Added capsule collider component

This commit is contained in:
Antoine Pilote
2023-04-02 19:01:40 -04:00
parent 17849584e5
commit 80eadc2a5a
9 changed files with 144 additions and 46 deletions

View File

@@ -0,0 +1,37 @@
#pragma once
#include "ComponentPanel.h"
#include <src/Scene/Components/CapsuleColliderComponent.h>
class CapsuleColliderPanel: ComponentPanel
{
public:
CapsuleColliderPanel() = default;
void Draw(Nuake::Entity entity) override
{
if (!entity.HasComponent<Nuake::CapsuleColliderComponent>())
return;
auto& component = entity.GetComponent<Nuake::CapsuleColliderComponent>();
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()
}
};

View File

@@ -11,6 +11,8 @@
#include <dependencies/GLEW/include/GL/glew.h>
#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> scene)
Nuake::RenderCommand::DrawLines(0, 128);
}
auto capsuleColliderView = scene->m_Registry.view<TransformComponent, BoxColliderComponent>();
auto capsuleColliderView = scene->m_Registry.view<TransformComponent, CapsuleColliderComponent>();
for (auto e : capsuleColliderView)
{
auto [transform, capsule] = scene->m_Registry.get<TransformComponent, BoxColliderComponent>(e);
auto [transform, capsule] = scene->m_Registry.get<TransformComponent, CapsuleColliderComponent>(e);
mLineShader->Bind();
mLineShader->SetUniformMat4f("u_View", glm::translate(scene->m_EditorCamera->GetTransform(), transform.Translation));
mLineShader->SetUniformMat4f("u_Projection", scene->m_EditorCamera->GetPerspective());

View File

@@ -38,7 +38,7 @@ void EditorSelectionPanel::ResolveFile(Ref<Nuake::File> 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();

View File

@@ -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<Nuake::File> currentFile;

View File

@@ -353,6 +353,7 @@ namespace Nuake
void DynamicWorld::AddGhostbody(Ref<GhostObject> gb)
{
}
void DynamicWorld::AddCharacterController(Ref<CharacterController> 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<int>(bodyInterface.GetUserData(bodyId));
Entity entity = Engine::GetCurrentScene()->GetEntityByID(entId);
const std::string& name = entity.GetComponent<NameComponent>().Name;
TransformComponent& transformComponent = entity.GetComponent<TransformComponent>();
//transformComponent.GlobalTransform = transform;
auto& transformComponent = entity.GetComponent<TransformComponent>();
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<NameComponent>().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.

View File

@@ -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;
}
}

View File

@@ -0,0 +1,20 @@
#pragma once
#include "src/Core/Physics/PhysicsShapes.h"
#include "src/Core/Core.h"
namespace Nuake
{
class CapsuleColliderComponent
{
public:
Ref<Physics::PhysicShape> Capsule;
float Radius = 0.5f;
float Height = 1.0f;
bool IsTrigger = false;
json Serialize();
bool Deserialize(const std::string& str);
};
}

View File

@@ -13,6 +13,7 @@
#include "src/Scene/Components/Components.h"
#include <src/Scene/Components/BoxCollider.h>
#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<NameComponent>());
SERIALIZE_OBJECT_REF_LBL("ParentComponent", GetComponent<ParentComponent>());
SERIALIZE_OBJECT_REF_LBL("TransformComponent", GetComponent<TransformComponent>());
SERIALIZE_OBJECT_REF_LBL("VisibilityComponent", GetComponent<VisibilityComponent>());
SERIALIZE_OBJECT_REF_LBL("NameComponent", GetComponent<NameComponent>())
SERIALIZE_OBJECT_REF_LBL("ParentComponent", GetComponent<ParentComponent>())
SERIALIZE_OBJECT_REF_LBL("TransformComponent", GetComponent<TransformComponent>())
SERIALIZE_OBJECT_REF_LBL("VisibilityComponent", GetComponent<VisibilityComponent>())
if (HasComponent<CameraComponent>())
SERIALIZE_OBJECT_REF_LBL("CameraComponent", GetComponent<CameraComponent>());
SERIALIZE_OBJECT_REF_LBL("CameraComponent", GetComponent<CameraComponent>())
if (HasComponent<QuakeMapComponent>())
SERIALIZE_OBJECT_REF_LBL("QuakeMapComponent", GetComponent<QuakeMapComponent>());
SERIALIZE_OBJECT_REF_LBL("QuakeMapComponent", GetComponent<QuakeMapComponent>())
if (HasComponent<LightComponent>())
SERIALIZE_OBJECT_REF_LBL("LightComponent", GetComponent<LightComponent>());
SERIALIZE_OBJECT_REF_LBL("LightComponent", GetComponent<LightComponent>())
if (HasComponent<WrenScriptComponent>())
SERIALIZE_OBJECT_REF_LBL("WrenScriptComponent", GetComponent<WrenScriptComponent>());
SERIALIZE_OBJECT_REF_LBL("WrenScriptComponent", GetComponent<WrenScriptComponent>())
if (HasComponent<CharacterControllerComponent>())
SERIALIZE_OBJECT_REF_LBL("CharacterControllerComponent", GetComponent<CharacterControllerComponent>());
SERIALIZE_OBJECT_REF_LBL("CharacterControllerComponent", GetComponent<CharacterControllerComponent>())
if (HasComponent<BoxColliderComponent>())
SERIALIZE_OBJECT_REF_LBL("BoxColliderComponent", GetComponent<BoxColliderComponent>());
SERIALIZE_OBJECT_REF_LBL("BoxColliderComponent", GetComponent<BoxColliderComponent>())
if (HasComponent<CapsuleColliderComponent>())
SERIALIZE_OBJECT_REF_LBL("CapsuleColliderComponent", GetComponent<CapsuleColliderComponent>())
if (HasComponent<SphereColliderComponent>())
SERIALIZE_OBJECT_REF_LBL("SphereColliderComponent", GetComponent<SphereColliderComponent>());
SERIALIZE_OBJECT_REF_LBL("SphereColliderComponent", GetComponent<SphereColliderComponent>())
if (HasComponent<MeshColliderComponent>())
SERIALIZE_OBJECT_REF_LBL("MeshColliderComponent", GetComponent<MeshColliderComponent>());
SERIALIZE_OBJECT_REF_LBL("MeshColliderComponent", GetComponent<MeshColliderComponent>())
if (HasComponent<ModelComponent>())
SERIALIZE_OBJECT_REF_LBL("ModelComponent", GetComponent<ModelComponent>());
SERIALIZE_OBJECT_REF_LBL("ModelComponent", GetComponent<ModelComponent>())
if (HasComponent<BSPBrushComponent>())
SERIALIZE_OBJECT_REF_LBL("BSPBrushComponent", GetComponent<BSPBrushComponent>());
SERIALIZE_OBJECT_REF_LBL("BSPBrushComponent", GetComponent<BSPBrushComponent>())
if (HasComponent<QuakeMapComponent>())
SERIALIZE_OBJECT_REF_LBL("QuakeMapComponent", GetComponent<QuakeMapComponent>());
SERIALIZE_OBJECT_REF_LBL("QuakeMapComponent", GetComponent<QuakeMapComponent>())
if (HasComponent<RigidBodyComponent>())
SERIALIZE_OBJECT_REF_LBL("RigidBodyComponent", GetComponent<RigidBodyComponent>());
SERIALIZE_OBJECT_REF_LBL("RigidBodyComponent", GetComponent<RigidBodyComponent>())
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<VisibilityComponent>();
}
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;
}

View File

@@ -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<CapsuleColliderComponent>())
{
auto& capsuleComponent = ent.GetComponent<CapsuleColliderComponent>();
float radius = capsuleComponent.Radius;
float height = capsuleComponent.Height;
auto capsuleShape = CreateRef<Physics::Capsule>(radius, height);
rigidBody = CreateRef<Physics::RigidBody>(rigidBodyComponent.Mass, transform.GetGlobalPosition(), transform.GetGlobalTransform(), capsuleShape, ent);
PhysicsManager::Get()->RegisterBody(rigidBody);
}
if (ent.HasComponent<SphereColliderComponent>())
{
float mass = rigidBodyComponent.Mass;