From dffdec9d9c428573ecb3c6dfe2cae0ad4cd68055 Mon Sep 17 00:00:00 2001 From: Diren D Bharwani Date: Wed, 4 Jan 2023 19:45:41 +0800 Subject: [PATCH] Cleaned up colliders --- .../Inspector/SHEditorComponentView.hpp | 8 +- SHADE_Engine/src/Math/Geometry/SHAABB.h | 11 +- SHADE_Engine/src/Math/Geometry/SHPlane.h | 10 +- SHADE_Engine/src/Math/Geometry/SHShape.h | 42 -- .../Collision/Broadphase/SHDynamicAABBTree.h | 2 +- .../Collision/Contacts/SHCollisionKey.cpp | 2 +- .../Physics/Collision/Contacts/SHContact.h | 2 +- .../Physics/Collision/Contacts/SHManifold.h | 2 +- .../Narrowphase/SHCapsuleVsConvex.cpp | 2 +- .../Collision/Narrowphase/SHCollision.h | 1 - .../Narrowphase/SHConvexVsConvex.cpp | 2 + .../Narrowphase/SHSphereVsCapsule.cpp | 2 +- .../Narrowphase/SHSphereVsConvex.cpp | 4 +- .../Narrowphase/SHSphereVsSphere.cpp | 2 +- .../src/Physics/Collision/SHCollider.cpp | 393 ++++++++++++++++++ .../src/Physics/Collision/SHCollider.h | 178 ++++++++ .../Physics/Collision/SHCollisionSpace.cpp | 14 +- .../src/Physics/Collision/SHCollisionSpace.h | 10 +- .../Physics/Collision/SHCompositeCollider.cpp | 339 +-------------- .../Physics/Collision/SHCompositeCollider.h | 141 +------ .../{CollisionShapes => Shapes}/SHBox.cpp | 2 +- .../{CollisionShapes => Shapes}/SHBox.h | 1 + .../SHCollisionShape.cpp | 2 +- .../SHCollisionShape.h | 3 +- .../SHCollisionShapeID.h | 0 .../SHCollisionShapeID.hpp | 0 .../SHCollisionShapeLibrary.cpp | 0 .../SHCollisionShapeLibrary.h | 0 .../SHConvexPolyhedron.cpp | 44 +- .../SHConvexPolyhedron.h | 2 +- .../SHHalfEdgeStructure.cpp | 0 .../SHHalfEdgeStructure.h | 0 .../{CollisionShapes => Shapes}/SHSphere.cpp | 2 +- .../{CollisionShapes => Shapes}/SHSphere.h | 1 + .../src/Physics/Dynamics/SHPhysicsWorld.cpp | 2 +- .../src/Physics/Dynamics/SHRigidBody.cpp | 4 +- .../src/Physics/Dynamics/SHRigidBody.h | 6 +- .../PhysicsObject/SHPhysicsObject.cpp | 9 +- .../Interface/PhysicsObject/SHPhysicsObject.h | 16 +- .../PhysicsObject/SHPhysicsObjectManager.cpp | 12 +- .../PhysicsObject/SHPhysicsObjectManager.h | 4 +- .../Physics/Interface/SHColliderComponent.cpp | 7 +- .../Physics/Interface/SHColliderComponent.h | 4 +- SHADE_Engine/src/Physics/SHPhysicsEvents.h | 2 +- .../Routines/SHPhysicsPreUpdateRoutine.cpp | 2 +- .../System/SHPhysicsDebugDrawSystem.cpp | 2 +- .../Physics/System/SHPhysicsDebugDrawSystem.h | 6 +- .../src/Physics/System/SHPhysicsSystem.cpp | 4 +- .../src/Serialization/SHYAMLConverters.h | 12 +- 49 files changed, 697 insertions(+), 619 deletions(-) delete mode 100644 SHADE_Engine/src/Math/Geometry/SHShape.h create mode 100644 SHADE_Engine/src/Physics/Collision/SHCollider.cpp create mode 100644 SHADE_Engine/src/Physics/Collision/SHCollider.h rename SHADE_Engine/src/Physics/Collision/{CollisionShapes => Shapes}/SHBox.cpp (99%) rename SHADE_Engine/src/Physics/Collision/{CollisionShapes => Shapes}/SHBox.h (99%) rename SHADE_Engine/src/Physics/Collision/{CollisionShapes => Shapes}/SHCollisionShape.cpp (99%) rename SHADE_Engine/src/Physics/Collision/{CollisionShapes => Shapes}/SHCollisionShape.h (98%) rename SHADE_Engine/src/Physics/Collision/{CollisionShapes => Shapes}/SHCollisionShapeID.h (100%) rename SHADE_Engine/src/Physics/Collision/{CollisionShapes => Shapes}/SHCollisionShapeID.hpp (100%) rename SHADE_Engine/src/Physics/Collision/{CollisionShapes => Shapes}/SHCollisionShapeLibrary.cpp (100%) rename SHADE_Engine/src/Physics/Collision/{CollisionShapes => Shapes}/SHCollisionShapeLibrary.h (100%) rename SHADE_Engine/src/Physics/Collision/{CollisionShapes => Shapes}/SHConvexPolyhedron.cpp (66%) rename SHADE_Engine/src/Physics/Collision/{CollisionShapes => Shapes}/SHConvexPolyhedron.h (99%) rename SHADE_Engine/src/Physics/Collision/{CollisionShapes => Shapes}/SHHalfEdgeStructure.cpp (100%) rename SHADE_Engine/src/Physics/Collision/{CollisionShapes => Shapes}/SHHalfEdgeStructure.h (100%) rename SHADE_Engine/src/Physics/Collision/{CollisionShapes => Shapes}/SHSphere.cpp (98%) rename SHADE_Engine/src/Physics/Collision/{CollisionShapes => Shapes}/SHSphere.h (99%) diff --git a/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorComponentView.hpp b/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorComponentView.hpp index 765dbc9b..db9c161f 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorComponentView.hpp +++ b/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorComponentView.hpp @@ -21,6 +21,7 @@ #include "Serialization/SHSerializationHelper.hpp" #include "Tools/Utilities/SHClipboardUtilities.h" #include "SHInspectorCommands.h" +#include "Physics/Collision/SHCompositeCollider.h" #include "Physics/Collision/CollisionTags/SHCollisionTagMatrix.h" namespace SHADE { @@ -420,17 +421,20 @@ namespace SHADE } ImGui::EndChild(); + // TODO: Handle differences between composite & hull collider if (ImGui::BeginMenu("Add Collider")) { int newColl = -1; if (ImGui::Selectable("Box Collider")) { - component->GetCollider()->AddBoxCollisionShape(SHVec3::One); + auto* compositeCollider = dynamic_cast(component->GetCollider()); + compositeCollider->AddBoxCollisionShape(SHVec3::One); } if (ImGui::Selectable("Sphere Collider")) { - component->GetCollider()->AddSphereCollisionShape(1.0f); + auto* compositeCollider = dynamic_cast(component->GetCollider()); + compositeCollider->AddSphereCollisionShape(1.0f); } //No idea why this doesn't work diff --git a/SHADE_Engine/src/Math/Geometry/SHAABB.h b/SHADE_Engine/src/Math/Geometry/SHAABB.h index e6536fa5..9b62c85b 100644 --- a/SHADE_Engine/src/Math/Geometry/SHAABB.h +++ b/SHADE_Engine/src/Math/Geometry/SHAABB.h @@ -13,7 +13,7 @@ #include // Project Headers -#include "SHShape.h" +#include "Math/SHRay.h" namespace SHADE { @@ -25,8 +25,7 @@ namespace SHADE * @brief * Encapsulates a 3D Axis-Aligned Bounding Box. */ - class SH_API SHAABB : public SHShape, - private DirectX::BoundingBox + class SH_API SHAABB : private DirectX::BoundingBox { public: /*---------------------------------------------------------------------------------*/ @@ -39,7 +38,7 @@ namespace SHADE /* Constructors & Destructor */ /*---------------------------------------------------------------------------------*/ - ~SHAABB () override = default; + ~SHAABB () noexcept = default; SHAABB () noexcept; SHAABB (const SHVec3& center, const SHVec3& halfExtents) noexcept; @@ -85,7 +84,7 @@ namespace SHADE * @return * True if the point is inside the aabb. */ - [[nodiscard]] bool TestPoint (const SHVec3& point) const noexcept override; + [[nodiscard]] bool TestPoint (const SHVec3& point) const noexcept; /** * @brief @@ -96,7 +95,7 @@ namespace SHADE * The result of the raycast.
* See the corresponding header for the contents of the raycast result object. */ - [[nodiscard]] SHRaycastResult Raycast (const SHRay& ray) const noexcept override; + [[nodiscard]] SHRaycastResult Raycast (const SHRay& ray) const noexcept; /** * @brief diff --git a/SHADE_Engine/src/Math/Geometry/SHPlane.h b/SHADE_Engine/src/Math/Geometry/SHPlane.h index 581b1c03..6593c627 100644 --- a/SHADE_Engine/src/Math/Geometry/SHPlane.h +++ b/SHADE_Engine/src/Math/Geometry/SHPlane.h @@ -11,7 +11,7 @@ #pragma once // Project Headers -#include "SHShape.h" +#include "Math/SHRay.h" #include "Math/Vector/SHVec4.h" namespace SHADE @@ -24,14 +24,14 @@ namespace SHADE * @brief * Encapsulates a 3D plane in point-normal form. */ - class SH_API SHPlane : public SHShape + class SH_API SHPlane { public: /*---------------------------------------------------------------------------------*/ /* Constructors & Destructor */ /*---------------------------------------------------------------------------------*/ - ~SHPlane () override = default; + ~SHPlane () noexcept = default; SHPlane (const SHPlane& rhs) noexcept = default; SHPlane (SHPlane&& rhs) noexcept = default; @@ -77,7 +77,7 @@ namespace SHADE * @return * True if the point is on the plane. */ - [[nodiscard]] bool TestPoint (const SHVec3& point) const noexcept override; + [[nodiscard]] bool TestPoint (const SHVec3& point) const noexcept; /** * @brief @@ -88,7 +88,7 @@ namespace SHADE * The result of the raycast.
* See the corresponding header for the contents of the raycast result object. */ - [[nodiscard]] SHRaycastResult Raycast (const SHRay& ray) const noexcept override; + [[nodiscard]] SHRaycastResult Raycast (const SHRay& ray) const noexcept; /** * @brief diff --git a/SHADE_Engine/src/Math/Geometry/SHShape.h b/SHADE_Engine/src/Math/Geometry/SHShape.h deleted file mode 100644 index 7781a5a4..00000000 --- a/SHADE_Engine/src/Math/Geometry/SHShape.h +++ /dev/null @@ -1,42 +0,0 @@ -/**************************************************************************************** - * \file SHShape.h - * \author Diren D Bharwani, diren.dbharwani, 390002520 - * \brief Interface for a shape. - * - * \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 "Math/SHRay.h" - -namespace SHADE -{ - /*-----------------------------------------------------------------------------------*/ - /* Type Definitions */ - /*-----------------------------------------------------------------------------------*/ - - /** - * @brief - * Encapsulates a base class for any shape. - */ - class SH_API SHShape - { - public: - /*---------------------------------------------------------------------------------*/ - /* Constructors & Destructor */ - /*---------------------------------------------------------------------------------*/ - - virtual ~SHShape () = default; - - /*---------------------------------------------------------------------------------*/ - /* Function Members */ - /*---------------------------------------------------------------------------------*/ - - [[nodiscard]] virtual bool TestPoint (const SHVec3& point) const noexcept = 0; - [[nodiscard]] virtual SHRaycastResult Raycast (const SHRay& ray) const noexcept = 0; - }; -} // namespace SHADE \ No newline at end of file diff --git a/SHADE_Engine/src/Physics/Collision/Broadphase/SHDynamicAABBTree.h b/SHADE_Engine/src/Physics/Collision/Broadphase/SHDynamicAABBTree.h index 32b5095a..292c3528 100644 --- a/SHADE_Engine/src/Physics/Collision/Broadphase/SHDynamicAABBTree.h +++ b/SHADE_Engine/src/Physics/Collision/Broadphase/SHDynamicAABBTree.h @@ -13,7 +13,7 @@ #include // Project Headers -#include "Physics/Collision/CollisionShapes/SHCollisionShape.h" +#include "Physics/Collision/Shapes/SHCollisionShape.h" namespace SHADE { diff --git a/SHADE_Engine/src/Physics/Collision/Contacts/SHCollisionKey.cpp b/SHADE_Engine/src/Physics/Collision/Contacts/SHCollisionKey.cpp index 8bd26e91..4bb22697 100644 --- a/SHADE_Engine/src/Physics/Collision/Contacts/SHCollisionKey.cpp +++ b/SHADE_Engine/src/Physics/Collision/Contacts/SHCollisionKey.cpp @@ -14,7 +14,7 @@ #include "SHCollisionKey.h" // Project Headers -#include "Physics/Collision/SHCompositeCollider.h" +#include "Physics/Collision/SHCollider.h" #include "Physics/Interface/SHColliderComponent.h" diff --git a/SHADE_Engine/src/Physics/Collision/Contacts/SHContact.h b/SHADE_Engine/src/Physics/Collision/Contacts/SHContact.h index 0c137f2f..70e53794 100644 --- a/SHADE_Engine/src/Physics/Collision/Contacts/SHContact.h +++ b/SHADE_Engine/src/Physics/Collision/Contacts/SHContact.h @@ -12,7 +12,7 @@ // Primary Header #include "Physics/Dynamics/SHRigidBody.h" -#include "Physics/Collision/CollisionShapes/SHCollisionShape.h" +#include "Physics/Collision/Shapes/SHCollisionShape.h" namespace SHADE { diff --git a/SHADE_Engine/src/Physics/Collision/Contacts/SHManifold.h b/SHADE_Engine/src/Physics/Collision/Contacts/SHManifold.h index 15741276..3b591875 100644 --- a/SHADE_Engine/src/Physics/Collision/Contacts/SHManifold.h +++ b/SHADE_Engine/src/Physics/Collision/Contacts/SHManifold.h @@ -12,7 +12,7 @@ // Primary Header #include "Physics/Dynamics/SHRigidBody.h" -#include "Physics/Collision/CollisionShapes/SHCollisionShape.h" +#include "Physics/Collision/Shapes/SHCollisionShape.h" #include "SHContact.h" #include "SHCollisionEvents.h" diff --git a/SHADE_Engine/src/Physics/Collision/Narrowphase/SHCapsuleVsConvex.cpp b/SHADE_Engine/src/Physics/Collision/Narrowphase/SHCapsuleVsConvex.cpp index e7da5f8b..6c82c3a5 100644 --- a/SHADE_Engine/src/Physics/Collision/Narrowphase/SHCapsuleVsConvex.cpp +++ b/SHADE_Engine/src/Physics/Collision/Narrowphase/SHCapsuleVsConvex.cpp @@ -16,7 +16,7 @@ // Project Headers #include "Math/SHMathHelpers.h" -#include "Physics/Collision/CollisionShapes/SHBox.h" +#include "Physics/Collision/Shapes/SHConvexPolyhedron.h" // TODO diff --git a/SHADE_Engine/src/Physics/Collision/Narrowphase/SHCollision.h b/SHADE_Engine/src/Physics/Collision/Narrowphase/SHCollision.h index e98983b4..0ce1f688 100644 --- a/SHADE_Engine/src/Physics/Collision/Narrowphase/SHCollision.h +++ b/SHADE_Engine/src/Physics/Collision/Narrowphase/SHCollision.h @@ -11,7 +11,6 @@ #pragma once // Project Headers -#include "Physics/Collision/CollisionShapes/SHCollisionShape.h" #include "Physics/Collision/Contacts/SHManifold.h" #include "Physics/Collision/Contacts/SHCollisionKey.h" diff --git a/SHADE_Engine/src/Physics/Collision/Narrowphase/SHConvexVsConvex.cpp b/SHADE_Engine/src/Physics/Collision/Narrowphase/SHConvexVsConvex.cpp index d73097bb..6753c453 100644 --- a/SHADE_Engine/src/Physics/Collision/Narrowphase/SHConvexVsConvex.cpp +++ b/SHADE_Engine/src/Physics/Collision/Narrowphase/SHConvexVsConvex.cpp @@ -15,6 +15,8 @@ // Project Headers #include "Math/SHMathHelpers.h" +#include "Physics/Collision/Shapes/SHConvexPolyhedron.h" + namespace SHADE { diff --git a/SHADE_Engine/src/Physics/Collision/Narrowphase/SHSphereVsCapsule.cpp b/SHADE_Engine/src/Physics/Collision/Narrowphase/SHSphereVsCapsule.cpp index d7eb02fc..25515fd7 100644 --- a/SHADE_Engine/src/Physics/Collision/Narrowphase/SHSphereVsCapsule.cpp +++ b/SHADE_Engine/src/Physics/Collision/Narrowphase/SHSphereVsCapsule.cpp @@ -15,7 +15,7 @@ // Project Headers #include "Math/SHMathHelpers.h" -#include "Physics/Collision/CollisionShapes/SHSphere.h" +#include "Physics/Collision/Shapes/SHSphere.h" // TODO diff --git a/SHADE_Engine/src/Physics/Collision/Narrowphase/SHSphereVsConvex.cpp b/SHADE_Engine/src/Physics/Collision/Narrowphase/SHSphereVsConvex.cpp index 1b97a7c6..2b08313b 100644 --- a/SHADE_Engine/src/Physics/Collision/Narrowphase/SHSphereVsConvex.cpp +++ b/SHADE_Engine/src/Physics/Collision/Narrowphase/SHSphereVsConvex.cpp @@ -17,8 +17,8 @@ // Project Headers #include "Math/Geometry/SHPlane.h" #include "Math/SHMathHelpers.h" -#include "Physics/Collision/CollisionShapes/SHCollisionShape.h" -#include "Physics/Collision/CollisionShapes/SHBox.h" +#include "Physics/Collision/Shapes/SHSphere.h" +#include "Physics/Collision/Shapes/SHConvexPolyhedron.h" namespace SHADE { diff --git a/SHADE_Engine/src/Physics/Collision/Narrowphase/SHSphereVsSphere.cpp b/SHADE_Engine/src/Physics/Collision/Narrowphase/SHSphereVsSphere.cpp index aa270b16..1a76924e 100644 --- a/SHADE_Engine/src/Physics/Collision/Narrowphase/SHSphereVsSphere.cpp +++ b/SHADE_Engine/src/Physics/Collision/Narrowphase/SHSphereVsSphere.cpp @@ -15,7 +15,7 @@ // Project Headers #include "Math/SHMathHelpers.h" -#include "Physics/Collision/CollisionShapes/SHSphere.h" +#include "Physics/Collision/Shapes/SHSphere.h" namespace SHADE { diff --git a/SHADE_Engine/src/Physics/Collision/SHCollider.cpp b/SHADE_Engine/src/Physics/Collision/SHCollider.cpp new file mode 100644 index 00000000..2e7cc3c6 --- /dev/null +++ b/SHADE_Engine/src/Physics/Collision/SHCollider.cpp @@ -0,0 +1,393 @@ +/**************************************************************************************** + * \file SHCollider.cpp + * \author Diren D Bharwani, diren.dbharwani, 390002520 + * \brief Implementation for a Base Collider Class. + * + * \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 "SHCollider.h" + +// Project Headers +#include "Broadphase/SHDynamicAABBTree.h" +#include "Events/SHEvent.h" +#include "Math/SHMathHelpers.h" +#include "Physics/SHPhysicsEvents.h" +#include "Physics/Dynamics/SHRigidBody.h" + + +namespace SHADE +{ + /*-----------------------------------------------------------------------------------*/ + /* Constructors & Destructor Definitions */ + /*-----------------------------------------------------------------------------------*/ + + SHCollider::SHCollider(EntityID eid, const SHTransform& worldTransform) noexcept + : entityID { eid } + , flags { 0 } + , rigidBody { nullptr } + , shapeLibrary { nullptr } + , broadphase { nullptr } + , transform { worldTransform } + { + flags |= ACTIVE_FLAG; + flags |= MOVED_FLAG; + } + + SHCollider::SHCollider(const SHCollider& rhs) noexcept + : entityID { rhs.entityID } + , flags { rhs.flags } + , rigidBody { rhs.rigidBody } + , shapeLibrary { rhs.shapeLibrary } + , broadphase { rhs.broadphase } + , transform { rhs.transform } + {} + + SHCollider::SHCollider(SHCollider&& rhs) noexcept + : entityID { rhs.entityID } + , flags { rhs.flags } + , rigidBody { rhs.rigidBody } + , shapeLibrary { rhs.shapeLibrary } + , broadphase { rhs.broadphase } + , transform { rhs.transform } + {} + + SHCollider::~SHCollider() noexcept + { + if (!shapeLibrary) + { + SHLOGV_ERROR("Shape factory is unlinked with Composite Collider {}. Unable to add destroy collider!", entityID) + return; + } + + for (auto* shape : shapes) + shapeLibrary->DestroyShape(shape); + } + + /*-----------------------------------------------------------------------------------*/ + /* Operator Overload Definitions */ + /*-----------------------------------------------------------------------------------*/ + + SHCollider& SHCollider::operator=(const SHCollider& rhs) noexcept + { + if (this == &rhs) + return *this; + + if (!shapeLibrary) + { + SHLOGV_ERROR("Shape factory is unlinked with Collider {}. Unable to add copy shapes!", entityID) + return *this; + } + + entityID = rhs.entityID; + flags = rhs.flags; + rigidBody = rhs.rigidBody; + shapeLibrary = rhs.shapeLibrary; + broadphase = rhs.broadphase; + transform = rhs.transform; + + copyShapes(rhs); + + return *this; + } + + SHCollider& SHCollider::operator=(SHCollider&& rhs) noexcept + { + if (!shapeLibrary) + { + SHLOGV_ERROR("Shape factory is unlinked with Collider {}. Unable to add copy shapes!", entityID) + return *this; + } + + entityID = rhs.entityID; + flags = rhs.flags; + rigidBody = rhs.rigidBody; + shapeLibrary = rhs.shapeLibrary; + broadphase = rhs.broadphase; + transform = rhs.transform; + + copyShapes(rhs); + + return *this; + } + + /*-----------------------------------------------------------------------------------*/ + /* Getter Function Definitions */ + /*-----------------------------------------------------------------------------------*/ + + EntityID SHCollider::GetEntityID() const noexcept + { + return entityID; + } + + SHCollider::Type SHCollider::GetType() const noexcept + { + if (flags & COMPOSITE_FLAG) + return Type::COMPOSITE; + + if (flags & HULL_FLAG) + return Type::HULL; + + return Type::INVALID; + } + + bool SHCollider::IsActive() const noexcept + { + return flags & ACTIVE_FLAG; + } + + bool SHCollider::GetDebugDrawState() const noexcept + { + return flags & DRAW_FLAG; + } + + const SHTransform& SHCollider::GetTransform() const noexcept + { + return transform; + } + + const SHVec3& SHCollider::GetPosition() const noexcept + { + return transform.position; + } + + const SHQuaternion& SHCollider::GetOrientation() const noexcept + { + return transform.orientation; + } + + const SHVec3& SHCollider::GetScale() const noexcept + { + return transform.scale; + } + + const SHCollider::CollisionShapes& SHCollider::GetCollisionShapes() const noexcept + { + return shapes; + } + + SHCollisionShape* SHCollider::GetCollisionShape(int index) const + { + const int NUM_SHAPES = static_cast(shapes.size()); + + if (index < 0 || index >= NUM_SHAPES) + throw std::invalid_argument("Out-of-range index!"); + + return shapes[index]; + } + + /*-----------------------------------------------------------------------------------*/ + /* Setter Function Definitions */ + /*-----------------------------------------------------------------------------------*/ + + void SHCollider::SetType(Type type) noexcept + { + if (type == Type::COMPOSITE) + flags |= COMPOSITE_FLAG; + + if (type == Type::HULL) + flags |= HULL_FLAG; + } + + void SHCollider::SetIsActive(bool state) noexcept + { + const bool PREV_STATE = flags & ACTIVE_FLAG; + state ? flags |= ACTIVE_FLAG : flags &= ~(ACTIVE_FLAG); + + if (!broadphase) + return; + + for (auto* shape : shapes) + { + if (PREV_STATE) // Previously inactive + broadphase->Insert(shape->id, shape->ComputeAABB()); + else // Previously active + broadphase->Remove(shape->id); + } + } + + void SHCollider::SetDebugDrawState(bool state) noexcept + { + state ? flags |= DRAW_FLAG : flags &= ~(DRAW_FLAG); + + #ifdef SHEDITOR + + // Broadcast event for the Debug Draw system to catch + const SHColliderOnDebugDrawEvent EVENT_DATA + { + .entityID = entityID + , .debugDrawState = state + }; + + SHEventManager::BroadcastEvent(EVENT_DATA, SH_PHYSICS_COLLIDER_DRAW_EVENT); + + #endif + } + + void SHCollider::SetRigidBody(SHRigidBody* rb) noexcept + { + rigidBody = rb; + } + + void SHCollider::SetTransform(const SHTransform& newTransform) noexcept + { + flags |= MOVED_FLAG; + transform = newTransform; + } + + void SHCollider::SetPosition(const SHVec3& newPosition) noexcept + { + flags |= MOVED_FLAG; + transform.position = newPosition; + } + + void SHCollider::SetOrientation(const SHQuaternion& newOrientation) noexcept + { + flags |= MOVED_FLAG; + transform.orientation = newOrientation; + } + + void SHCollider::SetScale(const SHVec3& newScale) noexcept + { + flags |= MOVED_FLAG; + transform.scale = newScale; + } + + void SHCollider::SetLibrary(SHCollisionShapeLibrary* factory) noexcept + { + shapeLibrary = factory; + } + + /*-----------------------------------------------------------------------------------*/ + /* Public Member Function Definitions */ + /*-----------------------------------------------------------------------------------*/ + + const SHMatrix& SHCollider::ComputeTRS() noexcept + { + return transform.ComputeTRS(); + } + + void SHCollider::RemoveCollisionShape(int index) + { + if (!shapeLibrary) + { + SHLOGV_ERROR("Shape factory is unlinked with Collider {}. Unable to add remove shape!", entityID) + return; + } + + const int NUM_SHAPES = static_cast(shapes.size()); + + if (index < 0 || index >= NUM_SHAPES) + throw std::invalid_argument("Out-of-range index!"); + + auto shape = shapes.begin(); + for (int i = 0; i < NUM_SHAPES; ++i, ++shape) + { + if (i == index) + break; + } + + const SHPhysicsColliderRemovedEvent EVENT_DATA + { + .entityID = entityID + , .colliderType = (*shape)->GetType() + , .colliderIndex = index + }; + + // Remove from broadphase + if (broadphase) + broadphase->Remove((*shape)->id); + + shapeLibrary->DestroyShape(*shape); + *shape = nullptr; + + // Remove the shape from the container to prevent accessing a nullptr + shape = shapes.erase(shape); + + + + // Broadcast Event for removing a shape + SHEventManager::BroadcastEvent(EVENT_DATA, SH_PHYSICS_COLLIDER_REMOVED_EVENT); + + if (rigidBody) + rigidBody->ComputeMassData(); + + SHLOG_INFO_D("Removing Collision Shape {} from Entity {}", index, entityID) + } + + void SHCollider::Update() noexcept + { + for (auto* shape : shapes) + shape->Update(); + } + + /*-----------------------------------------------------------------------------------*/ + /* Private Member Function Definitions */ + /*-----------------------------------------------------------------------------------*/ + + void SHCollider::copyShapes(const SHCollider& rhsCollider) + { + for (const auto* shape : rhsCollider.shapes) + { + switch (shape->GetType()) + { + case SHCollisionShape::Type::BOX: + { + const SHBox* RHS_BOX = dynamic_cast(shape); + + const SHBoxCreateInfo BOX_CREATE_INFO + { + .Center = RHS_BOX->Center + , .Extents = RHS_BOX->Extents + , .RelativeExtents = RHS_BOX->relativeExtents + , .Orientation = RHS_BOX->Orientation + , .Scale = RHS_BOX->scale + }; + + const uint32_t NEW_INDEX = static_cast(shapes.size()); + const SHCollisionShapeID NEW_SHAPE_ID{ entityID, NEW_INDEX }; + + SHBox* box = shapeLibrary->CreateBox(NEW_SHAPE_ID, BOX_CREATE_INFO); + *box = *RHS_BOX; + + shapes.emplace_back(box); + + break; + } + case SHCollisionShape::Type::SPHERE: + { + const SHSphere* RHS_SPHERE = dynamic_cast(shape); + + const SHSphereCreateInfo SPHERE_CREATE_INFO + { + .Center = RHS_SPHERE->Center + , .Radius = RHS_SPHERE->Radius + , .RelativeRadius = RHS_SPHERE->relativeRadius + , .Scale = RHS_SPHERE->scale + }; + + const uint32_t NEW_INDEX = static_cast(shapes.size()); + const SHCollisionShapeID NEW_SHAPE_ID{ entityID, NEW_INDEX }; + + SHSphere* sphere = shapeLibrary->CreateSphere(NEW_SHAPE_ID, SPHERE_CREATE_INFO); + *sphere = *RHS_SPHERE; + + shapes.emplace_back(sphere); + + break; + } + case SHCollisionShape::Type::CAPSULE: + { + break; + } + default: break; + } + } + } + +} // namespace SHADE \ No newline at end of file diff --git a/SHADE_Engine/src/Physics/Collision/SHCollider.h b/SHADE_Engine/src/Physics/Collision/SHCollider.h new file mode 100644 index 00000000..a326215f --- /dev/null +++ b/SHADE_Engine/src/Physics/Collision/SHCollider.h @@ -0,0 +1,178 @@ +/**************************************************************************************** + * \file SHCollider.h + * \author Diren D Bharwani, diren.dbharwani, 390002520 + * \brief Interface for a Base Collider Class. + * + * \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 "ECS_Base/Entity/SHEntity.h" +#include "Math/Transform/SHTransform.h" +#include "Physics/Collision/Shapes/SHCollisionShapeLibrary.h" + +namespace SHADE +{ + /*-----------------------------------------------------------------------------------*/ + /* Forward Declarations */ + /*-----------------------------------------------------------------------------------*/ + + class SHRigidBody; + class SHAABBTree; + + /*-----------------------------------------------------------------------------------*/ + /* Type Definitions */ + /*-----------------------------------------------------------------------------------*/ + + /** + * @brief + * Base class for a collider. + * There are only two collider types supported by SHADE Engine: Composite & Hull + */ + class SH_API SHCollider + { + private: + /*---------------------------------------------------------------------------------*/ + /* Friends */ + /*---------------------------------------------------------------------------------*/ + + friend class SHCollisionSpace; + friend struct SHManifold; + + public: + /*---------------------------------------------------------------------------------*/ + /* Type Definitions */ + /*---------------------------------------------------------------------------------*/ + + enum class Type + { + COMPOSITE + , HULL + + , TOTAL + , INVALID = -1 + }; + + using CollisionShapes = std::vector; + + /*---------------------------------------------------------------------------------*/ + /* Constructors & Destructor */ + /*---------------------------------------------------------------------------------*/ + + /** + * @brief + * Constructor for a collider. + * @param eid + * The entity this collider belongs to. + * @param worldTransform + * The world transform for the collider. Defaults to the identity transform. + * This is particularly important for composite colliders for offsets & relative sizes. + * @return + */ + SHCollider (EntityID eid, const SHTransform& worldTransform = SHTransform::Identity) noexcept; + SHCollider (const SHCollider& rhs) noexcept; + SHCollider (SHCollider&& rhs) noexcept; + virtual ~SHCollider () noexcept; + + /*---------------------------------------------------------------------------------*/ + /* Operator Overloads */ + /*---------------------------------------------------------------------------------*/ + + SHCollider& operator=(const SHCollider& rhs) noexcept; + SHCollider& operator=(SHCollider&& rhs) noexcept; + + /*---------------------------------------------------------------------------------*/ + /* Getter Functions */ + /*---------------------------------------------------------------------------------*/ + + [[nodiscard]] EntityID GetEntityID () const noexcept; + + [[nodiscard]] Type GetType () const noexcept; + [[nodiscard]] bool IsActive () const noexcept; + [[nodiscard]] bool GetDebugDrawState () const noexcept; + + [[nodiscard]] const SHTransform& GetTransform () const noexcept; + [[nodiscard]] const SHVec3& GetPosition () const noexcept; + [[nodiscard]] const SHQuaternion& GetOrientation () const noexcept; + [[nodiscard]] const SHVec3& GetScale () const noexcept; + + [[nodiscard]] const CollisionShapes& GetCollisionShapes () const noexcept; + [[nodiscard]] SHCollisionShape* GetCollisionShape (int index) const; + + /*---------------------------------------------------------------------------------*/ + /* Setter Functions */ + /*---------------------------------------------------------------------------------*/ + + void SetType (Type type) noexcept; + void SetIsActive (bool state) noexcept; + void SetDebugDrawState (bool state) noexcept; + + void SetRigidBody (SHRigidBody* rb) noexcept; + + void SetTransform (const SHTransform& newTransform) noexcept; + void SetPosition (const SHVec3& newPosition) noexcept; + void SetOrientation (const SHQuaternion& newOrientation) noexcept; + void SetScale (const SHVec3& newScale) noexcept; + + void SetLibrary (SHCollisionShapeLibrary* factory) noexcept; + + /*---------------------------------------------------------------------------------*/ + /* Member Functions */ + /*---------------------------------------------------------------------------------*/ + + /** + * @brief + * Computes the TRS for the collider's transform + * @return + * The computed TRS. + */ + const SHMatrix& ComputeTRS() noexcept; + + /** + * @brief + * Removes a shape from the container. Removal reduces the size of the container. + * If removing all, perform removal from back to front. + * @param index + * The index of the shape to remove. + * @throws + * Invalid argument for out-of-range indices. + */ + void RemoveCollisionShape (int index); + + /** + * @brief + * Recomputes the transforms for all shapes in this composite collider. + */ + void Update () noexcept; + + protected: + /*---------------------------------------------------------------------------------*/ + /* Data Members */ + /*---------------------------------------------------------------------------------*/ + + static constexpr uint8_t COMPOSITE_FLAG = 1U << static_cast(Type::COMPOSITE); + static constexpr uint8_t HULL_FLAG = 1U << static_cast(Type::HULL); + static constexpr uint8_t ACTIVE_FLAG = 1U << 2; + static constexpr uint8_t DRAW_FLAG = 1U << 3; + static constexpr uint8_t MOVED_FLAG = 1U << 4; + + EntityID entityID; + uint8_t flags; // 0 0 0 hasMoved debugDraw active hull composite + SHRigidBody* rigidBody; + SHCollisionShapeLibrary* shapeLibrary; + SHAABBTree* broadphase; + SHTransform transform; + CollisionShapes shapes; + + /*---------------------------------------------------------------------------------*/ + /* Member Functions */ + /*---------------------------------------------------------------------------------*/ + + void copyShapes (const SHCollider& rhsCollider); + }; + +} // namespace SHADE diff --git a/SHADE_Engine/src/Physics/Collision/SHCollisionSpace.cpp b/SHADE_Engine/src/Physics/Collision/SHCollisionSpace.cpp index e410ac36..c643e05e 100644 --- a/SHADE_Engine/src/Physics/Collision/SHCollisionSpace.cpp +++ b/SHADE_Engine/src/Physics/Collision/SHCollisionSpace.cpp @@ -40,7 +40,7 @@ namespace SHADE /* Public Member Functions Definitions */ /*-----------------------------------------------------------------------------------*/ - void SHCollisionSpace::AddCollider(SHCompositeCollider* collider) noexcept + void SHCollisionSpace::AddCollider(SHCollider* collider) noexcept { const bool INSERTED = colliders.emplace(collider->entityID, collider).second; if (!INSERTED) @@ -56,7 +56,7 @@ namespace SHADE broadphase.Insert(shape->id, shape->ComputeAABB()); } - void SHCollisionSpace::RemoveCollider(SHCompositeCollider* collider) noexcept + void SHCollisionSpace::RemoveCollider(SHCollider* collider) noexcept { colliders.erase(collider->entityID); @@ -85,14 +85,14 @@ namespace SHADE // Update any colliders that have moved for (auto& collider : colliders | std::views::values) { - const bool IS_ACTIVE = collider->active; - const bool HAS_MOVED = collider->hasMoved; + const bool IS_ACTIVE = collider->IsActive(); + const bool HAS_MOVED = collider->flags & SHCollider::MOVED_FLAG; if (!IS_ACTIVE || !HAS_MOVED) continue; // Clear hasMoved flag here - collider->hasMoved = false; + collider->flags &= ~SHCollider::MOVED_FLAG; // Update moved shapes in broadphase for (auto* shape : collider->shapes) @@ -114,7 +114,7 @@ namespace SHADE // Colliders without bodies are considered to be static bodies // This is specific to this engine because of Unity's stupid convention. const bool IS_IMPLICIT_STATIC = !collider->rigidBody; - const bool IS_ACTIVE = collider->active; + const bool IS_ACTIVE = collider->IsActive(); // Skip inactive colliders if (!IS_ACTIVE || IS_IMPLICIT_STATIC) @@ -246,7 +246,7 @@ namespace SHADE /* Private Member Functions Definitions */ /*-----------------------------------------------------------------------------------*/ - void SHCollisionSpace::broadphaseQuery(SHRigidBody::Type rigidBodyType, SHCompositeCollider* collider) noexcept + void SHCollisionSpace::broadphaseQuery(SHRigidBody::Type rigidBodyType, SHCollider* collider) noexcept { for (auto* shape : collider->shapes) { diff --git a/SHADE_Engine/src/Physics/Collision/SHCollisionSpace.h b/SHADE_Engine/src/Physics/Collision/SHCollisionSpace.h index fa1f0d16..8607cf45 100644 --- a/SHADE_Engine/src/Physics/Collision/SHCollisionSpace.h +++ b/SHADE_Engine/src/Physics/Collision/SHCollisionSpace.h @@ -18,7 +18,7 @@ // Project Headers #include "Broadphase/SHDynamicAABBTree.h" #include "Physics/Dynamics/SHContactManager.h" -#include "SHCompositeCollider.h" +#include "SHCollider.h" #include "SHPhysicsRaycastResult.h" #include "CollisionTags/SHCollisionTags.h" #include "CollisionTags/SHCollisionTags.h" @@ -118,7 +118,7 @@ namespace SHADE * @param collider * A collider to add. Duplicates will be ignored. */ - void AddCollider (SHCompositeCollider* collider) noexcept; + void AddCollider (SHCollider* collider) noexcept; /** * @brief @@ -127,7 +127,7 @@ namespace SHADE * @param collider * A collider to remove. If a reference to it doesn't exist, it will be ignored. */ - void RemoveCollider (SHCompositeCollider* collider) noexcept; + void RemoveCollider (SHCollider* collider) noexcept; /** * @brief @@ -165,7 +165,7 @@ namespace SHADE SHCollisionShape* B = nullptr; }; - using Colliders = std::unordered_map; + using Colliders = std::unordered_map; using NarrowphaseBatch = std::unordered_map; /*---------------------------------------------------------------------------------*/ @@ -185,7 +185,7 @@ namespace SHADE // Broadphase helpers - void broadphaseQuery (SHRigidBody::Type rigidBodyType, SHCompositeCollider* collider) noexcept; + void broadphaseQuery (SHRigidBody::Type rigidBodyType, SHCollider* collider) noexcept; // Narrowphase helpers diff --git a/SHADE_Engine/src/Physics/Collision/SHCompositeCollider.cpp b/SHADE_Engine/src/Physics/Collision/SHCompositeCollider.cpp index 97fef331..28b6aafe 100644 --- a/SHADE_Engine/src/Physics/Collision/SHCompositeCollider.cpp +++ b/SHADE_Engine/src/Physics/Collision/SHCompositeCollider.cpp @@ -1,7 +1,7 @@ /**************************************************************************************** - * \file SHCollider.cpp + * \file SHCompositeCollider.cpp * \author Diren D Bharwani, diren.dbharwani, 390002520 - * \brief Implementation for a Base Collider Class. + * \brief Implementation for a Composite Collider Class. * * \copyright Copyright (C) 2022 DigiPen Institute of Technology. Reproduction or * disclosure of this file or its contents without the prior written consent @@ -15,12 +15,10 @@ // Project Headers #include "Broadphase/SHDynamicAABBTree.h" -#include "Events/SHEvent.h" #include "Math/SHMathHelpers.h" #include "Physics/SHPhysicsEvents.h" #include "Physics/Dynamics/SHRigidBody.h" - namespace SHADE { /*-----------------------------------------------------------------------------------*/ @@ -28,65 +26,18 @@ namespace SHADE /*-----------------------------------------------------------------------------------*/ SHCompositeCollider::SHCompositeCollider(EntityID eid, const SHTransform& worldTransform) noexcept - : entityID { eid } - , active { true } - , debugDraw { false } - , hasMoved { true } - , rigidBody { nullptr } - , shapeLibrary { nullptr } - , broadphase { nullptr } - , transform { worldTransform } - {} + : SHCollider( eid, worldTransform ) + { + flags |= COMPOSITE_FLAG; + } SHCompositeCollider::SHCompositeCollider(const SHCompositeCollider& rhs) noexcept - : entityID { rhs.entityID } - , active { rhs.active } - , debugDraw { rhs.debugDraw } - , hasMoved { rhs.hasMoved } - , rigidBody { rhs.rigidBody } - , shapeLibrary { rhs.shapeLibrary } - , broadphase { rhs.broadphase } - , transform { rhs.transform } - { - if (!shapeLibrary) - { - SHLOGV_ERROR("Shape factory is unlinked with Collider {}. Unable to add copy shapes!", entityID) - return; - } - - copyShapes(rhs); - } + : SHCollider( rhs ) + {} SHCompositeCollider::SHCompositeCollider(SHCompositeCollider&& rhs) noexcept - : entityID { rhs.entityID } - , active { rhs.active } - , debugDraw { rhs.debugDraw } - , hasMoved { rhs.hasMoved } - , rigidBody { rhs.rigidBody } - , shapeLibrary { rhs.shapeLibrary } - , broadphase { rhs.broadphase } - , transform { rhs.transform } - { - if (!shapeLibrary) - { - SHLOGV_ERROR("Shape factory is unlinked with Collider {}. Unable to add copy shapes!", entityID) - return; - } - - copyShapes(rhs); - } - - SHCompositeCollider::~SHCompositeCollider() noexcept - { - if (!shapeLibrary) - { - SHLOGV_ERROR("Shape factory is unlinked with Composite Collider {}. Unable to add destroy collider!", entityID) - return; - } - - for (auto* shape : shapes) - shapeLibrary->DestroyShape(shape); - } + : SHCollider( rhs ) + {} /*-----------------------------------------------------------------------------------*/ /* Operator Overload Definitions */ @@ -97,186 +48,22 @@ namespace SHADE if (this == &rhs) return *this; - if (!shapeLibrary) - { - SHLOGV_ERROR("Shape factory is unlinked with Collider {}. Unable to add copy shapes!", entityID) - return *this; - } - - entityID = rhs.entityID; - active = rhs.active; - debugDraw = rhs.debugDraw; - hasMoved = rhs.hasMoved; - rigidBody = rhs.rigidBody; - shapeLibrary = rhs.shapeLibrary; - broadphase = rhs.broadphase; - transform = rhs.transform; - - copyShapes(rhs); + SHCollider::operator=(rhs); return *this; } SHCompositeCollider& SHCompositeCollider::operator=(SHCompositeCollider&& rhs) noexcept { - if (!shapeLibrary) - { - SHLOGV_ERROR("Shape factory is unlinked with Collider {}. Unable to add copy shapes!", entityID) - return *this; - } - - entityID = rhs.entityID; - active = rhs.active; - debugDraw = rhs.debugDraw; - hasMoved = rhs.hasMoved; - rigidBody = rhs.rigidBody; - shapeLibrary = rhs.shapeLibrary; - broadphase = rhs.broadphase; - transform = rhs.transform; - - copyShapes(rhs); + SHCollider::operator=(rhs); return *this; } - /*-----------------------------------------------------------------------------------*/ - /* Getter Function Definitions */ - /*-----------------------------------------------------------------------------------*/ - - EntityID SHCompositeCollider::GetEntityID() const noexcept - { - return entityID; - } - - bool SHCompositeCollider::IsActive() const noexcept - { - return active; - } - - bool SHCompositeCollider::GetDebugDrawState() const noexcept - { - return debugDraw; - } - - const SHTransform& SHCompositeCollider::GetTransform() const noexcept - { - return transform; - } - - const SHVec3& SHCompositeCollider::GetPosition() const noexcept - { - return transform.position; - } - - const SHQuaternion& SHCompositeCollider::GetOrientation() const noexcept - { - return transform.orientation; - } - - const SHVec3& SHCompositeCollider::GetScale() const noexcept - { - return transform.scale; - } - - const SHCompositeCollider::CollisionShapes& SHCompositeCollider::GetCollisionShapes() const noexcept - { - return shapes; - } - - SHCollisionShape* SHCompositeCollider::GetCollisionShape(int index) const - { - const int NUM_SHAPES = static_cast(shapes.size()); - - if (index < 0 || index >= NUM_SHAPES) - throw std::invalid_argument("Out-of-range index!"); - - return shapes[index]; - } - - /*-----------------------------------------------------------------------------------*/ - /* Setter Function Definitions */ - /*-----------------------------------------------------------------------------------*/ - - void SHCompositeCollider::SetIsActive(bool state) noexcept - { - if (active == state) - return; - - active = state; - - if (!broadphase) - return; - - for (auto* shape : shapes) - { - if (active) // Previously inactive - broadphase->Insert(shape->id, shape->ComputeAABB()); - else // Previously active - broadphase->Remove(shape->id); - } - } - - void SHCompositeCollider::SetDebugDrawState(bool state) noexcept - { - debugDraw = state; - - #ifdef SHEDITOR - - // Broadcast event for the Debug Draw system to catch - const SHColliderOnDebugDrawEvent EVENT_DATA - { - .entityID = entityID - , .debugDrawState = debugDraw - }; - - SHEventManager::BroadcastEvent(EVENT_DATA, SH_PHYSICS_COLLIDER_DRAW_EVENT); - - #endif - } - - void SHCompositeCollider::SetRigidBody(SHRigidBody* rb) noexcept - { - rigidBody = rb; - } - - void SHCompositeCollider::SetTransform(const SHTransform& newTransform) noexcept - { - hasMoved = true; - transform = newTransform; - } - - void SHCompositeCollider::SetPosition(const SHVec3& newPosition) noexcept - { - hasMoved = true; - transform.position = newPosition; - } - - void SHCompositeCollider::SetOrientation(const SHQuaternion& newOrientation) noexcept - { - hasMoved = true; - transform.orientation = newOrientation; - } - - void SHCompositeCollider::SetScale(const SHVec3& newScale) noexcept - { - hasMoved = true; - transform.scale = newScale; - } - - void SHCompositeCollider::SetFactory(SHCollisionShapeLibrary* factory) noexcept - { - shapeLibrary = factory; - } - /*-----------------------------------------------------------------------------------*/ /* Public Member Function Definitions */ /*-----------------------------------------------------------------------------------*/ - const SHMatrix& SHCompositeCollider::ComputeTransformTRS() noexcept - { - return transform.ComputeTRS(); - } - int SHCompositeCollider::AddSphereCollisionShape(float relativeRadius, const SHVec3& posOffset, const SHVec3& rotOffset) { if (!shapeLibrary) @@ -386,106 +173,4 @@ namespace SHADE } - void SHCompositeCollider::RemoveCollisionShape(int index) - { - if (!shapeLibrary) - { - SHLOGV_ERROR("Shape factory is unlinked with Collider {}. Unable to add remove shape!", entityID) - return; - } - - const int NUM_SHAPES = static_cast(shapes.size()); - - if (index < 0 || index >= NUM_SHAPES) - throw std::invalid_argument("Out-of-range index!"); - - auto shape = shapes.begin(); - for (int i = 0; i < NUM_SHAPES; ++i, ++shape) - { - if (i == index) - break; - } - - const SHPhysicsColliderRemovedEvent EVENT_DATA - { - .entityID = entityID - , .colliderType = (*shape)->GetType() - , .colliderIndex = index - }; - - // Remove from broadphase - if (broadphase) - broadphase->Remove((*shape)->id); - - shapeLibrary->DestroyShape(*shape); - *shape = nullptr; - - // Remove the shape from the container to prevent accessing a nullptr - shape = shapes.erase(shape); - - - - // Broadcast Event for removing a shape - SHEventManager::BroadcastEvent(EVENT_DATA, SH_PHYSICS_COLLIDER_REMOVED_EVENT); - - if (rigidBody) - rigidBody->ComputeMassData(); - - SHLOG_INFO_D("Removing Collision Shape {} from Entity {}", index, entityID) - } - - void SHCompositeCollider::RecomputeShapes() noexcept - { - for (auto* shape : shapes) - shape->Update(); - } - - /*-----------------------------------------------------------------------------------*/ - /* Private Member Function Definitions */ - /*-----------------------------------------------------------------------------------*/ - - void SHCompositeCollider::copyShapes(const SHCompositeCollider& rhsCollider) - { - for (const auto* shape : rhsCollider.shapes) - copyShape(shape); - } - - void SHCompositeCollider::copyShape(const SHCollisionShape* rhsShape) - { - switch (rhsShape->GetType()) - { - case SHCollisionShape::Type::BOX: - { - break; - } - case SHCollisionShape::Type::SPHERE: - { - const SHSphere* RHS_SPHERE = dynamic_cast(rhsShape); - - const SHSphereCreateInfo SPHERE_CREATE_INFO - { - .Center = RHS_SPHERE->Center - , .Radius = RHS_SPHERE->Radius - , .RelativeRadius = RHS_SPHERE->relativeRadius - , .Scale = RHS_SPHERE->scale - }; - - const uint32_t NEW_INDEX = static_cast(shapes.size()); - const SHCollisionShapeID NEW_SHAPE_ID{ entityID, NEW_INDEX }; - - SHSphere* sphere = shapeLibrary->CreateSphere(NEW_SHAPE_ID, SPHERE_CREATE_INFO); - *sphere = *RHS_SPHERE; - - shapes.emplace_back(sphere); - - break; - } - case SHCollisionShape::Type::CAPSULE: - { - break; - } - default: break; - } - } - } // namespace SHADE \ No newline at end of file diff --git a/SHADE_Engine/src/Physics/Collision/SHCompositeCollider.h b/SHADE_Engine/src/Physics/Collision/SHCompositeCollider.h index e5ce8609..8ab71186 100644 --- a/SHADE_Engine/src/Physics/Collision/SHCompositeCollider.h +++ b/SHADE_Engine/src/Physics/Collision/SHCompositeCollider.h @@ -1,7 +1,7 @@ /**************************************************************************************** - * \file SHCollider.h + * \file SHCompositeCollider.h * \author Diren D Bharwani, diren.dbharwani, 390002520 - * \brief Interface for a Base Collider Class. + * \brief Interface for a Composite Collider Class. * * \copyright Copyright (C) 2022 DigiPen Institute of Technology. Reproduction or * disclosure of this file or its contents without the prior written consent @@ -11,63 +11,26 @@ #pragma once // Project Headers -#include "ECS_Base/Entity/SHEntity.h" -#include "Math/Transform/SHTransform.h" -#include "Physics/Collision/CollisionShapes/SHCollisionShapeLibrary.h" +#include "SHCollider.h" namespace SHADE { - /*-----------------------------------------------------------------------------------*/ - /* Forward Declarations */ - /*-----------------------------------------------------------------------------------*/ - - class SHRigidBody; - class SHAABBTree; - - /*-----------------------------------------------------------------------------------*/ - /* Type Definitions */ - /*-----------------------------------------------------------------------------------*/ - /** * @brief - * Base class for a collider. - * There are only two collider types supported by SHADE Engine: Composite & Hull + * Encapsulates the behaviour of a collider with composited shapes.
+ * Contains no data members but methods to add multiple shapes. */ - class SH_API SHCompositeCollider + class SH_API SHCompositeCollider : public SHCollider { - private: - /*---------------------------------------------------------------------------------*/ - /* Friends */ - /*---------------------------------------------------------------------------------*/ - - friend class SHCollisionSpace; - friend struct SHManifold; - public: - /*---------------------------------------------------------------------------------*/ - /* Type Definitions */ - /*---------------------------------------------------------------------------------*/ - - using CollisionShapes = std::vector; - /*---------------------------------------------------------------------------------*/ /* Constructors & Destructor */ /*---------------------------------------------------------------------------------*/ - /** - * @brief - * Constructor for a collider. - * @param eid - * The entity this collider belongs to. - * @param worldTransform - * The world transform for the collider. Defaults to the identity transform. - * This is particularly important for composite colliders for offsets & relative sizes. - * @return - */ - SHCompositeCollider (EntityID eid, const SHTransform& worldTransform = SHTransform::Identity) noexcept; - SHCompositeCollider (const SHCompositeCollider& rhs) noexcept; - SHCompositeCollider (SHCompositeCollider&& rhs) noexcept; - ~SHCompositeCollider () noexcept; + SHCompositeCollider(EntityID eid, const SHTransform& worldTransform = SHTransform::Identity) noexcept; + SHCompositeCollider(const SHCompositeCollider& rhs) noexcept; + SHCompositeCollider(SHCompositeCollider&& rhs) noexcept; + ~SHCompositeCollider () noexcept override = default; /*---------------------------------------------------------------------------------*/ /* Operator Overloads */ @@ -76,50 +39,10 @@ namespace SHADE SHCompositeCollider& operator=(const SHCompositeCollider& rhs) noexcept; SHCompositeCollider& operator=(SHCompositeCollider&& rhs) noexcept; - /*---------------------------------------------------------------------------------*/ - /* Getter Functions */ - /*---------------------------------------------------------------------------------*/ - - [[nodiscard]] EntityID GetEntityID () const noexcept; - [[nodiscard]] bool IsActive () const noexcept; - [[nodiscard]] bool GetDebugDrawState () const noexcept; - - [[nodiscard]] const SHTransform& GetTransform () const noexcept; - [[nodiscard]] const SHVec3& GetPosition () const noexcept; - [[nodiscard]] const SHQuaternion& GetOrientation () const noexcept; - [[nodiscard]] const SHVec3& GetScale () const noexcept; - - [[nodiscard]] const CollisionShapes& GetCollisionShapes () const noexcept; - [[nodiscard]] SHCollisionShape* GetCollisionShape (int index) const; - - /*---------------------------------------------------------------------------------*/ - /* Setter Functions */ - /*---------------------------------------------------------------------------------*/ - - void SetIsActive (bool state) noexcept; - void SetDebugDrawState (bool state) noexcept; - - void SetRigidBody (SHRigidBody* rb) noexcept; - - void SetTransform (const SHTransform& newTransform) noexcept; - void SetPosition (const SHVec3& newPosition) noexcept; - void SetOrientation (const SHQuaternion& newOrientation) noexcept; - void SetScale (const SHVec3& newScale) noexcept; - - void SetFactory (SHCollisionShapeLibrary* factory) noexcept; - /*---------------------------------------------------------------------------------*/ /* Member Functions */ /*---------------------------------------------------------------------------------*/ - /** - * @brief - * Computes the TRS for the collider's transform - * @return - * The computed TRS. - */ - const SHMatrix& ComputeTransformTRS() noexcept; - /** * @brief * Adds a sphere collision shape. @@ -151,49 +74,7 @@ namespace SHADE int AddBoxCollisionShape (const SHVec3& relativeExtents, const SHVec3& posOffset = SHVec3::Zero, const SHVec3& rotOffset = SHVec3::Zero); // TODO: Add Capsule - - /** - * @brief - * Removes a shape from the container. Removal reduces the size of the container. - * If removing all, perform removal from back to front. - * @param index - * The index of the shape to remove. - * @throws - * Invalid argument for out-of-range indices. - */ - void RemoveCollisionShape (int index); - - /** - * @brief - * Recomputes the transforms for all shapes in this composite collider. - */ - void RecomputeShapes () noexcept; - - protected: - /*---------------------------------------------------------------------------------*/ - /* Data Members */ - /*---------------------------------------------------------------------------------*/ - - EntityID entityID; - - bool active; - bool debugDraw; - bool hasMoved; - - SHRigidBody* rigidBody; - SHCollisionShapeLibrary* shapeLibrary; - SHAABBTree* broadphase; - - SHTransform transform; - - CollisionShapes shapes; - - /*---------------------------------------------------------------------------------*/ - /* Member Functions */ - /*---------------------------------------------------------------------------------*/ - - void copyShapes (const SHCompositeCollider& rhsCollider); - void copyShape (const SHCollisionShape* rhsShape); }; + } // namespace SHADE diff --git a/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHBox.cpp b/SHADE_Engine/src/Physics/Collision/Shapes/SHBox.cpp similarity index 99% rename from SHADE_Engine/src/Physics/Collision/CollisionShapes/SHBox.cpp rename to SHADE_Engine/src/Physics/Collision/Shapes/SHBox.cpp index b46c92da..efe40f7d 100644 --- a/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHBox.cpp +++ b/SHADE_Engine/src/Physics/Collision/Shapes/SHBox.cpp @@ -16,7 +16,7 @@ // Project Headers #include "Math/SHMathHelpers.h" #include "Math/SHMatrix.h" -#include "Physics/Collision/SHCompositeCollider.h" +#include "Physics/Collision/SHCollider.h" namespace SHADE { diff --git a/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHBox.h b/SHADE_Engine/src/Physics/Collision/Shapes/SHBox.h similarity index 99% rename from SHADE_Engine/src/Physics/Collision/CollisionShapes/SHBox.h rename to SHADE_Engine/src/Physics/Collision/Shapes/SHBox.h index bf250726..044af40f 100644 --- a/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHBox.h +++ b/SHADE_Engine/src/Physics/Collision/Shapes/SHBox.h @@ -47,6 +47,7 @@ namespace SHADE /* Friends */ /*---------------------------------------------------------------------------------*/ + friend class SHCollider; friend class SHCompositeCollider; friend class SHCollision; friend class SHCollisionShapeLibrary; diff --git a/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHCollisionShape.cpp b/SHADE_Engine/src/Physics/Collision/Shapes/SHCollisionShape.cpp similarity index 99% rename from SHADE_Engine/src/Physics/Collision/CollisionShapes/SHCollisionShape.cpp rename to SHADE_Engine/src/Physics/Collision/Shapes/SHCollisionShape.cpp index f089c02c..dfbed047 100644 --- a/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHCollisionShape.cpp +++ b/SHADE_Engine/src/Physics/Collision/Shapes/SHCollisionShape.cpp @@ -14,7 +14,7 @@ #include "SHCollisionShape.h" // Project Headers -#include "Physics/Collision/SHCompositeCollider.h" +#include "Physics/Collision/SHCollider.h" #include "Physics/Collision/CollisionTags/SHCollisionTagMatrix.h" #include "Reflection/SHReflectionMetadata.h" #include "Tools/Utilities/SHUtilities.h" diff --git a/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHCollisionShape.h b/SHADE_Engine/src/Physics/Collision/Shapes/SHCollisionShape.h similarity index 98% rename from SHADE_Engine/src/Physics/Collision/CollisionShapes/SHCollisionShape.h rename to SHADE_Engine/src/Physics/Collision/Shapes/SHCollisionShape.h index b4ce9529..3e57b74a 100644 --- a/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHCollisionShape.h +++ b/SHADE_Engine/src/Physics/Collision/Shapes/SHCollisionShape.h @@ -41,6 +41,7 @@ namespace SHADE /* Friends */ /*---------------------------------------------------------------------------------*/ + friend class SHCollider; friend class SHCompositeCollider; friend class SHColliderComponent; friend class SHCollisionShapeLibrary; @@ -191,7 +192,7 @@ namespace SHADE SHCollisionShapeID id; - SHCompositeCollider* collider; // The collider it belongs to. + SHCollider* collider; // The collider it belongs to. SHCollisionTag* collisionTag; SHPhysicsMaterial material; // TODO: Change to pointer once instancing is supported diff --git a/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHCollisionShapeID.h b/SHADE_Engine/src/Physics/Collision/Shapes/SHCollisionShapeID.h similarity index 100% rename from SHADE_Engine/src/Physics/Collision/CollisionShapes/SHCollisionShapeID.h rename to SHADE_Engine/src/Physics/Collision/Shapes/SHCollisionShapeID.h diff --git a/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHCollisionShapeID.hpp b/SHADE_Engine/src/Physics/Collision/Shapes/SHCollisionShapeID.hpp similarity index 100% rename from SHADE_Engine/src/Physics/Collision/CollisionShapes/SHCollisionShapeID.hpp rename to SHADE_Engine/src/Physics/Collision/Shapes/SHCollisionShapeID.hpp diff --git a/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHCollisionShapeLibrary.cpp b/SHADE_Engine/src/Physics/Collision/Shapes/SHCollisionShapeLibrary.cpp similarity index 100% rename from SHADE_Engine/src/Physics/Collision/CollisionShapes/SHCollisionShapeLibrary.cpp rename to SHADE_Engine/src/Physics/Collision/Shapes/SHCollisionShapeLibrary.cpp diff --git a/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHCollisionShapeLibrary.h b/SHADE_Engine/src/Physics/Collision/Shapes/SHCollisionShapeLibrary.h similarity index 100% rename from SHADE_Engine/src/Physics/Collision/CollisionShapes/SHCollisionShapeLibrary.h rename to SHADE_Engine/src/Physics/Collision/Shapes/SHCollisionShapeLibrary.h diff --git a/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHConvexPolyhedron.cpp b/SHADE_Engine/src/Physics/Collision/Shapes/SHConvexPolyhedron.cpp similarity index 66% rename from SHADE_Engine/src/Physics/Collision/CollisionShapes/SHConvexPolyhedron.cpp rename to SHADE_Engine/src/Physics/Collision/Shapes/SHConvexPolyhedron.cpp index a2aef745..8cccd837 100644 --- a/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHConvexPolyhedron.cpp +++ b/SHADE_Engine/src/Physics/Collision/Shapes/SHConvexPolyhedron.cpp @@ -25,30 +25,14 @@ namespace SHADE {} SHConvexPolyhedron::SHConvexPolyhedron(const SHConvexPolyhedron& rhs) noexcept - : SHCollisionShape (rhs.id, rhs.GetType()) - , halfEdgeStructure { nullptr } - { - material = rhs.material; - collider = rhs.collider; - transform = rhs.transform; - rotationOffset = rhs.rotationOffset; - flags = rhs.flags; - // Since all collision tags are taken from the matrix, we do not need to do a deep copy here. - collisionTag = rhs.collisionTag; - } + : SHCollisionShape ( rhs ) + , halfEdgeStructure { rhs.halfEdgeStructure } + {} SHConvexPolyhedron::SHConvexPolyhedron(SHConvexPolyhedron&& rhs) noexcept - : SHCollisionShape (rhs.id, rhs.GetType()) - , halfEdgeStructure { nullptr } - { - material = rhs.material; - collider = rhs.collider; - transform = rhs.transform; - rotationOffset = rhs.rotationOffset; - flags = rhs.flags; - // Since all collision tags are taken from the matrix, we do not need to do a deep copy here. - collisionTag = rhs.collisionTag; - } + : SHCollisionShape ( rhs ) + , halfEdgeStructure { rhs.halfEdgeStructure } + {} /*-----------------------------------------------------------------------------------*/ /* Operator Overload Definitions */ @@ -59,13 +43,7 @@ namespace SHADE if (this == &rhs) return *this; - material = rhs.material; - collider = rhs.collider; - transform = rhs.transform; - rotationOffset = rhs.rotationOffset; - flags = rhs.flags; - // Since all collision tags are taken from the matrix, we do not need to do a deep copy here. - collisionTag = rhs.collisionTag; + SHCollisionShape::operator=(rhs); // Local Properties halfEdgeStructure = rhs.halfEdgeStructure; @@ -75,13 +53,7 @@ namespace SHADE SHConvexPolyhedron& SHConvexPolyhedron::operator=(SHConvexPolyhedron&& rhs) noexcept { - material = rhs.material; - collider = rhs.collider; - transform = rhs.transform; - rotationOffset = rhs.rotationOffset; - flags = rhs.flags; - // Since all collision tags are taken from the matrix, we do not need to do a deep copy here. - collisionTag = rhs.collisionTag; + SHCollisionShape::operator=(rhs); // Local Properties halfEdgeStructure = rhs.halfEdgeStructure; diff --git a/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHConvexPolyhedron.h b/SHADE_Engine/src/Physics/Collision/Shapes/SHConvexPolyhedron.h similarity index 99% rename from SHADE_Engine/src/Physics/Collision/CollisionShapes/SHConvexPolyhedron.h rename to SHADE_Engine/src/Physics/Collision/Shapes/SHConvexPolyhedron.h index cdc7f45f..dd4595d1 100644 --- a/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHConvexPolyhedron.h +++ b/SHADE_Engine/src/Physics/Collision/Shapes/SHConvexPolyhedron.h @@ -31,7 +31,7 @@ namespace SHADE /* Friends */ /*---------------------------------------------------------------------------------*/ - friend class SHCompositeCollider; + friend class SHCollider; friend class SHCollision; friend class SHCollisionShapeLibrary; diff --git a/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHHalfEdgeStructure.cpp b/SHADE_Engine/src/Physics/Collision/Shapes/SHHalfEdgeStructure.cpp similarity index 100% rename from SHADE_Engine/src/Physics/Collision/CollisionShapes/SHHalfEdgeStructure.cpp rename to SHADE_Engine/src/Physics/Collision/Shapes/SHHalfEdgeStructure.cpp diff --git a/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHHalfEdgeStructure.h b/SHADE_Engine/src/Physics/Collision/Shapes/SHHalfEdgeStructure.h similarity index 100% rename from SHADE_Engine/src/Physics/Collision/CollisionShapes/SHHalfEdgeStructure.h rename to SHADE_Engine/src/Physics/Collision/Shapes/SHHalfEdgeStructure.h diff --git a/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHSphere.cpp b/SHADE_Engine/src/Physics/Collision/Shapes/SHSphere.cpp similarity index 98% rename from SHADE_Engine/src/Physics/Collision/CollisionShapes/SHSphere.cpp rename to SHADE_Engine/src/Physics/Collision/Shapes/SHSphere.cpp index 04f8718e..5708bf91 100644 --- a/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHSphere.cpp +++ b/SHADE_Engine/src/Physics/Collision/Shapes/SHSphere.cpp @@ -16,7 +16,7 @@ // Project Headers #include "Math/SHMathHelpers.h" #include "Math/SHMatrix.h" -#include "Physics/Collision/SHCompositeCollider.h" +#include "Physics/Collision/SHCollider.h" namespace SHADE { diff --git a/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHSphere.h b/SHADE_Engine/src/Physics/Collision/Shapes/SHSphere.h similarity index 99% rename from SHADE_Engine/src/Physics/Collision/CollisionShapes/SHSphere.h rename to SHADE_Engine/src/Physics/Collision/Shapes/SHSphere.h index c4e97fe0..b874d2fe 100644 --- a/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHSphere.h +++ b/SHADE_Engine/src/Physics/Collision/Shapes/SHSphere.h @@ -46,6 +46,7 @@ namespace SHADE /* Friends */ /*---------------------------------------------------------------------------------*/ + friend class SHCollider; friend class SHCompositeCollider; friend class SHCollision; friend class SHCollisionShapeLibrary; diff --git a/SHADE_Engine/src/Physics/Dynamics/SHPhysicsWorld.cpp b/SHADE_Engine/src/Physics/Dynamics/SHPhysicsWorld.cpp index d5c9b029..3595ec99 100644 --- a/SHADE_Engine/src/Physics/Dynamics/SHPhysicsWorld.cpp +++ b/SHADE_Engine/src/Physics/Dynamics/SHPhysicsWorld.cpp @@ -178,7 +178,7 @@ namespace SHADE rigidBody.collider->SetPosition(rigidBody.motionState.position); rigidBody.collider->SetOrientation(rigidBody.motionState.orientation); - rigidBody.collider->RecomputeShapes(); + rigidBody.collider->Update(); } } diff --git a/SHADE_Engine/src/Physics/Dynamics/SHRigidBody.cpp b/SHADE_Engine/src/Physics/Dynamics/SHRigidBody.cpp index 9688caa2..d76b79b8 100644 --- a/SHADE_Engine/src/Physics/Dynamics/SHRigidBody.cpp +++ b/SHADE_Engine/src/Physics/Dynamics/SHRigidBody.cpp @@ -17,7 +17,7 @@ #include #include -#include "Physics/Collision/SHCompositeCollider.h" +#include "Physics/Collision/SHCollider.h" #include "Tools/Logger/SHLogger.h" namespace SHADE @@ -296,7 +296,7 @@ namespace SHADE /* Setter Functions Definitions */ /*-----------------------------------------------------------------------------------*/ - void SHRigidBody::SetCollider(SHCompositeCollider* c) noexcept + void SHRigidBody::SetCollider(SHCollider* c) noexcept { collider = c; } diff --git a/SHADE_Engine/src/Physics/Dynamics/SHRigidBody.h b/SHADE_Engine/src/Physics/Dynamics/SHRigidBody.h index 44ae3f48..3c869ad2 100644 --- a/SHADE_Engine/src/Physics/Dynamics/SHRigidBody.h +++ b/SHADE_Engine/src/Physics/Dynamics/SHRigidBody.h @@ -22,7 +22,7 @@ namespace SHADE /* Forward Declarations */ /*-------------------------------------------------------------------------------------*/ - class SHCompositeCollider; + class SHCollider; /*-------------------------------------------------------------------------------------*/ /* Type Definitions */ @@ -113,7 +113,7 @@ namespace SHADE /* Setter Functions */ /*-----------------------------------------------------------------------------------*/ - void SetCollider (SHCompositeCollider* c) noexcept; + void SetCollider (SHCollider* c) noexcept; /** * @brief @@ -229,7 +229,7 @@ namespace SHADE // The entityID here is only meant for linking with the actual component in the engine. EntityID entityID; - SHCompositeCollider* collider; + SHCollider* collider; Type bodyType; diff --git a/SHADE_Engine/src/Physics/Interface/PhysicsObject/SHPhysicsObject.cpp b/SHADE_Engine/src/Physics/Interface/PhysicsObject/SHPhysicsObject.cpp index 07e08b78..2353e3f3 100644 --- a/SHADE_Engine/src/Physics/Interface/PhysicsObject/SHPhysicsObject.cpp +++ b/SHADE_Engine/src/Physics/Interface/PhysicsObject/SHPhysicsObject.cpp @@ -13,6 +13,9 @@ // Primary Header #include "SHPhysicsObject.h" +#include "Physics/Collision/SHCollider.h" +#include "Physics/Collision/SHCompositeCollider.h" + namespace SHADE { /*-----------------------------------------------------------------------------------*/ @@ -111,7 +114,7 @@ namespace SHADE collider->SetRigidBody(nullptr); } - SHCompositeCollider* SHPhysicsObject::CreateCollider(const SHTransform& transform) + SHCollider* SHPhysicsObject::CreateCompositeCollider(const SHTransform& transform) { if (collider) { @@ -148,13 +151,13 @@ namespace SHADE /* Private Member Function Definitions */ /*-----------------------------------------------------------------------------------*/ - void SHPhysicsObject::deepCopyComponents(const SHRigidBody* rhsRigidBody, const SHCompositeCollider* rhsCollider) + void SHPhysicsObject::deepCopyComponents(const SHRigidBody* rhsRigidBody, const SHCollider* rhsCollider) { if (rhsRigidBody) rigidBody = new SHRigidBody{ *rhsRigidBody }; if (rhsCollider) - collider = new SHCompositeCollider { *rhsCollider }; + collider = new SHCollider { *rhsCollider }; } } // namespace SHADE \ No newline at end of file diff --git a/SHADE_Engine/src/Physics/Interface/PhysicsObject/SHPhysicsObject.h b/SHADE_Engine/src/Physics/Interface/PhysicsObject/SHPhysicsObject.h index f1ee042d..9736f8d0 100644 --- a/SHADE_Engine/src/Physics/Interface/PhysicsObject/SHPhysicsObject.h +++ b/SHADE_Engine/src/Physics/Interface/PhysicsObject/SHPhysicsObject.h @@ -11,7 +11,7 @@ #pragma once // Project Headers -#include "Physics/Collision/SHCompositeCollider.h" +#include "Physics/Collision/SHCollider.h" #include "Physics/Dynamics/SHRigidBody.h" namespace SHADE @@ -33,7 +33,7 @@ namespace SHADE EntityID entityID = MAX_EID; SHRigidBody* rigidBody = nullptr; - SHCompositeCollider* collider = nullptr; + SHCollider* collider = nullptr; /*-----------------------------------------------------------------------------------*/ /* Constructors & Destructor */ @@ -61,7 +61,7 @@ namespace SHADE * @return * True if the physics object has neither a rigid body nor a collider. */ - [[nodiscard]] bool IsEmpty () const noexcept; + [[nodiscard]] bool IsEmpty () const noexcept; /** * @brief @@ -72,13 +72,13 @@ namespace SHADE * Pointer to the rigid body that was created. The memory of this rigid body is managed * by the physics object itself. */ - SHRigidBody* CreateRigidBody (SHRigidBody::Type bodyType); + SHRigidBody* CreateRigidBody (SHRigidBody::Type bodyType); /** * @brief * Destroys the rigid body of this physics object and frees the memory. */ - void DestroyRigidBody () noexcept; + void DestroyRigidBody () noexcept; /** * @brief @@ -91,19 +91,19 @@ namespace SHADE * Pointer to the collider that was created. The memory of this collider is managed * by the physics object itself. */ - SHCompositeCollider* CreateCollider (const SHTransform& transform = SHTransform::Identity); + SHCollider* CreateCompositeCollider (const SHTransform& transform = SHTransform::Identity); /** * @brief * Destroys the collider of this physics object and frees the memory. */ - void DestroyCollider () noexcept; + void DestroyCollider () noexcept; private: /*-----------------------------------------------------------------------------------*/ /* Member Functions */ /*-----------------------------------------------------------------------------------*/ - void deepCopyComponents(const SHRigidBody* rhsRigidBody, const SHCompositeCollider* rhsCollider); + void deepCopyComponents(const SHRigidBody* rhsRigidBody, const SHCollider* rhsCollider); }; } // namespace SHADE \ No newline at end of file diff --git a/SHADE_Engine/src/Physics/Interface/PhysicsObject/SHPhysicsObjectManager.cpp b/SHADE_Engine/src/Physics/Interface/PhysicsObject/SHPhysicsObjectManager.cpp index 81fb25e1..956f8078 100644 --- a/SHADE_Engine/src/Physics/Interface/PhysicsObject/SHPhysicsObjectManager.cpp +++ b/SHADE_Engine/src/Physics/Interface/PhysicsObject/SHPhysicsObjectManager.cpp @@ -98,7 +98,7 @@ namespace SHADE destroyPhysicsObject(entityID); } - void SHPhysicsObjectManager::AddCollider(EntityID entityID) noexcept + void SHPhysicsObjectManager::AddCollider(EntityID entityID, SHCollider::Type type) noexcept { SHPhysicsObject* physicsObject = ensurePhysicsObject(entityID); @@ -116,11 +116,15 @@ namespace SHADE } // Create a new composite collider in the physics object - physicsObject->CreateCollider(worldTransform); - physicsObject->collider->SetFactory(&shapeLibrary); + if (type == SHCollider::Type::COMPOSITE) + physicsObject->CreateCompositeCollider(worldTransform); + + // TODO: Hull collider + + physicsObject->collider->SetLibrary(&shapeLibrary); // Link with the component - colliderComponent->SetCollider(physicsObject->collider); + colliderComponent->SetCollider(dynamic_cast(physicsObject->collider)); } void SHPhysicsObjectManager::RemoveCollider(EntityID entityID) noexcept diff --git a/SHADE_Engine/src/Physics/Interface/PhysicsObject/SHPhysicsObjectManager.h b/SHADE_Engine/src/Physics/Interface/PhysicsObject/SHPhysicsObjectManager.h index 11818316..8b4e79c1 100644 --- a/SHADE_Engine/src/Physics/Interface/PhysicsObject/SHPhysicsObjectManager.h +++ b/SHADE_Engine/src/Physics/Interface/PhysicsObject/SHPhysicsObjectManager.h @@ -14,7 +14,7 @@ // Project Headers #include "SHPhysicsObject.h" -#include "Physics/Collision/CollisionShapes/SHCollisionShapeLibrary.h" +#include "Physics/Collision/Shapes/SHCollisionShapeLibrary.h" namespace SHADE { @@ -77,7 +77,7 @@ namespace SHADE * @param entityID * The entity to link the new collider to. */ - void AddCollider (EntityID entityID) noexcept; + void AddCollider (EntityID entityID, SHCollider::Type type) noexcept; /** * @brief diff --git a/SHADE_Engine/src/Physics/Interface/SHColliderComponent.cpp b/SHADE_Engine/src/Physics/Interface/SHColliderComponent.cpp index 5569c713..a36fb730 100644 --- a/SHADE_Engine/src/Physics/Interface/SHColliderComponent.cpp +++ b/SHADE_Engine/src/Physics/Interface/SHColliderComponent.cpp @@ -13,11 +13,6 @@ // Primary Header #include "SHColliderComponent.h" -// Project Headers -#include "ECS_Base/Managers/SHSystemManager.h" -#include "Math/SHMathHelpers.h" -#include "Physics/System/SHPhysicsSystem.h" - namespace SHADE { /*-----------------------------------------------------------------------------------*/ @@ -37,7 +32,7 @@ namespace SHADE return collider; } - const SHCompositeCollider::CollisionShapes* const SHColliderComponent::GetCollisionShapes() const noexcept + const SHCollider::CollisionShapes* const SHColliderComponent::GetCollisionShapes() const noexcept { if (!collider) return nullptr; diff --git a/SHADE_Engine/src/Physics/Interface/SHColliderComponent.h b/SHADE_Engine/src/Physics/Interface/SHColliderComponent.h index 3c8e6342..39552949 100644 --- a/SHADE_Engine/src/Physics/Interface/SHColliderComponent.h +++ b/SHADE_Engine/src/Physics/Interface/SHColliderComponent.h @@ -54,8 +54,8 @@ namespace SHADE /* Getter Functions */ /*---------------------------------------------------------------------------------*/ - [[nodiscard]] SHCompositeCollider* const GetCollider () const noexcept; - [[nodiscard]] const SHCompositeCollider::CollisionShapes* const GetCollisionShapes() const noexcept; + [[nodiscard]] SHCompositeCollider* const GetCollider () const noexcept; + [[nodiscard]] const SHCollider::CollisionShapes* const GetCollisionShapes() const noexcept; [[nodiscard]] SHCollisionShape* const GetCollisionShape (int index) const; // Required for serialisation diff --git a/SHADE_Engine/src/Physics/SHPhysicsEvents.h b/SHADE_Engine/src/Physics/SHPhysicsEvents.h index 2f78b6ee..a192ec3f 100644 --- a/SHADE_Engine/src/Physics/SHPhysicsEvents.h +++ b/SHADE_Engine/src/Physics/SHPhysicsEvents.h @@ -11,7 +11,7 @@ #pragma once // Project Headers -#include "Collision/CollisionShapes/SHCollisionShape.h" +#include "Collision/Shapes/SHCollisionShape.h" namespace SHADE { diff --git a/SHADE_Engine/src/Physics/System/Routines/SHPhysicsPreUpdateRoutine.cpp b/SHADE_Engine/src/Physics/System/Routines/SHPhysicsPreUpdateRoutine.cpp index 17f3f83d..3f2de93f 100644 --- a/SHADE_Engine/src/Physics/System/Routines/SHPhysicsPreUpdateRoutine.cpp +++ b/SHADE_Engine/src/Physics/System/Routines/SHPhysicsPreUpdateRoutine.cpp @@ -83,7 +83,7 @@ namespace SHADE physicsObject.collider->SetOrientation(WORLD_ROT); physicsObject.collider->SetScale(WORLD_SCL); - physicsObject.collider->RecomputeShapes(); + physicsObject.collider->Update(); } } } diff --git a/SHADE_Engine/src/Physics/System/SHPhysicsDebugDrawSystem.cpp b/SHADE_Engine/src/Physics/System/SHPhysicsDebugDrawSystem.cpp index 1b1055be..ae25216f 100644 --- a/SHADE_Engine/src/Physics/System/SHPhysicsDebugDrawSystem.cpp +++ b/SHADE_Engine/src/Physics/System/SHPhysicsDebugDrawSystem.cpp @@ -122,7 +122,7 @@ namespace SHADE return onColliderDrawEvent.get()->handle; } - void SHPhysicsDebugDrawSystem::drawCollider(SHDebugDrawSystem* debugDrawSystem, const SHCompositeCollider& collider) noexcept + void SHPhysicsDebugDrawSystem::drawCollider(SHDebugDrawSystem* debugDrawSystem, const SHCollider& collider) noexcept { for (const auto* SHAPE : collider.GetCollisionShapes()) { diff --git a/SHADE_Engine/src/Physics/System/SHPhysicsDebugDrawSystem.h b/SHADE_Engine/src/Physics/System/SHPhysicsDebugDrawSystem.h index c284792f..336dff0c 100644 --- a/SHADE_Engine/src/Physics/System/SHPhysicsDebugDrawSystem.h +++ b/SHADE_Engine/src/Physics/System/SHPhysicsDebugDrawSystem.h @@ -18,9 +18,9 @@ #include "ECS_Base/System/SHSystemRoutine.h" #include "Events/SHEvent.h" #include "Graphics/MiddleEnd/Interface/SHDebugDrawSystem.h" -#include "Physics/Collision/SHCompositeCollider.h" +#include "Physics/Collision/SHCollider.h" #include "Physics/Collision/SHPhysicsRaycastResult.h" -#include "Physics/Collision/CollisionShapes/SHSphere.h" +#include "Physics/Collision/Shapes/SHSphere.h" namespace SHADE @@ -138,7 +138,7 @@ namespace SHADE SHEventHandle onColliderDraw(SHEventPtr onColliderDrawEvent); - static void drawCollider (SHDebugDrawSystem* debugDrawSystem, const SHCompositeCollider& collider) noexcept; + static void drawCollider (SHDebugDrawSystem* debugDrawSystem, const SHCollider& collider) noexcept; static void drawRaycast (SHDebugDrawSystem* debugDrawSystem, const DebugDrawInfo::Raycast& raycastInfo) noexcept; }; diff --git a/SHADE_Engine/src/Physics/System/SHPhysicsSystem.cpp b/SHADE_Engine/src/Physics/System/SHPhysicsSystem.cpp index f9e7a3cd..97b555af 100644 --- a/SHADE_Engine/src/Physics/System/SHPhysicsSystem.cpp +++ b/SHADE_Engine/src/Physics/System/SHPhysicsSystem.cpp @@ -308,6 +308,8 @@ namespace SHADE const bool IS_RIGID_BODY = ADDED_ID == RIGID_BODY_COMPONENT_ID; const bool IS_COLLIDER = ADDED_ID == COLLIDER_COMPONENT_ID; + // TODO: Hull Collider + // Check if its a physics component const bool IS_PHYSICS_COMPONENT = IS_RIGID_BODY || IS_COLLIDER; if (!IS_PHYSICS_COMPONENT) @@ -329,7 +331,7 @@ namespace SHADE if (IS_COLLIDER) { - physicsObjectManager.AddCollider(EID); + physicsObjectManager.AddCollider(EID, SHCollider::Type::COMPOSITE); if (collisionSpace) { diff --git a/SHADE_Engine/src/Serialization/SHYAMLConverters.h b/SHADE_Engine/src/Serialization/SHYAMLConverters.h index 18d8d63f..6f3b2336 100644 --- a/SHADE_Engine/src/Serialization/SHYAMLConverters.h +++ b/SHADE_Engine/src/Serialization/SHYAMLConverters.h @@ -1,7 +1,6 @@ #pragma once #include "Graphics/MiddleEnd/Interface/SHRenderable.h" #include "Graphics/MiddleEnd/Materials/SHMaterialSpec.h" -#include "Physics/Collision/CollisionShapes/SHSphere.h" #include "Resource/SHResourceManager.h" #include "Math/Vector/SHVec2.h" #include "Math/Vector/SHVec3.h" @@ -12,6 +11,7 @@ #include "Physics/Interface/SHColliderComponent.h" #include "Graphics/MiddleEnd/TextRendering/SHTextRenderableComponent.h" #include "Graphics/MiddleEnd/TextRendering/SHFont.h" +#include "Physics/Collision/SHCompositeCollider.h" #include "Physics/Collision/CollisionTags/SHCollisionTagMatrix.h" namespace YAML @@ -261,14 +261,14 @@ namespace YAML return false; auto* collider = rhs.GetCollider(); - switch (colliderType) { - case SHCollisionShape::Type::SPHERE: collider->AddSphereCollisionShape(1.0f); break; - case SHCollisionShape::Type::BOX: collider->AddBoxCollisionShape(SHVec3::One); break; - case SHCollisionShape::Type::CAPSULE: break; - default:; + case SHCollisionShape::Type::SPHERE: collider->AddSphereCollisionShape(1.0f); break; + case SHCollisionShape::Type::BOX: collider->AddBoxCollisionShape(SHVec3::One); break; + case SHCollisionShape::Type::CAPSULE: break; + default:; } + YAML::convert::decode(colliderNode, *collider->GetCollisionShape(numColliders++)); } }