From 80eadc2a5ace783d2928072352e1b8e330bb2404 Mon Sep 17 00:00:00 2001 From: Antoine Pilote Date: Sun, 2 Apr 2023 19:01:40 -0400 Subject: [PATCH] Added capsule collider component --- .../ComponentsPanel/CapsuleColliderPanel.h | 37 +++++++++++ Editor/src/Misc/GizmoDrawer.cpp | 6 +- Editor/src/Windows/EditorSelectionPanel.cpp | 4 +- Editor/src/Windows/EditorSelectionPanel.h | 3 + Nuake/src/Core/Physics/DynamicWorld.cpp | 20 ++---- .../Components/CapsuleColliderComponent.cpp | 24 +++++++ .../Components/CapsuleColliderComponent.h | 20 ++++++ Nuake/src/Scene/Entities/Entity.cpp | 64 ++++++++++--------- Nuake/src/Scene/Systems/PhysicsSystem.cpp | 12 ++++ 9 files changed, 144 insertions(+), 46 deletions(-) create mode 100644 Editor/src/ComponentsPanel/CapsuleColliderPanel.h create mode 100644 Nuake/src/Scene/Components/CapsuleColliderComponent.cpp create mode 100644 Nuake/src/Scene/Components/CapsuleColliderComponent.h diff --git a/Editor/src/ComponentsPanel/CapsuleColliderPanel.h b/Editor/src/ComponentsPanel/CapsuleColliderPanel.h new file mode 100644 index 00000000..8ca9f015 --- /dev/null +++ b/Editor/src/ComponentsPanel/CapsuleColliderPanel.h @@ -0,0 +1,37 @@ +#pragma once +#include "ComponentPanel.h" +#include + +class CapsuleColliderPanel: ComponentPanel +{ +public: + CapsuleColliderPanel() = default; + + void Draw(Nuake::Entity entity) override + { + if (!entity.HasComponent()) + return; + + auto& component = entity.GetComponent(); + BeginComponentTable(CAPSULE COLLIDER, Nuake::CapsuleColliderComponent); + { + { + ImGui::Text("Radius"); + ImGui::TableNextColumn(); + ImGui::DragFloat("##Radius", &component.Radius); + ImGui::TableNextColumn(); + ComponentTableReset(component.Radius, 0.5f) + } + ImGui::TableNextColumn(); + { + ImGui::Text("Height"); + ImGui::TableNextColumn(); + + ImGui::DragFloat("##Height", &component.Height); + ImGui::TableNextColumn(); + ComponentTableReset(component.Height, 1.0f) + } + } + EndComponentTable() + } +}; \ No newline at end of file diff --git a/Editor/src/Misc/GizmoDrawer.cpp b/Editor/src/Misc/GizmoDrawer.cpp index 7bfd482d..6b201982 100644 --- a/Editor/src/Misc/GizmoDrawer.cpp +++ b/Editor/src/Misc/GizmoDrawer.cpp @@ -11,6 +11,8 @@ #include +#include "src/Scene/Components/CapsuleColliderComponent.h" + GizmoDrawer::GizmoDrawer() { mLineShader = Nuake::ShaderManager::GetShader("resources/Shaders/line.shader"); @@ -199,10 +201,10 @@ void GizmoDrawer::DrawGizmos(Ref scene) Nuake::RenderCommand::DrawLines(0, 128); } - auto capsuleColliderView = scene->m_Registry.view(); + auto capsuleColliderView = scene->m_Registry.view(); for (auto e : capsuleColliderView) { - auto [transform, capsule] = scene->m_Registry.get(e); + auto [transform, capsule] = scene->m_Registry.get(e); mLineShader->Bind(); mLineShader->SetUniformMat4f("u_View", glm::translate(scene->m_EditorCamera->GetTransform(), transform.Translation)); mLineShader->SetUniformMat4f("u_Projection", scene->m_EditorCamera->GetPerspective()); diff --git a/Editor/src/Windows/EditorSelectionPanel.cpp b/Editor/src/Windows/EditorSelectionPanel.cpp index 4c5dc429..8409401b 100644 --- a/Editor/src/Windows/EditorSelectionPanel.cpp +++ b/Editor/src/Windows/EditorSelectionPanel.cpp @@ -38,7 +38,7 @@ void EditorSelectionPanel::ResolveFile(Ref file) void EditorSelectionPanel::Draw(EditorSelection selection) { - if (ImGui::Begin("Propreties")) + if (ImGui::Begin("Properties")) { switch (selection.Type) { @@ -101,6 +101,7 @@ void EditorSelectionPanel::DrawEntity(Nuake::Entity entity) mRigidbodyPanel.Draw(entity); mBoxColliderPanel.Draw(entity); mSphereColliderPanel.Draw(entity); + mCapsuleColliderPanel.Draw(entity); mMeshColliderPanel.Draw(entity); mCharacterControllerPanel.Draw(entity); } @@ -126,6 +127,7 @@ void EditorSelectionPanel::DrawAddComponentMenu(Nuake::Entity entity) MenuItemComponent("Character Controller", Nuake::CharacterControllerComponent) MenuItemComponent("Rigid body", Nuake::RigidBodyComponent) MenuItemComponent("Box collider", Nuake::BoxColliderComponent) + MenuItemComponent("Capsule collider", Nuake::CapsuleColliderComponent) MenuItemComponent("Sphere collider", Nuake::SphereColliderComponent) MenuItemComponent("Mesh collider", Nuake::MeshColliderComponent) ImGui::Separator(); diff --git a/Editor/src/Windows/EditorSelectionPanel.h b/Editor/src/Windows/EditorSelectionPanel.h index a99a0544..ff19422a 100644 --- a/Editor/src/Windows/EditorSelectionPanel.h +++ b/Editor/src/Windows/EditorSelectionPanel.h @@ -13,6 +13,7 @@ #include "../ComponentsPanel/CameraPanel.h" #include "../ComponentsPanel/RigidbodyPanel.h" #include "../ComponentsPanel/BoxColliderPanel.h" +#include "../ComponentsPanel/CapsuleColliderPanel.h" #include "../ComponentsPanel/SphereColliderPanel.h" #include "../ComponentsPanel/MeshColliderPanel.h" #include "../ComponentsPanel/CharacterControllerPanel.h" @@ -29,6 +30,8 @@ private: BoxColliderPanel mBoxColliderPanel; SphereColliderPanel mSphereColliderPanel; MeshColliderPanel mMeshColliderPanel; + CapsuleColliderPanel mCapsuleColliderPanel; + CharacterControllerPanel mCharacterControllerPanel; Ref currentFile; diff --git a/Nuake/src/Core/Physics/DynamicWorld.cpp b/Nuake/src/Core/Physics/DynamicWorld.cpp index 3c6b91c7..daa87c8a 100644 --- a/Nuake/src/Core/Physics/DynamicWorld.cpp +++ b/Nuake/src/Core/Physics/DynamicWorld.cpp @@ -353,6 +353,7 @@ namespace Nuake void DynamicWorld::AddGhostbody(Ref gb) { + } void DynamicWorld::AddCharacterController(Ref cc) @@ -409,27 +410,20 @@ namespace Nuake Vector4 pesp = Vector4(); glm::decompose(transform, scale, rotation, pos, skew, pesp); - uint32_t entId = bodyInterface.GetUserData(bodyId); + auto entId = static_cast(bodyInterface.GetUserData(bodyId)); Entity entity = Engine::GetCurrentScene()->GetEntityByID(entId); - - const std::string& name = entity.GetComponent().Name; - TransformComponent& transformComponent = entity.GetComponent(); - //transformComponent.GlobalTransform = transform; + auto& transformComponent = entity.GetComponent(); transformComponent.SetLocalPosition(pos); - transformComponent.Dirty = false; transformComponent.SetLocalRotation(Quat(bodyRotation.GetW(), bodyRotation.GetX(), bodyRotation.GetY(), bodyRotation.GetZ())); - //transformComponent.SetLocalScale(scale); - - Matrix4 newTransform = Matrix4(1.0f); - newTransform = glm::translate(newTransform, pos); - newTransform = newTransform * glm::toMat4(rotation); - newTransform = glm::scale(newTransform, transformComponent.GetGlobalScale()); - transformComponent.SetLocalTransform(transform); + transformComponent.Dirty = false; + /* Logging + const std::string& name = entity.GetComponent().Name; const std::string& posStr = "(" + std::to_string(pos.x) + ", " + std::to_string(pos.y) + ", " + std::to_string(pos.z) + ")"; const std::string& logMsg = "Physics pos: " + name + " at " + posStr; Logger::Log(logMsg); + */ } // If you take larger steps than 1 / 60th of a second you need to do multiple collision steps in order to keep the simulation stable. diff --git a/Nuake/src/Scene/Components/CapsuleColliderComponent.cpp b/Nuake/src/Scene/Components/CapsuleColliderComponent.cpp new file mode 100644 index 00000000..535055e6 --- /dev/null +++ b/Nuake/src/Scene/Components/CapsuleColliderComponent.cpp @@ -0,0 +1,24 @@ +#include "CapsuleColliderComponent.h" +#include "src/Resource/Serializable.h" + +namespace Nuake +{ + json CapsuleColliderComponent::Serialize() + { + BEGIN_SERIALIZE() + + j["IsTrigger"] = IsTrigger; + SERIALIZE_VAL(Radius) + SERIALIZE_VAL(Height) + END_SERIALIZE() + } + + bool CapsuleColliderComponent::Deserialize(const std::string& str) + { + BEGIN_DESERIALIZE() + this->IsTrigger = j["IsTrigger"]; + this->Radius = j["Radius"]; + this->Height = j["Height"]; + return true; + } +} \ No newline at end of file diff --git a/Nuake/src/Scene/Components/CapsuleColliderComponent.h b/Nuake/src/Scene/Components/CapsuleColliderComponent.h new file mode 100644 index 00000000..c6c482d0 --- /dev/null +++ b/Nuake/src/Scene/Components/CapsuleColliderComponent.h @@ -0,0 +1,20 @@ +#pragma once +#include "src/Core/Physics/PhysicsShapes.h" +#include "src/Core/Core.h" + +namespace Nuake +{ + class CapsuleColliderComponent + { + public: + Ref Capsule; + + float Radius = 0.5f; + float Height = 1.0f; + + bool IsTrigger = false; + + json Serialize(); + bool Deserialize(const std::string& str); + }; +} diff --git a/Nuake/src/Scene/Entities/Entity.cpp b/Nuake/src/Scene/Entities/Entity.cpp index 222ccbfc..e187c3a8 100644 --- a/Nuake/src/Scene/Entities/Entity.cpp +++ b/Nuake/src/Scene/Entities/Entity.cpp @@ -13,6 +13,7 @@ #include "src/Scene/Components/Components.h" #include +#include "src/Scene/Components/CapsuleColliderComponent.h" namespace Nuake { @@ -30,34 +31,36 @@ namespace Nuake json Entity::Serialize() { BEGIN_SERIALIZE(); - SERIALIZE_OBJECT_REF_LBL("NameComponent", GetComponent()); - SERIALIZE_OBJECT_REF_LBL("ParentComponent", GetComponent()); - SERIALIZE_OBJECT_REF_LBL("TransformComponent", GetComponent()); - SERIALIZE_OBJECT_REF_LBL("VisibilityComponent", GetComponent()); + SERIALIZE_OBJECT_REF_LBL("NameComponent", GetComponent()) + SERIALIZE_OBJECT_REF_LBL("ParentComponent", GetComponent()) + SERIALIZE_OBJECT_REF_LBL("TransformComponent", GetComponent()) + SERIALIZE_OBJECT_REF_LBL("VisibilityComponent", GetComponent()) if (HasComponent()) - SERIALIZE_OBJECT_REF_LBL("CameraComponent", GetComponent()); + SERIALIZE_OBJECT_REF_LBL("CameraComponent", GetComponent()) if (HasComponent()) - SERIALIZE_OBJECT_REF_LBL("QuakeMapComponent", GetComponent()); + SERIALIZE_OBJECT_REF_LBL("QuakeMapComponent", GetComponent()) if (HasComponent()) - SERIALIZE_OBJECT_REF_LBL("LightComponent", GetComponent()); + SERIALIZE_OBJECT_REF_LBL("LightComponent", GetComponent()) if (HasComponent()) - SERIALIZE_OBJECT_REF_LBL("WrenScriptComponent", GetComponent()); + SERIALIZE_OBJECT_REF_LBL("WrenScriptComponent", GetComponent()) if (HasComponent()) - SERIALIZE_OBJECT_REF_LBL("CharacterControllerComponent", GetComponent()); + SERIALIZE_OBJECT_REF_LBL("CharacterControllerComponent", GetComponent()) if (HasComponent()) - SERIALIZE_OBJECT_REF_LBL("BoxColliderComponent", GetComponent()); + SERIALIZE_OBJECT_REF_LBL("BoxColliderComponent", GetComponent()) + if (HasComponent()) + SERIALIZE_OBJECT_REF_LBL("CapsuleColliderComponent", GetComponent()) if (HasComponent()) - SERIALIZE_OBJECT_REF_LBL("SphereColliderComponent", GetComponent()); + SERIALIZE_OBJECT_REF_LBL("SphereColliderComponent", GetComponent()) if (HasComponent()) - SERIALIZE_OBJECT_REF_LBL("MeshColliderComponent", GetComponent()); + SERIALIZE_OBJECT_REF_LBL("MeshColliderComponent", GetComponent()) if (HasComponent()) - SERIALIZE_OBJECT_REF_LBL("ModelComponent", GetComponent()); + SERIALIZE_OBJECT_REF_LBL("ModelComponent", GetComponent()) if (HasComponent()) - SERIALIZE_OBJECT_REF_LBL("BSPBrushComponent", GetComponent()); + SERIALIZE_OBJECT_REF_LBL("BSPBrushComponent", GetComponent()) if (HasComponent()) - SERIALIZE_OBJECT_REF_LBL("QuakeMapComponent", GetComponent()); + SERIALIZE_OBJECT_REF_LBL("QuakeMapComponent", GetComponent()) if (HasComponent()) - SERIALIZE_OBJECT_REF_LBL("RigidBodyComponent", GetComponent()); + SERIALIZE_OBJECT_REF_LBL("RigidBodyComponent", GetComponent()) END_SERIALIZE(); } @@ -65,25 +68,26 @@ namespace Nuake bool Entity::Deserialize(const std::string& str) { BEGIN_DESERIALIZE(); - DESERIALIZE_COMPONENT(TransformComponent); + DESERIALIZE_COMPONENT(TransformComponent) DESERIALIZE_COMPONENT(VisibilityComponent) else { AddComponent(); } - DESERIALIZE_COMPONENT(NameComponent); - DESERIALIZE_COMPONENT(ParentComponent); - DESERIALIZE_COMPONENT(CameraComponent); - DESERIALIZE_COMPONENT(QuakeMapComponent); - DESERIALIZE_COMPONENT(LightComponent); - DESERIALIZE_COMPONENT(ModelComponent); - DESERIALIZE_COMPONENT(WrenScriptComponent); - DESERIALIZE_COMPONENT(CharacterControllerComponent); - DESERIALIZE_COMPONENT(BoxColliderComponent); - DESERIALIZE_COMPONENT(MeshColliderComponent); - DESERIALIZE_COMPONENT(SphereColliderComponent); - DESERIALIZE_COMPONENT(RigidBodyComponent); - DESERIALIZE_COMPONENT(BSPBrushComponent); + DESERIALIZE_COMPONENT(NameComponent) + DESERIALIZE_COMPONENT(ParentComponent) + DESERIALIZE_COMPONENT(CameraComponent) + DESERIALIZE_COMPONENT(QuakeMapComponent) + DESERIALIZE_COMPONENT(LightComponent) + DESERIALIZE_COMPONENT(ModelComponent) + DESERIALIZE_COMPONENT(WrenScriptComponent) + DESERIALIZE_COMPONENT(CharacterControllerComponent) + DESERIALIZE_COMPONENT(BoxColliderComponent) + DESERIALIZE_COMPONENT(CapsuleColliderComponent) + DESERIALIZE_COMPONENT(MeshColliderComponent) + DESERIALIZE_COMPONENT(SphereColliderComponent) + DESERIALIZE_COMPONENT(RigidBodyComponent) + DESERIALIZE_COMPONENT(BSPBrushComponent) return true; } diff --git a/Nuake/src/Scene/Systems/PhysicsSystem.cpp b/Nuake/src/Scene/Systems/PhysicsSystem.cpp index 47976466..f5330892 100644 --- a/Nuake/src/Scene/Systems/PhysicsSystem.cpp +++ b/Nuake/src/Scene/Systems/PhysicsSystem.cpp @@ -1,6 +1,7 @@ #include "PhysicsSystem.h" #include "src/Scene/Scene.h" #include "src/Scene/Components/BoxCollider.h" +#include "src/Scene/Components/CapsuleColliderComponent.h" #include "src/Scene/Components/SphereCollider.h" #include "src/Scene/Components/MeshCollider.h" #include "src/Scene/Components/ModelComponent.h" @@ -39,6 +40,17 @@ namespace Nuake PhysicsManager::Get()->RegisterBody(rigidBody); } + if (ent.HasComponent()) + { + auto& capsuleComponent = ent.GetComponent(); + float radius = capsuleComponent.Radius; + float height = capsuleComponent.Height; + auto capsuleShape = CreateRef(radius, height); + + rigidBody = CreateRef(rigidBodyComponent.Mass, transform.GetGlobalPosition(), transform.GetGlobalTransform(), capsuleShape, ent); + PhysicsManager::Get()->RegisterBody(rigidBody); + } + if (ent.HasComponent()) { float mass = rigidBodyComponent.Mass;