CelticCraft/Plugins/VoxelFree/Source/Voxel/Private/VoxelAssets/VoxelDataAssetData.cpp

66 lines
No EOL
2.3 KiB
C++

// Copyright 2020 Phyronnaz
#include "VoxelAssets/VoxelDataAssetData.h"
#include "VoxelUtilities/VoxelSerializationUtilities.h"
#include "VoxelFeedbackContext.h"
DEFINE_VOXEL_MEMORY_STAT(STAT_VoxelDataAssetMemory);
void FVoxelDataAssetData::SetSize(const FIntVector& NewSize, bool bCreateMaterials)
{
VOXEL_FUNCTION_COUNTER();
check(int64(NewSize.X) * int64(NewSize.Y) * int64(NewSize.Z) < MAX_int32);
const int32 Num = NewSize.X * NewSize.Y * NewSize.Z;
// Somewhat thread safe
Values.Empty(Num);
Values.SetNumUninitialized(Num);
Materials.Empty(bCreateMaterials ? Num : 0);
Materials.SetNumUninitialized(bCreateMaterials ? Num : 0);
Size = NewSize;
ensure(Size.GetMin() > 0);
ensure(Size.GetMax() > 1); // Else it'll be considered empty
UpdateStats();
}
void FVoxelDataAssetData::Serialize(FArchive& Ar, uint32 ValueConfigFlag, uint32 MaterialConfigFlag, FVoxelDataAssetDataVersion::Type Version)
{
VOXEL_FUNCTION_COUNTER();
FVoxelScopedSlowTask Serializing(2.f);
Ar << Size;
const auto SerializationVersion =
Version >= FVoxelDataAssetDataVersion::ValueConfigFlagAndSaveGUIDs
? FVoxelSerializationVersion::ValueConfigFlagAndSaveGUIDs
: Version >= FVoxelDataAssetDataVersion::RemoveEnableVoxelSpawnedActorsEnableVoxelGrass
? FVoxelSerializationVersion::RemoveEnableVoxelSpawnedActorsEnableVoxelGrass
: FVoxelSerializationVersion::BeforeCustomVersionWasAdded;
static_assert(FVoxelSerializationVersion::LatestVersion == FVoxelSerializationVersion::SHARED_StoreMaterialChannelsIndividuallyAndRemoveFoliage, "Need to add a new FVoxelDataAssetDataVersion");
Serializing.EnterProgressFrame(1.f, VOXEL_LOCTEXT("Serializing values"));
FVoxelSerializationUtilities::SerializeValues(Ar, Values, ValueConfigFlag, SerializationVersion);
Serializing.EnterProgressFrame(1.f, VOXEL_LOCTEXT("Serializing materials"));
FVoxelSerializationUtilities::SerializeMaterials(Ar, Materials, MaterialConfigFlag, SerializationVersion);
if (Size.X * Size.Y * Size.Z != Values.Num() || (Materials.Num() > 0 && Size.X * Size.Y * Size.Z != Materials.Num()))
{
Ar.SetError();
}
UpdateStats();
}
void FVoxelDataAssetData::UpdateStats() const
{
DEC_VOXEL_MEMORY_STAT_BY(STAT_VoxelDataAssetMemory, AllocatedSize);
AllocatedSize = Values.GetAllocatedSize() + Materials.GetAllocatedSize();
INC_VOXEL_MEMORY_STAT_BY(STAT_VoxelDataAssetMemory, AllocatedSize);
}