// Copyright 2020 Phyronnaz #pragma once #include "CoreMinimal.h" #include "VoxelValue.h" #include "VoxelMaterial.h" class FArchive; class FLargeMemoryWriter; namespace FVoxelSerializationVersion { enum Type : int32 { BeforeCustomVersionWasAdded, SHARED_PlaceableItemsInSave, SHARED_AssetItemsImportValueMaterials, SHARED_DataAssetScale, SHARED_RemoveVoxelGrass, SHARED_DataAssetTransform, RemoveEnableVoxelSpawnedActorsEnableVoxelGrass, SHARED_FoliagePaint, ValueConfigFlagAndSaveGUIDs, SHARED_SingleValues, SHARED_NoVoxelMaterialInHeightmapAssets, SHARED_FixMissingMaterialsInHeightmapAssets, SHARED_AddUserFlagsToSaves, SHARED_StoreSpawnerMatricesRelativeToComponent, SHARED_StoreMaterialChannelsIndividuallyAndRemoveFoliage, // ------------------------------------------------------ VersionPlusOne, LatestVersion = VersionPlusOne - 1 }; }; namespace EVoxelCompressionLevel { enum Type : int32 { NoCompression = 0, BestSpeed = 1, BestCompression = 9, DefaultCompression = -1, VoxelDefault = -2 }; } namespace FVoxelSerializationUtilities { VOXEL_API void SerializeValues(FArchive& Archive, TNoGrowArray& Values, uint32 ValueConfigFlag, FVoxelSerializationVersion::Type VoxelCustomVersion); VOXEL_API void SerializeMaterials(FArchive& Archive, TNoGrowArray& Materials, uint32 MaterialConfigFlag, FVoxelSerializationVersion::Type VoxelCustomVersion); template void SerializeMaterials(FArchive& Archive, TNoGrowArray>& Materials, uint32 MaterialConfigFlag) { VOXEL_ASYNC_FUNCTION_COUNTER(); static_assert(sizeof(TVoxelMaterialStorage) / sizeof(T) == TVoxelMaterialStorage::NumChannels, "Serialization below will be broken"); if (Archive.IsLoading()) { if (MaterialConfigFlag == GVoxelMaterialConfigFlag) { int32 MaterialsSize; Archive << MaterialsSize; Materials.Empty(MaterialsSize); Materials.SetNumUninitialized(MaterialsSize); Archive.Serialize(Materials.GetData(), MaterialsSize * sizeof(TVoxelMaterialStorage)); } else { int32 MaterialsSize; Archive << MaterialsSize; Materials.Empty(MaterialsSize); Materials.SetNumUninitialized(MaterialsSize); for (int32 I = 0; I < MaterialsSize; I++) { Materials[I] = TVoxelMaterialStorage::SerializeWithCustomConfig(Archive, MaterialConfigFlag); } } } else if (Archive.IsSaving()) { int32 MaterialsSize = Materials.Num(); Archive << MaterialsSize; Archive.Serialize(Materials.GetData(), MaterialsSize * sizeof(TVoxelMaterialStorage)); } } ////////////////////////////////////////////////////////////////////////////// VOXEL_API void CompressData( const uint8* UncompressedData, int64 UncompressedDataNum, TArray& OutCompressedData, EVoxelCompressionLevel::Type CompressionLevel = EVoxelCompressionLevel::VoxelDefault); VOXEL_API void CompressData( FLargeMemoryWriter& UncompressedData, TArray& CompressedData, EVoxelCompressionLevel::Type CompressionLevel = EVoxelCompressionLevel::VoxelDefault); inline void CompressData( const TArray& UncompressedData, TArray& CompressedData, EVoxelCompressionLevel::Type CompressionLevel = EVoxelCompressionLevel::VoxelDefault) { CompressData(UncompressedData.GetData(), UncompressedData.Num(), CompressedData, CompressionLevel); } VOXEL_API bool DecompressData(const TArray& CompressedData, TArray64& UncompressedData); VOXEL_API void TestCompression(int64 Size, EVoxelCompressionLevel::Type CompressionLevel); }