mirror of
https://github.com/antopilo/Nuake.git
synced 2026-09-15 20:08:54 +03:00
Added mesh colliders
This commit is contained in:
40
Editor/src/ComponentsPanel/MeshColliderPanel.h
Normal file
40
Editor/src/ComponentsPanel/MeshColliderPanel.h
Normal file
@@ -0,0 +1,40 @@
|
||||
#pragma once
|
||||
#include <src/Core/Core.h>
|
||||
#include "ComponentPanel.h"
|
||||
#include "ModelResourceInspector.h"
|
||||
|
||||
#include <src/Scene/Entities/ImGuiHelper.h>
|
||||
#include <src/Scene/Components/MeshCollider.h>
|
||||
|
||||
#include <src/Resource/ResourceLoader.h>
|
||||
#include <src/Core/String.h>
|
||||
|
||||
class MeshColliderPanel : ComponentPanel {
|
||||
private:
|
||||
Scope<ModelResourceInspector> _modelInspector;
|
||||
bool _expanded = false;
|
||||
public:
|
||||
MeshColliderPanel()
|
||||
{
|
||||
CreateScope<ModelResourceInspector>();
|
||||
}
|
||||
|
||||
void Draw(Nuake::Entity entity) override
|
||||
{
|
||||
using namespace Nuake;
|
||||
if (!entity.HasComponent<MeshColliderComponent>())
|
||||
return;
|
||||
|
||||
MeshColliderComponent& component = entity.GetComponent<MeshColliderComponent>();
|
||||
BeginComponentTable(MESH, MeshColliderComponent);
|
||||
{
|
||||
ImGui::Text("Model");
|
||||
ImGui::TableNextColumn();
|
||||
|
||||
ImGui::DragInt("##Submesh", &component.SubMesh, 0, 255);
|
||||
ImGui::TableNextColumn();
|
||||
ComponentTableReset(component.SubMesh, 0);
|
||||
}
|
||||
EndComponentTable();
|
||||
}
|
||||
};
|
||||
@@ -101,6 +101,8 @@ void EditorSelectionPanel::DrawEntity(Nuake::Entity entity)
|
||||
mRigidbodyPanel.Draw(entity);
|
||||
mBoxColliderPanel.Draw(entity);
|
||||
mSphereColliderPanel.Draw(entity);
|
||||
mMeshColliderPanel.Draw(entity);
|
||||
|
||||
/*
|
||||
if (Selection.Entity.HasComponent<MeshComponent>())
|
||||
{
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
#include "../ComponentsPanel/RigidbodyPanel.h"
|
||||
#include "../ComponentsPanel/BoxColliderPanel.h"
|
||||
#include "../ComponentsPanel/SphereColliderPanel.h"
|
||||
#include "../ComponentsPanel/MeshColliderPanel.h"
|
||||
|
||||
class EditorSelectionPanel {
|
||||
private:
|
||||
@@ -26,6 +27,7 @@ private:
|
||||
RigidbodyPanel mRigidbodyPanel;
|
||||
BoxColliderPanel mBoxColliderPanel;
|
||||
SphereColliderPanel mSphereColliderPanel;
|
||||
MeshColliderPanel mMeshColliderPanel;
|
||||
|
||||
Ref<Nuake::File> currentFile;
|
||||
Ref<Nuake::Resource> selectedResource;
|
||||
|
||||
@@ -254,6 +254,7 @@ namespace Nuake
|
||||
|
||||
void DynamicWorld::DrawDebug()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void DynamicWorld::SetGravity(glm::vec3 g)
|
||||
@@ -371,6 +372,7 @@ namespace Nuake
|
||||
JPH::Vec3 position = bodyInterface.GetCenterOfMassPosition(bodyId);
|
||||
JPH::Vec3 velocity = bodyInterface.GetLinearVelocity(bodyId);
|
||||
JPH::Mat44 joltTransform = bodyInterface.GetWorldTransform(bodyId);
|
||||
|
||||
Matrix4 transform = glm::mat4(
|
||||
joltTransform(0, 0), joltTransform(1, 0), joltTransform(2, 0), joltTransform(3, 0),
|
||||
joltTransform(0, 1), joltTransform(1, 1), joltTransform(2, 1), joltTransform(3, 1),
|
||||
@@ -387,9 +389,6 @@ namespace Nuake
|
||||
transformComponent.SetGlobalPosition(Vector3(position.GetX(), position.GetY(), position.GetZ()));
|
||||
transformComponent.SetGlobalTransform(transform);
|
||||
transformComponent.SetLocalTransform(transform);
|
||||
std::cout << "Object with Name: " << name << " has moved!";
|
||||
std::cout << "Step " << _stepCount << ": Position = (" << position.GetX() << ", " << position.GetY() << ", " << position.GetZ() << "), Velocity = (" << velocity.GetX() << ", " << velocity.GetY() << ", " << velocity.GetZ() << ")" << std::endl;
|
||||
|
||||
}
|
||||
// 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. Do 1 collision step per 1 / 60th of a second (round up).
|
||||
const int cCollisionSteps = 1;
|
||||
@@ -404,12 +403,7 @@ namespace Nuake
|
||||
void DynamicWorld::Clear()
|
||||
{
|
||||
_stepCount = 0;
|
||||
|
||||
for (auto& b : _registeredBodies)
|
||||
{
|
||||
_JoltBodyInterface->RemoveBody((JPH::BodyID)b);
|
||||
}
|
||||
|
||||
_JoltBodyInterface->RemoveBodies((JPH::BodyID*)_registeredBodies.data(), _registeredBodies.size());
|
||||
_registeredBodies.clear();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,8 +6,23 @@ namespace Nuake {
|
||||
class MeshColliderComponent
|
||||
{
|
||||
public:
|
||||
Ref<Physics::MeshShape> MeshShape;
|
||||
Ref<Mesh> Mesh;
|
||||
int SubMesh = 0;
|
||||
bool IsTrigger;
|
||||
|
||||
json Serialize()
|
||||
{
|
||||
BEGIN_SERIALIZE();
|
||||
j["IsTrigger"] = IsTrigger;
|
||||
SERIALIZE_VAL(SubMesh);
|
||||
END_SERIALIZE();
|
||||
}
|
||||
|
||||
bool Deserialize(const std::string& str)
|
||||
{
|
||||
BEGIN_DESERIALIZE();
|
||||
this->IsTrigger = j["IsTrigger"];
|
||||
this->SubMesh = j["SubMesh"];
|
||||
return true;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -48,6 +48,8 @@ namespace Nuake
|
||||
SERIALIZE_OBJECT_REF_LBL("BoxColliderComponent", GetComponent<BoxColliderComponent>());
|
||||
if (HasComponent<SphereColliderComponent>())
|
||||
SERIALIZE_OBJECT_REF_LBL("SphereColliderComponent", GetComponent<SphereColliderComponent>());
|
||||
if (HasComponent<MeshColliderComponent>())
|
||||
SERIALIZE_OBJECT_REF_LBL("MeshColliderComponent", GetComponent<MeshColliderComponent>());
|
||||
if (HasComponent<ModelComponent>())
|
||||
SERIALIZE_OBJECT_REF_LBL("ModelComponent", GetComponent<ModelComponent>());
|
||||
if (HasComponent<BSPBrushComponent>())
|
||||
@@ -78,6 +80,7 @@ namespace Nuake
|
||||
DESERIALIZE_COMPONENT(WrenScriptComponent);
|
||||
DESERIALIZE_COMPONENT(CharacterControllerComponent);
|
||||
DESERIALIZE_COMPONENT(BoxColliderComponent);
|
||||
DESERIALIZE_COMPONENT(MeshColliderComponent);
|
||||
DESERIALIZE_COMPONENT(SphereColliderComponent);
|
||||
DESERIALIZE_COMPONENT(RigidBodyComponent);
|
||||
return true;
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
#include "src/Scene/Components/BoxCollider.h"
|
||||
#include "src/Scene/Components/SphereCollider.h"
|
||||
#include "src/Scene/Components/MeshCollider.h"
|
||||
|
||||
#include "src/Scene/Components/ModelComponent.h"
|
||||
#include <src/Scene/Components/RigidbodyComponent.h>
|
||||
#include "src/Scene/Entities/Entity.h"
|
||||
#include <src/Core/Physics/PhysicsManager.h>
|
||||
@@ -50,15 +50,28 @@ namespace Nuake
|
||||
PhysicsManager::Get()->RegisterBody(rigidBody);
|
||||
}
|
||||
|
||||
if (ent.HasComponent<SphereColliderComponent>())
|
||||
if (ent.HasComponent<MeshColliderComponent>())
|
||||
{
|
||||
float mass = rigidbody.Mass;
|
||||
if (!ent.HasComponent<ModelComponent>())
|
||||
{
|
||||
Logger::Log("Cannot use mesh collider without model component", WARNING);
|
||||
}
|
||||
const auto& modelComponent = ent.GetComponent<ModelComponent>();
|
||||
const auto& component = ent.GetComponent<MeshColliderComponent>();
|
||||
|
||||
const auto& component = ent.GetComponent<SphereColliderComponent>();
|
||||
auto shape = CreateRef<Physics::Sphere>(component.Radius);
|
||||
|
||||
rigidBody = CreateRef<Physics::RigidBody>(mass, transform.GetGlobalPosition(), shape, ent);
|
||||
PhysicsManager::Get()->RegisterBody(rigidBody);
|
||||
if (modelComponent.ModelResource)
|
||||
{
|
||||
uint32_t subMeshId = component.SubMesh;
|
||||
const std::vector<Ref<Mesh>>& submeshes = modelComponent.ModelResource->GetMeshes();
|
||||
if (subMeshId >= submeshes.size())
|
||||
{
|
||||
Logger::Log("Cannot create mesh collider, invalid submesh ID", WARNING);
|
||||
}
|
||||
Ref<Mesh> mesh = submeshes[subMeshId];
|
||||
auto shape = CreateRef<Physics::MeshShape>(mesh);
|
||||
rigidBody = CreateRef<Physics::RigidBody>(1.0f, transform.GetGlobalPosition(), shape, ent);
|
||||
PhysicsManager::Get()->RegisterBody(rigidBody);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user