5#include "CoreMinimal.h"
6#include "Kismet/BlueprintFunctionLibrary.h"
7#include "IVSmokeGridLibrary.generated.h"
28 UFUNCTION(BlueprintPure, Category =
"IVSmoke | Math")
29 static FORCEINLINE int32 GridToIndex(const FIntVector& GridPos, const FIntVector& Resolution)
31 return GridPos.X + (GridPos.Y * Resolution.X) + (GridPos.Z * Resolution.X * Resolution.Y);
41 UFUNCTION(BlueprintPure, Category =
"IVSmoke | Math")
42 static FORCEINLINE FIntVector IndexToGrid(int32 Index, const FIntVector& Resolution)
44 if (Resolution.X <= 0 || Resolution.Y <= 0 || Resolution.Z <= 0)
46 return FIntVector::ZeroValue;
49 const int32 BaseArea = Resolution.X * Resolution.Y;
50 const int32 Z = Index / BaseArea;
51 const int32 Remainder = Index % BaseArea;
52 const int32 Y = Remainder / Resolution.X;
53 const int32 X = Remainder % Resolution.X;
55 return FIntVector(X, Y, Z);
66 UFUNCTION(BlueprintPure, Category =
"IVSmoke | Math")
67 static FORCEINLINE FVector GridToLocal(const FIntVector& GridPos,
float VoxelSize, const FIntVector& CenterOffset)
70 (GridPos.X - CenterOffset.X) * VoxelSize,
71 (GridPos.Y - CenterOffset.Y) * VoxelSize,
72 (GridPos.Z - CenterOffset.Z) * VoxelSize
85 UFUNCTION(BlueprintPure, Category =
"IVSmoke | Math")
86 static FORCEINLINE FIntVector LocalToGrid(const FVector& LocalPos,
float VoxelSize, const FIntVector& CenterOffset, const FIntVector& Resolution)
88 if (VoxelSize <= UE_SMALL_NUMBER)
90 return InvalidGridPos;
93 const int32 X = FMath::RoundToInt(LocalPos.X / VoxelSize) + CenterOffset.X;
94 const int32 Y = FMath::RoundToInt(LocalPos.Y / VoxelSize) + CenterOffset.Y;
95 const int32 Z = FMath::RoundToInt(LocalPos.Z / VoxelSize) + CenterOffset.Z;
97 if (X >= 0 && X < Resolution.X &&
98 Y >= 0 && Y < Resolution.Y &&
99 Z >= 0 && Z < Resolution.Z)
101 return FIntVector(X, Y, Z);
104 return InvalidGridPos;
119 return GridToVoxelBitIndex(GridPos.Y, GridPos.Z, Resolution.Y);
132 return Y + (Z * ResolutionY);
144 static FORCEINLINE
bool IsVoxelBitSet(
const TArray<uint64>& VoxelBitArray,
const FIntVector& GridPos,
const FIntVector& Resolution)
147 check(Resolution.X >= 0 && Resolution.X < 64 &&
148 Resolution.Y >= 0 && Resolution.Y < 64 &&
149 Resolution.Z >= 0 && Resolution.Z < 64);
151 const int32 Index = GridToVoxelBitIndex(GridPos, Resolution);
153 if (!VoxelBitArray.IsValidIndex(Index))
158 return VoxelBitArray[Index] & (1ULL << GridPos.X);
169 static FORCEINLINE
void SetVoxelBit(TArray<uint64>& VoxelBitArray, int32 Index,
const FIntVector& Resolution,
bool bValue)
171 const FIntVector GridPos = IndexToGrid(Index, Resolution);
172 SetVoxelBit(VoxelBitArray, GridPos, Resolution, bValue);
184 static FORCEINLINE
void SetVoxelBit(TArray<uint64>& VoxelBitArray,
const FIntVector& GridPos,
const FIntVector& Resolution,
bool bValue)
187 check(Resolution.X >= 0 && Resolution.X < 64 &&
188 Resolution.Y >= 0 && Resolution.Y < 64 &&
189 Resolution.Z >= 0 && Resolution.Z < 64);
191 const int32 Index = GridToVoxelBitIndex(GridPos, Resolution);
193 if (!VoxelBitArray.IsValidIndex(Index))
200 VoxelBitArray[Index] |= (1ULL << GridPos.X);
204 VoxelBitArray[Index] &= ~(1ULL << GridPos.X);
215 static FORCEINLINE
void ToggleVoxelBit(TArray<uint64>& VoxelBitArray, int32 Index,
const FIntVector& Resolution)
217 const FIntVector GridPos = IndexToGrid(Index, Resolution);
218 ToggleVoxelBit(VoxelBitArray, GridPos, Resolution);
229 static FORCEINLINE
void ToggleVoxelBit(TArray<uint64>& VoxelBitArray,
const FIntVector& GridPos,
const FIntVector& Resolution)
232 check(Resolution.X >= 0 && Resolution.X < 64 &&
233 Resolution.Y >= 0 && Resolution.Y < 64 &&
234 Resolution.Z >= 0 && Resolution.Z < 64);
236 const int32 Index = GridToVoxelBitIndex(GridPos, Resolution);
238 if (!VoxelBitArray.IsValidIndex(Index))
243 VoxelBitArray[Index] ^= (1ULL << GridPos.X);
static FORCEINLINE int32 GridToVoxelBitIndex(int32 Y, int32 Z, int32 ResolutionY)
static FORCEINLINE void SetVoxelBit(TArray< uint64 > &VoxelBitArray, int32 Index, const FIntVector &Resolution, bool bValue)
static FORCEINLINE void SetVoxelBit(TArray< uint64 > &VoxelBitArray, const FIntVector &GridPos, const FIntVector &Resolution, bool bValue)
static FORCEINLINE void ToggleVoxelBit(TArray< uint64 > &VoxelBitArray, int32 Index, const FIntVector &Resolution)
static FORCEINLINE void ToggleVoxelBit(TArray< uint64 > &VoxelBitArray, const FIntVector &GridPos, const FIntVector &Resolution)
static FORCEINLINE bool IsVoxelBitSet(const TArray< uint64 > &VoxelBitArray, const FIntVector &GridPos, const FIntVector &Resolution)
static const FIntVector InvalidGridPos
static FORCEINLINE int32 GridToVoxelBitIndex(const FIntVector &GridPos, const FIntVector &Resolution)