Indexify.cpp 1.9 KB

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