LkEngine 0.1.2
 
Loading...
Searching...
No Matches
SceneRenderer.h
1#pragma once
2
4#include "LkEngine/Core/LObject/ObjectPtr.h"
5
7#include "LkEngine/Renderer/RenderPass.h"
8#include "LkEngine/Scene/Scene.h"
9
10#include "LkEngine/Renderer/UniformBufferSet.h"
11
12namespace LkEngine {
13
14 class LMaterial;
15 class LMesh;
16 class LStaticMesh;
17 class LRenderer;
18 class LRenderer2D;
19 class LRenderCommandBuffer;
20 class LVertexBuffer;
21
23 {
24 uint32_t ShadowCascades = 4;
25 };
26
28 {
29 uint32_t StaticMeshDrawListSize = 0;
30 uint32_t StaticMeshTransformMapSize = 0;
31
32 uint32_t MeshDrawListSize = 0;
33 uint32_t MeshTransformMapSize = 0;
34 };
35
36 class LSceneRenderer : public LObject
37 {
38 public:
39 LK_DECLARE_MULTICAST_DELEGATE(FOnDrawListFlush, const FSceneRendererFlushData&);
40 public:
43 ~LSceneRenderer() = default;
44
45 void Initialize();
46 void Destroy();
47
48 void BeginScene(const LSceneCamera& Camera);
49 void EndScene();
50
51 void SetScene(TObjectPtr<LScene> InScene);
52
54 TObjectPtr<LMaterialTable> MaterialTable,
55 const glm::mat4& Transform,
56 TObjectPtr<LMaterialAsset> MaterialOverride = nullptr);
57
59 const uint32_t SubmeshIndex,
60 TObjectPtr<LMaterialTable> MaterialTable,
61 const glm::mat4& Transform,
62 TObjectPtr<LMaterialAsset> MaterialOverride = nullptr);
63
65 {
66 uint32_t DrawCalls = 0;
67 uint32_t Meshes = 0;
68 uint32_t Instances = 0;
69 float TotalGpuTime = 0.0f;
70 };
71
72 private:
73 void PreRender();
74 void FlushDrawList();
75
76 public:
77 FOnDrawListFlush OnDrawListFlush;
78 private:
79 enum class EMeshRigged
80 {
81 IsRigged,
82 NotRigged
83 };
84
88 struct FMeshKey
89 {
90 FAssetHandle MeshHandle = 0;
91 FAssetHandle MaterialHandle = 0;
92 uint32_t SubmeshIndex = 0;
93 bool bIsSelected = false;
94
95 FMeshKey(const FAssetHandle InMeshHandle,
96 const FAssetHandle InMaterialHandle,
97 const uint32_t InSubmeshIndex,
98 const bool IsSelected)
99 : MeshHandle(InMeshHandle)
100 , MaterialHandle(InMaterialHandle)
101 , SubmeshIndex(InSubmeshIndex)
102 , bIsSelected(IsSelected)
103 {
104 }
105
106 FORCEINLINE bool operator<(const FMeshKey& Other) const
107 {
108 if (MeshHandle < Other.MeshHandle) return true;
109 if (MeshHandle > Other.MeshHandle) return false;
110 if (SubmeshIndex < Other.SubmeshIndex) return true;
111 if (SubmeshIndex > Other.SubmeshIndex) return false;
112 if (MaterialHandle < Other.MaterialHandle) return true;
113 if (MaterialHandle > Other.MaterialHandle) return false;
114 return (bIsSelected < Other.bIsSelected);
115 }
116 };
117
121 template<typename MeshType = LMesh>
122 struct FDrawCommand
123 {
124 TObjectPtr<MeshType> Mesh{};
125 uint32_t SubmeshIndex{};
126 TObjectPtr<LMaterialTable> MaterialTable{};
127 TObjectPtr<LMaterial> OverrideMaterial{};
128
129 uint32_t InstanceCount = 0;
130 uint32_t InstanceOffset = 0;
131 bool bIsRigged = false; /* TODO: Replace with enum EMeshRigged. */
132 };
133
134 struct FTransformVertexData
135 {
136 glm::vec4 MRow[3];
137 };
138
139 struct FTransformBuffer
140 {
141 TObjectPtr<LVertexBuffer> Buffer{};
142 FTransformVertexData* Data = nullptr;
143 };
144
145 struct FTransformMapData
146 {
147 std::vector<FTransformVertexData> Transforms{};
148 uint32_t TransformOffset = 0;
149 };
150
151 private:
152 FSceneRendererSpecification Specification{};
153 TObjectPtr<LScene> Scene;
154
156 TObjectPtr<LRenderCommandBuffer> CommandBuffer;
157 TObjectPtr<LRenderer2D> Renderer2D;
158
159 struct FSceneData
160 {
161 glm::mat4 ViewProjectionMatrix;
162 };
163 FSceneData Data{};
164
165 TObjectPtr<LPipeline> GeometryPipeline;
166 TObjectPtr<LRenderPass> GeometryPass;
167 TObjectPtr<LUniformBufferSet> UBSCamera;
168
169 std::map<FMeshKey, FDrawCommand<LMesh>> MeshDrawList{};
170 std::map<FMeshKey, FTransformMapData> MeshTransformMap;
171
172 std::map<FMeshKey, FDrawCommand<LStaticMesh>> StaticMeshDrawList{};
173 std::map<FMeshKey, FTransformMapData> StaticMeshTransformMap;
174
175 friend class LSceneManagerPanel;
176
177 LCLASS(LSceneRenderer)
178 };
179
180}
LObject implementation.
Pipeline.
Definition Object.h:46
Definition SceneCamera.h:12
Definition SceneRenderer.h:37
void Destroy()
Destroy object, releasing all resources.
Definition SceneRenderer.cpp:32
void SubmitStaticMesh(TObjectPtr< LStaticMesh > StaticMesh, TObjectPtr< LMaterialTable > MaterialTable, const glm::mat4 &Transform, TObjectPtr< LMaterialAsset > MaterialOverride=nullptr)
Definition SceneRenderer.cpp:60
void Initialize()
Initialize object.
Definition SceneRenderer.cpp:28
void SubmitMesh(TObjectPtr< LMesh > Mesh, const uint32_t SubmeshIndex, TObjectPtr< LMaterialTable > MaterialTable, const glm::mat4 &Transform, TObjectPtr< LMaterialAsset > MaterialOverride=nullptr)
Definition SceneRenderer.cpp:121
Definition ObjectPtr.h:102
#define LCLASS(Class)
Definition CoreMacros.h:226
Definition Asset.h:11
Definition SceneRenderer.h:28
Definition SceneRenderer.h:23
Definition SceneRenderer.h:65
Definition UUID.h:13