From 8ead885d0df7d661643e186289a7bf461fad6810 Mon Sep 17 00:00:00 2001 From: Diren D Bharwani Date: Fri, 30 Dec 2022 00:44:08 +0800 Subject: [PATCH] Renamed CollisionShapeFactory to CollisionShapeLibrary --- .../CollisionShapes/SHBoxCollisionShape.h | 2 +- .../CollisionShapes/SHCollisionShape.h | 4 +- ...actory.cpp => SHCollisionShapeLibrary.cpp} | 47 ++++++++++++++++--- ...apeFactory.h => SHCollisionShapeLibrary.h} | 23 +++++---- .../CollisionShapes/SHSphereCollisionShape.h | 2 +- .../src/Physics/Collision/SHCollider.cpp | 40 ++++++++-------- .../src/Physics/Collision/SHCollider.h | 6 +-- .../PhysicsObject/SHPhysicsObjectManager.cpp | 6 ++- .../PhysicsObject/SHPhysicsObjectManager.h | 4 +- 9 files changed, 89 insertions(+), 45 deletions(-) rename SHADE_Engine/src/Physics/Collision/CollisionShapes/{SHCollisionShapeFactory.cpp => SHCollisionShapeLibrary.cpp} (71%) rename SHADE_Engine/src/Physics/Collision/CollisionShapes/{SHCollisionShapeFactory.h => SHCollisionShapeLibrary.h} (81%) diff --git a/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHBoxCollisionShape.h b/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHBoxCollisionShape.h index 35da5e6e..0cb925f2 100644 --- a/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHBoxCollisionShape.h +++ b/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHBoxCollisionShape.h @@ -49,7 +49,7 @@ namespace SHADE friend class SHCollider; friend class SHCollision; friend class SHCompositeCollider; - friend class SHCollisionShapeFactory; + friend class SHCollisionShapeLibrary; public: /*---------------------------------------------------------------------------------*/ diff --git a/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHCollisionShape.h b/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHCollisionShape.h index 61f2b43c..6a2e81e4 100644 --- a/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHCollisionShape.h +++ b/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHCollisionShape.h @@ -42,7 +42,7 @@ namespace SHADE friend class SHCollider; friend class SHColliderComponent; - friend class SHCollisionShapeFactory; + friend class SHCollisionShapeLibrary; friend class SHCollisionSpace; friend struct SHManifold; @@ -65,7 +65,7 @@ namespace SHADE /* Constructors & Destructor */ /*---------------------------------------------------------------------------------*/ - SHCollisionShape (SHCollisionShapeID id, Type colliderType = Type::BOX); + SHCollisionShape (SHCollisionShapeID id, Type colliderType = Type::SPHERE); SHCollisionShape (const SHCollisionShape& rhs) noexcept = default; SHCollisionShape (SHCollisionShape&& rhs) noexcept = default; diff --git a/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHCollisionShapeFactory.cpp b/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHCollisionShapeLibrary.cpp similarity index 71% rename from SHADE_Engine/src/Physics/Collision/CollisionShapes/SHCollisionShapeFactory.cpp rename to SHADE_Engine/src/Physics/Collision/CollisionShapes/SHCollisionShapeLibrary.cpp index 97409cf0..6d2fdc06 100644 --- a/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHCollisionShapeFactory.cpp +++ b/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHCollisionShapeLibrary.cpp @@ -1,5 +1,5 @@ /**************************************************************************************** - * \file SHCollisionShapeFactory.cpp + * \file SHCollisionShapeLibrary.cpp * \author Diren D Bharwani, diren.dbharwani, 390002520 * \brief Implementation for a Collison Shape Factory Class. * @@ -11,7 +11,7 @@ #include // Primary Header -#include "SHCollisionShapeFactory.h" +#include "SHCollisionShapeLibrary.h" namespace SHADE { @@ -19,7 +19,12 @@ namespace SHADE /* Constructors & Destructor Definitions */ /*-----------------------------------------------------------------------------------*/ - SHCollisionShapeFactory::~SHCollisionShapeFactory() noexcept + SHCollisionShapeLibrary::SHCollisionShapeLibrary() noexcept + { + createBoxPolyhedron(); + } + + SHCollisionShapeLibrary::~SHCollisionShapeLibrary() noexcept { // Free all shapes in each container for (auto* sphereCollisionShape : spheres | std::views::values) @@ -34,7 +39,7 @@ namespace SHADE /* Public Member Function Definitions */ /*-----------------------------------------------------------------------------------*/ - SHSphereCollisionShape* SHCollisionShapeFactory::CreateSphere(SHCollisionShapeID id, const SHSphereCreateInfo& createInfo) + SHSphereCollisionShape* SHCollisionShapeLibrary::CreateSphere(SHCollisionShapeID id, const SHSphereCreateInfo& createInfo) { const auto RESULT = spheres.emplace(id, new SHSphereCollisionShape{ id }); if (RESULT.second) @@ -52,7 +57,7 @@ namespace SHADE return spheres.find(id)->second; } - SHBoxCollisionShape* SHCollisionShapeFactory::CreateBox(SHCollisionShapeID id, const SHBoxCreateInfo& createInfo) + SHBoxCollisionShape* SHCollisionShapeLibrary::CreateBox(SHCollisionShapeID id, const SHBoxCreateInfo& createInfo) { const auto RESULT = boxes.emplace(id, new SHBoxCollisionShape{ id }); if (RESULT.second) @@ -72,7 +77,7 @@ namespace SHADE } - void SHCollisionShapeFactory::DestroyShape(SHCollisionShape* shape) + void SHCollisionShapeLibrary::DestroyShape(SHCollisionShape* shape) { switch (shape->GetType()) { @@ -97,4 +102,34 @@ namespace SHADE default: break; } } + + /*-----------------------------------------------------------------------------------*/ + /* Private Member Function Definitions */ + /*-----------------------------------------------------------------------------------*/ + + void SHCollisionShapeLibrary::createBoxPolyhedron() noexcept + { + /* + * Vertices (Front/Back Face): + * + * 3/7 ---------- 2/6 + * | | + * | | + * | | + * 0/4 ---------- 1/5 + * + * Faces: + * + * Front: 0 (0,1,2,3) + * Right: 1 (1,5,6,2) + * Back: 2 (5,4,7,6) + * Left: 3 (4,0,3,7) + * Top: 4 (3,2,6,7) + * Bottom: 5 (4,5,1,0) + * + */ + + // Create face data + } + } // namespace SHADE \ No newline at end of file diff --git a/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHCollisionShapeFactory.h b/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHCollisionShapeLibrary.h similarity index 81% rename from SHADE_Engine/src/Physics/Collision/CollisionShapes/SHCollisionShapeFactory.h rename to SHADE_Engine/src/Physics/Collision/CollisionShapes/SHCollisionShapeLibrary.h index c82d7e26..e5958f96 100644 --- a/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHCollisionShapeFactory.h +++ b/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHCollisionShapeLibrary.h @@ -1,7 +1,7 @@ /**************************************************************************************** - * \file SHCollisionShapeFactory.h + * \file SHCollisionShapeLibrary.h * \author Diren D Bharwani, diren.dbharwani, 390002520 - * \brief Interface for a Collison Shape Factory Class. + * \brief Interface for a Collison Shape Library. * * \copyright Copyright (C) 2022 DigiPen Institute of Technology. Reproduction or * disclosure of this file or its contents without the prior written consent @@ -24,19 +24,18 @@ namespace SHADE /** * @brief - * Encapsulates a class for Creating and Destroying Collision Shapes.
- * All memory for collision shapes are handled in this factory class.
- * TODO: Support instancing of shapes + * Encapsulates a class for Creating, Storing and Destroying Collision Shapes.
+ * All memory for collision shapes are stored in this factory class.
*/ - class SH_API SHCollisionShapeFactory final + class SH_API SHCollisionShapeLibrary final { public: /*---------------------------------------------------------------------------------*/ /* Constructors & Destructor */ /*---------------------------------------------------------------------------------*/ - SHCollisionShapeFactory () noexcept = default; - ~SHCollisionShapeFactory () noexcept; + SHCollisionShapeLibrary () noexcept; + ~SHCollisionShapeLibrary () noexcept; /*---------------------------------------------------------------------------------*/ /* Function Members */ @@ -92,10 +91,18 @@ namespace SHADE /*---------------------------------------------------------------------------------*/ /* Data Members */ /*---------------------------------------------------------------------------------*/ + + SHConvexPolyhedron boxPolyhedron; Spheres spheres; Boxes boxes; // TODO: Add capsules and hulls + + /*---------------------------------------------------------------------------------*/ + /* Function Members */ + /*---------------------------------------------------------------------------------*/ + + void createBoxPolyhedron() noexcept; }; } // namespace SHADE \ No newline at end of file diff --git a/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHSphereCollisionShape.h b/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHSphereCollisionShape.h index a1ebf6a3..75492505 100644 --- a/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHSphereCollisionShape.h +++ b/SHADE_Engine/src/Physics/Collision/CollisionShapes/SHSphereCollisionShape.h @@ -48,7 +48,7 @@ namespace SHADE friend class SHCollider; friend class SHCollision; friend class SHCompositeCollider; - friend class SHCollisionShapeFactory; + friend class SHCollisionShapeLibrary; public: /*---------------------------------------------------------------------------------*/ diff --git a/SHADE_Engine/src/Physics/Collision/SHCollider.cpp b/SHADE_Engine/src/Physics/Collision/SHCollider.cpp index 4ce819ac..021605c7 100644 --- a/SHADE_Engine/src/Physics/Collision/SHCollider.cpp +++ b/SHADE_Engine/src/Physics/Collision/SHCollider.cpp @@ -33,7 +33,7 @@ namespace SHADE , debugDraw { false } , hasMoved { true } , rigidBody { nullptr } - , shapeFactory { nullptr } + , shapeLibrary { nullptr } , broadphase { nullptr } , transform { worldTransform } {} @@ -44,11 +44,11 @@ namespace SHADE , debugDraw { rhs.debugDraw } , hasMoved { rhs.hasMoved } , rigidBody { rhs.rigidBody } - , shapeFactory { rhs.shapeFactory } + , shapeLibrary { rhs.shapeLibrary } , broadphase { rhs.broadphase } , transform { rhs.transform } { - if (!shapeFactory) + if (!shapeLibrary) { SHLOGV_ERROR("Shape factory is unlinked with Collider {}. Unable to add copy shapes!", entityID) return; @@ -63,11 +63,11 @@ namespace SHADE , debugDraw { rhs.debugDraw } , hasMoved { rhs.hasMoved } , rigidBody { rhs.rigidBody } - , shapeFactory { rhs.shapeFactory } + , shapeLibrary { rhs.shapeLibrary } , broadphase { rhs.broadphase } , transform { rhs.transform } { - if (!shapeFactory) + if (!shapeLibrary) { SHLOGV_ERROR("Shape factory is unlinked with Collider {}. Unable to add copy shapes!", entityID) return; @@ -78,14 +78,14 @@ namespace SHADE SHCollider::~SHCollider() noexcept { - if (!shapeFactory) + if (!shapeLibrary) { SHLOGV_ERROR("Shape factory is unlinked with Composite Collider {}. Unable to add destroy collider!", entityID) return; } for (auto* shape : shapes) - shapeFactory->DestroyShape(shape); + shapeLibrary->DestroyShape(shape); } /*-----------------------------------------------------------------------------------*/ @@ -97,7 +97,7 @@ namespace SHADE if (this == &rhs) return *this; - if (!shapeFactory) + if (!shapeLibrary) { SHLOGV_ERROR("Shape factory is unlinked with Collider {}. Unable to add copy shapes!", entityID) return *this; @@ -108,7 +108,7 @@ namespace SHADE debugDraw = rhs.debugDraw; hasMoved = rhs.hasMoved; rigidBody = rhs.rigidBody; - shapeFactory = rhs.shapeFactory; + shapeLibrary = rhs.shapeLibrary; broadphase = rhs.broadphase; transform = rhs.transform; @@ -119,7 +119,7 @@ namespace SHADE SHCollider& SHCollider::operator=(SHCollider&& rhs) noexcept { - if (!shapeFactory) + if (!shapeLibrary) { SHLOGV_ERROR("Shape factory is unlinked with Collider {}. Unable to add copy shapes!", entityID) return *this; @@ -130,7 +130,7 @@ namespace SHADE debugDraw = rhs.debugDraw; hasMoved = rhs.hasMoved; rigidBody = rhs.rigidBody; - shapeFactory = rhs.shapeFactory; + shapeLibrary = rhs.shapeLibrary; broadphase = rhs.broadphase; transform = rhs.transform; @@ -263,9 +263,9 @@ namespace SHADE transform.scale = newScale; } - void SHCollider::SetFactory(SHCollisionShapeFactory* factory) noexcept + void SHCollider::SetFactory(SHCollisionShapeLibrary* factory) noexcept { - shapeFactory = factory; + shapeLibrary = factory; } /*-----------------------------------------------------------------------------------*/ @@ -279,7 +279,7 @@ namespace SHADE int SHCollider::AddSphereCollisionShape(float relativeRadius, const SHVec3& posOffset, const SHVec3& rotOffset) { - if (!shapeFactory) + if (!shapeLibrary) { SHLOGV_ERROR("Shape factory is unlinked with Collider {}. Unable to add new shape!", entityID) return -1; @@ -304,7 +304,7 @@ namespace SHADE const uint32_t NEW_INDEX = static_cast(shapes.size()); const SHCollisionShapeID NEW_SHAPE_ID{ entityID, NEW_INDEX }; - SHSphereCollisionShape* sphere = shapeFactory->CreateSphere(NEW_SHAPE_ID, SPHERE_CREATE_INFO); + SHSphereCollisionShape* sphere = shapeLibrary->CreateSphere(NEW_SHAPE_ID, SPHERE_CREATE_INFO); // Set offsets sphere->collider = this; @@ -334,7 +334,7 @@ namespace SHADE int SHCollider::AddBoxCollisionShape(const SHVec3& relativeExtents, const SHVec3& posOffset, const SHVec3& rotOffset) { - if (!shapeFactory) + if (!shapeLibrary) { SHLOGV_ERROR("Shape factory is unlinked with Collider {}. Unable to add new shape!", entityID) return -1; @@ -357,7 +357,7 @@ namespace SHADE const uint32_t NEW_INDEX = static_cast(shapes.size()); const SHCollisionShapeID NEW_SHAPE_ID{ entityID, NEW_INDEX }; - SHBoxCollisionShape* box = shapeFactory->CreateBox(NEW_SHAPE_ID, BOX_CREATE_INFO); + SHBoxCollisionShape* box = shapeLibrary->CreateBox(NEW_SHAPE_ID, BOX_CREATE_INFO); // Set offsets box->collider = this; @@ -388,7 +388,7 @@ namespace SHADE void SHCollider::RemoveCollisionShape(int index) { - if (!shapeFactory) + if (!shapeLibrary) { SHLOGV_ERROR("Shape factory is unlinked with Collider {}. Unable to add remove shape!", entityID) return; @@ -417,7 +417,7 @@ namespace SHADE if (broadphase) broadphase->Remove((*shape)->id); - shapeFactory->DestroyShape(*shape); + shapeLibrary->DestroyShape(*shape); *shape = nullptr; // Remove the shape from the container to prevent accessing a nullptr @@ -473,7 +473,7 @@ namespace SHADE const uint32_t NEW_INDEX = static_cast(shapes.size()); const SHCollisionShapeID NEW_SHAPE_ID{ entityID, NEW_INDEX }; - SHSphereCollisionShape* sphere = shapeFactory->CreateSphere(NEW_SHAPE_ID, SPHERE_CREATE_INFO); + SHSphereCollisionShape* sphere = shapeLibrary->CreateSphere(NEW_SHAPE_ID, SPHERE_CREATE_INFO); *sphere = *RHS_SPHERE; shapes.emplace_back(sphere); diff --git a/SHADE_Engine/src/Physics/Collision/SHCollider.h b/SHADE_Engine/src/Physics/Collision/SHCollider.h index 3d80118e..c4a4ad17 100644 --- a/SHADE_Engine/src/Physics/Collision/SHCollider.h +++ b/SHADE_Engine/src/Physics/Collision/SHCollider.h @@ -13,7 +13,7 @@ // Project Headers #include "ECS_Base/Entity/SHEntity.h" #include "Math/Transform/SHTransform.h" -#include "Physics/Collision/CollisionShapes/SHCollisionShapeFactory.h" +#include "Physics/Collision/CollisionShapes/SHCollisionShapeLibrary.h" namespace SHADE { @@ -106,7 +106,7 @@ namespace SHADE void SetOrientation (const SHQuaternion& newOrientation) noexcept; void SetScale (const SHVec3& newScale) noexcept; - void SetFactory (SHCollisionShapeFactory* factory) noexcept; + void SetFactory (SHCollisionShapeLibrary* factory) noexcept; /*---------------------------------------------------------------------------------*/ /* Member Functions */ @@ -181,7 +181,7 @@ namespace SHADE bool hasMoved; SHRigidBody* rigidBody; - SHCollisionShapeFactory* shapeFactory; + SHCollisionShapeLibrary* shapeLibrary; SHAABBTree* broadphase; SHTransform transform; diff --git a/SHADE_Engine/src/Physics/Interface/PhysicsObject/SHPhysicsObjectManager.cpp b/SHADE_Engine/src/Physics/Interface/PhysicsObject/SHPhysicsObjectManager.cpp index 61a77f28..81fb25e1 100644 --- a/SHADE_Engine/src/Physics/Interface/PhysicsObject/SHPhysicsObjectManager.cpp +++ b/SHADE_Engine/src/Physics/Interface/PhysicsObject/SHPhysicsObjectManager.cpp @@ -67,15 +67,17 @@ namespace SHADE auto* rigidBody = physicsObject->CreateRigidBody(RIGID_BODY_TYPE); SHVec3 worldPos = SHVec3::Zero; - // TODO: Force orientation + SHQuaternion worldRot = SHQuaternion::Identity; if (const auto* TRANSFORM_COMPONENT = SHComponentManager::GetComponent_s(entityID); TRANSFORM_COMPONENT) { worldPos = TRANSFORM_COMPONENT->GetWorldPosition(); + worldRot = TRANSFORM_COMPONENT->GetWorldOrientation(); } SHMotionState& motionState = rigidBody->GetMotionState(); motionState.ForcePosition(worldPos); + motionState.ForceOrientation(worldRot); // Link with the component rigidBodyComponent->SetRigidBody(rigidBody); @@ -115,7 +117,7 @@ namespace SHADE // Create a new composite collider in the physics object physicsObject->CreateCollider(worldTransform); - physicsObject->collider->SetFactory(&shapeFactory); + physicsObject->collider->SetFactory(&shapeLibrary); // Link with the component colliderComponent->SetCollider(physicsObject->collider); diff --git a/SHADE_Engine/src/Physics/Interface/PhysicsObject/SHPhysicsObjectManager.h b/SHADE_Engine/src/Physics/Interface/PhysicsObject/SHPhysicsObjectManager.h index ca260a02..11818316 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/SHCollisionShapeFactory.h" +#include "Physics/Collision/CollisionShapes/SHCollisionShapeLibrary.h" namespace SHADE { @@ -100,7 +100,7 @@ namespace SHADE /*-----------------------------------------------------------------------------------*/ EntityObjectMap physicsObjects; - SHCollisionShapeFactory shapeFactory; + SHCollisionShapeLibrary shapeLibrary; /*-----------------------------------------------------------------------------------*/ /* Member Functions */