From 1672765936beeb3784ca00b416d1386ac8f393a1 Mon Sep 17 00:00:00 2001 From: SirLynix Date: Fri, 2 Jun 2023 17:47:25 +0200 Subject: [PATCH] JoltPhysics3D/JoltCollider3D: Add Mesh JoltMeshCollider3D --- include/Nazara/JoltPhysics3D/Enums.hpp | 1 + .../Nazara/JoltPhysics3D/JoltCollider3D.hpp | 12 ++++ src/Nazara/JoltPhysics3D/JoltCollider3D.cpp | 62 +++++++++++++++++++ 3 files changed, 75 insertions(+) diff --git a/include/Nazara/JoltPhysics3D/Enums.hpp b/include/Nazara/JoltPhysics3D/Enums.hpp index 996c48c30..af2943b14 100644 --- a/include/Nazara/JoltPhysics3D/Enums.hpp +++ b/include/Nazara/JoltPhysics3D/Enums.hpp @@ -15,6 +15,7 @@ namespace Nz Capsule, Compound, Convex, + Mesh, Sphere, ScaleDecoration, diff --git a/include/Nazara/JoltPhysics3D/JoltCollider3D.hpp b/include/Nazara/JoltPhysics3D/JoltCollider3D.hpp index 21b4f0179..f7c760a3e 100644 --- a/include/Nazara/JoltPhysics3D/JoltCollider3D.hpp +++ b/include/Nazara/JoltPhysics3D/JoltCollider3D.hpp @@ -122,6 +122,18 @@ namespace Nz JoltColliderType3D GetType() const override; }; + + class NAZARA_JOLTPHYSICS3D_API JoltMeshCollider3D final : public JoltCollider3D + { + public: + JoltMeshCollider3D(SparsePtr vertices, std::size_t vertexCount, SparsePtr indices, std::size_t indexCount); + JoltMeshCollider3D(SparsePtr vertices, std::size_t vertexCount, SparsePtr indices, std::size_t indexCount); + ~JoltMeshCollider3D() = default; + + void BuildDebugMesh(std::vector& vertices, std::vector& indices, const Matrix4f& offsetMatrix) const override; + + JoltColliderType3D GetType() const override; + }; class NAZARA_JOLTPHYSICS3D_API JoltSphereCollider3D final : public JoltCollider3D { diff --git a/src/Nazara/JoltPhysics3D/JoltCollider3D.cpp b/src/Nazara/JoltPhysics3D/JoltCollider3D.cpp index 0ca19230d..5ed0fa569 100644 --- a/src/Nazara/JoltPhysics3D/JoltCollider3D.cpp +++ b/src/Nazara/JoltPhysics3D/JoltCollider3D.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -352,6 +353,67 @@ namespace Nz return JoltColliderType3D::Convex; } + /******************************** JoltMeshCollider3D *********************************/ + + JoltMeshCollider3D::JoltMeshCollider3D(SparsePtr vertices, std::size_t vertexCount, SparsePtr indices, std::size_t indexCount) + { + std::unique_ptr settings = std::make_unique(); + settings->mTriangleVertices.resize(vertexCount); + for (std::size_t i = 0; i < vertexCount; ++i) + { + settings->mTriangleVertices[i].x = vertices[i].x; + settings->mTriangleVertices[i].y = vertices[i].y; + settings->mTriangleVertices[i].z = vertices[i].z; + } + + std::size_t triangleCount = indexCount / 3; + settings->mIndexedTriangles.resize(triangleCount); + for (std::size_t i = 0; i < triangleCount; ++i) + { + settings->mIndexedTriangles[i].mIdx[0] = indices[i * 3 + 0]; + settings->mIndexedTriangles[i].mIdx[1] = indices[i * 3 + 1]; + settings->mIndexedTriangles[i].mIdx[2] = indices[i * 3 + 2]; + } + + settings->Sanitize(); + + SetupShapeSettings(std::move(settings)); + } + + JoltMeshCollider3D::JoltMeshCollider3D(SparsePtr vertices, std::size_t vertexCount, SparsePtr indices, std::size_t indexCount) + { + std::unique_ptr settings = std::make_unique(); + settings->mTriangleVertices.resize(vertexCount); + for (std::size_t i = 0; i < vertexCount; ++i) + { + settings->mTriangleVertices[i].x = vertices[i].x; + settings->mTriangleVertices[i].y = vertices[i].y; + settings->mTriangleVertices[i].z = vertices[i].z; + } + + std::size_t triangleCount = indexCount / 3; + settings->mIndexedTriangles.resize(triangleCount); + for (std::size_t i = 0; i < triangleCount; ++i) + { + settings->mIndexedTriangles[i].mIdx[0] = indices[i * 3 + 0]; + settings->mIndexedTriangles[i].mIdx[1] = indices[i * 3 + 1]; + settings->mIndexedTriangles[i].mIdx[2] = indices[i * 3 + 2]; + } + + settings->Sanitize(); + + SetupShapeSettings(std::move(settings)); + } + + void JoltMeshCollider3D::BuildDebugMesh(std::vector& vertices, std::vector& indices, const Matrix4f& offsetMatrix) const + { + } + + JoltColliderType3D JoltMeshCollider3D::GetType() const + { + return JoltColliderType3D::Mesh; + } + /******************************** JoltSphereCollider3D *********************************/ JoltSphereCollider3D::JoltSphereCollider3D(float radius)