Indexify.cpp 1.8 KB

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