16#include "Containers/HashTable.h"
56template <
typename MeshT,
typename DisplacementPolicyT>
63 union {
float f;
uint32 i; } x;
64 union {
float f;
uint32 i; } y;
65 union {
float f;
uint32 i; } z;
80 union {
double f;
uint64 i; } x;
81 union {
double f;
uint64 i; } y;
82 union {
double f;
uint64 i; } z;
117 for (
int Corner = 0; Corner < 3; Corner++)
126 template <
typename T>
127 inline static constexpr T EquilateralArea( T EdgeLength )
129 constexpr T
sqrt3_4 = T(0.4330127018922193);
133 template <
typename T>
140 template <
typename T>
142 inline static constexpr T DistanceToEdge( T Barycentric, T EdgeLength, T
TriangleArea )
150 inline static constexpr int32 NextEdge(
int32 e) {
return (e+1)%3; }
151 inline static constexpr int32 PrevEdge(
int32 e) {
return (e+2)%3; }
200 Displacements.
Init(
VecType( std::numeric_limits<RealType>::signaling_NaN(),
201 std::numeric_limits<RealType>::signaling_NaN(),
202 std::numeric_limits<RealType>::signaling_NaN() ), Mesh.MaxVertexID() );
210 for(
int k = 0; k < 3; k++ )
213 check(Mesh.IsValidVertex(VID));
216 Displacements[VID] = DisplacementPolicy.GetVertexDisplacement(VID,
TriIndex);
219 Displacements[VID] =
VecType(0., 0., 0.);
225 SplitRequests.
SetNum( TriSplitRecords.
Num() );
228 NumNewTriangles.store(0);
238 CheckSplitAndEnqueue( TriIndex, 0 );
248 SplitRequests.
Sort();
251 for(
int32 i = 0; i < SplitRequests.
Num(); i++ )
253 TriSplitRecords[ SplitRequests[i] ].RequestIndex = i;
258 while( SplitRequests.
Num() )
260 SplitTriangle( SplitRequests.
Pop() );
269 SplitRequests.
SetNum( TriSplitRecords.
Num() );
272 NumNewTriangles.store(0);
277 CheckSplitAndEnqueue( FindRequests[i], Iter );
280 FindRequests.
Reset();
285 if( Options.
bCrackFree && Mesh.IsTriangleSoup())
291 FHashTable HashTable( 1 << FMath::FloorLog2( Mesh.MaxVertexID() ), Mesh.MaxVertexID() );
292 ParallelFor(
TEXT(
"TAdaptiveTessellator.HashVerts.PF"), Mesh.MaxVertexID(), 4096,
295 if (Mesh.IsValidVertex(i))
298 HashTable.Add_Concurrent( static_cast<uint32>(HashPosition(Mesh.GetVertexPosition(i))), i );
302 ParallelFor(
TEXT(
"TAdaptiveTessellator.HashVerts.PF"), Mesh.MaxVertexID(), 4096,
305 if (!Mesh.IsValidVertex(VID))
313 uint32 Hash =
static_cast<uint32>(HashPosition( Mesh.GetVertexPosition(VID) ));
316 if( Mesh.GetVertexPosition(VID) == Mesh.GetVertexPosition(
OtherIndex) )
327 if (Options.bFinalDisplace)
332 if (Mesh.IsValidVertex(VID))
334 if (ensure(VectorUtil::IsFinite(Displacements[VID])))
336 Mesh.SetVertexPosition(VID, Mesh.GetVertexPosition(VID) + Displacements[VID]);
343 Displacements.Empty();
344 check(Displacements.Max() == 0);
346 TriSplitRecords.Empty();
347 FindRequests.Empty();
348 SplitRequests.Empty();
383 if (VertexIndex >= Displacements.Num())
386 Displacements.AddUninitialized(1 + VertexIndex - Displacements.Num());
391 inline void GrowTriRecords(
int32 Num)
393 if (
Num > TriSplitRecords.Num())
395 TriSplitRecords.AddDefaulted(
Num - TriSplitRecords.Num());
401 VecType SplitBarycentrics;
402 int32 RequestIndex = -1;
417 const FOptions& Options;
424 std::atomic<uint32> NumSplits;
425 std::atomic<uint32> NumNewTriangles;
428template <
typename MeshT,
typename DisplacementPolicyT>
429inline void TAdaptiveTessellator<MeshT, DisplacementPolicyT>::FindSplitBVH(
uint32 TriIndex )
435 const VecType
Edge01 = P1 - P0;
436 const VecType
Edge12 = P2 - P1;
437 const VecType
Edge20 = P0 - P2;
451 const float SampleArea = EquilateralArea( Options.SampleRate );
479 Node.ErrorMin = 0.0f;
489 { 1.0f, 0.0f, 0.0f },
490 { 0.0f, 1.0f, 0.0f },
491 { 0.0f, 0.0f, 1.0f },
508 Node.ErrorMax >
BestError * 1.25f + Options.TargetError )
510 for(
uint32 ChildIndex = 0; ChildIndex < 4; ChildIndex++ )
521 ChildNode.TriX = Node.TriX * 2 + ( ChildIndex & 1 );
522 ChildNode.TriY = Node.TriY * 2 + ( ChildIndex >> 1 );
530 if( ChildIndex == 3 )
566 int32 NumSamples = 64;
587 for(
int32 i = 0; i < NumSamples; i++ )
596 Random.
X = RealType( i + 1 ) / RealType( NumSamples + 1 );
663 [&](
const FNode&
Node0,
const FNode& Node1 )
665 return Node0.ErrorMax > Node1.ErrorMax;
675 [&](
const FNode&
Node0,
const FNode& Node1 )
677 return Node0.ErrorMax > Node1.ErrorMax;
687template <
typename MeshT,
typename DisplacementPolicyT>
688inline void TAdaptiveTessellator<MeshT, DisplacementPolicyT>::SplitTriangle(
uint32 TriIndex )
691 TriSplitRecords[
TriIndex ].RequestIndex = -1;
696 if(
Barycentrics[ ( EdgeIndex + 2 ) % 3 ] == RealType(0) )
713 for(
int32 j = 0; j < 2; j++ )
722 VecType&
D = Displacements[
SplitInfo.NewVertIndex[1]];
735 check(TriSplitRecords.Num() <=
Mesh.MaxTriID());
737 for(
int32 j = 0; j < 2; j++ )
741 RemoveSplitRequest(
SplitInfo.OldTriIndex[j] );
743 AddFindRequest(
SplitInfo.OldTriIndex[j] );
744 AddFindRequest(
SplitInfo.NewTriIndex[j] );
746 TryDelaunayFlip(
SplitInfo.OldTriIndex[j], 1 );
747 TryDelaunayFlip(
SplitInfo.NewTriIndex[j], 2 );
764 GrowTriRecords(FMath::Max(
pokeInfo.NewTriIndex[1],
pokeInfo.NewTriIndex[2]) + 1);
778template <
typename MeshT,
typename DisplacementPolicyT>
779inline void TAdaptiveTessellator<MeshT, DisplacementPolicyT>::AddFindRequest(
int32 TriIndex )
782 int32& RequestIndex = TriSplitRecords[
TriIndex ].RequestIndex;
783 if( RequestIndex != -2 )
785 check( RequestIndex == -1 );
791template <
typename MeshT,
typename DisplacementPolicyT>
792inline void TAdaptiveTessellator<MeshT, DisplacementPolicyT>::CheckSplitAndEnqueue(
const int32 TriIndex,
const int32 Level )
794 TriSplitRecords[
TriIndex ].RequestIndex = -1;
796 if ( Options.RefinementMethod == ERefinementMethod::HierarchicalSplit )
810template <
typename MeshT,
typename DisplacementPolicyT>
822 TriSplitRecords[
TriIndex ].RequestIndex = NumSplits++;
827template <
typename MeshT,
typename DisplacementPolicyT>
828inline void TAdaptiveTessellator<MeshT, DisplacementPolicyT>::RemoveSplitRequest(
int32 TriIndex )
830 int32& RequestIndex = TriSplitRecords[
TriIndex ].RequestIndex;
831 if( RequestIndex >= 0 )
833 TriSplitRecords[ SplitRequests.Last() ].RequestIndex = RequestIndex;
839template <
typename MeshT,
typename DisplacementPolicyT>
840inline void TAdaptiveTessellator<MeshT, DisplacementPolicyT>::TryDelaunayFlip(
int32 TriIndex,
int32 TriEdgeIndex )
842 if( !CouldFlipEdge(
TriIndex, TriEdgeIndex ) )
848 const uint32 e1 = NextEdge(TriEdgeIndex);
849 const uint32 e2 = PrevEdge(TriEdgeIndex);
855 const VecType
Edge01 = P1 - P0;
856 const VecType
Edge12 = P2 - P1;
857 const VecType
Edge20 = P0 - P2;
#define check(expr)
Definition AssertionMacros.h:314
#define ensure( InExpression)
Definition AssertionMacros.h:464
#define CA_ASSUME(Expr)
Definition CoreMiscDefines.h:126
EParallelForFlags
Definition ParallelFor.h:47
void ParallelFor(int32 Num, TFunctionRef< void(int32)> Body, bool bForceSingleThread, bool bPumpRenderingThread=false)
Definition ParallelFor.h:481
uint64 Murmur64(std::initializer_list< uint64 > InitList)
Definition HashTable.h:60
uint32 Murmur32(std::initializer_list< uint32 > InitList)
Definition HashTable.h:43
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define TRACE_CPUPROFILER_EVENT_SCOPE_TEXT(Name)
Definition CpuProfilerTrace.h:532
#define MAX_flt
Definition NumericLimits.h:29
#define Split(a, ahi, alo)
Definition Predicates.inl:204
uint32 Size
Definition VulkanMemory.cpp:4034
Definition HashTable.h:210
UE_FORCEINLINE_HINT SizeType AddUninitialized()
Definition Array.h:1664
UE_REWRITE SizeType Num() const
Definition Array.h:1144
void Reset(SizeType NewSize=0)
Definition Array.h:2246
SizeType HeapPush(ElementType &&InItem, const PREDICATE_CLASS &Predicate)
Definition Array.h:3671
UE_REWRITE bool IsEmpty() const
Definition Array.h:1133
void HeapPop(ElementType &OutItem, const PREDICATE_CLASS &Predicate, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:3748
void SetNum(SizeType NewNum, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2308
void Init(const ElementType &Element, SizeType Number)
Definition Array.h:3043
ElementType Pop(EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:1196
UE_NODEBUG void Sort()
Definition Array.h:3418
Definition AdaptiveTessellator.h:58
typename MeshT::VecType VecType
Definition AdaptiveTessellator.h:163
typename MeshT::RealType RealType
Definition AdaptiveTessellator.h:162
TAdaptiveTessellator(MeshT &InMesh, DisplacementPolicyT &InDisplacementPolicy, const FOptions &InOptions)
Definition AdaptiveTessellator.h:189
ERefinementMethod
Definition AdaptiveTessellator.h:156
ECompressionLevel Level
Definition OodleDataCompression.cpp:70
constexpr int InvalidID
Definition IndexTypes.h:13
const FName EdgeIndex("EdgeIndex")
Definition MeshAttributes.h:40
const FName VertexIndex("VertexIndex")
Definition MeshAttributes.h:28
double SizeSquared(const T &Value)
Definition SplineMath.h:172
bool IsFinite(const TVector2< RealType > &V)
Definition VectorUtil.h:42
Definition AdvancedWidgetsModule.cpp:13
static constexpr UE_FORCEINLINE_HINT T Square(const T A)
Definition UnrealMathUtility.h:578
static constexpr UE_FORCEINLINE_HINT int32 Min3Index(const T A, const T B, const T C)
Definition UnrealMathUtility.h:571
Definition AdaptiveTessellator.h:29
FIndex2i OldTriIndex
Definition AdaptiveTessellator.h:31
FIndex2i NewVertIndex
Definition AdaptiveTessellator.h:33
FIndex2i NewTriIndex
Definition AdaptiveTessellator.h:32
Definition AdaptiveTessellator.h:45
FIndex2i SharedEdge
Definition AdaptiveTessellator.h:48
FIndex2i Triangles
Definition AdaptiveTessellator.h:47
Definition IndexTypes.h:27
Definition IndexTypes.h:158
Definition AdaptiveTessellator.h:37
FIndex3i NewTriIndex
Definition AdaptiveTessellator.h:39
int32 NewVertIndex
Definition AdaptiveTessellator.h:41
FIndex3i EdgeIndex
Definition AdaptiveTessellator.h:40
Definition AdaptiveTessellator.h:166
RealType SampleRate
Definition AdaptiveTessellator.h:172
bool bSingleThreaded
Definition AdaptiveTessellator.h:185
bool bFinalDisplace
Definition AdaptiveTessellator.h:178
ERefinementMethod RefinementMethod
Definition AdaptiveTessellator.h:183
bool bCrackFree
Definition AdaptiveTessellator.h:175
uint32 MaxTriangles
Definition AdaptiveTessellator.h:181
RealType TargetError
Definition AdaptiveTessellator.h:168
T X
Definition Vector2D.h:49