diff --git a/Assets/Application.SHConfig b/Assets/Application.SHConfig index 3f7a4ac0..c9b34a7a 100644 --- a/Assets/Application.SHConfig +++ b/Assets/Application.SHConfig @@ -1,4 +1,4 @@ Start in Fullscreen: false -Starting Scene ID: 94283040 +Starting Scene ID: 94246101 Window Size: {x: 1920, y: 1080} Window Title: SHADE Engine \ No newline at end of file diff --git a/Assets/Scenes/M2Scene.shade b/Assets/Scenes/M2Scene.shade index 8b61dc67..ff5e5fd6 100644 --- a/Assets/Scenes/M2Scene.shade +++ b/Assets/Scenes/M2Scene.shade @@ -4,7 +4,7 @@ NumberOfChildren: 0 Components: Camera Component: - Position: {x: 0, y: 0, z: 8} + Position: {x: 0, y: 3, z: 8} Pitch: 0 Yaw: 0 Roll: 0 @@ -13,6 +13,7 @@ Near: 0.00999999978 Far: 10000 Perspective: true + IsActive: true Light Component: Position: {x: 0, y: 0, z: 0} Type: Directional @@ -20,6 +21,7 @@ Color: {x: 0.951541841, y: 0.921719015, z: 0.553319454, w: 1} Layer: 4294967295 Strength: 0 + IsActive: true Scripts: ~ - EID: 7 Name: BigBoi @@ -30,9 +32,11 @@ Translate: {x: 0, y: -16.8647861, z: -14.039052} Rotate: {x: -0, y: 0, z: -0} Scale: {x: 28.1434975, y: 28.1434975, z: 28.1434975} + IsActive: true Renderable Component: Mesh: 149697411 Material: 126974645 + IsActive: true Scripts: ~ - EID: 8 Name: AmbientLight @@ -46,4 +50,335 @@ Color: {x: 1, y: 1, z: 1, w: 1} Layer: 4294967295 Strength: 0.25 + IsActive: true + Scripts: ~ +- EID: 65542 + Name: Default + IsActive: true + NumberOfChildren: 0 + Components: + Transform Component: + Translate: {x: 2.5, y: 0.5, z: -2.5} + Rotate: {x: 0, y: 0, z: 0} + Scale: {x: 5, y: 0.5, z: 5} + IsActive: true + Collider Component: + Colliders: + - Is Trigger: false + Type: Box + Half Extents: {x: 1, y: 1, z: 1} + Friction: 0.400000006 + Bounciness: 0 + Density: 1 + Position Offset: {x: 0, y: 0, z: 0} + Rotation Offset: {x: 0, y: 0, z: 0} + IsActive: true + Scripts: ~ +- EID: 65538 + Name: Movable + IsActive: true + NumberOfChildren: 0 + Components: + Transform Component: + Translate: {x: 0, y: 4.28833103, z: 0} + Rotate: {x: -0, y: 0, z: -0} + Scale: {x: 1, y: 1, z: 1} + IsActive: true + RigidBody Component: + Type: Dynamic + Drag: 0.00999999978 + Angular Drag: 0.00999999978 + Use Gravity: true + Interpolate: true + Sleeping Enabled: true + Freeze Position X: false + Freeze Position Y: false + Freeze Position Z: false + Freeze Rotation X: false + Freeze Rotation Y: false + Freeze Rotation Z: false + IsActive: true + Collider Component: + Colliders: + - Is Trigger: false + Type: Box + Half Extents: {x: 1, y: 1, z: 1} + Friction: 0.400000006 + Bounciness: 0 + Density: 1 + Position Offset: {x: 0, y: 0, z: 0} + Rotation Offset: {x: 0, y: 0, z: 0} + - Is Trigger: false + Type: Box + Half Extents: {x: 2, y: 2, z: 2} + Friction: 0.400000006 + Bounciness: 0 + Density: 1 + Position Offset: {x: 0, y: 0, z: 0} + Rotation Offset: {x: 0, y: 0, z: 0} + IsActive: true + Scripts: ~ +- EID: 65537 + Name: Default + IsActive: true + NumberOfChildren: 0 + Components: + Transform Component: + Translate: {x: 5.25, y: 2.75, z: 2.5} + Rotate: {x: 0, y: 0, z: 1.57079637} + Scale: {x: 5, y: 0.5, z: 5} + IsActive: true + Collider Component: + Colliders: + - Is Trigger: false + Type: Box + Half Extents: {x: 1, y: 1, z: 1} + Friction: 0.400000006 + Bounciness: 0 + Density: 1 + Position Offset: {x: 0, y: 0, z: 0} + Rotation Offset: {x: 0, y: 0, z: 0} + IsActive: true + Scripts: ~ +- EID: 9 + Name: Default + IsActive: true + NumberOfChildren: 0 + Components: + Transform Component: + Translate: {x: 5.25, y: 2.75, z: -2.5} + Rotate: {x: 0, y: 0, z: 1.57079637} + Scale: {x: 5, y: 0.5, z: 5} + IsActive: true + Collider Component: + Colliders: + - Is Trigger: false + Type: Box + Half Extents: {x: 1, y: 1, z: 1} + Friction: 0.400000006 + Bounciness: 0 + Density: 1 + Position Offset: {x: 0, y: 0, z: 0} + Rotation Offset: {x: 0, y: 0, z: 0} + IsActive: true + Scripts: ~ +- EID: 10 + Name: Default + IsActive: true + NumberOfChildren: 0 + Components: + Transform Component: + Translate: {x: -5.25, y: 2.75, z: 2.5} + Rotate: {x: 0, y: 0, z: 1.57079637} + Scale: {x: 5, y: 0.5, z: 5} + IsActive: true + Collider Component: + Colliders: + - Is Trigger: false + Type: Box + Half Extents: {x: 1, y: 1, z: 1} + Friction: 0.400000006 + Bounciness: 0 + Density: 1 + Position Offset: {x: 0, y: 0, z: 0} + Rotation Offset: {x: 0, y: 0, z: 0} + IsActive: true + Scripts: ~ +- EID: 11 + Name: Default + IsActive: true + NumberOfChildren: 0 + Components: + Transform Component: + Translate: {x: -5.25, y: 2.75, z: -2.5} + Rotate: {x: 0, y: 0, z: 1.57079637} + Scale: {x: 5, y: 0.5, z: 5} + IsActive: true + Collider Component: + Colliders: + - Is Trigger: false + Type: Box + Half Extents: {x: 1, y: 1, z: 1} + Friction: 0.400000006 + Bounciness: 0 + Density: 1 + Position Offset: {x: 0, y: 0, z: 0} + Rotation Offset: {x: 0, y: 0, z: 0} + IsActive: true + Scripts: ~ +- EID: 12 + Name: Default + IsActive: true + NumberOfChildren: 0 + Components: + Transform Component: + Translate: {x: 2.5, y: 2.75, z: 5.25} + Rotate: {x: 7.15255737e-07, y: 1.57079566, z: 1.57079589} + Scale: {x: 4.99999809, y: 0.499999762, z: 4.99999809} + IsActive: true + Collider Component: + Colliders: + - Is Trigger: false + Type: Box + Half Extents: {x: 1, y: 1, z: 1} + Friction: 0.400000006 + Bounciness: 0 + Density: 1 + Position Offset: {x: 0, y: 0, z: 0} + Rotation Offset: {x: 0, y: 0, z: 0} + IsActive: true + Scripts: ~ +- EID: 65551 + Name: Default + IsActive: true + NumberOfChildren: 0 + Components: + Transform Component: + Translate: {x: -2.5, y: 2.75, z: 5.25} + Rotate: {x: 7.15255737e-07, y: 1.57079566, z: 1.57079589} + Scale: {x: 4.99999809, y: 0.499999762, z: 4.99999809} + IsActive: true + Collider Component: + Colliders: + - Is Trigger: false + Type: Box + Half Extents: {x: 1, y: 1, z: 1} + Friction: 0.400000006 + Bounciness: 0 + Density: 1 + Position Offset: {x: 0, y: 0, z: 0} + Rotation Offset: {x: 0, y: 0, z: 0} + IsActive: true + Scripts: ~ +- EID: 65550 + Name: Default + IsActive: true + NumberOfChildren: 0 + Components: + Transform Component: + Translate: {x: -2.5, y: 2.75, z: -5.25} + Rotate: {x: 7.15255737e-07, y: 1.57079566, z: 1.57079589} + Scale: {x: 4.99999809, y: 0.499999762, z: 4.99999809} + IsActive: true + Collider Component: + Colliders: + - Is Trigger: false + Type: Box + Half Extents: {x: 1, y: 1, z: 1} + Friction: 0.400000006 + Bounciness: 0 + Density: 1 + Position Offset: {x: 0, y: 0, z: 0} + Rotation Offset: {x: 0, y: 0, z: 0} + IsActive: true + Scripts: ~ +- EID: 65549 + Name: Default + IsActive: true + NumberOfChildren: 0 + Components: + Transform Component: + Translate: {x: 2.5, y: 2.75, z: -5.25} + Rotate: {x: 7.15255737e-07, y: 1.57079566, z: 1.57079589} + Scale: {x: 4.99999809, y: 0.499999762, z: 4.99999809} + IsActive: true + Collider Component: + Colliders: + - Is Trigger: false + Type: Box + Half Extents: {x: 1, y: 1, z: 1} + Friction: 0.400000006 + Bounciness: 0 + Density: 1 + Position Offset: {x: 0, y: 0, z: 0} + Rotation Offset: {x: 0, y: 0, z: 0} + IsActive: true + Scripts: ~ +- EID: 16 + Name: Default + IsActive: true + NumberOfChildren: 0 + Components: + Transform Component: + Translate: {x: 0, y: 2.5, z: 0} + Rotate: {x: 0, y: 0, z: 0} + Scale: {x: 2.5, y: 0.5, z: 2.5} + IsActive: true + Collider Component: + Colliders: + - Is Trigger: false + Type: Box + Half Extents: {x: 1, y: 1, z: 1} + Friction: 0.400000006 + Bounciness: 0 + Density: 1 + Position Offset: {x: 0, y: 0, z: 0} + Rotation Offset: {x: 0, y: 0, z: 0} + IsActive: true + Scripts: ~ +- EID: 5 + Name: Default + IsActive: true + NumberOfChildren: 0 + Components: + Transform Component: + Translate: {x: 2.5, y: 0.5, z: 2.5} + Rotate: {x: 0, y: 0, z: 0} + Scale: {x: 5, y: 0.5, z: 5} + IsActive: true + Collider Component: + Colliders: + - Is Trigger: false + Type: Box + Half Extents: {x: 1, y: 1, z: 1} + Friction: 0.400000006 + Bounciness: 0 + Density: 1 + Position Offset: {x: 0, y: 0, z: 0} + Rotation Offset: {x: 0, y: 0, z: 0} + IsActive: true + Scripts: ~ +- EID: 4 + Name: Default + IsActive: true + NumberOfChildren: 0 + Components: + Transform Component: + Translate: {x: -2.5, y: 0.5, z: -2.5} + Rotate: {x: 0, y: 0, z: 0} + Scale: {x: 5, y: 0.5, z: 5} + IsActive: true + Collider Component: + Colliders: + - Is Trigger: false + Type: Box + Half Extents: {x: 1, y: 1, z: 1} + Friction: 0.400000006 + Bounciness: 0 + Density: 1 + Position Offset: {x: 0, y: 0, z: 0} + Rotation Offset: {x: 0, y: 0, z: 0} + IsActive: true + Scripts: ~ +- EID: 3 + Name: Default + IsActive: true + NumberOfChildren: 0 + Components: + Transform Component: + Translate: {x: -2.5, y: 0.5, z: 2.5} + Rotate: {x: 0, y: 0, z: 0} + Scale: {x: 5, y: 0.5, z: 5} + IsActive: true + Collider Component: + Colliders: + - Is Trigger: false + Type: Box + Half Extents: {x: 1, y: 1, z: 1} + Friction: 0.400000006 + Bounciness: 0 + Density: 1 + Position Offset: {x: 0, y: 0, z: 0} + Rotation Offset: {x: 0, y: 0, z: 0} + IsActive: true Scripts: ~ \ No newline at end of file diff --git a/Assets/Scenes/UI Test.shade b/Assets/Scenes/UI Test.shade new file mode 100644 index 00000000..e8ee4df2 --- /dev/null +++ b/Assets/Scenes/UI Test.shade @@ -0,0 +1,84 @@ +- EID: 0 + Name: Canvas + IsActive: true + NumberOfChildren: 1 + Components: + Canvas Component: + Canvas Width: 10 + Canvas Height: 10 + IsActive: true + Scripts: ~ +- EID: 6 + Name: Default + IsActive: true + NumberOfChildren: 0 + Components: + Transform Component: + Translate: {x: 0, y: 0, z: 0} + Rotate: {x: 0, y: 0, z: 0} + Scale: {x: 1, y: 1, z: 1} + IsActive: true + Renderable Component: + Mesh: 141771688 + Material: 129340704 + IsActive: true + Button Component: + Default Texture: 0 + Hovered Texture: 0 + Clicked Texture: 0 + IsActive: true + Scripts: ~ +- EID: 1 + Name: Camera + IsActive: true + NumberOfChildren: 0 + Components: + Camera Component: + Position: {x: 0, y: 3, z: 8} + Pitch: 0 + Yaw: 0 + Roll: 0 + Width: 1920 + Height: 1080 + Near: 0.00999999978 + Far: 10000 + Perspective: true + IsActive: true + Light Component: + Position: {x: 0, y: 0, z: 0} + Type: Directional + Direction: {x: 1.79999995, y: 0, z: 1} + Color: {x: 0.951541841, y: 0.921719015, z: 0.553319454, w: 1} + Layer: 4294967295 + Strength: 0 + IsActive: true + Scripts: ~ +- EID: 7 + Name: BigBoi + IsActive: true + NumberOfChildren: 0 + Components: + Transform Component: + Translate: {x: 0, y: -16.8647861, z: -14.039052} + Rotate: {x: -0, y: 0, z: -0} + Scale: {x: 28.1434975, y: 28.1434975, z: 28.1434975} + IsActive: true + Renderable Component: + Mesh: 149697411 + Material: 126974645 + IsActive: true + Scripts: ~ +- EID: 8 + Name: AmbientLight + IsActive: true + NumberOfChildren: 0 + Components: + Light Component: + Position: {x: 0, y: 0, z: 0} + Type: Ambient + Direction: {x: 0, y: 0, z: 1} + Color: {x: 1, y: 1, z: 1, w: 1} + Layer: 4294967295 + Strength: 0.25 + IsActive: true + Scripts: ~ \ No newline at end of file diff --git a/Assets/Scenes/UI Test.shade.shmeta b/Assets/Scenes/UI Test.shade.shmeta new file mode 100644 index 00000000..cf38916e --- /dev/null +++ b/Assets/Scenes/UI Test.shade.shmeta @@ -0,0 +1,3 @@ +Name: UI Test +ID: 87707373 +Type: 5 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_Application/src/Application/SBApplication.cpp b/SHADE_Application/src/Application/SBApplication.cpp index 1a00941f..06c42d2d 100644 --- a/SHADE_Application/src/Application/SBApplication.cpp +++ b/SHADE_Application/src/Application/SBApplication.cpp @@ -126,7 +126,9 @@ namespace Sandbox //SHSystemManager::RegisterRoutine(); SHSystemManager::RegisterRoutine(); + SHSystemManager::RegisterRoutine(); SHSystemManager::RegisterRoutine(); + SHSystemManager::RegisterRoutine(); SHSystemManager::RegisterRoutine(); #ifdef SHEDITOR diff --git a/SHADE_Application/src/Scenes/SBMainScene.cpp b/SHADE_Application/src/Scenes/SBMainScene.cpp index e9611fd8..521dd275 100644 --- a/SHADE_Application/src/Scenes/SBMainScene.cpp +++ b/SHADE_Application/src/Scenes/SBMainScene.cpp @@ -44,6 +44,8 @@ namespace Sandbox { sceneName = SHSerialization::DeserializeSceneFromFile(sceneAssetID); + #ifndef SHEDITOR + auto* physicsSystem = SHSystemManager::GetSystem(); if (!physicsSystem) { @@ -53,6 +55,8 @@ namespace Sandbox physicsSystem->BuildScene(SHSceneManager::GetCurrentSceneGraph()); + #endif + /*-----------------------------------------------------------------------*/ /* TESTING CODE */ /*-----------------------------------------------------------------------*/ diff --git a/SHADE_CSharp/premake5.lua b/SHADE_CSharp/premake5.lua index 8844b84c..f735b515 100644 --- a/SHADE_CSharp/premake5.lua +++ b/SHADE_CSharp/premake5.lua @@ -53,15 +53,16 @@ project "SHADE_CSharp" function configElementCS(cfg) _p(2,'Debug;Release;Publish') end - function docsElementCS(cfg) - _p(2,'true') - end - function docsLocationElementCS(cfg) - _p(2,'$(OutDir)') - end + -- function docsElementCS(cfg) + -- _p(2,'true') + -- end + -- function docsLocationElementCS(cfg) + -- _p(2,'$(OutDir)') + -- end premake.override(premake.vstudio.cs2005.elements, "projectProperties", function (oldfn, cfg) return table.join(oldfn(cfg), { - platformsElementCS, configElementCS, docsElementCS, docsLocationElementCS, +-- platformsElementCS, configElementCS, docsElementCS, docsLocationElementCS, + platformsElementCS, configElementCS, }) end) \ No newline at end of file diff --git a/SHADE_Engine/src/Assets/Libraries/Loaders/SHModelLoader.cpp b/SHADE_Engine/src/Assets/Libraries/Loaders/SHModelLoader.cpp index 74aa5350..3978c02f 100644 --- a/SHADE_Engine/src/Assets/Libraries/Loaders/SHModelLoader.cpp +++ b/SHADE_Engine/src/Assets/Libraries/Loaders/SHModelLoader.cpp @@ -52,7 +52,7 @@ namespace SHADE std::ifstream file{ path.string(), std::ios::in | std::ios::binary }; if (!file.is_open()) { - SHLOG_ERROR("Unable to open SHMesh File: {}", path.string()); + SHLOG_ERROR("[Model Loader] Unable to open SHModel File: {}", path.string()); return; } diff --git a/SHADE_Engine/src/Assets/Libraries/Loaders/SHTextBasedLoader.cpp b/SHADE_Engine/src/Assets/Libraries/Loaders/SHTextBasedLoader.cpp index b23130f3..4858e639 100644 --- a/SHADE_Engine/src/Assets/Libraries/Loaders/SHTextBasedLoader.cpp +++ b/SHADE_Engine/src/Assets/Libraries/Loaders/SHTextBasedLoader.cpp @@ -26,7 +26,7 @@ namespace SHADE if (!file.is_open()) { - SHLOG_ERROR("Unable to open text File: {}", path.string()); + SHLOG_ERROR("[Text Loader] Unable to open text File: {}", path.string()); return nullptr; } std::stringstream stream; @@ -70,7 +70,7 @@ namespace SHADE if (!file.is_open()) { - SHLOG_ERROR("Unable to open text File: {}", path.string()); + SHLOG_ERROR("[Text Loader] Unable to open text File: {}", path.string()); return; } diff --git a/SHADE_Engine/src/Assets/Libraries/Loaders/SHTextureLoader.cpp b/SHADE_Engine/src/Assets/Libraries/Loaders/SHTextureLoader.cpp index 423301dd..96dabf18 100644 --- a/SHADE_Engine/src/Assets/Libraries/Loaders/SHTextureLoader.cpp +++ b/SHADE_Engine/src/Assets/Libraries/Loaders/SHTextureLoader.cpp @@ -22,7 +22,7 @@ namespace SHADE std::ifstream file{ path.string(), std::ios::in | std::ios::binary }; if (!file.is_open()) { - SHLOG_ERROR("Error opening SHTexture file: {}", path.string()); + SHLOG_ERROR("[Texture Loader] Error opening SHTexture file: {}", path.string()); } auto const intBytes{ sizeof(uint32_t) }; @@ -61,7 +61,7 @@ namespace SHADE std::ofstream file{ path, std::ios::out | std::ios::binary }; if (!file.is_open()) { - SHLOG_ERROR("Unable to open file for writing texture file: {}", path.string()); + SHLOG_ERROR("[Texture Loader] Unable to open file for writing texture file: {}", path.string()); } auto asset = *dynamic_cast(data); diff --git a/SHADE_Engine/src/Assets/SHAssetManager.cpp b/SHADE_Engine/src/Assets/SHAssetManager.cpp index 5d8a0f13..2aaf226b 100644 --- a/SHADE_Engine/src/Assets/SHAssetManager.cpp +++ b/SHADE_Engine/src/Assets/SHAssetManager.cpp @@ -220,7 +220,7 @@ namespace SHADE break; default: - SHLOG_ERROR("Asset type of {} not an internal asset type, cannot be created", name); + SHLOG_ERROR("[Asset Manager] Asset type of {} not an internal asset type, cannot be created", name); return 0; } @@ -272,14 +272,14 @@ namespace SHADE return true; } - SHLOG_ERROR("Asset data has not been written into, cannot be saved: {}", + SHLOG_ERROR("[Asset Manager] Asset data has not been written into, cannot be saved: {}", asset.path.filename().string()); return false; } } - SHLOG_WARNING("Asset id: {} not an internal asset type, save cannot be triggered", id); + SHLOG_WARNING("[Asset Manager] Asset id: {} not an internal asset type, save cannot be triggered", id); return false; } @@ -297,10 +297,10 @@ namespace SHADE { return (DeleteLocalFile(asset.path) && DeleteLocalFile(asset.path.string() + META_EXTENSION.data())); } - SHLOG_WARNING("Asset id: {} not an internal asset type, file deletion not allowed", id); + SHLOG_WARNING("[Asset Manager] Asset id: {} not an internal asset type, file deletion not allowed", id); } - SHLOG_WARNING("Asset id does not exist, nothing was deleted: {}", id); + SHLOG_WARNING("[Asset Manager] Asset id does not exist, nothing was deleted: {}", id); return false; } @@ -334,7 +334,7 @@ namespace SHADE std::filesystem::path const newPath{ GenerateLocalPath(path) }; if (newPath.empty()) { - SHLOG_WARNING("Unsupported file format for asset: {}", path.string()); + SHLOG_WARNING("[Asset Manager] Unsupported file format for asset: {}", path.string()); return 0; } @@ -386,7 +386,7 @@ namespace SHADE { if (!std::filesystem::exists(path)) { - SHLOG_ERROR("Path provided does not point to a file: {}", path.string()); + SHLOG_ERROR("[Asset Manager] Path provided does not point to a file: {}", path.string()); return; } AssetPath newPath; @@ -416,7 +416,7 @@ namespace SHADE auto pathGen = SHTextureCompiler::CompileTextureAsset(path); if (!pathGen.has_value()) { - SHLOG_ERROR("Texture Compilation Failed for: {}", path.string()); + SHLOG_ERROR("[Asset Manager] Texture Compilation Failed for: {}", path.string()); return; } newPath = pathGen.value(); @@ -433,7 +433,7 @@ namespace SHADE } else { - SHLOG_WARNING("File Type compilation not yet Implemented: {}", path.string()); + SHLOG_WARNING("[Asset Manager] File Type compilation not yet Implemented: {}", path.string()); return; } @@ -520,7 +520,7 @@ namespace SHADE SHAssetData* data = loaders[static_cast(asset.type)]->Load(asset.path); if (data == nullptr) { - SHLOG_ERROR("Unable to load asset into memory: {}\n", asset.path.string()); + SHLOG_ERROR("[Asset Manager] Unable to load asset into memory: {}\n", asset.path.string()); } else { @@ -537,7 +537,7 @@ namespace SHADE if (parentData == nullptr) { - SHLOG_ERROR("Unable to load asset into memory: {}\n", parent.path.string()); + SHLOG_ERROR("[Asset Manager] Unable to load asset into memory: {}\n", parent.path.string()); } else { @@ -653,6 +653,34 @@ namespace SHADE return newAsset.id; } + else if(ext == MATERIAL_EXTENSION) + { + SHAsset newAsset{ + path.stem().string(), + GenerateAssetID(AssetType::MATERIAL), + AssetType::MATERIAL, + path, + false + }; + assetCollection.emplace(newAsset.id, newAsset); + SHAssetMetaHandler::WriteMetaData(newAsset); + + return newAsset.id; + } + else if (ext == PREFAB_EXTENSION) + { + SHAsset newAsset{ + path.stem().string(), + GenerateAssetID(AssetType::PREFAB), + AssetType::PREFAB, + path, + false + }; + assetCollection.emplace(newAsset.id, newAsset); + SHAssetMetaHandler::WriteMetaData(newAsset); + + return newAsset.id; + } else if (ext == FONT_EXTENSION) { SHAsset newAsset{ diff --git a/SHADE_Engine/src/Camera/SHCameraDirector.cpp b/SHADE_Engine/src/Camera/SHCameraDirector.cpp index 1f97160c..7d5ec6f2 100644 --- a/SHADE_Engine/src/Camera/SHCameraDirector.cpp +++ b/SHADE_Engine/src/Camera/SHCameraDirector.cpp @@ -90,5 +90,22 @@ namespace SHADE return SHMatrix::Identity; } + float SHCameraDirector::GetWidth() noexcept + { + SHCameraComponent* camComponent = GetMainCameraComponent(); + if (camComponent) + return camComponent->GetWidth(); + else + return 0.0f; + } + + float SHCameraDirector::GetHeight() noexcept + { + SHCameraComponent* camComponent = GetMainCameraComponent(); + if (camComponent) + return camComponent->GetHeight(); + else + return 0.0f; + } } diff --git a/SHADE_Engine/src/Camera/SHCameraDirector.h b/SHADE_Engine/src/Camera/SHCameraDirector.h index 8538a824..381531d6 100644 --- a/SHADE_Engine/src/Camera/SHCameraDirector.h +++ b/SHADE_Engine/src/Camera/SHCameraDirector.h @@ -30,6 +30,8 @@ namespace SHADE void SetMainCamera(SHCameraComponent& cam) noexcept; SHMatrix const& GetOrthoMatrix() noexcept; SHMatrix const& GetPerspectiveMatrix() noexcept; + float GetWidth() noexcept; + float GetHeight() noexcept; private: SHMatrix viewMatrix; diff --git a/SHADE_Engine/src/Camera/SHCameraSystem.cpp b/SHADE_Engine/src/Camera/SHCameraSystem.cpp index 489b05a1..a2e83767 100644 --- a/SHADE_Engine/src/Camera/SHCameraSystem.cpp +++ b/SHADE_Engine/src/Camera/SHCameraSystem.cpp @@ -8,6 +8,8 @@ #include "Math/Transform/SHTransformComponent.h" #include #include "Scene/SHSceneManager.h" +#include "ECS_Base/Managers/SHSystemManager.h" +#include "Editor/SHEditor.h" namespace SHADE { @@ -57,6 +59,8 @@ namespace SHADE //std::cout << camera.yaw << std::endl; + + camera.pitch -= mouseY * dt * camera.turnSpeed.x; camera.yaw -= mouseX * dt * camera.turnSpeed.y; camera.dirtyView = true; @@ -150,6 +154,8 @@ namespace SHADE void SHCameraSystem::UpdateCameraComponent(SHCameraComponent& camera) noexcept { + + if (camera.isActive == false) return; @@ -436,4 +442,22 @@ namespace SHADE SetCameraViewMatrix(camera, viewMtx); } + SHVec2 SHCameraSystem::GetCameraWidthHeight(size_t index) noexcept + { +#ifdef SHEDITOR + auto editor = SHSystemManager::GetSystem(); + if (editor->editorState != SHEditor::State::PLAY) + { + return SHVec2{ GetEditorCamera()->GetWidth(), GetEditorCamera()->GetHeight() }; + } + else + { + return SHVec2{ GetDirector(index)->GetWidth(),GetDirector(index)->GetHeight() }; + } + +#else + return SHVec2{ GetDirector(index)->GetWidth(),GetDirector(index)->GetHeight() }; +#endif + } + } diff --git a/SHADE_Engine/src/Camera/SHCameraSystem.h b/SHADE_Engine/src/Camera/SHCameraSystem.h index 9c8157f4..d40f9a6c 100644 --- a/SHADE_Engine/src/Camera/SHCameraSystem.h +++ b/SHADE_Engine/src/Camera/SHCameraSystem.h @@ -27,6 +27,7 @@ namespace SHADE void UpdateCameraComponent(SHCameraComponent& camera) noexcept; void UpdatePivotArmComponent(SHCameraArmComponent& pivot) noexcept; + public: @@ -57,6 +58,8 @@ namespace SHADE void SetCameraViewMatrix(SHCameraComponent& camera, SHMatrix const& viewMatrix) noexcept; void CameraLookAt(SHCameraComponent& camera, SHVec3 target) noexcept; void UpdateEditorArm(double dt,bool active ,SHVec3 const& targetPos) noexcept; + + SHVec2 GetCameraWidthHeight(size_t index) noexcept; }; diff --git a/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorComponentView.hpp b/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorComponentView.hpp index f8be2af9..0f3dce3e 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorComponentView.hpp +++ b/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorComponentView.hpp @@ -333,10 +333,10 @@ namespace SHADE auto cursorPos = ImGui::GetCursorPos(); //collider->IsTrigger - if (collider->GetType() == SHCollisionShape::Type::BOX) { SHEditorWidgets::BeginPanel(std::format("{} Box #{}", ICON_FA_CUBE, i).data(), { ImGui::GetContentRegionAvail().x, ImGui::GetContentRegionAvail().y }); + const auto* BOX = reinterpret_cast(collider->GetShape()); SHEditorWidgets::DragVec3 ( @@ -360,6 +360,15 @@ namespace SHADE } { + SHEditorWidgets::CheckBox("Is Trigger", [collider] { return collider->IsTrigger(); }, [collider](bool value) { collider->SetIsTrigger(value); }); + + if(ImGui::CollapsingHeader("Physics Material")) + { + SHEditorWidgets::DragFloat("Friction", [collider] { return collider->GetFriction(); }, [collider](float value) { collider->SetFriction(value); }, "Friction", 0.05f, 0.0f, 1.0f); + SHEditorWidgets::DragFloat("Bounciness", [collider] { return collider->GetBounciness(); }, [collider](float value) { collider->SetBounciness(value); }, "Bounciness", 0.05f, 0.0f, 1.0f); + SHEditorWidgets::DragFloat("Mass Density", [collider] { return collider->GetDensity(); }, [collider](float value) { collider->SetDensity(value); }, "Mass Density", 0.1f, 0.0f); + } + SHEditorWidgets::BeginPanel("Offsets",{ ImGui::GetContentRegionAvail().x, 30.0f }); SHEditorWidgets::DragVec3("Position", { "X", "Y", "Z" }, [&collider] {return collider->GetPositionOffset(); }, [&collider](SHVec3 const& vec) {collider->SetPositionOffset(vec); }); SHEditorWidgets::DragVec3("Rotation", { "X", "Y", "Z" }, @@ -375,8 +384,6 @@ namespace SHADE SHEditorWidgets::EndPanel(); } - SHEditorWidgets::CheckBox("Is Trigger", [collider] { return collider->IsTrigger(); }, [collider](bool value) { collider->SetIsTrigger(value); }); - if (ImGui::Button(std::format("{} Remove Collider #{}", ICON_MD_REMOVE, i).data())) { colliderToDelete = i; diff --git a/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorInspector.cpp b/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorInspector.cpp index c4287e6f..83647da7 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorInspector.cpp +++ b/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorInspector.cpp @@ -20,6 +20,7 @@ #include "Camera/SHCameraArmComponent.h" #include "UI/SHUIComponent.h" #include "UI/SHCanvasComponent.h" +#include "UI/SHButtonComponent.h" #include "SHEditorComponentView.h" #include "AudioSystem/SHAudioListenerComponent.h" #include "Graphics/MiddleEnd/TextRendering/SHTextRenderableComponent.h" @@ -149,6 +150,10 @@ namespace SHADE { DrawComponent(textRendererComponent); } + if (auto buttonComponent = SHComponentManager::GetComponent_s(eid)) + { + DrawComponent(buttonComponent); + } ImGui::Separator(); // Render Scripts SHScriptEngine* scriptEngine = static_cast(SHSystemManager::GetSystem()); @@ -161,6 +166,7 @@ namespace SHADE DrawAddComponentButton(eid); DrawAddComponentButton(eid); DrawAddComponentButton(eid); + DrawAddComponentButton(eid); // Components that require Transforms diff --git a/SHADE_Engine/src/Editor/EditorWindow/MenuBar/SHEditorMenuBar.cpp b/SHADE_Engine/src/Editor/EditorWindow/MenuBar/SHEditorMenuBar.cpp index 2912a0bc..a1335e19 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/MenuBar/SHEditorMenuBar.cpp +++ b/SHADE_Engine/src/Editor/EditorWindow/MenuBar/SHEditorMenuBar.cpp @@ -20,6 +20,7 @@ #include "Assets/SHAssetManager.h" #include "Assets/Asset Types/SHSceneAsset.h" +#include "ECS_Base/Managers/SHEntityManager.h" #include "Scene/SHSceneManager.h" #include "Serialization/SHSerialization.h" #include "Serialization/Configurations/SHConfigurationManager.h" @@ -256,11 +257,13 @@ namespace SHADE ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f); ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, { ImVec2(0.0f, 0.0f) }); + ImGui::PushStyleColor(ImGuiCol_WindowBg, ImGui::GetStyle().Colors[ImGuiCol_MenuBarBg]); if (ImGui::BeginViewportSideBar("MainStatusBar", ImGui::GetMainViewport(), ImGuiDir_Down, menuBarHeight, editorMenuBarFlags)) { - ImGui::Text("Entity count: "); + ImGui::Text("Entity count: %zu", SHEntityManager::GetEntityCount()); } ImGui::End(); + ImGui::PopStyleColor(); ImGui::PopStyleVar(3); } diff --git a/SHADE_Engine/src/Editor/SHEditorUI.cpp b/SHADE_Engine/src/Editor/SHEditorUI.cpp index 9fdcbde7..b9783020 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) + { + // 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..cd87f46b 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 { @@ -298,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. @@ -310,6 +311,13 @@ 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. + /// + /// Label used to identify this widget. + /// Reference to the variable to store the result. + /// The type of enum to input. diff --git a/SHADE_Engine/src/Editor/SHEditorWidgets.hpp b/SHADE_Engine/src/Editor/SHEditorWidgets.hpp index 2681e916..403992cc 100644 --- a/SHADE_Engine/src/Editor/SHEditorWidgets.hpp +++ b/SHADE_Engine/src/Editor/SHEditorWidgets.hpp @@ -454,12 +454,12 @@ namespace SHADE ImGui::BeginGroup(); ImGui::PushID(label.data()); TextLabel(label); - const bool hasChange = ImGui::DragScalar("##dragScalar", data_type, &value, speed, &p_min, &p_max, displayFormat, flags); + const bool hasChange = ImGui::InputScalar("##dragScalar", data_type, &value); static bool startRecording = false; if (hasChange) { SHCommandManager::PerformCommand(std::reinterpret_pointer_cast(std::make_shared>(get(), value, set)), startRecording); - if (!startRecording) + if (!startRecording && ImGui::IsMouseDown(ImGuiMouseButton_Left)) startRecording = true; } if (startRecording && ImGui::IsMouseReleased(ImGuiMouseButton_Left)) @@ -477,7 +477,7 @@ namespace SHADE ImGui::EndTooltip(); } } - return hasChange; + return false; } static bool DragFloat(const std::string_view& label, std::function get, std::function set, std::string_view const& tooltip = {}, diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Batching/SHBatch.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Batching/SHBatch.cpp index 9b4b02b0..afa2f9e0 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Batching/SHBatch.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Batching/SHBatch.cpp @@ -313,7 +313,8 @@ namespace SHADE auto uiComp = SHComponentManager::GetComponent_s(rendId); if (uiComp) { - transformData.emplace_back(uiComp->GetMatrix()); + if(uiComp->isActive) + transformData.emplace_back(uiComp->GetMatrix()); } else transformData.emplace_back(transform->GetTRS()); diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Batching/SHSuperBatch.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Batching/SHSuperBatch.cpp index ec19691f..58993026 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Batching/SHSuperBatch.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Batching/SHSuperBatch.cpp @@ -55,7 +55,11 @@ namespace SHADE void SHSuperBatch::Remove(const SHRenderable* renderable) noexcept { - Handle baseMat = (renderable->HasMaterialChanged() ? renderable->GetPrevMaterial() : renderable->GetMaterial())->GetBaseMaterial(); + Handle matInst = renderable->HasMaterialChanged() ? renderable->GetPrevMaterial() : renderable->GetMaterial(); + if (!matInst) + return; + + Handle baseMat = matInst->GetBaseMaterial(); const Handle PIPELINE = baseMat->HasPipelineChanged() ? baseMat->GetPrevPipeline() : baseMat->GetPipeline(); // Check if we have a Batch with the same pipeline yet diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp index af09c819..03ca0b3d 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp @@ -968,7 +968,7 @@ namespace SHADE for (auto& renderable : renderables) { // Check if the material instance is now unused - renderable.CleanUpMaterials(); + renderable.CleanUpMaterials(); if (!renderable.HasChanged()) continue; diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHRenderable.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHRenderable.cpp index e22de5ab..5dc5d22c 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHRenderable.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHRenderable.cpp @@ -34,9 +34,10 @@ namespace SHADE void SHRenderable::OnDestroy() { // Remove from SuperBatch - if (sharedMaterial) + auto currMat = GetMaterial(); + if (currMat) { - Handle superBatch = sharedMaterial->GetBaseMaterial()->GetPipeline()->GetPipelineState().GetSubpass()->GetSuperBatch(); + Handle superBatch = currMat->GetBaseMaterial()->GetPipeline()->GetPipelineState().GetSubpass()->GetSuperBatch(); superBatch->Remove(this); } @@ -64,7 +65,6 @@ namespace SHADE if (material) { oldMaterial = material; - material.Free(); material = {}; } else if (sharedMaterial) @@ -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) @@ -144,6 +150,8 @@ namespace SHADE { matChanged = false; meshChanged = false; + if (oldMaterial) + oldMaterial.Free(); oldMaterial = {}; oldMesh = {}; } 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_Engine/src/Math/Transform/SHTransformSystem.cpp b/SHADE_Engine/src/Math/Transform/SHTransformSystem.cpp index 94c133dd..38d44984 100644 --- a/SHADE_Engine/src/Math/Transform/SHTransformSystem.cpp +++ b/SHADE_Engine/src/Math/Transform/SHTransformSystem.cpp @@ -47,14 +47,14 @@ namespace SHADE { // Get the current scene graph to traverse and update const auto& SCENE_GRAPH = SHSceneManager::GetCurrentSceneGraph(); - UpdateEntity(SCENE_GRAPH.GetRoot(), !IsRunInEditorPause); + UpdateEntity(SCENE_GRAPH.GetRoot(), false); } void SHTransformSystem::TransformPostPhysicsUpdate::Execute(double) noexcept { // Get the current scene graph to traverse and update const auto& SCENE_GRAPH = SHSceneManager::GetCurrentSceneGraph(); - UpdateEntity(SCENE_GRAPH.GetRoot(), IsRunInEditorPause); + UpdateEntity(SCENE_GRAPH.GetRoot(), true); } void SHTransformSystem::Init() diff --git a/SHADE_Engine/src/Physics/Interface/SHCollisionShape.cpp b/SHADE_Engine/src/Physics/Interface/SHCollisionShape.cpp index c8a082a5..f597077f 100644 --- a/SHADE_Engine/src/Physics/Interface/SHCollisionShape.cpp +++ b/SHADE_Engine/src/Physics/Interface/SHCollisionShape.cpp @@ -359,6 +359,10 @@ RTTR_REGISTRATION ); registration::class_("Collider") - .property("Position Offset", &SHCollisionShape::GetPositionOffset, &SHCollisionShape::SetPositionOffset) - .property("Rotation Offset", &SHCollisionShape::GetRotationOffset, &SHCollisionShape::SetRotationOffset) (metadata(META::angleInRad, true)); + .property("IsTrigger" , &SHCollisionShape::IsTrigger , &SHCollisionShape::SetIsTrigger ) + .property("Friction" , &SHCollisionShape::GetFriction , &SHCollisionShape::SetFriction ) + .property("Bounciness" , &SHCollisionShape::GetBounciness , &SHCollisionShape::SetBounciness ) + .property("Density" , &SHCollisionShape::GetDensity , &SHCollisionShape::SetDensity ) + .property("Position Offset" , &SHCollisionShape::GetPositionOffset, &SHCollisionShape::SetPositionOffset) + .property("Rotation Offset" , &SHCollisionShape::GetRotationOffset, &SHCollisionShape::SetRotationOffset) (metadata(META::angleInRad, true)); } \ No newline at end of file diff --git a/SHADE_Engine/src/Physics/PhysicsObject/SHPhysicsObject.cpp b/SHADE_Engine/src/Physics/PhysicsObject/SHPhysicsObject.cpp index 00f280e9..71b08831 100644 --- a/SHADE_Engine/src/Physics/PhysicsObject/SHPhysicsObject.cpp +++ b/SHADE_Engine/src/Physics/PhysicsObject/SHPhysicsObject.cpp @@ -123,12 +123,14 @@ namespace SHADE default: break; } + auto* rp3dCollider = rp3dBody->getCollider(rp3dBody->getNbColliders() - 1); + syncColliderProperties(collisionShape, rp3dCollider); + if (rp3dBody->getType() == rp3d::BodyType::DYNAMIC) { rp3dBody->updateMassPropertiesFromColliders(); - - auto* rigidBodyComponent = SHComponentManager::GetComponent_s(entityID); - if (rigidBodyComponent) + + if (auto* rigidBodyComponent = SHComponentManager::GetComponent_s(entityID); rigidBodyComponent) rigidBodyComponent->mass = rp3dBody->getMass(); } @@ -326,28 +328,42 @@ namespace SHADE default: break; } - // Sync material auto* rp3dCollider = rp3dBody->getCollider(i); - auto& rp3dMaterial = rp3dCollider->getMaterial(); - - rp3dMaterial.setFrictionCoefficient(collisionShape.GetFriction()); - rp3dMaterial.setBounciness(collisionShape.GetBounciness()); - rp3dMaterial.setMassDensity(collisionShape.GetDensity()); - - // Sync tags - const unsigned short MASK_BITS = collisionShape.GetCollisionTag(); - rp3dCollider->setCollisionCategoryBits(MASK_BITS); - rp3dCollider->setCollideWithMaskBits(MASK_BITS); + syncColliderProperties(collisionShape, rp3dCollider); collisionShape.dirty = false; } + + // Set rigidbody mass if dynamic + auto* rigidBodyComponent = SHComponentManager::GetComponent_s(entityID); + if (rigidBodyComponent) + { + // This is generally expensive, will be optimised in the future with my own engine. + rp3dBody->updateMassPropertiesFromColliders(); + rigidBodyComponent->mass = rp3dBody->getMass(); + } } /*-----------------------------------------------------------------------------------*/ /* Private Function Member Definitions */ /*-----------------------------------------------------------------------------------*/ - void SHPhysicsObject::addBoxShape(SHCollisionShape& boxShape) const noexcept + void SHPhysicsObject::syncColliderProperties(const SHCollisionShape& collisionShape, rp3d::Collider* rp3dCollider) const noexcept + { + rp3dCollider->setIsTrigger(collisionShape.IsTrigger()); + + auto& rp3dMaterial = rp3dCollider->getMaterial(); + + rp3dMaterial.setFrictionCoefficient(collisionShape.GetFriction()); + rp3dMaterial.setBounciness(collisionShape.GetBounciness()); + rp3dMaterial.setMassDensity(collisionShape.GetDensity()); + + const unsigned short MASK_BITS = collisionShape.GetCollisionTag(); + rp3dCollider->setCollisionCategoryBits(MASK_BITS); + rp3dCollider->setCollideWithMaskBits(MASK_BITS); + } + + void SHPhysicsObject::addBoxShape(const SHCollisionShape& boxShape) const noexcept { const rp3d::Transform OFFSETS { @@ -361,7 +377,7 @@ namespace SHADE rp3dBody->addCollider(newBox, OFFSETS); } - void SHPhysicsObject::syncBoxShape(int index, SHCollisionShape& boxShape) const noexcept + void SHPhysicsObject::syncBoxShape(int index, const SHCollisionShape& boxShape) const noexcept { const auto* BOX = reinterpret_cast(boxShape.GetShape()); @@ -380,7 +396,7 @@ namespace SHADE rp3dBox->setHalfExtents(BOX->GetWorldExtents()); } - void SHPhysicsObject::addSphereShape(SHCollisionShape& sphereShape) const noexcept + void SHPhysicsObject::addSphereShape(const SHCollisionShape& sphereShape) const noexcept { const rp3d::Transform OFFSETS { @@ -394,7 +410,7 @@ namespace SHADE rp3dBody->addCollider(newSphere, OFFSETS); } - void SHPhysicsObject::syncSphereShape(int index, SHCollisionShape& sphereShape) const noexcept + void SHPhysicsObject::syncSphereShape(int index, const SHCollisionShape& sphereShape) const noexcept { const auto* SPHERE = reinterpret_cast(sphereShape.GetShape()); diff --git a/SHADE_Engine/src/Physics/PhysicsObject/SHPhysicsObject.h b/SHADE_Engine/src/Physics/PhysicsObject/SHPhysicsObject.h index 818e5471..c572ca2e 100644 --- a/SHADE_Engine/src/Physics/PhysicsObject/SHPhysicsObject.h +++ b/SHADE_Engine/src/Physics/PhysicsObject/SHPhysicsObject.h @@ -96,14 +96,16 @@ namespace SHADE /* Function Members */ /*---------------------------------------------------------------------------------*/ + void syncColliderProperties (const SHCollisionShape& collisionShape, rp3d::Collider* rp3dCollider) const noexcept; + // Box Shapes - void addBoxShape (SHCollisionShape& boxShape) const noexcept; - void syncBoxShape (int index, SHCollisionShape& boxShape) const noexcept; + void addBoxShape (const SHCollisionShape& boxShape) const noexcept; + void syncBoxShape (int index, const SHCollisionShape& boxShape) const noexcept; // Sphere Shapes - void addSphereShape (SHCollisionShape& sphereShape) const noexcept; - void syncSphereShape (int index, SHCollisionShape& sphereShape) const noexcept; + void addSphereShape (const SHCollisionShape& sphereShape) const noexcept; + void syncSphereShape (int index, const SHCollisionShape& sphereShape) const noexcept; }; } // namespace SHADE \ No newline at end of file diff --git a/SHADE_Engine/src/Physics/System/SHPhysicsSystemRoutines.cpp b/SHADE_Engine/src/Physics/System/SHPhysicsSystemRoutines.cpp index 9d860bf9..24bd2f81 100644 --- a/SHADE_Engine/src/Physics/System/SHPhysicsSystemRoutines.cpp +++ b/SHADE_Engine/src/Physics/System/SHPhysicsSystemRoutines.cpp @@ -21,6 +21,14 @@ #include "Input/SHInputManager.h" +/*-------------------------------------------------------------------------------------*/ +/* Local Functions */ +/*-------------------------------------------------------------------------------------*/ + +void testFunction(); + +///////////////////////////////////////////////////////////////////////////////////////// + namespace SHADE { /*-----------------------------------------------------------------------------------*/ @@ -134,6 +142,8 @@ namespace SHADE const double FIXED_DT = physicsSystem->fixedDT; accumulatedTime += dt; + //testFunction(); + int count = 0; while (accumulatedTime > FIXED_DT) { @@ -292,9 +302,12 @@ namespace SHADE { colliderComponent->position = WORLD_POS; colliderComponent->orientation = WORLD_ROT; - colliderComponent->scale = WORLD_SCL; - colliderComponent->RecomputeCollisionShapes(); + if (colliderComponent->scale != WORLD_SCL) + { + colliderComponent->scale = WORLD_SCL; + colliderComponent->RecomputeCollisionShapes(); + } } } @@ -315,6 +328,10 @@ namespace SHADE if (physicsObject.GetRigidBody()->isActive()) physicsObject.prevTransform = CURRENT_TF; + // Skip sleeping objects + if (physicsObject.GetRigidBody()->isSleeping()) + return; + // Sync with rigid bodies if (rigidBodyComponent && SHSceneManager::CheckNodeAndComponentsActive(physicsObject.entityID)) { @@ -336,20 +353,52 @@ namespace SHADE rigidBodyComponent->position = CURRENT_TF.getPosition(); rigidBodyComponent->orientation = CURRENT_TF.getOrientation(); - } - // Sync with colliders - if (colliderComponent && SHSceneManager::CheckNodeAndComponentsActive(physicsObject.entityID)) - { - colliderComponent->position = CURRENT_TF.getPosition(); - colliderComponent->orientation = CURRENT_TF.getOrientation(); - } + // Sync with colliders + if (colliderComponent && SHSceneManager::CheckNodeAndComponentsActive(physicsObject.entityID)) + { + // Skip colliders without rigidbody components. If any transform was updated, it was done in pre-update. + + colliderComponent->position = CURRENT_TF.getPosition(); + colliderComponent->orientation = CURRENT_TF.getOrientation(); + } - // Set transform for rendering - if (transformComponent) - { - transformComponent->SetWorldPosition(renderPos); - transformComponent->SetWorldOrientation(renderRot); + // Set transform for rendering + if (transformComponent) + { + transformComponent->SetWorldPosition(renderPos); + transformComponent->SetWorldOrientation(renderRot); + } } } -} // namespace SHADE \ No newline at end of file +} // namespace SHADE + +///////////////////////////////////////////////////////////////////////////////////////// + +void testFunction() +{ + using namespace SHADE; + + // Test movement + const float forceModifier = 25.0f; + EntityID eid = 65538; + + if (SHEntityManager::IsValidEID(eid)) + { + auto* rb = SHComponentManager::GetComponent_s(eid); + if (rb) + { + if (SHInputManager::GetKey(SHInputManager::SH_KEYCODE::W)) + rb->AddForce(-SHVec3::UnitZ * forceModifier); + + if (SHInputManager::GetKey(SHInputManager::SH_KEYCODE::A)) + rb->AddForce(-SHVec3::UnitX * forceModifier); + + if (SHInputManager::GetKey(SHInputManager::SH_KEYCODE::S)) + rb->AddForce(SHVec3::UnitZ * forceModifier); + + if (SHInputManager::GetKey(SHInputManager::SH_KEYCODE::D)) + rb->AddForce(SHVec3::UnitX * forceModifier); + } + } +} 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/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/Serialization/SHSerialization.cpp b/SHADE_Engine/src/Serialization/SHSerialization.cpp index be7c9cf0..99e4fa41 100644 --- a/SHADE_Engine/src/Serialization/SHSerialization.cpp +++ b/SHADE_Engine/src/Serialization/SHSerialization.cpp @@ -12,9 +12,12 @@ #include "Assets/Asset Types/SHSceneAsset.h" #include "Camera/SHCameraComponent.h" +#include "Camera/SHCameraArmComponent.h" #include "Math/Transform/SHTransformComponent.h" #include "Graphics/MiddleEnd/Interface/SHRenderable.h" #include "Physics/Interface/SHRigidBodyComponent.h" +#include "UI/SHCanvasComponent.h" +#include "UI/SHButtonComponent.h" #include "ECS_Base/Managers/SHSystemManager.h" #include "Graphics/MiddleEnd/Lights/SHLightComponent.h" #include "Scripting/SHScriptEngine.h" @@ -207,10 +210,15 @@ namespace SHADE AddComponentToComponentNode(components, eid); AddComponentToComponentNode(components, eid); + AddComponentToComponentNode(components, eid); AddConvComponentToComponentNode(components, eid); AddComponentToComponentNode(components, eid); AddComponentToComponentNode(components, eid); AddConvComponentToComponentNode(components, eid); + + AddComponentToComponentNode(components, eid); + AddComponentToComponentNode(components, eid); + AddConvComponentToComponentNode(components, eid); node[ComponentsNode] = components; @@ -259,10 +267,14 @@ namespace SHADE AddComponentID(componentIDList, componentsNode); AddComponentID(componentIDList, componentsNode); + AddComponentID(componentIDList, componentsNode); AddComponentID(componentIDList, componentsNode); AddComponentID(componentIDList, componentsNode); AddComponentID(componentIDList, componentsNode); AddComponentID(componentIDList, componentsNode); + + AddComponentID(componentIDList, componentsNode); + AddComponentID(componentIDList, componentsNode); AddComponentID(componentIDList, componentsNode); return componentIDList; @@ -337,9 +349,13 @@ namespace SHADE return; SHSerializationHelper::InitializeComponentFromNode(componentsNode, eid); SHSerializationHelper::InitializeComponentFromNode(componentsNode, eid); + SHSerializationHelper::InitializeComponentFromNode(componentsNode, eid); SHSerializationHelper::InitializeComponentFromNode(componentsNode, eid); SHSerializationHelper::ConvertNodeToComponent(componentsNode, eid); SHSerializationHelper::ConvertNodeToComponent(componentsNode, eid); + + SHSerializationHelper::InitializeComponentFromNode(componentsNode, eid); + SHSerializationHelper::InitializeComponentFromNode(componentsNode, eid); SHSerializationHelper::ConvertNodeToComponent(componentsNode, eid); SHSerializationHelper::InitializeComponentFromNode(componentsNode, eid); } diff --git a/SHADE_Engine/src/Serialization/SHYAMLConverters.h b/SHADE_Engine/src/Serialization/SHYAMLConverters.h index 023f0817..48150d4a 100644 --- a/SHADE_Engine/src/Serialization/SHYAMLConverters.h +++ b/SHADE_Engine/src/Serialization/SHYAMLConverters.h @@ -188,7 +188,7 @@ namespace YAML if (node[Friction].IsDefined()) rhs.SetFriction(node[Friction].as()); if (node[Bounciness].IsDefined()) - rhs.SetBounciness(rhs.GetBounciness()); + rhs.SetBounciness(node[Bounciness].as()); if (node[Density].IsDefined()) rhs.SetDensity(node[Density].as()); if (node[PositionOffset].IsDefined()) diff --git a/SHADE_Engine/src/UI/SHButtonComponent.cpp b/SHADE_Engine/src/UI/SHButtonComponent.cpp new file mode 100644 index 00000000..7b275128 --- /dev/null +++ b/SHADE_Engine/src/UI/SHButtonComponent.cpp @@ -0,0 +1,58 @@ +#include "SHpch.h" +#include "SHButtonComponent.h" + + +namespace SHADE +{ + SHButtonComponent::SHButtonComponent() + :size(1.0f), offset(0.0f), isHovered(false), isClicked(false), + defaultTexture(0), hoveredTexture(0), clickedTexture(0) + { + } + + AssetID SHButtonComponent::GetDefaultTexture() const noexcept + { + return defaultTexture; + } + + AssetID SHButtonComponent::GetHoveredTexture() const noexcept + { + return hoveredTexture; + } + + AssetID SHButtonComponent::GetClickedTexture() const noexcept + { + return clickedTexture; + } + + void SHButtonComponent::SetDefaultTexture(AssetID texture) noexcept + { + defaultTexture = texture; + } + + void SHButtonComponent::SetHoveredTexture(AssetID texture) noexcept + { + hoveredTexture = texture; + } + + void SHButtonComponent::SetClickedTexture(AssetID texture) noexcept + { + clickedTexture = texture; + } + +} + + +RTTR_REGISTRATION +{ + using namespace SHADE; + using namespace rttr; + + registration::class_("Button Component") + .property("Default Texture", &SHButtonComponent::GetDefaultTexture, &SHButtonComponent::SetDefaultTexture) + .property("Hovered Texture", &SHButtonComponent::GetHoveredTexture, &SHButtonComponent::SetHoveredTexture) + .property("Clicked Texture", &SHButtonComponent::GetClickedTexture, &SHButtonComponent::SetClickedTexture) + ; + + +} \ No newline at end of file diff --git a/SHADE_Engine/src/UI/SHButtonComponent.h b/SHADE_Engine/src/UI/SHButtonComponent.h new file mode 100644 index 00000000..39790b6a --- /dev/null +++ b/SHADE_Engine/src/UI/SHButtonComponent.h @@ -0,0 +1,48 @@ +#pragma once + +#include + +#include "SH_API.h" +#include "ECS_Base/Components/SHComponent.h" +#include "Math/Vector/SHVec3.h" +#include "Math/Vector/SHVec2.h" +#include "Assets/SHAssetMacros.h" + +namespace SHADE +{ + + class SH_API SHButtonComponent final: public SHComponent + { + public: + SHButtonComponent(); + virtual ~SHButtonComponent() = default; + + SHVec2 size; + SHVec2 offset; + + AssetID GetClickedTexture() const noexcept; + AssetID GetDefaultTexture() const noexcept; + AssetID GetHoveredTexture() const noexcept; + + + void SetDefaultTexture(AssetID texture) noexcept; + void SetHoveredTexture(AssetID texture) noexcept; + void SetClickedTexture(AssetID texture) noexcept; + + + + friend class SHUISystem; + private: + + bool isHovered; + bool isClicked; + AssetID defaultTexture; + AssetID hoveredTexture; + AssetID clickedTexture; + + + RTTR_ENABLE() + }; + + +} \ No newline at end of file diff --git a/SHADE_Engine/src/UI/SHUISystem.cpp b/SHADE_Engine/src/UI/SHUISystem.cpp index d7dfe3c5..1387bc6b 100644 --- a/SHADE_Engine/src/UI/SHUISystem.cpp +++ b/SHADE_Engine/src/UI/SHUISystem.cpp @@ -3,6 +3,13 @@ #include "ECS_Base/Managers/SHComponentManager.h" #include "ECS_Base/Managers/SHSystemManager.h" #include "Math/Transform/SHTransformComponent.h" +#include "Graphics/MiddleEnd/Interface/SHRenderable.h" +#include "Camera/SHCameraSystem.h" +#include "Editor/EditorWindow/SHEditorWindowManager.h" +#include "Editor/EditorWindow/ViewportWindow/SHEditorViewport.h" +#include "Editor/SHEditor.h" +#include "Resource/SHResourceManager.h" +#include "Input/SHInputManager.h" namespace SHADE { @@ -12,6 +19,7 @@ namespace SHADE SystemFamily::GetID(); SHComponentManager::CreateComponentSparseSet(); SHComponentManager::CreateComponentSparseSet(); + SHComponentManager::CreateComponentSparseSet(); } void SHUISystem::Exit() @@ -95,7 +103,7 @@ namespace SHADE { auto transform = SHComponentManager::GetComponent(comp.GetEID()); if (canvasComp != nullptr) - comp.localToCanvasMatrix = canvasComp->GetMatrix() * transform->GetTRS(); + comp.localToCanvasMatrix = canvasComp->GetMatrix()* transform->GetTRS(); else comp.localToCanvasMatrix = transform->GetTRS(); } @@ -108,6 +116,109 @@ namespace SHADE } } + void SHUISystem::UpdateCanvasComponent(SHCanvasComponent& comp) noexcept + { + auto cameraSystem = SHSystemManager::GetSystem(); + SHVec2 camSize = cameraSystem->GetCameraWidthHeight(0); + comp.canvasMatrix = SHMatrix::Identity; + comp.canvasMatrix(0, 0) = camSize.x * 0.5f / (comp.GetCanvasWidth() * 0.5f); + comp.canvasMatrix(1, 1) = camSize.y * 0.5f / (comp.GetCanvasHeight() * 0.5f); + } + void SHUISystem::UpdateCanvasMatrixRoutine::Execute(double dt) noexcept + { + SHUISystem* system = (SHUISystem*)GetSystem(); + auto& dense = SHComponentManager::GetDense(); + for (auto& comp : dense) + { + if(SHSceneManager::CheckNodeAndComponentsActive(comp.GetEID())) + system->UpdateCanvasComponent(comp); + } + } + + + void SHUISystem::UpdateButtonComponent(SHButtonComponent& comp) noexcept + { + if (!SHComponentManager::HasComponent(comp.GetEID()) || !SHComponentManager::HasComponent(comp.GetEID())) + { + return; + } + auto cameraSystem = SHSystemManager::GetSystem(); + auto uiComp = SHComponentManager::GetComponent(comp.GetEID()); + + SHVec4 topExtent4 = uiComp->GetMatrix() * SHVec4(-comp.size.x * 0.5f, comp.size.y * 0.5f , 0.0f,1.0f); + SHVec4 btmExtent4 = uiComp->GetMatrix() * SHVec4(comp.size.x * 0.5f , -comp.size.y * 0.5f , 0.0f, 1.0f); + + SHVec2 topExtent{ topExtent4.x,-topExtent4.y }; + SHVec2 btmExtent{ btmExtent4.x,-btmExtent4.y }; + + + + SHVec2 windowSize; + SHVec2 mousePos; +#ifdef SHEDITOR + + windowSize = SHEditorWindowManager::GetEditorWindow()->windowSize; + mousePos = SHEditorWindowManager::GetEditorWindow()->viewportMousePos; + + + +#endif + + + + SHVec2 camSize{ cameraSystem->GetCameraWidthHeight(0).x , cameraSystem->GetCameraWidthHeight(0).y }; + + topExtent += camSize * 0.5f; + btmExtent += camSize * 0.5f; + + //Convert everything to using ratios + topExtent /= camSize; + btmExtent /= camSize; + + mousePos /= windowSize; + + //SHLOG_INFO("mousePos: {} , {}", mousePos.x, mousePos.y); + comp.isClicked = false; + if (mousePos.x >= topExtent.x && mousePos.x <= btmExtent.x + && mousePos.y >= topExtent.y && mousePos.y <= btmExtent.y) + { + comp.isHovered = true; + if (SHInputManager::GetKeyUp(SHInputManager::SH_KEYCODE::LMB)) + { + comp.isClicked = true; + } + //SHLOG_INFO("BUTTON HOVERED"); + + + } + else + { + comp.isHovered = false; + + //SHLOG_INFO("BUTTON NOT HOVERED") + } + + + if (SHComponentManager::HasComponent(comp.GetEID())) + { + //auto renderable = SHComponentManager::GetComponent_s(comp.GetEID()); + //auto texture = SHResourceManager::Get(comp.GetDefaultTexture()); + + //auto material = renderable->GetModifiableMaterial(); + //material->SetProperty("texture", comp.GetDefaultTexture()); + } + } + + void SHUISystem::UpdateButtonsRoutine::Execute(double dt) noexcept + { + SHUISystem* system = (SHUISystem*)GetSystem(); + auto& dense = SHComponentManager::GetDense(); + for (auto& comp : dense) + { + if (SHSceneManager::CheckNodeAndComponentsActive(comp.GetEID())) + system->UpdateButtonComponent(comp); + } + } }//end namespace diff --git a/SHADE_Engine/src/UI/SHUISystem.h b/SHADE_Engine/src/UI/SHUISystem.h index 3da7efb3..04e057ad 100644 --- a/SHADE_Engine/src/UI/SHUISystem.h +++ b/SHADE_Engine/src/UI/SHUISystem.h @@ -4,6 +4,7 @@ #include "ECS_Base/System/SHSystem.h" #include "ECS_Base/System/SHSystemRoutine.h" #include "SHUIComponent.h" +#include "SHButtonComponent.h" #include "SHCanvasComponent.h" #include "Scene/SHSceneGraph.h" #include "Scene/SHSceneManager.h" @@ -38,6 +39,23 @@ namespace SHADE }; friend class UpdateUIMatrixRoutine; + class SH_API UpdateCanvasMatrixRoutine final: public SHSystemRoutine + { + public: + UpdateCanvasMatrixRoutine() :SHSystemRoutine("Update Canvas Matrix Routine", true) {}; + virtual void Execute(double dt) noexcept override final; + }; + friend class UpdateCanvasMatrixRoutine; + + + class SH_API UpdateButtonsRoutine final: public SHSystemRoutine + { + public: + UpdateButtonsRoutine() : SHSystemRoutine("Update Buttons Routine", true) {}; + virtual void Execute(double dt) noexcept override final; + }; + friend class UpdateButtonsRoutine; + void Init(); void Exit(); @@ -45,8 +63,8 @@ namespace SHADE private: void UpdateUIComponent(SHUIComponent& comp) noexcept; - - + void UpdateButtonComponent(SHButtonComponent& comp) noexcept; + void UpdateCanvasComponent(SHCanvasComponent& comp) noexcept; }; diff --git a/SHADE_Managed/premake5.lua b/SHADE_Managed/premake5.lua index 463e80b8..9253c81b 100644 --- a/SHADE_Managed/premake5.lua +++ b/SHADE_Managed/premake5.lua @@ -119,14 +119,14 @@ project "SHADE_Managed" links{"librttr_core.lib"} links{"fmodstudio_vc.lib", "fmod_vc.lib"} - require "vstudio" + -- require "vstudio" - function docsElementCPP(cfg) - _p(3,'true') - end + -- function docsElementCPP(cfg) + -- _p(3,'true') + -- end - premake.override(premake.vstudio.vc2010.elements, "clCompile", function (oldfn, cfg) - return table.join(oldfn(cfg), { - docsElementCPP, - }) - end) \ No newline at end of file + -- premake.override(premake.vstudio.vc2010.elements, "clCompile", function (oldfn, cfg) + -- return table.join(oldfn(cfg), { + -- docsElementCPP, + -- }) + -- end) \ No newline at end of file diff --git a/SHADE_Managed/src/Assets/Font.cxx b/SHADE_Managed/src/Assets/Font.cxx deleted file mode 100644 index 782b0688..00000000 --- a/SHADE_Managed/src/Assets/Font.cxx +++ /dev/null @@ -1,32 +0,0 @@ -/************************************************************************************//*! -\file Font.cxx -\author Tng Kah Wei, kahwei.tng, 390009620 -\par email: kahwei.tng\@digipen.edu -\date Oct 28, 2022 -\brief Contains the implementation of the functions of the managed Font class. - - 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 "Font.hxx" - -namespace SHADE -{ - /*---------------------------------------------------------------------------------*/ - /* Explicit Template Instantiation */ - /*---------------------------------------------------------------------------------*/ - template ref class NativeAsset; - - /*---------------------------------------------------------------------------------*/ - /* Constructors/Destructor */ - /*---------------------------------------------------------------------------------*/ - Font::Font(Handle font) - : NativeAsset { font } - {} -} diff --git a/SHADE_Managed/src/Assets/Font.hxx b/SHADE_Managed/src/Assets/Font.hxx deleted file mode 100644 index fd194d1a..00000000 --- a/SHADE_Managed/src/Assets/Font.hxx +++ /dev/null @@ -1,41 +0,0 @@ -/************************************************************************************//*! -\file Font.hxx -\author Tng Kah Wei, kahwei.tng, 390009620 -\par email: kahwei.tng\@digipen.edu -\date Oct 28, 2022 -\brief Contains the definition of the managed Font class. - - 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/TextRendering/SHFont.h" -// Project Includes -#include "NativeAsset.hxx" -#include "Engine/GenericHandle.hxx" - -namespace SHADE -{ - /// - /// Managed counterpart of the native Font object that can be fed to TextRenderables - /// for rendering. - /// - public ref class Font : public NativeAsset - { - internal: - /*-----------------------------------------------------------------------------*/ - /* Constructors/Destructor */ - /*-----------------------------------------------------------------------------*/ - /// - /// Constructor for the Font. - /// - /// Handle to the font object. - Font(Handle font); - }; -} diff --git a/SHADE_Managed/src/Assets/FontAsset.cxx b/SHADE_Managed/src/Assets/FontAsset.cxx new file mode 100644 index 00000000..19d256cb --- /dev/null +++ b/SHADE_Managed/src/Assets/FontAsset.cxx @@ -0,0 +1,69 @@ +/************************************************************************************//*! +\file Font.cxx +\author Tng Kah Wei, kahwei.tng, 390009620 +\par email: kahwei.tng\@digipen.edu +\date Oct 28, 2022 +\brief Contains the implementation of the functions of the managed Font class. + + 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 "FontAsset.hxx" +// External Dependencies +#include "Resource/SHResourceManagerInterface.h" +// Project Headers +#include "Utility/Convert.hxx" + +namespace SHADE +{ + /*---------------------------------------------------------------------------------*/ + /* Properties */ + /*---------------------------------------------------------------------------------*/ + Handle FontAsset::NativeObject::get() + try + { + return SHResourceManagerInterface::LoadOrGetFont(asset.NativeAssetID); + } + catch (const BadHandleCastException&) + { + return Handle(); + } + AssetID FontAsset::NativeAssetID::get() + { + return asset.NativeAssetID; + } + + /*---------------------------------------------------------------------------------*/ + /* Constructors/Destructor */ + /*---------------------------------------------------------------------------------*/ + FontAsset::FontAsset(AssetID fontId) + : asset { fontId } + {} + + /*---------------------------------------------------------------------------------*/ + /* Operator Overloads */ + /*---------------------------------------------------------------------------------*/ + FontAsset::operator bool(FontAsset asset) + { + return asset.asset; + } + + /*---------------------------------------------------------------------------------*/ + /* Conversion Operators */ + /*---------------------------------------------------------------------------------*/ + FontAsset::operator Asset(FontAsset nativeAsset) + { + return nativeAsset.asset; + } + + FontAsset::operator FontAsset(Asset asset) + { + return FontAsset(asset.NativeAssetID); + } +} diff --git a/SHADE_Managed/src/Assets/FontAsset.hxx b/SHADE_Managed/src/Assets/FontAsset.hxx new file mode 100644 index 00000000..89239224 --- /dev/null +++ b/SHADE_Managed/src/Assets/FontAsset.hxx @@ -0,0 +1,89 @@ +/************************************************************************************//*! +\file Font.hxx +\author Tng Kah Wei, kahwei.tng, 390009620 +\par email: kahwei.tng\@digipen.edu +\date Oct 28, 2022 +\brief Contains the definition of the managed Font class. + + 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/TextRendering/SHFont.h" +// Project Includes +#include "NativeAsset.hxx" +#include "Engine/GenericHandle.hxx" + +namespace SHADE +{ + /// + /// Managed counterpart of the native Font object that can be fed to TextRenderables + /// for rendering. + /// + public value struct FontAsset + { + 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 Font. + /// + /// AssetID to the font asset. + FontAsset(AssetID fontId); + + /*-----------------------------------------------------------------------------*/ + /* 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(FontAsset asset); + + /*-----------------------------------------------------------------------------*/ + /* Conversion Operators */ + /*-----------------------------------------------------------------------------*/ + /// + /// Conversion operator to enable casting from a Font to an Asset. + /// + /// Vector3 to convert from. + static explicit operator Asset(FontAsset nativeAsset); + /// + /// Conversion operator to enable casting from a Asset to a Font. + /// + /// + static explicit operator FontAsset(Asset asset); + + protected: + /*-----------------------------------------------------------------------------*/ + /* Data Members */ + /*-----------------------------------------------------------------------------*/ + Asset asset; + }; +} diff --git a/SHADE_Managed/src/Assets/MaterialAsset.cxx b/SHADE_Managed/src/Assets/MaterialAsset.cxx new file mode 100644 index 00000000..48cbfd83 --- /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.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/Assets/Mesh.cxx b/SHADE_Managed/src/Assets/Mesh.cxx deleted file mode 100644 index 95a61ff6..00000000 --- a/SHADE_Managed/src/Assets/Mesh.cxx +++ /dev/null @@ -1,34 +0,0 @@ -/************************************************************************************//*! -\file Mesh.cxx -\author Tng Kah Wei, kahwei.tng, 390009620 -\par email: kahwei.tng\@digipen.edu -\date Oct 28, 2022 -\brief Contains the implementation of the functions of the managed Mesh class. - - 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 "Mesh.hxx" -// Project Headers -#include "Utility/Convert.hxx" - -namespace SHADE -{ - /*---------------------------------------------------------------------------------*/ - /* Explicit Template Instantiation */ - /*---------------------------------------------------------------------------------*/ - template ref class NativeAsset; - - /*---------------------------------------------------------------------------------*/ - /* Constructors/Destructor */ - /*---------------------------------------------------------------------------------*/ - Mesh::Mesh(Handle mesh) - : NativeAsset { mesh } - {} -} diff --git a/SHADE_Managed/src/Assets/Mesh.hxx b/SHADE_Managed/src/Assets/Mesh.hxx deleted file mode 100644 index 8cd356ba..00000000 --- a/SHADE_Managed/src/Assets/Mesh.hxx +++ /dev/null @@ -1,41 +0,0 @@ -/************************************************************************************//*! -\file Mesh.hxx -\author Tng Kah Wei, kahwei.tng, 390009620 -\par email: kahwei.tng\@digipen.edu -\date Oct 28, 2022 -\brief Contains the definition of the managed Mesh class. - - 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/SHMeshLibrary.h" -// Project Includes -#include "NativeAsset.hxx" -#include "Engine/GenericHandle.hxx" - -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 - { - internal: - /*-----------------------------------------------------------------------------*/ - /* Constructors/Destructor */ - /*-----------------------------------------------------------------------------*/ - /// - /// Constructor for the Mesh - /// - /// Handle to the mesh object. - Mesh(Handle mesh); - }; -} diff --git a/SHADE_Managed/src/Assets/MeshAsset.cxx b/SHADE_Managed/src/Assets/MeshAsset.cxx new file mode 100644 index 00000000..6301fcee --- /dev/null +++ b/SHADE_Managed/src/Assets/MeshAsset.cxx @@ -0,0 +1,69 @@ +/************************************************************************************//*! +\file Mesh.cxx +\author Tng Kah Wei, kahwei.tng, 390009620 +\par email: kahwei.tng\@digipen.edu +\date Oct 28, 2022 +\brief Contains the implementation of the functions of the managed Mesh class. + + 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 "MeshAsset.hxx" +// External Dependencies +#include "Resource/SHResourceManagerInterface.h" +// Project Headers +#include "Utility/Convert.hxx" + +namespace SHADE +{ + /*---------------------------------------------------------------------------------*/ + /* Properties */ + /*---------------------------------------------------------------------------------*/ + Handle MeshAsset::NativeObject::get() + try + { + return SHResourceManagerInterface::LoadOrGetMesh(asset.NativeAssetID); + } + catch (const BadHandleCastException&) + { + return Handle(); + } + AssetID MeshAsset::NativeAssetID::get() + { + return asset.NativeAssetID; + } + + /*---------------------------------------------------------------------------------*/ + /* Constructors/Destructor */ + /*---------------------------------------------------------------------------------*/ + MeshAsset::MeshAsset(AssetID meshId) + : asset{ meshId } + {} + + /*---------------------------------------------------------------------------------*/ + /* Operator Overloads */ + /*---------------------------------------------------------------------------------*/ + MeshAsset::operator bool(MeshAsset asset) + { + return asset.asset; + } + + /*---------------------------------------------------------------------------------*/ + /* Conversion Operators */ + /*---------------------------------------------------------------------------------*/ + MeshAsset::operator Asset(MeshAsset nativeAsset) + { + return nativeAsset.asset; + } + + MeshAsset::operator MeshAsset(Asset asset) + { + return MeshAsset(asset.NativeAssetID); + } +} diff --git a/SHADE_Managed/src/Assets/MeshAsset.hxx b/SHADE_Managed/src/Assets/MeshAsset.hxx new file mode 100644 index 00000000..26625c1a --- /dev/null +++ b/SHADE_Managed/src/Assets/MeshAsset.hxx @@ -0,0 +1,89 @@ +/************************************************************************************//*! +\file Mesh.hxx +\author Tng Kah Wei, kahwei.tng, 390009620 +\par email: kahwei.tng\@digipen.edu +\date Oct 28, 2022 +\brief Contains the definition of the managed Mesh class. + + 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/SHMeshLibrary.h" +// Project Includes +#include "NativeAsset.hxx" +#include "Engine/GenericHandle.hxx" + +namespace SHADE +{ + /// + /// Managed counterpart of the native Mesh object containing vertex data that can + /// be fed to Renderables for rendering. + /// + public value struct MeshAsset + { + 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 Mesh. + /// + /// AssetID to the Mesh asset. + MeshAsset(AssetID meshId); + + /*-----------------------------------------------------------------------------*/ + /* 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(MeshAsset asset); + + /*-----------------------------------------------------------------------------*/ + /* Conversion Operators */ + /*-----------------------------------------------------------------------------*/ + /// + /// Conversion operator to enable casting from a Mesh to an Asset. + /// + /// Vector3 to convert from. + static explicit operator Asset(MeshAsset nativeAsset); + /// + /// Conversion operator to enable casting from a Asset to a Mesh. + /// + /// + static explicit operator MeshAsset(Asset asset); + + protected: + /*-----------------------------------------------------------------------------*/ + /* Data Members */ + /*-----------------------------------------------------------------------------*/ + Asset asset; + }; +} diff --git a/SHADE_Managed/src/Assets/NativeAsset.cxx b/SHADE_Managed/src/Assets/NativeAsset.cxx index 9cdb1840..9480b02a 100644 --- a/SHADE_Managed/src/Assets/NativeAsset.cxx +++ b/SHADE_Managed/src/Assets/NativeAsset.cxx @@ -17,21 +17,30 @@ of DigiPen Institute of Technology is prohibited. #include "NativeAsset.hxx" // Project Includes #include "Engine/GenericHandle.hxx" +#include "Utility/Convert.hxx" namespace SHADE { /*---------------------------------------------------------------------------------*/ /* Properties */ /*---------------------------------------------------------------------------------*/ - GenericHandle Asset::NativeObjectHandle::get() + AssetID Asset::NativeAssetID::get() { - return nativeObjHandle; + return assetId; } /*---------------------------------------------------------------------------------*/ /* Constructors */ /*---------------------------------------------------------------------------------*/ - Asset::Asset(Handle nativeHandle) - : nativeObjHandle { Convert::ToCLI(Handle(nativeHandle)) } + Asset::Asset(AssetID id) + : assetId { id } {} + + /*---------------------------------------------------------------------------------*/ + /* Operator Overloads */ + /*---------------------------------------------------------------------------------*/ + Asset::operator bool(Asset asset) + { + return 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..40f7e628 100644 --- a/SHADE_Managed/src/Assets/NativeAsset.hxx +++ b/SHADE_Managed/src/Assets/NativeAsset.hxx @@ -14,25 +14,28 @@ 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: /*-----------------------------------------------------------------------------*/ /* Properties */ /*-----------------------------------------------------------------------------*/ /// - /// Generic handle for the native object + /// The raw asset ID of the asset. /// - property GenericHandle NativeObjectHandle + property AssetID NativeAssetID { - GenericHandle get(); + AssetID get(); } /*-----------------------------------------------------------------------------*/ @@ -41,46 +44,23 @@ 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 */ + /*-----------------------------------------------------------------------------*/ + /// + /// 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); + AssetID assetId; }; } - -#include "NativeAsset.h++" diff --git a/SHADE_Managed/src/Components/Renderable.cxx b/SHADE_Managed/src/Components/Renderable.cxx index bc01bc03..819760e6 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) { @@ -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 e8f11ef6..d52a01e5 100644 --- a/SHADE_Managed/src/Components/Renderable.hxx +++ b/SHADE_Managed/src/Components/Renderable.hxx @@ -20,8 +20,9 @@ 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/Material.hxx" +#include "Assets/MeshAsset.hxx" +#include "Graphics/Material.hxx" +#include "Assets/MaterialAsset.hxx" namespace SHADE { @@ -48,10 +49,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. @@ -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 c5859854..88e43823 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) { @@ -51,7 +51,7 @@ namespace SHADE } else { - GetNativeComponent()->SetFont(Handle(Convert::ToNative(value->NativeObjectHandle))); + GetNativeComponent()->SetFont(value->NativeObject); } } } 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); } }; } 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..37d5c27d 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 = 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 = 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 = MaterialAsset(assetId); + return true; + } + return false; } } diff --git a/SHADE_Managed/src/Assets/Material.cxx b/SHADE_Managed/src/Graphics/Material.cxx similarity index 86% rename from SHADE_Managed/src/Assets/Material.cxx rename to SHADE_Managed/src/Graphics/Material.cxx index f4262c2a..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 { @@ -53,15 +54,31 @@ namespace SHADE } /*---------------------------------------------------------------------------------*/ - /* Explicit Template Instantiation */ + /* Properties */ /*---------------------------------------------------------------------------------*/ - template ref class NativeAsset; + Handle Material::NativeObject::get() + try + { + return Handle(Convert::ToNative(matInstHandle)); + } + catch (const BadHandleCastException&) + { + return Handle(); + } + GenericHandle Material::NativeObjectHandle::get() + { + return matInstHandle; + } + AssetID Material::NativeAssetID::get() + { + return SHResourceManagerInterface::GetAssetID(Convert::ToNative(matInstHandle)).value_or(INVALID_ASSET_ID); + } /*---------------------------------------------------------------------------------*/ /* Constructors/Destructor */ /*---------------------------------------------------------------------------------*/ Material::Material(Handle material) - : NativeAsset{ material } + : matInstHandle{ Handle(material) } {} /*---------------------------------------------------------------------------------*/ @@ -116,4 +133,12 @@ namespace SHADE throw gcnew System::ArgumentException("Attempted to retrieve an invalid property on a material."); } + + /*---------------------------------------------------------------------------------*/ + /* Operator Overloads */ + /*---------------------------------------------------------------------------------*/ + Material::operator bool(Material materialInstance) + { + return materialInstance; + } } diff --git a/SHADE_Managed/src/Assets/Material.hxx b/SHADE_Managed/src/Graphics/Material.hxx similarity index 66% rename from SHADE_Managed/src/Assets/Material.hxx rename to SHADE_Managed/src/Graphics/Material.hxx index 25cc96a6..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 @@ -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,21 @@ 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); + + protected: + /*-----------------------------------------------------------------------------*/ + /* Data Members */ + /*-----------------------------------------------------------------------------*/ + GenericHandle matInstHandle; }; } 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 cfa94540..2bf05bc5 100644 --- a/SHADE_Managed/src/Serialisation/SerialisationUtilities.cxx +++ b/SHADE_Managed/src/Serialisation/SerialisationUtilities.cxx @@ -18,11 +18,16 @@ 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" +#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 */ @@ -36,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); @@ -69,7 +83,7 @@ namespace SHADE { using namespace System::Reflection; - // Load the YAML + // Error Checking if (!yamlNode.IsMap()) { // Invalid @@ -80,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) @@ -92,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]); } @@ -129,7 +158,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 +222,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 +249,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 +315,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();