From 145dfabd36ab295d7dc9f5723e9fe1eda952fd27 Mon Sep 17 00:00:00 2001 From: Timon Roemer <t.roemer@vis.rwth-aachen.de> Date: Wed, 10 Jul 2024 18:32:19 +0200 Subject: [PATCH] Adds FloodFilling --- Config/DefaultEngine.ini | 6 +- Content/MetaPointMap.umap | Bin 47547 -> 43192 bytes Content/MetaPointMap_BuiltData.uasset | Bin 96052 -> 42891 bytes Source/MetaCastBachelor/DensityField.cpp | 214 ++++++++++-------- Source/MetaCastBachelor/DensityField.h | 56 ++--- Source/MetaCastBachelor/MetaCastBaseline.cpp | 13 +- Source/MetaCastBachelor/MetaPoint.cpp | 46 +++- Source/MetaCastBachelor/MetaPoint.h | 15 +- Source/MetaCastBachelor/PointCloud.cpp | 24 +- Source/MetaCastBachelor/PointCloud.h | 2 +- Source/MetaCastBachelor/Utilities.cpp | 221 ++++++++++--------- Source/MetaCastBachelor/Utilities.h | 7 +- 12 files changed, 344 insertions(+), 260 deletions(-) diff --git a/Config/DefaultEngine.ini b/Config/DefaultEngine.ini index f503eeb..19b59fc 100644 --- a/Config/DefaultEngine.ini +++ b/Config/DefaultEngine.ini @@ -122,8 +122,10 @@ r.DynamicGlobalIlluminationMethod = 1 r.ReflectionMethod = 1 r.Shadow.Virtual.Enable = 1 -r.Mobile.AntiAliasing=0 -r.AntiAliasingMethod=0 +r.Mobile.AntiAliasing=3 +r.AntiAliasingMethod=3 +vr.InstancedStereo=True +r.MobileHDR=True [/Script/HardwareTargeting.HardwareTargetingSettings] TargetedHardwareClass = Mobile diff --git a/Content/MetaPointMap.umap b/Content/MetaPointMap.umap index 29279ebda45e68b55a53493d3d7ba85a1c563b49..add3f06500b1b576fa486e1ede28b8e2d591a298 100644 GIT binary patch literal 43192 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 ZA%a2=gv;((1hSmkuL&C)IM}Q;4*<CJk4pdm literal 47547 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 diff --git a/Content/MetaPointMap_BuiltData.uasset b/Content/MetaPointMap_BuiltData.uasset index c34cc92efe7ae452c7cc0e5fc0848b52ea42c079..1bf02fa1814c30bc66b1c21252e01906ddb1ac28 100644 GIT binary patch delta 9843 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 b!2bvR56YL_vj}84wO`ZE7*ZI5R(Svb&MS@m literal 96052 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 WrtF?YAj_%!n)Ba4s*QuqTJr#Ld&I~9 diff --git a/Source/MetaCastBachelor/DensityField.cpp b/Source/MetaCastBachelor/DensityField.cpp index 803b67d..0cfcdc9 100644 --- a/Source/MetaCastBachelor/DensityField.cpp +++ b/Source/MetaCastBachelor/DensityField.cpp @@ -7,12 +7,12 @@ FDensityField::FDensityField(): XNum(0), YNum(0), ZNum(0), XStep(0), YStep(0), ZStep(0) { - GridNodes = TArray<FVoxel>(); + VoxelList = TArray<FVoxel>(); } void FDensityField::InitializeDensityField(const FVector& MinBounds, const FVector& MaxBounds, const int32 XAxisNum, const int32 YAxisNum, const int32 ZAxisNum) { - GridNodes.Empty(); + VoxelList.Empty(); XStep = (MaxBounds.X - MinBounds.X) / (XAxisNum - 1); YStep = (MaxBounds.Y - MinBounds.Y) / (YAxisNum - 1); @@ -26,7 +26,7 @@ void FDensityField::InitializeDensityField(const FVector& MinBounds, const FVect { FVector Position(MinBounds.X + X * XStep, MinBounds.Y + Y * YStep, MinBounds.Z + Z * ZStep); FVector GridPosition(X, Y, Z); - GridNodes.Add(FVoxel(Position, GridPosition)); + VoxelList.Add(FVoxel(Position, GridPosition)); } } } @@ -46,10 +46,10 @@ void FDensityField::CalculateVoxelDensities(const APointCloud* PointCloud, const UE_LOG(LogTemp, Log, TEXT("Starting density calculation.")); // Clear existing densities and counts - for (auto& Node : GridNodes) + for (auto& Node : VoxelList) { - Node.SetNodeDensity(0.0); - Node.SetEnclosedParticleNum(0.0); // Reset the counter + Node.SetVoxelDensity(0.0); + Node.SetClosePointsNumber(0.0); // Reset the counter } UE_LOG(LogTemp, Log, TEXT("Cleared previous densities.")); @@ -70,17 +70,17 @@ void FDensityField::CalculateVoxelDensities(const APointCloud* PointCloud, const { for (int32 X = StartX; X <= EndX; ++X) { - const int32 Index = GridPositionToIndex(Z, Y, X); - if (Index >= 0 && Index < GridNodes.Num()) + const int32 Index = GridPositionToIndex(X, Y, Z); + if (Index >= 0 && Index < VoxelList.Num()) { - FVector NodePosition = GridNodes[Index].GetNodePosition(); + FVector NodePosition = VoxelList[Index].GetVoxelPosition(); const float Distance = FVector::Dist(NodePosition, ParticlePosition); if (Distance < InfluenceRadius) { const double Weight = FUtilities::GaussianKernel(Distance, Sigma); - GridNodes[Index].NodeDensityPlusDis(Weight); - GridNodes[Index].SetEnclosedParticleNum(GridNodes[Index].GetEnclosedParticleNum() + 1.0); + VoxelList[Index].AddToVoxelDensity(Weight); + VoxelList[Index].SetClosePointsNumber(VoxelList[Index].GetClosePointsNumber() + 1.0); } } } @@ -88,11 +88,11 @@ void FDensityField::CalculateVoxelDensities(const APointCloud* PointCloud, const } } double MaxDensity = 0.0; - for (const auto& Node : GridNodes) + for (const auto& Node : VoxelList) { - if (Node.GetNodeDensity() > MaxDensity) + if (Node.GetVoxelDensity() > MaxDensity) { - MaxDensity = Node.GetNodeDensity(); + MaxDensity = Node.GetVoxelDensity(); } } UE_LOG(LogTemp, Log, TEXT("Maximum density found: %f"), MaxDensity); @@ -114,17 +114,17 @@ void FDensityField::CalculateAndStoreGradients() { for (int32 X = 0; X < XNum; X++) { - const int32 Index = GridPositionToIndex(Z, Y, X); - if (!GridNodes.IsValidIndex(Index)) + const int32 Index = GridPositionToIndex(X, Y, Z); + if (!VoxelList.IsValidIndex(Index)) continue; // Use one-sided differences at the boundaries - const double DensityX1 = X < XNum - 1 ? GridNodes[GridPositionToIndex(Z, Y, X + 1)].GetNodeDensity() : GridNodes[Index].GetNodeDensity(); - const double DensityX0 = X > 0 ? GridNodes[GridPositionToIndex(Z, Y, X - 1)].GetNodeDensity() : GridNodes[Index].GetNodeDensity(); - const double DensityY1 = Y < YNum - 1 ? GridNodes[GridPositionToIndex(Z, Y + 1, X)].GetNodeDensity() : GridNodes[Index].GetNodeDensity(); - const double DensityY0 = Y > 0 ? GridNodes[GridPositionToIndex(Z, Y - 1, X)].GetNodeDensity() : GridNodes[Index].GetNodeDensity(); - const double DensityZ1 = Z < ZNum - 1 ? GridNodes[GridPositionToIndex(Z + 1, Y, X)].GetNodeDensity() : GridNodes[Index].GetNodeDensity(); - const double DensityZ0 = Z > 0 ? GridNodes[GridPositionToIndex(Z - 1, Y, X)].GetNodeDensity() : GridNodes[Index].GetNodeDensity(); + const double DensityX1 = X < XNum - 1 ? VoxelList[GridPositionToIndex(X + 1, Y, Z)].GetVoxelDensity() : VoxelList[Index].GetVoxelDensity(); + const double DensityX0 = X > 0 ? VoxelList[GridPositionToIndex(X - 1, Y, Z)].GetVoxelDensity() : VoxelList[Index].GetVoxelDensity(); + const double DensityY1 = Y < YNum - 1 ? VoxelList[GridPositionToIndex(X, Y + 1, Z)].GetVoxelDensity() : VoxelList[Index].GetVoxelDensity(); + const double DensityY0 = Y > 0 ? VoxelList[GridPositionToIndex(X, Y - 1, Z)].GetVoxelDensity() : VoxelList[Index].GetVoxelDensity(); + const double DensityZ1 = Z < ZNum - 1 ? VoxelList[GridPositionToIndex(X, Y, Z + 1)].GetVoxelDensity() : VoxelList[Index].GetVoxelDensity(); + const double DensityZ0 = Z > 0 ? VoxelList[GridPositionToIndex(X, Y, Z - 1)].GetVoxelDensity() : VoxelList[Index].GetVoxelDensity(); FVector Gradient( (DensityX1 - DensityX0) / (X == 0 || X == XNum - 1 ? XStep : 2 * XStep), @@ -132,7 +132,7 @@ void FDensityField::CalculateAndStoreGradients() (DensityZ1 - DensityZ0) / (Z == 0 || Z == ZNum - 1 ? ZStep : 2 * ZStep) ); - GridNodes[Index].SetNodeGradient(Gradient); + VoxelList[Index].SetVoxelGradient(Gradient); } } } @@ -151,18 +151,18 @@ void FDensityField::DrawDebugVoxelDensity(const UWorld* World, const AActor* Act } double MinDensity = DBL_MAX, MaxDensity = 0; - for (const FVoxel& Node : GridNodes) + for (const FVoxel& Node : VoxelList) { - const double LogDensity = log10(Node.GetNodeDensity() + 1); // Avoiding log(0) + const double LogDensity = log10(Node.GetVoxelDensity() + 1); // Avoiding log(0) if (LogDensity < MinDensity) MinDensity = LogDensity; if (LogDensity > MaxDensity) MaxDensity = LogDensity; } const FTransform ActorTransform = Actor->GetActorTransform(); - for (const FVoxel& Node : GridNodes) + for (const FVoxel& Node : VoxelList) { - const double Density = Node.GetNodeDensity(); + const double Density = Node.GetVoxelDensity(); const double LogDensity = log10(Density + 1); // Normalize using logarithmic scale const float NormalizedDensity = static_cast<float>((LogDensity - MinDensity) / (MaxDensity - MinDensity)); @@ -172,7 +172,7 @@ void FDensityField::DrawDebugVoxelDensity(const UWorld* World, const AActor* Act FLinearColor VoxelColor = FLinearColor::LerpUsingHSV(FLinearColor::Green, FLinearColor::Red, NormalizedDensity); FVector VoxelSize = FVector(Scale * XStep, Scale * YStep, Scale * ZStep) / 2.0f; - FVector WorldPosition = ActorTransform.TransformPosition(Node.GetNodePosition()); + FVector WorldPosition = ActorTransform.TransformPosition(Node.GetVoxelPosition()); FVector ScaledVoxelSize = ActorTransform.TransformVector(VoxelSize); DrawDebugBox(World, WorldPosition, 0.95 * ScaledVoxelSize, VoxelColor.ToFColor(true), false, Duration, 0, 0.1f); @@ -185,30 +185,22 @@ void FDensityField::DrawDebugVoxelDensity(const UWorld* World, const AActor* Act // CONVERSION FUNCTIONS -int32 FDensityField::GridPositionToIndex(const int32 Z, const int32 Y, const int32 X) const +int32 FDensityField::GridPositionToIndex(const int32 X, const int32 Y, const int32 Z) const { return Z * XNum * YNum + Y * XNum + X; } -int32 FDensityField::WorldPositionToIndex(const FVector &Position, const APointCloud * PointCloud) const { - if (!PointCloud) { - UE_LOG(LogTemp, Warning, TEXT("PointCloud is null, cannot convert position to box index.")); - return -1; - } - +int32 FDensityField::WorldPositionToIndex(const FVector &Position) const { // Convert world position to grid position - FVector GridPosition = WorldToGridPosition(Position); + const FVector GridPosition = WorldToGridPosition(Position); // Check if the grid position is valid - if (GridPosition.X < 0 || GridPosition.Y < 0 || GridPosition.Z < 0) { + if (!IsValidGridPosition(GridPosition.X, GridPosition.Y, GridPosition.Z)) { UE_LOG(LogTemp, Warning, TEXT("Position out of grid bounds or invalid grid settings, cannot find box index.")); return -1; // Grid position was invalid } - // Calculate the linear index from grid position - const int32 Index = static_cast<int32>(GridPosition.Z) * XNum * YNum + static_cast<int32>(GridPosition.Y) * XNum + static_cast<int32>(GridPosition.X); - - return Index; + return GridPositionToIndex(GridPosition.X, GridPosition.Y, GridPosition.Z); } FVector FDensityField::WorldToGridPosition(const FVector& Position) const @@ -220,9 +212,9 @@ FVector FDensityField::WorldToGridPosition(const FVector& Position) const } // Calculate the grid coordinates by subtracting the grid origin and dividing by the grid step sizes - int32 GridX = static_cast<int32>((Position.X - GridOrigin.X) / XStep); - int32 GridY = static_cast<int32>((Position.Y - GridOrigin.Y) / YStep); - int32 GridZ = static_cast<int32>((Position.Z - GridOrigin.Z) / ZStep); + const int32 GridX = FMath::FloorToInt((Position.X - GridOrigin.X) / XStep); + const int32 GridY = FMath::FloorToInt((Position.Y - GridOrigin.Y) / YStep); + const int32 GridZ = FMath::FloorToInt((Position.Z - GridOrigin.Z) / ZStep); // Check if the calculated grid coordinates are within the bounds if (GridX < 0 || GridX >= XNum || GridY < 0 || GridY >= YNum || GridZ < 0 || GridZ >= ZNum) @@ -234,7 +226,7 @@ FVector FDensityField::WorldToGridPosition(const FVector& Position) const return FVector(GridX, GridY, GridZ); } -bool FDensityField::IsValidIndex(const int32 XBin, const int32 YBin, const int32 ZBin) const +bool FDensityField::IsValidGridPosition(const int32 XBin, const int32 YBin, const int32 ZBin) const { // Check if the provided indices are within the grid bounds return (XBin >= 0 && XBin < XNum) && @@ -242,103 +234,99 @@ bool FDensityField::IsValidIndex(const int32 XBin, const int32 YBin, const int32 (ZBin >= 0 && ZBin < ZNum); } - -// GETTER AND SETTER FUNCTIONS - -FVector FDensityField::GetGridOrigin() const +FVector FDensityField::IndexToVoxelGradient(const int32 Index) const { - return GridOrigin; + if (VoxelList.IsValidIndex(Index)) + { + return VoxelList[Index].GetVoxelGradient(); + } + return FVector::ZeroVector; } -FVector FDensityField::GetNodeGradient(const int32 Index) const +FVector FDensityField::IndexToVoxelPosition(const int32 Index) const { - if (GridNodes.IsValidIndex(Index)) - { - return GridNodes[Index].GetNodeGradient(); - } - return FVector::ZeroVector; + if (VoxelList.IsValidIndex(Index)) + { + return VoxelList[Index].GetVoxelPosition(); + } + return -FVector::One(); } -FVector FDensityField::GetNodePosition(const int32 Index) const +FVector FDensityField::IndexToGridPosition(const int32 Index) const { - if (GridNodes.IsValidIndex(Index)) - { - return GridNodes[Index].GetNodePosition(); - } - return FVector::ZeroVector; + if (IsValidIndex(Index)) + { + return VoxelList[Index].GetVoxelGridPos(); + } + return -FVector::One(); } -FVector FDensityField::GetNodeGridPos(const int32 Index) const + +// GETTER AND SETTER FUNCTIONS + +FVector FDensityField::GetGridOrigin() const { - if (GridNodes.IsValidIndex(Index)) - { - return GridNodes[Index].GetNodeGridPos(); - } - return FVector::ZeroVector; + return GridOrigin; } -double FDensityField::GetNodeDensity(const int32 Index) const +double FDensityField::GetVoxelDensityFromIndex(const int32 Index) const { - if (GridNodes.IsValidIndex(Index)) + if (VoxelList.IsValidIndex(Index)) { - return GridNodes[Index].GetNodeDensity(); + return VoxelList[Index].GetVoxelDensity(); } return 0.0; } -int32 FDensityField::GetNodeNum() const +int32 FDensityField::GetVoxelNumber() const { - return GridNodes.Num(); + return VoxelList.Num(); } -void FDensityField::SetNodeDensity(const int32 Index, const double Density) +void FDensityField::SetVoxelDensity(const int32 Index, const double Density) { - if (GridNodes.IsValidIndex(Index)) + if (VoxelList.IsValidIndex(Index)) { - GridNodes[Index].SetNodeDensity(Density); + VoxelList[Index].SetVoxelDensity(Density); } } -void FDensityField::SetNodeGradient(const int32 Index, const FVector& Gradient) +void FDensityField::SetVoxelGradient(const int32 Index, const FVector& Gradient) { - if (GridNodes.IsValidIndex(Index)) + if (VoxelList.IsValidIndex(Index)) { - GridNodes[Index].SetNodeGradient(Gradient); + VoxelList[Index].SetVoxelGradient(Gradient); } } -double FDensityField::GetDensity(const int32 XBin, const int32 YBin, const int32 ZBin) const +double FDensityField::GetVoxelDensityFromGridPosition(const int32 XBin, const int32 YBin, const int32 ZBin) const { // First, check if the provided indices are valid - if (IsValidIndex(XBin, YBin, ZBin)) + if (IsValidGridPosition(XBin, YBin, ZBin)) { // Convert 3D grid coordinates to a linear index - const int32 Index = GridPositionToIndex(ZBin, YBin, XBin); + const int32 Index = GridPositionToIndex(XBin, YBin, ZBin); - // Ensure the index is within the valid range - if (GridNodes.IsValidIndex(Index)) - { - // Return the density at the calculated index - return GridNodes[Index].GetNodeDensity(); - } + return GetVoxelDensityFromIndex(Index); } + // Return 0 if the indices are out of bounds or the index is invalid return 0.0; } -FVector FDensityField::GetGradient(const int32 XBin, const int32 YBin, const int32 ZBin) const +FVector FDensityField::GetVoxelGradientFromGridPosition(const int32 XBin, const int32 YBin, const int32 ZBin) const { // First, check if the provided indices are valid - if (IsValidIndex(XBin, YBin, ZBin)) + if (IsValidGridPosition(XBin, YBin, ZBin)) { // Convert 3D grid coordinates to a linear index - const int32 Index = GridPositionToIndex(ZBin, YBin, XBin); + const int32 Index = GridPositionToIndex(XBin, YBin, ZBin); // Ensure the index is within the valid range - if (GridNodes.IsValidIndex(Index)) + if (VoxelList.IsValidIndex(Index)) { // Return the gradient at the calculated index - return GridNodes[Index].GetNodeGradient(); + return VoxelList[Index].GetVoxelGradient(); } } // Return 0 if the indices are out of bounds or the index is invalid @@ -362,13 +350,45 @@ int32 FDensityField::GetZNum() const { return ZNum; } -bool FDensityField::IsValidPosition(const FVector& Position) const +bool FDensityField::IsValidWorldPosition(const FVector& Position) const { // Convert the world position to grid coordinates const FVector GridPosition = WorldToGridPosition(Position); // Check if the grid position is within the valid bounds - return (GridPosition.X >= 0 && GridPosition.X < XNum) && - (GridPosition.Y >= 0 && GridPosition.Y < YNum) && - (GridPosition.Z >= 0 && GridPosition.Z < ZNum); + return IsValidGridPosition(GridPosition.X, GridPosition.Y, GridPosition.Z); +} + +TArray<int32> FDensityField::GetNeighborsFromIndex(const int32 Index) const +{ + TArray<int32> Neighbors; + if (VoxelList.IsValidIndex(Index)) + { + const int32 X = VoxelList[Index].GetVoxelGridPos().X; + const int32 Y = VoxelList[Index].GetVoxelGridPos().Y; + const int32 Z = VoxelList[Index].GetVoxelGridPos().Z; + + // List all potential neighbors + TArray<FIntVector> PotentialNeighbors = { + FIntVector(X+1, Y, Z), FIntVector(X-1, Y, Z), + FIntVector(X, Y+1, Z), FIntVector(X, Y-1, Z), + FIntVector(X, Y, Z+1), FIntVector(X, Y, Z-1) + }; + + for (const FIntVector& NeighborPos : PotentialNeighbors) + { + if (NeighborPos.X >= 0 && NeighborPos.X < XNum && + NeighborPos.Y >= 0 && NeighborPos.Y < YNum && + NeighborPos.Z >= 0 && NeighborPos.Z < ZNum) + { + int NeighborIndex = GridPositionToIndex(NeighborPos.Z, NeighborPos.Y, NeighborPos.Z); + Neighbors.Add(NeighborIndex); + } + } + } + return Neighbors; +} + +bool FDensityField::IsValidIndex(const int32 Index) const { + return VoxelList.IsValidIndex(Index); } diff --git a/Source/MetaCastBachelor/DensityField.h b/Source/MetaCastBachelor/DensityField.h index 79fb38d..3e71da4 100644 --- a/Source/MetaCastBachelor/DensityField.h +++ b/Source/MetaCastBachelor/DensityField.h @@ -15,22 +15,22 @@ private: FVector GridPosition; double VoxelDensity; FVector VoxelGradient; - double EnclosedParticleNumber; + double ClosePointsNumber; public: - FVoxel() : WorldPosition(FVector::ZeroVector), GridPosition(FVector::ZeroVector), VoxelDensity(0.0), VoxelGradient(FVector::ZeroVector), EnclosedParticleNumber(0.0) {} - FVoxel(const FVector &InPosition, const FVector &InGridPos) : WorldPosition(InPosition), GridPosition(InGridPos), VoxelDensity(0.0), VoxelGradient(FVector::ZeroVector), EnclosedParticleNumber(0.0) {} + FVoxel() : WorldPosition(FVector::ZeroVector), GridPosition(FVector::ZeroVector), VoxelDensity(0.0), VoxelGradient(FVector::ZeroVector), ClosePointsNumber(0.0) {} + FVoxel(const FVector &InPosition, const FVector &InGridPos) : WorldPosition(InPosition), GridPosition(InGridPos), VoxelDensity(0.0), VoxelGradient(FVector::ZeroVector), ClosePointsNumber(0.0) {} - double GetNodeDensity() const { return VoxelDensity; } - FVector GetNodeGridPos() const { return GridPosition; } - FVector GetNodePosition() const { return WorldPosition; } - FVector GetNodeGradient() const { return VoxelGradient; } - double GetEnclosedParticleNum() const { return EnclosedParticleNumber; } + double GetVoxelDensity() const { return VoxelDensity; } + FVector GetVoxelGridPos() const { return GridPosition; } + FVector GetVoxelPosition() const { return WorldPosition; } + FVector GetVoxelGradient() const { return VoxelGradient; } + double GetClosePointsNumber() const { return ClosePointsNumber; } - void SetNodeDensity(const double Density) { this->VoxelDensity = Density; } - void SetNodeGradient(const FVector &Gradient) { this->VoxelGradient = Gradient; } - void SetEnclosedParticleNum(const double Dis) { EnclosedParticleNumber = Dis; } - void NodeDensityPlusDis(const double Dis) { VoxelDensity += Dis; } + void SetVoxelDensity(const double Density) { this->VoxelDensity = Density; } + void SetVoxelGradient(const FVector &Gradient) { this->VoxelGradient = Gradient; } + void SetClosePointsNumber(const double Dis) { ClosePointsNumber = Dis; } + void AddToVoxelDensity(const double Dis) { VoxelDensity += Dis; } }; USTRUCT(BlueprintType) @@ -54,7 +54,7 @@ struct FLUTUnit class FDensityField { // VARIABLES - TArray<FVoxel> GridNodes; + TArray<FVoxel> VoxelList; int32 XNum, YNum, ZNum; float XStep, YStep, ZStep; FVector GridOrigin; @@ -72,27 +72,27 @@ public: void DrawDebugVoxelDensity(const UWorld* World, const AActor* Actor, float Duration, float Scale, float DensityThreshold) const; // CONVERSION FUNCTIONS - int32 WorldPositionToIndex(const FVector &Position, const APointCloud * PointCloud) const; + int32 WorldPositionToIndex(const FVector& Position) const; FVector WorldToGridPosition(const FVector& Position) const; - bool IsValidIndex(int32 XBin, int32 YBin, int32 ZBin) const; - int32 GridPositionToIndex(int32 Z, int32 Y, int32 X) const; + bool IsValidGridPosition(int32 XBin, int32 YBin, int32 ZBin) const; + int32 GridPositionToIndex(int32 X, int32 Y, int32 Z) const; // GETTER AND SETTER FUNCTIONS FVector GetGridOrigin() const; - FVector GetNodeGradient(int32 Index) const; - FVector GetNodePosition(int32 Index) const; - FVector GetNodeGridPos(int32 Index) const; - int32 GetNodeNum() const; - double GetNodeDensity(int32 Index) const; - double GetDensity(int32 XBin, int32 YBin, int32 ZBin) const; - FVector GetGradient(int32 XBin, int32 YBin, int32 ZBin) const; + FVector IndexToVoxelGradient(int32 Index) const; + FVector IndexToVoxelPosition(int32 Index) const; + FVector IndexToGridPosition(int32 Index) const; + int32 GetVoxelNumber() const; + double GetVoxelDensityFromIndex(int32 Index) const; + double GetVoxelDensityFromGridPosition(int32 XBin, int32 YBin, int32 ZBin) const; + FVector GetVoxelGradientFromGridPosition(int32 XBin, int32 YBin, int32 ZBin) const; FVector GetStep() const; int32 GetXNum() const; int32 GetYNum() const; int32 GetZNum() const; - bool IsValidPosition(const FVector& Position) const; - - - void SetNodeDensity(int32 Index, double Density); - void SetNodeGradient(int32 Index, const FVector& Gradient); + bool IsValidWorldPosition(const FVector& Position) const; + TArray<int32> GetNeighborsFromIndex(const int32 Index) const; + bool IsValidIndex(int32 Index) const; + void SetVoxelDensity(int32 Index, double Density); + void SetVoxelGradient(int32 Index, const FVector& Gradient); }; diff --git a/Source/MetaCastBachelor/MetaCastBaseline.cpp b/Source/MetaCastBachelor/MetaCastBaseline.cpp index 7c38736..7d19389 100644 --- a/Source/MetaCastBachelor/MetaCastBaseline.cpp +++ b/Source/MetaCastBachelor/MetaCastBaseline.cpp @@ -130,14 +130,12 @@ void UMetaCastBaseline::AttachToHand(const float DeltaTime) const if (MyPointCloud && LeftHandComponent) { // Get the target position and rotation from the hand component, applying the offset - FVector TargetPosition = LeftHandComponent->GetComponentLocation() + PositionOffset; - FRotator TargetRotation = LeftHandComponent->GetComponentRotation() + RotationOffset; + const FVector TargetPosition = LeftHandComponent->GetComponentLocation() + PositionOffset; + const FRotator TargetRotation = LeftHandComponent->GetComponentRotation() + RotationOffset; // Smoothly lerp the point cloud's position and rotation to the target values - FVector NewPosition = - FMath::VInterpTo(MyPointCloud->GetActorLocation(), TargetPosition, DeltaTime, PositionLerpSpeed); - FRotator NewRotation = - FMath::RInterpTo(MyPointCloud->GetActorRotation(), TargetRotation, DeltaTime, RotationLerpSpeed); + const FVector NewPosition = FMath::VInterpTo(MyPointCloud->GetActorLocation(), TargetPosition, DeltaTime, PositionLerpSpeed); + const FRotator NewRotation = FMath::RInterpTo(MyPointCloud->GetActorRotation(), TargetRotation, DeltaTime, RotationLerpSpeed); // Apply the new position and rotation to the point cloud MyPointCloud->SetActorLocation(NewPosition); @@ -146,8 +144,7 @@ void UMetaCastBaseline::AttachToHand(const float DeltaTime) const } // Called every frame -void UMetaCastBaseline::TickComponent(const float DeltaTime, const ELevelTick TickType, - FActorComponentTickFunction* ThisTickFunction) +void UMetaCastBaseline::TickComponent(const float DeltaTime, const ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) { Super::TickComponent(DeltaTime, TickType, ThisTickFunction); diff --git a/Source/MetaCastBachelor/MetaPoint.cpp b/Source/MetaCastBachelor/MetaPoint.cpp index 1235280..2e920d0 100644 --- a/Source/MetaCastBachelor/MetaPoint.cpp +++ b/Source/MetaCastBachelor/MetaPoint.cpp @@ -1,8 +1,8 @@ #include "MetaPoint.h" -#include "MaterialDomain.h" #include "Utilities.h" -UMetaPoint::UMetaPoint() : MyProceduralMesh(nullptr) { +UMetaPoint::UMetaPoint() : Index(0), MyDensityField(nullptr), Threshold(0), MyProceduralMesh(nullptr) +{ // Initialize the Marching Cubes algorithm MyMarchingCubes = new MarchingCubes(); } @@ -12,10 +12,7 @@ void UMetaPoint::BeginPlay() Super::BeginPlay(); } -void UMetaPoint::SelectParticles(const FVector& InputPosition) -{ -} void UMetaPoint::EraseParticles(const FVector& InputPosition) { @@ -36,7 +33,7 @@ void UMetaPoint::HandleMetaSelectPressed(const FInputActionInstance& Instance) // Method to perform gradient ascent to find the local maximum density starting from a given position. -void UMetaPoint::FindAndMarkLocalMaximum() const +void UMetaPoint::FindAndMarkLocalMaximum() { const UWorld* World = GetWorld(); @@ -48,19 +45,46 @@ void UMetaPoint::FindAndMarkLocalMaximum() const const FVector WorldPosition = SelectionObject->GetComponentLocation(); UE_LOG(LogTemp, Log, TEXT("World Position: %s"), *WorldPosition.ToString()); + MyDensityField = MyPointCloud->MyDensityField; + // Convert the world position of the selection object to the local position relative to the point cloud - const FVector StartPosition = MyPointCloud->GetTransform().InverseTransformPosition(WorldPosition); + const FVector StartPosition = MyPointCloud->PointCloudVisualizer->GetComponentTransform().InverseTransformPosition(WorldPosition); // Perform gradient ascent to find the local maximum starting from the converted local position - const FVector LocalMaximum = FUtilities::FollowGradientToMaximum(StartPosition, MyPointCloud->MyDensityField); + LocalMaximum = FUtilities::FollowGradientToMaximum(MyDensityField, StartPosition); + UE_LOG(LogTemp, Log, TEXT("Local maximum found at world position: %s"), *WorldMaximum.ToString()); // Convert the local maximum back to world coordinates - const FVector WorldMaximum = MyPointCloud->GetActorTransform().TransformPosition(LocalMaximum); + Index = MyDensityField->WorldPositionToIndex(LocalMaximum); + + Threshold = FUtilities::InterpolateDensityAtPosition(MyDensityField, LocalMaximum); + TestingThresholdFactor = 1; +} + +void UMetaPoint::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) +{ + Super::TickComponent(DeltaTime, TickType, ThisTickFunction); + + TestingThresholdFactor -= DeltaTime * 0.1f; +} +void UMetaPoint::SelectParticles(const FVector& InputPosition) +{ + const UWorld* World = GetWorld(); + WorldMaximum = MyPointCloud->PointCloudVisualizer->GetComponentTransform().TransformPosition(LocalMaximum); + // Draw a debug sphere at the location of the local maximum in the world - DrawDebugSphere(World, WorldMaximum, SelectionRadius / 2, 32, FColor::Red, false, 10); - UE_LOG(LogTemp, Log, TEXT("Local maximum found at world position: %s"), *WorldMaximum.ToString()); + DrawDebugSphere(World, WorldMaximum, SelectionRadius / 2, 32, FColor::Red, false, 0); + auto Voxels = FUtilities::FloodFilling(MyDensityField, Index, Threshold * TestingThresholdFactor); + for (const int32 Index2 : Voxels) + { + MyPointCloud->DrawVoxel(Index2, 0); + } } + + + + diff --git a/Source/MetaCastBachelor/MetaPoint.h b/Source/MetaCastBachelor/MetaPoint.h index 50bf21c..c95ffd9 100644 --- a/Source/MetaCastBachelor/MetaPoint.h +++ b/Source/MetaCastBachelor/MetaPoint.h @@ -13,22 +13,31 @@ class UMetaPoint : public UMetaCastBaseline GENERATED_BODY() MarchingCubes* MyMarchingCubes; - + FVector WorldMaximum; + int32 Index; + FVector LocalMaximum; + FDensityField* MyDensityField; + float Threshold; public: UPROPERTY(EditAnywhere, BlueprintReadWrite) UProceduralMeshComponent* MyProceduralMesh; + + UPROPERTY(EditAnywhere) + float TestingThresholdFactor = 2.0; UMetaPoint(); virtual void BeginPlay() override; - + virtual void SelectParticles(const FVector& InputPosition) override; virtual void EraseParticles(const FVector& InputPosition) override; virtual void HandleMetaSelectReleased(const FInputActionInstance& Instance) override; virtual void HandleMetaSelectPressed(const FInputActionInstance& Instance) override; - void FindAndMarkLocalMaximum() const; + void FindAndMarkLocalMaximum(); + + virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override; }; diff --git a/Source/MetaCastBachelor/PointCloud.cpp b/Source/MetaCastBachelor/PointCloud.cpp index 8d76f03..a5a93cf 100644 --- a/Source/MetaCastBachelor/PointCloud.cpp +++ b/Source/MetaCastBachelor/PointCloud.cpp @@ -91,7 +91,7 @@ void APointCloud::SetupDensityFieldFromPointCloud() const constexpr int32 ZAxisNum = 100; // Number of divisions in the grid along the Z-axis MyDensityField->InitializeDensityField(MinBounds, MaxBounds, XAxisNum, YAxisNum, ZAxisNum); - constexpr float InfluenceRadius = 5.0f; // Half the size of a voxel + constexpr float InfluenceRadius = 0.5f; // Half the size of a voxel constexpr float Sigma = 3.0f; // Standard deviation for the Gaussian kernel MyDensityField->CalculateVoxelDensities(this, InfluenceRadius, Sigma); @@ -99,10 +99,9 @@ void APointCloud::SetupDensityFieldFromPointCloud() const if (const UWorld* World = GetWorld()) { - MyDensityField->DrawDebugVoxelDensity(World, this, 100.0f, 1.0f, 0.5f); + //MyDensityField->DrawDebugVoxelDensity(World, this, 100.0f, 1.0f, 0.8f); } } - void APointCloud::UpdateSelection() { for (int32 i = 0; i < PositionVectors.Num(); i++) @@ -119,6 +118,25 @@ void APointCloud::UpdateSelection() PointCloudVisualizer->SetInputAndConvert2(PositionVectors, PointColors); } +void APointCloud::DrawVoxel(const int Index, float Time) const +{ + if(!MyDensityField->IsValidIndex(Index)) + { + return; + } + + const FVector VoxelHalfExtents = MyDensityField->GetStep() / 2.0f; + const FVector VoxelWorldPosition = PointCloudVisualizer->GetComponentTransform().TransformPosition(MyDensityField->IndexToVoxelPosition(Index)); + const FVector WorldScale = PointCloudVisualizer->GetComponentScale(); + + // Scale the voxel size by the component's world scale to ensure it reflects the actual dimensions + FVector ScaledVoxelSize = GetActorRightVector(); + + // Draw the debug box with the correct world space dimensions + DrawDebugBox(GetWorld(), VoxelWorldPosition, VoxelHalfExtents, this->GetActorQuat(), FColor::Green, false, Time, 0, 0.1f); + +} + // Called every frame void APointCloud::Tick(float DeltaTime) { diff --git a/Source/MetaCastBachelor/PointCloud.h b/Source/MetaCastBachelor/PointCloud.h index 9c53726..e22fd46 100644 --- a/Source/MetaCastBachelor/PointCloud.h +++ b/Source/MetaCastBachelor/PointCloud.h @@ -13,7 +13,6 @@ class APointCloud : public AActor public: FDensityField* MyDensityField; - TArray<FVector> PositionVectors; TArray<bool> DefaultFlags; TArray<bool> SelectionFlags; @@ -59,6 +58,7 @@ public: virtual void Tick(float DeltaTime) override; void UpdateSelection(); + void DrawVoxel(const int Index, float Time) const; UFUNCTION(BlueprintCallable) void ReadPointCloudFromFile(FFilePath FileNamePoints, FFilePath FileNameFlags); diff --git a/Source/MetaCastBachelor/Utilities.cpp b/Source/MetaCastBachelor/Utilities.cpp index e549e57..939fe97 100644 --- a/Source/MetaCastBachelor/Utilities.cpp +++ b/Source/MetaCastBachelor/Utilities.cpp @@ -26,128 +26,94 @@ void FUtilities::QuickSort(TArray<float>& Array, const int32 Begin, const int32 } } -double FUtilities::InterpolateDensityAtPosition(const FVector& Position, const FDensityField* DensityField) +double FUtilities::InterpolateDensityAtPosition(const FDensityField* DensityField, const FVector& Position) { if (!DensityField) return 0.0; - // Convert position into grid coordinate space const FVector GridPos = (Position - DensityField->GetGridOrigin()) / DensityField->GetStep(); const int32 XBin = FMath::FloorToInt(GridPos.X); const int32 YBin = FMath::FloorToInt(GridPos.Y); const int32 ZBin = FMath::FloorToInt(GridPos.Z); - // Calculate fractional components for interpolation - const double XFraction = GridPos.X - XBin; - const double YFraction = GridPos.Y - YBin; - const double ZFraction = GridPos.Z - ZBin; - - // Ensure indices are within the valid range - if (!DensityField->IsValidIndex(XBin, YBin, ZBin) || - !DensityField->IsValidIndex(XBin + 1, YBin, ZBin) || - !DensityField->IsValidIndex(XBin, YBin + 1, ZBin) || - !DensityField->IsValidIndex(XBin, YBin, ZBin + 1) || - !DensityField->IsValidIndex(XBin + 1, YBin + 1, ZBin) || - !DensityField->IsValidIndex(XBin + 1, YBin, ZBin + 1) || - !DensityField->IsValidIndex(XBin, YBin + 1, ZBin + 1) || - !DensityField->IsValidIndex(XBin + 1, YBin + 1, ZBin + 1)) - { - return 0.0; - } - - // Fetch the densities from the surrounding voxel corners - const double D000 = DensityField->GetDensity(XBin, YBin, ZBin); - const double D100 = DensityField->GetDensity(XBin + 1, YBin, ZBin); - const double D010 = DensityField->GetDensity(XBin, YBin + 1, ZBin); - const double D001 = DensityField->GetDensity(XBin, YBin, ZBin + 1); - const double D110 = DensityField->GetDensity(XBin + 1, YBin + 1, ZBin); - const double D101 = DensityField->GetDensity(XBin + 1, YBin, ZBin + 1); - const double D011 = DensityField->GetDensity(XBin, YBin + 1, ZBin + 1); - const double D111 = DensityField->GetDensity(XBin + 1, YBin + 1, ZBin + 1); - - // Interpolate along x for each of the pairs - const double D00 = D000 * (1 - XFraction) + D100 * XFraction; - const double D01 = D001 * (1 - XFraction) + D101 * XFraction; - const double D10 = D010 * (1 - XFraction) + D110 * XFraction; - const double D11 = D011 * (1 - XFraction) + D111 * XFraction; - - // Interpolate along y - const double D0 = D00 * (1 - YFraction) + D10 * YFraction; - const double D1 = D01 * (1 - YFraction) + D11 * YFraction; - - // Final interpolation along z - const double Density = D0 * (1 - ZFraction) + D1 * ZFraction; - - return Density; -} + const float XFraction = GridPos.X - XBin; + const float YFraction = GridPos.Y - YBin; + const float ZFraction = GridPos.Z - ZBin; + const double D000 = DensityField->GetVoxelDensityFromGridPosition(XBin, YBin, ZBin); + const double D100 = DensityField->GetVoxelDensityFromGridPosition(XBin + 1, YBin, ZBin); + const double D010 = DensityField->GetVoxelDensityFromGridPosition(XBin, YBin + 1, ZBin); + const double D001 = DensityField->GetVoxelDensityFromGridPosition(XBin, YBin, ZBin + 1); + const double D101 = DensityField->GetVoxelDensityFromGridPosition(XBin + 1, YBin, ZBin + 1); + const double D011 = DensityField->GetVoxelDensityFromGridPosition(XBin, YBin + 1, ZBin + 1); + const double D110 = DensityField->GetVoxelDensityFromGridPosition(XBin + 1, YBin + 1, ZBin); + const double D111 = DensityField->GetVoxelDensityFromGridPosition(XBin + 1, YBin + 1, ZBin + 1); -FVector FUtilities::InterpolateGradientAtPosition(const FVector& Position, const FDensityField* DensityField) -{ - if (!DensityField) - return FVector::ZeroVector; + // Trilinear interpolation + const double DX00 = FMath::Lerp(D000, D100, XFraction); + const double DX01 = FMath::Lerp(D001, D101, XFraction); + const double DX10 = FMath::Lerp(D010, D110, XFraction); + const double DX11 = FMath::Lerp(D011, D111, XFraction); - // Convert position into grid coordinate space - const FVector GridPos = (Position - DensityField->GetGridOrigin()) / DensityField->GetStep(); + const double DY0 = FMath::Lerp(DX00, DX10, YFraction); + const double DY1 = FMath::Lerp(DX01, DX11, YFraction); - const int32 XBin = FMath::FloorToInt(GridPos.X); - const int32 YBin = FMath::FloorToInt(GridPos.Y); - const int32 ZBin = FMath::FloorToInt(GridPos.Z); + const double DZ = FMath::Lerp(DY0, DY1, ZFraction); - // Calculate fractional components for interpolation - const double XFraction = GridPos.X - XBin; - const double YFraction = GridPos.Y - YBin; - const double ZFraction = GridPos.Z - ZBin; - - // Ensure indices are within the valid range - if (!DensityField->IsValidIndex(XBin, YBin, ZBin) || - !DensityField->IsValidIndex(XBin + 1, YBin, ZBin) || - !DensityField->IsValidIndex(XBin, YBin + 1, ZBin) || - !DensityField->IsValidIndex(XBin, YBin, ZBin + 1) || - !DensityField->IsValidIndex(XBin + 1, YBin + 1, ZBin) || - !DensityField->IsValidIndex(XBin + 1, YBin, ZBin + 1) || - !DensityField->IsValidIndex(XBin, YBin + 1, ZBin + 1) || - !DensityField->IsValidIndex(XBin + 1, YBin + 1, ZBin + 1)) - { - return FVector::ZeroVector; - } - - // Fetch the gradients from the surrounding voxel corners - const FVector G000 = DensityField->GetGradient(XBin, YBin, ZBin); - const FVector G100 = DensityField->GetGradient(XBin + 1, YBin, ZBin); - const FVector G010 = DensityField->GetGradient(XBin, YBin + 1, ZBin); - const FVector G001 = DensityField->GetGradient(XBin, YBin, ZBin + 1); - const FVector G110 = DensityField->GetGradient(XBin + 1, YBin + 1, ZBin); - const FVector G101 = DensityField->GetGradient(XBin + 1, YBin, ZBin + 1); - const FVector G011 = DensityField->GetGradient(XBin, YBin + 1, ZBin + 1); - const FVector G111 = DensityField->GetGradient(XBin + 1, YBin + 1, ZBin + 1); - - // Interpolate along x for each of the pairs - const FVector G00 = G000 * (1 - XFraction) + G100 * XFraction; - const FVector G01 = G001 * (1 - XFraction) + G101 * XFraction; - const FVector G10 = G010 * (1 - XFraction) + G110 * XFraction; - const FVector G11 = G011 * (1 - XFraction) + G111 * XFraction; - - // Interpolate along y - const FVector G0 = G00 * (1 - YFraction) + G10 * YFraction; - const FVector G1 = G01 * (1 - YFraction) + G11 * YFraction; - - // Final interpolation along z - const FVector Gradient = G0 * (1 - ZFraction) + G1 * ZFraction; - - return Gradient; + return DZ; } +FVector FUtilities::InterpolateGradientAtPosition(const FDensityField* DensityField, const FVector& Position) +{ + if (!DensityField) + return FVector::ZeroVector; + + FVector GridPos = (Position - DensityField->GetGridOrigin()) / DensityField->GetStep(); + + int32 XBin = FMath::FloorToInt(GridPos.X); + int32 YBin = FMath::FloorToInt(GridPos.Y); + int32 ZBin = FMath::FloorToInt(GridPos.Z); + + // Fractional parts to interpolate + float XFraction = GridPos.X - XBin; + float YFraction = GridPos.Y - YBin; + float ZFraction = GridPos.Z - ZBin; + + // Fetch gradients from corners of the cell + FVector G000 = DensityField->GetVoxelGradientFromGridPosition(XBin, YBin, ZBin); + FVector G100 = DensityField->GetVoxelGradientFromGridPosition(XBin + 1, YBin, ZBin); + FVector G010 = DensityField->GetVoxelGradientFromGridPosition(XBin, YBin + 1, ZBin); + FVector G001 = DensityField->GetVoxelGradientFromGridPosition(XBin, YBin, ZBin + 1); + FVector G110 = DensityField->GetVoxelGradientFromGridPosition(XBin + 1, YBin + 1, ZBin); + FVector G101 = DensityField->GetVoxelGradientFromGridPosition(XBin + 1, YBin, ZBin + 1); + FVector G011 = DensityField->GetVoxelGradientFromGridPosition(XBin, YBin + 1, ZBin + 1); + FVector G111 = DensityField->GetVoxelGradientFromGridPosition(XBin + 1, YBin + 1, ZBin + 1); + + // Interpolate along x for each of the yz pairs + FVector G00 = FMath::Lerp(G000, G100, XFraction); + FVector G01 = FMath::Lerp(G001, G101, XFraction); + FVector G10 = FMath::Lerp(G010, G110, XFraction); + FVector G11 = FMath::Lerp(G011, G111, XFraction); + + // Interpolate along y + FVector G0 = FMath::Lerp(G00, G10, YFraction); + FVector G1 = FMath::Lerp(G01, G11, YFraction); + + // Final interpolation along z + FVector Gradient = FMath::Lerp(G0, G1, ZFraction); + + return Gradient; +} float FUtilities::GaussianKernel(const float Distance, const float Sigma) { return FMath::Exp(-0.5 * FMath::Square(Distance / Sigma)); } -FVector FUtilities::FollowGradientToMaximum(const FVector& StartPosition, const FDensityField* DensityField) +FVector FUtilities::FollowGradientToMaximum(const FDensityField* DensityField, const FVector& StartPosition) { FVector CurrentPosition = StartPosition; - double CurrentDensity = InterpolateDensityAtPosition(CurrentPosition, DensityField); + double CurrentDensity = InterpolateDensityAtPosition(DensityField, CurrentPosition); int Iterations = 0; constexpr int MaxIterations = 100; // Prevent infinite loops @@ -155,22 +121,21 @@ FVector FUtilities::FollowGradientToMaximum(const FVector& StartPosition, const while (Iterations < MaxIterations) { - FVector Gradient = InterpolateGradientAtPosition(CurrentPosition, DensityField); + FVector Gradient = InterpolateGradientAtPosition(DensityField, CurrentPosition); if (Gradient.IsNearlyZero()) { UE_LOG(LogTemp, Log, TEXT("Gradient is zero at position %s"), *CurrentPosition.ToString()); break; // Gradient is zero, likely at a local maximum } // Move towards the direction of the gradient - FVector NextPosition = CurrentPosition + StepSize * Gradient.GetSafeNormal(); - if (!DensityField->IsValidPosition(NextPosition)) { + FVector NextPosition = CurrentPosition + (StepSize * Gradient.GetSafeNormal()); + if (!DensityField->IsValidWorldPosition(NextPosition)) { UE_LOG(LogTemp, Warning, TEXT("Next position out of bounds: %s"), *NextPosition.ToString()); break; // Next position is out of valid bounds } - const double NewDensity = InterpolateDensityAtPosition(NextPosition, DensityField); - UE_LOG(LogTemp, Log, TEXT("Iteration %d: CurrentPos = %s, Gradient = %s, NextPos = %s, NewDensity = %f, CurrentDensity = %f"), - Iterations, *CurrentPosition.ToString(), *Gradient.ToString(), *NextPosition.ToString(), NewDensity, CurrentDensity); + const double NewDensity = InterpolateDensityAtPosition(DensityField, NextPosition); + //UE_LOG(LogTemp, Log, TEXT("Iteration %d: CurrentPos = %s, Gradient = %s, NextPos = %s, NewDensity = %f, CurrentDensity = %f"), Iterations, *CurrentPosition.ToString(), *Gradient.ToString(), *NextPosition.ToString(), NewDensity, CurrentDensity); if (NewDensity <= CurrentDensity) { // Check if density has increased UE_LOG(LogTemp, Log, TEXT("Density did not increase; stopping at position %s with density %f"), *CurrentPosition.ToString(), CurrentDensity); @@ -185,3 +150,51 @@ FVector FUtilities::FollowGradientToMaximum(const FVector& StartPosition, const return CurrentPosition; } +TArray<int32> FUtilities::FloodFilling(const FDensityField* DensityField, const int32 StartIndex, const float Threshold) +{ + UE_LOG(LogTemp, Warning, TEXT("T: %f"), Threshold); + + TArray<int32> VisitedIndices; + if (!DensityField) { + UE_LOG(LogTemp, Warning, TEXT("DensityField is null.")); + return VisitedIndices; + } + + if (!DensityField->IsValidIndex(StartIndex)) { + UE_LOG(LogTemp, Warning, TEXT("Start index %d is invalid."), StartIndex); + return VisitedIndices; + } + + TArray<int32> Stack; + Stack.Push(StartIndex); + TArray<bool> Visited; + Visited.Init(false, DensityField->GetVoxelNumber()); + + while (Stack.Num() > 0) + { + int32 CurrentIndex = Stack.Pop(); + if (!Visited[CurrentIndex]) + { + Visited[CurrentIndex] = true; + VisitedIndices.Add(CurrentIndex); + + TArray<int32> Neighbors = DensityField->GetNeighborsFromIndex(CurrentIndex); + UE_LOG(LogTemp, Log, TEXT("Visiting Node %d at Position %s with %d neighbors."), CurrentIndex, *DensityField->IndexToGridPosition(CurrentIndex).ToString(), Neighbors.Num()); + + for (int32 NeighborIndex : Neighbors) + { + if (DensityField->GetVoxelDensityFromIndex(NeighborIndex) > Threshold && !Visited[NeighborIndex]) { + Stack.Push(NeighborIndex); + } + } + } + } + + // Logging final details + UE_LOG(LogTemp, Log, TEXT("Flood filling completed from start index %d. Total voxels selected: %d"), StartIndex, VisitedIndices.Num()); + for (const int32 idx : VisitedIndices) { + UE_LOG(LogTemp, Log, TEXT("Selected Voxel Index: %d at Grid Position: %s"), idx, *DensityField->IndexToGridPosition(idx).ToString()); + } + + return VisitedIndices; +} diff --git a/Source/MetaCastBachelor/Utilities.h b/Source/MetaCastBachelor/Utilities.h index bba7a43..72313c1 100644 --- a/Source/MetaCastBachelor/Utilities.h +++ b/Source/MetaCastBachelor/Utilities.h @@ -6,8 +6,9 @@ class FUtilities { public: static void QuickSort(TArray<float>& Array, int32 Begin, int32 End); - static double InterpolateDensityAtPosition(const FVector& Position, const FDensityField* DensityField); - static FVector InterpolateGradientAtPosition(const FVector& Position, const FDensityField* DensityField); + static double InterpolateDensityAtPosition(const FDensityField* DensityField, const FVector& Position); + static FVector InterpolateGradientAtPosition(const FDensityField* DensityField, const FVector& Position); static float GaussianKernel(float Distance, float Sigma); - static FVector FollowGradientToMaximum(const FVector& StartPosition, const FDensityField* DensityField); + static FVector FollowGradientToMaximum(const FDensityField* DensityField, const FVector& StartPosition); + static TArray<int32> FloodFilling(const FDensityField* DensityField, const int32 StartIndex, const float Threshold); }; -- GitLab