// Copyright 2020 Phyronnaz #pragma once #include "CoreMinimal.h" #include "VoxelValue.h" #include "VoxelMaterial.h" #include "VoxelDiff.h" #include "VoxelUtilities/VoxelMiscUtilities.h" DECLARE_VOXEL_MEMORY_STAT(TEXT("Voxel Multiplayer Memory"), STAT_VoxelMultiplayerMemory, STATGROUP_VoxelMemory, VOXEL_API); template struct TEmptyArray { inline int32 Add(T Value) { return -1; } inline int32 Num() const { return 0; } inline T* begin() const { return nullptr; } inline T* end() const { return nullptr; } }; class FVoxelDataOctreeLeafMultiplayer { public: struct FDirty { // TODO bit arrays would be better TSet Values; TSet Materials; }; FDirty Dirty; public: template FORCEINLINE void MarkIndexDirty(FVoxelCellIndex Index) { FVoxelUtilities::TValuesMaterialsSelector::Get(Dirty).Add(Index); } template void AddToDiffQueueAndReset(const TData& Data, TArray>& OutDiffQueue) { auto& DirtyT = FVoxelUtilities::TValuesMaterialsSelector::Get(Dirty); for (int32 Index : DirtyT) { OutDiffQueue.Emplace(Index, Data.Get(Index)); } DirtyT.Empty(); } template bool IsNetworkDirty() { return FVoxelUtilities::TValuesMaterialsSelector::Get(Dirty).Num() > 0; } };