// Copyright 2020 Phyronnaz #pragma once #include "CoreMinimal.h" #include "VoxelRender/VoxelMaterialIndices.h" class FVoxelMaterialInterface; struct FVoxelChunkMaterials { public: FVoxelChunkMaterials() = default; template TVoxelSharedRef FindOrAddSingle(T Create) { if (!SingleMaterial.IsValid()) { const TVoxelSharedRef NewMaterial = Create(); SingleMaterial = NewMaterial; } return SingleMaterial.ToSharedRef(); } template TVoxelSharedRef FindOrAddMultiple(const FVoxelMaterialIndices& Key, T Create) { auto* Result = Materials.Find(Key); if (!Result) { const TVoxelSharedRef NewMaterial = Create(); Result = &Materials.Add(Key, NewMaterial); } return Result->ToSharedRef(); } void Reset() { SingleMaterial.Reset(); Materials.Empty(); } private: TVoxelSharedPtr SingleMaterial; TMap> Materials; };