Files
UnrealEngine/Engine/Source/Runtime/MovieScene/Private/EntitySystem/MovieSceneComponentRegistry.cpp
2025-05-18 13:04:45 +08:00

88 lines
2.5 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "EntitySystem/MovieSceneComponentRegistry.h"
#include "EntitySystem/MovieSceneComponentTypeInfo.h"
namespace UE
{
namespace MovieScene
{
FComponentTypeID FComponentRegistry::NewTag(const TCHAR* const DebugName, EComponentTypeFlags Flags)
{
FComponentTypeInfo NewTypeInfo;
NewTypeInfo.Sizeof = 0;
NewTypeInfo.Alignment = 0;
NewTypeInfo.bIsZeroConstructType = 1;
NewTypeInfo.bIsTriviallyDestructable = 1;
NewTypeInfo.bIsTriviallyCopyAssignable = 1;
NewTypeInfo.bIsPreserved = EnumHasAnyFlags(Flags, EComponentTypeFlags::Preserved);
NewTypeInfo.bIsCopiedToOutput = EnumHasAnyFlags(Flags, EComponentTypeFlags::CopyToOutput);
NewTypeInfo.bIsMigratedToOutput = EnumHasAnyFlags(Flags, EComponentTypeFlags::MigrateToOutput);
#if UE_MOVIESCENE_ENTITY_DEBUG
NewTypeInfo.DebugInfo = MakeUnique<FComponentTypeDebugInfo>();
NewTypeInfo.DebugInfo->DebugName = DebugName;
NewTypeInfo.DebugInfo->DebugTypeName = TEXT("TAG");
#endif
FComponentTypeID NewType = NewComponentTypeInternal(MoveTemp(NewTypeInfo));
if (EnumHasAnyFlags(Flags, EComponentTypeFlags::CopyToChildren))
{
Factories.DefineChildComponent(NewType, NewType);
}
return NewType;
}
FComponentTypeID FComponentRegistry::NewComponentTypeInternal(FComponentTypeInfo&& TypeInfo)
{
check(ComponentTypes.Num() < MaximumNumComponentsSupported-1);
const bool bAddToPreservationMask = TypeInfo.bIsPreserved;
const bool bAddToCopyMask = TypeInfo.bIsCopiedToOutput;
const bool bAddToMigrationMask = TypeInfo.bIsMigratedToOutput;
const bool bIsTag = TypeInfo.IsTag();
const int32 InsertedIndex = ComponentTypes.Add(MoveTemp(TypeInfo));
// ~~~~~~~~~~~~~~~~~ TypeInfo is now garbage ~~~~~~~~~~~~~~~~~
FComponentTypeID NewComponentType = FComponentTypeID::FromBitIndex(InsertedIndex);
if (bAddToPreservationMask)
{
PreservationMask.Set(NewComponentType);
}
if (bAddToCopyMask)
{
CopyAndMigrationMask.Set(NewComponentType);
}
if (bAddToMigrationMask)
{
MigrationMask.Set(NewComponentType);
CopyAndMigrationMask.Set(NewComponentType);
}
if (!bIsTag)
{
NonTagComponentMask.Set(NewComponentType);
}
return FComponentTypeID::FromBitIndex(InsertedIndex);
}
const FComponentTypeInfo& FComponentRegistry::GetComponentTypeChecked(FComponentTypeID ComponentTypeID) const
{
check(ComponentTypes.IsValidIndex(ComponentTypeID.BitIndex()));
return ComponentTypes[ComponentTypeID.BitIndex()];
}
} // using namespace MovieScene
} // using namespace UE