// Copyright 2020 Phyronnaz #pragma once #include "CoreMinimal.h" #include "VoxelEnums.h" #include "VoxelValue.h" struct VOXEL_API FVoxelDistanceFieldUtilities { public: FORCEINLINE static bool IsSurfacePositionValid(const FVector3f& P) { return P.X < 1e9; } FORCEINLINE static FVector3f MakeInvalidSurfacePosition() { return FVector3f(1e9); } public: static FColor GetDistanceFieldColor(float Value); public: static void JumpFlood(const FIntVector& Size, TArray& InOutPackedPositions, EVoxelComputeDevice Device, bool bMultiThreaded = false, int32 MaxPasses_Debug = -1); // Only the InOutDistances sign will be used, not their actual values static void GetDistancesFromSurfacePositions(const FIntVector& Size, TArrayView SurfacePositions, TArrayView InOutDistances); public: // OutDistances will only have the signs of the values // Note: densities need to match Size + 2, so that all neighbors can be queried! template static void GetSurfacePositionsFromDensities( const FIntVector& Size, TArrayView Densities, TArrayView OutDistances, TArrayView OutSurfacePositions, TLambda GetFloatFromT); static void GetSurfacePositionsFromDensities(const FIntVector& Size, TArrayView Densities, TArrayView OutDistances, TArrayView OutSurfacePositions); static void GetSurfacePositionsFromDensities(const FIntVector& Size, TArrayView Densities, TArrayView OutDistances, TArrayView OutSurfacePositions); static void GetSurfacePositionsFromDensities(const FIntVector& Size, TArrayView Densities, TArray& OutDistances, TArray& OutSurfacePositions); public: // Must be called BEFORE JumpFlood // bShrink: if true, will bias towards shrinking the distance field. If false, will bias towards growing it // TODO Doesn't work well, signs are leaking & wrongs on the borders static void DownSample( const FIntVector& Size, TArrayView InDistances, TArrayView InSurfacePositions, TArrayView OutDistances, TArrayView OutSurfacePositions, int32 Divisor, bool bShrink); static void DownSample( FIntVector& Size, TArray& Distances, TArray& SurfacePositions, int32 Divisor, bool bShrink); private: static void JumpFloodStep_CPU(const FIntVector& Size, TArrayView InData, TArrayView OutData, int32 Step, bool bMultiThreaded); };