Skip to content
Snippets Groups Projects
Select Git revision
  • dce992eee8b4b5c06b7b623224f41856309a2988
  • 5.4 default protected
  • 5.6-fix-android-build-dependencies
  • fix/stuck-in-geometry
  • 5.5
  • dev/5.5
  • dev/5.4
  • dev/5.6
  • dev/5.3_downgrade
  • feature/experimenttime_hack
  • 5.3 protected
  • _IntenSelect5.3
  • IntenSelect5.3
  • 4.27 protected
  • 4.26 protected
  • 5.0 protected
  • 4.22 protected
  • 4.21 protected
  • UE5.4-2024.1
  • UE5.5-1
  • UE5.4-2024.1-rc1
  • UE5.3-2023.1-rc3
  • UE5.3-2023.1-rc2
  • UE5.3-2023.1-rc
24 results

TurnComponent.cpp

Blame
  • DensityField.h 3.58 KiB
    #pragma once
    
    #include "CoreMinimal.h"
    #include "DensityField.generated.h"
    
    class APointCloud;
    
    USTRUCT(BlueprintType)
    struct FVoxel
    {
        GENERATED_BODY()
    
    private:
        FVector WorldPosition;
    	FIntVector3 GridPosition;
        double VoxelDensity;
        FVector VoxelGradient;
    	double ClosePointsNumber;
    
    public:
        FVoxel() : WorldPosition(FVector::ZeroVector), GridPosition(FIntVector3::ZeroValue), VoxelDensity(0.0), VoxelGradient(FVector::ZeroVector), ClosePointsNumber(0.0) {}
        FVoxel(const FVector &InPosition, const FIntVector3 &InGridPos) : WorldPosition(InPosition), GridPosition(InGridPos), VoxelDensity(0.0), VoxelGradient(FVector::ZeroVector), ClosePointsNumber(0.0) {}
    	
        double GetVoxelDensity() const { return VoxelDensity; }
    	FIntVector3 GetVoxelGridPos() const { return GridPosition; }
        FVector GetVoxelPosition() const { return WorldPosition; }
        FVector GetVoxelGradient() const { return VoxelGradient; }
    	double GetClosePointsNumber() const { return ClosePointsNumber; }
    	
    	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)
    struct FLUTUnit
    {
        GENERATED_BODY()
    
        TArray<int32> LUTUnit;
    
        void AddToLUT(const int32 TargetInt)
        {
            LUTUnit.Add(TargetInt);
        }
    
        TArray<int32> GetLTUnit() const
        {
            return LUTUnit;
        }
    };
    
    class FDensityField
    {
    	//	VARIABLES
        TArray<FVoxel> VoxelList;
        int32 XNum, YNum, ZNum;
        float XStep, YStep, ZStep;
    	FVector GridOrigin;
    	
    public:
    	mutable FCriticalSection DataGuard;
    	// CONSTRUCTOR
    	FDensityField();
    
    	// INITIALIZATION FUNCTIONS
    	void InitializeDensityField(const FVector& MinBounds, const FVector& MaxBounds, const int32 XAxisNum, const int32 YAxisNum, const int32 ZAxisNum);
        void CalculateVoxelDensities(const APointCloud* PointCloud, float InfluenceRadius, float Sigma);
    	void CalculateVoxelDensitiesByNumber(const APointCloud* PointCloud, float InfluenceRadius);
    	void CalculateAndStoreGradients();
    
    	//	DEBUG FUNCTIONS
        void DrawDebugVoxelDensity(const UWorld* World, const AActor* Actor, float Duration, float Scale, float DensityThreshold) const;
    
    	// CONVERSION FUNCTIONS
    	int32 WorldPositionToIndex(const FVector& Position) const;
    	FIntVector3 WorldToGridPosition(const FVector& Position) const;
    	bool IsValidGridPosition(int32 XBin, int32 YBin, int32 ZBin) const;
    	int32 GridPositionToIndex(int32 X, int32 Y, int32 Z) const;
    	TArray<FVector> IndexToVoxelCornersWorld(const int32 Index) const;
    	
    	// GETTER AND SETTER FUNCTIONS
    	FVector GetGridOrigin() const;
        FVector IndexToVoxelGradient(int32 Index) const;
        FVector IndexToVoxelPosition(int32 Index) const;
    	FIntVector3 IndexToGridPosition(int32 Index) const;
    	int32 GetVoxelNumber() const;
        double IndexToVoxelDensity(int32 Index) const;
    	void IndexToVoxelBounds(int32 Index, FVector& OutMinBounds, FVector& OutMaxBounds) const;
    	double GridPositionToVoxelDensity(int32 XBin, int32 YBin, int32 ZBin) const;
    	FVector GridPositionToVoxelGradient(int32 XBin, int32 YBin, int32 ZBin) const;
    	FVector GetStep() const;
    	int32 GetXNum() const;
    	int32 GetYNum() const;
    	int32 GetZNum() const;
    	bool IsValidWorldPosition(const FVector& Position) const;
    	TArray<int32> IndexToVoxelNeighbors(const int32 Index) const;
    	bool IsValidIndex(int32 Index) const;
    	bool IsValid();
    	void SetVoxelDensityByIndex(int32 Index, double Density);
        void SetVoxelGradientByIndex(int32 Index, const FVector& Gradient);
    };