From a67e65ff765c6fab0898ea9495145ea728dec4c2 Mon Sep 17 00:00:00 2001 From: Brandon Mak Date: Mon, 30 Jan 2023 15:34:22 +0800 Subject: [PATCH 01/13] Made array for usable subpasses --- .../Graphics/MiddleEnd/Interface/SHGraphicsConstants.h | 8 ++++++++ .../src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp | 6 +++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsConstants.h b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsConstants.h index b3945689..45f91ae6 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsConstants.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsConstants.h @@ -13,6 +13,7 @@ of DigiPen Institute of Technology is prohibited. // STL Includes #include +#include namespace SHADE { @@ -114,7 +115,14 @@ namespace SHADE static constexpr std::string_view DEFERRED_COMPOSITE_COMPUTE = "Deferred Composite"; + static constexpr std::string_view GBUFFER_WRITE_SUBPASS = "G-Buffer Write"; + static constexpr std::string_view UI_SUBPASS = "UI"; + static constexpr std::array USABLE_SUBPASSES = + { + GBUFFER_WRITE_SUBPASS, + UI_SUBPASS + }; }; struct DescriptorSetBindings diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp index c4990153..437dd9a8 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp @@ -231,7 +231,7 @@ namespace SHADE /*-----------------------------------------------------------------------*/ /* G-BUFFER SUBPASS INIT */ /*-----------------------------------------------------------------------*/ - auto gBufferSubpass = gBufferNode->AddSubpass("G-Buffer Write", worldViewport, worldRenderer); + auto gBufferSubpass = gBufferNode->AddSubpass(SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_WRITE_SUBPASS.data(), worldViewport, worldRenderer); gBufferSubpass->AddColorOutput("Position"); gBufferSubpass->AddColorOutput("Entity ID"); gBufferSubpass->AddColorOutput("Light Layer Indices"); @@ -447,7 +447,7 @@ namespace SHADE defaultMaterial = AddMaterial ( defaultVertShader, defaultFragShader, - renderGraph->GetNode(SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_PASS.data())->GetSubpass("G-Buffer Write") + renderGraph->GetNode(SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_PASS.data())->GetSubpass(SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_WRITE_SUBPASS) ); defaultMaterial->SetProperty("data.textureIndex", defaultTexture->TextureArrayIndex); } @@ -765,7 +765,7 @@ namespace SHADE auto const& EVENT_DATA = reinterpret_cast*>(eventPtr.get())->data; auto* lightComp = SHComponentManager::GetComponent(EVENT_DATA->lightEntity); std::string resourceName = "ShadowMap " + std::to_string(EVENT_DATA->lightEntity); - Handle companionSubpass = renderGraph->GetNode(SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_PASS.data())->GetSubpass("G-Buffer Write"); + Handle companionSubpass = renderGraph->GetNode(SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_PASS.data())->GetSubpass(SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_WRITE_SUBPASS); if (EVENT_DATA->generateRenderer) { From 8a4a469abf991059f0591cf60429fc09d091e15f Mon Sep 17 00:00:00 2001 From: Kah Wei Date: Mon, 30 Jan 2023 15:52:42 +0800 Subject: [PATCH 02/13] Added ability to change subpass for a material and fixed typo for vertex shader in the material editor --- .../MaterialInspector/SHMaterialInspector.cpp | 38 ++++++++++++++++++- SHADE_Engine/src/Editor/SHEditorUI.h | 10 ++--- 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/SHADE_Engine/src/Editor/EditorWindow/MaterialInspector/SHMaterialInspector.cpp b/SHADE_Engine/src/Editor/EditorWindow/MaterialInspector/SHMaterialInspector.cpp index 537cfc55..d382451d 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/MaterialInspector/SHMaterialInspector.cpp +++ b/SHADE_Engine/src/Editor/EditorWindow/MaterialInspector/SHMaterialInspector.cpp @@ -1,8 +1,11 @@ #include "SHpch.h" + +#include +#include + #include "Serialization/SHSerializationHelper.hpp" #include "SHMaterialInspector.h" #include "Editor/SHImGuiHelpers.hpp" -#include #include "Assets/SHAssetManager.h" #include "Editor/IconsMaterialDesign.h" @@ -176,7 +179,7 @@ namespace SHADE const std::string VERT_SHADER_NAME = VERT_SHADER_INFO ? VERT_SHADER_INFO->name : "Unknown Shader"; isDirty |= SHEditorWidgets::DragDropReadOnlyField ( - "Fragment Shader", VERT_SHADER_NAME.data(), + "Vertex Shader", VERT_SHADER_NAME.data(), [this]() { return currentMatSpec->vertexShader; }, [this](const AssetID& id) { currentMatSpec->vertexShader = id; }, SHDragDrop::DRAG_RESOURCE @@ -191,6 +194,37 @@ namespace SHADE SHDragDrop::DRAG_RESOURCE ); + // Subpass + const auto& SP_NAMES = SHGraphicsConstants::RenderGraphEntityNames::USABLE_SUBPASSES; + ImGui::Text("Subpass"); + ImGui::SameLine(); + if (ImGui::BeginCombo("##", currentMatSpec->subpassName.data(), ImGuiComboFlags_None)) + { + for (const auto& NAME : SP_NAMES) + { + const bool IS_SELECTED = currentMatSpec->subpassName == NAME; + if (ImGui::Selectable(NAME.data(), IS_SELECTED)) + { + isDirty = true; + SHCommandManager::PerformCommand + ( + std::reinterpret_pointer_cast(std::make_shared> + ( + currentMatSpec->subpassName, + std::string(NAME), + [&](const std::string& newName){ currentMatSpec->subpassName = newName; } + )), + false + ); + } + if (IS_SELECTED) + { + ImGui::SetItemDefaultFocus(); + } + } + ImGui::EndCombo(); + } + // Load the shader to access it's data auto fragShader = SHResourceManager::LoadOrGet(currentMatSpec->fragShader); if (!fragShader) diff --git a/SHADE_Engine/src/Editor/SHEditorUI.h b/SHADE_Engine/src/Editor/SHEditorUI.h index cd87f46b..23cc2d1a 100644 --- a/SHADE_Engine/src/Editor/SHEditorUI.h +++ b/SHADE_Engine/src/Editor/SHEditorUI.h @@ -98,9 +98,9 @@ namespace SHADE static bool IsItemHovered(); /*-----------------------------------------------------------------------------*/ - /* ImGui Wrapper Functions - Menu */ - /*-----------------------------------------------------------------------------*/ - static bool BeginMenu(const std::string& label); + /* ImGui Wrapper Functions - Menu */ + /*-----------------------------------------------------------------------------*/ + static bool BeginMenu(const std::string& label); static bool BeginMenu(const std::string& label, const char* icon); static void EndMenu(); static void BeginTooltip(); @@ -164,8 +164,8 @@ namespace SHADE /// /// Text to display. /// True if button was pressed. - static bool Button(const std::string& title); - static bool Selectable(const std::string& label); + static bool Button(const std::string& title); + static bool Selectable(const std::string& label); static bool Selectable(const std::string& label, const char* icon); /// /// Creates a checkbox widget for boolean input. From f8bde9fc359bb18bc2f2660c26a725038556d365 Mon Sep 17 00:00:00 2001 From: Brandon Mak Date: Mon, 30 Jan 2023 16:35:12 +0800 Subject: [PATCH 03/13] Added map to retrieve usable subpasses --- .../src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp | 7 +++++-- .../src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h | 3 +++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp index 437dd9a8..12f8f318 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp @@ -240,6 +240,7 @@ namespace SHADE gBufferSubpass->AddColorOutput("Position World Space"); gBufferSubpass->AddDepthOutput("Depth Buffer", SH_RENDER_GRAPH_RESOURCE_FLAGS::DEPTH_STENCIL); + usableSubpassesMapping.emplace (std::string (SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_WRITE_SUBPASS.data()), gBufferSubpass); /*-----------------------------------------------------------------------*/ /* SSAO PASS AND DATA INIT */ @@ -318,7 +319,7 @@ namespace SHADE /* SCREEN SPACE PASS */ /*-----------------------------------------------------------------------*/ auto screenSpaceNode = renderGraph->AddNode(SHGraphicsConstants::RenderGraphEntityNames::SCREEN_SPACE_PASS.data(), {"Scene", "Entity ID"}, {SHGraphicsConstants::RenderGraphEntityNames::DEFERRED_COMPOSITE_PASS.data(), SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_PASS.data(), SHGraphicsConstants::RenderGraphEntityNames::DEBUG_DRAW.data()}); - auto uiSubpass = screenSpaceNode->AddSubpass("UI", worldViewport, screenRenderer); + auto uiSubpass = screenSpaceNode->AddSubpass(SHGraphicsConstants::RenderGraphEntityNames::UI_SUBPASS.data(), worldViewport, screenRenderer); uiSubpass->AddColorOutput("Scene"); uiSubpass->AddColorOutput("Entity ID"); uiSubpass->AddExteriorDrawCalls([=](Handle cmdBuffer, Handle renderer, uint32_t frameIndex) @@ -326,6 +327,8 @@ namespace SHADE textRenderingSubSystem->Render(cmdBuffer, renderer, frameIndex); }); + usableSubpassesMapping.emplace(SHGraphicsConstants::RenderGraphEntityNames::UI_SUBPASS.data(), uiSubpass); + /*-----------------------------------------------------------------------*/ /* RENDER TO SWAPCHAIN IMAGE FOR PRESENT PASS */ /*-----------------------------------------------------------------------*/ @@ -420,7 +423,7 @@ namespace SHADE // initialize the text renderer auto uiNode = renderGraph->GetNode(SHGraphicsConstants::RenderGraphEntityNames::SCREEN_SPACE_PASS.data()); - textRenderingSubSystem->Init(device, uiNode->GetRenderpass(), uiNode->GetSubpass("UI"), descPool, textVS, textFS); + textRenderingSubSystem->Init(device, uiNode->GetRenderpass(), uiNode->GetSubpass(SHGraphicsConstants::RenderGraphEntityNames::UI_SUBPASS), descPool, textVS, textFS); SHGlobalDescriptorSets::SetLightingSubSystem(lightingSubSystem); diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h index c736599f..11aaf337 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h @@ -399,6 +399,7 @@ namespace SHADE uint32_t GetCurrentFrameIndex(void) const noexcept { return renderContext.GetCurrentFrame(); } SHFontLibrary const& GetFontLibrary (void) const noexcept; const SHMeshLibrary& GetMeshLibrary() const noexcept { return meshLibrary; }; + std::unordered_map> const& GetUsableSubpasses(void) const noexcept {return usableSubpassesMapping;}; /*-----------------------------------------------------------------------------*/ /* Getters */ @@ -507,6 +508,8 @@ namespace SHADE uint32_t resizeHeight = 1; bool restoredFromMinimize = false; + std::unordered_map> usableSubpassesMapping{}; + /*---------------------------------------------------------------------------------*/ /* Helper Functions */ /*---------------------------------------------------------------------------------*/ From c45c469c8e46506a23ab64d7aa0e4d49f41ee54d Mon Sep 17 00:00:00 2001 From: Brandon Mak Date: Mon, 30 Jan 2023 16:42:19 +0800 Subject: [PATCH 04/13] Change GetUsableSubpasses to GetUsableSubpass --- .../Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp | 10 ++++++++++ .../Graphics/MiddleEnd/Interface/SHGraphicsSystem.h | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp index 12f8f318..9874b706 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp @@ -1185,6 +1185,16 @@ namespace SHADE return fontLibrary; } + Handle const& SHGraphicsSystem::GetUsableSubpass(std::string subpassName) const noexcept + { + if (usableSubpassesMapping.contains(subpassName)) + { + return usableSubpassesMapping.at (subpassName); + } + else + return {}; + } + Handle SHGraphicsSystem::createDebugDrawPipeline(Handle renderPass, Handle subpass, bool filled, bool triMesh, bool instanced) { auto pipelineLayout = resourceManager.Create diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h index 11aaf337..bf283bc8 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h @@ -399,7 +399,7 @@ namespace SHADE uint32_t GetCurrentFrameIndex(void) const noexcept { return renderContext.GetCurrentFrame(); } SHFontLibrary const& GetFontLibrary (void) const noexcept; const SHMeshLibrary& GetMeshLibrary() const noexcept { return meshLibrary; }; - std::unordered_map> const& GetUsableSubpasses(void) const noexcept {return usableSubpassesMapping;}; + Handle const& GetUsableSubpass(std::string subpassName) const noexcept; /*-----------------------------------------------------------------------------*/ /* Getters */ From 89b101f3e5386fa44ef178e7a63a575483d22ad1 Mon Sep 17 00:00:00 2001 From: Brandon Mak Date: Mon, 30 Jan 2023 16:46:14 +0800 Subject: [PATCH 05/13] passed string by value dum dum brandon --- .../src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp index 9874b706..e84955d7 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp @@ -1185,7 +1185,7 @@ namespace SHADE return fontLibrary; } - Handle const& SHGraphicsSystem::GetUsableSubpass(std::string subpassName) const noexcept + Handle const& SHGraphicsSystem::GetUsableSubpass(std::string const& subpassName) const noexcept { if (usableSubpassesMapping.contains(subpassName)) { From a3ca04535fbb6264549bb64698678093763ed884 Mon Sep 17 00:00:00 2001 From: Brandon Mak Date: Mon, 30 Jan 2023 16:46:42 +0800 Subject: [PATCH 06/13] More changes --- .../src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp | 2 +- .../src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp index e84955d7..6914df49 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp @@ -1185,7 +1185,7 @@ namespace SHADE return fontLibrary; } - Handle const& SHGraphicsSystem::GetUsableSubpass(std::string const& subpassName) const noexcept + Handle SHGraphicsSystem::GetUsableSubpass(std::string const& subpassName) const noexcept { if (usableSubpassesMapping.contains(subpassName)) { diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h index bf283bc8..86b233fd 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h @@ -399,7 +399,7 @@ namespace SHADE uint32_t GetCurrentFrameIndex(void) const noexcept { return renderContext.GetCurrentFrame(); } SHFontLibrary const& GetFontLibrary (void) const noexcept; const SHMeshLibrary& GetMeshLibrary() const noexcept { return meshLibrary; }; - Handle const& GetUsableSubpass(std::string subpassName) const noexcept; + Handle GetUsableSubpass(std::string const& subpassName) const noexcept; /*-----------------------------------------------------------------------------*/ /* Getters */ From c2aa067cc4403fc9d5ddb16a11b85dc39835c65f Mon Sep 17 00:00:00 2001 From: Kah Wei Date: Mon, 30 Jan 2023 16:55:15 +0800 Subject: [PATCH 07/13] Fixed crash caused by loading incorrect renderpass for subpass replacement --- .../MaterialInspector/SHMaterialInspector.cpp | 16 +++++++++++----- .../src/Graphics/RenderGraph/SHSubpass.cpp | 2 +- .../src/Graphics/RenderGraph/SHSubpass.h | 2 +- SHADE_Engine/src/Resource/SHResourceManager.hpp | 10 ++-------- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/SHADE_Engine/src/Editor/EditorWindow/MaterialInspector/SHMaterialInspector.cpp b/SHADE_Engine/src/Editor/EditorWindow/MaterialInspector/SHMaterialInspector.cpp index d382451d..adb1fe51 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/MaterialInspector/SHMaterialInspector.cpp +++ b/SHADE_Engine/src/Editor/EditorWindow/MaterialInspector/SHMaterialInspector.cpp @@ -92,11 +92,17 @@ namespace SHADE if (vertShader && fragShader && gfxSystem) { // - Retrieve pipeline from pipeline library - auto renderPass = gfxSystem->GetPrimaryRenderpass(); - auto subPass = renderPass->GetSubpass(currentMatSpec->subpassName); - auto pipeline = renderPass->GetOrCreatePipeline({ vertShader, fragShader }, subPass); - // - Set Pipeline - matHandle->SetPipeline(pipeline); + auto subPass = gfxSystem->GetUsableSubpass(currentMatSpec->subpassName); + if (subPass) + { + // Set Pipeline if valid + auto pipeline = subPass->GetParentNode()->GetOrCreatePipeline({vertShader, fragShader}, subPass); + matHandle->SetPipeline(pipeline); + } + else + { + SHLOG_ERROR("[SHMaterialInspector] Failed to find material subpass of type \"{}\"", currentMatSpec->subpassName); + } } } diff --git a/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.cpp b/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.cpp index 5205b44d..96207d7a 100644 --- a/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.cpp +++ b/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.cpp @@ -474,7 +474,7 @@ namespace SHADE */ /***************************************************************************/ - Handle const& SHSubpass::GetParentNode(void) const noexcept + Handle SHSubpass::GetParentNode(void) const noexcept { return parentNode; } diff --git a/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.h b/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.h index f84d4dee..811cc70c 100644 --- a/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.h +++ b/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.h @@ -159,7 +159,7 @@ namespace SHADE /*-----------------------------------------------------------------------*/ void SetCompanionSubpass (Handle companion, Handle pipeline) noexcept; - Handle const& GetParentNode(void) const noexcept; + Handle GetParentNode(void) const noexcept; SHSubPassIndex GetIndex() const noexcept; Handle GetSuperBatch(void) const noexcept; std::vector const& GetColorAttachmentReferences (void) const noexcept; diff --git a/SHADE_Engine/src/Resource/SHResourceManager.hpp b/SHADE_Engine/src/Resource/SHResourceManager.hpp index 51ee356a..8e2b3309 100644 --- a/SHADE_Engine/src/Resource/SHResourceManager.hpp +++ b/SHADE_Engine/src/Resource/SHResourceManager.hpp @@ -270,14 +270,8 @@ namespace SHADE return {}; } - // Grab subpass from worldRenderer - auto renderPass = gfxSystem->GetPrimaryRenderpass(); - if (!renderPass) - { - SHLOG_ERROR("[SHResourceManager] Failed to load material as RenderPass could not be found."); - return {}; - } - auto subPass = renderPass->GetSubpass(assetData.subpassName); + // Grab subpass + auto subPass = gfxSystem->GetUsableSubpass(assetData.subpassName); if (!subPass) { SHLOG_ERROR("[SHResourceManager] Failed to load material as SubPass could not be found."); From e9452093f0eb6fc8b09491f0540e5bbc7dca9f9f Mon Sep 17 00:00:00 2001 From: Brandon Mak Date: Tue, 31 Jan 2023 15:17:40 +0800 Subject: [PATCH 08/13] Fixed UI --- Assets/Application.SHConfig | 2 +- Assets/Materials/UIMat_LoseScene.shmat | 2 +- Assets/Materials/UIMat_MainMenu.shmat | 2 +- Assets/Materials/UIMat_WinScene.shmat | 2 +- Assets/Shaders/UI_FS.glsl | 11 ++----- Assets/Shaders/UI_FS.shshaderb | Bin 2285 -> 1941 bytes SHADE_Engine/src/Camera/SHCameraSystem.cpp | 2 +- .../MiddleEnd/Interface/SHGraphicsSystem.cpp | 29 ++++++++---------- .../Graphics/RenderGraph/SHRenderGraph.cpp | 12 +++++++- .../src/Graphics/RenderGraph/SHRenderGraph.h | 2 +- 10 files changed, 31 insertions(+), 33 deletions(-) diff --git a/Assets/Application.SHConfig b/Assets/Application.SHConfig index ee5e42a8..5673556d 100644 --- a/Assets/Application.SHConfig +++ b/Assets/Application.SHConfig @@ -1,4 +1,4 @@ Start in Fullscreen: false -Starting Scene ID: 87244611 +Starting Scene ID: 97158628 Window Size: {x: 1920, y: 1080} Window Title: SHADE Engine \ No newline at end of file diff --git a/Assets/Materials/UIMat_LoseScene.shmat b/Assets/Materials/UIMat_LoseScene.shmat index b962f5ad..5be3677e 100644 --- a/Assets/Materials/UIMat_LoseScene.shmat +++ b/Assets/Materials/UIMat_LoseScene.shmat @@ -1,6 +1,6 @@ - VertexShader: 46580970 FragmentShader: 35983630 - SubPass: G-Buffer Write + SubPass: UI Properties: data.color: {x: 1, y: 1, z: 1, w: 1} data.textureIndex: 54324293 diff --git a/Assets/Materials/UIMat_MainMenu.shmat b/Assets/Materials/UIMat_MainMenu.shmat index 625021b0..0ca4c7a1 100644 --- a/Assets/Materials/UIMat_MainMenu.shmat +++ b/Assets/Materials/UIMat_MainMenu.shmat @@ -1,6 +1,6 @@ - VertexShader: 46580970 FragmentShader: 35983630 - SubPass: G-Buffer Write + SubPass: UI Properties: data.color: {x: 1, y: 1, z: 1, w: 1} data.textureIndex: 54429632 diff --git a/Assets/Materials/UIMat_WinScene.shmat b/Assets/Materials/UIMat_WinScene.shmat index b8d5b183..e9c36f65 100644 --- a/Assets/Materials/UIMat_WinScene.shmat +++ b/Assets/Materials/UIMat_WinScene.shmat @@ -1,6 +1,6 @@ - VertexShader: 46580970 FragmentShader: 35983630 - SubPass: G-Buffer Write + SubPass: UI Properties: data.color: {x: 1, y: 1, z: 1, w: 1} data.textureIndex: 57302694 diff --git a/Assets/Shaders/UI_FS.glsl b/Assets/Shaders/UI_FS.glsl index 0c4c526c..a28642f4 100644 --- a/Assets/Shaders/UI_FS.glsl +++ b/Assets/Shaders/UI_FS.glsl @@ -33,18 +33,11 @@ layout (std430, set = 2, binding = 0) buffer MaterialProperties // For mater MatPropData data[]; } MatProp; -layout(location = 0) out vec4 position; +layout(location = 0) out vec4 fragColor; layout(location = 1) out uint outEntityID; -layout(location = 2) out uint lightLayerIndices; -layout(location = 3) out vec4 normals; -layout(location = 4) out vec4 albedo; void main() { - position = In.vertPos; - normals = In.normal; - albedo = texture(textures[nonuniformEXT(MatProp.data[In2.materialIndex].textureIndex)], In.uv); - + fragColor = texture(textures[nonuniformEXT(MatProp.data[In2.materialIndex].textureIndex)], In.uv); outEntityID = In2.eid; - lightLayerIndices = In2.lightLayerIndex; } \ No newline at end of file diff --git a/Assets/Shaders/UI_FS.shshaderb b/Assets/Shaders/UI_FS.shshaderb index 703040e1a63c9c59d398cc68a6df7121a76c6b39..ce1dd7e9c0a416be4f198d797c9709fa254dd63e 100644 GIT binary patch literal 1941 zcmY+E+fEZv6o$97ML-b{0Tsmpo>4$VV`4NxCACQnM2vbj*|eK7I?UARl*l{yIO>ge zK9x5n{@)y+ZnC=8`qz2wJ&b=lZPHU3Sd?_ijF?gLFoVp584zMp{^LT%f9Cv`_=p)Y zJKOKQ&5!TAmg_cSzmr6<=Z7u#)eqa|j2TShYmJ@8ayMx$uRmHP^*K{YE0BB444bkz zbYT4u!?5VG=#FSbG%kPav|7^NfcS3(m*rV&cpGnDcwN`Au}z%U-M1|ld(rME*G#(q z`^coWyugO-o^3mCeQmX4o1c|uh&+rDMqw}X_oDc~`_i+4zvsJH_7Uv0t*u&P(`$A* zUN<=koEP|^^ICqaO8%jvR+=aG^TTG)YxO%+W}!$|*+P-rR4d}U)zOA}m8~f&s zMZIJ*O#I}i{>s#pgEu%Q;-GUU3#oRZ&r7GyYvm~JVlnqAFzjICeSY);rcdZNmOB8e zil}#9d{D#(L#|@)_;6~P0gO2OxdZwmccIfC2VeHb4A_vFEsHIsao^Ppe%FN;@{MD; zobIcCAM6aB`6gABy7P)BC-Sr;`mc&+RFiKPo%dhW?~pjY;7@a%or7J{_D96=Cx8Db z^jUeHkpaJ}lFy2xlY3O014eFiX6H;v9}};N$VG454YjB}CyBeHFZ{rrQ#OL@I%$sFp>h*wc`=5)7w2h;-3Y-Q~r>kk__(YZHzrsixe6IawI z?gRTZ;ndG&EvIiwYPut4zA2g6@Sz93BW4DNljF8H^{~+cI{%Z49`5EcG59ZwvqNUU zAAKdqu=AFQ#r{||sm*)f5cfw&MSMfQ%y&h^%S X15xqKQHS~0avXnlg#K6Cc_R7;_oT5} literal 2285 zcmY+FZF3Yw5XUFnU5Mc+h=7R14N*YRh%q3FP!)^RnX0o$8B2Y)HMt#<(ar9;yO$#0 zOMT-zKZ_rNH&prm&FzGxt2+JkpPufX-pkT|3nozS)aq$t=FFlwXP(Sl=AtovUnT16)Nqt;{`g&5 zyNRuAbL^ObJ$M~=Hfo)+heaX!tufPoO*o(EV;WuD8p4{YW@ocF+HH?VmRdW53ABAwd5*X=RaDgaUR5y!XG@zEbXeYz(& z?!}jg$^U`myqFJ_T!|zE1{$i;M3QshsSPG~v{$46#j5A){CoS6Ll24HjFCH+ON=sfkHUy(-riTJAU{7zsq&qROuxdV&;QET%?_`okp zf+yFq`sbSiiyujjvy#+9j2zg!E56IJ={ITZyRCgeHpF?}1Z=kk_JA59o;RX~SR;Eu z{F*lET}f&rN0*{~UC3(+fV(06JxOftzAg#jBR4iX2GRcwNpf@7vNUE*o%DpCI62u9 zV$0GKNo?}3NK$tqCO`H~F+OIqDw&8O=F4|TZv3-Y-+Ux}PE3p(*tc3Acie7u&c%6s z(uv=d&V93Y=$p@_LvaS{(#g-8lJ9{e{c=C|Ve|h6AMuBh;Jb15koW`jz+LPYgzu$1 z1IbPO<*hG@*$;N$v5?I3Z882QI>G*7NBm{!;MswQzakw!cy>;FX< zdcH5_9De#>r}2@48GkLNkC=mbf7ANG^Cs94|E+ZJaZcbLi}8c!jj&(o^&X1<2dFg4 A;s5{u diff --git a/SHADE_Engine/src/Camera/SHCameraSystem.cpp b/SHADE_Engine/src/Camera/SHCameraSystem.cpp index 6feece48..8b78045a 100644 --- a/SHADE_Engine/src/Camera/SHCameraSystem.cpp +++ b/SHADE_Engine/src/Camera/SHCameraSystem.cpp @@ -314,7 +314,7 @@ namespace SHADE camera.orthoProjMatrix(3, 3) = 1.0f; //camera.perspProjMatrix = SHMatrix::OrthographicLH(9.0f, 9.0f, 0.1f, 20.0f); - camera.orthoProjMatrix = SHMatrix::OrthographicRH(camera.GetWidth(), camera.GetHeight(), camera.GetNear(), camera.GetFar()); + //camera.orthoProjMatrix = SHMatrix::OrthographicLH(camera.GetWidth(), camera.GetHeight(), camera.GetNear(), camera.GetFar()); //camera.perspProjMatrix = SHMatrix::OrthographicLH(5.0f, 5.0f, 0.1f, 20.0f); //camera.projMatrix.Transpose(); diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp index 6914df49..a416b149 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp @@ -127,12 +127,15 @@ namespace SHADE SHFreetypeInstance::Init(); - SHAssetManager::CompileAsset("../../Assets/Shaders/DeferredComposite_CS.glsl", false); - SHAssetManager::CompileAsset("../../Assets/Shaders/SSAO_CS.glsl", false); - SHAssetManager::CompileAsset("../../Assets/Shaders/SSAOBlur_CS.glsl", false); - SHAssetManager::CompileAsset("../../Assets/Shaders/PureCopy_CS.glsl", false); - SHAssetManager::CompileAsset("../../Assets/Shaders/TestCube_VS.glsl", false); - SHAssetManager::CompileAsset("../../Assets/Shaders/TestCube_FS.glsl", false); + //SHAssetManager::CompileAsset("../../Assets/Shaders/DeferredComposite_CS.glsl", false); + //SHAssetManager::CompileAsset("../../Assets/Shaders/SSAO_CS.glsl", false); + //SHAssetManager::CompileAsset("../../Assets/Shaders/SSAOBlur_CS.glsl", false); + //SHAssetManager::CompileAsset("../../Assets/Shaders/PureCopy_CS.glsl", false); + //SHAssetManager::CompileAsset("../../Assets/Shaders/TestCube_VS.glsl", false); + //SHAssetManager::CompileAsset("../../Assets/Shaders/TestCube_FS.glsl", false); + //SHAssetManager::CompileAsset("../../Assets/Shaders/UI_VS.glsl", false); + //SHAssetManager::CompileAsset("../../Assets/Shaders/UI_FS.glsl", false); + //SHAssetManager::CompileAsset("../../Assets/Shaders/Text_VS.glsl", false); // Load Built In Shaders static constexpr AssetID VS_DEFAULT = 39210065; defaultVertShader = SHResourceManager::LoadOrGet(VS_DEFAULT); @@ -418,7 +421,7 @@ namespace SHADE .addressMode = vk::SamplerAddressMode::eClampToBorder, }) ); - + textRenderingSubSystem = resourceManager.Create(); // initialize the text renderer @@ -567,7 +570,7 @@ namespace SHADE else renderer->UpdateData(frameIndex); #else - renderers[renIndex]->UpdateDataAndBind(frameIndex); + renderer->UpdateData(frameIndex); #endif } @@ -583,16 +586,8 @@ namespace SHADE renderGraph->Begin(frameIndex); auto cmdBuffer = renderGraph->GetCommandBuffer(frameIndex); - // Bind all the buffers required for meshes - for (auto& [buffer, bindingPoint] : MESH_DATA) - { - if (buffer->GetUsageBits() & vk::BufferUsageFlagBits::eVertexBuffer) - cmdBuffer->BindVertexBuffer(bindingPoint, buffer, 0); - else if (buffer->GetUsageBits() & vk::BufferUsageFlagBits::eIndexBuffer) - cmdBuffer->BindIndexBuffer(buffer, 0); - } - renderGraph->Execute(frameIndex, descPool); + renderGraph->Execute(frameIndex, descPool, MESH_DATA); renderGraph->End(frameIndex); graphicsQueue->SubmitCommandBuffer diff --git a/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraph.cpp b/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraph.cpp index 74ea951a..c312535e 100644 --- a/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraph.cpp +++ b/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraph.cpp @@ -565,7 +565,7 @@ namespace SHADE // TODO: The graph scope buffers were meant to bind vertex buffers and index buffers for meshes. Find a // better way to manage these - void SHRenderGraph::Execute(uint32_t frameIndex, Handle descPool) noexcept + void SHRenderGraph::Execute(uint32_t frameIndex, Handle descPool, const std::initializer_list, uint32_t>> MESH_DATA) noexcept { auto cmdBuffer = commandBuffers[frameIndex]; cmdBuffer->BeginLabeledSegment(name); @@ -577,6 +577,7 @@ namespace SHADE cmdBuffer->ForceSetPipelineLayout(batchingSystemData.dummyPipelineLayout, SH_PIPELINE_TYPE::COMPUTE); auto const& descMappings = SHGraphicsPredefinedData::GetMappings(SHGraphicsPredefinedData::SystemType::BATCHING); + for (auto& node : nodes) { @@ -585,6 +586,15 @@ namespace SHADE // bind static global data SHGlobalDescriptorSets::BindStaticGlobalData(cmdBuffer, SH_PIPELINE_TYPE::GRAPHICS, descMappings.at(SHPredefinedDescriptorTypes::STATIC_DATA)); + // Bind all the buffers required for meshes + for (auto& [buffer, bindingPoint] : MESH_DATA) + { + if (buffer->GetUsageBits() & vk::BufferUsageFlagBits::eVertexBuffer) + cmdBuffer->BindVertexBuffer(bindingPoint, buffer, 0); + else if (buffer->GetUsageBits() & vk::BufferUsageFlagBits::eIndexBuffer) + cmdBuffer->BindIndexBuffer(buffer, 0); + } + node->Execute(cmdBuffer, descPool, frameIndex); } } diff --git a/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraph.h b/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraph.h index 5abcd6b6..0ae30015 100644 --- a/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraph.h +++ b/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraph.h @@ -143,7 +143,7 @@ namespace SHADE void Generate (void) noexcept; void CheckForNodeComputes (void) noexcept; - void Execute (uint32_t frameIndex, Handle descPool) noexcept; + void Execute (uint32_t frameIndex, Handle descPool, const std::initializer_list, uint32_t>> MESH_DATA) noexcept; void Begin (uint32_t frameIndex) noexcept; void End (uint32_t frameIndex) noexcept; void FinaliseBatch (uint32_t frameIndex, Handle descPool); From 164b4f719735c80a5029149b90447e8aa5c22d1f Mon Sep 17 00:00:00 2001 From: Xiao Qi Date: Tue, 31 Jan 2023 17:38:48 +0800 Subject: [PATCH 09/13] Changed gitignore line to ignore all items in Editor Folder --- .gitignore | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 06ae45fd..e595ab73 100644 --- a/.gitignore +++ b/.gitignore @@ -363,8 +363,6 @@ MigrationBackup/ *.filters -Assets/Editor/Layouts/UserLayout.ini - JSON/Schemas/Catalog/ -Assets/Editor/Editor.SHConfig +Assets/Editor/ From e0f363f1ec9f051831bfac2ae0a583aee3f0c3f0 Mon Sep 17 00:00:00 2001 From: Xiao Qi Date: Tue, 31 Jan 2023 17:47:36 +0800 Subject: [PATCH 10/13] Changed line to only ignore editor config --- .gitignore | 2 +- Assets/Editor/Layouts/UserLayout.ini | 165 +++++++++++++++++++++++++++ 2 files changed, 166 insertions(+), 1 deletion(-) create mode 100644 Assets/Editor/Layouts/UserLayout.ini diff --git a/.gitignore b/.gitignore index e595ab73..1771ebb0 100644 --- a/.gitignore +++ b/.gitignore @@ -365,4 +365,4 @@ MigrationBackup/ JSON/Schemas/Catalog/ -Assets/Editor/ +Assets/Editor/Editor.SHConfig diff --git a/Assets/Editor/Layouts/UserLayout.ini b/Assets/Editor/Layouts/UserLayout.ini new file mode 100644 index 00000000..7c2df9e0 --- /dev/null +++ b/Assets/Editor/Layouts/UserLayout.ini @@ -0,0 +1,165 @@ +[Window][MainStatusBar] +Pos=0,989 +Size=1920,20 +Collapsed=0 + +[Window][SHEditorMenuBar] +Pos=0,48 +Size=1920,941 +Collapsed=0 + +[Window][Hierarchy Panel] +Pos=0,187 +Size=300,802 +Collapsed=0 +DockId=0x00000004,0 + +[Window][Debug##Default] +Pos=60,60 +Size=400,400 +Collapsed=0 + +[Window][Inspector] +Pos=1604,48 +Size=316,941 +Collapsed=0 +DockId=0x00000006,0 + +[Window][Profiler] +Pos=0,48 +Size=300,137 +Collapsed=0 +DockId=0x00000003,0 + +[Window][Viewport] +Pos=227,48 +Size=1457,1012 +Collapsed=0 +DockId=0x0000000B,0 + +[Window][面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面o] +Pos=60,60 +Size=32,64 +Collapsed=0 + +[Window][面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面] +Pos=60,60 +Size=999,581 +Collapsed=0 + +[Window][o] +Pos=60,60 +Size=32,64 +Collapsed=0 + +[Window][面面] +Pos=60,60 +Size=553,422 +Collapsed=0 + +[Window][] +Pos=60,60 +Size=770,394 +Collapsed=0 + +[Window][ Viewport] +Pos=227,48 +Size=1457,1012 +Collapsed=0 +DockId=0x0000000B,0 + +[Window][ Viewport] +Pos=227,48 +Size=1457,1012 +Collapsed=0 +DockId=0x0000000B,0 + +[Window][ Viewport] +Pos=302,48 +Size=1300,836 +Collapsed=0 +DockId=0x0000000B,0 + +[Window][V] +Pos=310,722 +Size=1501,338 +Collapsed=0 +DockId=0x00000008,0 + +[Window][p] +Pos=310,750 +Size=1501,310 +Collapsed=0 +DockId=0x0000000A,0 + +[Window][ Asset Browser] +Pos=302,886 +Size=1300,103 +Collapsed=0 +DockId=0x0000000C,0 + +[Window][Material Inspector] +Pos=1604,48 +Size=316,941 +Collapsed=0 +DockId=0x00000006,1 + +[Window][Save scene as...] +Pos=1197,693 +Size=165,120 +Collapsed=0 + +[Window][Create New Asset] +Pos=896,472 +Size=464,144 +Collapsed=0 + +[Window][Collider Tag Panel] +Pos=60,60 +Size=625,744 +Collapsed=0 + +[Window][Input Bindings Panel] +Pos=60,60 +Size=154,204 +Collapsed=0 + +[Window][Save Scene As] +Pos=877,444 +Size=165,120 +Collapsed=0 + +[Table][0x9D40AE32,17] +Column 0 Weight=1.0000 +Column 1 Weight=1.0000 +Column 2 Weight=1.0000 +Column 3 Weight=1.0000 +Column 4 Weight=1.0000 +Column 5 Weight=1.0000 +Column 6 Weight=1.0000 +Column 7 Weight=1.0000 +Column 8 Weight=1.0000 +Column 9 Weight=1.0000 +Column 10 Weight=1.0000 +Column 11 Weight=1.0000 +Column 12 Weight=1.0000 +Column 13 Weight=1.0000 +Column 14 Weight=1.0000 +Column 15 Weight=1.0000 +Column 16 Weight=1.0000 + +[Docking][Data] +DockSpace ID=0xC5C9B8AB Window=0xBE4044E9 Pos=0,71 Size=1920,941 Split=X + DockNode ID=0x00000005 Parent=0xC5C9B8AB SizeRef=1602,1036 Split=X + DockNode ID=0x00000001 Parent=0x00000005 SizeRef=300,1036 Split=Y Selected=0x1E6EB881 + DockNode ID=0x00000003 Parent=0x00000001 SizeRef=225,147 Selected=0x1E6EB881 + DockNode ID=0x00000004 Parent=0x00000001 SizeRef=225,863 Selected=0xE096E5AE + DockNode ID=0x00000002 Parent=0x00000005 SizeRef=1300,1036 Split=Y Selected=0xB41284E7 + DockNode ID=0x00000007 Parent=0x00000002 SizeRef=1501,672 Split=Y Selected=0xB41284E7 + DockNode ID=0x00000009 Parent=0x00000007 SizeRef=1501,700 Split=Y Selected=0xB41284E7 + DockNode ID=0x0000000B Parent=0x00000009 SizeRef=1501,836 CentralNode=1 Selected=0xB41284E7 + DockNode ID=0x0000000C Parent=0x00000009 SizeRef=1501,103 Selected=0xB128252A + DockNode ID=0x0000000A Parent=0x00000007 SizeRef=1501,310 Selected=0xD446F7B6 + DockNode ID=0x00000008 Parent=0x00000002 SizeRef=1501,338 Selected=0xD9F31532 + DockNode ID=0x00000006 Parent=0xC5C9B8AB SizeRef=316,1036 Selected=0xE7039252 + From 8c9673cafd7dd027b65aa28c20730e2c47150ea3 Mon Sep 17 00:00:00 2001 From: Xiao Qi Date: Tue, 31 Jan 2023 17:48:29 +0800 Subject: [PATCH 11/13] Removed editor config from repo --- Assets/Editor/Editor.SHConfig | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 Assets/Editor/Editor.SHConfig diff --git a/Assets/Editor/Editor.SHConfig b/Assets/Editor/Editor.SHConfig deleted file mode 100644 index c56772c9..00000000 --- a/Assets/Editor/Editor.SHConfig +++ /dev/null @@ -1,4 +0,0 @@ -Start Maximized: true -Working Scene ID: 97402985 -Window Size: {x: 1920, y: 1013} -Style: 0 \ No newline at end of file From 4c4d39d4bbcbd7b0fe50c09b9d1bc35e08352339 Mon Sep 17 00:00:00 2001 From: SHAM-DP Date: Tue, 31 Jan 2023 18:55:50 +0800 Subject: [PATCH 12/13] Added double click asset id in inspector to scroll to asset in asset browser Added asset browser filter by name and type --- SHADE_Engine/src/Assets/SHAssetManager.cpp | 23 +++ .../AssetBrowser/SHAssetBrowser.cpp | 155 +++++++++++++++++- .../AssetBrowser/SHAssetBrowser.h | 12 +- .../HierarchyPanel/SHHierarchyPanel.h | 2 +- .../Inspector/SHEditorComponentView.hpp | 46 +++++- SHADE_Engine/src/Editor/SHEditor.cpp | 24 ++- SHADE_Engine/src/Editor/SHEditor.h | 3 +- SHADE_Engine/src/Editor/SHEditorWidgets.hpp | 2 +- 8 files changed, 253 insertions(+), 14 deletions(-) diff --git a/SHADE_Engine/src/Assets/SHAssetManager.cpp b/SHADE_Engine/src/Assets/SHAssetManager.cpp index 44d62f66..363b7829 100644 --- a/SHADE_Engine/src/Assets/SHAssetManager.cpp +++ b/SHADE_Engine/src/Assets/SHAssetManager.cpp @@ -27,6 +27,7 @@ #include "Libraries/Compilers/SHShaderSourceCompiler.h" #include "Filesystem/SHFileSystem.h" +#include namespace SHADE { @@ -733,3 +734,25 @@ namespace SHADE } } } + +namespace rttr +{ + using namespace SHADE; + RTTR_REGISTRATION + { + registration::enumeration("Asset Type") + ( + value("Invalid", AssetType::INVALID), + value("Shader", AssetType::SHADER), + value("Shader [Built-In]", AssetType::SHADER_BUILT_IN), + value("Texture", AssetType::TEXTURE), + value("Model", AssetType::MODEL), + value("Scene", AssetType::SCENE), + value("Prefab", AssetType::PREFAB), + value("Material", AssetType::MATERIAL), + value("Mesh", AssetType::MESH), + value("Script", AssetType::SCRIPT), + value("Font", AssetType::FONT) + ); + } +} diff --git a/SHADE_Engine/src/Editor/EditorWindow/AssetBrowser/SHAssetBrowser.cpp b/SHADE_Engine/src/Editor/EditorWindow/AssetBrowser/SHAssetBrowser.cpp index a7ba7dc0..791396df 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/AssetBrowser/SHAssetBrowser.cpp +++ b/SHADE_Engine/src/Editor/EditorWindow/AssetBrowser/SHAssetBrowser.cpp @@ -16,6 +16,9 @@ #include "Editor/EditorWindow/SHEditorWindowManager.h" #include "Scripting/SHVSUtilities.h" #include "Scripting/SHScriptEngine.h" +#include "Tools/Utilities/SHStringUtilities.h" +#include +#include namespace SHADE { @@ -27,6 +30,13 @@ namespace SHADE void SHAssetBrowser::Init() { SHEditorWindow::Init(); + rttr::array_range typeNames = typeEnumAlign.get_names(); + + for(auto const& name : typeNames) + { + uint64_t val = typeEnumAlign.name_to_value(name).to_uint64(); + typeFilters[val] = true; + } } void SHAssetBrowser::Update() @@ -34,7 +44,10 @@ namespace SHADE SHEditorWindow::Update(); if (Begin()) { - RecursivelyDrawTree(rootFolder); + for(auto subFolder : rootFolder->subFolders) + { + RecursivelyDrawTree(subFolder); + } DrawMenuBar(); DrawCurrentFolder(); DrawAssetBeingCreated(); @@ -50,6 +63,11 @@ namespace SHADE refreshQueued = true; } + void SHAssetBrowser::SetScrollTo(AssetID assetid) + { + assetToScrollTo = assetid; + } + void SHAssetBrowser::Refresh() noexcept { SHAssetManager::RefreshDirectory(); @@ -69,6 +87,7 @@ namespace SHADE { isAssetBeingCreated = true; } + DrawAssetBrowserFilter(); ImGui::EndMenuBar(); } } @@ -81,13 +100,34 @@ namespace SHADE auto files = folder->files; const bool isSelected = std::ranges::find(selectedFolders, folder) != selectedFolders.end(); ImGuiTreeNodeFlags flags = (subFolders.empty() && files.empty()) ? ImGuiTreeNodeFlags_Leaf : ImGuiTreeNodeFlags_OpenOnArrow; + if(!filter.empty() && (!subFolders.empty() || !files.empty())) + { + ImGui::SetNextItemOpen(true); + } if (isSelected) flags |= ImGuiTreeNodeFlags_Selected; if (folder == rootFolder) flags |= ImGuiTreeNodeFlags_DefaultOpen; - bool isOpen = ImGui::TreeNodeEx(folder, flags, "%s %s", ICON_MD_FOLDER, folder->name.data()); - ImGuiID folderID = ImGui::GetItemID(); + if(assetToScrollTo != 0) + { + if(auto asset = SHAssetManager::GetAsset(assetToScrollTo)) + { + if(!asset->path.empty()) + { + ImGui::SetNextItemOpen(SHStringUtilities::StringFindInsensitive(asset->path.string(), folder->name.data()) != std::string::npos); + } + else if(auto parent = SHAssetManager::GetAsset(asset->parent)) + { + ImGui::SetNextItemOpen(SHStringUtilities::StringFindInsensitive(parent->path.string(), folder->name.data()) != std::string::npos); + } + } + } + + bool isOpen = false; + if(filter.empty()) + isOpen = ImGui::TreeNodeEx(folder, flags, "%s %s", ICON_MD_FOLDER, folder->name.data()); + const ImRect nodeRect = ImRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax()); //if (ImGui::BeginPopupContextItem()) @@ -101,7 +141,7 @@ namespace SHADE selectedFolders.push_back(folder); } - if (isOpen) + if (isOpen || !filter.empty()) { const ImColor treeLineColor = ImGui::GetColorU32(ImGuiCol_CheckMark); const float horizontalOffset = 0.0f; @@ -127,7 +167,8 @@ namespace SHADE } drawList->AddLine(vertLineStart, vertLineEnd, treeLineColor, 1); - ImGui::TreePop(); + if(filter.empty()) + ImGui::TreePop(); } return nodeRect; } @@ -167,8 +208,26 @@ namespace SHADE { ImGuiTreeNodeFlags flags = ImGuiTreeNodeFlags_Leaf; static constexpr std::string_view icon = ICON_MD_FILE_PRESENT; + bool highlighted = false; + if (!filter.empty()) + { + if (SHStringUtilities::StringFindInsensitive(file.name.data(), filter) == std::string::npos) + { + return ImRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax()); + } + else + { + highlighted = true; + ImGui::PushStyleColor(ImGuiCol_Text, highlightedColor); + } + } ImGui::PushID(file.name.data()); + bool const isOpen = ImGui::TreeNodeEx(file.name.data(), flags, "%s %s%s", icon.data(), file.name.data(), file.ext.data()); + if(highlighted) + { + ImGui::PopStyleColor(); + } const ImRect nodeRect = ImRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax()); if(ImGui::BeginPopupContextItem()) { @@ -194,6 +253,27 @@ namespace SHADE { if (asset == nullptr) return ImRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax()); + + if (!typeFilters[static_cast(asset->type)]) + { + return ImRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax()); + } + + bool highlighted = false; + if(!filter.empty()) + { + ImGui::SetNextItemOpen(true); + if(SHStringUtilities::StringFindInsensitive(asset->name.data(), filter) == std::string::npos) + { + return ImRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax()); + } + else + { + highlighted = true; + ImGui::PushStyleColor(ImGuiCol_Text, highlightedColor); + } + } + const bool isSelected = std::ranges::find(selectedAssets, asset->id) != selectedAssets.end(); ImGuiTreeNodeFlags flags = (!asset->subAssets.empty()) ? ImGuiTreeNodeFlags_OpenOnArrow : ImGuiTreeNodeFlags_Leaf; if (isSelected) @@ -214,8 +294,34 @@ namespace SHADE case AssetType::MAX_COUNT: break; default:; } + + if(assetToScrollTo != 0) + { + if(asset->id == assetToScrollTo) + { + ImGui::SetScrollHereY(); + selectedAssets.clear(); + selectedAssets.push_back(asset->id); + assetToScrollTo = 0; + } + else + { + for (auto const& subAsset : asset->subAssets) + { + if(subAsset->id == assetToScrollTo) + { + ImGui::SetNextItemOpen(true); + } + } + } + } bool const isOpen = ImGui::TreeNodeEx(asset, flags, "%s %s%s", icon.data(), asset->name.data(), ext.data()); + + if(highlighted) + { + ImGui::PopStyleColor(); + } const ImRect nodeRect = ImRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax()); if (SHDragDrop::BeginSource()) { @@ -339,4 +445,43 @@ namespace SHADE // QueueRefresh(); //} } + + void SHAssetBrowser::DrawAssetBrowserFilter() + { + if (ImGui::InputTextWithHint("##hierarchyPanelFilter", "Filter", &filter)) + { + } + if (ImGui::Button("x")) + { + filter.clear(); + } + if(ImGui::BeginMenu("Type")) + { + if (ImGui::Button("All")) + { + for (auto& [id, value] : typeFilters) + value = true; + } + ImGui::SameLine(); + if (ImGui::Button("None")) + { + for (auto& [id, value] : typeFilters) + value = false; + } + for (auto& [id, value] : typeFilters) + { + if(ImGui::Checkbox(typeEnumAlign.value_to_name(id).data(), &value)) + { + + } + if(ImGui::IsItemClicked(ImGuiMouseButton_Right)) + { + for (auto& [id2, value2] : typeFilters) + value2 = false; + value = true; + } + } + ImGui::EndMenu(); + } + } } diff --git a/SHADE_Engine/src/Editor/EditorWindow/AssetBrowser/SHAssetBrowser.h b/SHADE_Engine/src/Editor/EditorWindow/AssetBrowser/SHAssetBrowser.h index 6d3c5eb4..0ff5225e 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/AssetBrowser/SHAssetBrowser.h +++ b/SHADE_Engine/src/Editor/EditorWindow/AssetBrowser/SHAssetBrowser.h @@ -4,18 +4,21 @@ #include "Assets/SHAsset.h" #include "Editor/EditorWindow/SHEditorWindow.h" #include "Filesystem/SHFolder.h" +#include namespace SHADE { class SHAssetBrowser final : public SHEditorWindow { public: + static constexpr ImVec4 highlightedColor = ImVec4(0.f, 0.7f, 0.0f, 1.0f); SHAssetBrowser(); void Init(); void Update(); void QueueRefresh() noexcept; + void SetScrollTo(AssetID assetid); private: void DrawMenuBar(); ImRect RecursivelyDrawTree(FolderPointer folder); @@ -23,6 +26,7 @@ namespace SHADE ImRect DrawFile(SHFile& file) noexcept; ImRect DrawAsset(SHAsset const* const asset, FileExt const& ext = "") noexcept; void DrawAssetBeingCreated() noexcept; + void DrawAssetBrowserFilter(); void Refresh() noexcept; @@ -30,9 +34,13 @@ namespace SHADE std::vector selectedFolders; std::vector selectedAssets; static constexpr float tileWidth = 50.0f; + static constexpr std::string_view newAssetPopup = "Create New Asset"; + std::string nameOfAssetBeingCreated, filter; + rttr::enumeration typeEnumAlign = rttr::type::get().get_enumeration(); + std::unordered_map typeFilters; + + AssetID assetToScrollTo = 0; bool refreshQueued = false; bool isAssetBeingCreated = false; - static constexpr std::string_view newAssetPopup = "Create New Asset"; - std::string nameOfAssetBeingCreated; }; } diff --git a/SHADE_Engine/src/Editor/EditorWindow/HierarchyPanel/SHHierarchyPanel.h b/SHADE_Engine/src/Editor/EditorWindow/HierarchyPanel/SHHierarchyPanel.h index d217a307..cf5f0980 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/HierarchyPanel/SHHierarchyPanel.h +++ b/SHADE_Engine/src/Editor/EditorWindow/HierarchyPanel/SHHierarchyPanel.h @@ -15,11 +15,11 @@ namespace SHADE { class SHSceneNode; - constexpr ImVec4 highlightedColor = ImVec4(0.f, 0.7f, 0.0f, 1.0f); class SHHierarchyPanel final : public SHEditorWindow { public: + static constexpr ImVec4 highlightedColor = ImVec4(0.f, 0.7f, 0.0f, 1.0f); SHHierarchyPanel(); void Init() override; void Update() override; diff --git a/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorComponentView.hpp b/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorComponentView.hpp index a2873bd0..48d334fa 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorComponentView.hpp +++ b/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorComponentView.hpp @@ -24,6 +24,8 @@ #include "SHInspectorCommands.h" #include "Physics/Collision/SHCollisionTagMatrix.h" #include "Animation/SHAnimatorComponent.h" +#include "../SHEditorWindowManager.h" +#include "../AssetBrowser/SHAssetBrowser.h" namespace SHADE { template @@ -502,6 +504,15 @@ namespace SHADE SHResourceManager::FinaliseChanges(); }, SHDragDrop::DRAG_RESOURCE); + if (ImGui::IsItemHovered() && ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left)) + { + if(Handle const& mesh = component->GetMesh()) + { + AssetID assetID = SHResourceManager::GetAssetID(mesh).value_or(0); + SHEditorWindowManager::GetEditorWindow()->SetScrollTo(assetID); + } + } + const auto MAT_NAME = mat ? SHResourceManager::GetAssetName(mat->GetBaseMaterial()).value_or("") : ""; SHEditorWidgets::DragDropReadOnlyField("Material", MAT_NAME, [component]() @@ -521,6 +532,15 @@ namespace SHADE auto gfxSystem = SHSystemManager::GetSystem(); component->SetMaterial(gfxSystem->AddOrGetBaseMaterialInstance(SHResourceManager::LoadOrGet(id))); }, SHDragDrop::DRAG_RESOURCE); + if (ImGui::IsItemHovered() && ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left)) + { + if(Handle const& mat = component->GetMaterial()) + { + AssetID assetID = SHResourceManager::GetAssetID(mat->GetBaseMaterial()).value_or(0); + SHEditorWindowManager::GetEditorWindow()->SetScrollTo(assetID); + } + } + } else { @@ -558,7 +578,14 @@ namespace SHADE component->SetFont(SHResourceManager::LoadOrGet(id)); SHResourceManager::FinaliseChanges(); }, SHDragDrop::DRAG_RESOURCE); - + if (ImGui::IsItemHovered() && ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left)) + { + if (Handle const& font = component->GetFont()) + { + AssetID assetID = SHResourceManager::GetAssetID(font).value_or(0); + SHEditorWindowManager::GetEditorWindow()->SetScrollTo(assetID); + } + } SHEditorWidgets::InputText("Text", [component](void) { @@ -606,7 +633,14 @@ namespace SHADE component->SetRig(SHResourceManager::LoadOrGet(id)); SHResourceManager::FinaliseChanges(); }, SHDragDrop::DRAG_RESOURCE); - + if (ImGui::IsItemHovered() && ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left)) + { + if (Handle const& rig = component->GetRig()) + { + AssetID assetID = SHResourceManager::GetAssetID(rig).value_or(0); + SHEditorWindowManager::GetEditorWindow()->SetScrollTo(assetID); + } + } Handle const& clip = component->GetCurrentClip(); const auto CLIP_NAME = clip ? SHResourceManager::GetAssetName(clip).value_or("") : ""; SHEditorWidgets::DragDropReadOnlyField("Clip", CLIP_NAME, @@ -624,6 +658,14 @@ namespace SHADE } component->SetClip(SHResourceManager::LoadOrGet(id)); }, SHDragDrop::DRAG_RESOURCE); + if (ImGui::IsItemHovered() && ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left)) + { + if (Handle const& clip = component->GetCurrentClip()) + { + AssetID assetID = SHResourceManager::GetAssetID(clip).value_or(0); + SHEditorWindowManager::GetEditorWindow()->SetScrollTo(assetID); + } + } } else { diff --git a/SHADE_Engine/src/Editor/SHEditor.cpp b/SHADE_Engine/src/Editor/SHEditor.cpp index 4d180635..d151fd64 100644 --- a/SHADE_Engine/src/Editor/SHEditor.cpp +++ b/SHADE_Engine/src/Editor/SHEditor.cpp @@ -96,8 +96,10 @@ namespace SHADE SHLOG_CRITICAL("Failed to create ImGui Context") } } - + +#ifdef SHEDITOR editorConfig = &SHConfigurationManager::LoadEditorConfig(); +#endif //Add editor windows SHEditorWindowManager::CreateEditorWindow(); @@ -131,8 +133,9 @@ namespace SHADE InitBackend(); +#ifdef SHEDITOR SetStyle(static_cast