TriangleSplitterFixedLeafSize.h 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
  2. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  3. // SPDX-License-Identifier: MIT
  4. #pragma once
  5. #include <Jolt/TriangleSplitter/TriangleSplitter.h>
  6. #include <Jolt/Geometry/AABox.h>
  7. JPH_NAMESPACE_BEGIN
  8. /// Same as TriangleSplitterBinning, but ensuring that leaves have a fixed amount of triangles
  9. /// The resulting tree should be suitable for processing on GPU where we want all threads to process an equal amount of triangles
  10. class TriangleSplitterFixedLeafSize : public TriangleSplitter
  11. {
  12. public:
  13. /// Constructor
  14. TriangleSplitterFixedLeafSize(const VertexList &inVertices, const IndexedTriangleList &inTriangles, uint inLeafSize, uint inMinNumBins = 8, uint inMaxNumBins = 128, uint inNumTrianglesPerBin = 6);
  15. // See TriangleSplitter::GetStats
  16. virtual void GetStats(Stats &outStats) const override
  17. {
  18. outStats.mSplitterName = "TriangleSplitterFixedLeafSize";
  19. outStats.mLeafSize = mLeafSize;
  20. }
  21. // See TriangleSplitter::Split
  22. virtual bool Split(const Range &inTriangles, Range &outLeft, Range &outRight) override;
  23. private:
  24. /// Get centroid for group
  25. Vec3 GetCentroidForGroup(uint inFirstTriangleInGroup);
  26. // Configuration
  27. const uint mLeafSize;
  28. const uint mMinNumBins;
  29. const uint mMaxNumBins;
  30. const uint mNumTrianglesPerBin;
  31. struct Bin
  32. {
  33. // Properties of this bin
  34. AABox mBounds;
  35. float mMinCentroid;
  36. uint mNumTriangles;
  37. // Accumulated data from left most / right most bin to current (including this bin)
  38. AABox mBoundsAccumulatedLeft;
  39. AABox mBoundsAccumulatedRight;
  40. uint mNumTrianglesAccumulatedLeft;
  41. uint mNumTrianglesAccumulatedRight;
  42. };
  43. };
  44. JPH_NAMESPACE_END