Files
UnrealEngineUWP/Engine/Source/Editor/MovieSceneTools/Public/MovieSceneToolsModule.h
david bromberg 86154d2d61 Sequencer- Adding a track for animating custom primitive data on PrimitiveComponents.
Custom primitive data is an alternative way of driving material parameters. It allows you to map any of 36 numbered float parameters on a PrimitiveComponent to one or more material parameters across multiple meshes and materials. You can apportion between 1-4 slots in a row to handle anything from scalar to color parameters. Previously these could only be set via code or blueprint, but now these can be animated in Sequencer.

A custom primitive data track can be added to a Primitive Component binding track in Sequencer.
From there, you can choose to add a float, Vector2D, Vector, or Color parameter, choosing the custom primitive data start index the parameter starts from. The UI will also scan the primitive component for material parameters currently mapped to any index to give you helpful suggestions for which parameters you may want to add. These parameters can then be animated and blended just like any parameter of that type.

As this was a new track, we had to build a new track editor, track, and section. The section inherits from MovieSceneParameterSection, as this was already capable of animating parameters of these types. We use the unique start index of the parameter as the name for these parameter sections.

To create the dynamic tooltips that show which material parameters the custom primitive data entries are mapped to, a change was made to the tooltiptext channel metadata to take a lambda instead of just an FText. This allows the tooltips to be generated live, so any changes to materials will be taken into account in the tooltip.

A new screenshot autotest using the feature was also created.

#jira UE-158852
[REVIEW] [at]ue-sequencer

[CL 27300987 by david bromberg in ue5-main branch]
2023-08-23 05:36:36 -04:00

143 lines
5.8 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "Modules/ModuleInterface.h"
#include "Modules/ModuleManager.h"
#include "Misc/Guid.h"
#include "Curves/RichCurve.h"
#include "Containers/UnrealString.h"
#include "IMovieSceneTools.h"
struct FAssetData;
class UK2Node;
class UBlueprint;
class UMovieScene;
class UMovieSceneSection;
class UMovieSceneEventSectionBase;
class IMovieSceneToolsTrackImporter;
class ULevelSequence;
class IMovieSceneToolsTakeData
{
public:
virtual bool GatherTakes(const UMovieSceneSection* Section, TArray<FAssetData>& AssetData, uint32& OutCurrentTakeNumber) = 0;
virtual bool GetTakeNumber(const UMovieSceneSection* Section, FAssetData AssetData, uint32& OutTakeNumber) = 0;
virtual bool SetTakeNumber(const UMovieSceneSection*, uint32 InTakeNumber) = 0;
};
//Interface to get notifications when an animation bake happens in case in needs to run custom code
class IMovieSceneToolsAnimationBakeHelper
{
public:
virtual void StartBaking(UMovieScene* MovieScene) {};
virtual void PreEvaluation(UMovieScene* MovieScene, FFrameNumber Frame) {};
virtual void PostEvaluation(UMovieScene* MovieScene, FFrameNumber Frame) {};
virtual void StopBaking(UMovieScene* MovieScene) {};
};
/**
* Implements the MovieSceneTools module.
*/
class MOVIESCENETOOLS_API FMovieSceneToolsModule
: public IMovieSceneTools
{
public:
static inline FMovieSceneToolsModule& Get()
{
return FModuleManager::LoadModuleChecked< FMovieSceneToolsModule >("MovieSceneTools");
}
// IModuleInterface interface
virtual void StartupModule() override;
virtual void ShutdownModule() override;
void RegisterAnimationBakeHelper(IMovieSceneToolsAnimationBakeHelper* BakeHelper);
void UnregisterAnimationBakeHelper(IMovieSceneToolsAnimationBakeHelper* BakeHelper);
const TArray<IMovieSceneToolsAnimationBakeHelper*>& GetAnimationBakeHelpers() { return BakeHelpers; }
void RegisterTakeData(IMovieSceneToolsTakeData*);
void UnregisterTakeData(IMovieSceneToolsTakeData*);
bool GatherTakes(const UMovieSceneSection* Section, TArray<FAssetData>& AssetData, uint32& OutCurrentTakeNumber);
bool GetTakeNumber(const UMovieSceneSection* Section, FAssetData AssetData, uint32& OutTakeNumber);
bool SetTakeNumber(const UMovieSceneSection* Section, uint32 InTakeNumber);
void RegisterTrackImporter(IMovieSceneToolsTrackImporter*);
void UnregisterTrackImporter(IMovieSceneToolsTrackImporter*);
bool ImportAnimatedProperty(const FString& InPropertyName, const FRichCurve& InCurve, FGuid InBinding, UMovieScene* InMovieScene);
bool ImportStringProperty(const FString& InPropertyName, const FString& InPropertyValue, FGuid InBinding, UMovieScene* InMovieScene);
private:
void RegisterClipboardConversions();
static void FixupPayloadParameterNameForSection(UMovieSceneEventSectionBase* Section, UK2Node* InNode, FName OldPinName, FName NewPinName);
static void FixupPayloadParameterNameForDynamicBinding(UMovieScene* MovieScene, UK2Node* InNode, FName OldPinName, FName NewPinName);
static bool UpgradeLegacyEventEndpointForSection(UMovieSceneEventSectionBase* Section);
static void PostDuplicateEventSection(UMovieSceneEventSectionBase* Section);
static void RemoveForCookEventSection(UMovieSceneEventSectionBase* Section);
static bool IsTrackClassAllowed(UClass* InClass);
static void PostDuplicateEvent(ULevelSequence* LevelSequence);
private:
/** Registered delegate handles */
FDelegateHandle BoolPropertyTrackCreateEditorHandle;
FDelegateHandle BytePropertyTrackCreateEditorHandle;
FDelegateHandle ColorPropertyTrackCreateEditorHandle;
FDelegateHandle FloatPropertyTrackCreateEditorHandle;
FDelegateHandle DoublePropertyTrackCreateEditorHandle;
FDelegateHandle IntegerPropertyTrackCreateEditorHandle;
FDelegateHandle FloatVectorPropertyTrackCreateEditorHandle;
FDelegateHandle DoubleVectorPropertyTrackCreateEditorHandle;
FDelegateHandle TransformPropertyTrackCreateEditorHandle;
FDelegateHandle EulerTransformPropertyTrackCreateEditorHandle;
FDelegateHandle VisibilityPropertyTrackCreateEditorHandle;
FDelegateHandle ActorReferencePropertyTrackCreateEditorHandle;
FDelegateHandle StringPropertyTrackCreateEditorHandle;
FDelegateHandle ObjectTrackCreateEditorHandle;
FDelegateHandle AnimationTrackCreateEditorHandle;
FDelegateHandle AttachTrackCreateEditorHandle;
FDelegateHandle AudioTrackCreateEditorHandle;
FDelegateHandle EventTrackCreateEditorHandle;
FDelegateHandle ParticleTrackCreateEditorHandle;
FDelegateHandle ParticleParameterTrackCreateEditorHandle;
FDelegateHandle PathTrackCreateEditorHandle;
FDelegateHandle CameraCutTrackCreateEditorHandle;
FDelegateHandle CinematicShotTrackCreateEditorHandle;
FDelegateHandle SlomoTrackCreateEditorHandle;
FDelegateHandle SubTrackCreateEditorHandle;
FDelegateHandle TransformTrackCreateEditorHandle;
FDelegateHandle ComponentMaterialTrackCreateEditorHandle;
FDelegateHandle FadeTrackCreateEditorHandle;
FDelegateHandle SpawnTrackCreateEditorHandle;
FDelegateHandle LevelVisibilityTrackCreateEditorHandle;
FDelegateHandle DataLayerTrackCreateEditorHandle;
FDelegateHandle CameraShakeTrackCreateEditorHandle;
FDelegateHandle MPCTrackCreateEditorHandle;
FDelegateHandle PrimitiveMaterialCreateEditorHandle;
FDelegateHandle CameraShakeSourceShakeCreateEditorHandle;
FDelegateHandle CVarTrackCreateEditorHandle;
FDelegateHandle CustomPrimitiveDataTrackCreateEditorHandle;
FDelegateHandle CameraCutTrackModelHandle;
FDelegateHandle CinematicShotTrackModelHandle;
FDelegateHandle GenerateEventEntryPointsHandle;
FDelegateHandle FixupDynamicBindingPayloadParameterNameHandle;
FDelegateHandle FixupEventSectionPayloadParameterNameHandle;
FDelegateHandle UpgradeLegacyEventEndpointHandle;
FDelegateHandle OnObjectsReplacedHandle;
TArray<IMovieSceneToolsTakeData*> TakeDatas;
TArray<IMovieSceneToolsTrackImporter*> TrackImporters;
TArray<IMovieSceneToolsAnimationBakeHelper*> BakeHelpers;
};