// Copyright Epic Games, Inc. All Rights Reserved. #include "Tracks/MovieSceneMaterialParameterCollectionTrack.h" #include "Materials/MaterialParameterCollection.h" #include "Evaluation/MovieSceneEvaluationField.h" #include "EntitySystem/BuiltInComponentTypes.h" #include "MovieSceneTracksComponentTypes.h" #include "Sections/MovieSceneComponentMaterialParameterSection.h" #include UE_INLINE_GENERATED_CPP_BY_NAME(MovieSceneMaterialParameterCollectionTrack) #define LOCTEXT_NAMESPACE "MovieSceneMaterialParameterCollectionTrack" UMovieSceneMaterialParameterCollectionTrack::UMovieSceneMaterialParameterCollectionTrack(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { #if WITH_EDITORONLY_DATA TrackTint = FColor(64,192,64,65); #endif } UMovieSceneSection* UMovieSceneMaterialParameterCollectionTrack::CreateNewSection() { UMovieSceneSection* NewSection = NewObject(this, NAME_None, RF_Transactional); NewSection->SetBlendType(EMovieSceneBlendType::Absolute); NewSection->SetRange(TRange::All()); return NewSection; } void UMovieSceneMaterialParameterCollectionTrack::ImportEntityImpl(UMovieSceneEntitySystemLinker* EntityLinker, const FEntityImportParams& Params, FImportedEntity* OutImportedEntity) { // These tracks don't define any entities for themselves checkf(false, TEXT("This track should never have created entities for itself - this assertion indicates an error in the entity-component field")); } void UMovieSceneMaterialParameterCollectionTrack::ExtendEntityImpl(UMovieSceneParameterSection* Section, UMovieSceneEntitySystemLinker* EntityLinker, const UE::MovieScene::FEntityImportParams& Params, UE::MovieScene::FImportedEntity* OutImportedEntity) { using namespace UE::MovieScene; FBuiltInComponentTypes* BuiltInComponents = FBuiltInComponentTypes::Get(); FMovieSceneTracksComponentTypes* TracksComponents = FMovieSceneTracksComponentTypes::Get(); // Material parameters are always absolute blends for the time being OutImportedEntity->AddBuilder( FEntityBuilder() .Add(TracksComponents->MPC, MPC) .AddTag(BuiltInComponents->Tags.Root) // If the section has no valid blend type (legacy data), make it use absolute blending. // Otherwise, the base section class will add the appropriate blend type tag in BuildDefaultComponents. .AddTagConditional(BuiltInComponents->Tags.AbsoluteBlend, !Section->GetBlendType().IsValid()) ); } bool UMovieSceneMaterialParameterCollectionTrack::PopulateEvaluationFieldImpl(const TRange& EffectiveRange, const FMovieSceneEvaluationFieldEntityMetaData& InMetaData, FMovieSceneEntityComponentFieldBuilder* OutFieldBuilder) { const FMovieSceneTrackEvaluationField& LocalEvaluationField = GetEvaluationField(); // Define entities for the old style parameter sections. ComponentMaterialParameterSections define their own. for (const FMovieSceneTrackEvaluationFieldEntry& Entry : LocalEvaluationField.Entries) { UMovieSceneParameterSection* ParameterSection = Cast(Entry.Section); UMovieSceneComponentMaterialParameterSection* ComponentMaterialParameterSection = Cast(Entry.Section); if (ParameterSection || ComponentMaterialParameterSection) { if (IsRowEvalDisabled(Entry.Section->GetRowIndex())) { continue; } TRange SectionEffectiveRange = TRange::Intersection(EffectiveRange, Entry.Range); if (!SectionEffectiveRange.IsEmpty()) { FMovieSceneEvaluationFieldEntityMetaData SectionMetaData = InMetaData; SectionMetaData.Flags = Entry.Flags; if (Entry.Section) { SectionMetaData.Condition = MovieSceneHelpers::GetSequenceCondition(this, Entry.Section, true); } if (ParameterSection) { ParameterSection->ExternalPopulateEvaluationField(SectionEffectiveRange, SectionMetaData, OutFieldBuilder); } else if (ComponentMaterialParameterSection) { ComponentMaterialParameterSection->ExternalPopulateEvaluationField(SectionEffectiveRange, SectionMetaData, OutFieldBuilder); } } } } return true; } bool UMovieSceneMaterialParameterCollectionTrack::SupportsType(TSubclassOf SectionClass) const { return SectionClass == UMovieSceneComponentMaterialParameterSection::StaticClass() || SectionClass == UMovieSceneParameterSection::StaticClass(); } #if WITH_EDITORONLY_DATA FText UMovieSceneMaterialParameterCollectionTrack::GetDefaultDisplayName() const { return LOCTEXT("DefaultTrackName", "Material Parameter Collection"); } #endif #undef LOCTEXT_NAMESPACE