// Copyright 2020 Phyronnaz #pragma once #include "CoreMinimal.h" #include "VoxelDirection.h" #include "VoxelContainers/VoxelStaticArray.h" #include "VoxelData/VoxelDataAccelerator.h" #include "VoxelRender/Meshers/VoxelMesher.h" #define CUBIC_CHUNK_SIZE_WITH_NEIGHBORS (RENDER_CHUNK_SIZE + 2) class FVoxelCubicMesher : public FVoxelMesher { public: using FVoxelMesher::FVoxelMesher; protected: virtual FVoxelIntBox GetBoundsToCheckIsEmptyOn() const override final; virtual FVoxelIntBox GetBoundsToLock() const override final; virtual TVoxelSharedPtr CreateFullChunkImpl(FVoxelMesherTimes& Times) override final; virtual void CreateGeometryImpl(FVoxelMesherTimes& Times, TArray& Indices, TArray& Vertices) override final; private: TUniquePtr Accelerator; TVoxelStaticArray CachedValues; private: template void CreateGeometryTemplate(FVoxelMesherTimes& Times, TArray& Indices, TArray& Vertices); private: FVoxelValue GetValue(int32 X, int32 Y, int32 Z) const; }; class FVoxelCubicTransitionsMesher : public FVoxelTransitionsMesher { public: using FVoxelTransitionsMesher::FVoxelTransitionsMesher; protected: virtual FVoxelIntBox GetBoundsToCheckIsEmptyOn() const override final; virtual FVoxelIntBox GetBoundsToLock() const override final; virtual TVoxelSharedPtr CreateFullChunkImpl(FVoxelMesherTimes& Times) override final; private: TUniquePtr Accelerator; private: template void CreateTransitionsForDirection(FVoxelMesherTimes& Times, TArray& Indices, TArray& Vertices); private: template FVoxelValue GetValue(int32 InStep, int32 X, int32 Y, int32 Z) const; template FVoxelMaterial GetMaterial(int32 InStep, int32 X, int32 Y, int32 Z) const; // LX * HalfStep = GX template void Add2DFace( int32 InStep, const FVoxelMaterial& Material, int32 LX, int32 LY, TArray& Vertices, TArray& Indices); template static FIntVector Local2DToGlobal(int32 InSize, int32 LX, int32 LY, int32 LZ); };