// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "Templates/SharedPointer.h" #include "EntitySystem/MovieSceneComponentAccessors.h" #include "EntitySystem/MovieSceneEntitySystemTypes.h" #include "EntitySystem/MovieScenePropertySystemTypes.h" #include "EntitySystem/MovieScenePropertyRegistry.h" class UMovieSceneEntitySystemLinker; class FTrackInstancePropertyBindings; namespace UE { namespace MovieScene { template FORCEINLINE void PatchComposite(uint8* OutValueBase, const CompositeType* Composite, uint16 PtrOffset) { if (Composite) { *reinterpret_cast(OutValueBase + PtrOffset) = *Composite; } } template FORCEINLINE void PatchCompositeValueImpl(const TIntegerSequence&, TArrayView CompositeDefinitions, uint8* OutValueBase, const CompositeTypes*... Composites) { int Tmp[] = { ( PatchComposite(OutValueBase, Composites, CompositeDefinitions[CompositeIndices].CompositeOffset), 0 )..., 0 }; (void)Tmp; } template void PatchCompositeValue(TArrayView CompositeDefinitions, void* OutValueAddress, const CompositeTypes*... Composites) { uint8* ValueBase = static_cast(OutValueAddress); PatchCompositeValueImpl(TMakeIntegerSequence(), CompositeDefinitions, ValueBase, Composites...); } template struct TSetPartialPropertyValuesImpl; template struct TSetPartialPropertyValuesImpl, TIntegerSequence, CompositeTypes...> { using StorageType = typename PropertyTraits::StorageType; using FThreeWayAccessor = TMultiReadOptional>; using FTwoWayAccessor = TMultiReadOptional>; explicit TSetPartialPropertyValuesImpl(ICustomPropertyRegistration* InCustomProperties, TArrayView InCompositeDefinitions) : CustomProperties(InCustomProperties) , CompositeDefinitions(InCompositeDefinitions) { if (CustomProperties) { CustomAccessors = CustomProperties->GetAccessors(); } } void ForEachAllocation(const FEntityAllocation* Allocation, TRead BoundObjectComponents, FThreeWayAccessor PropertyBindingComponents, TRead... InMetaData, TReadOptional... InCompositeComponents) const; void ForEachAllocation(const FEntityAllocation* Allocation, TRead BoundObjectComponents, FTwoWayAccessor PropertyBindingComponents, TRead... InMetaData, TReadOptional... InCompositeComponents) const; private: void ForEachCustom(const FEntityAllocation* Allocation, UObject* const* Objects, const FCustomPropertyIndex* Custom, const MetaDataTypes*... InMetaData, const CompositeTypes*... InCompositeComponents) const; void ForEachFast(const FEntityAllocation* Allocation, UObject* const* Objects, const uint16* Fast, const MetaDataTypes*... InMetaData, const CompositeTypes*... InCompositeComponents) const; void ForEachSlow(const FEntityAllocation* Allocation, UObject* const* Objects, const TSharedPtr* Slow, const MetaDataTypes*... InMetaData, const CompositeTypes*... InCompositeComponents) const; private: ICustomPropertyRegistration* CustomProperties; FCustomAccessorView CustomAccessors; TArrayView CompositeDefinitions; }; template using TSetPartialPropertyValues = TSetPartialPropertyValuesImpl, CompositeTypes...>; } // namespace MovieScene } // namespace UE