From f6c74ad3d2ea9074d6d36dc314c4a09d45fd72c3 Mon Sep 17 00:00:00 2001 From: Diren D Bharwani Date: Thu, 24 Nov 2022 14:41:52 +0800 Subject: [PATCH 1/5] Fixed recurring bug with collision listener --- .../Physics/Collision/SHCollisionListener.cpp | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/SHADE_Engine/src/Physics/Collision/SHCollisionListener.cpp b/SHADE_Engine/src/Physics/Collision/SHCollisionListener.cpp index 11a3f754..3e485153 100644 --- a/SHADE_Engine/src/Physics/Collision/SHCollisionListener.cpp +++ b/SHADE_Engine/src/Physics/Collision/SHCollisionListener.cpp @@ -84,14 +84,27 @@ namespace SHADE { const SHCollisionInfo& C_INFO = *eventIter; - const bool CLEAR_EVENT = C_INFO.GetCollisionState() == SHCollisionInfo::State::EXIT || C_INFO.GetCollisionState() == SHCollisionInfo::State::INVALID; const bool INVALID_ENTITY = !SHEntityManager::IsValidEID(C_INFO.GetEntityA()) || !SHEntityManager::IsValidEID(C_INFO.GetEntityB()); - const bool INACTIVE_OBJECT = !SHSceneManager::CheckNodeAndComponentsActive(C_INFO.GetEntityA()) || !SHSceneManager::CheckNodeAndComponentsActive(C_INFO.GetEntityB()); - - if (CLEAR_EVENT || INVALID_ENTITY || INACTIVE_OBJECT) + if (INVALID_ENTITY) + { eventIter = container.erase(eventIter); + continue; + } else - ++eventIter; + { + const bool CLEAR_EVENT = C_INFO.GetCollisionState() == SHCollisionInfo::State::EXIT || C_INFO.GetCollisionState() == SHCollisionInfo::State::INVALID; + + const bool INACTIVE_OBJECT = !SHSceneManager::CheckNodeAndComponentsActive(C_INFO.GetEntityA()) + || !SHSceneManager::CheckNodeAndComponentsActive(C_INFO.GetEntityB()); + + if (CLEAR_EVENT || INACTIVE_OBJECT) + { + eventIter = container.erase(eventIter); + continue; + } + } + + ++eventIter; } }; -- 2.40.1 From a9bacc9e48798d7d6ec7e1ede98b32f67d67a946 Mon Sep 17 00:00:00 2001 From: Diren D Bharwani Date: Thu, 24 Nov 2022 14:42:34 +0800 Subject: [PATCH 2/5] Fixed incorrect storing of world extents --- SHADE_Engine/src/Physics/Interface/SHCollisionShape.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SHADE_Engine/src/Physics/Interface/SHCollisionShape.cpp b/SHADE_Engine/src/Physics/Interface/SHCollisionShape.cpp index f597077f..43906c22 100644 --- a/SHADE_Engine/src/Physics/Interface/SHCollisionShape.cpp +++ b/SHADE_Engine/src/Physics/Interface/SHCollisionShape.cpp @@ -206,7 +206,7 @@ namespace SHADE } // Set the half extents relative to world scale - const SHVec3 WORLD_EXTENTS = correctedHalfExtents * COLLIDER->GetScale() * 0.5f; + const SHVec3 WORLD_EXTENTS = correctedHalfExtents * COLLIDER->GetScale(); if (type != Type::BOX) { -- 2.40.1 From 438a597a25730845de5b06974b096944700e7d3f Mon Sep 17 00:00:00 2001 From: Diren D Bharwani Date: Thu, 24 Nov 2022 14:43:11 +0800 Subject: [PATCH 3/5] Fixed managed Transform returning the wrong forward --- SHADE_Managed/src/Components/Transform.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SHADE_Managed/src/Components/Transform.cxx b/SHADE_Managed/src/Components/Transform.cxx index bd564010..bc61eff3 100644 --- a/SHADE_Managed/src/Components/Transform.cxx +++ b/SHADE_Managed/src/Components/Transform.cxx @@ -107,7 +107,7 @@ namespace SHADE Vector3 Transform::Forward::get() { - const SHVec3 DIRECTION = SHVec3::Rotate(SHVec3::UnitZ, Convert::ToNative(GlobalRotation)); + const SHVec3 DIRECTION = SHVec3::Rotate(-SHVec3::UnitZ, Convert::ToNative(GlobalRotation)); return Convert::ToCLI(DIRECTION); } -- 2.40.1 From 3775df23a4ae0cbe3a43d42b4c019a3ea1852c8c Mon Sep 17 00:00:00 2001 From: Diren D Bharwani Date: Thu, 24 Nov 2022 14:43:41 +0800 Subject: [PATCH 4/5] Debug draw is disabled on publish builds. --- .../src/Application/SBApplication.cpp | 19 ++++++++++++------- .../src/Physics/System/SHPhysicsSystem.cpp | 8 ++++++++ 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/SHADE_Application/src/Application/SBApplication.cpp b/SHADE_Application/src/Application/SBApplication.cpp index 06c42d2d..5aa1eb00 100644 --- a/SHADE_Application/src/Application/SBApplication.cpp +++ b/SHADE_Application/src/Application/SBApplication.cpp @@ -74,7 +74,9 @@ namespace Sandbox SHSystemManager::CreateSystem(); SHSystemManager::CreateSystem(); SHSystemManager::CreateSystem(); +#ifndef _PUBLISH SHSystemManager::CreateSystem(); +#endif SHSystemManager::CreateSystem(); SHSystemManager::CreateSystem(); @@ -114,7 +116,9 @@ namespace Sandbox SHSystemManager::RegisterRoutine(); SHSystemManager::RegisterRoutine(); +#ifndef _PUBLISH SHSystemManager::RegisterRoutine(); +#endif SHSystemManager::RegisterRoutine(); SHSystemManager::RegisterRoutine(); @@ -189,6 +193,13 @@ namespace Sandbox SHSystemManager::RunRoutines(false, SHFrameRateController::GetRawDeltaTime()); #endif // TODO: Move into an Editor menu + static bool drawContacts = false; + if (SHInputManager::GetKeyDown(SHInputManager::SH_KEYCODE::F9)) + { + drawContacts = !drawContacts; + SHSystemManager::GetSystem()->SetDebugDrawFlag(SHPhysicsDebugDrawSystem::DebugDrawFlags::CONTACT_POINTS, drawContacts); + SHSystemManager::GetSystem()->SetDebugDrawFlag(SHPhysicsDebugDrawSystem::DebugDrawFlags::CONTACT_NORMALS, drawContacts); + } static bool drawColliders = false; if (SHInputManager::GetKeyDown(SHInputManager::SH_KEYCODE::F10)) { @@ -201,13 +212,7 @@ namespace Sandbox drawRays = !drawRays; SHSystemManager::GetSystem()->SetDebugDrawFlag(SHPhysicsDebugDrawSystem::DebugDrawFlags::RAYCASTS, drawRays); } - static bool drawContacts = false; - if (SHInputManager::GetKeyDown(SHInputManager::SH_KEYCODE::F9)) - { - drawContacts = !drawContacts; - SHSystemManager::GetSystem()->SetDebugDrawFlag(SHPhysicsDebugDrawSystem::DebugDrawFlags::CONTACT_POINTS, drawContacts); - SHSystemManager::GetSystem()->SetDebugDrawFlag(SHPhysicsDebugDrawSystem::DebugDrawFlags::CONTACT_NORMALS, drawContacts); - } + } // Finish all graphics jobs first graphicsSystem->AwaitGraphicsExecution(); diff --git a/SHADE_Engine/src/Physics/System/SHPhysicsSystem.cpp b/SHADE_Engine/src/Physics/System/SHPhysicsSystem.cpp index dd2cc091..79757867 100644 --- a/SHADE_Engine/src/Physics/System/SHPhysicsSystem.cpp +++ b/SHADE_Engine/src/Physics/System/SHPhysicsSystem.cpp @@ -173,7 +173,11 @@ namespace SHADE } worldState.CreateWorld(factory); +#ifdef _PUBLISH + worldState.world->setIsDebugRenderingEnabled(false); +#else worldState.world->setIsDebugRenderingEnabled(true); +#endif // Link Collision Listener & Raycaster collisionListener.BindToWorld(worldState.world); @@ -438,7 +442,11 @@ namespace SHADE return onPlayEvent->handle; worldState.CreateWorld(factory); +#ifdef _PUBLISH + worldState.world->setIsDebugRenderingEnabled(false); +#else worldState.world->setIsDebugRenderingEnabled(true); +#endif // Link Collision Listener & Raycaster collisionListener.BindToWorld(worldState.world); -- 2.40.1 From 6525a39df266cda47fa0a4a4c03c7c9af349b0b3 Mon Sep 17 00:00:00 2001 From: Diren D Bharwani Date: Thu, 24 Nov 2022 15:11:07 +0800 Subject: [PATCH 5/5] Added collision tags for raycasting. Does not apply to collider raycasting --- .../Physics/Collision/SHPhysicsRaycaster.cpp | 10 ++--- .../Physics/Collision/SHPhysicsRaycaster.h | 39 ++++++++++--------- .../src/Physics/System/SHPhysicsSystem.cpp | 8 ++-- .../src/Physics/System/SHPhysicsSystem.h | 8 +++- .../System/SHPhysicsSystemRoutines.cpp | 10 +++++ 5 files changed, 46 insertions(+), 29 deletions(-) diff --git a/SHADE_Engine/src/Physics/Collision/SHPhysicsRaycaster.cpp b/SHADE_Engine/src/Physics/Collision/SHPhysicsRaycaster.cpp index 11b9fcab..cab5c93b 100644 --- a/SHADE_Engine/src/Physics/Collision/SHPhysicsRaycaster.cpp +++ b/SHADE_Engine/src/Physics/Collision/SHPhysicsRaycaster.cpp @@ -63,7 +63,7 @@ namespace SHADE raycasts.clear(); } - SHPhysicsRaycastResult SHPhysicsRaycaster::Raycast(const SHRay& ray, float distance) noexcept + SHPhysicsRaycastResult SHPhysicsRaycaster::Raycast(const SHRay& ray, float distance, const SHCollisionTag& collisionTag) noexcept { // Reset temp temp = SHPhysicsRaycastResult{}; @@ -78,13 +78,13 @@ namespace SHADE // If distance in infinity, cast to the default max distance of 2 km. if (distance == std::numeric_limits::infinity()) { - world->raycast(ray, this); + world->raycast(ray, this, collisionTag); } else { const SHVec3 END_POINT = ray.position + ray.direction * distance; const rp3d::Ray RP3D_RAY{ ray.position, END_POINT }; - world->raycast(RP3D_RAY, this); + world->raycast(RP3D_RAY, this, collisionTag); } // If a hit was found, populate temp info for return. @@ -98,7 +98,7 @@ namespace SHADE return temp; } - SHPhysicsRaycastResult SHPhysicsRaycaster::Linecast(const SHVec3& start, const SHVec3& end) noexcept + SHPhysicsRaycastResult SHPhysicsRaycaster::Linecast(const SHVec3& start, const SHVec3& end, const SHCollisionTag& collisionTag) noexcept { temp = SHPhysicsRaycastResult{}; temp.distance = SHVec3::Distance(start, end); @@ -110,7 +110,7 @@ namespace SHADE } const rp3d::Ray RP3D_RAY{ start, end }; - world->raycast(RP3D_RAY, this); + world->raycast(RP3D_RAY, this, collisionTag); if (temp.hit) { diff --git a/SHADE_Engine/src/Physics/Collision/SHPhysicsRaycaster.h b/SHADE_Engine/src/Physics/Collision/SHPhysicsRaycaster.h index 81165b56..447207c7 100644 --- a/SHADE_Engine/src/Physics/Collision/SHPhysicsRaycaster.h +++ b/SHADE_Engine/src/Physics/Collision/SHPhysicsRaycaster.h @@ -19,6 +19,7 @@ #include "Physics/PhysicsObject/SHPhysicsObjectManager.h" #include "Physics/SHPhysicsWorld.h" #include "SH_API.h" +#include "SHCollisionTags.h" #include "SHPhysicsRaycastResult.h" namespace SHADE @@ -67,44 +68,46 @@ namespace SHADE SHPhysicsRaycastResult Raycast ( - const SHRay& ray - , float distance = std::numeric_limits::infinity() + const SHRay& ray + , float distance = std::numeric_limits::infinity() + , const SHCollisionTag& collisionTag = SHCollisionTag{} ) noexcept; SHPhysicsRaycastResult Linecast ( - const SHVec3& start - , const SHVec3& end + const SHVec3& start + , const SHVec3& end + , const SHCollisionTag& collisionTag = SHCollisionTag{} ) noexcept; SHPhysicsRaycastResult ColliderRaycast ( - EntityID eid - , const SHRay& ray - , float distance = std::numeric_limits::infinity() + EntityID eid + , const SHRay& ray + , float distance = std::numeric_limits::infinity() ) noexcept; SHPhysicsRaycastResult ColliderRaycast ( - EntityID eid - , int shapeIndex - , const SHRay& ray - , float distance = std::numeric_limits::infinity() + EntityID eid + , int shapeIndex + , const SHRay& ray + , float distance = std::numeric_limits::infinity() ) noexcept; SHPhysicsRaycastResult ColliderLinecast ( - EntityID eid - , const SHVec3& start - , const SHVec3& end + EntityID eid + , const SHVec3& start + , const SHVec3& end ) noexcept; SHPhysicsRaycastResult ColliderLinecast ( - EntityID eid - , int shapeIndex - , const SHVec3& start - , const SHVec3& end + EntityID eid + , int shapeIndex + , const SHVec3& start + , const SHVec3& end ) noexcept; rp3d::decimal notifyRaycastHit(const rp3d::RaycastInfo& raycastInfo) override; diff --git a/SHADE_Engine/src/Physics/System/SHPhysicsSystem.cpp b/SHADE_Engine/src/Physics/System/SHPhysicsSystem.cpp index 79757867..768c9b77 100644 --- a/SHADE_Engine/src/Physics/System/SHPhysicsSystem.cpp +++ b/SHADE_Engine/src/Physics/System/SHPhysicsSystem.cpp @@ -258,14 +258,14 @@ namespace SHADE } } - SHPhysicsRaycastResult SHPhysicsSystem::Raycast(const SHRay& ray, float distance) noexcept + SHPhysicsRaycastResult SHPhysicsSystem::Raycast(const SHRay& ray, float distance, const SHCollisionTag& collisionTag) noexcept { - return raycaster.Raycast(ray, distance); + return raycaster.Raycast(ray, distance, collisionTag); } - SHPhysicsRaycastResult SHPhysicsSystem::Linecast(const SHVec3& start, const SHVec3& end) noexcept + SHPhysicsRaycastResult SHPhysicsSystem::Linecast(const SHVec3& start, const SHVec3& end, const SHCollisionTag& collisionTag) noexcept { - return raycaster.Linecast(start, end); + return raycaster.Linecast(start, end, collisionTag); } SHPhysicsRaycastResult SHPhysicsSystem::ColliderRaycast(EntityID eid, const SHRay& ray, float distance) noexcept diff --git a/SHADE_Engine/src/Physics/System/SHPhysicsSystem.h b/SHADE_Engine/src/Physics/System/SHPhysicsSystem.h index 8d49450d..99db493e 100644 --- a/SHADE_Engine/src/Physics/System/SHPhysicsSystem.h +++ b/SHADE_Engine/src/Physics/System/SHPhysicsSystem.h @@ -85,24 +85,28 @@ namespace SHADE * @brief Casts a ray into the world. * @param ray The ray to cast. * @param distance The distance to cast the ray. Defaults to infinity. + * @param collisionTag The collision tag to use for filtering the raycast. * @return The result of the raycast. */ SHPhysicsRaycastResult Raycast ( - const SHRay& ray - , float distance = std::numeric_limits::infinity() + const SHRay& ray + , float distance = std::numeric_limits::infinity() + , const SHCollisionTag& collisionTag = SHCollisionTag{} ) noexcept; /** * @brief Casts a bounded ray into the world. * @param start The starting point of the ray. * @param end The end point of the ray. + * @param collisionTag The collision tag to use for filtering the bounded raycast. * @return The result of the raycast. */ SHPhysicsRaycastResult Linecast ( const SHVec3& start , const SHVec3& end + , const SHCollisionTag& collisionTag = SHCollisionTag{} ) noexcept; /** diff --git a/SHADE_Engine/src/Physics/System/SHPhysicsSystemRoutines.cpp b/SHADE_Engine/src/Physics/System/SHPhysicsSystemRoutines.cpp index d133f562..6168d673 100644 --- a/SHADE_Engine/src/Physics/System/SHPhysicsSystemRoutines.cpp +++ b/SHADE_Engine/src/Physics/System/SHPhysicsSystemRoutines.cpp @@ -20,6 +20,7 @@ #include "Scripting/SHScriptEngine.h" #include "Input/SHInputManager.h" +#include "Physics/Collision/SHCollisionTagMatrix.h" /*-------------------------------------------------------------------------------------*/ /* Local Functions */ @@ -403,4 +404,13 @@ void testFunction() rb->AddForce(SHVec3::UnitX * forceModifier); } } + + // Cast rays + auto* tag = SHCollisionTagMatrix::GetTag(1); + tag->SetLayerState(SHCollisionTag::Layer::_1, false); + tag->SetLayerState(SHCollisionTag::Layer::_2, true); + + SHRay ray { SHVec3{3.0f, 3.5f, 0.0f}, -SHVec3::UnitX }; + auto* physicsSystem = SHSystemManager::GetSystem(); + physicsSystem->Raycast(ray, std::numeric_limits::infinity(), *tag); } -- 2.40.1