2
0

Indexify.cpp 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  2. // SPDX-License-Identifier: MIT
  3. #include <Jolt/Jolt.h>
  4. #include <Jolt/Geometry/Indexify.h>
  5. JPH_SUPPRESS_WARNINGS_STD_BEGIN
  6. #include <unordered_map>
  7. JPH_SUPPRESS_WARNINGS_STD_END
  8. JPH_NAMESPACE_BEGIN
  9. void Indexify(const TriangleList &inTriangles, VertexList &outVertices, IndexedTriangleList &outTriangles, float inVertexWeldDistance)
  10. {
  11. float weld_dist_sq = Square(inVertexWeldDistance);
  12. // Ensure that output vertices are empty before we begin
  13. outVertices.clear();
  14. // Find unique vertices
  15. unordered_map<Float3, uint32> vertex_map;
  16. for (const Triangle &t : inTriangles)
  17. for (const Float3 &v : t.mV)
  18. {
  19. // Try to insert element
  20. auto insert = vertex_map.insert(pair<Float3, uint32>(v, 0));
  21. if (insert.second)
  22. {
  23. // Newly inserted, see if we can share
  24. bool found = false;
  25. for (size_t i = 0; i < outVertices.size(); ++i)
  26. {
  27. const Float3 &other = outVertices[i];
  28. if (Square(other.x - v.x) + Square(other.y - v.y) + Square(other.z - v.z) <= weld_dist_sq)
  29. {
  30. insert.first->second = (uint32)i;
  31. found = true;
  32. break;
  33. }
  34. }
  35. if (!found)
  36. {
  37. // Can't share, add vertex
  38. insert.first->second = (uint32)outVertices.size();
  39. outVertices.push_back(v);
  40. }
  41. }
  42. }
  43. // Create indexed triangles
  44. outTriangles.clear();
  45. outTriangles.reserve(inTriangles.size());
  46. for (const Triangle &t : inTriangles)
  47. {
  48. IndexedTriangle it;
  49. it.mMaterialIndex = t.mMaterialIndex;
  50. for (int j = 0; j < 3; ++j)
  51. it.mIdx[j] = vertex_map[t.mV[j]];
  52. if (!it.IsDegenerate())
  53. outTriangles.push_back(it);
  54. }
  55. }
  56. void Deindexify(const VertexList &inVertices, const IndexedTriangleList &inTriangles, TriangleList &outTriangles)
  57. {
  58. outTriangles.resize(inTriangles.size());
  59. for (size_t t = 0; t < inTriangles.size(); ++t)
  60. for (int v = 0; v < 3; ++v)
  61. outTriangles[t].mV[v] = inVertices[inTriangles[t].mIdx[v]];
  62. }
  63. JPH_NAMESPACE_END