Backlog/lib/zphysics/libs/Jolt/Geometry/Indexify.cpp

73 lines
1.9 KiB
C++

// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
// SPDX-FileCopyrightText: 2021 Jorrit Rouwe
// SPDX-License-Identifier: MIT
#include <Jolt/Jolt.h>
#include <Jolt/Core/UnorderedMap.h>
#include <Jolt/Geometry/Indexify.h>
JPH_NAMESPACE_BEGIN
void Indexify(const TriangleList &inTriangles, VertexList &outVertices, IndexedTriangleList &outTriangles, float inVertexWeldDistance)
{
float weld_dist_sq = Square(inVertexWeldDistance);
// Ensure that output vertices are empty before we begin
outVertices.clear();
// Find unique vertices
UnorderedMap<Float3, uint32> vertex_map;
for (const Triangle &t : inTriangles)
for (const Float3 &v : t.mV)
{
// Try to insert element
auto insert = vertex_map.insert(pair<Float3, uint32>(v, 0));
if (insert.second)
{
// Newly inserted, see if we can share
bool found = false;
for (size_t i = 0; i < outVertices.size(); ++i)
{
const Float3 &other = outVertices[i];
if (Square(other.x - v.x) + Square(other.y - v.y) + Square(other.z - v.z) <= weld_dist_sq)
{
insert.first->second = (uint32)i;
found = true;
break;
}
}
if (!found)
{
// Can't share, add vertex
insert.first->second = (uint32)outVertices.size();
outVertices.push_back(v);
}
}
}
// Create indexed triangles
outTriangles.clear();
outTriangles.reserve(inTriangles.size());
for (const Triangle &t : inTriangles)
{
IndexedTriangle it;
it.mMaterialIndex = t.mMaterialIndex;
for (int j = 0; j < 3; ++j)
it.mIdx[j] = vertex_map[t.mV[j]];
if (!it.IsDegenerate())
outTriangles.push_back(it);
}
}
void Deindexify(const VertexList &inVertices, const IndexedTriangleList &inTriangles, TriangleList &outTriangles)
{
outTriangles.resize(inTriangles.size());
for (size_t t = 0; t < inTriangles.size(); ++t)
for (int v = 0; v < 3; ++v)
outTriangles[t].mV[v] = inVertices[inTriangles[t].mIdx[v]];
}
JPH_NAMESPACE_END