JoltCollider3D/ConvexHullCollider3D: Improve debug mesh generation
This commit is contained in:
parent
6a609055dc
commit
ad1a7cf43e
|
|
@ -308,7 +308,7 @@ namespace Nz
|
||||||
|
|
||||||
UInt16 index = SafeCast<UInt16>(vertices.size());
|
UInt16 index = SafeCast<UInt16>(vertices.size());
|
||||||
|
|
||||||
vertices.push_back(position);
|
vertices.push_back(offsetMatrix * position);
|
||||||
vertexCache.emplace(position, index);
|
vertexCache.emplace(position, index);
|
||||||
|
|
||||||
return index;
|
return index;
|
||||||
|
|
@ -320,8 +320,8 @@ namespace Nz
|
||||||
btVector3 from, to;
|
btVector3 from, to;
|
||||||
m_shape->getEdge(i, from, to);
|
m_shape->getEdge(i, from, to);
|
||||||
|
|
||||||
indices.push_back(InsertVertex(offsetMatrix * FromBullet(from)));
|
indices.push_back(InsertVertex(FromBullet(from)));
|
||||||
indices.push_back(InsertVertex(offsetMatrix * FromBullet(to)));
|
indices.push_back(InsertVertex(FromBullet(to)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@
|
||||||
#include <Jolt/Physics/Collision/Shape/RotatedTranslatedShape.h>
|
#include <Jolt/Physics/Collision/Shape/RotatedTranslatedShape.h>
|
||||||
#include <Jolt/Physics/Collision/Shape/StaticCompoundShape.h>
|
#include <Jolt/Physics/Collision/Shape/StaticCompoundShape.h>
|
||||||
#include <Jolt/Physics/Collision/Shape/SphereShape.h>
|
#include <Jolt/Physics/Collision/Shape/SphereShape.h>
|
||||||
|
#include <optional>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include <Nazara/JoltPhysics3D/Debug.hpp>
|
#include <Nazara/JoltPhysics3D/Debug.hpp>
|
||||||
|
|
||||||
|
|
@ -302,24 +303,24 @@ namespace Nz
|
||||||
|
|
||||||
void JoltConvexHullCollider3D::BuildDebugMesh(std::vector<Vector3f>& vertices, std::vector<UInt16>& indices, const Matrix4f& offsetMatrix) const
|
void JoltConvexHullCollider3D::BuildDebugMesh(std::vector<Vector3f>& vertices, std::vector<UInt16>& indices, const Matrix4f& offsetMatrix) const
|
||||||
{
|
{
|
||||||
std::unordered_map<Vector3f, UInt16> vertexCache;
|
const JPH::ConvexHullShapeSettings* settings = GetShapeSettingsAs<JPH::ConvexHullShapeSettings>();
|
||||||
auto InsertVertex = [&](const Vector3f& position) -> UInt16
|
const JPH::ConvexHullShape* shape = SafeCast<const JPH::ConvexHullShape*>(settings->Create().Get().GetPtr());
|
||||||
|
|
||||||
|
std::unordered_map<unsigned int, UInt16> vertexCache;
|
||||||
|
auto InsertVertex = [&](unsigned int vertexIndex) -> UInt16
|
||||||
{
|
{
|
||||||
auto it = vertexCache.find(position);
|
auto it = vertexCache.find(vertexIndex);
|
||||||
if (it != vertexCache.end())
|
if (it != vertexCache.end())
|
||||||
return it->second;
|
return it->second;
|
||||||
|
|
||||||
UInt16 index = SafeCast<UInt16>(vertices.size());
|
UInt16 index = SafeCast<UInt16>(vertices.size());
|
||||||
|
|
||||||
vertices.push_back(position);
|
vertices.push_back(offsetMatrix * FromJolt(shape->GetPoint(vertexIndex)));
|
||||||
vertexCache.emplace(position, index);
|
vertexCache.emplace(vertexIndex, index);
|
||||||
|
|
||||||
return index;
|
return index;
|
||||||
};
|
};
|
||||||
|
|
||||||
const JPH::ConvexHullShapeSettings* settings = GetShapeSettingsAs<JPH::ConvexHullShapeSettings>();
|
|
||||||
const JPH::ConvexHullShape* shape = SafeCast<const JPH::ConvexHullShape*>(settings->Create().Get().GetPtr());
|
|
||||||
|
|
||||||
unsigned int faceCount = shape->GetNumFaces();
|
unsigned int faceCount = shape->GetNumFaces();
|
||||||
unsigned int maxVerticesInFace = 0;
|
unsigned int maxVerticesInFace = 0;
|
||||||
for (unsigned int i = 0; i < faceCount; ++i)
|
for (unsigned int i = 0; i < faceCount; ++i)
|
||||||
|
|
@ -329,16 +330,19 @@ namespace Nz
|
||||||
for (unsigned int i = 0; i < faceCount; ++i)
|
for (unsigned int i = 0; i < faceCount; ++i)
|
||||||
{
|
{
|
||||||
unsigned int vertexCount = shape->GetFaceVertices(i, maxVerticesInFace, faceVertices.data());
|
unsigned int vertexCount = shape->GetFaceVertices(i, maxVerticesInFace, faceVertices.data());
|
||||||
if (vertexCount > 2)
|
if NAZARA_LIKELY(vertexCount >= 2)
|
||||||
{
|
{
|
||||||
for (unsigned int i = 1; i < vertexCount; ++i)
|
for (unsigned int i = 1; i < vertexCount; ++i)
|
||||||
{
|
{
|
||||||
indices.push_back(InsertVertex(offsetMatrix * FromJolt(shape->GetPoint(faceVertices[i - 1]))));
|
indices.push_back(InsertVertex(faceVertices[i - 1]));
|
||||||
indices.push_back(InsertVertex(offsetMatrix * FromJolt(shape->GetPoint(faceVertices[i]))));
|
indices.push_back(InsertVertex(faceVertices[i]));
|
||||||
}
|
}
|
||||||
|
|
||||||
indices.push_back(InsertVertex(offsetMatrix * FromJolt(shape->GetPoint(faceVertices[vertexCount - 1]))));
|
if NAZARA_LIKELY(vertexCount > 2)
|
||||||
indices.push_back(InsertVertex(offsetMatrix * FromJolt(shape->GetPoint(faceVertices[0]))));
|
{
|
||||||
|
indices.push_back(InsertVertex(faceVertices[vertexCount - 1]));
|
||||||
|
indices.push_back(InsertVertex(faceVertices[0]));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue