From 89846a6885e9eff54fdd5e0f256a72c4ae0ac370 Mon Sep 17 00:00:00 2001 From: Antoine Pilote Date: Thu, 18 Apr 2024 20:08:04 -0400 Subject: [PATCH] Added ability for triggers to move according to parent --- Nuake/src/Physics/DynamicWorld.cpp | 43 ++++++++++++++++++--- Nuake/src/Physics/DynamicWorld.h | 2 + Nuake/src/Physics/PhysicsManager.cpp | 5 +++ Nuake/src/Physics/PhysicsManager.h | 1 + Nuake/src/Physics/Rigibody.h | 1 - Nuake/src/Physics/Rigidbody.cpp | 1 - Nuake/src/Scene/Systems/PhysicsSystem.cpp | 29 +++++++++++++- Nuake/src/Scene/Systems/ScriptingSystem.cpp | 4 +- Nuake/src/Scripting/ScriptingEngineNet.cpp | 3 -- Nuake/src/Scripting/ScriptingEngineNet.h | 2 +- 10 files changed, 75 insertions(+), 16 deletions(-) diff --git a/Nuake/src/Physics/DynamicWorld.cpp b/Nuake/src/Physics/DynamicWorld.cpp index c1308fad..08ee07e6 100644 --- a/Nuake/src/Physics/DynamicWorld.cpp +++ b/Nuake/src/Physics/DynamicWorld.cpp @@ -144,8 +144,8 @@ namespace Nuake virtual void OnContactAdded(const JPH::Body& inBody1, const JPH::Body& inBody2, const JPH::ContactManifold& inManifold, JPH::ContactSettings& ioSettings) override { - int entity1 = static_cast(inBody1.GetUserData()); - int entity2 = static_cast(inBody2.GetUserData()); + uint32_t entity1 = static_cast(inBody1.GetUserData()); + uint32_t entity2 = static_cast(inBody2.GetUserData()); JPH::Vec3 joltNormal = inManifold.mWorldSpaceNormal; Vector3 normal = Vector3(joltNormal.GetX(), joltNormal.GetY(), joltNormal.GetZ()); @@ -301,6 +301,7 @@ namespace Nuake layer = Layers::MOVING; } + const std::string name = rb->GetEntity().GetComponent().Name; if (rb->IsTrigger()) { layer = Layers::SENSORS; @@ -353,7 +354,7 @@ namespace Nuake Logger::Log("Entity with ID 0 detected. Name: " + rb->GetEntity().GetComponent().Name, "DEBUG"); } - int entityId = rb->GetEntity().GetID(); + int entityId = rb->GetEntity().GetHandle(); if (entityId == 0) { @@ -430,6 +431,31 @@ namespace Nuake return false; } + void DynamicWorld::SetBodyPosition(const Entity& entity, const Vector3& position, const Quat& rotation) + { + const auto& bodyInterface = _JoltPhysicsSystem->GetBodyInterface(); + for (const auto& body : _registeredBodies) + { + auto bodyId = static_cast(body); + auto bodyEntityId = bodyInterface.GetUserData(bodyId); + if (bodyEntityId == entity.GetHandle()) + { + JPH::Vec3 currentPosition; + JPH::Quat currentRotation; + _JoltBodyInterface->GetPositionAndRotation(bodyId, currentPosition, currentRotation); + + JPH::Vec3 newPosition = { position.x, position.y, position.z }; + JPH::Quat newRotation = { rotation.x, rotation.y, rotation.z, rotation.w }; + + if (newPosition != currentPosition || currentRotation != newRotation) + { + std::string name = entity.GetComponent().Name; + _JoltBodyInterface->SetPositionAndRotation(bodyId, newPosition, newRotation, JPH::EActivation::DontActivate); + } + } + } + } + void DynamicWorld::SetCharacterControllerPosition(const Entity & entity, const Vector3 & position) { const uint32_t entityHandle = entity.GetHandle(); @@ -486,6 +512,11 @@ namespace Nuake auto bodyId = static_cast(body); if (auto entId = static_cast(bodyInterface.GetUserData(bodyId)); entId != 0) { + if (bodyInterface.GetObjectLayer(bodyId) == Layers::SENSORS) + { + continue; + } + JPH::Vec3 position = bodyInterface.GetCenterOfMassPosition(bodyId); JPH::Vec3 velocity = bodyInterface.GetLinearVelocity(bodyId); JPH::Mat44 joltTransform = bodyInterface.GetWorldTransform(bodyId); @@ -505,7 +536,7 @@ namespace Nuake Vector4 pesp = Vector4(); glm::decompose(transform, scale, rotation, pos, skew, pesp); - Entity entity = Engine::GetCurrentScene()->GetEntityByID(entId); + Entity entity = { (entt::entity)entId, Engine::GetCurrentScene().get() }; auto& transformComponent = entity.GetComponent(); transformComponent.SetLocalPosition(pos); transformComponent.SetLocalRotation(Quat(bodyRotation.GetW(), bodyRotation.GetX(), bodyRotation.GetY(), bodyRotation.GetZ())); @@ -724,7 +755,7 @@ namespace Nuake { auto bodyId = static_cast(body); auto entityId = bodyInterface.GetUserData(bodyId); - if (entityId == entity.GetID()) + if (entityId == entity.GetHandle()) { bodyInterface.AddForce(bodyId, JPH::Vec3(force.x, force.y, force.z)); return; @@ -744,7 +775,7 @@ namespace Nuake { Box* box = (Box*)shape.get(); const Vector3& boxSize = box->GetSize(); - JPH::BoxShapeSettings shapeSettings(JPH::Vec3(boxSize.x, boxSize.y, boxSize.z)); + JPH::BoxShapeSettings shapeSettings(JPH::Vec3(boxSize.x, boxSize.y, boxSize.z), 0.01f); result = shapeSettings.Create(); } break; diff --git a/Nuake/src/Physics/DynamicWorld.h b/Nuake/src/Physics/DynamicWorld.h index 698b725b..f18925bb 100644 --- a/Nuake/src/Physics/DynamicWorld.h +++ b/Nuake/src/Physics/DynamicWorld.h @@ -75,6 +75,8 @@ namespace Nuake bool IsCharacterGrounded(const Entity& entity); void SetCharacterControllerPosition(const Entity& entity, const Vector3& position); + void SetBodyPosition(const Entity& entity, const Vector3& position, const Quat& rotation); + // This is going to be ugly. TODO: Find a better way that passing itself as a parameter void MoveAndSlideCharacterController(const Entity& entity, const Vector3& velocity); void AddForceToRigidBody(Entity& entity, const Vector3& force); diff --git a/Nuake/src/Physics/PhysicsManager.cpp b/Nuake/src/Physics/PhysicsManager.cpp index d48b0b98..708900fc 100644 --- a/Nuake/src/Physics/PhysicsManager.cpp +++ b/Nuake/src/Physics/PhysicsManager.cpp @@ -27,6 +27,11 @@ namespace Nuake m_World->AddCharacterController(cc); } + void PhysicsManager::SetBodyTransform(const Entity& entity, const Vector3& position, const Quat& rotation) + { + m_World->SetBodyPosition(entity, position, rotation); + } + void PhysicsManager::SetCharacterControllerPosition(const Entity& entity, const Vector3& position) { m_World->SetCharacterControllerPosition(entity, position); diff --git a/Nuake/src/Physics/PhysicsManager.h b/Nuake/src/Physics/PhysicsManager.h index 418f60ce..c4ad1ea5 100644 --- a/Nuake/src/Physics/PhysicsManager.h +++ b/Nuake/src/Physics/PhysicsManager.h @@ -56,6 +56,7 @@ namespace Nuake void RegisterGhostBody(Ref rb); void RegisterCharacterController(Ref c); + void SetBodyTransform(const Entity& entity, const Vector3& position, const Quat& rotation); void SetCharacterControllerPosition(const Entity& entity, const Vector3& position); }; } diff --git a/Nuake/src/Physics/Rigibody.h b/Nuake/src/Physics/Rigibody.h index a6282569..3e1be3c9 100644 --- a/Nuake/src/Physics/Rigibody.h +++ b/Nuake/src/Physics/Rigibody.h @@ -26,7 +26,6 @@ namespace Nuake bool m_LockZAxis = false; public: float _mass; - Matrix4 _transform; RigidBody(); RigidBody(Vector3 position, Entity handle); diff --git a/Nuake/src/Physics/Rigidbody.cpp b/Nuake/src/Physics/Rigidbody.cpp index 70a32e12..0ffd9d35 100644 --- a/Nuake/src/Physics/Rigidbody.cpp +++ b/Nuake/src/Physics/Rigidbody.cpp @@ -25,7 +25,6 @@ namespace Nuake _collisionShape(shape), _mass(mass), _entity(entity), - _transform(transform), _rotation(rotation) { diff --git a/Nuake/src/Scene/Systems/PhysicsSystem.cpp b/Nuake/src/Scene/Systems/PhysicsSystem.cpp index 3988b325..9a0a5b37 100644 --- a/Nuake/src/Scene/Systems/PhysicsSystem.cpp +++ b/Nuake/src/Scene/Systems/PhysicsSystem.cpp @@ -75,7 +75,32 @@ namespace Nuake return; InitializeRigidbodies(); - + + auto view = m_Scene->m_Registry.view(); + for (auto e : view) + { + auto [transform, rigidBodyComponent] = view.get(e); + Entity ent = Entity({ e, m_Scene }); + + bool isTrigger = false; + if (!rigidBodyComponent.GetRigidBody()) + { + continue; + } + + if (rigidBodyComponent.Rigidbody->IsTrigger()) + { + auto globaltransform = transform.GetGlobalTransform(); + Vector3 translation; + glm::quat rotation; + Vector3 scale; + Vector3 skew; + Vector4 perspective; + glm::decompose(globaltransform, scale, rotation, translation, skew, perspective); + + PhysicsManager::Get().SetBodyTransform(ent, globaltransform[3], glm::normalize(transform.GetGlobalRotation())); + } + } } void PhysicsSystem::Exit() @@ -155,7 +180,7 @@ namespace Nuake Logger::Log("Cannot use mesh collider without model component", "physics", WARNING); } - auto meshColliderComponent = meshColliderView.get(e); + auto& meshColliderComponent = meshColliderView.get(e); const auto& modelComponent = entity.GetComponent(); if (modelComponent.ModelResource) diff --git a/Nuake/src/Scene/Systems/ScriptingSystem.cpp b/Nuake/src/Scene/Systems/ScriptingSystem.cpp index f7586ce0..5941ac3f 100644 --- a/Nuake/src/Scene/Systems/ScriptingSystem.cpp +++ b/Nuake/src/Scene/Systems/ScriptingSystem.cpp @@ -177,8 +177,8 @@ namespace Nuake const auto& collisions = physicsManager.GetCollisions(); for (const auto& col : collisions) { - Entity entity1 = m_Scene->GetEntityByID(col.Entity1); - Entity entity2 = m_Scene->GetEntityByID(col.Entity2); + Entity entity1 = { (entt::entity)col.Entity1, m_Scene }; + Entity entity2 = { (entt::entity)col.Entity2, m_Scene }; if (entity1.IsValid() && scriptingEngineNet.HasEntityScriptInstance(entity1)) { diff --git a/Nuake/src/Scripting/ScriptingEngineNet.cpp b/Nuake/src/Scripting/ScriptingEngineNet.cpp index b3d04c42..3dadd05b 100644 --- a/Nuake/src/Scripting/ScriptingEngineNet.cpp +++ b/Nuake/src/Scripting/ScriptingEngineNet.cpp @@ -150,9 +150,6 @@ namespace Nuake for (auto& type : m_GameAssembly.GetTypes()) { - Logger::Log(std::string("Detected type: ") + std::string(type->GetFullName()), ".net"); - Logger::Log(std::string("Detected base type: ") + std::string(type->GetBaseType().GetFullName()), ".net"); - const std::string baseTypeName = std::string(type->GetBaseType().GetFullName()); if (baseTypeName == "Nuake.Net.Entity") { diff --git a/Nuake/src/Scripting/ScriptingEngineNet.h b/Nuake/src/Scripting/ScriptingEngineNet.h index 64f6c831..7201e14f 100644 --- a/Nuake/src/Scripting/ScriptingEngineNet.h +++ b/Nuake/src/Scripting/ScriptingEngineNet.h @@ -21,7 +21,7 @@ namespace Nuake { private: const std::string m_Scope = "Nuake.Net"; const std::string m_EngineAssemblyName = "NuakeNet.dll"; - const std::string m_NetDirectory = "bin/Debug/net8.0"; + const std::string m_NetDirectory = ".net"; const std::string m_ContextName = "NuakeEngineContext"; bool m_IsInitialized = false;