From 4478b6db62d8dc309f949665e364e4b41b89dd3b Mon Sep 17 00:00:00 2001 From: Kah Wei Date: Tue, 22 Nov 2022 17:48:01 +0800 Subject: [PATCH] Added editor support for FontAsset, MeshAsset and MaterialAsset. --- Assets/Scripts/RaccoonShowcase.cs | 4 +- SHADE_Engine/src/Editor/SHEditorUI.cpp | 49 ++++++++++++++++++++++ SHADE_Engine/src/Editor/SHEditorUI.h | 11 +++++ SHADE_Managed/src/Assets/FontAsset.cxx | 2 +- SHADE_Managed/src/Assets/MaterialAsset.cxx | 2 +- SHADE_Managed/src/Assets/MeshAsset.cxx | 2 +- SHADE_Managed/src/Editor/Editor.cxx | 10 ++++- SHADE_Managed/src/Editor/Editor.h++ | 39 +++++++++++++++++ 8 files changed, 113 insertions(+), 6 deletions(-) diff --git a/Assets/Scripts/RaccoonShowcase.cs b/Assets/Scripts/RaccoonShowcase.cs index 3c767f7f..1da191fd 100644 --- a/Assets/Scripts/RaccoonShowcase.cs +++ b/Assets/Scripts/RaccoonShowcase.cs @@ -23,7 +23,9 @@ public class RaccoonShowcase : Script [Range(-5, 5)] public List intList = new List(new int[] { 2, 8, 2, 6, 8, 0, 1 }); public List enumList = new List(new Light.Type[] { Light.Type.Point, Light.Type.Directional, Light.Type.Ambient }); - + public FontAsset fontAsset; + public MeshAsset mesh; + public MaterialAsset matAsset; protected override void awake() { Transform = GetComponent(); diff --git a/SHADE_Engine/src/Editor/SHEditorUI.cpp b/SHADE_Engine/src/Editor/SHEditorUI.cpp index 9fdcbde7..caa6e5a2 100644 --- a/SHADE_Engine/src/Editor/SHEditorUI.cpp +++ b/SHADE_Engine/src/Editor/SHEditorUI.cpp @@ -15,8 +15,10 @@ of DigiPen Institute of Technology is prohibited. #include "SHEditorUI.h" // External Dependencies #include +// Project Includes #include "SHEditorWidgets.hpp" #include "ECS_Base/Managers/SHEntityManager.h" +#include "Assets/SHAssetManager.h" namespace SHADE { @@ -351,6 +353,53 @@ namespace SHADE return changed; } + bool SHEditorUI::InputAssetField(const std::string& label, AssetID& value, AssetType type, bool* isHovered, bool alwaysNull) + { + // Label + if (!label.empty()) + { + ImGui::Text(label.c_str()); + ImGui::SameLine(); + } + // Hover tracking + if (isHovered) + *isHovered = ImGui::IsItemHovered(); + ImGui::SameLine(); + + // Attempt to get the asset's data for rendering editor + auto asset = SHAssetManager::GetAsset(value); + std::string assetName; + if (asset.has_value()) + { + assetName = asset.value().name; + } + + // Editor + bool changed = ImGui::InputText("##", &assetName, ImGuiInputTextFlags_ReadOnly); + if (SHDragDrop::BeginTarget()) + { + if (AssetID* payload = SHDragDrop::AcceptPayload(SHDragDrop::DRAG_RESOURCE)) + { + // Check if type matches + auto draggedAsset = SHAssetManager::GetAsset(*payload); + if (draggedAsset.has_value() && draggedAsset.value().type == type) + { + value = draggedAsset.value().id; + changed = true; + } + SHDragDrop::EndTarget(); + } + } + ImGui::SameLine(); + if (ImGui::Button("Clear")) + { + value = INVALID_ASSET_ID; + changed = true; + } + + return changed; + } + bool SHEditorUI::InputEnumCombo(const std::string& label, int& v, const std::vector& enumNames, bool* isHovered) { // Clamp input value diff --git a/SHADE_Engine/src/Editor/SHEditorUI.h b/SHADE_Engine/src/Editor/SHEditorUI.h index f450ac0d..ce26b39e 100644 --- a/SHADE_Engine/src/Editor/SHEditorUI.h +++ b/SHADE_Engine/src/Editor/SHEditorUI.h @@ -19,6 +19,7 @@ of DigiPen Institute of Technology is prohibited. #include "Math/Vector/SHVec3.h" #include "Math/Vector/SHVec4.h" #include "Math/SHMatrix.h" +#include "Assets/SHAssetMacros.h" namespace SHADE { @@ -310,6 +311,16 @@ namespace SHADE /// True if the value was changed. static bool InputGameObjectField(const std::string& label, uint32_t& value, bool* isHovered = nullptr, bool alwaysNull = false); /// + /// + /// + /// + /// + /// + /// + /// + /// + static bool InputAssetField(const std::string& label, AssetID& value, AssetType type, bool* isHovered = nullptr, bool alwaysNull = false); + /// /// Creates a combo box for enumeration input. /// /// The type of enum to input. diff --git a/SHADE_Managed/src/Assets/FontAsset.cxx b/SHADE_Managed/src/Assets/FontAsset.cxx index e49568fc..19d256cb 100644 --- a/SHADE_Managed/src/Assets/FontAsset.cxx +++ b/SHADE_Managed/src/Assets/FontAsset.cxx @@ -51,7 +51,7 @@ namespace SHADE /*---------------------------------------------------------------------------------*/ FontAsset::operator bool(FontAsset asset) { - return asset; + return asset.asset; } /*---------------------------------------------------------------------------------*/ diff --git a/SHADE_Managed/src/Assets/MaterialAsset.cxx b/SHADE_Managed/src/Assets/MaterialAsset.cxx index 16f6a929..48cbfd83 100644 --- a/SHADE_Managed/src/Assets/MaterialAsset.cxx +++ b/SHADE_Managed/src/Assets/MaterialAsset.cxx @@ -52,7 +52,7 @@ namespace SHADE /*---------------------------------------------------------------------------------*/ MaterialAsset::operator bool(MaterialAsset asset) { - return asset; + return asset.asset; } /*---------------------------------------------------------------------------------*/ diff --git a/SHADE_Managed/src/Assets/MeshAsset.cxx b/SHADE_Managed/src/Assets/MeshAsset.cxx index d24ad20d..6301fcee 100644 --- a/SHADE_Managed/src/Assets/MeshAsset.cxx +++ b/SHADE_Managed/src/Assets/MeshAsset.cxx @@ -51,7 +51,7 @@ namespace SHADE /*---------------------------------------------------------------------------------*/ MeshAsset::operator bool(MeshAsset asset) { - return asset; + return asset.asset; } /*---------------------------------------------------------------------------------*/ diff --git a/SHADE_Managed/src/Editor/Editor.cxx b/SHADE_Managed/src/Editor/Editor.cxx index beb667e3..29e3da36 100644 --- a/SHADE_Managed/src/Editor/Editor.cxx +++ b/SHADE_Managed/src/Editor/Editor.cxx @@ -176,7 +176,10 @@ namespace SHADE renderSpecificField(field, object, SHEditorUI::InputVec3 , &isHovered) || renderSpecificField(field, object, nullptr , &isHovered) || renderSpecificField(field, object, nullptr , &isHovered) || - renderSpecificField(field, object, nullptr , &isHovered); + renderSpecificField(field, object, nullptr , &isHovered) || + renderSpecificField(field, object, nullptr , &isHovered) || + renderSpecificField(field, object, nullptr , &isHovered) || + renderSpecificField(field, object, nullptr , &isHovered); if (!MODIFIED_PRIMITIVE) { @@ -319,7 +322,10 @@ namespace SHADE renderFieldEditor(fieldName, object, SHEditorUI::InputVec3 , nullptr, rangeAttrib, modified) || renderFieldEditor(fieldName, object, nullptr , nullptr, rangeAttrib, modified) || renderFieldEditor(fieldName, object, nullptr , nullptr, rangeAttrib, modified) || - renderFieldEditor(fieldName, object, nullptr , nullptr, rangeAttrib, modified); + renderFieldEditor(fieldName, object, nullptr , nullptr, rangeAttrib, modified) || + renderFieldEditor(fieldName, object, nullptr , nullptr, rangeAttrib, modified) || + renderFieldEditor(fieldName, object, nullptr , nullptr, rangeAttrib, modified) || + renderFieldEditor(fieldName, object, nullptr , nullptr, rangeAttrib, modified); return modified; } diff --git a/SHADE_Managed/src/Editor/Editor.h++ b/SHADE_Managed/src/Editor/Editor.h++ index a186d7ea..352431fd 100644 --- a/SHADE_Managed/src/Editor/Editor.h++ +++ b/SHADE_Managed/src/Editor/Editor.h++ @@ -20,6 +20,9 @@ of DigiPen Institute of Technology is prohibited. #include "Editor/SHEditorUI.h" // Project Includes #include "Utility/Convert.hxx" +#include "Assets/FontAsset.hxx" +#include "Assets/MeshAsset.hxx" +#include "Assets/MaterialAsset.hxx" namespace SHADE { @@ -198,6 +201,42 @@ namespace SHADE return true; } + return false; + } + template<> + bool Editor::renderFieldEditorInternal(const std::string& fieldName, interior_ptr managedValPtr, EditorFieldFunc, bool* isHovered, RangeAttribute^) + { + uint32_t assetId = managedValPtr->NativeAssetID; + if (SHEditorUI::InputAssetField(fieldName, assetId, AssetType::FONT, isHovered, !(*managedValPtr))) + { + *managedValPtr = FontAsset(assetId); + return true; + } + + return false; + } + template<> + bool Editor::renderFieldEditorInternal(const std::string& fieldName, interior_ptr managedValPtr, EditorFieldFunc, bool* isHovered, RangeAttribute^) + { + uint32_t assetId = managedValPtr->NativeAssetID; + if (SHEditorUI::InputAssetField(fieldName, assetId, AssetType::MESH, isHovered, !(*managedValPtr))) + { + *managedValPtr = MeshAsset(assetId); + return true; + } + + return false; + } + template<> + bool Editor::renderFieldEditorInternal(const std::string& fieldName, interior_ptr managedValPtr, EditorFieldFunc, bool* isHovered, RangeAttribute^) + { + uint32_t assetId = managedValPtr->NativeAssetID; + if (SHEditorUI::InputAssetField(fieldName, assetId, AssetType::MATERIAL, isHovered, !(*managedValPtr))) + { + *managedValPtr = MaterialAsset(assetId); + return true; + } + return false; } }