134 template<
typename MeshType,
typename GetTriangleIDFuncType>
147 template<
typename MeshType,
typename GetTriangleIDFuncType>
166 const double TexelDiag = TexelSize.Length();
178 for (int32 ImgX = 0; ImgX < Tile.GetWidth(); ++ImgX)
180 const FVector2i SourceCoords = Tile.GetSourceCoords(ImgX, ImgY);
181 const int64 SourceTexelLinearIdx = Dimensions.GetIndex(SourceCoords.X, SourceCoords.Y);
182 const int64 TexelLinearIdx = Tile.GetIndex(ImgX, ImgY);
183 const FVector2d SourceTexelCenterUV = Dimensions.GetTexelUV(SourceTexelLinearIdx);
185 for (int32 Sample = 0; Sample < PixelSampler.Num(); ++Sample)
187 const int64 SampleLinearIdx = TexelLinearIdx * PixelSampler.Num() + Sample;
188 const FVector2d SampleUV = PixelSampler.Sample(Sample);
189 const FVector2d UVPoint = SourceTexelCenterUV - 0.5 * TexelSize + SampleUV * TexelSize;
190 const FVector3d UVPoint3d(UVPoint.X, UVPoint.Y, 0);
193 const int32 NearestTriID = UVSpaceMeshSpatial.FindNearestTriangle(UVPoint3d, NearDistSqr, QueryOptions);
194 if (NearestTriID >= 0)
197 UVSpaceMesh.GetTriVertices(NearestTriID, A, B, C);
198 const FTriangle2d UVTriangle(GetXY(A), GetXY(B), GetXY(C));
200 const int32 TriId = GetTriangleIDFunc(NearestTriID);
201 if (UVTriangle.IsInsideOrOn(UVPoint))
203 TexelType[SampleLinearIdx] = InteriorTexel;
204 TexelQueryUV[SampleLinearIdx] = (FVector2f)UVPoint;
205 TexelQueryTriangle[SampleLinearIdx] = TriId;
206 ++TexelInteriorSamples[TexelLinearIdx];
208 else if (NearDistSqr < TexelDiag * TexelDiag)
210 const FDistPoint3Triangle3d DistQuery = TMeshQueries<MeshType>::TriangleDistance(UVSpaceMesh, NearestTriID, UVPoint3d);
211 FVector2d NearestUV = GetXY(DistQuery.ClosestTrianglePoint);
215 NearestUV += (10.0 * FMathf::ZeroTolerance) * Normalized(NearestUV - UVPoint);
218 TexelType[SampleLinearIdx] = InteriorTexel;
219 TexelQueryUV[SampleLinearIdx] = (FVector2f)NearestUV;
220 TexelQueryTriangle[SampleLinearIdx] = TriId;
221 ++TexelInteriorSamples[TexelLinearIdx];
225 TexelType[SampleLinearIdx] = GutterTexel;
226 const FDistPoint3Triangle3d DistQuery = TMeshQueries<MeshType>::TriangleDistance(UVSpaceMesh, NearestTriID, UVPoint3d);
227 const FVector2d NearestUV = GetXY(DistQuery.ClosestTrianglePoint);
229 TexelQueryUV[SampleLinearIdx] = (FVector2f)NearestUV;
230 TexelQueryTriangle[SampleLinearIdx] = TriId;
233 if (TriId < NumUVSpaceMeshTriCharts && TexelQueryUVChart[TexelLinearIdx] == IndexConstants::InvalidID)
235 TexelQueryUVChart[TexelLinearIdx] = (*UVSpaceMeshTriCharts)[TriId];
254 for (int32 ImgX = 0; ImgX < Tile.GetWidth(); ++ImgX)
256 const FVector2i SourceCoords = Tile.GetSourceCoords(ImgX, ImgY);
257 const int64 SourceTexelLinearIdx = Dimensions.GetIndex(SourceCoords.X, SourceCoords.Y);
258 const int64 TexelLinearIdx = Tile.GetIndex(ImgX, ImgY);
259 const TTuple<int64, int64> InvalidGutterNearestTexel(-1, -1);
265 TTuple<int64, int64> GutterNearestTexel = InvalidGutterNearestTexel;
266 for (int32 Sample = 0; Sample < PixelSampler.Num(); ++Sample)
268 const int64 SampleLinearIdx = TexelLinearIdx * PixelSampler.Num() + Sample;
270 if (TexelType[SampleLinearIdx] == InteriorTexel)
272 GutterNearestTexel = InvalidGutterNearestTexel;
276 if (TexelType[SampleLinearIdx] == GutterTexel)
278 const FVector2d NearestUV = (FVector2d)TexelQueryUV[SampleLinearIdx];
279 const FVector2i NearestCoords = Dimensions.UVToCoords(NearestUV);
288 const int64 NearestLinearIdx = Dimensions.GetIndex(NearestCoords);
289 GutterNearestTexel = TTuple<int64, int64>(SourceTexelLinearIdx, NearestLinearIdx);
293 if (GutterNearestTexel != InvalidGutterNearestTexel)
295 GutterTexelsPerScanline[ImgY].Add(GutterNearestTexel);
322 template<
typename MeshType,
typename GetTriangleIDFuncType>
330 ComputeGutterTexelsFromGutterSamples();
338 template<
typename TexelValueType>
358 for (int32 ImgX = 0; ImgX < Dimensions.GetWidth(); ++ImgX)
360 int32 LinearIdx = (int32)Dimensions.GetIndex(ImgX, ImgY);
361 if (TexelType[LinearIdx] != EmptyTexel)
363 TexelValueType AccumValue = BeginTexel(LinearIdx);
366 FVector2i Coords(ImgX, ImgY);
367 FVector2i MaxNbr = Coords + FVector2i(FilterWidth, FilterWidth);
368 Dimensions.Clamp(MaxNbr);
369 FVector2i MinNbr = Coords - FVector2i(FilterWidth, FilterWidth);
370 Dimensions.Clamp(MinNbr);
372 for (int32 Y = MinNbr.Y; Y <= MaxNbr.Y; ++Y)
374 for (int32 X = MinNbr.X; X <= MaxNbr.X; ++X)
376 FVector2i NbrCoords(X, Y);
377 if (Dimensions.IsValidCoords(NbrCoords))
379 FVector2i Offset = NbrCoords - Coords;
380 int64 LinearNbrIndex = Dimensions.GetIndex(NbrCoords);
381 if (TexelType[LinearNbrIndex] != EmptyTexel)
383 float NbrWeight = WeightFunction(Offset);
384 AccumulateTexel(LinearNbrIndex, NbrWeight, AccumValue);
385 WeightSum += NbrWeight;
391 CompleteTexel(LinearIdx, WeightSum, AccumValue);
392 PassBuffer[LinearIdx] = AccumValue;
400 if (TexelType[k] != EmptyTexel)
#define checkSlow(expr)
Definition AssertionMacros.h:332
#define check(expr)
Definition AssertionMacros.h:314
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
void SetNum(SizeType NewNum, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2308
Definition AssetRegistryState.h:50
static RealType Clamp(const RealType Value, const RealType ClampMin, const RealType ClampMax)
Definition MathUtil.h:222
static RealType Sqrt(const RealType Value)
Definition MathUtil.h:342
Definition ImageDimensions.h:18
int32 GetHeight() const
Definition ImageDimensions.h:40
int64 Num() const
Definition ImageDimensions.h:42
FVector2d GetTexelSize() const
Definition ImageDimensions.h:97
int32 GetWidth() const
Definition ImageDimensions.h:38
Definition ImageOccupancyMap.h:34
TArray64< int32 > TexelInteriorSamples
Definition ImageOccupancyMap.h:60
TArray64< TTuple< int64, int64 > > BorderTexels
Definition ImageOccupancyMap.h:84
TArray64< int8 > TexelType
Definition ImageOccupancyMap.h:54
FGridSampler PixelSampler
Definition ImageOccupancyMap.h:93
bool ClassifySamplesFromUVSpaceMesh(const MeshType &UVSpaceMesh, GetTriangleIDFuncType GetTriangleIDFunc=[](int32 TriangleID) { return TriangleID;}, const TArray< int32 > *UVSpaceMeshTriCharts=nullptr)
Definition ImageOccupancyMap.h:135
TArray64< int32 > TexelQueryUVChart
Definition ImageOccupancyMap.h:78
static constexpr int8 BorderTexel
Definition ImageOccupancyMap.h:47
void InitializePixelSampler(const int32 SamplesPerPixelIn)
Definition ImageOccupancyMap.h:412
FImageDimensions Dimensions
Definition ImageOccupancyMap.h:37
TArray64< FVector2f > TexelQueryUV
Definition ImageOccupancyMap.h:66
bool ClassifySamplesFromUVSpaceMesh(const MeshType &UVSpaceMesh, const TMeshAABBTree3< MeshType > &UVSpaceMeshSpatial, GetTriangleIDFuncType GetTriangleIDFunc=[](int32 TriangleID) { return TriangleID;}, const TArray< int32 > *UVSpaceMeshTriCharts=nullptr)
Definition ImageOccupancyMap.h:148
static constexpr int8 EmptyTexel
Definition ImageOccupancyMap.h:45
bool IsInterior(int64 LinearIndex) const
Definition ImageOccupancyMap.h:117
int32 GutterSize
Definition ImageOccupancyMap.h:42
void Initialize(FImageDimensions DimensionsIn, const FImageTile &TileIn, int32 SamplesPerPixel=1)
Definition ImageOccupancyMap.h:106
int32 TexelNumSamples(int64 LinearIndex) const
Definition ImageOccupancyMap.h:123
void ParallelProcessingPass(TFunctionRef< TexelValueType(int64 LinearIdx)> BeginTexel, TFunctionRef< void(int64 LinearIdx, float Weight, TexelValueType &)> AccumulateTexel, TFunctionRef< void(int64 LinearIdx, float Weight, TexelValueType &)> CompleteTexel, TFunctionRef< void(int64 LinearIdx, TexelValueType &)> WriteTexel, TFunctionRef< float(const FVector2i &TexelOffset)> WeightFunction, int32 FilterWidth, TArray< TexelValueType > &PassBuffer) const
Definition ImageOccupancyMap.h:339
bool bParallel
Definition ImageOccupancyMap.h:95
TArray64< TTuple< int64, int64 > > GutterTexels
Definition ImageOccupancyMap.h:90
bool ComputeFromUVSpaceMesh(const MeshType &UVSpaceMesh, GetTriangleIDFuncType GetTriangleIDFunc=[](int32 TriangleID) { return TriangleID;}, const TArray< int32 > *UVSpaceMeshTriCharts=nullptr)
Definition ImageOccupancyMap.h:323
TGridSampler< double > FGridSampler
Definition ImageOccupancyMap.h:92
bool ComputeGutterTexelsFromGutterSamples()
Definition ImageOccupancyMap.h:245
TArray64< int32 > TexelQueryTriangle
Definition ImageOccupancyMap.h:72
void Initialize(FImageDimensions DimensionsIn, int32 SamplesPerPixel=1)
Definition ImageOccupancyMap.h:98
static constexpr int8 InteriorTexel
Definition ImageOccupancyMap.h:46
FImageTile Tile
Definition ImageOccupancyMap.h:38
static constexpr int8 GutterTexel
Definition ImageOccupancyMap.h:48
Definition ImageTile.h:14
int64 Num() const
Definition ImageTile.h:51
int32 GetHeight() const
Definition ImageTile.h:46
int32 Num() const
Definition GridSampler.h:32
Definition MeshAABBTree3.h:61
constexpr int InvalidID
Definition IndexTypes.h:13
Definition AdvancedWidgetsModule.cpp:13
Definition IntVectorTypes.h:20
Definition SpatialInterfaces.h:57
double MaxDistance
Definition SpatialInterfaces.h:61
static TVector2< float > Zero()
Definition Vector2D.h:79