Added mesh colliders

This commit is contained in:
antopilo
2023-03-08 22:37:03 -05:00
parent 0a6f7ad733
commit 1c13c7ef2d
7 changed files with 88 additions and 19 deletions

View 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();
}
};

View File

@@ -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>())
{

View File

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

View File

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

View File

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

View File

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

View File

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