Files
FlaxEngine/Source/Engine/Content/Upgraders/SkeletonMaskUpgrader.h
Wojciech Figat a7e428a21c Merge branch 'master' into 1.5
# Conflicts:
#	Content/Shaders/GI/DDGI.flax
#	Content/Shaders/GI/GlobalSurfaceAtlas.flax
#	Content/Shaders/TAA.flax
#	Content/Shaders/VolumetricFog.flax
#	Source/Editor/CustomEditors/Editors/ActorTagEditor.cs
#	Source/Engine/Core/Config/GraphicsSettings.cpp
#	Source/Engine/Engine/PostProcessEffect.cs
#	Source/Engine/Graphics/GPUResourcesCollection.cpp
#	Source/Engine/Graphics/GPUResourcesCollection.h
#	Source/Engine/Graphics/PostProcessBase.h
#	Source/FlaxEngine.Gen.cs
2023-01-10 15:37:55 +01:00

103 lines
2.9 KiB
C++

// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved.
#pragma once
#if USE_EDITOR
#include "BinaryAssetUpgrader.h"
#include "Engine/Content/Assets/SkinnedModel.h"
#include "Engine/Serialization/MemoryReadStream.h"
#include "Engine/Serialization/MemoryWriteStream.h"
#include "Engine/Threading/Threading.h"
/// <summary>
/// Skeleton Mask asset upgrader.
/// </summary>
/// <seealso cref="BinaryAssetUpgrader" />
class SkeletonMaskUpgrader : public BinaryAssetUpgrader
{
public:
/// <summary>
/// Initializes a new instance of the <see cref="SkeletonMaskUpgrader"/> class.
/// </summary>
SkeletonMaskUpgrader()
{
static const Upgrader upgraders[] =
{
{ 1, 2, &Upgrade_1_To_2 },
};
setup(upgraders, ARRAY_COUNT(upgraders));
}
private:
static bool Upgrade_1_To_2(AssetMigrationContext& context)
{
ASSERT(context.Input.SerializedVersion == 1 && context.Output.SerializedVersion == 2);
// Load data
AssetReference<SkinnedModel> skeleton;
Array<bool> bonesMask;
{
auto dataChunk = context.Input.Header.Chunks[0];
if (dataChunk == nullptr || dataChunk->IsMissing())
{
LOG(Warning, "Missing data chunk.");
return true;
}
MemoryReadStream stream(dataChunk->Get(), dataChunk->Size());
Guid skeletonId;
stream.Read(skeletonId);
int32 maskCount;
stream.ReadInt32(&maskCount);
bonesMask.Resize(maskCount, false);
if (maskCount > 0)
stream.ReadBytes(bonesMask.Get(), maskCount * sizeof(bool));
skeleton = skeletonId;
if (skeleton && skeleton->WaitForLoaded())
{
LOG(Warning, "Failed to load skeleton to update skeleton mask.");
return true;
}
}
// Build nodes mask from bones
Array<String> nodesMask;
if (skeleton)
{
ScopeLock lock(skeleton->Locker);
for (int32 i = 0; i < bonesMask.Count(); i++)
{
if (bonesMask[i])
{
int32 nodeIndex = skeleton->Skeleton.Bones[i].NodeIndex;
nodesMask.Add(skeleton->Skeleton.Nodes[nodeIndex].Name);
}
}
}
// Save data
{
if (context.AllocateChunk(0))
return true;
MemoryWriteStream stream(4096);
const Guid skeletonId = skeleton.GetID();
stream.Write(skeletonId);
stream.WriteInt32(nodesMask.Count());
for (auto& e : nodesMask)
{
stream.WriteString(e, -13);
}
context.Output.Header.Chunks[0]->Data.Copy(stream.GetHandle(), stream.GetPosition());
}
return false;
}
};
#endif