UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
DenseGrid3.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3// Port of geometry3Sharp DenseGrid3
4
5#pragma once
6
7#include "CoreMinimal.h"
8#include "BoxTypes.h"
9#include "IntBoxTypes.h"
10
11#include "HAL/PlatformAtomics.h"
12
13namespace UE
14{
15namespace Geometry
16{
17
21template<typename ElemType>
23{
24protected:
27
30
31public:
36 {
37 }
38
39 TDenseGrid3(int DimX, int DimY, int DimZ, ElemType InitialValue)
40 {
42 Assign(InitialValue);
43 }
44
45 int Size() const
46 {
48 }
49
50 bool IsValidIndex(const FVector3i& Index) const
51 {
52 return Index.X >= 0 && Index.Y >= 0 && Index.Z >= 0
53 && Index.X < Dimensions.X && Index.Y < Dimensions.Y && Index.Z < Dimensions.Z;
54 }
55
56 const FVector3i& GetDimensions() const
57 {
58 return Dimensions;
59 }
60
68 FORCEINLINE void Resize(int DimX, int DimY, int DimZ, bool bAllowShrinking)
69 {
71 }
72
73 void Assign(ElemType Value)
74 {
75 for (int i = 0; i < Buffer.Num(); ++i)
76 {
77 Buffer[i] = Value;
78 }
79 }
80
81 void SetMin(const FVector3i& IJK, ElemType F)
82 {
83 int Idx = IJK.X + Dimensions.X * (IJK.Y + Dimensions.Y * IJK.Z);
84 if (F < Buffer[Idx])
85 {
86 Buffer[Idx] = F;
87 }
88 }
89 void SetMax(const FVector3i& IJK, ElemType F)
90 {
91 int Idx = IJK.X + Dimensions.X * (IJK.Y + Dimensions.Y * IJK.Z);
92 if (F > Buffer[Idx])
93 {
94 Buffer[Idx] = F;
95 }
96 }
97
98 constexpr ElemType& operator[](int Idx)
99 {
100 return Buffer[Idx];
101 }
102 constexpr const ElemType& operator[](int Idx) const
103 {
104 return Buffer[Idx];
105 }
106
107 constexpr ElemType& operator[](FVector3i Idx)
108 {
109 return Buffer[Idx.X + Dimensions.X * (Idx.Y + Dimensions.Y * Idx.Z)];
110 }
111 constexpr const ElemType& operator[](FVector3i Idx) const
112 {
113 return Buffer[Idx.X + Dimensions.X * (Idx.Y + Dimensions.Y * Idx.Z)];
114 }
115 constexpr ElemType& At(int I, int J, int K)
116 {
117 return Buffer[I + Dimensions.X * (J + Dimensions.Y * K)];
118 }
119 constexpr const ElemType& At(int I, int J, int K) const
120 {
121 return Buffer[I + Dimensions.X * (J + Dimensions.Y * K)];
122 }
123
125 {
126 return Buffer;
127 }
129 {
130 return Buffer;
131 }
132
136 ElemType GetValue(int32 X, int32 Y, int32 Z) const
137 {
138 return Buffer[X + Dimensions.X * (Y + Dimensions.Y * Z)];
139 }
140
144 ElemType GetValue(const FVector3i& CellCoords) const
145 {
147 }
148
152 void SetValue(int32 X, int32 Y, int32 Z, ElemType NewValue)
153 {
154 Buffer[X + Dimensions.X * (Y + Dimensions.Y * Z)] = NewValue;
155 }
156
160 void SetValue(const FVector3i& CellCoords, ElemType NewValue)
161 {
162 Buffer[CellCoords.X + Dimensions.X * (CellCoords.Y + Dimensions.Y * CellCoords.Z)] = NewValue;
163 }
164
169 template<typename ProcessFunc>
171 {
172 int32 Index = X + Dimensions.X * (Y + Dimensions.Y * Z);
173 ElemType& CurValue = Buffer[Index];
174 Func(CurValue);
175 }
176
181 template<typename ProcessFunc>
183 {
185 ElemType& CurValue = Buffer[Index];
186 Func(CurValue);
187 }
188
189
190
191 void GetXPair(int X0, int Y, int Z, ElemType& AOut, ElemType& BOut) const
192 {
193 int Offset = Dimensions.X * (Y + Dimensions.Y * Z);
194 AOut = Buffer[Offset + X0];
195 BOut = Buffer[Offset + X0 + 1];
196 }
197
198 void Apply(TFunctionRef<ElemType(ElemType)> F)
199 {
200 for (int Idx = 0, Num = Size(); Idx < Num; Idx++)
201 {
202 Buffer[Idx] = F(Buffer[Idx]);
203 }
204 }
205
207 {
208 return FAxisAlignedBox3i({0, 0, 0},{Dimensions.X, Dimensions.Y, Dimensions.Z});
209 }
211 {
212 return FAxisAlignedBox3i({0, 0, 0},{Dimensions.X-1, Dimensions.Y-1, Dimensions.Z-1});
213 }
214
215 FVector3i ToIndex(int Idx) const
216 {
217 int x = Idx % Dimensions.X;
218 int y = (Idx / Dimensions.X) % Dimensions.Y;
219 int z = Idx / (Dimensions.X * Dimensions.Y);
220 return FVector3i(x, y, z);
221 }
222 int ToLinear(int X, int Y, int Z) const
223 {
224 return X + Dimensions.X * (Y + Dimensions.Y * Z);
225 }
226 int ToLinear(const FVector3i& IJK) const
227 {
228 return IJK.X + Dimensions.X * (IJK.Y + Dimensions.Y * IJK.Z);
229 }
230};
231
232
236
237// additional utility functions
238namespace DenseGrid
239{
240
241 inline void AtomicIncrement(FDenseGrid3i& Grid, int i, int j, int k)
242 {
243 FPlatformAtomics::InterlockedIncrement(&Grid.At(i,j,k));
244 }
245
246 inline void AtomicDecrement(FDenseGrid3i& Grid, int i, int j, int k)
247 {
248 FPlatformAtomics::InterlockedDecrement(&Grid.At(i, j, k));
249 }
250
251 inline void AtomicIncDec(FDenseGrid3i& Grid, int i, int j, int k, bool bDecrement = false)
252 {
253 if (bDecrement)
254 {
255 FPlatformAtomics::InterlockedDecrement(&Grid.At(i, j, k));
256 }
257 else
258 {
259 FPlatformAtomics::InterlockedIncrement(&Grid.At(i, j, k));
260 }
261 }
262}
263
264} // end namespace UE::Geometry
265} // end namespace UE
EAllowShrinking
Definition AllowShrinking.h:10
#define UE_ALLOWSHRINKING_BOOL_DEPRECATED(FunctionName)
Definition AllowShrinking.h:31
#define FORCEINLINE
Definition AndroidPlatform.h:140
#define check(expr)
Definition AssertionMacros.h:314
FPlatformTypes::int64 int64
A 64-bit signed integer.
Definition Platform.h:1127
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define X(Name, Desc)
Definition FormatStringSan.h:47
@ Num
Definition MetalRHIPrivate.h:234
uint32 Offset
Definition VulkanMemory.cpp:4033
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
void SetNumUninitialized(SizeType NewNum, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2369
Definition AssetRegistryState.h:50
Definition DenseGrid3.h:23
TArray< ElemType > & GridValues()
Definition DenseGrid3.h:124
void SetValue(const FVector3i &CellCoords, ElemType NewValue)
Definition DenseGrid3.h:160
ElemType GetValue(const FVector3i &CellCoords) const
Definition DenseGrid3.h:144
void SetMax(const FVector3i &IJK, ElemType F)
Definition DenseGrid3.h:89
void SetMin(const FVector3i &IJK, ElemType F)
Definition DenseGrid3.h:81
constexpr const ElemType & operator[](int Idx) const
Definition DenseGrid3.h:102
constexpr const ElemType & At(int I, int J, int K) const
Definition DenseGrid3.h:119
void SetValue(int32 X, int32 Y, int32 Z, ElemType NewValue)
Definition DenseGrid3.h:152
bool IsValidIndex(const FVector3i &Index) const
Definition DenseGrid3.h:50
FAxisAlignedBox3i BoundsInclusive() const
Definition DenseGrid3.h:210
TArray< ElemType > Buffer
Definition DenseGrid3.h:26
ElemType GetValue(int32 X, int32 Y, int32 Z) const
Definition DenseGrid3.h:136
int ToLinear(const FVector3i &IJK) const
Definition DenseGrid3.h:226
void ProcessValue(int32 X, int32 Y, int32 Z, ProcessFunc Func)
Definition DenseGrid3.h:170
const TArray< ElemType > & GridValues() const
Definition DenseGrid3.h:128
int ToLinear(int X, int Y, int Z) const
Definition DenseGrid3.h:222
const FVector3i & GetDimensions() const
Definition DenseGrid3.h:56
void Apply(TFunctionRef< ElemType(ElemType)> F)
Definition DenseGrid3.h:198
TDenseGrid3(int DimX, int DimY, int DimZ, ElemType InitialValue)
Definition DenseGrid3.h:39
constexpr ElemType & operator[](int Idx)
Definition DenseGrid3.h:98
void Assign(ElemType Value)
Definition DenseGrid3.h:73
FVector3i ToIndex(int Idx) const
Definition DenseGrid3.h:215
void GetXPair(int X0, int Y, int Z, ElemType &AOut, ElemType &BOut) const
Definition DenseGrid3.h:191
constexpr ElemType & At(int I, int J, int K)
Definition DenseGrid3.h:115
void Resize(int DimX, int DimY, int DimZ, EAllowShrinking AllowShrinking=EAllowShrinking::Default)
Definition DenseGrid3.h:61
constexpr ElemType & operator[](FVector3i Idx)
Definition DenseGrid3.h:107
constexpr const ElemType & operator[](FVector3i Idx) const
Definition DenseGrid3.h:111
TDenseGrid3()
Definition DenseGrid3.h:35
FVector3i Dimensions
Definition DenseGrid3.h:29
int Size() const
Definition DenseGrid3.h:45
FAxisAlignedBox3i Bounds() const
Definition DenseGrid3.h:206
void ProcessValue(const FVector3i &CellCoords, ProcessFunc Func)
Definition DenseGrid3.h:182
void AtomicDecrement(FDenseGrid2i &Grid, int32 i, int32 j)
Definition DenseGrid2.h:202
void AtomicIncrement(FDenseGrid2i &Grid, int32 i, int32 j)
Definition DenseGrid2.h:197
void AtomicIncDec(FDenseGrid2i &Grid, int32 i, int32 j, bool bDecrement=false)
Definition DenseGrid2.h:207
TDenseGrid3< int > FDenseGrid3i
Definition DenseGrid3.h:235
TDenseGrid3< float > FDenseGrid3f
Definition DenseGrid3.h:233
TDenseGrid3< double > FDenseGrid3d
Definition DenseGrid3.h:234
Definition AdvancedWidgetsModule.cpp:13
U16 Index
Definition radfft.cpp:71
Definition IntBoxTypes.h:184
Definition IntVectorTypes.h:252
int32 Z
Definition IntVectorTypes.h:257
int32 X
Definition IntVectorTypes.h:257
int32 Y
Definition IntVectorTypes.h:257