From 5217a8639b04ebc2f14ec5828f8c846a38421faa Mon Sep 17 00:00:00 2001 From: Antoine Pilote Date: Mon, 1 Apr 2024 14:28:59 -0400 Subject: [PATCH] Started collision callbacks for .Net --- Nuake/src/Physics/CollisionData.h | 16 +++++++++ Nuake/src/Physics/DynamicWorld.cpp | 39 +++++++++++++++------ Nuake/src/Physics/DynamicWorld.h | 15 +++----- Nuake/src/Physics/PhysicsManager.cpp | 5 +++ Nuake/src/Physics/PhysicsManager.h | 3 ++ Nuake/src/Scene/Systems/ScriptingSystem.cpp | 23 +++++++++++- Nuake/src/Scene/Systems/ScriptingSystem.h | 3 ++ 7 files changed, 82 insertions(+), 22 deletions(-) create mode 100644 Nuake/src/Physics/CollisionData.h diff --git a/Nuake/src/Physics/CollisionData.h b/Nuake/src/Physics/CollisionData.h new file mode 100644 index 00000000..d6f6d95e --- /dev/null +++ b/Nuake/src/Physics/CollisionData.h @@ -0,0 +1,16 @@ +#pragma once +#include + +namespace Nuake { + + namespace Physics { + + struct CollisionData + { + uint32_t Entity1; + uint32_t Entity2; + Vector3 Normal; + Vector3 Position; + }; + } +} diff --git a/Nuake/src/Physics/DynamicWorld.cpp b/Nuake/src/Physics/DynamicWorld.cpp index 24336592..527c9c18 100644 --- a/Nuake/src/Physics/DynamicWorld.cpp +++ b/Nuake/src/Physics/DynamicWorld.cpp @@ -144,18 +144,23 @@ namespace Nuake virtual void OnContactAdded(const JPH::Body& inBody1, const JPH::Body& inBody2, const JPH::ContactManifold& inManifold, JPH::ContactSettings& ioSettings) override { - auto entId1 = static_cast(inBody1.GetUserData()); - Entity entity1 = Engine::GetCurrentScene()->GetEntityByID(entId1); + int entity1 = static_cast(inBody1.GetUserData()); + int entity2 = static_cast(inBody2.GetUserData()); - auto entId2 = static_cast(inBody2.GetUserData()); - Entity entity2 = Engine::GetCurrentScene()->GetEntityByID(entId2); + JPH::Vec3 joltNormal = inManifold.mWorldSpaceNormal; + Vector3 normal = Vector3(joltNormal.GetX(), joltNormal.GetY(), joltNormal.GetZ()); - const std::string entity1Name = entity1.GetComponent().Name; - const std::string entity2Name = entity2.GetComponent().Name; + JPH::Vec3 joltPos = inManifold.GetWorldSpaceContactPointOn1(0); + Vector3 position = Vector3(joltPos.GetX(), joltPos.GetY(), joltPos.GetZ()); - Logger::Log("Collision detected between " + entity1Name + " and " + entity2Name); + Physics::CollisionData data + { + entity1, + entity2, + normal, + position + }; - Physics::CollisionCallbackData data; _World->RegisterCollisionCallback(std::move(data)); } @@ -399,12 +404,12 @@ namespace Nuake Logger::Log("ERROR"); } - bodySettings.mUserData = 1337; + bodySettings.mUserData = cc->Owner.GetHandle(); // Create the actual rigid body JPH::BodyID body = _JoltBodyInterface->CreateAndAddBody(bodySettings, JPH::EActivation::Activate); // Note that if we run out of bodies this can return nullptr uint32_t bodyIndex = body.GetIndexAndSequenceNumber(); - _registeredBodies.push_back(bodyIndex); + //_registeredBodies.push_back(bodyIndex); // To get the jolt character control from a scene entity. _registeredCharacters[cc->Owner.GetHandle()] = CharacterGhostPair{ character, bodyIndex }; @@ -548,6 +553,12 @@ namespace Nuake void DynamicWorld::StepSimulation(Timestep ts) { + // Clear collisions, before very step + { + std::scoped_lock lock(_CollisionCallbackMutex); + _CollisionCallbacks.clear(); + } + if (ts > 0.1f) { ts = 0.08f; @@ -677,7 +688,7 @@ namespace Nuake } } - void DynamicWorld::RegisterCollisionCallback(const CollisionCallbackData& data) + void DynamicWorld::RegisterCollisionCallback(const CollisionData& data) { // This will be called from multiple threads std::scoped_lock lock(_CollisionCallbackMutex); @@ -685,6 +696,12 @@ namespace Nuake _CollisionCallbacks.push_back(std::move(data)); } + const std::vector& DynamicWorld::GetCollisionsData() + { + std::scoped_lock lock(_CollisionCallbackMutex); + return _CollisionCallbacks; + } + void DynamicWorld::MoveAndSlideCharacterController(const Entity& entity, const Vector3& velocity) { const uint32_t entityHandle = entity.GetHandle(); diff --git a/Nuake/src/Physics/DynamicWorld.h b/Nuake/src/Physics/DynamicWorld.h index 5a7b13ae..97555abb 100644 --- a/Nuake/src/Physics/DynamicWorld.h +++ b/Nuake/src/Physics/DynamicWorld.h @@ -9,6 +9,7 @@ #include #include "CharacterController.h" +#include "CollisionData.h" #include "Jolt/Jolt.h" @@ -41,13 +42,7 @@ namespace Nuake uint32_t Ghost; }; - struct CollisionCallbackData - { - uint32_t Entity1; - uint32_t Entity2; - Vector3 Normal; - Vector3 Position; - }; + class DynamicWorld { @@ -65,7 +60,7 @@ namespace Nuake std::map _registeredCharacters; std::mutex _CollisionCallbackMutex; - std::vector _CollisionCallbacks; + std::vector _CollisionCallbacks; public: DynamicWorld(); @@ -85,8 +80,8 @@ namespace Nuake void StepSimulation(Timestep ts); void Clear(); - void RegisterCollisionCallback(const CollisionCallbackData& data); - + void RegisterCollisionCallback(const CollisionData& data); + const std::vector& GetCollisionsData(); private: JPH::Ref GetJoltShape(const Ref shape); void SyncEntitiesTranforms(); diff --git a/Nuake/src/Physics/PhysicsManager.cpp b/Nuake/src/Physics/PhysicsManager.cpp index 620c5b77..06120b7e 100644 --- a/Nuake/src/Physics/PhysicsManager.cpp +++ b/Nuake/src/Physics/PhysicsManager.cpp @@ -42,6 +42,11 @@ namespace Nuake return m_World->Raycast(from, to); } + const std::vector& PhysicsManager::GetCollisions() + { + return m_World->GetCollisionsData(); + } + void PhysicsManager::DrawDebug() { if (m_DrawDebug) diff --git a/Nuake/src/Physics/PhysicsManager.h b/Nuake/src/Physics/PhysicsManager.h index f4074f07..9c310b12 100644 --- a/Nuake/src/Physics/PhysicsManager.h +++ b/Nuake/src/Physics/PhysicsManager.h @@ -3,6 +3,7 @@ #include "../Scene/Entities/Entity.h" #include "DynamicWorld.h" #include "Rigibody.h" +#include "CollisionData.h" #include "RaycastResult.h" @@ -49,6 +50,8 @@ namespace Nuake std::vector Raycast(const Vector3& from, const Vector3& to); + const std::vector& GetCollisions(); + void RegisterBody(Ref rb); void RegisterGhostBody(Ref rb); void RegisterCharacterController(Ref c); diff --git a/Nuake/src/Scene/Systems/ScriptingSystem.cpp b/Nuake/src/Scene/Systems/ScriptingSystem.cpp index 708d8a27..1e6d5be3 100644 --- a/Nuake/src/Scene/Systems/ScriptingSystem.cpp +++ b/Nuake/src/Scene/Systems/ScriptingSystem.cpp @@ -5,7 +5,7 @@ #include "Engine.h" #include "src/Scripting/ScriptingEngineNet.h" - +#include "src/Physics/PhysicsManager.h" namespace Nuake { @@ -129,6 +129,8 @@ namespace Nuake auto scriptInstance = scriptingEngineNet.GetEntityScript(entity); scriptInstance.InvokeMethod("OnFixedUpdate", ts.GetSeconds()); } + + DispatchPhysicCallbacks(); } void ScriptingSystem::Exit() @@ -166,4 +168,23 @@ namespace Nuake ScriptingEngine::Close(); ScriptingEngineNet::Get().Uninitialize(); } + + void ScriptingSystem::DispatchPhysicCallbacks() + { + auto& scriptingEngineNet = ScriptingEngineNet::Get(); + + auto& physicsManager = PhysicsManager::Get(); + const auto& collisions = physicsManager.GetCollisions(); + for (const auto& col : collisions) + { + Entity entity1 = m_Scene->GetEntityByID(col.Entity1); + Entity entity2 = m_Scene->GetEntityByID(col.Entity2); + + if (entity1.IsValid() && scriptingEngineNet.HasEntityScriptInstance(entity1)) + { + auto scriptInstance = scriptingEngineNet.GetEntityScript(entity1); + scriptInstance.InvokeMethod("OnCollision", col.Entity1, col.Entity2); + } + } + } } diff --git a/Nuake/src/Scene/Systems/ScriptingSystem.h b/Nuake/src/Scene/Systems/ScriptingSystem.h index 6ab630c2..106e7ba8 100644 --- a/Nuake/src/Scene/Systems/ScriptingSystem.h +++ b/Nuake/src/Scene/Systems/ScriptingSystem.h @@ -13,5 +13,8 @@ namespace Nuake { void Draw() override {} void FixedUpdate(Timestep ts) override; void Exit() override; + + private: + void DispatchPhysicCallbacks(); }; }