mirror of
https://github.com/antopilo/Nuake.git
synced 2026-09-09 20:08:57 +03:00
Added capsule collider component
This commit is contained in:
37
Editor/src/ComponentsPanel/CapsuleColliderPanel.h
Normal file
37
Editor/src/ComponentsPanel/CapsuleColliderPanel.h
Normal 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()
|
||||
}
|
||||
};
|
||||
@@ -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());
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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.
|
||||
|
||||
24
Nuake/src/Scene/Components/CapsuleColliderComponent.cpp
Normal file
24
Nuake/src/Scene/Components/CapsuleColliderComponent.cpp
Normal 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;
|
||||
}
|
||||
}
|
||||
20
Nuake/src/Scene/Components/CapsuleColliderComponent.h
Normal file
20
Nuake/src/Scene/Components/CapsuleColliderComponent.h
Normal 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);
|
||||
};
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user