TriangleSplitter.cpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  2. // SPDX-License-Identifier: MIT
  3. #include <Jolt/Jolt.h>
  4. #include <Jolt/TriangleSplitter/TriangleSplitter.h>
  5. JPH_NAMESPACE_BEGIN
  6. TriangleSplitter::TriangleSplitter(const VertexList &inVertices, const IndexedTriangleList &inTriangles) :
  7. mVertices(inVertices),
  8. mTriangles(inTriangles)
  9. {
  10. mSortedTriangleIdx.resize(inTriangles.size());
  11. mCentroids.resize(inTriangles.size());
  12. for (uint t = 0; t < inTriangles.size(); ++t)
  13. {
  14. // Initially triangles start unsorted
  15. mSortedTriangleIdx[t] = t;
  16. // Calculate centroid
  17. inTriangles[t].GetCentroid(inVertices).StoreFloat3(&mCentroids[t]);
  18. }
  19. }
  20. bool TriangleSplitter::SplitInternal(const Range &inTriangles, uint inDimension, float inSplit, Range &outLeft, Range &outRight)
  21. {
  22. // Divide triangles
  23. uint start = inTriangles.mBegin, end = inTriangles.mEnd;
  24. while (start < end)
  25. {
  26. // Search for first element that is on the right hand side of the split plane
  27. while (start < end && mCentroids[mSortedTriangleIdx[start]][inDimension] < inSplit)
  28. ++start;
  29. // Search for the first element that is on the left hand side of the split plane
  30. while (start < end && mCentroids[mSortedTriangleIdx[end - 1]][inDimension] >= inSplit)
  31. --end;
  32. if (start < end)
  33. {
  34. // Swap the two elements
  35. swap(mSortedTriangleIdx[start], mSortedTriangleIdx[end - 1]);
  36. ++start;
  37. --end;
  38. }
  39. }
  40. JPH_ASSERT(start == end);
  41. #ifdef JPH_ENABLE_ASSERTS
  42. // Validate division algorithm
  43. JPH_ASSERT(inTriangles.mBegin <= start);
  44. JPH_ASSERT(start <= inTriangles.mEnd);
  45. for (uint i = inTriangles.mBegin; i < start; ++i)
  46. JPH_ASSERT(mCentroids[mSortedTriangleIdx[i]][inDimension] < inSplit);
  47. for (uint i = start; i < inTriangles.mEnd; ++i)
  48. JPH_ASSERT(mCentroids[mSortedTriangleIdx[i]][inDimension] >= inSplit);
  49. #endif
  50. outLeft = Range(inTriangles.mBegin, start);
  51. outRight = Range(start, inTriangles.mEnd);
  52. return outLeft.Count() > 0 && outRight.Count() > 0;
  53. }
  54. JPH_NAMESPACE_END