From a78b3c0123e291a7a7b597fe509f110deef412da Mon Sep 17 00:00:00 2001 From: Kah Wei Date: Tue, 22 Nov 2022 15:37:01 +0800 Subject: [PATCH 1/7] Reworked NativeAsset system --- SHADE_Engine/src/Resource/SHResourceManager.h | 3 +- .../src/Resource/SHResourceManagerWrapper.cpp | 34 ++++++++++ .../src/Resource/SHResourceManagerWrapper.h | 57 ++++++++++++++++ SHADE_Managed/src/Assets/Font.cxx | 45 ++++++++++++- SHADE_Managed/src/Assets/Font.hxx | 59 ++++++++++++++++- SHADE_Managed/src/Assets/Material.cxx | 43 +++++++++++- SHADE_Managed/src/Assets/Material.hxx | 57 +++++++++++++++- SHADE_Managed/src/Assets/Mesh.cxx | 45 +++++++++++-- SHADE_Managed/src/Assets/Mesh.hxx | 65 +++++++++++++++++-- SHADE_Managed/src/Assets/NativeAsset.cxx | 14 ++++ SHADE_Managed/src/Assets/NativeAsset.h++ | 44 ------------- SHADE_Managed/src/Assets/NativeAsset.hxx | 57 +++++++--------- 12 files changed, 425 insertions(+), 98 deletions(-) create mode 100644 SHADE_Engine/src/Resource/SHResourceManagerWrapper.cpp create mode 100644 SHADE_Engine/src/Resource/SHResourceManagerWrapper.h delete mode 100644 SHADE_Managed/src/Assets/NativeAsset.h++ diff --git a/SHADE_Engine/src/Resource/SHResourceManager.h b/SHADE_Engine/src/Resource/SHResourceManager.h index 6afdf2b0..5b98ffc3 100644 --- a/SHADE_Engine/src/Resource/SHResourceManager.h +++ b/SHADE_Engine/src/Resource/SHResourceManager.h @@ -49,7 +49,8 @@ namespace SHADE template<> struct SHResourceLoader { using AssetType = SHMaterialAsset; }; template<> struct SHResourceLoader { using AssetType = SHMaterialSpec; }; template<> struct SHResourceLoader { using AssetType = SHFontAsset; }; -/// + + /// /// Static class responsible for loading and caching runtime resources from their /// serialised Asset IDs. /// diff --git a/SHADE_Engine/src/Resource/SHResourceManagerWrapper.cpp b/SHADE_Engine/src/Resource/SHResourceManagerWrapper.cpp new file mode 100644 index 00000000..f99e2dc6 --- /dev/null +++ b/SHADE_Engine/src/Resource/SHResourceManagerWrapper.cpp @@ -0,0 +1,34 @@ +/************************************************************************************//*! +\file SHResourceManagerWrapper.cpp +\author Tng Kah Wei, kahwei.tng, 390009620 +\par email: kahwei.tng\@digipen.edu +\date Nov 22, 2022 +\brief Contains the definition of the functions of the SHResourceManagerWraper + static class. + +Copyright (C) 2022 DigiPen Institute of Technology. +Reproduction or disclosure of this file or its contents without the prior written consent +of DigiPen Institute of Technology is prohibited. +*//*************************************************************************************/ +// Precompiled Header +#include "SHpch.h" +// Primary Include +#include "SHResourceManagerWrapper.h" +// Project Includes +#include "SHResourceManager.h" + +namespace SHADE +{ + /*-----------------------------------------------------------------------------------*/ + /* Query Functions */ + /*-----------------------------------------------------------------------------------*/ + std::optional SHResourceManagerWrapper::GetAssetID(Handle handle) + { + return SHResourceManager::GetAssetID(handle); + } + + std::optional SHResourceManagerWrapper::GetAssetName(Handle handle) + { + return SHResourceManager::GetAssetName(handle); + } +} diff --git a/SHADE_Engine/src/Resource/SHResourceManagerWrapper.h b/SHADE_Engine/src/Resource/SHResourceManagerWrapper.h new file mode 100644 index 00000000..9f34f74e --- /dev/null +++ b/SHADE_Engine/src/Resource/SHResourceManagerWrapper.h @@ -0,0 +1,57 @@ +/************************************************************************************//*! +\file SHResourceManagerWrapper.h +\author Tng Kah Wei, kahwei.tng, 390009620 +\par email: kahwei.tng\@digipen.edu +\date Nov 22, 2022 +\brief Contains the definition of the SHResourceManagerWrapper static class. + +Copyright (C) 2022 DigiPen Institute of Technology. +Reproduction or disclosure of this file or its contents without the prior written consent +of DigiPen Institute of Technology is prohibited. +*//*************************************************************************************/ +#pragma once + +// STL Includes +#include +// Project Includes +#include "SH_API.h" +#include "Resource/SHHandle.h" +#include "Assets/SHAssetMacros.h" + +namespace SHADE +{ + /// + /// Static class providing access to non-templated functions of SHResourceManager for + /// SHADE_Managed. + /// + class SH_API SHResourceManagerWrapper + { + public: + /*---------------------------------------------------------------------------------*/ + /* Query Functions */ + /*---------------------------------------------------------------------------------*/ + /// + /// Retrieves the AssetID associated with a specified Handle. + /// Compared to the templated version, this function is slower as it requires + /// searching through the storage of all resource types. + /// + /// Handle to get the AssetID of. + /// + /// AssetID for the specified Handle. If the Handle is invalid, there will be no + /// value. + /// + static std::optional GetAssetID(Handle handle); + /// + /// Retrieves the name associated with the AssetID that is associated with the + /// specified Handle. + /// Compared to the templated version, this function is slower as it requires + /// searching through the storage of all resource types. + /// + /// Handle to get the name of. + /// + /// Name for the specified Handle. If the Handle is invalid, there will be no + /// value. + /// + static std::optional GetAssetName(Handle handle); + }; +} \ No newline at end of file diff --git a/SHADE_Managed/src/Assets/Font.cxx b/SHADE_Managed/src/Assets/Font.cxx index 782b0688..b21c7a02 100644 --- a/SHADE_Managed/src/Assets/Font.cxx +++ b/SHADE_Managed/src/Assets/Font.cxx @@ -15,18 +15,57 @@ of DigiPen Institute of Technology is prohibited. #include "SHpch.h" // Primary Header #include "Font.hxx" +// Project Headers +#include "Utility/Convert.hxx" namespace SHADE { /*---------------------------------------------------------------------------------*/ - /* Explicit Template Instantiation */ + /* Properties */ /*---------------------------------------------------------------------------------*/ - template ref class NativeAsset; + Handle Font::NativeObject::get() + try + { + return Handle(Convert::ToNative(asset.NativeObjectHandle)); + } + catch (const BadHandleCastException&) + { + return Handle(); + } + GenericHandle Font::NativeObjectHandle::get() + { + return asset.NativeObjectHandle; + } + AssetID Font::NativeAssetID::get() + { + return asset.NativeAssetID; + } /*---------------------------------------------------------------------------------*/ /* Constructors/Destructor */ /*---------------------------------------------------------------------------------*/ Font::Font(Handle font) - : NativeAsset { font } + : asset { Handle(font) } {} + + /*---------------------------------------------------------------------------------*/ + /* Operator Overloads */ + /*---------------------------------------------------------------------------------*/ + Font::operator bool(Font asset) + { + return asset; + } + + /*---------------------------------------------------------------------------------*/ + /* Conversion Operators */ + /*---------------------------------------------------------------------------------*/ + Font::operator Asset(Font nativeAsset) + { + return nativeAsset.asset; + } + + Font::operator Font(Asset asset) + { + return Font(Handle(Convert::ToNative(asset.NativeObjectHandle))); + } } diff --git a/SHADE_Managed/src/Assets/Font.hxx b/SHADE_Managed/src/Assets/Font.hxx index fd194d1a..4acc49e6 100644 --- a/SHADE_Managed/src/Assets/Font.hxx +++ b/SHADE_Managed/src/Assets/Font.hxx @@ -24,11 +24,36 @@ namespace SHADE { /// /// Managed counterpart of the native Font object that can be fed to TextRenderables - /// for rendering. + /// for rendering. /// - public ref class Font : public NativeAsset + public value struct Font { internal: + /*-----------------------------------------------------------------------------*/ + /* Properties */ + /*-----------------------------------------------------------------------------*/ + /// + /// Copy of the Handle to the native object. + /// + property Handle NativeObject + { + Handle get(); + } + /// + /// Generic handle for the native object + /// + property GenericHandle NativeObjectHandle + { + GenericHandle get(); + } + /// + /// The raw asset ID of the asset. + /// + property AssetID NativeAssetID + { + AssetID get(); + } + /*-----------------------------------------------------------------------------*/ /* Constructors/Destructor */ /*-----------------------------------------------------------------------------*/ @@ -37,5 +62,35 @@ namespace SHADE /// /// Handle to the font object. Font(Handle font); + + /*-----------------------------------------------------------------------------*/ + /* Operator Overloads */ + /*-----------------------------------------------------------------------------*/ + /// + /// Implicit conversion operator to enable checking if a Font is valid. + /// + /// Asset to check. + /// True if the Asset is valid. + static operator bool(Font asset); + + /*-----------------------------------------------------------------------------*/ + /* Conversion Operators */ + /*-----------------------------------------------------------------------------*/ + /// + /// Conversion operator to enable casting from a Font to an Asset. + /// + /// Vector3 to convert from. + static explicit operator Asset(Font nativeAsset); + /// + /// Conversion operator to enable casting from a Asset to a Font. + /// + /// Vector2 to convert from. + static explicit operator Font(Asset vec); + + protected: + /*-----------------------------------------------------------------------------*/ + /* Data Members */ + /*-----------------------------------------------------------------------------*/ + Asset asset; }; } diff --git a/SHADE_Managed/src/Assets/Material.cxx b/SHADE_Managed/src/Assets/Material.cxx index f4262c2a..3caa5b22 100644 --- a/SHADE_Managed/src/Assets/Material.cxx +++ b/SHADE_Managed/src/Assets/Material.cxx @@ -53,15 +53,31 @@ namespace SHADE } /*---------------------------------------------------------------------------------*/ - /* Explicit Template Instantiation */ + /* Properties */ /*---------------------------------------------------------------------------------*/ - template ref class NativeAsset; + Handle Material::NativeObject::get() + try + { + return Handle(Convert::ToNative(asset.NativeObjectHandle)); + } + catch (const BadHandleCastException&) + { + return Handle(); + } + GenericHandle Material::NativeObjectHandle::get() + { + return asset.NativeObjectHandle; + } + AssetID Material::NativeAssetID::get() + { + return asset.NativeAssetID; + } /*---------------------------------------------------------------------------------*/ /* Constructors/Destructor */ /*---------------------------------------------------------------------------------*/ Material::Material(Handle material) - : NativeAsset{ material } + : asset { Handle(material) } {} /*---------------------------------------------------------------------------------*/ @@ -116,4 +132,25 @@ namespace SHADE throw gcnew System::ArgumentException("Attempted to retrieve an invalid property on a material."); } + + /*---------------------------------------------------------------------------------*/ + /* Operator Overloads */ + /*---------------------------------------------------------------------------------*/ + Material::operator bool(Material asset) + { + return asset; + } + + /*---------------------------------------------------------------------------------*/ + /* Conversion Operators */ + /*---------------------------------------------------------------------------------*/ + Material::operator Asset(Material nativeAsset) + { + return nativeAsset.asset; + } + + Material::operator Material(Asset asset) + { + return Material(Handle(Convert::ToNative(asset.NativeObjectHandle))); + } } diff --git a/SHADE_Managed/src/Assets/Material.hxx b/SHADE_Managed/src/Assets/Material.hxx index 25cc96a6..14cf557e 100644 --- a/SHADE_Managed/src/Assets/Material.hxx +++ b/SHADE_Managed/src/Assets/Material.hxx @@ -26,9 +26,34 @@ namespace SHADE /// Managed counterpart of the native MaterialInstance object containing material /// data that can be fed to Renderables for rendering. /// - public ref class Material : public NativeAsset + public value struct Material { internal: + /*-----------------------------------------------------------------------------*/ + /* Properties */ + /*-----------------------------------------------------------------------------*/ + /// + /// Copy of the Handle to the native object. + /// + property Handle NativeObject + { + Handle get(); + } + /// + /// Generic handle for the native object + /// + property GenericHandle NativeObjectHandle + { + GenericHandle get(); + } + /// + /// The raw asset ID of the asset. + /// + property AssetID NativeAssetID + { + AssetID get(); + } + /*-----------------------------------------------------------------------------*/ /* Constructors/Destructor */ /*-----------------------------------------------------------------------------*/ @@ -77,5 +102,35 @@ namespace SHADE /// generic T GetProperty(System::String^ name); + + /*-----------------------------------------------------------------------------*/ + /* Operator Overloads */ + /*-----------------------------------------------------------------------------*/ + /// + /// Implicit conversion operator to enable checking if a Material is valid. + /// + /// Asset to check. + /// True if the Asset is valid. + static operator bool(Material asset); + + /*-----------------------------------------------------------------------------*/ + /* Conversion Operators */ + /*-----------------------------------------------------------------------------*/ + /// + /// Conversion operator to enable casting from a Material to an Asset. + /// + /// Vector3 to convert from. + static explicit operator Asset(Material nativeAsset); + /// + /// Conversion operator to enable casting from a Asset to a Material. + /// + /// Vector2 to convert from. + static explicit operator Material(Asset vec); + + protected: + /*-----------------------------------------------------------------------------*/ + /* Data Members */ + /*-----------------------------------------------------------------------------*/ + Asset asset; }; } diff --git a/SHADE_Managed/src/Assets/Mesh.cxx b/SHADE_Managed/src/Assets/Mesh.cxx index 95a61ff6..bcfeac36 100644 --- a/SHADE_Managed/src/Assets/Mesh.cxx +++ b/SHADE_Managed/src/Assets/Mesh.cxx @@ -21,14 +21,51 @@ of DigiPen Institute of Technology is prohibited. namespace SHADE { /*---------------------------------------------------------------------------------*/ - /* Explicit Template Instantiation */ + /* Properties */ /*---------------------------------------------------------------------------------*/ - template ref class NativeAsset; + Handle Mesh::NativeObject::get() + try + { + return Handle(Convert::ToNative(asset.NativeObjectHandle)); + } + catch (const BadHandleCastException&) + { + return Handle(); + } + GenericHandle Mesh::NativeObjectHandle::get() + { + return asset.NativeObjectHandle; + } + AssetID Mesh::NativeAssetID::get() + { + return asset.NativeAssetID; + } /*---------------------------------------------------------------------------------*/ /* Constructors/Destructor */ /*---------------------------------------------------------------------------------*/ - Mesh::Mesh(Handle mesh) - : NativeAsset { mesh } + Mesh::Mesh(Handle Mesh) + : asset{ Handle(Mesh) } {} + + /*---------------------------------------------------------------------------------*/ + /* Operator Overloads */ + /*---------------------------------------------------------------------------------*/ + Mesh::operator bool(Mesh asset) + { + return asset; + } + + /*---------------------------------------------------------------------------------*/ + /* Conversion Operators */ + /*---------------------------------------------------------------------------------*/ + Mesh::operator Asset(Mesh nativeAsset) + { + return nativeAsset.asset; + } + + Mesh::operator Mesh(Asset asset) + { + return Mesh(Handle(Convert::ToNative(asset.NativeObjectHandle))); + } } diff --git a/SHADE_Managed/src/Assets/Mesh.hxx b/SHADE_Managed/src/Assets/Mesh.hxx index 8cd356ba..7403ae83 100644 --- a/SHADE_Managed/src/Assets/Mesh.hxx +++ b/SHADE_Managed/src/Assets/Mesh.hxx @@ -26,16 +26,71 @@ namespace SHADE /// Managed counterpart of the native Mesh object containing vertex data that can /// be fed to Renderables for rendering. /// - public ref class Mesh : public NativeAsset + public value struct Mesh { - internal: + internal: + /*-----------------------------------------------------------------------------*/ + /* Properties */ + /*-----------------------------------------------------------------------------*/ + /// + /// Copy of the Handle to the native object. + /// + property Handle NativeObject + { + Handle get(); + } + /// + /// Generic handle for the native object + /// + property GenericHandle NativeObjectHandle + { + GenericHandle get(); + } + /// + /// The raw asset ID of the asset. + /// + property AssetID NativeAssetID + { + AssetID get(); + } + /*-----------------------------------------------------------------------------*/ /* Constructors/Destructor */ /*-----------------------------------------------------------------------------*/ /// - /// Constructor for the Mesh + /// Constructor for the Mesh. /// - /// Handle to the mesh object. - Mesh(Handle mesh); + /// Handle to the Mesh object. + Mesh(Handle Mesh); + + /*-----------------------------------------------------------------------------*/ + /* Operator Overloads */ + /*-----------------------------------------------------------------------------*/ + /// + /// Implicit conversion operator to enable checking if a Mesh is valid. + /// + /// Asset to check. + /// True if the Asset is valid. + static operator bool(Mesh asset); + + /*-----------------------------------------------------------------------------*/ + /* Conversion Operators */ + /*-----------------------------------------------------------------------------*/ + /// + /// Conversion operator to enable casting from a Mesh to an Asset. + /// + /// Vector3 to convert from. + static explicit operator Asset(Mesh nativeAsset); + /// + /// Conversion operator to enable casting from a Asset to a Mesh. + /// + /// Vector2 to convert from. + static explicit operator Mesh(Asset vec); + + protected: + /*-----------------------------------------------------------------------------*/ + /* Data Members */ + /*-----------------------------------------------------------------------------*/ + Asset asset; }; } diff --git a/SHADE_Managed/src/Assets/NativeAsset.cxx b/SHADE_Managed/src/Assets/NativeAsset.cxx index 9cdb1840..3f827fea 100644 --- a/SHADE_Managed/src/Assets/NativeAsset.cxx +++ b/SHADE_Managed/src/Assets/NativeAsset.cxx @@ -17,6 +17,8 @@ of DigiPen Institute of Technology is prohibited. #include "NativeAsset.hxx" // Project Includes #include "Engine/GenericHandle.hxx" +#include "Utility/Convert.hxx" +#include "Resource/SHResourceManagerWrapper.h" namespace SHADE { @@ -27,6 +29,10 @@ namespace SHADE { return nativeObjHandle; } + AssetID Asset::NativeAssetID::get() + { + return SHResourceManagerWrapper::GetAssetID(Convert::ToNative(nativeObjHandle)).value_or(INVALID_ASSET_ID); + } /*---------------------------------------------------------------------------------*/ /* Constructors */ @@ -34,4 +40,12 @@ namespace SHADE Asset::Asset(Handle nativeHandle) : nativeObjHandle { Convert::ToCLI(Handle(nativeHandle)) } {} + + /*---------------------------------------------------------------------------------*/ + /* Operator Overloads */ + /*---------------------------------------------------------------------------------*/ + Asset::operator bool(Asset asset) + { + return asset.nativeObjHandle && asset.NativeAssetID != INVALID_ASSET_ID; + } } \ No newline at end of file diff --git a/SHADE_Managed/src/Assets/NativeAsset.h++ b/SHADE_Managed/src/Assets/NativeAsset.h++ deleted file mode 100644 index 05be83b4..00000000 --- a/SHADE_Managed/src/Assets/NativeAsset.h++ +++ /dev/null @@ -1,44 +0,0 @@ -/************************************************************************************//*! -\file NativeAsset.h++ -\author Tng Kah Wei, kahwei.tng, 390009620 -\par email: kahwei.tng\@digipen.edu -\date Oct 28, 2022 -\brief Contains the definition of templated functions for the managed - NativeAsset classes. - - Note: This file is written in C++17/CLI. - -Copyright (C) 2022 DigiPen Institute of Technology. -Reproduction or disclosure of this file or its contents without the prior written consent -of DigiPen Institute of Technology is prohibited. -*//*************************************************************************************/ -#pragma once - -// Primary Include -#include "NativeAsset.hxx" -#include "Utility/Convert.hxx" - -namespace SHADE -{ - /*---------------------------------------------------------------------------------*/ - /* Properties */ - /*---------------------------------------------------------------------------------*/ - template - Handle NativeAsset::NativeObject::get() - try - { - return Handle(Convert::ToNative(nativeObjHandle)); - } - catch (const BadHandleCastException&) - { - return Handle(); // Null handle - } - - /*---------------------------------------------------------------------------------*/ - /* Constructors */ - /*---------------------------------------------------------------------------------*/ - template - NativeAsset::NativeAsset(Handle nativeObj) - : Asset { Handle(nativeObj) } - {} -} diff --git a/SHADE_Managed/src/Assets/NativeAsset.hxx b/SHADE_Managed/src/Assets/NativeAsset.hxx index 4d53ce6b..7ce9c6ed 100644 --- a/SHADE_Managed/src/Assets/NativeAsset.hxx +++ b/SHADE_Managed/src/Assets/NativeAsset.hxx @@ -14,14 +14,17 @@ of DigiPen Institute of Technology is prohibited. *//*************************************************************************************/ #pragma once +// External Dependencies +#include "Assets/SHAssetMacros.h" +// Project Includes #include "Engine/GenericHandle.hxx" namespace SHADE { /// - /// Abstract base class that all Native Assets will inherit from. + /// Struct that contains native asset information. /// - public ref class Asset abstract + public value struct Asset { internal: /*-----------------------------------------------------------------------------*/ @@ -34,6 +37,13 @@ namespace SHADE { GenericHandle get(); } + /// + /// The raw asset ID of the asset. + /// + property AssetID NativeAssetID + { + AssetID get(); + } /*-----------------------------------------------------------------------------*/ /* Constructors/Destructor */ @@ -44,43 +54,20 @@ namespace SHADE /// Native asset object handle. Asset(Handle nativeHandle); + /*-----------------------------------------------------------------------------*/ + /* Operator Overloads */ + /*-----------------------------------------------------------------------------*/ + /// + /// Implicit conversion operator to enable checking if a Asset is valid. + /// + /// Asset to check. + /// True if the Asset is valid. + static operator bool(Asset asset); + protected: /*-----------------------------------------------------------------------------*/ /* Data Members */ /*-----------------------------------------------------------------------------*/ GenericHandle nativeObjHandle; }; - - /// - /// Generalised template class for a managed representation of a native asset - /// - /// - /// The type of the asset's native representation. - /// - template - public ref class NativeAsset abstract : Asset - { - internal: - /*-----------------------------------------------------------------------------*/ - /* Properties */ - /*-----------------------------------------------------------------------------*/ - /// - /// Copy of the Handle to the native object. - /// - property Handle NativeObject - { - Handle get(); - } - - /*-----------------------------------------------------------------------------*/ - /* Constructors/Destructor */ - /*-----------------------------------------------------------------------------*/ - /// - /// Constructor for the native asset - /// - /// Native asset object handle. - NativeAsset(Handle ptr); - }; } - -#include "NativeAsset.h++" -- 2.40.1 From 719d29dec3f97ddfa86a399e9ddb9e4276b7a4d1 Mon Sep 17 00:00:00 2001 From: Kah Wei Date: Tue, 22 Nov 2022 16:51:07 +0800 Subject: [PATCH 2/7] Renamed Mesh and Font structs in Managed to MeshAsset and FontAsset and reworked them to be a abstraction for asset IDs --- .../Resource/SHResourceManagerInterface.cpp | 59 ++++++++++ .../src/Resource/SHResourceManagerInterface.h | 111 ++++++++++++++++++ .../src/Resource/SHResourceManagerWrapper.cpp | 34 ------ .../src/Resource/SHResourceManagerWrapper.h | 57 --------- .../src/Assets/{Font.cxx => FontAsset.cxx} | 26 ++-- .../src/Assets/{Font.hxx => FontAsset.hxx} | 21 ++-- .../src/Assets/{Mesh.cxx => MeshAsset.cxx} | 26 ++-- .../src/Assets/{Mesh.hxx => MeshAsset.hxx} | 21 ++-- SHADE_Managed/src/Assets/NativeAsset.cxx | 13 +- SHADE_Managed/src/Assets/NativeAsset.hxx | 13 +- SHADE_Managed/src/Components/Renderable.cxx | 6 +- SHADE_Managed/src/Components/Renderable.hxx | 8 +- .../src/Components/TextRenderable.cxx | 6 +- .../src/Components/TextRenderable.hxx | 8 +- 14 files changed, 229 insertions(+), 180 deletions(-) create mode 100644 SHADE_Engine/src/Resource/SHResourceManagerInterface.cpp create mode 100644 SHADE_Engine/src/Resource/SHResourceManagerInterface.h delete mode 100644 SHADE_Engine/src/Resource/SHResourceManagerWrapper.cpp delete mode 100644 SHADE_Engine/src/Resource/SHResourceManagerWrapper.h rename SHADE_Managed/src/Assets/{Font.cxx => FontAsset.cxx} (79%) rename SHADE_Managed/src/Assets/{Font.hxx => FontAsset.hxx} (86%) rename SHADE_Managed/src/Assets/{Mesh.cxx => MeshAsset.cxx} (79%) rename SHADE_Managed/src/Assets/{Mesh.hxx => MeshAsset.hxx} (86%) diff --git a/SHADE_Engine/src/Resource/SHResourceManagerInterface.cpp b/SHADE_Engine/src/Resource/SHResourceManagerInterface.cpp new file mode 100644 index 00000000..d89a7b16 --- /dev/null +++ b/SHADE_Engine/src/Resource/SHResourceManagerInterface.cpp @@ -0,0 +1,59 @@ +/************************************************************************************//*! +\file SHResourceManagerInterface.cpp +\author Tng Kah Wei, kahwei.tng, 390009620 +\par email: kahwei.tng\@digipen.edu +\date Nov 22, 2022 +\brief Contains the definition of the functions of the + SHResourceManagerInterface static class. + +Copyright (C) 2022 DigiPen Institute of Technology. +Reproduction or disclosure of this file or its contents without the prior written consent +of DigiPen Institute of Technology is prohibited. +*//*************************************************************************************/ +// Precompiled Header +#include "SHpch.h" +// Primary Include +#include "SHResourceManagerInterface.h" +// Project Includes +#include "SHResourceManager.h" + +namespace SHADE +{ + Handle SHResourceManagerInterface::LoadOrGetMesh(AssetID assetId) + { + return SHResourceManager::LoadOrGet(assetId); + } + Handle SHResourceManagerInterface::LoadOrGetTexture(AssetID assetId) + { + return SHResourceManager::LoadOrGet(assetId); + } + Handle SHResourceManagerInterface::LoadOrGetShaderModule(AssetID assetId) + { + return SHResourceManager::LoadOrGet(assetId); + } + Handle SHResourceManagerInterface::LoadOrGetMaterialSpec(AssetID assetId) + { + return SHResourceManager::LoadOrGet(assetId); + } + Handle SHResourceManagerInterface::LoadOrGetMaterial(AssetID assetId) + { + return SHResourceManager::LoadOrGet(assetId); + } + Handle SHResourceManagerInterface::LoadOrGetFont(AssetID assetId) + { + return SHResourceManager::LoadOrGet(assetId); + } + + /*-----------------------------------------------------------------------------------*/ + /* Query Functions */ + /*-----------------------------------------------------------------------------------*/ + std::optional SHResourceManagerInterface::GetAssetID(Handle handle) + { + return SHResourceManager::GetAssetID(handle); + } + + std::optional SHResourceManagerInterface::GetAssetName(Handle handle) + { + return SHResourceManager::GetAssetName(handle); + } +} diff --git a/SHADE_Engine/src/Resource/SHResourceManagerInterface.h b/SHADE_Engine/src/Resource/SHResourceManagerInterface.h new file mode 100644 index 00000000..359bd7c8 --- /dev/null +++ b/SHADE_Engine/src/Resource/SHResourceManagerInterface.h @@ -0,0 +1,111 @@ +/************************************************************************************//*! +\file SHResourceManagerInterface.h +\author Tng Kah Wei, kahwei.tng, 390009620 +\par email: kahwei.tng\@digipen.edu +\date Nov 22, 2022 +\brief Contains the definition of the SHResourceManagerInterface static class. + +Copyright (C) 2022 DigiPen Institute of Technology. +Reproduction or disclosure of this file or its contents without the prior written consent +of DigiPen Institute of Technology is prohibited. +*//*************************************************************************************/ +#pragma once + +// STL Includes +#include +// Project Includes +#include "SH_API.h" +#include "Resource/SHHandle.h" +#include "Assets/SHAssetMacros.h" + +namespace SHADE +{ + /*-----------------------------------------------------------------------------------*/ + /* Forward Declarations */ + /*-----------------------------------------------------------------------------------*/ + class SHMesh; + class SHTexture; + class SHVkShaderModule; + struct SHMaterialSpec; + class SHMaterial; + class SHFont; + + /*-----------------------------------------------------------------------------------*/ + /* Type Definitions */ + /*-----------------------------------------------------------------------------------*/ + /// + /// Static class providing access to non-templated functions of SHResourceManager for + /// SHADE_Managed. + /// + class SH_API SHResourceManagerInterface + { + public: + /*---------------------------------------------------------------------------------*/ + /* Loading Functions */ + /*---------------------------------------------------------------------------------*/ + + /// + /// Wrapper for SHResourceManager::LoadOrGet(). + /// + /// Asset ID of the resource to load. + /// Handle to the resource to retrieve. + static Handle LoadOrGetMesh(AssetID assetId); + /// + /// Wrapper for SHResourceManager::LoadOrGet(). + /// + /// + /// Handle to the resource to retrieve. + static Handle LoadOrGetTexture(AssetID assetId); + /// + /// Wrapper for SHResourceManager::LoadOrGet(). + /// + /// Asset ID of the resource to load. + /// Handle to the resource to retrieve. + static Handle LoadOrGetShaderModule(AssetID assetId); + /// + /// Wrapper for SHResourceManager::LoadOrGet(). + /// + /// Asset ID of the resource to load. + /// Handle to the resource to retrieve. + static Handle LoadOrGetMaterialSpec (AssetID assetId); + /// + /// Wrapper for SHResourceManager::LoadOrGet(). + /// + /// Asset ID of the resource to load. + /// Handle to the resource to retrieve. + static Handle LoadOrGetMaterial(AssetID assetId); + /// + /// Wrapper for SHResourceManager::LoadOrGet(). + /// + /// Asset ID of the resource to load. + /// Handle to the resource to retrieve. + static Handle LoadOrGetFont(AssetID assetId); + + /*---------------------------------------------------------------------------------*/ + /* Query Functions */ + /*---------------------------------------------------------------------------------*/ + /// + /// Retrieves the AssetID associated with a specified Handle. + /// Compared to the templated version, this function is slower as it requires + /// searching through the storage of all resource types. + /// + /// Handle to get the AssetID of. + /// + /// AssetID for the specified Handle. If the Handle is invalid, there will be no + /// value. + /// + static std::optional GetAssetID(Handle handle); + /// + /// Retrieves the name associated with the AssetID that is associated with the + /// specified Handle. + /// Compared to the templated version, this function is slower as it requires + /// searching through the storage of all resource types. + /// + /// Handle to get the name of. + /// + /// Name for the specified Handle. If the Handle is invalid, there will be no + /// value. + /// + static std::optional GetAssetName(Handle handle); + }; +} \ No newline at end of file diff --git a/SHADE_Engine/src/Resource/SHResourceManagerWrapper.cpp b/SHADE_Engine/src/Resource/SHResourceManagerWrapper.cpp deleted file mode 100644 index f99e2dc6..00000000 --- a/SHADE_Engine/src/Resource/SHResourceManagerWrapper.cpp +++ /dev/null @@ -1,34 +0,0 @@ -/************************************************************************************//*! -\file SHResourceManagerWrapper.cpp -\author Tng Kah Wei, kahwei.tng, 390009620 -\par email: kahwei.tng\@digipen.edu -\date Nov 22, 2022 -\brief Contains the definition of the functions of the SHResourceManagerWraper - static class. - -Copyright (C) 2022 DigiPen Institute of Technology. -Reproduction or disclosure of this file or its contents without the prior written consent -of DigiPen Institute of Technology is prohibited. -*//*************************************************************************************/ -// Precompiled Header -#include "SHpch.h" -// Primary Include -#include "SHResourceManagerWrapper.h" -// Project Includes -#include "SHResourceManager.h" - -namespace SHADE -{ - /*-----------------------------------------------------------------------------------*/ - /* Query Functions */ - /*-----------------------------------------------------------------------------------*/ - std::optional SHResourceManagerWrapper::GetAssetID(Handle handle) - { - return SHResourceManager::GetAssetID(handle); - } - - std::optional SHResourceManagerWrapper::GetAssetName(Handle handle) - { - return SHResourceManager::GetAssetName(handle); - } -} diff --git a/SHADE_Engine/src/Resource/SHResourceManagerWrapper.h b/SHADE_Engine/src/Resource/SHResourceManagerWrapper.h deleted file mode 100644 index 9f34f74e..00000000 --- a/SHADE_Engine/src/Resource/SHResourceManagerWrapper.h +++ /dev/null @@ -1,57 +0,0 @@ -/************************************************************************************//*! -\file SHResourceManagerWrapper.h -\author Tng Kah Wei, kahwei.tng, 390009620 -\par email: kahwei.tng\@digipen.edu -\date Nov 22, 2022 -\brief Contains the definition of the SHResourceManagerWrapper static class. - -Copyright (C) 2022 DigiPen Institute of Technology. -Reproduction or disclosure of this file or its contents without the prior written consent -of DigiPen Institute of Technology is prohibited. -*//*************************************************************************************/ -#pragma once - -// STL Includes -#include -// Project Includes -#include "SH_API.h" -#include "Resource/SHHandle.h" -#include "Assets/SHAssetMacros.h" - -namespace SHADE -{ - /// - /// Static class providing access to non-templated functions of SHResourceManager for - /// SHADE_Managed. - /// - class SH_API SHResourceManagerWrapper - { - public: - /*---------------------------------------------------------------------------------*/ - /* Query Functions */ - /*---------------------------------------------------------------------------------*/ - /// - /// Retrieves the AssetID associated with a specified Handle. - /// Compared to the templated version, this function is slower as it requires - /// searching through the storage of all resource types. - /// - /// Handle to get the AssetID of. - /// - /// AssetID for the specified Handle. If the Handle is invalid, there will be no - /// value. - /// - static std::optional GetAssetID(Handle handle); - /// - /// Retrieves the name associated with the AssetID that is associated with the - /// specified Handle. - /// Compared to the templated version, this function is slower as it requires - /// searching through the storage of all resource types. - /// - /// Handle to get the name of. - /// - /// Name for the specified Handle. If the Handle is invalid, there will be no - /// value. - /// - static std::optional GetAssetName(Handle handle); - }; -} \ No newline at end of file diff --git a/SHADE_Managed/src/Assets/Font.cxx b/SHADE_Managed/src/Assets/FontAsset.cxx similarity index 79% rename from SHADE_Managed/src/Assets/Font.cxx rename to SHADE_Managed/src/Assets/FontAsset.cxx index b21c7a02..e49568fc 100644 --- a/SHADE_Managed/src/Assets/Font.cxx +++ b/SHADE_Managed/src/Assets/FontAsset.cxx @@ -14,7 +14,9 @@ of DigiPen Institute of Technology is prohibited. // Precompiled Headers #include "SHpch.h" // Primary Header -#include "Font.hxx" +#include "FontAsset.hxx" +// External Dependencies +#include "Resource/SHResourceManagerInterface.h" // Project Headers #include "Utility/Convert.hxx" @@ -23,20 +25,16 @@ namespace SHADE /*---------------------------------------------------------------------------------*/ /* Properties */ /*---------------------------------------------------------------------------------*/ - Handle Font::NativeObject::get() + Handle FontAsset::NativeObject::get() try { - return Handle(Convert::ToNative(asset.NativeObjectHandle)); + return SHResourceManagerInterface::LoadOrGetFont(asset.NativeAssetID); } catch (const BadHandleCastException&) { return Handle(); } - GenericHandle Font::NativeObjectHandle::get() - { - return asset.NativeObjectHandle; - } - AssetID Font::NativeAssetID::get() + AssetID FontAsset::NativeAssetID::get() { return asset.NativeAssetID; } @@ -44,14 +42,14 @@ namespace SHADE /*---------------------------------------------------------------------------------*/ /* Constructors/Destructor */ /*---------------------------------------------------------------------------------*/ - Font::Font(Handle font) - : asset { Handle(font) } + FontAsset::FontAsset(AssetID fontId) + : asset { fontId } {} /*---------------------------------------------------------------------------------*/ /* Operator Overloads */ /*---------------------------------------------------------------------------------*/ - Font::operator bool(Font asset) + FontAsset::operator bool(FontAsset asset) { return asset; } @@ -59,13 +57,13 @@ namespace SHADE /*---------------------------------------------------------------------------------*/ /* Conversion Operators */ /*---------------------------------------------------------------------------------*/ - Font::operator Asset(Font nativeAsset) + FontAsset::operator Asset(FontAsset nativeAsset) { return nativeAsset.asset; } - Font::operator Font(Asset asset) + FontAsset::operator FontAsset(Asset asset) { - return Font(Handle(Convert::ToNative(asset.NativeObjectHandle))); + return FontAsset(asset.NativeAssetID); } } diff --git a/SHADE_Managed/src/Assets/Font.hxx b/SHADE_Managed/src/Assets/FontAsset.hxx similarity index 86% rename from SHADE_Managed/src/Assets/Font.hxx rename to SHADE_Managed/src/Assets/FontAsset.hxx index 4acc49e6..89239224 100644 --- a/SHADE_Managed/src/Assets/Font.hxx +++ b/SHADE_Managed/src/Assets/FontAsset.hxx @@ -26,7 +26,7 @@ namespace SHADE /// Managed counterpart of the native Font object that can be fed to TextRenderables /// for rendering. /// - public value struct Font + public value struct FontAsset { internal: /*-----------------------------------------------------------------------------*/ @@ -40,13 +40,6 @@ namespace SHADE Handle get(); } /// - /// Generic handle for the native object - /// - property GenericHandle NativeObjectHandle - { - GenericHandle get(); - } - /// /// The raw asset ID of the asset. /// property AssetID NativeAssetID @@ -60,8 +53,8 @@ namespace SHADE /// /// Constructor for the Font. /// - /// Handle to the font object. - Font(Handle font); + /// AssetID to the font asset. + FontAsset(AssetID fontId); /*-----------------------------------------------------------------------------*/ /* Operator Overloads */ @@ -71,7 +64,7 @@ namespace SHADE /// /// Asset to check. /// True if the Asset is valid. - static operator bool(Font asset); + static operator bool(FontAsset asset); /*-----------------------------------------------------------------------------*/ /* Conversion Operators */ @@ -80,12 +73,12 @@ namespace SHADE /// Conversion operator to enable casting from a Font to an Asset. /// /// Vector3 to convert from. - static explicit operator Asset(Font nativeAsset); + static explicit operator Asset(FontAsset nativeAsset); /// /// Conversion operator to enable casting from a Asset to a Font. /// - /// Vector2 to convert from. - static explicit operator Font(Asset vec); + /// + static explicit operator FontAsset(Asset asset); protected: /*-----------------------------------------------------------------------------*/ diff --git a/SHADE_Managed/src/Assets/Mesh.cxx b/SHADE_Managed/src/Assets/MeshAsset.cxx similarity index 79% rename from SHADE_Managed/src/Assets/Mesh.cxx rename to SHADE_Managed/src/Assets/MeshAsset.cxx index bcfeac36..d24ad20d 100644 --- a/SHADE_Managed/src/Assets/Mesh.cxx +++ b/SHADE_Managed/src/Assets/MeshAsset.cxx @@ -14,7 +14,9 @@ of DigiPen Institute of Technology is prohibited. // Precompiled Headers #include "SHpch.h" // Primary Header -#include "Mesh.hxx" +#include "MeshAsset.hxx" +// External Dependencies +#include "Resource/SHResourceManagerInterface.h" // Project Headers #include "Utility/Convert.hxx" @@ -23,20 +25,16 @@ namespace SHADE /*---------------------------------------------------------------------------------*/ /* Properties */ /*---------------------------------------------------------------------------------*/ - Handle Mesh::NativeObject::get() + Handle MeshAsset::NativeObject::get() try { - return Handle(Convert::ToNative(asset.NativeObjectHandle)); + return SHResourceManagerInterface::LoadOrGetMesh(asset.NativeAssetID); } catch (const BadHandleCastException&) { return Handle(); } - GenericHandle Mesh::NativeObjectHandle::get() - { - return asset.NativeObjectHandle; - } - AssetID Mesh::NativeAssetID::get() + AssetID MeshAsset::NativeAssetID::get() { return asset.NativeAssetID; } @@ -44,14 +42,14 @@ namespace SHADE /*---------------------------------------------------------------------------------*/ /* Constructors/Destructor */ /*---------------------------------------------------------------------------------*/ - Mesh::Mesh(Handle Mesh) - : asset{ Handle(Mesh) } + MeshAsset::MeshAsset(AssetID meshId) + : asset{ meshId } {} /*---------------------------------------------------------------------------------*/ /* Operator Overloads */ /*---------------------------------------------------------------------------------*/ - Mesh::operator bool(Mesh asset) + MeshAsset::operator bool(MeshAsset asset) { return asset; } @@ -59,13 +57,13 @@ namespace SHADE /*---------------------------------------------------------------------------------*/ /* Conversion Operators */ /*---------------------------------------------------------------------------------*/ - Mesh::operator Asset(Mesh nativeAsset) + MeshAsset::operator Asset(MeshAsset nativeAsset) { return nativeAsset.asset; } - Mesh::operator Mesh(Asset asset) + MeshAsset::operator MeshAsset(Asset asset) { - return Mesh(Handle(Convert::ToNative(asset.NativeObjectHandle))); + return MeshAsset(asset.NativeAssetID); } } diff --git a/SHADE_Managed/src/Assets/Mesh.hxx b/SHADE_Managed/src/Assets/MeshAsset.hxx similarity index 86% rename from SHADE_Managed/src/Assets/Mesh.hxx rename to SHADE_Managed/src/Assets/MeshAsset.hxx index 7403ae83..26625c1a 100644 --- a/SHADE_Managed/src/Assets/Mesh.hxx +++ b/SHADE_Managed/src/Assets/MeshAsset.hxx @@ -26,7 +26,7 @@ namespace SHADE /// Managed counterpart of the native Mesh object containing vertex data that can /// be fed to Renderables for rendering. /// - public value struct Mesh + public value struct MeshAsset { internal: /*-----------------------------------------------------------------------------*/ @@ -40,13 +40,6 @@ namespace SHADE Handle get(); } /// - /// Generic handle for the native object - /// - property GenericHandle NativeObjectHandle - { - GenericHandle get(); - } - /// /// The raw asset ID of the asset. /// property AssetID NativeAssetID @@ -60,8 +53,8 @@ namespace SHADE /// /// Constructor for the Mesh. /// - /// Handle to the Mesh object. - Mesh(Handle Mesh); + /// AssetID to the Mesh asset. + MeshAsset(AssetID meshId); /*-----------------------------------------------------------------------------*/ /* Operator Overloads */ @@ -71,7 +64,7 @@ namespace SHADE /// /// Asset to check. /// True if the Asset is valid. - static operator bool(Mesh asset); + static operator bool(MeshAsset asset); /*-----------------------------------------------------------------------------*/ /* Conversion Operators */ @@ -80,12 +73,12 @@ namespace SHADE /// Conversion operator to enable casting from a Mesh to an Asset. /// /// Vector3 to convert from. - static explicit operator Asset(Mesh nativeAsset); + static explicit operator Asset(MeshAsset nativeAsset); /// /// Conversion operator to enable casting from a Asset to a Mesh. /// - /// Vector2 to convert from. - static explicit operator Mesh(Asset vec); + /// + static explicit operator MeshAsset(Asset asset); protected: /*-----------------------------------------------------------------------------*/ diff --git a/SHADE_Managed/src/Assets/NativeAsset.cxx b/SHADE_Managed/src/Assets/NativeAsset.cxx index 3f827fea..9480b02a 100644 --- a/SHADE_Managed/src/Assets/NativeAsset.cxx +++ b/SHADE_Managed/src/Assets/NativeAsset.cxx @@ -18,27 +18,22 @@ of DigiPen Institute of Technology is prohibited. // Project Includes #include "Engine/GenericHandle.hxx" #include "Utility/Convert.hxx" -#include "Resource/SHResourceManagerWrapper.h" namespace SHADE { /*---------------------------------------------------------------------------------*/ /* Properties */ /*---------------------------------------------------------------------------------*/ - GenericHandle Asset::NativeObjectHandle::get() - { - return nativeObjHandle; - } AssetID Asset::NativeAssetID::get() { - return SHResourceManagerWrapper::GetAssetID(Convert::ToNative(nativeObjHandle)).value_or(INVALID_ASSET_ID); + return assetId; } /*---------------------------------------------------------------------------------*/ /* Constructors */ /*---------------------------------------------------------------------------------*/ - Asset::Asset(Handle nativeHandle) - : nativeObjHandle { Convert::ToCLI(Handle(nativeHandle)) } + Asset::Asset(AssetID id) + : assetId { id } {} /*---------------------------------------------------------------------------------*/ @@ -46,6 +41,6 @@ namespace SHADE /*---------------------------------------------------------------------------------*/ Asset::operator bool(Asset asset) { - return asset.nativeObjHandle && asset.NativeAssetID != INVALID_ASSET_ID; + return asset.NativeAssetID != INVALID_ASSET_ID; } } \ No newline at end of file diff --git a/SHADE_Managed/src/Assets/NativeAsset.hxx b/SHADE_Managed/src/Assets/NativeAsset.hxx index 7ce9c6ed..40f7e628 100644 --- a/SHADE_Managed/src/Assets/NativeAsset.hxx +++ b/SHADE_Managed/src/Assets/NativeAsset.hxx @@ -31,13 +31,6 @@ namespace SHADE /* Properties */ /*-----------------------------------------------------------------------------*/ /// - /// Generic handle for the native object - /// - property GenericHandle NativeObjectHandle - { - GenericHandle get(); - } - /// /// The raw asset ID of the asset. /// property AssetID NativeAssetID @@ -51,8 +44,8 @@ namespace SHADE /// /// Constructor for the asset. /// - /// Native asset object handle. - Asset(Handle nativeHandle); + /// Native asset ID to construct this asset from. + explicit Asset(AssetID id); /*-----------------------------------------------------------------------------*/ /* Operator Overloads */ @@ -68,6 +61,6 @@ namespace SHADE /*-----------------------------------------------------------------------------*/ /* Data Members */ /*-----------------------------------------------------------------------------*/ - GenericHandle nativeObjHandle; + AssetID assetId; }; } diff --git a/SHADE_Managed/src/Components/Renderable.cxx b/SHADE_Managed/src/Components/Renderable.cxx index bc01bc03..b4efe26e 100644 --- a/SHADE_Managed/src/Components/Renderable.cxx +++ b/SHADE_Managed/src/Components/Renderable.cxx @@ -30,11 +30,11 @@ namespace SHADE /*---------------------------------------------------------------------------------*/ /* Properties */ /*---------------------------------------------------------------------------------*/ - SHADE::Mesh^ Renderable::Mesh::get() + SHADE::MeshAsset^ Renderable::Mesh::get() { - return gcnew SHADE::Mesh(GetNativeComponent()->GetMesh()); + return gcnew SHADE::MeshAsset(GetNativeComponent()->GetMesh()); } - void Renderable::Mesh::set(SHADE::Mesh^ value) + void Renderable::Mesh::set(SHADE::MeshAsset^ value) { if (value == nullptr) { diff --git a/SHADE_Managed/src/Components/Renderable.hxx b/SHADE_Managed/src/Components/Renderable.hxx index e8f11ef6..be7d107f 100644 --- a/SHADE_Managed/src/Components/Renderable.hxx +++ b/SHADE_Managed/src/Components/Renderable.hxx @@ -20,7 +20,7 @@ of DigiPen Institute of Technology is prohibited. #include "Math/Quaternion.hxx" // External Dependencies #include "Graphics/MiddleEnd/Interface/SHRenderable.h" -#include "Assets/Mesh.hxx" +#include "Assets/MeshAsset.hxx" #include "Assets/Material.hxx" namespace SHADE @@ -48,10 +48,10 @@ namespace SHADE /// /// Mesh used to render this Renderable. /// - property SHADE::Mesh^ Mesh + property SHADE::MeshAsset^ Mesh { - SHADE::Mesh^ get(); - void set(SHADE::Mesh^ value); + SHADE::MeshAsset^ get(); + void set(SHADE::MeshAsset^ value); } /// /// Material used to render this Renderable. diff --git a/SHADE_Managed/src/Components/TextRenderable.cxx b/SHADE_Managed/src/Components/TextRenderable.cxx index c5859854..e34592ae 100644 --- a/SHADE_Managed/src/Components/TextRenderable.cxx +++ b/SHADE_Managed/src/Components/TextRenderable.cxx @@ -39,11 +39,11 @@ namespace SHADE { GetNativeComponent()->SetText(Convert::ToNative(value)); } - SHADE::Font^ TextRenderable::Font::get() + SHADE::FontAsset^ TextRenderable::Font::get() { - return gcnew SHADE::Font(GetNativeComponent()->GetFont()); + return gcnew SHADE::FontAsset(GetNativeComponent()->GetFont()); } - void TextRenderable::Font::set(SHADE::Font^ value) + void TextRenderable::Font::set(SHADE::FontAsset^ value) { if (value == nullptr) { diff --git a/SHADE_Managed/src/Components/TextRenderable.hxx b/SHADE_Managed/src/Components/TextRenderable.hxx index 5418b6e5..bcd99bcf 100644 --- a/SHADE_Managed/src/Components/TextRenderable.hxx +++ b/SHADE_Managed/src/Components/TextRenderable.hxx @@ -20,7 +20,7 @@ of DigiPen Institute of Technology is prohibited. #include "Components/Component.hxx" #include "Math/Vector3.hxx" #include "Math/Quaternion.hxx" -#include "Assets/Font.hxx" +#include "Assets/FontAsset.hxx" namespace SHADE { @@ -55,10 +55,10 @@ namespace SHADE /// /// Font to use to render using this TextRenderable. /// - property SHADE::Font^ Font + property SHADE::FontAsset^ Font { - SHADE::Font^ get(); - void set(SHADE::Font^ value); + SHADE::FontAsset^ get(); + void set(SHADE::FontAsset^ value); } }; } -- 2.40.1 From 7d692061fbbf2e64930ea580c67193cbef60bcd5 Mon Sep 17 00:00:00 2001 From: Kah Wei Date: Tue, 22 Nov 2022 17:23:50 +0800 Subject: [PATCH 3/7] Reworked how Materials are handled on C# --- .../MiddleEnd/Interface/SHRenderable.cpp | 6 ++ .../MiddleEnd/Interface/SHRenderable.h | 1 + SHADE_Managed/src/Assets/MaterialAsset.cxx | 70 +++++++++++++++ SHADE_Managed/src/Assets/MaterialAsset.hxx | 89 +++++++++++++++++++ SHADE_Managed/src/Components/Renderable.cxx | 10 ++- SHADE_Managed/src/Components/Renderable.hxx | 13 ++- .../src/Components/TextRenderable.cxx | 2 +- .../src/{Assets => Graphics}/Material.cxx | 26 ++---- .../src/{Assets => Graphics}/Material.hxx | 18 +--- 9 files changed, 197 insertions(+), 38 deletions(-) create mode 100644 SHADE_Managed/src/Assets/MaterialAsset.cxx create mode 100644 SHADE_Managed/src/Assets/MaterialAsset.hxx rename SHADE_Managed/src/{Assets => Graphics}/Material.cxx (90%) rename SHADE_Managed/src/{Assets => Graphics}/Material.hxx (86%) diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHRenderable.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHRenderable.cpp index e22de5ab..c7578137 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHRenderable.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHRenderable.cpp @@ -76,6 +76,12 @@ namespace SHADE sharedMaterial = materialInstance; } + void SHRenderable::SetMaterial(Handle material) + { + SHGraphicsSystem* gfxSystem = SHSystemManager::GetSystem(); + SetMaterial(gfxSystem->AddOrGetBaseMaterialInstance(material)); + } + Handle SHRenderable::GetMaterial() const { if (material) diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHRenderable.h b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHRenderable.h index f1455ef4..39132ca0 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHRenderable.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHRenderable.h @@ -48,6 +48,7 @@ namespace SHADE /*-------------------------------------------------------------------------------*/ /* Material Functions */ /*-------------------------------------------------------------------------------*/ + void SetMaterial(Handle material); void SetMaterial(Handle materialInstance); Handle GetMaterial() const; Handle GetModifiableMaterial(); diff --git a/SHADE_Managed/src/Assets/MaterialAsset.cxx b/SHADE_Managed/src/Assets/MaterialAsset.cxx new file mode 100644 index 00000000..16f6a929 --- /dev/null +++ b/SHADE_Managed/src/Assets/MaterialAsset.cxx @@ -0,0 +1,70 @@ +/************************************************************************************//*! +\file MaterialAsset.cxx +\author Tng Kah Wei, kahwei.tng, 390009620 +\par email: kahwei.tng\@digipen.edu +\date Nov 22, 2022 +\brief Contains the implementation of the functions of the managed Material + struct. + + Note: This file is written in C++17/CLI. + +Copyright (C) 2022 DigiPen Institute of Technology. +Reproduction or disclosure of this file or its contents without the prior written consent +of DigiPen Institute of Technology is prohibited. +*//*************************************************************************************/ +// Precompiled Headers +#include "SHpch.h" +// Primary Header +#include "MaterialAsset.hxx" +// External Dependencies +#include "Resource/SHResourceManagerInterface.h" +// Project Headers +#include "Utility/Convert.hxx" + +namespace SHADE +{ + /*---------------------------------------------------------------------------------*/ + /* Properties */ + /*---------------------------------------------------------------------------------*/ + Handle MaterialAsset::NativeObject::get() + try + { + return SHResourceManagerInterface::LoadOrGetMaterial(asset.NativeAssetID); + } + catch (const BadHandleCastException&) + { + return Handle(); + } + AssetID MaterialAsset::NativeAssetID::get() + { + return asset.NativeAssetID; + } + + /*---------------------------------------------------------------------------------*/ + /* Constructors/Destructor */ + /*---------------------------------------------------------------------------------*/ + MaterialAsset::MaterialAsset(AssetID MaterialId) + : asset { MaterialId } + {} + + /*---------------------------------------------------------------------------------*/ + /* Operator Overloads */ + /*---------------------------------------------------------------------------------*/ + MaterialAsset::operator bool(MaterialAsset asset) + { + return asset; + } + + /*---------------------------------------------------------------------------------*/ + /* Conversion Operators */ + /*---------------------------------------------------------------------------------*/ + MaterialAsset::operator Asset(MaterialAsset nativeAsset) + { + return nativeAsset.asset; + } + + MaterialAsset::operator MaterialAsset(Asset asset) + { + return MaterialAsset(asset.NativeAssetID); + } +} diff --git a/SHADE_Managed/src/Assets/MaterialAsset.hxx b/SHADE_Managed/src/Assets/MaterialAsset.hxx new file mode 100644 index 00000000..5380b286 --- /dev/null +++ b/SHADE_Managed/src/Assets/MaterialAsset.hxx @@ -0,0 +1,89 @@ +/************************************************************************************//*! +\file MaterialAsset.hxx +\author Tng Kah Wei, kahwei.tng, 390009620 +\par email: kahwei.tng\@digipen.edu +\date Nov 22, 2022 +\brief Contains the definition of the managed MaterialAsset struct. + + Note: This file is written in C++17/CLI. + +Copyright (C) 2022 DigiPen Institute of Technology. +Reproduction or disclosure of this file or its contents without the prior written consent +of DigiPen Institute of Technology is prohibited. +*//*************************************************************************************/ +#pragma once + +// External Dependencies +#include "Resource/SHHandle.h" +#include "Graphics/MiddleEnd/Interface/SHMaterial.h" +// Project Includes +#include "NativeAsset.hxx" +#include "Engine/GenericHandle.hxx" + +namespace SHADE +{ + /// + /// Managed counterpart of the native Material object that can be fed to TextRenderables + /// for rendering. + /// + public value struct MaterialAsset + { + internal: + /*-----------------------------------------------------------------------------*/ + /* Properties */ + /*-----------------------------------------------------------------------------*/ + /// + /// Copy of the Handle to the native object. + /// + property Handle NativeObject + { + Handle get(); + } + /// + /// The raw asset ID of the asset. + /// + property AssetID NativeAssetID + { + AssetID get(); + } + + /*-----------------------------------------------------------------------------*/ + /* Constructors/Destructor */ + /*-----------------------------------------------------------------------------*/ + /// + /// Constructor for the Material. + /// + /// AssetID to the Material asset. + MaterialAsset(AssetID MaterialId); + + /*-----------------------------------------------------------------------------*/ + /* Operator Overloads */ + /*-----------------------------------------------------------------------------*/ + /// + /// Implicit conversion operator to enable checking if a Material is valid. + /// + /// Asset to check. + /// True if the Asset is valid. + static operator bool(MaterialAsset asset); + + /*-----------------------------------------------------------------------------*/ + /* Conversion Operators */ + /*-----------------------------------------------------------------------------*/ + /// + /// Conversion operator to enable casting from a Material to an Asset. + /// + /// Vector3 to convert from. + static explicit operator Asset(MaterialAsset nativeAsset); + /// + /// Conversion operator to enable casting from a Asset to a Material. + /// + /// + static explicit operator MaterialAsset(Asset asset); + + protected: + /*-----------------------------------------------------------------------------*/ + /* Data Members */ + /*-----------------------------------------------------------------------------*/ + Asset asset; + }; +} diff --git a/SHADE_Managed/src/Components/Renderable.cxx b/SHADE_Managed/src/Components/Renderable.cxx index b4efe26e..819760e6 100644 --- a/SHADE_Managed/src/Components/Renderable.cxx +++ b/SHADE_Managed/src/Components/Renderable.cxx @@ -42,7 +42,7 @@ namespace SHADE } else { - GetNativeComponent()->SetMesh(Handle(Convert::ToNative(value->NativeObjectHandle))); + GetNativeComponent()->SetMesh(value->NativeObject); } } SHADE::Material^ Renderable::Material::get() @@ -64,4 +64,12 @@ namespace SHADE { return GetNativeComponent()->GetLightLayer(); } + + /*---------------------------------------------------------------------------------*/ + /* Properties */ + /*---------------------------------------------------------------------------------*/ + void Renderable::SetMaterial(MaterialAsset materialAsset) + { + GetNativeComponent()->SetMaterial(materialAsset.NativeObject); + } } diff --git a/SHADE_Managed/src/Components/Renderable.hxx b/SHADE_Managed/src/Components/Renderable.hxx index be7d107f..d52a01e5 100644 --- a/SHADE_Managed/src/Components/Renderable.hxx +++ b/SHADE_Managed/src/Components/Renderable.hxx @@ -21,7 +21,8 @@ of DigiPen Institute of Technology is prohibited. // External Dependencies #include "Graphics/MiddleEnd/Interface/SHRenderable.h" #include "Assets/MeshAsset.hxx" -#include "Assets/Material.hxx" +#include "Graphics/Material.hxx" +#include "Assets/MaterialAsset.hxx" namespace SHADE { @@ -68,6 +69,16 @@ namespace SHADE { System::Byte get(); } + + /*-----------------------------------------------------------------------------*/ + /* Usage functions */ + /*-----------------------------------------------------------------------------*/ + /// + /// Sets the Material used by this Renderable to be an instance of the specified + /// base MaterialAsset. + /// + /// Material to set. + void SetMaterial(MaterialAsset materialAsset); }; } diff --git a/SHADE_Managed/src/Components/TextRenderable.cxx b/SHADE_Managed/src/Components/TextRenderable.cxx index e34592ae..88e43823 100644 --- a/SHADE_Managed/src/Components/TextRenderable.cxx +++ b/SHADE_Managed/src/Components/TextRenderable.cxx @@ -51,7 +51,7 @@ namespace SHADE } else { - GetNativeComponent()->SetFont(Handle(Convert::ToNative(value->NativeObjectHandle))); + GetNativeComponent()->SetFont(value->NativeObject); } } } diff --git a/SHADE_Managed/src/Assets/Material.cxx b/SHADE_Managed/src/Graphics/Material.cxx similarity index 90% rename from SHADE_Managed/src/Assets/Material.cxx rename to SHADE_Managed/src/Graphics/Material.cxx index 3caa5b22..e646b34d 100644 --- a/SHADE_Managed/src/Assets/Material.cxx +++ b/SHADE_Managed/src/Graphics/Material.cxx @@ -20,6 +20,7 @@ of DigiPen Institute of Technology is prohibited. #include // Project Includes #include "Utility/Convert.hxx" +#include "Resource/SHResourceManagerInterface.h" namespace SHADE { @@ -58,7 +59,7 @@ namespace SHADE Handle Material::NativeObject::get() try { - return Handle(Convert::ToNative(asset.NativeObjectHandle)); + return Handle(Convert::ToNative(matInstHandle)); } catch (const BadHandleCastException&) { @@ -66,18 +67,18 @@ namespace SHADE } GenericHandle Material::NativeObjectHandle::get() { - return asset.NativeObjectHandle; + return matInstHandle; } AssetID Material::NativeAssetID::get() { - return asset.NativeAssetID; + return SHResourceManagerInterface::GetAssetID(Convert::ToNative(matInstHandle)).value_or(INVALID_ASSET_ID); } /*---------------------------------------------------------------------------------*/ /* Constructors/Destructor */ /*---------------------------------------------------------------------------------*/ Material::Material(Handle material) - : asset { Handle(material) } + : matInstHandle{ Handle(material) } {} /*---------------------------------------------------------------------------------*/ @@ -136,21 +137,8 @@ namespace SHADE /*---------------------------------------------------------------------------------*/ /* Operator Overloads */ /*---------------------------------------------------------------------------------*/ - Material::operator bool(Material asset) + Material::operator bool(Material materialInstance) { - return asset; - } - - /*---------------------------------------------------------------------------------*/ - /* Conversion Operators */ - /*---------------------------------------------------------------------------------*/ - Material::operator Asset(Material nativeAsset) - { - return nativeAsset.asset; - } - - Material::operator Material(Asset asset) - { - return Material(Handle(Convert::ToNative(asset.NativeObjectHandle))); + return materialInstance; } } diff --git a/SHADE_Managed/src/Assets/Material.hxx b/SHADE_Managed/src/Graphics/Material.hxx similarity index 86% rename from SHADE_Managed/src/Assets/Material.hxx rename to SHADE_Managed/src/Graphics/Material.hxx index 14cf557e..12664658 100644 --- a/SHADE_Managed/src/Assets/Material.hxx +++ b/SHADE_Managed/src/Graphics/Material.hxx @@ -16,8 +16,8 @@ of DigiPen Institute of Technology is prohibited. // External Dependencies #include "Resource/SHHandle.h" #include "Graphics/MiddleEnd/Interface/SHMaterialInstance.h" +#include "Assets/SHAssetMacros.h" // Project Includes -#include "NativeAsset.hxx" #include "Engine/GenericHandle.hxx" namespace SHADE @@ -113,24 +113,10 @@ namespace SHADE /// True if the Asset is valid. static operator bool(Material asset); - /*-----------------------------------------------------------------------------*/ - /* Conversion Operators */ - /*-----------------------------------------------------------------------------*/ - /// - /// Conversion operator to enable casting from a Material to an Asset. - /// - /// Vector3 to convert from. - static explicit operator Asset(Material nativeAsset); - /// - /// Conversion operator to enable casting from a Asset to a Material. - /// - /// Vector2 to convert from. - static explicit operator Material(Asset vec); - protected: /*-----------------------------------------------------------------------------*/ /* Data Members */ /*-----------------------------------------------------------------------------*/ - Asset asset; + GenericHandle matInstHandle; }; } -- 2.40.1 From 4478b6db62d8dc309f949665e364e4b41b89dd3b Mon Sep 17 00:00:00 2001 From: Kah Wei Date: Tue, 22 Nov 2022 17:48:01 +0800 Subject: [PATCH 4/7] 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; } } -- 2.40.1 From 9a7bf335bb732743dd0cac0b568a2be8eefa0f01 Mon Sep 17 00:00:00 2001 From: Kah Wei Date: Tue, 22 Nov 2022 17:58:07 +0800 Subject: [PATCH 5/7] Added serialization and deserialization of MeshAsset, FontAsset and MaterialAsset --- .../Serialisation/SerialisationUtilities.cxx | 23 +++++++++++++--- .../Serialisation/SerialisationUtilities.h++ | 27 +++++++++++++++++++ 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/SHADE_Managed/src/Serialisation/SerialisationUtilities.cxx b/SHADE_Managed/src/Serialisation/SerialisationUtilities.cxx index cfa94540..8a36613c 100644 --- a/SHADE_Managed/src/Serialisation/SerialisationUtilities.cxx +++ b/SHADE_Managed/src/Serialisation/SerialisationUtilities.cxx @@ -18,6 +18,9 @@ of DigiPen Institute of Technology is prohibited. #include "Serialisation/SerialisationUtilities.hxx" // Project Includes #include "ReflectionUtilities.hxx" +#include "Assets/FontAsset.hxx" +#include "Assets/MaterialAsset.hxx" +#include "Assets/MeshAsset.hxx" /*-------------------------------------------------------------------------------------*/ /* File-Level Constants */ @@ -129,7 +132,10 @@ namespace SHADE fieldInsertYaml(fieldInfo, object, fieldNode) || fieldInsertYaml(fieldInfo, object, fieldNode) || fieldInsertYaml(fieldInfo, object, fieldNode) || - fieldInsertYaml(fieldInfo, object, fieldNode); + fieldInsertYaml(fieldInfo, object, fieldNode) || + fieldInsertYaml(fieldInfo, object, fieldNode) || + fieldInsertYaml(fieldInfo, object, fieldNode) || + fieldInsertYaml(fieldInfo, object, fieldNode); // Serialization of more complex types if (!PRIMITIVE_SERIALIZED) @@ -190,7 +196,10 @@ namespace SHADE varInsertYamlInternal(object, fieldNode) || varInsertYamlInternal(object, fieldNode) || varInsertYamlInternal(object, fieldNode) || - varInsertYamlInternal(object, fieldNode); + varInsertYamlInternal(object, fieldNode) || + varInsertYamlInternal(object, fieldNode) || + varInsertYamlInternal(object, fieldNode) || + varInsertYamlInternal(object, fieldNode); return INSERTED; } @@ -214,7 +223,10 @@ namespace SHADE fieldAssignYaml(fieldInfo, object, node) || fieldAssignYaml (fieldInfo, object, node) || fieldAssignYaml (fieldInfo, object, node) || - fieldAssignYaml (fieldInfo, object, node); + fieldAssignYaml (fieldInfo, object, node) || + fieldAssignYaml (fieldInfo, object, node) || + fieldAssignYaml (fieldInfo, object, node) || + fieldAssignYaml (fieldInfo, object, node); if (!ASSIGNED) { if (ReflectionUtilities::FieldIsList(fieldInfo)) @@ -277,7 +289,10 @@ namespace SHADE varAssignYamlInternal(object, node) || varAssignYamlInternal (object, node) || varAssignYamlInternal (object, node) || - varAssignYamlInternal (object, node); + varAssignYamlInternal (object, node) || + varAssignYamlInternal (object, node) || + varAssignYamlInternal (object, node) || + varAssignYamlInternal (object, node); return DESERIALISED; } } diff --git a/SHADE_Managed/src/Serialisation/SerialisationUtilities.h++ b/SHADE_Managed/src/Serialisation/SerialisationUtilities.h++ index 2c943452..04c87ef4 100644 --- a/SHADE_Managed/src/Serialisation/SerialisationUtilities.h++ +++ b/SHADE_Managed/src/Serialisation/SerialisationUtilities.h++ @@ -60,6 +60,12 @@ namespace SHADE { fieldNode = MAX_EID; } + else if constexpr (std::is_same_v || + std::is_same_v || + std::is_same_v) + { + fieldNode = INVALID_ASSET_ID; + } else { fieldNode = FieldType(); @@ -122,6 +128,17 @@ namespace SHADE return true; } } + else if constexpr (std::is_same_v || + std::is_same_v || + std::is_same_v) + { + if (object->GetType() == FieldType::typeid) + { + FieldType asset = safe_cast(object); + fieldNode = asset.NativeAssetID; + return true; + } + } else { if (object->GetType() == FieldType::typeid) @@ -229,6 +246,16 @@ namespace SHADE const uint32_t EID = node.as(); object = (EID == MAX_EID ? GameObject() : GameObject(EID)); } + else if constexpr (std::is_same_v || + std::is_same_v || + std::is_same_v) + { + if (object->GetType() == FieldType::typeid) + { + object = FieldType(node.as()); + return true; + } + } else { object = node.as(); -- 2.40.1 From 6afcaa92638624bdffc40a0a2097a7b798512e63 Mon Sep 17 00:00:00 2001 From: Kah Wei Date: Tue, 22 Nov 2022 18:09:50 +0800 Subject: [PATCH 6/7] Enabled state of scripts are now serialised --- SHADE_Managed/src/Scripts/Script.cxx | 8 +++++ SHADE_Managed/src/Scripts/Script.hxx | 9 ++++++ SHADE_Managed/src/Scripts/ScriptStore.cxx | 2 +- .../Serialisation/SerialisationUtilities.cxx | 30 +++++++++++++++++-- 4 files changed, 46 insertions(+), 3 deletions(-) diff --git a/SHADE_Managed/src/Scripts/Script.cxx b/SHADE_Managed/src/Scripts/Script.cxx index 2ee7dbf7..294f4096 100644 --- a/SHADE_Managed/src/Scripts/Script.cxx +++ b/SHADE_Managed/src/Scripts/Script.cxx @@ -258,6 +258,14 @@ namespace SHADE Script::Script() : OnGizmosDrawOverriden { false } {} + + /*---------------------------------------------------------------------------------*/ + /* Manipulation Functions */ + /*---------------------------------------------------------------------------------*/ + void Script::SetEnabledWithoutEvents(bool enable) + { + enabled = enable; + } /*---------------------------------------------------------------------------------*/ /* Virtual "All-Time" Lifecycle Functions */ diff --git a/SHADE_Managed/src/Scripts/Script.hxx b/SHADE_Managed/src/Scripts/Script.hxx index 62c5015c..8fc36544 100644 --- a/SHADE_Managed/src/Scripts/Script.hxx +++ b/SHADE_Managed/src/Scripts/Script.hxx @@ -326,6 +326,15 @@ namespace SHADE /// Information on the collision event. void OnTriggerExit(CollisionInfo collision); + /*-----------------------------------------------------------------------------*/ + /* Manipulation Functions */ + /*-----------------------------------------------------------------------------*/ + /// + /// Function to set the enabled state of this script without triggering events. + /// + /// Whether to enable or disable the script. + void SetEnabledWithoutEvents(bool enable); + protected: /*-----------------------------------------------------------------------------*/ /* Constructors */ diff --git a/SHADE_Managed/src/Scripts/ScriptStore.cxx b/SHADE_Managed/src/Scripts/ScriptStore.cxx index 96eb7361..d3d989cc 100644 --- a/SHADE_Managed/src/Scripts/ScriptStore.cxx +++ b/SHADE_Managed/src/Scripts/ScriptStore.cxx @@ -744,7 +744,7 @@ namespace SHADE for (YAML::Node& node : *yamlNode) { // Get the name of the script - if (!node["Type"]) + if (!node["Type"].IsDefined()) { Debug::LogWarning("[ScriptStore] Script with no type detected, skipping."); continue; diff --git a/SHADE_Managed/src/Serialisation/SerialisationUtilities.cxx b/SHADE_Managed/src/Serialisation/SerialisationUtilities.cxx index 8a36613c..2bf05bc5 100644 --- a/SHADE_Managed/src/Serialisation/SerialisationUtilities.cxx +++ b/SHADE_Managed/src/Serialisation/SerialisationUtilities.cxx @@ -21,11 +21,13 @@ of DigiPen Institute of Technology is prohibited. #include "Assets/FontAsset.hxx" #include "Assets/MaterialAsset.hxx" #include "Assets/MeshAsset.hxx" +#include "Scripts/Script.hxx" /*-------------------------------------------------------------------------------------*/ /* File-Level Constants */ /*-------------------------------------------------------------------------------------*/ static const std::string_view SCRIPT_TYPE_YAMLTAG = "Type"; +static const std::string_view SCRIPT_ENABLED_YAMLTAG = "Enabled"; /*-------------------------------------------------------------------------------------*/ /* Function Definitions */ @@ -39,10 +41,19 @@ namespace SHADE { using namespace System::Reflection; + // Obtain script + Script^ script = safe_cast(object); + if (script == nullptr) + { + Debug::LogWarning("[SerialisationUtilities] Attempted to serialise an object that is not a script!"); + return; + } + // Create YAML object YAML::Node scriptNode; scriptNode.SetStyle(YAML::EmitterStyle::Block); scriptNode[SCRIPT_TYPE_YAMLTAG.data()] = Convert::ToNative(object->GetType()->FullName); + scriptNode[SCRIPT_ENABLED_YAMLTAG.data()] = script->Enabled; // Get all fields System::Collections::Generic::IEnumerable^ fields = ReflectionUtilities::GetInstanceFields(object); @@ -72,7 +83,7 @@ namespace SHADE { using namespace System::Reflection; - // Load the YAML + // Error Checking if (!yamlNode.IsMap()) { // Invalid @@ -83,6 +94,21 @@ namespace SHADE ); return; } + + // Get the script + Script^ script = safe_cast(object); + if (script == nullptr) + { + Debug::LogWarning("[SerialisationUtilities] Attempted to deserialise an object that is not a script!"); + return; + } + + // Set enabled state + if (yamlNode[SCRIPT_ENABLED_YAMLTAG.data()].IsDefined()) + { + script->SetEnabledWithoutEvents(yamlNode[SCRIPT_ENABLED_YAMLTAG.data()].as()); + } + // Get all fields System::Collections::Generic::IEnumerable^ fields = ReflectionUtilities::GetInstanceFields(object); for each (FieldInfo^ field in fields) @@ -95,7 +121,7 @@ namespace SHADE // Deserialise const std::string FIELD_NAME = Convert::ToNative(field->Name); - if (yamlNode[FIELD_NAME]) + if (yamlNode[FIELD_NAME].IsDefined()) { writeYamlIntoField(field, object, yamlNode[FIELD_NAME]); } -- 2.40.1 From 9964d5dfce3c17199bf2cf62df0c85499ebcff3b Mon Sep 17 00:00:00 2001 From: Kah Wei Date: Tue, 22 Nov 2022 18:17:24 +0800 Subject: [PATCH 7/7] Fixed missing comments for SHEditorUI --- SHADE_Engine/src/Editor/SHEditorUI.cpp | 2 +- SHADE_Engine/src/Editor/SHEditorUI.h | 15 ++++++--------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/SHADE_Engine/src/Editor/SHEditorUI.cpp b/SHADE_Engine/src/Editor/SHEditorUI.cpp index caa6e5a2..b9783020 100644 --- a/SHADE_Engine/src/Editor/SHEditorUI.cpp +++ b/SHADE_Engine/src/Editor/SHEditorUI.cpp @@ -353,7 +353,7 @@ namespace SHADE return changed; } - bool SHEditorUI::InputAssetField(const std::string& label, AssetID& value, AssetType type, bool* isHovered, bool alwaysNull) + bool SHEditorUI::InputAssetField(const std::string& label, AssetID& value, AssetType type, bool* isHovered) { // Label if (!label.empty()) diff --git a/SHADE_Engine/src/Editor/SHEditorUI.h b/SHADE_Engine/src/Editor/SHEditorUI.h index ce26b39e..cd87f46b 100644 --- a/SHADE_Engine/src/Editor/SHEditorUI.h +++ b/SHADE_Engine/src/Editor/SHEditorUI.h @@ -299,7 +299,7 @@ namespace SHADE /// True if the value was changed. static bool InputTextField(const std::string& label, std::string& value, bool* isHovered = nullptr); /// - /// Creates a drag field widget for int input. + /// Creates a drag field widget for GameObject input. /// /// Label used to identify this widget. /// Reference to the variable to store the result. @@ -311,15 +311,12 @@ namespace SHADE /// True if the value was changed. static bool InputGameObjectField(const std::string& label, uint32_t& value, bool* isHovered = nullptr, bool alwaysNull = false); /// - /// + /// Creates a drag field widget for Asset input. /// - /// - /// - /// - /// - /// - /// - static bool InputAssetField(const std::string& label, AssetID& value, AssetType type, bool* isHovered = nullptr, bool alwaysNull = false); + /// Label used to identify this widget. + /// Reference to the variable to store the result. + ///