Skip to content

Commit ffe215e

Browse files
[Renderer] [Engine] material use count & display info in GUI
1 parent da953aa commit ffe215e

12 files changed

Lines changed: 102 additions & 38 deletions

Engine/MauEng/Private/GUI/ImGUILayer.cpp

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,11 +183,13 @@ namespace MauEng
183183

184184
void ImGUILayer::RenderRendererInfo()
185185
{
186-
auto const& info{ RENDERER.GetRendererMeshInfo() };
187186

188-
ImGui::Begin("Renderer Mesh Info");
187+
ImGui::Begin("Renderer Info");
188+
189189
if (ImGui::BeginTable("MeshTable", 1, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg))
190190
{
191+
auto const& info{ RENDERER.GetRendererMeshInfo() };
192+
191193
ImGui::TableSetupColumn("Meshes");
192194
ImGui::TableHeadersRow();
193195

@@ -221,6 +223,45 @@ namespace MauEng
221223

222224
ImGui::EndTable();
223225
}
226+
227+
if (ImGui::BeginTable("MaterialTable", 1, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg))
228+
{
229+
auto const& info{ RENDERER.GetMaterialRendererInfo() };
230+
231+
ImGui::TableSetupColumn("Materials");
232+
ImGui::TableHeadersRow();
233+
234+
for (auto const& mat : info.name_ID)
235+
{
236+
ImGui::TableNextRow();
237+
ImGui::TableSetColumnIndex(0);
238+
239+
if (ImGui::TreeNode(mat.first.c_str()))
240+
{
241+
ImGui::Indent();
242+
243+
// Display mesh details as plain text or another table
244+
auto const loadedID{ mat.second.materialID };
245+
if (loadedID == UINT32_MAX)
246+
{
247+
ImGui::TextColored(ImVec4(1, 0, 0, 1), "Invalid Material ID");
248+
}
249+
else
250+
{
251+
ImGui::Text("Mat ID: %zu", info.matData[loadedID].materialID);
252+
ImGui::Text("Use Count: %zu", mat.second.useCount);
253+
ImGui::Text("Albedo texture ID: %zu", info.matData[loadedID].albedoTextureID);
254+
ImGui::Text("Normal texture ID: %zu", info.matData[loadedID].normalTextureID);
255+
ImGui::Text("Metalness texture ID: %zu", info.matData[loadedID].metallicTextureID);
256+
}
257+
258+
ImGui::Unindent();
259+
ImGui::TreePop();
260+
}
261+
}
262+
263+
ImGui::EndTable();
264+
}
224265
ImGui::End();
225266
}
226267
}

Engine/Renderer/Private/NullRenderer.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,16 @@ namespace MauRen
4646
return temp;
4747
}
4848

49+
virtual [[nodiscard]] struct MaterialRendererInfo GetMaterialRendererInfo() const noexcept override
50+
{
51+
static auto temp01{ std::unordered_map<std::string, LoadedMaterialInfo>{} };
52+
static auto temp02{ std::vector<MaterialData>{} };
53+
54+
MaterialRendererInfo info{ temp01, temp02 };
55+
return info;
56+
}
57+
58+
4959
NullRenderer(NullRenderer const&) = delete;
5060
NullRenderer(NullRenderer&&) = delete;
5161
NullRenderer& operator=(NullRenderer const&) = delete;

Engine/Renderer/Private/Vulkan/Assets/VulkanMaterialManager.cpp

Lines changed: 8 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -48,22 +48,7 @@ namespace MauRen
4848
return { false, INVALID_MATERIAL_ID };
4949
}
5050

51-
return { true, it->second };
52-
}
53-
54-
bool VulkanMaterialManager::Exists(uint32_t ID) const noexcept
55-
{
56-
if (ID == INVALID_MATERIAL_ID)
57-
{
58-
return false;
59-
}
60-
61-
if (ID < m_Materials.size())
62-
{
63-
return true;
64-
}
65-
66-
return false;
51+
return { true, it->second.materialID };
6752
}
6853

6954
uint32_t VulkanMaterialManager::LoadOrGetMaterial(VulkanCommandPoolManager& cmdPoolManager, VulkanDescriptorContext& descriptorContext, Material const& material)
@@ -80,7 +65,8 @@ namespace MauRen
8065
auto const it{ m_MaterialIDMap.find(material.name) };
8166
if (it != end(m_MaterialIDMap))
8267
{
83-
return it->second;
68+
m_MaterialIDMap[material.name].useCount++;
69+
return it->second.materialID;
8470
}
8571

8672
MaterialData vkMat{};
@@ -112,7 +98,11 @@ namespace MauRen
11298
vkMat.metallicTextureID = m_TextureManager->LoadOrGetTexture(cmdPoolManager, descriptorContext, material.metalnessRoughnessTexture, true);
11399
}
114100

101+
vkMat.materialID = m_NextMaterialID;
102+
115103
m_Materials.emplace_back(vkMat);
104+
m_MaterialIDMap[material.name] = { static_cast<uint32_t>(m_Materials.size() - 1), 1};
105+
m_NextMaterialID++;
116106

117107
// Upload the material id if new
118108
{
@@ -129,7 +119,6 @@ namespace MauRen
129119
bufferInfo.buffer = m_MaterialDataBuffers[i].buffer.buffer;
130120
bufferInfo.range = sizeof(MaterialData) * MAX_MATERIALS;
131121

132-
//TODO simply do this once per frame, if buffer has changed
133122
descriptorContext.BindMaterialBuffer(bufferInfo, i);
134123
}
135124
}
@@ -138,11 +127,6 @@ namespace MauRen
138127
return static_cast<uint32_t>(m_Materials.size() - 1);
139128
}
140129

141-
MaterialData const& VulkanMaterialManager::GetMaterial(uint32_t ID) const noexcept
142-
{
143-
return m_Materials[ID];
144-
}
145-
146130
void VulkanMaterialManager::InitMaterialBuffers()
147131
{
148132
auto deviceContext{ VulkanDeviceContextManager::GetInstance().GetDeviceContext() };
@@ -168,6 +152,6 @@ namespace MauRen
168152
Material const defaultMat{};
169153
auto const id{ LoadOrGetMaterial(cmdPoolManager, descContext, defaultMat) };
170154

171-
ME_ASSERT(id == INVALID_MATERIAL_ID);
155+
ME_ASSERT(id == DEFAULT_MATERIAL_ID);
172156
}
173157
}

Engine/Renderer/Private/Vulkan/Assets/VulkanMaterialManager.h

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,16 @@ namespace MauRen
2222

2323
// Returns if it exists, and ID if it does
2424
[[nodiscard]] std::pair<bool, uint32_t> GetMaterial(std::string const& materialName) const noexcept;
25-
[[nodiscard]] bool Exists(uint32_t ID) const noexcept;
2625

2726
[[nodiscard]] uint32_t LoadOrGetMaterial(VulkanCommandPoolManager& cmdPoolManager, VulkanDescriptorContext& descriptorContext, Material const& material);
2827

29-
[[nodiscard]] MaterialData const& GetMaterial(uint32_t ID) const noexcept;
30-
3128
[[nodiscard]] VkSampler GetTextureSampler() const noexcept { return m_TextureManager->GetTextureSampler(); }
3229
[[nodiscard]] VulkanTextureManager* GetTextureManager() const noexcept { return m_TextureManager.get(); }
3330
[[nodiscard]] std::vector<MaterialData> const& GetMaterials() const noexcept { return m_Materials; }
3431

32+
[[nodiscard]] std::unordered_map<std::string, LoadedMaterialInfo> const& GetMaterialIDMap() const noexcept { return m_MaterialIDMap; }
33+
[[nodiscard]] std::vector<MaterialData> const& GetMaterialData() const noexcept { return m_Materials; }
34+
3535
VulkanMaterialManager(VulkanMaterialManager const&) = delete;
3636
VulkanMaterialManager(VulkanMaterialManager&&) = delete;
3737
VulkanMaterialManager& operator=(VulkanMaterialManager const&) = delete;
@@ -41,16 +41,18 @@ namespace MauRen
4141
friend class MauCor::Singleton<VulkanMaterialManager>;
4242
VulkanMaterialManager() = default;
4343
virtual ~VulkanMaterialManager() override = default;
44-
44+
4545
std::unique_ptr<VulkanTextureManager> m_TextureManager;
4646

4747
// Material name, ID in MaterialData[ ]
48-
std::unordered_map<std::string, uint32_t> m_MaterialIDMap;
48+
std::unordered_map<std::string, LoadedMaterialInfo> m_MaterialIDMap;
4949

5050
// All loaded materials - 1:1 copy of GPU buffer
5151
std::vector<MaterialData> m_Materials;
5252
std::vector<VulkanMappedBuffer> m_MaterialDataBuffers;
5353

54+
uint32_t m_NextMaterialID{ 0 };
55+
5456
void InitMaterialBuffers();
5557

5658
void CreateDefaultMaterial(VulkanCommandPoolManager& cmdPoolManager, VulkanDescriptorContext& descContext);

Engine/Renderer/Private/Vulkan/Assets/VulkanMeshManager.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ namespace MauRen
6161

6262
std::string cleanPath{ path };
6363
std::string const prefix{ "Resources/Models/" };
64-
if (cleanPath.compare(0, prefix.size(), prefix) == 0)
64+
if (cleanPath.starts_with(prefix))
6565
{
6666
cleanPath.erase(0, prefix.size());
6767
}
@@ -115,6 +115,7 @@ namespace MauRen
115115

116116
m_LoadedMeshes[m_NextID] = static_cast<uint32_t>(m_MeshData.size());
117117
m_LoadedMeshes_Path[cleanPath] = { static_cast<uint32_t>(m_MeshData.size()), 1 };
118+
m_MeshID_path[m_NextID] = cleanPath;
118119

119120
m_MeshData.emplace_back(std::move(meshData));
120121

Engine/Renderer/Private/Vulkan/Assets/VulkanMeshManager.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,10 +90,12 @@ namespace MauRen
9090

9191
// maps mesh ID -> index into m_MeshData
9292
std::unordered_map<uint32_t, uint32_t> m_LoadedMeshes;
93-
// map model/mesh path into m_MeshData
9493

94+
// map model/mesh path into m_MeshData
9595
std::unordered_map<std::string, LoadedMeshes_PathInfo> m_LoadedMeshes_Path;
9696

97+
std::unordered_map<uint32_t, std::string> m_MeshID_path;
98+
9799
uint32_t m_CurrentVertexOffset{ 0 }; // current vertex offset in the "global" vertex buffer
98100
uint32_t m_CurrentIndexOffset{ 0 }; // current index offset in the "global" index buffer
99101
uint32_t m_NextID{ 0 }; // next available mesh ID

Engine/Renderer/Private/Vulkan/Assets/VulkanTextureManager.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ namespace MauRen
151151
descriptorContext.BindTexture(static_cast<uint32_t>(std::size(m_Textures)), defaultGrayTexture.imageViews[0], VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
152152
m_Textures.emplace_back(std::move(defaultGrayTexture));
153153
m_TextureIDMap["__DefaultGray"] = static_cast<uint32_t>(std::size(m_Textures) - 1);
154-
154+
155155
// 2
156156
auto defaultNormalTexture{ Create1x1Texture(cmdPoolManager, glm::vec4(0.5f, 0.5f, 1.0f, 1.0f), false) };
157157
descriptorContext.BindTexture(static_cast<uint32_t>(std::size(m_Textures)), defaultNormalTexture.imageViews[0], VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);

Engine/Renderer/Private/Vulkan/VulkanRenderer.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,14 @@ namespace MauRen
307307
return VulkanMeshManager::GetInstance().LoadMesh(path, m_CommandPoolManager, m_DescriptorContext);
308308
}
309309

310+
MaterialRendererInfo VulkanRenderer::GetMaterialRendererInfo() const noexcept
311+
{
312+
return {
313+
VulkanMaterialManager::GetInstance().GetMaterialIDMap(),
314+
VulkanMaterialManager::GetInstance().GetMaterialData()
315+
};
316+
}
317+
310318
std::pair<std::unordered_map<std::string, struct LoadedMeshes_PathInfo> const&, std::vector<struct MeshData> const&>
311319
VulkanRenderer::GetRendererMeshInfo()
312320
{

Engine/Renderer/Private/Vulkan/VulkanRenderer.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ namespace MauRen
6464
virtual [[nodiscard]] uint32_t LoadOrGetMeshID(char const* path) override;
6565

6666
virtual [[nodiscard]] std::pair<std::unordered_map<std::string, struct LoadedMeshes_PathInfo> const&, std::vector<struct MeshData>const&> GetRendererMeshInfo() override;
67-
67+
virtual [[nodiscard]] MaterialRendererInfo GetMaterialRendererInfo() const noexcept override;
68+
6869
VulkanRenderer(VulkanRenderer const&) = delete;
6970
VulkanRenderer(VulkanRenderer&&) = delete;
7071
VulkanRenderer& operator=(VulkanRenderer const&) = delete;

Engine/Renderer/Public/RendererIdentifiers.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ namespace MauRen
1414
uint32_t constexpr INVALID_TEXTURE_ID{ 5 };
1515

1616

17-
uint32_t constexpr INVALID_MATERIAL_ID{ 0 };
18-
17+
uint32_t constexpr DEFAULT_MATERIAL_ID{ 0 };
18+
uint32_t constexpr INVALID_MATERIAL_ID{ UINT32_MAX };
1919
uint32_t constexpr INVALID_DRAW_COMMAND{ UINT32_MAX };
2020

2121
uint32_t constexpr INVALID_SHADOW_MAP_ID{ 0 };

0 commit comments

Comments
 (0)