From 3e54c258ab5874076db73134e80a1746f23553f5 Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 25 Mar 2024 14:20:06 -0700 Subject: [PATCH 01/14] Tone down camera movement speed slightly --- src/engine/entity.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/entity.cpp b/src/engine/entity.cpp index eb19e69c6..150c23c4d 100644 --- a/src/engine/entity.cpp +++ b/src/engine/entity.cpp @@ -1450,7 +1450,7 @@ SimulateEntities(engine_resources *Resources, r32 dt, chunk_dimension VisibleReg { if (UiCapturedMouseInput(Ui) == False) { - f32 CameraSpeed = Camera->DistanceFromTarget * Camera->Blend/40.f; + f32 CameraSpeed = Camera->DistanceFromTarget * Camera->Blend/100.f; v3 Offset = GetCameraRelativeInput(Hotkeys, Camera); Offset.z = 0; // Constrain to XY plane From e9ab82a50ae41a0700e4b381c0b1dde7dc492455 Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 25 Mar 2024 18:25:57 -0700 Subject: [PATCH 02/14] Drive fog from C++ side --- ...lock_array_voxel_stack_element_688853862.h | 2 +- .../do_editor_ui_for_compound_type_graphics.h | 25 +++++++++++++++++++ ...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 +- .../gen_constructor_voxel_stack_element.h | 2 +- .../generate_cursor_voxel_stack_element.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 | 18 ++++++------- shaders/Lighting.fragmentshader | 9 ++++--- src/engine/graphics.h | 4 ++- src/engine/render/render_init.cpp | 16 ++++++++++++ 23 files changed, 77 insertions(+), 31 deletions(-) diff --git a/generated/block_array_voxel_stack_element_688853862.h b/generated/block_array_voxel_stack_element_688853862.h index 3f8a58627..189c38ab6 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_chunk.cpp:4051:0 +// src/engine/world_chunk.cpp:4054:0 struct voxel_stack_element_block { diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index 3b3e3f9ee..8e4089d11 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -38,6 +38,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + DoEditorUi(Ui, + Window, +&Element->FogPower, + CSz("FogPower"), + Params + ); + + + + + + PushNewRow(Ui); + + DoEditorUi(Ui, + Window, +&Element->FogColor, + CSz("FogColor"), + Params + ); + + + + + + DoEditorUi(Ui, Window, &Element->SkyColor, diff --git a/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h b/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h index 9aeacb901..ddc916d4b 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_chunk.cpp:4364:0 +// src/engine/world_chunk.cpp:4367: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 b35f7850e..7bf722107 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_chunk.cpp:4604:0 +// src/engine/world_chunk.cpp:4607: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 0ed325864..89d974588 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_chunk.cpp:4588:0 +// src/engine/world_chunk.cpp:4591: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 3dc980535..a17735da7 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_chunk.cpp:4468:0 +// src/engine/world_chunk.cpp:4471:0 random_series ColorEntropy = {4654376543246}; diff --git a/generated/gen_constructor_voxel_stack_element.h b/generated/gen_constructor_voxel_stack_element.h index 24c611fd7..060d7db06 100644 --- a/generated/gen_constructor_voxel_stack_element.h +++ b/generated/gen_constructor_voxel_stack_element.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:4048:0 +// src/engine/world_chunk.cpp:4051: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 9846ef62b..30fd3ff09 100644 --- a/generated/generate_cursor_voxel_stack_element.h +++ b/generated/generate_cursor_voxel_stack_element.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:4054:0 +// src/engine/world_chunk.cpp:4057:0 struct voxel_stack_element_cursor { diff --git a/generated/rectalinear_iteration_pattern_398799212.h b/generated/rectalinear_iteration_pattern_398799212.h index 74a79854b..d6e539b79 100644 --- a/generated/rectalinear_iteration_pattern_398799212.h +++ b/generated/rectalinear_iteration_pattern_398799212.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:4324:0 +// src/engine/world_chunk.cpp:4327:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_416827956.h b/generated/rectalinear_iteration_pattern_416827956.h index 98610bdf1..6fa68723a 100644 --- a/generated/rectalinear_iteration_pattern_416827956.h +++ b/generated/rectalinear_iteration_pattern_416827956.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:4495:0 +// src/engine/world_chunk.cpp:4498:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_428632106.h b/generated/rectalinear_iteration_pattern_428632106.h index 53a5585ac..e76045575 100644 --- a/generated/rectalinear_iteration_pattern_428632106.h +++ b/generated/rectalinear_iteration_pattern_428632106.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:4646:0 +// src/engine/world_chunk.cpp:4649:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_530902269.h b/generated/rectalinear_iteration_pattern_530902269.h index 4d6bbc073..b1cf92f12 100644 --- a/generated/rectalinear_iteration_pattern_530902269.h +++ b/generated/rectalinear_iteration_pattern_530902269.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:4443:0 +// src/engine/world_chunk.cpp:4446:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_583358156.h b/generated/rectalinear_iteration_pattern_583358156.h index 304299d3b..6cf7b92d0 100644 --- a/generated/rectalinear_iteration_pattern_583358156.h +++ b/generated/rectalinear_iteration_pattern_583358156.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:4620:0 +// src/engine/world_chunk.cpp:4623:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_631222419.h b/generated/rectalinear_iteration_pattern_631222419.h index 1d2bbdd5c..3ae807f29 100644 --- a/generated/rectalinear_iteration_pattern_631222419.h +++ b/generated/rectalinear_iteration_pattern_631222419.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:4536:0 +// src/engine/world_chunk.cpp:4539:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_643608995.h b/generated/rectalinear_iteration_pattern_643608995.h index 772518dd0..1164636a9 100644 --- a/generated/rectalinear_iteration_pattern_643608995.h +++ b/generated/rectalinear_iteration_pattern_643608995.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:4424:0 +// src/engine/world_chunk.cpp:4427:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_812652930.h b/generated/rectalinear_iteration_pattern_812652930.h index f0d3e45e9..88ca94a58 100644 --- a/generated/rectalinear_iteration_pattern_812652930.h +++ b/generated/rectalinear_iteration_pattern_812652930.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:4396:0 +// src/engine/world_chunk.cpp:4399:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_920026661.h b/generated/rectalinear_iteration_pattern_920026661.h index ea6488b14..2fb255dc0 100644 --- a/generated/rectalinear_iteration_pattern_920026661.h +++ b/generated/rectalinear_iteration_pattern_920026661.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:4344:0 +// src/engine/world_chunk.cpp:4347:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_992879728.h b/generated/rectalinear_iteration_pattern_992879728.h index 2c8712911..7e47f04cd 100644 --- a/generated/rectalinear_iteration_pattern_992879728.h +++ b/generated/rectalinear_iteration_pattern_992879728.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:4557:0 +// src/engine/world_chunk.cpp:4560:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_99934950.h b/generated/rectalinear_iteration_pattern_99934950.h index 6681f83e5..42556f36f 100644 --- a/generated/rectalinear_iteration_pattern_99934950.h +++ b/generated/rectalinear_iteration_pattern_99934950.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:4503:0 +// src/engine/world_chunk.cpp:4506:0 DimIterator(x, y, z, UpdateDim) { diff --git a/jesse.make.sh b/jesse.make.sh index c6bcd5677..7d9271577 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 $OPT BuildAll -# ./make.sh $OPT \ -# BuildSingleExample examples/blank_project \ -# BuildSingleExample examples/project_and_level_picker \ - # BuildExecutables \ - # BuildDebugSystem \ - # BuildSingleExample examples/terrain_gen \ +./make.sh $OPT \ + BuildSingleExample examples/blank_project \ + BuildSingleExample examples/project_and_level_picker \ + BuildSingleExample examples/terrain_gen \ + BuildExecutables \ + BuildDebugSystem \ # BuildSingleExample examples/turn_based \ # BuildSingleExample examples/tools/voxel_synthesis_rule_baker \ # BuildSingleExample examples/the_wanderer \ diff --git a/shaders/Lighting.fragmentshader b/shaders/Lighting.fragmentshader index 2dc10e794..144360583 100644 --- a/shaders/Lighting.fragmentshader +++ b/shaders/Lighting.fragmentshader @@ -25,6 +25,10 @@ uniform vec3 SunPosition; uniform vec3 SunColor; uniform vec3 CameraP; +uniform r32 FogPower; +uniform vec3 FogColor; + + uniform bool UseSsao; uniform bool UseShadowMapping; uniform bool UseLightingBloom; @@ -261,11 +265,10 @@ void main() */ // TODO(Jesse): Can do squared? float DistanceToFrag = distance(CameraP, FragPosition.xyz); - float MaxFogDist = 6000.f; + float MaxFogDist = 20000.f; float FogContrib = clamp( DistanceToFrag / MaxFogDist, 0.f, 1.f); - v3 FogColor = V3(0.01f, 0.04f, 0.15f); - v3 Fog = FogContrib * FogColor; + v3 Fog = FogContrib * FogColor * FogPower; #else v3 Fog = V3(0); #endif diff --git a/src/engine/graphics.h b/src/engine/graphics.h index b331e1005..1975b4795 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -36,7 +36,9 @@ struct graphics { render_settings Settings; - v3 SkyColor = {{0.02f, 0.04f, 0.46f}}; + r32 FogPower; + v3 FogColor; + v3 SkyColor; // Default cameras, game code can do it's own thing if it wants to. camera GameCamera; diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index 776d4ea0f..e54e7ee46 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -161,6 +161,9 @@ MakeLightingShader( memory_arena *GraphicsMemory, v3 *SunPosition, v3 *SunColor, + v3 *FogColor, + r32 *FogPower, + b32 *UseSsao, b32 *UseShadowMapping, b32 *UseLightingBloom @@ -221,6 +224,12 @@ MakeLightingShader( memory_arena *GraphicsMemory, *Current = GetUniform(GraphicsMemory, &Shader, SunColor, "SunColor"); Current = &(*Current)->Next; + *Current = GetUniform(GraphicsMemory, &Shader, FogColor, "FogColor"); + Current = &(*Current)->Next; + + *Current = GetUniform(GraphicsMemory, &Shader, FogPower, "FogPower"); + Current = &(*Current)->Next; + *Current = GetUniform(GraphicsMemory, &Shader, (u32*)UseSsao, "UseSsao"); Current = &(*Current)->Next; @@ -608,6 +617,10 @@ GraphicsInit(engine_settings *EngineSettings, memory_arena *GraphicsMemory) Result->Settings.iShadowMapResolution = GetShadowMapResolution(EngineSettings); Result->Settings.iLuminanceMapResolution = GetLuminanceMapResolution(EngineSettings); + Result->FogPower = 2.f; + Result->FogColor = V3(0.01f, 0.04f, 0.25f); + + Result->SkyColor = V3(0.001f, 0.001f, 0.35f); { lighting_settings *Lighting = &Result->Settings.Lighting; @@ -699,6 +712,9 @@ GraphicsInit(engine_settings *EngineSettings, memory_arena *GraphicsMemory) &Result->Settings.Lighting.SunP, &Result->Settings.Lighting.CurrentSunColor, + &Result->FogColor, + &Result->FogPower, + &Result->Settings.UseSsao, &Result->Settings.UseShadowMapping, &Result->Settings.UseLightingBloom From 5050c15a79b529c61e31c986b8325d6ff9938392 Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 25 Mar 2024 18:57:07 -0700 Subject: [PATCH 03/14] Improve new brush UX --- .../do_editor_ui_for_compound_type_graphics.h | 12 +++++ jesse.make.sh | 2 +- src/engine/api.cpp | 6 +-- src/engine/editor.cpp | 52 +++++++++++++------ src/engine/graphics.h | 5 +- 5 files changed, 53 insertions(+), 24 deletions(-) diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index 8e4089d11..3024c8d30 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -38,6 +38,18 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + DoEditorUi(Ui, + Window, +&Element->SunBasis, + CSz("SunBasis"), + Params + ); + + + + + + DoEditorUi(Ui, Window, &Element->FogPower, diff --git a/jesse.make.sh b/jesse.make.sh index 7d9271577..fe98ee9b0 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 cc65ca09f..90fea745e 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -315,9 +315,9 @@ DoDayNightCycle(graphics *Graphics, r32 tDay) v3 DuskColor = Normalize(Lighting->DuskColor) * Lighting->DuskIntensity; v3 MoonColor = Normalize(Lighting->MoonColor) * Lighting->MoonIntensity; - Lighting->SunP.x = Sin(tDay); - Lighting->SunP.y = Cos(tDay); - Lighting->SunP.z = (1.3f+Cos(tDay))/2.f; + 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) { diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 755b332b4..522ebfc66 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -1364,6 +1364,25 @@ SaveBrush(layered_brush_editor *LayeredBrush, const char *FilenameZ) } +link_internal void +NewBrush(layered_brush_editor *LayeredBrush) +{ + cs BrushNameBuf = CS(LayeredBrush->NameBuf, NameBuf_Len); + brush_layer *Layers = LayeredBrush->Layers; + + ZeroMemory(LayeredBrush->NameBuf, NameBuf_Len); + + cs Src = CSz("_untitled.brush"); + CopyString(&Src, &BrushNameBuf); + + LayeredBrush->LayerCount = 1; + RangeIterator(LayerIndex, MAX_BRUSH_LAYERS) + { + brush_layer *Layer = Layers + LayerIndex; + Layer->Settings = {}; + } +} + link_internal void BrushSettingsForLayeredBrush(engine_resources *Engine, window_layout *BrushSettingsWindow) { @@ -1374,6 +1393,12 @@ BrushSettingsForLayeredBrush(engine_resources *Engine, window_layout *BrushSetti cs BrushNameBuf = CS(LayeredBrush->NameBuf, NameBuf_Len); + b32 IsNewBrush = False; + if (LayeredBrush->NameBuf[0] == 0 && LayeredBrush->LayerCount == 0) + { + NewBrush(LayeredBrush); + IsNewBrush = True; + } { PushWindowStart(Ui, BrushSettingsWindow); @@ -1450,17 +1475,8 @@ BrushSettingsForLayeredBrush(engine_resources *Engine, window_layout *BrushSetti if (Button(Ui, CSz("New"), UiId(BrushSettingsWindow, "brush new", 0u))) { - ZeroMemory(LayeredBrush->NameBuf, NameBuf_Len); - - cs Src = CSz("_untitled.brush"); - CopyString(&Src, &BrushNameBuf); - - LayeredBrush->LayerCount = 1; - RangeIterator(LayerIndex, MAX_BRUSH_LAYERS) - { - brush_layer *Layer = Layers + LayerIndex; - Layer->Settings = {}; - } + NewBrush(LayeredBrush); + IsNewBrush = True; } if (LayeredBrush->LayerCount) @@ -1502,9 +1518,6 @@ BrushSettingsForLayeredBrush(engine_resources *Engine, window_layout *BrushSetti PushWindowEnd(Ui, BrushSettingsWindow); } - { - } - b32 AnyBrushSettingsUpdated = False; if (SelectionComplete(Editor->SelectionClicks)) @@ -1536,7 +1549,8 @@ BrushSettingsForLayeredBrush(engine_resources *Engine, window_layout *BrushSetti { brush_layer *Layer = Layers + LayerIndex; - if (ToggleButton(Ui, FSz("v Layer %d", LayerIndex), FSz("> Layer %d", LayerIndex), UiId(BrushSettingsWindow, "brush_layer toggle interaction", Layer))) + 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))) { @@ -1562,10 +1576,14 @@ BrushSettingsForLayeredBrush(engine_resources *Engine, window_layout *BrushSetti EditLayerIndex = LayerIndex; } - - DoSettingsForBrush(Engine, Layer, BrushSettingsWindow); } + + if (IsNewBrush && LayerIndex == 0) + { + SetToggleButton(Ui, ToggleId, True); + } + PushNewRow(Ui); } PushTableEnd(Ui); diff --git a/src/engine/graphics.h b/src/engine/graphics.h index 1975b4795..181da4a20 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -9,9 +9,6 @@ struct gaussian_render_group texture Textures[2]; shader Shader; - - /* shader DebugTextureShader0; */ - /* shader DebugTextureShader1; */ }; struct transparency_render_group @@ -36,6 +33,8 @@ struct graphics { render_settings Settings; + v3 SunBasis; + r32 FogPower; v3 FogColor; v3 SkyColor; From bdae2b84b0bc2d93e52c5d528b8fc7bab85a1ace Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 26 Mar 2024 20:43:08 -0700 Subject: [PATCH 04/14] Fix editor preview jank This is not a very good fix. I moved the mesh generation onto the main thread because I couldn't figure out the correct order-of-operations in terms of storing the min corner offset (it's more fucky than you think). This should all get moved to a thread at some point in the future. The fucky problem won't be a problem because then everything will be on the thread (hopefully), and the offsets will just be obvious (I claim). GLHF --- ...editor_ui_for_compound_type_level_editor.h | 12 ++ ...editor_ui_for_radio_enum_world_edit_tool.h | 1 - jesse.make.sh | 4 +- src/engine/canonical_position.h | 10 ++ src/engine/editor.cpp | 131 ++++++++++-------- src/engine/editor.h | 8 +- src/engine/render.cpp | 14 +- 7 files changed, 117 insertions(+), 63 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 cd0c9307f..57f11cd86 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -111,6 +111,18 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + DoEditorUi(Ui, + Window, +&Element->EditorPreviewRegionMin, + CSz("EditorPreviewRegionMin"), + Params + ); + + + + + + DoEditorUi(Ui, Window, &Element->EngineDebugViewModeToggleBits, 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 61ec9e4c9..70399de5e 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 @@ -23,7 +23,6 @@ RadioButtonGroup_world_edit_tool( renderer_2d *Ui, { 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 }, - { CSz("StandingSpots"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_tool WorldEdit_Tool_StandingSpots")), WorldEdit_Tool_StandingSpots }, }; ui_toggle_button_handle_buffer ButtonBuffer = { diff --git a/jesse.make.sh b/jesse.make.sh index fe98ee9b0..c77b2f125 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/canonical_position.h b/src/engine/canonical_position.h index 7eff3f547..0523dd716 100644 --- a/src/engine/canonical_position.h +++ b/src/engine/canonical_position.h @@ -339,6 +339,16 @@ GetSimSpaceRect3i(world *World, rect3cp Rect) return Result; } +struct world; +link_internal rect3 +GetSimSpaceRect(world *World, rect3cp Rect) +{ + v3 Min = GetSimSpaceP(World, Rect.Min); + v3 Max = GetSimSpaceP(World, Rect.Max); + rect3 Result = RectMinMax(Min, Max); + return Result; +} + link_internal rect3 GetSimSpaceAABB(world *World, rect3cp Rect) { diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 522ebfc66..a801a8ac5 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -986,7 +986,8 @@ CheckForChangesAndUpdate_ThenRenderToPreviewTexture(engine_resources *Engine, br v3i RequiredLayerDim = GetRequiredDimForLayer(SelectionDim, Layer); b32 ReallocChunk = Editor->SelectionChanged || Layer->Preview.Chunk.Dim != RequiredLayerDim; - b32 UpdateVoxels = ReallocChunk || !AreEqual(Settings, PrevSettings); + b32 SettingsChanged = !AreEqual(Settings, PrevSettings); + b32 UpdateVoxels = ReallocChunk || SettingsChanged; *PrevSettings = *Settings; @@ -1008,7 +1009,8 @@ CheckForChangesAndUpdate_ThenRenderToPreviewTexture(engine_resources *Engine, br if (UpdateVoxels) { - Info("Detected changes to settings, updating voxels."); + /* Info("Detected changes to settings, updating voxels. ReallocChunk(%b) SettingsChanged(%b)", ReallocChunk, SettingsChanged); */ + switch (Settings->Type) { case BrushLayerType_Shape: @@ -1099,10 +1101,9 @@ CheckForChangesAndUpdate_ThenRenderToPreviewTexture(engine_resources *Engine, br } break; } + SyncGpuBuffersImmediate(Engine, &Chunk->Meshes); } - - SyncGpuBuffersImmediate(Engine, &Chunk->Meshes); if (Layer->Preview.Thumbnail.Texture.ID) // NOTE(Jesse): Avoid spamming a warning to console { RenderToTexture(Engine, &Layer->Preview.Thumbnail, &Chunk->Meshes, V3(Chunk->Dim)/-2.f); @@ -1519,19 +1520,25 @@ BrushSettingsForLayeredBrush(engine_resources *Engine, window_layout *BrushSetti } - b32 AnyBrushSettingsUpdated = False; if (SelectionComplete(Editor->SelectionClicks)) { + b32 AnyChanges = True; + RangeIterator(LayerIndex, LayeredBrush->LayerCount) { - RangeIterator(LayerIndex, LayeredBrush->LayerCount) - { - brush_layer *Layer = Layers + LayerIndex; - AnyBrushSettingsUpdated |= CheckForChangesAndUpdate_ThenRenderToPreviewTexture(Engine, Layer); - } + brush_layer *Layer = Layers + LayerIndex; + AnyChanges |= CheckForChangesAndUpdate_ThenRenderToPreviewTexture(Engine, Layer); + } + + if (AnyChanges) + { + Editor->RootChunkNeedsNewMesh = True; + Editor->MostRecentSelectionRegionMin = Editor->SelectionRegion.Min; } } + + { local_persist window_layout LayersWindow = WindowLayout("Layers", WindowLayoutFlag_Align_Right); PushWindowStart(Ui, &LayersWindow); @@ -1644,9 +1651,10 @@ BrushSettingsForLayeredBrush(engine_resources *Engine, window_layout *BrushSetti { world_chunk *Root_LayeredBrushPreview = &LayeredBrush->Preview.Chunk; + // // TODO(Jesse)(async, speed): It would be kinda nice if this ran async.. - if (AnyBrushSettingsUpdated) + if ( Editor->RootChunkNeedsNewMesh && (Root_LayeredBrushPreview->Flags&Chunk_Queued) == 0) { // First find the largest total dimension of all the layers, and the // largest negative minimum offset. We need this min offset such @@ -1657,8 +1665,6 @@ BrushSettingsForLayeredBrush(engine_resources *Engine, window_layout *BrushSetti v3i LargestLayerDim = GetSelectionDim(World, Editor); v3i SmallestMinOffset = GetSmallestMinOffset(LayeredBrush, &LargestLayerDim); - - // Clear the voxels if the size didn't change, otherwise realloc if (Root_LayeredBrushPreview->Dim == LargestLayerDim) { @@ -1687,12 +1693,35 @@ BrushSettingsForLayeredBrush(engine_resources *Engine, window_layout *BrushSetti ApplyBrushLayer(Engine, Layer, Root_LayeredBrushPreview, SmallestMinOffset); } + /* DeallocateGpuBuffers(Root_LayeredBrushPreview); */ + FinalizeChunkInitialization(Root_LayeredBrushPreview); - QueueChunkForMeshRebuild(&Plat->LowPriority, Root_LayeredBrushPreview); + + Assert( (Root_LayeredBrushPreview->Flags&Chunk_Queued) == False ); + + /* QueueChunkForMeshRebuild(&Plat->LowPriority, Root_LayeredBrushPreview); */ + + /* MarkBoundaryVoxels_MakeExteriorFaces( Root_LayeredBrushPreview->Voxels, Root_LayeredBrushPreview->Dim, {}, Root_LayeredBrushPreview->Dim); */ + + { + auto Thread = GetThreadLocalState(ThreadLocal_ThreadIndex); + auto Chunk = Root_LayeredBrushPreview; + untextured_3d_geometry_buffer *TempMesh = AllocateTempWorldChunkMesh(Thread->TempMemory); + RebuildWorldChunkMesh(Thread, Chunk, {}, Chunk->Dim, MeshBit_Lod0, TempMesh, Thread->TempMemory); + } + + FinalizeChunkInitialization(Root_LayeredBrushPreview); + + Editor->RootChunkNeedsNewMesh = False; + Editor->NextSelectionRegionMin = Editor->MostRecentSelectionRegionMin; + } + + + if (SyncGpuBuffersImmediate(Engine, &Root_LayeredBrushPreview->Meshes)) + { + Editor->EditorPreviewRegionMin = Editor->NextSelectionRegionMin; } - SyncGpuBuffersImmediate(Engine, &Root_LayeredBrushPreview->Meshes); - /* RenderToTexture(Engine, &LayeredBrush->Preview.Thumbnail, &Root_LayeredBrushPreview->Meshes, Root_LayeredBrushPreview->Dim/-2.f); */ } } @@ -1712,7 +1741,7 @@ DoBrushSettingsWindow(engine_resources *Engine, world_edit_tool WorldEditTool, w case WorldEdit_Tool_Select: case WorldEdit_Tool_Eyedropper: case WorldEdit_Tool_BlitEntity: - case WorldEdit_Tool_StandingSpots: + /* case WorldEdit_Tool_StandingSpots: */ { } break; @@ -1778,7 +1807,7 @@ CurrentToolIs(level_editor *Editor, world_edit_tool Tool, world_edit_brush_type } link_internal aabb_intersect_result -EditWorldSelection(engine_resources *Engine, rect3 *SelectionAABB) +EditWorldSelection(engine_resources *Engine) { UNPACK_ENGINE_RESOURCES(Engine); @@ -1806,47 +1835,42 @@ EditWorldSelection(engine_resources *Engine, rect3 *SelectionAABB) Thickness = 0.20f; } - /* { */ - v3 SelectionMinP = GetSimSpaceP(World, Editor->SelectionRegion.Min); - v3 SelectionMaxP = GetSimSpaceP(World, Editor->SelectionRegion.Max); - *SelectionAABB = AABBMinMax(SelectionMinP, SelectionMaxP); - /* } */ - if (CurrentToolIs(Editor, WorldEdit_Tool_Brush, WorldEdit_BrushType_Layered)) { layered_brush_editor *Brush = &Editor->LayeredBrushEditor; if (Brush->BrushFollowsCursor) { - v3 SelectionRad = (SelectionMaxP - SelectionMinP)/2.f; + /* v3 SelectionDim = (SelectionMaxP - SelectionMinP); */ + /* v3 SelectionRad = (SelectionMaxP - SelectionMinP)/2.f; */ if (Engine->MousedOverVoxel.Tag) { - cp MouseP = Canonical_Position(&Engine->MousedOverVoxel.Value); + cp MouseP = Canonical_Position(&Engine->MousedOverVoxel.Value, PickedVoxel_LastEmpty); - Editor->SelectionRegion.Min = MouseP - SelectionRad; - Editor->SelectionRegion.Max = MouseP + SelectionRad; - Canonicalize(World, &Editor->SelectionRegion.Min); - Canonicalize(World, &Editor->SelectionRegion.Max); + /* Editor->SelectionRegion.Min = MouseP - SelectionRad; */ + /* Editor->SelectionRegion.Max = MouseP + SelectionRad; */ + v3 SelectionDim = GetDim(GetSimSpaceRect(World, Editor->SelectionRegion)); + + Editor->SelectionRegion.Min = MouseP; + Editor->SelectionRegion.Max = MouseP + SelectionDim; Truncate(&Editor->SelectionRegion.Min.Offset); Truncate(&Editor->SelectionRegion.Max.Offset); - SelectionMinP = GetSimSpaceP(World, Editor->SelectionRegion.Min); - SelectionMaxP = GetSimSpaceP(World, Editor->SelectionRegion.Max); - *SelectionAABB = AABBMinMax(SelectionMinP, SelectionMaxP); + Canonicalize(World, &Editor->SelectionRegion.Min); + Canonicalize(World, &Editor->SelectionRegion.Max); } } } + aabb SelectionAABB = GetSimSpaceRect(World, Editor->SelectionRegion); { - // TODO(Jesse): Use pre-computed ray - maybe_ray MaybeRay = ComputeRayFromCursor(Engine, &gBuffer->ViewProjection, Camera, World->ChunkDim); - if (MaybeRay.Tag == Maybe_Yes) + if (Engine->MaybeMouseRay.Tag == Maybe_Yes) { - ray Ray = MaybeRay.Ray; + ray Ray = Engine->MaybeMouseRay.Ray; /* Ray.Origin = GetSimSpaceP(World, Canonical_Position(World->ChunkDim, Ray.Origin, {})); */ - AABBTest = Intersect(SelectionAABB, &Ray); + AABBTest = Intersect(&SelectionAABB, &Ray); face_index Face = AABBTest.Face; /* PushColumn(Ui, CS(Face)); */ @@ -1859,7 +1883,7 @@ EditWorldSelection(engine_resources *Engine, rect3 *SelectionAABB) u8 HiColor = GREEN; r32 HiThickness = Thickness*1.2f; - HighlightFace(Engine, Face, *SelectionAABB, InsetWidth, HiColor, HiThickness); + HighlightFace(Engine, Face, SelectionAABB, InsetWidth, HiColor, HiThickness); if ( Input->LMB.Clicked && (Input->Ctrl.Pressed || Input->Shift.Pressed || Input->Alt.Pressed) ) { @@ -1902,18 +1926,16 @@ EditWorldSelection(engine_resources *Engine, rect3 *SelectionAABB) /* 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, SelectionAABB); if (!Input->LMB.Pressed) { // If we actually changed the selection region rect3cp ProposedSelection = SimSpaceToCanonical(World, &ModifiedSelection); - /* if (!AreEqual(Editor->SelectionRegion, ProposedSelection)) */ - { - // Make ModifiedSelection permanent - Editor->SelectionRegion = ProposedSelection; - Editor->Selection.ClickedFace = FaceIndex_None; - } + + // Make ModifiedSelection permanent + Editor->SelectionRegion = ProposedSelection; + Editor->Selection.ClickedFace = FaceIndex_None; } } } @@ -1923,7 +1945,7 @@ EditWorldSelection(engine_resources *Engine, rect3 *SelectionAABB) // u8 BaseColor = WHITE; - DEBUG_DrawSimSpaceAABB(Engine, SelectionAABB, BaseColor, Thickness); + DEBUG_DrawSimSpaceAABB(Engine, &SelectionAABB, BaseColor, Thickness); } @@ -1941,9 +1963,6 @@ EditWorldSelection(engine_resources *Engine, rect3 *SelectionAABB) Editor->PrevSelectionRegion = Editor->SelectionRegion; } - - - return AABBTest; } @@ -1969,8 +1988,8 @@ DoWorldEditor(engine_resources *Engine) // @selection_changed_flag // - aabb SelectionAABB = {}; - aabb_intersect_result AABBTest = EditWorldSelection(Engine, &SelectionAABB); + aabb_intersect_result AABBTest = EditWorldSelection(Engine); + aabb SelectionAABB = GetSimSpaceRect(World, Editor->SelectionRegion); ui_toggle_button_group WorldEditToolButtonGroup = {}; ui_toggle_button_group WorldEditModeButtonGroup = {}; @@ -2096,7 +2115,7 @@ DoWorldEditor(engine_resources *Engine) case WorldEdit_Tool_Brush: case WorldEdit_Tool_Eyedropper: case WorldEdit_Tool_BlitEntity: - case WorldEdit_Tool_StandingSpots: + /* case WorldEdit_Tool_StandingSpots: */ { } break; case WorldEdit_Tool_Select: @@ -2345,7 +2364,7 @@ DoWorldEditor(engine_resources *Engine) if (Input->LMB.Clicked) { - Info("Selecting Color (%S)", CS(V->Color)); + /* Info("Selecting Color (%S)", CS(V->Color)); */ Engine->Editor.SelectedColorIndex = V->Color; if (Editor->PreviousTool) @@ -2393,10 +2412,10 @@ DoWorldEditor(engine_resources *Engine) } } break; +#if 0 case WorldEdit_Tool_StandingSpots: { NotImplemented; -#if 0 if (Input->LMB.Clicked && AABBTest.Face && !Input->Shift.Pressed && !Input->Ctrl.Pressed) { world_edit_shape Shape = { @@ -2406,8 +2425,8 @@ DoWorldEditor(engine_resources *Engine) }; QueueWorldUpdateForRegion(Engine, WorldUpdateOperationMode_StandingSpots, &Shape, Editor->SelectedColorIndex, Engine->WorldUpdateMemory); } -#endif } break; +#endif } } diff --git a/src/engine/editor.h b/src/engine/editor.h index a24cdf394..0e9b7122e 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -557,7 +557,7 @@ enum world_edit_tool WorldEdit_Tool_Brush, // world_edit_brush_type WorldEdit_Tool_Eyedropper, WorldEdit_Tool_BlitEntity, - WorldEdit_Tool_StandingSpots, // Recomputes standing spots for an area + /* WorldEdit_Tool_StandingSpots, // Recomputes standing spots for an area */ }; enum world_edit_brush_type @@ -1017,6 +1017,12 @@ struct level_editor /* brush_layer Shape; */ layered_brush_editor LayeredBrushEditor; + b32 RootChunkNeedsNewMesh; + + cp MostRecentSelectionRegionMin; + cp NextSelectionRegionMin; + cp EditorPreviewRegionMin; + u64 EngineDebugViewModeToggleBits; u16 SelectedColorIndex; diff --git a/src/engine/render.cpp b/src/engine/render.cpp index 4d34fc5ed..5e1c7d5fe 100644 --- a/src/engine/render.cpp +++ b/src/engine/render.cpp @@ -909,9 +909,10 @@ CopyToGpuBuffer(untextured_3d_geometry_buffer *Mesh, gpu_element_buffer_handles FlushBuffersToCard(Handles); } -link_internal void +link_internal b32 SyncGpuBuffersImmediate(engine_resources *Engine, lod_element_buffer *Meshes) { + b32 Result = False; Assert(ThreadLocal_ThreadIndex == 0); RangeIterator(MeshIndex, MeshIndex_Count) @@ -927,6 +928,7 @@ SyncGpuBuffersImmediate(engine_resources *Engine, lod_element_buffer *Meshes) { AllocateGpuElementBuffer(Handles, Mesh->At); CopyToGpuBuffer(Mesh, Handles); + Result = True; } DeallocateMesh(Mesh, &Engine->MeshFreelist); @@ -935,6 +937,8 @@ SyncGpuBuffersImmediate(engine_resources *Engine, lod_element_buffer *Meshes) // TODO(Jesse): Is this actually a thing?? FullBarrier; + + return Result; } link_internal m4 @@ -1294,7 +1298,11 @@ 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->SelectionRegion.Min); + Basis = V3(SmallestMinOffset) + GetRenderP(Engine, Editor->EditorPreviewRegionMin); + /* Basis = V3(SmallestMinOffset) + GetRenderP(Engine, Editor->SelectionRegion.Min); */ + /* Basis = V3(SmallestMinOffset) + GetSimSpaceP(World, Editor->SelectionRegion.Min); */ + /* Basis = V3(SmallestMinOffset) + GetSimSpaceP(World, Editor->EditorPreviewRegionMin); */ + /* Basis = {}; */ } break; default: {} break; @@ -1306,7 +1314,7 @@ DrawEditorPreview(engine_resources *Engine, shader *Shader) if (Chunk) { - SyncGpuBuffersImmediate(Engine, &Chunk->Meshes); + /* SyncGpuBuffersImmediate(Engine, &Chunk->Meshes); */ DrawLod(Engine, Shader, &Chunk->Meshes, 0.f, Basis); } } From 88ee39bbdd57716eee346daccf555def4fc6412f Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 26 Mar 2024 20:47:39 -0700 Subject: [PATCH 05/14] Update readme --- jesse.make.sh | 2 +- readme.md | 15 +++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/jesse.make.sh b/jesse.make.sh index c77b2f125..cd928b84e 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/readme.md b/readme.md index 2553c2aff..92404bef5 100644 --- a/readme.md +++ b/readme.md @@ -16,6 +16,15 @@ compiler, and a few appropriate system headers. ![banner](screenshots/orks.png) +# 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 ;) + +## Build from Source + +See the docs on the [build process](docs/01_build_process.md). + ## Renderer Features * Deferred Shading @@ -50,12 +59,6 @@ compiler, and a few appropriate system headers. * Physical Core (windows only) -# Getting Started - -## Building - -See the docs on the [build process](docs/01_build_process.md). - # Gallery ![banner](screenshots/3_skele.png) From 9bf452e6919dfff69fdc5cf94990c604148c0d07 Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 26 Mar 2024 21:33:49 -0700 Subject: [PATCH 06/14] Tune down gBuffer textures to 16f, change default shadow quality to Medium --- external/bonsai_stdlib | 2 +- settings.init | 4 ++-- src/engine/render/render_init.cpp | 10 +++++----- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 24c8cf2b3..083ef12c3 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 24c8cf2b3d8979d7a7adafd0365d4a0746e80197 +Subproject commit 083ef12c333cea334ea44ee16f60551b31592a54 diff --git a/settings.init b/settings.init index e3ea0e89b..bcc472832 100644 --- a/settings.init +++ b/settings.init @@ -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/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index e54e7ee46..ef64e5e58 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -423,12 +423,12 @@ InitGbufferRenderGroup(v2i ApplicationResolution, g_buffer_render_group *gBuffer { GL.BindFramebuffer(GL_FRAMEBUFFER, gBuffer->FBO.ID); - gBuffer->Textures.Color = MakeTexture_RGBA( ApplicationResolution, (v4*)0, CSz("gBufferColor")); + gBuffer->Textures.Color = MakeTexture_RGBA( ApplicationResolution, (v4*)0, CSz("gBufferColor"), TextureStorageFormat_RGBA16F); - gBuffer->Textures.Normal = MakeTexture_RGB( ApplicationResolution, (v3*)0, CSz("gBufferNormal")); + gBuffer->Textures.Normal = MakeTexture_RGB( ApplicationResolution, (v3*)0, CSz("gBufferNormal"), TextureStorageFormat_RGBA16F); // NOTE(Jesse): Depth gets stuffed into A value here. - gBuffer->Textures.Position = MakeTexture_RGBA( ApplicationResolution, (v4*)0, CSz("gBufferPosition")); + gBuffer->Textures.Position = MakeTexture_RGBA( ApplicationResolution, (v4*)0, CSz("gBufferPosition"), TextureStorageFormat_RGBA32F); FramebufferTexture(&gBuffer->FBO, &gBuffer->Textures.Color); FramebufferTexture(&gBuffer->FBO, &gBuffer->Textures.Normal); @@ -724,8 +724,8 @@ GraphicsInit(engine_settings *EngineSettings, memory_arena *GraphicsMemory) // NOTE(Jesse): This is used for bloom Lighting->FBO = GenFramebuffer(); - Lighting->LightingTex = MakeTexture_RGB( Result->Settings.iLuminanceMapResolution, 0, CSz("Lighting")); - Lighting->BloomTex = MakeTexture_RGB( Result->Settings.iLuminanceMapResolution, 0, CSz("Bloom")); + Lighting->LightingTex = MakeTexture_RGB( Result->Settings.iLuminanceMapResolution, 0, CSz("Lighting"), TextureStorageFormat_RGB16F); + Lighting->BloomTex = MakeTexture_RGB( Result->Settings.iLuminanceMapResolution, 0, CSz("Bloom"), TextureStorageFormat_RGB16F); /* Lighting->DebugBloomShader = MakeSimpleTextureShader(&Lighting->BloomTex, GraphicsMemory); */ /* Lighting->DebugLightingShader = MakeSimpleTextureShader(&Lighting->LightingTex, GraphicsMemory); */ From bdc396b12e564a7b55e15371fb27f42f24c8795d Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 26 Mar 2024 21:43:45 -0700 Subject: [PATCH 07/14] Changelog --- CHANGELOG.txt | 12 ++++++++++++ jesse.make.sh | 16 ++++++++-------- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 8a6f19928..a86a2c6bf 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,3 +1,15 @@ +* 1.5.1 + +- Fog now driven from C++ (and, by extension, the editor) + +- Improved UX when opening brush menu for the first time + +- Fixed the preview jank when using a layered brush. + The preview should now appear stable in the viewport + +- Tuned some gBuffer texture sizes & turned down default shadow quality + This is in an effort to get mid-end cards running at >60fps on 4k + * 1.5.0 - @Shawnecy Chased down a divide by zero in the lighting shader diff --git a/jesse.make.sh b/jesse.make.sh index cd928b84e..6092b187c 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,18 +1,18 @@ #!/usr/bin/env bash -OPT="-O2" +# OPT="-O2" # ./make.sh RunPoof # [ $? -ne 0 ] && exit 1 -# ./make.sh $OPT BuildAll +./make.sh $OPT BuildAll -./make.sh $OPT \ - BuildSingleExample examples/blank_project \ - BuildSingleExample examples/project_and_level_picker \ - BuildSingleExample examples/terrain_gen \ - BuildExecutables \ - BuildDebugSystem \ +# ./make.sh $OPT \ +# BuildSingleExample examples/blank_project \ +# BuildSingleExample examples/project_and_level_picker \ +# BuildSingleExample examples/terrain_gen \ +# BuildExecutables \ +# BuildDebugSystem \ # BuildSingleExample examples/turn_based \ # BuildSingleExample examples/tools/voxel_synthesis_rule_baker \ # BuildSingleExample examples/the_wanderer \ From 19ea97f9356441dbf2eed7dc808423d7ee59988c Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 27 Mar 2024 08:31:37 -0700 Subject: [PATCH 08/14] Fix texture window layout --- src/engine/debug.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/engine/debug.cpp b/src/engine/debug.cpp index 73f84b453..6d3016ebb 100644 --- a/src/engine/debug.cpp +++ b/src/engine/debug.cpp @@ -664,13 +664,14 @@ DoEngineDebug(engine_resources *Engine) } PushTableEnd(Ui); EndColumn(Ui, StartOuter); + PushNewRow(Ui); PushTableEnd(Ui); - if ( (GetIndex(&TextureIndex)+1) % 6 == 0) - { - PushNewRow(Ui); - } + /* if ( (GetIndex(&TextureIndex)+1) % 6 == 0) */ + /* { */ + /* PushNewRow(Ui); */ + /* } */ } From 68edf3d3d572b67581cb80aa5ba2dc6548969bea Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 27 Mar 2024 12:44:36 -0700 Subject: [PATCH 09/14] Pass depth and InverseViewMatrix to Lighting.fragmentshader in prep to reconstruct position from depth --- jesse.make.sh | 16 ++++++++-------- shaders/Lighting.fragmentshader | 3 ++- src/engine/api.cpp | 10 +++++++--- src/engine/render.h | 1 + src/engine/render/render_init.cpp | 7 +++++++ 5 files changed, 25 insertions(+), 12 deletions(-) diff --git a/jesse.make.sh b/jesse.make.sh index 6092b187c..c77b2f125 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -5,14 +5,14 @@ # ./make.sh RunPoof # [ $? -ne 0 ] && exit 1 -./make.sh $OPT BuildAll - -# ./make.sh $OPT \ -# BuildSingleExample examples/blank_project \ -# BuildSingleExample examples/project_and_level_picker \ -# BuildSingleExample examples/terrain_gen \ -# BuildExecutables \ -# BuildDebugSystem \ +# ./make.sh $OPT BuildAll + +./make.sh $OPT \ + BuildSingleExample examples/blank_project \ + BuildSingleExample examples/project_and_level_picker \ + BuildSingleExample examples/terrain_gen \ + BuildExecutables \ + BuildDebugSystem \ # BuildSingleExample examples/turn_based \ # BuildSingleExample examples/tools/voxel_synthesis_rule_baker \ # BuildSingleExample examples/the_wanderer \ diff --git a/shaders/Lighting.fragmentshader b/shaders/Lighting.fragmentshader index 144360583..807b6bd89 100644 --- a/shaders/Lighting.fragmentshader +++ b/shaders/Lighting.fragmentshader @@ -6,6 +6,7 @@ layout (location = 1) out vec3 BloomColor; uniform sampler2D gColor; uniform sampler2D gPosition; uniform sampler2D gNormal; +uniform sampler2D gDepth; uniform sampler2D shadowMap; uniform sampler2D Ssao; @@ -19,6 +20,7 @@ uniform sampler2D TransparencyCount; uniform bool BravoilMyersOIT; uniform bool BravoilMcGuireOIT; +uniform mat4 InverseViewMatrix; uniform mat4 ShadowMVP; uniform vec3 SunPosition; @@ -88,7 +90,6 @@ vec3 LightingCalc(float AttenuationFactor, vec3 LightColor, vec3 FragToLight, ve void main() { - vec2 gBufferTextureDim = ApplicationResolution; ivec2 texelCoord = ivec2(gBufferUV*gBufferTextureDim); vec4 FragPosition = texelFetch(gPosition, texelCoord, 0); diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 90fea745e..f500f5bc6 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -289,9 +289,13 @@ Bonsai_Simulate(engine_resources *Resources) UpdateGameCamera(World, MouseDelta, InputForCamera, CameraTargetP, Camera, Plat->dt, DoPositionDelta, DoZoomDelta); // TODO(Jesse)(correctness, nopush): This should actually be passing the back-buffer resolution?? - Resources->Graphics->gBuffer->ViewProjection = - ProjectionMatrix(Camera, Plat->ScreenDim) * - ViewMatrix(World->ChunkDim, Camera); + + + m4 ViewMat = ViewMatrix(World->ChunkDim, Camera); + m4 ProjMat = ProjectionMatrix(Camera, Plat->ScreenDim); + + Resources->Graphics->gBuffer->InverseViewMatrix = Inverse(ViewMat); + Resources->Graphics->gBuffer->ViewProjection = ProjMat * ViewMat; #if BONSAI_DEBUG_SYSTEM_API Debug_DoWorldChunkPicking(Resources); diff --git a/src/engine/render.h b/src/engine/render.h index 3ee899917..930ab3a8e 100644 --- a/src/engine/render.h +++ b/src/engine/render.h @@ -31,6 +31,7 @@ struct g_buffer_render_group framebuffer FBO; g_buffer_textures Textures; shader gBufferShader; + m4 InverseViewMatrix; m4 ViewProjection; }; diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index ef64e5e58..22991e545 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -155,7 +155,9 @@ MakeLightingShader( memory_arena *GraphicsMemory, b32 *BravoilMyersOIT, b32 *BravoilMcGuireOIT, + m4 *InverseViewMatrix, m4 *ShadowMVP, + game_lights *Lights, camera *Camera, v3 *SunPosition, @@ -182,6 +184,9 @@ MakeLightingShader( memory_arena *GraphicsMemory, *Current = GetUniform(GraphicsMemory, &Shader, &gTextures->Position, "gPosition"); Current = &(*Current)->Next; + *Current = GetUniform(GraphicsMemory, &Shader, &gTextures->Depth, "gDepth"); + Current = &(*Current)->Next; + *Current = GetUniform(GraphicsMemory, &Shader, ShadowMap, "shadowMap"); Current = &(*Current)->Next; @@ -706,7 +711,9 @@ GraphicsInit(engine_settings *EngineSettings, memory_arena *GraphicsMemory) &Result->Settings.BravoilMyersOIT, &Result->Settings.BravoilMcGuireOIT, + &Result->gBuffer->InverseViewMatrix, &SG->MVP, + &Lighting->Lights, Result->Camera, &Result->Settings.Lighting.SunP, From 65fd2db622d63b4201c8253d41f6749d93615c1c Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 27 Mar 2024 14:45:07 -0700 Subject: [PATCH 10/14] Reconstruct worldspace position from depth; remove gPosition texture --- generated/block_array_h_texture_688856411.h | 2 +- generated/block_array_h_texture_688856411_0.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 +- ..._for_compound_type_g_buffer_render_group.h | 112 ++++++++++++++++++ .../do_editor_ui_for_compound_type_graphics.h | 2 +- ...r_ui_for_compound_type_graphics_settings.h | 2 +- ...editor_ui_for_compound_type_level_editor.h | 39 +++++- ...editor_ui_for_compound_type_render_debug.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 +- .../do_editor_ui_for_vector_type_688873645.h | 22 ++++ jesse.make.sh | 18 +-- shaders/Ao.fragmentshader | 24 +++- shaders/Lighting.fragmentshader | 63 ++++++++-- src/engine/api.cpp | 1 + src/engine/editor.cpp | 3 + src/engine/editor.h | 2 +- src/engine/render.h | 5 +- src/engine/render/render_init.cpp | 42 +++++-- 23 files changed, 304 insertions(+), 51 deletions(-) create mode 100644 generated/do_editor_ui_for_compound_type_g_buffer_render_group.h diff --git a/generated/block_array_h_texture_688856411.h b/generated/block_array_h_texture_688856411.h index 013960eb0..de922950c 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:19:0 +// external/bonsai_stdlib/src/texture.h:35: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 5be00fd53..9568b6e29 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:16:0 +// external/bonsai_stdlib/src/texture.h:32:0 struct texture_block { 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 b87e609de..0523c1f66 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:413:0 +// src/engine/editor.cpp:416:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) 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 3e202297b..3df1eac02 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:434:0 +// src/engine/editor.cpp:437:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) 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 775b53205..bec6a73cf 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:431:0 +// src/engine/editor.cpp:434:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) 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 new file mode 100644 index 000000000..a1b960d2f --- /dev/null +++ b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h @@ -0,0 +1,112 @@ +// src/engine/editor.cpp:404:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) +{ + 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 g_buffer_render_group", Element), &DefaultUiRenderParams_Generic)) + { + DidToggle = True; + PushNewRow(Ui); + } + else + { + DrawChildren = False; + } + } + + if (DrawChildren) + { + PushTableStart(Ui); + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } + DoEditorUi(Ui, + Window, +&Element->FBO, + CSz("FBO"), + Params + ); + + + + + + + DoEditorUi(Ui, + Window, +&Element->Textures, + CSz("Textures"), + Params + ); + + + + + + + DoEditorUi(Ui, + Window, +&Element->gBufferShader, + CSz("gBufferShader"), + Params + ); + + + + + + + DoEditorUi(Ui, + Window, +&Element->InverseViewMatrix, + CSz("InverseViewMatrix"), + Params + ); + + + + + + + DoEditorUi(Ui, + Window, +&Element->InverseProjectionMatrix, + CSz("InverseProjectionMatrix"), + Params + ); + + + + + + + DoEditorUi(Ui, + Window, +&Element->ViewProjection, + CSz("ViewProjection"), + 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_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index 3024c8d30..e7bcf928d 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:404:0 +// src/engine/editor.cpp:407:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) 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 f931388c8..5db243eb8 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:428:0 +// src/engine/editor.cpp:431:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) 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 57f11cd86..8e93fb27e 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:419:0 +// src/engine/editor.cpp:422:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) @@ -111,6 +111,43 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + DoEditorUi(Ui, + Window, + Cast(b8*,&Element->RootChunkNeedsNewMesh), + CSz("RootChunkNeedsNewMesh"), + &DefaultUiRenderParams_Checkbox + ); + + + + + + PushNewRow(Ui); + + DoEditorUi(Ui, + Window, +&Element->MostRecentSelectionRegionMin, + CSz("MostRecentSelectionRegionMin"), + Params + ); + + + + + + + DoEditorUi(Ui, + Window, +&Element->NextSelectionRegionMin, + CSz("NextSelectionRegionMin"), + Params + ); + + + + + + DoEditorUi(Ui, Window, &Element->EditorPreviewRegionMin, 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 2bd982f21..bb5c46c06 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:407:0 +// src/engine/editor.cpp:410:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) 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 fcf9de077..3aaef61ef 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:410:0 +// src/engine/editor.cpp:413:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *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 7f0c76481..6b9c078e0 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:416:0 +// src/engine/editor.cpp:419: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 88dab0012..973859561 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:422:0 +// src/engine/editor.cpp:425: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 e7ae31659..4d905cbff 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:425:0 +// src/engine/editor.cpp:428: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_vector_type_688873645.h b/generated/do_editor_ui_for_vector_type_688873645.h index a447d6476..f13f031c2 100644 --- a/generated/do_editor_ui_for_vector_type_688873645.h +++ b/generated/do_editor_ui_for_vector_type_688873645.h @@ -148,4 +148,26 @@ 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) +{ + /* 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[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 ); + PushTableEnd(Ui); + /* PushNewRow(Ui); */ + EndColumn(Ui, Start); + } + /* PushTableEnd(Ui); */ + + PushNewRow(Ui); +} diff --git a/jesse.make.sh b/jesse.make.sh index c77b2f125..a29aa5de2 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 $OPT BuildAll -./make.sh $OPT \ - BuildSingleExample examples/blank_project \ - BuildSingleExample examples/project_and_level_picker \ - BuildSingleExample examples/terrain_gen \ - BuildExecutables \ - BuildDebugSystem \ +# ./make.sh $OPT \ +# BuildSingleExample examples/blank_project \ +# BuildSingleExample examples/project_and_level_picker \ +# BuildSingleExample examples/terrain_gen \ +# BuildExecutables \ +# BuildDebugSystem \ # BuildSingleExample examples/turn_based \ # BuildSingleExample examples/tools/voxel_synthesis_rule_baker \ # BuildSingleExample examples/the_wanderer \ diff --git a/shaders/Ao.fragmentshader b/shaders/Ao.fragmentshader index b2cef69fb..0de205807 100644 --- a/shaders/Ao.fragmentshader +++ b/shaders/Ao.fragmentshader @@ -2,8 +2,9 @@ in vec2 UV; out float Output; /* uniform sampler2D gColor; */ -uniform sampler2D gPosition; +/* uniform sampler2D gPosition; */ uniform sampler2D gNormal; +uniform sampler2D gDepth; uniform sampler2D SsaoNoiseTexture; uniform vec3 SsaoNoiseTile; @@ -12,6 +13,8 @@ uniform vec3 SsaoNoiseTile; const int SSAO_KERNEL_SIZE = 32; uniform vec3 SsaoKernel[SSAO_KERNEL_SIZE]; +uniform mat4 InverseViewMatrix; +uniform mat4 InverseProjectionMatrix; uniform mat4 ViewProjection; // Tuning @@ -22,8 +25,18 @@ uniform mat4 ViewProjection; void main() { vec3 FragNormal = texture(gNormal, UV).rgb; // modelspace - vec3 FragPosition = texture(gPosition, UV).rgb; // worldspace - float FragDepth = texture(gPosition, UV).w; // Linear + /* vec3 FragPosition = texture(gPosition, UV).rgb; // worldspace */ + + float FragDepthNonlinear = texture(gDepth, UV).r; + v3 FragPosition = WorldPositionFromNonlinearDepth(FragDepthNonlinear, UV, InverseProjectionMatrix, InverseViewMatrix); + + + + float FragDepth = Linearize(FragDepthNonlinear, 5000.f, 0.1f); + + /* Output = FragPosition.y; */ + /* Output = FragDepth; */ + /* return; */ vec3 Noise = texture(SsaoNoiseTexture, UV*SsaoNoiseTile.xy).xyz; @@ -59,10 +72,11 @@ void main() vec2 SampleUV = Projected.xy / Projected.w; // NDC to screen space [-1, 1] -> [0, 1] - SampleUV = (SampleUV.xy * 0.5) + 0.5; + SampleUV = (SampleUV.xy * 0.5f) + 0.5f; // get Sample depth: - float SampleDepth = texture(gPosition, SampleUV).w; + float SampleDepth = Linearize(texture(gDepth, SampleUV).r, 5000.f, 0.1f); + /* float SampleDepth = texture(gPosition, SampleUV).w; */ float DepthDelta = (BiasedFragDepth - SampleDepth); #if 0 diff --git a/shaders/Lighting.fragmentshader b/shaders/Lighting.fragmentshader index 807b6bd89..863fe5f5c 100644 --- a/shaders/Lighting.fragmentshader +++ b/shaders/Lighting.fragmentshader @@ -21,6 +21,7 @@ uniform bool BravoilMyersOIT; uniform bool BravoilMcGuireOIT; uniform mat4 InverseViewMatrix; +uniform mat4 InverseProjectionMatrix; uniform mat4 ShadowMVP; uniform vec3 SunPosition; @@ -69,10 +70,10 @@ float SunIntensity = 0.5f; // -vec3 SpecLightingCalc(float AttenuationFactor, vec3 DiffuseColor, vec3 FragToLight, vec3 FragPosition, vec3 FragNormal, vec3 CameraP) +vec3 SpecLightingCalc(float AttenuationFactor, vec3 DiffuseColor, vec3 FragToLight, vec3 FragWorldP, vec3 FragNormal, vec3 CameraP) { vec3 reflectionVector = reflect(FragToLight, FragNormal); - vec3 FragToCamera = normalize(FragPosition - CameraP); + vec3 FragToCamera = normalize(FragWorldP - CameraP); float cosAngle = max(0.0, dot(FragToCamera, reflectionVector)); float SpecularPower = pow(cosAngle, materialShininess); vec3 SpecularLight = DiffuseColor * SpecularPower; @@ -92,7 +93,42 @@ void main() { vec2 gBufferTextureDim = ApplicationResolution; ivec2 texelCoord = ivec2(gBufferUV*gBufferTextureDim); - vec4 FragPosition = texelFetch(gPosition, texelCoord, 0); + + /* vec4 FragWorldP = texelFetch(gPosition, texelCoord, 0); */ + + /* f32 Depth = texelFetch(gDepth, texelCoord, 0).r; */ + f32 Depth = texture(gDepth, gBufferUV).r; // NOTE(Jesse): Nonlinear + +#if 0 + /* f32 DepthNonlinear = Linearize(DepthNonlinear, 5000.f, 0.1f); // 1.f at far clip plane, 0.f at near clip */ + + f32 ClipZ = (Depth*2.f) - 1.f; + v2 ClipXY = (gBufferUV*2.f)-1.f; + + v4 ClipP = V4(ClipXY.x, ClipXY.y, ClipZ, 1.f); // Correct + v4 ViewP = InverseProjectionMatrix * ClipP; + + ViewP /= ViewP.w; + + v4 WorldP = InverseViewMatrix * ViewP; + v4 FragPosition = WorldP; +#endif + + v3 FragWorldP = WorldPositionFromNonlinearDepth(Depth, gBufferUV, InverseProjectionMatrix, InverseViewMatrix); + + /* out_LightColor.r = Depth; */ + /* out_LightColor.r = abs(ClipZ); */ + /* out_LightColor.xy = abs(ClipXY); */ + /* out_LightColor = abs(ClipP); */ + + /* out_LightColor = abs(InverseProjectionMatrix[0]); */ + /* out_LightColor = abs(InverseProjectionMatrix[1]); */ + /* out_LightColor = abs(ViewP); */ + /* out_LightColor = abs(WorldP); */ + /* out_LightColor = FragWorldP; */ + /* out_LightColor.a = 1.f; */ + /* return; */ + vec4 TransAccum = texture(TransparencyAccum, gBufferUV); float TransAccumCount = texture(TransparencyCount, gBufferUV).r; @@ -103,7 +139,7 @@ void main() vec3 BackLightContrib = V3(0.f); vec3 PointLightsContrib = V3(0.f); - vec3 CameraToFrag = normalize(FragPosition.xyz - CameraP); // TODO(Jesse): Pass this to the lighting calc that needs it + vec3 CameraToFrag = normalize(FragWorldP - CameraP); // TODO(Jesse): Pass this to the lighting calc that needs it vec4 gColorTexel = texelFetch(gColor, texelCoord, 0); @@ -119,14 +155,14 @@ void main() vec3 TotalLight = vec3(0.f); /* r32 DiscardThresh = f32_MAX; */ - /* if (FragPosition.x == DiscardThresh) */ + /* if (FragWorldP.x == DiscardThresh) */ /* { */ /* TotalLight = vec3(1.f); */ /* } */ /* else */ { - /* out_LightColor = FragPosition; */ + /* out_LightColor = FragWorldP; */ /* return; */ @@ -138,7 +174,7 @@ void main() float LightAtt = SunIntensity; KeyLightContrib = LightingCalc(LightAtt, SunColor, FragToLight, FragNormal, CameraP); - /* KeyLightContrib += SpecLightingCalc(LightAtt, Diffuse, FragToLight, FragPosition, FragNormal, CameraP); */ + /* KeyLightContrib += SpecLightingCalc(LightAtt, Diffuse, FragToLight, FragWorldP, FragNormal, CameraP); */ BackLightContrib = LightingCalc(LightAtt, 0.15f*SunColor, LightToFrag, FragNormal, CameraP); } @@ -152,17 +188,17 @@ void main() vec3 LightPosition = texelFetch(LightPositions, LightUV, 0).rgb; vec3 LightColor = texelFetch(LightColors, LightUV, 0).rgb; - vec3 FragToLight = normalize(LightPosition - FragPosition.xyz); + vec3 FragToLight = normalize(LightPosition - FragWorldP); float LightCosTheta = clamp( dot( FragNormal, FragToLight), 0.0f, 1.0f); - float Distance = distance(FragPosition.xyz, LightPosition); + float Distance = distance(FragWorldP, LightPosition); float LightAtt = 0.f; if (Distance > 0) { LightAtt = 1.0f/(Distance*Distance); } vec3 reflectionVector = reflect(FragToLight, FragNormal); - vec3 CameraToFrag = normalize(FragPosition.xyz - CameraP); + vec3 CameraToFrag = normalize(FragWorldP - CameraP); float cosAngle = max(0.f, dot(CameraToFrag, reflectionVector)); float SpecularPower = pow(cosAngle, materialShininess); @@ -205,9 +241,10 @@ void main() /* * Shadow Mapping */ - float acneBias = 0.0001f; // Fix acne + f32 LinearDepth = Linearize(Depth, 5000.f, 0.1f); + float acneBias = 0.045f * LinearDepth; // Fix acne - vec4 FragPShadowSpace = ShadowMVP * vec4(FragPosition.xyz, 1.f); + vec4 FragPShadowSpace = ShadowMVP * vec4(FragWorldP, 1.f); float FragDepth = FragPShadowSpace.z - acneBias; /* out_LightColor = vec4(FragDepth, FragDepth, FragDepth, 1.f); */ /* out_LightColor = FragPShadowSpace; */ @@ -265,7 +302,7 @@ void main() * Fog */ // TODO(Jesse): Can do squared? - float DistanceToFrag = distance(CameraP, FragPosition.xyz); + float DistanceToFrag = distance(CameraP, FragWorldP); float MaxFogDist = 20000.f; float FogContrib = clamp( DistanceToFrag / MaxFogDist, 0.f, 1.f); diff --git a/src/engine/api.cpp b/src/engine/api.cpp index f500f5bc6..c251c0346 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -295,6 +295,7 @@ Bonsai_Simulate(engine_resources *Resources) m4 ProjMat = ProjectionMatrix(Camera, Plat->ScreenDim); Resources->Graphics->gBuffer->InverseViewMatrix = Inverse(ViewMat); + Resources->Graphics->gBuffer->InverseProjectionMatrix = Inverse(ProjMat); Resources->Graphics->gBuffer->ViewProjection = ProjMat * ViewMat; #if BONSAI_DEBUG_SYSTEM_API diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index a801a8ac5..190eb0ed7 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -401,6 +401,9 @@ poof(do_editor_ui_for_compound_type(game_lights)) poof(do_editor_ui_for_compound_type(lighting_render_group)) #include +poof(do_editor_ui_for_compound_type(g_buffer_render_group)) +#include + poof(do_editor_ui_for_compound_type(graphics)) #include diff --git a/src/engine/editor.h b/src/engine/editor.h index 0e9b7122e..9407133c4 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -467,7 +467,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, void *Value, cs Name, ui_rend } -poof(do_editor_ui_for_vector_type({v4i v4 v3i v3 v2i v2 Quaternion})); +poof(do_editor_ui_for_vector_type({v4i v4 v3i v3 v2i v2 Quaternion m4})); #include diff --git a/src/engine/render.h b/src/engine/render.h index 930ab3a8e..38eda43c5 100644 --- a/src/engine/render.h +++ b/src/engine/render.h @@ -22,7 +22,7 @@ struct g_buffer_textures { texture Color; texture Normal; - texture Position; + /* texture Position; */ // NOTE(Jesse): Back-projected from depth texture Depth; }; @@ -31,7 +31,10 @@ struct g_buffer_render_group framebuffer FBO; g_buffer_textures Textures; shader gBufferShader; + m4 InverseViewMatrix; + m4 InverseProjectionMatrix; + m4 ViewProjection; }; diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index 22991e545..79e9b3455 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -156,6 +156,7 @@ MakeLightingShader( memory_arena *GraphicsMemory, b32 *BravoilMcGuireOIT, m4 *InverseViewMatrix, + m4 *InverseProjectionMatrix, m4 *ShadowMVP, game_lights *Lights, @@ -181,8 +182,8 @@ MakeLightingShader( memory_arena *GraphicsMemory, *Current = GetUniform(GraphicsMemory, &Shader, &gTextures->Normal, "gNormal"); Current = &(*Current)->Next; - *Current = GetUniform(GraphicsMemory, &Shader, &gTextures->Position, "gPosition"); - Current = &(*Current)->Next; +/* *Current = GetUniform(GraphicsMemory, &Shader, &gTextures->Position, "gPosition"); */ + /* Current = &(*Current)->Next; */ *Current = GetUniform(GraphicsMemory, &Shader, &gTextures->Depth, "gDepth"); Current = &(*Current)->Next; @@ -205,6 +206,12 @@ MakeLightingShader( memory_arena *GraphicsMemory, *Current = GetUniform(GraphicsMemory, &Shader, BravoilMcGuireOIT, "BravoilMcGuireOIT"); Current = &(*Current)->Next; + *Current = GetUniform(GraphicsMemory, &Shader, InverseViewMatrix, "InverseViewMatrix"); + Current = &(*Current)->Next; + + *Current = GetUniform(GraphicsMemory, &Shader, InverseProjectionMatrix, "InverseProjectionMatrix"); + Current = &(*Current)->Next; + *Current = GetUniform(GraphicsMemory, &Shader, ShadowMVP, "ShadowMVP"); Current = &(*Current)->Next; @@ -373,8 +380,13 @@ CreateGbufferShader(graphics *Graphics, memory_arena *GraphicsMemory, m4 *ViewPr } shader -MakeSsaoShader(memory_arena *GraphicsMemory, g_buffer_textures *gTextures, - texture *SsaoNoiseTexture, v3 *SsaoNoiseTile, m4 *ViewProjection) +MakeSsaoShader( memory_arena *GraphicsMemory, + g_buffer_textures *gTextures, + texture *SsaoNoiseTexture, + v3 *SsaoNoiseTile, + m4 *InverseViewMatrix, + m4 *InverseProjectionMatrix, + m4 *ViewProjection ) { shader Shader = LoadShaders( CSz(STDLIB_SHADER_PATH "Passthrough.vertexshader"), CSz(BONSAI_SHADER_PATH "Ao.fragmentshader") ); @@ -383,18 +395,27 @@ MakeSsaoShader(memory_arena *GraphicsMemory, g_buffer_textures *gTextures, /* *Current = GetUniform(GraphicsMemory, &Shader, &gTextures->Color, "gColor"); */ /* Current = &(*Current)->Next; */ - *Current = GetUniform(GraphicsMemory, &Shader, &gTextures->Position, "gPosition"); - Current = &(*Current)->Next; + /* *Current = GetUniform(GraphicsMemory, &Shader, &gTextures->Position, "gPosition"); */ + /* Current = &(*Current)->Next; */ *Current = GetUniform(GraphicsMemory, &Shader, &gTextures->Normal, "gNormal"); Current = &(*Current)->Next; + *Current = GetUniform(GraphicsMemory, &Shader, &gTextures->Depth, "gDepth"); + Current = &(*Current)->Next; + *Current = GetUniform(GraphicsMemory, &Shader, SsaoNoiseTexture, "SsaoNoiseTexture"); Current = &(*Current)->Next; *Current = GetUniform(GraphicsMemory, &Shader, SsaoNoiseTile, "SsaoNoiseTile"); Current = &(*Current)->Next; + *Current = GetUniform(GraphicsMemory, &Shader, InverseViewMatrix, "InverseViewMatrix"); + Current = &(*Current)->Next; + + *Current = GetUniform(GraphicsMemory, &Shader, InverseProjectionMatrix, "InverseProjectionMatrix"); + Current = &(*Current)->Next; + *Current = GetUniform(GraphicsMemory, &Shader, ViewProjection, "ViewProjection"); Current = &(*Current)->Next; @@ -433,11 +454,11 @@ InitGbufferRenderGroup(v2i ApplicationResolution, g_buffer_render_group *gBuffer gBuffer->Textures.Normal = MakeTexture_RGB( ApplicationResolution, (v3*)0, CSz("gBufferNormal"), TextureStorageFormat_RGBA16F); // NOTE(Jesse): Depth gets stuffed into A value here. - gBuffer->Textures.Position = MakeTexture_RGBA( ApplicationResolution, (v4*)0, CSz("gBufferPosition"), TextureStorageFormat_RGBA32F); + /* gBuffer->Textures.Position = MakeTexture_RGBA( ApplicationResolution, (v4*)0, CSz("gBufferPosition"), TextureStorageFormat_RGBA32F); */ FramebufferTexture(&gBuffer->FBO, &gBuffer->Textures.Color); FramebufferTexture(&gBuffer->FBO, &gBuffer->Textures.Normal); - FramebufferTexture(&gBuffer->FBO, &gBuffer->Textures.Position); + /* FramebufferTexture(&gBuffer->FBO, &gBuffer->Textures.Position); */ SetDrawBuffers(&gBuffer->FBO); gBuffer->Textures.Depth = MakeDepthTexture( ApplicationResolution, CSz("gBufferDepth") ); @@ -711,7 +732,8 @@ GraphicsInit(engine_settings *EngineSettings, memory_arena *GraphicsMemory) &Result->Settings.BravoilMyersOIT, &Result->Settings.BravoilMcGuireOIT, - &Result->gBuffer->InverseViewMatrix, + &gBuffer->InverseViewMatrix, + &gBuffer->InverseProjectionMatrix, &SG->MVP, &Lighting->Lights, @@ -779,6 +801,8 @@ GraphicsInit(engine_settings *EngineSettings, memory_arena *GraphicsMemory) &gBuffer->Textures, &AoGroup->NoiseTexture, &AoGroup->NoiseTile, + &gBuffer->InverseViewMatrix, + &gBuffer->InverseProjectionMatrix, &gBuffer->ViewProjection ); AoGroup->SsaoKernelUniform = GetShaderUniform(&AoGroup->Shader, "SsaoKernel"); From dfa760faf483c12d0047f10d72af8217102e3ece Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 27 Mar 2024 14:51:40 -0700 Subject: [PATCH 11/14] Turn down transparency texture storage resolution (32f -> 16f) --- jesse.make.sh | 2 +- src/engine/render/render_init.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/jesse.make.sh b/jesse.make.sh index a29aa5de2..3b14be088 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/render/render_init.cpp b/src/engine/render/render_init.cpp index 79e9b3455..75c637b66 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -578,13 +578,13 @@ InitTransparencyRenderGroup(render_settings *Settings, transparency_render_group { u32 Channels = 4; Group->AccumTex = GenTexture(TextureSize, CSz("Transparency Accum"), Channels); - GL.TexImage2D( GL_TEXTURE_2D, 0, GL_RGBA32F, TextureSize.x, TextureSize.y, 0, GL_RGBA, GL_FLOAT, 0); + GL.TexImage2D( GL_TEXTURE_2D, 0, GL_RGBA16F, TextureSize.x, TextureSize.y, 0, GL_RGBA, GL_FLOAT, 0); } { u32 Channels = 2; Group->RevealTex = GenTexture(TextureSize, CSz("Transparency Reveal"), Channels); - GL.TexImage2D( GL_TEXTURE_2D, 0, GL_RG32F, TextureSize.x, TextureSize.y, 0, GL_RG, GL_FLOAT, 0); + GL.TexImage2D( GL_TEXTURE_2D, 0, GL_RG16F, TextureSize.x, TextureSize.y, 0, GL_RG, GL_FLOAT, 0); } // NOTE(Jesse): These have to be bound in this order because they're cleared From feff54c83f25639d710acdf4688ad1d0255d9c20 Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 27 Mar 2024 14:56:51 -0700 Subject: [PATCH 12/14] Changelog --- CHANGELOG.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index a86a2c6bf..3b925326e 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -7,7 +7,7 @@ - Fixed the preview jank when using a layered brush. The preview should now appear stable in the viewport -- Tuned some gBuffer texture sizes & turned down default shadow quality +- Tuned some gBuffer texture storage resolution, transparency buffer storage resolution, & turned down default shadow quality This is in an effort to get mid-end cards running at >60fps on 4k * 1.5.0 From 721615b0edf512612258f84118a9f64bef1d56de Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 27 Mar 2024 15:23:00 -0700 Subject: [PATCH 13/14] Update stdlib --- external/bonsai_stdlib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 083ef12c3..65ef6f8ce 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 083ef12c333cea334ea44ee16f60551b31592a54 +Subproject commit 65ef6f8ce0894e0d063945495fecffa6b51f84d7 From ebb7b121e14170add12e8ca9f8bf534f4f86ca11 Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 28 Mar 2024 09:06:57 -0700 Subject: [PATCH 14/14] Fix assertions in terrain generators using non-tiled voronoi noise --- external/bonsai_stdlib | 2 +- src/engine/terrain.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 65ef6f8ce..374a35f4a 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 65ef6f8ce0894e0d063945495fecffa6b51f84d7 +Subproject commit 374a35f4a7e78ce5415b0cc70ced5f033cabb9c3 diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index 49c8f7e85..5f3593819 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -2321,7 +2321,7 @@ Terrain_Voronoi3D( world_chunk *Chunk, v3 RepeatBasisInCells = V3(8); v3 NoiseInput = NoiseMod((V3(x,y,z) + NoiseBasis)/Period, RepeatBasisInCells); - r32 NoiseValue = VoronoiNoise3D(NoiseInput, Squareness, MaskChance, RepeatBasisInCells); + r32 NoiseValue = VoronoiNoise3D_Tiled(NoiseInput, RepeatBasisInCells, Squareness, MaskChance); NoiseValue = Clamp01(NoiseValue); NoiseValue *= Amplitude;