From 899e2dee864c606d4b2856865dec86b0432665e4 Mon Sep 17 00:00:00 2001 From: Antoine Pilote Date: Wed, 9 Aug 2023 00:29:48 -0400 Subject: [PATCH] Fixed ApplyForce on rigidbody not working --- Editor/resources/Scripts/Scene.wren | 2 +- Nuake/src/Core/Physics/DynamicWorld.cpp | 6 ++--- Nuake/src/Core/Physics/DynamicWorld.h | 2 +- Nuake/src/Resource/Prefab.cpp | 3 ++- .../src/Scene/Components/RigidbodyComponent.h | 2 ++ Nuake/src/Scene/Systems/PhysicsSystem.cpp | 22 +++++++++++++++++++ Nuake/src/Scene/Systems/PhysicsSystem.h | 2 ++ Nuake/src/Scripting/Modules/SceneModule.h | 2 +- 8 files changed, 34 insertions(+), 7 deletions(-) diff --git a/Editor/resources/Scripts/Scene.wren b/Editor/resources/Scripts/Scene.wren index 88db8711..2cf02b7b 100644 --- a/Editor/resources/Scripts/Scene.wren +++ b/Editor/resources/Scripts/Scene.wren @@ -192,7 +192,7 @@ class RigidBody { } AddForce(force) { - Scene.AddForce_(_entityId, force.x, force,y, force.z) + Scene.AddForce_(_entityId, force.x, force.y, force.z) } } diff --git a/Nuake/src/Core/Physics/DynamicWorld.cpp b/Nuake/src/Core/Physics/DynamicWorld.cpp index 5f3936ae..57718b35 100644 --- a/Nuake/src/Core/Physics/DynamicWorld.cpp +++ b/Nuake/src/Core/Physics/DynamicWorld.cpp @@ -555,21 +555,21 @@ namespace Nuake } } - void DynamicWorld::AddForceToRigidBody(const Entity& entity, const Vector3& force) + void DynamicWorld::AddForceToRigidBody(Entity& entity, const Vector3& force) { auto& bodyInterface = _JoltPhysicsSystem->GetBodyInterface(); for (const auto& body : _registeredBodies) { auto bodyId = static_cast(body); auto entityId = static_cast(bodyInterface.GetUserData(bodyId)); - if (entityId == entity.GetHandle()) + if (entityId == entity.GetID()) { bodyInterface.AddForce(bodyId, JPH::Vec3(force.x, force.y, force.z)); return; } } - Logger::Log("Failed to add force to rigidbody. Body not found with id: " + std::to_string(entity.GetHandle()), "physics", WARNING); + //Logger::Log("Failed to add force to rigidbody. Body not found with id: " + std::to_string(entity.GetHandle()), "physics", WARNING); } JPH::Ref DynamicWorld::GetJoltShape(const Ref shape) diff --git a/Nuake/src/Core/Physics/DynamicWorld.h b/Nuake/src/Core/Physics/DynamicWorld.h index 2336bdf5..0c47bee7 100644 --- a/Nuake/src/Core/Physics/DynamicWorld.h +++ b/Nuake/src/Core/Physics/DynamicWorld.h @@ -63,7 +63,7 @@ namespace Nuake bool IsCharacterGrounded(const Entity& entity); // 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(const Entity& entity, const Vector3& force); + void AddForceToRigidBody(Entity& entity, const Vector3& force); std::vector Raycast(const Vector3& from, const Vector3& to); void StepSimulation(Timestep ts); diff --git a/Nuake/src/Resource/Prefab.cpp b/Nuake/src/Resource/Prefab.cpp index 4740028d..22456a1e 100644 --- a/Nuake/src/Resource/Prefab.cpp +++ b/Nuake/src/Resource/Prefab.cpp @@ -1,7 +1,8 @@ #include "Prefab.h" #include "src/Scene/Components/ParentComponent.h" -namespace Nuake { +namespace Nuake +{ Ref Prefab::CreatePrefabFromEntity(Entity entity) { Ref prefab = CreateRef(); diff --git a/Nuake/src/Scene/Components/RigidbodyComponent.h b/Nuake/src/Scene/Components/RigidbodyComponent.h index 7a7c8442..90c36ef9 100644 --- a/Nuake/src/Scene/Components/RigidbodyComponent.h +++ b/Nuake/src/Scene/Components/RigidbodyComponent.h @@ -15,6 +15,8 @@ namespace Nuake { float Mass; Ref Rigidbody; + Vector3 QueuedForce = Vector3(); + RigidBodyComponent(); Ref GetRigidBody() const; diff --git a/Nuake/src/Scene/Systems/PhysicsSystem.cpp b/Nuake/src/Scene/Systems/PhysicsSystem.cpp index 8f484bfc..40ad1d35 100644 --- a/Nuake/src/Scene/Systems/PhysicsSystem.cpp +++ b/Nuake/src/Scene/Systems/PhysicsSystem.cpp @@ -121,6 +121,7 @@ namespace Nuake return; InitializeRigidbodies(); + ApplyForces(); PhysicsManager::Get().Step(ts); } @@ -333,4 +334,25 @@ namespace Nuake // TODO: Other types of collider supported for character controller? } } + + void PhysicsSystem::ApplyForces() + { + auto view = m_Scene->m_Registry.view(); + for (auto e : view) + { + auto [transform, rigidBodyComponent] = view.get(e); + Entity ent = Entity({ e, m_Scene }); + Ref rigidBody; + + // Not initialized yet. + if (!rigidBodyComponent.GetRigidBody() || rigidBodyComponent.QueuedForce == Vector3() || rigidBodyComponent.Mass == 0.0) + { + continue; + } + + PhysicsManager::Get().GetWorld()->AddForceToRigidBody(ent, rigidBodyComponent.QueuedForce); + + rigidBodyComponent.QueuedForce = Vector3(); + } + } } diff --git a/Nuake/src/Scene/Systems/PhysicsSystem.h b/Nuake/src/Scene/Systems/PhysicsSystem.h index 7b639e65..24c6a28e 100644 --- a/Nuake/src/Scene/Systems/PhysicsSystem.h +++ b/Nuake/src/Scene/Systems/PhysicsSystem.h @@ -18,5 +18,7 @@ namespace Nuake void InitializeQuakeMap(); void InitializeRigidbodies(); void InitializeCharacterControllers(); + + void ApplyForces(); }; } diff --git a/Nuake/src/Scripting/Modules/SceneModule.h b/Nuake/src/Scripting/Modules/SceneModule.h index 4f8293b8..40b03e32 100644 --- a/Nuake/src/Scripting/Modules/SceneModule.h +++ b/Nuake/src/Scripting/Modules/SceneModule.h @@ -305,7 +305,7 @@ namespace Nuake Entity ent = Entity((entt::entity)handle, Engine::GetCurrentScene().get()); auto& rigidBodyComponent = ent.GetComponent(); - rigidBodyComponent.Rigidbody->AddForce(Vector3(x, y, z)); + rigidBodyComponent.QueuedForce += Vector3(x, y, z); } static void GetTranslation(WrenVM* vm)