Skip to content

Commit d49ff92

Browse files
committed
Add Decal rendering
Add Forward+ style Decal rendering through LightRenderer Add Decal component Add Inspectors for AABB and Decal Add function for loading textures into ModelRenderers texture array Add DirtyAABB tag Fix issue where WorldAABB was not updated when AABB changed Update Engine submodule
1 parent 1f98b95 commit d49ff92

31 files changed

+1771
-105
lines changed

Source/Game-Lib/Game-Lib/ECS/Components/AABB.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,6 @@ namespace ECS::Components
1616
vec3 min;
1717
vec3 max;
1818
};
19+
20+
struct DirtyAABB {};
1921
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#pragma once
2+
#include <Base/Types.h>
3+
#include <Base/Math/Color.h>
4+
5+
namespace ECS::Components
6+
{
7+
struct Decal
8+
{
9+
std::string texturePath;
10+
Color colorMultiplier = Color::White;
11+
hvec2 thresholdMinMax = hvec2(0.0f, 1.0f);
12+
hvec2 minUV = hvec2(0.0f, 0.0f);
13+
hvec2 maxUV = hvec2(1.0f, 1.0f);
14+
u32 flags = 0; // DecalFlags
15+
};
16+
17+
struct DirtyDecal {};
18+
}

Source/Game-Lib/Game-Lib/ECS/Systems/CalculateCameraMatrices.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,6 @@ namespace ECS::Systems
8383

8484
if (CVAR_CameraLockCullingFrustum.Get() == 0)
8585
{
86-
mat4x4 m = glm::transpose(camera.worldToClip);
87-
8886
glm::vec3 Front = glm::vec3(0, 0, 1);
8987
glm::vec3 Right = glm::vec3(1, 0, 0);
9088
glm::vec3 Up = glm::vec3(0, 1, 0);

Source/Game-Lib/Game-Lib/ECS/Systems/UpdateAABBs.cpp

Lines changed: 44 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -8,42 +8,55 @@
88

99
namespace ECS::Systems
1010
{
11+
void UpdateWorldAABB(const Components::Transform& transform, const Components::AABB& aabb, Components::WorldAABB& worldAABB)
12+
{
13+
// Calculate the world AABB
14+
glm::vec3 min = aabb.centerPos - aabb.extents;
15+
glm::vec3 max = aabb.centerPos + aabb.extents;
16+
17+
glm::vec3 corners[8] = {
18+
glm::vec3(min.x, min.y, min.z),
19+
glm::vec3(min.x, min.y, max.z),
20+
glm::vec3(min.x, max.y, min.z),
21+
glm::vec3(min.x, max.y, max.z),
22+
glm::vec3(max.x, min.y, min.z),
23+
glm::vec3(max.x, min.y, max.z),
24+
glm::vec3(max.x, max.y, min.z),
25+
glm::vec3(max.x, max.y, max.z)
26+
};
27+
28+
const mat4x4 transformMatrix = transform.GetMatrix();
29+
for (i32 i = 0; i < 8; ++i)
30+
{
31+
corners[i] = transformMatrix * glm::vec4(corners[i], 1.0f);
32+
}
33+
34+
worldAABB.min = vec3(1000000000.0f);
35+
worldAABB.max = vec3(-1000000000.0f);
36+
37+
for (i32 i = 1; i < 8; ++i)
38+
{
39+
worldAABB.min = glm::min(worldAABB.min, corners[i]);
40+
worldAABB.max = glm::max(worldAABB.max, corners[i]);
41+
}
42+
}
43+
1144
void UpdateAABBs::Update(entt::registry& registry, f32 deltaTime)
1245
{
1346
ZoneScopedN("ECS::UpdateAABBs");
1447

15-
auto view = registry.view<Components::Transform, Components::AABB, Components::WorldAABB, Components::DirtyTransform>();
16-
view.each([&](entt::entity entity, Components::Transform& transform, Components::AABB& aabb, Components::WorldAABB& worldAABB, ECS::Components::DirtyTransform& dirtyTransform)
48+
// Update AABBs for entities with dirty transforms
49+
auto dirtyTransformView = registry.view<Components::Transform, Components::AABB, Components::WorldAABB, Components::DirtyTransform>();
50+
dirtyTransformView.each([&](entt::entity entity, Components::Transform& transform, Components::AABB& aabb, Components::WorldAABB& worldAABB, ECS::Components::DirtyTransform& dirtyTransform)
51+
{
52+
UpdateWorldAABB(transform, aabb, worldAABB);
53+
});
54+
55+
// Update AABBs for entities with dirty AABBs
56+
auto dirtyAABBView = registry.view<Components::Transform, Components::AABB, Components::WorldAABB, Components::DirtyAABB>();
57+
dirtyAABBView.each([&](entt::entity entity, Components::Transform& transform, Components::AABB& aabb, Components::WorldAABB& worldAABB)
1758
{
18-
// Calculate the world AABB
19-
glm::vec3 min = aabb.centerPos - aabb.extents;
20-
glm::vec3 max = aabb.centerPos + aabb.extents;
21-
22-
glm::vec3 corners[8] = {
23-
glm::vec3(min.x, min.y, min.z),
24-
glm::vec3(min.x, min.y, max.z),
25-
glm::vec3(min.x, max.y, min.z),
26-
glm::vec3(min.x, max.y, max.z),
27-
glm::vec3(max.x, min.y, min.z),
28-
glm::vec3(max.x, min.y, max.z),
29-
glm::vec3(max.x, max.y, min.z),
30-
glm::vec3(max.x, max.y, max.z)
31-
};
32-
33-
const mat4x4 transformMatrix = transform.GetMatrix();
34-
for (i32 i = 0; i < 8; ++i)
35-
{
36-
corners[i] = transformMatrix * glm::vec4(corners[i], 1.0f);
37-
}
38-
39-
worldAABB.min = vec3(1000000000.0f);
40-
worldAABB.max = vec3(-1000000000.0f);
41-
42-
for (i32 i = 1; i < 8; ++i)
43-
{
44-
worldAABB.min = glm::min(worldAABB.min, corners[i]);
45-
worldAABB.max = glm::max(worldAABB.max, corners[i]);
46-
}
59+
UpdateWorldAABB(transform, aabb, worldAABB);
4760
});
4861
}
4962
}

Source/Game-Lib/Game-Lib/Editor/Inspector.cpp

Lines changed: 127 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,12 @@
11
#include "Inspector.h"
22

3-
#include <Game-Lib/Util/ServiceLocator.h>
4-
#include <Game-Lib/Util/ImguiUtil.h>
53
#include <Game-Lib/Application/EnttRegistries.h>
6-
#include <Game-Lib/Rendering/GameRenderer.h>
7-
#include <Game-Lib/Rendering/Terrain/TerrainRenderer.h>
8-
#include <Game-Lib/Rendering/Model/ModelLoader.h>
9-
#include <Game-Lib/Rendering/Model/ModelRenderer.h>
10-
#include <Game-Lib/Rendering/Debug/DebugRenderer.h>
11-
#include <Game-Lib/Rendering/PixelQuery.h>
12-
#include <Game-Lib/Rendering/Camera.h>
134
#include <Game-Lib/ECS/Singletons/ActiveCamera.h>
145
#include <Game-Lib/ECS/Singletons/FreeflyingCameraSettings.h>
156
#include <Game-Lib/ECS/Singletons/RenderState.h>
167
#include <Game-Lib/ECS/Singletons/Database/TextureSingleton.h>
178
#include <Game-Lib/ECS/Components/Camera.h>
9+
#include <Game-Lib/ECS/Components/Decal.h>
1810
#include <Game-Lib/ECS/Components/Model.h>
1911
#include <Game-Lib/ECS/Components/Name.h>
2012
#include <Game-Lib/ECS/Components/Unit.h>
@@ -23,6 +15,15 @@
2315
#include <Game-Lib/Editor/ActionStack.h>
2416
#include <Game-Lib/Editor/Hierarchy.h>
2517
#include <Game-Lib/Editor/Viewport.h>
18+
#include <Game-Lib/Rendering/GameRenderer.h>
19+
#include <Game-Lib/Rendering/Terrain/TerrainRenderer.h>
20+
#include <Game-Lib/Rendering/Model/ModelLoader.h>
21+
#include <Game-Lib/Rendering/Model/ModelRenderer.h>
22+
#include <Game-Lib/Rendering/Debug/DebugRenderer.h>
23+
#include <Game-Lib/Rendering/PixelQuery.h>
24+
#include <Game-Lib/Rendering/Camera.h>
25+
#include <Game-Lib/Util/ServiceLocator.h>
26+
#include <Game-Lib/Util/ImguiUtil.h>
2627

2728
#include <Renderer/RenderSettings.h>
2829

@@ -322,8 +323,12 @@ namespace Editor
322323

323324
InspectEntityTransform(entity);
324325

326+
InspectEntityAABB(entity);
327+
325328
InspectEntityModel(entity);
326329

330+
InspectEntityDecal(entity);
331+
327332
if (ECS::Components::Unit* unit = registry->try_get<ECS::Components::Unit>(entity))
328333
{
329334
ImGui::Text("Body ID: %d", unit->bodyID);
@@ -521,6 +526,119 @@ namespace Editor
521526
ImGui::PopStyleColor();
522527
}
523528

529+
void Inspector::InspectEntityAABB(entt::entity entity)
530+
{
531+
entt::registry* registry = ServiceLocator::GetEnttRegistries()->gameRegistry;
532+
533+
ECS::Components::AABB* aabb = registry->try_get<ECS::Components::AABB>(entity);
534+
535+
ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0.4f, 0.4f, 0.4f, 1.0f));
536+
537+
if (aabb)
538+
{
539+
if (Util::Imgui::BeginGroupPanel("AABB"))
540+
{
541+
bool isDirty = false;
542+
543+
// Center Pos
544+
vec3 centerPos = aabb->centerPos;
545+
if (ImGui::DragFloat3("center pos", &centerPos.x))
546+
{
547+
aabb->centerPos = centerPos;
548+
isDirty = true;
549+
}
550+
551+
// Extents
552+
vec3 extents = aabb->extents;
553+
if (ImGui::DragFloat3("extents", &extents.x))
554+
{
555+
aabb->extents = extents;
556+
isDirty = true;
557+
}
558+
559+
if (isDirty)
560+
{
561+
registry->emplace_or_replace<ECS::Components::DirtyAABB>(entity);
562+
}
563+
}
564+
Util::Imgui::EndGroupPanel();
565+
}
566+
ImGui::PopStyleColor();
567+
}
568+
569+
void Inspector::InspectEntityDecal(entt::entity entity)
570+
{
571+
entt::registry* registry = ServiceLocator::GetEnttRegistries()->gameRegistry;
572+
573+
ECS::Components::Decal* decal = registry->try_get<ECS::Components::Decal>(entity);
574+
575+
ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0.4f, 0.4f, 0.4f, 1.0f));
576+
577+
if (decal)
578+
{
579+
if (Util::Imgui::BeginGroupPanel("Decal"))
580+
{
581+
bool isDirty = false;
582+
583+
std::string texturePath = decal->texturePath;
584+
if (ImGui::InputText("Texture Path", &texturePath))
585+
{
586+
decal->texturePath = texturePath;
587+
isDirty = true;
588+
}
589+
590+
Color color = decal->colorMultiplier;
591+
if (ImGui::ColorEdit3("Color Multiplier", &color.r))
592+
{
593+
decal->colorMultiplier = color;
594+
isDirty = true;
595+
}
596+
597+
f32 thresholdMin = f32(decal->thresholdMinMax.x);
598+
if (ImGui::SliderFloat("Threshold Min", &thresholdMin, -1.0f, 1.0f))
599+
{
600+
decal->thresholdMinMax.x = f16(thresholdMin);
601+
isDirty = true;
602+
}
603+
604+
f32 thresholdMax = f32(decal->thresholdMinMax.y);
605+
if (ImGui::SliderFloat("Threshold Max", &thresholdMax, -1.0f, 1.0f))
606+
{
607+
decal->thresholdMinMax.y = f16(thresholdMax);
608+
isDirty = true;
609+
}
610+
611+
vec2 minUV = vec2(decal->minUV);
612+
if (ImGui::DragFloat2("Min UV", &minUV.x, 0.01f, 0.0f, 1.0f))
613+
{
614+
decal->minUV = hvec2(minUV);
615+
isDirty = true;
616+
}
617+
618+
vec2 maxUV = vec2(decal->maxUV);
619+
if (ImGui::DragFloat2("Max UV", &maxUV.x, 0.01f, 0.0f, 1.0f))
620+
{
621+
decal->maxUV = hvec2(maxUV);
622+
isDirty = true;
623+
}
624+
625+
u32 flags = decal->flags;
626+
if (ImGui::InputScalar("Flags", ImGuiDataType_U32, &flags, nullptr, nullptr, "%u", ImGuiInputTextFlags_CharsHexadecimal))
627+
{
628+
decal->flags = flags;
629+
isDirty = true;
630+
}
631+
632+
if (isDirty)
633+
{
634+
registry->emplace_or_replace<ECS::Components::DirtyDecal>(entity);
635+
}
636+
}
637+
Util::Imgui::EndGroupPanel();
638+
}
639+
ImGui::PopStyleColor();
640+
}
641+
524642
bool Inspector::DrawGizmo(entt::registry* registry, entt::entity entity, ECS::Components::Transform& transform)
525643
{
526644
entt::registry::context& ctx = registry->ctx();

Source/Game-Lib/Game-Lib/Editor/Inspector.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ namespace Editor
5151
void InspectEntity(entt::entity entity);
5252
void InspectEntityTransform(entt::entity entity);
5353
void InspectEntityModel(entt::entity entity);
54+
void InspectEntityAABB(entt::entity entity);
55+
void InspectEntityDecal(entt::entity entity);
5456
bool DrawGizmo(entt::registry* registry, entt::entity entity, ECS::Components::Transform& transform);
5557
void DrawGizmoControls();
5658

Source/Game-Lib/Game-Lib/Rendering/GameRenderer.cpp

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include "UIRenderer.h"
44
#include "Debug/DebugRenderer.h"
55
#include "Debug/JoltDebugRenderer.h"
6+
#include "Light/LightRenderer.h"
67
#include "Terrain/TerrainRenderer.h"
78
#include "Terrain/TerrainLoader.h"
89
#include "Terrain/TerrainManipulator.h"
@@ -145,7 +146,8 @@ GameRenderer::GameRenderer(InputManager* inputManager)
145146
_joltDebugRenderer = new JoltDebugRenderer(_renderer, _debugRenderer);
146147

147148
_modelRenderer = new ModelRenderer(_renderer, _debugRenderer);
148-
_modelLoader = new ModelLoader(_modelRenderer);
149+
_lightRenderer = new LightRenderer(_renderer, _debugRenderer, _modelRenderer);
150+
_modelLoader = new ModelLoader(_modelRenderer, _lightRenderer);
149151
_modelLoader->Init();
150152

151153
_liquidRenderer = new LiquidRenderer(_renderer, _debugRenderer);
@@ -159,8 +161,8 @@ GameRenderer::GameRenderer(InputManager* inputManager)
159161
_modelLoader->SetTerrainLoader(_terrainLoader);
160162

161163
_mapLoader = new MapLoader(_terrainLoader, _modelLoader, _liquidLoader);
162-
163-
_materialRenderer = new MaterialRenderer(_renderer, _terrainRenderer, _modelRenderer);
164+
165+
_materialRenderer = new MaterialRenderer(_renderer, _terrainRenderer, _modelRenderer, _lightRenderer);
164166
_skyboxRenderer = new SkyboxRenderer(_renderer, _debugRenderer);
165167
_editorRenderer = new EditorRenderer(_renderer, _debugRenderer);
166168
_canvasRenderer = new CanvasRenderer(_renderer, _debugRenderer);
@@ -206,6 +208,7 @@ void GameRenderer::UpdateRenderers(f32 deltaTime)
206208
_materialRenderer->Update(deltaTime);
207209
_joltDebugRenderer->Update(deltaTime);
208210
_debugRenderer->Update(deltaTime);
211+
_lightRenderer->Update(deltaTime);
209212
_pixelQuery->Update(deltaTime);
210213
_editorRenderer->Update(deltaTime);
211214
_canvasRenderer->Update(deltaTime);
@@ -383,6 +386,8 @@ f32 GameRenderer::Render()
383386
_liquidRenderer->AddCullingPass(&renderGraph, _resources, _frameIndex);
384387
_liquidRenderer->AddGeometryPass(&renderGraph, _resources, _frameIndex);
385388

389+
_lightRenderer->AddClassificationPass(&renderGraph, _resources, _frameIndex);
390+
386391
_materialRenderer->AddPreEffectsPass(&renderGraph, _resources, _frameIndex);
387392
_effectRenderer->AddSSAOPass(&renderGraph, _resources, _frameIndex);
388393

@@ -396,6 +401,8 @@ f32 GameRenderer::Render()
396401
_canvasRenderer->AddCanvasPass(&renderGraph, _resources, _frameIndex);
397402
_debugRenderer->Add2DPass(&renderGraph, _resources, _frameIndex);
398403

404+
_lightRenderer->AddDebugPass(&renderGraph, _resources, _frameIndex);
405+
399406
Renderer::ImageID finalTarget = isEditorMode ? _resources.finalColor : _resources.sceneColor;
400407
_uiRenderer->AddImguiPass(&renderGraph, _resources, _frameIndex, finalTarget);
401408

@@ -532,6 +539,17 @@ void GameRenderer::CreatePermanentResources()
532539
sceneColorDesc.clearColor = Color(0.43f, 0.50f, 0.56f, 1.0f); // Slate gray
533540
_resources.finalColor = _renderer->CreateImage(sceneColorDesc);
534541

542+
// Debug rendertarget
543+
Renderer::ImageDesc debugColorDesc;
544+
debugColorDesc.debugName = "DebugColor";
545+
debugColorDesc.dimensions = vec2(1.0f, 1.0f);
546+
debugColorDesc.dimensionType = Renderer::ImageDimensionType::DIMENSION_SCALE_RENDERSIZE;
547+
debugColorDesc.format = _renderer->GetSwapChainImageFormat();
548+
debugColorDesc.sampleCount = Renderer::SampleCount::SAMPLE_COUNT_1;
549+
debugColorDesc.clearColor = Color::Clear;
550+
551+
_resources.debugColor = _renderer->CreateImage(debugColorDesc);
552+
535553
// SSAO
536554
Renderer::ImageDesc ssaoTargetDesc;
537555
ssaoTargetDesc.debugName = "SSAOTarget";

Source/Game-Lib/Game-Lib/Rendering/GameRenderer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ class MaterialRenderer;
3232
class SkyboxRenderer;
3333
class EditorRenderer;
3434
class DebugRenderer;
35+
class LightRenderer;
3536
class JoltDebugRenderer;
3637
class CanvasRenderer;
3738
class LiquidLoader;
@@ -134,6 +135,7 @@ class GameRenderer
134135
MaterialRenderer* _materialRenderer = nullptr;
135136
SkyboxRenderer* _skyboxRenderer = nullptr;
136137
DebugRenderer* _debugRenderer = nullptr;
138+
LightRenderer* _lightRenderer = nullptr;
137139
JoltDebugRenderer* _joltDebugRenderer = nullptr;
138140
EditorRenderer* _editorRenderer = nullptr;
139141
CanvasRenderer* _canvasRenderer = nullptr;

0 commit comments

Comments
 (0)