From ffa4b52ad350b01e59d1bd800034f3ac023008ea Mon Sep 17 00:00:00 2001 From: antopilo Date: Mon, 13 Mar 2023 23:32:49 -0400 Subject: [PATCH] Added transform to rigidbody --- Nuake/src/Core/Physics/DynamicWorld.cpp | 8 ++++++-- Nuake/src/Core/Physics/Rigibody.h | 3 ++- Nuake/src/Core/Physics/Rigidbody.cpp | 5 +++-- Nuake/src/Scene/Systems/PhysicsSystem.cpp | 12 ++++++------ 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/Nuake/src/Core/Physics/DynamicWorld.cpp b/Nuake/src/Core/Physics/DynamicWorld.cpp index 0f74b536..546a4819 100644 --- a/Nuake/src/Core/Physics/DynamicWorld.cpp +++ b/Nuake/src/Core/Physics/DynamicWorld.cpp @@ -312,14 +312,18 @@ namespace Nuake JPH::TriangleList triangles; triangles.reserve(indices.size()); - + Matrix4 transform = rb->_transform; + transform[3] = Vector4(0, 0, 0, 1.0f); for (int i = 0; i < indices.size() - 3; i += 3) { const Vector3& p1 = vertices[indices[i]].position; const Vector3& p2 = vertices[indices[i + 1]].position; const Vector3& p3 = vertices[indices[i + 2]].position; - triangles.push_back(JPH::Triangle(JPH::Float3(p1.x, p1.y, p1.z), JPH::Float3(p2.x, p2.y, p2.z), JPH::Float3(p3.x, p3.y, p3.z))); + const Vector4& tp1 = transform * Vector4(p1, 1.0f); + const Vector4& tp2 = transform * Vector4(p2, 1.0f); + const Vector4& tp3 = transform * Vector4(p3, 1.0f); + triangles.push_back(JPH::Triangle(JPH::Float3(tp1.x, tp1.y, tp1.z), JPH::Float3(tp2.x, tp2.y, tp2.z), JPH::Float3(tp3.x, tp3.y, tp3.z))); } JPH::MeshShapeSettings shapeSettings(std::move(triangles)); diff --git a/Nuake/src/Core/Physics/Rigibody.h b/Nuake/src/Core/Physics/Rigibody.h index 29186127..ebe76d66 100644 --- a/Nuake/src/Core/Physics/Rigibody.h +++ b/Nuake/src/Core/Physics/Rigibody.h @@ -16,10 +16,11 @@ namespace Nuake Entity _entity; public: float _mass; + Matrix4 _transform; RigidBody(); RigidBody(glm::vec3 position, Entity handle); - RigidBody(float mass, glm::vec3 position, Ref shape, Entity entity, glm::vec3 initialVel = glm::vec3(0, 0, 0)); + RigidBody(float mass, glm::vec3 position, Matrix4 _transform, Ref shape, Entity entity, glm::vec3 initialVel = glm::vec3(0, 0, 0)); void UpdateTransform(); diff --git a/Nuake/src/Core/Physics/Rigidbody.cpp b/Nuake/src/Core/Physics/Rigidbody.cpp index f0337eec..1135022c 100644 --- a/Nuake/src/Core/Physics/Rigidbody.cpp +++ b/Nuake/src/Core/Physics/Rigidbody.cpp @@ -18,11 +18,12 @@ namespace Nuake } - RigidBody::RigidBody(float mass, glm::vec3 position, Ref shape, Entity entity, glm::vec3 initialVel) : + RigidBody::RigidBody(float mass, glm::vec3 position, Matrix4 transform, Ref shape, Entity entity, glm::vec3 initialVel) : _position(position), _collisionShape(shape), _mass(mass), - _entity(entity) + _entity(entity), + _transform(transform) { } diff --git a/Nuake/src/Scene/Systems/PhysicsSystem.cpp b/Nuake/src/Scene/Systems/PhysicsSystem.cpp index 28a44edc..59ccd449 100644 --- a/Nuake/src/Scene/Systems/PhysicsSystem.cpp +++ b/Nuake/src/Scene/Systems/PhysicsSystem.cpp @@ -25,28 +25,28 @@ namespace Nuake auto view = m_Scene->m_Registry.view(); for (auto e : view) { - auto [transform, rigidbody] = view.get(e); + auto [transform, rigidBodyComponent] = view.get(e); Entity ent = Entity({ e, m_Scene }); Ref rigidBody; if (ent.HasComponent()) { - float mass = rigidbody.Mass; + float mass = rigidBodyComponent.Mass; BoxColliderComponent& boxComponent = ent.GetComponent(); Ref boxShape = CreateRef(boxComponent.Size); - rigidBody = CreateRef(mass, transform.GetGlobalPosition(), boxShape, ent); + rigidBody = CreateRef(rigidBodyComponent.Mass, transform.GetGlobalPosition(), transform.GetGlobalTransform(), boxShape, ent); PhysicsManager::Get()->RegisterBody(rigidBody); } if (ent.HasComponent()) { - float mass = rigidbody.Mass; + float mass = rigidBodyComponent.Mass; const auto& component = ent.GetComponent(); auto shape = CreateRef(component.Radius); - rigidBody = CreateRef(mass, transform.GetGlobalPosition(), shape, ent); + rigidBody = CreateRef(rigidBodyComponent.Mass, transform.GetGlobalPosition(), transform.GetGlobalTransform(), shape, ent); PhysicsManager::Get()->RegisterBody(rigidBody); } @@ -69,7 +69,7 @@ namespace Nuake } Ref mesh = submeshes[subMeshId]; auto shape = CreateRef(mesh); - rigidBody = CreateRef(1.0f, transform.GetGlobalPosition(), shape, ent); + rigidBody = CreateRef(rigidBodyComponent.Mass, transform.GetGlobalPosition(), transform.GetGlobalTransform(), shape, ent); PhysicsManager::Get()->RegisterBody(rigidBody); } }