10#include "Containers/Array.h"
13#include "Containers/Map.h"
286 return ((
int64)Idx.
X&0xFFFF) | (((
int64)Idx.
Y&0xFFFF) << 16) | (((
int64)Idx.
Z&0xFFFF) << 32);
290 return ((
int64)
X & 0xFFFF) | (((
int64)
Y & 0xFFFF) << 16) | (((
int64)
Z & 0xFFFF) << 32);
400 if (CurrentValue != FMathf::MaxReal)
402 return (
double)CurrentValue;
410 return (
double)CurrentValue;
420 if (CurrentValue != FMathf::MaxReal)
422 return (
double)CurrentValue;
430 return (
double)CurrentValue;
444 for (
int i = 0; i < 8; ++i)
474 for (
int i = 0; i < 8; ++i)
556 for (int yi = 0; yi < CellDimensions.Y; ++yi)
563 FVector3i Idx(0, yi, ZIdx);
564 initialize_cell(Cell, Idx);
565 polygonize_cell(Cell, vertTArray);
566 for (int XIdx = 1; XIdx < CellDimensions.X; ++XIdx)
568 shift_cell_x(Cell, XIdx);
569 polygonize_cell(Cell, vertTArray);
591 for (
int yi = 0;
yi < CellDimensions.Y; ++
yi)
599 initialize_cell(
Cell, Idx);
622 BlockedDoneCells.Reset(CellDimensions.X, CellDimensions.Y, CellDimensions.Z, 0);
636 while ( stack.
Num() > 0 )
645 initialize_cell(
Cell, Idx);
686 parallel_mesh_access =
true;
698 if ( BlockedDoneCells.IsValidIndex(
seed_idx) && set_cell_if_not_done(
seed_idx) )
713 FVector3i InitialCellIndex = ActiveCells[Idx];
731 initialize_cell(
TempCell, CellIndex);
766 parallel_mesh_access =
false;
802 for (
int i = 0; i < 8; ++i)
804 if (
Cell.f[i] < IsoValue)
822 for (
int i = 0; i <= 11; i++)
826 int a = EdgeIndices[i][0], b = EdgeIndices[i][1];
839 int ta = int(tris & 0xf);
840 int tb = int((tris >> 4) & 0xf);
841 int tc = int((tris >> 8) & 0xf);
847 if (!
ensure(a != b && a != c && b != c))
872 return (
int32)(hash % (NumVertexSections - 1));
880 int SectionIndex = GetVertexSectionIndex(
CellHash);
881 int32 NewIndex = VertexCounter++;
883 if (parallel_mesh_access)
902 return (
int32)(hash % (NumTriangleSections - 1));
910 int SectionIndex = GetTriangleSectionIndex(
CellHash);
911 if (parallel_mesh_access)
928 VertexSectionLocks.
SetNum((
int32)NumVertexSections);
929 VertexSectionLists.
Reset();
930 VertexSectionLists.
SetNum((
int32)NumVertexSections);
933 TriangleSectionLocks.
SetNum((
int32)NumTriangleSections);
934 TriangleSectionLists.
Reset();
935 TriangleSectionLists.
SetNum((
int32)NumTriangleSections);
946 int32 NumVertices = VertexCounter;
956 for (
int32 k = 0; k < NumVertices; ++k)
965 AppendTriangle(Tri.A, Tri.B, Tri.C);
984 const double dt = 0.999999;
987 PIso = (P1 + P2) * 0.5;
990 if (FMath::Abs(IsoValue -
ValP1) < 0.00001)
995 if (FMath::Abs(IsoValue -
ValP2) < 0.00001)
1012 if (RootMode == ERootfindingModes::Bisection)
1014 for (
int k = 0; k < RootModeSteps; ++k)
1016 PIso.
X = (a.
X + b.X) * 0.5;
PIso.Y = (a.
Y + b.Y) * 0.5;
PIso.Z = (a.
Z + b.Z) * 0.5;
1018 if (
mid_f < IsoValue)
1033 if (RootMode == ERootfindingModes::LerpSteps)
1035 for (
int k = 0; k < RootModeSteps; ++k)
1042 if (
mid_f < IsoValue)
#define ensure( InExpression)
Definition AssertionMacros.h:464
void ParallelFor(int32 Num, TFunctionRef< void(int32)> Body, bool bForceSingleThread, bool bPumpRenderingThread=false)
Definition ParallelFor.h:481
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define TRACE_CPUPROFILER_EVENT_SCOPE(Name)
Definition CpuProfilerTrace.h:528
UE::FPlatformRecursiveMutex FCriticalSection
Definition CriticalSection.h:53
const bool
Definition NetworkReplayStreaming.h:178
USkinnedMeshComponent float
Definition SkinnedMeshComponent.h:60
FRWLock Lock
Definition UnversionedPropertySerialization.cpp:921
Definition ScopeLock.h:141
Definition ArrayView.h:139
UE_REWRITE SizeType Num() const
Definition Array.h:1144
void RemoveAt(SizeType Index, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2083
void Reset(SizeType NewSize=0)
Definition Array.h:2246
void SetNum(SizeType NewNum, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2308
UE_NODEBUG UE_FORCEINLINE_HINT SizeType Add(ElementType &&Item)
Definition Array.h:2696
UE_NODEBUG UE_FORCEINLINE_HINT bool Find(const ElementType &Item, SizeType &Index) const
Definition Array.h:1302
Definition AndroidPlatformMisc.h:14
static RealType Clamp(const RealType Value, const RealType ClampMin, const RealType ClampMax)
Definition MathUtil.h:222
Definition MarchingCubes.h:51
TArray< FCriticalSection > EdgeVertexSectionLocks
Definition MarchingCubes.h:324
int GetVertexSectionIndex(int64 hash)
Definition MarchingCubes.h:870
FVector3i cell_index(const TVector< double > &Pos)
Definition MarchingCubes.h:268
TArray< TArray< FIndexedVertex > > VertexSectionLists
Definition MarchingCubes.h:869
FBlockedDenseGrid3f BlockedCornerValuesGrid
Definition MarchingCubes.h:387
double corner_value_grid(const FVector3i &Idx)
Definition MarchingCubes.h:412
void ResetMesh()
Definition MarchingCubes.h:926
void corner_pos(const FVector3i &IJK, TVector< double > &Pos)
Definition MarchingCubes.h:256
void generate_basic()
Definition MarchingCubes.h:584
int64 edge_hash(const FVector3i &Idx1, const FVector3i &Idx2)
Definition MarchingCubes.h:297
int SafetyMaxDimension
Definition MarchingCubes.h:92
const int64 EDGE_Z
Definition MarchingCubes.h:295
TFunction< bool(void)> CancelF
Definition MarchingCubes.h:106
const int64 NumEdgeVertexSections
Definition MarchingCubes.h:322
void generate_parallel()
Definition MarchingCubes.h:547
void InitHashTables()
Definition MarchingCubes.h:532
double CubeSize
Definition MarchingCubes.h:74
virtual ~FMarchingCubes()
Definition MarchingCubes.h:122
FAxisAlignedBox3i GridBounds
Definition MarchingCubes.h:228
FMeshShapeGenerator & Generate() override
Definition MarchingCubes.h:134
double IsoValue
Definition MarchingCubes.h:62
int edge_vertex_id(const FVector3i &Idx1, const FVector3i &Idx2, double F1, double F2)
Definition MarchingCubes.h:349
ERootfindingModes RootMode
Definition MarchingCubes.h:97
void find_iso(const TVector< double > &P1, const TVector< double > &P2, double ValP1, double ValP2, TVector< double > &PIso)
Definition MarchingCubes.h:975
double corner_value_grid_parallel(const FVector3i &Idx)
Definition MarchingCubes.h:389
bool bParallelCompute
Definition MarchingCubes.h:80
void shift_cell_x(FGridCell &Cell, int XIdx)
Definition MarchingCubes.h:511
TAxisAlignedBox3< double > Bounds
Definition MarchingCubes.h:68
int GetTriangleSectionIndex(int64 hash)
Definition MarchingCubes.h:900
void initialize_cell(FGridCell &Cell, const FVector3i &Idx)
Definition MarchingCubes.h:486
FMarchingCubes()
Definition MarchingCubes.h:116
std::atomic< int32 > VertexCounter
Definition MarchingCubes.h:865
void SetDimensions()
Definition MarchingCubes.h:240
int FindVertexID(int64 hash)
Definition MarchingCubes.h:326
TFunction< double(TVector< double >)> Implicit
Definition MarchingCubes.h:56
FAxisAlignedBox3i LastGridBounds
Definition MarchingCubes.h:229
void BuildMesh()
Definition MarchingCubes.h:942
FVector3i CellDimensions
Definition MarchingCubes.h:113
TArray< TMap< int64, int > > EdgeVertexSections
Definition MarchingCubes.h:323
bool Validate()
Definition MarchingCubes.h:126
int64 corner_hash(const FVector3i &Idx)
Definition MarchingCubes.h:284
void append_triangle(int A, int B, int C, int64 CellHash)
Definition MarchingCubes.h:908
bool set_cell_if_not_done(const FVector3i &Idx)
Definition MarchingCubes.h:772
int64 corner_hash(int X, int Y, int Z)
Definition MarchingCubes.h:288
bool polygonize_cell(FGridCell &Cell, int VertIndexArray[])
Definition MarchingCubes.h:795
int AppendOrFindVertexID(int64 hash, TVector< double > Pos)
Definition MarchingCubes.h:334
void initialize_cell_values_grid(FGridCell &Cell, bool Shift)
Definition MarchingCubes.h:433
int append_vertex(TVector< double > V, int64 CellHash)
Definition MarchingCubes.h:878
FBlockedDenseGrid3i BlockedDoneCells
Definition MarchingCubes.h:770
bool parallel_mesh_access
Definition MarchingCubes.h:541
TVector< double > corner_pos(const FVector3i &IJK)
Definition MarchingCubes.h:262
const int64 EDGE_Y
Definition MarchingCubes.h:294
TArray< TArray< FIndex3i > > TriangleSectionLists
Definition MarchingCubes.h:899
bool bEnableValueCaching
Definition MarchingCubes.h:87
void initialize_cell_values_nohash(FGridCell &Cell, bool Shift)
Definition MarchingCubes.h:463
void generate_continuation_parallel(TArrayView< const FVector3d > Seeds)
Definition MarchingCubes.h:668
FMeshShapeGenerator & GenerateContinuation(TArrayView< const FVector3d > Seeds)
Definition MarchingCubes.h:169
int RootModeSteps
Definition MarchingCubes.h:102
const int64 EDGE_X
Definition MarchingCubes.h:293
void generate_continuation(TArrayView< const FVector3d > Seeds)
Definition MarchingCubes.h:617
TArray< FCriticalSection > VertexSectionLocks
Definition MarchingCubes.h:868
double corner_value_nohash(const FVector3i &Idx)
Definition MarchingCubes.h:458
TArray< FCriticalSection > TriangleSectionLocks
Definition MarchingCubes.h:898
Definition MeshShapeGenerator.h:19
void SetValue(int32 I, int32 J, int32 K, ElemType NewValue)
Definition BlockedDenseGrid3.h:336
ElemType GetValue(int32 I, int32 J, int32 K) const
Definition BlockedDenseGrid3.h:319
void Resize(int32 DimI, int32 DimJ, int32 DimK)
Definition BlockedDenseGrid3.h:795
void Reset()
Definition BlockedDenseGrid3.h:807
void SetValueThreadSafe(int32 I, int32 J, int32 K, ElemType NewValue)
Definition BlockedDenseGrid3.h:848
ElemType GetValueThreadSafe(int32 I, int32 J, int32 K)
Definition BlockedDenseGrid3.h:832
void ProcessValueThreadSafe(int32 I, int32 J, int32 K, ProcessFunc Func)
Definition BlockedDenseGrid3.h:869
constexpr int InvalidID
Definition IndexTypes.h:13
GEOMETRYCORE_API const FVector3i GridOffsets6[6]
Definition IndexUtil.cpp:24
ERootfindingModes
Definition MarchingCubes.h:44
Definition AdvancedWidgetsModule.cpp:13
static constexpr UE_FORCEINLINE_HINT T Max3(const T A, const T B, const T C)
Definition UnrealMathUtility.h:551
Definition IntBoxTypes.h:184
Definition IndexTypes.h:158
Definition MarchingCubes.h:234
double f[8]
Definition MarchingCubes.h:237
FVector3i i[8]
Definition MarchingCubes.h:236
Definition MarchingCubes.h:861
FVector3d Position
Definition MarchingCubes.h:863
int32 Index
Definition MarchingCubes.h:862
Definition IntVectorTypes.h:252
static FVector3i Zero()
Definition IntVectorTypes.h:326
int32 Z
Definition IntVectorTypes.h:257
int32 X
Definition IntVectorTypes.h:257
int32 Y
Definition IntVectorTypes.h:257
Definition BoxTypes.h:247
RealType Depth() const
Definition BoxTypes.h:578
RealType Width() const
Definition BoxTypes.h:568
bool IsEmpty() const
Definition BoxTypes.h:613
RealType MaxDim() const
Definition BoxTypes.h:598
RealType Height() const
Definition BoxTypes.h:573
TVector< RealType > Min
Definition BoxTypes.h:248
T Z
Definition Vector.h:68
static TVector< T > Zero()
Definition Vector.h:112
T Y
Definition Vector.h:65
T X
Definition Vector.h:62