From 78d13c0ab8f69e0cd37641c0e9913aed474d9e5a Mon Sep 17 00:00:00 2001 From: maverickdgg Date: Sat, 1 Oct 2022 14:28:13 +0800 Subject: [PATCH 01/92] Changed some couts and asserts to use SHLOG --- SHADE_Engine/src/ECS_Base/Managers/SHComponentManager.h | 2 +- SHADE_Engine/src/ECS_Base/Managers/SHEntityManager.cpp | 3 ++- SHADE_Engine/src/ECS_Base/Managers/SHEntityManager.h | 2 +- SHADE_Engine/src/ECS_Base/Managers/SHSystemManager.cpp | 2 +- SHADE_Engine/src/ECS_Base/Managers/SHSystemManager.h | 3 ++- 5 files changed, 7 insertions(+), 5 deletions(-) diff --git a/SHADE_Engine/src/ECS_Base/Managers/SHComponentManager.h b/SHADE_Engine/src/ECS_Base/Managers/SHComponentManager.h index 8921fbce..517fb4b9 100644 --- a/SHADE_Engine/src/ECS_Base/Managers/SHComponentManager.h +++ b/SHADE_Engine/src/ECS_Base/Managers/SHComponentManager.h @@ -439,7 +439,7 @@ namespace SHADE { if ((templateIDs[i] == oID)) { - assert("This Component is owned by another group"); + SHLOG_WARNING("Component type already owned by another component group"); } } } diff --git a/SHADE_Engine/src/ECS_Base/Managers/SHEntityManager.cpp b/SHADE_Engine/src/ECS_Base/Managers/SHEntityManager.cpp index bbf8d400..b0332728 100644 --- a/SHADE_Engine/src/ECS_Base/Managers/SHEntityManager.cpp +++ b/SHADE_Engine/src/ECS_Base/Managers/SHEntityManager.cpp @@ -88,7 +88,8 @@ namespace SHADE if (!entityVec[eIndex]) { //There is still an entity stored there.Something went wrong - assert("FATAL ERROR: Entity Creation error. Entity Index Conflict"); + SHLOG_CRITICAL("FATAL ERROR: Entity Creation error. Entity index conflict.") + } //Reset it to a newly constructed entity diff --git a/SHADE_Engine/src/ECS_Base/Managers/SHEntityManager.h b/SHADE_Engine/src/ECS_Base/Managers/SHEntityManager.h index f32ab2c4..fac97339 100644 --- a/SHADE_Engine/src/ECS_Base/Managers/SHEntityManager.h +++ b/SHADE_Engine/src/ECS_Base/Managers/SHEntityManager.h @@ -119,7 +119,7 @@ namespace SHADE if (!entityVec[eIndex]) { //There is still an entity stored there.Something went wrong - assert("FATAL ERROR: Entity Creation error. Entity Index Conflict"); + SHLOG_CRITICAL("FATAL ERROR: Entity Creation error. Entity index conflict.") } //Reset it to a newly constructed entity diff --git a/SHADE_Engine/src/ECS_Base/Managers/SHSystemManager.cpp b/SHADE_Engine/src/ECS_Base/Managers/SHSystemManager.cpp index 551233db..35269863 100644 --- a/SHADE_Engine/src/ECS_Base/Managers/SHSystemManager.cpp +++ b/SHADE_Engine/src/ECS_Base/Managers/SHSystemManager.cpp @@ -29,7 +29,7 @@ namespace SHADE { system.second->Init(); #ifdef _DEBUG - std::cout << system.first << " Init" << std::endl; + SHLOG_INFO("{} Init", system.first); #endif } } diff --git a/SHADE_Engine/src/ECS_Base/Managers/SHSystemManager.h b/SHADE_Engine/src/ECS_Base/Managers/SHSystemManager.h index 995a1cf5..25ff0c15 100644 --- a/SHADE_Engine/src/ECS_Base/Managers/SHSystemManager.h +++ b/SHADE_Engine/src/ECS_Base/Managers/SHSystemManager.h @@ -94,7 +94,8 @@ namespace SHADE if (systemContainer.find(id) == systemContainer.end()) { - std::cout << "System Manager error: System Version " << version << " does not exit." << std::endl; + SHLOG_WARNING("System Manager warning: System Version {} does not exist. Returning as nullptr", version) + return nullptr; } From 5aee22a5e3fc06b02dcdc66ef9f029f130956a71 Mon Sep 17 00:00:00 2001 From: maverickdgg Date: Sat, 1 Oct 2022 16:37:47 +0800 Subject: [PATCH 02/92] Revert "Changed some couts and asserts to use SHLOG" This reverts commit 78d13c0ab8f69e0cd37641c0e9913aed474d9e5a. --- SHADE_Engine/src/ECS_Base/Managers/SHComponentManager.h | 2 +- SHADE_Engine/src/ECS_Base/Managers/SHEntityManager.cpp | 3 +-- SHADE_Engine/src/ECS_Base/Managers/SHEntityManager.h | 2 +- SHADE_Engine/src/ECS_Base/Managers/SHSystemManager.cpp | 2 +- SHADE_Engine/src/ECS_Base/Managers/SHSystemManager.h | 3 +-- 5 files changed, 5 insertions(+), 7 deletions(-) diff --git a/SHADE_Engine/src/ECS_Base/Managers/SHComponentManager.h b/SHADE_Engine/src/ECS_Base/Managers/SHComponentManager.h index 517fb4b9..8921fbce 100644 --- a/SHADE_Engine/src/ECS_Base/Managers/SHComponentManager.h +++ b/SHADE_Engine/src/ECS_Base/Managers/SHComponentManager.h @@ -439,7 +439,7 @@ namespace SHADE { if ((templateIDs[i] == oID)) { - SHLOG_WARNING("Component type already owned by another component group"); + assert("This Component is owned by another group"); } } } diff --git a/SHADE_Engine/src/ECS_Base/Managers/SHEntityManager.cpp b/SHADE_Engine/src/ECS_Base/Managers/SHEntityManager.cpp index b0332728..bbf8d400 100644 --- a/SHADE_Engine/src/ECS_Base/Managers/SHEntityManager.cpp +++ b/SHADE_Engine/src/ECS_Base/Managers/SHEntityManager.cpp @@ -88,8 +88,7 @@ namespace SHADE if (!entityVec[eIndex]) { //There is still an entity stored there.Something went wrong - SHLOG_CRITICAL("FATAL ERROR: Entity Creation error. Entity index conflict.") - + assert("FATAL ERROR: Entity Creation error. Entity Index Conflict"); } //Reset it to a newly constructed entity diff --git a/SHADE_Engine/src/ECS_Base/Managers/SHEntityManager.h b/SHADE_Engine/src/ECS_Base/Managers/SHEntityManager.h index fac97339..f32ab2c4 100644 --- a/SHADE_Engine/src/ECS_Base/Managers/SHEntityManager.h +++ b/SHADE_Engine/src/ECS_Base/Managers/SHEntityManager.h @@ -119,7 +119,7 @@ namespace SHADE if (!entityVec[eIndex]) { //There is still an entity stored there.Something went wrong - SHLOG_CRITICAL("FATAL ERROR: Entity Creation error. Entity index conflict.") + assert("FATAL ERROR: Entity Creation error. Entity Index Conflict"); } //Reset it to a newly constructed entity diff --git a/SHADE_Engine/src/ECS_Base/Managers/SHSystemManager.cpp b/SHADE_Engine/src/ECS_Base/Managers/SHSystemManager.cpp index 35269863..551233db 100644 --- a/SHADE_Engine/src/ECS_Base/Managers/SHSystemManager.cpp +++ b/SHADE_Engine/src/ECS_Base/Managers/SHSystemManager.cpp @@ -29,7 +29,7 @@ namespace SHADE { system.second->Init(); #ifdef _DEBUG - SHLOG_INFO("{} Init", system.first); + std::cout << system.first << " Init" << std::endl; #endif } } diff --git a/SHADE_Engine/src/ECS_Base/Managers/SHSystemManager.h b/SHADE_Engine/src/ECS_Base/Managers/SHSystemManager.h index 25ff0c15..995a1cf5 100644 --- a/SHADE_Engine/src/ECS_Base/Managers/SHSystemManager.h +++ b/SHADE_Engine/src/ECS_Base/Managers/SHSystemManager.h @@ -94,8 +94,7 @@ namespace SHADE if (systemContainer.find(id) == systemContainer.end()) { - SHLOG_WARNING("System Manager warning: System Version {} does not exist. Returning as nullptr", version) - + std::cout << "System Manager error: System Version " << version << " does not exit." << std::endl; return nullptr; } From 488fd51d05d210a264705c8551375b756b544587 Mon Sep 17 00:00:00 2001 From: Kah Wei Date: Thu, 20 Oct 2022 17:07:21 +0800 Subject: [PATCH 03/92] Added Collider component and Ray struct for C# --- SHADE_Managed/src/Components/Collider.cxx | 192 ++++++++++++++++++ SHADE_Managed/src/Components/Collider.h++ | 41 ++++ SHADE_Managed/src/Components/Collider.hxx | 228 ++++++++++++++++++++++ SHADE_Managed/src/Math/Ray.cxx | 28 +++ SHADE_Managed/src/Math/Ray.hxx | 50 +++++ SHADE_Managed/src/Utility/Convert.cxx | 11 ++ SHADE_Managed/src/Utility/Convert.hxx | 14 ++ 7 files changed, 564 insertions(+) create mode 100644 SHADE_Managed/src/Components/Collider.cxx create mode 100644 SHADE_Managed/src/Components/Collider.h++ create mode 100644 SHADE_Managed/src/Components/Collider.hxx create mode 100644 SHADE_Managed/src/Math/Ray.cxx create mode 100644 SHADE_Managed/src/Math/Ray.hxx diff --git a/SHADE_Managed/src/Components/Collider.cxx b/SHADE_Managed/src/Components/Collider.cxx new file mode 100644 index 00000000..e09b7ead --- /dev/null +++ b/SHADE_Managed/src/Components/Collider.cxx @@ -0,0 +1,192 @@ +/************************************************************************************//*! +\file Collider.cxx +\author Tng Kah Wei, kahwei.tng, 390009620 +\par email: kahwei.tng\@digipen.edu +\date Oct 20, 2022 +\brief Contains the definition of the functions of the managed Collider 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 "Collider.hxx" +#include "Utility/Debug.hxx" + +namespace SHADE +{ + /*---------------------------------------------------------------------------------*/ + /* ColliderBound - Constructors */ + /*---------------------------------------------------------------------------------*/ + ColliderBound::ColliderBound(int arrayIdx, Entity attachedEntity) + : arrayIndex { arrayIdx } + , entity { attachedEntity } + {} + + /*---------------------------------------------------------------------------------*/ + /* ColliderBound - Setter Functions */ + /*---------------------------------------------------------------------------------*/ + void ColliderBound::updateArrayIndex(int index) + { + arrayIndex = index; + } + + /*---------------------------------------------------------------------------------*/ + /* BoxColliderBound - Constructors */ + /*---------------------------------------------------------------------------------*/ + BoxColliderBound::BoxColliderBound(int arrayIdx, Entity attachedEntity) + : ColliderBound { arrayIndex, attachedEntity } + {} + + /*---------------------------------------------------------------------------------*/ + /* BoxColliderBound - Properties */ + /*---------------------------------------------------------------------------------*/ + Vector3 BoxColliderBound::Center::get() + { + return Convert::ToCLI(getNativeBoundObject().GetCenter()); + } + void BoxColliderBound::Center::set(Vector3 value) + { + getNativeBoundObject().SetCenter(Convert::ToNative(value)); + } + Vector3 BoxColliderBound::HalfExtents::get() + { + return Convert::ToCLI(getNativeBoundObject().GetHalfExtents()); + } + void BoxColliderBound::HalfExtents::set(Vector3 value) + { + getNativeBoundObject().SetHalfExtents(Convert::ToNative(value)); + } + Vector3 BoxColliderBound::Min::get() + { + return Convert::ToCLI(getNativeBoundObject().GetMin()); + } + void BoxColliderBound::Min::set(Vector3 value) + { + getNativeBoundObject().SetMin(Convert::ToNative(value)); + } + Vector3 BoxColliderBound::Max::get() + { + return Convert::ToCLI(getNativeBoundObject().GetMax()); + } + void BoxColliderBound::Max::set(Vector3 value) + { + getNativeBoundObject().SetMax(Convert::ToNative(value)); + } + + /*---------------------------------------------------------------------------------*/ + /* BoxColliderBound - Usage Functions */ + /*---------------------------------------------------------------------------------*/ + bool BoxColliderBound::TestPoint(Vector3 point) + { + return getNativeBoundObject().TestPoint(Convert::ToNative(point)); + } + bool BoxColliderBound::Raycast(Ray ray, float maxDistance) + { + return getNativeBoundObject().Raycast(Convert::ToNative(ray), maxDistance); + } + + /*---------------------------------------------------------------------------------*/ + /* BoxColliderBound - Properties */ + /*---------------------------------------------------------------------------------*/ + Vector3 SphereColliderBound::Center::get() + { + return Convert::ToCLI(getNativeBoundObject().GetCenter()); + } + void SphereColliderBound::Center::set(Vector3 value) + { + getNativeBoundObject().SetCenter(Convert::ToNative(value)); + } + float SphereColliderBound::Radius::get() + { + return getNativeBoundObject().GetRadius(); + } + void SphereColliderBound::Radius::set(float value) + { + getNativeBoundObject().SetRadius(value); + } + + /*---------------------------------------------------------------------------------*/ + /* SphereColliderBound - Usage Functions */ + /*---------------------------------------------------------------------------------*/ + bool SphereColliderBound::TestPoint(Vector3 point) + { + return getNativeBoundObject().TestPoint(Convert::ToNative(point)); + } + bool SphereColliderBound::Raycast(Ray ray, float maxDistance) + { + return getNativeBoundObject().Raycast(Convert::ToNative(ray), maxDistance); + } + + /*---------------------------------------------------------------------------------*/ + /* SphereColliderBound - Constructors */ + /*---------------------------------------------------------------------------------*/ + SphereColliderBound::SphereColliderBound(int arrayIndex, Entity attachedEntity) + : ColliderBound{ arrayIndex, attachedEntity } + {} + + /*---------------------------------------------------------------------------------*/ + /* Collider - Constructors */ + /*---------------------------------------------------------------------------------*/ + Collider::Collider(Entity entity) + : Component(entity) + {} + + /*---------------------------------------------------------------------------------*/ + /* Collider - Properties */ + /*---------------------------------------------------------------------------------*/ + int Collider::ColliderBoundsCount::get() + { + return static_cast(GetNativeComponent()->GetColliders().size()); + } + + /*---------------------------------------------------------------------------------*/ + /* Collider - ColliderBound Functions */ + /*---------------------------------------------------------------------------------*/ + ColliderBound^ Collider::GetColliderBound(int index) + { + // Populate the list if it hasn't been + if (subColliderList == nullptr) + { + subColliderList = gcnew System::Collections::Generic::List(); + for (const auto& collider : GetNativeComponent()->GetColliders()) + { + ColliderBound^ bound = nullptr; + switch (collider.first.GetType()) + { + case SHCollider::Type::BOX: + bound = gcnew BoxColliderBound(index, Owner.GetEntity()); + break; + case SHCollider::Type::SPHERE: + bound = gcnew SphereColliderBound(index, Owner.GetEntity()); + break; + case SHCollider::Type::CAPSULE: + // TODO + break; + default: + Debug::LogWarning("[Collider] An invalid Collider Type was detected. Skipping."); + break; + } + + // Add into list + subColliderList->Add(bound); + } + } + + // Check if valid + if (index < 0 || index >= subColliderList->Count) + throw gcnew System::ArgumentException("[Collider] Invalid index for Collider Bound retrieval."); + + // Return the bound + return subColliderList[index]; + } + generic + T Collider::GetColliderBound(int index) + { + return safe_cast(GetColliderBound(index)); + } +} diff --git a/SHADE_Managed/src/Components/Collider.h++ b/SHADE_Managed/src/Components/Collider.h++ new file mode 100644 index 00000000..66f77e18 --- /dev/null +++ b/SHADE_Managed/src/Components/Collider.h++ @@ -0,0 +1,41 @@ +/************************************************************************************//*! +\file Collider.h++ +\author Tng Kah Wei, kahwei.tng, 390009620 +\par email: kahwei.tng\@digipen.edu +\date Oct 20, 2022 +\brief Contains the definition of templated functions for the managed Collider + and related 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 "Component.hxx" +namespace SHADE +{ + template + ColliderBoundType& SHADE::ColliderBound::getNativeBoundObject() + { + SHColliderComponent* collider = SHComponentManager::GetComponent_s(entity); + if (!collider) + throw gcnew System::InvalidOperationException("Unable to retrieve Collider component!"); + + try + { + auto& bounds = collider->GetCollider(arrayIndex); + if (bounds.GetType() != SHCollider::Type::BOX) + throw gcnew System::InvalidOperationException("Attempted to retrieve invalid ColliderBound."); + + return reinterpret_cast(bounds); + } + catch (std::invalid_argument&) + { + throw gcnew System::IndexOutOfRangeException("Attempted to retrieve out of range ColliderBound!"); + } + } +} diff --git a/SHADE_Managed/src/Components/Collider.hxx b/SHADE_Managed/src/Components/Collider.hxx new file mode 100644 index 00000000..a831e5f9 --- /dev/null +++ b/SHADE_Managed/src/Components/Collider.hxx @@ -0,0 +1,228 @@ +/************************************************************************************//*! +\file Collider.hxx +\author Tng Kah Wei, kahwei.tng, 390009620 +\par email: kahwei.tng\@digipen.edu +\date Oct 20, 2022 +\brief Contains the definition of the managed Collider class with the + declaration of functions for working with it. + + 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 "Physics/Components/SHColliderComponent.h" +// Project Includes +#include "Components/Component.hxx" +#include "Math/Vector3.hxx" +#include "Utility/Convert.hxx" +#include "Math/Ray.hxx" + +namespace SHADE +{ + /// + /// Base interface for all Collider Shapes. + /// + public ref class ColliderBound + { + public: + /*-----------------------------------------------------------------------------*/ + /* Usage Functions */ + /*-----------------------------------------------------------------------------*/ + /// + /// Checks if the specified point is within this shape's bounds. + /// + /// Point to test with. + /// True if the point is in the shape's bounds. + virtual bool TestPoint(Vector3 point) = 0; + /// + /// Computes a Raycast and checks if there is a collision with any object. + /// + /// The ray to cast. + /// Maximum distance for the raycast check. + /// True if the ray intersects with an object in the scene. + virtual bool Raycast(Ray ray, float maxDistance) = 0; + + protected: + /*-----------------------------------------------------------------------------*/ + /* Constructors */ + /*-----------------------------------------------------------------------------*/ + ColliderBound(int arrayIdx, Entity attachedEntity); + + /*-----------------------------------------------------------------------------*/ + /* Data Members */ + /*-----------------------------------------------------------------------------*/ + int arrayIndex; // Index into the colliders vector on the native object + Entity entity; // Entity holding the collider component that this collider bounds is on + + /*-----------------------------------------------------------------------------*/ + /* Helper Functions */ + /*-----------------------------------------------------------------------------*/ + template + ColliderBoundType& getNativeBoundObject(); + + internal: + /*-----------------------------------------------------------------------------*/ + /* Setter Functions */ + /*-----------------------------------------------------------------------------*/ + void updateArrayIndex(int index); + }; + + /// + /// Box-shaped Collider Bound. + /// + public ref class BoxColliderBound : public ColliderBound + { + public: + /*-----------------------------------------------------------------------------*/ + /* Properties */ + /*-----------------------------------------------------------------------------*/ + /// + /// Center of the Bounding Box formed by this bound. + /// + property Vector3 Center + { + Vector3 get(); + void set(Vector3 value); + } + /// + /// Half of the scale of the Bounding Box formed by this bound. + /// + property Vector3 HalfExtents + { + Vector3 get(); + void set(Vector3 value); + } + /// + /// Position of the bottom left back corner of the Bounding Box formed by this + /// bound. + /// + property Vector3 Min + { + Vector3 get(); + void set(Vector3 value); + } + /// + /// Position of the top right front corner of the Bounding Box formed by this + /// bound. + /// + property Vector3 Max + { + Vector3 get(); + void set(Vector3 value); + } + + /*-----------------------------------------------------------------------------*/ + /* ColliderBound Functions */ + /*-----------------------------------------------------------------------------*/ + /// + bool TestPoint(Vector3 point) override; + /// + bool Raycast(Ray ray, float maxDistance) override; + + internal: + /*-----------------------------------------------------------------------------*/ + /* Constructors */ + /*-----------------------------------------------------------------------------*/ + BoxColliderBound(int arrayIndex, Entity attachedEntity); + }; + + /// + /// Sphere-shaped Collider Bound. + /// + public ref class SphereColliderBound : public ColliderBound + { + public: + /*-----------------------------------------------------------------------------*/ + /* Properties */ + /*-----------------------------------------------------------------------------*/ + /// + /// Center of the Bounding Sphere formed by this bound. + /// + property Vector3 Center + { + Vector3 get(); + void set(Vector3 value); + } + /// + /// Radius of the Bounding Sphere formed by this bound. + /// + property float Radius + { + float get(); + void set(float value); + } + + /*-----------------------------------------------------------------------------*/ + /* ColliderBound Functions */ + /*-----------------------------------------------------------------------------*/ + /// + bool TestPoint(Vector3 point) override; + /// + bool Raycast(Ray ray, float maxDistance) override; + + internal: + /*-----------------------------------------------------------------------------*/ + /* Constructors */ + /*-----------------------------------------------------------------------------*/ + SphereColliderBound(int arrayIndex, Entity attachedEntity); + }; + + /// + /// CLR version of the the SHADE Engine's SHColliderComponent. + /// A single Collider component can contain one or multiple Collider Bounds. + /// + public ref class Collider : public Component + { + internal: + /*-----------------------------------------------------------------------------*/ + /* Constructors */ + /*-----------------------------------------------------------------------------*/ + /// + /// Constructs a Collider Component that represents a native SHColliderComponent + /// component tied to the specified Entity. + /// + /// Entity that this Component will be tied to. + Collider(Entity entity); + + public: + /*-----------------------------------------------------------------------------*/ + /* Properties */ + /*-----------------------------------------------------------------------------*/ + /// + /// Total number of ColliderBounds in the Collider component. + /// + property int ColliderBoundsCount + { + int get(); + } + + /*-----------------------------------------------------------------------------*/ + /* Usage Functions */ + /*-----------------------------------------------------------------------------*/ + /// + /// Retrieves a ColliderBound at the specified index in the ColliderBound list. + /// + /// Index to retrieve a ColliderBound from. + /// ColliderBound for the specified index. + ColliderBound^ GetColliderBound(int index); + /// + /// Retrieves a ColliderBound at the specified index in the ColliderBound list + /// and casts it to the appropriate type. + /// + /// Type of the ColliderBound to cast to. + /// Index to retrieve a ColliderBound from. + /// ColliderBound for the specified index. + generic where T:ColliderBound + T GetColliderBound(int index); + + private: + System::Collections::Generic::List^ subColliderList; // TODO: Update elements in this list if the list on native collider changes + }; +} + +#include "Collider.h++" \ No newline at end of file diff --git a/SHADE_Managed/src/Math/Ray.cxx b/SHADE_Managed/src/Math/Ray.cxx new file mode 100644 index 00000000..ee614cbe --- /dev/null +++ b/SHADE_Managed/src/Math/Ray.cxx @@ -0,0 +1,28 @@ +/************************************************************************************//*! +\file Ray.cxx +\author Tng Kah Wei, kahwei.tng, 390009620 +\par email: kahwei.tng\@digipen.edu +\date Oct 20, 2022 +\brief Contains the definitions of functions of the Vector2 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 "Math/Ray.hxx" + +namespace SHADE +{ + /*---------------------------------------------------------------------------------*/ + /* Constructors */ + /*---------------------------------------------------------------------------------*/ + Ray::Ray(Vector3 origin, Vector3 direction) + : Origin { origin } + , Direction{ direction } + {} +} \ No newline at end of file diff --git a/SHADE_Managed/src/Math/Ray.hxx b/SHADE_Managed/src/Math/Ray.hxx new file mode 100644 index 00000000..c50191f8 --- /dev/null +++ b/SHADE_Managed/src/Math/Ray.hxx @@ -0,0 +1,50 @@ +/************************************************************************************//*! +\file Ray.hxx +\author Tng Kah Wei, kahwei.tng, 390009620 +\par email: kahwei.tng\@digipen.edu +\date Oct 20, 2021 +\brief Contains the definitions of Vector2 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 + +// Project Includes +#include "Vector3.hxx" + +namespace SHADE +{ + /// + /// CLR version of the the SHADE Engine's Ray class that represents a ray in + /// 3-Dimensional space. + /// + public value struct Ray + { + public: + /*-----------------------------------------------------------------------------*/ + /* Public Members */ + /*-----------------------------------------------------------------------------*/ + /// + /// The start point of the ray. + /// + Vector3 Origin; + /// + /// The direction that a ray travels in. + /// + Vector3 Direction; + + /*-----------------------------------------------------------------------------*/ + /* Constructors */ + /*-----------------------------------------------------------------------------*/ + /// + /// Creates a ray starting at origin along direction. + /// + /// Source of the ray. + /// Direction the ray travels in. + Ray(Vector3 origin, Vector3 direction); + }; +} diff --git a/SHADE_Managed/src/Utility/Convert.cxx b/SHADE_Managed/src/Utility/Convert.cxx index 661eb3e4..33c4e4dc 100644 --- a/SHADE_Managed/src/Utility/Convert.cxx +++ b/SHADE_Managed/src/Utility/Convert.cxx @@ -40,6 +40,7 @@ namespace SHADE const double Z = vec.z; return SHVec3(X, Y, Z); } + Vector3 Convert::ToCLI(const SHVec3& vec) { return Vector3(vec.x, vec.y, vec.z); @@ -56,6 +57,16 @@ namespace SHADE return Vector2(vec.x, vec.y); } + SHRay Convert::ToNative(Ray vec) + { + return SHRay(ToNative(vec.Origin), ToNative(vec.Direction)); + } + + Ray Convert::ToCLI(const SHRay& vec) + { + return Ray(ToCLI(vec.position), ToCLI(vec.direction)); + } + /*---------------------------------------------------------------------------------*/ /* String Conversions */ /*---------------------------------------------------------------------------------*/ diff --git a/SHADE_Managed/src/Utility/Convert.hxx b/SHADE_Managed/src/Utility/Convert.hxx index f04cbf4b..fd0ecdce 100644 --- a/SHADE_Managed/src/Utility/Convert.hxx +++ b/SHADE_Managed/src/Utility/Convert.hxx @@ -18,10 +18,12 @@ of DigiPen Institute of Technology is prohibited. #include "ECS_Base/Entity/SHEntity.h" #include "Math/Vector/SHVec2.h" #include "Math/Vector/SHVec3.h" +#include "Math/SHRay.h" // Project Includes #include "Engine/Entity.hxx" #include "Math/Vector2.hxx" #include "Math/Vector3.hxx" +#include "Math/Ray.hxx" namespace SHADE { @@ -74,6 +76,18 @@ namespace SHADE /// The native Vector2 to convert from. /// Managed copy of a native Vector2. static Vector2 ToCLI(const SHVec2& vec); + /// + /// Converts from a managed Vector2 to a native Vector2. + /// + /// The managed Vector2 to convert from. + /// Native copy of a managed Vector2. + static SHRay ToNative(Ray vec); + /// + /// Converts from a native Vector2 to a managed Vector2. + /// + /// The native Vector2 to convert from. + /// Managed copy of a native Vector2. + static Ray ToCLI(const SHRay& vec); /*-----------------------------------------------------------------------------*/ /* String Conversions */ From 1ea482ff387707c28b9396b1e71b74259e9c654a Mon Sep 17 00:00:00 2001 From: Kah Wei Date: Fri, 21 Oct 2022 18:36:56 +0800 Subject: [PATCH 04/92] Added serialization of SHRenderable (only Mesh) --- .../MiddleEnd/Interface/SHRenderable.cpp | 8 +++++ .../MiddleEnd/Interface/SHRenderable.h | 5 ++- SHADE_Engine/src/Resource/SHHandle.hpp | 1 - .../src/Resource/SHResourceManager.hpp | 4 +-- .../src/Serialization/SHSerialization.cpp | 6 ++-- .../Serialization/SHSerializationHelper.hpp | 36 ++++++++++++++++++- 6 files changed, 52 insertions(+), 8 deletions(-) diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHRenderable.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHRenderable.cpp index 0b1c1b66..78687b0c 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHRenderable.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHRenderable.cpp @@ -93,3 +93,11 @@ namespace SHADE oldMaterial = {}; } } + +RTTR_REGISTRATION +{ + using namespace SHADE; + using namespace rttr; + + registration::class_("Renderable Component"); +} \ No newline at end of file diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHRenderable.h b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHRenderable.h index bc885ca2..f80c71db 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHRenderable.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHRenderable.h @@ -11,9 +11,10 @@ of DigiPen Institute of Technology is prohibited. *//*************************************************************************************/ #pragma once +// External Dependencies +#include // Project Includes #include "Resource/SHHandle.h" -//#include "SHTransform.h" #include "ECS_Base/Components/SHComponent.h" #include "Math/SHMatrix.h" #include "SH_API.h" @@ -75,6 +76,8 @@ namespace SHADE Handle material; bool materialChanged = true; Handle oldMaterial; + + RTTR_ENABLE() }; } diff --git a/SHADE_Engine/src/Resource/SHHandle.hpp b/SHADE_Engine/src/Resource/SHHandle.hpp index 53061ac7..c5d14132 100644 --- a/SHADE_Engine/src/Resource/SHHandle.hpp +++ b/SHADE_Engine/src/Resource/SHHandle.hpp @@ -156,7 +156,6 @@ namespace std std::size_t hash, SHADE::Handle>>::operator()( std::pair, SHADE::Handle> const& pair) const { - return std::hash{}(pair.first.GetId().Raw) ^ std::hash{}(pair.second.GetId().Raw); } } diff --git a/SHADE_Engine/src/Resource/SHResourceManager.hpp b/SHADE_Engine/src/Resource/SHResourceManager.hpp index 54ced715..1d86037b 100644 --- a/SHADE_Engine/src/Resource/SHResourceManager.hpp +++ b/SHADE_Engine/src/Resource/SHResourceManager.hpp @@ -135,11 +135,11 @@ namespace SHADE template static std::optional SHResourceManager::GetAssetID(Handle handle) { - const Handle GENERIC_HANDLE = Handle(handle); + const Handle GENERIC_HANDLE = Handle(handle); auto [typedHandleMap, typedAssetIdMap] = getAssetHandleMap(); if (typedAssetIdMap.get().contains(GENERIC_HANDLE)) { - return typedAssetIdMap.GetId()[GENERIC_HANDLE]; + return typedAssetIdMap.get()[GENERIC_HANDLE]; } return {}; diff --git a/SHADE_Engine/src/Serialization/SHSerialization.cpp b/SHADE_Engine/src/Serialization/SHSerialization.cpp index 63583cf2..d5e3af08 100644 --- a/SHADE_Engine/src/Serialization/SHSerialization.cpp +++ b/SHADE_Engine/src/Serialization/SHSerialization.cpp @@ -1,8 +1,8 @@ #include "SHpch.h" -#include "SHSerializationHelper.hpp" -#include "SHSerialization.h" #include +#include "SHSerializationHelper.hpp" +#include "SHSerialization.h" #include "ECS_Base/Managers/SHEntityManager.h" #include "Scene/SHSceneManager.h" @@ -178,7 +178,7 @@ namespace SHADE } if (const auto renderable = SHComponentManager::GetComponent_s(eid)) { - components[rttr::type::get().get_name().data()] = SHSerializationHelper::SerializeComponentToNode(renderable); + components[rttr::type::get().get_name().data()] = *renderable; } if (const auto rigidbody = SHComponentManager::GetComponent_s(eid)) { diff --git a/SHADE_Engine/src/Serialization/SHSerializationHelper.hpp b/SHADE_Engine/src/Serialization/SHSerializationHelper.hpp index da98c885..48689298 100644 --- a/SHADE_Engine/src/Serialization/SHSerializationHelper.hpp +++ b/SHADE_Engine/src/Serialization/SHSerializationHelper.hpp @@ -1,7 +1,7 @@ #pragma once -#include "ECS_Base/Components/SHComponent.h" #include +#include "ECS_Base/Components/SHComponent.h" #include @@ -9,6 +9,40 @@ #include "Math/Vector/SHVec2.h" #include "Math/Vector/SHVec3.h" #include "Math/Vector/SHVec4.h" +#include "Resource/SHResourceManager.h" +#include "Graphics/MiddleEnd/Interface/SHRenderable.h" + +namespace YAML +{ + using namespace SHADE; + template<> + struct convert + { + static constexpr std::string_view MESH_YAML_TAG = "Mesh"; + static constexpr std::string_view MAT_YAML_TAG = "Material"; + + static YAML::Node encode(SHRenderable const& rhs) + { + YAML::Node node; + node[MESH_YAML_TAG.data()] = SHResourceManager::GetAssetID(rhs.Mesh).value_or(0); + node[MAT_YAML_TAG.data()] = 0; // TODO: Asset ID + return node; + } + static bool decode(YAML::Node const& node, SHRenderable& rhs) + { + if (node[MESH_YAML_TAG.data()]) + { + rhs.Mesh = {};//SHResourceManager::LoadOrGet(node[MESH_YAML_TAG].as()); + } + if (node[MAT_YAML_TAG.data()]) + { + // TODO: Convert Asset ID To Material HAndle + } + return true; + } + }; +} + namespace SHADE { From 76f83068baa2c9d5760079f91a5b821945b9381e Mon Sep 17 00:00:00 2001 From: Kah Wei Date: Sat, 22 Oct 2022 02:07:28 +0800 Subject: [PATCH 05/92] Added type information to SHShaderBlockInterface variables --- .../BlockInterface/SHShaderBlockInterface.cpp | 14 ++++++++ .../BlockInterface/SHShaderBlockInterface.h | 13 +++++++ .../Graphics/Shaders/SHShaderReflected.cpp | 34 +++++++++++++++++-- 3 files changed, 58 insertions(+), 3 deletions(-) diff --git a/SHADE_Engine/src/Graphics/Shaders/BlockInterface/SHShaderBlockInterface.cpp b/SHADE_Engine/src/Graphics/Shaders/BlockInterface/SHShaderBlockInterface.cpp index 75ede865..f214c094 100644 --- a/SHADE_Engine/src/Graphics/Shaders/BlockInterface/SHShaderBlockInterface.cpp +++ b/SHADE_Engine/src/Graphics/Shaders/BlockInterface/SHShaderBlockInterface.cpp @@ -14,6 +14,7 @@ namespace SHADE return; } variables.emplace_back(std::move(newVariable)); + variableNames.emplace_back(name); variableIndexing.try_emplace(std::move(name), static_cast(variables.size() - 1)); } @@ -41,6 +42,19 @@ namespace SHADE return variableIndexing.at(variableName); } + const std::string& SHShaderBlockInterface::GetVariableName(uint32_t index) const noexcept + { + if (index < variableNames.size()) + return variableNames.at(index); + + return {}; + } + + size_t SHShaderBlockInterface::GetVariableCount() const noexcept + { + return variables.size(); + } + SHShaderBlockInterface::SHShaderBlockInterface(void) noexcept : bytesRequired{ 0 } {} diff --git a/SHADE_Engine/src/Graphics/Shaders/BlockInterface/SHShaderBlockInterface.h b/SHADE_Engine/src/Graphics/Shaders/BlockInterface/SHShaderBlockInterface.h index e546b452..ae75e2c8 100644 --- a/SHADE_Engine/src/Graphics/Shaders/BlockInterface/SHShaderBlockInterface.h +++ b/SHADE_Engine/src/Graphics/Shaders/BlockInterface/SHShaderBlockInterface.h @@ -12,13 +12,24 @@ namespace SHADE public: struct Variable { + enum class Type + { + OTHER, + FLOAT, + INT, + VECTOR2, + VECTOR3, + VECTOR4 + }; //! Offset of the variable in the block uint32_t offset; + Type type; }; private: //! containers of variable information std::vector variables; + std::vector variableNames; std::unordered_map variableIndexing; //! bytes required by the block (includes padding). This variable is required @@ -29,6 +40,8 @@ namespace SHADE Variable const* const GetVariable (std::string const& variableName) const noexcept; Variable const* const GetVariable(uint32_t index) const noexcept; uint32_t GetVariableIndex(std::string const& variableName) const; + const std::string& GetVariableName(uint32_t index) const noexcept; + size_t GetVariableCount() const noexcept; /*-----------------------------------------------------------------------*/ /* CTORS AND DTORS */ diff --git a/SHADE_Engine/src/Graphics/Shaders/SHShaderReflected.cpp b/SHADE_Engine/src/Graphics/Shaders/SHShaderReflected.cpp index 41327988..90a0c84b 100644 --- a/SHADE_Engine/src/Graphics/Shaders/SHShaderReflected.cpp +++ b/SHADE_Engine/src/Graphics/Shaders/SHShaderReflected.cpp @@ -97,17 +97,45 @@ namespace SHADE switch (member.type_description->op) { case SpvOp::SpvOpTypeFloat: - interfaceHdl->AddVariable(parentVarName + std::string(member.name), SHShaderBlockInterface::Variable(parentOffset + member.offset)); + interfaceHdl->AddVariable + ( + parentVarName + std::string(member.name), + SHShaderBlockInterface::Variable + ( + parentOffset + member.offset, + SHShaderBlockInterface::Variable::Type::FLOAT + ) + ); biggestAlignment = std::max (biggestAlignment, 4u); break; case SpvOp::SpvOpTypeVector: - interfaceHdl->AddVariable(parentVarName + std::string(member.name), SHShaderBlockInterface::Variable(parentOffset + member.offset)); + SHShaderBlockInterface::Variable::Type varType; + switch (dim) + { + case 2: varType = SHShaderBlockInterface::Variable::Type::VECTOR2; break; + case 3: varType = SHShaderBlockInterface::Variable::Type::VECTOR3; break; + case 4: varType = SHShaderBlockInterface::Variable::Type::VECTOR4; break; + default: varType = SHShaderBlockInterface::Variable::Type::OTHER; break; + } + interfaceHdl->AddVariable + ( + parentVarName + std::string(member.name), + SHShaderBlockInterface::Variable(parentOffset + member.offset, varType) + ); if (dim == 3) dim = 4; biggestAlignment = std::max (biggestAlignment, dim * member.type_description->traits.numeric.scalar.width / 8); break; case SpvOp::SpvOpTypeInt: - interfaceHdl->AddVariable(parentVarName + std::string(member.name), SHShaderBlockInterface::Variable(parentOffset + member.offset)); + interfaceHdl->AddVariable + ( + parentVarName + std::string(member.name), + SHShaderBlockInterface::Variable + ( + parentOffset + member.offset, + SHShaderBlockInterface::Variable::Type::INT + ) + ); biggestAlignment = std::max(biggestAlignment, 4u); break; case SpvOp::SpvOpTypeStruct: From 9d8dfd334f5c58636f2bc98273a096bd35847711 Mon Sep 17 00:00:00 2001 From: Kah Wei Date: Sat, 22 Oct 2022 19:38:02 +0800 Subject: [PATCH 06/92] Added serialization interfaces for Material (missing Shader) --- .../MiddleEnd/Interface/SHMaterial.cpp | 6 +- .../Graphics/MiddleEnd/Interface/SHMaterial.h | 16 ++- .../MiddleEnd/Interface/SHMaterial.hpp | 31 ++++- .../Serialization/SHSerializationHelper.hpp | 116 +++++++++++++++++- .../Serialization/SHSerializationTools.cpp | 67 ++++++++++ .../src/Serialization/SHSerializationTools.h | 54 ++++++++ .../src/Serialisation/ReflectionUtilities.cxx | 4 - 7 files changed, 273 insertions(+), 21 deletions(-) create mode 100644 SHADE_Engine/src/Serialization/SHSerializationTools.cpp create mode 100644 SHADE_Engine/src/Serialization/SHSerializationTools.h diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHMaterial.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHMaterial.cpp index 36e30010..b6e1974f 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHMaterial.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHMaterial.cpp @@ -23,7 +23,7 @@ namespace SHADE } // Allocate memory for properties - const Handle SHADER_INFO = getShaderBlockInterface(); + const Handle SHADER_INFO = GetShaderBlockInterface(); propMemorySize = SHADER_INFO ? SHADER_INFO->GetBytesRequired() : 0; if (propMemorySize <= 0) { @@ -59,14 +59,14 @@ namespace SHADE size_t SHMaterial::GetPropertiesMemorySize() const noexcept { - const Handle SHADER_INFO = getShaderBlockInterface(); + const Handle SHADER_INFO = GetShaderBlockInterface(); return SHADER_INFO ? SHADER_INFO->GetBytesRequired() : 0; } /*---------------------------------------------------------------------------------*/ /* Helper Functions */ /*---------------------------------------------------------------------------------*/ - Handle SHMaterial::getShaderBlockInterface() const noexcept + Handle SHMaterial::GetShaderBlockInterface() const noexcept { return pipeline->GetPipelineLayout()->GetShaderBlockInterface ( diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHMaterial.h b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHMaterial.h index ec546fd5..ad7da4a6 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHMaterial.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHMaterial.h @@ -50,13 +50,24 @@ namespace SHADE template void SetProperty(const std::string& key, const T& value); template + void SetProperty(uint32_t memOffset, const T& value); + template T& GetProperty(const std::string& key); template const T& GetProperty(const std::string& key) const; + template + T& GetProperty(uint32_t memOffset); + template + const T& GetProperty(uint32_t memOffset) const; void ResetProperties(); void ExportProperties(void* dest) const noexcept; Byte GetPropertiesMemorySize() const noexcept; + /*-----------------------------------------------------------------------------*/ + /* Query Functions */ + /*-----------------------------------------------------------------------------*/ + Handle GetShaderBlockInterface() const noexcept; + private: /*-----------------------------------------------------------------------------*/ /* Data Members */ @@ -64,11 +75,6 @@ namespace SHADE Handle pipeline; std::unique_ptr propMemory; Byte propMemorySize = 0; - - /*-----------------------------------------------------------------------------*/ - /* Helper Functions */ - /*-----------------------------------------------------------------------------*/ - Handle getShaderBlockInterface() const noexcept; }; } diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHMaterial.hpp b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHMaterial.hpp index 49587921..3e56bfd5 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHMaterial.hpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHMaterial.hpp @@ -25,7 +25,7 @@ namespace SHADE template void SHMaterial::SetProperty(const std::string& key, const T& value) { - const auto SHADER_INFO = getShaderBlockInterface(); + const auto SHADER_INFO = GetShaderBlockInterface(); const auto PROP_INFO = SHADER_INFO->GetVariable(key); if (PROP_INFO == nullptr) { @@ -36,14 +36,25 @@ namespace SHADE T* dataPtr = propMemory.get() + PROP_INFO->offset; *dataPtr = value; } + + template + void SHMaterial::SetProperty(uint32_t memOffset, const T& value) + { + // Check if out of bounds + if (memOffset + sizeof(T) > propMemorySize) + throw std::invalid_argument("Attempted to set an invalid property!"); + // Set + (*reinterpret_cast(propMemory.get() + memOffset)) = value; + } + template T& SHMaterial::GetProperty(const std::string& key) { - const auto SHADER_INFO = getShaderBlockInterface(); + const auto SHADER_INFO = GetShaderBlockInterface(); const auto PROP_INFO = SHADER_INFO->GetVariable(key); if (PROP_INFO == nullptr) { - throw std::invalid_argument("Attempted to set an invalid property!"); + throw std::invalid_argument("Attempted to retrieve an invalid property!"); } // Get offset and return the memory directly @@ -55,5 +66,19 @@ namespace SHADE { return const_cast(const_cast(this)->GetProperty(key)); } + + template + const T& SHMaterial::GetProperty(uint32_t memOffset) const + { + // Check if out of bounds + if (memOffset + sizeof(T) > propMemorySize) + throw std::invalid_argument("Attempted to retrieve an invalid property!"); + return *(reinterpret_cast(propMemory.get() + memOffset)); + } + template + T& SHMaterial::GetProperty(uint32_t memOffset) + { + return const_cast(const_cast(this)->GetProperty(memOffset)); + } } diff --git a/SHADE_Engine/src/Serialization/SHSerializationHelper.hpp b/SHADE_Engine/src/Serialization/SHSerializationHelper.hpp index 48689298..048867a5 100644 --- a/SHADE_Engine/src/Serialization/SHSerializationHelper.hpp +++ b/SHADE_Engine/src/Serialization/SHSerializationHelper.hpp @@ -11,10 +11,117 @@ #include "Math/Vector/SHVec4.h" #include "Resource/SHResourceManager.h" #include "Graphics/MiddleEnd/Interface/SHRenderable.h" +#include "Graphics/MiddleEnd/Interface/SHMaterial.h" +#include "SHSerializationTools.h" namespace YAML { using namespace SHADE; + template<> + struct convert + { + static constexpr std::string_view VERT_SHADER_YAML_TAG = "VertexShader"; + static constexpr std::string_view FRAG_SHADER_YAML_TAG = "FragmentShader"; + static constexpr std::string_view PROPS_YAML_TAG = "Properties"; + + static YAML::Node encode(SHMaterial const& rhs) + { + // Write Properties + YAML::Node propertiesNode; + Handle pipelineProperties = rhs.GetShaderBlockInterface(); + for (int i = 0; i < static_cast(pipelineProperties->GetVariableCount()); ++i) + { + const SHShaderBlockInterface::Variable* VARIABLE = pipelineProperties->GetVariable(i); + if (!VARIABLE) + break; + const std::string& VAR_NAME = pipelineProperties->GetVariableName(i); + YAML::Node propNode; + switch (VARIABLE->type) + { + case SHADE::SHShaderBlockInterface::Variable::Type::FLOAT: + propNode = rhs.GetProperty(VARIABLE->offset); + break; + case SHADE::SHShaderBlockInterface::Variable::Type::INT: + propNode = rhs.GetProperty(VARIABLE->offset); + break; + case SHADE::SHShaderBlockInterface::Variable::Type::VECTOR2: + propNode = SHSerializationTools::ValToYAML(rhs.GetProperty(VARIABLE->offset)); + break; + case SHADE::SHShaderBlockInterface::Variable::Type::VECTOR3: + propNode = SHSerializationTools::ValToYAML(rhs.GetProperty(VARIABLE->offset)); + break; + case SHADE::SHShaderBlockInterface::Variable::Type::VECTOR4: + propNode = SHSerializationTools::ValToYAML(rhs.GetProperty(VARIABLE->offset)); + break; + case SHADE::SHShaderBlockInterface::Variable::Type::OTHER: + default: + continue; + break; + } + propertiesNode[VAR_NAME.data()] = propNode; + } + + // Write Material + YAML::Node node; + + node[VERT_SHADER_YAML_TAG.data()] = 0; + node[FRAG_SHADER_YAML_TAG.data()] = 0; + node[PROPS_YAML_TAG.data()] = propertiesNode; + + return node; + } + static bool decode(YAML::Node const& node, SHMaterial& rhs) + { + if (node[VERT_SHADER_YAML_TAG.data()]) + { + // TODO + } + if (node[FRAG_SHADER_YAML_TAG.data()]) + { + // TODO + } + if (node[PROPS_YAML_TAG.data()]) + { + // Loop through all properties + Handle pipelineProperties = rhs.GetShaderBlockInterface(); + const YAML::Node& PROPS_NODE = node[PROPS_YAML_TAG.data()]; + for (int i = 0; i < static_cast(pipelineProperties->GetVariableCount()); ++i) + { + const std::string& PROP_NAME = pipelineProperties->GetVariableName(i); + const auto& PROP_NODE = PROPS_NODE[PROP_NAME.data()]; + if (PROP_NODE) + { + const std::string& VAR_NAME = pipelineProperties->GetVariableName(i); + const SHShaderBlockInterface::Variable* VARIABLE = pipelineProperties->GetVariable(i); + switch (VARIABLE->type) + { + case SHADE::SHShaderBlockInterface::Variable::Type::FLOAT: + rhs.SetProperty(VARIABLE->offset, PROP_NODE.as()); + break; + case SHADE::SHShaderBlockInterface::Variable::Type::INT: + rhs.SetProperty(VARIABLE->offset, PROP_NODE.as()); + break; + case SHADE::SHShaderBlockInterface::Variable::Type::VECTOR2: + rhs.SetProperty(VARIABLE->offset, SHSerializationTools::YAMLToVec2(PROP_NODE)); + break; + case SHADE::SHShaderBlockInterface::Variable::Type::VECTOR3: + rhs.SetProperty(VARIABLE->offset, SHSerializationTools::YAMLToVec3(PROP_NODE)); + break; + case SHADE::SHShaderBlockInterface::Variable::Type::VECTOR4: + rhs.SetProperty(VARIABLE->offset, SHSerializationTools::YAMLToVec4(PROP_NODE)); + break; + case SHADE::SHShaderBlockInterface::Variable::Type::OTHER: + default: + continue; + break; + } + } + } + } + return true; + } + }; + template<> struct convert { @@ -160,18 +267,15 @@ namespace SHADE auto propType = prop.get_type(); if (propType == rttr::type::get()) { - SHVec4 vec{ propertyNode["X"].as(), propertyNode["Y"].as(), propertyNode["Z"].as(), propertyNode["W"].as() }; - prop.set_value(component, vec); + prop.set_value(component, SHSerializationTools::YAMLToVec4(propertyNode)); } else if (propType == rttr::type::get()) { - SHVec3 vec{ propertyNode["X"].as(), propertyNode["Y"].as(), propertyNode["Z"].as() }; - prop.set_value(component, vec); + prop.set_value(component, SHSerializationTools::YAMLToVec3(propertyNode)); } else if (propType == rttr::type::get()) { - SHVec2 vec{ propertyNode["X"].as(), propertyNode["Y"].as() }; - prop.set_value(component, vec); + prop.set_value(component, SHSerializationTools::YAMLToVec2(propertyNode)); } else if (propType.is_arithmetic()) { diff --git a/SHADE_Engine/src/Serialization/SHSerializationTools.cpp b/SHADE_Engine/src/Serialization/SHSerializationTools.cpp new file mode 100644 index 00000000..86a74613 --- /dev/null +++ b/SHADE_Engine/src/Serialization/SHSerializationTools.cpp @@ -0,0 +1,67 @@ +/************************************************************************************//*! +\file SHSerializationTools.cpp +\author Tng Kah Wei, kahwei.tng, 390009620 +\par email: kahwei.tng\@digipen.edu +\date Oct 22, 2022 +\brief Contains the definition of functions of the SHSerializationTools 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. +*//*************************************************************************************/ +#include "SHpch.h" +#include "SHSerializationTools.h" + +namespace SHADE +{ + /*-----------------------------------------------------------------------------------*/ + /* YAML Serialization Functions */ + /*-----------------------------------------------------------------------------------*/ + YAML::Node SHSerializationTools::ValToYAML(const SHVec2& vec) + { + YAML::Node node; + node.SetStyle(YAML::EmitterStyle::Flow); + node["X"] = vec.x; + node["Y"] = vec.y; + return node; + } + YAML::Node SHSerializationTools::ValToYAML(const SHVec3& vec) + { + YAML::Node node; + node.SetStyle(YAML::EmitterStyle::Flow); + node["X"] = vec.x; + node["Y"] = vec.y; + node["Z"] = vec.z; + return node; + } + YAML::Node SHSerializationTools::ValToYAML(const SHVec4& vec) + { + YAML::Node node; + node.SetStyle(YAML::EmitterStyle::Flow); + node["X"] = vec.x; + node["Y"] = vec.y; + node["Z"] = vec.z; + node["W"] = vec.w; + return node; + } + + /*-----------------------------------------------------------------------------------*/ + /* YAML Deserialization Functions */ + /*-----------------------------------------------------------------------------------*/ + SHVec2 SHSerializationTools::YAMLToVec2(const YAML::Node& node) + { + return SHVec2 { node["X"].as(), node["Y"].as() }; + } + + SHVec3 SHSerializationTools::YAMLToVec3(const YAML::Node& node) + { + return SHVec3 { node["X"].as(), node["Y"].as(), node["Z"].as() }; + } + + SHVec4 SHSerializationTools::YAMLToVec4(const YAML::Node& node) + { + return SHVec4 { node["X"].as(), node["Y"].as(), node["Z"].as(), node["W"].as() }; + } + +} \ No newline at end of file diff --git a/SHADE_Engine/src/Serialization/SHSerializationTools.h b/SHADE_Engine/src/Serialization/SHSerializationTools.h new file mode 100644 index 00000000..3a3f6645 --- /dev/null +++ b/SHADE_Engine/src/Serialization/SHSerializationTools.h @@ -0,0 +1,54 @@ +/************************************************************************************//*! +\file SHSerializationTools.h +\author Tng Kah Wei, kahwei.tng, 390009620 +\par email: kahwei.tng\@digipen.edu +\date Oct 22, 2022 +\brief Contains the class definition of SHSerializationTools. + + +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 +// Project Includes +#include "SH_API.h" +#include "Math/Vector/SHVec2.h" +#include "Math/Vector/SHVec3.h" +#include "Math/Vector/SHVec4.h" + +namespace SHADE +{ + /*************************************************************************************/ + /*! + \brief + Static class that contains useful functions for converting values to YAML Nodes + and vice versa. + */ + /*************************************************************************************/ + class SH_API SHSerializationTools + { + public: + /*---------------------------------------------------------------------------------*/ + /* Constructors */ + /*---------------------------------------------------------------------------------*/ + SHSerializationTools() = delete; + + /*---------------------------------------------------------------------------------*/ + /* YAML Serialization Functions */ + /*---------------------------------------------------------------------------------*/ + static YAML::Node ValToYAML(const SHVec2& vec); + static YAML::Node ValToYAML(const SHVec3& vec); + static YAML::Node ValToYAML(const SHVec4& vec); + + /*---------------------------------------------------------------------------------*/ + /* YAML Deserialization Functions */ + /*---------------------------------------------------------------------------------*/ + static SHVec2 YAMLToVec2(const YAML::Node& node); + static SHVec3 YAMLToVec3(const YAML::Node& node); + static SHVec4 YAMLToVec4(const YAML::Node& node); + }; +} \ No newline at end of file diff --git a/SHADE_Managed/src/Serialisation/ReflectionUtilities.cxx b/SHADE_Managed/src/Serialisation/ReflectionUtilities.cxx index 3e963818..f114d01b 100644 --- a/SHADE_Managed/src/Serialisation/ReflectionUtilities.cxx +++ b/SHADE_Managed/src/Serialisation/ReflectionUtilities.cxx @@ -184,10 +184,6 @@ namespace SHADE void ReflectionUtilities::writeYamlIntoField(System::Reflection::FieldInfo^ fieldInfo, Object^ object, YAML::Node& node) { - if (fieldInfo->FieldType == System::Int16::typeid) - { - fieldInfo->SetValue(object, node.as()); - } if (fieldAssignYaml (fieldInfo, object, node) || fieldAssignYaml (fieldInfo, object, node) || fieldAssignYaml (fieldInfo, object, node) || From 6ea5ae7707e660df3bc29a117fae695756a7747f Mon Sep 17 00:00:00 2001 From: Kah Wei Date: Sat, 22 Oct 2022 21:36:02 +0800 Subject: [PATCH 07/92] Added serialization and deserialization of pipeline on the material (no shader loading yet) --- .../MiddleEnd/Interface/SHGraphicsSystem.cpp | 11 +++- .../MiddleEnd/Interface/SHGraphicsSystem.h | 7 ++- .../RenderGraph/SHRenderGraphNode.cpp | 2 +- .../src/Graphics/RenderGraph/SHSubpass.cpp | 7 ++- .../src/Graphics/RenderGraph/SHSubpass.h | 5 +- .../Serialization/SHSerializationHelper.hpp | 62 ++++++++++++++++--- 6 files changed, 81 insertions(+), 13 deletions(-) diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp index 44404bc7..9d1583b3 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp @@ -158,7 +158,11 @@ namespace SHADE worldRenderGraph->AddResource("Depth Buffer", { SH_ATT_DESC_TYPE_FLAGS::DEPTH_STENCIL }, windowDims.first, windowDims.second, vk::Format::eD32SfloatS8Uint); worldRenderGraph->AddResource("Entity ID", { SH_ATT_DESC_TYPE_FLAGS::COLOR }, windowDims.first, windowDims.second, vk::Format::eR32Uint, 1, vk::ImageUsageFlagBits::eTransferSrc); - auto node = worldRenderGraph->AddNode("G-Buffer", { "Entity ID", "Depth Buffer", "Scene"}, {}); // no predecessors + auto node = worldRenderGraph->AddNode + ( + G_BUFFER_RENDER_GRAPH_NODE_NAME.data(), + { "Entity ID", "Depth Buffer", "Scene"}, {} + ); // no predecessors //First subpass to write to G-Buffer auto gBufferWriteSubpass = node->AddSubpass("G-Buffer Write"); @@ -749,5 +753,10 @@ namespace SHADE } + Handle SHGraphicsSystem::GetPrimaryRenderpass() const noexcept + { + return worldRenderGraph->GetNode(G_BUFFER_RENDER_GRAPH_NODE_NAME.data()); + } + #pragma endregion MISC } diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h index 870325ac..8b52e5c2 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h @@ -286,12 +286,17 @@ namespace SHADE #endif Handle GetMousePickSystem(void) const noexcept {return mousePickSystem;}; Handle GetPostOffscreenRenderSystem(void) const noexcept {return postOffscreenRender;}; + Handle GetPrimaryRenderpass() const noexcept; //SHRenderGraph const& GetRenderGraph(void) const noexcept; //Handle GetRenderPass() const { return renderPass; } private: + /*-----------------------------------------------------------------------------*/ + /* Constants */ + /*-----------------------------------------------------------------------------*/ + static constexpr std::string_view G_BUFFER_RENDER_GRAPH_NODE_NAME = "G-Buffer"; /*-----------------------------------------------------------------------------*/ /* Data Members */ @@ -318,7 +323,7 @@ namespace SHADE SHTextureLibrary texLibrary; SHSamplerCache samplerCache; SHMaterialInstanceCache materialInstanceCache; - // Viewports + // Viewports #ifdef SHEDITOR Handle editorViewport; Handle editorRenderer; diff --git a/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraphNode.cpp b/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraphNode.cpp index 5950426e..097f345c 100644 --- a/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraphNode.cpp +++ b/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraphNode.cpp @@ -235,7 +235,7 @@ namespace SHADE } // Add subpass to container and create mapping for it - subpasses.emplace_back(resourceManager->Create(GetHandle(), subpasses.size(), &resourceAttachmentMapping, ptrToResources)); + subpasses.emplace_back(resourceManager->Create(GetHandle(), subpassName, subpasses.size(), &resourceAttachmentMapping, ptrToResources)); subpassIndexing.try_emplace(subpassName, static_cast(subpasses.size()) - 1u); Handle subpass = subpasses.back(); subpass->Init(*resourceManager); diff --git a/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.cpp b/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.cpp index 7c5021f8..8b5c4b82 100644 --- a/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.cpp +++ b/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.cpp @@ -23,7 +23,7 @@ namespace SHADE */ /***************************************************************************/ - SHSubpass::SHSubpass(Handle const& parent, uint32_t index, std::unordered_map const* mapping, std::unordered_map> const* resources) noexcept + SHSubpass::SHSubpass(Handle const& parent, const std::string& name, uint32_t index, std::unordered_map const* mapping, std::unordered_map> const* resources) noexcept : resourceAttachmentMapping{ mapping } , ptrToResources{ resources } , parentNode{ parent } @@ -32,6 +32,7 @@ namespace SHADE , colorReferences{} , depthReferences{} , inputReferences{} + , name { name } { } @@ -224,4 +225,8 @@ namespace SHADE return parentNode->GetResource(attachmentReference)->GetResourceFormat(); } + const std::string& SHSubpass::GetName() const + { + return name; + } } \ No newline at end of file diff --git a/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.h b/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.h index e5094708..00bea35a 100644 --- a/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.h +++ b/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.h @@ -56,13 +56,15 @@ namespace SHADE //! are always the last things drawn, so DO NOT USE THIS FUNCTIONALITY FOR ANYTHING //! COMPLEX. std::vector&)>> exteriorDrawCalls; + /// For identifying subpasses + std::string name; public: /*-----------------------------------------------------------------------*/ /* CTORS AND DTORS */ /*-----------------------------------------------------------------------*/ - SHSubpass(Handle const& parent, uint32_t index, std::unordered_map const* mapping, std::unordered_map> const* ptrToResources) noexcept; + SHSubpass(Handle const& parent, const std::string& name, uint32_t index, std::unordered_map const* mapping, std::unordered_map> const* ptrToResources) noexcept; SHSubpass(SHSubpass&& rhs) noexcept; SHSubpass& operator=(SHSubpass&& rhs) noexcept; @@ -88,6 +90,7 @@ namespace SHADE Handle GetSuperBatch(void) const noexcept; std::vector const& GetColorAttachmentReferences (void) const noexcept; vk::Format GetFormatFromAttachmentReference (uint32_t attachmentReference) const noexcept; + const std::string& GetName() const; friend class SHRenderGraphNode; friend class SHRenderGraph; diff --git a/SHADE_Engine/src/Serialization/SHSerializationHelper.hpp b/SHADE_Engine/src/Serialization/SHSerializationHelper.hpp index 048867a5..6dafba1d 100644 --- a/SHADE_Engine/src/Serialization/SHSerializationHelper.hpp +++ b/SHADE_Engine/src/Serialization/SHSerializationHelper.hpp @@ -22,6 +22,7 @@ namespace YAML { static constexpr std::string_view VERT_SHADER_YAML_TAG = "VertexShader"; static constexpr std::string_view FRAG_SHADER_YAML_TAG = "FragmentShader"; + static constexpr std::string_view SUBPASS_YAML_TAG = "SubPass"; static constexpr std::string_view PROPS_YAML_TAG = "Properties"; static YAML::Node encode(SHMaterial const& rhs) @@ -61,25 +62,70 @@ namespace YAML propertiesNode[VAR_NAME.data()] = propNode; } + // Get Shader Handles + const auto& SHADERS = rhs.GetPipeline()->GetPipelineLayout()->GetShaderModules(); + Handle vertexShader, fragShader; + for (const auto& shader : SHADERS) + { + const auto FLAG_BITS = shader->GetShaderStageFlagBits(); + if (FLAG_BITS & vk::ShaderStageFlagBits::eVertex) + vertexShader = shader; + else if (FLAG_BITS & vk::ShaderStageFlagBits::eFragment) + fragShader = shader; + } + // Write Material YAML::Node node; - node[VERT_SHADER_YAML_TAG.data()] = 0; - node[FRAG_SHADER_YAML_TAG.data()] = 0; - node[PROPS_YAML_TAG.data()] = propertiesNode; + node[VERT_SHADER_YAML_TAG.data()] = 0; // SHResourceManager::GetAssetID(vertexShader).value_or(0); + node[FRAG_SHADER_YAML_TAG.data()] = 0; // SHResourceManager::GetAssetID(fragShader).value_or(0); + node[SUBPASS_YAML_TAG.data()] = rhs.GetPipeline()->GetPipelineState().GetSubpass()->GetName(); + node[PROPS_YAML_TAG.data()] = propertiesNode; return node; } static bool decode(YAML::Node const& node, SHMaterial& rhs) { + // Retrieve Shader Asset IDs + AssetID vertShaderId = 0; + AssetID fragShaderId = 0; if (node[VERT_SHADER_YAML_TAG.data()]) - { - // TODO - } + vertShaderId = node[VERT_SHADER_YAML_TAG.data()].as(); if (node[FRAG_SHADER_YAML_TAG.data()]) + fragShaderId = node[FRAG_SHADER_YAML_TAG.data()].as(); + + // Ensure that both shaders are present + if (vertShaderId == 0 || fragShaderId == 0) + return false; // No pipeline + + // Get Shader Modules + Handle vertexShader, fragShader; + // vertexShader = SHResourceManager::LoadOrGet(vertShaderId); + // fragShader = SHResourceManager::LoadOrGet(fragShaderId); + + // Get Pipeline Library + if (node[SUBPASS_YAML_TAG.data()]) { - // TODO + auto gfxSystem = SHSystemManager::GetSystem(); + if (!gfxSystem) + return false; + + // Grab subpass from worldRenderer + auto renderPass = gfxSystem->GetPrimaryRenderpass(); + if (!renderPass) + return false; + auto subPass = renderPass->GetSubpass(node[SUBPASS_YAML_TAG.data()].as()); + if (!subPass) + return false; + + // Set Pipeline + rhs.SetPipeline(renderPass->GetOrCreatePipeline + ( + std::make_pair(vertexShader, fragShader), + subPass + )); } + if (node[PROPS_YAML_TAG.data()]) { // Loop through all properties @@ -139,7 +185,7 @@ namespace YAML { if (node[MESH_YAML_TAG.data()]) { - rhs.Mesh = {};//SHResourceManager::LoadOrGet(node[MESH_YAML_TAG].as()); + rhs.Mesh = SHResourceManager::LoadOrGet(node[MESH_YAML_TAG.data()].as()); } if (node[MAT_YAML_TAG.data()]) { From 2bd633c11b5b487e748347076b75327944d06d27 Mon Sep 17 00:00:00 2001 From: Kah Wei Date: Sat, 22 Oct 2022 23:00:50 +0800 Subject: [PATCH 08/92] Added RigidBody component --- SHADE_Managed/src/Components/Collider.hxx | 3 + SHADE_Managed/src/Components/RigidBody.cxx | 197 +++++++++++++++++++++ SHADE_Managed/src/Components/RigidBody.hxx | 150 ++++++++++++++++ 3 files changed, 350 insertions(+) create mode 100644 SHADE_Managed/src/Components/RigidBody.cxx create mode 100644 SHADE_Managed/src/Components/RigidBody.hxx diff --git a/SHADE_Managed/src/Components/Collider.hxx b/SHADE_Managed/src/Components/Collider.hxx index a831e5f9..c85ee21c 100644 --- a/SHADE_Managed/src/Components/Collider.hxx +++ b/SHADE_Managed/src/Components/Collider.hxx @@ -221,6 +221,9 @@ namespace SHADE T GetColliderBound(int index); private: + /*-----------------------------------------------------------------------------*/ + /* Data Members */ + /*-----------------------------------------------------------------------------*/ System::Collections::Generic::List^ subColliderList; // TODO: Update elements in this list if the list on native collider changes }; } diff --git a/SHADE_Managed/src/Components/RigidBody.cxx b/SHADE_Managed/src/Components/RigidBody.cxx new file mode 100644 index 00000000..172b928b --- /dev/null +++ b/SHADE_Managed/src/Components/RigidBody.cxx @@ -0,0 +1,197 @@ +/************************************************************************************//*! +\file RigidBody.cxx +\author Tng Kah Wei, kahwei.tng, 390009620 +\par email: kahwei.tng\@digipen.edu +\date Oct 22, 2022 +\brief Contains the definition of the functions of the managed RigidBody 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 "RigidBody.hxx" + +namespace SHADE +{ + /*---------------------------------------------------------------------------------*/ + /* Constructors */ + /*---------------------------------------------------------------------------------*/ + RigidBody::RigidBody(Entity entity) + : Component(entity) + {} + + /*---------------------------------------------------------------------------------*/ + /* Properties */ + /*---------------------------------------------------------------------------------*/ + bool RigidBody::IsGravityEnabled::get() + { + return GetNativeComponent()->IsGravityEnabled(); + } + void RigidBody::IsGravityEnabled::set(bool value) + { + return GetNativeComponent()->SetGravityEnabled(value); + } + bool RigidBody::IsAllowedToSleep::get() + { + return GetNativeComponent()->IsAllowedToSleep(); + } + void RigidBody::IsAllowedToSleep::set(bool value) + { + return GetNativeComponent()->SetIsAllowedToSleep(value); + } + RigidBody::Type RigidBody::BodyType::get() + { + return static_cast(GetNativeComponent()->GetType()); + } + void RigidBody::BodyType::set(Type value) + { + return GetNativeComponent()->SetType(static_cast(value)); + } + float RigidBody::Mass::get() + { + return GetNativeComponent()->GetMass(); + } + void RigidBody::Mass::set(float value) + { + return GetNativeComponent()->SetMass(value); + } + float RigidBody::Drag::get() + { + return GetNativeComponent()->GetDrag(); + } + void RigidBody::Drag::set(float value) + { + return GetNativeComponent()->SetDrag(value); + } + float RigidBody::AngularDrag::get() + { + return GetNativeComponent()->GetAngularDrag(); + } + void RigidBody::AngularDrag::set(float value) + { + return GetNativeComponent()->SetAngularDrag(value); + } + bool RigidBody::FreezePositionX::get() + { + return GetNativeComponent()->GetFreezePositionX(); + } + void RigidBody::FreezePositionX::set(bool value) + { + return GetNativeComponent()->SetFreezePositionX(value); + } + bool RigidBody::FreezePositionY::get() + { + return GetNativeComponent()->GetFreezePositionY(); + } + void RigidBody::FreezePositionY::set(bool value) + { + return GetNativeComponent()->SetFreezePositionY(value); + } + bool RigidBody::FreezePositionZ::get() + { + return GetNativeComponent()->GetFreezePositionZ(); + } + void RigidBody::FreezePositionZ::set(bool value) + { + return GetNativeComponent()->SetFreezePositionZ(value); + } + bool RigidBody::FreezeRotationX::get() + { + return GetNativeComponent()->GetFreezeRotationX(); + } + void RigidBody::FreezeRotationX::set(bool value) + { + return GetNativeComponent()->SetFreezeRotationX(value); + } + bool RigidBody::FreezeRotationY::get() + { + return GetNativeComponent()->GetFreezeRotationY(); + } + void RigidBody::FreezeRotationY::set(bool value) + { + return GetNativeComponent()->SetFreezeRotationY(value); + } + bool RigidBody::FreezeRotationZ::get() + { + return GetNativeComponent()->GetFreezeRotationZ(); + } + void RigidBody::FreezeRotationZ::set(bool value) + { + return GetNativeComponent()->SetFreezeRotationZ(value); + } + Vector3 RigidBody::LinearVelocity::get() + { + return Convert::ToCLI(GetNativeComponent()->GetLinearVelocity()); + } + void RigidBody::LinearVelocity::set(Vector3 value) + { + return GetNativeComponent()->SetLinearVelocity(Convert::ToNative(value)); + } + Vector3 RigidBody::AngularVelocity::get() + { + return Convert::ToCLI(GetNativeComponent()->GetAngularVelocity()); + } + void RigidBody::AngularVelocity::set(Vector3 value) + { + return GetNativeComponent()->SetAngularVelocity(Convert::ToNative(value)); + } + Vector3 RigidBody::Force::get() + { + return Convert::ToCLI(GetNativeComponent()->GetForce()); + } + Vector3 RigidBody::Torque::get() + { + return Convert::ToCLI(GetNativeComponent()->GetTorque()); + } + + /*---------------------------------------------------------------------------------*/ + /* Force Functions */ + /*---------------------------------------------------------------------------------*/ + void RigidBody::AddForce(Vector3 force) + { + GetNativeComponent()->AddForce(Convert::ToNative(force)); + } + + void RigidBody::AddForceAtLocalPos(Vector3 force, Vector3 localPos) + { + GetNativeComponent()->AddForceAtLocalPos(Convert::ToNative(force), Convert::ToNative(localPos)); + } + + void RigidBody::AddForceAtWorldPos(Vector3 force, Vector3 worldPos) + { + GetNativeComponent()->AddForceAtWorldPos(Convert::ToNative(force), Convert::ToNative(worldPos)); + } + + void RigidBody::AddRelativeForce(Vector3 relativeForce) + { + GetNativeComponent()->AddRelativeForce(Convert::ToNative(relativeForce)); + } + + void RigidBody::AddRelativeForceAtLocalPos(Vector3 relativeForce, Vector3 localPos) + { + GetNativeComponent()->AddRelativeForceAtLocalPos(Convert::ToNative(relativeForce), Convert::ToNative(localPos)); + } + + void RigidBody::AddRelativeForceAtWorldPos(Vector3 relativeForce, Vector3 worldPos) + { + GetNativeComponent()->AddRelativeForceAtWorldPos(Convert::ToNative(relativeForce), Convert::ToNative(worldPos)); + } + + /*---------------------------------------------------------------------------------*/ + /* Torque Functions */ + /*---------------------------------------------------------------------------------*/ + void RigidBody::AddTorque(Vector3 torque) + { + GetNativeComponent()->AddTorque(Convert::ToNative(torque)); + } + + void RigidBody::AddRelativeTorque(Vector3 relativeTorque) + { + GetNativeComponent()->AddRelativeTorque(Convert::ToNative(relativeTorque)); + } +} \ No newline at end of file diff --git a/SHADE_Managed/src/Components/RigidBody.hxx b/SHADE_Managed/src/Components/RigidBody.hxx new file mode 100644 index 00000000..b3e031ba --- /dev/null +++ b/SHADE_Managed/src/Components/RigidBody.hxx @@ -0,0 +1,150 @@ +/************************************************************************************//*! +\file RigidBody.hxx +\author Tng Kah Wei, kahwei.tng, 390009620 +\par email: kahwei.tng\@digipen.edu +\date Oct 22, 2022 +\brief Contains the definition of the managed Collider class with the + declaration of functions for working with it. + + 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 "Physics/Components/SHRigidBodyComponent.h" +// Project Includes +#include "Components/Component.hxx" + +namespace SHADE +{ + /// + /// CLR version of the the SHADE Engine's SHRigidBodyComponent. + /// + public ref class RigidBody : public Component + { + internal: + /*-----------------------------------------------------------------------------*/ + /* Constructors */ + /*-----------------------------------------------------------------------------*/ + /// + /// Constructs a RigidBody Component that represents a native + /// SHRigidBodyComponent component tied to the specified Entity. + /// + /// Entity that this Component will be tied to. + RigidBody(Entity entity); + + public: + /*-----------------------------------------------------------------------------*/ + /* Type Definitions */ + /*-----------------------------------------------------------------------------*/ + enum class Type + { + Static, + Kinematic, + Dynamic + }; + + /*-----------------------------------------------------------------------------*/ + /* Properties */ + /*-----------------------------------------------------------------------------*/ + property bool IsGravityEnabled + { + bool get(); + void set(bool value); + } + property bool IsAllowedToSleep + { + bool get(); + void set(bool value); + } + property Type BodyType + { + Type get(); + void set(Type value); + } + property float Mass + { + float get(); + void set(float value); + } + property float Drag + { + float get(); + void set(float value); + } + property float AngularDrag + { + float get(); + void set(float value); + } + property bool FreezePositionX + { + bool get(); + void set(bool value); + } + property bool FreezePositionY + { + bool get(); + void set(bool value); + } + property bool FreezePositionZ + { + bool get(); + void set(bool value); + } + property bool FreezeRotationX + { + bool get(); + void set(bool value); + } + property bool FreezeRotationY + { + bool get(); + void set(bool value); + } + property bool FreezeRotationZ + { + bool get(); + void set(bool value); + } + property Vector3 LinearVelocity + { + Vector3 get(); + void set(Vector3 value); + } + property Vector3 AngularVelocity + { + Vector3 get(); + void set(Vector3 value); + } + property Vector3 Force + { + Vector3 get(); + } + property Vector3 Torque + { + Vector3 get(); + } + + /*-----------------------------------------------------------------------------*/ + /* Force Functions */ + /*-----------------------------------------------------------------------------*/ + void AddForce(Vector3 force); + void AddForceAtLocalPos(Vector3 force, Vector3 localPos); + void AddForceAtWorldPos(Vector3 force, Vector3 worldPos); + void AddRelativeForce(Vector3 relativeForce); + void AddRelativeForceAtLocalPos(Vector3 relativeForce, Vector3 localPos); + void AddRelativeForceAtWorldPos(Vector3 relativeForce, Vector3 worldPos); + + /*-----------------------------------------------------------------------------*/ + /* Torque Functions */ + /*-----------------------------------------------------------------------------*/ + void AddTorque(Vector3 force); + void AddRelativeTorque(Vector3 relativeForce); + }; + +} \ No newline at end of file From 10a945a35d0d081331dc4c3cd43e6ef27e9f6aa5 Mon Sep 17 00:00:00 2001 From: Kah Wei Date: Sun, 23 Oct 2022 18:20:38 +0800 Subject: [PATCH 09/92] Added SHADE_CSharp --- SHADE_CSharp/premake5.lua | 48 +++++++++++++++++++++++++++++++++++++++ premake5.lua | 1 + 2 files changed, 49 insertions(+) create mode 100644 SHADE_CSharp/premake5.lua diff --git a/SHADE_CSharp/premake5.lua b/SHADE_CSharp/premake5.lua new file mode 100644 index 00000000..c6efa145 --- /dev/null +++ b/SHADE_CSharp/premake5.lua @@ -0,0 +1,48 @@ +project "SHADE_CSharp" + architecture "x64" + kind "SharedLib" + language "C#" + clr "NetCore" + dotnetframework "net5.0" + namespace ("SHADE") + targetdir (outputdir) + objdir (interdir) + systemversion "latest" + + files + { + "%{prj.location}/src/**.cs", + "%{prj.location}/src/**.tt" + } + + flags + { + "MultiProcessorCompile" + } + + dependson + { + "SHADE_Engine" + } + + warnings 'Extra' + + filter "configurations:Debug" + symbols "On" + defines {"_DEBUG"} + + filter "configurations:Release" + optimize "On" + defines{"_RELEASE"} + + require "vstudio" + + function platformsElement(cfg) + _p(2,'x64') + end + + premake.override(premake.vstudio.cs2005.elements, "projectProperties", function (oldfn, cfg) + return table.join(oldfn(cfg), { + platformsElement, + }) + end) \ No newline at end of file diff --git a/premake5.lua b/premake5.lua index cebb5544..35bff9d2 100644 --- a/premake5.lua +++ b/premake5.lua @@ -22,6 +22,7 @@ workspace "SHADE" include "SHADE_Engine" include "SHADE_Application" include "SHADE_Managed" + include "SHADE_CSharp" group "Dependencies" include "Dependencies/msdf" From 51c79d33d619e2a0ae87423f3bea316abd1f5d98 Mon Sep 17 00:00:00 2001 From: Kah Wei Date: Mon, 24 Oct 2022 02:04:05 +0800 Subject: [PATCH 10/92] Added C-style versions of SHLog functions and P/Invoke versions in SHADE_CSharp --- SHADE_CSharp/premake5.lua | 4 ++ SHADE_CSharp/src/Utility/Debug.cs | 37 +++++++++++++++ SHADE_Engine/src/Tools/SHLog.cpp | 20 ++++++++ SHADE_Engine/src/Tools/SHLog.h | 8 ++++ SHADE_Managed/premake5.lua | 3 +- SHADE_Managed/src/Editor/Editor.cxx | 72 +++++++++++++++++------------ 6 files changed, 113 insertions(+), 31 deletions(-) create mode 100644 SHADE_CSharp/src/Utility/Debug.cs diff --git a/SHADE_CSharp/premake5.lua b/SHADE_CSharp/premake5.lua index c6efa145..2d6c1edb 100644 --- a/SHADE_CSharp/premake5.lua +++ b/SHADE_CSharp/premake5.lua @@ -35,6 +35,10 @@ project "SHADE_CSharp" optimize "On" defines{"_RELEASE"} + filter "configurations:Publish" + optimize "On" + defines{"_RELEASE"} + require "vstudio" function platformsElement(cfg) diff --git a/SHADE_CSharp/src/Utility/Debug.cs b/SHADE_CSharp/src/Utility/Debug.cs new file mode 100644 index 00000000..eb9d9b24 --- /dev/null +++ b/SHADE_CSharp/src/Utility/Debug.cs @@ -0,0 +1,37 @@ +using System; +using System.Runtime.InteropServices; + +namespace SHADE +{ + internal static class Debug + { + [DllImport("SHADE_Engine.dll", EntryPoint = "SHLog_Info")] + public static extern void LogInfo([MarshalAs(UnmanagedType.LPStr)] string str); + [DllImport("SHADE_Engine.dll", EntryPoint = "SHLog_Warning")] + public static extern void LogWarning([MarshalAs(UnmanagedType.LPStr)] string str); + [DllImport("SHADE_Engine.dll", EntryPoint = "SHLog_Error")] + public static extern void LogError([MarshalAs(UnmanagedType.LPStr)] string str); + [DllImport("SHADE_Engine.dll", EntryPoint = "SHLog_Critical")] + public static extern void LogCritical([MarshalAs(UnmanagedType.LPStr)] string str); + public static void LogInfo(string msg, Object thrower) + { + LogInfo($"[{thrower.GetType().Name}] {msg}"); + } + public static void LogWarning(string msg, Object thrower) + { + LogWarning($"[{thrower.GetType().Name}] {msg}"); + } + public static void LogError(string msg, Object thrower) + { + LogError($"[{thrower.GetType().Name}] {msg}"); + } + public static void LogCritical(string msg, Object thrower) + { + LogCritical($"[{thrower.GetType().Name}] {msg}"); + } + public static void LogException(Exception exception, Object thrower) + { + LogError($"[{ thrower.GetType().Name }] Unhandled exception: { exception.ToString() }"); + } + } +} \ No newline at end of file diff --git a/SHADE_Engine/src/Tools/SHLog.cpp b/SHADE_Engine/src/Tools/SHLog.cpp index 2d0b7b58..30a79338 100644 --- a/SHADE_Engine/src/Tools/SHLog.cpp +++ b/SHADE_Engine/src/Tools/SHLog.cpp @@ -51,4 +51,24 @@ namespace SHADE } #endif + void SHLog_Info(const char* msg) noexcept + { + SHLOG_INFO(msg) + } + + void SHLog_Warning(const char* msg) noexcept + { + SHLOG_WARNING(msg) + } + + void SHLog_Error(const char* msg) noexcept + { + SHLOG_ERROR(msg) + } + + void SHLog_Critical(const char* msg) noexcept + { + SHLOG_CRITICAL(msg) + } + } diff --git a/SHADE_Engine/src/Tools/SHLog.h b/SHADE_Engine/src/Tools/SHLog.h index b77042db..89dd9206 100644 --- a/SHADE_Engine/src/Tools/SHLog.h +++ b/SHADE_Engine/src/Tools/SHLog.h @@ -45,4 +45,12 @@ namespace SHADE static void Trace(const std::string& msg) noexcept; #endif }; + + extern "C" + { + static void SHLog_Info(const char* msg) noexcept; + static void SHLog_Warning(const char* msg) noexcept; + static void SHLog_Error(const char* msg) noexcept; + static void SHLog_Critical(const char* msg) noexcept; + } } diff --git a/SHADE_Managed/premake5.lua b/SHADE_Managed/premake5.lua index 6d37122c..906511c1 100644 --- a/SHADE_Managed/premake5.lua +++ b/SHADE_Managed/premake5.lua @@ -45,7 +45,8 @@ project "SHADE_Managed" { "yaml-cpp", "imgui", - "SHADE_Engine" + "SHADE_Engine", + "SHADE_CSharp" } disablewarnings diff --git a/SHADE_Managed/src/Editor/Editor.cxx b/SHADE_Managed/src/Editor/Editor.cxx index 120f0274..c2b34d44 100644 --- a/SHADE_Managed/src/Editor/Editor.cxx +++ b/SHADE_Managed/src/Editor/Editor.cxx @@ -68,36 +68,36 @@ using namespace System::Collections::Generic; /// The managed type of the object to edit. /// The native type of the object to edit. /// The SHEditorUI:: function to use for editing. -#define RENDER_FIELD_RANGE(MANAGED_TYPE, NATIVE_TYPE, FUNC) \ -(field->FieldType == MANAGED_TYPE::typeid) \ -{ \ - NATIVE_TYPE val = safe_cast(field->GetValue(object)); \ - NATIVE_TYPE oldVal = val; \ - \ - RangeAttribute^ rangeAttrib = hasAttribute(field); \ - const std::string FIELD_NAME = Convert::ToNative(field->Name); \ - bool changed = false; \ - if (rangeAttrib) \ - { \ - changed = SHEditorUI::InputSlider \ - ( \ - FIELD_NAME, \ - static_cast(rangeAttrib->Min), \ - static_cast(rangeAttrib->Max), \ - val, &isHovered \ - ); \ - } \ - else \ - { \ - changed = SHEditorUI::FUNC(FIELD_NAME, val, &isHovered); \ - } \ - \ - if (changed) \ - { \ - field->SetValue(object, val); \ - registerUndoAction(object, field, val, oldVal); \ - } \ -} \ +#define RENDER_FIELD_RANGE(MANAGED_TYPE, NATIVE_TYPE, FUNC) \ +(field->FieldType == MANAGED_TYPE::typeid) \ +{ \ + NATIVE_TYPE val = safe_cast(field->GetValue(object)); \ + NATIVE_TYPE oldVal = val; \ + \ + RangeAttribute^ rangeAttrib = hasAttribute(field);\ + const std::string FIELD_NAME = Convert::ToNative(field->Name); \ + bool changed = false; \ + if (rangeAttrib) \ + { \ + changed = SHEditorUI::InputSlider \ + ( \ + FIELD_NAME, \ + static_cast(rangeAttrib->Min), \ + static_cast(rangeAttrib->Max), \ + val, &isHovered \ + ); \ + } \ + else \ + { \ + changed = SHEditorUI::FUNC(FIELD_NAME, val, &isHovered); \ + } \ + \ + if (changed) \ + { \ + field->SetValue(object, val); \ + registerUndoAction(object, field, val, oldVal); \ + } \ +} \ /// /// Macro expansion that is used in renderFieldInInspector() to check the type of a field /// named "field" against the specified type and if it matches, retrieves the value of @@ -286,6 +286,18 @@ namespace SHADE registerUndoAction(object, field, Convert::ToCLI(val), Convert::ToCLI(oldVal)); } } + else if (field->FieldType->BaseType == ICallbackEvent::typeid) + { + // Needs to present + // - name and param list + // Needs to present for each callbackaction + // - object, methodinfo OR action + // - Ways to add or remove items + } + else + { + return; + } // Check if the field has a specific attribute TooltipAttribute^ toolTip = hasAttribute(field); From c6d29a10382732f12f57031cf36127f2c2ddb93a Mon Sep 17 00:00:00 2001 From: Kah Wei Date: Mon, 24 Oct 2022 02:04:22 +0800 Subject: [PATCH 11/92] Added CallbackAction and CallbackEvent --- SHADE_CSharp/src/Events/CallbackAction.cs | 812 ++++++++++++++++++++ SHADE_CSharp/src/Events/CallbackAction.tt | 128 ++++ SHADE_CSharp/src/Events/CallbackEvent.cs | 854 ++++++++++++++++++++++ SHADE_CSharp/src/Events/CallbackEvent.tt | 143 ++++ 4 files changed, 1937 insertions(+) create mode 100644 SHADE_CSharp/src/Events/CallbackAction.cs create mode 100644 SHADE_CSharp/src/Events/CallbackAction.tt create mode 100644 SHADE_CSharp/src/Events/CallbackEvent.cs create mode 100644 SHADE_CSharp/src/Events/CallbackEvent.tt diff --git a/SHADE_CSharp/src/Events/CallbackAction.cs b/SHADE_CSharp/src/Events/CallbackAction.cs new file mode 100644 index 00000000..ec34ca5c --- /dev/null +++ b/SHADE_CSharp/src/Events/CallbackAction.cs @@ -0,0 +1,812 @@ +/************************************************************************************//*! +\file CallbackAction.cs +\author Tng Kah Wei, kahwei.tng, 390009620 +\par email: kahwei.tng\@digipen.edu +\date Oct 23, 2022 +\brief Contains the definition of CallbackAction and related classes. + +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. +*//*************************************************************************************/ +using System; +using System.Reflection; + +namespace SHADE +{ + /// + /// Interface for a CallbackAction that all variants inherit from. + /// + public interface ICallbackAction + { + /// + /// Whether or not this CallbackAction is runtime assigned. If it is, then the + /// TargetMethodName and TargetObject properties are invalid. + /// + bool IsRuntimeAction { get; } + /// + /// Name of the method that this CallbackAction is using. + /// + string TargetMethodName { get; } + /// + /// Object which the specified target method is called on. + /// + Object TargetObject { get; } + } + + /// + /// Represents a function call that can be serialised and put togetheer with scripts. + /// This variant accepts functions with 1 parameter. + /// + public class CallbackAction : ICallbackAction + { + #region Properties ------------------------------------------------------------ + /// + public Object TargetObject { get; private set; } + /// + public string TargetMethodName => targetMethod == null ? "" : targetMethod.Name; + /// + public bool IsRuntimeAction => targetAction != null; + #endregion + + #region Fields ------------------------------------------------------------------ + private MethodInfo targetMethod; + private Action targetAction; + private Object[] parameters; + #endregion + + #region Constructors ------------------------------------------------------------ + /// + /// Constructs a CallbackAction that represents a call to the specified method on the + /// specified target. + /// + /// Object to call the method on. + /// Method to call. + /// + /// Thrown if a method that is not compatible with the target is specified. The method's + /// source type must match the target's type. + /// + public CallbackAction(Object target, MethodInfo method) + { + // Error Checks + if (method.DeclaringType != target.GetType()) + throw new ArgumentException("[CallbackAction] Attempted register an action using an incompatible target object and method."); + + // No errors, assign + TargetObject = target; + targetMethod = method; + + // Create storage for parameters for calling + parameters = new Object[1]; + } + /// + /// Constructs a Callback action based on an action. + /// + /// + public CallbackAction(Action action) + { + targetAction = action; + } + #endregion + + #region Usage Functions --------------------------------------------------------- + /// + /// Invokes the CallbackAction's stored method/action with the specified parameters. + /// + public void Invoke(T1 t1) + { + if (targetAction != null) + { + targetAction.Invoke(t1); + } + else if (TargetObject != null && targetMethod != null) + { + parameters[0] = t1; + _ = targetMethod.Invoke(TargetObject, parameters); + } + } + #endregion + } + /// + /// Represents a function call that can be serialised and put togetheer with scripts. + /// This variant accepts functions with 2 parameters. + /// + public class CallbackAction : ICallbackAction + { + #region Properties ------------------------------------------------------------ + /// + public Object TargetObject { get; private set; } + /// + public string TargetMethodName => targetMethod == null ? "" : targetMethod.Name; + /// + public bool IsRuntimeAction => targetAction != null; + #endregion + + #region Fields ------------------------------------------------------------------ + private MethodInfo targetMethod; + private Action targetAction; + private Object[] parameters; + #endregion + + #region Constructors ------------------------------------------------------------ + /// + /// Constructs a CallbackAction that represents a call to the specified method on the + /// specified target. + /// + /// Object to call the method on. + /// Method to call. + /// + /// Thrown if a method that is not compatible with the target is specified. The method's + /// source type must match the target's type. + /// + public CallbackAction(Object target, MethodInfo method) + { + // Error Checks + if (method.DeclaringType != target.GetType()) + throw new ArgumentException("[CallbackAction] Attempted register an action using an incompatible target object and method."); + + // No errors, assign + TargetObject = target; + targetMethod = method; + + // Create storage for parameters for calling + parameters = new Object[1]; + } + /// + /// Constructs a Callback action based on an action. + /// + /// + public CallbackAction(Action action) + { + targetAction = action; + } + #endregion + + #region Usage Functions --------------------------------------------------------- + /// + /// Invokes the CallbackAction's stored method/action with the specified parameters. + /// + public void Invoke(T1 t1, T2 t2) + { + if (targetAction != null) + { + targetAction.Invoke(t1, t2); + } + else if (TargetObject != null && targetMethod != null) + { + parameters[0] = t1; + parameters[1] = t2; + _ = targetMethod.Invoke(TargetObject, parameters); + } + } + #endregion + } + /// + /// Represents a function call that can be serialised and put togetheer with scripts. + /// This variant accepts functions with 3 parameters. + /// + public class CallbackAction : ICallbackAction + { + #region Properties ------------------------------------------------------------ + /// + public Object TargetObject { get; private set; } + /// + public string TargetMethodName => targetMethod == null ? "" : targetMethod.Name; + /// + public bool IsRuntimeAction => targetAction != null; + #endregion + + #region Fields ------------------------------------------------------------------ + private MethodInfo targetMethod; + private Action targetAction; + private Object[] parameters; + #endregion + + #region Constructors ------------------------------------------------------------ + /// + /// Constructs a CallbackAction that represents a call to the specified method on the + /// specified target. + /// + /// Object to call the method on. + /// Method to call. + /// + /// Thrown if a method that is not compatible with the target is specified. The method's + /// source type must match the target's type. + /// + public CallbackAction(Object target, MethodInfo method) + { + // Error Checks + if (method.DeclaringType != target.GetType()) + throw new ArgumentException("[CallbackAction] Attempted register an action using an incompatible target object and method."); + + // No errors, assign + TargetObject = target; + targetMethod = method; + + // Create storage for parameters for calling + parameters = new Object[1]; + } + /// + /// Constructs a Callback action based on an action. + /// + /// + public CallbackAction(Action action) + { + targetAction = action; + } + #endregion + + #region Usage Functions --------------------------------------------------------- + /// + /// Invokes the CallbackAction's stored method/action with the specified parameters. + /// + public void Invoke(T1 t1, T2 t2, T3 t3) + { + if (targetAction != null) + { + targetAction.Invoke(t1, t2, t3); + } + else if (TargetObject != null && targetMethod != null) + { + parameters[0] = t1; + parameters[1] = t2; + parameters[2] = t3; + _ = targetMethod.Invoke(TargetObject, parameters); + } + } + #endregion + } + /// + /// Represents a function call that can be serialised and put togetheer with scripts. + /// This variant accepts functions with 4 parameters. + /// + public class CallbackAction : ICallbackAction + { + #region Properties ------------------------------------------------------------ + /// + public Object TargetObject { get; private set; } + /// + public string TargetMethodName => targetMethod == null ? "" : targetMethod.Name; + /// + public bool IsRuntimeAction => targetAction != null; + #endregion + + #region Fields ------------------------------------------------------------------ + private MethodInfo targetMethod; + private Action targetAction; + private Object[] parameters; + #endregion + + #region Constructors ------------------------------------------------------------ + /// + /// Constructs a CallbackAction that represents a call to the specified method on the + /// specified target. + /// + /// Object to call the method on. + /// Method to call. + /// + /// Thrown if a method that is not compatible with the target is specified. The method's + /// source type must match the target's type. + /// + public CallbackAction(Object target, MethodInfo method) + { + // Error Checks + if (method.DeclaringType != target.GetType()) + throw new ArgumentException("[CallbackAction] Attempted register an action using an incompatible target object and method."); + + // No errors, assign + TargetObject = target; + targetMethod = method; + + // Create storage for parameters for calling + parameters = new Object[1]; + } + /// + /// Constructs a Callback action based on an action. + /// + /// + public CallbackAction(Action action) + { + targetAction = action; + } + #endregion + + #region Usage Functions --------------------------------------------------------- + /// + /// Invokes the CallbackAction's stored method/action with the specified parameters. + /// + public void Invoke(T1 t1, T2 t2, T3 t3, T4 t4) + { + if (targetAction != null) + { + targetAction.Invoke(t1, t2, t3, t4); + } + else if (TargetObject != null && targetMethod != null) + { + parameters[0] = t1; + parameters[1] = t2; + parameters[2] = t3; + parameters[3] = t4; + _ = targetMethod.Invoke(TargetObject, parameters); + } + } + #endregion + } + /// + /// Represents a function call that can be serialised and put togetheer with scripts. + /// This variant accepts functions with 5 parameters. + /// + public class CallbackAction : ICallbackAction + { + #region Properties ------------------------------------------------------------ + /// + public Object TargetObject { get; private set; } + /// + public string TargetMethodName => targetMethod == null ? "" : targetMethod.Name; + /// + public bool IsRuntimeAction => targetAction != null; + #endregion + + #region Fields ------------------------------------------------------------------ + private MethodInfo targetMethod; + private Action targetAction; + private Object[] parameters; + #endregion + + #region Constructors ------------------------------------------------------------ + /// + /// Constructs a CallbackAction that represents a call to the specified method on the + /// specified target. + /// + /// Object to call the method on. + /// Method to call. + /// + /// Thrown if a method that is not compatible with the target is specified. The method's + /// source type must match the target's type. + /// + public CallbackAction(Object target, MethodInfo method) + { + // Error Checks + if (method.DeclaringType != target.GetType()) + throw new ArgumentException("[CallbackAction] Attempted register an action using an incompatible target object and method."); + + // No errors, assign + TargetObject = target; + targetMethod = method; + + // Create storage for parameters for calling + parameters = new Object[1]; + } + /// + /// Constructs a Callback action based on an action. + /// + /// + public CallbackAction(Action action) + { + targetAction = action; + } + #endregion + + #region Usage Functions --------------------------------------------------------- + /// + /// Invokes the CallbackAction's stored method/action with the specified parameters. + /// + public void Invoke(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5) + { + if (targetAction != null) + { + targetAction.Invoke(t1, t2, t3, t4, t5); + } + else if (TargetObject != null && targetMethod != null) + { + parameters[0] = t1; + parameters[1] = t2; + parameters[2] = t3; + parameters[3] = t4; + parameters[4] = t5; + _ = targetMethod.Invoke(TargetObject, parameters); + } + } + #endregion + } + /// + /// Represents a function call that can be serialised and put togetheer with scripts. + /// This variant accepts functions with 6 parameters. + /// + public class CallbackAction : ICallbackAction + { + #region Properties ------------------------------------------------------------ + /// + public Object TargetObject { get; private set; } + /// + public string TargetMethodName => targetMethod == null ? "" : targetMethod.Name; + /// + public bool IsRuntimeAction => targetAction != null; + #endregion + + #region Fields ------------------------------------------------------------------ + private MethodInfo targetMethod; + private Action targetAction; + private Object[] parameters; + #endregion + + #region Constructors ------------------------------------------------------------ + /// + /// Constructs a CallbackAction that represents a call to the specified method on the + /// specified target. + /// + /// Object to call the method on. + /// Method to call. + /// + /// Thrown if a method that is not compatible with the target is specified. The method's + /// source type must match the target's type. + /// + public CallbackAction(Object target, MethodInfo method) + { + // Error Checks + if (method.DeclaringType != target.GetType()) + throw new ArgumentException("[CallbackAction] Attempted register an action using an incompatible target object and method."); + + // No errors, assign + TargetObject = target; + targetMethod = method; + + // Create storage for parameters for calling + parameters = new Object[1]; + } + /// + /// Constructs a Callback action based on an action. + /// + /// + public CallbackAction(Action action) + { + targetAction = action; + } + #endregion + + #region Usage Functions --------------------------------------------------------- + /// + /// Invokes the CallbackAction's stored method/action with the specified parameters. + /// + public void Invoke(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6) + { + if (targetAction != null) + { + targetAction.Invoke(t1, t2, t3, t4, t5, t6); + } + else if (TargetObject != null && targetMethod != null) + { + parameters[0] = t1; + parameters[1] = t2; + parameters[2] = t3; + parameters[3] = t4; + parameters[4] = t5; + parameters[5] = t6; + _ = targetMethod.Invoke(TargetObject, parameters); + } + } + #endregion + } + /// + /// Represents a function call that can be serialised and put togetheer with scripts. + /// This variant accepts functions with 7 parameters. + /// + public class CallbackAction : ICallbackAction + { + #region Properties ------------------------------------------------------------ + /// + public Object TargetObject { get; private set; } + /// + public string TargetMethodName => targetMethod == null ? "" : targetMethod.Name; + /// + public bool IsRuntimeAction => targetAction != null; + #endregion + + #region Fields ------------------------------------------------------------------ + private MethodInfo targetMethod; + private Action targetAction; + private Object[] parameters; + #endregion + + #region Constructors ------------------------------------------------------------ + /// + /// Constructs a CallbackAction that represents a call to the specified method on the + /// specified target. + /// + /// Object to call the method on. + /// Method to call. + /// + /// Thrown if a method that is not compatible with the target is specified. The method's + /// source type must match the target's type. + /// + public CallbackAction(Object target, MethodInfo method) + { + // Error Checks + if (method.DeclaringType != target.GetType()) + throw new ArgumentException("[CallbackAction] Attempted register an action using an incompatible target object and method."); + + // No errors, assign + TargetObject = target; + targetMethod = method; + + // Create storage for parameters for calling + parameters = new Object[1]; + } + /// + /// Constructs a Callback action based on an action. + /// + /// + public CallbackAction(Action action) + { + targetAction = action; + } + #endregion + + #region Usage Functions --------------------------------------------------------- + /// + /// Invokes the CallbackAction's stored method/action with the specified parameters. + /// + public void Invoke(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7) + { + if (targetAction != null) + { + targetAction.Invoke(t1, t2, t3, t4, t5, t6, t7); + } + else if (TargetObject != null && targetMethod != null) + { + parameters[0] = t1; + parameters[1] = t2; + parameters[2] = t3; + parameters[3] = t4; + parameters[4] = t5; + parameters[5] = t6; + parameters[6] = t7; + _ = targetMethod.Invoke(TargetObject, parameters); + } + } + #endregion + } + /// + /// Represents a function call that can be serialised and put togetheer with scripts. + /// This variant accepts functions with 8 parameters. + /// + public class CallbackAction : ICallbackAction + { + #region Properties ------------------------------------------------------------ + /// + public Object TargetObject { get; private set; } + /// + public string TargetMethodName => targetMethod == null ? "" : targetMethod.Name; + /// + public bool IsRuntimeAction => targetAction != null; + #endregion + + #region Fields ------------------------------------------------------------------ + private MethodInfo targetMethod; + private Action targetAction; + private Object[] parameters; + #endregion + + #region Constructors ------------------------------------------------------------ + /// + /// Constructs a CallbackAction that represents a call to the specified method on the + /// specified target. + /// + /// Object to call the method on. + /// Method to call. + /// + /// Thrown if a method that is not compatible with the target is specified. The method's + /// source type must match the target's type. + /// + public CallbackAction(Object target, MethodInfo method) + { + // Error Checks + if (method.DeclaringType != target.GetType()) + throw new ArgumentException("[CallbackAction] Attempted register an action using an incompatible target object and method."); + + // No errors, assign + TargetObject = target; + targetMethod = method; + + // Create storage for parameters for calling + parameters = new Object[1]; + } + /// + /// Constructs a Callback action based on an action. + /// + /// + public CallbackAction(Action action) + { + targetAction = action; + } + #endregion + + #region Usage Functions --------------------------------------------------------- + /// + /// Invokes the CallbackAction's stored method/action with the specified parameters. + /// + public void Invoke(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8) + { + if (targetAction != null) + { + targetAction.Invoke(t1, t2, t3, t4, t5, t6, t7, t8); + } + else if (TargetObject != null && targetMethod != null) + { + parameters[0] = t1; + parameters[1] = t2; + parameters[2] = t3; + parameters[3] = t4; + parameters[4] = t5; + parameters[5] = t6; + parameters[6] = t7; + parameters[7] = t8; + _ = targetMethod.Invoke(TargetObject, parameters); + } + } + #endregion + } + /// + /// Represents a function call that can be serialised and put togetheer with scripts. + /// This variant accepts functions with 9 parameters. + /// + public class CallbackAction : ICallbackAction + { + #region Properties ------------------------------------------------------------ + /// + public Object TargetObject { get; private set; } + /// + public string TargetMethodName => targetMethod == null ? "" : targetMethod.Name; + /// + public bool IsRuntimeAction => targetAction != null; + #endregion + + #region Fields ------------------------------------------------------------------ + private MethodInfo targetMethod; + private Action targetAction; + private Object[] parameters; + #endregion + + #region Constructors ------------------------------------------------------------ + /// + /// Constructs a CallbackAction that represents a call to the specified method on the + /// specified target. + /// + /// Object to call the method on. + /// Method to call. + /// + /// Thrown if a method that is not compatible with the target is specified. The method's + /// source type must match the target's type. + /// + public CallbackAction(Object target, MethodInfo method) + { + // Error Checks + if (method.DeclaringType != target.GetType()) + throw new ArgumentException("[CallbackAction] Attempted register an action using an incompatible target object and method."); + + // No errors, assign + TargetObject = target; + targetMethod = method; + + // Create storage for parameters for calling + parameters = new Object[1]; + } + /// + /// Constructs a Callback action based on an action. + /// + /// + public CallbackAction(Action action) + { + targetAction = action; + } + #endregion + + #region Usage Functions --------------------------------------------------------- + /// + /// Invokes the CallbackAction's stored method/action with the specified parameters. + /// + public void Invoke(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8, T9 t9) + { + if (targetAction != null) + { + targetAction.Invoke(t1, t2, t3, t4, t5, t6, t7, t8, t9); + } + else if (TargetObject != null && targetMethod != null) + { + parameters[0] = t1; + parameters[1] = t2; + parameters[2] = t3; + parameters[3] = t4; + parameters[4] = t5; + parameters[5] = t6; + parameters[6] = t7; + parameters[7] = t8; + parameters[8] = t9; + _ = targetMethod.Invoke(TargetObject, parameters); + } + } + #endregion + } + /// + /// Represents a function call that can be serialised and put togetheer with scripts. + /// This variant accepts functions with 10 parameters. + /// + public class CallbackAction : ICallbackAction + { + #region Properties ------------------------------------------------------------ + /// + public Object TargetObject { get; private set; } + /// + public string TargetMethodName => targetMethod == null ? "" : targetMethod.Name; + /// + public bool IsRuntimeAction => targetAction != null; + #endregion + + #region Fields ------------------------------------------------------------------ + private MethodInfo targetMethod; + private Action targetAction; + private Object[] parameters; + #endregion + + #region Constructors ------------------------------------------------------------ + /// + /// Constructs a CallbackAction that represents a call to the specified method on the + /// specified target. + /// + /// Object to call the method on. + /// Method to call. + /// + /// Thrown if a method that is not compatible with the target is specified. The method's + /// source type must match the target's type. + /// + public CallbackAction(Object target, MethodInfo method) + { + // Error Checks + if (method.DeclaringType != target.GetType()) + throw new ArgumentException("[CallbackAction] Attempted register an action using an incompatible target object and method."); + + // No errors, assign + TargetObject = target; + targetMethod = method; + + // Create storage for parameters for calling + parameters = new Object[1]; + } + /// + /// Constructs a Callback action based on an action. + /// + /// + public CallbackAction(Action action) + { + targetAction = action; + } + #endregion + + #region Usage Functions --------------------------------------------------------- + /// + /// Invokes the CallbackAction's stored method/action with the specified parameters. + /// + public void Invoke(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8, T9 t9, T10 t10) + { + if (targetAction != null) + { + targetAction.Invoke(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10); + } + else if (TargetObject != null && targetMethod != null) + { + parameters[0] = t1; + parameters[1] = t2; + parameters[2] = t3; + parameters[3] = t4; + parameters[4] = t5; + parameters[5] = t6; + parameters[6] = t7; + parameters[7] = t8; + parameters[8] = t9; + parameters[9] = t10; + _ = targetMethod.Invoke(TargetObject, parameters); + } + } + #endregion + } +} diff --git a/SHADE_CSharp/src/Events/CallbackAction.tt b/SHADE_CSharp/src/Events/CallbackAction.tt new file mode 100644 index 00000000..0b1efb83 --- /dev/null +++ b/SHADE_CSharp/src/Events/CallbackAction.tt @@ -0,0 +1,128 @@ +<# +/************************************************************************************//*! +\file CallbackAction.tt +\author Tng Kah Wei, kahwei.tng, 390009620 +\par email: kahwei.tng\@digipen.edu +\date Oct 23, 2022 +\brief Contains the T4 template for the definition of CallbackAction and + related classes. + +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. +*//*************************************************************************************/#> +<#@ template hostspecific="false" language="C#" #> +<#@ output extension=".cs" #> +<# var max = 10; #> +/************************************************************************************//*! +\file CallbackAction.cs +\author Tng Kah Wei, kahwei.tng, 390009620 +\par email: kahwei.tng\@digipen.edu +\date Oct 23, 2022 +\brief Contains the definition of CallbackAction and related classes. + +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. +*//*************************************************************************************/ +using System; +using System.Reflection; + +namespace SHADE +{ + /// + /// Interface for a CallbackAction that all variants inherit from. + /// + public interface ICallbackAction + { + /// + /// Whether or not this CallbackAction is runtime assigned. If it is, then the + /// TargetMethodName and TargetObject properties are invalid. + /// + bool IsRuntimeAction { get; } + /// + /// Name of the method that this CallbackAction is using. + /// + string TargetMethodName { get; } + /// + /// Object which the specified target method is called on. + /// + Object TargetObject { get; } + } + +<# for (int i = 1; i <= max; ++i) { #> + /// + /// Represents a function call that can be serialised and put togetheer with scripts. + /// This variant accepts functions with <#=i#> parameter<# if (i > 1) {#>s<#} #>. + /// + public class CallbackAction<<# for (int t = 1; t < i + 1; ++t) { #>T<#=t#><# if (t != i) { #>, <# } #><# } #>> : ICallbackAction + { + #region Properties ------------------------------------------------------------ + /// + public Object TargetObject { get; private set; } + /// + public string TargetMethodName => targetMethod == null ? "" : targetMethod.Name; + /// + public bool IsRuntimeAction => targetAction != null; + #endregion + + #region Fields ------------------------------------------------------------------ + private MethodInfo targetMethod; + private Action<<# for (int t = 1; t < i + 1; ++t) { #>T<#=t#><# if (t != i) { #>, <# } #><# } #>> targetAction; + private Object[] parameters; + #endregion + + #region Constructors ------------------------------------------------------------ + /// + /// Constructs a CallbackAction that represents a call to the specified method on the + /// specified target. + /// + /// Object to call the method on. + /// Method to call. + /// + /// Thrown if a method that is not compatible with the target is specified. The method's + /// source type must match the target's type. + /// + public CallbackAction(Object target, MethodInfo method) + { + // Error Checks + if (method.DeclaringType != target.GetType()) + throw new ArgumentException("[CallbackAction] Attempted register an action using an incompatible target object and method."); + + // No errors, assign + TargetObject = target; + targetMethod = method; + + // Create storage for parameters for calling + parameters = new Object[1]; + } + /// + /// Constructs a Callback action based on an action. + /// + /// + public CallbackAction(Action<<# for (int t = 1; t < i + 1; ++t) { #>T<#=t#><# if (t != i) { #>, <# } #><# } #>> action) + { + targetAction = action; + } + #endregion + + #region Usage Functions --------------------------------------------------------- + /// + /// Invokes the CallbackAction's stored method/action with the specified parameters. + /// + public void Invoke(<# for (int t = 1; t < i + 1; ++t) { #>T<#=t#> t<#=t#><# if (t != i) { #>, <# } #><# } #>) + { + if (targetAction != null) + { + targetAction.Invoke(<# for (int t = 1; t < i + 1; ++t) { #>t<#=t#><# if (t != i) { #>, <# } #><# } #>); + } + else if (TargetObject != null && targetMethod != null) + { + <# for (int t = 0; t < i; ++t) {#>parameters[<#=t#>] = t<#=t+1#>; + <# } #>_ = targetMethod.Invoke(TargetObject, parameters); + } + } + #endregion + } +<# } #> +} diff --git a/SHADE_CSharp/src/Events/CallbackEvent.cs b/SHADE_CSharp/src/Events/CallbackEvent.cs new file mode 100644 index 00000000..7b30a8ec --- /dev/null +++ b/SHADE_CSharp/src/Events/CallbackEvent.cs @@ -0,0 +1,854 @@ +/************************************************************************************//*! +\file CallbackEvent.cs +\author Tng Kah Wei, kahwei.tng, 390009620 +\par email: kahwei.tng\@digipen.edu +\date Oct 23, 2022 +\brief Contains the definition of CallbackEvent and related classes. + +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. +*//*************************************************************************************/ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Reflection; +using System.Reflection.Metadata.Ecma335; + +namespace SHADE +{ + /// + /// Interface for a CallbackEvent that all variants inherit from. + /// + public interface ICallbackEvent + { + /// + /// Registers an ICallbackAction with the event such that it will be called in + /// future + /// + /// ICallbackAction to register with. + void RegisterAction(ICallbackAction action); + /// + /// Deregisters an ICallbackAction that was previously added. This should + /// only emit a warning if an action that was not previous added was + /// provided. + /// + /// ICallbackAction to remove. + void DeregisterAction(ICallbackAction action); + /// + /// Iterable set of ICallbackActions that were registered to this event. + /// + IEnumerable Actions { get; } + } + + /// + /// A container of CallbackActions that is correlated to a specific scenario as + /// specified by the user of this class. + /// This variant accepts CallbackEvents with 1 generic parameter. + /// + public class CallbackEvent : ICallbackEvent + { + #region Properties -------------------------------------------------------------- + /// + public IEnumerable Actions => actions; + #endregion + + #region Fields ------------------------------------------------------------------ + private List actions = new List(); + #endregion + + #region Usage Functions --------------------------------------------------------- + /// + public void RegisterAction(ICallbackAction action) + { + // Check if valid action + if (action.GetType() != typeof(CallbackAction)) + { + Debug.LogWarning("Attempted to register an invalid CallbackAction type. Ignoring.", this); + return; + } + + actions.Add(action); + } + /// + /// Adds a CallbackAction into the event. + /// + /// CallbackAction to add. + public void RegisterAction(CallbackAction action) + { + actions.Add(action); + } + /// + /// Constructs and adds a CallbackACtion into the event. + /// + /// System.Action to add as a CallbackAction. + public void RegisterAction(Action action) + { + actions.Add(new CallbackAction(action)); + } + /// + /// Constructs and adds a CallbackACtion into the event. + /// + /// Object to call the method on. + /// Method to call. + public void RegisterAction(Object target, MethodInfo method) + { + actions.Add(new CallbackAction(target, method)); + } + /// + public void DeregisterAction(ICallbackAction action) + { + if (!actions.Remove(action)) + { + Debug.LogWarning("Attempted to deregister invalid action. Ignored.", this); + } + } + /// + /// Invokes all stored CallbackActions with the specified parameters. + /// + public void Invoke(T1 t1) + { + foreach (CallbackAction action in actions) + { + try + { + action.Invoke(t1); + } + catch (Exception e) + { + Debug.LogException(e, this); + } + } + } + #endregion + } + /// + /// A container of CallbackActions that is correlated to a specific scenario as + /// specified by the user of this class. + /// This variant accepts CallbackEvents with 1 generic parameter. + /// + public class CallbackEvent : ICallbackEvent + { + #region Properties -------------------------------------------------------------- + /// + public IEnumerable Actions => actions; + #endregion + + #region Fields ------------------------------------------------------------------ + private List actions = new List(); + #endregion + + #region Usage Functions --------------------------------------------------------- + /// + public void RegisterAction(ICallbackAction action) + { + // Check if valid action + if (action.GetType() != typeof(CallbackAction)) + { + Debug.LogWarning("Attempted to register an invalid CallbackAction type. Ignoring.", this); + return; + } + + actions.Add(action); + } + /// + /// Adds a CallbackAction into the event. + /// + /// CallbackAction to add. + public void RegisterAction(CallbackAction action) + { + actions.Add(action); + } + /// + /// Constructs and adds a CallbackACtion into the event. + /// + /// System.Action to add as a CallbackAction. + public void RegisterAction(Action action) + { + actions.Add(new CallbackAction(action)); + } + /// + /// Constructs and adds a CallbackACtion into the event. + /// + /// Object to call the method on. + /// Method to call. + public void RegisterAction(Object target, MethodInfo method) + { + actions.Add(new CallbackAction(target, method)); + } + /// + public void DeregisterAction(ICallbackAction action) + { + if (!actions.Remove(action)) + { + Debug.LogWarning("Attempted to deregister invalid action. Ignored.", this); + } + } + /// + /// Invokes all stored CallbackActions with the specified parameters. + /// + public void Invoke(T1 t1, T2 t2) + { + foreach (CallbackAction action in actions) + { + try + { + action.Invoke(t1, t2); + } + catch (Exception e) + { + Debug.LogException(e, this); + } + } + } + #endregion + } + /// + /// A container of CallbackActions that is correlated to a specific scenario as + /// specified by the user of this class. + /// This variant accepts CallbackEvents with 1 generic parameter. + /// + public class CallbackEvent : ICallbackEvent + { + #region Properties -------------------------------------------------------------- + /// + public IEnumerable Actions => actions; + #endregion + + #region Fields ------------------------------------------------------------------ + private List actions = new List(); + #endregion + + #region Usage Functions --------------------------------------------------------- + /// + public void RegisterAction(ICallbackAction action) + { + // Check if valid action + if (action.GetType() != typeof(CallbackAction)) + { + Debug.LogWarning("Attempted to register an invalid CallbackAction type. Ignoring.", this); + return; + } + + actions.Add(action); + } + /// + /// Adds a CallbackAction into the event. + /// + /// CallbackAction to add. + public void RegisterAction(CallbackAction action) + { + actions.Add(action); + } + /// + /// Constructs and adds a CallbackACtion into the event. + /// + /// System.Action to add as a CallbackAction. + public void RegisterAction(Action action) + { + actions.Add(new CallbackAction(action)); + } + /// + /// Constructs and adds a CallbackACtion into the event. + /// + /// Object to call the method on. + /// Method to call. + public void RegisterAction(Object target, MethodInfo method) + { + actions.Add(new CallbackAction(target, method)); + } + /// + public void DeregisterAction(ICallbackAction action) + { + if (!actions.Remove(action)) + { + Debug.LogWarning("Attempted to deregister invalid action. Ignored.", this); + } + } + /// + /// Invokes all stored CallbackActions with the specified parameters. + /// + public void Invoke(T1 t1, T2 t2, T3 t3) + { + foreach (CallbackAction action in actions) + { + try + { + action.Invoke(t1, t2, t3); + } + catch (Exception e) + { + Debug.LogException(e, this); + } + } + } + #endregion + } + /// + /// A container of CallbackActions that is correlated to a specific scenario as + /// specified by the user of this class. + /// This variant accepts CallbackEvents with 1 generic parameter. + /// + public class CallbackEvent : ICallbackEvent + { + #region Properties -------------------------------------------------------------- + /// + public IEnumerable Actions => actions; + #endregion + + #region Fields ------------------------------------------------------------------ + private List actions = new List(); + #endregion + + #region Usage Functions --------------------------------------------------------- + /// + public void RegisterAction(ICallbackAction action) + { + // Check if valid action + if (action.GetType() != typeof(CallbackAction)) + { + Debug.LogWarning("Attempted to register an invalid CallbackAction type. Ignoring.", this); + return; + } + + actions.Add(action); + } + /// + /// Adds a CallbackAction into the event. + /// + /// CallbackAction to add. + public void RegisterAction(CallbackAction action) + { + actions.Add(action); + } + /// + /// Constructs and adds a CallbackACtion into the event. + /// + /// System.Action to add as a CallbackAction. + public void RegisterAction(Action action) + { + actions.Add(new CallbackAction(action)); + } + /// + /// Constructs and adds a CallbackACtion into the event. + /// + /// Object to call the method on. + /// Method to call. + public void RegisterAction(Object target, MethodInfo method) + { + actions.Add(new CallbackAction(target, method)); + } + /// + public void DeregisterAction(ICallbackAction action) + { + if (!actions.Remove(action)) + { + Debug.LogWarning("Attempted to deregister invalid action. Ignored.", this); + } + } + /// + /// Invokes all stored CallbackActions with the specified parameters. + /// + public void Invoke(T1 t1, T2 t2, T3 t3, T4 t4) + { + foreach (CallbackAction action in actions) + { + try + { + action.Invoke(t1, t2, t3, t4); + } + catch (Exception e) + { + Debug.LogException(e, this); + } + } + } + #endregion + } + /// + /// A container of CallbackActions that is correlated to a specific scenario as + /// specified by the user of this class. + /// This variant accepts CallbackEvents with 1 generic parameter. + /// + public class CallbackEvent : ICallbackEvent + { + #region Properties -------------------------------------------------------------- + /// + public IEnumerable Actions => actions; + #endregion + + #region Fields ------------------------------------------------------------------ + private List actions = new List(); + #endregion + + #region Usage Functions --------------------------------------------------------- + /// + public void RegisterAction(ICallbackAction action) + { + // Check if valid action + if (action.GetType() != typeof(CallbackAction)) + { + Debug.LogWarning("Attempted to register an invalid CallbackAction type. Ignoring.", this); + return; + } + + actions.Add(action); + } + /// + /// Adds a CallbackAction into the event. + /// + /// CallbackAction to add. + public void RegisterAction(CallbackAction action) + { + actions.Add(action); + } + /// + /// Constructs and adds a CallbackACtion into the event. + /// + /// System.Action to add as a CallbackAction. + public void RegisterAction(Action action) + { + actions.Add(new CallbackAction(action)); + } + /// + /// Constructs and adds a CallbackACtion into the event. + /// + /// Object to call the method on. + /// Method to call. + public void RegisterAction(Object target, MethodInfo method) + { + actions.Add(new CallbackAction(target, method)); + } + /// + public void DeregisterAction(ICallbackAction action) + { + if (!actions.Remove(action)) + { + Debug.LogWarning("Attempted to deregister invalid action. Ignored.", this); + } + } + /// + /// Invokes all stored CallbackActions with the specified parameters. + /// + public void Invoke(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5) + { + foreach (CallbackAction action in actions) + { + try + { + action.Invoke(t1, t2, t3, t4, t5); + } + catch (Exception e) + { + Debug.LogException(e, this); + } + } + } + #endregion + } + /// + /// A container of CallbackActions that is correlated to a specific scenario as + /// specified by the user of this class. + /// This variant accepts CallbackEvents with 1 generic parameter. + /// + public class CallbackEvent : ICallbackEvent + { + #region Properties -------------------------------------------------------------- + /// + public IEnumerable Actions => actions; + #endregion + + #region Fields ------------------------------------------------------------------ + private List actions = new List(); + #endregion + + #region Usage Functions --------------------------------------------------------- + /// + public void RegisterAction(ICallbackAction action) + { + // Check if valid action + if (action.GetType() != typeof(CallbackAction)) + { + Debug.LogWarning("Attempted to register an invalid CallbackAction type. Ignoring.", this); + return; + } + + actions.Add(action); + } + /// + /// Adds a CallbackAction into the event. + /// + /// CallbackAction to add. + public void RegisterAction(CallbackAction action) + { + actions.Add(action); + } + /// + /// Constructs and adds a CallbackACtion into the event. + /// + /// System.Action to add as a CallbackAction. + public void RegisterAction(Action action) + { + actions.Add(new CallbackAction(action)); + } + /// + /// Constructs and adds a CallbackACtion into the event. + /// + /// Object to call the method on. + /// Method to call. + public void RegisterAction(Object target, MethodInfo method) + { + actions.Add(new CallbackAction(target, method)); + } + /// + public void DeregisterAction(ICallbackAction action) + { + if (!actions.Remove(action)) + { + Debug.LogWarning("Attempted to deregister invalid action. Ignored.", this); + } + } + /// + /// Invokes all stored CallbackActions with the specified parameters. + /// + public void Invoke(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6) + { + foreach (CallbackAction action in actions) + { + try + { + action.Invoke(t1, t2, t3, t4, t5, t6); + } + catch (Exception e) + { + Debug.LogException(e, this); + } + } + } + #endregion + } + /// + /// A container of CallbackActions that is correlated to a specific scenario as + /// specified by the user of this class. + /// This variant accepts CallbackEvents with 1 generic parameter. + /// + public class CallbackEvent : ICallbackEvent + { + #region Properties -------------------------------------------------------------- + /// + public IEnumerable Actions => actions; + #endregion + + #region Fields ------------------------------------------------------------------ + private List actions = new List(); + #endregion + + #region Usage Functions --------------------------------------------------------- + /// + public void RegisterAction(ICallbackAction action) + { + // Check if valid action + if (action.GetType() != typeof(CallbackAction)) + { + Debug.LogWarning("Attempted to register an invalid CallbackAction type. Ignoring.", this); + return; + } + + actions.Add(action); + } + /// + /// Adds a CallbackAction into the event. + /// + /// CallbackAction to add. + public void RegisterAction(CallbackAction action) + { + actions.Add(action); + } + /// + /// Constructs and adds a CallbackACtion into the event. + /// + /// System.Action to add as a CallbackAction. + public void RegisterAction(Action action) + { + actions.Add(new CallbackAction(action)); + } + /// + /// Constructs and adds a CallbackACtion into the event. + /// + /// Object to call the method on. + /// Method to call. + public void RegisterAction(Object target, MethodInfo method) + { + actions.Add(new CallbackAction(target, method)); + } + /// + public void DeregisterAction(ICallbackAction action) + { + if (!actions.Remove(action)) + { + Debug.LogWarning("Attempted to deregister invalid action. Ignored.", this); + } + } + /// + /// Invokes all stored CallbackActions with the specified parameters. + /// + public void Invoke(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7) + { + foreach (CallbackAction action in actions) + { + try + { + action.Invoke(t1, t2, t3, t4, t5, t6, t7); + } + catch (Exception e) + { + Debug.LogException(e, this); + } + } + } + #endregion + } + /// + /// A container of CallbackActions that is correlated to a specific scenario as + /// specified by the user of this class. + /// This variant accepts CallbackEvents with 1 generic parameter. + /// + public class CallbackEvent : ICallbackEvent + { + #region Properties -------------------------------------------------------------- + /// + public IEnumerable Actions => actions; + #endregion + + #region Fields ------------------------------------------------------------------ + private List actions = new List(); + #endregion + + #region Usage Functions --------------------------------------------------------- + /// + public void RegisterAction(ICallbackAction action) + { + // Check if valid action + if (action.GetType() != typeof(CallbackAction)) + { + Debug.LogWarning("Attempted to register an invalid CallbackAction type. Ignoring.", this); + return; + } + + actions.Add(action); + } + /// + /// Adds a CallbackAction into the event. + /// + /// CallbackAction to add. + public void RegisterAction(CallbackAction action) + { + actions.Add(action); + } + /// + /// Constructs and adds a CallbackACtion into the event. + /// + /// System.Action to add as a CallbackAction. + public void RegisterAction(Action action) + { + actions.Add(new CallbackAction(action)); + } + /// + /// Constructs and adds a CallbackACtion into the event. + /// + /// Object to call the method on. + /// Method to call. + public void RegisterAction(Object target, MethodInfo method) + { + actions.Add(new CallbackAction(target, method)); + } + /// + public void DeregisterAction(ICallbackAction action) + { + if (!actions.Remove(action)) + { + Debug.LogWarning("Attempted to deregister invalid action. Ignored.", this); + } + } + /// + /// Invokes all stored CallbackActions with the specified parameters. + /// + public void Invoke(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8) + { + foreach (CallbackAction action in actions) + { + try + { + action.Invoke(t1, t2, t3, t4, t5, t6, t7, t8); + } + catch (Exception e) + { + Debug.LogException(e, this); + } + } + } + #endregion + } + /// + /// A container of CallbackActions that is correlated to a specific scenario as + /// specified by the user of this class. + /// This variant accepts CallbackEvents with 1 generic parameter. + /// + public class CallbackEvent : ICallbackEvent + { + #region Properties -------------------------------------------------------------- + /// + public IEnumerable Actions => actions; + #endregion + + #region Fields ------------------------------------------------------------------ + private List actions = new List(); + #endregion + + #region Usage Functions --------------------------------------------------------- + /// + public void RegisterAction(ICallbackAction action) + { + // Check if valid action + if (action.GetType() != typeof(CallbackAction)) + { + Debug.LogWarning("Attempted to register an invalid CallbackAction type. Ignoring.", this); + return; + } + + actions.Add(action); + } + /// + /// Adds a CallbackAction into the event. + /// + /// CallbackAction to add. + public void RegisterAction(CallbackAction action) + { + actions.Add(action); + } + /// + /// Constructs and adds a CallbackACtion into the event. + /// + /// System.Action to add as a CallbackAction. + public void RegisterAction(Action action) + { + actions.Add(new CallbackAction(action)); + } + /// + /// Constructs and adds a CallbackACtion into the event. + /// + /// Object to call the method on. + /// Method to call. + public void RegisterAction(Object target, MethodInfo method) + { + actions.Add(new CallbackAction(target, method)); + } + /// + public void DeregisterAction(ICallbackAction action) + { + if (!actions.Remove(action)) + { + Debug.LogWarning("Attempted to deregister invalid action. Ignored.", this); + } + } + /// + /// Invokes all stored CallbackActions with the specified parameters. + /// + public void Invoke(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8, T9 t9) + { + foreach (CallbackAction action in actions) + { + try + { + action.Invoke(t1, t2, t3, t4, t5, t6, t7, t8, t9); + } + catch (Exception e) + { + Debug.LogException(e, this); + } + } + } + #endregion + } + /// + /// A container of CallbackActions that is correlated to a specific scenario as + /// specified by the user of this class. + /// This variant accepts CallbackEvents with 1 generic parameter. + /// + public class CallbackEvent : ICallbackEvent + { + #region Properties -------------------------------------------------------------- + /// + public IEnumerable Actions => actions; + #endregion + + #region Fields ------------------------------------------------------------------ + private List actions = new List(); + #endregion + + #region Usage Functions --------------------------------------------------------- + /// + public void RegisterAction(ICallbackAction action) + { + // Check if valid action + if (action.GetType() != typeof(CallbackAction)) + { + Debug.LogWarning("Attempted to register an invalid CallbackAction type. Ignoring.", this); + return; + } + + actions.Add(action); + } + /// + /// Adds a CallbackAction into the event. + /// + /// CallbackAction to add. + public void RegisterAction(CallbackAction action) + { + actions.Add(action); + } + /// + /// Constructs and adds a CallbackACtion into the event. + /// + /// System.Action to add as a CallbackAction. + public void RegisterAction(Action action) + { + actions.Add(new CallbackAction(action)); + } + /// + /// Constructs and adds a CallbackACtion into the event. + /// + /// Object to call the method on. + /// Method to call. + public void RegisterAction(Object target, MethodInfo method) + { + actions.Add(new CallbackAction(target, method)); + } + /// + public void DeregisterAction(ICallbackAction action) + { + if (!actions.Remove(action)) + { + Debug.LogWarning("Attempted to deregister invalid action. Ignored.", this); + } + } + /// + /// Invokes all stored CallbackActions with the specified parameters. + /// + public void Invoke(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8, T9 t9, T10 t10) + { + foreach (CallbackAction action in actions) + { + try + { + action.Invoke(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10); + } + catch (Exception e) + { + Debug.LogException(e, this); + } + } + } + #endregion + } +} diff --git a/SHADE_CSharp/src/Events/CallbackEvent.tt b/SHADE_CSharp/src/Events/CallbackEvent.tt new file mode 100644 index 00000000..74fadd08 --- /dev/null +++ b/SHADE_CSharp/src/Events/CallbackEvent.tt @@ -0,0 +1,143 @@ +<# +/************************************************************************************//*! +\file CallbackEvent.tt +\author Tng Kah Wei, kahwei.tng, 390009620 +\par email: kahwei.tng\@digipen.edu +\date Oct 23, 2022 +\brief Contains the T4 template for the definition of CallbackEvent and + related classes. + +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. +*//*************************************************************************************/#> +<#@ template hostspecific="false" language="C#" #> +<#@ output extension=".cs" #> +<# var max = 10; #> +/************************************************************************************//*! +\file CallbackEvent.cs +\author Tng Kah Wei, kahwei.tng, 390009620 +\par email: kahwei.tng\@digipen.edu +\date Oct 23, 2022 +\brief Contains the definition of CallbackEvent and related classes. + +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. +*//*************************************************************************************/ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Reflection; +using System.Reflection.Metadata.Ecma335; + +namespace SHADE +{ + /// + /// Interface for a CallbackEvent that all variants inherit from. + /// + public interface ICallbackEvent + { + /// + /// Registers an ICallbackAction with the event such that it will be called in + /// future + /// + /// ICallbackAction to register with. + void RegisterAction(ICallbackAction action); + /// + /// Deregisters an ICallbackAction that was previously added. This should + /// only emit a warning if an action that was not previous added was + /// provided. + /// + /// ICallbackAction to remove. + void DeregisterAction(ICallbackAction action); + /// + /// Iterable set of ICallbackActions that were registered to this event. + /// + IEnumerable Actions { get; } + } + +<# for (int i = 1; i <= max; ++i) { #> + /// + /// A container of CallbackActions that is correlated to a specific scenario as + /// specified by the user of this class. + /// This variant accepts CallbackEvents with 1 generic parameter. + /// + public class CallbackEvent<<# for (int t = 1; t < i + 1; ++t) { #>T<#=t#><# if (t != i) { #>, <# } #><# } #>> : ICallbackEvent + { + #region Properties -------------------------------------------------------------- + /// + public IEnumerable Actions => actions; + #endregion + + #region Fields ------------------------------------------------------------------ + private List actions = new List(); + #endregion + + #region Usage Functions --------------------------------------------------------- + /// + public void RegisterAction(ICallbackAction action) + { + // Check if valid action + if (action.GetType() != typeof(CallbackAction<<# for (int t = 1; t < i + 1; ++t) { #>T<#=t#><# if (t != i) { #>, <# } #><# } #>>)) + { + Debug.LogWarning("Attempted to register an invalid CallbackAction type. Ignoring.", this); + return; + } + + actions.Add(action); + } + /// + /// Adds a CallbackAction into the event. + /// + /// CallbackAction to add. + public void RegisterAction(CallbackAction<<# for (int t = 1; t < i + 1; ++t) { #>T<#=t#><# if (t != i) { #>, <# } #><# } #>> action) + { + actions.Add(action); + } + /// + /// Constructs and adds a CallbackACtion into the event. + /// + /// System.Action to add as a CallbackAction. + public void RegisterAction(Action<<# for (int t = 1; t < i + 1; ++t) { #>T<#=t#><# if (t != i) { #>, <# } #><# } #>> action) + { + actions.Add(new CallbackAction<<# for (int t = 1; t < i + 1; ++t) { #>T<#=t#><# if (t != i) { #>, <# } #><# } #>>(action)); + } + /// + /// Constructs and adds a CallbackACtion into the event. + /// + /// Object to call the method on. + /// Method to call. + public void RegisterAction(Object target, MethodInfo method) + { + actions.Add(new CallbackAction<<# for (int t = 1; t < i + 1; ++t) { #>T<#=t#><# if (t != i) { #>, <# } #><# } #>>(target, method)); + } + /// + public void DeregisterAction(ICallbackAction action) + { + if (!actions.Remove(action)) + { + Debug.LogWarning("Attempted to deregister invalid action. Ignored.", this); + } + } + /// + /// Invokes all stored CallbackActions with the specified parameters. + /// + public void Invoke(<# for (int t = 1; t < i + 1; ++t) { #>T<#=t#> t<#=t#><# if (t != i) { #>, <# } #><# } #>) + { + foreach (CallbackAction<<# for (int t = 1; t < i + 1; ++t) { #>T<#=t#><# if (t != i) { #>, <# } #><# } #>> action in actions) + { + try + { + action.Invoke(<# for (int t = 1; t < i + 1; ++t) { #>t<#=t#><# if (t != i) { #>, <# } #><# } #>); + } + catch (Exception e) + { + Debug.LogException(e, this); + } + } + } + #endregion + } +<# } #> +} From 254fc4e641552e8127b4f97f0ea8c701318eaa9b Mon Sep 17 00:00:00 2001 From: Xiao Qi Date: Mon, 24 Oct 2022 03:54:28 +0800 Subject: [PATCH 12/92] SP3-284 Restructured Shader source loader into asset manager to follow design pattern for loaders and asset data --- .../src/Assets/Asset Types/SHShaderAsset.h | 43 ++++++ .../src/Assets/Libraries/SHAssetLoader.h | 1 + .../src/Assets/Libraries/SHMeshCompiler.cpp | 3 +- .../src/Assets/Libraries/SHMeshCompiler.h | 5 +- .../src/Assets/Libraries/SHMeshLoader.h | 2 +- .../Libraries/SHShaderSourceCompiler.cpp | 142 ++++++++++++++++++ .../Assets/Libraries/SHShaderSourceCompiler.h | 28 ++++ .../Assets/Libraries/SHShaderSourceLoader.cpp | 41 +++++ .../Assets/Libraries/SHShaderSourceLoader.h | 22 +++ SHADE_Engine/src/Assets/SHAssetManager.cpp | 2 +- .../Graphics/MiddleEnd/Shaders/SHShaderType.h | 5 +- 11 files changed, 285 insertions(+), 9 deletions(-) create mode 100644 SHADE_Engine/src/Assets/Asset Types/SHShaderAsset.h create mode 100644 SHADE_Engine/src/Assets/Libraries/SHShaderSourceCompiler.cpp create mode 100644 SHADE_Engine/src/Assets/Libraries/SHShaderSourceCompiler.h create mode 100644 SHADE_Engine/src/Assets/Libraries/SHShaderSourceLoader.cpp create mode 100644 SHADE_Engine/src/Assets/Libraries/SHShaderSourceLoader.h diff --git a/SHADE_Engine/src/Assets/Asset Types/SHShaderAsset.h b/SHADE_Engine/src/Assets/Asset Types/SHShaderAsset.h new file mode 100644 index 00000000..2fdf0cb6 --- /dev/null +++ b/SHADE_Engine/src/Assets/Asset Types/SHShaderAsset.h @@ -0,0 +1,43 @@ +/*************************************************************************//** + * \file SHShaderAsset.h + * \author Brandon Mak + * \date 24 October 2022 + * \brief + * + * 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 + +#include "SHAssetData.h" +#include "SH_API.h" +#include +#include "Graphics/MiddleEnd/Shaders/SHShaderType.h" + +namespace SHADE +{ + struct SH_API SHShaderAsset : SHAssetData + { + /*-----------------------------------------------------------------------*/ + /* MEMBER VARIABLES */ + /*-----------------------------------------------------------------------*/ + //! container storing the spirv binary + std::vector spirvBinary; + + //! For the compilation of the shader. Vulkan backend will use it too + SH_SHADER_TYPE shaderType; + + //! Name of the shader file (without parent path) + std::string name; + + //! id of the shader + uint32_t id; + + SHShaderAsset(void) noexcept; + SHShaderAsset(SHShaderAsset const& rhs) noexcept; + SHShaderAsset(SHShaderAsset&& rhs) noexcept; + SHShaderAsset& operator= (SHShaderAsset&& rhs) noexcept; + SHShaderAsset& operator= (SHShaderAsset const& rhs) noexcept; + }; +} diff --git a/SHADE_Engine/src/Assets/Libraries/SHAssetLoader.h b/SHADE_Engine/src/Assets/Libraries/SHAssetLoader.h index 41595519..63e081af 100644 --- a/SHADE_Engine/src/Assets/Libraries/SHAssetLoader.h +++ b/SHADE_Engine/src/Assets/Libraries/SHAssetLoader.h @@ -10,6 +10,7 @@ *****************************************************************************/ #pragma once +#include "Assets/SHAssetMacros.h" #include "Assets/Asset Types/SHAssetData.h" namespace SHADE diff --git a/SHADE_Engine/src/Assets/Libraries/SHMeshCompiler.cpp b/SHADE_Engine/src/Assets/Libraries/SHMeshCompiler.cpp index 2346714e..335eb631 100644 --- a/SHADE_Engine/src/Assets/Libraries/SHMeshCompiler.cpp +++ b/SHADE_Engine/src/Assets/Libraries/SHMeshCompiler.cpp @@ -18,8 +18,7 @@ std::string SHADE::SHMeshCompiler::CompileMeshBinary(SHMeshAsset const& asset, AssetPath path) noexcept { - std::string newPath{ path.string() }; - newPath = newPath.substr(0, newPath.find_last_of('/') + 1); + std::string newPath{ path.parent_path().string() + '/'}; newPath += asset.header.name + MESH_EXTENSION.data(); std::ofstream file{ newPath, std::ios::out | std::ios::binary | std::ios::trunc }; diff --git a/SHADE_Engine/src/Assets/Libraries/SHMeshCompiler.h b/SHADE_Engine/src/Assets/Libraries/SHMeshCompiler.h index a8ce67be..441c2297 100644 --- a/SHADE_Engine/src/Assets/Libraries/SHMeshCompiler.h +++ b/SHADE_Engine/src/Assets/Libraries/SHMeshCompiler.h @@ -12,14 +12,13 @@ *****************************************************************************/ #pragma once -#include "../Asset Types/SHMeshAsset.h" -#include "../SHAssetMacros.h" +#include "Assets/Asset Types/SHMeshAsset.h" +#include "Assets/SHAssetMacros.h" namespace SHADE { class SHMeshCompiler { - private: public: static std::string CompileMeshBinary(SHMeshAsset const& asset, AssetPath path) noexcept; }; diff --git a/SHADE_Engine/src/Assets/Libraries/SHMeshLoader.h b/SHADE_Engine/src/Assets/Libraries/SHMeshLoader.h index 34c4e5d2..706d65d6 100644 --- a/SHADE_Engine/src/Assets/Libraries/SHMeshLoader.h +++ b/SHADE_Engine/src/Assets/Libraries/SHMeshLoader.h @@ -16,7 +16,7 @@ namespace SHADE { - struct SHMeshLoader : public SHAssetLoader + struct SHMeshLoader : SHAssetLoader { void LoadSHMesh(AssetPath path, SHMeshAsset& meshes) noexcept; SHAssetData* Load(AssetPath path) override; diff --git a/SHADE_Engine/src/Assets/Libraries/SHShaderSourceCompiler.cpp b/SHADE_Engine/src/Assets/Libraries/SHShaderSourceCompiler.cpp new file mode 100644 index 00000000..c9674b2e --- /dev/null +++ b/SHADE_Engine/src/Assets/Libraries/SHShaderSourceCompiler.cpp @@ -0,0 +1,142 @@ +/*************************************************************************//** + * \file SHShaderSourceCompiler.cpp + * \author Loh Xiao Qi + * \date 23 10 2022 + * \brief + * + * 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. + *****************************************************************************/ +#include "SHpch.h" +#include "SHShaderSourceCompiler.h" +#include "shaderc/shaderc.hpp" + +#include +#include +#include +#include + +namespace SHADE +{ + std::string SHShaderSourceCompiler::CompileShaderSourceToBinary(AssetPath path, SHShaderAsset const& data) noexcept + { + std::string newPath{ path.string() + SHADER_SPRV_EXTENSION.data() }; + + std::ofstream file{ newPath, std::ios::binary | std::ios::out | std::ios::trunc }; + + file.write( + reinterpret_cast(& data.shaderType), sizeof(uint8_t) + ); + + size_t const byteCount = sizeof(uint32_t) * data.spirvBinary.size(); + + file.write( + reinterpret_cast(&byteCount), sizeof(size_t) + ); + + file.write( + reinterpret_cast(data.spirvBinary.data()), byteCount + ); + + file.close(); + + return newPath; + } + + SHShaderAsset const* SHShaderSourceCompiler::CompileShaderSourceToMemory(std::string const& data, std::string const& name, SH_SHADER_TYPE type) noexcept + { + // shaderc compiler + shaderc::Compiler compiler; + shaderc::CompileOptions options; + + options.AddMacroDefinition("MY_DEFINE", "1"); + + //TODO: Check if we need optimisation levels when compiling into spirv + // Set optimization levels + //if (opLevel != shaderc_optimization_level_zero) + // options.SetOptimizationLevel(opLevel); + + // Attempt to get the shaderc equivalent shader stage + shaderc_shader_kind shaderKind; + switch (type) + { + case SH_SHADER_TYPE::VERTEX: + shaderKind = shaderc_shader_kind::shaderc_glsl_vertex_shader; + break; + case SH_SHADER_TYPE::FRAGMENT: + shaderKind = shaderc_shader_kind::shaderc_glsl_fragment_shader; + break; + case SH_SHADER_TYPE::COMPUTE: + shaderKind = shaderc_shader_kind::shaderc_glsl_compute_shader; + break; + default: + shaderKind = shaderc_shader_kind::shaderc_glsl_vertex_shader; + break; + } + + // Compile the shader and get the result + shaderc::SpvCompilationResult compileResult = compiler.CompileGlslToSpv(data, shaderKind, name.c_str(), options); + + if (compileResult.GetCompilationStatus() != shaderc_compilation_status_success) + { + SHLOG_ERROR("Shaderc failed to compile GLSL shader to binary | " + compileResult.GetErrorMessage()); + return nullptr; + } + + auto result = new SHShaderAsset(); + result->spirvBinary.reserve(compileResult.end() - compileResult.begin()); + + std::ranges::copy(compileResult.begin(), compileResult.end(), result->spirvBinary.data()); + + return result; + } + + SH_SHADER_TYPE SHShaderSourceCompiler::GetShaderTypeFromFilename(std::string name) noexcept + { + for (auto i { 0}; i < SHADER_TYPE_MAX_COUNT; ++i) + { + if (name.find(SHADER_IDENTIFIERS[i].data()) != std::string::npos) + { + return static_cast(i); + } + } + + return SH_SHADER_TYPE::INAVLID_TYPE; + } + + std::optional SHShaderSourceCompiler::LoadAndCompileShader(AssetPath path) noexcept + { + auto type = GetShaderTypeFromFilename(path.filename().string()); + + if (type == SH_SHADER_TYPE::INAVLID_TYPE) + { + SHLOG_ERROR("Invalid filename for shaders, follow suffix in SHAssetMacros.h: {}", path.string()); + return {}; + } + + std::ifstream file{ path.string(), std::ios::in }; + + if (file.is_open()) + { + std::stringstream stream; + + stream << file.rdbuf(); + + std::string const content = stream.str(); + + auto data = CompileShaderSourceToMemory(content, path.filename().string(), type); + + if (data == nullptr) + { + return{}; + } + + return CompileShaderSourceToBinary(path, *data); + } + + SHLOG_ERROR("Unable to open shader file: {}", path.string()); + + return {}; + } +} diff --git a/SHADE_Engine/src/Assets/Libraries/SHShaderSourceCompiler.h b/SHADE_Engine/src/Assets/Libraries/SHShaderSourceCompiler.h new file mode 100644 index 00000000..b2b8bca3 --- /dev/null +++ b/SHADE_Engine/src/Assets/Libraries/SHShaderSourceCompiler.h @@ -0,0 +1,28 @@ +/*************************************************************************//** + * \file SHShaderSourceCompiler.h + * \author Loh Xiao Qi + * \date 23 10 2022 + * \brief + * + * 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 + +#include "Assets/SHAssetMacros.h" +#include "Assets/Asset Types/SHShaderAsset.h" + +namespace SHADE +{ + class SHShaderSourceCompiler + { + static std::string CompileShaderSourceToBinary(AssetPath path, SHShaderAsset const& data) noexcept; + static SHShaderAsset const* CompileShaderSourceToMemory(std::string const& data, std::string const& name, SH_SHADER_TYPE type) noexcept; + + static SH_SHADER_TYPE GetShaderTypeFromFilename(std::string name) noexcept; + + public: + static std::optional LoadAndCompileShader(AssetPath path) noexcept; + }; +} diff --git a/SHADE_Engine/src/Assets/Libraries/SHShaderSourceLoader.cpp b/SHADE_Engine/src/Assets/Libraries/SHShaderSourceLoader.cpp new file mode 100644 index 00000000..bfb6b34a --- /dev/null +++ b/SHADE_Engine/src/Assets/Libraries/SHShaderSourceLoader.cpp @@ -0,0 +1,41 @@ +/*************************************************************************//** + * \file SHShaderSourceLoader.cpp + * \author Loh Xiao Qi + * \date 23 10 2022 + * \brief + * + * 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. + *****************************************************************************/ + +#include "SHpch.h" +#include "SHShaderSourceLoader.h" +#include "Assets/Asset Types/SHShaderAsset.h" + +#include + +namespace SHADE +{ + SHAssetData* SHShaderSourceLoader::Load(AssetPath path) + { + SHShaderAsset* result = new SHShaderAsset(); + + std::ifstream file{ path.string(), std::ios::in | std::ios::binary }; + if (!file.is_open()) + { + SHLOG_ERROR("Unable to open compiled shader file: {}", path.string()); + return nullptr; + } + + size_t byteCount = 0; + + file.read(reinterpret_cast(&result->shaderType), sizeof(uint8_t)); + file.read(reinterpret_cast(&byteCount), sizeof(size_t)); + file.read(reinterpret_cast(result->spirvBinary.data()), byteCount); + + file.close(); + + return result; + } +} diff --git a/SHADE_Engine/src/Assets/Libraries/SHShaderSourceLoader.h b/SHADE_Engine/src/Assets/Libraries/SHShaderSourceLoader.h new file mode 100644 index 00000000..262a767a --- /dev/null +++ b/SHADE_Engine/src/Assets/Libraries/SHShaderSourceLoader.h @@ -0,0 +1,22 @@ +/*************************************************************************//** + * \file SHShaderSourceLoader.h + * \author Loh Xiao Qi + * \date 23 10 2022 + * \brief + * + * 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 + +#include "Assets/Libraries/SHAssetLoader.h" +#include "Assets/SHAssetMacros.h" + +namespace SHADE +{ + struct SHShaderSourceLoader : SHAssetLoader + { + SHAssetData* Load(AssetPath path) override; + }; +} diff --git a/SHADE_Engine/src/Assets/SHAssetManager.cpp b/SHADE_Engine/src/Assets/SHAssetManager.cpp index 3032ba51..b7d7268f 100644 --- a/SHADE_Engine/src/Assets/SHAssetManager.cpp +++ b/SHADE_Engine/src/Assets/SHAssetManager.cpp @@ -234,7 +234,7 @@ namespace SHADE void SHAssetManager::InitLoaders() noexcept { loaders[static_cast(AssetType::AUDIO)] = nullptr; - loaders[static_cast(AssetType::SHADER)] = nullptr; + loaders[static_cast(AssetType::SHADER)] = dynamic_cast(new SHShaderSourceLoader()); loaders[static_cast(AssetType::MATERIAL)] = nullptr; loaders[static_cast(AssetType::IMAGE)] = dynamic_cast(new SHTextureLoader()); loaders[static_cast(AssetType::TEXTURE)] = nullptr; diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Shaders/SHShaderType.h b/SHADE_Engine/src/Graphics/MiddleEnd/Shaders/SHShaderType.h index bf4828b5..77f79f09 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Shaders/SHShaderType.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Shaders/SHShaderType.h @@ -3,11 +3,12 @@ namespace SHADE { - enum class SH_SHADER_TYPE + enum class SH_SHADER_TYPE : uint8_t { VERTEX, FRAGMENT, - COMPUTE + COMPUTE, + INAVLID_TYPE }; } From 8a0106564166e49cfd5d34edb3a80bb074b718c6 Mon Sep 17 00:00:00 2001 From: Xiao Qi Date: Mon, 24 Oct 2022 04:17:51 +0800 Subject: [PATCH 13/92] Moved original shader source library Added functions to asset manager to get all by type --- .../Libraries}/SHShaderSourceLibrary.cpp | 96 +++++-------------- .../Assets/Libraries/SHShaderSourceLibrary.h | 25 +++++ SHADE_Engine/src/Assets/SHAssetMacros.h | 18 +++- SHADE_Engine/src/Assets/SHAssetManager.cpp | 28 ++++++ SHADE_Engine/src/Assets/SHAssetManager.h | 3 + .../MiddleEnd/Interface/SHGraphicsSystem.h | 5 +- .../MiddleEnd/Shaders/SHShaderSourceLibrary.h | 70 -------------- 7 files changed, 98 insertions(+), 147 deletions(-) rename SHADE_Engine/src/{Graphics/MiddleEnd/Shaders => Assets/Libraries}/SHShaderSourceLibrary.cpp (74%) create mode 100644 SHADE_Engine/src/Assets/Libraries/SHShaderSourceLibrary.h delete mode 100644 SHADE_Engine/src/Graphics/MiddleEnd/Shaders/SHShaderSourceLibrary.h diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Shaders/SHShaderSourceLibrary.cpp b/SHADE_Engine/src/Assets/Libraries/SHShaderSourceLibrary.cpp similarity index 74% rename from SHADE_Engine/src/Graphics/MiddleEnd/Shaders/SHShaderSourceLibrary.cpp rename to SHADE_Engine/src/Assets/Libraries/SHShaderSourceLibrary.cpp index d9bf9ddc..8a5769d0 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Shaders/SHShaderSourceLibrary.cpp +++ b/SHADE_Engine/src/Assets/Libraries/SHShaderSourceLibrary.cpp @@ -6,27 +6,6 @@ namespace SHADE { - /***************************************************************************/ - /*! - - \brief - Initializes the directory to take assets from. TODO: Only temporary until - the resource manager is implemented. - - \param directory - - \return - - */ - /***************************************************************************/ - void SHShaderSourceLibrary::Init (std::string directory) noexcept - { - shaderDirectory = directory; - if (shaderDirectory.back() != '/') - { - shaderDirectory += '/'; - } - } /***************************************************************************/ /*! @@ -147,15 +126,6 @@ namespace SHADE /***************************************************************************/ bool SHShaderSourceLibrary::LoadShader (uint32_t id, std::string glslFile, SH_SHADER_TYPE type, bool checkSpirvOutdated/* = true*/, bool recompileAnyway /*= false*/) noexcept { - //if (sourceLibrary.contains(id)) - //{ - // SHLOG_ERROR("Shader with ID passed in already exists. Use a different ID"); - // return false; - //} - - std::string fullGLSLPath = shaderDirectory + glslFile; - auto path = std::filesystem::path(fullGLSLPath); - if (path.extension() != ".glsl") { SHLOG_ERROR("Shader is not GLSL file, failed to load shader. "); @@ -164,16 +134,16 @@ namespace SHADE std::string spirvFilepath = path.replace_extension("spv").string(); - SHShaderData newShaderData{}; + SHShaderAsset newShaderData{}; newShaderData.shaderType = type; // spirv file std::ifstream spirvFile(spirvFilepath, std::ios::ate | std::ios::binary); // If we disable spirv validation, file is not checked - if (!recompileAnyway && - spirvFile.is_open() && - (checkSpirvOutdated ? (std::filesystem::last_write_time(spirvFilepath) > std::filesystem::last_write_time(fullGLSLPath)) : true)) + if (!recompileAnyway && + spirvFile.is_open() && + (checkSpirvOutdated ? (std::filesystem::last_write_time(spirvFilepath) > std::filesystem::last_write_time(fullGLSLPath)) : true)) { // Get file size of binary uint32_t fileSize = static_cast(spirvFile.tellg()); @@ -210,58 +180,42 @@ namespace SHADE newShaderData.name = glslFile; newShaderData.id = id; - - sourceLibrary.emplace_back(std::move (newShaderData)); + + sourceLibrary.emplace_back(std::move(newShaderData)); return true; } /***************************************************************************/ /*! - - \brief - Gets the entire source library. - - \return - The container of binary data. - - */ - /***************************************************************************/ - std::vector const& SHShaderSourceLibrary::GetSourceLibrary(void) const noexcept - { - return sourceLibrary; - } - /***************************************************************************/ - /*! - \brief - Move ctor for shader data. - + Move ctor for shader data. + \param rhs The other shader data - + */ /***************************************************************************/ - SHShaderData::SHShaderData(SHShaderData&& rhs) noexcept - : spirvBinary{ std::move (rhs.spirvBinary)} - , shaderType{std::move (rhs.shaderType)} - , name{ std::move (rhs.name)} - , id {std::move (rhs.id)} + SHShaderAsset::SHShaderAsset(SHShaderAsset&& rhs) noexcept + : spirvBinary{ std::move(rhs.spirvBinary) } + , shaderType{ std::move(rhs.shaderType) } + , name{ std::move(rhs.name) } + , id{ std::move(rhs.id) } { } /***************************************************************************/ /*! - + \brief Default ctor for shader data. Does nothing. - + */ /***************************************************************************/ - SHShaderData::SHShaderData(void) noexcept + SHShaderAsset::SHShaderAsset(void) noexcept : spirvBinary{} - , shaderType{SH_SHADER_TYPE::VERTEX} + , shaderType{ SH_SHADER_TYPE::VERTEX } , name{ } , id{ } @@ -269,16 +223,16 @@ namespace SHADE } - SHShaderData::SHShaderData(SHShaderData const& rhs) noexcept - : spirvBinary{rhs.spirvBinary} - , shaderType{ rhs.shaderType} - , name{rhs.name } - , id{rhs.id } + SHShaderAsset::SHShaderAsset(SHShaderAsset const& rhs) noexcept + : spirvBinary{ rhs.spirvBinary } + , shaderType{ rhs.shaderType } + , name{ rhs.name } + , id{ rhs.id } { } - SHShaderData& SHShaderData::operator=(SHShaderData const& rhs) noexcept + SHShaderAsset& SHShaderAsset::operator=(SHShaderAsset const& rhs) noexcept { if (this == &rhs) return *this; @@ -292,7 +246,7 @@ namespace SHADE return *this; } - SHShaderData& SHShaderData::operator=(SHShaderData&& rhs) noexcept + SHShaderAsset& SHShaderAsset::operator=(SHShaderAsset&& rhs) noexcept { if (this == &rhs) return *this; diff --git a/SHADE_Engine/src/Assets/Libraries/SHShaderSourceLibrary.h b/SHADE_Engine/src/Assets/Libraries/SHShaderSourceLibrary.h new file mode 100644 index 00000000..cb4a3453 --- /dev/null +++ b/SHADE_Engine/src/Assets/Libraries/SHShaderSourceLibrary.h @@ -0,0 +1,25 @@ +#ifndef SH_SHADER_SOURCE_LIBRARY_H +#define SH_SHADER_SOURCE_LIBRARY_H + +#include "Graphics/MiddleEnd/Shaders/SHShaderType.h" +#include "shaderc/shaderc.hpp" + +namespace SHADE +{ + class SHShaderSourceLibrary + { + private: + /*-----------------------------------------------------------------------*/ + /* PRIVATE MEMBER FUNCTIONS */ + /*-----------------------------------------------------------------------*/ + std::vector CompileToBinary(std::string const& glslSource, char const* const spirvFilename, SH_SHADER_TYPE type, shaderc_optimization_level opLevel = shaderc_optimization_level_zero); + + // TODO: Delete after file IO is implemented + std::string GetStringFromFile(char const* filePath) noexcept; + + public: + bool LoadShader (uint32_t id, std::string glslFile, SH_SHADER_TYPE type, bool checkSpirvOutdated = true, bool recompileAnyway = false) noexcept; + }; +} + +#endif diff --git a/SHADE_Engine/src/Assets/SHAssetMacros.h b/SHADE_Engine/src/Assets/SHAssetMacros.h index 0fdfa04e..cb8e1331 100644 --- a/SHADE_Engine/src/Assets/SHAssetMacros.h +++ b/SHADE_Engine/src/Assets/SHAssetMacros.h @@ -56,6 +56,7 @@ enum class AssetType : AssetTypeMeta DDS, MAX_COUNT }; +constexpr size_t TYPE_COUNT{ static_cast(AssetType::MAX_COUNT) }; //Directory #ifdef _PUBLISH @@ -70,7 +71,8 @@ constexpr std::string_view META_EXTENSION {".shmeta"}; constexpr std::string_view IMAGE_EXTENSION {".png"}; constexpr std::string_view AUDIO_EXTENSION {".ogg"}; constexpr std::string_view AUDIO_WAV_EXTENSION {".wav"}; -constexpr std::string_view SHADER_EXTENSION {".glsl"}; +constexpr std::string_view SHADER_EXTENSION{ ".glsl" }; +constexpr std::string_view SHADER_SPRV_EXTENSION {".sprv"}; constexpr std::string_view SCRIPT_EXTENSION {".cs"}; constexpr std::string_view SCENE_EXTENSION {".SHADE"}; constexpr std::string_view PREFAB_EXTENSION {".SHPrefab"}; @@ -84,6 +86,7 @@ constexpr std::string_view MESH_EXTENSION {".shmesh"}; constexpr std::string_view EXTENSIONS[] = { AUDIO_EXTENSION, SHADER_EXTENSION, + SHADER_SPRV_EXTENSION, MATERIAL_EXTENSION, IMAGE_EXTENSION, TEXTURE_EXTENSION, @@ -97,7 +100,18 @@ constexpr std::string_view EXTENSIONS[] = { GLTF_EXTENSION }; -constexpr size_t TYPE_COUNT {static_cast(AssetType::MAX_COUNT) }; +// SHADER IDENTIFIERS +constexpr std::string_view VERTEX_SHADER{ "_VS" }; +constexpr std::string_view FRAGMENT_SHADER{ "_FS" }; +constexpr std::string_view COMPUTER_SHADER{ "_CS" }; + +constexpr std::string_view SHADER_IDENTIFIERS[] = { + VERTEX_SHADER, + FRAGMENT_SHADER, + COMPUTER_SHADER +}; + +constexpr size_t SHADER_TYPE_MAX_COUNT{ 3 }; // Error flags constexpr std::string_view FILE_NOT_FOUND_ERR {"FILE NOT FOUND"}; diff --git a/SHADE_Engine/src/Assets/SHAssetManager.cpp b/SHADE_Engine/src/Assets/SHAssetManager.cpp index b7d7268f..9198666c 100644 --- a/SHADE_Engine/src/Assets/SHAssetManager.cpp +++ b/SHADE_Engine/src/Assets/SHAssetManager.cpp @@ -17,6 +17,7 @@ #include "Libraries/SHAssimpLibrary.h" #include "Libraries/SHMeshLoader.h" #include "Libraries/SHTextureLoader.h" +#include "Libraries/SHShaderSourceLoader.h" #include "Libraries/SHMeshCompiler.h" #include "Libraries/SHTextureCompiler.h" @@ -206,6 +207,33 @@ namespace SHADE } + std::vector SHAssetManager::GetAllDataOfType(AssetType type) noexcept + { + auto const toRetrieve = GetAllRecordOfType(type); + std::vector result; + result.reserve(toRetrieve.size()); + for (auto const& get : toRetrieve) + { + result.push_back(LoadData(get)); + } + + return result; + } + + std::vector SHAssetManager::GetAllRecordOfType(AssetType type) noexcept + { + std::vector result; + for (auto const& asset : assetCollection) + { + if (asset.type == type) + { + result.push_back(asset); + } + } + + return result; + } + bool SHAssetManager::IsRecognised(char const* ext) noexcept { for (auto const& e : EXTENSIONS) diff --git a/SHADE_Engine/src/Assets/SHAssetManager.h b/SHADE_Engine/src/Assets/SHAssetManager.h index 9ee7ab92..fedebfba 100644 --- a/SHADE_Engine/src/Assets/SHAssetManager.h +++ b/SHADE_Engine/src/Assets/SHAssetManager.h @@ -77,6 +77,9 @@ namespace SHADE template static std::enable_if_t, T const* const> GetData(AssetID id) noexcept; + + static std::vector GetAllDataOfType(AssetType type) noexcept; + static std::vector GetAllRecordOfType(AssetType type) noexcept; private: /**************************************************************************** * \brief Load resource data into memory diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h index 870325ac..35bf2c5b 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h @@ -25,7 +25,6 @@ of DigiPen Institute of Technology is prohibited. #include "ECS_Base/System/SHSystemRoutine.h" #include "Graphics/Descriptors/SHVkDescriptorPool.h" #include "Graphics/RenderGraph/SHRenderGraph.h" -#include "Graphics/MiddleEnd/Shaders/SHShaderSourceLibrary.h" #include "Graphics/MiddleEnd/Shaders/SHShaderModuleLibrary.h" #include "SHMeshLibrary.h" #include "Graphics/MiddleEnd/Materials/SHMaterialInstanceCache.h" @@ -338,9 +337,7 @@ namespace SHADE // Temp Cameras Handle worldCamera; Handle screenCamera; - - // TODO: Temporary only until resource library from Xiao Qi is implemented - SHShaderSourceLibrary shaderSourceLibrary; + SHShaderModuleLibrary shaderModuleLibrary; // Temp Materials diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Shaders/SHShaderSourceLibrary.h b/SHADE_Engine/src/Graphics/MiddleEnd/Shaders/SHShaderSourceLibrary.h deleted file mode 100644 index bb346111..00000000 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Shaders/SHShaderSourceLibrary.h +++ /dev/null @@ -1,70 +0,0 @@ -#ifndef SH_SHADER_SOURCE_LIBRARY_H -#define SH_SHADER_SOURCE_LIBRARY_H - -#include -#include "SHShaderType.h" -#include "shaderc/shaderc.hpp" - -namespace SHADE -{ - struct SHShaderData - { - /*-----------------------------------------------------------------------*/ - /* MEMBER VARIABLES */ - /*-----------------------------------------------------------------------*/ - //! container storing the spirv binary - std::vector spirvBinary; - - //! For the compilation of the shader. Vulkan backend will use it too - SH_SHADER_TYPE shaderType; - - //! Name of the shader file (without parent path) - std::string name; - - //! id of the shader - uint32_t id; - - SHShaderData(void) noexcept; - SHShaderData(SHShaderData const& rhs) noexcept; - SHShaderData(SHShaderData&& rhs) noexcept; - SHShaderData& operator= (SHShaderData&& rhs) noexcept; - SHShaderData& operator= (SHShaderData const& rhs) noexcept; - }; - - // TODO: This class is purely temporary and will be converted/changed when XQ implements his resource manager - class SHShaderSourceLibrary - { - private: - /*-----------------------------------------------------------------------*/ - /* PRIVATE MEMBER VARIABLES */ - /*-----------------------------------------------------------------------*/ - //! Stores all the source data. Take note that the source here is GLSL source and NOT binary data. - //! Binary data gets passed to the backend to convert to spirv. - std::vector sourceLibrary; - - //! The directory where the shaders are located. - std::string shaderDirectory; - - /*-----------------------------------------------------------------------*/ - /* PRIVATE MEMBER FUNCTIONS */ - /*-----------------------------------------------------------------------*/ - std::vector CompileToBinary(std::string const& glslSource, char const* const spirvFilename, SH_SHADER_TYPE type, shaderc_optimization_level opLevel = shaderc_optimization_level_zero); - - // TODO: Delete after file IO is implemented - std::string GetStringFromFile(char const* filePath) noexcept; - - public: - /*-----------------------------------------------------------------------*/ - /* PUBLIC MEMBER FUNCTIONS */ - /*-----------------------------------------------------------------------*/ - void Init (std::string directory) noexcept; - bool LoadShader (uint32_t id, std::string glslFile, SH_SHADER_TYPE type, bool checkSpirvOutdated = true, bool recompileAnyway = false) noexcept; - - /*-----------------------------------------------------------------------*/ - /* SETTERS AND GETTERS */ - /*-----------------------------------------------------------------------*/ - std::vector const& GetSourceLibrary(void) const noexcept; - }; -} - -#endif From 2dbd2f603064a95cc78c7170fa973ae9008232da Mon Sep 17 00:00:00 2001 From: Xiao Qi Date: Mon, 24 Oct 2022 22:46:01 +0800 Subject: [PATCH 14/92] Split asset into 2 categories for internal assets to be loaded and external assets to be compiled --- .../{ => Compilers}/SHAssimpLibrary.cpp | 0 .../{ => Compilers}/SHAssimpLibrary.h | 6 ++-- .../{ => Compilers}/SHMeshCompiler.cpp | 0 .../{ => Compilers}/SHMeshCompiler.h | 0 .../SHShaderSourceCompiler.cpp | 2 +- .../{ => Compilers}/SHShaderSourceCompiler.h | 0 .../{ => Compilers}/SHTextureCompiler.cpp | 0 .../{ => Compilers}/SHTextureCompiler.h | 0 .../Libraries/{ => Loaders}/SHAssetLoader.h | 0 .../Libraries/{ => Loaders}/SHMeshLoader.cpp | 0 .../Libraries/{ => Loaders}/SHMeshLoader.h | 4 +-- .../{ => Loaders}/SHShaderSourceLoader.cpp | 0 .../{ => Loaders}/SHShaderSourceLoader.h | 2 +- .../{ => Loaders}/SHTextureLoader.cpp | 0 .../Libraries/{ => Loaders}/SHTextureLoader.h | 4 +-- SHADE_Engine/src/Assets/SHAssetMacros.h | 29 ++++++++++------- SHADE_Engine/src/Assets/SHAssetManager.cpp | 32 +++++++++++++------ SHADE_Engine/src/Assets/SHAssetManager.h | 4 ++- 18 files changed, 52 insertions(+), 31 deletions(-) rename SHADE_Engine/src/Assets/Libraries/{ => Compilers}/SHAssimpLibrary.cpp (100%) rename SHADE_Engine/src/Assets/Libraries/{ => Compilers}/SHAssimpLibrary.h (89%) rename SHADE_Engine/src/Assets/Libraries/{ => Compilers}/SHMeshCompiler.cpp (100%) rename SHADE_Engine/src/Assets/Libraries/{ => Compilers}/SHMeshCompiler.h (100%) rename SHADE_Engine/src/Assets/Libraries/{ => Compilers}/SHShaderSourceCompiler.cpp (98%) rename SHADE_Engine/src/Assets/Libraries/{ => Compilers}/SHShaderSourceCompiler.h (100%) rename SHADE_Engine/src/Assets/Libraries/{ => Compilers}/SHTextureCompiler.cpp (100%) rename SHADE_Engine/src/Assets/Libraries/{ => Compilers}/SHTextureCompiler.h (100%) rename SHADE_Engine/src/Assets/Libraries/{ => Loaders}/SHAssetLoader.h (100%) rename SHADE_Engine/src/Assets/Libraries/{ => Loaders}/SHMeshLoader.cpp (100%) rename SHADE_Engine/src/Assets/Libraries/{ => Loaders}/SHMeshLoader.h (90%) rename SHADE_Engine/src/Assets/Libraries/{ => Loaders}/SHShaderSourceLoader.cpp (100%) rename SHADE_Engine/src/Assets/Libraries/{ => Loaders}/SHShaderSourceLoader.h (92%) rename SHADE_Engine/src/Assets/Libraries/{ => Loaders}/SHTextureLoader.cpp (100%) rename SHADE_Engine/src/Assets/Libraries/{ => Loaders}/SHTextureLoader.h (93%) diff --git a/SHADE_Engine/src/Assets/Libraries/SHAssimpLibrary.cpp b/SHADE_Engine/src/Assets/Libraries/Compilers/SHAssimpLibrary.cpp similarity index 100% rename from SHADE_Engine/src/Assets/Libraries/SHAssimpLibrary.cpp rename to SHADE_Engine/src/Assets/Libraries/Compilers/SHAssimpLibrary.cpp diff --git a/SHADE_Engine/src/Assets/Libraries/SHAssimpLibrary.h b/SHADE_Engine/src/Assets/Libraries/Compilers/SHAssimpLibrary.h similarity index 89% rename from SHADE_Engine/src/Assets/Libraries/SHAssimpLibrary.h rename to SHADE_Engine/src/Assets/Libraries/Compilers/SHAssimpLibrary.h index 83755b4c..d5afde00 100644 --- a/SHADE_Engine/src/Assets/Libraries/SHAssimpLibrary.h +++ b/SHADE_Engine/src/Assets/Libraries/Compilers/SHAssimpLibrary.h @@ -13,9 +13,9 @@ #include #include #include -#include "../SHAssetMacros.h" -#include "../Asset Types/SHMeshAsset.h" -#include "../Asset Types/SHAnimationAsset.h" +#include "Assets/SHAssetMacros.h" +#include "Assets/Asset Types/SHMeshAsset.h" +#include "Assets/Asset Types/SHAnimationAsset.h" namespace SHADE { diff --git a/SHADE_Engine/src/Assets/Libraries/SHMeshCompiler.cpp b/SHADE_Engine/src/Assets/Libraries/Compilers/SHMeshCompiler.cpp similarity index 100% rename from SHADE_Engine/src/Assets/Libraries/SHMeshCompiler.cpp rename to SHADE_Engine/src/Assets/Libraries/Compilers/SHMeshCompiler.cpp diff --git a/SHADE_Engine/src/Assets/Libraries/SHMeshCompiler.h b/SHADE_Engine/src/Assets/Libraries/Compilers/SHMeshCompiler.h similarity index 100% rename from SHADE_Engine/src/Assets/Libraries/SHMeshCompiler.h rename to SHADE_Engine/src/Assets/Libraries/Compilers/SHMeshCompiler.h diff --git a/SHADE_Engine/src/Assets/Libraries/SHShaderSourceCompiler.cpp b/SHADE_Engine/src/Assets/Libraries/Compilers/SHShaderSourceCompiler.cpp similarity index 98% rename from SHADE_Engine/src/Assets/Libraries/SHShaderSourceCompiler.cpp rename to SHADE_Engine/src/Assets/Libraries/Compilers/SHShaderSourceCompiler.cpp index c9674b2e..8cca46dc 100644 --- a/SHADE_Engine/src/Assets/Libraries/SHShaderSourceCompiler.cpp +++ b/SHADE_Engine/src/Assets/Libraries/Compilers/SHShaderSourceCompiler.cpp @@ -21,7 +21,7 @@ namespace SHADE { std::string SHShaderSourceCompiler::CompileShaderSourceToBinary(AssetPath path, SHShaderAsset const& data) noexcept { - std::string newPath{ path.string() + SHADER_SPRV_EXTENSION.data() }; + std::string newPath{ path.string() + SHADER_EXTENSION.data() }; std::ofstream file{ newPath, std::ios::binary | std::ios::out | std::ios::trunc }; diff --git a/SHADE_Engine/src/Assets/Libraries/SHShaderSourceCompiler.h b/SHADE_Engine/src/Assets/Libraries/Compilers/SHShaderSourceCompiler.h similarity index 100% rename from SHADE_Engine/src/Assets/Libraries/SHShaderSourceCompiler.h rename to SHADE_Engine/src/Assets/Libraries/Compilers/SHShaderSourceCompiler.h diff --git a/SHADE_Engine/src/Assets/Libraries/SHTextureCompiler.cpp b/SHADE_Engine/src/Assets/Libraries/Compilers/SHTextureCompiler.cpp similarity index 100% rename from SHADE_Engine/src/Assets/Libraries/SHTextureCompiler.cpp rename to SHADE_Engine/src/Assets/Libraries/Compilers/SHTextureCompiler.cpp diff --git a/SHADE_Engine/src/Assets/Libraries/SHTextureCompiler.h b/SHADE_Engine/src/Assets/Libraries/Compilers/SHTextureCompiler.h similarity index 100% rename from SHADE_Engine/src/Assets/Libraries/SHTextureCompiler.h rename to SHADE_Engine/src/Assets/Libraries/Compilers/SHTextureCompiler.h diff --git a/SHADE_Engine/src/Assets/Libraries/SHAssetLoader.h b/SHADE_Engine/src/Assets/Libraries/Loaders/SHAssetLoader.h similarity index 100% rename from SHADE_Engine/src/Assets/Libraries/SHAssetLoader.h rename to SHADE_Engine/src/Assets/Libraries/Loaders/SHAssetLoader.h diff --git a/SHADE_Engine/src/Assets/Libraries/SHMeshLoader.cpp b/SHADE_Engine/src/Assets/Libraries/Loaders/SHMeshLoader.cpp similarity index 100% rename from SHADE_Engine/src/Assets/Libraries/SHMeshLoader.cpp rename to SHADE_Engine/src/Assets/Libraries/Loaders/SHMeshLoader.cpp diff --git a/SHADE_Engine/src/Assets/Libraries/SHMeshLoader.h b/SHADE_Engine/src/Assets/Libraries/Loaders/SHMeshLoader.h similarity index 90% rename from SHADE_Engine/src/Assets/Libraries/SHMeshLoader.h rename to SHADE_Engine/src/Assets/Libraries/Loaders/SHMeshLoader.h index 706d65d6..bf65851a 100644 --- a/SHADE_Engine/src/Assets/Libraries/SHMeshLoader.h +++ b/SHADE_Engine/src/Assets/Libraries/Loaders/SHMeshLoader.h @@ -10,8 +10,8 @@ * of DigiPen Institute of Technology is prohibited. *****************************************************************************/ #pragma once -#include "../SHAssetMacros.h" -#include "../Asset Types/SHMeshAsset.h" +#include "Assets/SHAssetMacros.h" +#include "Assets/Asset Types/SHMeshAsset.h" #include "SHAssetLoader.h" namespace SHADE diff --git a/SHADE_Engine/src/Assets/Libraries/SHShaderSourceLoader.cpp b/SHADE_Engine/src/Assets/Libraries/Loaders/SHShaderSourceLoader.cpp similarity index 100% rename from SHADE_Engine/src/Assets/Libraries/SHShaderSourceLoader.cpp rename to SHADE_Engine/src/Assets/Libraries/Loaders/SHShaderSourceLoader.cpp diff --git a/SHADE_Engine/src/Assets/Libraries/SHShaderSourceLoader.h b/SHADE_Engine/src/Assets/Libraries/Loaders/SHShaderSourceLoader.h similarity index 92% rename from SHADE_Engine/src/Assets/Libraries/SHShaderSourceLoader.h rename to SHADE_Engine/src/Assets/Libraries/Loaders/SHShaderSourceLoader.h index 262a767a..befdade5 100644 --- a/SHADE_Engine/src/Assets/Libraries/SHShaderSourceLoader.h +++ b/SHADE_Engine/src/Assets/Libraries/Loaders/SHShaderSourceLoader.h @@ -10,7 +10,7 @@ *****************************************************************************/ #pragma once -#include "Assets/Libraries/SHAssetLoader.h" +#include "Assets/Libraries/Loaders/SHAssetLoader.h" #include "Assets/SHAssetMacros.h" namespace SHADE diff --git a/SHADE_Engine/src/Assets/Libraries/SHTextureLoader.cpp b/SHADE_Engine/src/Assets/Libraries/Loaders/SHTextureLoader.cpp similarity index 100% rename from SHADE_Engine/src/Assets/Libraries/SHTextureLoader.cpp rename to SHADE_Engine/src/Assets/Libraries/Loaders/SHTextureLoader.cpp diff --git a/SHADE_Engine/src/Assets/Libraries/SHTextureLoader.h b/SHADE_Engine/src/Assets/Libraries/Loaders/SHTextureLoader.h similarity index 93% rename from SHADE_Engine/src/Assets/Libraries/SHTextureLoader.h rename to SHADE_Engine/src/Assets/Libraries/Loaders/SHTextureLoader.h index 8bdf91b1..95dd7c9a 100644 --- a/SHADE_Engine/src/Assets/Libraries/SHTextureLoader.h +++ b/SHADE_Engine/src/Assets/Libraries/Loaders/SHTextureLoader.h @@ -12,8 +12,8 @@ #pragma once #define TINYDDSLOADER_IMPLEMENTATION -#include "../SHAssetMacros.h" -#include "../Asset Types/SHTextureAsset.h" +#include "Assets/SHAssetMacros.h" +#include "Assets/Asset Types/SHTextureAsset.h" #include "tinyddsloader.h" #include "SHAssetLoader.h" diff --git a/SHADE_Engine/src/Assets/SHAssetMacros.h b/SHADE_Engine/src/Assets/SHAssetMacros.h index cb8e1331..c5c8493b 100644 --- a/SHADE_Engine/src/Assets/SHAssetMacros.h +++ b/SHADE_Engine/src/Assets/SHAssetMacros.h @@ -68,34 +68,39 @@ constexpr std::string_view ASSET_ROOT {"../../Assets"}; // ASSET EXTENSIONS constexpr std::string_view META_EXTENSION {".shmeta"}; -constexpr std::string_view IMAGE_EXTENSION {".png"}; constexpr std::string_view AUDIO_EXTENSION {".ogg"}; constexpr std::string_view AUDIO_WAV_EXTENSION {".wav"}; -constexpr std::string_view SHADER_EXTENSION{ ".glsl" }; -constexpr std::string_view SHADER_SPRV_EXTENSION {".sprv"}; +constexpr std::string_view SHADER_EXTENSION{".shshader"}; constexpr std::string_view SCRIPT_EXTENSION {".cs"}; -constexpr std::string_view SCENE_EXTENSION {".SHADE"}; -constexpr std::string_view PREFAB_EXTENSION {".SHPrefab"}; -constexpr std::string_view MATERIAL_EXTENSION {".SHMat"}; +constexpr std::string_view SCENE_EXTENSION {".shade"}; +constexpr std::string_view PREFAB_EXTENSION {".shprefab"}; +constexpr std::string_view MATERIAL_EXTENSION {".shmat"}; constexpr std::string_view TEXTURE_EXTENSION {".shtex"}; -constexpr std::string_view DDS_EXTENSION {".dds"}; -constexpr std::string_view FBX_EXTENSION {".fbx"}; -constexpr std::string_view GLTF_EXTENSION {".gltf"}; constexpr std::string_view MESH_EXTENSION {".shmesh"}; +// EXTERNAL EXTENSIONS +constexpr std::string_view GLSL_EXTENSION{ ".glsl" }; +constexpr std::string_view IMAGE_EXTENSION{ ".png" }; +constexpr std::string_view DDS_EXTENSION{ ".dds" }; +constexpr std::string_view FBX_EXTENSION{ ".fbx" }; +constexpr std::string_view GLTF_EXTENSION{ ".gltf" }; + constexpr std::string_view EXTENSIONS[] = { AUDIO_EXTENSION, SHADER_EXTENSION, - SHADER_SPRV_EXTENSION, MATERIAL_EXTENSION, - IMAGE_EXTENSION, TEXTURE_EXTENSION, - DDS_EXTENSION, MESH_EXTENSION, SCRIPT_EXTENSION, SCENE_EXTENSION, PREFAB_EXTENSION, AUDIO_WAV_EXTENSION, +}; + +constexpr std::string_view EXTERNALS[] = { + GLSL_EXTENSION, + IMAGE_EXTENSION, + DDS_EXTENSION, FBX_EXTENSION, GLTF_EXTENSION }; diff --git a/SHADE_Engine/src/Assets/SHAssetManager.cpp b/SHADE_Engine/src/Assets/SHAssetManager.cpp index 9198666c..28790dca 100644 --- a/SHADE_Engine/src/Assets/SHAssetManager.cpp +++ b/SHADE_Engine/src/Assets/SHAssetManager.cpp @@ -14,13 +14,14 @@ #include "SHAssetMetaHandler.h" #include "Filesystem/SHFileSystem.h" -#include "Libraries/SHAssimpLibrary.h" -#include "Libraries/SHMeshLoader.h" -#include "Libraries/SHTextureLoader.h" -#include "Libraries/SHShaderSourceLoader.h" +#include "Libraries/Loaders/SHMeshLoader.h" +#include "Libraries/Loaders/SHTextureLoader.h" +#include "Libraries/Loaders/SHShaderSourceLoader.h" -#include "Libraries/SHMeshCompiler.h" -#include "Libraries/SHTextureCompiler.h" + +#include "Libraries/Compilers/SHAssimpLibrary.h" +#include "Libraries/Compilers/SHMeshCompiler.h" +#include "Libraries/Compilers/SHTextureCompiler.h" namespace SHADE { @@ -65,7 +66,20 @@ namespace SHADE // TODO } - AssetPath SHAssetManager::GenerateLocalPath(AssetPath path) noexcept + void SHAssetManager::Exit() noexcept + { + for (auto const& loader : loaders) + { + delete loader; + } + + for (auto const& data : assetData) + { + delete data.second; + } + } + + AssetPath SHAssetManager::GenerateLocalPath(AssetPath path) noexcept { if (!IsRecognised(path.extension().string().c_str())) { @@ -255,6 +269,7 @@ namespace SHADE result.type = SHAssetMetaHandler::GetTypeFromExtension(path.extension().string()); result.id = GenerateAssetID(result.type); result.path = path; + result.location = 0; return result; } @@ -264,8 +279,7 @@ namespace SHADE loaders[static_cast(AssetType::AUDIO)] = nullptr; loaders[static_cast(AssetType::SHADER)] = dynamic_cast(new SHShaderSourceLoader()); loaders[static_cast(AssetType::MATERIAL)] = nullptr; - loaders[static_cast(AssetType::IMAGE)] = dynamic_cast(new SHTextureLoader()); - loaders[static_cast(AssetType::TEXTURE)] = nullptr; + loaders[static_cast(AssetType::TEXTURE)] = dynamic_cast(new SHTextureLoader()); loaders[static_cast(AssetType::MESH)] = dynamic_cast(new SHMeshLoader()); loaders[static_cast(AssetType::SCRIPT)] = nullptr; loaders[static_cast(AssetType::SCENE)] = nullptr; diff --git a/SHADE_Engine/src/Assets/SHAssetManager.h b/SHADE_Engine/src/Assets/SHAssetManager.h index fedebfba..0dc376d9 100644 --- a/SHADE_Engine/src/Assets/SHAssetManager.h +++ b/SHADE_Engine/src/Assets/SHAssetManager.h @@ -12,7 +12,7 @@ #include "tinyddsloader.h" #include "SHAsset.h" #include "Asset Types/SHAssetData.h" -#include "Libraries/SHAssetLoader.h" +#include "Assets/Libraries/Loaders/SHAssetLoader.h" #include #include "SH_API.h" @@ -37,6 +37,8 @@ namespace SHADE static void Unload() noexcept; static void Unload(AssetID assetId) noexcept; + static void Exit() noexcept; + /**************************************************************************** * \brief Load all resources that are in the folder ****************************************************************************/ From f6cbb1814386e4d624df0c0ec26ac45524516041 Mon Sep 17 00:00:00 2001 From: Kah Wei Date: Tue, 25 Oct 2022 01:34:46 +0800 Subject: [PATCH 15/92] Added display of WIP CallbackEvents on the inspector --- SHADE_CSharp/src/Events/CallbackAction.cs | 40 +++++++++++++ SHADE_CSharp/src/Events/CallbackAction.tt | 4 ++ SHADE_CSharp/src/Events/CallbackEvent.cs | 54 +++++++++++++++++ SHADE_CSharp/src/Events/CallbackEvent.tt | 9 +++ SHADE_Engine/src/Editor/SHEditorUI.cpp | 2 +- SHADE_Engine/src/Scripting/SHScriptEngine.cpp | 4 ++ SHADE_Managed/src/Editor/Editor.cxx | 60 ++++++++++++++++--- TempScriptsFolder/RaccoonSpin.cs | 4 ++ 8 files changed, 167 insertions(+), 10 deletions(-) diff --git a/SHADE_CSharp/src/Events/CallbackAction.cs b/SHADE_CSharp/src/Events/CallbackAction.cs index ec34ca5c..968302ed 100644 --- a/SHADE_CSharp/src/Events/CallbackAction.cs +++ b/SHADE_CSharp/src/Events/CallbackAction.cs @@ -57,6 +57,10 @@ namespace SHADE #region Constructors ------------------------------------------------------------ /// + /// Constructs an empty Callback action. + /// + public CallbackAction() {} + /// /// Constructs a CallbackAction that represents a call to the specified method on the /// specified target. /// @@ -130,6 +134,10 @@ namespace SHADE #region Constructors ------------------------------------------------------------ /// + /// Constructs an empty Callback action. + /// + public CallbackAction() {} + /// /// Constructs a CallbackAction that represents a call to the specified method on the /// specified target. /// @@ -204,6 +212,10 @@ namespace SHADE #region Constructors ------------------------------------------------------------ /// + /// Constructs an empty Callback action. + /// + public CallbackAction() {} + /// /// Constructs a CallbackAction that represents a call to the specified method on the /// specified target. /// @@ -279,6 +291,10 @@ namespace SHADE #region Constructors ------------------------------------------------------------ /// + /// Constructs an empty Callback action. + /// + public CallbackAction() {} + /// /// Constructs a CallbackAction that represents a call to the specified method on the /// specified target. /// @@ -355,6 +371,10 @@ namespace SHADE #region Constructors ------------------------------------------------------------ /// + /// Constructs an empty Callback action. + /// + public CallbackAction() {} + /// /// Constructs a CallbackAction that represents a call to the specified method on the /// specified target. /// @@ -432,6 +452,10 @@ namespace SHADE #region Constructors ------------------------------------------------------------ /// + /// Constructs an empty Callback action. + /// + public CallbackAction() {} + /// /// Constructs a CallbackAction that represents a call to the specified method on the /// specified target. /// @@ -510,6 +534,10 @@ namespace SHADE #region Constructors ------------------------------------------------------------ /// + /// Constructs an empty Callback action. + /// + public CallbackAction() {} + /// /// Constructs a CallbackAction that represents a call to the specified method on the /// specified target. /// @@ -589,6 +617,10 @@ namespace SHADE #region Constructors ------------------------------------------------------------ /// + /// Constructs an empty Callback action. + /// + public CallbackAction() {} + /// /// Constructs a CallbackAction that represents a call to the specified method on the /// specified target. /// @@ -669,6 +701,10 @@ namespace SHADE #region Constructors ------------------------------------------------------------ /// + /// Constructs an empty Callback action. + /// + public CallbackAction() {} + /// /// Constructs a CallbackAction that represents a call to the specified method on the /// specified target. /// @@ -750,6 +786,10 @@ namespace SHADE #region Constructors ------------------------------------------------------------ /// + /// Constructs an empty Callback action. + /// + public CallbackAction() {} + /// /// Constructs a CallbackAction that represents a call to the specified method on the /// specified target. /// diff --git a/SHADE_CSharp/src/Events/CallbackAction.tt b/SHADE_CSharp/src/Events/CallbackAction.tt index 0b1efb83..fffd4251 100644 --- a/SHADE_CSharp/src/Events/CallbackAction.tt +++ b/SHADE_CSharp/src/Events/CallbackAction.tt @@ -74,6 +74,10 @@ namespace SHADE #region Constructors ------------------------------------------------------------ /// + /// Constructs an empty Callback action. + /// + public CallbackAction() {} + /// /// Constructs a CallbackAction that represents a call to the specified method on the /// specified target. /// diff --git a/SHADE_CSharp/src/Events/CallbackEvent.cs b/SHADE_CSharp/src/Events/CallbackEvent.cs index 7b30a8ec..ec464ba9 100644 --- a/SHADE_CSharp/src/Events/CallbackEvent.cs +++ b/SHADE_CSharp/src/Events/CallbackEvent.cs @@ -22,6 +22,10 @@ namespace SHADE /// public interface ICallbackEvent { + /// + /// Registers an empty ICallbackAction. + /// + void RegisterAction(); /// /// Registers an ICallbackAction with the event such that it will be called in /// future @@ -59,6 +63,11 @@ namespace SHADE #region Usage Functions --------------------------------------------------------- /// + public void RegisterAction() + { + actions.Add(new CallbackAction()); + } + /// public void RegisterAction(ICallbackAction action) { // Check if valid action @@ -140,6 +149,11 @@ namespace SHADE #region Usage Functions --------------------------------------------------------- /// + public void RegisterAction() + { + actions.Add(new CallbackAction()); + } + /// public void RegisterAction(ICallbackAction action) { // Check if valid action @@ -221,6 +235,11 @@ namespace SHADE #region Usage Functions --------------------------------------------------------- /// + public void RegisterAction() + { + actions.Add(new CallbackAction()); + } + /// public void RegisterAction(ICallbackAction action) { // Check if valid action @@ -302,6 +321,11 @@ namespace SHADE #region Usage Functions --------------------------------------------------------- /// + public void RegisterAction() + { + actions.Add(new CallbackAction()); + } + /// public void RegisterAction(ICallbackAction action) { // Check if valid action @@ -383,6 +407,11 @@ namespace SHADE #region Usage Functions --------------------------------------------------------- /// + public void RegisterAction() + { + actions.Add(new CallbackAction()); + } + /// public void RegisterAction(ICallbackAction action) { // Check if valid action @@ -464,6 +493,11 @@ namespace SHADE #region Usage Functions --------------------------------------------------------- /// + public void RegisterAction() + { + actions.Add(new CallbackAction()); + } + /// public void RegisterAction(ICallbackAction action) { // Check if valid action @@ -545,6 +579,11 @@ namespace SHADE #region Usage Functions --------------------------------------------------------- /// + public void RegisterAction() + { + actions.Add(new CallbackAction()); + } + /// public void RegisterAction(ICallbackAction action) { // Check if valid action @@ -626,6 +665,11 @@ namespace SHADE #region Usage Functions --------------------------------------------------------- /// + public void RegisterAction() + { + actions.Add(new CallbackAction()); + } + /// public void RegisterAction(ICallbackAction action) { // Check if valid action @@ -707,6 +751,11 @@ namespace SHADE #region Usage Functions --------------------------------------------------------- /// + public void RegisterAction() + { + actions.Add(new CallbackAction()); + } + /// public void RegisterAction(ICallbackAction action) { // Check if valid action @@ -788,6 +837,11 @@ namespace SHADE #region Usage Functions --------------------------------------------------------- /// + public void RegisterAction() + { + actions.Add(new CallbackAction()); + } + /// public void RegisterAction(ICallbackAction action) { // Check if valid action diff --git a/SHADE_CSharp/src/Events/CallbackEvent.tt b/SHADE_CSharp/src/Events/CallbackEvent.tt index 74fadd08..6a545601 100644 --- a/SHADE_CSharp/src/Events/CallbackEvent.tt +++ b/SHADE_CSharp/src/Events/CallbackEvent.tt @@ -38,6 +38,10 @@ namespace SHADE /// public interface ICallbackEvent { + /// + /// Registers an empty ICallbackAction. + /// + void RegisterAction(); /// /// Registers an ICallbackAction with the event such that it will be called in /// future @@ -76,6 +80,11 @@ namespace SHADE #region Usage Functions --------------------------------------------------------- /// + public void RegisterAction() + { + actions.Add(new CallbackAction<<# for (int t = 1; t < i + 1; ++t) { #>T<#=t#><# if (t != i) { #>, <# } #><# } #>>()); + } + /// public void RegisterAction(ICallbackAction action) { // Check if valid action diff --git a/SHADE_Engine/src/Editor/SHEditorUI.cpp b/SHADE_Engine/src/Editor/SHEditorUI.cpp index 7107778d..0137b951 100644 --- a/SHADE_Engine/src/Editor/SHEditorUI.cpp +++ b/SHADE_Engine/src/Editor/SHEditorUI.cpp @@ -54,7 +54,7 @@ namespace SHADE /*-----------------------------------------------------------------------------------*/ bool SHEditorUI::CollapsingHeader(const std::string& title) { - return ImGui::CollapsingHeader(title.c_str()); + return ImGui::CollapsingHeader(title.c_str(), ImGuiTreeNodeFlags_DefaultOpen); } void SHEditorUI::SameLine() diff --git a/SHADE_Engine/src/Scripting/SHScriptEngine.cpp b/SHADE_Engine/src/Scripting/SHScriptEngine.cpp index fea59353..195d8ee3 100644 --- a/SHADE_Engine/src/Scripting/SHScriptEngine.cpp +++ b/SHADE_Engine/src/Scripting/SHScriptEngine.cpp @@ -255,6 +255,10 @@ namespace SHADE ..\\bin\\Debug\\SHADE_Managed.dll\n\ ..\\bin\\Release\\SHADE_Managed.dll\n\ \n\ + \n\ + ..\\bin\\Debug\\SHADE_CSharp.dll\n\ + ..\\bin\\Release\\SHADE_CSharp.dll\n\ + \n\ \n\ "; diff --git a/SHADE_Managed/src/Editor/Editor.cxx b/SHADE_Managed/src/Editor/Editor.cxx index c2b34d44..018a9591 100644 --- a/SHADE_Managed/src/Editor/Editor.cxx +++ b/SHADE_Managed/src/Editor/Editor.cxx @@ -286,17 +286,59 @@ namespace SHADE registerUndoAction(object, field, Convert::ToCLI(val), Convert::ToCLI(oldVal)); } } - else if (field->FieldType->BaseType == ICallbackEvent::typeid) - { - // Needs to present - // - name and param list - // Needs to present for each callbackaction - // - object, methodinfo OR action - // - Ways to add or remove items - } else { - return; + array^ interfaces = field->FieldType->GetInterfaces(); + if (interfaces->Length > 0 && interfaces[0] == ICallbackEvent::typeid) + { + array^ typeArgs = field->FieldType->GenericTypeArguments; + System::String^ title = field->Name + " : CallbackEvent<"; + for (int i = 0; i < typeArgs->Length; ++i) + { + title += typeArgs[i]->Name; + if (i < typeArgs->Length - 1) + title += ", "; + } + title += ">"; + if (SHEditorUI::CollapsingHeader(Convert::ToNative(title))) + { + ICallbackEvent^ callbackEvent = safe_cast(field->GetValue(object)); + if (callbackEvent == nullptr) + { + // Construct one since it was not constructed before + callbackEvent = safe_cast(System::Activator::CreateInstance(field->FieldType)); + } + for each (ICallbackAction ^ action in callbackEvent->Actions) + { + if (action->IsRuntimeAction) + continue; + + if (action->TargetObject == nullptr) + SHEditorUI::Text("Target Object"); + else + SHEditorUI::Text(Convert::ToNative(action->TargetObject->GetType()->Name)); + SHEditorUI::SameLine(); + + if (action->TargetMethodName == nullptr) + SHEditorUI::Text("Target Method Name"); + else + SHEditorUI::Text(Convert::ToNative(action->TargetMethodName)); + } + if (SHEditorUI::Button("Add Action")) + { + callbackEvent->RegisterAction(); + } + } + // Needs to present + // - name and param list + // Needs to present for each callbackaction + // - object, methodinfo OR action + // - Ways to add or remove items + } + else + { + return; + } } // Check if the field has a specific attribute diff --git a/TempScriptsFolder/RaccoonSpin.cs b/TempScriptsFolder/RaccoonSpin.cs index d6ee1c9f..6bbd1462 100644 --- a/TempScriptsFolder/RaccoonSpin.cs +++ b/TempScriptsFolder/RaccoonSpin.cs @@ -7,6 +7,10 @@ public class RaccoonSpin : Script [Tooltip("Speed of the rotation in radians per second.")] private double RotateSpeed = 1.0; private double rotation = 0.0; + [SerializeField] + private CallbackEvent testEvent; + [SerializeField] + private CallbackEvent testEvent3 = new CallbackEvent(); private Transform Transform; public RaccoonSpin(GameObject gameObj) : base(gameObj) { } From f64f13521b000f2c2dabeae1a2710958f6ea4e5e Mon Sep 17 00:00:00 2001 From: Sri Sham Haran Date: Tue, 25 Oct 2022 08:42:51 +0800 Subject: [PATCH 16/92] SHVec to yaml node convert --- Assets/Editor/Layouts/UserLayout.ini | 54 ------- .../src/Serialization/SHSerialization.cpp | 4 + .../Serialization/SHSerializationHelper.hpp | 132 +++++++++++++++--- 3 files changed, 115 insertions(+), 75 deletions(-) delete mode 100644 Assets/Editor/Layouts/UserLayout.ini diff --git a/Assets/Editor/Layouts/UserLayout.ini b/Assets/Editor/Layouts/UserLayout.ini deleted file mode 100644 index baced6b8..00000000 --- a/Assets/Editor/Layouts/UserLayout.ini +++ /dev/null @@ -1,54 +0,0 @@ -[Window][MainStatusBar] -Pos=0,1060 -Size=1920,20 -Collapsed=0 - -[Window][SHEditorMenuBar] -Pos=0,48 -Size=1920,1012 -Collapsed=0 - -[Window][Hierarchy Panel] -Pos=0,142 -Size=387,918 -Collapsed=0 -DockId=0x00000004,0 - -[Window][Debug##Default] -Pos=60,60 -Size=400,400 -Collapsed=0 - -[Window][Inspector] -Pos=1649,48 -Size=271,1012 -Collapsed=0 -DockId=0x00000006,0 - -[Window][Profiler] -Pos=0,48 -Size=387,92 -Collapsed=0 -DockId=0x00000003,0 - -[Window][Viewport] -Pos=648,48 -Size=2519,1319 -Collapsed=0 -DockId=0x00000002,0 - -[Window][ Viewport] -Pos=389,48 -Size=1258,1012 -Collapsed=0 -DockId=0x00000002,0 - -[Docking][Data] -DockSpace ID=0xC5C9B8AB Window=0xBE4044E9 Pos=8,79 Size=1920,1012 Split=X - DockNode ID=0x00000005 Parent=0xC5C9B8AB SizeRef=1992,1036 Split=X - DockNode ID=0x00000001 Parent=0x00000005 SizeRef=387,1036 Split=Y Selected=0x1E6EB881 - DockNode ID=0x00000003 Parent=0x00000001 SizeRef=225,94 Selected=0x1E6EB881 - DockNode ID=0x00000004 Parent=0x00000001 SizeRef=225,940 Selected=0xE096E5AE - DockNode ID=0x00000002 Parent=0x00000005 SizeRef=1258,1036 CentralNode=1 Selected=0xB41284E7 - DockNode ID=0x00000006 Parent=0xC5C9B8AB SizeRef=271,1036 Selected=0xE7039252 - diff --git a/SHADE_Engine/src/Serialization/SHSerialization.cpp b/SHADE_Engine/src/Serialization/SHSerialization.cpp index 3804db95..3e569690 100644 --- a/SHADE_Engine/src/Serialization/SHSerialization.cpp +++ b/SHADE_Engine/src/Serialization/SHSerialization.cpp @@ -192,6 +192,10 @@ namespace SHADE { components[rttr::type::get().get_name().data()] = SHSerializationHelper::SerializeComponentToNode(rigidbody); } + if (const auto collisionComp = SHComponentManager::GetComponent_s(eid)) + { + components[rttr::type::get().get_name().data()] = SHSerializationHelper::SerializeComponentToNode(collisionComp); + } node[ComponentsNode] = components; YAML::Node scripts; diff --git a/SHADE_Engine/src/Serialization/SHSerializationHelper.hpp b/SHADE_Engine/src/Serialization/SHSerializationHelper.hpp index da98c885..f8b55d7e 100644 --- a/SHADE_Engine/src/Serialization/SHSerializationHelper.hpp +++ b/SHADE_Engine/src/Serialization/SHSerializationHelper.hpp @@ -9,46 +9,125 @@ #include "Math/Vector/SHVec2.h" #include "Math/Vector/SHVec3.h" #include "Math/Vector/SHVec4.h" +#include "Physics/Components/SHColliderComponent.h" + +namespace YAML +{ + using namespace SHADE; + + template<> + struct convert + { + static constexpr const char* x = "x"; + static constexpr const char* y = "y"; + static constexpr const char* z = "z"; + static constexpr const char* w = "w"; + + static Node encode(SHVec4 const& rhs) + { + Node node; + node.SetStyle(EmitterStyle::Flow); + node[x] = rhs.x; + node[y] = rhs.y; + node[z] = rhs.z; + node[w] = rhs.w; + return node; + } + static bool decode(Node const& node, SHVec4& rhs) + { + if(node[x]) + rhs.x = node[x].as(); + if(node[y]) + rhs.y = node[y].as(); + if(node[z]) + rhs.z = node[z].as(); + if(node[w]) + rhs.w = node[w].as(); + return true; + } + }; + + template<> + struct convert + { + static constexpr const char* x = "x"; + static constexpr const char* y = "y"; + static constexpr const char* z = "z"; + + static Node encode(SHVec3 const& rhs) + { + Node node; + node.SetStyle(EmitterStyle::Flow); + node[x] = rhs.x; + node[y] = rhs.y; + node[z] = rhs.z; + return node; + } + static bool decode(Node const& node, SHVec3& rhs) + { + if(node[x]) + rhs.x = node[x].as(); + if(node[y]) + rhs.y = node[y].as(); + if(node[z]) + rhs.z = node[z].as(); + return true; + } + }; + + template<> + struct convert + { + static constexpr const char* x = "x"; + static constexpr const char* y = "y"; + + static Node encode(SHVec2 const& rhs) + { + Node node; + node.SetStyle(EmitterStyle::Flow); + node[x] = rhs.x; + node[y] = rhs.y; + return node; + } + static bool decode(Node const& node, SHVec2& rhs) + { + if(node[x]) + rhs.x = node[x].as(); + if(node[y]) + rhs.y = node[y].as(); + return true; + } + }; +} namespace SHADE { struct SHSerializationHelper { - template , bool> = true> - static std::string SerializeComponentToString(ComponentType* component) - { - return std::string(); - } - template , bool> = true> - static void SerializeComponentToFile(ComponentType* component, std::filesystem::path const& path) - { - } static YAML::Node RTTRToNode(const rttr::variant& var) { YAML::Node node; auto varType = var.get_type(); + if(varType.is_sequential_container()) + { + for(auto const& elem : var.create_sequential_view()) + { + node.push_back(RTTRToNode(elem)); + } + } if (varType == rttr::type::get()) { - node.SetStyle(YAML::EmitterStyle::Flow); - node["X"] = var.convert().x; - node["Y"] = var.convert().y; - node["Z"] = var.convert().z; - node["W"] = var.convert().w; + node = YAML::convert::encode(var.convert()); } else if (varType == rttr::type::get()) { - node.SetStyle(YAML::EmitterStyle::Flow); - node["X"] = var.convert().x; - node["Y"] = var.convert().y; - node["Z"] = var.convert().z; + node = YAML::convert::encode(var.convert()); } else if (varType == rttr::type::get()) { - node.SetStyle(YAML::EmitterStyle::Flow); - node["X"] = var.convert().x; - node["Y"] = var.convert().y; + node = YAML::convert::encode(var.convert()); } else if (varType.is_arithmetic()) { @@ -107,6 +186,17 @@ namespace SHADE return node; } + template , bool> = true> + static std::string SerializeComponentToString(ComponentType* component) + { + return std::string(); + } + + template , bool> = true> + static void SerializeComponentToFile(ComponentType* component, std::filesystem::path const& path) + { + } + template , bool> = true> static YAML::Node SerializeComponentToNode(ComponentType* component) { From 8466309e2fc43119e56708348d2999d346442ba8 Mon Sep 17 00:00:00 2001 From: Sri Sham Haran Date: Tue, 25 Oct 2022 15:09:45 +0800 Subject: [PATCH 17/92] Serialize/Deserialize SHCollider & SHColliderComponent --- .../HierarchyPanel/SHHierarchyPanel.cpp | 29 ++- .../HierarchyPanel/SHHierarchyPanel.h | 4 +- .../src/Serialization/SHSerialization.cpp | 12 +- .../Serialization/SHSerializationHelper.hpp | 203 ++++++++++++++++-- 4 files changed, 221 insertions(+), 27 deletions(-) diff --git a/SHADE_Engine/src/Editor/EditorWindow/HierarchyPanel/SHHierarchyPanel.cpp b/SHADE_Engine/src/Editor/EditorWindow/HierarchyPanel/SHHierarchyPanel.cpp index 27e46d98..5d7b6a81 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/HierarchyPanel/SHHierarchyPanel.cpp +++ b/SHADE_Engine/src/Editor/EditorWindow/HierarchyPanel/SHHierarchyPanel.cpp @@ -48,15 +48,28 @@ namespace SHADE if (Begin()) { + if(skipFrame) + { + ImGui::End(); + skipFrame = false; + return; + } DrawMenuBar(); auto const& sceneGraph = SHSceneManager::GetCurrentSceneGraph(); - if(const auto root = sceneGraph.GetRoot()) + + if (const auto root = sceneGraph.GetRoot()) { auto const& children = root->GetChildren(); - + for (const auto child : children) { - RecursivelyDrawEntityNode(child); + if(child) + RecursivelyDrawEntityNode(child); + if(skipFrame) + { + ImGui::End(); + return; + } } } else @@ -120,8 +133,10 @@ namespace SHADE } } - ImRect SHHierarchyPanel::RecursivelyDrawEntityNode(SHSceneNode* currentNode) + ImRect SHHierarchyPanel::RecursivelyDrawEntityNode(SHSceneNode* const currentNode) { + if(currentNode == nullptr) + return {}; auto const& sceneGraph = SHSceneManager::GetCurrentSceneGraph(); //Get node data (Children, eid, selected) @@ -193,10 +208,16 @@ namespace SHADE if(ImGui::Selectable("Paste")) { SetScrollTo(SHSerialization::DeserializeEntitiesFromString(SHClipboardUtilities::GetDataFromClipboard())); + skipFrame = true; + ImGui::EndPopup(); + if(isNodeOpen) + ImGui::TreePop(); + return nodeRect; } if(ImGui::Selectable("Paste as Child")) { SetScrollTo(SHSerialization::DeserializeEntitiesFromString(SHClipboardUtilities::GetDataFromClipboard(), eid)); + skipFrame = true; } if(ImGui::Selectable(std::format("{} Delete", ICON_MD_DELETE).data())) { diff --git a/SHADE_Engine/src/Editor/EditorWindow/HierarchyPanel/SHHierarchyPanel.h b/SHADE_Engine/src/Editor/EditorWindow/HierarchyPanel/SHHierarchyPanel.h index 0cfe6474..8fae5d6d 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/HierarchyPanel/SHHierarchyPanel.h +++ b/SHADE_Engine/src/Editor/EditorWindow/HierarchyPanel/SHHierarchyPanel.h @@ -26,10 +26,12 @@ namespace SHADE void SetScrollTo(EntityID eid); private: void DrawMenuBar() const noexcept; - ImRect RecursivelyDrawEntityNode(SHSceneNode*); + ImRect RecursivelyDrawEntityNode(SHSceneNode* const); void CreateChildEntity(EntityID parentEID) const noexcept; void ParentSelectedEntities(EntityID parentEID) const noexcept; void SelectRangeOfEntities(EntityID beginEID, EntityID EndEID); + + bool skipFrame = false; std::string filter; bool isAnyNodeSelected = false; EntityID scrollTo = MAX_EID; diff --git a/SHADE_Engine/src/Serialization/SHSerialization.cpp b/SHADE_Engine/src/Serialization/SHSerialization.cpp index 3e569690..31b15409 100644 --- a/SHADE_Engine/src/Serialization/SHSerialization.cpp +++ b/SHADE_Engine/src/Serialization/SHSerialization.cpp @@ -85,6 +85,8 @@ namespace SHADE // Deserialise scripts if (node[ScriptsNode]) SHSystemManager::GetSystem()->DeserialiseScripts(eid, node[ScriptsNode]); + + return eid; } void SHSerialization::DeserializeSceneFromFile(std::filesystem::path const& path) @@ -192,9 +194,9 @@ namespace SHADE { components[rttr::type::get().get_name().data()] = SHSerializationHelper::SerializeComponentToNode(rigidbody); } - if (const auto collisionComp = SHComponentManager::GetComponent_s(eid)) + if (auto collisionComp = SHComponentManager::GetComponent_s(eid)) { - components[rttr::type::get().get_name().data()] = SHSerializationHelper::SerializeComponentToNode(collisionComp); + components[rttr::type::get().get_name().data()] = YAML::convert::encode(*collisionComp); } node[ComponentsNode] = components; @@ -254,6 +256,10 @@ namespace SHADE if (id.has_value()) componentIDList.push_back(id.value()); + id = GetComponentID(componentsNode); + if(id.has_value()) + componentIDList.push_back(id.value()); + return componentIDList; } @@ -263,5 +269,7 @@ namespace SHADE if (!componentsNode) return; SHSerializationHelper::InitializeComponentFromNode(componentsNode, eid); + SHSerializationHelper::InitializeComponentFromNode(componentsNode, eid); + SHSerializationHelper::InitializeComponentFromNodeData(componentsNode, eid); } } diff --git a/SHADE_Engine/src/Serialization/SHSerializationHelper.hpp b/SHADE_Engine/src/Serialization/SHSerializationHelper.hpp index f8b55d7e..6d52df7d 100644 --- a/SHADE_Engine/src/Serialization/SHSerializationHelper.hpp +++ b/SHADE_Engine/src/Serialization/SHSerializationHelper.hpp @@ -35,13 +35,13 @@ namespace YAML } static bool decode(Node const& node, SHVec4& rhs) { - if(node[x]) + if (node[x]) rhs.x = node[x].as(); - if(node[y]) + if (node[y]) rhs.y = node[y].as(); - if(node[z]) + if (node[z]) rhs.z = node[z].as(); - if(node[w]) + if (node[w]) rhs.w = node[w].as(); return true; } @@ -65,11 +65,11 @@ namespace YAML } static bool decode(Node const& node, SHVec3& rhs) { - if(node[x]) + if (node[x]) rhs.x = node[x].as(); - if(node[y]) + if (node[y]) rhs.y = node[y].as(); - if(node[z]) + if (node[z]) rhs.z = node[z].as(); return true; } @@ -91,13 +91,162 @@ namespace YAML } static bool decode(Node const& node, SHVec2& rhs) { - if(node[x]) + if (node[x]) rhs.x = node[x].as(); - if(node[y]) + if (node[y]) rhs.y = node[y].as(); return true; } }; + + template<> + struct convert + { + static constexpr const char* IsTrigger = "Is Trigger"; + + static constexpr const char* Type = "Type"; + static constexpr const char* HalfExtents = "Half Extents"; + static constexpr const char* Radius = "Radius"; + + static constexpr const char* Friction = "Friction"; + static constexpr const char* Bounciness = "Bounciness"; + static constexpr const char* Density = "Density"; + static constexpr const char* PositionOffset = "Position Offset"; + + static Node encode(SHCollider& rhs) + { + Node node; + node[IsTrigger] = rhs.IsTrigger(); + + rttr::type const shapeRttrType = rttr::type::get(); + rttr::enumeration const enumAlign = shapeRttrType.get_enumeration(); + SHCollider::Type colliderType = rhs.GetType(); + + node[Type] = enumAlign.value_to_name(colliderType).data(); + + switch (colliderType) + { + case SHCollider::Type::BOX: + { + auto const bb = reinterpret_cast(rhs.GetShape()); + node[HalfExtents] = bb->GetHalfExtents(); + } + break; + case SHCollider::Type::SPHERE: + { + auto const bs = reinterpret_cast(rhs.GetShape()); + node[Radius] = bs->GetRadius(); + } + break; + case SHCollider::Type::CAPSULE: break; + default:; + } + + node[Friction] = rhs.GetFriction(); + node[Bounciness] = rhs.GetBounciness(); + node[Density] = rhs.GetDensity(); + node[PositionOffset] = rhs.GetPositionOffset(); + + return node; + } + static bool decode(Node const& node, SHCollider& rhs) + { + if (node[IsTrigger]) + rhs.SetIsTrigger(node[IsTrigger].as()); + if (!node[Type]) + return false; + rttr::type const shapeRttrType = rttr::type::get(); + rttr::enumeration const enumAlign = shapeRttrType.get_enumeration(); + bool ok; + const SHCollider::Type colliderType = enumAlign.name_to_value(node[Type].as()).convert(&ok); + if (!ok) + return false; + switch (colliderType) + { + case SHCollider::Type::BOX: + { + if(auto const bb = dynamic_cast(rhs.GetShape()); bb) + { + if (node[HalfExtents]) + { + bb->SetHalfExtents(node[HalfExtents].as()); + } + } + } + break; + case SHCollider::Type::SPHERE: + { + if(auto const bs = dynamic_cast(rhs.GetShape()); bs) + { + if (node[Radius]) + { + bs->SetRadius(node[Radius].as()); + } + } + } + break; + case SHCollider::Type::CAPSULE: break; + default:; + } + if (node[Friction]) + rhs.SetFriction(node[Friction].as()); + if (node[Bounciness]) + rhs.SetBounciness(rhs.GetBounciness()); + if (node[Density]) + rhs.SetDensity(node[Density].as()); + if (node[PositionOffset]) + rhs.SetPositionOffset(node[PositionOffset].as()); + + return true; + } + }; + + template<> + struct convert + { + static constexpr const char* Colliders = "Colliders"; + static Node encode(SHColliderComponent& rhs) + { + Node node, collidersNode; + auto const& colliders = rhs.GetColliders(); + int const numColliders = static_cast(colliders.size()); + for (int i = 0; i < numColliders; ++i) + { + auto& collider = rhs.GetCollider(i); + Node colliderNode = convert::encode(collider); + if (colliderNode.IsDefined()) + collidersNode[i] = colliderNode; + } + node[Colliders] = collidersNode; + return node; + } + static bool decode(Node const& node, SHColliderComponent& rhs) + { + if(node.IsNull()) + return false; + if (node[Colliders]) + { + int numColliders{}; + for (auto const& colliderNode : node[Colliders]) + { + rttr::type const shapeRttrType = rttr::type::get(); + rttr::enumeration const enumAlign = shapeRttrType.get_enumeration(); + bool ok; + const SHCollider::Type colliderType = enumAlign.name_to_value(colliderNode[convert::Type].as()).convert(&ok); + if (!ok) + return false; + switch (colliderType) + { + case SHCollider::Type::BOX: rhs.AddBoundingBox(); break; + case SHCollider::Type::SPHERE: rhs.AddBoundingSphere(); break; + case SHCollider::Type::CAPSULE: break; + default:; + } + rhs.GetCollider(numColliders++) = colliderNode.as(); + } + } + } + }; } namespace SHADE @@ -110,11 +259,11 @@ namespace SHADE { YAML::Node node; auto varType = var.get_type(); - if(varType.is_sequential_container()) + if (varType.is_sequential_container()) { - for(auto const& elem : var.create_sequential_view()) + for (auto const& elem : var.create_sequential_view()) { - node.push_back(RTTRToNode(elem)); + node.push_back(RTTRToNode(elem)); } } if (varType == rttr::type::get()) @@ -178,7 +327,7 @@ namespace SHADE else { auto properties = var.get_type().get_properties(); - for (auto property : properties) + for (auto const& property : properties) { node[property.get_name().data()] = RTTRToNode(property.get_value(var)); } @@ -186,7 +335,7 @@ namespace SHADE return node; } - template , bool> = true> + template , bool> = true> static std::string SerializeComponentToString(ComponentType* component) { return std::string(); @@ -216,17 +365,17 @@ namespace SHADE auto propType = prop.get_type(); if (propType == rttr::type::get()) { - SHVec4 vec{ propertyNode["X"].as(), propertyNode["Y"].as(), propertyNode["Z"].as(), propertyNode["W"].as() }; + SHVec4 vec = propertyNode.as(); prop.set_value(component, vec); } else if (propType == rttr::type::get()) { - SHVec3 vec{ propertyNode["X"].as(), propertyNode["Y"].as(), propertyNode["Z"].as() }; + SHVec3 vec = propertyNode.as(); prop.set_value(component, vec); } else if (propType == rttr::type::get()) { - SHVec2 vec{ propertyNode["X"].as(), propertyNode["Y"].as() }; + SHVec2 vec = propertyNode.as(); prop.set_value(component, vec); } else if (propType.is_arithmetic()) @@ -263,7 +412,7 @@ namespace SHADE else { auto properties = propType.get_properties(); - for (auto property : properties) + for (auto const& property : properties) { InitializeProperty(component, property, propertyNode[property.get_name().data()]); } @@ -273,7 +422,7 @@ namespace SHADE template , bool> = true> static void InitializeComponentFromNode(YAML::Node const& componentsNode, EntityID const& eid) { - auto component = SHComponentManager::GetComponent_s(eid); + ComponentType* component = SHComponentManager::GetComponent_s(eid); if (componentsNode.IsNull() && !component) return; auto rttrType = rttr::type::get(); @@ -283,12 +432,26 @@ namespace SHADE auto properties = rttrType.get_properties(); for (auto const& prop : properties) { - if (componentNode[prop.get_name().data()]) + + if (componentNode[prop.get_name().data()].IsDefined()) { InitializeProperty(component, prop, componentNode[prop.get_name().data()]); } } } + template , bool> = true> + static void InitializeComponentFromNodeData(YAML::Node const& componentsNode, EntityID const& eid) + { + ComponentType* component = SHComponentManager::GetComponent_s(eid); + if (componentsNode.IsNull() && !component) + return; + auto rttrType = rttr::type::get(); + auto componentNode = componentsNode[rttrType.get_name().data()]; + if (componentsNode.IsNull()) + return; + YAML::convert::decode(componentNode, *component); + } + }; } From b4726ae99272813ff2dbef49b7faa511ce30592f Mon Sep 17 00:00:00 2001 From: Xiao Qi Date: Tue, 25 Oct 2022 15:43:36 +0800 Subject: [PATCH 18/92] Removed Shader source library, changed header and enum type locations --- .../src/Assets/Asset Types/SHShaderAsset.h | 9 ++++++++- .../MiddleEnd/Shaders/SHShaderModuleLibrary.cpp | 1 + .../MiddleEnd/Shaders/SHShaderModuleLibrary.h | 1 - .../src/Graphics/MiddleEnd/Shaders/SHShaderType.h | 15 --------------- 4 files changed, 9 insertions(+), 17 deletions(-) delete mode 100644 SHADE_Engine/src/Graphics/MiddleEnd/Shaders/SHShaderType.h diff --git a/SHADE_Engine/src/Assets/Asset Types/SHShaderAsset.h b/SHADE_Engine/src/Assets/Asset Types/SHShaderAsset.h index 2fdf0cb6..47681d79 100644 --- a/SHADE_Engine/src/Assets/Asset Types/SHShaderAsset.h +++ b/SHADE_Engine/src/Assets/Asset Types/SHShaderAsset.h @@ -13,10 +13,17 @@ #include "SHAssetData.h" #include "SH_API.h" #include -#include "Graphics/MiddleEnd/Shaders/SHShaderType.h" namespace SHADE { + enum class SH_SHADER_TYPE : uint8_t + { + VERTEX, + FRAGMENT, + COMPUTE, + INAVLID_TYPE + }; + struct SH_API SHShaderAsset : SHAssetData { /*-----------------------------------------------------------------------*/ diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Shaders/SHShaderModuleLibrary.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Shaders/SHShaderModuleLibrary.cpp index 23d6323c..7fa5168d 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Shaders/SHShaderModuleLibrary.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Shaders/SHShaderModuleLibrary.cpp @@ -1,6 +1,7 @@ #include "SHPch.h" #include "SHShaderModuleLibrary.h" #include "Graphics/Devices/SHVkLogicalDevice.h" +#include "Assets/Asset Types/SHShaderAsset.h" namespace SHADE { diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Shaders/SHShaderModuleLibrary.h b/SHADE_Engine/src/Graphics/MiddleEnd/Shaders/SHShaderModuleLibrary.h index ed942833..aba3a16c 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Shaders/SHShaderModuleLibrary.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Shaders/SHShaderModuleLibrary.h @@ -2,7 +2,6 @@ #define SH_SHADER_MODULE_LIBRARY_H #include "Graphics/Shaders/SHVkShaderModule.h" -#include "SHShaderSourceLibrary.h" #include namespace SHADE diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Shaders/SHShaderType.h b/SHADE_Engine/src/Graphics/MiddleEnd/Shaders/SHShaderType.h deleted file mode 100644 index 77f79f09..00000000 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Shaders/SHShaderType.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef SH_SHADER_TYPE_H -#define SH_SHADER_TYPE_H - -namespace SHADE -{ - enum class SH_SHADER_TYPE : uint8_t - { - VERTEX, - FRAGMENT, - COMPUTE, - INAVLID_TYPE - }; -} - -#endif From 3bdc48260f84e3a7f6641e7585143964acd4ae3e Mon Sep 17 00:00:00 2001 From: Kah Wei Date: Tue, 25 Oct 2022 16:55:50 +0800 Subject: [PATCH 19/92] Improved CallbackEvent inspector --- SHADE_Managed/src/Editor/Editor.cxx | 46 +++++++++++++++++++---------- 1 file changed, 31 insertions(+), 15 deletions(-) diff --git a/SHADE_Managed/src/Editor/Editor.cxx b/SHADE_Managed/src/Editor/Editor.cxx index 018a9591..1097e203 100644 --- a/SHADE_Managed/src/Editor/Editor.cxx +++ b/SHADE_Managed/src/Editor/Editor.cxx @@ -197,7 +197,7 @@ namespace SHADE void Editor::renderScriptInInspector(Entity entity, Script^ script, int index) { // Constants - const std::string LABEL = Convert::ToNative(script->GetType()->Name); + const std::string LABEL = Convert::ToNative(script->GetType()->Name); // Header SHEditorUI::PushID(index); @@ -302,6 +302,10 @@ namespace SHADE title += ">"; if (SHEditorUI::CollapsingHeader(Convert::ToNative(title))) { + // Constants + const std::string LABEL = Convert::ToNative(field->Name); + SHEditorUI::PushID(LABEL); + ICallbackEvent^ callbackEvent = safe_cast(field->GetValue(object)); if (callbackEvent == nullptr) { @@ -313,27 +317,39 @@ namespace SHADE if (action->IsRuntimeAction) continue; - if (action->TargetObject == nullptr) - SHEditorUI::Text("Target Object"); - else - SHEditorUI::Text(Convert::ToNative(action->TargetObject->GetType()->Name)); + // Attempt to get the object if any + int entityId = static_cast(-1); + if (action->TargetObject) + { + Script^ script = safe_cast(action->TargetObject); + if (script) + { + entityId = static_cast(script->Owner.GetEntity()); + } + } + SHEditorUI::InputInt("", entityId); SHEditorUI::SameLine(); - - if (action->TargetMethodName == nullptr) - SHEditorUI::Text("Target Method Name"); - else - SHEditorUI::Text(Convert::ToNative(action->TargetMethodName)); + System::String^ methodName = ""; + if (action->TargetMethodName != nullptr) + { + methodName = action->TargetMethodName; + } + std::string methodNameNative = Convert::ToNative(methodName); + SHEditorUI::InputTextField("", methodNameNative); + SHEditorUI::SameLine(); + if (SHEditorUI::Button("-")) + { + callbackEvent->DeregisterAction(action); + break; + } } if (SHEditorUI::Button("Add Action")) { callbackEvent->RegisterAction(); } + + SHEditorUI::PopID(); } - // Needs to present - // - name and param list - // Needs to present for each callbackaction - // - object, methodinfo OR action - // - Ways to add or remove items } else { From 84ce3696075537f7d326f1ce15f0c13098bda7ca Mon Sep 17 00:00:00 2001 From: Xiao Qi Date: Tue, 25 Oct 2022 21:04:21 +0800 Subject: [PATCH 20/92] Changed shader module library to Import shaders and reflect all on its own Preparation for separation for built in shaders distinction --- SHADE_Engine/src/Assets/SHAssetMacros.h | 14 +-- .../MiddleEnd/Interface/SHGraphicsSystem.cpp | 18 +-- .../Shaders/SHShaderModuleLibrary.cpp | 113 +++++++++++++----- .../MiddleEnd/Shaders/SHShaderModuleLibrary.h | 12 +- 4 files changed, 97 insertions(+), 60 deletions(-) diff --git a/SHADE_Engine/src/Assets/SHAssetMacros.h b/SHADE_Engine/src/Assets/SHAssetMacros.h index c5c8493b..31b96724 100644 --- a/SHADE_Engine/src/Assets/SHAssetMacros.h +++ b/SHADE_Engine/src/Assets/SHAssetMacros.h @@ -78,13 +78,6 @@ constexpr std::string_view MATERIAL_EXTENSION {".shmat"}; constexpr std::string_view TEXTURE_EXTENSION {".shtex"}; constexpr std::string_view MESH_EXTENSION {".shmesh"}; -// EXTERNAL EXTENSIONS -constexpr std::string_view GLSL_EXTENSION{ ".glsl" }; -constexpr std::string_view IMAGE_EXTENSION{ ".png" }; -constexpr std::string_view DDS_EXTENSION{ ".dds" }; -constexpr std::string_view FBX_EXTENSION{ ".fbx" }; -constexpr std::string_view GLTF_EXTENSION{ ".gltf" }; - constexpr std::string_view EXTENSIONS[] = { AUDIO_EXTENSION, SHADER_EXTENSION, @@ -97,6 +90,13 @@ constexpr std::string_view EXTENSIONS[] = { AUDIO_WAV_EXTENSION, }; +// EXTERNAL EXTENSIONS +constexpr std::string_view GLSL_EXTENSION{ ".glsl" }; +constexpr std::string_view IMAGE_EXTENSION{ ".png" }; +constexpr std::string_view DDS_EXTENSION{ ".dds" }; +constexpr std::string_view FBX_EXTENSION{ ".fbx" }; +constexpr std::string_view GLTF_EXTENSION{ ".gltf" }; + constexpr std::string_view EXTERNALS[] = { GLSL_EXTENSION, IMAGE_EXTENSION, diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp index 7ecd92d2..fe3caccd 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp @@ -116,22 +116,8 @@ namespace SHADE transferCmdBuffer = graphicsCmdPool->RequestCommandBuffer(SH_CMD_BUFFER_TYPE::PRIMARY); graphicsTexCmdBuffer = graphicsCmdPool->RequestCommandBuffer(SH_CMD_BUFFER_TYPE::PRIMARY); - - // TODO: This is VERY temporarily here until a more solid resource management system is implemented - shaderSourceLibrary.Init("../../TempShaderFolder/"); - - shaderSourceLibrary.LoadShader(0, "TestCubeVs.glsl", SH_SHADER_TYPE::VERTEX, true); - shaderSourceLibrary.LoadShader(1, "TestCubeFs.glsl", SH_SHADER_TYPE::FRAGMENT, true); - - shaderSourceLibrary.LoadShader(2, "KirschCs.glsl", SH_SHADER_TYPE::COMPUTE, true); - - shaderModuleLibrary.ImportFromSourceLibrary(device, shaderSourceLibrary); - auto cubeVS = shaderModuleLibrary.GetShaderModule("TestCubeVs.glsl"); - auto cubeFS = shaderModuleLibrary.GetShaderModule("TestCubeFs.glsl"); - auto greyscale = shaderModuleLibrary.GetShaderModule("KirschCs.glsl"); - cubeVS->Reflect(); - cubeFS->Reflect(); - greyscale->Reflect(); + shaderModuleLibrary.ImportAllShaderSource(device); + shaderModuleLibrary.ReflectAllShaderModules(); } void SHGraphicsSystem::InitSceneRenderGraph(void) noexcept diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Shaders/SHShaderModuleLibrary.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Shaders/SHShaderModuleLibrary.cpp index 7fa5168d..0d5fc84f 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Shaders/SHShaderModuleLibrary.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Shaders/SHShaderModuleLibrary.cpp @@ -2,6 +2,7 @@ #include "SHShaderModuleLibrary.h" #include "Graphics/Devices/SHVkLogicalDevice.h" #include "Assets/Asset Types/SHShaderAsset.h" +#include "Assets/SHAssetManager.h" namespace SHADE { @@ -19,33 +20,33 @@ namespace SHADE */ /***************************************************************************/ - void SHShaderModuleLibrary::ImportFromSourceLibrary(Handle& logicalDeviceHdl, SHShaderSourceLibrary const& sourceLib) noexcept - { - auto const& sources = sourceLib.GetSourceLibrary(); - for (auto const& source : sources) - { - vk::ShaderStageFlagBits shaderType{}; - switch (source.shaderType) - { - case SH_SHADER_TYPE::VERTEX: - shaderType = vk::ShaderStageFlagBits::eVertex; - break; - case SH_SHADER_TYPE::FRAGMENT: - shaderType = vk::ShaderStageFlagBits::eFragment; - break; - case SH_SHADER_TYPE::COMPUTE: - shaderType = vk::ShaderStageFlagBits::eCompute; - break; - default: - shaderType = vk::ShaderStageFlagBits::eVertex; - break; - } + //void SHShaderModuleLibrary::ImportFromSourceLibrary(Handle& logicalDeviceHdl, SHShaderSourceLibrary const& sourceLib) noexcept + //{ + // auto const& sources = sourceLib.GetSourceLibrary(); + // for (auto const& source : sources) + // { + // vk::ShaderStageFlagBits shaderType{}; + // switch (source.shaderType) + // { + // case SH_SHADER_TYPE::VERTEX: + // shaderType = vk::ShaderStageFlagBits::eVertex; + // break; + // case SH_SHADER_TYPE::FRAGMENT: + // shaderType = vk::ShaderStageFlagBits::eFragment; + // break; + // case SH_SHADER_TYPE::COMPUTE: + // shaderType = vk::ShaderStageFlagBits::eCompute; + // break; + // default: + // shaderType = vk::ShaderStageFlagBits::eVertex; + // break; + // } - Handle newShaderModule = logicalDeviceHdl->CreateShaderModule(source.spirvBinary, "main", shaderType, source.name); - shaderModules.emplace(source.id, newShaderModule); - stringToID.emplace(source.name, source.id); - } - } + // Handle newShaderModule = logicalDeviceHdl->CreateShaderModule(source.spirvBinary, "main", shaderType, source.name); + // shaderModules.emplace(source.id, newShaderModule); + // stringToID.emplace(source.name, source.id); + // } + //} /***************************************************************************/ /*! @@ -59,12 +60,60 @@ namespace SHADE */ /***************************************************************************/ - Handle SHShaderModuleLibrary::GetShaderModule(std::string shaderName) const noexcept + //Handle SHShaderModuleLibrary::GetShaderModule(std::string shaderName) const noexcept + //{ + // if (stringToID.contains(shaderName)) + // return shaderModules.at(stringToID.at(shaderName)); + // else + // return {}; + //} + + void SHShaderModuleLibrary::ImportBuiltInShaderSource(Handle& logicalDeviceHdl) noexcept { - if (stringToID.contains(shaderName)) - return shaderModules.at(stringToID.at(shaderName)); - else - return {}; + uint32_t idCounter{ 0 }; + const AssetID DEFAULT_VS_ID{ 69 }; + const AssetID DEFAULT_FS_ID{ 420 }; + + auto vsData{ SHAssetManager::GetData(DEFAULT_VS_ID) }; + Handle newShaderModule = logicalDeviceHdl->CreateShaderModule(vsData->spirvBinary, "main", shaderType, vsData->name); + shaderModules.emplace(idCounter++, newShaderModule); } -} \ No newline at end of file + void SHShaderModuleLibrary::ImportAllShaderSource(Handle& logicalDeviceHdl) noexcept + { + uint32_t idCounter{ 0 }; + + auto data = SHAssetManager::GetAllDataOfType(AssetType::SHADER); + for (auto const& dataPtr : data) + { + auto shader = dynamic_cast(dataPtr); + vk::ShaderStageFlagBits shaderType{}; + switch (shader->shaderType) + { + case SH_SHADER_TYPE::VERTEX: + shaderType = vk::ShaderStageFlagBits::eVertex; + break; + case SH_SHADER_TYPE::FRAGMENT: + shaderType = vk::ShaderStageFlagBits::eFragment; + break; + case SH_SHADER_TYPE::COMPUTE: + shaderType = vk::ShaderStageFlagBits::eCompute; + break; + default: + shaderType = vk::ShaderStageFlagBits::eVertex; + break; + } + + Handle newShaderModule = logicalDeviceHdl->CreateShaderModule(shader->spirvBinary, "main", shaderType, shader->name); + shaderModules.emplace(idCounter++, newShaderModule); + } + } + + void SHShaderModuleLibrary::ReflectAllShaderModules() noexcept + { + for (auto& module : shaderModules) + { + module.second->Reflect(); + } + } +} diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Shaders/SHShaderModuleLibrary.h b/SHADE_Engine/src/Graphics/MiddleEnd/Shaders/SHShaderModuleLibrary.h index aba3a16c..be4bdbfb 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Shaders/SHShaderModuleLibrary.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Shaders/SHShaderModuleLibrary.h @@ -21,20 +21,22 @@ namespace SHADE /*-----------------------------------------------------------------------*/ //! Stored shader modules std::unordered_map> shaderModules; - - //! We want some sort of interface with strings, instead of ints - std::map stringToID; + std::unordered_map> builtInShaderModules; public: /*-----------------------------------------------------------------------*/ /* PUBLIC MEMBER FUNCTIONS */ /*-----------------------------------------------------------------------*/ - void ImportFromSourceLibrary(Handle& logicalDeviceHdl, SHShaderSourceLibrary const& sourceLib) noexcept; + //void ImportFromSourceLibrary(Handle& logicalDeviceHdl, SHShaderSourceLibrary const& sourceLib) noexcept; /*-----------------------------------------------------------------------*/ /* SETTERS AND GETTERS */ /*-----------------------------------------------------------------------*/ - Handle GetShaderModule(std::string shaderName) const noexcept; + //Handle GetShaderModule(std::string shaderName) const noexcept; + + void ImportBuiltInShaderSource(Handle& logicalDeviceHdl) noexcept; + void ImportAllShaderSource(Handle& logicalDeviceHdl) noexcept; + void ReflectAllShaderModules() noexcept; }; } From c0c6d35b295d0ee8a9fbd94a76e9c6b1be4ccdbe Mon Sep 17 00:00:00 2001 From: Xiao Qi Date: Wed, 26 Oct 2022 01:53:08 +0800 Subject: [PATCH 21/92] Split function in shader module library to get vk flag conversion Changed some calls to get build in modules --- .../MiddleEnd/Interface/SHGraphicsSystem.cpp | 4 +- .../Shaders/SHShaderModuleLibrary.cpp | 69 +++++++++++-------- .../MiddleEnd/Shaders/SHShaderModuleLibrary.h | 9 +-- 3 files changed, 49 insertions(+), 33 deletions(-) diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp index fe3caccd..81be28a7 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp @@ -183,8 +183,8 @@ namespace SHADE worldRenderer->SetCameraDirector(cameraSystem->CreateDirector()); - auto cubeVS = shaderModuleLibrary.GetShaderModule("TestCubeVs.glsl"); - auto cubeFS = shaderModuleLibrary.GetShaderModule("TestCubeFs.glsl"); + auto cubeVS = shaderModuleLibrary.GetBuiltInShaderModule("TestCubeVs.glsl"); + auto cubeFS = shaderModuleLibrary.GetBuiltInShaderModule("TestCubeFs.glsl"); defaultMaterial = AddMaterial(cubeVS, cubeFS, gBufferWriteSubpass); diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Shaders/SHShaderModuleLibrary.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Shaders/SHShaderModuleLibrary.cpp index 0d5fc84f..15b0111d 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Shaders/SHShaderModuleLibrary.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Shaders/SHShaderModuleLibrary.cpp @@ -1,7 +1,6 @@ #include "SHPch.h" #include "SHShaderModuleLibrary.h" #include "Graphics/Devices/SHVkLogicalDevice.h" -#include "Assets/Asset Types/SHShaderAsset.h" #include "Assets/SHAssetManager.h" namespace SHADE @@ -68,45 +67,61 @@ namespace SHADE // return {}; //} - void SHShaderModuleLibrary::ImportBuiltInShaderSource(Handle& logicalDeviceHdl) noexcept + vk::ShaderStageFlagBits SHShaderModuleLibrary::GetVkShaderFlag(SH_SHADER_TYPE type) noexcept { - uint32_t idCounter{ 0 }; - const AssetID DEFAULT_VS_ID{ 69 }; - const AssetID DEFAULT_FS_ID{ 420 }; + vk::ShaderStageFlagBits shaderType{}; + switch (type) + { + case SH_SHADER_TYPE::VERTEX: + shaderType = vk::ShaderStageFlagBits::eVertex; + break; + case SH_SHADER_TYPE::FRAGMENT: + shaderType = vk::ShaderStageFlagBits::eFragment; + break; + case SH_SHADER_TYPE::COMPUTE: + shaderType = vk::ShaderStageFlagBits::eCompute; + break; + default: + shaderType = vk::ShaderStageFlagBits::eVertex; + break; + } - auto vsData{ SHAssetManager::GetData(DEFAULT_VS_ID) }; - Handle newShaderModule = logicalDeviceHdl->CreateShaderModule(vsData->spirvBinary, "main", shaderType, vsData->name); - shaderModules.emplace(idCounter++, newShaderModule); + return shaderType; + } + + Handle SHShaderModuleLibrary::GetBuiltInShaderModule(std::string shaderName) const noexcept + { + if (builtInShaderModules.contains(shaderName)) + return shaderModules.at(builtInShaderModules.at(shaderName)); + else + return {}; } void SHShaderModuleLibrary::ImportAllShaderSource(Handle& logicalDeviceHdl) noexcept { uint32_t idCounter{ 0 }; - auto data = SHAssetManager::GetAllDataOfType(AssetType::SHADER); + auto const data = SHAssetManager::GetAllDataOfType(AssetType::SHADER); for (auto const& dataPtr : data) { - auto shader = dynamic_cast(dataPtr); - vk::ShaderStageFlagBits shaderType{}; - switch (shader->shaderType) - { - case SH_SHADER_TYPE::VERTEX: - shaderType = vk::ShaderStageFlagBits::eVertex; - break; - case SH_SHADER_TYPE::FRAGMENT: - shaderType = vk::ShaderStageFlagBits::eFragment; - break; - case SH_SHADER_TYPE::COMPUTE: - shaderType = vk::ShaderStageFlagBits::eCompute; - break; - default: - shaderType = vk::ShaderStageFlagBits::eVertex; - break; - } + auto const shader = dynamic_cast(dataPtr); + + Handle newShaderModule = + logicalDeviceHdl->CreateShaderModule(shader->spirvBinary, "main", GetVkShaderFlag(shader->shaderType), shader->name); - Handle newShaderModule = logicalDeviceHdl->CreateShaderModule(shader->spirvBinary, "main", shaderType, shader->name); shaderModules.emplace(idCounter++, newShaderModule); } + + auto const builtIn = SHAssetManager::GetAllDataOfType(AssetType::SHADER_BUILT_IN); + for (auto const& dataPtr : builtIn) + { + auto const shader = dynamic_cast(dataPtr); + + Handle newShaderModule = + logicalDeviceHdl->CreateShaderModule(shader->spirvBinary, "main", GetVkShaderFlag(shader->shaderType), shader->name); + + builtInShaderModules.emplace(shader->name, newShaderModule); + } } void SHShaderModuleLibrary::ReflectAllShaderModules() noexcept diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Shaders/SHShaderModuleLibrary.h b/SHADE_Engine/src/Graphics/MiddleEnd/Shaders/SHShaderModuleLibrary.h index be4bdbfb..9daae816 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Shaders/SHShaderModuleLibrary.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Shaders/SHShaderModuleLibrary.h @@ -2,7 +2,7 @@ #define SH_SHADER_MODULE_LIBRARY_H #include "Graphics/Shaders/SHVkShaderModule.h" -#include +#include "Assets/Asset Types/SHShaderAsset.h" namespace SHADE { @@ -23,6 +23,8 @@ namespace SHADE std::unordered_map> shaderModules; std::unordered_map> builtInShaderModules; + inline vk::ShaderStageFlagBits GetVkShaderFlag(SH_SHADER_TYPE type) noexcept; + public: /*-----------------------------------------------------------------------*/ /* PUBLIC MEMBER FUNCTIONS */ @@ -32,9 +34,8 @@ namespace SHADE /*-----------------------------------------------------------------------*/ /* SETTERS AND GETTERS */ /*-----------------------------------------------------------------------*/ - //Handle GetShaderModule(std::string shaderName) const noexcept; - - void ImportBuiltInShaderSource(Handle& logicalDeviceHdl) noexcept; + Handle GetBuiltInShaderModule(std::string shaderName) const noexcept; + void ImportAllShaderSource(Handle& logicalDeviceHdl) noexcept; void ReflectAllShaderModules() noexcept; }; From 54796773b2145f66f2dc57c6cd0b0f6cea6d820d Mon Sep 17 00:00:00 2001 From: Xiao Qi Date: Wed, 26 Oct 2022 01:53:26 +0800 Subject: [PATCH 22/92] Added built in shader extension Collision check for asset IDs --- SHADE_Engine/src/Assets/SHAssetMacros.h | 5 ++++- SHADE_Engine/src/Assets/SHAssetManager.cpp | 9 ++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/SHADE_Engine/src/Assets/SHAssetMacros.h b/SHADE_Engine/src/Assets/SHAssetMacros.h index 31b96724..3b352d4e 100644 --- a/SHADE_Engine/src/Assets/SHAssetMacros.h +++ b/SHADE_Engine/src/Assets/SHAssetMacros.h @@ -45,6 +45,7 @@ enum class AssetType : AssetTypeMeta INVALID = 0, AUDIO = 1, SHADER, + SHADER_BUILT_IN, MATERIAL, IMAGE, TEXTURE, @@ -70,7 +71,8 @@ constexpr std::string_view ASSET_ROOT {"../../Assets"}; constexpr std::string_view META_EXTENSION {".shmeta"}; constexpr std::string_view AUDIO_EXTENSION {".ogg"}; constexpr std::string_view AUDIO_WAV_EXTENSION {".wav"}; -constexpr std::string_view SHADER_EXTENSION{".shshader"}; +constexpr std::string_view SHADER_EXTENSION{ ".shshader" }; +constexpr std::string_view SHADER_BUILT_IN_EXTENSION{".shshaderb"}; constexpr std::string_view SCRIPT_EXTENSION {".cs"}; constexpr std::string_view SCENE_EXTENSION {".shade"}; constexpr std::string_view PREFAB_EXTENSION {".shprefab"}; @@ -81,6 +83,7 @@ constexpr std::string_view MESH_EXTENSION {".shmesh"}; constexpr std::string_view EXTENSIONS[] = { AUDIO_EXTENSION, SHADER_EXTENSION, + SHADER_BUILT_IN_EXTENSION, MATERIAL_EXTENSION, TEXTURE_EXTENSION, MESH_EXTENSION, diff --git a/SHADE_Engine/src/Assets/SHAssetManager.cpp b/SHADE_Engine/src/Assets/SHAssetManager.cpp index 28790dca..3cd4c33c 100644 --- a/SHADE_Engine/src/Assets/SHAssetManager.cpp +++ b/SHADE_Engine/src/Assets/SHAssetManager.cpp @@ -46,7 +46,13 @@ namespace SHADE result |= unique; - while (result == 0) + while (result == 0 || + std::ranges::any_of( + assetCollection.begin(), + assetCollection.end(), + [result](SHAsset const& asset) { return asset.id == result; } + ) + ) { result = GenerateAssetID(type); } @@ -278,6 +284,7 @@ namespace SHADE { loaders[static_cast(AssetType::AUDIO)] = nullptr; loaders[static_cast(AssetType::SHADER)] = dynamic_cast(new SHShaderSourceLoader()); + loaders[static_cast(AssetType::SHADER_BUILT_IN)] = loaders[static_cast(AssetType::SHADER)]; loaders[static_cast(AssetType::MATERIAL)] = nullptr; loaders[static_cast(AssetType::TEXTURE)] = dynamic_cast(new SHTextureLoader()); loaders[static_cast(AssetType::MESH)] = dynamic_cast(new SHMeshLoader()); From d9584a0e39932b403e6ecde24854016309a2a143 Mon Sep 17 00:00:00 2001 From: Sri Sham Haran Date: Wed, 26 Oct 2022 14:32:00 +0800 Subject: [PATCH 23/92] Changed SHEditor.hpp to .h Handle editor camera update when interacting with viewport window only --- .../src/Application/SBApplication.cpp | 4 +- .../HierarchyPanel/SHHierarchyPanel.cpp | 2 +- .../Inspector/SHEditorInspector.cpp | 12 +++-- .../EditorWindow/MenuBar/SHEditorMenuBar.cpp | 2 +- .../ViewportWindow/SHEditorViewport.cpp | 47 ++++++++++++++++++- .../src/Editor/Gizmos/SHTransformGizmo.cpp | 2 +- SHADE_Engine/src/Editor/SHEditor.cpp | 2 +- .../src/Editor/{SHEditor.hpp => SHEditor.h} | 0 .../MiddleEnd/Interface/SHGraphicsSystem.cpp | 2 +- 9 files changed, 60 insertions(+), 13 deletions(-) rename SHADE_Engine/src/Editor/{SHEditor.hpp => SHEditor.h} (100%) diff --git a/SHADE_Application/src/Application/SBApplication.cpp b/SHADE_Application/src/Application/SBApplication.cpp index 54dc0ccf..c6750707 100644 --- a/SHADE_Application/src/Application/SBApplication.cpp +++ b/SHADE_Application/src/Application/SBApplication.cpp @@ -4,7 +4,7 @@ //#define SHEDITOR #ifdef SHEDITOR -#include "Editor/SHEditor.hpp" +#include "Editor/SHEditor.h" //#include "Scenes/SBEditorScene.h" #endif // SHEDITOR @@ -94,7 +94,7 @@ namespace Sandbox SHSystemManager::RegisterRoutine(); SHSystemManager::RegisterRoutine(); - SHSystemManager::RegisterRoutine(); + //SHSystemManager::RegisterRoutine(); SHSystemManager::RegisterRoutine(); #ifdef SHEDITOR diff --git a/SHADE_Engine/src/Editor/EditorWindow/HierarchyPanel/SHHierarchyPanel.cpp b/SHADE_Engine/src/Editor/EditorWindow/HierarchyPanel/SHHierarchyPanel.cpp index f2f8d927..fff0a188 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/HierarchyPanel/SHHierarchyPanel.cpp +++ b/SHADE_Engine/src/Editor/EditorWindow/HierarchyPanel/SHHierarchyPanel.cpp @@ -6,7 +6,7 @@ //#==============================================================# //|| SHADE Includes || //#==============================================================# -#include "Editor/SHEditor.hpp" +#include "Editor/SHEditor.h" #include "Editor/SHImGuiHelpers.hpp" #include "Editor/SHEditorWidgets.hpp" #include "SHHierarchyPanel.h" diff --git a/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorInspector.cpp b/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorInspector.cpp index ada5a35a..511f8642 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorInspector.cpp +++ b/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorInspector.cpp @@ -1,6 +1,6 @@ #include "SHpch.h" -#include "Editor/SHEditor.hpp" +#include "Editor/SHEditor.h" #include "SHEditorInspector.h" #include "ECS_Base/SHECSMacros.h" @@ -92,11 +92,15 @@ namespace SHADE DrawAddComponentButton(eid); DrawAddComponentButton(eid); DrawAddComponentButton(eid); - if(DrawAddComponentButton(eid)) + if (!SHComponentManager::HasComponent(eid)) { - if(SHComponentManager::GetComponent_s(eid) == nullptr) + if (ImGui::Selectable(std::format("Add {}", rttr::type::get().get_name().data()).data())) { - SHComponentManager::AddComponent(eid); + if (SHComponentManager::GetComponent_s(eid) == nullptr) + { + SHComponentManager::AddComponent(eid); + } + SHComponentManager::AddComponent(eid); } } ImGui::EndMenu(); diff --git a/SHADE_Engine/src/Editor/EditorWindow/MenuBar/SHEditorMenuBar.cpp b/SHADE_Engine/src/Editor/EditorWindow/MenuBar/SHEditorMenuBar.cpp index c33f4fb6..50b878a8 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/MenuBar/SHEditorMenuBar.cpp +++ b/SHADE_Engine/src/Editor/EditorWindow/MenuBar/SHEditorMenuBar.cpp @@ -3,7 +3,7 @@ //#==============================================================# //|| SHADE Includes || //#==============================================================# -#include "Editor/SHEditor.hpp" +#include "Editor/SHEditor.h" #include "SHEditorMenuBar.h" #include "Editor/IconsMaterialDesign.h" #include "Editor/Command/SHCommandManager.h" diff --git a/SHADE_Engine/src/Editor/EditorWindow/ViewportWindow/SHEditorViewport.cpp b/SHADE_Engine/src/Editor/EditorWindow/ViewportWindow/SHEditorViewport.cpp index f5170999..17bf6fa5 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/ViewportWindow/SHEditorViewport.cpp +++ b/SHADE_Engine/src/Editor/EditorWindow/ViewportWindow/SHEditorViewport.cpp @@ -5,13 +5,15 @@ #include "ImGuizmo.h" #include "ECS_Base/Managers/SHSystemManager.h" #include "Editor/IconsMaterialDesign.h" -#include "Editor/SHEditor.hpp" +#include "Editor/SHEditor.h" #include "Editor/EditorWindow/HierarchyPanel/SHHierarchyPanel.h" #include "Graphics/MiddleEnd/Interface/SHGraphicsSystem.h" #include "Graphics/Descriptors/SHVkDescriptorSetGroup.h" #include "Graphics/MiddleEnd/Interface/SHMousePickSystem.h" #include +#include "Camera/SHCameraSystem.h" + constexpr std::string_view windowName = "\xef\x80\x95 Viewport"; namespace SHADE @@ -25,6 +27,8 @@ namespace SHADE { SHEditorWindow::Init(); transformGizmo.Init(); + auto camSystem = SHSystemManager::GetSystem(); + camSystem->UpdateEditorCamera(0.016f); } void SHEditorViewport::Update() @@ -51,6 +55,24 @@ namespace SHADE ImGui::PushStyleColor(ImGuiCol_Text, ImGuiColors::green); ImGui::Text(ICON_FA_EYE); ImGui::PopStyleColor(); + + auto camSystem = SHSystemManager::GetSystem(); + camSystem->UpdateEditorCamera(0.016f); + } + if(ImGui::IsWindowFocused() && !ImGui::IsMouseDown(ImGuiMouseButton_Right)) + { + if(ImGui::IsKeyReleased(ImGuiKey_Q)) + { + transformGizmo.operation = SHTransformGizmo::Operation::TRANSLATE; + } + if(ImGui::IsKeyReleased(ImGuiKey_W)) + { + transformGizmo.operation = SHTransformGizmo::Operation::ROTATE; + } + if(ImGui::IsKeyReleased(ImGuiKey_E)) + { + transformGizmo.operation = SHTransformGizmo::Operation::SCALE; + } } } ImGuizmo::SetRect(beginCursorPos.x , beginCursorPos.y, beginContentRegionAvailable.x, beginContentRegionAvailable.y); @@ -77,6 +99,8 @@ namespace SHADE beginContentRegionAvailable = windowSize; } gfxSystem->PrepareResize(static_cast(beginContentRegionAvailable.x), static_cast(beginContentRegionAvailable.y)); + auto camSystem = SHSystemManager::GetSystem(); + camSystem->UpdateEditorCamera(0.016f); } void SHEditorViewport::OnPosChange() @@ -88,6 +112,7 @@ namespace SHADE { if(ImGui::BeginMenuBar()) { + ImGui::BeginDisabled(ImGui::IsWindowFocused() && ImGui::IsMouseDown(ImGuiMouseButton_Right)); bool const isTranslate = transformGizmo.operation == SHTransformGizmo::Operation::TRANSLATE; ImGui::BeginDisabled(isTranslate); if(isTranslate) @@ -97,6 +122,12 @@ namespace SHADE transformGizmo.operation = SHTransformGizmo::Operation::TRANSLATE; } ImGui::EndDisabled(); + if(ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) + { + ImGui::BeginTooltip(); + ImGui::Text("Translate [Q]"); + ImGui::EndTooltip(); + } if(isTranslate) ImGui::PopStyleColor(); @@ -109,6 +140,12 @@ namespace SHADE transformGizmo.operation = SHTransformGizmo::Operation::ROTATE; } ImGui::EndDisabled(); + if(ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) + { + ImGui::BeginTooltip(); + ImGui::Text("Rotate [W]"); + ImGui::EndTooltip(); + } if(isRotate) ImGui::PopStyleColor(); @@ -121,9 +158,15 @@ namespace SHADE transformGizmo.operation = SHTransformGizmo::Operation::SCALE; } ImGui::EndDisabled(); + if(ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) + { + ImGui::BeginTooltip(); + ImGui::Text("Scale [E]"); + ImGui::EndTooltip(); + } if(isScale) ImGui::PopStyleColor(); - + ImGui::EndDisabled(); ImGui::EndMenuBar(); } } diff --git a/SHADE_Engine/src/Editor/Gizmos/SHTransformGizmo.cpp b/SHADE_Engine/src/Editor/Gizmos/SHTransformGizmo.cpp index 3c984051..55e99ff9 100644 --- a/SHADE_Engine/src/Editor/Gizmos/SHTransformGizmo.cpp +++ b/SHADE_Engine/src/Editor/Gizmos/SHTransformGizmo.cpp @@ -3,7 +3,7 @@ #include "ECS_Base/Managers/SHComponentManager.h" #include "ECS_Base/Managers/SHSystemManager.h" -#include "Editor/SHEditor.hpp" +#include "Editor/SHEditor.h" #include "Editor/SHImGuiHelpers.hpp" #include #include diff --git a/SHADE_Engine/src/Editor/SHEditor.cpp b/SHADE_Engine/src/Editor/SHEditor.cpp index 06fadfee..99125e65 100644 --- a/SHADE_Engine/src/Editor/SHEditor.cpp +++ b/SHADE_Engine/src/Editor/SHEditor.cpp @@ -21,7 +21,7 @@ #include "Graphics/MiddleEnd/Interface/SHViewport.h" #include "Graphics/MiddleEnd/Interface/SHRenderer.h" -#include "SHEditor.hpp" +#include "SHEditor.h" #include "SHEditorWidgets.hpp" #include "Math/Transform/SHTransformSystem.h" diff --git a/SHADE_Engine/src/Editor/SHEditor.hpp b/SHADE_Engine/src/Editor/SHEditor.h similarity index 100% rename from SHADE_Engine/src/Editor/SHEditor.hpp rename to SHADE_Engine/src/Editor/SHEditor.h diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp index 4280cafd..8744b083 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp @@ -17,7 +17,7 @@ of DigiPen Institute of Technology is prohibited. #include "Graphics/Windowing/Surface/SHVkSurface.h" #include "Graphics/Swapchain/SHVkSwapchain.h" #include "Camera/SHCameraSystem.h" -#include "Editor/SHEditor.hpp" +#include "Editor/SHEditor.h" #include "ECS_Base/Managers/SHSystemManager.h" //#include "SHRenderer.h" #include "Graphics/Windowing/SHWindow.h" From b013d09f42273ae984ac0b33e7d3efe44b10feeb Mon Sep 17 00:00:00 2001 From: Sri Sham Haran Date: Wed, 26 Oct 2022 15:31:23 +0800 Subject: [PATCH 24/92] Tooltips. editor tweaks --- .../Inspector/SHEditorComponentView.hpp | 47 ++++++++------- .../src/Editor/Gizmos/SHTransformGizmo.cpp | 3 + SHADE_Engine/src/Editor/SHEditorWidgets.hpp | 58 ++++++++++--------- .../Math/Transform/SHTransformComponent.cpp | 7 ++- 4 files changed, 61 insertions(+), 54 deletions(-) diff --git a/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorComponentView.hpp b/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorComponentView.hpp index 7fa39d74..71a31bb8 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorComponentView.hpp +++ b/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorComponentView.hpp @@ -51,8 +51,10 @@ namespace SHADE { if (!component) return; - const auto componentType = rttr::type::get(*component); + const auto componentType = rttr::type::get(); + ImGui::PushID(component->GetEID()); SHEditorWidgets::CheckBox("##IsActive", [component]() {return component->isActive; }, [component](bool const& active) {component->isActive = active; }, "Is Component Active"); + ImGui::PopID(); ImGui::SameLine(); if (ImGui::CollapsingHeader(componentType.get_name().data())) { @@ -61,6 +63,7 @@ namespace SHADE for (auto const& property : properties) { auto const& type = property.get_type(); + auto tooltip = property.get_metadata(META::tooltip); if (type.is_enumeration()) { @@ -75,29 +78,25 @@ namespace SHADE auto values = enumAlign.get_values(); auto it = std::next(values.begin(), idx); property.set_value(component, *it); - }); + }, tooltip.is_valid() ? tooltip.template get_value() : std::string()); } else if (type.is_arithmetic()) { if (type == rttr::type::get()) { - SHEditorWidgets::CheckBox(property.get_name().data(), [component, property] {return property.get_value(component).to_bool(); }, [component, property](bool const& result) {property.set_value(component, result); }); + SHEditorWidgets::CheckBox(property.get_name().data(), [component, property] {return property.get_value(component).to_bool(); }, [component, property](bool const& result) {property.set_value(component, result); }, tooltip.is_valid() ? tooltip.template get_value() : std::string()); } - //else if (type == rttr::type::get()) - //{ - // - //} else if (type == rttr::type::get() || type == rttr::type::get() || type == rttr::type::get() || type == rttr::type::get()) { auto metaMin = property.get_metadata(META::min); auto metaMax = property.get_metadata(META::max); if (metaMin && metaMax) { - SHEditorWidgets::SliderInt(property.get_name().data(), metaMin.template get_value(), metaMax.template get_value(), [component, property] {return property.get_value(component).to_int(); }, [component, property](int const& result) {property.set_value(component, result); }); + SHEditorWidgets::SliderInt(property.get_name().data(), metaMin.template get_value(), metaMax.template get_value(), [component, property] {return property.get_value(component).to_int(); }, [component, property](int const& result) {property.set_value(component, result); }, tooltip.is_valid() ? tooltip.template get_value() : std::string()); } else { - SHEditorWidgets::DragInt(property.get_name().data(), [component, property] {return property.get_value(component).to_int(); }, [component, property](int const& result) {property.set_value(component, result); }); + SHEditorWidgets::DragInt(property.get_name().data(), [component, property] {return property.get_value(component).to_int(); }, [component, property](int const& result) {property.set_value(component, result); }, tooltip.is_valid() ? tooltip.template get_value() : std::string()); } } else if (type == rttr::type::get()) @@ -106,11 +105,11 @@ namespace SHADE auto metaMax = property.get_metadata(META::max); if (metaMin.is_valid() && metaMax.is_valid()) { - SHEditorWidgets::SliderScalar(property.get_name().data(), ImGuiDataType_U8, metaMin.template get_value(), metaMax.template get_value(), [component, property] {return property.get_value(component).to_uint8(); }, [component, property](uint8_t const& result) {property.set_value(component, result); }, "%zu"); + SHEditorWidgets::SliderScalar(property.get_name().data(), ImGuiDataType_U8, metaMin.template get_value(), metaMax.template get_value(), [component, property] {return property.get_value(component).to_uint8(); }, [component, property](uint8_t const& result) {property.set_value(component, result); }, tooltip.is_valid() ? tooltip.template get_value() : std::string(), "%zu"); } else { - SHEditorWidgets::DragScalar(property.get_name().data(), ImGuiDataType_U8, [component, property] {return property.get_value(component).to_uint8(); }, [component, property](uint8_t const& result) {property.set_value(component, result); }, 0.1f, 0, 0, "%zu"); + SHEditorWidgets::DragScalar(property.get_name().data(), ImGuiDataType_U8, [component, property] {return property.get_value(component).to_uint8(); }, [component, property](uint8_t const& result) {property.set_value(component, result); }, 0.1f, 0, 0, "%zu", tooltip.is_valid() ? tooltip.template get_value() : std::string()); } } else if (type == rttr::type::get()) @@ -119,11 +118,11 @@ namespace SHADE auto metaMax = property.get_metadata(META::max); if (metaMin.is_valid() && metaMax.is_valid()) { - SHEditorWidgets::SliderScalar(property.get_name().data(), ImGuiDataType_U16, metaMin.template get_value(), metaMax.template get_value(), [component, property] {return property.get_value(component).to_uint16(); }, [component, property](uint16_t const& result) {property.set_value(component, result); }, "%zu"); + SHEditorWidgets::SliderScalar(property.get_name().data(), ImGuiDataType_U16, metaMin.template get_value(), metaMax.template get_value(), [component, property] {return property.get_value(component).to_uint16(); }, [component, property](uint16_t const& result) {property.set_value(component, result); }, tooltip.is_valid() ? tooltip.template get_value() : std::string(), "%zu"); } else { - SHEditorWidgets::DragScalar(property.get_name().data(), ImGuiDataType_U16, [component, property] {return property.get_value(component).to_uint16(); }, [component, property](uint16_t const& result) {property.set_value(component, result); }, 0.1f, 0, 0, "%zu"); + SHEditorWidgets::DragScalar(property.get_name().data(), ImGuiDataType_U16, [component, property] {return property.get_value(component).to_uint16(); }, [component, property](uint16_t const& result) {property.set_value(component, result); }, 0.1f, 0, 0, "%zu", tooltip.is_valid() ? tooltip.template get_value() : std::string()); } } else if (type == rttr::type::get()) @@ -132,11 +131,11 @@ namespace SHADE auto metaMax = property.get_metadata(META::max); if (metaMin.is_valid() && metaMax.is_valid()) { - SHEditorWidgets::SliderScalar(property.get_name().data(), ImGuiDataType_U32, metaMin.template get_value(), metaMax.template get_value(), [component, property] { return property.get_value(component).to_uint32(); }, [component, property](uint32_t const& result) {property.set_value(component, result); }, "%zu"); + SHEditorWidgets::SliderScalar(property.get_name().data(), ImGuiDataType_U32, metaMin.template get_value(), metaMax.template get_value(), [component, property] { return property.get_value(component).to_uint32(); }, [component, property](uint32_t const& result) {property.set_value(component, result); }, tooltip.is_valid() ? tooltip.template get_value() : std::string(), "%zu"); } else { - SHEditorWidgets::DragScalar(property.get_name().data(), ImGuiDataType_U32, [component, property] { return property.get_value(component).to_uint32(); }, [component, property](uint32_t const& result) {property.set_value(component, result); }, 0.1f, 0, 0, "%zu"); + SHEditorWidgets::DragScalar(property.get_name().data(), ImGuiDataType_U32, [component, property] { return property.get_value(component).to_uint32(); }, [component, property](uint32_t const& result) {property.set_value(component, result); }, 0.1f, 0, 0, "%zu", tooltip.is_valid() ? tooltip.template get_value() : std::string()); } } else if (type == rttr::type::get()) @@ -145,11 +144,11 @@ namespace SHADE auto metaMax = property.get_metadata(META::max); if (metaMin.is_valid() && metaMax.is_valid()) { - SHEditorWidgets::SliderScalar(property.get_name().data(), ImGuiDataType_U64, metaMin.template get_value(), metaMax.template get_value(), [component, property] {return property.get_value(component).to_uint64(); }, [component, property](uint64_t const& result) {property.set_value(component, result); }, "%zu"); + SHEditorWidgets::SliderScalar(property.get_name().data(), ImGuiDataType_U64, metaMin.template get_value(), metaMax.template get_value(), [component, property] {return property.get_value(component).to_uint64(); }, [component, property](uint64_t const& result) {property.set_value(component, result); }, tooltip.is_valid() ? tooltip.template get_value() : std::string(), "%zu"); } else { - SHEditorWidgets::DragScalar(property.get_name().data(), ImGuiDataType_U64, [component, property] {return property.get_value(component).to_uint64(); }, [component, property](uint64_t const& result) {property.set_value(component, result); }, 0.1f, 0, 0, "%zu"); + SHEditorWidgets::DragScalar(property.get_name().data(), ImGuiDataType_U64, [component, property] {return property.get_value(component).to_uint64(); }, [component, property](uint64_t const& result) {property.set_value(component, result); }, 0.1f, 0, 0, "%zu", tooltip.is_valid() ? tooltip.template get_value() : std::string()); } } else if (type == rttr::type::get()) @@ -163,11 +162,11 @@ namespace SHADE max = std::min(metaMax.template get_value(), FLT_MAX * 0.5f); if (metaMin.is_valid() && metaMax.is_valid()) { - SHEditorWidgets::SliderFloat(property.get_name().data(), min, max, [component, property] {return property.get_value(component).to_float(); }, [component, property](float const& result) {property.set_value(component, result); }); + SHEditorWidgets::SliderFloat(property.get_name().data(), min, max, [component, property] {return property.get_value(component).to_float(); }, [component, property](float const& result) {property.set_value(component, result); }, tooltip.is_valid() ? tooltip.template get_value() : std::string()); } else { - SHEditorWidgets::DragFloat(property.get_name().data(), [component, property] {return property.get_value(component).to_float(); }, [component, property](float const& result) {property.set_value(component, result); }, "Test"); + SHEditorWidgets::DragFloat(property.get_name().data(), [component, property] {return property.get_value(component).to_float(); }, [component, property](float const& result) {property.set_value(component, result); }, tooltip.is_valid() ? tooltip.template get_value() : std::string()); } } else if (type == rttr::type::get()) @@ -176,25 +175,25 @@ namespace SHADE auto metaMax = property.get_metadata(META::max); if (metaMin.is_valid() && metaMax.is_valid()) { - SHEditorWidgets::SliderScalar(property.get_name().data(), ImGuiDataType_Double, metaMin.template get_value(), metaMax.template get_value(), [component, property] {return property.get_value(component).to_double(); }, [component, property](double const& result) {property.set_value(component, result); }); + SHEditorWidgets::SliderScalar(property.get_name().data(), ImGuiDataType_Double, metaMin.template get_value(), metaMax.template get_value(), [component, property] {return property.get_value(component).to_double(); }, [component, property](double const& result) {property.set_value(component, result); }, tooltip.is_valid() ? tooltip.template get_value() : std::string()); } else { - SHEditorWidgets::DragScalar(property.get_name().data(), ImGuiDataType_Double, [component, property] {return property.get_value(component).to_double(); }, [component, property](double const& result) {property.set_value(component, result); }, 0.1f); + SHEditorWidgets::DragScalar(property.get_name().data(), ImGuiDataType_Double, [component, property] {return property.get_value(component).to_double(); }, [component, property](double const& result) {property.set_value(component, result); }, 0.1f, {}, {}, "%.3f", tooltip.is_valid() ? tooltip.template get_value() : std::string()); } } } else if (type == rttr::type::get()) { - SHEditorWidgets::DragVec4(property.get_name().data(), { "X", "Y", "Z", "W" }, [component, property]() {return property.get_value(component).template convert(); }, [component, property](SHVec4 vec) {return property.set_value(component, vec); }); + SHEditorWidgets::DragVec4(property.get_name().data(), { "X", "Y", "Z", "W" }, [component, property]() {return property.get_value(component).template convert(); }, [component, property](SHVec4 vec) {return property.set_value(component, vec); }, tooltip.is_valid() ? tooltip.template get_value() : std::string()); } else if (type == rttr::type::get()) { - SHEditorWidgets::DragVec3(property.get_name().data(), { "X", "Y", "Z" }, [component, property]() {return property.get_value(component).template convert(); }, [component, property](SHVec3 vec) {return property.set_value(component, vec); }); + SHEditorWidgets::DragVec3(property.get_name().data(), { "X", "Y", "Z" }, [component, property]() {return property.get_value(component).template convert(); }, [component, property](SHVec3 vec) {return property.set_value(component, vec); }, tooltip.is_valid() ? tooltip.template get_value() : std::string()); } else if (type == rttr::type::get()) { - SHEditorWidgets::DragVec2(property.get_name().data(), { "X", "Y" }, [component, property]() {return property.get_value(component).template convert(); }, [component, property](SHVec2 vec) {return property.set_value(component, vec); }); + SHEditorWidgets::DragVec2(property.get_name().data(), { "X", "Y" }, [component, property]() {return property.get_value(component).template convert(); }, [component, property](SHVec2 vec) {return property.set_value(component, vec); }, tooltip.is_valid() ? tooltip.template get_value() : std::string()); } } diff --git a/SHADE_Engine/src/Editor/Gizmos/SHTransformGizmo.cpp b/SHADE_Engine/src/Editor/Gizmos/SHTransformGizmo.cpp index 55e99ff9..e3bbc809 100644 --- a/SHADE_Engine/src/Editor/Gizmos/SHTransformGizmo.cpp +++ b/SHADE_Engine/src/Editor/Gizmos/SHTransformGizmo.cpp @@ -63,6 +63,9 @@ namespace SHADE if (selectedEntityTransformComponent == nullptr) return; + if(!selectedEntityTransformComponent->isActive) + return; + SHMatrix mat = selectedEntityTransformComponent->GetTRS(); useSnap = ImGui::IsKeyDown(ImGuiKey_LeftCtrl); if(useSnap) diff --git a/SHADE_Engine/src/Editor/SHEditorWidgets.hpp b/SHADE_Engine/src/Editor/SHEditorWidgets.hpp index b54a6799..26cac23e 100644 --- a/SHADE_Engine/src/Editor/SHEditorWidgets.hpp +++ b/SHADE_Engine/src/Editor/SHEditorWidgets.hpp @@ -174,15 +174,19 @@ namespace SHADE ImGui::SetColumnWidth(-1, 80.0f); ImGui::Text(label.c_str()); if (isHovered) - *isHovered = ImGui::IsItemHovered(); + *isHovered |= ImGui::IsItemHovered(); ImGui::NextColumn(); for (std::size_t i = 0; i < N; ++i) { ImGui::PushID(static_cast(i)); - ImGui::TextUnformatted(componentLabels[i].c_str(), ImGui::FindRenderedTextEnd(componentLabels[i].c_str())); ImGui::SameLine(); + ImGui::TextUnformatted(componentLabels[i].c_str(), ImGui::FindRenderedTextEnd(componentLabels[i].c_str())); + if (isHovered) + *isHovered |= ImGui::IsItemHovered(); + ImGui::SameLine(); ImGui::SetNextItemWidth(80.0f); valueChanged |= ImGui::DragFloat("##v", values[i], speed, valueMin, valueMax, displayFormat, flags); - + if (isHovered) + *isHovered |= ImGui::IsItemHovered(); const ImVec2 min = ImGui::GetItemRectMin(); const ImVec2 max = ImGui::GetItemRectMax(); const float spacing = g.Style.FrameRounding; @@ -203,7 +207,7 @@ namespace SHADE } static bool DragVec2(const std::string& label, std::vectorconst& componentLabels, std::function get, - std::function set, float speed = 0.1f, const char* displayFormat = "%.3f", std::string_view const& tooltip = {}, float valueMin = 0.0f, float valueMax = 0.0f, + std::function set, std::string_view const& tooltip = {}, float speed = 0.1f, const char* displayFormat = "%.3f", float valueMin = 0.0f, float valueMax = 0.0f, ImGuiSliderFlags flags = 0) { SHVec2 values = get(); @@ -217,9 +221,9 @@ namespace SHADE } if (startRecording && ImGui::IsMouseReleased(ImGuiMouseButton_Left)) startRecording = false; - if(!tooltip.empty()) + if (!tooltip.empty()) { - if(ImGui::IsItemHovered()) + if (ImGui::IsItemHovered()) { ImGui::BeginTooltip(); ImGui::Text(tooltip.data()); @@ -230,11 +234,12 @@ namespace SHADE } static bool DragVec3(const std::string& label, std::vectorconst& componentLabels, std::function get, - std::function set, float speed = 0.1f, const char* displayFormat = "%.3f", std::string_view const& tooltip = {}, float valueMin = 0.0f, float valueMax = 0.0f, + std::function set, std::string_view const& tooltip = {}, float speed = 0.1f, const char* displayFormat = "%.3f", float valueMin = 0.0f, float valueMax = 0.0f, ImGuiSliderFlags flags = 0) { SHVec3 values = get(); - bool const changed = DragN(label, componentLabels, { &values.x, &values.y, &values.z }, speed, displayFormat, valueMin, valueMax, flags); + bool isHovered = false; + bool const changed = DragN(label, componentLabels, { &values.x, &values.y, &values.z }, speed, displayFormat, valueMin, valueMax, flags, &isHovered); static bool startRecording = false; @@ -249,9 +254,9 @@ namespace SHADE { startRecording = false; } - if(!tooltip.empty()) + if (!tooltip.empty()) { - if(ImGui::IsItemHovered()) + if (isHovered) { ImGui::BeginTooltip(); ImGui::Text(tooltip.data()); @@ -262,7 +267,7 @@ namespace SHADE } static bool DragVec4(const std::string& label, std::vectorconst& componentLabels, std::function get, - std::function set, float speed = 0.1f, const char* displayFormat = "%.3f", std::string_view const& tooltip = {}, float valueMin = 0.0f, float valueMax = 0.0f, + std::function set, std::string_view const& tooltip = {}, float speed = 0.1f, const char* displayFormat = "%.3f", float valueMin = 0.0f, float valueMax = 0.0f, ImGuiSliderFlags flags = 0) { SHVec4 values = get(); @@ -278,9 +283,9 @@ namespace SHADE { startRecording = false; } - if(!tooltip.empty()) + if (!tooltip.empty()) { - if(ImGui::IsItemHovered()) + if (ImGui::IsItemHovered()) { ImGui::BeginTooltip(); ImGui::Text(tooltip.data()); @@ -297,7 +302,7 @@ namespace SHADE static void TextLabel(std::string_view const& text, bool sameLine = true) { const ImVec2 textSize = ImGui::CalcTextSize(text.data(), NULL, true); - if(textSize.x > 0.0f) + if (textSize.x > 0.0f) { ImGui::Text(text.data()); ImGui::SameLine(); @@ -310,32 +315,32 @@ namespace SHADE ImGui::BeginGroup(); ImGui::PushID(label.data()); TextLabel(label); - if (ImGui::Checkbox("##", &value)) + bool const changed = ImGui::Checkbox("##", &value); + if (changed) { SHCommandManager::PerformCommand(std::reinterpret_pointer_cast(std::make_shared>(get(), value, set)), false); - return true; } ImGui::PopID(); ImGui::EndGroup(); - if(!tooltip.empty()) + if (!tooltip.empty()) { - if(ImGui::IsItemHovered()) + if (ImGui::IsItemHovered()) { ImGui::BeginTooltip(); ImGui::Text(tooltip.data()); ImGui::EndTooltip(); } } - return false; + return changed; } template - static bool RadioButton(std::vector const& label, std::vector const& listTypes, std::function get, std::function set ,std::string_view const& tooltip = {}) + static bool RadioButton(std::vector const& label, std::vector const& listTypes, std::function get, std::function set, std::string_view const& tooltip = {}) { T type = get(); ImGui::BeginGroup(); ImGui::PushID(label.data()); - TextLabel(label); + //TextLabel(label); for (size_t i = 0; i < listTypes.size(); i++) { if (ImGui::RadioButton(label[i].c_str(), type == listTypes[i])) @@ -366,12 +371,11 @@ namespace SHADE ImGui::BeginGroup(); ImGui::PushID(label.data()); TextLabel(label); - if (ImGui::InputText("##", &text, flag, callback, userData)) + bool const changed = ImGui::InputText("##", &text, flag, callback, userData); + if (changed) { if (ImGui::IsItemDeactivatedAfterEdit()) SHCommandManager::PerformCommand(std::reinterpret_pointer_cast(std::make_shared>(get(), text, set)), false); - - return true; } ImGui::PopID(); ImGui::EndGroup(); @@ -384,7 +388,7 @@ namespace SHADE ImGui::EndTooltip(); } } - return false; + return changed; } template @@ -442,9 +446,9 @@ namespace SHADE } ImGui::PopID(); ImGui::EndGroup(); - if(!tooltip.empty()) + if (!tooltip.empty()) { - if(ImGui::IsItemHovered()) + if (ImGui::IsItemHovered()) { ImGui::BeginTooltip(); ImGui::Text(tooltip.data()); diff --git a/SHADE_Engine/src/Math/Transform/SHTransformComponent.cpp b/SHADE_Engine/src/Math/Transform/SHTransformComponent.cpp index e56cbc8d..c6068f1a 100644 --- a/SHADE_Engine/src/Math/Transform/SHTransformComponent.cpp +++ b/SHADE_Engine/src/Math/Transform/SHTransformComponent.cpp @@ -14,6 +14,7 @@ #include "SHTransformComponent.h" // Project Headers #include "Math/SHMathHelpers.h" +#include "Reflection/SHReflectionMetadata.h" namespace SHADE { @@ -184,7 +185,7 @@ RTTR_REGISTRATION using namespace rttr; registration::class_("Transform Component") - .property("Translate" , &SHTransformComponent::GetLocalPosition , &SHTransformComponent::SetLocalPosition ) - .property("Rotate" , &SHTransformComponent::GetLocalRotation , select_overload(&SHTransformComponent::SetLocalRotation) ) - .property("Scale" , &SHTransformComponent::GetLocalScale , &SHTransformComponent::SetLocalScale ); + .property("Translate" , &SHTransformComponent::GetLocalPosition , &SHTransformComponent::SetLocalPosition)(metadata(META::tooltip, "Translate")) + .property("Rotate" , &SHTransformComponent::GetLocalRotation , select_overload(&SHTransformComponent::SetLocalRotation))(metadata(META::tooltip, "Rotate")) + .property("Scale" , &SHTransformComponent::GetLocalScale , &SHTransformComponent::SetLocalScale)(metadata(META::tooltip, "Scale")); } \ No newline at end of file From 1c099acccb403fd3bbfd842b9c7c275802b0784a Mon Sep 17 00:00:00 2001 From: Sri Sham Haran Date: Wed, 26 Oct 2022 16:05:52 +0800 Subject: [PATCH 25/92] handle vec2/3/4 that contain values in radians --- .../Inspector/SHEditorComponentView.hpp | 8 ++--- SHADE_Engine/src/Editor/SHEditorWidgets.hpp | 32 ++++++++++++++++--- .../Math/Transform/SHTransformComponent.cpp | 6 ++-- .../src/Reflection/SHReflectionMetadata.h | 1 + 4 files changed, 35 insertions(+), 12 deletions(-) diff --git a/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorComponentView.hpp b/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorComponentView.hpp index 71a31bb8..046dba2f 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorComponentView.hpp +++ b/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorComponentView.hpp @@ -64,7 +64,7 @@ namespace SHADE { auto const& type = property.get_type(); auto tooltip = property.get_metadata(META::tooltip); - + bool const& isAngleInRad = property.get_metadata(META::angleInRad).is_valid() ? property.get_metadata(META::angleInRad).template get_value() : false; if (type.is_enumeration()) { auto enumAlign = type.get_enumeration(); @@ -185,15 +185,15 @@ namespace SHADE } else if (type == rttr::type::get()) { - SHEditorWidgets::DragVec4(property.get_name().data(), { "X", "Y", "Z", "W" }, [component, property]() {return property.get_value(component).template convert(); }, [component, property](SHVec4 vec) {return property.set_value(component, vec); }, tooltip.is_valid() ? tooltip.template get_value() : std::string()); + SHEditorWidgets::DragVec4(property.get_name().data(), { "X", "Y", "Z", "W" }, [component, property]() {return property.get_value(component).template convert(); }, [component, property](SHVec4 vec) {return property.set_value(component, vec); }, isAngleInRad, tooltip.is_valid() ? tooltip.template get_value() : std::string()); } else if (type == rttr::type::get()) { - SHEditorWidgets::DragVec3(property.get_name().data(), { "X", "Y", "Z" }, [component, property]() {return property.get_value(component).template convert(); }, [component, property](SHVec3 vec) {return property.set_value(component, vec); }, tooltip.is_valid() ? tooltip.template get_value() : std::string()); + SHEditorWidgets::DragVec3(property.get_name().data(), { "X", "Y", "Z" }, [component, property]() {return property.get_value(component).template convert(); }, [component, property](SHVec3 vec) {return property.set_value(component, vec); }, isAngleInRad, tooltip.is_valid() ? tooltip.template get_value() : std::string()); } else if (type == rttr::type::get()) { - SHEditorWidgets::DragVec2(property.get_name().data(), { "X", "Y" }, [component, property]() {return property.get_value(component).template convert(); }, [component, property](SHVec2 vec) {return property.set_value(component, vec); }, tooltip.is_valid() ? tooltip.template get_value() : std::string()); + SHEditorWidgets::DragVec2(property.get_name().data(), { "X", "Y" }, [component, property]() {return property.get_value(component).template convert(); }, [component, property](SHVec2 vec) {return property.set_value(component, vec); }, isAngleInRad, tooltip.is_valid() ? tooltip.template get_value() : std::string()); } } diff --git a/SHADE_Engine/src/Editor/SHEditorWidgets.hpp b/SHADE_Engine/src/Editor/SHEditorWidgets.hpp index 26cac23e..60cd7a86 100644 --- a/SHADE_Engine/src/Editor/SHEditorWidgets.hpp +++ b/SHADE_Engine/src/Editor/SHEditorWidgets.hpp @@ -207,14 +207,22 @@ namespace SHADE } static bool DragVec2(const std::string& label, std::vectorconst& componentLabels, std::function get, - std::function set, std::string_view const& tooltip = {}, float speed = 0.1f, const char* displayFormat = "%.3f", float valueMin = 0.0f, float valueMax = 0.0f, + std::function set, bool const& isAnAngleInRad = false, std::string_view const& tooltip = {}, float speed = 0.1f, const char* displayFormat = "%.3f", float valueMin = 0.0f, float valueMax = 0.0f, ImGuiSliderFlags flags = 0) { SHVec2 values = get(); + if(isAnAngleInRad) + { + values = {SHMath::RadiansToDegrees(values.x), SHMath::RadiansToDegrees(values.y)}; + } bool const changed = DragN(label, componentLabels, { &values.x, &values.y }, speed, displayFormat, valueMin, valueMax, flags); static bool startRecording = false; if (changed) { + if(isAnAngleInRad) + { + values = {SHMath::DegreesToRadians(values.x), SHMath::DegreesToRadians(values.y)}; + } SHCommandManager::PerformCommand(std::reinterpret_pointer_cast(std::make_shared>(get(), values, set)), startRecording); if (!startRecording) startRecording = true; @@ -234,18 +242,24 @@ namespace SHADE } static bool DragVec3(const std::string& label, std::vectorconst& componentLabels, std::function get, - std::function set, std::string_view const& tooltip = {}, float speed = 0.1f, const char* displayFormat = "%.3f", float valueMin = 0.0f, float valueMax = 0.0f, + std::function set, bool const& isAnAngleInRad = false, std::string_view const& tooltip = {}, float speed = 0.1f, const char* displayFormat = "%.3f", float valueMin = 0.0f, float valueMax = 0.0f, ImGuiSliderFlags flags = 0) { SHVec3 values = get(); + if(isAnAngleInRad) + { + values = {SHMath::RadiansToDegrees(values.x), SHMath::RadiansToDegrees(values.y), SHMath::RadiansToDegrees(values.z)}; + } bool isHovered = false; bool const changed = DragN(label, componentLabels, { &values.x, &values.y, &values.z }, speed, displayFormat, valueMin, valueMax, flags, &isHovered); - - static bool startRecording = false; if (changed) { SHVec3 old = get(); + if(isAnAngleInRad) + { + values = {SHMath::DegreesToRadians(values.x), SHMath::DegreesToRadians(values.y), SHMath::DegreesToRadians(values.z)}; + } SHCommandManager::PerformCommand(std::reinterpret_pointer_cast(std::make_shared>(old, values, set)), startRecording); if (!startRecording) startRecording = true; @@ -267,14 +281,22 @@ namespace SHADE } static bool DragVec4(const std::string& label, std::vectorconst& componentLabels, std::function get, - std::function set, std::string_view const& tooltip = {}, float speed = 0.1f, const char* displayFormat = "%.3f", float valueMin = 0.0f, float valueMax = 0.0f, + std::function set, bool const& isAnAngleInRad = false, std::string_view const& tooltip = {}, float speed = 0.1f, const char* displayFormat = "%.3f", float valueMin = 0.0f, float valueMax = 0.0f, ImGuiSliderFlags flags = 0) { SHVec4 values = get(); + if(isAnAngleInRad) + { + values = {SHMath::RadiansToDegrees(values.x), SHMath::RadiansToDegrees(values.y), SHMath::RadiansToDegrees(values.z), SHMath::RadiansToDegrees(values.w)}; + } bool const changed = DragN(label, componentLabels, { &values.x, &values.y, &values.z, &values.w }, speed, displayFormat, valueMin, valueMax, flags); static bool startRecording = false; if (changed) { + if(isAnAngleInRad) + { + values = {SHMath::DegreesToRadians(values.x), SHMath::DegreesToRadians(values.y), SHMath::DegreesToRadians(values.z), SHMath::DegreesToRadians(values.w)}; + } SHCommandManager::PerformCommand(std::reinterpret_pointer_cast(std::make_shared>(get(), values, set)), startRecording); if (!startRecording) startRecording = true; diff --git a/SHADE_Engine/src/Math/Transform/SHTransformComponent.cpp b/SHADE_Engine/src/Math/Transform/SHTransformComponent.cpp index c6068f1a..43742855 100644 --- a/SHADE_Engine/src/Math/Transform/SHTransformComponent.cpp +++ b/SHADE_Engine/src/Math/Transform/SHTransformComponent.cpp @@ -185,7 +185,7 @@ RTTR_REGISTRATION using namespace rttr; registration::class_("Transform Component") - .property("Translate" , &SHTransformComponent::GetLocalPosition , &SHTransformComponent::SetLocalPosition)(metadata(META::tooltip, "Translate")) - .property("Rotate" , &SHTransformComponent::GetLocalRotation , select_overload(&SHTransformComponent::SetLocalRotation))(metadata(META::tooltip, "Rotate")) - .property("Scale" , &SHTransformComponent::GetLocalScale , &SHTransformComponent::SetLocalScale)(metadata(META::tooltip, "Scale")); + .property("Translate" ,&SHTransformComponent::GetLocalPosition ,&SHTransformComponent::SetLocalPosition ) (metadata(META::tooltip, "Translate")) + .property("Rotate" ,&SHTransformComponent::GetLocalRotation ,select_overload(&SHTransformComponent::SetLocalRotation) ) (metadata(META::tooltip, "Rotate"), metadata(META::angleInRad, true)) + .property("Scale" ,&SHTransformComponent::GetLocalScale ,&SHTransformComponent::SetLocalScale ) (metadata(META::tooltip, "Scale")); } \ No newline at end of file diff --git a/SHADE_Engine/src/Reflection/SHReflectionMetadata.h b/SHADE_Engine/src/Reflection/SHReflectionMetadata.h index 0cc6d8a5..b4dc009c 100644 --- a/SHADE_Engine/src/Reflection/SHReflectionMetadata.h +++ b/SHADE_Engine/src/Reflection/SHReflectionMetadata.h @@ -7,5 +7,6 @@ namespace SHADE constexpr const char* min = "MIN"; constexpr const char* max = "MAX"; constexpr const char* tooltip = "tooltip"; + constexpr const char* angleInRad = "angleInRad"; } } From 4eaa15d999e7191e6ef41fb21f0feafaa59ff918 Mon Sep 17 00:00:00 2001 From: Xiao Qi Date: Wed, 26 Oct 2022 17:16:09 +0800 Subject: [PATCH 26/92] Added function to compile built in shaders --- .../Libraries/Compilers/SHShaderSourceCompiler.cpp | 13 +++++++++++++ .../Libraries/Compilers/SHShaderSourceCompiler.h | 2 ++ SHADE_Engine/src/Assets/SHAssetManager.h | 1 + 3 files changed, 16 insertions(+) diff --git a/SHADE_Engine/src/Assets/Libraries/Compilers/SHShaderSourceCompiler.cpp b/SHADE_Engine/src/Assets/Libraries/Compilers/SHShaderSourceCompiler.cpp index 8cca46dc..85e69e31 100644 --- a/SHADE_Engine/src/Assets/Libraries/Compilers/SHShaderSourceCompiler.cpp +++ b/SHADE_Engine/src/Assets/Libraries/Compilers/SHShaderSourceCompiler.cpp @@ -139,4 +139,17 @@ namespace SHADE return {}; } + + std::optional SHShaderSourceCompiler::CompileShaderFromString + (std::string const& string, AssetPath path, SH_SHADER_TYPE type) noexcept + { + auto const data = CompileShaderSourceToMemory(string, path.filename().string(), type); + + if (data == nullptr) + { + return{}; + } + + return CompileShaderSourceToBinary(path, *data); + } } diff --git a/SHADE_Engine/src/Assets/Libraries/Compilers/SHShaderSourceCompiler.h b/SHADE_Engine/src/Assets/Libraries/Compilers/SHShaderSourceCompiler.h index b2b8bca3..9fb93924 100644 --- a/SHADE_Engine/src/Assets/Libraries/Compilers/SHShaderSourceCompiler.h +++ b/SHADE_Engine/src/Assets/Libraries/Compilers/SHShaderSourceCompiler.h @@ -24,5 +24,7 @@ namespace SHADE public: static std::optional LoadAndCompileShader(AssetPath path) noexcept; + static std::optional CompileShaderFromString + (std::string const& string, AssetPath path, SH_SHADER_TYPE type) noexcept; }; } diff --git a/SHADE_Engine/src/Assets/SHAssetManager.h b/SHADE_Engine/src/Assets/SHAssetManager.h index 0dc376d9..376467d8 100644 --- a/SHADE_Engine/src/Assets/SHAssetManager.h +++ b/SHADE_Engine/src/Assets/SHAssetManager.h @@ -82,6 +82,7 @@ namespace SHADE static std::vector GetAllDataOfType(AssetType type) noexcept; static std::vector GetAllRecordOfType(AssetType type) noexcept; + private: /**************************************************************************** * \brief Load resource data into memory From 1018454f2e9f3dd2c2525fd0b4c51b42cac9ab59 Mon Sep 17 00:00:00 2001 From: Sri Sham Haran Date: Wed, 26 Oct 2022 20:21:47 +0800 Subject: [PATCH 27/92] Add Win32 MessageBox Add Prefab Manager --- Assets/Editor/Layouts/UserLayout.ini | 62 ------------------- .../Serialization/Prefab/SHPrefabManager.cpp | 56 +++++++++++++++++ .../Serialization/Prefab/SHPrefabManager.h | 28 +++++++++ SHADE_Engine/src/Tools/Dialog/SHWinDialog.cpp | 31 ++++++++++ SHADE_Engine/src/Tools/Dialog/SHWinDialog.h | 35 +++++++++++ 5 files changed, 150 insertions(+), 62 deletions(-) delete mode 100644 Assets/Editor/Layouts/UserLayout.ini create mode 100644 SHADE_Engine/src/Serialization/Prefab/SHPrefabManager.cpp create mode 100644 SHADE_Engine/src/Serialization/Prefab/SHPrefabManager.h create mode 100644 SHADE_Engine/src/Tools/Dialog/SHWinDialog.cpp create mode 100644 SHADE_Engine/src/Tools/Dialog/SHWinDialog.h diff --git a/Assets/Editor/Layouts/UserLayout.ini b/Assets/Editor/Layouts/UserLayout.ini deleted file mode 100644 index e27f5cca..00000000 --- a/Assets/Editor/Layouts/UserLayout.ini +++ /dev/null @@ -1,62 +0,0 @@ -[Window][MainStatusBar] -Pos=0,1060 -Size=1920,20 -Collapsed=0 - -[Window][SHEditorMenuBar] -Pos=0,48 -Size=1920,1012 -Collapsed=0 - -[Window][Hierarchy Panel] -Pos=0,142 -Size=494,690 -Collapsed=0 -DockId=0x00000007,0 - -[Window][Debug##Default] -Pos=60,60 -Size=400,400 -Collapsed=0 - -[Window][Inspector] -Pos=1649,48 -Size=271,1012 -Collapsed=0 -DockId=0x00000006,0 - -[Window][Profiler] -Pos=0,48 -Size=494,92 -Collapsed=0 -DockId=0x00000003,0 - -[Window][Viewport] -Pos=648,48 -Size=2519,1319 -Collapsed=0 -DockId=0x00000002,0 - -[Window][ Viewport] -Pos=496,48 -Size=1151,1012 -Collapsed=0 -DockId=0x00000002,0 - -[Window][ Asset Browser] -Pos=0,834 -Size=494,226 -Collapsed=0 -DockId=0x00000008,0 - -[Docking][Data] -DockSpace ID=0xC5C9B8AB Window=0xBE4044E9 Pos=8,79 Size=1920,1012 Split=X - DockNode ID=0x00000005 Parent=0xC5C9B8AB SizeRef=1992,1036 Split=X - DockNode ID=0x00000001 Parent=0x00000005 SizeRef=494,1036 Split=Y Selected=0x1E6EB881 - DockNode ID=0x00000003 Parent=0x00000001 SizeRef=225,94 Selected=0x1E6EB881 - DockNode ID=0x00000004 Parent=0x00000001 SizeRef=225,940 Split=Y Selected=0xE096E5AE - DockNode ID=0x00000007 Parent=0x00000004 SizeRef=494,690 Selected=0xE096E5AE - DockNode ID=0x00000008 Parent=0x00000004 SizeRef=494,226 Selected=0xB128252A - DockNode ID=0x00000002 Parent=0x00000005 SizeRef=1151,1036 CentralNode=1 Selected=0xB41284E7 - DockNode ID=0x00000006 Parent=0xC5C9B8AB SizeRef=271,1036 Selected=0xE7039252 - diff --git a/SHADE_Engine/src/Serialization/Prefab/SHPrefabManager.cpp b/SHADE_Engine/src/Serialization/Prefab/SHPrefabManager.cpp new file mode 100644 index 00000000..8ab098b8 --- /dev/null +++ b/SHADE_Engine/src/Serialization/Prefab/SHPrefabManager.cpp @@ -0,0 +1,56 @@ +#include "SHpch.h" +#include "SHPrefabManager.h" + +namespace SHADE +{ + SHPrefabManager::PrefabMap SHPrefabManager::prefabMap{}; + + void SHPrefabManager::AddPrefab(AssetID const& prefabAssetID) noexcept + { + prefabMap.insert({ prefabAssetID, {} }); + } + + void SHPrefabManager::RemovePrefab(AssetID const& prefabAssetID) noexcept + { + prefabMap.erase(prefabAssetID); + } + + void SHPrefabManager::ClearPrefab(AssetID const& prefabAssetID) noexcept + { + if (prefabMap.contains(prefabAssetID)) + { + prefabMap[prefabAssetID].clear(); + } + } + + void SHPrefabManager::UpdateAllPrefabEntities(AssetID const& prefabAssetID) noexcept + { + //Loop through all entities and deserialize new data + } + + void SHPrefabManager::AddEntity(AssetID const& prefabAssetID, EntityID const& eid) noexcept + { + if (prefabMap.contains(prefabAssetID)) + { + prefabMap[prefabAssetID].insert(eid); + } + } + + void SHPrefabManager::RemoveEntity(AssetID const& prefabAssetID, EntityID const& eid) noexcept + { + if (prefabMap.contains(prefabAssetID)) + { + prefabMap[prefabAssetID].erase(eid); + } + } + + void SHPrefabManager::Clear() noexcept + { + prefabMap.clear(); + } + + bool SHPrefabManager::Empty() noexcept + { + return prefabMap.empty(); + } +} diff --git a/SHADE_Engine/src/Serialization/Prefab/SHPrefabManager.h b/SHADE_Engine/src/Serialization/Prefab/SHPrefabManager.h new file mode 100644 index 00000000..37c317ed --- /dev/null +++ b/SHADE_Engine/src/Serialization/Prefab/SHPrefabManager.h @@ -0,0 +1,28 @@ +#pragma once + +#include "Assets/SHAssetMacros.h" +#include "ECS_Base/SHECSMacros.h" +#include +#include + + +namespace SHADE +{ + class SHPrefabManager + { + public: + using PrefabMap = std::unordered_map>; + + static void AddPrefab(AssetID const& prefabAssetID) noexcept; + static void RemovePrefab(AssetID const& prefabAssetID) noexcept; + static void ClearPrefab(AssetID const& prefabAssetID) noexcept; + static void UpdateAllPrefabEntities(AssetID const& prefabAssetID) noexcept; + static void AddEntity(AssetID const& prefabAssetID, EntityID const& eid) noexcept; + static void RemoveEntity(AssetID const& prefabAssetID, EntityID const& eid) noexcept; + static void Clear() noexcept; + static bool Empty() noexcept; + + private: + static PrefabMap prefabMap; + }; +} diff --git a/SHADE_Engine/src/Tools/Dialog/SHWinDialog.cpp b/SHADE_Engine/src/Tools/Dialog/SHWinDialog.cpp new file mode 100644 index 00000000..a2900401 --- /dev/null +++ b/SHADE_Engine/src/Tools/Dialog/SHWinDialog.cpp @@ -0,0 +1,31 @@ +#include "SHpch.h" +#include "SHWinDialog.h" +#include +#include + +namespace SHADE +{ + void SHWinDialog::DisplayMessageBox(MessageBoxType const& messageBoxType, std::string const& title, std::string const& text) + { + if(messageBoxType == MessageBoxType::MB_MAX) + return; + + UINT flags = MB_APPLMODAL | MB_SETFOREGROUND | MB_OK; + flags |= static_cast(messageBoxType); + + const std::wstring wTitle(title.begin(), title.end()); + const std::wstring wText(text.begin(), text.end()); + + MessageBox(GetDesktopWindow(), wText.data(), wTitle.data(), flags); + } + + std::vector SHWinDialog::DisplayOpenDialog(OpenSaveConfig const& openSaveConfig) + { + return {}; + } + + std::vector SHWinDialog::DisplaySaveAsDialog(OpenSaveConfig const& openSaveConfig) + { + return{}; + } +} diff --git a/SHADE_Engine/src/Tools/Dialog/SHWinDialog.h b/SHADE_Engine/src/Tools/Dialog/SHWinDialog.h new file mode 100644 index 00000000..0c11f768 --- /dev/null +++ b/SHADE_Engine/src/Tools/Dialog/SHWinDialog.h @@ -0,0 +1,35 @@ +#pragma once +#include +#include + +namespace SHADE +{ + //https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-messagebox + enum class MessageBoxType + { + MB_ERROR = 0x00000010L, + MB_QUESTION = 0x00000020L, + MB_WARNING = 0x00000030L, + MB_INFO = 0x00000040L, + MB_MAX = 0 + }; + + struct OpenSaveConfig + { + using Extension = std::string; + using Extensions = std::vector; + using FileTypeDesc = std::pair; + using FilterList = std::vector; + + std::string title = "Open"; + bool openFolders = false; + FilterList filterList{}; + }; + + struct SHWinDialog + { + static void DisplayMessageBox(MessageBoxType const& messageBoxType, std::string const& title, std::string const& text); + static std::vector DisplayOpenDialog(OpenSaveConfig const& openSaveConfig); + static std::vector DisplaySaveAsDialog(OpenSaveConfig const& openSaveConfig); + }; +} From 3518004266bdcce320934c1884a7a006e86bb0cc Mon Sep 17 00:00:00 2001 From: Sri Sham Haran Date: Wed, 26 Oct 2022 21:06:09 +0800 Subject: [PATCH 28/92] Add Open File DIalog (WIP) --- SHADE_Engine/src/Tools/Dialog/SHWinDialog.cpp | 40 +++++++++++++++++++ SHADE_Engine/src/Tools/Dialog/SHWinDialog.h | 1 + 2 files changed, 41 insertions(+) diff --git a/SHADE_Engine/src/Tools/Dialog/SHWinDialog.cpp b/SHADE_Engine/src/Tools/Dialog/SHWinDialog.cpp index a2900401..bd13801a 100644 --- a/SHADE_Engine/src/Tools/Dialog/SHWinDialog.cpp +++ b/SHADE_Engine/src/Tools/Dialog/SHWinDialog.cpp @@ -21,6 +21,46 @@ namespace SHADE std::vector SHWinDialog::DisplayOpenDialog(OpenSaveConfig const& openSaveConfig) { + const HWND hwnd = GetDesktopWindow(); + HRESULT hResult = CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); + if(SUCCEEDED(hResult)) + { + IFileOpenDialog* pFileOpen; + + //Create Dialog object + hResult = CoCreateInstance(CLSID_FileOpenDialog, nullptr, CLSCTX_ALL, IID_IFileOpenDialog, reinterpret_cast(pFileOpen)); + + if(SUCCEEDED(hResult)) + { + //Show the open dialog box + hResult = pFileOpen->Show(hwnd); + + //Get file name from the dialoh box + if(SUCCEEDED(hResult)) + { + if(openSaveConfig.openMultiple) + { + IShellItemArray* pItemArray; + hResult = pFileOpen->GetResults(&pItemArray); + if(SUCCEEDED(hResult)) + { + + } + } + else + { + IShellItem* pItem; + hResult = pFileOpen->GetResult(&pItem); + if(SUCCEEDED(hResult)) + { + PWSTR pszFilePath; + hResult = pItem->GetDisplayName(SIGDN_FILESYSPATH, &pszFilePath); + } + } + + } + } + } return {}; } diff --git a/SHADE_Engine/src/Tools/Dialog/SHWinDialog.h b/SHADE_Engine/src/Tools/Dialog/SHWinDialog.h index 0c11f768..02fe07b9 100644 --- a/SHADE_Engine/src/Tools/Dialog/SHWinDialog.h +++ b/SHADE_Engine/src/Tools/Dialog/SHWinDialog.h @@ -23,6 +23,7 @@ namespace SHADE std::string title = "Open"; bool openFolders = false; + bool openMultiple = false; FilterList filterList{}; }; From 6e9f54987f2ec25d0a04a35587447684881a766c Mon Sep 17 00:00:00 2001 From: Brandon Mak Date: Wed, 26 Oct 2022 22:40:04 +0800 Subject: [PATCH 29/92] Prepared light global desc set layout data and render graph resources - Fixed material padding - Lighting desc sets now have a buffer at binding 0 to store light counts. - Added position, normals, albedo resources in render graph --- .../Graphics/MiddleEnd/Batching/SHBatch.cpp | 8 +- .../GlobalData/SHGraphicsGlobalData.cpp | 31 ++++---- .../MiddleEnd/Interface/SHGraphicsConstants.h | 32 ++------ .../MiddleEnd/Interface/SHGraphicsSystem.cpp | 40 ++++++++-- .../MiddleEnd/Interface/SHRenderable.cpp | 2 +- .../MiddleEnd/Lights/SHLightingSubSystem.cpp | 71 +++++++++++++----- .../MiddleEnd/Lights/SHLightingSubSystem.h | 19 ++++- TempShaderFolder/DeferredCompositeCs.glsl | 30 ++++++++ TempShaderFolder/DeferredCompositeCs.spv | Bin 0 -> 1716 bytes TempShaderFolder/TestCubeFs.glsl | 17 +++-- TempShaderFolder/TestCubeFs.spv | Bin 2300 -> 2536 bytes TempShaderFolder/TestCubeVs.glsl | 12 ++- TempShaderFolder/TestCubeVs.spv | Bin 2492 -> 2684 bytes 13 files changed, 175 insertions(+), 87 deletions(-) create mode 100644 TempShaderFolder/DeferredCompositeCs.glsl create mode 100644 TempShaderFolder/DeferredCompositeCs.spv diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Batching/SHBatch.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Batching/SHBatch.cpp index 09fde60f..f5c51914 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Batching/SHBatch.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Batching/SHBatch.cpp @@ -180,7 +180,8 @@ namespace SHADE { SHLOG_WARNING("[SHBatch] Entity with a missing SHRenderable found!"); } - propsCurrPtr += singleMatPropAlignedSize; + //propsCurrPtr += singleMatPropAlignedSize; + propsCurrPtr += singleMatPropSize; } // Transfer to GPU @@ -302,7 +303,7 @@ namespace SHADE { singleMatPropSize = SHADER_INFO->GetBytesRequired(); singleMatPropAlignedSize = device->PadSSBOSize(static_cast(singleMatPropSize)); - matPropTotalBytes = numTotalElements * singleMatPropAlignedSize; + matPropTotalBytes = numTotalElements * singleMatPropSize; if (matPropsDataSize < matPropTotalBytes) { matPropsData.reset(new char[matPropTotalBytes]); @@ -361,7 +362,8 @@ namespace SHADE { SHLOG_WARNING("[SHBatch] Entity with a missing SHRenderable found!"); } - propsCurrPtr += singleMatPropAlignedSize; + //propsCurrPtr += singleMatPropAlignedSize; + propsCurrPtr += singleMatPropSize; } } } diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHGraphicsGlobalData.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHGraphicsGlobalData.cpp index 0f1658f3..d5fb81bd 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHGraphicsGlobalData.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHGraphicsGlobalData.cpp @@ -47,36 +47,35 @@ namespace SHADE // For global data (generic data and textures) Handle staticGlobalLayout = logicalDevice->CreateDescriptorSetLayout(SHGraphicsConstants::DescriptorSetIndex::STATIC_GLOBALS,{ genericDataBinding, texturesBinding }); + std::vector lightBindings{}; - for (uint32_t i = 0; i < SHUtilities::ToUnderlying(SH_LIGHT_TYPE::NUM_TYPES); ++i) + + // This is the binding we use to count the lights (binding 0) + lightBindings.push_back(SHVkDescriptorSetLayout::Binding + { + .Type = vk::DescriptorType::eUniformBufferDynamic, + .Stage = vk::ShaderStageFlagBits::eCompute, + .BindPoint = 0, + .DescriptorCount = 1, + + }); + + for (uint32_t i = 1; i <= SHUtilities::ToUnderlying(SH_LIGHT_TYPE::NUM_TYPES); ++i) { lightBindings.push_back (SHVkDescriptorSetLayout::Binding { .Type = vk::DescriptorType::eStorageBufferDynamic, - .Stage = vk::ShaderStageFlagBits::eFragment, + .Stage = vk::ShaderStageFlagBits::eCompute, .BindPoint = i, .DescriptorCount = 1, }); } - //SHVkDescriptorSetLayout::Binding pointLightBinding - //{ - // .Type = vk::DescriptorType::eStorageBufferDynamic, - // .Stage = vk::ShaderStageFlagBits::eFragment, - // .BindPoint = SHGraphicsConstants::DescriptorSetBindings::POINT_LIGHT_DATA, - // .DescriptorCount = 1, - //}; - //SHVkDescriptorSetLayout::Binding spotLightBinding - //{ - // .Type = vk::DescriptorType::eStorageBufferDynamic, - // .Stage = vk::ShaderStageFlagBits::eFragment, - // .BindPoint = SHGraphicsConstants::DescriptorSetBindings::SPOT_LIGHT_DATA, - // .DescriptorCount = 1, - //}; // For Dynamic global data (lights) Handle dynamicGlobalLayout = logicalDevice->CreateDescriptorSetLayout(SHGraphicsConstants::DescriptorSetIndex::DYNAMIC_GLOBALS, lightBindings); + SHVkDescriptorSetLayout::Binding cameraDataBinding { .Type = vk::DescriptorType::eUniformBufferDynamic, diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsConstants.h b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsConstants.h index 4c3ba7f9..a39ec10e 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsConstants.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsConstants.h @@ -94,32 +94,14 @@ namespace SHADE /***************************************************************************/ static constexpr uint32_t IMAGE_AND_SAMPLERS_DATA = 1; - ///***************************************************************************/ - ///*! - // \brief - // DescriptorSet binding for directional lights. + /***************************************************************************/ + /*! + \brief + DescriptorSet binding for combined image sampler data. - //*/ - ///***************************************************************************/ - //static constexpr uint32_t DIRECTIONAL_LIGHT_DATA = 0; - - ///***************************************************************************/ - ///*! - // \brief - // DescriptorSet binding for directional lights. - - //*/ - ///***************************************************************************/ - //static constexpr uint32_t POINT_LIGHT_DATA = 1; - - ///***************************************************************************/ - ///*! - // \brief - // DescriptorSet binding for directional lights. - - //*/ - ///***************************************************************************/ - //static constexpr uint32_t SPOT_LIGHT_DATA = 2; + */ + /***************************************************************************/ + static constexpr uint32_t LIGHTING_COUNT = 0; /***************************************************************************/ /*! diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp index 9b984a4b..dfa4e41e 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp @@ -127,15 +127,20 @@ namespace SHADE shaderSourceLibrary.LoadShader(2, "KirschCs.glsl", SH_SHADER_TYPE::COMPUTE, true); shaderSourceLibrary.LoadShader(3, "PureCopyCs.glsl", SH_SHADER_TYPE::COMPUTE, true); + shaderSourceLibrary.LoadShader(4, "DeferredCompositeCs.glsl", SH_SHADER_TYPE::COMPUTE, true); + + shaderModuleLibrary.ImportFromSourceLibrary(device, shaderSourceLibrary); auto cubeVS = shaderModuleLibrary.GetShaderModule("TestCubeVs.glsl"); auto cubeFS = shaderModuleLibrary.GetShaderModule("TestCubeFs.glsl"); auto greyscale = shaderModuleLibrary.GetShaderModule("KirschCs.glsl"); auto pureCopy = shaderModuleLibrary.GetShaderModule("PureCopyCs.glsl"); + auto deferredComposite = shaderModuleLibrary.GetShaderModule("DeferredCompositeCs.glsl"); cubeVS->Reflect(); cubeFS->Reflect(); greyscale->Reflect(); pureCopy->Reflect(); + deferredComposite->Reflect(); } void SHGraphicsSystem::InitSceneRenderGraph(void) noexcept @@ -176,26 +181,45 @@ namespace SHADE // Initialize world render graph worldRenderGraph->Init(device, swapchain); - worldRenderGraph->AddResource("Scene Pre-Process", { SH_ATT_DESC_TYPE_FLAGS::COLOR, SH_ATT_DESC_TYPE_FLAGS::INPUT, SH_ATT_DESC_TYPE_FLAGS::STORAGE }, windowDims.first, windowDims.second); - worldRenderGraph->AddResource("Scene", { SH_ATT_DESC_TYPE_FLAGS::COLOR, SH_ATT_DESC_TYPE_FLAGS::INPUT, SH_ATT_DESC_TYPE_FLAGS::STORAGE }, windowDims.first, windowDims.second); + worldRenderGraph->AddResource("Position", { SH_ATT_DESC_TYPE_FLAGS::COLOR, SH_ATT_DESC_TYPE_FLAGS::INPUT, SH_ATT_DESC_TYPE_FLAGS::STORAGE }, windowDims.first, windowDims.second); + worldRenderGraph->AddResource("Normals", { SH_ATT_DESC_TYPE_FLAGS::COLOR, SH_ATT_DESC_TYPE_FLAGS::INPUT, SH_ATT_DESC_TYPE_FLAGS::STORAGE }, windowDims.first, windowDims.second); + worldRenderGraph->AddResource("Albedo", { SH_ATT_DESC_TYPE_FLAGS::COLOR, SH_ATT_DESC_TYPE_FLAGS::INPUT, SH_ATT_DESC_TYPE_FLAGS::STORAGE }, windowDims.first, windowDims.second); worldRenderGraph->AddResource("Depth Buffer", { SH_ATT_DESC_TYPE_FLAGS::DEPTH_STENCIL }, windowDims.first, windowDims.second, vk::Format::eD32SfloatS8Uint); worldRenderGraph->AddResource("Entity ID", { SH_ATT_DESC_TYPE_FLAGS::COLOR }, windowDims.first, windowDims.second, vk::Format::eR32Uint, 1, vk::ImageUsageFlagBits::eTransferSrc); worldRenderGraph->AddResource("Light Layer Indices", { SH_ATT_DESC_TYPE_FLAGS::COLOR }, windowDims.first, windowDims.second, vk::Format::eR32Uint, 1, vk::ImageUsageFlagBits::eTransferSrc); + worldRenderGraph->AddResource("Scene", { SH_ATT_DESC_TYPE_FLAGS::COLOR, SH_ATT_DESC_TYPE_FLAGS::INPUT, SH_ATT_DESC_TYPE_FLAGS::STORAGE }, windowDims.first, windowDims.second); + + auto gBufferNode = worldRenderGraph->AddNode("G-Buffer", + { + "Position", + "Entity ID", + "Light Layer Indices", + "Normals", + "Albedo", + "Depth Buffer", + "Scene" + }, + {}); // no predecessors - auto gBufferNode = worldRenderGraph->AddNode("G-Buffer", { "Light Layer Indices", "Entity ID", "Depth Buffer", "Scene", "Scene Pre-Process"}, {}); // no predecessors auto gBufferSubpass = gBufferNode->AddSubpass("G-Buffer Write"); - gBufferSubpass->AddColorOutput("Scene Pre-Process"); + gBufferSubpass->AddColorOutput("Position"); gBufferSubpass->AddColorOutput("Entity ID"); gBufferSubpass->AddColorOutput("Light Layer Indices"); + gBufferSubpass->AddColorOutput("Normals"); + gBufferSubpass->AddColorOutput("Albedo"); gBufferSubpass->AddDepthOutput("Depth Buffer", SH_ATT_DESC_TYPE_FLAGS::DEPTH_STENCIL); //// kirsch //auto kirschShader = shaderModuleLibrary.GetShaderModule("KirschCs.glsl"); - //gBufferNode->AddNodeCompute(kirschShader, { "Scene Pre-Process", "Scene" }); + //gBufferNode->AddNodeCompute(kirschShader, { "Position", "Scene" }); - // copy - auto pureCopyShader = shaderModuleLibrary.GetShaderModule("PureCopyCs.glsl"); - gBufferNode->AddNodeCompute(pureCopyShader, { "Scene Pre-Process", "Scene" }); + //// copy + //auto pureCopyShader = shaderModuleLibrary.GetShaderModule("PureCopyCs.glsl"); + //gBufferNode->AddNodeCompute(pureCopyShader, { "Position", "Scene" }); + + // deferred composite + auto deferredCompositeShader = shaderModuleLibrary.GetShaderModule("DeferredCompositeCs.glsl"); + gBufferNode->AddNodeCompute(deferredCompositeShader, { "Albedo", "Scene" }); auto dummyNode = worldRenderGraph->AddNode("Dummy Pass", { "Scene" }, {"G-Buffer"}); // no predecessors diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHRenderable.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHRenderable.cpp index 7c4d0bb9..c935194f 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHRenderable.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHRenderable.cpp @@ -28,7 +28,7 @@ namespace SHADE material = {}; oldMaterial = {}; - lightLayer = 0; + lightLayer = 1; } void SHRenderable::OnDestroy() diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.cpp index 8d9efe54..a22fb662 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.cpp @@ -76,8 +76,8 @@ namespace SHADE // boilerplate intermediateData = nullptr; - // initialize alignment - lightDataAlignmentSize = logicalDevice->PadSSBOSize(GetLightTypeSize(type)); + // Get data required for struct + lightDataSize = GetLightTypeSize(type); // So create some data! Expand(logicalDevice); @@ -94,7 +94,7 @@ namespace SHADE /***************************************************************************/ void SHLightingSubSystem::PerTypeData::Expand(Handle logicalDevice) noexcept { - if (lightDataAlignmentSize == 0) + if (lightDataSize == 0) { SHLOG_ERROR ("One of the types of lights have not been accounted for. Make sure lightDataAlignmentSize is not nullptr."); return; @@ -111,10 +111,12 @@ namespace SHADE numLights = 0; // Initialize the data for lights - intermediateData = std::make_unique(lightDataAlignmentSize * maxLights); + intermediateData = std::make_unique(lightDataSize * maxLights); + + lightDataAlignedSize = logicalDevice->PadSSBOSize(lightDataSize * maxLights); // We want to initialize 3 times the amount of data required. - dataBuffer = logicalDevice->CreateBuffer(maxLights * lightDataAlignmentSize * SHGraphicsConstants::NUM_FRAME_BUFFERS, nullptr, maxLights * lightDataAlignmentSize * SHGraphicsConstants::NUM_FRAME_BUFFERS, vk::BufferUsageFlagBits::eStorageBuffer, VMA_MEMORY_USAGE_AUTO, VMA_ALLOCATION_CREATE_MAPPED_BIT | VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT); + dataBuffer = logicalDevice->CreateBuffer(lightDataAlignedSize * SHGraphicsConstants::NUM_FRAME_BUFFERS, nullptr, lightDataAlignedSize * SHGraphicsConstants::NUM_FRAME_BUFFERS, vk::BufferUsageFlagBits::eStorageBuffer, VMA_MEMORY_USAGE_AUTO, VMA_ALLOCATION_CREATE_MAPPED_BIT | VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT); } else { @@ -122,24 +124,27 @@ namespace SHADE uint32_t const OLD_MAX_LIGHTS = maxLights; // before we increase the number of lights, create space to store old data. - std::unique_ptr oldData = std::make_unique(lightDataAlignmentSize * OLD_MAX_LIGHTS); + std::unique_ptr oldData = std::make_unique(lightDataSize * OLD_MAX_LIGHTS); // copy data over. - std::memcpy (oldData.get(), intermediateData.get(), lightDataAlignmentSize * OLD_MAX_LIGHTS); + std::memcpy (oldData.get(), intermediateData.get(), lightDataSize * OLD_MAX_LIGHTS); // now we start to expand.... // double space for lights maxLights *= 2; + // calculate total + padding + lightDataAlignedSize = logicalDevice->PadSSBOSize(lightDataSize * maxLights); + // destroy old data and initialize container for double the amount of data. - intermediateData = std::make_unique(lightDataAlignmentSize * maxLights); + intermediateData = std::make_unique(lightDataSize * maxLights); // copy old data to new container - std::memcpy(intermediateData.get(), oldData.get(), lightDataAlignmentSize * OLD_MAX_LIGHTS); + std::memcpy(intermediateData.get(), oldData.get(), lightDataSize * OLD_MAX_LIGHTS); // Resize the GPU buffer. TODO: Replace with Resize no copy here - dataBuffer->ResizeReplace(maxLights * lightDataAlignmentSize * SHGraphicsConstants::NUM_FRAME_BUFFERS, oldData.get(), lightDataAlignmentSize * OLD_MAX_LIGHTS); + dataBuffer->ResizeReplace(maxLights * lightDataAlignedSize * SHGraphicsConstants::NUM_FRAME_BUFFERS, oldData.get(), lightDataAlignedSize * OLD_MAX_LIGHTS); } @@ -187,7 +192,12 @@ namespace SHADE uint32_t SHLightingSubSystem::PerTypeData::GetAlignmentSize(void) const noexcept { - return lightDataAlignmentSize; + return lightDataAlignedSize; + } + + uint32_t SHLightingSubSystem::PerTypeData::GetDataSize(void) const noexcept + { + return lightDataSize; } uint32_t SHLightingSubSystem::PerTypeData::GetNumLights(void) const noexcept @@ -231,7 +241,7 @@ namespace SHADE // Now that the container is big enough, bind the new light // Get address of write location - void* writeLocation = reinterpret_cast(intermediateData.get()) + (lightDataAlignmentSize * numLights); + void* writeLocation = reinterpret_cast(intermediateData.get()) + (lightDataSize * numLights); // Write the light data to address WriteLightToAddress(writeLocation, unboundLight); @@ -257,7 +267,7 @@ namespace SHADE /***************************************************************************/ void SHLightingSubSystem::PerTypeData::ModifyLight(SHLightComponent* lightComp) noexcept { - void* writeLocation = reinterpret_cast(intermediateData.get()) + (lightDataAlignmentSize * lightComp->GetIndexInBuffer()); + void* writeLocation = reinterpret_cast(intermediateData.get()) + (lightDataSize * lightComp->GetIndexInBuffer()); WriteLightToAddress(writeLocation, lightComp); } @@ -266,7 +276,7 @@ namespace SHADE if (intermediateData) { // we want to write to the offset of the current frame - dataBuffer->WriteToMemory(intermediateData.get(), lightDataAlignmentSize * numLights, 0, lightDataAlignmentSize * maxLights * frameIndex); + dataBuffer->WriteToMemory(intermediateData.get(), lightDataSize * numLights, 0, lightDataSize * maxLights * frameIndex); } } @@ -287,12 +297,12 @@ namespace SHADE // We bind the buffer with the correct desc set binding lightingDataDescSet->ModifyWriteDescBuffer(SHGraphicsConstants::DescriptorSetIndex::DYNAMIC_GLOBALS, - binding, + binding + 1, // we want to +1 here because the first binding is reserved for count { &buffer, 1 }, 0, - perTypeData[binding].GetAlignmentSize() * perTypeData[binding].GetMaxLights()); + perTypeData[binding].GetDataSize() * perTypeData[binding].GetMaxLights()); - lightingDataDescSet->UpdateDescriptorSetBuffer(SHGraphicsConstants::DescriptorSetIndex::DYNAMIC_GLOBALS, binding); + lightingDataDescSet->UpdateDescriptorSetBuffer(SHGraphicsConstants::DescriptorSetIndex::DYNAMIC_GLOBALS, binding + 1); // +1 here, same reason. see above } /***************************************************************************/ @@ -307,11 +317,13 @@ namespace SHADE { for (uint32_t i = 0; i < SHGraphicsConstants::NUM_FRAME_BUFFERS; ++i) { - for (uint32_t j = 0; j < dynamicOffsets.size(); ++j) + dynamicOffsets[i][0] = i * lightCountsAlignedSize; + // Even if the first binding is a count, we want to account for that too + for (uint32_t j = 1; j < static_cast(dynamicOffsets.size()); ++j) { auto const& typeData = perTypeData[j]; { - dynamicOffsets[i][j] = j * typeData.GetAlignmentSize() * typeData.GetMaxLights(); + dynamicOffsets[i][j] = j * typeData.GetAlignmentSize(); } } } @@ -346,11 +358,23 @@ namespace SHADE // initialize all the data first. We add more lights here as we add more types. perTypeData[i].InitializeData(logicalDevice, static_cast(i)); UpdateDescSet(i); + + // no lights at first + lightCountsData[i] = 0; } + + lightCountsAlignedSize = sizeof (uint32_t) * NUM_LIGHT_TYPES; + lightCountsAlignedSize = logicalDevice->PadUBOSize(lightCountsAlignedSize); + + // Create the GPU buffer to hold light count + lightCountsBuffer = logicalDevice->CreateBuffer(lightCountsAlignedSize * SHGraphicsConstants::NUM_FRAME_BUFFERS, nullptr, lightCountsAlignedSize * SHGraphicsConstants::NUM_FRAME_BUFFERS, vk::BufferUsageFlagBits::eUniformBuffer, VMA_MEMORY_USAGE_AUTO, VMA_ALLOCATION_CREATE_MAPPED_BIT | VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT); + + lightingDataDescSet->ModifyWriteDescBuffer(SHGraphicsConstants::DescriptorSetIndex::DYNAMIC_GLOBALS, SHGraphicsConstants::DescriptorSetBindings::LIGHTING_COUNT, {&lightCountsBuffer, 1}, 0, sizeof (uint32_t) * NUM_LIGHT_TYPES); + lightingDataDescSet->UpdateDescriptorSetBuffer(SHGraphicsConstants::DescriptorSetIndex::DYNAMIC_GLOBALS, SHGraphicsConstants::DescriptorSetBindings::LIGHTING_COUNT); for (uint32_t i = 0; i < SHGraphicsConstants::NUM_FRAME_BUFFERS; ++i) { - dynamicOffsets[i].resize(NUM_LIGHT_TYPES); + dynamicOffsets[i].resize(NUM_LIGHT_TYPES + 1); // +1 for the count } } @@ -366,6 +390,8 @@ namespace SHADE /***************************************************************************/ void SHLightingSubSystem::Run(Handle cmdBuffer, uint32_t frameIndex) noexcept { + static uint32_t constexpr NUM_LIGHT_TYPES = SHUtilities::ToUnderlying(SH_LIGHT_TYPE::NUM_TYPES); + auto& lightComps = SHComponentManager::GetDense(); bool expanded = false; for (auto& light : lightComps) @@ -377,6 +403,9 @@ namespace SHADE if (!light.GetBound()) { perTypeData[enumValue].AddLight(logicalDevice, &light, expanded); + + // add to light count + ++lightCountsData[enumValue]; } // if there was modification to the light data @@ -396,6 +425,8 @@ namespace SHADE data.WriteToGPU(frameIndex); } + lightCountsBuffer->WriteToMemory(lightCountsData.data(), lightCountsData.size() * sizeof (uint32_t), 0, lightCountsAlignedSize * frameIndex); + // If any of the buffers got expanded, the descriptor set is invalid because the expanded buffer // is a new buffer. If some expansion was detected, update descriptor sets. if (expanded) diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.h b/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.h index e5336b4e..6c974730 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.h @@ -17,7 +17,7 @@ namespace SHADE class SHVkCommandBuffer; // Represents how the data will be interpreted in GPU. we want to copy to a container of these before passing to GPU. - struct SHDirectionalLightData + struct SHDirectionalLightData { //! Direction of the light SHVec3 direction; @@ -53,8 +53,11 @@ namespace SHADE //! Capacity of the container. uint32_t maxLights; - //! SSBOs need to be aligned. This is to pad lighting structs - uint32_t lightDataAlignmentSize; + //! SSBOs need to be aligned. This is to pad descriptor offset + uint32_t lightDataAlignedSize; + + //! size needed to store 1 struct object + uint32_t lightDataSize; //! type of the light. Will be used later when we want to expand SH_LIGHT_TYPE lightType; @@ -87,6 +90,7 @@ namespace SHADE static uint32_t GetLightTypeSize (SH_LIGHT_TYPE type) noexcept; Handle GetDataBuffer (void) const noexcept; uint32_t GetAlignmentSize (void) const noexcept; + uint32_t GetDataSize (void) const noexcept; uint32_t GetNumLights (void) const noexcept; uint32_t GetMaxLights (void) const noexcept; }; @@ -105,6 +109,15 @@ namespace SHADE //! Container to store dynamic offsets for binding descriptor sets std::array, static_cast(SHGraphicsConstants::NUM_FRAME_BUFFERS)> dynamicOffsets; + //! holds the data that represents how many lights are in the scene + std::array(SH_LIGHT_TYPE::NUM_TYPES)> lightCountsData; + + //! GPU buffer to hold lightCountData + Handle lightCountsBuffer; + + //! For padding in the buffer + uint32_t lightCountsAlignedSize; + /*-----------------------------------------------------------------------*/ /* PRIVATE MEMBER FUNCTIONS */ /*-----------------------------------------------------------------------*/ diff --git a/TempShaderFolder/DeferredCompositeCs.glsl b/TempShaderFolder/DeferredCompositeCs.glsl new file mode 100644 index 00000000..354a8954 --- /dev/null +++ b/TempShaderFolder/DeferredCompositeCs.glsl @@ -0,0 +1,30 @@ +#version 450 + +struct DirectionalLightStruct +{ + vec3 direction; + uint isActive; + uint cullingMask; + vec4 diffuseColor; +}; + +layout(local_size_x = 16, local_size_y = 16) in; +layout(set = 4, binding = 0, rgba8) uniform image2D inputImage; +layout(set = 4, binding = 1, rgba8) uniform image2D targetImage; + +layout(set = 1, binding = 0) buffer DirectionalLightData +{ + DirectionalLightStruct dLightData[]; +} DirLightData; + +void main() +{ + // convenient variables + ivec2 globalThread = ivec2(gl_GlobalInvocationID); + + vec3 color = imageLoad (inputImage, globalThread).rgb; + + // store result into result image + imageStore(targetImage, ivec2(gl_GlobalInvocationID.xy), vec4(color, 1.0f)); + +} \ No newline at end of file diff --git a/TempShaderFolder/DeferredCompositeCs.spv b/TempShaderFolder/DeferredCompositeCs.spv new file mode 100644 index 0000000000000000000000000000000000000000..679dc135f5f556eb95565c51c1c9f1c2aca8821a GIT binary patch literal 1716 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 diff --git a/TempShaderFolder/TestCubeVs.glsl b/TempShaderFolder/TestCubeVs.glsl index 7b58d1cf..bac9444d 100644 --- a/TempShaderFolder/TestCubeVs.glsl +++ b/TempShaderFolder/TestCubeVs.glsl @@ -14,13 +14,14 @@ layout(location = 8) in uvec2 integerData; layout(location = 0) out struct { - vec4 vertColor; // location 0 + vec4 vertPos; // location 0 vec2 uv; // location = 1 + vec4 normal; // location = 2 } Out; // material stuff -layout(location = 2) out struct +layout(location = 3) out struct { int materialIndex; uint eid; @@ -36,10 +37,13 @@ layout(set = 2, binding = 0) uniform CameraData void main() { - Out.uv = aUV; + Out2.materialIndex = gl_InstanceIndex; Out2.eid = integerData[0]; Out2.lightLayerIndex = integerData[1]; + + Out.vertPos = worldTransform * vec4(aVertexPos, 1.0f); + Out.uv = aUV; + Out.normal = vec4 (aNormal, 1.0f); gl_Position = cameraData.vpMat * worldTransform * vec4 (aVertexPos, 1.0f); - Out.vertColor = vec4 (aVertexPos, 1.0f); } \ No newline at end of file diff --git a/TempShaderFolder/TestCubeVs.spv b/TempShaderFolder/TestCubeVs.spv index 731e31d107fda1e44cdbef3c2445017205b6b841..9cf9d86def3a980db6b334d741cd492d99e8a0bc 100644 GIT binary patch literal 2684 zcmZ9OX>%Jz5QfLr;Uvz9$w3H4vI!U*4CEpZau^@7K|X>Ve^pIMi`lC6O0`;>B%ksZ z;3x5`_(B!$GrR3ZRM)Of zx7XR(>2%k6{n4m5&R-`{FNxErH;A*SpT{Q=yfYPEoc5FBL6y)DqgqQtXPnU)tfref zwU2xrWwB2-(?Rqq#K=r1oQvYYDVO?^`0$Us>t9D%!R8F^xO1G}m2wT`<-UhWZ!;a| zKJ7=ARc{XY_<(YjFW%=%KEUX?dYB@f6$Dx*Vm>v0qGi#x@ zszG)$^!U$VmJIeYpN@YQ3r-{S-5)4%^orDBAMfB_9>}hT_wd_AQu3@QrhDv0S+Pm3 z&;rLMHXO%!JWPd71wM5KT$kL7-{_T!UXzQO6pdkrg7FK7v!r$!N>x((K=m?pOAMF?)XBr-xAr&2`H6oRv*Y_`K(| zWU=&_W#Y^T@!O>@75s(LXZDCQ@9Cc90qE{@=WEln@3~d;Dz^K(Q zY_Q_|TF7U)tzYwsvo^%CUNwUMu6J-QzlZ4uB48bz$UgFN2YNgAp5KxH`5wU*%beE7mi+U=$xj~m z_`EL|ael$rOWgKfkxl%%;vYzJHZ{YaktPOCK78f_jQw!0N?7o(NfWdBKa$OP_;%jM zvdM4zZ^>rQH8ES#2(`3Jn|H>aD}DCTuX$-W;03qtK9kLP#Hbga`31Wn|8r@$Emf$~>hD*)t$LD(i zBmRRle2bHx?}zv;#ebG=1)Clezg6uLBUZ%gZdEpURwSH*&u(WhPArY+4ssO*PNoVoc+d5PVVa5fxj zWsV+5m}To3K0IohlYS&&mf$l-KT6ELY%q!MZ&C6r}h2U5;wmqpLh6Mdw7>E2^?^{&$jI9+w8~( vW7&OnWrJ1k^P5=4rhyKdR literal 2492 zcmZ9MX-^bE5QbY=78Su;@j?)96fab~56}f&MdR^x)7c$yl3{i;JD~W#cgLy1J`o2M4Byo!jAdyHWSn6>Gm6kj1$XR}Xum`Jp-6&pWeox39w( zbAy2hXRm&&nqk-K@$!W=~iU_!5oP&8H|b`< zUJG{av%cXRG2CHgJr6o}@t-~i{g8B4-3>d_*L)sju}_xMPV_zaYQaaoDDG@=xoZ-y ze$AVHGs+4!_3}!voHF&y4(HEAuU{oJSR$kNI;6y7pU^Jq277Jcqzsk%Bp%(bm7VJv)A^xG4E$)PmI^|nP;@)Ch)UXvt=kcv4$(E1z zqQ5L^WJnhLT9o-vVyGnyj_f@vM0&mCQp-l~jnB0c&qK5;@!XNw`PR*n&d1EB{V&~Y zt>7|GzPPsTh^-dp%fA)HCm|oR=0Ey$HA*?cHN>I6696qRJqA+?n4W-n3ovs`%uI=y zY5Y4SOFD&jW5HpWjeOYH%|=dayrtRDu`#<1d8`lk?d_)JV=ak=jhsUP7aTC0ecNpM zz=Msv#MzyA=QG>zlrW1s^XA;KsHqmdT`&uOQ+xG|cxNzoIjB=OXG#c+eneVb`=sQk z;;9QvelTwdhC3n5w+aXQr0{O-mT=rL(AETs!BH2R@kDvKmfECl)_% za!NaA@g~IczHqS<4`vpzabC4%_*13N>OCt=ez4VdUOM?L{(^M!omBjcc6x$sLfRGW z);D|z=UmlJUi{Pr=05@3xbQXY#L;Vd%N&BS6MsWHHDD(m%zWCtZPyPqm@nMG#=D!0Q_lEme;@r`X8m%W+XUIW9;n$0h05Eyrc)f`s$oa0mMSLc;9YTZ7?QZ7-!)YikH&V_6+b(y>)*TP|(Y+Fr> Date: Wed, 26 Oct 2022 23:07:01 +0800 Subject: [PATCH 30/92] Re-restructured compilers to be more self contained Loaders only load internal binary asset files --- Assets/Cube.003.shmesh.shmeta | 3 - Assets/Cube.012.shmesh.shmeta | 3 - .../RaccoonPreTexturedVer1_Base9.shtex.shmeta | 3 - .../Shaders}/KirschCs.glsl | 0 .../Shaders}/PureCopyCs.glsl | 0 .../Shaders}/TestCubeFs.glsl | 0 .../Shaders}/TestCubeVs.glsl | 0 SHADE_Application/src/Scenes/SBTestScene.cpp | 2 +- SHADE_Engine/SHAnimationAsset.h | 30 -- .../Libraries/Compilers/SHAssimpLibrary.cpp | 141 ---------- .../Libraries/Compilers/SHAssimpLibrary.h | 36 --- .../Libraries/Compilers/SHMeshCompiler.cpp | 216 ++++++++++++--- .../Libraries/Compilers/SHMeshCompiler.h | 19 +- .../Compilers/SHShaderSourceCompiler.h | 1 + .../Libraries/Compilers/SHTextureCompiler.cpp | 94 +++++++ .../Libraries/Compilers/SHTextureCompiler.h | 10 +- .../Libraries/Loaders/SHShaderSourceLoader.h | 2 +- .../Libraries/Loaders/SHTextureLoader.cpp | 160 +++-------- .../Libraries/Loaders/SHTextureLoader.h | 9 - .../Libraries/SHShaderSourceLibrary.cpp | 262 ------------------ .../Assets/Libraries/SHShaderSourceLibrary.h | 25 -- SHADE_Engine/src/Assets/SHAssetMacros.h | 16 +- SHADE_Engine/src/Assets/SHAssetManager.cpp | 74 +++-- SHADE_Engine/src/Assets/SHAssetManager.h | 9 +- .../MiddleEnd/Interface/SHGraphicsSystem.cpp | 20 +- TempShaderFolder/KirschCs.spv | Bin 5900 -> 0 bytes TempShaderFolder/PureCopyCs.spv | Bin 1264 -> 0 bytes .../ShaderDescriptorDefinitions.glsl | 11 - TempShaderFolder/TestCubeFs.spv | Bin 2300 -> 0 bytes TempShaderFolder/TestCubeVs.spv | Bin 2492 -> 0 bytes 30 files changed, 386 insertions(+), 760 deletions(-) delete mode 100644 Assets/Cube.003.shmesh.shmeta delete mode 100644 Assets/Cube.012.shmesh.shmeta delete mode 100644 Assets/RaccoonPreTexturedVer1_Base9.shtex.shmeta rename {TempShaderFolder => Assets/Shaders}/KirschCs.glsl (100%) rename {TempShaderFolder => Assets/Shaders}/PureCopyCs.glsl (100%) rename {TempShaderFolder => Assets/Shaders}/TestCubeFs.glsl (100%) rename {TempShaderFolder => Assets/Shaders}/TestCubeVs.glsl (100%) delete mode 100644 SHADE_Engine/SHAnimationAsset.h delete mode 100644 SHADE_Engine/src/Assets/Libraries/Compilers/SHAssimpLibrary.cpp delete mode 100644 SHADE_Engine/src/Assets/Libraries/Compilers/SHAssimpLibrary.h delete mode 100644 SHADE_Engine/src/Assets/Libraries/SHShaderSourceLibrary.cpp delete mode 100644 SHADE_Engine/src/Assets/Libraries/SHShaderSourceLibrary.h delete mode 100644 TempShaderFolder/KirschCs.spv delete mode 100644 TempShaderFolder/PureCopyCs.spv delete mode 100644 TempShaderFolder/ShaderDescriptorDefinitions.glsl delete mode 100644 TempShaderFolder/TestCubeFs.spv delete mode 100644 TempShaderFolder/TestCubeVs.spv diff --git a/Assets/Cube.003.shmesh.shmeta b/Assets/Cube.003.shmesh.shmeta deleted file mode 100644 index 207f3999..00000000 --- a/Assets/Cube.003.shmesh.shmeta +++ /dev/null @@ -1,3 +0,0 @@ -Name: Cube.003 -ID: 110152941 -Type: 6 diff --git a/Assets/Cube.012.shmesh.shmeta b/Assets/Cube.012.shmesh.shmeta deleted file mode 100644 index 3af04f93..00000000 --- a/Assets/Cube.012.shmesh.shmeta +++ /dev/null @@ -1,3 +0,0 @@ -Name: Cube.012 -ID: 107348815 -Type: 6 diff --git a/Assets/RaccoonPreTexturedVer1_Base9.shtex.shmeta b/Assets/RaccoonPreTexturedVer1_Base9.shtex.shmeta deleted file mode 100644 index 3905aa4f..00000000 --- a/Assets/RaccoonPreTexturedVer1_Base9.shtex.shmeta +++ /dev/null @@ -1,3 +0,0 @@ -Name: RaccoonPreTexturedVer1_Base9 -ID: 91918845 -Type: 4 diff --git a/TempShaderFolder/KirschCs.glsl b/Assets/Shaders/KirschCs.glsl similarity index 100% rename from TempShaderFolder/KirschCs.glsl rename to Assets/Shaders/KirschCs.glsl diff --git a/TempShaderFolder/PureCopyCs.glsl b/Assets/Shaders/PureCopyCs.glsl similarity index 100% rename from TempShaderFolder/PureCopyCs.glsl rename to Assets/Shaders/PureCopyCs.glsl diff --git a/TempShaderFolder/TestCubeFs.glsl b/Assets/Shaders/TestCubeFs.glsl similarity index 100% rename from TempShaderFolder/TestCubeFs.glsl rename to Assets/Shaders/TestCubeFs.glsl diff --git a/TempShaderFolder/TestCubeVs.glsl b/Assets/Shaders/TestCubeVs.glsl similarity index 100% rename from TempShaderFolder/TestCubeVs.glsl rename to Assets/Shaders/TestCubeVs.glsl diff --git a/SHADE_Application/src/Scenes/SBTestScene.cpp b/SHADE_Application/src/Scenes/SBTestScene.cpp index a06e68c2..de408cc9 100644 --- a/SHADE_Application/src/Scenes/SBTestScene.cpp +++ b/SHADE_Application/src/Scenes/SBTestScene.cpp @@ -53,7 +53,7 @@ namespace Sandbox if (asset.name == "Cube.012") handles.emplace_back(SHResourceManager::LoadOrGet(asset.id)); break; - case AssetType::IMAGE: + case AssetType::TEXTURE: texHandles.emplace_back(SHResourceManager::LoadOrGet(asset.id)); break; } diff --git a/SHADE_Engine/SHAnimationAsset.h b/SHADE_Engine/SHAnimationAsset.h deleted file mode 100644 index d8d0ffb1..00000000 --- a/SHADE_Engine/SHAnimationAsset.h +++ /dev/null @@ -1,30 +0,0 @@ -/*************************************************************************//** - * \file SHAnimationAsset.h - * \author Loh Xiao Qi - * \date October 2022 - * \brief - * - * 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 - -#include -#include -#include "SH_API.power h" - -namespace SHADE -{ - struct SH_API SHAnimationAsset - { - std::string name; - - std::vector nodeChannels; - std::vector meshChannels; - std::vector morphMeshChannels; - - double duration; - double ticksPerSecond; - }; -} \ No newline at end of file diff --git a/SHADE_Engine/src/Assets/Libraries/Compilers/SHAssimpLibrary.cpp b/SHADE_Engine/src/Assets/Libraries/Compilers/SHAssimpLibrary.cpp deleted file mode 100644 index f4be0b68..00000000 --- a/SHADE_Engine/src/Assets/Libraries/Compilers/SHAssimpLibrary.cpp +++ /dev/null @@ -1,141 +0,0 @@ -/*************************************************************************//** - * \file SHAssimpLibrary.cpp - * \author Loh Xiao Qi - * \date October 2022 - * \brief - * - * 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. - *****************************************************************************/ -#include "SHpch.h" -#include "SHAssimpLibrary.h" -#include - -namespace SHADE -{ - Assimp::Importer SHAssimpLibrary::aiImporter; - - void SHAssimpLibrary::ProcessNode(aiNode const& node, aiScene const& scene, MeshVectorRef meshes) noexcept - { - for (size_t i {0}; i < node.mNumMeshes; ++i) - { - aiMesh* mesh = scene.mMeshes[node.mMeshes[i]]; - meshes.push_back(ProcessMesh(*mesh)); - } - - for (size_t i{ 0 }; i < node.mNumChildren; ++i) - { - ProcessNode(*node.mChildren[i], scene, meshes); - } - } - - void SHAssimpLibrary::ExtractAnimations(aiScene const& scene, AnimVectorRef anims) noexcept - { - if (scene.HasAnimations()) - { - std::vector anims(scene.mNumAnimations); - for (auto i{0}; i < scene.mNumAnimations; ++i) - { - auto const& anim {*scene.mAnimations[i]}; - - anims[i].name = anim.mName.C_Str(); - - anims[i].duration = anim.mDuration; - anims[i].ticksPerSecond = anim.mTicksPerSecond; - - std::copy_n(anim.mChannels, anim.mNumChannels, anims[i].nodeChannels.data()); - std::copy_n(anim.mMeshChannels, anim.mNumMeshChannels, anims[i].meshChannels.data()); - std::copy_n(anim.mMorphMeshChannels, anim.mNumMorphMeshChannels, anims[i].morphMeshChannels.data()); - } - } - } - - SHMeshAsset* SHAssimpLibrary::ProcessMesh(aiMesh const& mesh) noexcept - { - SHMeshAsset* result = new SHMeshAsset(); - result->compiled = false; - result->changed = false; - - for (size_t i{0}; i < mesh.mNumVertices; ++i) - { - // Vertex position - SHVec3 vertex; - vertex.x = mesh.mVertices[i].x; - vertex.y = mesh.mVertices[i].y; - vertex.z = mesh.mVertices[i].z; - result->vertexPosition.push_back(vertex); - - // Tex coords - SHVec2 texCoord{0.f, 0.f}; - if (mesh.mTextureCoords[0]) - { - texCoord.x = mesh.mTextureCoords[0][i].x; - texCoord.y = mesh.mTextureCoords[0][i].y; - } - result->texCoords.push_back(texCoord); - - // Normals - SHVec3 normal{0.f, 0.f, 0.f}; - if (mesh.mNormals) - { - normal.x = mesh.mNormals[i].x; - normal.y = mesh.mNormals[i].y; - normal.z = mesh.mNormals[i].z; - } - result->vertexNormal.push_back(normal); - - // Tangent - SHVec3 tangent{0.f, 0.f, 0.f}; - if (mesh.mTangents) - { - tangent.x = mesh.mTangents[i].x; - tangent.y = mesh.mTangents[i].y; - tangent.z = mesh.mTangents[i].z; - } - result->vertexTangent.push_back(tangent); - } - - for (size_t i {0}; i < mesh.mNumFaces; ++i) - { - aiFace face = mesh.mFaces[i]; - for (size_t j{0}; j < face.mNumIndices; ++j) - { - result->indices.push_back(face.mIndices[j]); - } - } - - result->header.vertexCount = static_cast(result->vertexPosition.size()); - result->header.indexCount = static_cast(result->indices.size()); - result->header.name = mesh.mName.C_Str(); - - return result; - } - - void SHAssimpLibrary::LoadFromFile(AssetPath path, MeshVectorRef meshes, AnimVectorRef anims) noexcept - { - const aiScene* scene = aiImporter.ReadFile(path.string().c_str(), - aiProcess_Triangulate // Make sure we get triangles rather than nvert polygons - | aiProcess_GenUVCoords // Convert any type of mapping to uv mapping - | aiProcess_TransformUVCoords // preprocess UV transformations (scaling, translation ...) - | aiProcess_FindInstances // search for instanced meshes and remove them by references to one master - | aiProcess_CalcTangentSpace // calculate tangents and bitangents if possible - | aiProcess_JoinIdenticalVertices // join identical vertices/ optimize indexing - | aiProcess_RemoveRedundantMaterials // remove redundant materials - | aiProcess_FindInvalidData // detect invalid model data, such as invalid normal vectors - | aiProcess_FlipUVs // flip the V to match the Vulkans way of doing UVs - ); - - if (!scene || !scene->HasMeshes()) - { - SHLOG_ERROR("ERROR in GLTF::ASSIMP: {}\nFile: {}", aiImporter.GetErrorString(), path.string()); - return; - } - - ExtractAnimations(*scene, anims); - - ProcessNode(*scene->mRootNode, *scene, meshes); - - aiImporter.FreeScene(); - } -} diff --git a/SHADE_Engine/src/Assets/Libraries/Compilers/SHAssimpLibrary.h b/SHADE_Engine/src/Assets/Libraries/Compilers/SHAssimpLibrary.h deleted file mode 100644 index d5afde00..00000000 --- a/SHADE_Engine/src/Assets/Libraries/Compilers/SHAssimpLibrary.h +++ /dev/null @@ -1,36 +0,0 @@ -/*************************************************************************//** - * \file SHAssimpLibrary.h - * \author Loh Xiao Qi - * \date October 2022 - * \brief - * - * 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 -#include -#include -#include -#include "Assets/SHAssetMacros.h" -#include "Assets/Asset Types/SHMeshAsset.h" -#include "Assets/Asset Types/SHAnimationAsset.h" - -namespace SHADE -{ - class SHAssimpLibrary - { - private: - using MeshVectorRef = std::vector&; - using AnimVectorRef = std::vector&; - - static Assimp::Importer aiImporter; - static void ProcessNode(aiNode const& node, aiScene const& scene,MeshVectorRef meshes) noexcept; - static void ExtractAnimations(aiScene const& scene, AnimVectorRef anims) noexcept; - static SHMeshAsset* ProcessMesh(aiMesh const& mesh) noexcept; - - public: - static void LoadFromFile(AssetPath path, MeshVectorRef meshes, AnimVectorRef anims) noexcept; - }; -} \ No newline at end of file diff --git a/SHADE_Engine/src/Assets/Libraries/Compilers/SHMeshCompiler.cpp b/SHADE_Engine/src/Assets/Libraries/Compilers/SHMeshCompiler.cpp index 335eb631..3962b851 100644 --- a/SHADE_Engine/src/Assets/Libraries/Compilers/SHMeshCompiler.cpp +++ b/SHADE_Engine/src/Assets/Libraries/Compilers/SHMeshCompiler.cpp @@ -13,59 +13,189 @@ #include "SHpch.h" #include "SHMeshCompiler.h" #include "Graphics/MiddleEnd/Meshes/SHMeshData.h" +#include #include -std::string SHADE::SHMeshCompiler::CompileMeshBinary(SHMeshAsset const& asset, AssetPath path) noexcept +namespace SHADE { - std::string newPath{ path.parent_path().string() + '/'}; - newPath += asset.header.name + MESH_EXTENSION.data(); - std::ofstream file{ newPath, std::ios::out | std::ios::binary | std::ios::trunc }; - if (!file.is_open()) - { - SHLOG_ERROR("Unable to open file for writing mesh file: {}", path.string()); - } + Assimp::Importer SHMeshCompiler::aiImporter; - file.write( - reinterpret_cast(&(asset.header.vertexCount)), - sizeof(uint32_t) - ); + void SHMeshCompiler::ProcessNode(aiNode const& node, aiScene const& scene, MeshVectorRef meshes) noexcept + { + for (size_t i{ 0 }; i < node.mNumMeshes; ++i) + { + aiMesh* mesh = scene.mMeshes[node.mMeshes[i]]; + meshes.push_back(ProcessMesh(*mesh)); + } - file.write( - reinterpret_cast(&(asset.header.indexCount)), - sizeof(uint32_t) - ); + for (size_t i{ 0 }; i < node.mNumChildren; ++i) + { + ProcessNode(*node.mChildren[i], scene, meshes); + } + } - auto const vertexVec3Byte {sizeof(SHVec3) * asset.header.vertexCount}; - auto const vertexVec2Byte {sizeof(SHVec2) * asset.header.vertexCount}; + void SHMeshCompiler::ExtractAnimations(aiScene const& scene, AnimVectorRef anims) noexcept + { + if (scene.HasAnimations()) + { + std::vector anims(scene.mNumAnimations); + for (auto i{ 0 }; i < scene.mNumAnimations; ++i) + { + auto const& anim{ *scene.mAnimations[i] }; - file.write( - reinterpret_cast(asset.vertexPosition.data()), - vertexVec3Byte - ); - - file.write( - reinterpret_cast(asset.vertexTangent.data()), - vertexVec3Byte - ); - - file.write( - reinterpret_cast(asset.vertexNormal.data()), - vertexVec3Byte - ); - - file.write( - reinterpret_cast(asset.texCoords.data()), - vertexVec2Byte - ); + anims[i].name = anim.mName.C_Str(); - file.write( - reinterpret_cast(asset.indices.data()), - sizeof(uint32_t) * asset.header.indexCount - ); + anims[i].duration = anim.mDuration; + anims[i].ticksPerSecond = anim.mTicksPerSecond; - file.close(); + std::copy_n(anim.mChannels, anim.mNumChannels, anims[i].nodeChannels.data()); + std::copy_n(anim.mMeshChannels, anim.mNumMeshChannels, anims[i].meshChannels.data()); + std::copy_n(anim.mMorphMeshChannels, anim.mNumMorphMeshChannels, anims[i].morphMeshChannels.data()); + } + } + } - return newPath; + SHMeshAsset* SHMeshCompiler::ProcessMesh(aiMesh const& mesh) noexcept + { + SHMeshAsset* result = new SHMeshAsset(); + result->compiled = false; + result->changed = false; + + for (size_t i{ 0 }; i < mesh.mNumVertices; ++i) + { + // Vertex position + SHVec3 vertex; + vertex.x = mesh.mVertices[i].x; + vertex.y = mesh.mVertices[i].y; + vertex.z = mesh.mVertices[i].z; + result->vertexPosition.push_back(vertex); + + // Tex coords + SHVec2 texCoord{ 0.f, 0.f }; + if (mesh.mTextureCoords[0]) + { + texCoord.x = mesh.mTextureCoords[0][i].x; + texCoord.y = mesh.mTextureCoords[0][i].y; + } + result->texCoords.push_back(texCoord); + + // Normals + SHVec3 normal{ 0.f, 0.f, 0.f }; + if (mesh.mNormals) + { + normal.x = mesh.mNormals[i].x; + normal.y = mesh.mNormals[i].y; + normal.z = mesh.mNormals[i].z; + } + result->vertexNormal.push_back(normal); + + // Tangent + SHVec3 tangent{ 0.f, 0.f, 0.f }; + if (mesh.mTangents) + { + tangent.x = mesh.mTangents[i].x; + tangent.y = mesh.mTangents[i].y; + tangent.z = mesh.mTangents[i].z; + } + result->vertexTangent.push_back(tangent); + } + + for (size_t i{ 0 }; i < mesh.mNumFaces; ++i) + { + aiFace face = mesh.mFaces[i]; + for (size_t j{ 0 }; j < face.mNumIndices; ++j) + { + result->indices.push_back(face.mIndices[j]); + } + } + + result->header.vertexCount = static_cast(result->vertexPosition.size()); + result->header.indexCount = static_cast(result->indices.size()); + result->header.name = mesh.mName.C_Str(); + + return result; + } + + void SHMeshCompiler::LoadFromFile(AssetPath path, MeshVectorRef meshes, AnimVectorRef anims) noexcept + { + const aiScene* scene = aiImporter.ReadFile(path.string().c_str(), + aiProcess_Triangulate // Make sure we get triangles rather than nvert polygons + | aiProcess_GenUVCoords // Convert any type of mapping to uv mapping + | aiProcess_TransformUVCoords // preprocess UV transformations (scaling, translation ...) + | aiProcess_FindInstances // search for instanced meshes and remove them by references to one master + | aiProcess_CalcTangentSpace // calculate tangents and bitangents if possible + | aiProcess_JoinIdenticalVertices // join identical vertices/ optimize indexing + | aiProcess_RemoveRedundantMaterials // remove redundant materials + | aiProcess_FindInvalidData // detect invalid model data, such as invalid normal vectors + | aiProcess_FlipUVs // flip the V to match the Vulkans way of doing UVs + ); + + if (!scene || !scene->HasMeshes()) + { + SHLOG_ERROR("ERROR in GLTF::ASSIMP: {}\nFile: {}", aiImporter.GetErrorString(), path.string()); + return; + } + + ExtractAnimations(*scene, anims); + + ProcessNode(*scene->mRootNode, *scene, meshes); + + aiImporter.FreeScene(); + } + + std::string SHMeshCompiler::CompileMeshBinary(SHMeshAsset const& asset, AssetPath path) noexcept + { + std::string newPath{ path.parent_path().string() + '/' }; + newPath += asset.header.name + MESH_EXTENSION.data(); + + std::ofstream file{ newPath, std::ios::out | std::ios::binary | std::ios::trunc }; + if (!file.is_open()) + { + SHLOG_ERROR("Unable to open file for writing mesh file: {}", path.string()); + } + + file.write( + reinterpret_cast(&(asset.header.vertexCount)), + sizeof(uint32_t) + ); + + file.write( + reinterpret_cast(&(asset.header.indexCount)), + sizeof(uint32_t) + ); + + auto const vertexVec3Byte{ sizeof(SHVec3) * asset.header.vertexCount }; + auto const vertexVec2Byte{ sizeof(SHVec2) * asset.header.vertexCount }; + + file.write( + reinterpret_cast(asset.vertexPosition.data()), + vertexVec3Byte + ); + + file.write( + reinterpret_cast(asset.vertexTangent.data()), + vertexVec3Byte + ); + + file.write( + reinterpret_cast(asset.vertexNormal.data()), + vertexVec3Byte + ); + + file.write( + reinterpret_cast(asset.texCoords.data()), + vertexVec2Byte + ); + + file.write( + reinterpret_cast(asset.indices.data()), + sizeof(uint32_t) * asset.header.indexCount + ); + + file.close(); + + return newPath; + } } diff --git a/SHADE_Engine/src/Assets/Libraries/Compilers/SHMeshCompiler.h b/SHADE_Engine/src/Assets/Libraries/Compilers/SHMeshCompiler.h index 441c2297..0b873621 100644 --- a/SHADE_Engine/src/Assets/Libraries/Compilers/SHMeshCompiler.h +++ b/SHADE_Engine/src/Assets/Libraries/Compilers/SHMeshCompiler.h @@ -12,6 +12,11 @@ *****************************************************************************/ #pragma once +#include +#include +#include + +#include "Assets/Asset Types/SHAnimationAsset.h" #include "Assets/Asset Types/SHMeshAsset.h" #include "Assets/SHAssetMacros.h" @@ -19,7 +24,17 @@ namespace SHADE { class SHMeshCompiler { - public: - static std::string CompileMeshBinary(SHMeshAsset const& asset, AssetPath path) noexcept; + + using MeshVectorRef = std::vector&; + using AnimVectorRef = std::vector&; + + static Assimp::Importer aiImporter; + static void ProcessNode(aiNode const& node, aiScene const& scene, MeshVectorRef meshes) noexcept; + static void ExtractAnimations(aiScene const& scene, AnimVectorRef anims) noexcept; + static SHMeshAsset* ProcessMesh(aiMesh const& mesh) noexcept; + + public: + static void LoadFromFile(AssetPath path, MeshVectorRef meshes, AnimVectorRef anims) noexcept; + static std::string CompileMeshBinary(SHMeshAsset const& asset, AssetPath path) noexcept; }; } \ No newline at end of file diff --git a/SHADE_Engine/src/Assets/Libraries/Compilers/SHShaderSourceCompiler.h b/SHADE_Engine/src/Assets/Libraries/Compilers/SHShaderSourceCompiler.h index 9fb93924..4872be59 100644 --- a/SHADE_Engine/src/Assets/Libraries/Compilers/SHShaderSourceCompiler.h +++ b/SHADE_Engine/src/Assets/Libraries/Compilers/SHShaderSourceCompiler.h @@ -17,6 +17,7 @@ namespace SHADE { class SHShaderSourceCompiler { + private: static std::string CompileShaderSourceToBinary(AssetPath path, SHShaderAsset const& data) noexcept; static SHShaderAsset const* CompileShaderSourceToMemory(std::string const& data, std::string const& name, SH_SHADER_TYPE type) noexcept; diff --git a/SHADE_Engine/src/Assets/Libraries/Compilers/SHTextureCompiler.cpp b/SHADE_Engine/src/Assets/Libraries/Compilers/SHTextureCompiler.cpp index 49de6b5c..9c65f5b2 100644 --- a/SHADE_Engine/src/Assets/Libraries/Compilers/SHTextureCompiler.cpp +++ b/SHADE_Engine/src/Assets/Libraries/Compilers/SHTextureCompiler.cpp @@ -17,6 +17,100 @@ namespace SHADE { + + std::string SHTextureCompiler::TinyDDSResultToString(tinyddsloader::Result value) + { + switch (value) + { + case tinyddsloader::Result::ErrorFileOpen: + return "File open err"; + case tinyddsloader::Result::ErrorRead: + return "File read err"; + case tinyddsloader::Result::ErrorMagicWord: + return "File header magic word err"; + case tinyddsloader::Result::ErrorSize: + return "File size err"; + case tinyddsloader::Result::ErrorVerify: + return "Pixel format err"; + case tinyddsloader::Result::ErrorNotSupported: + return "Unsupported format"; + case tinyddsloader::Result::ErrorInvalidData: + return "Invalid data"; + default: + return "Unknown"; + } + } + + vk::Format SHTextureCompiler::ddsLoaderToVkFormat(tinyddsloader::DDSFile::DXGIFormat format, bool isLinear) + { + switch (format) + { + case tinyddsloader::DDSFile::DXGIFormat::BC1_UNorm: + case tinyddsloader::DDSFile::DXGIFormat::BC1_UNorm_SRGB: + return isLinear ? vk::Format::eBc1RgbaUnormBlock : vk::Format::eBc1RgbaSrgbBlock; + case tinyddsloader::DDSFile::DXGIFormat::BC2_UNorm: + case tinyddsloader::DDSFile::DXGIFormat::BC2_UNorm_SRGB: + return isLinear ? vk::Format::eBc2UnormBlock : vk::Format::eBc2SrgbBlock; + case tinyddsloader::DDSFile::DXGIFormat::BC3_UNorm: + case tinyddsloader::DDSFile::DXGIFormat::BC3_UNorm_SRGB: + return isLinear ? vk::Format::eBc3UnormBlock : vk::Format::eBc3SrgbBlock; + case tinyddsloader::DDSFile::DXGIFormat::BC5_UNorm: + case tinyddsloader::DDSFile::DXGIFormat::BC5_SNorm: + return isLinear ? vk::Format::eBc5UnormBlock : vk::Format::eBc5SnormBlock; + case tinyddsloader::DDSFile::DXGIFormat::R8G8B8A8_UNorm: + case tinyddsloader::DDSFile::DXGIFormat::R8G8B8A8_UNorm_SRGB: + return isLinear ? vk::Format::eR8G8B8A8Unorm : vk::Format::eR8G8B8A8Srgb; + case tinyddsloader::DDSFile::DXGIFormat::R8G8B8A8_SNorm: + return vk::Format::eR8G8B8A8Snorm; + case tinyddsloader::DDSFile::DXGIFormat::B8G8R8A8_UNorm: + case tinyddsloader::DDSFile::DXGIFormat::B8G8R8A8_UNorm_SRGB: + return isLinear ? vk::Format::eB8G8R8A8Unorm : vk::Format::eB8G8R8A8Srgb; + case tinyddsloader::DDSFile::DXGIFormat::B8G8R8X8_UNorm: + case tinyddsloader::DDSFile::DXGIFormat::B8G8R8X8_UNorm_SRGB: + return isLinear ? vk::Format::eB8G8R8A8Unorm : vk::Format::eB8G8R8Srgb; + default: + throw std::runtime_error("Unsupported DDS format."); + } + } + + void SHTextureCompiler::LoadTinyDDS(AssetPath path, SHTextureAsset& asset) noexcept + { + tinyddsloader::Result loadResult = tinyddsloader::Result::Success; + tinyddsloader::DDSFile file; + loadResult = file.Load(path.string().c_str()); + if (loadResult != tinyddsloader::Result::Success) + { + SHLOG_ERROR("Unable to load Texture file: {} at {}", TinyDDSResultToString(loadResult), path.string()); + } + + size_t totalBytes{ 0 }; + + std::vector mipOff(file.GetMipCount()); + + for (size_t i{ 0 }; i < file.GetMipCount(); ++i) + { + mipOff[i] = static_cast(totalBytes); + totalBytes += file.GetImageData(static_cast(i), 0)->m_memSlicePitch; + } + + SHTexture::PixelChannel* pixel = new SHTexture::PixelChannel[totalBytes]; + std::memcpy(pixel, file.GetImageData()->m_mem, totalBytes); + //pixel = std::move(reinterpret_cast(file.GetDDSData())); + + asset.name = path.stem().string(); + asset.compiled = false; + asset.numBytes = static_cast(totalBytes); + asset.width = file.GetWidth(); + asset.height = file.GetHeight(); + asset.format = ddsLoaderToVkFormat(file.GetFormat(), true); + asset.mipOffsets = std::move(mipOff); + asset.pixelData = std::move(pixel); + } + + void SHTextureCompiler::LoadImageAsset(AssetPath path, SHTextureAsset& image) + { + LoadTinyDDS(path, image); + } std::string SHTextureCompiler::CompileTextureBinary(SHTextureAsset const& asset, AssetPath path) { std::string newPath{ path.string() }; diff --git a/SHADE_Engine/src/Assets/Libraries/Compilers/SHTextureCompiler.h b/SHADE_Engine/src/Assets/Libraries/Compilers/SHTextureCompiler.h index 52980084..3a7e7db7 100644 --- a/SHADE_Engine/src/Assets/Libraries/Compilers/SHTextureCompiler.h +++ b/SHADE_Engine/src/Assets/Libraries/Compilers/SHTextureCompiler.h @@ -11,14 +11,22 @@ * of DigiPen Institute of Technology is prohibited. *****************************************************************************/ #pragma once +#define TINYDDSLOADER_IMPLEMENTATION #include "Assets/Asset Types/SHTextureAsset.h" #include "Assets/SHAssetMacros.h" +#include "tinyddsloader.h" namespace SHADE { - struct SHTextureCompiler + class SHTextureCompiler { + private: + static std::string TinyDDSResultToString(tinyddsloader::Result value); + static vk::Format ddsLoaderToVkFormat(tinyddsloader::DDSFile::DXGIFormat format, bool isLinear); + static void LoadTinyDDS(AssetPath path, SHTextureAsset& asset) noexcept; + public: + static void LoadImageAsset(AssetPath paths, SHTextureAsset& image); static std::string CompileTextureBinary(SHTextureAsset const& asset, AssetPath path); }; } \ No newline at end of file diff --git a/SHADE_Engine/src/Assets/Libraries/Loaders/SHShaderSourceLoader.h b/SHADE_Engine/src/Assets/Libraries/Loaders/SHShaderSourceLoader.h index befdade5..905eb223 100644 --- a/SHADE_Engine/src/Assets/Libraries/Loaders/SHShaderSourceLoader.h +++ b/SHADE_Engine/src/Assets/Libraries/Loaders/SHShaderSourceLoader.h @@ -15,7 +15,7 @@ namespace SHADE { - struct SHShaderSourceLoader : SHAssetLoader + struct SHShaderSourceLoader final : SHAssetLoader { SHAssetData* Load(AssetPath path) override; }; diff --git a/SHADE_Engine/src/Assets/Libraries/Loaders/SHTextureLoader.cpp b/SHADE_Engine/src/Assets/Libraries/Loaders/SHTextureLoader.cpp index 8b986524..74c08230 100644 --- a/SHADE_Engine/src/Assets/Libraries/Loaders/SHTextureLoader.cpp +++ b/SHADE_Engine/src/Assets/Libraries/Loaders/SHTextureLoader.cpp @@ -12,145 +12,47 @@ #include "SHpch.h" #include "SHTextureLoader.h" +#include + namespace SHADE { - std::string SHTextureLoader::TinyDDSResultToString(tinyddsloader::Result value) - { - switch (value) - { - case tinyddsloader::Result::ErrorFileOpen: - return "File open err"; - case tinyddsloader::Result::ErrorRead: - return "File read err"; - case tinyddsloader::Result::ErrorMagicWord: - return "File header magic word err"; - case tinyddsloader::Result::ErrorSize: - return "File size err"; - case tinyddsloader::Result::ErrorVerify: - return "Pixel format err"; - case tinyddsloader::Result::ErrorNotSupported: - return "Unsupported format"; - case tinyddsloader::Result::ErrorInvalidData: - return "Invalid data"; - default: - return "Unknown"; - } - } - vk::Format SHTextureLoader::ddsLoaderToVkFormat(tinyddsloader::DDSFile::DXGIFormat format, bool isLinear) - { - switch (format) - { - case tinyddsloader::DDSFile::DXGIFormat::BC1_UNorm: - case tinyddsloader::DDSFile::DXGIFormat::BC1_UNorm_SRGB: - return isLinear ? vk::Format::eBc1RgbaUnormBlock : vk::Format::eBc1RgbaSrgbBlock; - case tinyddsloader::DDSFile::DXGIFormat::BC2_UNorm: - case tinyddsloader::DDSFile::DXGIFormat::BC2_UNorm_SRGB: - return isLinear ? vk::Format::eBc2UnormBlock : vk::Format::eBc2SrgbBlock; - case tinyddsloader::DDSFile::DXGIFormat::BC3_UNorm: - case tinyddsloader::DDSFile::DXGIFormat::BC3_UNorm_SRGB: - return isLinear ? vk::Format::eBc3UnormBlock : vk::Format::eBc3SrgbBlock; - case tinyddsloader::DDSFile::DXGIFormat::BC5_UNorm: - case tinyddsloader::DDSFile::DXGIFormat::BC5_SNorm: - return isLinear ? vk::Format::eBc5UnormBlock : vk::Format::eBc5SnormBlock; - case tinyddsloader::DDSFile::DXGIFormat::R8G8B8A8_UNorm: - case tinyddsloader::DDSFile::DXGIFormat::R8G8B8A8_UNorm_SRGB: - return isLinear ? vk::Format::eR8G8B8A8Unorm : vk::Format::eR8G8B8A8Srgb; - case tinyddsloader::DDSFile::DXGIFormat::R8G8B8A8_SNorm: - return vk::Format::eR8G8B8A8Snorm; - case tinyddsloader::DDSFile::DXGIFormat::B8G8R8A8_UNorm: - case tinyddsloader::DDSFile::DXGIFormat::B8G8R8A8_UNorm_SRGB: - return isLinear ? vk::Format::eB8G8R8A8Unorm : vk::Format::eB8G8R8A8Srgb; - case tinyddsloader::DDSFile::DXGIFormat::B8G8R8X8_UNorm: - case tinyddsloader::DDSFile::DXGIFormat::B8G8R8X8_UNorm_SRGB: - return isLinear ? vk::Format::eB8G8R8A8Unorm : vk::Format::eB8G8R8Srgb; - default: - throw std::runtime_error("Unsupported DDS format."); - } - } + void SHTextureLoader::LoadSHTexture(AssetPath path, SHTextureAsset& asset) noexcept + { + std::ifstream file{ path.string(), std::ios::in | std::ios::binary }; + if (!file.is_open()) + { + SHLOG_ERROR("Error opening SHTexture file: {}", path.string()); + } - void SHTextureLoader::LoadTinyDDS(AssetPath path, SHTextureAsset& asset) noexcept - { - tinyddsloader::Result loadResult = tinyddsloader::Result::Success; - tinyddsloader::DDSFile file; - loadResult = file.Load(path.string().c_str()); - if (loadResult != tinyddsloader::Result::Success) - { - SHLOG_ERROR("Unable to load Texture file: {} at {}", TinyDDSResultToString(loadResult), path.string()); - } + auto const intBytes{ sizeof(uint32_t) }; + uint32_t mipCount; - size_t totalBytes{ 0 }; + file.read(reinterpret_cast(&asset.numBytes), intBytes); + file.read(reinterpret_cast(&asset.width), intBytes); + file.read(reinterpret_cast(&asset.height), intBytes); + file.read(reinterpret_cast(&asset.format), sizeof(SHTexture::TextureFormat)); - std::vector mipOff(file.GetMipCount()); + file.read(reinterpret_cast(&mipCount), intBytes); + std::vector mips(mipCount); + file.read(reinterpret_cast(mips.data()), intBytes * mipCount); - for (size_t i{0}; i < file.GetMipCount(); ++i) - { - mipOff[i] = static_cast(totalBytes); - totalBytes += file.GetImageData(static_cast(i), 0)->m_memSlicePitch; - } + auto pixel = new SHTexture::PixelChannel[asset.numBytes]; + file.read(reinterpret_cast(pixel), asset.numBytes); - SHTexture::PixelChannel* pixel = new SHTexture::PixelChannel[totalBytes]; - std::memcpy(pixel, file.GetImageData()->m_mem, totalBytes); - //pixel = std::move(reinterpret_cast(file.GetDDSData())); + asset.mipOffsets = std::move(mips); + asset.pixelData = std::move(pixel); - asset.name = path.stem().string(); - asset.compiled = false; - asset.numBytes = static_cast(totalBytes); - asset.width = file.GetWidth(); - asset.height = file.GetHeight(); - asset.format = ddsLoaderToVkFormat(file.GetFormat(), true); - asset.mipOffsets = std::move(mipOff); - asset.pixelData = std::move(pixel); - } + asset.compiled = true; + file.close(); + } - void SHTextureLoader::LoadSHTexture(AssetPath path, SHTextureAsset& asset) noexcept - { - std::ifstream file{path.string(), std::ios::in | std::ios::binary}; - if (!file.is_open()) - { - SHLOG_ERROR("Error opening SHTexture file: {}", path.string()); - } + SHAssetData* SHTextureLoader::Load(AssetPath path) + { + auto result = new SHTextureAsset(); - auto const intBytes{ sizeof(uint32_t) }; - uint32_t mipCount; + LoadSHTexture(path, *result); - file.read(reinterpret_cast(&asset.numBytes), intBytes); - file.read(reinterpret_cast(&asset.width), intBytes); - file.read(reinterpret_cast(&asset.height), intBytes); - file.read(reinterpret_cast(&asset.format), sizeof(SHTexture::TextureFormat)); - - file.read(reinterpret_cast(&mipCount), intBytes); - std::vector mips(mipCount); - file.read(reinterpret_cast(mips.data()), intBytes * mipCount); - - auto pixel = new SHTexture::PixelChannel[asset.numBytes]; - file.read(reinterpret_cast(pixel), asset.numBytes); - - asset.mipOffsets = std::move(mips); - asset.pixelData = std::move( pixel ); - - asset.compiled = true; - file.close(); - } - - SHAssetData* SHTextureLoader::Load(AssetPath path) - { - auto result = new SHTextureAsset(); - - LoadImageAsset(path, *result); - - return result; - } - - void SHTextureLoader::LoadImageAsset(AssetPath path, SHTextureAsset& asset) - { - if (path.extension().string() == DDS_EXTENSION) - { - LoadTinyDDS(path, asset); - } - else if (path.extension().string() == TEXTURE_EXTENSION) - { - LoadSHTexture(path, asset); - } - } + return result; + } } diff --git a/SHADE_Engine/src/Assets/Libraries/Loaders/SHTextureLoader.h b/SHADE_Engine/src/Assets/Libraries/Loaders/SHTextureLoader.h index 95dd7c9a..00b060ec 100644 --- a/SHADE_Engine/src/Assets/Libraries/Loaders/SHTextureLoader.h +++ b/SHADE_Engine/src/Assets/Libraries/Loaders/SHTextureLoader.h @@ -10,24 +10,15 @@ * of DigiPen Institute of Technology is prohibited. *****************************************************************************/ #pragma once -#define TINYDDSLOADER_IMPLEMENTATION #include "Assets/SHAssetMacros.h" #include "Assets/Asset Types/SHTextureAsset.h" -#include "tinyddsloader.h" #include "SHAssetLoader.h" namespace SHADE { class SHTextureLoader : public SHAssetLoader { - private: - std::string TinyDDSResultToString(tinyddsloader::Result value); - vk::Format ddsLoaderToVkFormat(tinyddsloader::DDSFile::DXGIFormat format, bool isLinear); - - void LoadTinyDDS(AssetPath path, SHTextureAsset& asset) noexcept; - public: - void LoadImageAsset(AssetPath paths, SHTextureAsset& image); void LoadSHTexture(AssetPath path, SHTextureAsset& asset) noexcept; SHAssetData* Load(AssetPath path) override; }; diff --git a/SHADE_Engine/src/Assets/Libraries/SHShaderSourceLibrary.cpp b/SHADE_Engine/src/Assets/Libraries/SHShaderSourceLibrary.cpp deleted file mode 100644 index 8a5769d0..00000000 --- a/SHADE_Engine/src/Assets/Libraries/SHShaderSourceLibrary.cpp +++ /dev/null @@ -1,262 +0,0 @@ -#include "SHPch.h" -#include -#include -#include "SHShaderSourceLibrary.h" -#include "Tools/SHLogger.h" - -namespace SHADE -{ - - /***************************************************************************/ - /*! - - \brief - Private member function to compile a shader STRING source to binary and - returns a vector of 4 bytes. - - \param glslSource - The GLSL string source. - - \param type - Type of the shader: vertex, fragment, compute, etc. - - \param opLevel - Optimization level. - - \return - Returns a vector of the binary data. - - */ - /***************************************************************************/ - std::vector SHShaderSourceLibrary::CompileToBinary(std::string const& glslSource, char const* const spirvFilename, SH_SHADER_TYPE type, shaderc_optimization_level opLevel /*= shaderc_optimization_level_zero*/) - { - // shaderc compiler - shaderc::Compiler compiler; - shaderc::CompileOptions options; - - options.AddMacroDefinition("MY_DEFINE", "1"); - - // Set optimization levels - if (opLevel != shaderc_optimization_level_zero) - options.SetOptimizationLevel(opLevel); - - // Attempt to get the shaderc equivalent shader stage - shaderc_shader_kind shaderKind; - switch (type) - { - case SH_SHADER_TYPE::VERTEX: - shaderKind = shaderc_shader_kind::shaderc_glsl_vertex_shader; - break; - case SH_SHADER_TYPE::FRAGMENT: - shaderKind = shaderc_shader_kind::shaderc_glsl_fragment_shader; - break; - case SH_SHADER_TYPE::COMPUTE: - shaderKind = shaderc_shader_kind::shaderc_glsl_compute_shader; - break; - default: - shaderKind = shaderc_shader_kind::shaderc_glsl_vertex_shader; - break; - } - - // Compile the shader and get the result - shaderc::SpvCompilationResult compileResult = compiler.CompileGlslToSpv(glslSource, shaderKind, spirvFilename, options); - - if (compileResult.GetCompilationStatus() != shaderc_compilation_status_success) - { - SHLOG_ERROR("Shaderc failed to compile GLSL shader to binary | " + compileResult.GetErrorMessage()); - } - - return { compileResult.begin(), compileResult.end() }; - } - - /***************************************************************************/ - /*! - - \brief - TODO: Delete after file IO is implemented. Loads a shader from disk. - - \param filePath - file path to the shader in the asset directory. - - \return - Returns the data in the file in string form. - - */ - /***************************************************************************/ - std::string SHShaderSourceLibrary::GetStringFromFile(char const* filePath) noexcept - { - // Retrieve contents from filePath - // Ensure ifstream objects can throw exceptions - std::ifstream iFile; - iFile.exceptions(std::ifstream::failbit | std::ifstream::badbit); - std::string fileContent = ""; - - try - { - // Open file - // Read file's buffer contents into streams - iFile.open(filePath); - std::stringstream fileStream; - fileStream << iFile.rdbuf(); - - fileContent = fileStream.str(); - - // Close file handler - iFile.close(); - } - catch (std::ifstream::failure e) - { - std::cerr << "File was not successfully read" << filePath << std::endl; - } - - return fileContent; - - } - - /***************************************************************************/ - /*! - - \brief - Load a shader into the library. - - \param filePath - file path to the shader in the asset directory. - - */ - /***************************************************************************/ - bool SHShaderSourceLibrary::LoadShader (uint32_t id, std::string glslFile, SH_SHADER_TYPE type, bool checkSpirvOutdated/* = true*/, bool recompileAnyway /*= false*/) noexcept - { - if (path.extension() != ".glsl") - { - SHLOG_ERROR("Shader is not GLSL file, failed to load shader. "); - return false; - } - - std::string spirvFilepath = path.replace_extension("spv").string(); - - SHShaderAsset newShaderData{}; - newShaderData.shaderType = type; - - // spirv file - std::ifstream spirvFile(spirvFilepath, std::ios::ate | std::ios::binary); - - // If we disable spirv validation, file is not checked - if (!recompileAnyway && - spirvFile.is_open() && - (checkSpirvOutdated ? (std::filesystem::last_write_time(spirvFilepath) > std::filesystem::last_write_time(fullGLSLPath)) : true)) - { - // Get file size of binary - uint32_t fileSize = static_cast(spirvFile.tellg()); - - // resize container to store binary - newShaderData.spirvBinary.resize(fileSize / sizeof(uint32_t)); - - // Read data from binary file to container - spirvFile.seekg(0); - spirvFile.read(reinterpret_cast(newShaderData.spirvBinary.data()), fileSize); - - // close file - spirvFile.close(); - - } - else - { - // Use glslc to generate spirv file - newShaderData.spirvBinary = CompileToBinary(GetStringFromFile(fullGLSLPath.c_str()), spirvFilepath.c_str(), type); - - std::ofstream binaryFile(spirvFilepath, std::ios::binary); - - if (binaryFile.is_open()) - { - // write all data to binary file - binaryFile.write(reinterpret_cast(newShaderData.spirvBinary.data()), newShaderData.spirvBinary.size() * sizeof(uint32_t)); - } - else - { - SHLOG_ERROR("Failed to modify spirv file. "); - return false; - } - } - - newShaderData.name = glslFile; - newShaderData.id = id; - - sourceLibrary.emplace_back(std::move(newShaderData)); - return true; - } - - /***************************************************************************/ - /*! - - \brief - Move ctor for shader data. - - \param rhs - The other shader data - - */ - /***************************************************************************/ - SHShaderAsset::SHShaderAsset(SHShaderAsset&& rhs) noexcept - : spirvBinary{ std::move(rhs.spirvBinary) } - , shaderType{ std::move(rhs.shaderType) } - , name{ std::move(rhs.name) } - , id{ std::move(rhs.id) } - { - - } - - /***************************************************************************/ - /*! - - \brief - Default ctor for shader data. Does nothing. - - */ - /***************************************************************************/ - SHShaderAsset::SHShaderAsset(void) noexcept - : spirvBinary{} - , shaderType{ SH_SHADER_TYPE::VERTEX } - , name{ } - , id{ } - - { - - } - - SHShaderAsset::SHShaderAsset(SHShaderAsset const& rhs) noexcept - : spirvBinary{ rhs.spirvBinary } - , shaderType{ rhs.shaderType } - , name{ rhs.name } - , id{ rhs.id } - { - - } - - SHShaderAsset& SHShaderAsset::operator=(SHShaderAsset const& rhs) noexcept - { - if (this == &rhs) - return *this; - - spirvBinary = rhs.spirvBinary; - shaderType = rhs.shaderType; - name = rhs.name; - id = rhs.id; - - - return *this; - } - - SHShaderAsset& SHShaderAsset::operator=(SHShaderAsset&& rhs) noexcept - { - if (this == &rhs) - return *this; - - spirvBinary = std::move(rhs.spirvBinary); - shaderType = std::move (rhs.shaderType); - name = std::move (rhs.name); - id = std::move (rhs.id); - - return *this; - } - -} \ No newline at end of file diff --git a/SHADE_Engine/src/Assets/Libraries/SHShaderSourceLibrary.h b/SHADE_Engine/src/Assets/Libraries/SHShaderSourceLibrary.h deleted file mode 100644 index cb4a3453..00000000 --- a/SHADE_Engine/src/Assets/Libraries/SHShaderSourceLibrary.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef SH_SHADER_SOURCE_LIBRARY_H -#define SH_SHADER_SOURCE_LIBRARY_H - -#include "Graphics/MiddleEnd/Shaders/SHShaderType.h" -#include "shaderc/shaderc.hpp" - -namespace SHADE -{ - class SHShaderSourceLibrary - { - private: - /*-----------------------------------------------------------------------*/ - /* PRIVATE MEMBER FUNCTIONS */ - /*-----------------------------------------------------------------------*/ - std::vector CompileToBinary(std::string const& glslSource, char const* const spirvFilename, SH_SHADER_TYPE type, shaderc_optimization_level opLevel = shaderc_optimization_level_zero); - - // TODO: Delete after file IO is implemented - std::string GetStringFromFile(char const* filePath) noexcept; - - public: - bool LoadShader (uint32_t id, std::string glslFile, SH_SHADER_TYPE type, bool checkSpirvOutdated = true, bool recompileAnyway = false) noexcept; - }; -} - -#endif diff --git a/SHADE_Engine/src/Assets/SHAssetMacros.h b/SHADE_Engine/src/Assets/SHAssetMacros.h index 3b352d4e..1df4e30b 100644 --- a/SHADE_Engine/src/Assets/SHAssetMacros.h +++ b/SHADE_Engine/src/Assets/SHAssetMacros.h @@ -42,19 +42,11 @@ constexpr std::string_view ASSET_META_VER { "1.0" }; // Asset type enum enum class AssetType : AssetTypeMeta { - INVALID = 0, - AUDIO = 1, + INVALID, SHADER, SHADER_BUILT_IN, - MATERIAL, - IMAGE, - TEXTURE, - MESH, - SCRIPT, - SCENE, - PREFAB, - AUDIO_WAV, - DDS, + TEXTURE, + MESH, MAX_COUNT }; constexpr size_t TYPE_COUNT{ static_cast(AssetType::MAX_COUNT) }; @@ -95,14 +87,12 @@ constexpr std::string_view EXTENSIONS[] = { // EXTERNAL EXTENSIONS constexpr std::string_view GLSL_EXTENSION{ ".glsl" }; -constexpr std::string_view IMAGE_EXTENSION{ ".png" }; constexpr std::string_view DDS_EXTENSION{ ".dds" }; constexpr std::string_view FBX_EXTENSION{ ".fbx" }; constexpr std::string_view GLTF_EXTENSION{ ".gltf" }; constexpr std::string_view EXTERNALS[] = { GLSL_EXTENSION, - IMAGE_EXTENSION, DDS_EXTENSION, FBX_EXTENSION, GLTF_EXTENSION diff --git a/SHADE_Engine/src/Assets/SHAssetManager.cpp b/SHADE_Engine/src/Assets/SHAssetManager.cpp index 3cd4c33c..e7a7a1b7 100644 --- a/SHADE_Engine/src/Assets/SHAssetManager.cpp +++ b/SHADE_Engine/src/Assets/SHAssetManager.cpp @@ -18,10 +18,9 @@ #include "Libraries/Loaders/SHTextureLoader.h" #include "Libraries/Loaders/SHShaderSourceLoader.h" - -#include "Libraries/Compilers/SHAssimpLibrary.h" #include "Libraries/Compilers/SHMeshCompiler.h" #include "Libraries/Compilers/SHTextureCompiler.h" +#include "Libraries/Compilers/SHShaderSourceCompiler.h" namespace SHADE { @@ -112,17 +111,10 @@ namespace SHADE switch(type) { - case AssetType::SCENE: - folder = "scenes/"; - break; - - case AssetType::PREFAB: - folder = "prefabs/"; - break; - - case AssetType::MATERIAL: - folder = "materials/"; - break; + case AssetType::SHADER: + case AssetType::SHADER_BUILT_IN: + folder = "Shaders/"; + break; default: folder = "/"; @@ -280,19 +272,55 @@ namespace SHADE return result; } - void SHAssetManager::InitLoaders() noexcept + void SHAssetManager::CompileAll() noexcept + { + std::vector paths; + + for (auto const& dir : std::filesystem::recursive_directory_iterator{ ASSET_ROOT }) + { + if (dir.is_regular_file()) + { + for (auto const& ext : EXTERNALS) + { + if (dir.path().extension().string() == ext.data()) + { + paths.push_back(dir.path()); + } + } + } + } + + for (auto const& path : paths) + { + auto const ext{ path.extension().string() }; + if (ext == GLSL_EXTENSION.data()) + { + SHShaderSourceCompiler::LoadAndCompileShader(path); + } + else if (ext == DDS_EXTENSION.data()) + { + auto image = new SHTextureAsset(); + SHTextureCompiler::LoadImageAsset(path, *image); + } + else if (ext == GLTF_EXTENSION.data() || ext == FBX_EXTENSION.data()) + { + std::vector meshes; + std::vector anims; + SHMeshCompiler::LoadFromFile(path, meshes, anims); + for (auto const& mesh : meshes) + { + SHMeshCompiler::CompileMeshBinary(*mesh, path); + } + } + } + } + + void SHAssetManager::InitLoaders() noexcept { - loaders[static_cast(AssetType::AUDIO)] = nullptr; loaders[static_cast(AssetType::SHADER)] = dynamic_cast(new SHShaderSourceLoader()); loaders[static_cast(AssetType::SHADER_BUILT_IN)] = loaders[static_cast(AssetType::SHADER)]; - loaders[static_cast(AssetType::MATERIAL)] = nullptr; - loaders[static_cast(AssetType::TEXTURE)] = dynamic_cast(new SHTextureLoader()); - loaders[static_cast(AssetType::MESH)] = dynamic_cast(new SHMeshLoader()); - loaders[static_cast(AssetType::SCRIPT)] = nullptr; - loaders[static_cast(AssetType::SCENE)] = nullptr; - loaders[static_cast(AssetType::PREFAB)] = nullptr; - loaders[static_cast(AssetType::AUDIO_WAV)] = nullptr; - loaders[static_cast(AssetType::DDS)] = nullptr; + loaders[static_cast(AssetType::TEXTURE)] = dynamic_cast(new SHTextureLoader()); + loaders[static_cast(AssetType::MESH)] = dynamic_cast(new SHMeshLoader()); } /**************************************************************************** diff --git a/SHADE_Engine/src/Assets/SHAssetManager.h b/SHADE_Engine/src/Assets/SHAssetManager.h index 376467d8..6e5abfd1 100644 --- a/SHADE_Engine/src/Assets/SHAssetManager.h +++ b/SHADE_Engine/src/Assets/SHAssetManager.h @@ -84,20 +84,17 @@ namespace SHADE static std::vector GetAllRecordOfType(AssetType type) noexcept; private: - /**************************************************************************** - * \brief Load resource data into memory - ****************************************************************************/ + + static void InitLoaders() noexcept; static void LoadAllData() noexcept; - static SHAssetData* LoadData(SHAsset const& asset) noexcept; - inline static void BuildAssetCollection() noexcept; static bool IsRecognised(char const*) noexcept; static SHAsset CreateAssetFromPath(AssetPath path) noexcept; - static void InitLoaders() noexcept; + static void CompileAll() noexcept; static FMOD::System* audioSystem; static std::unordered_map* audioSoundList; diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp index 2847f5f3..6c8baa36 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp @@ -118,24 +118,8 @@ namespace SHADE graphicsTexCmdBuffer = graphicsCmdPool->RequestCommandBuffer(SH_CMD_BUFFER_TYPE::PRIMARY); - // TODO: This is VERY temporarily here until a more solid resource management system is implemented - shaderSourceLibrary.Init("../../TempShaderFolder/"); - - shaderSourceLibrary.LoadShader(0, "TestCubeVs.glsl", SH_SHADER_TYPE::VERTEX, true); - shaderSourceLibrary.LoadShader(1, "TestCubeFs.glsl", SH_SHADER_TYPE::FRAGMENT, true); - - shaderSourceLibrary.LoadShader(2, "KirschCs.glsl", SH_SHADER_TYPE::COMPUTE, true); - shaderSourceLibrary.LoadShader(3, "PureCopyCs.glsl", SH_SHADER_TYPE::COMPUTE, true); - - shaderModuleLibrary.ImportFromSourceLibrary(device, shaderSourceLibrary); - auto cubeVS = shaderModuleLibrary.GetShaderModule("TestCubeVs.glsl"); - auto cubeFS = shaderModuleLibrary.GetShaderModule("TestCubeFs.glsl"); - auto greyscale = shaderModuleLibrary.GetShaderModule("KirschCs.glsl"); - auto pureCopy = shaderModuleLibrary.GetShaderModule("PureCopyCs.glsl"); - cubeVS->Reflect(); - cubeFS->Reflect(); - greyscale->Reflect(); - pureCopy->Reflect(); + shaderModuleLibrary.ImportAllShaderSource(device); + shaderModuleLibrary.ReflectAllShaderModules(); } void SHGraphicsSystem::InitSceneRenderGraph(void) noexcept diff --git a/TempShaderFolder/KirschCs.spv b/TempShaderFolder/KirschCs.spv deleted file mode 100644 index 1ae5408b12013ad40918e0477191c76630795dbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5900 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 X9SA&+p7_3yst)~9m-s(*^G^5=Amdbt diff --git a/TempShaderFolder/ShaderDescriptorDefinitions.glsl b/TempShaderFolder/ShaderDescriptorDefinitions.glsl deleted file mode 100644 index c70a9f5b..00000000 --- a/TempShaderFolder/ShaderDescriptorDefinitions.glsl +++ /dev/null @@ -1,11 +0,0 @@ -#define SET_STATIC_GLOBALS 0 -#define SET_DYNAMIC_GLOBALS 1 -#define SET_HIGH_FREQUENCY_GLOBALS 2 - -#define BINDING_GENERIC_DATA 0 -#define BINDING_IMAGE_AND_SAMPLERS_DATA 1 -#define BINDING_LIGHTS_DATA 0 -#define BINDING_CAMERA_DATA 0 -#define BINDING_BATCHED_PER_INST_DATA 0 - - diff --git a/TempShaderFolder/TestCubeFs.spv b/TempShaderFolder/TestCubeFs.spv deleted file mode 100644 index 9955abe53ff6b413215a81ed14c71a2cae54e69d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2300 zcmZ9MT~icC6oy;(LjoE#MlljMi#_+KBF{BO_S zh)zk0kv}xGA_1|_ zDoR}(+K*j|;RDeX(buAfqK@dC?%<;$CDl}sG5;t)UEbYZ)cNUgG`6ESi*p-|_u_%g zqT%zGwx5sR^^r-XMM<3QPU2k~tt>B%;{GeenIaCYq{DQQx);N2KYBfh6ZgW|O!jH) z-Dl6bz0IgU8b#y$D6vuEQX36ircCa@lBUh8JDlWChRHBf zTS6L|kukYF%qN*u2PJl1{ArwTXT#A(oX47OL%S(Y-(PNOLSW3+-``>%cm;oE7bl~= zxPq~f=T<>=8j5j2T)AxK;)H}Y%N>;v0~=>R5jymAQQX%iy=E?B(4n3n@B4V6pr-C& zqgLw%$G+5;xZS8d|4?%~fqsIRJ19|vD%Ne}oU(;IbQ1V~;B4SY+yCN64Tawr< zb>Rn&ogC~4TT3##Kqnu2E$2|?LuWr=H+;TJk~!p`6>p>Hw6tr!5psc-wz_6e)`yKA z(Agt3lXK3?+zUCvez1Qgocv|4_2R8bEoMZ|Ur44md|J}^mgpIr`(KHZ3!MDu{J#$Q zzwvVL=iL&E7@?k3j}dRp%j87=PMmquFY(cNV_?`HiIb~p?|A!~W=1aF5{Eng3TcRU z^vi5M6)`X7{!pIG;i?F{qbiwCTg0C5!N&Z8@4V!;Xvg2ZCK-(Q3*vk?;eP~oczb+5 z;P^0~8zN>F;xen79{*K7%<7hid*Gq=Mal2iep?tgwKMBGqEI`w&?hmMy*Gb7JQ|h`{mZU7!d5$CB|6HRAt71de~l>;LHmt&83QTD-=O diff --git a/TempShaderFolder/TestCubeVs.spv b/TempShaderFolder/TestCubeVs.spv deleted file mode 100644 index 731e31d107fda1e44cdbef3c2445017205b6b841..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2492 zcmZ9MX-^bE5QbY=78Su;@j?)96fab~56}f&MdR^x)7c$yl3{i;JD~W#cgLy1J`o2M4Byo!jAdyHWSn6>Gm6kj1$XR}Xum`Jp-6&pWeox39w( zbAy2hXRm&&nqk-K@$!W=~iU_!5oP&8H|b`< zUJG{av%cXRG2CHgJr6o}@t-~i{g8B4-3>d_*L)sju}_xMPV_zaYQaaoDDG@=xoZ-y ze$AVHGs+4!_3}!voHF&y4(HEAuU{oJSR$kNI;6y7pU^Jq277Jcqzsk%Bp%(bm7VJv)A^xG4E$)PmI^|nP;@)Ch)UXvt=kcv4$(E1z zqQ5L^WJnhLT9o-vVyGnyj_f@vM0&mCQp-l~jnB0c&qK5;@!XNw`PR*n&d1EB{V&~Y zt>7|GzPPsTh^-dp%fA)HCm|oR=0Ey$HA*?cHN>I6696qRJqA+?n4W-n3ovs`%uI=y zY5Y4SOFD&jW5HpWjeOYH%|=dayrtRDu`#<1d8`lk?d_)JV=ak=jhsUP7aTC0ecNpM zz=Msv#MzyA=QG>zlrW1s^XA;KsHqmdT`&uOQ+xG|cxNzoIjB=OXG#c+eneVb`=sQk z;;9QvelTwdhC3n5w+aXQr0{O-mT=rL(AETs!BH2R@kDvKmfECl)_% za!NaA@g~IczHqS<4`vpzabC4%_*13N>OCt=ez4VdUOM?L{(^M!omBjcc6x$sLfRGW z);D|z=UmlJUi{Pr=05@3xbQXY#L;Vd%N&BS6MsWHHDD(m%zWCtZPyPqm@nMG#=D!0Q_lEme;@r`X8m%W+XUIW9;n$0h05Eyrc)f`s$oa0mMSLc;9YTZ7?QZ7-!)YikH&V_6+b(y>)*TP|(Y+Fr> Date: Thu, 27 Oct 2022 02:28:38 +0800 Subject: [PATCH 31/92] Lighting shader kind of done (still has bugs) --- .../MiddleEnd/Interface/SHGraphicsSystem.cpp | 3 +- .../MiddleEnd/Lights/SHLightingSubSystem.cpp | 12 +++-- .../MiddleEnd/Lights/SHLightingSubSystem.h | 2 +- .../RenderGraph/SHRenderGraphNodeCompute.cpp | 1 - TempShaderFolder/DeferredCompositeCs.glsl | 47 +++++++++++++++--- TempShaderFolder/DeferredCompositeCs.spv | Bin 1716 -> 3384 bytes TempShaderFolder/TestCubeFs.glsl | 2 +- TempShaderFolder/TestCubeVs.glsl | 2 +- TempShaderFolder/TestCubeVs.spv | Bin 2684 -> 3036 bytes 9 files changed, 54 insertions(+), 15 deletions(-) diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp index dfa4e41e..58a86bcd 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp @@ -219,7 +219,7 @@ namespace SHADE // deferred composite auto deferredCompositeShader = shaderModuleLibrary.GetShaderModule("DeferredCompositeCs.glsl"); - gBufferNode->AddNodeCompute(deferredCompositeShader, { "Albedo", "Scene" }); + gBufferNode->AddNodeCompute(deferredCompositeShader, { "Position", "Normals", "Albedo", "Scene" }); auto dummyNode = worldRenderGraph->AddNode("Dummy Pass", { "Scene" }, {"G-Buffer"}); // no predecessors @@ -403,6 +403,7 @@ namespace SHADE // Force set the pipeline layout currentCmdBuffer->ForceSetPipelineLayout(SHGraphicsGlobalData::GetDummyPipelineLayout(), SH_PIPELINE_TYPE::GRAPHICS); + currentCmdBuffer->ForceSetPipelineLayout(SHGraphicsGlobalData::GetDummyPipelineLayout(), SH_PIPELINE_TYPE::COMPUTE); // Bind all the buffers required for meshes for (auto& [buffer, bindingPoint] : MESH_DATA) diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.cpp index a22fb662..6e8dd916 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.cpp @@ -319,11 +319,12 @@ namespace SHADE { dynamicOffsets[i][0] = i * lightCountsAlignedSize; // Even if the first binding is a count, we want to account for that too - for (uint32_t j = 1; j < static_cast(dynamicOffsets.size()); ++j) + for (uint32_t j = 0; j < static_cast(SH_LIGHT_TYPE::NUM_TYPES); ++j) { auto const& typeData = perTypeData[j]; { - dynamicOffsets[i][j] = j * typeData.GetAlignmentSize(); + // +1 because 1st reserved for count + dynamicOffsets[i][j + 1] = i * typeData.GetAlignmentSize(); } } } @@ -376,6 +377,7 @@ namespace SHADE { dynamicOffsets[i].resize(NUM_LIGHT_TYPES + 1); // +1 for the count } + } /***************************************************************************/ @@ -425,7 +427,7 @@ namespace SHADE data.WriteToGPU(frameIndex); } - lightCountsBuffer->WriteToMemory(lightCountsData.data(), lightCountsData.size() * sizeof (uint32_t), 0, lightCountsAlignedSize * frameIndex); + lightCountsBuffer->WriteToMemory(lightCountsData.data(), static_cast(lightCountsData.size()) * sizeof (uint32_t), 0, lightCountsAlignedSize * frameIndex); // If any of the buffers got expanded, the descriptor set is invalid because the expanded buffer // is a new buffer. If some expansion was detected, update descriptor sets. @@ -442,8 +444,10 @@ namespace SHADE // so we do it anyway. #NoteToSelf: if at any point it affects performance, do a check before computing. ComputeDynamicOffsets(); + //cmdBuffer->ForceSetPipelineLayout() + // Bind descriptor set (We bind at an offset because the buffer holds NUM_FRAME_BUFFERS sets of data). - cmdBuffer->BindDescriptorSet(lightingDataDescSet, SH_PIPELINE_TYPE::GRAPHICS, SHGraphicsConstants::DescriptorSetIndex::DYNAMIC_GLOBALS, {dynamicOffsets[frameIndex]}); + cmdBuffer->BindDescriptorSet(lightingDataDescSet, SH_PIPELINE_TYPE::COMPUTE, SHGraphicsConstants::DescriptorSetIndex::DYNAMIC_GLOBALS, {dynamicOffsets[frameIndex]}); } diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.h b/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.h index 6c974730..efc6ddf6 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.h @@ -31,7 +31,7 @@ namespace SHADE uint32_t cullingMask; //! Diffuse color emitted by the light - SHVec4 diffuseColor; + alignas (16) SHVec4 diffuseColor; }; diff --git a/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraphNodeCompute.cpp b/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraphNodeCompute.cpp index a5208fcf..678fc41b 100644 --- a/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraphNodeCompute.cpp +++ b/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraphNodeCompute.cpp @@ -53,7 +53,6 @@ namespace SHADE descSetGroups[i] = graphStorage->descriptorPool->Allocate(layouts, variableCounts); } - HandleResize(); } diff --git a/TempShaderFolder/DeferredCompositeCs.glsl b/TempShaderFolder/DeferredCompositeCs.glsl index 354a8954..c5e543db 100644 --- a/TempShaderFolder/DeferredCompositeCs.glsl +++ b/TempShaderFolder/DeferredCompositeCs.glsl @@ -9,22 +9,57 @@ struct DirectionalLightStruct }; layout(local_size_x = 16, local_size_y = 16) in; -layout(set = 4, binding = 0, rgba8) uniform image2D inputImage; -layout(set = 4, binding = 1, rgba8) uniform image2D targetImage; +layout(set = 4, binding = 0, rgba8) uniform image2D positions; +layout(set = 4, binding = 1, rgba8) uniform image2D normals; +layout(set = 4, binding = 2, rgba8) uniform image2D albedo; +layout(set = 4, binding = 3, rgba8) uniform image2D targetImage; -layout(set = 1, binding = 0) buffer DirectionalLightData +layout(set = 1, binding = 0) uniform LightCounts +{ + uint directionalLights; + uint pointLights; + uint spotLights; + +} lightCounts; + +layout(std430, set = 1, binding = 1) buffer DirectionalLightData { DirectionalLightStruct dLightData[]; } DirLightData; void main() -{ +{ // convenient variables ivec2 globalThread = ivec2(gl_GlobalInvocationID); - vec3 color = imageLoad (inputImage, globalThread).rgb; + // Get the diffuse color of the pixel + vec3 pixelDiffuse = imageLoad (albedo, globalThread).rgb; + + // Get position of fragment in world space + vec3 positionWorld = imageLoad (positions, globalThread).rgb; + + // normal of fragment + vec3 normalWorld = imageLoad(normals, globalThread).rgb; + normalWorld = normalize (normalWorld); + + vec3 fragColor = vec3 (0.0f); + + for (int i = 0; i < lightCounts.directionalLights; ++i) + { + // get normalized direction of light + vec3 dLightNormalized = vec3 (0.0f, 0.0f, 1.0f); + //vec3 dLightNormalized = normalize (DirLightData.dLightData[i].direction); + + // Get diffuse strength + float diffuseStrength = max (0, dot (dLightNormalized, normalWorld)); + + //fragColor += vec3 (1.0f) * diffuseStrength.rrr * pixelDiffuse; + fragColor += DirLightData.dLightData[i].diffuseColor.rgb * diffuseStrength.rrr * pixelDiffuse; + //fragColor += vec3 (dLightNormalized.rgb); + } // store result into result image - imageStore(targetImage, ivec2(gl_GlobalInvocationID.xy), vec4(color, 1.0f)); + //imageStore(targetImage, ivec2(gl_GlobalInvocationID.xy), vec4(fragColor, 1.0f)); + imageStore(targetImage, ivec2(gl_GlobalInvocationID.xy), vec4(normalWorld, 1.0f)); } \ No newline at end of file diff --git a/TempShaderFolder/DeferredCompositeCs.spv b/TempShaderFolder/DeferredCompositeCs.spv index 679dc135f5f556eb95565c51c1c9f1c2aca8821a..ffd0343f71e1704bba6f534f17d842cba15ac6cf 100644 GIT binary patch literal 3384 zcmZ9O`*Ku85XL8$O#(>>2qAbOZio^UjHuicxx_3k(S-zp;(a;UJ=q*NIcID4gi^~t z@DJa>2k{wvC`zre%I|k}I!@Fk2i{s7>xx;SSZ5l7re8A!~GVk(lO!fupgIHrZ8;^B^!IyP0Dc8(~!bAQShRn>Z< zSzlkTH*Pmu-EOmA{FKJcG|A#-JL$!(B6%7UHxa}oSu5RZhXEBug!L<`eMmJrX}%Su z4|jTT)Rw6}C(7PBX|rCs*0QI0D=LyaTdS4+F*hgKO@55iTC%;p*H?A+jk=d4qjW27 z>ypS{mEFzz37a3~y_5nK{aXn5zUR(LW_fQnN(YhTTiWOP<-TRv+r6l>nx}cM+&ALh zlT1pz;;unzlxM;<#McJn+wVyMd#z&77k<`$ z-_q#|o_>@5il6-dJpH!zQaz2%-KhUW(c@)2FVXj4S6B9MPyE3iYEco1E^Fau4bC?3 zFxL%n+E<>~;+ZQOi>TL$i?!XT6YK1wqgAIzCL?4vF=by)1T`Gj?BHgHoxoYmp; zZF@(g6IT_;e^+u$;LC#;yL-z|e{k$0o*9JwVbh=W8+pIoGd6zPpGjvfFAB$XYI^^$OV7R+k6jN{u$}yC;p`V zo{+2xMUB&v)F9sc3({F;FAYq0 zPEo|Zw&vCt=r~Z;+vPw`@?4cx+J~8(H}N% z5YEo{K)TIq)BDJ4{-*RH!R|Ja&SDlVNqVt-=&5j2U_bV*z<$ojo8nCq1Mpqe-Lju~ zvgqY6G5i)&llRMSAoqaHo8q@Ew5tc~vj^sr%du(uw2j8;Yaeae-KTH*`|Y1xFp;`^y4v9h-Q*kBQmRer7T+ z5Cgxio8c|ID!>C4^|(*+b5Hm!{~75E-X{N|5axePHZky)|8?o`fEDJi%EoW`-;loK zZSubv;igO1F;vwm>|e9ekV_KRh~fzu&N+WqUcMVX6^MbK(#wJSOyF*~Z@yQE zA$MI8pPlQzbk4P+eVdXGg$;po;Cmnt%lrFWz;Cnr!gKH}n;r4=@JOKEhM(7$o`VO! zssCBYuLN@8w=;e%eNM2LZ=@3kZ!zCWXU4z!Jl{!&Bi7~*$4swCa>q#aGt=({&i+jM zu^$U?O@aOR9t+`{VOH!vCAlR;-ky|f3w%$k>n>Z8vFG4f+z;=E&&IZZ-_FvJ&P@4E s;qG<>IF@mVbU5-D_k-t#B{!6rIXw~BPdxsb&{AFcr7r$|mF24NAM&9b*#H0l delta 778 zcmYjP%Sr=55bS*<@wK3+1S6XD{fdbi4}wT8N(?9}=*iQPgmp0{5;r#?{(z_X5>dg6 z|KQbwpCVYbnUzc^db+Bor+Ts`?jP-q}pn<+K37KGKfL* zz7tmNJip%KTyUY+_UoEV$bb~om6@F?K;fzd?Rqr~T21Ve_!ZQ%nT}KwOtsT!1Wo_c zd$@&`g8FGr8{6s|9kzKKt9BCjH{qcddb~3!MKxxPt34~%rCJtST*P_6?#t(}H*}sy z90sOEq~<+-M(X^*D8H4_3CYPXdhW6T6Okm&J-Wo}t$wBE81m znA5Ag{@7Wg>vD^gMk&jN09x2UK7qIbh&+{;Q_BIg7U!GTvvm%pI5J0P4MA-dJjb5| zc%GPvU~z;h$U69Q&Z|C@NgnB(0vKHRsv@*nkJ9^Zly0 Oh=zGF^PpcWd0L&ED1CCW3$Y z74#$dsr<((pWp0uxMEUW-Tm~_Gd(@MSEra>Y93W`#I+%+-T#wYS?V zlYF>xUPP$4U!g*PLtg2+s$0_zv$qC6B$wkQ}$p@0pBpZ^RWGJcVZ&vyrZB$iO ztKDyPI<5BI{$M=rPx5C;)KB6x>JQ^A8szbT3aq*#Q@l7GB>Tf@LQRb6T53Auh|XZu z-Q1zQ=kq9weX^Afqo*Op&UC`LC>|bisV|9lf6LqcS(FuQ&ft!n{rs|&t7%{EyPNd4 z(n;>qL1f!1RttTI(>&UZvUQ((Ar-eoqE=m=*#}XUcSjRp)qqjU{=st&wWOnL&nKK& z3B6Sfvg@J8zmKwH*vou6`Bf}9wa|CJqm84dY#s7=2mfeCb~U_*e^6}7KHn&&dvv3$ zNRlhGz_E#qCUG8*QlWE!Pn`kRCAZ^0!WdbMniX41;_-T1^yV;+DI&I?B!@BX#eA@+ z|B>{X--|LIS{G^oV~wp4+4K>dS`NndeJ)M@x6*^Dd@yFu_k6k=rO;ffe9r~h)P&D_ z9+NDW{uycF%m{Jj8lQ#FjN>zV_{{rsoSx%TA920|eEPGgn&>-=Gg*eg2SXc14j8o> zh7DGnUkUr!-qx=r#aWwTS+8orf8IMdue^Zi2O?lCok$-0atC_5_=4Y*&mvBrxg)im zRu*|pdHC38#i>g-B-{_5v+!99>I?mb175_c?j_mmLF|Td@cACWmdib@j}7_9g|k2V zz{lr(!HDwy0>L>9x>|0XMVxX%YR22E_+h% zyV5ffaQOJlHyCHWFWr!k4}V#j7&v@<<{ymvG^AG~&i#2C{uNo|HYNDiq~TIC`S^S< zV8lO{hEJS&Z%K0&n4PyF+xS~$tRZdvd?1@1T~Pi*=|-^WS@GM}EHPq5yy~`Pa|Yig z=iv8BY(YNX0(ta_I(MWw0~|g+-v}7-$E9t3rB6f2jO3c$4jym7;@p3Q@O|DCT9-a4 zVQyE2GP8WA%ssPyOBwiZh|f!(lQ5UeB6~1z=Oy59n8Vj4?7_UV2Rw6OB2cLKQP{MpXR1FR3k0f9$!}v!7jNTabNr};?u5Qzm zzAPahK5^#kFYQb0Qwe9op;qSZs)X6Mp5eozwngdd5@ruRbN7V=zV!zmj@|8sZ0>ek zFT`EHlu$E!5$lybxG9?$ccHf15-?Urzhv~~jszTGu@85(oK@N6fLqR2vcVA+vFV&O z`Q(6E&bn-Hgk?Eh-GOiGuH=q{z2VxswPbHd=r8qdO5lR8Dwpr>YYF{g7MMF~Z%E&h zz-KWd@W3puE!*;#HOsp%n>=bH4<4B1b!1x}-?-&c>n37>yrNgtsCHs delta 934 zcmZ8fO-lk%6ut8tlZt`FAj%Leis)3rYB^0SD9J(gA06accp`#}x6kq+r(p)>F^? zJdi=(1#LwpVB Date: Thu, 27 Oct 2022 02:46:38 +0800 Subject: [PATCH 32/92] Working abit more now. Error with device extension thingy. --- .../MiddleEnd/Interface/SHGraphicsSystem.cpp | 4 ++-- TempShaderFolder/DeferredCompositeCs.glsl | 6 +++--- TempShaderFolder/DeferredCompositeCs.spv | Bin 3384 -> 3332 bytes TempShaderFolder/TestCubeVs.glsl | 3 ++- TempShaderFolder/TestCubeVs.spv | Bin 3036 -> 3296 bytes 5 files changed, 7 insertions(+), 6 deletions(-) diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp index 58a86bcd..df884f57 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp @@ -181,8 +181,8 @@ namespace SHADE // Initialize world render graph worldRenderGraph->Init(device, swapchain); - worldRenderGraph->AddResource("Position", { SH_ATT_DESC_TYPE_FLAGS::COLOR, SH_ATT_DESC_TYPE_FLAGS::INPUT, SH_ATT_DESC_TYPE_FLAGS::STORAGE }, windowDims.first, windowDims.second); - worldRenderGraph->AddResource("Normals", { SH_ATT_DESC_TYPE_FLAGS::COLOR, SH_ATT_DESC_TYPE_FLAGS::INPUT, SH_ATT_DESC_TYPE_FLAGS::STORAGE }, windowDims.first, windowDims.second); + worldRenderGraph->AddResource("Position", { SH_ATT_DESC_TYPE_FLAGS::COLOR, SH_ATT_DESC_TYPE_FLAGS::INPUT, SH_ATT_DESC_TYPE_FLAGS::STORAGE }, windowDims.first, windowDims.second, vk::Format::eR32G32B32A32Sfloat); + worldRenderGraph->AddResource("Normals", { SH_ATT_DESC_TYPE_FLAGS::COLOR, SH_ATT_DESC_TYPE_FLAGS::INPUT, SH_ATT_DESC_TYPE_FLAGS::STORAGE }, windowDims.first, windowDims.second, vk::Format::eR32G32B32A32Sfloat); worldRenderGraph->AddResource("Albedo", { SH_ATT_DESC_TYPE_FLAGS::COLOR, SH_ATT_DESC_TYPE_FLAGS::INPUT, SH_ATT_DESC_TYPE_FLAGS::STORAGE }, windowDims.first, windowDims.second); worldRenderGraph->AddResource("Depth Buffer", { SH_ATT_DESC_TYPE_FLAGS::DEPTH_STENCIL }, windowDims.first, windowDims.second, vk::Format::eD32SfloatS8Uint); worldRenderGraph->AddResource("Entity ID", { SH_ATT_DESC_TYPE_FLAGS::COLOR }, windowDims.first, windowDims.second, vk::Format::eR32Uint, 1, vk::ImageUsageFlagBits::eTransferSrc); diff --git a/TempShaderFolder/DeferredCompositeCs.glsl b/TempShaderFolder/DeferredCompositeCs.glsl index c5e543db..c0e42cea 100644 --- a/TempShaderFolder/DeferredCompositeCs.glsl +++ b/TempShaderFolder/DeferredCompositeCs.glsl @@ -40,7 +40,7 @@ void main() // normal of fragment vec3 normalWorld = imageLoad(normals, globalThread).rgb; - normalWorld = normalize (normalWorld); + //normalWorld = normalize (normalWorld); vec3 fragColor = vec3 (0.0f); @@ -59,7 +59,7 @@ void main() } // store result into result image - //imageStore(targetImage, ivec2(gl_GlobalInvocationID.xy), vec4(fragColor, 1.0f)); - imageStore(targetImage, ivec2(gl_GlobalInvocationID.xy), vec4(normalWorld, 1.0f)); + imageStore(targetImage, ivec2(gl_GlobalInvocationID.xy), vec4(fragColor, 1.0f)); + //imageStore(targetImage, ivec2(gl_GlobalInvocationID.xy), vec4(normalWorld, 1.0f)); } \ No newline at end of file diff --git a/TempShaderFolder/DeferredCompositeCs.spv b/TempShaderFolder/DeferredCompositeCs.spv index ffd0343f71e1704bba6f534f17d842cba15ac6cf..a87b7548fb45981226d5a85fa1e4c3f4cf88dbd4 100644 GIT binary patch literal 3332 zcmZ9OZF5sq5XVoOCM|`6$fFO`lqyxJ^{GV^0Yi(S7-(uyd=9tCZF=Q4Hi7a* z_znCZeg;33qs}-sy3c-Tm*L-95W|Q%mFXlg^E~X*c8c+~}Ni<3gM}>MEYs z8(WQ~VcuC_TBX&1GKkxG@+8J@s^FLO+Ub6$=unnNF@IUPk0?hs&9ucU#ap%PQ$q#Y5mh9~850#yJ6YhEODBX@b z8G6N4rT4R8!sUnAASFRr|IHQfVZbhl_p-rWl#V=!w{UqV(|A#X+hafhDwv!s^?i{Z>**v}01HCz*x z7IKu`q^k+*_`CQ03zDDW(94RujcwGXt$Yyoy7{i+Ou4(l*GA(zs7Vg{?R-=hcFsZF zlBo-vdXr%-O#XkIdfWS{R-=0_8a|fyr1xhNLk-qCUqeIq;TqPWJQD14VdsqAHnK3+ z`@(e3zu5elYfE?@4Z3l@z87_4SJw>L^P{2{Md<9vMbSh-pOZ}O*pZ8NbclnUohaJT zv5$%Fs0QZAnIEwO3_BQk&5xX5Q=+=QIqq5=%$YpgBQH96INZ1S6!X|@z>XFCEDzte z-7QJRuPP$`C*l=ZkV4}|TCddq$0 z$)T3Ngz&eRoa`@u1L*@gJH_9&qFz0uUpk~O7Ify!_glPQE9mr`zX#Z_D<3r<7tM%% zmd^h3KCn$y$)4E%8%R9Bo|TLrZ*R(vc&9}8V!NT2@-8s)u@V+~QxB3=VOM@tGrb-ogy|ZjqTE-{#+X={w@=3;a*@ZCQLp#KC?= z96Ovknb&(FVldBX@v8x=sn2|~*F}8C>2qAbOZio^UjHuicxx_3k(S-zp;(a;UJ=q*NIcID4gi^~t z@DJa>2k{wvC`zre%I|k}I!@Fk2i{s7>xx;SSZ5l7re8A!~GVk(lO!fupgIHrZ8;^B^!IyP0Dc8(~!bAQShRn>Z< zSzlkTH*Pmu-EOmA{FKJcG|A#-JL$!(B6%7UHxa}oSu5RZhXEBug!L<`eMmJrX}%Su z4|jTT)Rw6}C(7PBX|rCs*0QI0D=LyaTdS4+F*hgKO@55iTC%;p*H?A+jk=d4qjW27 z>ypS{mEFzz37a3~y_5nK{aXn5zUR(LW_fQnN(YhTTiWOP<-TRv+r6l>nx}cM+&ALh zlT1pz;;unzlxM;<#McJn+wVyMd#z&77k<`$ z-_q#|o_>@5il6-dJpH!zQaz2%-KhUW(c@)2FVXj4S6B9MPyE3iYEco1E^Fau4bC?3 zFxL%n+E<>~;+ZQOi>TL$i?!XT6YK1wqgAIzCL?4vF=by)1T`Gj?BHgHoxoYmp; zZF@(g6IT_;e^+u$;LC#;yL-z|e{k$0o*9JwVbh=W8+pIoGd6zPpGjvfFAB$XYI^^$OV7R+k6jN{u$}yC;p`V zo{+2xMUB&v)F9sc3({F;FAYq0 zPEo|Zw&vCt=r~Z;+vPw`@?4cx+J~8(H}N% z5YEo{K)TIq)BDJ4{-*RH!R|Ja&SDlVNqVt-=&5j2U_bV*z<$ojo8nCq1Mpqe-Lju~ zvgqY6G5i)&llRMSAoqaHo8q@Ew5tc~vj^sr%du(uw2j8;Yaeae-KTH*`|Y1xFp;`^y4v9h-Q*kBQmRer7T+ z5Cgxio8c|ID!>C4^|(*+b5Hm!{~75E-X{N|5axePHZky)|8?o`fEDJi%EoW`-;loK zZSubv;igO1F;vwm>|e9ekV_KRh~fzu&N+WqUcMVX6^MbK(#wJSOyF*~Z@yQE zA$MI8pPlQzbk4P+eVdXGg$;po;Cmnt%lrFWz;Cnr!gKH}n;r4=@JOKEhM(7$o`VO! zssCBYuLN@8w=;e%eNM2LZ=@3kZ!zCWXU4z!Jl{!&Bi7~*$4swCa>q#aGt=({&i+jM zu^$U?O@aOR9t+`{VOH!vCAlR;-ky|f3w%$k>n>Z8vFG4f+z;=E&&IZZ-_FvJ&P@4E s;qG<>IF@mVbU5-D_k-t#B{!6rIXw~BPdxsb&{AFcr7r$|mF24NAM&9b*#H0l diff --git a/TempShaderFolder/TestCubeVs.glsl b/TempShaderFolder/TestCubeVs.glsl index dc8f0b98..49f107dd 100644 --- a/TempShaderFolder/TestCubeVs.glsl +++ b/TempShaderFolder/TestCubeVs.glsl @@ -44,6 +44,7 @@ void main() Out.vertPos = worldTransform * vec4(aVertexPos, 1.0f); Out.uv = aUV; - Out.normal.rgb = mat3 (transpose (inverse (worldTransform))) * aNormal.rgb; + Out.normal.rgb = mat3(transpose(inverse(worldTransform))) * aNormal.rgb; + Out.normal.rgb = normalize (Out.normal.rgb); gl_Position = cameraData.vpMat * worldTransform * vec4 (aVertexPos, 1.0f); } \ No newline at end of file diff --git a/TempShaderFolder/TestCubeVs.spv b/TempShaderFolder/TestCubeVs.spv index 0dfd6cf270dcc59b66eab56b32b571b5f96caa4c..d8c3c3d072f76728073803b4f4baa5c981426184 100644 GIT binary patch delta 966 zcmZ9L&rVZO5XR@8{v*X2Nf!;2kSfvm4_7Ws3?y9`a6zOhYPGdq|4^%VO9CNb)$j;- z7OZ&$!V~x&F7zQ>n)v@quQ|a+RT#E zgX1Xb`5D)k?J35F+k=hq?r3i`PONMd>-n~8O4Coj4_vcGC05dB;7?qAX^;`N6ABfV z$;wB<{?2;5Cr?G}f4X{<_+QT72+y2W4qH?W@iwuE_MLHjcs zvX($D%NMP$GkcJ~uX1AU6mB7(nYwF2OYs|dW??4u#IXQJ{%v-?m=++oB_cUHtn3!z zyE=A+t3p#)R+`?A1^7ocWjE!Y93T#Dt zY|6t0)pMQ01l&$XZ>uH$LI|CyLkAb?y8c_WF?pG*m!oLzTAK$%x=r)vqeCTMY>5g^j4ARFMtfsdv&EAhV;U zKUBhS^{3LC;WHPZF^bU1v49gR~de2#NDi*pN@QA1u6S@}a`K{9A?XLW0$MrD)^unJ`G{@jf=2cQ<{mYm|u_n>}= zcGkR8a+&$g>{|yM)aS_Dg*(yDnmduBei59P{017fLAbN$Sl=8`y9DTu14ocK_X;2% z*4H?1057;l>NfyA Date: Thu, 27 Oct 2022 03:14:46 +0800 Subject: [PATCH 33/92] Colliders now use relative sizes --- SHADE_Application/src/Scenes/SBTestScene.cpp | 6 +- .../Inspector/SHEditorComponentView.hpp | 35 ++++-- SHADE_Engine/src/Math/Geometry/SHShape.cpp | 3 +- SHADE_Engine/src/Math/Geometry/SHShape.h | 4 +- .../Components/SHColliderComponent.cpp | 21 ++-- .../Physics/Components/SHColliderComponent.h | 3 +- SHADE_Engine/src/Physics/SHCollider.cpp | 85 ++++++++++--- SHADE_Engine/src/Physics/SHCollider.h | 55 +++++---- .../src/Physics/SHPhysicsMaterial.cpp | 104 ++++++++++++++++ SHADE_Engine/src/Physics/SHPhysicsMaterial.h | 113 ++++++++++++++++++ SHADE_Engine/src/Physics/SHPhysicsObject.cpp | 6 +- SHADE_Engine/src/Physics/SHPhysicsSystem.cpp | 6 +- SHADE_Engine/src/Scene/SHSceneGraph.cpp | 10 +- SHADE_Engine/src/Scene/SHSceneGraph.h | 2 +- 14 files changed, 369 insertions(+), 84 deletions(-) create mode 100644 SHADE_Engine/src/Physics/SHPhysicsMaterial.cpp create mode 100644 SHADE_Engine/src/Physics/SHPhysicsMaterial.h diff --git a/SHADE_Application/src/Scenes/SBTestScene.cpp b/SHADE_Application/src/Scenes/SBTestScene.cpp index a06e68c2..d0d64c73 100644 --- a/SHADE_Application/src/Scenes/SBTestScene.cpp +++ b/SHADE_Application/src/Scenes/SBTestScene.cpp @@ -95,11 +95,7 @@ namespace Sandbox transform.SetWorldRotation(SHMath::GenerateRandomNumber(0.0f, 360.0f), SHMath::GenerateRandomNumber(0.0f, 360.0f), SHMath::GenerateRandomNumber(0.0f, 360.0f)); transform.SetWorldScale(TEST_OBJ_SCALE); - //if (const bool IS_EVEN = (y * NUM_ROWS + x) % 2; IS_EVEN) - collider.AddBoundingBox(SHVec3::One * 0.5f, SHVec3::Zero); - //else - // collider.AddBoundingSphere(0.5f, SHVec3::Zero); - + collider.AddBoundingBox(SHVec3::One, SHVec3::Zero); stressTestObjects.emplace_back(entity); } diff --git a/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorComponentView.hpp b/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorComponentView.hpp index 7fa39d74..4645bf52 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorComponentView.hpp +++ b/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorComponentView.hpp @@ -207,6 +207,10 @@ namespace SHADE { if (!component) return; + + // Get transform component for extrapolating relative sizes + auto* transformComponent = SHComponentManager::GetComponent(component->GetEID()); + const auto componentType = rttr::type::get(*component); SHEditorWidgets::CheckBox("##IsActive", [component]() {return component->isActive; }, [component](bool const& active) {component->isActive = active; }); ImGui::SameLine(); @@ -221,28 +225,41 @@ namespace SHADE for (int i{}; i < size; ++i) { ImGui::PushID(i); - SHCollider& collider = component->GetCollider(i); + SHCollider* collider = &component->GetCollider(i); auto cursorPos = ImGui::GetCursorPos(); - if (collider.GetType() == SHCollider::Type::BOX) + if (collider->GetType() == SHCollider::Type::BOX) { SHEditorWidgets::BeginPanel( std::format("{} Box Collider #{}", ICON_FA_CUBE, i).data(), { ImGui::GetContentRegionAvail().x, ImGui::GetContentRegionAvail().y }); - auto box = reinterpret_cast(collider.GetShape()); - SHEditorWidgets::DragVec3("Half Extents", { "X", "Y", "Z" }, [box] {return box->GetHalfExtents(); }, [box](SHVec3 const& vec) {box->SetHalfExtents(vec);}); + auto box = reinterpret_cast(collider->GetShape()); + SHEditorWidgets::DragVec3 + ( + "Half Extents", { "X", "Y", "Z" }, + [box, transformComponent] { return (transformComponent->GetWorldScale() * 2.0f) * box->GetHalfExtents(); }, + [collider](SHVec3 const& vec) { collider->SetBoundingBox(vec); }); } - else if (collider.GetType() == SHCollider::Type::SPHERE) + else if (collider->GetType() == SHCollider::Type::SPHERE) { SHEditorWidgets::BeginPanel(std::format("{} Sphere Collider #{}", ICON_MD_CIRCLE, i).data(), { ImGui::GetContentRegionAvail().x, ImGui::GetContentRegionAvail().y }); - auto sphere = reinterpret_cast(collider.GetShape()); - SHEditorWidgets::DragFloat("Radius", [sphere] {return sphere->GetRadius(); }, [sphere](float const& value) {sphere->SetRadius(value);}); + auto sphere = reinterpret_cast(collider->GetShape()); + SHEditorWidgets::DragFloat + ( + "Radius", + [sphere, transformComponent] + { + const SHVec3& TF_WORLD_SCALE = transformComponent->GetWorldScale(); + const float MAX_SCALE = SHMath::Max({ TF_WORLD_SCALE.x, TF_WORLD_SCALE.y, TF_WORLD_SCALE.z }); + return sphere->GetRadius() / MAX_SCALE; + }, + [collider](float const& value) { collider->SetBoundingSphere(value);}); } - else if (collider.GetType() == SHCollider::Type::CAPSULE) + else if (collider->GetType() == SHCollider::Type::CAPSULE) { } { SHEditorWidgets::BeginPanel("Offset", { ImGui::GetContentRegionAvail().x, 30.0f }); - SHEditorWidgets::DragVec3("Position", { "X", "Y", "Z" }, [&collider] {return collider.GetPositionOffset(); }, [&collider](SHVec3 const& vec) {collider.SetPositionOffset(vec); }); + SHEditorWidgets::DragVec3("Position", { "X", "Y", "Z" }, [&collider] {return collider->GetPositionOffset(); }, [&collider](SHVec3 const& vec) {collider->SetPositionOffset(vec); }); SHEditorWidgets::EndPanel(); } if(ImGui::Button(std::format("{} Remove Collider #{}", ICON_MD_REMOVE, i).data())) diff --git a/SHADE_Engine/src/Math/Geometry/SHShape.cpp b/SHADE_Engine/src/Math/Geometry/SHShape.cpp index 3fc5775d..2f869029 100644 --- a/SHADE_Engine/src/Math/Geometry/SHShape.cpp +++ b/SHADE_Engine/src/Math/Geometry/SHShape.cpp @@ -27,10 +27,9 @@ namespace SHADE /* Getter Function Definitions */ /*-----------------------------------------------------------------------------------*/ - SHShape::Type SHShape::GetType() const + SHShape::Type SHShape::GetType() const noexcept { return type; } - } // namespace SHADE \ No newline at end of file diff --git a/SHADE_Engine/src/Math/Geometry/SHShape.h b/SHADE_Engine/src/Math/Geometry/SHShape.h index 18f54fe6..62198897 100644 --- a/SHADE_Engine/src/Math/Geometry/SHShape.h +++ b/SHADE_Engine/src/Math/Geometry/SHShape.h @@ -63,7 +63,7 @@ namespace SHADE /* Getter Functions */ /*---------------------------------------------------------------------------------*/ - [[nodiscard]] Type GetType() const; + [[nodiscard]] Type GetType () const noexcept; /*---------------------------------------------------------------------------------*/ /* Function Members */ @@ -77,6 +77,6 @@ namespace SHADE /* Data Members */ /*---------------------------------------------------------------------------------*/ - Type type; + Type type; }; } // namespace SHADE \ No newline at end of file diff --git a/SHADE_Engine/src/Physics/Components/SHColliderComponent.cpp b/SHADE_Engine/src/Physics/Components/SHColliderComponent.cpp index 75a00491..fb999847 100644 --- a/SHADE_Engine/src/Physics/Components/SHColliderComponent.cpp +++ b/SHADE_Engine/src/Physics/Components/SHColliderComponent.cpp @@ -58,7 +58,7 @@ namespace SHADE if (index < 0 || static_cast(index) >= colliders.size()) throw std::invalid_argument("Out-of-range access!"); - return colliders[index].first; + return colliders[index]; } /*-----------------------------------------------------------------------------------*/ @@ -85,13 +85,11 @@ namespace SHADE static constexpr auto TYPE = SHCollider::Type::BOX; - auto boxPair = std::make_pair(SHCollider{ TYPE }, true); - auto& collider = colliders.emplace_back(boxPair).first; - - const auto* tf = SHComponentManager::GetComponent(GetEID()); + auto& collider = colliders.emplace_back(SHCollider{ GetEID(), TYPE }); + collider.entityID = GetEID(); collider.SetPositionOffset(posOffset); - collider.SetAsBoundingBox(tf->GetWorldScale() * halfExtents); + collider.SetBoundingBox(halfExtents); // Notify Physics System system->AddCollisionShape(GetEID(), &collider); @@ -109,16 +107,11 @@ namespace SHADE static constexpr auto TYPE = SHCollider::Type::SPHERE; - auto spherePair = std::make_pair(SHCollider{ TYPE }, true); - auto& collider = colliders.emplace_back(spherePair).first; - - const auto* tf = SHComponentManager::GetComponent(GetEID()); + auto& collider = colliders.emplace_back(SHCollider{ GetEID(), TYPE }); + collider.entityID = GetEID(); collider.SetPositionOffset(posOffset); - - const SHVec3 TF_WORLD_SCALE = tf->GetWorldScale(); - const float MAX_SCALE = SHMath::Max({ TF_WORLD_SCALE.x, TF_WORLD_SCALE.y, TF_WORLD_SCALE.z }); - collider.SetAsBoundingSphere(MAX_SCALE * 0.5f * radius); + collider.SetBoundingSphere(radius); // Notify Physics System system->AddCollisionShape(GetEID(), &collider); diff --git a/SHADE_Engine/src/Physics/Components/SHColliderComponent.h b/SHADE_Engine/src/Physics/Components/SHColliderComponent.h index 4ecd0e93..af726b51 100644 --- a/SHADE_Engine/src/Physics/Components/SHColliderComponent.h +++ b/SHADE_Engine/src/Physics/Components/SHColliderComponent.h @@ -43,8 +43,7 @@ namespace SHADE /* Type Definitions */ /*---------------------------------------------------------------------------------*/ - using ColliderDirtyPair = std::pair; - using Colliders = std::vector; + using Colliders = std::vector; public: diff --git a/SHADE_Engine/src/Physics/SHCollider.cpp b/SHADE_Engine/src/Physics/SHCollider.cpp index f5899cfc..6e929a17 100644 --- a/SHADE_Engine/src/Physics/SHCollider.cpp +++ b/SHADE_Engine/src/Physics/SHCollider.cpp @@ -15,6 +15,8 @@ // Project Headers #include "Math/Geometry/SHBoundingBox.h" #include "Math/Geometry/SHBoundingSphere.h" +#include "Math/Transform/SHTransformComponent.h" +#include "Math/SHMathHelpers.h" namespace SHADE { @@ -22,22 +24,24 @@ namespace SHADE /* Constructors & Destructor Definitions */ /*-----------------------------------------------------------------------------------*/ - SHCollider::SHCollider(Type colliderType) + SHCollider::SHCollider(EntityID eid, Type colliderType, const SHPhysicsMaterial& physicsMaterial) : type { colliderType } + , entityID { eid } , isTrigger { false } , dirty { true } , shape { nullptr } + , material { physicsMaterial } { switch (type) { case Type::BOX: { - SetAsBoundingBox(SHVec3::One); + shape = new SHBoundingBox{ SHVec3::Zero, SHVec3::One }; break; } case Type::SPHERE: { - SetAsBoundingSphere(1.0f); + shape = new SHBoundingSphere{ SHVec3::Zero, 0.5f }; break; } default: break; @@ -46,17 +50,21 @@ namespace SHADE SHCollider::SHCollider(const SHCollider& rhs) noexcept : type { rhs.type} + , entityID { rhs.entityID } , isTrigger { rhs.isTrigger } , dirty { true } , shape { rhs.shape } + , material { rhs.material } , positionOffset { rhs.positionOffset } {} SHCollider::SHCollider(SHCollider&& rhs) noexcept : type { rhs.type} + , entityID { rhs.entityID } , isTrigger { rhs.isTrigger } , dirty { true } , shape { rhs.shape } + , material { rhs.material } , positionOffset { rhs.positionOffset } {} @@ -75,9 +83,11 @@ namespace SHADE return *this; type = rhs.type; + entityID = rhs.entityID; isTrigger = rhs.isTrigger; dirty = true; shape = rhs.shape; + material = rhs.material; positionOffset = rhs.positionOffset; return *this; @@ -86,9 +96,11 @@ namespace SHADE SHCollider& SHCollider::operator=(SHCollider&& rhs) noexcept { type = rhs.type; + entityID = rhs.entityID; isTrigger = rhs.isTrigger; dirty = true; shape = rhs.shape; + material = rhs.material; positionOffset = rhs.positionOffset; return *this; @@ -115,19 +127,16 @@ namespace SHADE float SHCollider::GetFriction() const noexcept { - // TODO(Diren): Fix after implementing materials - return 0.0f; + return material.GetFriction(); } float SHCollider::GetBounciness() const noexcept { - // TODO(Diren): Fix after implementing materials - return 0.0f; + return material.GetBounciness(); } float SHCollider::GetDensity() const noexcept { - // TODO(Diren): Fix after implementing materials - return 0.0f; + return material.GetDensity(); } const SHVec3& SHCollider::GetPositionOffset() const noexcept @@ -145,22 +154,60 @@ namespace SHADE /* Setter Function Definitions */ /*-----------------------------------------------------------------------------------*/ - void SHCollider::SetAsBoundingBox(const SHVec3& halfExtents) + void SHCollider::SetBoundingBox(const SHVec3& halfExtents) { dirty = true; - type = Type::BOX; - delete shape; - shape = new SHBoundingBox{ positionOffset, halfExtents }; + // Set the half extents relative to transform + SHVec3 worldHalfExtents = halfExtents; + + const auto* transformComponent = SHComponentManager::GetComponent_s(entityID); + if (transformComponent != nullptr) + worldHalfExtents *= (transformComponent->GetWorldScale() * 0.5f); + + if (type == Type::BOX) + { + auto* box = reinterpret_cast(shape); + box->SetHalfExtents(worldHalfExtents); + } + else + { + type = Type::BOX; + + delete shape; + shape = new SHBoundingBox{ positionOffset, worldHalfExtents }; + } } - void SHCollider::SetAsBoundingSphere(float radius) + void SHCollider::SetBoundingSphere(float radius) { dirty = true; - type = Type::SPHERE; - delete shape; - shape = new SHBoundingSphere{ positionOffset, radius }; + // Set the radius relative to transform + float worldRadius = radius; + + const auto* transformComponent = SHComponentManager::GetComponent_s(entityID); + if (transformComponent != nullptr) + { + const SHVec3 TF_WORLD_SCALE = transformComponent->GetWorldScale(); + const float MAX_SCALE = SHMath::Max({ TF_WORLD_SCALE.x, TF_WORLD_SCALE.y, TF_WORLD_SCALE.z }); + + worldRadius *= MAX_SCALE; + } + + if (type == Type::SPHERE) + { + auto* sphere = reinterpret_cast(shape); + sphere->SetRadius(worldRadius); + } + else + { + type = Type::SPHERE; + + delete shape; + shape = new SHBoundingSphere{ positionOffset, worldRadius }; + } + } void SHCollider::SetIsTrigger(bool trigger) noexcept @@ -172,16 +219,19 @@ namespace SHADE void SHCollider::SetFriction(float friction) noexcept { dirty = true; + material.SetFriction(friction); } void SHCollider::SetBounciness(float bounciness) noexcept { dirty = true; + material.SetBounciness(bounciness); } void SHCollider::SetDensity(float density) noexcept { dirty = true; + material.SetDensity(density); } void SHCollider::SetPositionOffset(const SHVec3& posOffset) noexcept @@ -205,5 +255,4 @@ RTTR_REGISTRATION registration::class_("Collider") .property("Position Offset", &SHCollider::GetPositionOffset, &SHCollider::SetPositionOffset); - // TODO(Diren): Add Physics Materials } \ No newline at end of file diff --git a/SHADE_Engine/src/Physics/SHCollider.h b/SHADE_Engine/src/Physics/SHCollider.h index 0e024f09..4fa483c9 100644 --- a/SHADE_Engine/src/Physics/SHCollider.h +++ b/SHADE_Engine/src/Physics/SHCollider.h @@ -13,8 +13,10 @@ #include // Project Headers +#include "ECS_Base/Entity/SHEntity.h" #include "Math/Geometry/SHShape.h" #include "Math/SHQuaternion.h" +#include "SHPhysicsMaterial.h" namespace SHADE { @@ -24,6 +26,15 @@ namespace SHADE class SH_API SHCollider { + private: + + /*---------------------------------------------------------------------------------*/ + /* Friends */ + /*---------------------------------------------------------------------------------*/ + + friend class SHColliderComponent; + friend class SHPhysicsObject; + public: /*---------------------------------------------------------------------------------*/ /* Type Definitions */ @@ -40,7 +51,7 @@ namespace SHADE /* Constructors & Destructor */ /*---------------------------------------------------------------------------------*/ - SHCollider (Type colliderType = Type::BOX); + SHCollider (EntityID eid, Type colliderType = Type::BOX, const SHPhysicsMaterial& physicsMaterial = SHPhysicsMaterial::DEFAULT); SHCollider (const SHCollider& rhs) noexcept; SHCollider (SHCollider&& rhs) noexcept; @@ -57,31 +68,33 @@ namespace SHADE /* Getter Functions */ /*---------------------------------------------------------------------------------*/ - [[nodiscard]] bool HasChanged () const noexcept; + [[nodiscard]] bool HasChanged () const noexcept; - [[nodiscard]] bool IsTrigger () const noexcept; + [[nodiscard]] bool IsTrigger () const noexcept; - [[nodiscard]] Type GetType () const noexcept; + [[nodiscard]] Type GetType () const noexcept; - [[nodiscard]] float GetFriction () const noexcept; - [[nodiscard]] float GetBounciness () const noexcept; - [[nodiscard]] float GetDensity () const noexcept; + [[nodiscard]] float GetFriction () const noexcept; + [[nodiscard]] float GetBounciness () const noexcept; + [[nodiscard]] float GetDensity () const noexcept; + [[nodiscard]] const SHPhysicsMaterial& GetMaterial () const noexcept; - [[nodiscard]] const SHVec3& GetPositionOffset () const noexcept; + [[nodiscard]] const SHVec3& GetPositionOffset () const noexcept; - [[nodiscard]] SHShape* GetShape () noexcept; + [[nodiscard]] SHShape* GetShape () noexcept; /*---------------------------------------------------------------------------------*/ /* Setter Functions */ /*---------------------------------------------------------------------------------*/ - void SetAsBoundingBox (const SHVec3& halfExtents); - void SetAsBoundingSphere (float radius); + void SetBoundingBox (const SHVec3& halfExtents); + void SetBoundingSphere (float radius); - void SetIsTrigger (bool isTrigger) noexcept; - void SetFriction (float friction) noexcept; - void SetBounciness (float bounciness) noexcept; - void SetDensity (float density) noexcept; + void SetIsTrigger (bool isTrigger) noexcept; + void SetFriction (float friction) noexcept; + void SetBounciness (float bounciness) noexcept; + void SetDensity (float density) noexcept; + void SetMaterial (const SHPhysicsMaterial& newMaterial) noexcept; void SetPositionOffset (const SHVec3& positionOffset) noexcept; @@ -90,11 +103,13 @@ namespace SHADE /* Data Members */ /*---------------------------------------------------------------------------------*/ - Type type; - bool isTrigger; - bool dirty; - SHShape* shape; - SHVec3 positionOffset; + Type type; + EntityID entityID; // The entity this collider belongs to + bool isTrigger; + bool dirty; + SHShape* shape; + SHPhysicsMaterial material; + SHVec3 positionOffset; RTTR_ENABLE() }; diff --git a/SHADE_Engine/src/Physics/SHPhysicsMaterial.cpp b/SHADE_Engine/src/Physics/SHPhysicsMaterial.cpp new file mode 100644 index 00000000..677e448f --- /dev/null +++ b/SHADE_Engine/src/Physics/SHPhysicsMaterial.cpp @@ -0,0 +1,104 @@ +/**************************************************************************************** + * \file SHPhysicsMaterial.cpp + * \author Diren D Bharwani, diren.dbharwani, 390002520 + * \brief Implementation for a Physics Material. + * + * \copyright 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. +****************************************************************************************/ + +#include + +// Primary Header +#include "SHPhysicsMaterial.h" +// Project Headers +#include "Math/SHMathHelpers.h" + +namespace SHADE +{ + /*-----------------------------------------------------------------------------------*/ + /* Static Data Member Definitions */ + /*-----------------------------------------------------------------------------------*/ + + const SHPhysicsMaterial SHPhysicsMaterial::DEFAULT { 0.4f, 0.0f, 1.0f }; + + /*-----------------------------------------------------------------------------------*/ + /* Constructors & Destructor Definitions */ + /*-----------------------------------------------------------------------------------*/ + + SHPhysicsMaterial::SHPhysicsMaterial(float _friction, float _bounciness, float _density) noexcept + : friction { std::clamp(_friction, 0.0f, 1.0f) } + , bounciness{ std::clamp(_bounciness, 0.0f, 1.0f) } + , density { std::fabs(_density) } + {} + + /*-----------------------------------------------------------------------------------*/ + /* Operator Overload Definitions */ + /*-----------------------------------------------------------------------------------*/ + + bool SHPhysicsMaterial::operator==(const SHPhysicsMaterial& rhs) const noexcept + { + return SHMath::CompareFloat(friction, rhs.friction) + && SHMath::CompareFloat(bounciness, rhs.bounciness) + && SHMath::CompareFloat(density, rhs.density); + } + + bool SHPhysicsMaterial::operator!=(const SHPhysicsMaterial& rhs) const noexcept + { + return !SHMath::CompareFloat(friction, rhs.friction) + || !SHMath::CompareFloat(bounciness, rhs.bounciness) + || !SHMath::CompareFloat(density, rhs.density); + } + + /*-----------------------------------------------------------------------------------*/ + /* Getter Function Definitions */ + /*-----------------------------------------------------------------------------------*/ + + float SHPhysicsMaterial::GetFriction() const noexcept + { + return friction; + } + + float SHPhysicsMaterial::GetBounciness() const noexcept + { + return bounciness; + } + + float SHPhysicsMaterial::GetDensity() const noexcept + { + return density; + } + + /*-----------------------------------------------------------------------------------*/ + /* Setter Function Definitions */ + /*-----------------------------------------------------------------------------------*/ + + void SHPhysicsMaterial::SetFriction(float newFriction) noexcept + { + if (newFriction < 0.0f || newFriction > 1.0f) + { + SHLOG_WARNING("Clamping friction of Physics Material between [0,1].") + } + friction = std::clamp(newFriction, 0.0f, 1.0f); + } + + void SHPhysicsMaterial::SetBounciness(float newBounciness) noexcept + { + if (newBounciness < 0.0f || newBounciness > 1.0f) + { + SHLOG_WARNING("Clamping bounciness of Physics Material between [0,1].") + } + bounciness = std::clamp(newBounciness, 0.0f, 1.0f); + } + + void SHPhysicsMaterial::SetDensity(float newDensity) noexcept + { + if (newDensity < 0.0f) + { + SHLOG_WARNING("Setting negative density of Physics Material to positive.") + } + density = std::fabs(newDensity); + } + +} // namespace SHADE \ No newline at end of file diff --git a/SHADE_Engine/src/Physics/SHPhysicsMaterial.h b/SHADE_Engine/src/Physics/SHPhysicsMaterial.h new file mode 100644 index 00000000..b3db1655 --- /dev/null +++ b/SHADE_Engine/src/Physics/SHPhysicsMaterial.h @@ -0,0 +1,113 @@ +/**************************************************************************************** + * \file SHPhysicsMaterial.h + * \author Diren D Bharwani, diren.dbharwani, 390002520 + * \brief Interface for a Physics Material. + * + * \copyright 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 + +// Project Headers +#include "SH_API.h" + +namespace SHADE +{ + /*-----------------------------------------------------------------------------------*/ + /* Type Definitions */ + /*-----------------------------------------------------------------------------------*/ + + class SH_API SHPhysicsMaterial + { + public: + /*---------------------------------------------------------------------------------*/ + /* Static Data Members */ + /*---------------------------------------------------------------------------------*/ + + static const SHPhysicsMaterial DEFAULT; + + /*---------------------------------------------------------------------------------*/ + /* Constructors & Destructor */ + /*---------------------------------------------------------------------------------*/ + + SHPhysicsMaterial (const SHPhysicsMaterial&) noexcept = default; + SHPhysicsMaterial (SHPhysicsMaterial&&) noexcept = default; + ~SHPhysicsMaterial() = default; + + /** + * @brief Default constructor for a physics material. + * @param friction The friction of the material. Clamped between [0,1]. Defaults to 0.4. + * @param bounciness The bounciness of the material. Clamped between [0,1]. + * @param density The mass density of the material. Always made positive. + */ + SHPhysicsMaterial (float friction = 0.4f, float bounciness = 0.0f, float density = 1.0f) noexcept; + + /*---------------------------------------------------------------------------------*/ + /* Operator Overloads */ + /*---------------------------------------------------------------------------------*/ + + SHPhysicsMaterial& operator= (const SHPhysicsMaterial&) noexcept = default; + SHPhysicsMaterial& operator= (SHPhysicsMaterial&&) noexcept = default; + + bool operator==(const SHPhysicsMaterial& rhs) const noexcept; + bool operator!=(const SHPhysicsMaterial& rhs) const noexcept; + + /*---------------------------------------------------------------------------------*/ + /* Getter Functions */ + /*---------------------------------------------------------------------------------*/ + + [[nodiscard]] float GetFriction () const noexcept; + [[nodiscard]] float GetBounciness () const noexcept; + [[nodiscard]] float GetDensity () const noexcept; + + /*---------------------------------------------------------------------------------*/ + /* Setter Functions */ + /*---------------------------------------------------------------------------------*/ + + /** + * @brief Sets the friction coefficient of the physics material. + * @param newFriction The friction value to set. Clamped between [0,1]. + */ + void SetFriction (float newFriction) noexcept; + + /** + * @brief Sets the bounciness factor of the physics material. + * @param newBounciness The bounciness value to set. Clamped between [0,1]. + */ + void SetBounciness (float newBounciness) noexcept; + + /** + * @brief Sets the mass density of the physics material. + * @param newDensity The density value to set. Always made positive. + */ + void SetDensity (float newDensity) noexcept; + + private: + + /*---------------------------------------------------------------------------------*/ + /* Data Members */ + /*---------------------------------------------------------------------------------*/ + + /** + * @brief The friction coefficient of the physics object., clamped between [0,1].
+ * 0 means the object will never experience friction. + * 1 means the friction force against the object is equal to the applied force. + */ + float friction; + + /** + * @brief The bounciness factor of the physics object., clamped between [0,1].
+ * 0 means the object will never bounce. + * 1 means the object never loses energy on a bounce. + */ + float bounciness; + + /** + * @brief The density of the collider that determines the mass of the collision shape + * if it is automatically computed. Must be a positive number. + */ + float density; + }; +} \ No newline at end of file diff --git a/SHADE_Engine/src/Physics/SHPhysicsObject.cpp b/SHADE_Engine/src/Physics/SHPhysicsObject.cpp index 986ce503..4d4d8cd7 100644 --- a/SHADE_Engine/src/Physics/SHPhysicsObject.cpp +++ b/SHADE_Engine/src/Physics/SHPhysicsObject.cpp @@ -261,9 +261,9 @@ namespace SHADE void SHPhysicsObject::SyncColliders(SHColliderComponent* c) const noexcept { int index = 0; - for (auto& [collider, dirty] : c->colliders) + for (auto& collider : c->colliders) { - if (!dirty) + if (!collider.dirty) continue; // Update offsets @@ -293,7 +293,7 @@ namespace SHADE default: break; } - dirty = false; + collider.dirty = false; ++index; } } diff --git a/SHADE_Engine/src/Physics/SHPhysicsSystem.cpp b/SHADE_Engine/src/Physics/SHPhysicsSystem.cpp index 1c6e79d7..c3cd5ebc 100644 --- a/SHADE_Engine/src/Physics/SHPhysicsSystem.cpp +++ b/SHADE_Engine/src/Physics/SHPhysicsSystem.cpp @@ -517,7 +517,7 @@ namespace SHADE // Add collision shapes back into the body if (colliderComponent != nullptr) { - for (auto& collider : colliderComponent->colliders | std::views::keys) + for (auto& collider : colliderComponent->colliders) physicsObject->AddCollider(&collider); } } @@ -538,7 +538,7 @@ namespace SHADE } // Add Collision Shapes - for (auto& collider : colliderComponent->colliders | std::views::keys) + for (auto& collider : colliderComponent->colliders) physicsObject->AddCollider(&collider); } } @@ -576,7 +576,7 @@ namespace SHADE rp3d::Transform{ colliderComponent->position, colliderComponent->orientation } ); - for (auto& collider : colliderComponent->colliders | std::views::keys) + for (auto& collider : colliderComponent->colliders) physicsObject->AddCollider(&collider); } diff --git a/SHADE_Engine/src/Scene/SHSceneGraph.cpp b/SHADE_Engine/src/Scene/SHSceneGraph.cpp index 950fd6a0..df46b3fb 100644 --- a/SHADE_Engine/src/Scene/SHSceneGraph.cpp +++ b/SHADE_Engine/src/Scene/SHSceneGraph.cpp @@ -582,9 +582,9 @@ namespace SHADE ReleaseNode(node); } - void SHSceneGraph::Traverse (const UnaryFunction& predicate) const + void SHSceneGraph::Traverse (const UnaryFunction& function) const { - TraverseAndInvokePredicate(root, predicate); + TraverseAndInvokeFunction(root, function); } /*-----------------------------------------------------------------------------------*/ @@ -621,12 +621,12 @@ namespace SHADE delete node; } - void SHSceneGraph::TraverseAndInvokePredicate(const SHSceneNode* node, const UnaryFunction& predicate) + void SHSceneGraph::TraverseAndInvokeFunction(const SHSceneNode* node, const UnaryFunction& function) { for (auto* child : node->children) { - predicate(child); - TraverseAndInvokePredicate(child, predicate); + function(child); + TraverseAndInvokeFunction(child, function); } } diff --git a/SHADE_Engine/src/Scene/SHSceneGraph.h b/SHADE_Engine/src/Scene/SHSceneGraph.h index b52fd1ff..45ab48e5 100644 --- a/SHADE_Engine/src/Scene/SHSceneGraph.h +++ b/SHADE_Engine/src/Scene/SHSceneGraph.h @@ -142,7 +142,7 @@ namespace SHADE bool RemoveNode (SHSceneNode* nodeToRemove) noexcept; void Reset () noexcept; - void Traverse (const UnaryFunction& predicate) const; + void Traverse (const UnaryFunction& function) const; private: /*---------------------------------------------------------------------------------*/ From 75fd02c08a35e0d4f3145d671a9c7c00634ca86b Mon Sep 17 00:00:00 2001 From: Diren D Bharwani Date: Thu, 27 Oct 2022 03:35:32 +0800 Subject: [PATCH 34/92] small change to where forces are cleared (1 less comparison) --- SHADE_Engine/src/Physics/SHPhysicsSystem.cpp | 26 +++++++++----------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/SHADE_Engine/src/Physics/SHPhysicsSystem.cpp b/SHADE_Engine/src/Physics/SHPhysicsSystem.cpp index c3cd5ebc..44142aaf 100644 --- a/SHADE_Engine/src/Physics/SHPhysicsSystem.cpp +++ b/SHADE_Engine/src/Physics/SHPhysicsSystem.cpp @@ -246,21 +246,6 @@ namespace SHADE if (physicsObject.rp3dBody == nullptr) continue; - auto* rigidBodyComponent = SHComponentManager::GetComponent_s(entityID); - - // Clear all forces and velocities if editor is not in play - if (SHSystemManager::GetSystem()->editorState == SHEditor::State::STOP) - { - if (rigidBodyComponent) - { - auto* rp3dRigidBody = reinterpret_cast(physicsObject.rp3dBody); - rp3dRigidBody->resetForce(); - rp3dRigidBody->resetTorque(); - rp3dRigidBody->setLinearVelocity(SHVec3::Zero); - rp3dRigidBody->setAngularVelocity(SHVec3::Zero); - } - } - const auto* transformComponent = SHComponentManager::GetComponent_s(entityID); if (transformComponent && transformComponent->HasChanged()) { @@ -270,10 +255,21 @@ namespace SHADE physicsObject.SetPosition(WORLD_POS); physicsObject.SetOrientation(WORLD_ROT); + auto* rigidBodyComponent = SHComponentManager::GetComponent_s(entityID); if (rigidBodyComponent) { rigidBodyComponent->position = WORLD_POS; rigidBodyComponent->orientation = WORLD_ROT; + + // Clear all forces and velocities if editor is stopped + if (SHSystemManager::GetSystem()->editorState == SHEditor::State::STOP) + { + auto* rp3dRigidBody = reinterpret_cast(physicsObject.rp3dBody); + rp3dRigidBody->resetForce(); + rp3dRigidBody->resetTorque(); + rp3dRigidBody->setLinearVelocity(SHVec3::Zero); + rp3dRigidBody->setAngularVelocity(SHVec3::Zero); + } } auto* colliderComponent = SHComponentManager::GetComponent_s(entityID); From b7b3ef08ab850b559c8afe491579d54d104a8bba Mon Sep 17 00:00:00 2001 From: Brandon Mak Date: Thu, 27 Oct 2022 11:31:11 +0800 Subject: [PATCH 35/92] Some lighting fixes --- .../Graphics/Devices/SHVkLogicalDevice.cpp | 5 +++-- TempShaderFolder/DeferredCompositeCs.glsl | 12 ++++-------- TempShaderFolder/DeferredCompositeCs.spv | Bin 3332 -> 3460 bytes TempShaderFolder/TestCubeFs.glsl | 2 -- 4 files changed, 7 insertions(+), 12 deletions(-) diff --git a/SHADE_Engine/src/Graphics/Devices/SHVkLogicalDevice.cpp b/SHADE_Engine/src/Graphics/Devices/SHVkLogicalDevice.cpp index a6b415a9..6bf2e731 100644 --- a/SHADE_Engine/src/Graphics/Devices/SHVkLogicalDevice.cpp +++ b/SHADE_Engine/src/Graphics/Devices/SHVkLogicalDevice.cpp @@ -186,9 +186,10 @@ namespace SHADE vk::PhysicalDeviceFeatures features{}; // ADD MORE FEATURES HERE IF NEEDED // point and lines fill mode - features.fillModeNonSolid = true; + features.fillModeNonSolid = VK_TRUE; features.samplerAnisotropy = VK_TRUE; - features.multiDrawIndirect = true; + features.multiDrawIndirect = VK_TRUE; + features.independentBlend = VK_TRUE; // for wide lines features.wideLines = true; diff --git a/TempShaderFolder/DeferredCompositeCs.glsl b/TempShaderFolder/DeferredCompositeCs.glsl index c0e42cea..c707901f 100644 --- a/TempShaderFolder/DeferredCompositeCs.glsl +++ b/TempShaderFolder/DeferredCompositeCs.glsl @@ -9,8 +9,8 @@ struct DirectionalLightStruct }; layout(local_size_x = 16, local_size_y = 16) in; -layout(set = 4, binding = 0, rgba8) uniform image2D positions; -layout(set = 4, binding = 1, rgba8) uniform image2D normals; +layout(set = 4, binding = 0, rgba32f) uniform image2D positions; +layout(set = 4, binding = 1, rgba32f) uniform image2D normals; layout(set = 4, binding = 2, rgba8) uniform image2D albedo; layout(set = 4, binding = 3, rgba8) uniform image2D targetImage; @@ -40,26 +40,22 @@ void main() // normal of fragment vec3 normalWorld = imageLoad(normals, globalThread).rgb; - //normalWorld = normalize (normalWorld); vec3 fragColor = vec3 (0.0f); for (int i = 0; i < lightCounts.directionalLights; ++i) { // get normalized direction of light - vec3 dLightNormalized = vec3 (0.0f, 0.0f, 1.0f); - //vec3 dLightNormalized = normalize (DirLightData.dLightData[i].direction); + vec3 dLightNormalized = normalize (DirLightData.dLightData[i].direction); // Get diffuse strength float diffuseStrength = max (0, dot (dLightNormalized, normalWorld)); - //fragColor += vec3 (1.0f) * diffuseStrength.rrr * pixelDiffuse; + // Calculate the fragment color fragColor += DirLightData.dLightData[i].diffuseColor.rgb * diffuseStrength.rrr * pixelDiffuse; - //fragColor += vec3 (dLightNormalized.rgb); } // store result into result image imageStore(targetImage, ivec2(gl_GlobalInvocationID.xy), vec4(fragColor, 1.0f)); - //imageStore(targetImage, ivec2(gl_GlobalInvocationID.xy), vec4(normalWorld, 1.0f)); } \ No newline at end of file diff --git a/TempShaderFolder/DeferredCompositeCs.spv b/TempShaderFolder/DeferredCompositeCs.spv index a87b7548fb45981226d5a85fa1e4c3f4cf88dbd4..455ab5483f63c9c8c37d786c435e1d7ca6138b50 100644 GIT binary patch literal 3460 zcmZvd>2e!I5XZ-de8hH)$;lBT#~cX>CO{GbA&0Sp;-Ewh&cQ9#(pp};-WAe11r#5` z2i|}O;Td=+3aFxr|8F#Hwp>iA)7}5>>0`QA9vNO7cW%fXax<>)24~I<3vq7Bjd@#?3Uz;$}PP#jPTF65}^f@=LN-y4Nl{ROC_4Us3K!<>;jOW|ThI z?!{4Cs_LBZwRO^F&70P;CwVI>k~~{m_4YA$LcE)NAE&Fy*4AEM*||6Bo)?eO&A6ST zkGZP!Zr)G0{5bEWB&g`$VhQIx!OnJjkveP z6E9cXRq=Y#*)CS{y{zb~f(efacHyb=EK0o#dB^mRJG^-}PqHFd3}*)YZf>xz;hM0t zl%wLt-HNcbzkAPjko*|$za?+BIvCS_?v0|i*D412v2*t8lT3ba>Pq^{VZ#66)YaNc zwE~^HQGZ9?*035Ckzk(-J7>_tz{31)3)4N{nfZe^@Ezn) zD{*~3VB|H7oM028n!Y*iS{=-pJlrEMI(azUXFi;A9x%%@E!q4m58t<8 zBjIjUocOoI$3*;i;A1nf_|yl+J^YzXxjuC2vwGXXPQUo0W4HT!Kg{Jh(Ghh`jSI43 zM?R)I)Ke7^^MrK$2zm^ARXXnm2H}6mSm0NK&VE?@S;^$Y|G54? zDqa;4>zFvY#X2r|ke41N-N|4lR{2mXZ$N%}<={(xboP-$j#J{~z@L~4LI1y)V8lEv z&cTZNWbPalx-34g$gASiVX=6JQ+jE365G6Fb`PC6HF08skq4dqvpjc#OicXm ziPHO?$KG^DvU5*wpkwQb_})zaPBQU$ zbM}w@#|Of8S#L@_X3wFvKZR7psexUe6wwDd`^VqGvR*x)pE;oO_sjg5FMqpCC*Dd) z=gk^HzovZDd|1Ty@{{ygary(huPWJ(xqyl7W6uVR-q+82W^V^NjrtUMNc@aL~4ZRF=en|ulamdGe5}$X%PP_&2mqmOd7XKB=<@m1#A8?ER znq+W@Q;uJij@{zFF8OTGssEg)9RIv@e84UK8hz*G z`vU(%eO?xSSH!`7MI1YvI+@pdB4RL4cJ}>%E$f~6R&R*-e#yZdd~S-sf0NI$_=h6y z-4y*TAM{Hi@{ya~Sn*mw)}6`c6^ ztc$=*zb~1$`&G5_?SCS|2YgyJfNh9~iyyy#_z;`j$7Z!ZkZiR-lKfa?wPSlI!k7L0 zRD|7T`&q!iIW}ATso`@G`PM_PUjz&s`bG8A- zX0Ro`9WZbX@54^=?Ia@X*2}k&>4o1M-Yyk^aSYp)3`QKovVaYXuPZWh%0=AAAN!7| PrM%QjUhMxU$`#SSUL_#7 literal 3332 zcmZ9OZF5sq5XVoOCM|`6$fFO`lqyxJ^{GV^0Yi(S7-(uyd=9tCZF=Q4Hi7a* z_znCZeg;33qs}-sy3c-Tm*L-95W|Q%mFXlg^E~X*c8c+~}Ni<3gM}>MEYs z8(WQ~VcuC_TBX&1GKkxG@+8J@s^FLO+Ub6$=unnNF@IUPk0?hs&9ucU#ap%PQ$q#Y5mh9~850#yJ6YhEODBX@b z8G6N4rT4R8!sUnAASFRr|IHQfVZbhl_p-rWl#V=!w{UqV(|A#X+hafhDwv!s^?i{Z>**v}01HCz*x z7IKu`q^k+*_`CQ03zDDW(94RujcwGXt$Yyoy7{i+Ou4(l*GA(zs7Vg{?R-=hcFsZF zlBo-vdXr%-O#XkIdfWS{R-=0_8a|fyr1xhNLk-qCUqeIq;TqPWJQD14VdsqAHnK3+ z`@(e3zu5elYfE?@4Z3l@z87_4SJw>L^P{2{Md<9vMbSh-pOZ}O*pZ8NbclnUohaJT zv5$%Fs0QZAnIEwO3_BQk&5xX5Q=+=QIqq5=%$YpgBQH96INZ1S6!X|@z>XFCEDzte z-7QJRuPP$`C*l=ZkV4}|TCddq$0 z$)T3Ngz&eRoa`@u1L*@gJH_9&qFz0uUpk~O7Ify!_glPQE9mr`zX#Z_D<3r<7tM%% zmd^h3KCn$y$)4E%8%R9Bo|TLrZ*R(vc&9}8V!NT2@-8s)u@V+~QxB3=VOM@tGrb-ogy|ZjqTE-{#+X={w@=3;a*@ZCQLp#KC?= z96Ovknb&(FVldBX@v8x=sn2|~*F}8C Date: Thu, 27 Oct 2022 12:32:06 +0800 Subject: [PATCH 36/92] Collider now will have it's sub collider list updated based on events --- .../Components/SHRigidBodyComponent.cpp | 3 + .../Physics/Components/SHRigidBodyComponent.h | 8 +- SHADE_Engine/src/Scripting/SHScriptEngine.cpp | 40 +++++++- SHADE_Engine/src/Scripting/SHScriptEngine.h | 5 + SHADE_Managed/src/Components/Collider.cxx | 99 ++++++++++++++----- SHADE_Managed/src/Components/Collider.hxx | 28 +++++- SHADE_Managed/src/Engine/ECS.cxx | 6 ++ SHADE_Managed/src/Scripts/ScriptStore.hxx | 4 +- TempScriptsFolder/PhysicsTest.cs | 36 +++++++ TempScriptsFolder/RaccoonShowcase.cs | 10 +- TempScriptsFolder/RaccoonSpin.cs | 9 +- 11 files changed, 202 insertions(+), 46 deletions(-) create mode 100644 TempScriptsFolder/PhysicsTest.cs diff --git a/SHADE_Engine/src/Physics/Components/SHRigidBodyComponent.cpp b/SHADE_Engine/src/Physics/Components/SHRigidBodyComponent.cpp index b0172f64..c1969557 100644 --- a/SHADE_Engine/src/Physics/Components/SHRigidBodyComponent.cpp +++ b/SHADE_Engine/src/Physics/Components/SHRigidBodyComponent.cpp @@ -10,6 +10,9 @@ #include +// External Dependencies +#include + // Primary Header #include "SHRigidBodyComponent.h" diff --git a/SHADE_Engine/src/Physics/Components/SHRigidBodyComponent.h b/SHADE_Engine/src/Physics/Components/SHRigidBodyComponent.h index 78de84e7..3c5dd4f9 100644 --- a/SHADE_Engine/src/Physics/Components/SHRigidBodyComponent.h +++ b/SHADE_Engine/src/Physics/Components/SHRigidBodyComponent.h @@ -10,7 +10,6 @@ #pragma once -#include #include // Project Headers @@ -23,6 +22,11 @@ // class SHPhysicsSystem; //} +namespace reactphysics3d +{ + class RigidBody; +} + namespace SHADE { /*-----------------------------------------------------------------------------------*/ @@ -153,7 +157,7 @@ namespace SHADE uint16_t dirtyFlags; bool interpolate; - rp3d::RigidBody* rp3dBody; + reactphysics3d::RigidBody* rp3dBody; float mass; float drag; diff --git a/SHADE_Engine/src/Scripting/SHScriptEngine.cpp b/SHADE_Engine/src/Scripting/SHScriptEngine.cpp index 195d8ee3..3a2ea29f 100644 --- a/SHADE_Engine/src/Scripting/SHScriptEngine.cpp +++ b/SHADE_Engine/src/Scripting/SHScriptEngine.cpp @@ -24,6 +24,7 @@ of DigiPen Institute of Technology is prohibited. #include "Events/SHEvent.h" #include "Events/SHEventReceiver.h" #include "Events/SHEventManager.hpp" +#include "Physics/SHPhysicsSystem.h" namespace SHADE { @@ -60,7 +61,7 @@ namespace SHADE // Initialise the CSharp Engine csEngineInit(); - // Register entity creation events + // Register all events registerEvents(); } void SHScriptEngine::UnloadScriptAssembly() @@ -284,6 +285,20 @@ namespace SHADE return eventData->handle; } + SHEventHandle SHScriptEngine::onColliderAdded(SHEventPtr eventPtr) + { + auto eventData = reinterpret_cast*>(eventPtr.get()); + csColliderOnListChanged(eventData->data->entityID); + return eventData->handle; + } + + SHEventHandle SHScriptEngine::onColliderRemoved(SHEventPtr eventPtr) + { + auto eventData = reinterpret_cast*>(eventPtr.get()); + csColliderOnListChanged(eventData->data->entityID); + return eventData->handle; + } + /*-----------------------------------------------------------------------------------*/ /* Helper Functions */ /*-----------------------------------------------------------------------------------*/ @@ -384,6 +399,12 @@ namespace SHADE DEFAULT_CSHARP_NAMESPACE + ".ScriptStore", "DeserialiseScripts" ); + csColliderOnListChanged = dotNet.GetFunctionPtr + ( + DEFAULT_CSHARP_LIB_NAME, + DEFAULT_CSHARP_NAMESPACE + ".Collider", + "OnColliderBoundChanged" + ); csEditorRenderScripts = dotNet.GetFunctionPtr ( DEFAULT_CSHARP_LIB_NAME, @@ -411,8 +432,21 @@ namespace SHADE { std::make_shared>(this, &SHScriptEngine::onEntityDestroyed) }; - ReceiverPtr receiver = std::dynamic_pointer_cast(destroyedEventReceiver); - SHEventManager::SubscribeTo(SH_ENTITY_DESTROYED_EVENT, receiver); + SHEventManager::SubscribeTo(SH_ENTITY_DESTROYED_EVENT, std::dynamic_pointer_cast(destroyedEventReceiver)); + + // Register for collider added event + std::shared_ptr> addedColliderEventReceiver + { + std::make_shared>(this, &SHScriptEngine::onColliderAdded) + }; + SHEventManager::SubscribeTo(SH_PHYSICS_COLLIDER_ADDED_EVENT, std::dynamic_pointer_cast(addedColliderEventReceiver)); + + // Register for collider removed event + std::shared_ptr> removedColliderEventReceiver + { + std::make_shared>(this, &SHScriptEngine::onColliderRemoved) + }; + SHEventManager::SubscribeTo(SH_PHYSICS_COLLIDER_REMOVED_EVENT, std::dynamic_pointer_cast(removedColliderEventReceiver)); } void SHScriptEngine::dumpBuildLog(const std::string_view& buildLogPath) diff --git a/SHADE_Engine/src/Scripting/SHScriptEngine.h b/SHADE_Engine/src/Scripting/SHScriptEngine.h index 137d978f..a909a334 100644 --- a/SHADE_Engine/src/Scripting/SHScriptEngine.h +++ b/SHADE_Engine/src/Scripting/SHScriptEngine.h @@ -218,6 +218,7 @@ namespace SHADE using CsScriptSerialiseYamlFuncPtr = bool(*)(EntityID, void*); using CsScriptDeserialiseYamlFuncPtr = bool(*)(EntityID, const void*); using CsScriptEditorFuncPtr = void(*)(EntityID); + using CsEventRelayFuncPtr = void(*)(EntityID); /*-----------------------------------------------------------------------------*/ /* Constants */ @@ -250,6 +251,8 @@ namespace SHADE CsScriptOptionalFuncPtr csScriptsRemoveAllImmediately = nullptr; CsScriptSerialiseYamlFuncPtr csScriptsSerialiseYaml = nullptr; CsScriptDeserialiseYamlFuncPtr csScriptsDeserialiseYaml = nullptr; + // - Events + CsEventRelayFuncPtr csColliderOnListChanged = nullptr; // - Editor CsScriptEditorFuncPtr csEditorRenderScripts = nullptr; CsFuncPtr csEditorUndo = nullptr; @@ -259,6 +262,8 @@ namespace SHADE /* Event Handler Functions */ /*-----------------------------------------------------------------------------*/ SHEventHandle onEntityDestroyed(SHEventPtr eventPtr); + SHEventHandle onColliderAdded(SHEventPtr eventPtr); + SHEventHandle onColliderRemoved(SHEventPtr eventPtr); /*-----------------------------------------------------------------------------*/ /* Helper Functions */ diff --git a/SHADE_Managed/src/Components/Collider.cxx b/SHADE_Managed/src/Components/Collider.cxx index e09b7ead..7f41ad44 100644 --- a/SHADE_Managed/src/Components/Collider.cxx +++ b/SHADE_Managed/src/Components/Collider.cxx @@ -134,7 +134,16 @@ namespace SHADE /*---------------------------------------------------------------------------------*/ Collider::Collider(Entity entity) : Component(entity) - {} + { + // Create lists if they don't exist + if (colliders == nullptr) + colliders = gcnew CollidersMap; + if (!colliders->ContainsKey(entity)) + colliders->Add(entity, gcnew WeakReferenceList()); + + // Store a weak reference + colliders[entity]->Add(gcnew System::WeakReference(this)); + } /*---------------------------------------------------------------------------------*/ /* Collider - Properties */ @@ -152,29 +161,7 @@ namespace SHADE // Populate the list if it hasn't been if (subColliderList == nullptr) { - subColliderList = gcnew System::Collections::Generic::List(); - for (const auto& collider : GetNativeComponent()->GetColliders()) - { - ColliderBound^ bound = nullptr; - switch (collider.first.GetType()) - { - case SHCollider::Type::BOX: - bound = gcnew BoxColliderBound(index, Owner.GetEntity()); - break; - case SHCollider::Type::SPHERE: - bound = gcnew SphereColliderBound(index, Owner.GetEntity()); - break; - case SHCollider::Type::CAPSULE: - // TODO - break; - default: - Debug::LogWarning("[Collider] An invalid Collider Type was detected. Skipping."); - break; - } - - // Add into list - subColliderList->Add(bound); - } + updateSubColliderList(); } // Check if valid @@ -189,4 +176,68 @@ namespace SHADE { return safe_cast(GetColliderBound(index)); } + + /*---------------------------------------------------------------------------------*/ + /* Event Handling Functions */ + /*---------------------------------------------------------------------------------*/ + void Collider::OnColliderBoundChanged(EntityID entity) + { + // Check if there are any colliders to update + if (colliders == nullptr || !colliders->ContainsKey(entity)) + return; + + // Update any colliders + System::Collections::Generic::List^ toRemove = gcnew System::Collections::Generic::List(); + WeakReferenceList^ collidersList = colliders[entity]; + for each (System::WeakReference^ wr in collidersList) + { + Collider^ collider = safe_cast(wr->Target); + // Update collider bounds + if (collider && collider->subColliderList != nullptr) + collider->updateSubColliderList(); + else + toRemove->Add(wr); + } + + // Sweep through and clear any invalid references while we're at it + for each (System::WeakReference ^ wr in toRemove) + { + collidersList->Remove(wr); + } + } + + void Collider::updateSubColliderList() + { + // Prepare the list + if (subColliderList) + subColliderList->Clear(); + else + subColliderList = gcnew System::Collections::Generic::List(); + + // Populate the list + int i = 0; + for (const auto& collider : GetNativeComponent()->GetColliders()) + { + ColliderBound^ bound = nullptr; + switch (collider.first.GetType()) + { + case SHCollider::Type::BOX: + bound = gcnew BoxColliderBound(i, Owner.GetEntity()); + break; + case SHCollider::Type::SPHERE: + bound = gcnew SphereColliderBound(i, Owner.GetEntity()); + break; + case SHCollider::Type::CAPSULE: + // TODO + break; + default: + Debug::LogWarning("[Collider] An invalid Collider Type was detected. Skipping."); + break; + } + ++i; + + // Add into list + subColliderList->Add(bound); + } + } } diff --git a/SHADE_Managed/src/Components/Collider.hxx b/SHADE_Managed/src/Components/Collider.hxx index c85ee21c..8e63fc83 100644 --- a/SHADE_Managed/src/Components/Collider.hxx +++ b/SHADE_Managed/src/Components/Collider.hxx @@ -136,7 +136,7 @@ namespace SHADE ///
public ref class SphereColliderBound : public ColliderBound { - public: + public: /*-----------------------------------------------------------------------------*/ /* Properties */ /*-----------------------------------------------------------------------------*/ @@ -165,7 +165,7 @@ namespace SHADE /// bool Raycast(Ray ray, float maxDistance) override; - internal: + internal: /*-----------------------------------------------------------------------------*/ /* Constructors */ /*-----------------------------------------------------------------------------*/ @@ -220,11 +220,33 @@ namespace SHADE generic where T:ColliderBound T GetColliderBound(int index); + internal: + /*-----------------------------------------------------------------------------*/ + /* Event Handling Functions */ + /*-----------------------------------------------------------------------------*/ + static void OnColliderBoundChanged(EntityID entity); + private: + /*-----------------------------------------------------------------------------*/ + /* Type Definitions */ + /*-----------------------------------------------------------------------------*/ + using WeakReferenceList = System::Collections::Generic::List; + using CollidersMap = System::Collections::Generic::Dictionary; + + /*-----------------------------------------------------------------------------*/ + /* Static Data Members */ + /*-----------------------------------------------------------------------------*/ + static CollidersMap^ colliders; + /*-----------------------------------------------------------------------------*/ /* Data Members */ /*-----------------------------------------------------------------------------*/ - System::Collections::Generic::List^ subColliderList; // TODO: Update elements in this list if the list on native collider changes + System::Collections::Generic::List^ subColliderList; + + /*-----------------------------------------------------------------------------*/ + /* Helper Functions */ + /*-----------------------------------------------------------------------------*/ + void updateSubColliderList(); }; } diff --git a/SHADE_Managed/src/Engine/ECS.cxx b/SHADE_Managed/src/Engine/ECS.cxx index 4d62f643..df67c788 100644 --- a/SHADE_Managed/src/Engine/ECS.cxx +++ b/SHADE_Managed/src/Engine/ECS.cxx @@ -22,6 +22,8 @@ of DigiPen Institute of Technology is prohibited. // External Dependencies #include "ECS_Base/Managers/SHEntityManager.h" #include "Math/Transform/SHTransformComponent.h" +#include "Physics\Components\SHColliderComponent.h" +#include "Physics\Components\SHRigidBodyComponent.h" #include "Scene/SHSceneManager.h" #include "Scene/SHSceneGraph.h" #include "Tools/SHLog.h" @@ -29,6 +31,8 @@ of DigiPen Institute of Technology is prohibited. #include "Utility/Convert.hxx" #include "Utility/Debug.hxx" #include "Components/Transform.hxx" +#include "Components\RigidBody.hxx" +#include "Components\Collider.hxx" namespace SHADE { @@ -242,6 +246,8 @@ namespace SHADE static ECS::ECS() { componentMap.Add(createComponentSet()); + componentMap.Add(createComponentSet()); + componentMap.Add(createComponentSet()); } /*---------------------------------------------------------------------------------*/ diff --git a/SHADE_Managed/src/Scripts/ScriptStore.hxx b/SHADE_Managed/src/Scripts/ScriptStore.hxx index 4a9be721..9aa66fcd 100644 --- a/SHADE_Managed/src/Scripts/ScriptStore.hxx +++ b/SHADE_Managed/src/Scripts/ScriptStore.hxx @@ -132,7 +132,7 @@ namespace SHADE /// Immutable list of references to scripts of the specified type. /// generic where T : ref class, Script - static System::Collections::Generic::IEnumerable ^ GetScripts(Entity entity); + static System::Collections::Generic::IEnumerable^ GetScripts(Entity entity); /// /// Retrieves an immutable list of all scripts attached to a specified Entity. /// @@ -295,4 +295,4 @@ namespace SHADE static System::Type^ getScriptType(System::String^ scriptName); static bool isEntityActive(Entity entity); }; -} // namespace PlushieAPI \ No newline at end of file +} diff --git a/TempScriptsFolder/PhysicsTest.cs b/TempScriptsFolder/PhysicsTest.cs new file mode 100644 index 00000000..72e8a205 --- /dev/null +++ b/TempScriptsFolder/PhysicsTest.cs @@ -0,0 +1,36 @@ +using SHADE; +using System; + +public class PhysicsTest : Script +{ + [SerializeField] + [Tooltip("Force to apply when pressing Space.")] + private Vector3 Force = new Vector3(0.0f, 1.0f, 0.0f); + private RigidBody RigidBody; + private Collider Collider; + public PhysicsTest(GameObject gameObj) : base(gameObj) { } + + protected override void awake() + { + RigidBody = GetComponent(); + if (RigidBody == null) + { + Debug.LogError("RigidBody is NULL!"); + } + Collider = GetComponent(); + if (Collider == null) + { + Debug.LogError("Collider is NULL!"); + } + + var subColider = Collider.ColliderBoundsCount; + Debug.Log($"There are {subColider} colliders."); + } + protected override void update() + { + if (Input.GetKeyUp(Input.KeyCode.Space)) + { + RigidBody.AddForce(Force); + } + } +} \ No newline at end of file diff --git a/TempScriptsFolder/RaccoonShowcase.cs b/TempScriptsFolder/RaccoonShowcase.cs index 4191a6e5..da0b89d2 100644 --- a/TempScriptsFolder/RaccoonShowcase.cs +++ b/TempScriptsFolder/RaccoonShowcase.cs @@ -12,7 +12,7 @@ public class RaccoonShowcase : Script //private int test = 5; [SerializeField] [Tooltip("Speed of the scaling in radians per second around each axis.")] - private Vector3 ScaleSpeed = new Vector3(1.0, 1.0, 0.0); + private Vector3 ScaleSpeed = Vector3.One; private Transform Transform; private double rotation = 0.0; private Vector3 scale = Vector3.Zero; @@ -31,9 +31,9 @@ public class RaccoonShowcase : Script } protected override void update() { - rotation += RotateSpeed * 0.16; - scale += ScaleSpeed * 0.16; - Transform.LocalRotation = new Vector3(0.0f, rotation, 0.0f); - Transform.LocalScale = new Vector3(System.Math.Abs(System.Math.Sin(scale.x)) * originalScale, System.Math.Abs(System.Math.Cos(scale.y)) * originalScale, System.Math.Abs(System.Math.Sin(scale.z)) * originalScale); + //rotation += RotateSpeed * 0.16; + //scale += ScaleSpeed * 0.16; + //Transform.LocalRotation = new Vector3(0.0f, rotation, 0.0f); + //Transform.LocalScale = new Vector3(System.Math.Abs(System.Math.Sin(scale.x)) * originalScale, System.Math.Abs(System.Math.Cos(scale.y)) * originalScale, System.Math.Abs(System.Math.Sin(scale.z)) * originalScale); } } \ No newline at end of file diff --git a/TempScriptsFolder/RaccoonSpin.cs b/TempScriptsFolder/RaccoonSpin.cs index 6bbd1462..c5420ffb 100644 --- a/TempScriptsFolder/RaccoonSpin.cs +++ b/TempScriptsFolder/RaccoonSpin.cs @@ -5,8 +5,8 @@ public class RaccoonSpin : Script { [SerializeField] [Tooltip("Speed of the rotation in radians per second.")] - private double RotateSpeed = 1.0; - private double rotation = 0.0; + private float RotateSpeed = 1.0f; + private float rotation = 0.0f; [SerializeField] private CallbackEvent testEvent; [SerializeField] @@ -22,9 +22,4 @@ public class RaccoonSpin : Script Debug.LogError("Transform is NULL!"); } } - protected override void update() - { - rotation += RotateSpeed * 0.16; - Transform.LocalRotation = new Vector3(0.0f, rotation, 0.0f); - } } \ No newline at end of file From 97432b866687da2a4b5e67a1d25704298b3b6782 Mon Sep 17 00:00:00 2001 From: Kah Wei Date: Thu, 27 Oct 2022 12:46:42 +0800 Subject: [PATCH 37/92] Accounted for updating collider storage when a collider is removed --- SHADE_Engine/src/Scripting/SHScriptEngine.cpp | 21 +++++++++++++++++++ SHADE_Engine/src/Scripting/SHScriptEngine.h | 2 ++ SHADE_Managed/src/Components/Collider.cxx | 14 +++++++++++++ SHADE_Managed/src/Components/Collider.hxx | 11 ++++++++++ 4 files changed, 48 insertions(+) diff --git a/SHADE_Engine/src/Scripting/SHScriptEngine.cpp b/SHADE_Engine/src/Scripting/SHScriptEngine.cpp index 3a2ea29f..0a687601 100644 --- a/SHADE_Engine/src/Scripting/SHScriptEngine.cpp +++ b/SHADE_Engine/src/Scripting/SHScriptEngine.cpp @@ -299,6 +299,14 @@ namespace SHADE return eventData->handle; } + SHEventHandle SHScriptEngine::onColliderComponentRemoved(SHEventPtr eventPtr) + { + auto eventData = reinterpret_cast*>(eventPtr.get()); + if (eventData->data->removedComponentType == ComponentFamily::GetID()) + csColliderOnRemoved(eventData->data->eid); + return eventData->handle; + } + /*-----------------------------------------------------------------------------------*/ /* Helper Functions */ /*-----------------------------------------------------------------------------------*/ @@ -405,6 +413,12 @@ namespace SHADE DEFAULT_CSHARP_NAMESPACE + ".Collider", "OnColliderBoundChanged" ); + csColliderOnRemoved = dotNet.GetFunctionPtr + ( + DEFAULT_CSHARP_LIB_NAME, + DEFAULT_CSHARP_NAMESPACE + ".Collider", + "OnColliderRemoved" + ); csEditorRenderScripts = dotNet.GetFunctionPtr ( DEFAULT_CSHARP_LIB_NAME, @@ -447,6 +461,13 @@ namespace SHADE std::make_shared>(this, &SHScriptEngine::onColliderRemoved) }; SHEventManager::SubscribeTo(SH_PHYSICS_COLLIDER_REMOVED_EVENT, std::dynamic_pointer_cast(removedColliderEventReceiver)); + + // Register for collider component removed event + std::shared_ptr> removedColliderComponentEventReceiver + { + std::make_shared>(this, &SHScriptEngine::onColliderComponentRemoved) + }; + SHEventManager::SubscribeTo(SH_COMPONENT_REMOVED_EVENT, std::dynamic_pointer_cast(removedColliderComponentEventReceiver)); } void SHScriptEngine::dumpBuildLog(const std::string_view& buildLogPath) diff --git a/SHADE_Engine/src/Scripting/SHScriptEngine.h b/SHADE_Engine/src/Scripting/SHScriptEngine.h index a909a334..c38e3618 100644 --- a/SHADE_Engine/src/Scripting/SHScriptEngine.h +++ b/SHADE_Engine/src/Scripting/SHScriptEngine.h @@ -253,6 +253,7 @@ namespace SHADE CsScriptDeserialiseYamlFuncPtr csScriptsDeserialiseYaml = nullptr; // - Events CsEventRelayFuncPtr csColliderOnListChanged = nullptr; + CsEventRelayFuncPtr csColliderOnRemoved = nullptr; // - Editor CsScriptEditorFuncPtr csEditorRenderScripts = nullptr; CsFuncPtr csEditorUndo = nullptr; @@ -264,6 +265,7 @@ namespace SHADE SHEventHandle onEntityDestroyed(SHEventPtr eventPtr); SHEventHandle onColliderAdded(SHEventPtr eventPtr); SHEventHandle onColliderRemoved(SHEventPtr eventPtr); + SHEventHandle onColliderComponentRemoved(SHEventPtr eventPtr); /*-----------------------------------------------------------------------------*/ /* Helper Functions */ diff --git a/SHADE_Managed/src/Components/Collider.cxx b/SHADE_Managed/src/Components/Collider.cxx index 7f41ad44..6d2c2f01 100644 --- a/SHADE_Managed/src/Components/Collider.cxx +++ b/SHADE_Managed/src/Components/Collider.cxx @@ -180,8 +180,21 @@ namespace SHADE /*---------------------------------------------------------------------------------*/ /* Event Handling Functions */ /*---------------------------------------------------------------------------------*/ + void Collider::OnColliderRemoved(EntityID entity) + { + SAFE_NATIVE_CALL_BEGIN + // Check if there are any colliders to update + if (colliders == nullptr || !colliders->ContainsKey(entity)) + return; + + // Remove the key + colliders->Remove(entity); + SAFE_NATIVE_CALL_END("Collider.OnColliderRemoved") + } + void Collider::OnColliderBoundChanged(EntityID entity) { + SAFE_NATIVE_CALL_BEGIN // Check if there are any colliders to update if (colliders == nullptr || !colliders->ContainsKey(entity)) return; @@ -204,6 +217,7 @@ namespace SHADE { collidersList->Remove(wr); } + SAFE_NATIVE_CALL_END("Collider.OnColliderBoundChanged") } void Collider::updateSubColliderList() diff --git a/SHADE_Managed/src/Components/Collider.hxx b/SHADE_Managed/src/Components/Collider.hxx index 8e63fc83..f827ab71 100644 --- a/SHADE_Managed/src/Components/Collider.hxx +++ b/SHADE_Managed/src/Components/Collider.hxx @@ -224,6 +224,17 @@ namespace SHADE /*-----------------------------------------------------------------------------*/ /* Event Handling Functions */ /*-----------------------------------------------------------------------------*/ + /// + /// To be called from native code when a collider has been removed. + /// + /// The entity which has it's collider removed. + static void OnColliderRemoved(EntityID entity); + /// + /// To be called from native code when a Collider bound has been removed. + /// + /// + /// The entity which has it's collider bounds changed. + /// static void OnColliderBoundChanged(EntityID entity); private: From b5a1d5ea88e61a91652e0cfdcff7263c2b427c96 Mon Sep 17 00:00:00 2001 From: Xiao Qi Date: Thu, 27 Oct 2022 12:54:58 +0800 Subject: [PATCH 38/92] SP3-282 Restructured loaders and compilers Completed shader compiling and loading --- Assets/Cube.003.shmesh.shmeta | 3 + Assets/Cube.012.shmesh.shmeta | 3 + Assets/RaccoonBag_Color_Ver4.shtex | Bin 0 -> 1398192 bytes Assets/RaccoonBag_Color_Ver4.shtex.shmeta | 3 + .../RaccoonPreTexturedVer1_Base9.shtex.shmeta | 3 + .../Shaders/{KirschCs.glsl => Kirsch_CS.glsl} | 0 Assets/Shaders/Kirsch_CS.shshaderb | Bin 0 -> 5909 bytes Assets/Shaders/Kirsch_CS.shshaderb.shmeta | 3 + .../{PureCopyCs.glsl => PureCopy_CS.glsl} | 0 Assets/Shaders/PureCopy_CS.shshaderb | Bin 0 -> 1273 bytes Assets/Shaders/PureCopy_CS.shshaderb.shmeta | 3 + .../{TestCubeFs.glsl => TestCube_FS.glsl} | 0 Assets/Shaders/TestCube_FS.shshaderb | Bin 0 -> 2309 bytes Assets/Shaders/TestCube_FS.shshaderb.shmeta | 3 + .../{TestCubeVs.glsl => TestCube_VS.glsl} | 0 Assets/Shaders/TestCube_VS.shshaderb | Bin 0 -> 2501 bytes Assets/Shaders/TestCube_VS.shshaderb.shmeta | 3 + Assets/TD_Checker_Base_Color.shtex | Bin 0 -> 11184896 bytes Assets/TD_Checker_Base_Color.shtex.shmeta | 3 + .../src/Application/SBApplication.cpp | 11 +- SHADE_Application/src/Scenes/SBTestScene.cpp | 1 + .../src/Assets/Asset Types/SHShaderAsset.cpp | 61 ++++++++++ .../src/Assets/Asset Types/SHShaderAsset.h | 6 +- .../Libraries/Compilers/SHMeshCompiler.cpp | 4 +- .../Libraries/Compilers/SHMeshCompiler.h | 2 +- .../Compilers/SHShaderSourceCompiler.cpp | 15 ++- .../Compilers/SHShaderSourceCompiler.h | 4 +- .../Libraries/Compilers/SHTextureCompiler.cpp | 112 +++++++++--------- .../Libraries/Compilers/SHTextureCompiler.h | 5 +- .../Loaders/SHShaderSourceLoader.cpp | 7 +- .../Libraries/Loaders/SHShaderSourceLoader.h | 2 +- SHADE_Engine/src/Assets/SHAssetManager.cpp | 31 ++++- .../MiddleEnd/Interface/SHGraphicsSystem.cpp | 8 +- .../Shaders/SHShaderModuleLibrary.cpp | 7 +- 34 files changed, 212 insertions(+), 91 deletions(-) create mode 100644 Assets/Cube.003.shmesh.shmeta create mode 100644 Assets/Cube.012.shmesh.shmeta create mode 100644 Assets/RaccoonBag_Color_Ver4.shtex create mode 100644 Assets/RaccoonBag_Color_Ver4.shtex.shmeta create mode 100644 Assets/RaccoonPreTexturedVer1_Base9.shtex.shmeta rename Assets/Shaders/{KirschCs.glsl => Kirsch_CS.glsl} (100%) create mode 100644 Assets/Shaders/Kirsch_CS.shshaderb create mode 100644 Assets/Shaders/Kirsch_CS.shshaderb.shmeta rename Assets/Shaders/{PureCopyCs.glsl => PureCopy_CS.glsl} (100%) create mode 100644 Assets/Shaders/PureCopy_CS.shshaderb create mode 100644 Assets/Shaders/PureCopy_CS.shshaderb.shmeta rename Assets/Shaders/{TestCubeFs.glsl => TestCube_FS.glsl} (100%) create mode 100644 Assets/Shaders/TestCube_FS.shshaderb create mode 100644 Assets/Shaders/TestCube_FS.shshaderb.shmeta rename Assets/Shaders/{TestCubeVs.glsl => TestCube_VS.glsl} (100%) create mode 100644 Assets/Shaders/TestCube_VS.shshaderb create mode 100644 Assets/Shaders/TestCube_VS.shshaderb.shmeta create mode 100644 Assets/TD_Checker_Base_Color.shtex create mode 100644 Assets/TD_Checker_Base_Color.shtex.shmeta create mode 100644 SHADE_Engine/src/Assets/Asset Types/SHShaderAsset.cpp diff --git a/Assets/Cube.003.shmesh.shmeta b/Assets/Cube.003.shmesh.shmeta new file mode 100644 index 00000000..628ecd00 --- /dev/null +++ b/Assets/Cube.003.shmesh.shmeta @@ -0,0 +1,3 @@ +Name: Cube.003 +ID: 71245919 +Type: 4 diff --git a/Assets/Cube.012.shmesh.shmeta b/Assets/Cube.012.shmesh.shmeta new file mode 100644 index 00000000..56d2d0f5 --- /dev/null +++ b/Assets/Cube.012.shmesh.shmeta @@ -0,0 +1,3 @@ +Name: Cube.012 +ID: 80365422 +Type: 4 diff --git a/Assets/RaccoonBag_Color_Ver4.shtex b/Assets/RaccoonBag_Color_Ver4.shtex new file mode 100644 index 0000000000000000000000000000000000000000..effba95a24ad10ccc2cecb37531e81d2061b7bba GIT binary patch literal 1398192 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 ZGyw1Yqx`SW9`@2+nQZ5Ij7abLe*n!Gh{pf` literal 0 HcmV?d00001 diff --git a/Assets/Shaders/Kirsch_CS.shshaderb.shmeta b/Assets/Shaders/Kirsch_CS.shshaderb.shmeta new file mode 100644 index 00000000..61c735f3 --- /dev/null +++ b/Assets/Shaders/Kirsch_CS.shshaderb.shmeta @@ -0,0 +1,3 @@ +Name: Kirsch_CS +ID: 19931255 +Type: 2 diff --git a/Assets/Shaders/PureCopyCs.glsl b/Assets/Shaders/PureCopy_CS.glsl similarity index 100% rename from Assets/Shaders/PureCopyCs.glsl rename to Assets/Shaders/PureCopy_CS.glsl diff --git a/Assets/Shaders/PureCopy_CS.shshaderb b/Assets/Shaders/PureCopy_CS.shshaderb new file mode 100644 index 0000000000000000000000000000000000000000..9f1b0534b9e2c89fe180c1dc931e2f455964a012 GIT binary patch literal 1273 zcmYk5-A~hC6vhwRiUR~h1pKxW6&0Lbs4+3>jiy<$WDvb?O4rOLrCUZJG4aB`&A-S? zZ%llCFMUa0@^IesoTuljUF%QB+-bLVub3^^vaQ<73(7XECB|&U7M+cTUx)qEYTSSQ z<`t4PYda;Hb!h@w(w!uENnlmDCLV6X-SMenda|wTX20chR5cpL(P$J6zr^Wm7N1r> ziYzYjGKs|F{@M7;$13&mB*e3I2$&ZjyKhOeC@vIuW=FnWq~p+r^1HHd z0R6J#^-l*q`Qdn*=&#C>3;uoWGndc5t~)i+Z|naJ*-#+YmMp%{wXOR_U1nIan{}LA z%|oy3i2BURK}&sn_Q;{eJy~j?_wi774srI$JmlP$k9JQm`}GN**nz;e==~SE)6;<_ zV{Z121`vCz_w9R>>*o6_hHsu8*fHN4v*I&1-w^%>`Q%&^*yB(6?2!6!N6NxJ{cl9q zOYXYv{x@?d9r-o|w8TED6Y9cIhn?LK*cU!}zC|?0dY;|g7tp|u)H(0$fdCIU?1Fj8 z&m6>k{+{k(?K9V|z+59$WA~404xU3UW~P_N0&#Lt_lZD$cEEdjT5~d&+_Rb^kJmk~ dIeI))X6D)#cpg3RJt0*c`lT-Mf9mF)@E_-PRet~g literal 0 HcmV?d00001 diff --git a/Assets/Shaders/PureCopy_CS.shshaderb.shmeta b/Assets/Shaders/PureCopy_CS.shshaderb.shmeta new file mode 100644 index 00000000..8cb091d7 --- /dev/null +++ b/Assets/Shaders/PureCopy_CS.shshaderb.shmeta @@ -0,0 +1,3 @@ +Name: PureCopy_CS +ID: 29659779 +Type: 2 diff --git a/Assets/Shaders/TestCubeFs.glsl b/Assets/Shaders/TestCube_FS.glsl similarity index 100% rename from Assets/Shaders/TestCubeFs.glsl rename to Assets/Shaders/TestCube_FS.glsl diff --git a/Assets/Shaders/TestCube_FS.shshaderb b/Assets/Shaders/TestCube_FS.shshaderb new file mode 100644 index 0000000000000000000000000000000000000000..863287f68b0fa46d45c3d7b3615c5490386b1ba1 GIT binary patch literal 2309 zcmZ9MU2_yg6owo2gBU~-Fa$-G4FMF;7-IMmK^Kx*QneH*LZNq4!)_;Ooy@MYvng`v zoj*vq@y=hx1yuPyGu?5ZQzz$~_nbbTJ$vNslqpW_=;ASBj+kk4!mO2$nKeg+n1cWP zX~|!E{*U;ynKE0OFQWBdo<{>a?q_b453|Un1N+LQJLb4)7Wccot=`f&A1tljTqg7< zrdDJi_DMyli$i;{OEG*T`doBXbYIjF&FBt3DpFESl^OG|0@UT*?M0nu52LXi#aW!& zXuKN_Y!(e){%ZUA_CPnHvC-DUwA)*c`lC@a&JPkBB`&qmz-7wh_AR-JINr~t{bVwzIyB@_?X_VVMZd#I z{%DvCGqok8p&1#I+gJG{v+AJ4X2qYx`DQj8t;Kn)={B^R^7Q@XrX~c&Z2kQW_JLRM zXLfNi+Knq18+mCJRHvaBr^S`aW-d-hXtUf=2{Ev71{9$~PjlkFHt98U7K0A;1bNTL z3k5ZG4;!^wH#qdAzQpb9=Dqm9W~DbVc@rDyN)i7{$(*MCg1oOH!w`uLPVC7(HP(vv zw4oQqe0f)z`FfhW{9t2E$g$#`y_eVZi{W<_i#OR4anRY%#X|dEUyx3|$BGvAvgmyR zh8=9C;zz$=`lJr;vJbGfh5rHluM_jMBEuIHk9v^LNTQ#%XkPw&*XVp3ZT;tG z319GgUS|hjpJ^M@;`o!VdV+pVp2uat@4V!X#nFjicU+r<{KdwcxkI^ z24#KN=mDKQQZqTvd6|15N7xVc3&P1?_F6CAn$%)O^n67!z2Vc6&bLI*;N1U8oLu1K zN9XrC6{y>~uReQ(VZ)s-a;w^Ew z^F~NRyrcij<_i(?V($0l$sEp$z&omv`Lsps2_J0CFZeD_%oT4B z@xGJ(VZ2pg;KXA$w?!cyHg-o}?CXvQ`=)$}f7fH+f&TRUd@qdr`269qdy?rB+XHQj t?;MQ!*z=Df>I-vX=Rb+S@#kHj2mgnX@eeiP|40Omf5+?Z^n&h){sW9z$CLm7 literal 0 HcmV?d00001 diff --git a/Assets/Shaders/TestCube_FS.shshaderb.shmeta b/Assets/Shaders/TestCube_FS.shshaderb.shmeta new file mode 100644 index 00000000..3a647313 --- /dev/null +++ b/Assets/Shaders/TestCube_FS.shshaderb.shmeta @@ -0,0 +1,3 @@ +Name: TestCube_FS +ID: 18415057 +Type: 2 diff --git a/Assets/Shaders/TestCubeVs.glsl b/Assets/Shaders/TestCube_VS.glsl similarity index 100% rename from Assets/Shaders/TestCubeVs.glsl rename to Assets/Shaders/TestCube_VS.glsl diff --git a/Assets/Shaders/TestCube_VS.shshaderb b/Assets/Shaders/TestCube_VS.shshaderb new file mode 100644 index 0000000000000000000000000000000000000000..3d12507b9b6dac6ea9f270db7269266f4030a2b5 GIT binary patch literal 2501 zcmZ9M+foxj5Qawx0YOAX!2=?QiVETp#3LYJK%-!(+@_|I6}M{Hq&5qRSH6Nik5@jG zH&*$7vpcCRC)G9mcmLhfGu<2W>!@+7yKAb~m?Ng&44Su@$(%G@vKTX9%5JYz-&g0_ zX=Coe{2eIAO}Ash8PbnclI+7zedRm<07SJP6?R6?kD>kM>n6I40qVtPo2(P?8hCapO(%ln_lDfJ(~teXrs-z5qx#NlJk)- z2pb(Pca6f`&uP^j21&-IUfxM(-P5Ksdfl7tMzzhjo!Yn___Xr%xVH@BG}sN2HJe&l z%4Sw^;%^7Zj&9{jkTtWD6JN6(reQO7wZNw~XIHZK;Wxc(b|-w)Dc@=ow${R|hE5!v z$G0Cv9Ut#Se_7PXkgVFhAhE7QSBo1Q*;~F4>E)bDEeEYPHq}l%4^c0~b4O<9OEZZY z9}*k4KQ)uRjLSUP?Ap2`wvwAK`&JYixqQr;{b1wWAm#{D5r_Vc1GK>O7)&i-dIIJx zz|1i*GdX6a@%KqKbPDgrg2VDQ@?m55HgaO)ExipL8?#%H$M*rhf4eF9SQ}ztBWI7p z83zpK#D6w@;Lb)~;{2U>=ga@$NnsXu=FPcdR#VA+yI>ans`la=@y=lGGOSZLXHp1^ zJ|eBGeL^y-c6N>T-cxF*uUc$;bV@My~|9F2W8`3h(Dg| z~)x32R(0&G*h3*fU>AyetMEIl;^hd3+6{(pl7SRy*gB2R@kD z@-ec@s!9?UFa+yg5iUiS8Tl7W9`(<`Q(419Upf1VE#L>ac{WKCB}STg1;t>SZehAs&x1sGwLU$U%RnB-r85_p1_e_%p$9e2(kV$uTYQIc`YD?sMFfP7Y>2!7)1wCx z`o>e*lr&m7}ga45P4t6;7=$VB6yc37sEaf(B9ouqlqX(Y1lH2IVwz^0E zUPy>vmf)w)Ka>~Ws)Y05a0mLnE@5{4TZ7^G+FnX8)>aY5#`1M+NXJ&JZ8NtOYkMUd Y@$m6eo3G=wbY{fY0fzrqSr;Y$0Qhjc761SM literal 0 HcmV?d00001 diff --git a/Assets/Shaders/TestCube_VS.shshaderb.shmeta b/Assets/Shaders/TestCube_VS.shshaderb.shmeta new file mode 100644 index 00000000..23c5e30d --- /dev/null +++ b/Assets/Shaders/TestCube_VS.shshaderb.shmeta @@ -0,0 +1,3 @@ +Name: TestCube_VS +ID: 29315909 +Type: 2 diff --git a/Assets/TD_Checker_Base_Color.shtex b/Assets/TD_Checker_Base_Color.shtex new file mode 100644 index 0000000000000000000000000000000000000000..c99ff515093549bd44dfe4b92bf310d8aeb2c2ca GIT binary patch literal 11184896 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� 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 Ql;=Ny+?GIB4<^cQA$1Gh@zo-0-q7mMBn z9Q{Aa`Z_c(&f06<7xx4HZx|nq|F1(HWS@t424Ksz#Qm#4|T>r-X7VgXUfE)8e z_&@8H!IR7|}# z%HAM&2Kc+tFE{Xi-uH%{|JULF)VEvfKZJ3?@pGeIL*{$mTE02{A8z`!H{<^Zughot zR-^%$cf((cYA>Q*F+Tv~>3M#peQ(HyI>!6uA`bvgUzE}N4DO$iZupfsFJ$oETjc`& zZx|W;pXCKTUstmh8^LFA#hdd0APs<;$z#8e2Vl|SApGIPBZBacBd%}*c>uTU2hcn- zGYEg*y)P};p8)v3WI;Xv#Oas! z_p?0y-8U2D1N?y?Np}Iqw^;4=67T@Dc&wRazeUt|UT^PFh0+m_A+H_SW=+*Yr#NUb674thx`?z105ma{CC_@u97FPKkXaXj_cfR z_Z!UH+%Z1r&qF=-=k5M!3GQ>Opv1BN=+uE_!&5=#|M&Y3`taPRU}x|90`^g#$9}SB zU|%E}(}{J6b50va!`wF>dH!s`-D`5YjWqH9ABqp$yAFOCz>{}q$oG>qnZmkwwPJjH z9C>lBR&`uG6cVS({?2Frnf}Y~ z+#>}kyYqW~lDn;;W=C4t&+Cu;N&8XW*LU*qHZSty|INlN)x?SC&-8wpW!Kyu?3>+C z)1w;8CUIZ;%+C4TZDQRI@0YU#;QyCC<+(sytW^x1qHOqkUE_I6MQ<;0a$ULe3F6uR z_Hv+<{)j{a_ZP+YM?<4dzoy-um*0SPnl;KxyXvyt>1}}k{jSbpXN39rs~+_1VZQ$j zuC;5)16Wp_DxW&gUbF0X)>^;=!2G=!xQJNy$v?1Irhxx{@3m+$@2T8f?$5eyUxXel zTb3Otc}}eRzJKe+qrvr+SU0QLe}B8<_qQ=W_wO3{n7@JN?wATO_~ zT5elkxw*R9Gj$-_UA=78FrPazKX1n6FS0uZ+{k~>*M2_k1&%oCdGuA{_tD-)@FyB- z1gY%#V$>VB-~ii2zups`L_3E>4O)c!{oi;|XT8q}ohN|*yYDYwJ%Z~h?>KHe&HJ9o zDrsUnKl#ixT-Q*uHSzL&=uP*))1?vi&(>V~CwTld<*%b>Ae*Nj(TSgn-Y+1}Jn;Rg zKD0OZAco>(**PE~u4H{>mAdA8e9ucAcL(^qNMH;&c2VWE>u;KV$HBB0-y!hNhZpvr z?T-D+Tl}6mnKpcsK0^r>;=80Izg41M8<$nJ0eY)AmKV^!-M=Spr+!BD9jEB8Ot+^m zu{^9gbNQU(+YUU`fb%Ttf4Yq4FWK8#%J++nzb>&oF1Cb$|4&rxS9{ES5G~((wu^eY z=h4?9yq_0-KFTW0(59@~Xi9AJf_$m`?)mt<0OJ45pZ$fG8n~a*q6PdP-z8?=e(;Jh zehwpV7W?m3{Gax5d(A@J?alZ<%&cYTC(avdDarTD{tfZ}^=J>+=kkKgM>|b?xvC3s zaG1X|ILy&*l?Bt+%82_r_Z7>NJ2@_*!86|Wy1Qq_Bb>kdt_D{RnGiU*ke0$?RGou z6;ElGEFXX+BS{xz;Qy_fHyI2Tw?#GMa&hyL%HRL)81Vf1x{DSE@c!K9MfOGD3wYb^ z6C)?c1CUaEK9e61PBhVev!2u&fV(&EyRYvB;`hKEdu8wgTHc%b7I65T&0u^I@1GqI z3TO|_9bB=J*GbFojPdt14I6rS-L#OE%e(|#z$U8FMVhW(_mGG?BReI^+Cj)#O<2F7g9*KWN7J@5#?5&Of~6=Rc?4>bCZ0 zw4t4^y7pwRFpn?(R4(%2!JoKxZG-6j_MhfMf#}D!N#P{rk-L`cryoH9ae&W@^gE|G zFZ=!07uMr=)8@t~{YjFnz%K}Yha-Ot{SE!y&RpVN<1Syaxh18CPHKEVk3nzInbk!g|{de)F*Z zA?d$lJq*KQG0OmaSDIx5JdX@N0PP4zCH=9%eC0CpfDY&yeutkJfD_}Tth&#~_S>b? ze}%X+p;XI8f3%7s_J75?@LsBm>j=j0F}BNAzb4VY6;ID-^c#xW$pQLj5mpnR|1a87 zGe>;ixilxh_2rN(U&)65Qx9>U)V*cEdpA?QGdn!o3Hk0r7q(~c{#zyed?np+gZ|W~ z?@&$rH=)TtG5v0~BKT1|k-v2z4mAM0k$$-r#NShv^p^|#U4K{x4q0C|tQH@VYVI7U1OYH`*ld(eDu4& zaU%6L{jzCa;~0-SWAR6+|DnMU_I*YC>#!>Dcu^vC)j$i0bDYBVgB$nk)u^bPadXM<@8c8tiPgR~?PW&?8>9CT&nvk|W%<@?w@*-uy zcXD8F7P|EdjTiWw^;&f`$3t~(8vG;VXG*2!IsU)?wJ~!(@XU?$v0PQv5}BxgouI}| z|EQ5>Jlbhjn_V&S!CKvBEkaq5L<@1Rv_5X;MOCm+u&nCZIODhx&ur!wQqsB^-yN1^ z@CBn4C9C$#7UKGs&HXM8gb%()GzLH3S7FX+T;a{Rt-luk4(k) zJ<)*nOBty`&Ic`eUn}i}mcIKW9v1Y9&ON^F<> zypqLdV6kQ8Pfb!bz32Nn#~0Ac9qflh!q7P$9EvKL<09W;;rLcmB|!eKFc3leuCM&T zpXF(^gZ!ZoN~c{#y=f2I%YPF4RX`%&zRLF*UUht!?GnWXX4C^qzySV;{K%mN-bfVj z>^yEHWBaqw9>_Z~&2nRtG0Jv$>n-^t>f;JN8L+aQJ*qR!--X_J_=j;`jR!m{fp1&uI zB;E(}a3mDsbH{*(Q$O~kQqbce;IW#Y@0Ip7#~1V_nc)3pMFEZ-t(c2yz;Ez9Fp~!E z%jbqATvw3*-fY`5hGs+a z*<1ENezAk^b;x2v`@HHphD3JMXUXQp{ekO9t7N{Hs!AB|Smz>P;4h~uWF!(`zYI8; zhZp#EfB7t*b0}%-CeDs-spfG@tMl+W@DL*4fx+6XnAc-FSr0)MTB9Gt&vm*K%zDr4 zc%1wJj3=}=#+Rax72^Jq;)MR;c)E9n^#R-r<3dTRqR94nBeh8ntb5NAfG|M!hWvsA02m4U)8kK%lDThp^19X zQ2;%LM3xndZ}5>u44uanS>Dh0PTDMktS9n)=;nF4j&=c0V8B^ag!@c3)gtc*-WTu9 zc9QfK%%6M9##)K%0|&!~0K{qFJ_BxJ#yO%NJ6(n>2z(zyw{7A)Dp}frkA1rgysrYT z7bAxANzT_Q3}4Fe>T1LZW88H2Lr;L`rBo-&XHS0_}PCNSngaA`dLekjGRX#7> zxP$LeR1_B2&aH22U~9hWIu#%A5r_5rLs&n6A0eUS5YE4p>c)Juw`{2*DSS`MwAUQB z{*&JuCEf^s{grj-Mm^znR?Dob85t ztcnubZ~khD?=kZ{ocQsi<^A(MQZD|uIR3AD9@l52wU8(!NyB`z(rvZaupX>qyot|T zXC>$7X)g|LwOWaj50_g8iKBN*BE~Op+S~s)#NXe1GojPo`X17ga~w)x?fv-nHD=!X zcF6$V*;%F`KA-q!|G*{iTaLK0o_rEK0oW5pwZ|O4=uiGGJpCB*EFE$A_ROxzW<0kc z74iPV&O4E(0Qminh_?dQmZxpB>wJbBV%K>WH>U7{pr75rpHr=FUS0mHcoPV z2v5D&LHr(cLyXU>$XjEinC~C^B^Xz5y|zQs7+;>&^f{DWay+%0GW>M4DKS4y(T>wU z?^$U7=_K&}BQCfXF;8{6wp`Z3jQ92-Pe&(k`z-&$@v5qngTK$_jZeEs?mh?kMqwY@|VAFOv4v-KI2B?@@lOHa^P!nVpLxKfvKKf4lVL1oDA7RPOt51bG!^N2qsW zW0QMK-fv<$&HMp>Q~j8!&!Z~a1O4r^w{o6OBVg(X#)G73GT+B$w@O#>9>G`~;|9Oi zwxB=Ay9n4gPs_4kGuM;8(g538RV*D`cRcA{tV>vD5I4tl*pM}>?^ur{O=Y{?S3L(i z3;VUs8ez(m8aCzJfPR#}BadxtqN1TJ3_fHI%8DX)5WjZ<*JnTdbmn>jdI27XBvMc2 zW*7Jeu!Dst^Z?`1!u4Xd+nPi9heA8np-$|V(;*k4zxG_1PqTl<;eX*gVWgv`eXdUO zeNMZi!w03`6!-tA>xugVXI}hq@%~%S`*rYtn5hP@E6>k|_o>qhJIu)7i9+*UuQ5OW zcn0t61P%cA+uECP|0>{*#QiZ1`-uCa{k<97=vKVk#Q)*QyMc=m|0iFd9)7j|9R6R7 zzs!67N4d8S`wx78|9>RzUqf7q&qp3keAg5Iryr8||1bi)kQcCWc-g8|x7NqR|B=Tu z^ZX&;uHbDf&fr?Pz_S>~oWVhJflCv|WIG$gXLsI=|1VnftMLD7{N2ErKZO4y-rQ}* zNoV9o;s3?W(Vd_@ZoJVCAI7JDb^iYqh)*hR&c&Y>$OhYuW$r7$JfUmXB4Y{KfyZx^ zY@c70{~!DZGjGDJ_5bKHpLb(Fh0ODA;L!{Fx)c8g9a*{=|L6B{G5Ux7Oxz!8y>?{{ zX2}{xbO?{2%>9J;QK2T+zG^ zae~NKfPA@t1(s#>6@F!}1jj1ze;mes01M-SJOCFmw?a1i0QB=dTqkZkH+NS}gBYS; zntVS>{4U>GzmHq~ufqR-Te$xM-d~DOI!+jGHS zXoDa8Z}~u2Xh$6XxdW|-B>67j^~T&V^66hYkk&-x0XTOc94a!UoNKiZ&sR?*9hB4B zNvQ;Qe5(-dV|>5U;Q$Zdw&yGf(fWm#@Z5r&jl})uj;qcmkKzdO>^*rj@43dN3&;Zy zX#3|=GlPsjtMz(^zW9>2dGK`u@9AwD7)f`W1O5+hYT_L5oT8i^Z{GG)0Q(In-PaC) zRr-Vw;XVaF_o-^$Q|E$t^1q7A4^U&Pv*CEKWOaZ4cJLCcHfQ%2pUZnH)O&CEi_cvP zTGzZe#C!q|)igB`KiT|HLIgfhdHk*-G4HAD%7cp^TyZqGq;m5f&u*^shh}F}_2Bi% zhrT+_b^UUBu3E#&Zuo`=fvZ;9Jxw;^U#VDeF~56fm;K)F(I0PM!r=Ws_qnVrp2u-c z9>Bq;p2B|QD=UBc)4{<8;5ztR1x{HAexMEc$gvN*tf=Gx>~~I^65|hifFhx&r?1Dt9V}>0fP39GjuvtYwof(r%OF+fDytAkcyDB;*%tYHVzPTyc1Imir+e z?3PM$x2>z}jxTi*r>%WA;`bu&^|IYQA92vJHw?s$0>^#q$~BfpM!$In<$$y=LL6Uy zq`8Uszv{eX@cP8bRCg4(o}@J%jpBHh+Fvs1ZLe_(&QJ5abLqee{{DKG`Y3VbpFfke zBzISP&8VT?&-0e|eHyb>L(RonTRL}}SocVWfIRg>b;fN%E929{O5uH!`+K9$@w)Mg zngj8(b)J%Zg;GDUEeM`KU9tNs2Jh3@bp0&-%rkE`Ze{-K*~QCdyYT+y#r9AaaPZK$ zQ7fX|W{gY2#QTl81-yUD7xIwb7&yqXMZozdy`cijXQvSNk8!eW>cIKn_Rj6v`5@!> zH-3WG{bSyr&J(X+yWt=4yI5ECiM0jv{5#gWb-;I-vLp8B*LlBr z^^O6y^Zfz+GTXnkwDbsh07oa%d)c0U{peAhIAJXEZZG`-Pc=5AY1c<@3!kOmrN3v{ zaq~J$_%XKUoce`*ysl;E@$JO#r@pk`$>TpVRJ>1n%}>qT|ome@B|*GC!O)?xqA znRb+`!bQOMiz-VLHOagL8<3Edzu)~OW0>u$cB=1@j}aCEljw~KajZcr!u^XRIl}wN zEOaAHYKV z>;j&D1OIR5zFAeo|4sY&ru_f3A2Rqq$2s|jjQ_`HhKc{L-LP?E_DA6U>oKoke(3_P z|K+NxgOXW3NL(MsF|pt{{HwrAYKlyIuLyi3&NuvBl4_(v{5~_!{Gg{@<;8-)`2S9+ zO-4W0S+n+Epwy#H$+I*Cg{r6$*}S;Pbog>Fq6m#5#4aNPgE@K?JVuZ5tEytH=+q zGZcz8Q~-Am2ZCK*@By+d*54)GpZh?Empp*Lj`r{K`Yh{UBV}kH<{*9_7Egv)R{KN^ za@Y7ucj{LI$MAAFu*g@tM2&G?0 z(~i;vPh{J-aT*me%W9}}qKQ|(;NyX1*QWy_de@dtJw}U4Z zxR5k>-fhdB*jE62qK$uH@>OgnlOF1Q-*iWSzu#wf3S5tx=CQvx#$%-O$7A%jr4!5j z!CL#=Lp>PeK+v&)v}A{U7v~%o$0Me1Ov_;=IUzTToz@KbdEEgythID%u3% zV}yv>N54w(Ofmc!@GHLF1wRnt1#LpddOYtlg5;o|zHzM8%ICj}z-0Qvw>-bPgnYNE zEpmYCR`bqdgM7~HyJ^HZ0{3sxJ@mh)kZ+jxHA+f=YakBkX-^Z^+jQ)mB>jpH=}F9Y zJbwoG=T+Bm@fpO;BF|0FVZ_}5ue*?LVSdwsbb6Hc8CUuo@Kd=8?kxrW4$p+cF3~R; z5~CXNw(=g;S&!>vLF%TTs$IPLF5`kuzS-Qe64%EL9g^se>_-Ajw6D9%YQ=cTb_;>t z7Oq2^ED-f-|4@@oL)HcI;oUdsYE& z4S9j}`OB2X_;tKD@=c179<&4Y1<=yGuDtvn;I~WMJ)54b}|5*PlYk~hC4Ptt;o@YJ)Bmy8G0NuOs z=DYx)0bqVw=_XHnrF*3t=Ocb+iCco-#FY4FK}wK?ANOzjNhQ;(qAoYeoG;`02ua zmVsLXuOptefIES9X66rz(F}Y+k*V;@ZX6GyoB`J2=fxStWK+q zIMQ&{SGTYp=r+WmcDfL53S1xj5p@I^*r@Ft2pmC#}9a^ z!1=%%{pQdS!yrt7?!0W)cHWKK6%o|d`{Jm;;6n@Vk;P~^vBhkKTp_TK7Y?mEezmuT5 z)9#($I_T$lkyg{MihS+5mV@^d#cAMu&=2Sx%Smh?Pd{d>jdA&>U8fYM%==2M0n;De zA?qgorza(oFVH6=LJa5Y@ZVD+52%Sh9`Bwy-j4CMYIUxiyu;eML2CnW$go`=GwtvW zaf#UuaaEw5GCb#0Se{ca<9=T)W_y9ZG6p=) zJ zm+*Khsow`ZsgQu5LoX`Qs%+(Rk57dn#MxE&%h_H@$yPv|`H~dE_fw9$yzgb?o62!t zn@%UFXM<*5cUa>;Xg-wr!z3l@h*zp<~lRilI$yVqdhx1 zcCcNg-svRUPnkAmDfP%G_&VTE#B`nS7m@qaBJcvjz2S5r-cv(D;UbPpSq||1KnKS< zjrF@v)A&5UUwn56_d!^<%=<}#fPRZs#H1bf@_lttlX>0jY&^#6!fFzF5v>4i3i1Ak z8x*ugt`p2-O}!n?%ZI+^V191h%IgwhS4R=ex4-f zsUB4Ve!+3C2&|tV6s%?bV{zJm9(B4pRHJ{QqSN*A$lv#}KCu!7>&ZmL-%I;~EZgmt zR=$5oG%it3eCa;)Z;m^*t!|v{Vkz4CIPV*fly9-$qycOchWCfQn|hD^bAX%F17DAZ z%z4!aqdhxaa#zg9=Sm~9yZL>RPAlESyOj8L??So!C!BYETZ*xt0M=!!JLb9|*i4>P zwI^odcreOWW1czUn)VG?$crhlTSHuzx6T_qv>&8oLx}AZO{51XzdCx|#Q8&_*p4_@ z*WvCdjq6iy#4l0WFcI-NVlsY;<#?)pgyqn{Li}gJ{{2hY&iu@Wo#)=&Er;lbm~zBN za<|pjbURkfw*|Z$tSvbZ0CzP;*tGnc#@#_@*6C^f4?B@Qp13WRBQwba%k9}o6P zve{r)VH_qOCI0E!^z0MZzXJAce^p-s*8BhwJ6|_?Vy9m#ztyQa+^Xe%7NY97g?+CqNI25(T_NAzHUzAf;9<+55O8PL$-5SKNwVlK=)^og`8N^OB*` zZaMARBKtLSozYsVD4S}lsyKfgT(KgL_M{XDA0h55>Mc#2-)>tIu~LpnqR9K%i}Uh1 zpF^K6a~`x5Jz(-z<@fC+Lq>uXJV&rvV9&z8h(E3~2x{qCkP6ltyidmuin)GNNmd)? zWtW2Q3(m{?+O+#Puh{LfL^}mM2*e|Sj}}QwSnm+eR8TBXQVyziu#mR~rMM<4-VP3)C5cHUOzML|0s$4|1g^o-?*^90rCG?5VeW_0}lB~rXCqd{2zGahwy*m z9T~jJ#Q*b=-?W+jyoLP#XMS z3jCk?a%=rRy8L1MpSX1u?sF?no5B4vl6(O6Gx2}61Mz>joj3eC_&@vY1~20#{2%>& zYrEcBp8PH3|L6GoMeY2b!~Yj}92xvSBiWw+xqSc{>eiZi-oX6P82=f)KSQ3y+MDD5 z@$(1y-f!T~ZgZSu%8dIbUt}Bn#h@V!Qtyy%;~?>W-~^UmkOyEV;tH#7hlvLKNG z@qgN%lp8m=T+9P->wW+sKjVFn?*RBECE!T)Rz3Q-<=-~`|C{3e3wXa#Zc4;aWZL&X z%KuvYKf?paNb&(Jz~$fP19acY2RH*f5X-EAd7~~14j4)ch}Ap}KVbeO<`ev^W#-#k zrLb$rOMWzPRjW9df)W4O1!>m*ieb{+ls6Oh}MVx{rM+ZwuA)W z{?`tKT9?`o=l^W~;dmd<7u1xA^9Q7u^aaG>Tdg(CjN`We1}g!s|H;kE4&L@0_J^&W zJGT8Lj;lqB824XbIrbL$0IxpTacKKX=YngY&nBMV+c5Nn=gtMI);(6na@_fL4tW5* zGkTK@zKR%$*vJ#;o|?KuIo{z(LAD8U{7T+aa`5QwcYKQYzt_8V$N8WfEKfbF67P4e z?w%t4AM1Vdg)hEz+f!}Xui3UE|9=zWA#A&@R`m8ZMq!^;{&CV+n!D|E#qCe`47zcA z_GjtjN_=NnW_~_*9(;hR;o~LT=e=K&LO((N=fZx&*#DAPx5;MBKZf{T?sI$WrTUuT z;h#ccKYRGgC$aAX=fz2Uf4_u3;x6C)?swrYEo5Gu4YZ5%(Q(8p5od0Ge_N${1>%uX ziNitMQfp{x;rDn^p$tD_q5Cm?EJ{0imDAQ?+SAC3MSrd~-E(|B?6;0b#e2yQ=#iCH zekZkfMvVW%JyFr$)1wW+zczcgd$j<(v9MUezSHeBy?V=KH}bz5zMmm3zo_!f$B%(! zvcB^3M)SV_Pp#~XDQDZ^=Y2b`6?y;HS4JGU`-$scnYb?ry{p^(;=pC%(f1{_qNo>m ze)y!!cz*4y`ZUk`aZ9)e`s>fu69<2JK)p)5`Sq%#K^)t7 z@pzsWxW2mD7$q(mxcgXrE^z4OJM@A{FYx$#$NTvHugl?m+nUeR{a7}9$fHvC*Bv@o zJm3e!lFf|s$3ANk<*FwHfl`!oo!`faMB29(?YFvT7V-A@{=7Z4`in1}5AIQ<-je6e z2j6Ub+{k za3ja_?yo$&lI_sHUzuXNT(~&*C~(#qZ!B!FH)ZA@i-SY3B zE8zJ9$?HDi_(<;uJwkr!olQEwzx8NK1NAMhxEp?yv)FW6GZ zJ8M6G4;76+K>huPJKJLXKAjgst(48s55Ct5MK$B00T+Oufc;Vtx0;dkn_2)^nKFyg z9H-z1P+EQkPawk^051S1F7N`7=L7GxXz}ev7kDr-{xUp(1^nMg-JJg)^8?Ob;0q8B zn8$)Vg#IkY2gZ8LS5TX-1^F>>{hANs`$aW{{2nk&sTrs@;`}iW72-Hv*Rme-6N=ym zAaA_KkcjIaKHlj>|JLL=oZZyBXT<2XGv4;Pu@2>qF2wPB^g(|+^7}`whnKg5Km2TZ z9Q~7B>78#f%@%nEvwNFXxH=LD?)7d(V*Fyn{dY7-?c5J(MXnXNKE~r%1bO>& zn+saI%=}E6wH0yxA1{}oCxcml=E?FHPQ0P2)ZzaBuj{Ey1*e9wH_ zr!Sv75D3D3zK73K6Jwzu?5#_$)p)r-fYh2(K#Bc$+9?O_erE#D@h%_K^lhkzVcZU$ zM`5KHiZ*e))}Q@G_2kZM_g_>!=wlrJCkJ0K$E9L-+ByD49v4fI&%I{Z?Y?(_<5xC> zwgRsuUb5`LU>gwYe>{~F1kY<2>k{$ct<&KX=MI49RaL#&-Bwt+3<1Zu&K(GR8F~#* z)YnS?9}(Z-_uTH;Eqaf*jL|#F3*n#Yh;~gD!cW($m3GiS@bn+Prcb~hu&MSk;*a6C zNtE76e?duH-p=z!e-MrpV!Wlgzn!F%El2lp{P{bY;a7$~z0j#ZPu#QWIQ9{#ugNcZmvJD z4*o+ep-C*yrY`*<{fZ7DvK;=TikZZW$tOt9P7iQi>`_l2r&NMNz!|RsUs-#Ke#_8v z>Kgi=1WDgPf1(YJ7Ur$guU`|1Q+t6Q^Zd@Gg248={lz@QabAUgWUWSjJ~>sPR!b7?+t)Re>4T950NeuweD$U`8M zn0Q%xRJuw$WYxflpV8mA$xy)W1MZvKfq8R@do;cMGVz4y<&#gcT$L)B;{ApXj$$2Z zuQBv}&oj{p2A z5YJ~nVY+x<>cD&H=QZ>UFW^?m_cLO_KDN^{Hk-hC-(wJ8W}esdQA#CWmiYTy?=0{L zHb)he*IiLUroZ>d5h)5SEfbr_gFt_un=<40TM~?~LYxo+ml$U?eYwWV@}`szIC?$u zU&`?u#ND^TUqyeX-(rj0@>_@!O)e6Q*^-J{U zHOH>QUkAK(Md1q^C$;lw;FQSY;fanFLgqT-X1w*Fr1qP7Zw-H@0s1-nv;aJ?u+lS< z9;4s=k!@%9^SGy~_Ie>C_zY%w#MlO2%BwD0$qFZVs>%4nX1xDHW9=ccU!$QY<(Rk0 z!+yOx6um(GFV9z=O=5!UUvo^Iv&a5H0^ zA`Tbe3A>UfWF26DVD3|v0jefIW&i?l2531r!6uZ0!GQ>0lkP;q>~2n7UZ~7$4eZv&vNtM-f^a` zq0$!6nnd)csHKg1)Gw?A9fgoc$L?o+4Toe<>fyMD^)u$vk$U>A4R!f?98bNQFzq}^ z4ua=1fq241f_gSJHHG(E;_g<+1Ht|%;egEZC94%Y(4xw!ez}Y7t$}Dn+}J;pm}k31 z#Sq35_p9j7D}+?TM{KO`3H`E%rO_yMg0mBs2}anL#^M3J-xp2vR-$N zzt8B2dD^{aK}Y0sAJ!N*9<4~q4#6Ck^XYlkt0NH_qP^bI5;yUKcy4~q60C!fb_wg} z68Cd+v%_2$$F)}AYNuVJqnd~Lus#1&UB&izr`w^jo@sqX=kEb^;rN=T4}zbBnYeDu zPkaY?z$N0^Hd_bQ0kpeXvYO+3_nvLztVefAF6xuxKGiYQ!1w;6d-C(@VVA2$3i^@b zhMK~zodADD*V#TVB2O9TgL&vP+a)H$0)zCW)8M;cd@D9BN-3ogZ@YlE5pOYezKwMs zINPP;-(*>ve<03&A1JlKZh+qDV;cBbWnz&49JA9EJM0u__ZW&;L>`{1$k5BvuAD3( z+<^ITY^>4DYgGF8hKKFgp~X!;pC}Z7-;aHc{DU*Zr$Qkq{|fM?hnqHSGVxYPvJ!Vv z!h%F8hB~lr?JYZ6fc)cluRWuqtI4Mr-jc$+0G>gKUEum}iPpk?T;jg`26_2=YnnUa z_|D6A*EK{28t{A7GMlvl^VKiL`~Mr?$NG+OY_`MybV=M_#X{9k*@_>ssb zg+InKS6x1bxbAP4X%+$X1zws?1dtCO_J<)NKfdd3oJV|hM3GuykCeq?n#A%uis7S- zMYbf5xc;fkRs?&l65j*JcSKyVTd-g~&vuU*=^nmEsG}G50{Cp@9Iwb*bi|2y{zzHq z!b5L1U>y_$rJM6pSaO)_gOqc!m+Rvj`V77&Cn{RMeZ-t^ZA+(dU)T@V^cLFdvEV6# zc5uhr$rjobQhbleLy$&2n6JQdC^a;U&$7FuBzThFD)S@3I&tEonwC6__m3NIO|Txx zbovA(@)Tgaq5hbsCn_KT;2wdUC<+qt&ZGYN^;Y2dWtOuuCXdw8YK2{c`0_aOs~>Us zr8wrjBbcY-N!nopHXHa~;90a=Y@8>ZLV>wXe5b&=mGe-;*nBnTnfvb_F!P3BnZ3es zT~)Q|ggFm2?-@Uh-z`5jp5%Phw51Am?ZSM;a#dA-3D=hry9M)qr|XBme>a}9x2!1< z?WKJR*Jyhu<_)>S?>Fby7}pipmnjMJKH|-1Y3Fpp52N9Ftgo^xu`Gp;gs=|5UXx9K z$fUd+GRNI71zzX+w9kGU&cix{1hPC1TE!gaiQP#_X4wj@FBwEie$5xJObeH;v6Z^DIq4Df&Oe$};c>}P=aRI-9+ zKs(xyISy32)ym&JK4Up$YPXT#y2S6Ct7zxPrX>7+#8oZZB(7s4Mgi6-m83P`;|K>Rq1E}CG5cj<(#UtO;n)V zo51%kcy+DPJoPDj;$?|44jLiXuM)wAb?gfF5yN|eU#*KF>ffwK$Mdn?K~XY!v7)>m zCI;?XfcBTnvLvAlzZw2$pWrjg;JW*9_yNTIf#WUuxH$hWJMTY(|KAk%pJm4VBk(_i zBNG3AfQE z|D!wE&zavd{Y3m9x7jE{5|_^0Py871|JY^#`>=kfKR(!x;a0r=*79!y|K~XS;C-Qg z)R!Sh1s_;9>PP&O$3H9?|Ih1h5f3tnC{{irSG;{`^ z|Nl!OZ@if|&Ex}MUjX`tvdXa@!7tAJ0x(X@`~YWwzhFAXaql&L4a|HOn~tEmgmZ>(2#W`S-`q^Y=fUO~qNR z9vg!n`do0!8+w?ye=2P>1MhG1D20WT&x;l-_aP`(hdspq6QNkmwF7~+fO3zsupJf1%sIb_4tpCVmLNPL3Nel(h(UF>sARe)mXnmy>uO`UUvk zy2?jXml%DYv>kBfCp;ggfZqXS`I%Mj$rKIJ{0KWLmp9u?&E ze`nwx;@{!2AjBRb)%=TGxe-QbN z8-Qy)SjF~8%&Wr<`0i+FNuZs;jn40#Ese{2Acv>niQ}kB;;GUK5^iGQYvwe|de7_4}e01OK6@ zvbipqBo1xsxJP0;IOK?r$Hhn-@%GsF_4Dx*{m4CY1NRfRFX@scwrlD~|Ddp5gIi}B z_-{stxoo4lAeip|_|9>6zJpA>qcGSafp)So2^S%04+Z`fgvZDk1jY4_hMC9Un66` z!bhr3XYUaZ|Df)CIX?{*G>A2MeQgt)&-O-tBck9oCN9f(mXVdtuLZ(+^w z^XmK%&UZTR=|MjIU0u0$rwn^P%bpdIfuHYGg2)t!5ivNp^&I$M{aRNR-!p8$UYgu#DJYSG!0lTtQgsmcetX&j`)P8g zc>Qbr#P=QE_1?yetxZo`IPu*b-s8M z_j5N-*J&?PcE-Dw689ewXU51g5S}5=z};5Rm)K06!1AMGqdd${1wQFrtD$_IDPrqJ#+ z&i$<+>d$CzWy{n7bDjBrnYZ(QOa>selSxEL8}tE!%Vkp8T! z@AyMpZ!RRHaqbHMI1+yUS6x>&KcrK>y#GG<^Imn;H0|6;Kg`QvRpI@f*r&oD0Dl$u z*zh}4*urVde-jnXlGUp@kLd4?OY~c-qlOU9 zB_&RoakF}2<{0Mv%I6DDjT4Us-J*!H)juwB9W0gXE9rOfo=U*avbRi-BA5A|xrHl= zDMP*AeTII~mzPVxt*^RH*aJ5Db0XNlq!7RVRnH$jTZrfW{Ngh&Gae-zH%#0z@}8%b z*DoI^1b%`10ONWS&zAyEB5(hzu7+bB1$>YF-5vi%xkmll_voMXi_?c0FH}_U$2LCC zHjuVrw-UF#n{lMbXW!ZiKhUeLMapd={W7hg1pJw&T`#<-9$$&$*zW}XF!*_Uvlg)| zoekhQOWb>AbMxu%A5N(P{rwaD`=z6>7!Ky!i;o6_LF|XFT{|$jbIB&J^iezj<_8ck zFPJ<4Byh;=4{-iKp?ebmz#DOZv{x8scB{Nvq2YSkA4X^)4vq5-%YsDz*b;Y#685uP zAl!Ep?Ss6i4I0}c6k!|?_!y^Th2?y;e}w1Tl>QX?0Vl=t|JPOcqdW2yJL89HV)p&twe+Qbpy^`l?=>W(A${oUc?BaHLk!@Iw1;{KBCyqO0eph4(AHGF5D;O{o84RKV64+>vL9CUrz%#J4G z#`*By;g9)OovP7CKdRs;DIvb*8;cSL1HQL_Phr2)a{BWW#k*so0{*!O^MKZu&1nUz&3LO-Jd`WQ&I+L?CQG0X8aE-MD4 zd%wLE_&ehIt+p7)p;(%pqfF2HOgy;2(q#HKe}7GGIgcB0+0g*mq(%Mg$8ggr^n12@ zL*?g_!~s(AD^BycG9WXrafc1~BkbOTn3z}=K}@H;P<^=>^9J$(Xw3URQBmx?GRJj% z=(!($hPc3#{I=8pdmxB?0@mZcn;T9cuK@hmx*y{i@zgDiX8f4?M7d zW$;fl`Z;}=fLKl^WtD#Ie5DWfi&k7%zTEV0-;JM zO1>g+=7?S^qHJ??&(h8s3rWEFIZi_PT_}$VLV(Bj=!pQ^sYMC^&nR>U#idyP3(@X- zdMNc%SvKC+(DVfBXT)Q8K6n)PpyPLhF>8p>Cs&P*bsY0YG7`c32R+cz3D!FyiQqvX zK0JXP)Ny?HcsFq8XvH1?nXK19i*c66(}o5=IrHjA`k;@9bJNqr8~hl@jPr+pzKh^R zu}puz1%7tKy``q!qdau(VIQ9(I2AP;&lP3$dA{eNw`G~QdpaG{Syu9FHrN@J<;O>N zw?i%u0+>L(LIcJy`%RZh1yFH}u0O+sB*q&Cws9XTKBk0pj!JGVoWU70+e`1APA|`j_&qlLIFyMex1R zFBKi>(QpygOQZuZ{r>|}1h@_Ip}&eet`Ba=G*oLJV&_a z#8I|;I5IUsd|d5qhdv>1ke}mveP#6@H{q)#$E}Zz4N?xIjn_HuJAT~lsK<2)k7pCx z-QrLOSdXCG?4xXp`w;Jc+I7KGZI1ia?tw`@=aJDL&2k)7d8#*O^duYSC6oKQSpU|5 z^Ef5a5nG^V+!vyN^?3A~URx3L7dT7@^>}tR{SfllmvuWGCA8yrdVSa*0eYVh!K=l7 zZe0>&j=N+jzmL~f?ylPHY=9lU<c&xX8^XkErra)mg}K0o7= zv9F0@gFUju{hlg2D3=RkTQPnsFTb1i@%P3g`G=jZi6`_@KDV&5BRBzjBw_KlPQcDN zsmAB80Qc|i(!9X=U6Ngn6aUWr5AwMQuPbX3jn1$((cU zG}N6Ku@z9;88^X+4Qg*EMm=d<)iNGpgD;&9R7@QoQpYaXNQFtQNNwCZi6@=J6RS9Y z*xN{+bcl&C+Ke-{v6D7AGa;m@4H|p{Vq*j2grEqdecyKz6~|4QAMG>J{Z*7qf-~UW;3Iw^dpFD9@$DY|j-UrLH z7y1}*SOeOx-MS$=BLaQ7SOK`SttC9Mw@u5yLc?zxKsV0tBe|-b;(u~1BUX1d* zKm5Z#{LChlSBbLBbr1Q<2l-wrvm_VSy=Y8z;r}u{{Ghe#6RE^_*;#9~GLP>7aiP3! z{a9JMwW+T2GWEjQ!MSnb!8&)(0`dG{XioFrp9Bz0+&__;*2=0ZiTwW?y`uQfkV(k& zd$K(?%sK|y4v14?86yusRXjX@dOGDNZd_hIIK}6<-@&ort^j=cU~yP9-@*6#o5|PP zIFHC7GuGiVRzX%%++TPlZ!Yzd1}P+PesGj0fD?CEkIG6j=hc&Pwi(a0E=2vhwJ1+H zTU&`ct0SiZyx(lxucI6sx=q`Eh$Db` z?pChfHN~gmqM!3`sI9QggnC%i9Xr4_FZRdduaPI~MO-H0&nUp z;wOZR97oCd%g_^v+lR4Uw-wL3&_3v|IV8Z~_>35IBKt9ffQxI<4>AH`ao^!kMZ~29 z|JbC1UV6rwtBY;rd7$@#C(>5z*C|^6dqh>^jTl6=5BCR;h2IJ6SKx84z;)H(u!MFm zD@k_2&INtCNris9!uHl%-2cMg|G2V`{dlTvaF+cWzgVvEJ>uc@h!Zr1bv%SPOJmj$ z_yGgZuV!bvp}(KACPUO$5x?i*=moa7JK9vP@j(2O;0t41ojhq~|LApVVqE94GNvZk zuTgiap8W^)M&bIsJ`&31{kB4pfOZDGrpU{FX?>FWv9;jc1P!e3Q-J~H&oCaEn&z;t zM?Gh@-8)`(4tPJ~JuT{eA0%Vi`5(*=ShOoRR%bPim31O6#rxse+{}TSs`=t9J z-Jb6!VTE;W!*8N~zzGwTkKacOKj5C#5&ZZa@c;C9yHS#V!uL(LZ(6dQF}yw&{=a?u zZsb{>(D(vu&ySM_paA$k!t-y=hFqKnmf`?#TrA=L=e6(U{dfSx|G}RD{!hGChr9&z zXJftz_>qaCMEoC*LEiDZH2Xby0KgBI!Jb@?FaX!Z0T7tKV0F4*V2^GowJuvuyR_?F z`2d9b-MByf(kh%{fcF920Q{eimJi@J#s5Dp?!V~g|6XzZ-_5JAH5%&hntq#kbN@u_)n0!QWzSO@G{`>}W5OD=29|?@^F6H@&3(k7R`M-PlzqJwP z?`Zc5#QhOovNs2OgTOX>X%6xOTuZ91LdbRSPr4ia+!Iosj#5<{;>7D>&O?j&ze{PK z!1fCE3X`4wbhKNPs57uzFs{}lc=(9h-cS#`GvB5&7J>&*YlnKO3*b7?4qy*t94$i@ z{~tM#C$OAK^izK=i|>m@sqZ5$SUzP&UMxnLHPuwvS^c_I?rzJbUw2n_b2I(r|0T7s zKfA8BqB$n+C0^Zo&vQle3y||e`U$5Aej)LlwH2|lrb(}!&ogG|^~9~E(DeTx?)z-h zzaAI>E^Nphd4lDi9+)52aQ>?ofpgbZjNI~ID|rDYkE;DK;8WdM85$qJ=?@&|@w!(Y zcv-{6pKhL{T<thJ4l-@Nw)UyXg}l$zvy{^eR<)fHd9?cxYBr8yDbzWH;%mt6;ZeeKJY94}Le zh5Hz%^e0mf|NOkO*1jv`D&YTbJp6;_&pQ!6|8&Iy`3$LN){nDY-@f-J$b+6`dpps3 z&DXNYexQ8EO)vO1+2PSVbIMa)^uueE)0Hmv#LA&}U1J zv3-)$Q$Idm4ZHa8sZ=fg_bE{uWpD4rQ?v)^e)xpQ^NpdCQ^Xth#nxX#d)oibyXsX+ zvGrg%aYJupLIyv;uJ}aV7p2Jl zu3$a@PqhcnC*Gfy$m;=vlLzf9res$D<12KmBgt{$j=!p49N4A4$Bewb_d@SU_CwoL zUORaKm(-@eV%-14h`NeWc{`*FIDrQ?496)qlyuL=>ND*L(U3DyUsHiFk699Mc?MDHt0zUkt-4M0(wRprx>}>esOa&%<=b3JmQH%47JR4G&;#@B z|JTb^BTmf2H8pqNL;JC#{3gV&I#>30kN?m=QI9wsvp@Uk;(mQK^h?itzBM)cPnUIXuQOZT9o7Is0iEERJ8cxm^}YT^`P z?3zkE=KGd>`rBLm@!7}mAwO+J+)|k zFZ}#h*sfiE{%+#^k2i=0tZvrH`8@&Ft8a4RGVMjCKx#p2myGGF`D`DzrLU%9+$vej zi0_R&3)?PYHbs2Z!N$|P|GEu@X0G=SKlFOvTEq?Lh+J7y1D?dtE4`Rs!JC*K|7)&W zX3KK$-v+8xdD$|_=W8MF72~*t@q8tWWPayYFwP7Z@h?EX!hT`-`^5uTIu5%y9RIa; z#(g-yiy%yC67i^r7m1?ILAx_>C-8@$Pr}t@hXuP`IHA(s=N_eh*TG`f@xTD>v9DK^Zz1k~*zv7D;_i)P|=%H*q9Cx9!;D(t?91KrvT`!MXAF8ZY&w2EyK@>0V; zND-A7a3WPr7$B`l*$n&-_Tt0|=rf3~Q%HVerfn$fyUOv=5Y?G@JgHt&IIe&zo*@1o z5W^O>E9}FNh{q9pVD+b+IJqnLO#Z=W8Ea;_vG82>+QP+(SBv{s|MbP_WMrN zcFkTHUi4#%1SOGWIUy=+=R>JQzqi5yvypm*9*&UIBbp4Cw7 z*D+oz`@vEW3bDS;y?g!^?`0F3GlHClk*6L!z#98;Q3QYDF8l2>Zp?yr*((7+^E>G} zDnRR7VS8BAck;Tg>vTnwqM=mV4+M18kkBhnPjs@MA}Pji$h0Bc0QMJ|HW~zomvn*m z&HB1jrJwE9*~|9;-%B?gn4}hc+*kvJ2P#Av)#}ip?7ztw0Wj; zQk_J511CK`%;!fI0vbMlOP{5P*B_WuMN0L_)GD^GET2YsyewR+XyYI;(mKHRsh#ow zCpl|1-L8&n^RvDeaafQyD%Fd10ru||Pv!ACu`qv+}hpe{owwg6$>CeS5~sI;^5JK9Ys=3`UF0c>pN*N{*{k$m^$E&_zcnV~V6uR;j_A zl$X?v*=)y3my5VcnIc&ZasDXEUxRry%Vs{R;{9k51>E}}JkIYSl!}D4`x(qX;d}1iwx8`;Hs2G|@S@Yr zt)5K0SLo_n!+fvG5mjD}GU5r9bKJMB>mKCylTySG|98O=ff7WV8Opw{5cZYhWit3s z+!rXdG0ZFIhqskH%Kv*>*4LsR9~1OCl&!&mQa9__?ECSv)SsixEfz{025>F%bPcI0 z;_u|!bC-0gBRi}cx*dbqUs~tpJMlhthV0uIZ#>>}0y@c)p}aOH{f z)iB#HUwH&^f7E+QC!F98Ck=x?GG? z0bX8;`Y`yY?jA4Y*2)GYjeEo2zt|lh4&GKQVd5u0Kq^V@;dv3U4S48Tt5amUa;s5@q=KmjlJgnz@($yKo`UD*KmB&iR7nq4n#i+k3P;7brhQ2eri zpYkWp;eWx9hjry(u|*IHFwd14nx#gKC!jO66L)S^T<9mrs3i0Lj~yLC-k=VwqX*9L zc+*zdJYLq0I4WXv9P@8-N`$@)e(KzuS;P6`GTQH~wJSMzf%yN{y&<$0^13Da%-mNg zr<<`3kCi3=-iUPo`RiITTFD=AH%BWGXRX+uaFvf?JRq%7lJWl|CGrsWae@$ei&7`1 zz$<98_JhC1{>Qk%eu4e3q}p)ZmTki)IiC0QsbV{%OI3T%;JA5>7<`@ltneIoxXA04 z*L`TL4Eb%uj&97OWt~z`%13>`i_c`gWSLC0T<-&71iUzW4>7g!EarJfdDBiFSLH(F zm&1ArJ}1|wXm3K(!?FwpBipm+)Q=<++S%VMCD}gxZs?ylZ*VqLsNwrvCO`jIoC})7 z@~Zuh_uzV07S(ugh&wPnKF@V8(0dvC&U4l~^lR2|en_gpUdlX+06iJ|kXRJs9z6Fz zRqqPaFHupB{>FMJs@nSa+mIXw;1eMJ_&F=w{+9udtOx7@eCwdoQMG;H!{Yrno=3bM z!&Xh>fHz9w|JVEd18;O*yN3LlzzZ>->WKd@&;F;=ypOK5|D|8WJsB6D@%(|0uU@^H zxWB5pT*Un`k03iR;yL4&#wjO&XMPp-JK~zKzpY-vL2Igk+r10_ufXrOhyT}9BfSsm z`Qh>ZDg-bf{?B?5{~w%X-eBf2SiT&7u@!H?4=Md##9bXoV47~Xv|PfI7yYbZ*K~59 zk*(qXOMdFa{{hd6#Q)KZ?}`8OxYy^s&i`Lg-V1LAUiY!^f4=8Zf5ht9Z|QOx@4rzJ z|7YHX4}<>`2T!+4S`J{Gy&wKh9Q%Xu{u|>Y1hn}5>H8OO`~q-JjKX?|u^#7lz z2OT6u{Gac?)L+2=FRFdu%rd;lL8|Np4C|03T1 zVdDC0{{5RZ+}|&X>Gt?lN&m~uj`TeKyCTU4&;c)chY!&C;rRfy6}lOB;5;lzX4o@{ zw-~mDLd*kDvTks2CH&bjjF%O{?;o3*!81 z#NYj&5`d5A94RckC71F1%gaA++;!aRtNwyB!28^knG1jZE00u`7>Wv?5*lY-dTD|9 ze==v8mH7VAA0_6A=bH`Q3=Nl8UsS<6@KNukzyIl;Z7IePn861~{D1!E`yG_)HXOdh z>wLjTIdOmen(yCKc*NK8l6~uz=Y8ImHCfGi#s$bRHv4wL|G!n8p12!40k{6rtcKSs zr(eAC$Xylj_`ZEBAHA!h{P5v*ccZ?u60iGyOQ$IK$rmV*&4#a_{;yrojPT(wb80J9{=WPFYJDI*{7!5 zx=zSKN%FF+)4kMR3w<{p-#)DEi_8*urih=ahDx}9kcCwxz-es-X0uVaf5JK1mSdxT zsq3C{2l3*6l7l0}RUbkiw+W070r zo9wT;o_w12pZWUzS71LW>sZ|_dvIJxbcw9Tabit3-FtRbRe+OX+htFF>wd zp7DE()BVy*pGAJ{K=mEnZL@rz)~o>ha*0>_H5}EgKXrR{9pVqDl8g6!u65qY^Itqr zRUSkC_!Dyt7b*A6{31gBLtk$w<2>Y_ z|Drz1_I*N)dAVP`^VTOHW(bCi|ZIu2q`sS+>{0Vc?HhHjg1O$@cm8e=BU``LmBHqqLtc#A6Ei zEy<(>{C4;+rnbV~K)Z^lp{W%*!d%<=Yp)$29>j;XeGj`26qk-zN@_zeD_9KOC-~#`l5i!|tKs`$$NwNdSbD z#0mLbK)|0EGL%6cNyQzj^4R_r6+NQmJpA@w?+kbX7@y%?P5UT2EM1sCz-xIc^?Bmc zZMO~0@jRU$aeXmvcDs$f^Y!@^dz__T@W2nfrX%#D z_eTS*KH%%kQc5AdZV-~$-j)Gp>`~E;==R+&eW`p0+c8?Y#*O*7 zLR25vNBq8MT17q-%!9YA3*!5z-aZr1Wb3^07UzeFhkf{N0@X-ws3ZPw{gUIW&m-;% z^?Kq>4RJBd?^hoX!2-m0lu(-Lz$<_nNIRl^P3@K@&d2>hHHCQ;@$0^{+=j@3{%@>a zo_#;;8IIDg2#5m!{>t6i!2iFr`lfQq&5qw+oe4X~XUr<>3+>jTU}Bnfz1;jR*g@d; z`F8wod0cEwL@5`~66XU^=<6b$?HS*;uNLw2x2MKu>BkNCq$uqk zdj^kg<2tvetqZvO3R`x@=Mev6t!>m9K6MxF_sxW^mh+C~P!RUTc59#~276Jv^&zv_ zM|*pG;Vp43WXF^;O1nn*SZ62gOQG=y)QmSyAXgp`T?yR z=`gMIJ8Vhj9eXy2N$>^*?@uog@v+xVWb*iJv|Q6Mv}?^s!|GNTD=+kB5 z|LlK_2e54U>LtAY-FX3Ccm)31uw&flm-c?;O;``ebD~{Phd_|DFX<3>lXh#rbjxfl z?9(t$B{!j*7;SFm|8uF7cAgXaO|~E0vArBu1=)*vV*OA5O_=@khXLkoJ!{<+SLSKw z4b1rcn%xe>_J2lMI(ZoJ^3lG}NRzb7D*Nw69O~~CH&2E%KETkB#iH43g+Pk-;r&%r z4`}}WS?*@a5P)Az3Zjt`+dKWc@PAJyS>@s;x)LPMt*ipVaAJLwqi&h74>sByI?BJp%3@pj}X&Yz1x& zdtn$OyNt&d@oGE|_{~6>*TQ@W!1MGzAHN5~qzpVB{{M;Cz!=V#BZm~?{v!N#IUYkH zBeWQ{b2IG6D{M!B>vLR%a_Q&4!X}972=%Hwo$(gRozZ?B*ZHc-@`ZfJJq`!XM|o&a zUW@xmBa^UGGoFs4Qx;I^c?h)SlLX>wb#V5v}ca8vLXcgD(s`O0-QBgws*RB z4f_M_9%Fg1%h$~NBK~?U>Z^`M-5mc0i|E(BgHtB>;nvy<%|aL3!?Whm*Vyi2Bo6&*h0R%8HNtjT zW{H~Ej)FWiPkl{4H=E>oAato!l!0dHa3}OR=W9L3spmA!=+NGq>~$jee9(Vf4WdAa zeC|=chhCh(d!4ho6;;&UL(pS>B@RrylQ`~dp*GIc`3T>`F(@_jc(OINOB;7e0`nE( zqE8!r9G`M9(8_sty3=yUCbS3Qx4YRNj&ik^?b0|Yoi?Ez1G^ex?2o>_u0qcH&HX!@ zcs=qRK>r%I!rWa%|G?Mppnq$=ZT8wpZ9Y&_3D~8nHbGCPiqMzd- zoJchBeDA398sk`i2QAc~9wV_pfY&9>ao_>SgWXdlv200pbDk}WPt%_iajF`-`zWKM zyRp82ClgCejhD4sQ`24euE1L@IXcOCNT(Z4&@WxIbaoNHFn#_{J^429NySizWq*Db zjt>CeV4j2y>%ws52#<1md>V z@0C%EH^h19Flggp_IY0=^>lzaSIG$y*6c()~?vHJ@Odi1L zjko6UeA6lL0dT*!5!ZX zoI1*W+g`bSf%CQ(fx_5dg?+QYbr2U@?GtOz?v6n-+7&#$kipCGCPt$_uEn@;cai6U z@2hzy;yA$1^T@Eu=V5p#CS0FN$*3>dqsZ%JIlgVn)-gOsL|%1D{fPyPn|A06h+7SP z=iZ&sX6iBB-6fVx=s{3}@SP&h%rS!@ANK{FTA;tbj6g_*M>;E#@`jd`N3!cObfsSc z@3TTzs>A9IyFx~W&Ii5Vwo=*+Jr!H3%CUbsYuy(JxbrdpJMi8Ar~KV&2WMk@u|qA% zaQeVA)p#!Xw$0F|@@*RKuj71%?b)J~Fz(^MTPU>RyTv@$Zxbjp0+*v&Sv2QxoKD8X zX_kM~BWBe=R;2=dZT)XbX*>Ywr0N5%SsWN`C!SucC_k1M_g|;`%x5${fL~O2Je-;n zDW?*tF!6SsUJ$4s>-48}ynbF%la!%w68aYMSw!E$d58yqI8xNx2GzP<^n;%dNv$03 zrz%yM#}ieKD(KtRTYb6UgSJ~+jXsHbit&Yq@jhp*P4W1!Hs6HgX5LQ}1Agk~lJc;g z63a+WJMzGD9iv`234eX^Mb%KD8TTum9Z5u4-+)^X)8{b{0QSxBv&VUIEB5#8*5tHT z4_OTL6ZJT2^*yVHzBz6cbcG?}?clXs|9SbRm2F`N}l})gUj9dLbn|H0X zVLnc&cqV$=6y%h4;-p zm@lwCU7?c4+3yXB6aGv{q#p=TZ@f>E3fcd1kKc{)SvEg02^JI9vuB>!$g(6RFwVi( z(Tl_Rc8ouF0Pj!U2lL51SiBE@*looR7MEO8)dwLt9@3KIIB_+JeF5SC_(Y6vo5srU zy{NL8WeXB8XnKaF13bI4)-6qO=<)5=$3n~}au)iG2VX#|0nJ*DoWy=|4V?!JI#XOLK-jB z{QeIg*8Kjzi2Qau@1>V!-t2Iu{he39-d>K8s1L)pZMpExHtX($vg1+()hpAhxi1p_rjY2v;O}a|0iz0$X_V{&jN7x zFTW?^|BM^Eg#X9t+0VrP7suaP=!uATUIB^UN5TI&4&SRkc;7TWPW+$crEz~F&*C@t z|EGU_`u)=~Jq|xeI$=-d_*;tqpM5`Y@BVDG&jJ$fUXTBOv^)T{)um|9Y~cTBCdblu zaNbE?!1ee)+ws@q|EikC|LJ#zbigyTYr}2uFeUgLS{{Hch?DRhaR8iHuMkHYad3h2 z692!RzW{r5%QD#g$O8aRV>5XG*l#D6>Vq=cfjoeZk`Lgc;{P8H_s>O~g7=H-|55P% z(k*=cW*Ews{4Wvr1mpI11^-XigFFD*RW&{U@&YhUrp^FOxcWWg0}P%=9(qMoMu~5l zbf(<{PWS}~3FH?C?jjWRAs#H|>DhHFfrC37%Mtf~!Wr^!{vq*yy)b!|{{O=IzHagW zbb7s;@dBh0qmj7(FTAb2yN<7XbWPslkJC?nA?82MI05%HC0-!@FZ&M3#PMHVSkUqV zd`VS}%o8v;Gy^~XD~~)LHn)-w;C}7tX5#xDLzR`p|CPxDd!GkR5(q?;=Yi|z=E|Ln z>tA$y4yFs>{vOdp{A4Z_9F}liYxq>-3n)v_^MTv@PLymYXI}R=Vhcm$3+Ms?XAbas zUGxiImVEj4?Uj{HD<93b7v|(FzxzneqfMjN<_m%IhrD{k_rK!PBQaVb;`{I0mvCKy z|D0Zu4v_~?r<{mffghbe{MG}+{dMjX@;ciZWBU@95#`|iJD&{q9(t;-MKI_)4?Xo$ z@YYHln*V>T6KD>282FI~(0Q163+#5$XoBVGlH5P(gbW>>6p809e=8c2;|c%gMOT?(UC9>EF`?KRW8esyaCufPJhxC)+sTL_FuPAP_GqH0zPK z;e7S}sz=}#7=YfvJkXwsllgxH{2KVP)KJCoBLqXYorfGvq=2Ua|Nn*Mz5wl(vh+VZ zurpeM^G65pCRci{x`1v07o1yn9@pO-PkfR%^{L5`r-4@?U-{5hN+rYn;{xDPC#DbY zD1hH;Qz`<#(@pkx{I5o72fU(olz6I5_QQX7z{2CkoQJx9r z48X(exBlr#;Lx=dwfn9$@w|t!uRccm=Sxa#y$?7RK8w|Lz~{H`-@icn(jjl{HtOR= zdNDygdB8b*G9U6#C{#szlkrcC8GNn~nnWH~PsO@|&yKiy2R&Czy5aN0PxRU z+gI#noa)|$^Et}BYGVBhzD!%`f7#v7d;wctet9+W2voTCySDRwZ!S!Z@x6xMocS@z z6_=iSDD$Tncl&YT)kg-L&QBF=VY{g6L-%FZ!TzPdB8B(5t-2gEiTA-+m-a`IEPc_pu#2A~VN{f4inPOz^m^=fA4QeVgnz4GzxH zU$}RF-!%Cf%FL5J#EJSs7ktN2AIDwgj#`YD;FS6R?S6r^!BwzFR}}o~z36}7wojb) zay+Q5;)~GdD!S*r*_b!%)zO`C*xzl2l#F>0!~sa@_%+*8YdS+&>8XvcmTR<1}!8dwt9_ z!}jcOrJ}6A5LSoyemYY#>bc1-ANK$^guhRsVU+cEXPLEjd0l=(^Y@o_?z^}N?PG40 zpV4CEL;hXS11Q@uMeyo1N*LRkj- z|34)5UI}2`5k;@ed;rcZrOb4)gg$y-)y) zEO7l^Aq44cQKJ3Ny@2=wp*h*da{0q~SzK?DiEF)FeOL{GTEE9k7wxOupoaR8bYb{sg5_B8d> zH+7;P_V-&-EDy>DkDb;OBggQ8&*?2mF^NWl2E%}*W@iRT%8KCF9VWw9^Bdgy{!hCimAs$Wc}%lsq`V$n55Lpa z8HLX^cm$R9rmR~%@W+7vep~_W1pC(=$@1~Cc57npYMk|5hZiTlQxpm%S&pU3;V%OF z>mKzY-|y1fQVIP|x`9XKW4+A|h7$bW9q6Cp`Kf?-G!r}`i@8WPKc)RBB1d{?{}J_WiR<~bqziVwGuAA_DqRic>1jD= zJ_zZm{Wm51e)ws>tj_un$7WV80lyb{V>V=CTm`D{lUgzatYe*>hkppZij#4qC^4@r zmwY~-0TY9SkxYH$MoAt3wgZcN0PGi*_yGAf@I^{NldGrs@un|pT<@83{TXy*S&v!k%Q@K^N_;`^x*S)oMUbo2E%zg$uh zp*?dR#BbU?lG2Vk*0 zPCH&}P!wqIYyJA=YbM}Djnfks_+9A4PT=0~<1#*bv=-xfASJ9bPnTC(-YzF&Eun@ z1p8#BZ6dj22m9s8_Mt(R=jK8w%80NA-)Fw9B!cw-`wX`}34H!HTYi~Rcd*j zIk!k+c{m`hVR`#Czn@Zx`xCrx>F$}+e}?*qsto($TAN_Dm_4+6&kjNlMx2PMZE-E$ z|6#^EyUTv)>QFh4PYFf~rNN+6&SSj~Ar3$F--h7&3F5ya!!Zxr=l^XN`>BVh!AR5u zX@7S3k}5*tOz-ZimN zKG)zm34PsU@0rYzh)*^I7jEbO!Q)}fW1H-ET-F5>u0=!RAZx{3ilieT zj^c6we}rGTxN0TeS9dyok@kCp7xwV|%Bxi9L-5b`c?~=s&_$!MGT_>=#XJegq*TQD zbkenGf0he7&Gd6t=OpY;#;uYe_Yc@lO>lH(y`awRgw@!NU4d4PJ?p-I~5 z!B>%FtP2Cyun+=%K3-PhzXrcF@P&jf%(KXoG|fC_;F)%BnC3i>>RX6+7J5Z5$A!+n zf1a|Z%Hbf6k}BV;YP<^IQt)!N!7Z~g%ZB*Z2r!LtUp6~!DIw40w7M`y94sLvDk(!H zH+9$GIa?dNr}^CsCPk6+@O(-{etYm5_K4n0%-^{oIl}M9QX+?d&y*$Kj2ijfN>6?c z_I|X(RMedh{ZEz^_c+?^A1#G9leadoaj0DL_j9O*F&yvi>b%PP{w)$2@PGaK0~oKs zQ2^+&pX%P|3v(O}RW3koV*b@;mZh%lkf$QcRu%C#a~y;dDTVD?HLGA>xyjxsOip^x z?)~o1e1_$WTZ4MG58OTR{|cK)C^}MucG`CF)bWF8&uT@1zMN^xu`I?5C=z>9Y`QXsw{BC;_-p?wmpD?l?14oVrFwcPJ<<{^vY|}-4Pa)Ba@3+J1Rn#i-3Krtm zWb(2Oez9Wfcp31y@{YD~=sOQ?n6j`P6N)5KkB}{gpkK6G8}>ypUJ$RQ$g4Y80sKhr zGOs*>d2~Z=M&VP2x|uhxylkjjVe@Z`Cw#sYwvr9Ai1%~8TIXKAtj_1DDE+-pWRnN5 zXYiGmxUXx72i$0X+PO;eF`ux#{!{+Pwu7$)?GL-fqFj#robVGsKR99MI^5PNdVS7D z5x5e^AK-q>Gb^}1+@i_SE%2X5f5RR`nQ&R0Jg)9NiFF=+Ad}>Mfk!2Y_&%`Cj=Y6+ zeT6N{8+;PHJDaXKs&YPy#gzodnINd;)N>!$*0hIuRSW?riEDf0!DG~$6lD^674)oW zNyGI;WqyKX_`kycy}kGub#4!&wcN1=aR7k(`&+@ACH}gYPyNyxu45e6XLB!s$AJIg z?=ud)S8yr`#?c>4st-`#mDLjH>toiRcrA##a@IO26n&EAmz$#ff?8tl0ydK!)kQ=v7bUW8T=Pq_)?f{;t73@EsB7UXrq?4=7k2jVqL+{X46; zK0v$g;(343e_G>>O@3W8aDA6Xl_uz=pVj4wPRQcc=(X=~Uh%t|kDbH3G?(}KpPYjp ztG~S&^G%0Ur=%RzYlUz)LcLa5NcFZu2D_6-iD!$ULmD6MJ|))6`v@ZQ%j38?JDdGH zwLskad&O&KkBjHfPo`WW@-30i)T|&ni8Tg2g?s^3NlIK-+WJD;dM#d1F;1|*@{3jM zpCWGx5`O&(&wsF(*U=xpa;pRR10F2ye%%2-ev}=Kdmk+R#%JArK}Q~dn#|RtoZ&8E zxqsnLFkT-lmNEosjQJb{Gw%1j;=L&a@mCm6MQqmiASpA(58^otrSu$M@+m1R6XQje zp9oWS$hkg_tGc2>ZNA>PUNG@{O2~2vzqe#xHtdV|?hbH$UW>d~(Z z0k3hqY|oCrwNalK{G%d_yD@7j9*eETd$$#di2nlrrO0sA8RT8U>zcW5RfkG8jF+{8 z|DgL(4ALuxMq*e;u-_QWLi>6B(aYl~uMtBE$5E(o!`pn0*EiS4_Kh_(fS(V3YD?X{ zChXt04Of*j?u;lhPQn=C)J-G)1^64UO#Ly}Ezk`0yswD(wZAn9zyH;T56i?WvCUk) zg#Rzbw+24>vEl)|gYUm5{(qz2|LJQpGikh#`2Q^h*@o-m{=W$T{CfN!u-&`xfBIPy z|A*UrIq`qM_lUO-d@omc1AL&vyJE{9k;;)&g2U$r9fDOTX+EJVq{qUyvWavX+9D zR{U6w;#UA%8e!8*m-^#ITzaCO`cT@BIxQFd|IKFNt{)WtA8_jCbo-^1#?ud02jFPF^c|$*{k3Vs#; z2T~9SbT0LWhX4PXI19fO{2#o9MgButF1_CX?OwX~EB`9~U(m?!JRAQ1T*BLLj8nf@Uc&#g?|+uyC5S`9OiXPsIPD3 z5wzbR;s!qgp4OHpU@tCf5rotoh!fi=EX(#XFF?pFb>0oXe~V9&$OF)w)&bXFd1O^? z=5svmkH-|o2LPMT104Mk(UOZe{=naV?(d&#zKd@Zn$Z^@V$)r+DGri#~6&AOaN&pQE= z>kA*f;?oJ14obHek#~Wgfc?yiFA(>4N1eoXbOG`J;O7rsGx2`6FrA>Zr@F6F){Qna z;(KteNjaOoawPlymd>{2#Qz;2Zc{GDfTCT3c-r+6_})kW$ITh$5b=Fs)id9qd|d2Q zDF3!$w2Su6*^x!NCw5Eln}T2Hh3XiuOCi7*^~|PQnI`~#>47{y%NdC+7rDP*pL8@$ zU`LpBD4BfWkxlk{Ui??|>n8gM^bVeQlU(6W)Zce1!Z<#nBT0X^l90?`!k z;Of1XU3c@ozK4B!md&Q!_YjXh=i8h+cLL9XJ?clP zYt)xFFKpjOJyuPwH*^2fq$;BW)#t38u(z>(J02(pK1ToR9{4xI?ik7s#GJ7*cTe!- zc_-qIUYUl!y$SpDuR6XDT5MWCC(SpG7AA|Md3MDcXG&62Y%U1+mM;`~9T2 zFqioKL#=n1h%c2S#YVO-!d1dfaL&50e|QLX-?Fa4!fX%5&UJHE*bIZveCaMlpChiM1xc|31D?ai)+9~fviPwq|lS^x6=uc03J9_D*J zv=a_qx(D`e^xrrB<$IJZ#(|*I_kVq6l=@*&j7;%_Y;_fSKjNb!vo$C;A|M!!N_&!F< zd*b;Y`8e7ikC$uF?vNtJnO)Z}V&2NM&md7N+SA_MA$!j|J=KohXMYadxw@%w>T4eG z5&WOa3wPpp-%lT#+5hh*b0_c z^+S@+$b3V_L(Q$!YXX5o`Na7p#7BJo5wGtD5vh>t!esT-eT>835RbHsJjFjL@_}r&B~1%UwA}loOa!u%e({MdUK{9d0tx7lH?%qf1Q2};s@9o#pB_49p?X; zU~dsvUybTY%a^%cs1rVk$KyW>27IW`j<*8};{}|2qNkbv`wp3d5{@H2ay6d^J6RX` z2d^B6e4?tdkCg7Y%s+zPdre-fg38Rv}+@*Q__ zJ$icKD=vOVZiCRl`)vRA_HD#Rj5*7Vv^$i9`sQiRGE0-dA+R3l#f`Lo#fOK(JRb{p zZzk;dy3!0E?K837#}Cntf8YIyy0s{GuRAHzt`m#TCuq;v=n)OPf8*9lc=NSe4@JCD z*0-yx3wce?SpEJU;2W^K2&T|l*zs~(86V&*;#y8sGQO!_48iUN`(%AX!+06;oX!q* z=cD{eIsHJ|tjZhn3jLzi-06A|R;^;u=sQF|rBmYV9@b-06uq=#Nk+!iZnr)YacTCg ztm%-%_>}=I?)6#VV^Uvj#Tl!3O&wu;gw~L>4*Wj*)h=Jj^N$27&g5)RU+`tuUAjew z@n&nxUAgcas1y~v; zQjYVP}ajS&)#W~_&Le+ki_}7d#_>2kTJ<)nBU_yBo4}?C0c-`?BkBefT zgR%;KJDVU~YT`8QfAgsZ^xL@A97@8UXN9dnWt@o>$it8Xz6#tRXn{RC6Ylq-#wx^&DOvUZn=Z;iu3Jveops&>L*fAnmdSj z3jB8Hz4>;*AoX=ZuYnokKFWY1b#nf2_usA~547QQEAVFIElt2f8uh#yWd5g3_TuL) z;7!6_z7S8aeImiBCat{!!aBC=kSrO94|W9Co2X}<4+X_qoY!`!D2w{To^K?kcswBr zMxOtj)CoV^w>%=~d0#c5=vbDE3|KGoZOs?}y#7M{tFI9smrvd-VIH?9FUei3Z+utE zMd@o1wfd(P#-T@nZv~(yP;ssdTJJ3TR~@R_#ryhH*9i62)&%^!Fn&x(U}Ul*AG_Y5 z@e{l)(??l9b0{>8_1G>>lc$jdJtG$4JRcPbM)ucS_=BBTy2^2gFpj3? zUM$~F{J|=98zJ*C{*)BI%d9|nBXR#gaD5M-TQw57%=WqZP~-~u5LQ2Ur1|IORbI(|`fQeL`Q`Ex_-`%cdUx-oqSM z{r(yF$7kAvUP-J)y@lMILdraZHRgLoOZ)pd-kJd*u|6C67~cRqK6Bo!oG&c5qpo86*%_sdUb9H=Ply?oHup4emDO|{E1F}x2HXR9mhlYww)TzCYX-6m@gY? zt}s4U*m_P7U&Z%)l6WEFOvr{+d=Bs+507J;zl->Z1%ZnAe+YmMWkfQdK4`BlGrp7Y zvOtg0z;W!~q%?3GAT4&678g6w1bk5|{%Y*v z9-ptqKDg|wyCuke*twi7ciD{_*3AO{uh#Se!~t-r$p!8c|C0ysAIE!G#Q7b|H3^`f zlK!u0`>qpqC*b~_8tyNOPD;jc<~S>bQkR+M=NxeKc z$nmRJMh3CI;=Ilz@8fs7_i5+r0xHK)jATkxZvH7#B}O#Kw$by^u0 ze}2SuZwLIKRf+lI8Ao5#LvJm1V8g4)s>O0rm4$KOyZ9gXc@XoPsOpX{F~gxIdnkFyQ{}@Nw)u@9K8y3{+(`@D1rBoi&*1y53o~yA zcn5*lHTs1|pdax6XOp=`tY`2$K|U+YFS@)utQUxP<5l-+^NUHGlEL(V9j=2!}0`v=g>j?YR5N)Wc!F~ksU!bRg-`rx+ z_8+ZYWuEi3@fmq2ANMm%MviLpY4ho7;>EE|=Pw7C3PV&xddk00^*sn-XZ zIxPQ;=ZP41^xId&6*rGTs&QE$j*ldu{lxW?eQF8I4#(lg7UehFA1waM&!SoT+jxBN zOr~~zcUK$la{zW4mOpuip!IjNk^&C^ybkb7D33>qENju9-qt3pe`D4a`CSJxA$#6T zB{`0bM&AYQ2Mue@t@-%gDw`sv8uZJ$+s5Hfv(~25cU`64Vvv$aPerX==N68$|MJ|6 z@vi)N0qEQKe)VpQzf9Z4UFsain_D`yP18Gc?%kB9!Xq0vJ`*za59Gf)8URncz4+Ch zK!oGZA4r{`o{=HUtKg+tk9Dov!2S=nUci1E`v0W#Wqu#vsi+*sI)8cjIrOs*8!hxB z_&Sa)Ytc`AmmJ9B(Sda)beKHkZpqkOi*@vC*BJMT>nRrK-;x}tM;^@O%a;w**Hj0v z@ysRzDKqTfIE`K84D9Y`Ql1LTYT z{PfRZy%+I+<`YspDN=JEaA-`9{=b2ru*YYna2BXl*Iqd_ z2l|=yTKWz;oSX-oKI9p|@5cV1zdz4k>JRcPeqEl0-xUA95%*`@3GhptzaIBb|Nox& zznk$$&O2j)Kp>6(rzP9j{Sop26ae>Uy#H)S_}POOggCYMW#j&!1-vT{fYxq}?}z^v zG;-X~j?8{f&yTbpV;?QiuMO6N0C9i%@n6pa(0B*H|6$Gp-aS!|$D@CQ`&p)B8Fs@K z;toF8x8Elp!2JQg-%Z>f@dx@TrH~B%R+_K%Zuvp@{|Djz9~{^JBjNp}e4Y+`*(Lw} zcj5iudjR*>{)c}w+68gNkq4!8=kF@+e`CFf|1ZS_$X!SO-F0$d+l2FAMX1oTegJq( zOlXbK-)~y+z;3bvcC}O--@n~#F6;uX;A}qKc$GLwdHGE@IeioLtBeBT8Y6D;GMy1# z|30J9tiSuI7as8%+6?sfmke(-5Z6aIEJ$BV^RZ4-&JpBqUcOw%xcmk|Sj)Kn-@Z6A zL#fW?X7K#)-f1o%KfvQZ5xg76b)_EQ7WjW~_V?-k@AZodxV!H_`PXW49)+JJ(ohk1 z5h6cS@NY|A^RiXMV@A$3)f0a=WF22azkK7eoLt8Hx8!7J@4|Cph^Iwf0Mw`iWkYIL zVCAET-;6|D%sbFI+N02~zbM0<$Me_SR;7}UP_l8Z{O%*p#{J;+Y5tm`+30I=HX87u zunhO9({+qHVVt_?g!K1EuQ0xT;sy8QeZc?m8Ld9VJOBU$)3VkM{SUt-346r_|AOZ4 zWy!xS06WcNZHITzZetLB!mNBn5MXyh8>-w!6Qev$ZtXjoMU{I)u_yW!%5 z6LAJ|3JS7urmi(Bm|cfB;@d8&Jbu>K_2CMeN~skrd)3(k#D}8|L-Ra7eR34>Oaj$=zEUEwyspcK6zxr~#iw?0|KS=9_-Su1#6aRc2zFfLAwa$`O9;=Yt#~HY)Wmw^&qq3l z&$qs)0)IEzZyH`B@jN9J0sd*S|Frv7_;+R5)+YjP`2X9jLtiatJb>@7|L?&8Tt7AN zD*V+ES2H0E&>m_u9=aul`(JMSCj9R=*}r!!F~&IWLZ{rvdLMoEwt4<9_!^q{+=VN1 zgT(z`@w*=*PG<;5GO0zDU38;dz%1RQ&_**Q6|bo%K>zmTGSYM`}W^Nom?71yuwrpMxca)UhLD9}n3C z^CL}nrVbgJV6B3sKn92Jr#nWnqnb?toL_@Bq;hu(9}`{Q|^_qp%q zd1I7wC)An)@XtNa6i2==#DTRHRnjk)XAX({oqVvn49{_NQ)}Qk=gm(YV*eN#`-aXB z>FM35690d(A=*jYf05Z|;C;<%1UNtPVjOKV68DcxPw!%WfY4yHyP%=NWic0;_ zhKSo^-@@G;_+En$I?CgX74j%$(<5v*_}7o7fK!w@ii_?AuVbnGT62pO#`{U#+BDBE zF{R{T+}Gwma>m0wgCDwOXP?aE_5mGGS zIu3xoevAp3$MBotci?Y}%zwRr?=M;K*T65r`{`$SuO$8tSk(#Cn!McXg3N*!fMfXo z-OvyG-ES=MyZ7MwI=&CTD<#&`Zd}JQm{R8(=ol(IKOk-ad#JR|LfhAKR$=!yGE0@cwO;Z`)QBNB5pP8S>nhhvgvxPn+^-5 zm7H%f-DWH2m+O)!*n#6GHVqFGm+uk8F+YwC22(lpKFpp1N}tcy!RtQX?(dhu{y<(z z1LFJ}R|}#ko8!)~xx?hy=X9M%iQ_ z9{};O7q2~Cu%}YXWbVfNHS+nNzjN(rd&^IL|I@SBAE({pQ7%e>hIUE(tpCCj4ehF5 z_DXn8Wd3!HxW7LJgb*^dUId>~XbA)oah?ySn~?`VXpxR~X|%5%Xm-u=KBFNokH2@v z(+a-F^V8=eVSN9dPYNQQg82V*JjD2YZ_5pxztEe?&!24Us_Xij$|vnDU3G!3$U$Bo zQG-Q{_kS~WisPuxyd>X1-2ckTdhn*)uEh45OXLr1ncWB640*QI^9uWQWlTO4MnCfz z$66Uz9uBLQ>1Xl<6M`L{8}il{@c*sYFNt~FcfwADUfISx8HhKSKG{bZULVcBesovvoo4CUURjqabQI&Q;$F3%AU=(j{yQSWpQSi317@`Oar zTh-2Vh<=cYz~e#sRa(=R!%LvQ_g1%t7zfdYJp9xSfy_4Yhk2XCGPh)+qgw>9k0{2mDF-i0?#v|41fEsm=8l zVVoj=!HRzRTe9!&k2+XcSy+Pi8PVo$U_XJiuA0F-#t}u$!8m`Hz1lKT0@>4Z#7cd$ zx2GI9%(%__z$5ALs$({-b`<*szhv8gy&Sv(?thw{r@zy>zRf^?%gM1D`-x8<=>a`8)#nqrRZuKLY}9ZXH7n%{YHbTwWyMJ`?l+C1?PG6p-G{53oef`@foc zO4AVk|J%xO_?3MM{auPyy_fZT$~7mK*x#}l+7#rAKtJpdy5JYZJSX?l-!|lGx7Jb87KUF*dGFMnDpnFe9XgoVC~r3J8F1+_sX6E9?OMhBkwc# z5=}gxpWZe4SMYnfwjS>}fIOdu#JoniB025j`4OjA&j)}oX7B?Jz;D>IhVqf7=@|W> za7Y(As@LY@_v6=H+~O3KvtuC_aqF;) ztWrPy!D^GYMgLAM^)~BKHb)Qg_pdkg#fi&54}*m5JNM)2z3fln6LM^!eItcvUt0w2 z%k!qFcm~#C)s?>)h|(_2K3*J# zA6kC4&|kBuHuSHvwplG=;y!1R6acTY!*w_+DxAl%+17_y|4qA_!LNYbt4ewNo{<4@ zjChCv3l;WfLvj@O%2NA-BH~%?6IG9!%z2!5ZbtG^uZY{9tEnYk9mU3o)I$~4DC{%x z$XdPp?(EGU%v0aXk`?irFWW95PdagMlavyvhfbD89%uP8H@|j>^H93iA7;CU>gvQ2 zl)FR8mJ*NgBEFR4UR1(G6IGqI``@gTC#t~n`qcb9@n2_c^;Z%&e@mT9@qUX&obRmd ze6(kV{d1sVJ?e9d<6xKn80#-6-t#2C*NHs-koM8R*t5JoI#6zeUflzpvUjlX;F=}PblO6>b) z`%n(>a&1cgzC(u|Gu7k1#x{eY9`EPW^!(vf8BGz1i??ROh*vyoTNVB83ihL^rw^mP z&sO!MD$#$CcPrWUDEs9`f&B;lGyXj{+uI}z!rq>!x_8}@0{y)WpW8**=`;A)PnD-a z=(iOSl#(0Jv5yP+Z`3945 z8P|bB@%S{~uj`z-fbEt|GH+0#YHm(FRf1#dx+#%(+q$+;BllzJ5XCw6BVRgOL%YHR zz60m0V4FuJPS{~tSIYJZh^or=Q&!JgIjk)93a0C=Dl z$x%x?AehKH&w0je9ip~R3LyW=@4&CuGHye7!3^swEX!HF-V7!)c>spIMT;Ad7XaaJ zhI4gc*CrSM=b)GVl?QO=`tJSfz2ELwYG-`^N*(8S0x-(q{O^|@__dq>{{8Rb9LPiF z`QEePE>DX`_ZPFjp_zd5Lo)6k5`2J>CA6OmLD)%e*@9u>?c=rvO}k7Pm17u}u$y9) z0{f3IoK}}Yp2h&71Px1Ie?~fT{O-7IpLbRvFBbEcVFGqDikBJB?rX1vT@QRcD+=Vx zUP?xE`yXl^<-+cmBL59M;F*Ck@_;p2)b$0}rULiH@HQt5#M@KS3h0v(@a&@^?fcYJ z@F?|fQVQhNL(Wv2U_Xr8wnsg?fXjnF)Rsp(_|02s*vl{5=8w!Z^0+@aCr~Cer$YUl z^5>cPyTZ0&Bj;0>B8^cViAHCr2Of$o%->Paw^HT`-Obs$Y9`Y7X)KoBu!%mF$7F z{{^_QFT?X%Hd?@Pht6a_!{@zIMEktcR$aZlm3nR_(~bEOaq3fQkbI|3F&O9hcIBXM zcPe5Mt4plAd_&#@rI?*fApYJI%woTo@2m}Gz1f$+LkNrVJ+#}i(aQX{&>zc9zTh}; z`r1pU!52BU_Ry3VVtuc9^hGau0K4N^*#C(CN5`d|FCx*=G1&9FwmH}E`}U1$9n9bV zi|LC6+#f6^Ya=X2>$jM=-fG5zjJ#n<^Ma>$+$J6uySYAFwsZyNv2k0o=RDSj$V-ta zFW_;;E4AtUH)%4`-Ux+nOr!r*31T<;GxFAbGlG7z1p6HIu3~=|#n@An=RIdkoL8cg zFa8hyE-3cFPF`YPaj?}}f^zZwDURFpNOL9oUyaJ~@RF_DDzx!>(R3QTonvd$=ojpN zs?v9v`8A3o`ODazGn!h&`YvBCX>9kqOw9N7owf0FtDYa>)3Szj?=iGzULL;_VWWCp zq8$&^UgrJ{&XKM*+I6eU2H0T}Rnx8-@cPeI0q4>FSKRRG#SeE_@&jfDy8|4G|ApBoNzH^?hEG*0e4(~CZ85+vrri}YPR#pbT2g_f` z`@ePT&wufLyt5PjE8umAe+NDe|2}bl#0h$d`=dF4qAbLT=J4@J;Qcn>bh%^V|HSta z_)g+?@4^2OU;T07|B1We{XZ1{U&uqi{F{pMo8bSoNMJzxpExb?|B;!Q8RGxM^NIiS zy>s7@lREy7_s-ShuqUkJ!8u&D05~(?|GXUD`K$YY|3~qcYxmoD_IvlW|5yC~z4h_y z_4I!HpYixB5vQ|&!xH~zJ>QA{gGZmmIMVlF$h8yk{~c)m+xY)`@$`?z{}(N~jsGKm z0{Zp;4){NL54XSXqj>ZOmf4?qEMf9CtABrcd6 z55)g5+&0~g|39aXpAX9e&;b8-9^>_i|Kt725HBa;kA80q!(-q9v}A9n;CF0xJ>YgH z?!^Cz>*shZzn%v`*u%U4Ilcz{)JRjXH~@b;c?8U>yRaXCu*Zkz0+(;mz#At1|55t^ zd>H=!o8kV2e9j(hdj*-}L*(#&$gR$iTpoiDm&EtCI{7@}`5%n?Z^e1=p>aKoI7{kr z#6#B^;;Kd-*Cy}=b9((>j>P%^KneK^*77nlP>8yL@&}O*8F?W$`I?CTr`6;X{B4e} zr^Qba2ORiBmoV8Ft_%F-=;$zTgqk-l)$;!3@F!n;y2~SWl_CGXy~QX@-(3DoAkg+% zF-H8}V7#mUOV8R{+6>{#<5kWi<)wqw^u9;sW|* z`y4Y&+g1>KDMH=E3e{|~fdo!=zE4;~Ib+^9o3U3BdUVUN?RRWASjq-XE^JJVl&X3|snuBpR{jV0wCE&0fuAt&gLDp@be0!ca)P8RWc>_uvme@!SuXoS3`G|Xe zwXyjI<&hVTm7T-+wFjppUVk+DcpiWEl?SzX`hSck!wUVl{;7sq#Gli@V=*<<}muJiu%seek*pVV>s<{G{$b(HP$*jzLHr2#RdP)em%3vrq**#E@S zpX$FB8upYrW|LZw@7Ww{Z{U0N9_>9;fO=RzuySVD1AnR7yo1*hov-b6<9VMd{MtBw z_f~IL`8m{6=gleLGx_%2jh^#vSEsGh5jm9eoY{b;R*cx$!jQ`&wa6HMt8I3y|EwX- za-v^<1@UQ{9n;AFjh)E zmDvdP*{CbD4)jQfzxVs4a@a3>V*a8K?Fxf5^^hGn|KjuDT@gPo^RK^%xERgd@(_6e z>G*l%J0kvX*u?uIpDQn*9R#;2w02pGX@xpSyXEUKpON$5RQ8P~z9-D3Z*#sE`U@*A zJTci=SlCs10X%?h|9uGiDG4nDrWHoy!D#_4d{)A9SBoK^9``?gt5TPy1p2F^$2{fRW^ zmv_drD1ZOF&tPbPzfTOOcX3_;8hez#^IknP%lSrArlx@Vd-m-J`gr}7pG3{%o25_Q z7$V*uX|BGBaaDKXA8Wm+Z}b=C>2s*>$V3pl2e&J8^k@EyPhcNd=l_X$p~PW)yv@{s z@hnG9H*$P5O>>{?iK>Ps^+v&-iK_eW-?pO!#}hYy^j0b4^%rhlVO{|8w*}-(b6C_34X_y zZE1ti&vA5WC@)1nXFT{un!E(l`q?A&Yc`F=L_Sx|CWh$eNvq8vUf=f*{Z|=(AB`R~ zuZEwc%@9gcTGkDk>rvi@o{?YDpE#e`f%qHv|13h5&+7~JJz0X|Q2h1(#_}IT-b9}7 z5zVGB=JACL5qQKvUJgSmx8HZG} zgYX}I2k}cG@D&gj6%qXOZ@zNrNDuvvnHlZWa2?*GH@boQuXJPHr5+5O>z|ZUx8O{VG$`hwm-)1}G*)lWqZvh5bO}tl1Cg+G( zn9QQK8RzHI2^GJ$h3B(9tZ(qZjPxV!ON5nS_+OzALi86NO{iY_F?ZCCz<>E2_{T)x z?JwDO${XR&M!b@9GN_Y>+|r8~LZLRx9lwOxNgdoi$>=%7aY^`6l{iuuM|&8eOB!2P|g z%5@!QDmHacuB*8Fv;6(eowcnzhQD%}dBper!t-oSv?Ln(;G0>_(4Oo0~)q)w1#I4;6PagpO9arcVI zIpFTi*M@^`lzUB$2dVFRqgJ3_TO8H(4;|(C!Q)FIOB_R`&x02Qd_e5h`32e7)3BpT z9g*XLfceois;MgNZsFT`z$LMt$?n}K5BjJ}GI8Fn^C*ZL$NsNo#=#@+a!N8&f+ip1 z`O0m=mzQ?7e5yLgbxH<~e?Gsxz!alhew_J`q`z!``;+RdsnxN9^>~mD2dW7=x?oxvTG^g)|F6O8}v(6 zO8)FR_Osb+(o+K5BB6@lBLV-HEAs21f5kb)t>ZstYd6P>)`Wdh*)Gw_!>BjLQv&}$ zTwRAKQJUIj(2hS+1zwlIq^Ck3UwvYYGXfg$8XSZB=^DlYd zitHfTWsBp)Nl^@=U9`h$lE;arzs{1MGFUpVZC>xgl*#=rXFcjGs16?C{2NKn?;svBHa2#q6yH_eoouT|Jw1T+E}m9( z>^qMIc>XR+VIlD?!DK?dgb5qWo=@<3UPS~iVX3`LG8$NZ>Agk&7vHx|Y-`iMYenhn zd~fhRUe)`nDuTa){0ElGD?G0#sq557Fxx)iM*o6c?qUBk7|+*qU>(*cM$!JIj^0!X zc~`KXP}2^KFW~I5)K-f3#B#|`y_)cg1@*WOpPe~?_4&@d`+%Q=PlE*l@2hEPR@koH zl~yCadmuIzVtIobsb_)nU2AS;`?V#q;E^DYcCQA$$6u|DPtWT-vK6tBz2uR_y;BCp zPa~|?#QQUulrT|+eW0}|@Eo}h$9|RgzbY2%_*zeQnZ?tx1h{{BxgF~({)>Ulj>QIFkn0xOPw&V3bH^TBcOw6@Kah)a zob+t^-uK`=TEP8t^8GyV-0_0_ggoi!k8)H5e+c=Xf29J(JkFo9QE{Cc@2INI&L<|SkWcJ#wx$Hn^}oHa|ApfmG5nvO;e05UTl(FoS5ZvY@OjfUwYB6Cq+7Mr%eF86 z0eHPw$05IdHrvFwb+c$aM%>yI8dI5%Yv0~Z^D#W%g72a|ZwfUdpFiF^mT_|Z)X>#+ zojl)QA{^#>`LNI-p0Dm7fIP4k%M+33vAtIhbZs$7x~>-_Z<-;uqT(;@0qQJeqLhVxL!fF73?#Ue0YNP{?)HeUgG!^6F>Va z_8a53f1>kFe8x~KpJO&fXE;ua1e2B54Y2cdIi#qRZ4F&mM}BARt}`L*PxhU)6@J8_ zzuO;J??RwKw>Ny5nb!^=FM_w&U|{{4poiYF9k3~L z;ej6w5tq*cPn{A!&m#}OhkqzVBnHrV09c?d@Bx??;G=l}EC=taeN^24^fYn3g}8s< zf51tPN_Xb{{{;Z>561r)|Gvb*_z33xN7#HV@qeV-N4!1pa^iaj>iB(>#M5(lIli|J zdd9GT|8L!TC;kuoPW*WIe?dVQ{+^BagJiuSJ|`y+)FBT6_91}34S)YU{{KbrYGKa; z_b0!B_&>Hi$PoWuj13NS{2%4#z9T1z|Kq*8a?c&c^T`v);jY9@8L!NG2K>3{SN9SB zha;{E_0IePzm97!;NIdB;uHL?+wVvk*`JapM2){O(_UKkA9~lB=hj6Y5D-7-r#``yIqyHcDS>XLS zoCA2jA*d4fPh>UV{+q#@a&6b+;y|E+UPQd~y!I~z|L@S}A@IZM4!BH4BX}a=x}A$B z2RuN^wr$@n7Qnxs)mo>+o~8Dia`Y~&2VI%y0O}v{)YbofX<3WgweQd7=evOSyxEHU z@r_$tf&^qK5Uz_BjvyZ_`%S?r@&WSmjoX(!Q?{qC@6`;CmoBP=1g>#&`o40=Z@;>9 zG4cO1OP38Xp5NdT3W(1a6$N$tzxJWI23{A|U769Zqd$HL_iak}fV&{8rJM>AC)qI^ zYvz4>S9LxG9Hu4Woi|Ws2Tt5t2A;sJC4DX2 zDz%^U6mQ)4dyM;U6Yp9>{C{V4%`W2p_a@>f?_%JJbM`#fYrEY|4&wdTzDBEfrlEZ+ z2qN4+z^l!BiTgwzp7UQvUg()OXW!v*_Tg6d@@EPf9)ZFrNBsYYeA0J~>pBdu+j5Iz zI}(A=?}F2MoRGmc4Zjxrn$}h2T%W{{$Dh*h`S1|VBVUxem&bE2olVm2L>#)n<3|fb z_#sQ|9UjCzpu9He;k{fZC7QkZI;7~YBloiZnjcL8uU%p{6)r8H{HJfIS@HoE4;;&I z{a-yg3)~cW{s-5cp?q@il%F_sanN(PpaF3=uN3AXzO?SxiI&S3p8!8;(IF>srZ1ZQ z^FtCmPY9>~?*$Er%N{f!4mDhNs9dOQKtJ-P)ptw{z}qYXh%4`K*{9R$IrKN}O00PlFHZ$LTsOTjsHn7W=Wb+mzq}ISx)=OdYoVEb z-SXvT^Eo_s_8T{oEO(FJED^tdD5>nGJSuBnB|pFy0%|F=Sn z7GRfgdv|BK#P1w?aSQk~rH)oHsPhRbE!vNX<0noG>hV^AU1O+Uzj`Sz<$D+fKd!9;TeO&6ey!svZ#gO;Y z8byC7vHLC3p<%RtbA(HyKZgE}{`OekVVxf$l|5R(`_^{NWqDsb z9h>EST^pZ5yQ7@f)dwm2{eM)z^L@d`J1Ko*!=>lo-yECrg!q2R$MTMn|54kT@Uy=- zo%<`h@Eonib%Xsy^`AP#?+yINa`Z;z-xI}O@;%Pa&it5u(wXX8_^$D)tq-KfxZWq; zQDWD}C;Vj}58vnb!u0+tTz}!1agjKW0nham#I}0G#UZc2O4OTe`^wvRKmF#54MX!7 z1q*n8U55kVY0(89!2cV#{uVxG6Z!`w=0nPD3sRpSx444%pbnmgz7;?>JME)vSSd7MrrvR$4nuGaY$p!`c6qEUFX3%^S>=2e0x;~Jb& ziipei9y?}+|IuS=6Pq|c1x2Zsd6z^_pF;fqX>0Ex2{?RVo~4`fKzvAfi1rTjIp;M` z&~P`_CzFjPbH0Iiz6Jt<1bJ!iwrYDj)O(x z;-0}1(>>Ry&u2!afxGX?FA@%yKikm$XRrM2qH@e@vixN5BCfwNuSK!%OuLMLQ{whw zdOA$$AIp02yOxkYI|Dvgi&m*=7g4?}pE%oq`Qh$(X_j`B;fS0%0US0x834b)-XcA9 z8uOdIC7KQf8(`0QU|3OV2}L4)dqpxB`9AB8Ttc1!rBUebdX)J8>0mI3@AjO(G1gpw zJOE;N_f5)%Ym%@zmtSCy?*>jZ5n>K3svTHONB%9!$0K zZC(HONI`oG_8tAir(d0fp59hnyOZPF?|(5w|CCpq`a|l|sJBHWetEs~z-96PzJtL3 z5{#Sj?jKK-V7yE&S!85Ck9tQ>>HBDmtO0HTe|g03XF0V$x68yGFVt$y7zb6>?tyOl z;}qrcpOZhePP>GBD)rz4sE0ZKwLJXICdL)2i3i@Ge?l~wB>E?=zSve&0(rgL>gV|S z(F*}Re{;=)YODnBcj>T_pkHdry1$mvqlgs~Rq!8q2T$<$Pvonm@ZVJ>MN=F7DTx#F z8~GhaA5DT?_Ok8X$UzI`e5`dl^Ll~?`k4~^Zsnm>_wYMSvAOZp_}%l!W69^2uPHC* zdq)FZ$Y+4Kj&K@yC-?}{3B+@}Y}-F8|AhV~?mx`~s74uv zfzElDd7vm^POW4=T7(mUfN75aUcdqmU=er$@H1oJQ-TJtiQ`};en$x!0Ip9|aXrU+ zhua7K-~U+&zqBd@saHodt4Y_3*-(&iQaw>0cpb<;YZMZ!w{S@8A|ACY>owEQif}X^ z=WRtyqux4gM_ax7CaQ3(L^F&dnoIfGD4o?=h5k(Bl}#*xe^TDio#A~)1|QM;ZP>LF zJca{n)0z{0$@;Zv(G)#v+YH`?BA>;v=G4yA1LsGz7{~`0jLQ1H0KPd*EBM$)kYC(3|vb8NY=#Sl~WoC2!Ii3fPqntR8G*zn9V>|>* z686VlYCq{208Uk6A1eySi1P-6R}gnYf3PTWJo=R88cNVTyNPGU;zrnJAhwDMY*2kM!I_3 z7>_>}#nT*@{i)JY;?$W;@+!|O>PeB~QX6e0Z_d%0O(nMgC)1{~@G}926l9cxeJO_3 zCO6(2{DTDVOOHBdc)s=$<}VaG4ApPrrqE)M+kaU<+n z1IUO!VJALlpTTbd>q!HfF`-I9F z;(S$MLl@%3^X*gSigM!r&Dpe{=SLoF-o^Xng99?9No>Xa@bh9HGhV;DG}=jg)-&c8 zI`F=)Xp)h3)2JK+jsv}~U3sH~{X+-?7eid}%!VlA@|Q>D0rDxAtT28C_LxHnrf<^j zy3xY;aoCg5Ke?|9*Q1?M8T(HI{06MIjMTPQZ+C}Rv)^gSp^5pIgqkLaH-OPS4pB1lj+_b9ME7TWX+mZf5>JK?8 zx0Rs3%+4~82=c|eUL^3oQYb*KmlU)g^^bhoG{y6mW(T_1&&Do`z=6OsG8qi4pJ?qM z_%Yb`e$|=O7L=QfD+D-8<68wFB-`^T57)_&VtW1jCn&XC2kPSNJf6Q#oVUwJzqDpKh1IQ zdp__GIX=vWJiebG{NNDzCI8`vVLTu0Jspcu)@0Rd`gfceQ`ld{<{dTEbDuueQ_J#< zCaK$v`(7KZQQdgHPYQ`!kpH`82l0qb+oC)%OgWuxy+ZqCaGg;g-tY6Zweh_~>~Fy1 zMID)N#3D-S@&v7kRbP`-=vuUwFe zf%C&|M!jAPT-5#S^dI4H6D9ewIe+c@rHAqU2>7S$LOc0scNsQ)&jY)D5rCo`?w^x6 zy#LoFh-r75`zMOXZ^5xu5>t)-v9kqxDe%aP09Rm+@qAJv}(c;GVGZzFT z_BT;UZ>RpgQMS`z3@Wi@>SqFtc@q) zD(&{lN{fZ-qn`3^O9OZ~jEkeaI<3Z#p968>vc*h0)tqNSz2@7&ABX*wZ%;PDQE7$P-)v z_OIEVnGC-xY7#8en?19uF<)(Qbaz=Hkw3?%hFe;ax!AKx#EAT~CZ+KDUYa8}^r9t}Vear;W(Oq2#gVP!5p zoIHTs{s36UzPmpF^8$P@4}ibNV|D!hy>b7;jf=jG42Qs8wghm0 zEUUqH$n7s*uk!+O`2TI(vc3-GxN_%#-`5ex%;D`hN!*kB&f|9qpl^ZmFs*-P zXZ$~^StRbycFvv8@ePRoBi+T;ckzG3^Q?BUJ#yu-pRwIP8vlo#5@6OD%7r}tAB6w2 zoZJ0BHx3pg;<7vs;BT^V7*xmrN;y!Mz#sA0LHuzX@OrM_3~#=p*+xNQe7*u!@CnO%saXPmu&3Z%ao!(#rZuBiSI}JAMpN7z-K=g?>B5MpdS?1Z{z)p z^Y^&ezmQ%{>wunw-xR%Rv&#bni99Ii`)!o?nR7Mr+ZfV_hTP9Vl@$eS-DqJ{6HSNx{C5W?HzR^)!Mura^_Mp zkHL3qb(~e5S^LyGC z8H$34!w+n6`^7IkD+RjB%8(D>;uG_UEpf(E78(BSR^s|MU+c=}ega>c$-YheKNx)Y z&o7|gg*p?l<+$!#dFV0X`Dgxk7k=k&pPuiXUG{w`u+v$4=1au;%L@?if9;8{Cz{;L zzke;DxWi%Y2hh~)-Ua+OY{Rmn%%zC%txaFtwvITfhi|P;i zzKri*xj1j`%h(6OH?$Re0jvW>?G9OjJi0DekHA;ZuQp@-M7xOoipr6hF53MD%gj#7 zq4->e_gSnW{B^)1?===xKx?%M6f^|+e#^17IO5dMNC_PBERithL7y{8&^0IO!S z{`0g$wJ&ubz8EW;neY((V{abH>|p->mDu2ixX(txT1fxspB(dEVf=Q;VCkInAP?Yw z8%Dkpx5Gm84A%`p7yPHd7u2Z~<>z+3rCvk?)%`mcaE5y~&b>f9UVi(=CFXYzukf3B zpI|Wj4&`@GoqC>l#F{yi1^0P8-}?3+@%&^FGIm1FN#{?|zk1Z){t9vU8)Iq>ac#e6 zT7;eL_~kc_T;cl;eARjvfA{2}%qfiI-|zWjSH|g2)%FSb^xM{sh86l{o=OKl zNk82K$=C__$8GDEoruuiL;P+M&q4mSGM1-2oIHObu*J0x4v>qG)z15||9Yw8t4dfr zf%W|>|A)60*BzVg|6}NpL{)9y4TX5}-Z{B~{D6VAqbhj}1A+E~!+4MHdTu_$_ZiO) zW0ak>eXmp;<8#Gq|1kZ_FLbRplV{QV-P3v;dg~9pF}CYmeuwWI>i@zkv%u?d{bwC{ zEN7-W2>&zoxi!eIvYs}M{K+?YEO#}YU_CWI@OSXLA`j~RS4X(+jOAba49|B>-YDjM zYo1>T9)R2RyRV$Tm-lUdE%ImVXOVa^%KnGEnpnq7RGq5m?jhdaeef~h|KYm6n^VB! z>m6^r{(24ZJmu@^4X%Sms%sPU3pjtE-NSxpUY~NY-&n9O1?zLjJ*82OSl;roeQv2M z6yolq$OCTz{{ygAj|u&xHC>1JF1PEMS@g#7y(?6Ym zisj8E4|Y?=ce@q7U)R8o^BVArS4&d+5Kr!^RZcbWyB|tNMf#twcy>4o8cH15o`dEv zzWdFZ=3&bb7s5C{$#&C*7>~aN@%?wo4~y5=@%)d( z^^rHyxy7a5XUNI0XA5ROS%u$?v0+IoW61OA>#Xw#PZENmNUxfARuw{`=jfZRN;oQ&>536S93*^oaZ=iW{H_YtS{YBTR( z9{|s6Ha>Lm3FH;ovj_Y%=0~ahxdeXJOK=<$?_Vc+$0g{sFQ5S%+Vytc%JbRUr@r?n z#>+cD8=R5?ZkO%;uiW1OKNYs;*5hSUkBg%m-`9rKr|Eb1f44D4yrNcvLka%$AEhc0 zzl*pvaUJY|rS_d~I=69rd0iVHq`t7OiOAG5OO?di91jon?MB{E?2r82Wu?4cu;{2? z=N}|B=qK=x=BEZJ=U%N#9>BbHpD1U)i05suZE9xxPoB8|I5GA!)G`*z5;^rE$7f-| znnRS+TUG!^LHXe#;4s*)6W_t-?$1nO)`Ndsk>K}0IVL~y`Hxo>C|_;meV;Q6@Mj&j zb#x?RJYSx&CVAhs)|&0~cX>w!5fAaQtpxmAKBu+%>;+1z)#PWKzl;QlK;vz`p}tn$ z7gk61(w}28GvDX9t@EIS_{x`UjoG3&{fTq3U?jf3@)Oz{c%Ds}tx41G^W>l(`8!{- zDV8bZJq15NxVvJ~v&4Q#E-$CP>lWLa3mUi|j|$$G+jR(um&4!-Y3ht~82Xcb7xDn; zXUW;S{2kH&d_Z1+2ITo#>ExOV`fGs)uyxa~_6KM{jX7N0?*VoR{ywf`zd?6fydb*_ zZX9O>L7-o@rBw-W9uX(J3D%E6sJw^u*%FV#zx$GHamBi)=wCDhhjf3hL7Y-2s?OSc zs(Jxvr)_F#Dy#duX6XFE?TiI-UdKmt$E1EyX_^7=-3;9rQz1qE# z{zNqkSW!M=`={C@h=U@t^+Aqps@eE~ct!ANoQ%m}{V4k15alB-+-StO-0WC!BEOjSMf9;5 zC+!KXd2W>a0K}*5;B{Z(TR+*1a)v*@>@c4fwf1U^clLy$16>?X&WU}L%IH;zc7>Wr z>NvLa$#n*PcTGC+x*IatVTAT9bdqKU8kpD{@lsnMQ(^Hbd_TSXjcarNOMWkH~nK0<}J|heGjuLyrTwj>| zQ+u#ER093=hBoq~8~61`rA9aF-x#Zq-~aI?0Lag}OV+%$nWNny|`vHkX1^6*|0 zRXuQ2uzn2|4g30(qW+}vE|=TUqBbK>9Qfd`2Rp)OAEU`szwqP8)X`h~9{bBzT z93vify*0!8vuU-p9`Bz(Tq(aJIeYLR<*0bEpY^4h3zC%LSlq*LJ94NTxE$u`3*@OU zu}`(egN$dCqzVD`SJfBp`w!Ij)vl%%;)=oWXFtPskOIjmN>2zpR@`^VsTjIYo@Y{k zoeq9G_#5mO=Vk620gV*yOYm6M)T?aIV36_rTO1eKjm7-_>TDv;@ge$xr`aB>Hk5bs zyf1iPK!0CJG$7vJ{#he=9QpQilRM7(){;U6>v2Zqz8U%Up&J_3iP$GOrA9f<4quMp zI8micE6t@S-&7RAdF+RVj;fb4rmFm%HYfRcEL#PE<-&eV=z3SA-US~dw!jw)qrHf` z49eO}r|o6nZ41Y($X}uJ0gz>o^TLLK%0lu(vVGjg8F}iW@+f(P&XGfFINuLQ#jv~U zU8f&g5utsQNcXus?c=sbH14|uoW>9_v)xv$zUwI4xy>)YpFlkqmfSA4?%#K#{t#b` z@qu+O<~P<;<`+ZY5rBUIA^`kA@b|)x3yFDq+rRPv7V!TCoPVW`^CMl_9XNju@6XBG zxIg2Ma(>$P%LUxud5H2D0F(vX->`}Psqa7A)s@5h-!B*Nea4vs=SQ3p^ZlcH0k?aL z{1wxJG#V(4*f#_AQx)=C^>Q2R_Io0T!@8&x!PaQ>Esq6Fvdyf&RLQ6*?I$Tu>Kd@>q%M9@E_h!?I(Fm3=mfU~wU zQ$NcmuS$a9$?xv&tz5x*CKee_@Ol`D2UzY?=n#pjVOuy69-}_WVjl?F3C%UFIxnea zR6sxJT>EBaVHxuSD7&W>+QXyO-YMF(rUF?Uw}CI}JhWjP`m4D=oKM^wID<*oH)iI^ zIA#-kzUIvi)SsfwqP}b=UeKak*C=yyvo8Us=6i=xznP2-e(iy^=f=W6WBI)q4LpDY zYcr|j!*}v&oz=gLG5^4zP;8=Itwoao>dB0DJ&*D0Gsk3s@%~ZRkHr1eB;)^&!_Jp4 z@%pKUZZMDkTEO)E5UH|xPi4P)L~ zZEs4e%4)QO;%Nr{5B_99L3usw+h9DX+qLoHNJ)c!orjSvHm=5dcF(TEI0iq&Glcwc9mtQC zooD@x#<-8iaa*k{V7$Zb7mY^F6C{m6!`vEU6ChlK&u>I(J^Zsw$2E0?}UlI2V$X|}X-!%TetcCrM?euxPY2|Md|IhxFE1%;5-41b43;F+V$Nf(>DvE-< z@WXl@hFm)l|KGax&ba>%#Q%4HIR2l*{c{rdKi=p6EBHU-%-r}R{!cx?`UTGYTkiva z(&`ZYyR`rk-G0^W@qv5{4{Y6a8~;D2=h3*0i!bm27Vv-M@q9P_pZfr?yj*+JPmb{~ zLAK0K-?)M2x!mq>xC6MhbNhA|@&A=jxVQWBLLLD4;gSDD-f%k)0OI2E%vKNl&x#_7 z^iv~_=mYixK)nQ+k5+$fi2im=I|+fuC=mH+8-ZV7-)5ADafEESdz38W{7vu1`F~8j zAG`pJlRTEs{jVsA)7-}W;pYT!kGHDhbxK~xI{0>8|DdQ6_g6kR&fj5x;hxj;ISKsV zjxg}b|K0Kb_s9JMC#!?Ik_fJ6(ccask43l+d2b%!`HkQM0I%@$OqL1PfZzY$-ZO37 zFL_bevWqyz_C`~_e!SE$M4aTGGKI^fC(d~e9XvBl{QvE2>t#=%qb}neExhnVmuLCF zp&xMnWTVMtVLpJuWsBRE0mmPk`r(|OC%|NPFmLh@6cpm_p8+u~1Aaiu-whcyeHn3< z1xDlFKJ@IhCqf;;P0Ryu|C2uKkL+o0e(1G+#@#QjEL_fb|LLDke}m`EPfTgcfUoC8 z<(_iz0IZdjGV%MUIObXYeW|@~z6tm=;zbk4%!74R5Ii`>|KD@Zs#RZl=0X5CLLvDE zKA-r5hn@jLA(c#h8PDCFR+xnyj}I_m<1G5|%w}z*1omS(J%fBb zFWF`Xte+;X{MdT4fq89WD>iwCfta(&eRylsj77bC<8Hanhb+@7XC^x*89 zJL%sni+*AQ&#zt=f&ZYy?lv_1Im`RWt?S!?H#m+;?Go{6_42jLysz!?$Q2%EP1X&Q zut!Ggl}7Y0S6iVZQ2IjYKFZ63m8wB>uJmQ4a1EqZ4?)Wl2|G$><)aiKs zY_ES9{-g(*WAGbIR9$Hn)0CbE)pxk=l9DmK{x`^#1AMQ)ZErW7Lpfi$6nkjc13r30 z@k@ctj$h2Oeo7sZcK)pn$UT*B{GbDIRUsuDBA%{UKEIYcgW1;}08b5ZB+)}MpPxY2 z5Lo50`4A`jQ_`RS(FffBUe+O^IY^A$(~1J+^qN1MZfpSXFa8X5ym>XS_FT9*R!!O_y(npz17cT=`U@_ zcHw-!U3zS}#P>OJbit463!bpj-zXkWH}ky;t(_Xz=|Nurez%uxm4l_ge>z;9YokeF zPrV~PCUx`uyy~!m{@}R$+6?^GSjT#9G_!wR(yTfTFpB*H*-nPy;{0=Uc<-a%s^$GY zLt+>G!=|XF$K|Psx^x)#758Vq#^<#C7NrgdNaFpw5l;Y#35WHHY3JkP{a80*{uVp%d&4Fd=Brdd!+6%O!K-_Rv}ZWO{a>OXTW!~nf#nOgVFj!+9?$`vwJz8RUc_b-hgwSna`D& zmOXRf2`zF@`!ev=ZmMH`@&K}L&dhT@Fc}Ihl*WAFFnMb?UaOIqA3%Hik6r|B-#(N` zBX0n{U`a9TrAd!adiU>h{tOTA+C{&fvA|qTo&az;s0fVIaP|_uWloR_`Y?5o869~G&$yXuN|H%)_gB1eu(UGYqA7>CNbQn((h$0uaKxun`+Z1>AyUZZB3WZ z57E0uACIn6yTQl7eD@E3v6}bA&)oVioG(TH*c|*THmfK{$(uVPw!z=B#GW{zD)jd> ziGIYhEV1t!c=#OsS?Xs?;eQ#o{YRt0QjhZk1D4fcj8o+MjMFa^oR4bsQ&!6HDa0GD z-K}P8xgVpijqypxZC%n)iFmdsgwE41cH-`}B`klZ;=8K^-=$`!ke~G>o3B#CK8)Cx z@k9mkD7<8g&Rs9-a2;FQTPaJ_Z`MvpBTncG4vw;Z{!^q|W_~B?3(lJe?}G#nK+8f; zgRh6bVI1Gd2OtjsYT^U(0tkDIfMEjQq2OnW*ndF-fF1x(5&A5L`%~{zue~eb_u=uP zcP0HmI7R`K^p9*od>6#8n zrVjcU`=3*eQpTh%iTGJ_P4x)zlA&dl`Qz|sjtt0_65!VnCFG-j^SBfP{&HY#FqZXl z|IvQGd4PV=%TidQKP;UH2kCzV3?&lx7eyhTe#yDULGT6+tkp82pZCR;>9~&fXAwVf z2mW6v_sjgfxo}Y7{VCZ}$oI)J+}%gHYTz?gjuWl?U<$kXRE;N;Ed8+-!PG{X4vMh} zyk|HY^I?|^Td9w{ieZ~cilU#Kt=a(`cZq$titR?fu25)|*^k=-DP2ld5qQ)W?V`zS zAr3WnrEi)tl%Lp*?}WYN7x}&D7Dh_IJYn{KJPu6b_(2b!RfjF96=qb2~8};rCBz z^!q!42o&S{&#gBDk4E04WW(RnzG%8pjQxPzv=0Q@Evd+9;NG;m$KuRmAY1N=@;y$7 zF>e>`kqX40u`{;)5`axW(Z=qtq6j?T+GUa?Hbqh4)&_#v#mkzXKRKslw3 zt&KO%xltbvG&MFZMg6C~+i@7}Vmr1lNukZDSkt>lLm_&X#vgAl4+*?aTR(lmLK~!Li)MH;S5wNjU zsft)qA`tRArhwSWs>3+fQEU_n#o>&Aaoy6QK@nh;8=I2sIO!`*SGGumszq=h5v&}F z5I|zy_YDn8QS8KayYA|HkN<4WV1ArAXP>?I+27v#_$L z84O#_#W{bv9LlK&gRnO!@i@*B=6VUdxESdzb(1Ab89W?`eI*N%B@%=3VRXt zn~y6#wnMR6^>Hn%ZULSQxj23;OKOl~4U}8RyKkqzSFq0Ed$-m`wSRtv_LJn-kQWZ* z^z~c|pJO&zEaZz$_}AVg4r) znHIJy9F~jtJdfn_qCad>d>77Nt_k>$Tw*&)3~xTm>s!5(h${m=?e*Rz@_QEh;x6!$ znBzWZh%?a^F^^W-KOcHK1>D&d^l@KY;P>O1law>VdkwFXDnV}<$2E}4U46?&fpbKQSJ{cbnIOT zd?l?Wfs6Fo`d@irhV*Y+vCk^TWpmZ$evEgme01>V{NB$FC>hGlfVZ$<8-CvtDADu& z9SxpC9JkH=AuE5M^cwNrmuz=c7Ji!FYc4&dvH!f@vb#xTNxp~UVki>>I__UGJk0U+ z1_ywzBYroM2{xg>d;|B~MSAH>R-b=|27=IUD}hsmjgO*T2RvGa@jFl}uU`9f|VyJtA=we22;WeI7?o>-EHIS1;#0K|M7w@KfSuSpSsTH_MW5 z+Wn{#<)!Ai9!jQX9$;KRCY?asBJkOC<~8!++6K>V(v#Y#!v!44SiVN5P`}Gu=vTx8 z#%{&|+>8f+xgZh$UjxOi#{t04NBkf7rr~VkSsh3C|4SUe63%~X{r*za@Bejp|A)i< z^L|^Ozo^+{Tz0drG3@*8-~LX|?Rfv~$4mIW3HB)PegNmBAfUwC4Z}-x7WTu7w%Hww z55Rs_7QsmS)0CUhaqkTwxyprkg>onTod2y?0wBfh1hgZwlQSi%9bs3%1^I~i9c z#sj1z*L}ppwU{9BxfS<(@$XSDz;@kd2vR>(C^6_c_<>GI57CdXzHkZGzb<+auTpBi zkd+X>j`%#S_w&3ilD?}%pWlYS8Q$-Cb_?VHB&#mBpa%w6=Mww$^oBRN;McDvQ!HDeO>vWUPt41$7jF467{$c*5ggM5f9MczmDrQlq<8o zjFrrUY{qI0_U;a^cN)Jt<~8UINPIa9JGRW8K>-=cLF7Z|{pbzEhpDfE^Yin(4&^8_ zq=#EFN$L-WV;*tEiJC=iT#rYB-KG{oPsvE+=Xp(2%!pD1bq`bio3@;qCDbUVEy(z@QM#CoJ`eQL`A^D`-BAC{Lwzgz0 zuwF|4-J2)2VZZoHdI9xGevEZYsE_LsbLAJlg=oQzMoESpjq$)f66`l`N7oE-cP-oL z<+0g3eU;Zs^#`wC2GtgSVAbOW9xL`g{q2ta~zvNHAx_GQ7FJW{K^|BnABV^fH?L$`PE z_@LHlAU>az{g^+PUxAb4CtIO4rt8bQRFB^Outy^<@adhgIjn0?Pg9BvQC~@yrJxJr zo0H1m&z-6{B^H9;5&s%s{1yCuVL@UX%NPFI8z4V+%%*3jYEIZD>kebyVtsn|#d*H> z-qngqK39d3L9SCrwE)%&E9{z9e~A2CoJyh{E9}X2kD@L^udOV-3w0$#TSAKIb!bA0 zfc}SmRNX4q?UKC8&-fH$!LlOiXQb!tYC^ndK$MVgHf1X@3|wcs_6|dD)6SJL4>iFK zL!O%B-%3U3vnu8xc8<7NkFLB^+&2vUq{jj5*bdzPm+@EP_3vF50C+M4-Uxn|;CUx zUYxs^_;suo6t6K5{|C&5I{v`N;g2KkuW23+aet_B>}I)MU+3m=cjEqB|K^W%{2zed z&F>@r?{E|>TEy( z1LFVuKH~q__F#_qKioIK{hOFCjQX0typI9nD{hTj7;z(>0v(gbm5YEgGf(*@z9}x% zn@9g^2q5}p{D0Z9_s0L1FMr?sf8?8A!(Tq{{MP(`e#eK#{}G2m9R23_L|Cic(vws15$~V7rMDL&XJAS|Xf8yu~9rrK7e%}Ga8;vl|2!65Ycluj& z7Xuik|9N(Hco=zUsI$3zdH%Z@KTut5fPZ=^9-|1jKf(rqPh%edO#GYkW5m5@Pc`yB z&+5;m|C{4*JN}rv~XRUDv2WR zlT1Px{p#^Rpo{k}&b@R4$L^ECPo5^;uN51C|Nk5CegOIc-t(L4`ZHhuCQd@!pEwHY z$Ed$K&p(g%=PB(+*j+Ly+=Z|YS5V#u^YZ>b8hyXKf8rp3{XM|V8WGnEeJ3_9q96e4 z9rvIB4)6#6AEFQlasNGDua~&RXR5sh8F9jIsDy}8Ote8071ZGqq4)i|EJ zmSdgezUg~c`~2IS*JgJu$WH)|D;M;50{B7pT>1W4x6wFQnys8R$ z`s9PX+bWKsPQdn`t$7Ie`LgAA|Cl)XtHb}j^N&Fbia)-y0(2tq!$%lTkjtH^24C+l z6cdBQ)2+(&huMB>RZL@@HN(llw^+yjQs}Jz3gW7RVxmO`pC;03iuc7%elaY=KB%x- zt$%XtiofVF1@Q+j`z86P?@vI@k3XJT^_}L<~umdME7$o44OO$oWF@Gfb zIV8!AI%)8GpiocVPtJ9EcYn{H(Qe!o=<3kpO#^Czeutg)S=jl#ws=B{&_4CT?q_`{ z#68eoWlN&YYZK@vs(f+!2Mj?=A8~`0T-$RZ;!=~vkC&i+8R|bzct)@eTZo>E5}GcGRc7ICS&|`R}=wbC-zUW)5j- zUf+Iba)EwSi|ObK%wKY424v!&LsKsViIdMPDyUP?RQs54XCZNn3E6n38}el+bk@k@ zV+nVb?>RSk0dYqzXWjK=V#HlmyZh@N_)`-#hlUfa^pnQp!yWV=EngQ~EZPr$8S07> zH&xTFLkZlkHcsXkj}UV{IL7vrzA<@{$8~d?G~(;8NV16Y&Of;0znO@ycSzNf#O*JR zeGMok{Mb^%VdkBSF(pJhe^?CM!}s+~b{*w9Pumo$3os85!N|NG9jH*g&8GFtGR zEA5|-?7PC}Ti(Vw`VfbPQFZE|2ozsEA5xMU;b?#%d*A7b$ja6pq{sD z)jT>rH5sjvd0tDO{NKq(vaB2>jjNL``W51PUxt4V{=`f23#4-Mk)Lor{J7IP*M)YL zxg!^tKW3B<;`_kQrziAy>u-Kx@qe&gDJ6B5@c_ZAFKA~QUA1opRUg}(95|0z*ySw$ zoWH_^IFpG(i$^$)r`2oVXY@XB6*4b zFX8)~e~|m=ZBnO$xQ1cYqvQRD5dX{mgW6f6(+`v1e=FYamC#$Lw~ckdR1KbwKk`48 z8*6UrGacW@`Cm`T&q(WakYag-ct7Czn)dHN#YUq^(hx`Ho=p!t!+P_AM6G<*Jvs2^ z9>$kVq?>^|L+=_ozR5U%rc|BdtlQP-J~!#FIo7w7K&{P`ykC$#-{x7j<7G&byB)9u6W%fGQrCBE;EX$QCufWaW> z@oQ%?nXgdK8SXGc@3=dihU#kK{VDB>s1M-otgEX=Jb=B;EFFzfKNT0R()Yp1W$Igq z+Z#DKo)ti%6deP_IuuT3B)tlIIg+6JtF7L@bNA zG}Hyy?bvYT3Dm=AXjq`Xe%GEqZ>JonEX)1W-HClKH0_l;j`hKgcdWUB_&oy_tmhFQ zuzmYKZRb3Vjh{o@DB@()j!E+68TSJVtoOge@nzt_y|z_vDBWMe@tQS;`-T081NiA* z9?;_iVD}4%FI%>~8v9Hk&%SDRT`BCRD)VO%Z-n|YPNxUQwk?t90P`IT(%>UHo>O4F zm+!5>1`MQX)}xR_-!tilp9cH<`kn_~ePUzDwXE(B8_4Ej^jDdZ zLEzWO%Sa`^Nb*FMx6qwi~iN2n9zlM3tQDA zLuSgw{#b#La&*LONmH+Dr#1+%XPrBpun?fv4JH`y&L+gyNa(M8JV4ib#se@uK#4J~ zjr9R!=t;|#qGQ;fmfkt|)!^q!Ecu&#!62mbWt+8fOPKjC>Ai=rpD6OFlLh*? z*GD!99M=PjA&lFLw$5+@^-Y0~&S^hoK9eVC6sAxIU~GaoXwyd7YSoDMXo0{e?EsXo zC@2LzpvgY+vty!O-!HS|E+IfasZ$LmiQj0MYm=yl$~=FQehfT}eoM)05*TM-jYTuW z=Nj5`Rpf_1yYX5b^{Q2yTjYDBLILR^Z0Bi>-DM$M#wi$f0` z8AQGx{KeT6aDLFtrA_o7j~>kW`J5Z!x6hF_jAxGXIhHM3e6Vut#_&9F#I3da)ENAi z+iC~R1rf@Pxl~Hvaope?aN+lGY6f=V*4nGjRQai=ldTIG;;HJxX_fS+pZvdK_v87C zhkLR-KKctyrJdk64?#~tfBKRs;`Q^RsDFj?UFz`;(oI{!Cg|PTgBK5<1K-#7-#ygO zhxeGxhY$#U)Rp{$5LB?`%_Sml2rJ9M@BWY76L- zlvQlsV>9=_u0Vh0SU;<@w*Jjb9Q|hZOd3p-J9Tv#k^SF2uX=g??xIhj3Jvl*##(aFy_C;?dM;t^vHv_vCaR4E6C*_H8I0yZ4 z8T&LZ{(y2Yne13beX=DotH&L9*A}ep0!}-Jz*|1gb4brCw4vP5FrSNcnxFAXio-@yJD>SG@H3e>}2-J;{RJNJ5Az+sGU_w_RlAf0C1%#Kcam97tnOY_y)I{70P?D)A?Zj2MJ|E(|X-Ag@i?9EJua#njjqRVI4_qyCgHM#`l zw-zfXpnQEM5DsarnLbjMFr!HMtc$o81 z3@muK{u{`&ddPcDK%z5?y*Wv))!TEnp{r)_z|3Rt0vl@=cn|@in4uIkI zV;@$gD2KSr=lA(JK6>7N^>$Q~oYwPAZ^!#@KV}>%aB$e2pu@!XU$lW}mu)=16bFFA zV#=?WA_>F=gMXKic${-{o?!o|p_q^JTNqrN(C4|qcS_fn-XQ9nL(>fJd6V>QZ8LCc ztcNF(|DD&Jn~YCVKISf@^?20_*B|%s_XG+2U_SYiV zXAaMs7?(CJ>7#U-`g6C|0r`l14RS4qXvdqBx-qs3=0f{Q*wx}>P9rt>R1axfJ&66} zPuO<8Ra`)PcutX|Dd5^#m9?003uE&!f%9u_EC)Sxxn?g4h9%sP(-onR+&R){F+VoP zIsifO)Vz%GOf3%GEkk3}Zg*~DKP~1a(cdfVQ7xv+RnN4Xq@2p+7LZRZ+Pb7jw3K!m z^4BS+q);*R+DiKo=~_MINusr`j`pIOlulhh~L zMMq4xYZqfC+6@&&Mgu9f(TP((R2ziIw%YqY^JJN!i*g{g>sizXfj$hGO#D90y=!MF z`XwMGbC>@x86a&v)!IQthwgZiTFk3M6NqEW7gUcRb%SWoK^@KweOI2?=CCEAYt(3&=8 z+maIV^FxZ__jfpU9^`R$@x}z>15Bn2>QtQA zIHYM$leQ%_?F8OW`ObEkOh*0tiuzBDPGLP67c(jSd$s!RKGNSa zco)bYhcs8c&g<^eR=#B zaRB?MZx{~%b%VM9zz?fGTwMUv3ovni0F*lu%RBFP28%4&MC*#$-!U5ke17|t=va9t zaOaV5h`4+%`i0fRt(Gr07Z8^eMVAY41dUkkZYQo^Rb{m@t^n}q(OdC<;={!MS=XO+ z|B*J|K>QzYyOVkU^waVA4p8O^!(I3;4p00aw-x2_&OE+P{2z6t-^Kq&5O07wLh=0X zj{>(Mj+>7oARY_YuzLjbeer+nACSKu_XGdewD-sV?`M2~M*N@ONBn<_u%dQl<$A?+Y;X`;mpMU75v@A{}cN-&cv@d&fq)bhg4Uy z?teA@J_`QN@xF=sFXjK|`;GI8<9c%(YB~k{<$u4OepLLQ^MHJk?}t2P|8joh`SCYV z9sl3FdGqb{|ABvF-|y|)!7sqY7Zy1Ff}k$#1F*0#dutqk_XF(%;A(_;Gq@UE@XIgl zi(x1zC>HQsRh6(WJM!!>KE(gozj?g>cFKG>@(=yU96#d!9B<iT4>gq~3gef%m1i=Jy*6d-%NH zRM($)$xS?jc>g`~yw&SL zak%V13jY70^ZsGCa^D;72aNC7A^Z7#)mXnEE_`?n`@aHD(X`Dn@QKL6j=yByrP)-3 zyncIIf%%XANNB@;&+fE{^KIsPlzE@O&;3mo_JRi9Qi*!0XMz7<->=X5k#8SbWiF^V zcGhhuXm|!V1N7Ee>^tAr7|&$dU&ebh?O#XzsE=%vm43zr6s)q=tvZJNBo+=iWZ*$v z(x68GVi_2S0^jIr6eF2&&X32#KS2H@@^*;H)&GoTxOj61^CqAHsbuQL|osGxx!+?{sAZbk7rvi z^0}AdC+mp!uX{x4CpAf#hRS39PVH4~k@tLl>?74}{G5|Rt+tLX!#FxM|a&*&JhFMIy^5d6Zmld}0S<_Fe$)F9V&{f_QZ z;HplGsc#G4Ycl`dp`vEd`G>|1t_-?=zkO6&oj$>3ZV$lP_oR z9OQX@DGWL4a=L>P@RyX;iVNCv%-3p}4er^7ew+?&iLx##!ng(cYd3~&{LGFz1hFH2 z3)|lrnfwLwyrN(FRsrchrVk*$tE_fq@5I}r-}1e>iPw$J)#vzod-99sv-rLgHc%DO zPX|3Q?Lsx}D_E$C@M;tiTb3V%)>AaFCBP|iX>E-vzi<*_Vdr!Z-S_b|$y5^4; z`F!}*F%M@?q6sfh`_q9S$L}cx(oaSHR+|Ft1=c_4LrQI;sxs<`Qi1~ z2Nu{rN4{~XnSQ5*_B!2P|78E@Tl5#S&&1PQ53E}!lb`IWwR8*lEA{rghwb!A$yR>9 zWp#F*{E~KKMgd+CLU<*Vjki_Hy6W zQhWW_8((C*l;j(q5HMbU+BWXwvE*xvkiWvxTOFk8gKwnRKj6b4uam6n`WYwTfrEkl zvSs<1Va62{$O@(q^7F#Vxh}M~UAv~1VqIql=S238!Lf+-IqH)_FRsLT9C~FZ*Ga?J zH;m(l(`$74A@F|sH?WQhi|7Xliiz{u00l=1HTEv{0b@z1XA z+gNQImHns#bkL)LKN`pGNvuVjfzwbt|0LrOhX2blv_@>~?99GEeYN4#9Ih|gzdRO8 z-UWSR^z})1fG!AM$T8k5w(zEd`cRbQ`72M9w-twDp_h@re<-QU`+=V#Z*Mi@zzRNA zQbxU(YtXQN65=dh2oBI*5`SpW_cIXI3K7-=FbKhU8T#WVo1`Au-`w_-R8DKg7oKiO z4A8EMkDNe+#k6~q@+S7ZfgSqFMF;Wy2kYt%$*ku0GM#xTELMCs-GtPkQR(6~};ZKeY+_^&Dv|S|)yndKrGn<%kzR zeCl?L=hoV5@qNiI%#Xgs6yynTInUcO#EmrM+0)O^fA^T&-1(Btw*1S8gTcO&gP|hU z|F3p5)Cv1b?RPh5UoPJdy#Fs78btS0&F|OM?H+NzXgj>9U7{aj_8V8ObG~WOSb*{* zq%B_3{eFrsr27HahV59N*wd~^dMo@A?YY)8{WpfPLPII;KfcU=p3e!01HknWAAq<< z>cR4gq9gRf8IAsZe6C}Itk1K5N~gz}XR(lrT;ug)b={q$Z)B>^(4P~tnmbAFDFcpb z|FP{m-wv8CBOfG?&IR@B>K=pN{e-Pzxfyvn%*P#%(%;{1O8 zey2iHStaVE+Oo+U{H5?OsOB?_ObFeXaI1zdKg7xfHuK*cxC+ z(7ze#Q_Pf4$AVHN^=#~v6>OxB#IC_AufB;1;po zloPkc18DHGg8y|n(&Z!`KsiaAK#vE&gNgs&XXide#N~)1=y?8Z^quoakkfz1b;M=* z;DBaa0${uMps+V36>kS#CuyVn{+3MJ!}Qmp{y?M@^3^M55Iypetz&ZDL7IS_NI%vj z^28JLV<`&!Tq8AdHWwwnT#&gJb+=dA|Mcp_sE%)D)Wj6(p2h)m!hdSZotO1In7W4- zTvNd7;SMm8kCn|zigMpG(-(5VUpJvL|FhTTX-~&FuJdEPPZQtQBx!_rzYIS%^E$OF zsn_{?gToQy`!w0_WBZD|KaFx;C~Gqle0~-IDEyv^O8DU+-^UI-yqA7BLt$kZ<^AaB z?#Y$-eKrygu$_=|^dr_7g+&MbZsY09&=L+MOQ1DMI0rxQRE?-Grarqhu|=Clctw{6fA_ z^f?osBWpwRyxtGTyiVn0j^|N6rj*|!54NbZ$GRenr$pX3I+V{Tld>85-^HjHBMw-( zx}$^hw=k6j|CH9gR+U<$ef6wRIj{HM>9ofAYwqpU?H&<+Q|KM+s}rgq9qsoco?&b4 zu5>WsLjPql3E-8;yN`twK0g;8_#IO0h%-#PY(dR5kRDE5?IAtjiK;qZ&m;om50u%1 z|No_$D`m2ozt;^stMkRfk&X`X5z36C{x9MHvf8*#BN=xY^8ekF&jGi6$yQ{MZ;0pz zqY#^8y9DVJ>}bRdM>M^^+7c#cPgia4jHIxi+PfDKC)(xg?|-bw)aGtc=f*to25{X=HeY7RPFhtF+Rc6f-T?go99+^Mk5|~Ax2{XMKsDK{Q%i*a+@;hW zNvn}2=mUfA%wFb&8iaKwUYE%<-d9ShK5&hG_K0?&QQE*6-X&f4(SQyMXuAw9ZbJQxC;rQi3>8BB~Vg zdD#s2nMU1*V9>~M4}~li^0ge+&_65e&PdS9`gI>dDVov@RG#m z)?bfG#Q#k#`~DnuxZNwJPSGBh&xa~F4u*K8#OE6Bi^usKAr$hHPt3)4D%W(=y?Gop;8d;QJzt;|8e;gO?YxOA>(vWFMU(9J~$Q|I( z*%`fGr3)7Zc%KOW%{KJsrtm1%6Oa?<=};ZKJaN@#kzjBCp{qk7TeL@GK)F@ z#6dp>`vCIbi{E~h{nlYB2S049t@C7BIj<7;R9Y#YGwFDo@*D9*3g^uw_#en`$h*yu zKg|`J5r2XC_}T)#r>yqyjl+o3$Nm`Dn4IxmLQ=bqR@$zp8I|%M>ZX-=ewiRdsV7bb z4ElaBs-%i~+*mG`V7=?ZZOk`D-5ST}a^N}}i_K=Ej{DDTt|;1%e(?uY%89ab5%{lG z+MkU?pXc{^M;bJa$HGH@znnDGXEbn}v}E{nDfkWUDrqIY8){g`jT}ztop=DpFU12e z-ft-$;Qi|Y5dWt=aBCa@%!}>+Z;b<3!uvl+{r(S%_vf$s;JAPF$3DLNmvDb9{J2i| zPETLo?KuDY9p`cWJf-}CnWf7Yjd*|Uiu7 z7yhRj)D?|!zO7y@rCg|wZ<1qUTvwZ{u|?`vZ_9JA|F+f^Y+8y7P!F|lqTFlHq!RFR zZFy(MdGfUs&A_gO|H)!4J=?h6-mJ!TySTzcTz`fA<6AN^ubY%Tb$R31Mr;yJEF zYb)!L$0yqkQ@&ov)jzi$biVH3J(qz`cO=pQ?vtL=lrqNgdbD&)z8*b~>pUs>E$;gc z+?BY0|GJ^*h#MB1HHJ9a9$Px0Hqc)8s`GP?Iv?4%HnxcPKJ2q0Z-`C1;lENm4fH48 z-BVg|-oLdL%O?2q5HDvggxq||7EX^xDKCtQwn!QfEbD1s=DuFPK)DlEtQar&71VtV z)OTeA3wS%?Lj^_Q@4+Ap*&5)!XdvxIlQd}3e=n0VDo+${yFi~0MAr%1j996j6ao;(3L=gFe3`^M7GSQW2mC*VjDVb;SP{ug;D3;CLbzm3clqlSTY>&&Emw{IU*!D2X{z zxLsoUeUY5T-v#*jxgLD-8SOCjey(4D9z{K{;3VQk9^ELW79IR9lL?H8eo+Pm6Zw67 zT!dYZIAtlmm-EjPt+cS8?lhattQ)0e5{MVWzBp=2nsWKLTm^kPWiu+d9Qh;tlnj1G zUAnfmYc9;sq*TH_dS4ZuICRf(N0?|jrf9!$=W&SRsILgfF4zg^jZ>hiVTK%%~=?fyo;rJ~pm z9QKrKG0Fb&wxp^i?6^Lm?r9&{cfa%5h&o67-(s;85vP9jM?X44oS!)9df?*q_-g|G z4_MsT)Of!WVSyr#nO9BxpExA(f5rz)w~DBofZ?k1_`Z(+ zhe9EElk|M*JpRviAg*QSd*lB-J@1eIbN>J*?pvz=|Lbsn45ymU2hQia68~R>LLvT- zGV%r;|A!tS^ZD^1{ttb% zUB~}HZ^i%F@A>Cqel@o4+lNs@Jq!Hh<6)Tp&+*RpzuS*`320Bg|K1P(=XDT6?@?#r zqvii|9$>n?+unEEjsE?x_&?zP_r?G1z|*n6hcnO5jJKGbJu`eO{$BuwCx0MJfO+xU z$9@^(2Us6~cs%p)^W#vCIsoM7B2dVM^89l-Z;;pH%HxH%MW;_pJ1I0T2j~5aD zXPk?k=d9=LBi%^=Vu3gp?pMHek^fl#zroYKke~NFHW-%`5&!4@0Hi1jfVhLA{j;+_ zDj;2IKQi<}J#+M5Z-D~#!(WZ}uX-8&@bUJH!2G#4GA$3%kM9jg8%VF^=$}UY-SRba z@On2|H=Ta{S8)G#@qS@{Re>QO;C+UGb0;bF)d#QZ58NLf7UKQVhsg7Xer9~70R3G9 zyBX`cJkFn|>uX_0d-LbFLN6lT3)ZiW{~H(wung_g;{ou`Qe42Ycj*7R_<(%gKk-Pg z!}jtv;BG>zW^V(&wTpN>>~XYn+I_j^J`d|{Vm}{8-Hs`IM|XFfo}VXJL-1qayO%HT zo_4#OrXq8(0G#EzQW9BpY7&$+Tv;8HfP-rW?I1KU5(2Nupb3*hn*;#;|G5E zHZ~q64wKumxgYtE`%RH7@cXmwz@bB!KYi}eKlXfmdfzr@;-QC8mw2kCaBZfwXg_eU zwa6bwJc{YwRoFiV`x3V=B)S?`*2Y`+>D1CUH+I&IIQR<(3-}!d=?hUm-Y?0K&722H z|NJkwpFm1mW2!jj>um5G*g^b1_@(e;I{qJ4CD`lx)*)e@xPLnL)vKfpZGCgxFJQ7! z9>hM(ZHjujg}79qbf-xMzZ+19lko|Lgc^C-|E0Ejl|}6&;tK|5GN?Py+-Xq`ALRS5 zxMuMk*cpCXBFFW?h7DEaD!zyLZnsn7k=(aq+q?B~%eZd$qW^W=pLU`F`=8MsR5Ptu zAG~PudWSov5a*5hw|e}yHu5$A(eq!5oOL(V$`#pu`Vkg9 zS_AT>o!XbqH_?APqfPu_6Z~p^d? zuB#K#uJ0=6A7lG0Rw>EnSfgX`7rLCEyCE;qA5(hnwb%K+&&fm0?`u^4G*@Xy#r8te(IXgtrzdwM$NMfy^t-y81Al#V4e5(5f#MPPb7#iW zPj%rr+dXZ&>8CwB^!BUt>lDP(YeyOj?Ut$vQ&Dr5^BcvJXV~tBEi;Lp;P&c8_el4*R{wdV!5+Az8>xI6^4X!id zff@MaP$&4zaja_#?FYv+%u?hdR+vOm@!I%2udh<182xE?A#aZBamge+#dfr+_rY%l z9PPlvkQ>0EdKs^b{Z#9mQSK*^9oh`P9rAXuUZbDw;K+GEco z0^mRUaE|_ft+j7k&u6Exa-LMbE@1p>AM4BNaSLyrQm&F87pD{-=A&~@@a20s@0_if zG@pB|vvCjKXXz*oktWt}>0o=VjGQdw`U+;#EZ5r~4e!67xEcJT=tn67e<|vzD_AF> zzXK>BK)=eZdH&mQ9^!e8P7zPA&AIIze6Fk(Wwbtd6UX~E;{U`A@pl&Tsi%7>PD|39 zSrK@?!JzGYhoYX8e*7Mkb*%Q(g%KTJT))jxzHO@yyIjj z!{-S{zk6VMAL_~&D{oLg48<<|9^(MIttKO{pSmO7!sj1z#rN{PM!~v~&xQN^2=VZr z)y>c2`o_zNYkSz9uD8SgnfJd?u{uaxe){+`6SPkb?fWTkP}nKfNJBIHazR&ih&X@2 zE4#;DenQxPC40Dm?f!I0bOX<8o`Y}W{(YuZp_mLD-(|NL{eDw(!E}eW8Tt|X2Nolq zt?kEHP%+Ow;x?I3SJiE}`dS=OW{5vn|1{z=-6)fz*9Wi+wqjo==t~5IG9IA5t^JT2 z@7r|O51)M*_SJ*C_oIEt{|~mR#Q(KdcK;FL1Kg(7rlXXn3%hphIfX*N4qaLza z!?J*Wh>I%X0YubQ&@}evL@JQDnLP zRfN||lv_|cCe9aW=2_s7qAiULBDTT5)n^sV%=iEDZiik6qj)0pb9>w6nolereU*NM z&b4Zod|qZ%|AqIrw?xj9F2-D8=JSs?ctq3w7j3UhHao&6|lIt}?I2?~tozxsY-!7J9OS z`el1H<}c`+V@EY{f0+3a>2?6mcR&$^fbISd>9cQ*cOwVqevzeEL`}2mIqDoB2n|Y5K>sh!5in|5wxld#V?8Ba~1VQ2H zvBos+C(@ott2|#77-NTA{a`S}YYL|NG<= z^7nyLCsY;n%I%(Z#?wHb3mv+Blv7hy9(R^-zg6&|SCCzJj`CN3b+`-f5mm;gAl`BF zBKRKrSY=XkIJOVu!j|$NT0OS0!#ZRYls~Dh1gNE!TC0NwJA>Tg&>&(J$Z&-}RGR516b^{s7}! zoAN&vBYr>la0Yf2#Ruz$zJg=aY)jsvQfa#^_=0WLLFll{BnbL1bj{pxPw}0%EubZ3Ej#^4lKYKhQ>3;o-gXTiY-_a*GRJcGruoH=|KeHhPJ%M%A z!!f=6fWZ~MXXQ$t{@k&}z9AR%)P+PsZ9;qc9sNbb%UdQVfq$>C_s?0CCeYlV)I~k; zbR=ycKX=Ep*GSK}eR%E)``Z&D^Z?=kq==5AOD0K%d}16#E8889w>GZ?4gox(SpV*> zqrl^UcL$^p^8kGUOSR2(=AeGL0-!>YSUJH6gLP3Ui-JVgGkJ(Kl}lJ6wHjCr@M z_SNTA-R{n1JB;Le>#E<~!ghJGl8N8>04m?PK>dS~#Pep0aSzX?{)RK*nzYOtd%pc%nkB2qV;WOBos;1ZGlhQ2-@R=YbRnGGgi;|>#FGPTD z8RT(^Whr0MWHkK=pC_3*%$!H{EpgO|fj*hmCit9o6a*&z9}$Ey>Vu?gHS_nKJ0HY4 z{n3qe4Vu8;F^x;sJ`3xb&na>c_&@YST^-jkak&C^^-B9bHIm>uTkE&_$set1 zIzqm$ICT;FwA3yLmJ0S?eQR1}f1wN+;*)i~Ygh@sm0+jcJVt$hTjBwT{}bO|iUWB6 zx&XJv0Spf>?F)e0cKk<;1Ni9m`}27I2c-`h= z-~OHM-&pVeW*op)th=hW{|erZaYmgAL#cf|Rv$}vKg_Hu@+r1S^>Y3d49`LifnOBv z=Yjc{OBkqkceW#c9(Hi7!Yt9wM!b!#k4>Wc;ZoSMV#$^_N- zc1Hxv=N0zvKNskv{JE>lBv2lWUptc|u51}vL|h-@1q8XAdQZ-oO(XD+IOeP(^`0jd z-9kEleI~$pD?HOz0{gT!7Jl4Edl&fsCCZl>@#Hr_YrD(ti0b?=#;X};7V0|+f7NB% zq59TY*2(h327`?6lBIYn<7`XBthOHQ0h?kzAYa|{#x!y5w(Tvsw}7MepHhCoev}o@ zD6*hzb={AAgYC$DK3D!I>V74hbq=0K9S*C%^T*hSBZhpU^>)Xi*~EPXH7Rijej0m6 zfc5K2?IywPz8`u_(&`+gcG!>JYptB$lWJ;=deN`ai zC|}^tgZ}BYOx;<&J^?Rm!U} zDTm*&Z#_2Jqn#puHMXeRr-rq#Tbec&%)Xvs+~07v4t4jjKNdE?((9C&i><_oyM)%d zZRocR6|xNZXjAv768R*UOwF?&_s(YO5wB#M?C3PUi2EyjUN31wG;+KbczQgSn_&LF zJdp&B4_aJt_m6RXAmAHX0shHkCeJVqz|)f5cLH$$RmFE1iT_KI1l<0csMjw^{}cGV zlnK}IenULaKpKz~)VDZctGZi|jhq@7GyuvQeWOP4P>q1Uwg1#NP+hioa4q1#k6$5+qc*EI*g!zIxZs8c>&9IM! zCd-^R_mmAhNc$r0ZaskcQ)9V$RpEI_)*3jU5dRGSE=I)A5hULxXUrp{vf{_;8vP~C zXjACdquDob9roe-XHOkzYn|f&aeq}py?XY4P!y?uAg|jPkCv(`jqx~~YuDbwvE%Cp z+jyTvUc|mLFWI_QKh`@{bHb)r2IpvJ7-65UhdtZs(dI7KV4aJ=xR+{P((6)wSb9J5 zt(ebxzw>_Gul1<=eka1v9Hdy5E*F7|8;U)ePNB9C2k>j_0u;85?9*nCBEKAY|L)*U z;_A=L-6<5dy;Y-*CuWKN`}&UDC~8~pbWEgy^WWdNIiv`F;QoTi{9PG&8;M4>rMz=R zZL9Ngf^h;vh!;t;KI-n*qz>Zv$=0xcWZ!xx%COB67jM{56$H-jG?``(An)HP%ktz_ z;QvSm(un^fEWkL;JbwV^#Q*p1ZE4Bl<%}mV;g9Wv+kgA5_&?zP5b?zB?nfTE760G4 zv%dbl@c*8kzxkW@#s9G`1N^v{e{bFo@GBH~z#bGZVBSA*WPTsYa*Pu9hZ}MY@qQ3c z;2-!aZ@b_5i(kym<)8Zw{{Mqp@m9t^@LhcVyVnu_N5|D*eEFW6cy;R-wXdIe)$3M|GD7m`}TMH0r>O> z!T){WQ?OTz`TxHj{}=Uo@p*iixIgNoNWLeSSFUEtF&-R;{P+<6-;Vwy{ttHC@$2w^ z!2j=w|8u-=#sBg6cjG76pR4hAa~ziP|B3%|9P|B~r||E7r27Ay2e-y6-0a_9U+@2B zKP+9x{C~jz!0FvOAKs+Q|F5nl{*SmCH*t0mf5g-Ac_z+Vj1TGph;HKKJpV!V0VoIV zPyBCspQ~{l683M!|6Q&( zuan{bR;r$_lz|6tdgk=w=i!e&l)!zR*hkl+Cg_)MP^<;?cmF;L%`(rfAvfuzKiX1c zHbAc2g7-^q0sZQR=kg}rug6bdpJCz^)jLSH;{$K;Un0-{ox1+;8^V74P+BmBP+|8&tPT=?`6s z6Ih;)6Ifh2Hhl8-dIGQuuwRx|^$vx-q8}SdX)j2Q9bNDfS842*^|d+p(P76r8CU0m zJ&WeZtP21)FYJ5d%V^r{R>b>L&cg1gIkb0pIN#29;sD0B;rkR600Lh+t(FS-_fg*} zdi=AD@0d8+fPI6D_9tIX?FQc9PQ;&z5|>f03}lg~>CRn!MVj7MR(mayX)kZv>J(Gi zQ4{#daOcn>ahosPRj6{F-<2D$6W!aK52oWPafZZNK{&f_s^*!9A^?YR%Zc^^KHuGZ z1mo{=)-^;*{GF&zAF~*m(Viib0Tlj6_#4jx&#M$FE4ZH0M(6&Cd~Z=2Jczq#>k$4o z)D;lgB5&q4G7eyDt)YbR3r~Jx!v@ytzv4=$?ExIO1qUZaSD_99=;s?qh7a=hTxQ{WXkYE7)AJ8;J(kN% zPLf*6kNSE2KP5gra2D&ieVNwRd40jegq}C#GZx)l)GRh`T(CY}j`_Rgsj-7@^wYN& zw2M3*mR_tQzTSH6r^+gPf|LwqmXQ5EHQj>X>6LVW+Z@cfMty!Y`j?H|aW#_);o2(C*;zx$U7WKJbfn3u)@APX}=NjchFzx%U#C$9Q-@U zJUKkSYi6D_D9oJWbF!Yx0%0=0Qio$<8`=*l!VZMCtsVH!ovRZS0&(Z09U5%E8LEwp9jj0!6RgmkAMIj|geBKZb zYP1LThGqPYV}s#2()QNy8P5B}Pe(>L|00oI6ZQWa)7j^!myChvGpqw6JZ9+@+WHz% zb|rn*eWY==qXK%XtFfZIBFg7JJFs(%IDcWUtlJ~IveE0%KfuK^t(4dC4k^TToEHjL zlX|WnO7lHhv|}yf+xmYztk+k{{pmv~o{zsQ1$kb%c=3;Q{C{?S?q%3Pa3{PX!!9!J z+VExK_9cNgWY$NLm9~FGK7VIXaVT}ivF6UBRi9XX$1%puB~b5R#NCZ@`?Ry}^L4Bu zeR8qti_ovl$}6wF%6KwYP(8)-YrS6VS68%uxMSGJ?`qvq?`AxM;_H0{K7gUm;wzXfreu#@acrxAV~X0^jlyDg$-%6MLsCa=*i3jYD{Qp5#~kLmRlXZOT|Y){giGp#_r zO-wNvn(+Sqs%eYZ_@eE4ZZgRCb|!Z>koxFZfH=K+ZJ+ria|?a_*=WB+@zH{v)_vke1>B z9GKC(AM;nQ3ji?!I}vdJs2gxoj$pqYT)z|tkdeBa!0qry`NegP>wWQm9cTC@e4qAh zsa>~U;5YkC6m>1D6ETikx}{E{zYYF8;Po%sOo9M>7=A;sy^iOvO|ZTt_6xO0GX0^- z!Z_*x0B^}f+A(Uje#IxyKWZ|md#Ud-lC^^RZ=&@Y>PEa|!+wwk`b$xtKTdz1!=WG^ zq}LWwdIkDPiwcN~PT5)pST_}Q(oZvf0C`%iyIiE&VyJ^O;*<2c01;J@_`aB;`O5Ho zV^%v%DhA~c&l@l0o+VA>JPqJ8+q#O-q6_>s5YZfLUoPh>;Prku)JO$Y)A0V9K=5*s zw71VH<9tmnC+X+2DJ2GUxaQ$(CYGpSTpIm)BQ{@93iCY*_yF&zIgf-@e)pMAv;O^5 zO{rCsns6)$N1*Sw*1mGK6Y~PN+V2_4cs`bi6q1g$s*wB0qrW(}oYyVBu_aBtek%0^ z%zM~^SLN)~bbPqK0N@k{NRmI?6rnYj$!5B$M%66=GgIPNk6?M*1_>KhbHv;H=S4itby%*I9agSh5N1jjyXKHHtsbP zQNEasMkC*AMBXju!DQ}W9r41#vOA8l-4VUcQmOsA~m!SP0xx43MVOUk-{@lM>?qysn(jlKb3q9-=6MNbJC)FD-^nvcIkB-rPuILY|w6na1h&GM$kVZYY zuXYdiyWsgguTkp5^D1|7|Mr#k?}@UG=d?elfgdm1f|2VI`)@8H>2iB_%V-w(2>3sz z$0@WYIy&j^_Dausb$(H#$tLux)jF}8dLiHqLjSyITRqs&K-_Y-fR4zR3BJOeTS=T&}sG z3I@)LfUq6ygS}~yLmaPI?ox>3z4L1sJL}cQloW6S@L`F;Prc!Gi$UTuAvqz!TDHBq z)`a+|Dcd!lV4@u@Kyi^SMAgpqppp>zt5URUAT=?>eu`!$y^Oc82$G9@W;7|Id_UX- zGWoDztp)3%QsRJm{4c_WU`1@L4VIMMgX?N7QlgsU7k9N|-XTBUY^@+a#70LsPwib^ zZyDEDS=1?@9FsF@2K;Z!JSAE99gE4XA2N@ARrcB#`OB(QoFyIjm#z-pAMWb#avdNJ z1i`P!_f-=T=VfI~3A4S=okqSI+ufl`Y=?k#n~3%q4Whz!4(oag`+2$I!|WF^QWoI# zA#);AiuM@1GvlSYT+T(B(by>Tr$CaH)T}QsFU z_g-6KMjNGmz&^uRrz36)bpoju>f>=Q-iA0PK_Wi3^Fljt9qf;U`sK72z{csRnip-C zE)|%|Fb?y57O@oLzu}Y7D92?XEESMWrh&9#K30@lWZL8RWip8SSYaQIcl0&kJG?1( z4&Py08;E_A@}g>SZjSw82r7C%ZAZd3j~$Nf@Dt!X{@$PJ@c`f#;-n5I;{ae5Iux)geZzyEvF zcX0k+uHTOZ)XV-4ir;_K>wKMtJ=;Gh?!TS5Kk*`Guz~ZUgs;`=s~@A;IRfdMO<=zZtg1O z=#h|OVw`G&mK4ahj=I)B6Zq)hSPXVA;*k0*=4q_sLdB7WY4EeWcA%Z>f{{$P?<{Cg z%6NDjl(M?LTOw-E|A=S80-E%W6Fw999CbG4Ip57j&C`eX7=l^kg{-iTzkcBj#u3jV zzWZ{`30rF}GeSHVemtyCPi%bPD+ksQCpMbR0^@@#7Y}>L?+s%=u=2eQ$CK8g{V&?S z(cuH0+p}>v6D=BP1l~VaaNOTkT3b*u!0j^=8ttayi?4l!$5K+m@uM3HWGP6z7jdBy zkFD!tu#-_gz_bi`-Mu#PLFX=B4>yE<{qu^9x(L0txwrldih2JQ`iBLSFck zO~G@@(C(lpsZ+2wbMS`}7cYr<>fQnsVxtbyMDuRP|HIq+hc|KEd80yJz?MSXeV*o~ zPv33hb>3iGs!?us*#uHBYVQ`T-lnN;j9C?IUiWsbh&JIdrFdnq6#J$asR{dRLX)>4 zK`{Z3XOJd0S!2h>8ZUhk45Uf7Z;exu*k03sJiDso3wY=|9pK$ zGiT16AK!D%_w)IF58pee?bt#*->mMeVtkYB&=dTzC zuIapoasOrg?{@wMze`e7Mx2IKO3a?e_h@PL81oUOV)GKL|1T*OcFxyFq6HTyw{EZB z$#!jt2*$YpT2co7|D#p1)M6t3kK*Gz0m|qE{r1bFork$U8xZ{wKHm{qh?^q$l6_3) z2XFr;>S_2XVE@tKe8M4u_XmIYc^!E9pi{|exDGp7yP93fc||ESV;*-(IGBjzE#DH| z!uc8DGO&((#Tirs)yt8uNt{J|Gn^L}pT+w26=!j98vGCNRYd^BjYah@`pBfa$V z7gEj5#P?0{3WfU}vrPsr|BBOFS5wV67Blb*02{$6trlBPRUUOpN-WHF+*9(c>IB-k zt7|sH{*fKk=h^O6LtPJ3Hf5V@cwVf@Y_@dZcj{xbixbB!yv2IylUl7MC|^<>8|659 zeLmIv4xZDJ$wO=pQ}Jq3?mQXh19w048{}uo$-Jslm4==A$f=Lv2P}tu5jfXk`q7)< z|8Gc>Dernd0QaTzGxneX>31w1sSeO@9?2u%1H2y>AkhG~|H86X0se@iZ`=<*WX~?F z6oA_Ys;kz~kN@bb?%3;l2YkQ8_OhmTzU4R)m0fuLf>?pL!xIg6#1hrMFmMS`9}PW* z^8q4X2{UfMZ1lM;DOxp(GN2@z-vloDu0NnM&gula=N~M7RFZY;=ib`|%{~+-HP53kX`-g_!q5ppl z|9|-5haS2f|F5ZOZvH6z|Ji3Fkq_hlJjWgNq_!b00pN8h$1nH~xW5q>5OKJG|JByk zRulgRoOLhp|DoC0S>VAq$6)bd;{Py5LoVR|dy#KB{;tRWpT^%cyj3u8${el=dy^0G z+Drw&aR3Wn!@Yqdqj)0mf8_sr@PF|!_R|pj{!Ie|1N8qVUYf)IMWk7t9R7UG|34J| zCH}7A&Y#TxpLq3G@R!4*b25jE<|J4n4LCO7kHY_1&)3)2@8bW1zB}>9^9gu8$AcjL zPrvSu!vC+&kN*EyXDrI$zt`gaPc$$-MH%dkyr2CI)e0U!y@&B;(cT{7@z?Nwj0^mI zP)_vMhV9$8f0X|}-0m0U>Yuni^Uu}W$KwB}XT0u%`*QcgF8fE}{}U)5&bt?K<;}@l zKm4RJ*S^=wqUy{d;q+R5h%O^+ z62tGlCE)*c9ykPl2O|zaC(pAYFOHJDxNG_w_Br4(*YNu#u6r>~xqe4B_d<`m$TOhi zb6)I+6|DED&uRZ6{y%{G4IaS!%ys#^QW*%$&*!^dsZ^9{nenE}*C;%Y!Rm)BI zltf3oT;lqf3nKbssI^MZHZI`*%I;Ug;LVig!+-zlO~ID^@aO+}Q_qU&BgFH!dbQ2$ zr$OnNDfIh>Hc>F*Qwui)m$JWNJee6Epd;LR7U<57tW1tc z8~-Kon7iZJgT7YyJL>=bGVM8cE|ZlB*eU(HwW&eucd}maG>~6+ycqjD>`&6$LbTWP zI68y8KU-V1lli^bn%4_nwEMeRGwxgOjz76iS_J$ea=q;kX zoH)C1#Ex^_uurtSmgIX^4~j4HzKY(phYGd{b*C;|_$KlHztlUX3%0d+EcrM54dPPN zS+4H?k`doM=&vPjARQQZ0p-Ja(NFgA`C!qb0otPy`R!P*U#e_r8Gzj@Q7M;+N#a+a zx6aXiDRtes68+fIm{8+`uygvv!7)B3{L@=Dj)&M`)k{1$gm`7d{e@umZI;_UwR4F0 zXCr}Rf`AaL#vHZ!#-Z-W5#iU`+jXZz5A%j`L%Iif( z)fUS6`98xw)v}^g;&<%O-s|A?zJ48e$Eix&S=K)GD*-)CJ6?C!BiLV;xLS+zth5Jf z+Ek;l-vLB64SS^&gUIhO?#20qZZw>a|;LL6>;#Z7Tcm0@l(RFZ8;=abzl7d}) ziEFu|+_2j}TG*QrV1Laf$6n=ISHKKc5VBmMq^M*7neqa9Sya3GlSVtW>KnZgo=Gpb08B7?I zI^(rLf56QEahB>miU>bYjPtov5Ih0&i}zH>OO-qqvW?>)(?53_<6~w2p)Sgo)bSYS z4O>#K;JW6nA9&7VoY$3R&nL(eFn#eEh5r5)QSRpNGYuG*!0BPnY2@?3IpY&3SNroL zCYEoPt#2uD{S|_3i1&{jPTQ$Jf~N8y`2q3qP$!>n*W>50uBq#rpYG%P`fig?pd7xh z{@c%9B#vJ71Pnva@2fgeJ&-=IW#e4${GFPLNYLY*i}HZOPxvxB-qSE2_(0f29DdAm z*}GKEGvUK|w{kwPzyOWk8;Xj9IPViYfLrZR%nz-RADd(4&mmq;Ma7!(=PWxqf&-t! zIRZ_ASM@>{_>kjU6L;~voODG)74tQl#mQxu?-u6`%)c6*@Xcqn5u;pp6`$n$Ou^#) z#kV*1-d$L30_pW*B^A48#-A5jYQeQUf*;FU= zb;@&jE6@3v&8%F*^LMxoc{S|y1io5Z+lltm8q%Zt>Xy2DV;b}o=Ajo)ZlnI1*PEJ4 z+fC$YNJ6r!Ctr`k^(Ctu{})743iZ~fuV zXdGuJ-VC5rR9(+PijZ?lMs>PJuS>yw`R`L6nyIw~8L%Y=&hwU}6Z$sbNq;4``w^q(;wU}0lO z%xko>(O&}bSz%8$3G~;>H``(Ff*)@%sL`&6%cb-is;=>Cmyj0Y4m<5)#faZY`<5xs zoX2|qi6sL28SrnrZJIKn#jy^0#aS*(SVtXonzY_5+SeI0+hJeLcY)|KN?cb4u*P-| zBQO=Ot385BT*oA6HI#X=Ip92}ob!qmcH2bdmR=!LiuO(&6N9{-(f6a@bvRpIIH4@X zdjq?YUuC*n(SgT+S75Va{)HVbn+k5g{rdFq8Rn}iVga8oP*wB7@BUOio|mLn;`oe1 zCgS%>@;Z<&(h+k$@H$zP zhsc9L{Cn^pI1UEZjXlqKQ!HO8vOlGekC*e+PyeZh{Vm)gcXFIfG42DT5}MdT+@M)g z(;UBIUZkiK{jOYoBuYK2gyq?kQi11o zIJaq8;0LFiyJjaIVSQz0=U}JAIoa7?_OTvYLc!J&+#gl{?M1%t%NA*p<+WB+C|qBu z;qGqE|1nXXW4v)sDs15XEn{O5zW-$UI}+vi_zS}J?|m%9Gh&;yq$$EBeI>=(*U+XeDN^tt&OrX8iNZ}WcjN@Ili zo%hF4zc|ln*D%&gSf6FGX2U*gW__dG710>){ZTp0b)U7|0iGOqrqb&ew}@Nt+r~G% z$Zt$l-{bmU(n7$+5y#jD^X*gAC!RA84t<|;m(noJe4ZB)2|Vwz!yylNp8I)|IUlpH>xJ`I&=2rs)@L>1 z{2QygZll!U2*-9E&IbC3+dE>yn1Fur<8Y6S>0-H8Brg-&qB{16b>=Y6gD7!j5()5- z&_DV!=}x>S);7oZ0UpWL#rs{sF;64)>U+oIHuMvhyt*;e=2`C2Bl}xXkBDdNh5iO^ z-A3FJe*f7M;(`=|hU}MKVE?EMoZC+snCy#S-|Cz{Mqbb>&U0OFW4-vYv+%|^*0W1o zCq`3|DhpmQOpN7cNycRuOLk|KN!X_-Eju`Kwk?e+09m zF+Lv=9d`DQ*4kaL=VM-iU4-MLvrkWZ!KV-Gs;#a^zp7IsC@;=Qt|1+wu1K^TzttCmg-si+S|6rOOrK z{-!Ve>Kw}Fj2|SPihA^>&<`(F_IIU!N&Wth0j|s4^fZfcpXP6zR#CP8G3y8**5IY zPdTfH^ec?ZS8lZw)uUara{AfHr^pXNd@sDOM=G^F1qxIld*1O@b8=x0$xKY>2SAJg~R z79`g5MjG$GE4al6Z6Hgpq7$&j3KeWV82ARuq$5U0nE?SUXa88bMilj z2k?IUezPGL6X!2+WBc@9fcNKk0-pl+2hLC2|9^vld;#}2tt0L~Kd%RTSdZVl6n68b zkHh;vd>yzy?4UWjANw`@nT>HmoHmE^@5TIpWtCVDJ+I>j+WFviRcP4zbltG~B}F~B z9(p6?O_fs44y`TS3q3iz-(qHZQ_pM1xNml31I=H9pZMnH<|+CU@6l89?EjKo3}3=J ztSzEr{39;BoB?hRJBp$_f&B(>GU<@i+UD6}l@Z5mux{35&YTUmc>>z=vabo}5P+CQ zfBD*K-F7xi`=`iubRkZ>>4wK41ER_Bv#%CS656+F$c8lRoOs*Y> zcM%ZaA9T@K6_|n^eA$@}1n^x)5oaSXMt^gMqrwaxfO9q;vJHZVTdU6@j^jn=(A-*i z!gsOqwsN`pwC@$?rk^Y+rJXCe)j!3!c8&0(W`5Jt%4+N*oNfDGw{Tv{@05)B3GkrG z^%A1yMq%%Ajg60Q<$V9!_ufo${13?T70UiT3)XRn4`MF1aXjkj5kp_e8sicn-qg05 zXL#S0-MR?9>@?Z?rn$c`1$&>z`Bu*0qgnWOgU{;UW$-T$4hrXqbU3%XllMCH)UD>A zh3P=GK0_S7M<_B;KUMANmkr)hQXRa6bmQ(3JsoD`AnCqtG2McgQ}{s{Y`qW#Qe3l1NvUz@)&mTFRzCmy~9SCPCu{Zu76m*jQgQ? zs>u(yX{bsi43!&Bmz<@= zW}Wk7`f57O`TXbq_JYRw@uv}!nZNh84Gb_nrLT_h{n81+kfxvzTY~3?0^rHuIsN-t zNa%kt;aiGzLL{rtvOP?Zl#RG}O>K2;4lgG@zq)AN&-~#r9V}xrpaC zzx(cCo;RRPsR{Zsf~K4$|G)&`-;gF##kKFlJb}Ltr%zR4-GPQTPg2bCEus{7UAK=4r0f;+Rd0>$>_yASam92a09I~?K{&2#tX;=2$A71Vej@p*q zAKvTxp}*Z!*1Fs+cL#viFLwKDH4EbYdz5~q0)F|vP`=m*|9eky<4 zVX_JQf(HM_+FJ4mO7Bd8db8K(>a&-XwSLW0t7pe6TbFzGWWpgMU7HP&7w}SNaXaG! zteBb!5Pvs`@)6?u=AzzjQ$~9HKM=qhSgQxpmBW|*Bk-cdz;%iL19pU5Zo~)pNc{hqXP&|PeQbZ0 zYtbUZ-@gv?P{lQWX2HOnKe(@9uz~jz|0k}Q!?}TbH(@-O==aaK0J*sT!1WQnD)>C{ zf52|*K8*hp_lNoFz7OO7p|Go!_$mBATZy0J{Pv~@{)n%)`9P;=ROa{}lY6=MsES52&x-#s3BRpRZy0uE+n0`&Yov`=jyyYv&1+p+5uu z2VWx5V0>@5GR*H_n(a*dpY2RLE?{TG{Ws!4VqIY1|5YD{|6{z=0sj9;{2%Z8UHl*U zlm9|on)v@0@pp}f@xK2*t`k4a)o)J1Ui(Ml|AMa(f7jP5-#_RZe7|4*emT)F=!2TN zX`*4FosIacSnpor0TBN;ndtxT!+MMOI{IUf{Q=zuX~8!z!1M3mM}d|QF% zyP8_f1;G7%t&>W-a``E&$m#>H)Bo+A=bt}DUVx=IsnK6NqWWtXe^lt__M3%;ryS6WO?UynkM`Yb<8?ja#xLObd_ULi>sU_6s{1yrTLOOYLb)Mvkj{F~Lb>ZbU&B0N zv3N1=(Z7uS_Dm?hl(@~tjfvm}*q!Gxk`3oyfd{4okN0{2x53YPqG3)LZ!7@LpK9Dx z)9GugTXiT4JP2`~C2bpVhQ8HZz!4^V$)DBLkyo;LKATyO{d^!BETW%ip<}L@xbU@K@Lc)9JWLc1JXf%7^X}ay`Ym={y^((KUA6m?Ho*awZul$9VvS6?&%ppsQ*3c0b}fTXq~9-ZIC2S#)AP&a_360^5N1q^9b;^eZiu z``2Zz#^ah=&{bRY4V;r~^bM_i}sP{cy{llD?CrRX&+EPEtCGD8aeXgk)d+E3y;fVx{ocqk=@TyO&%SUI z&T(k1caIL;^aaF=_Eddg&A_YSdiM`@4+jQe*OMY=3_qVUX}ueELbrPPwT-m1nS^uo zuv55fmgs)kXRYIHGVoY;aZk3EcFO<$)?AeM#@z>%UZ%HaSBw)!mpi2}`_a)Wwd2I^ z-q4@^O&Rd>cjOg?v?Cts4Hgw_gTMchd@p5WL+cCtj=!#uWf$=J6(x7e#JdiscMtIS z-4FQAq5rvm{?lWT)97!bqc~TyF5i_*G@PORXFQUCJsSAZ^fY+R9f(M|kunbjID z*e29z`=VKv$LmcPcGkTwIe=^CyEM;s_(Ej7}S$U)kp zj`qY3^Lp$KyWv0hy!y-6x!?Su{;gX}@th{#4P4`t^SvwCdEPhlgktCT?2;T3aWQY> zOe3#59Gw>0(;T*nYS?kzFnykl# zPTVglYcjO+<%_F1!{c_(Eo0?dTw5rTfAO0{k zWkWff)>w9q>7Y4$fN|8!FRnc-fah9G`9u_(d5(*o(Z)8QoUM}d`A+=aKio~8m%H??wXoB))yd%~ z@c+&_;TJu?uRH6;H9bz=&dA98IAtg#1~?APVe=}^6B`D$UgmplSt~w)-H}J|YZ%|K zkcQ7rbKcO0B|G!6mzROxI?+(Q`bL}^(^;o^6HiVwwACHnw|@zK_YKdr_i{b+blwdz z^tn$twd(@){%fn(u3=hjj-4g$KYM&7c#;J>dVR0$^C7=IFNGq!K4Wb$@wz-6VmzfC zbz2wGw;d5@I9~`o+2PBNS$60deV%cU^q*}LxLyh-mz9@4SFq!W+KLL!J6`vubvGQu zc>=F*54f7z>KfCh8(D>lu)fjBvJHv6Gv%O1Dw`1jeNSr^LnbWbGc!@MMk_Z#KS zHxHb&aUC_b^$OQ%>6+@7`Te)dDGrpP?n{sUB1Ku8y%F^y)IAj~XlFiQDG&2_XWghr zyZq{7n15$?{<{=zLzGMBzrGq4>J~Zwys8s=5OG0)&j2rzj)gE@-O06gq`ZhXGSVoH zQ(ufFg20hZIlp^U-cLEyKiAIt?J*o+%=x4@zKZg@+R-oKdDq*?U+tkDc>aby8~uUO zvK`|Y@&8}*!tV{d$MM7%afoNd}~vi1{@I3MRcaAAyloUd%*I2;d-2YBC#BH|6e zjr3_d%N^|!B1|`HGlu2_4v0@+TLFK=i?A<=#yqR~#9#^RHN!)h5bZOv;>hRu zzwrNk{%fe0p>D}hk8*eX+x~p&pW;vyxE=II#!}75}|~;_+TH%a{}@T!6(3bKo9>)&cE#ArGZy{1ipXK$v9o` z)}fs+2s<5QP&8x^>tUoLSQlSA*AxC)?JZ{T0i1ewq4gcu?P_ZLBeVyK+3Jn7OIgeN zVPAXMS)%A!+Aj=d~8%npIVExF2$7AjJ7?=xH!tAgx$`pGJSuo16ZDJOE`ak1`nV|OkjL(aQoX^+W5UA z4lzR9q-oxQeG>SM*;It5zPjypytfjkxj>e>ch`LXE!xKu^YI?` z2fJKR!S<2jQ$J+=+Q!43tlyE*w~h6JepqPtV%+PFIL1HDBN&nGT&L`5`sx|h+nrKi z1J|{pI(?SE2P1DNEZ5v`dq$aGcI3A;ESFi5N7*lr#d}Y9@!iRmm)>T7$!1jx>!H72 z4zZr&X{(j>UR#?M_`TC{3ncLS=F#I!n`|ohqowZ68&kkb!54U&ewpAC$jLG0^Saph z*XXCt6-ylvuG<}s^J%U-)i+`i>s41O?xqZ^%VJ$s>i&zS2%ZDJY6%9pjy>rke`Kkv zpe!Wv`%awOJW72%Eti*f0#6Zzt=ro$Pnd#^GCtSRnle-G-eME+zV+_bjx#!+GZl^= zqP~2qhjB*`?@1lUynyvG9H`iz$CDED?kQ(n5?`Pnw%sAaUlseEwk*as{PHYMJkEY4 z$Mhl23oG^REcN|SM`vpZu6wuo8p%JI)s=}$l^xExr&lVMfY0JMUW{j+cRRO>^#J_} zTorKJ*fM2BRG2HKt;y?qQ zgV6JQ&oM9ZgMD(L-Ak<%%)e6wF9|$idq(*ymS;PN0vre9=NItna!L3+>-iU{nde#V zL;bqKv|OQ!ykFO@_*q`t9nArzgEoik#rSGh)dat1g);m$>dU!x>?Cj=w0oZxq~0lR z86W5PZXdsJlK!zNZGq1>v~y3ExQfjp%=5ZBB^kW4Nlf_cKTiznwWW9-aWSB$5|!_r zX)!bIwl^h|GXGy+Fq^rL8IAWu*x&z0UBlq9$1YX=ZPic}_mk;8KJdOv8CUB*&J+59 zX4EtK-BroPbZo63`w7I2C{!l7@ASR-sGaMiRO*e!60Sc&`PkQ7s+^d7{VLnnEJ$b% z%*Udrm!MuOhzCh&s(?QTr70&(#&z%mZ(_ateqI3j<)(#x3BQtB_CMO8yy%bE1}Hfm z0PFy;lPzBS{}&H{@zqf;iwt=a{o_mAfct?Hhj8BLebYiT&Ba^&T^YhY z0P7~;6BE9T@SDux6h2rwiQi*C;S1by^Wsl~`|~{c9PXc!*KmH!%kYm`!1)Uee4lXv zus?J|P#X42@@K267K1lk@0snyyp0h)r#BkHt$p2igMUbAAwy#2ECwyrts}}-I?>^4UbRwdNi$(vR2PrxC{%<5g59| z&{Xf02G_ZEEO*zWRJ~vu;`Uct=E`;aoSEv>RpO)84_)IT-Vq;?I$_zUVC%Mun#DLHo|e7-Bg1(SA&Qbbw%a# zzwkF3@vZDqxr6J;c}+I1&yA>9|6$*eOpCmZFeELM)iqPbdR6Z)v~k^pFzp)kmbZ;O z(GI61`nHweK5Hm8SL!;(nzGk=)t_age? zS5<%Kt2tbs>+)fFHjqGnP!xyb6y8&-Ya!yximr;e``AygUg_iWLseCOM|lf)70iEb zwi|rk4(B6MIqK=?s-S5sMc!}FBHAxi9$h7e!*!b11F!YI7q!;l@Z&Q{|cRsLvyRlAweLC|x%YAOhz76j|9EV?5F^&4%NZ!Yn=XdGsFIoKoAJakD zpO}s%lYY!!&g@`nE!%5Ik6*cn>$|Fk)?BJQ>eOY~Ok94>ksoBg4QNdc{{Hl+tS&~o z$nv2$>o?OcTS_nvKr6!f2U0Yl{2!Lc&$tem@*Ps9hnv@=9J{G`p+2|xY1t^+sk@&WH}5o6K&!|Usg+AvQbQvW(rFcNxfx##Mb zX*GVY>(VvgyL)|?$_fzwdT-sPv0#LJfL(Jj;B@t#Xh8_LTZeDFM(IPG0iU(!i&F`I zhwpYlQpg9W{8{oJ7#ARj12f7H4`5hcJPo|xZ5~K@1^EA8soGOZ|Nc}{=mGf|(Qimy{}tj0cz_n7zVTclk)>a&+5DBS@P1tXs!xdjZ_U+jPJUYazhDRYp@G}~ z>G(gtd*V9$pLX_Z`2Rv2fEL<#HFK zRTj&_&{K|BUx?Dw;`d#CY69m4=(9|3ioipkaR3sH{xaCNBiTKpNY$;ew#bx4Hv1&6 zi(xgu_`9Mdypwk7;8tH1?bgIg=->aR`1y0)`nz%cbGUy_eo{aG^~U-+ho9#pc~*-% zA9_geAr8PguBXWZsQyoj2av<_4ITjS{M@>p>wdnU68h?1`XvORU%7tWxXFw8n)^QT z7nZm{<9n$i|f9r}$Kl=v!`xzJQ9^m}FKkXf% zoKvJZ;{J|)d6*Kf4?h6B-DLUYw$W~Lu;+#r+VO-ZwJWaH_3m%{ zd=_!f1kZ0XvqNP&+B~(*4YkB|U{CSWo?+QP*~j(j*nn3gpL(=;9_O2a58eq&4eW@c zzsYW;y)b?9?EghOOxue2Fw=KWYgmuuyTZwHPY`Fnvi}J7XRvHK;@F=Fb#J8l>(S3V zLeE_|pWEv>{sm>OV4F~vn)%@hN`$rQ;r?|pE*^8?esSA>d!7FO4b4}88v-BNw(Hxc z@w``#LXWI>M_!G;*#^7mSc~?560hrR z#PP-6^Ka3v`hYgt$9~#W(lJFmX2p17JMkG|zDyYeUKSYkJV~jPcOl*8>5$Fc;ZrlpsRC;Uv`w>x`?_N&yF3S%tCl$$r8w2dph62KB>}T85g-9 znwin#w98%nx5-KFha(1FgSe~lthfR9ufRDK%zt?LfSvtor@+Sc?N7Ccs~5&JvGAdD;XE<=NEy3I2Yh>%dJcpDs%__A8vfCo*jY z5rE?kY8LwULw^29)9$hX^$2waxxtuEm}Xpm)<6AVmty}(J^hCy&jUqxp2f7|+=u%q zt6(@b^sTOcfa6`8AO196z-f$!1s*^>*w>Lr8}<`2&N*WLh$Os493RV84(;JM7RS_R zC*-)O47Z^lAMfeGx&?e8*e@_15T9kj%z54(U2Wz#7wg(f8Moz3#B3*iy?Sjw)&U#b zKOGxWIo?LAnky*Bq8)v-FRmEb?&kYW46YvN^lk9io3~B#_n?$aQ$E@^I?4Q7tn%mt z#&2XS;UlldW+_|7{LlP&ypz%%y7fu&04|TN*1_-c>F>$qoZn(Mu0FweV65$VGuAJ@ zPMav4#W^w6ReNxrjIHT#`T_95uB7mFzk67O!vB!k75mXm`YP`6=6u|9#O- zN63rZm>SE1KjqVH%WdR^RV@0cM7i#Um0!5wAb0}${15nC&F1?yg9qRNzx<2T%a~4A zmV+PgFaNUW%r=}mBdb&MU&pyKH)@lr4fey6*f&$&8f;rZep>VHu`vt2Yfbc6?*!{Z zcme4)PbfWvxCmHDwI6|s%d5H!u^m{Bge;~XDYjn6F=*4-f{erh2!z9<|ARs8();* zpNsh^uD`+Y)gz2;W*mUhRA3M1rN8VPg8dnGWZU6B%3!#5%}lwVf8gr2=*h8rovXOD%lqh%SLfn#NU%0Kv zn3qOn@@Bw?429T_zyIC)Cpix|8dT^J_-WhX#|NSJ`%8|z&i>xy*^K!MdRI?^2Mj+a zT^}&;SOaeZUUHxs^FoOW>;5>$ny$UZq0s9a&}Y0}zMu$f`UTGJ*TAGK;F8_9{zg zs)qJM#BuFikbPNRw}^+T@%|JWJO*zRF5BvQT^DK;7Lann36;1%G9W9{^B z=^7peo(6xOu+>WYXIc{?#=K}JzK(bRRy%OrM5Qq1_0pb-Q6^FL2noeV3%w#`%H#3V zt}6C19xHeR2!zUf5N;Co@Kesav}1ySN3Olgu-nGrAkBRB{@H#*rqwKQU8~+#$nh0& zIHtX5e?JI+>{rXAY>MfzlbuQ_(ty2jf1)y(?vIur9mw{EU?;BBQz_VWFIC22SK@m` zRfD|`I4l0xFRRw{Pw=|Q)MMaZhr@k{OMrEoBmqz7eDjasy_C59njp17KC;Yeq0H9I z2$XX9{$s>vaqM6P`{Q@REe77-f4IPi_k{Hx@L}lbq3$z~?!#it&vi>koa&?$T8Mum z{!%cA@r`k%sRGN@r2Q0j)rI-49_dU#3UeImx>`gzsslhn`QC}nLQh<({Fm`+=ncdd z(H(Ld;@nYm<64%ZV^(67_*&rQ)Eh^T)uqS?@mkNOm{N5uW+KN2zas zX5~{)&8OQV{7(PWxef$v{{VHw{y8SXRU{vVbQ zPZ{Z&^XIWX$#;pq6xz}2*@5_;UbI7OItD*u;QO~=WrKBI;wQsHte5WhbeXun_@a3J zbREuv$toJ#RSo!SSnAdUn2(P$Iw^RR0dnX!JuIce}; zqn_8M6+5qs>X(GCK@SXN`a)mB^&x%AMm?d=r!YBA)_NKKr?Ig`#JOE0}IC#JqvH2)#Y+ z>~~_oj(WoWxJlLO!7tIK(^I@|D*BC$GW5!63whhZ0fz}Zfy#eEpj$6^V{OH;9+oE< zv1KXSg%N@G3vg&>`7E{y#P z%?0!%`=41=z+XeZ(|d!wJ{gN)JYwA1N=w-;Qu5FfjMD&AX`J^LY3T<`Ano?<4&?8a zWhqNOM9_9?nDbOdS1?|oKc<^!nI0Y<9i`0rRf*S!`a7rDFYXSVOnNb%i;VNea1H>@ z4P<`fup{w%Bq=*jUcz0WHj`1F?9A8(lq(u7m-u^HUEuZXXt<)4;Cet)ZInYtDwgy6 zPfp(*uZPU>H^_iP*?T8m#mpo*nV7aqvILCy~NY@WVQQ(`;%q^!rpcYs@?Fn<8Fi z#~<+({mZ3yT&e`#_E(aj=Tq@mmi;a-ESIn!##(|w_Dfxf-AXww@_aSK9q6^#E-iS!UDWp_p}5k9@%6yZBx7IKbf%@0?Y#1kn9uQc^`*lYckt72 zZ!+Q@J*vmRGe8``lV91&euuC?I{PuEgZHH<N;C=)W|13yT zMNVJyJqSOEe#vtJshY> z6XxNc=i1>yoP0!@2cC;%f&x_7zytpCG0`Q;1`#&r{jPK|6dsrtMIKLrLpE-ZD zYjV(sV!=sX(k}A6_mGgdvK%}otD_(K`l2(D&}-QbH|f>zC$3+0JSHN(6V8*@We4J$ zI$O^qPEh|S(ftzp-OBDv#MYVGIK)Wd5*Os28xG>W zY&GH|E_b~Oev7LK*QMDisTFoly&C+A<*uhl!-?r=t0;oys)bR_YA~C&^zxqtFpzAM^**kH**T>)LBIi z(QjSpuC0Z2VwL%B#jtbqsPfRIO8A|h`_+l%n6K92V0G}VoaTr=R|5SaSZt^#tk)7* zoLhFv`Q%-4lrkQRgU7aaRems$N?+qx>LpV1eiPdEX;szwpUf^Na7ne|PJ#)vSevV_!SC?dY&h86i z{fPJg0euJ8)m6h^s3i_uwPmXr-?6HBDs~Jw?y5i_t5F}yQrt#f6x{lNukT%@%Z0$} z!B4oax|VvfcdErkoS*T0J0SNQzMwPyeQC-p)5rd#cgvX1UUr^OTM$3yV&yW6rI-3Nq0MZ<@0I&xX`0`2)RLcX z%x|q03;Qc*remCkGt=_^C9YG>x%=2os84CdGPdvRN(H^^qBDC!zg2>Ey)@E+mO1=N&=IR>upIFOa zY&qIzShuOHiMVa>d{$rXnp^PhdSHnnjk+q1V(RT`A%`I`SaI13K#A z71+BhkPG<2ACmC*cO7_m@#6J$>+7i3>*1en!-Vl^`2fTxm-WvAkNld)Y^@k2j$W$i zbM*fY+C)F&^+UayMd1IoXX1j0xald=yMDy?_o4jD$Pb8@JLbU0Y6=eoH5c%Aam;VT z_cv`F3MKqs^9Z+@EzCC~O13iiF$Z-2cKY!v&6?rw-`t%AOJKR@_8M>CYo3eWy2~am zC;s2Ja&}07KYv(!vzt5seKZ!{3tT=Z^=E;%drao!_jz5ZxUC;?419M7wOSG94y48M z3izov$wfD`Nhoi-y7fE6TN~%+r#tX`^VX9WiOUcFIu%^*d8aa!O_(Tqt)hLo8|M)G zVDvnHKUuDfLf^T|Ut4Xb4BGw`>xm`qcWadcjJHrd`=c;%|E_ePnCV~dek-sZ`9u;| zjB^-<@W*@r8{S#4W4SxCX3a9%x4a*yZ4F zzH#H=2l#(I@U#ecDIbsj!|ZPPF#eywISTx4K1ZBBhx0Gs|B@7XjDF;*hH~Tl1;&}L z=lG+{#r?-RW8J#n#s3#C&b3!%tAO*X4?O(w_Hkmse*w4ukN7{|e~s^8tb5QuKU&iNANkytYiD08&KZHB{loY_ z`w@8|#Qy>Rdx*0O_#>Xac5N2*EcoCihxOI9H~?_d%_9!K_@1R$47fL`2n=!l9xb#G_>OY%JTvKFG;dY`}8{efOTdA z*3I)Q7x)9-aJZ}qY2!Qq@CJZuqF-26RJb7jA=CaK%3b$VyC7g4=&5N=2`-FxyTbuH z_e4YEcsnRZg6~p{@ed{%mMMRyfk&_daZcul-;br5MiIx>cjwCJDt=G?T}8bv)F0z& zuswgP+49j3e3?NpK|G;N2wZlxB93rIZ^5|@p3&jBg)*I)M*PV(;0+!R?2wS6M)}G8 z{B7Lte<-g1pXTSE!~1g*^ECE3zKwzpaq;pNAr3Oy34i1PY=``>ZIy%wNRu`xVY=_;cE}1-5>@$J$mzP`5 z!cYJEp%$d!#ymbShWnaqQ|GfGjFXA`bY~QY$@WGDM_cZv;*oUcCbmE{5SKjR9d%oZK zb=YkXXTT9%LtOoKOYfUpw~B4If1dWh4deezkaE!IW3mbe$gojz!^&2 z=gvl2D1Th|>~8W-^3BRF;!=+9?|hqn@n4Du&hh$P?dfNE{p?ex%gfLY^V-vy({+2n z4|vYT{i|zz%d0G3Ds}fZ;w3LWSo=$!x4iZc{hZ)G-<$j#%kk|u71SHze5M-5Xm3gO z?#~dX>WDhZjeT(5qo^0)i%-O}gRo;XHfm>~k375d{U>P`U2PSAL0*9GNzLE^yyGY? z5|Hmd9Y1t}_$T6M>U>`5ut~r>JtKk8t;}~ie6^b8%KCOUGrj`gw>!y4u=!r|c>?z%zUia;i9dXQ`c5n5 zmyaJ@!}j=}ePyuAAzp!Y*Jo&-Jtx552<<9a3q481l859yT*f%(PUr1}*|Cn3MElVMR|HF>8#Fb9#`}iEf_7Afk zTJ3>q_QSE{H0;Fd-M_vN#lEP-_4T9%p7K)HPloQhk9NI=u`v9!V5gj1)=j(Km;dIA z@E^i?tB5DUeaiXq^f>ovHhcKSddQT2EW-U8;=8}b`^uI5j!wK!J>!Qx73YOl%;J5( z`_Cj{2Uy~ojM_Ao>%@to0?KNCHYA`N7IS}8K)LR%r9TaD{OkSvkv8ytNSI%K7w`W) zas98^*I)<6UoKr@M1$i7eTsi z=IYh+7$2T=bNCqXj;}nq`zhiPQ`5cpF7Rj~Zyh7fZ1703ZF&Op{M}J%77yW60LD-n|*;OLCse&PO!*SD4<|o@UxENnISbs@aNl zVTnsVY$=9x>vMAo^@YtolA^w8Qe(jDOI%mSCCH_&sfgsF+;jhft<-xzzioDwa(JXB z%P>-#GP#7;-`TUvvt6jt=UtirbFm)85)yV((`C zszL2_=9iy}VIIMGHOZvyv=2N2F=ULZ*hxho-cvg7hkw>9&ak6|{27m_s=BrS{Jndz zkO%(?>%0X&*?>N8;BDaT1Mh)8#z5zI|Ks=oJSTvBfQwEa82`lakqpvb|9b!ZPlE4@ zC}$4e|2WBfxG$kplB$jNNjsr`^X4~bC$w3UI_12g0EhSy;*Cls@*3~7n~P{4 zQ&pZ14!dS=I6^z1tvzno+d3WP<+Qu@L`q?|B_1>ZJ{<67f4GqIp=^~JDF;(>C*^H+ z+EGtAXMWKO+#UWj&3@oO@Rte)zD+xsoUYwS|IRTnt)HUZQma^>P<@1=(aYQHgrMeu;L@uD5p@^HOn3 zGQj#sj75xk>f3K;zi=sXxlB1BwutEWZn4l>K>zNcM=dQJ_oGwhc8=eGmIzYXanLpU zt=KO4xeh9dv``S|8g<#LU%`0>F4;rOGv4_?j0YvwFKqH?$5+=EGr7eFUH4c5^0>n-sBfK zu4UP-;C-&P8||$ur@6(B^9VM$n{hBn8|w2$M{)|~bGM7(H7w_rEkocVfv=cs?qNOa z`ekhc>htie?Go#MGI`rB%9nI0$?H8cGZCgIrY`j}eXj3HkkbEXo~0h;nVt2Iv0akl z$us$Aj~Y!wyP&;gvx(oce_3Xh>x4vie}*)D_Swcedh%x`0T1kz#)%dd}Wcn{*K zZ)=FKpH>a)C=bs4h$_vLSxeqNzW2@_&kV3%R47^ScCl`JiF|Fy3+ZWom+3?t@v^)g zTR~s9P?x9-2Dfg)saZ}OvsTRebhR7!x)=D+mO*~kl&?o*zNQ!R^97WnP_`KO-FaVN zC+kt2ATC?#7V4W2?`nfvInocFNU0n8K;`>-D{QF$4Q|`~2+Fy^z50Chdx-B3{>P}! z?*#ATD)Si{uE2bNeagHx?&bH&h11l>W?RtY#rrLmH1ux1D+1h-_{G@s5u={1R$D2{ z7l{;Uyq*<9p;Dw(ErC^YqViCmWaqg1=i>?VWAHws)?(`4nz8LT$KhpX(UT?MMPIBe zvaRW)-+B6q*v;RE`@_AIwOX)+{irEZljV9ft4W5x-bh@;xWxLP-)6b2Hql4@kK=8ZVf;Hy1KWdquJG3WNzN-ZLI~fv z)YU1rp`0b|5x=JL{efo9$8l01>!VCxdFk#Kfup+|a#qJUbH#h5R@QqUmJfZ1_AV5F zgX3KJ0bwoWQBf$xeQrIiTfJz%q3Uhh>T!KV*n<8JoXz(5Kk_@o*a@A_H;;`C@I6ZA zov$-(Hb-TqEg|tL@%@+H9vU|Aenl0D=V!I?UOo>q75X=L0r6Oj(qgk(DAg6Qc1kgk z7$>eDi6m6k%X6@=F<-MO-+13lyQzrf9334&y>VSDF@M*)vC<&xWw=?yeduR%hkJQn zZ{JI6nQvfQpven72=w(gO6X?`yEgGL+Sj1hop-}grWEnc!Eb2fe4}b-jd@4!g}8l#z*@Uj`yq*D?q-LYu=v+g6rPGxe~zpEX{GQj{?p5?pGhf{Ihc9 zO|L$-!To<=09}3x>0kXB=2`Om&ef6!u;|aLs&0V1_cMQ6RsI~u>3vnpAjuElxb9LM zIG1C++n;K)38=@pOm>X=@l0F(63Qxle&(Xn;OoK9bU_k#m9ZW$^r@2L2fUvar5sP- z58^oF0Tg1QrZnLnL*gIKFIX>F3?9JZ3jG@gu`Yq%{x^Wr>KT*i8wXFrKPw`f4MXy~ zvF^R8s1$zPmks;<4UfMXMz$3{!c%_|2q8N z!2NxH2=@=ShFV1|Ktc<+e-&|m6w|={VP?PAh;NGT@?qV5Gk*9)xIdorVO>kU!H04G zT$<}i?lTSfkvRW?{dvM?><`y*KVX6$I}Is_8>A|aG&LAN4B}24bw&pK)5f_>wapi}UPIhf!~_2kc$teRiftHIveIvqV?5DVL%ky? za+LbtR2WD8mnsv3Z`Jbq#L!s$QYF^sHb*ztUHi2x{NWMrUzUMKcR0^KvtOcqs2!@U zC4M`tzYV`_@J0uF!6yR0)nW->0xs+D*KVOc@zxG~_Z0L_6O0RZ={8Xi$Y zEPo`w6z2zYIA4DKo(G9Dr{C2xZ2v6IjiL+;58cM^tqQC?Mt!Q=VE;ouK^Pbt)1oMd zyzfXxe}esKdirdJ^%~!Iq-#CO_n^|{VEyk&h69{O?-YyC4}Y}ECW_!q99=aq797C( zzH(a8`zdu*f}XqRw3uy}4-nU4`t@11*IBi>n&oT`jP{g5%97a5dMk+zW!T=5C~aYX zcO!GjGM0uv%PY?1HVgV6`gtn5 zYdOlTX|>gCKbxEhuzytVo*!a8C-Y1}%5wAk2(O3V)rXl*_4Yi{MDy-~3 zqQJOo_#SNRK2GvJ{%%Oy`_iQA`Ath)oe2C7d>wK8MPaaEJ^gm?{ZxDaRWRZNl;5eW zPWYF5D%L8)`Ar?ZHxi=#{xJOL>kuaq_ncvZfT+Qj(%{~vMhAK%n{-;EyR5^O2PeeNC0UVFNye#pSG6kA<8ng9jk?6rcl zH6bd(Od%H6y?gA6E@4oDCxfNPYY|c#_8Lvo+tHwk0LSNGiP1TBWGuPlCj3a+;U8ZUre6BegfE^ekO_i*V8+kZR?jiU$z>nl_I6d za_}JW^Rm?I)!YxDXJ1_p@qSl6^=;zql0H-bZ@|9x(-!0f*x&L8ecB2cyo4H=_;+nb zTQ02~e(SB&I^caR zvMm31;(Z7o)e*;B2OirzPKN8;F(2Op_FvdX$uEY!ShAOHyK&-lk^4OG_)h$v`15>wah!YwfA7ctgBTyg-S3S17x18Y9G~@6 zRYe}iJpRx99vDwQkN;2Z+=l)=fBn2`dtpD~43B{bK?%zs@@rAhlTewc31^dZkry2U4P+gm87vISPpnq~yQ!bJR(A(P$zF3XDO83u2 zewR*qcKAHj1wvp7?E)Dr%n(lzmCHwP>>Phvo5Ay)IuKNVUphxzv%o)qGgKOM>~{@` zH=DUnd%L@{6XVu7nNbe};QukY-H0nZ*SNJ^1+N3~%h|`Y0P=&a?Xg(&yIP%E^+A1mT?i&}?#V1uHdE5+F_GfCtHWRr;u@qeiyQ#zKUaPFbQ*e?xv(vUZ~ zW79~J>&78>hw;BJ@Kt_84kbLfe&FyO@JqA>fw$;_gJVJ9DMLd8gXFRFt&L%SF?UBY z7B^LXBiNOV`2*JvVH_3bip2Z9IaMJKp!uI9tY6(-g#okvA>ca=n%B$n&S|bD@MPTZ zUoGP}%zP!J=l%d#9=qxh$9d*krW)`8LJmzJFW}e9Zv;yDb?Bc1tIhFmNnf?Hg!^i0 z+P~snD0Vt zdG5b0?4_UOg;Xwg9&%@PY>M|)+>kOX@7mx0e|}8)N#pNa=K8sy#T!_T%X;`tA%A*C zlX<;q6?ig`Ay41C7vTS#>vYJ#(QNN@OZd)3Hl^5JT3-gw-hT}154*80G=yhPCc%+vmG=`odteZ+rOU8l<=vnNp9eMp3~t7{hyL3mhup%a?xTr?0CyS z+(7)oJ9kt^IVeX(@@|4t*-<0^{H3hyh{G^tnDvuFvrLx~jU9nR9u=m2SgX=8C&A2M8&kbE&%r6j(%WlRg zfENz`FYXkTZEK#(!LRU2qq|KJTOp5qJyyl{ZnS%bn744Sx6Uw$JDa?5_(hNh z;KV!aTvvv-I5)HYe;MyboD}S5p2u`Fv;p-fOwYkj_RF~bZ#pL4uQikb=fZlF^V)lo z{d&p5?+-z*Lr*MlkXNIJ1C)Lp=J&iM|7~8tFY*Oo{l#$yS^)4T%G>+^>TLn@N=XVr zw}|;!8t68npSLV66yPU9{C~s^Jzit?HV+Bt*Y;*_(+(rPTZiRCx7%npAM5Sm_3G!J z$Y7kb=q)`fXt&&`STIRGKsfNXh_CO4z2j(-4~Z?D*J+0sPpnco9+7Up8uvMe9{9aW z%mWgiD|$JuI*ae(?+dIyKD5{;@O#WYINmWo)ZTA;m-xRRb`Dfxe$ZT675D_ZEEVfM#`8bl{rw@_ zx3f!ewrs~dWEt?f++E%7ZD+H?ZrD#k>oX6NC-C^$yOxyZ58=USfLndCIDSp|D{W=?KYY&FVAJCi3C&-i9;~iNT3Nb!xiIMw*mMwT=<_7S8 zp?txAxp4^gqVUnrARmDJPdB;t@_C-UxfJ!wzQ5W27X1^Jx*q6}iAEFiIYWPFd0EHz z3BE0xD8s?JXV$~tQ+9S~3Getz$1_&~xUSApwV3*(?2On4nu5Cdc)Cekw@HvBUeA0& z7h14Ck7M(D$6As4nR!7(yce_p$QsxQ1f#vZ^t)NA8f4A`g5p-_{|iflG0uAib5x_m zG@#W$UwuD&Fjj->w2qckDSig=_QZoybkd6IS3shS+Le z{~1vb_`IXtgT2HhpWKs+;MkgsCxV;@PDK0yrR?vAJ%%_fRrK>%3hTf_D7WdW#cArX zkTL-OF8qF}vYmx!w$(0rnwMB|I19E#b}Qtp-_9C#=ZlnkxdI z!ue!2zXune$aPd1H`%Y_qv1R_X`-*Pp;RwwtxtVfL45O`BoAGg*4D zUpw$yMa#3Ft!?P3q-@`o>ZEKq&~ue?ZmzS5cB)!*jSCrcDkJpD&Zylu!N=K3$e`{55k>67;&kWPP*H~8q9A!N! ze%c$z-;+D9u)Q;iI>2@sb0u@shds+qXe?JyFTrjDuPJ;K`VIN1qQwaw*JA*+;(Afx zzDdZlWUd2FzTTcS5vRuf_FLz+u$@hr8yf4+AL~W`D!1ic_dmd641+n=v*F&l9=5}k z9XmGBE)%MS)tn!XFE;|WZ*vaBu3jzK-M)oirn!1GJi)IG-XrPH|} zzqdlC`&<6LE#(95i+XQzrrFQO^-2-ZmR1RVDAt=Ps$HRkn_S^{3sQ27$5PykeXh!F z0|Uhz?^7O-jU+@-2H@P^^e5(H5GU5v+NgCK- zKS90sX~r``))C)-X{LzreXTLvpKEVJoGJ1kR1z0RZEM-aa)?q4{ReT@15t_nCsG~8 zc}S@R-?7McYN(-vmo#Z=q80v-ecmTBd~Z-E`1Ye63I+HHh?gsgF9E)C0m*m=L zjJW@^g>0VpCkx5a^R%LZa${c722PjGOM3JV@K^L@OL=TEl|z55x2JYEx3HWAE&Doo z1dbP5rYXmg-5Bq9?sHS^ERQEDmFgj1kc_;~=0B^5kPmM2>u9HIny-xKZy*6TWk)`N zbprB7%(a(zU4U&%cz%9BR;kZ>U+BcVfPIg>-VW;dqBe(k*ZnIS)(p;009SF#lArTJ zcTCfBzGx2XpvQst4a)Vb2PyBpxd`VUIMd%xd&kn9>~nXWYiw$2y2sXWu5n~|>qscH z$TnTLvghu@8{UiiFSl7NigE#ZS8p)aeeQYex3%#R#5ZqnI!g98*29)Hb+DtI$0Nxo z?Kaoji}k>L?L}q!66>M(M!2LW9h#;`|8LwZ=}?c%M@fF*FUz*~j!P2$tCBeGSemZXW#z00-)zX$NVj|yRlxc`!c3xM~3?l4Y6mhk;`b>Db3 zwAbr$)nWfd!2I63A)h~Xtou&UHjfw=!| z{C^(bf4}59P*_*8?|qvblx>@DtqZZd(z3}YSF>RdgZ@z6dM z6wMW&eXr(sQ=f^El!x}z^!aq0`cz5w1t~M*J^?u2N=H2H!!9B#voU!w?V1ADA|)d==!fu0u`9}k|IqZQ6 zoT-^A%>%pRQz+N9#=fFS-wHWfEJE*{L!Ox+{2IVrV?WU(Q2$Ii7ut^&_Rnfj3VyHY2eU-{X&Ewp>GAsPe^Q%~v56DgN$V zC||0h3Ap%q%(F4rzZ2FSU+{QoFaA|efq6h|J2Z8AIqEMt{$S>s741_W8=SCSZG@jk zqCP}Er!e)TKNuCMCqrhF!tc|(u`lO{e|S13m-Bb2K9Qtc6^%;#J=rhFwIH0K-9MeXgg6-FSBS+>f8fjB=sC*k-%Vsxwp0JNQaR4o zwX0*ai*4%v7K>4@Vs+)FeHIQE(Jwhq8(@drWqVYVqDGW&B=5;_y`eKDM_8XhRU2l% zOImL65K^hQ#Bo#9)XaH|1Mrw+_II;+fc4!7wQ1)2GT7gs70(;m;oQ0i-;aD?NnU3Z z!n4?SqcPXs3BJgQ#*Ytwz3ZA4{pPPTdswd$c#^C?EC3yxw?+zC%>S6jLQ4beulcth z&#*lmo`lTu%{UxCS!U}-o-M6dj{1yc(cfUVHjN~Mlq)O(?0{?5pcLz2e;QTQa1FkH z&!~$02FN=B{>glPu@5WL9*hSp;EAKF67%VcJCR2ccslT3B$D~Cd;sSC*9IMqw5PRY zcXGuH@&B>Q)4Ece{>;F6;{Up(^}zRATQ(XIR||aVK)EQ@cC2?+xAhCm+i&>pe=`7o z#eThC@LLi0-?l|Wy!B_DR|fTXPHW4NpiUnI;@GY8yOGD-^IgB1XL*f7X-`GR)kg#| zHUa$GnUn4{F#rFI8V~GuU$wf5b0Xv;S8s$&p9K#<_}W~8xW6}9*F!#m-RZ z0pz`3Xn$r|yJ3zNc8cxov;T zRjZiJ%pmUn5xDz++b^_xcONt`4}hkcbjxw*rd4}ls@E9;r)AkvPRy(@bJf1(9cy-5z18T`mA$XE{9rQZckVe zYnb1_d--CF_~1)_lq^hwKT#W-bxh(t;dsG;`mvkzOZO4qi^v)H+fKN1TROwU{k3Rq zSK32dR69>;0buza{%CvuW}g2M{*YGz`?jxJ2i&s*a8(WQQiP+oSrMn~#~+UYqqp#wcsk3Y*XvoH z4urKSz^~olNfn7>W7vGW782!tfBgTa824OJQL#7#e8}tdzRP2L&RI8}19}6VXY1su0nU4UjS#sA~^JJTh;L=N>{!nc#eL*K*yncuyd-<>>o(EqFWe+BZrA3uH@|35+A zp>7`kccUKgUYXxBH#euD+@<{&i2svc3I3Z?lDfNz|HJIsG>`wE08fOx3(y!HEx557b(__EaU&a6V z{`cejA9P&8|Lf}NehL34zoF|^-v4({8^rnJk2v?w zfBxe)C;``_{wH@bF97=CE~M{Wcsmb3ZO1wg1}cF6uM-%zhy6NAar=RmhUDNNadh-2 z#5sv>RduhUOg0Se=X1t8jy9nG?y~f}dQlEd!Y^$&LHvK{?8WQM1JJ1$P5iy#ze+*k zn4Y5Htc-XvhhLCFxV}#m!t_fwt10Y5d%^vfB%uGaI-85>Fmd3fV${HKU1_nD?mt@b zQsmW8s4HpeQusV6-HyEJ_|9VIUii=5(=97TDQ8?C3sEb0i<%Hz#p{8u$gR&eYq7WZ-Bmjr%_LG>3gu_nkJNK@izd;3MC{8I0M4(AbTkF9 zz7^x-^)9kc*)G1s=Q*@K@NE!3x2#IP9eIokgR9M-d*0nqS=KQ3(BaB&v|lf7u0-6w zUrOsgM|}UT6$QrmM-V4M{9QP!ZLa*rg%+XVen;gu#FjHZpF#exNw-Ox8Ga3M_rlN* z7LW%JUSklb?Y9-K4Tbf4d4TG zMUhsM{oLrwNhP@|pSX^E(7}ct{dM3b@Ncyv&vMJ$Xww+q-}{xBg}{AwCAFXZD|isw zMK$fIJAA=?kEO1%9^b?Lkv>pCkfN&EMDan>;bJ8^L$3p*D30sv1&``GFRd$ZhEZ@TEr zVjbT&GONPwW?s|TBK>Tc)p_`5YV5l;?SBVvz@FWn6_k<#!Lz4=LQ2NCNG%Uuy4! z-xq#8$*1Feec1sMuY2cvyO0;aX#c_!+A_*(1GB*Ek-s$h#58hhD{hp`9`Z()D4km!ZVc*xsk`{hv#Ub?!*Ry`HvxGlS4)@d<(QYHq+pNd0uX(ov z{>8>>X=;Ri?Je2jv;1AlCW8}LKN!_F-==>mx#pQGZScR%_&$UBI@h?W?g_;GZLmN1 z^@AZwEu_G&zQ}emoeERNWV4xmwEk`M`!LV%gdTX4GyAjd5)a^i0H;P5a&auFF)m9d zN($F&b85D!2K}$8bMIE_t-rpo8-9|zZ2Mdl@B;u3$o}AA_V2SV#jp+n{+Ji5IX-T5 z8CCk}!|qXq&%LZ8E(Sff=Kj75=ntwoiggco-l<$W@3X9^TP0#$7CK-!O+TA1*gaFR z9s4=>+wvDMZoE@dPqQA1)7`b~7urj6a~qr+Zs+w!oImS}>oTsNFrUAEOMWm9fWLze zdyMOF#`(|V{p_!J%tA`I*95c+_?x%$3ZUOOsrR9m-^1&FdtShBX+Lnxa|@qw1gP%^ z8jjH(DA$`{72bt-xawYxUorA6A0p$NL8({_V4Q68p*`~a>9qP&zV8Q? z<=_(;?VZick6ms%qb1wOAJRY&;c+^09{Up*?KO3^Jr~>uTDn_adzR0uZ!m!$f#)X9 zG_V|1%j-kL%kw>P#8rzeEu!Fi6}Wfd^@m5u6A(NmNd~^$;5ee0V7Hlc<(0tAcSdyS zAK}<-@_j^4yGj}`wU_3*9lpyZe2=~^o8&wwnFkQR4+MMBnwh%iO}mwqsDz7D>HS95);g!}LL@g|mg&%U3J)Ey2u*ZCgyo(#1)Kf3A5!=Wz3)n7rJIrKp0 zEiZ5+qrLccww?7{VKILdddN0D9alK7M=#CgsgLxzbd-3;X}4I-{y#HQc$MeF{u=mG zfGf$_G2$7yyxPuuG=o=;I>450STTf@&Yi@IKSP=6F86ZxFksoU>-?o)6nB3KENF30i<)3 zS>Cb+w)?S_8#mfFe^A{1{CVQ^4#!Lh--jsS`oE0tlkfFDoF9&_65fw;QbIs}b)^FP zh*B%|OV{w+%Ce>K-+pzaYB7U1hW(a{+6<*9FPYdr`WOB1ivrIn*859-K2JVLzho?_ z*VDfim*sn@?}M3$N#>Y!>~BF+4E+vzsXyhX z{bP(6$~lk6x*6wcwC{OQ`Vr5^0=_V>^NtnZS4>+UM*@7#`$)%|#C&a)q!h|GVeL=9 zx|TSpmJh-{JKu;*_zqP`s}u0+Y8hA4HS2lA-O2DTo`9W~Owb>CW-gtg zv>41K{LZk*VxeDk=Z>~E&Z~XNwMojwiJ%_+0eLa%%*4q%q_gAQ=s)|K2P7W53XuSh zuPTzl`Cstm+W0-GFyrS-_NtHP`_&@iUN_kH7L)xPS3C7WfKmiuf$z!Itdcp-p6l$y zcq_LJEv<%~3qH(GQX`yC|MiOZ2J0n{{>XXuq;6G_cE-O*e>KSRwX4(66E(Kji&;PQ zN?MU;I8F=MgRrA&>_0njpn~^lWA15Qmq&e27PVrE_XjOe*gHo1-p7*#+DpYL6?pVH ztE_wv?YGEgk`u6B%WYCb9;A#Y(oMFj$sfMNb{u*3g$G2)<}IpPV?#Rv&*1qN8?yK= z*lA<20O#}Mm)dtQFTj*~3+K1gMe#l04Q$!$;CruY!zKJ97*w#HO`YyNaElNFf_~7z_8G#sFc1a@?lfv=b3G znH(PD`1^#}g8u$WWA{^KI$o#OBM%Yu@eYM?i^o>pzqUBV`2hTnUapJo8_`fs=moh4 z{R#8j>~7TWUABu#r;qv~ahh@ai2p}GH-Gn^J!@urI}dW5a$;; zSjO|F7oq}>`}L*>uYX|GD!CQsmGN~r4}L<00p&ygNSMlb+|;yWaU0}{I^wm+uMmr7 zT5+5{ziy}v{DsN`-BKIMxy?;G9QJ6?{9jofIT{yv{nDH2<83&0OHuG8u#a{0B+3n5 zaMAKgEBlfE-XM-`pET-xtjF+p5Xb0$vA$W#j*Jqep3I540Q*;LurJ2*rUBD(zAwoJ z#`9A?oesx#t@BnK{^re>kY@|W89Bq>XSKfBR@|pn2ZEeWmD~gM#Odo+>yNU0u|#~J z&DlzRsl@B!@ynx>^3r=1N|PkT$zM5}YPrex=D-JGxdnsH%=_a=7{Kci%0QIIMeVs9 zj}5w|;P1BDlhS28cZ1z02p^%Iau;V$@b?8m8SLft_6+i-@i_U%Yf;aOY&%jZmE+Ih z8SkPV$FgOL_=?USiBq3~#&d+Yn<9$9xAw10NX0m>3xxin6i1qP?ssGC$1iJ%6YQr3 z@Wr4%8kb^T;Bg`=1^E0U4Y4?JnYnMTt`DI{e+2$d`OpSC;&>jUo%+JEHM{woZ7C7< z#e}s^Ho*=ee^wr(e%h*&#M`c5wg6mNkg0aMoGmSjF~Mdt2%}?6OvS9(>z? z6TC?Lu^t6D%t{jYH6;YbBhPbO-;yFEmJJJT$pu&s;TV8ECBzW(-XTvN))kOmtS@kW zNCPg6dPW>M-nPL`T={c{!S@01e;fC|jsJ7s`s*RNOH3;&@&AV({`}{8jA}p}#qIci zglUz*uYx@J>wba%!!NlV#r{vs`~M%o{hgZ`@9#hb1Vgv-5i`CIpN+iqlWx!+{$2V0 zdEY#~|C{7|ep%XwjEgEs5U4NU811TcQ6PN}?2ZUf0u8x!(Sjm3}1bu7MO_@Gzf?AjGhqrr$}zet+Qg%duhVU3`U?<@E&> z#E&0`47|nn$Q5P--|G{qp-(2P=42N23mhDZpX(0Y4~hloSF2CeynHV93-Hpfr4LDO z*5J8%gSiw>p!283sF%ilv6=m_1HxjW`8>vH%wkw(Lj24gEi6>*;=b(?*00!?tk@5K z&mx<{rEcN(O?x`GUV|Q))nwgO$R!4yt`+Y)5=&Nb9_sX{*zXMcse7}SA6{vE^e;Mm zEXR?-6R7WVjR2-1v@c_R+KUs`fBF39KhN($yu+0m8+ZxVAK*@Ah+c4e^6(uVq$C8=arM!|FDeCqT4 zUASZiTs(P_-@htZ$a0>T?0ZYk?^Z5m&az(tr$58@sGA*46ZpQ~-kBQ{R^~7Bo7qnX zD*Q@~O>Fd~#!LEJi&+|ISD8L(TueL21>BGJ$wg%v?E-#!+=SsD7&X??P$cX)>NJ)mD}MtmOfx@5cfJ^K{q>xbVCiQdTP=yeP~!}Cph z)Ml1rVO^!gi06vAQP?wSt9(!yE7eC^d*?OWSMp4kulInr5_YP&w$Vy^0SP_7H>423x0ydEslj_Uu7?Y-oSW zwO+-9IQyNkI_%?nXumt$ZVUu*Ug;Jk@(FbEmg4!HC)}d=`oW5h6K5C?pS$8V{usIMo!FPuuBApReIGb%8yKkZE*&;MQa(Pv&PqddK8+C$t_ z$o*&w-&26Plku9T;kGOZd?OJYs*}5784dVax@tAr7?nG6^B9KGI@)np^A>#!NvUUj`8VYJL28D42EUHY(MCe$sqP| z2#cRs7d&)sr^#fjeHHuJ`+UMW;``fDsV>I*TP&8Sg#7_(w(zfA$&&phY@Rmg|l(pwjckuUH!#%is^WAJ(N#Qy{J`|{+ilncHM z97o~)(eHc__^R}^<0|fNQGfi-L`wEM}JlEH;-!)|9=Y4`E~d|VD|-g;{V_gY@NsPE8g4pp#tB_ z{QrE;BK-Y2{2%tWI)5K={C{u!KkP}}uj2pb-L!8$2=9OYdE)5N$EUOA4f|N4q`gY2@t>wA2bhDStuCU}^|~PX%^VH*wJL+c%RT@CfFvr?=7H zJesQxa=eTcrKR}J7W3lgA4fS`!V-BwurqTm$9e1%G8B#sioo|bZ{D(nasGPg$Zj6% zmJSwd90yv%3GM@+>}}ft|FAVTm&?^)Ue~I0LJiiNY|jstzg?XFdip_4cJN|q>{!

o!CY~;AbagV1znp0RFMiTp_L;pd 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

HXF|1Xf2q)Fm|d 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
Z4^oPAYe$RsOY<+JDalmMwJ=-=- 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�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