Files
Brandyn / Techy fcc1b09210 init
2026-04-04 15:40:51 -05:00

169 lines
4.6 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "Tracks/MovieSceneEventTrack.h"
#include "MovieSceneCommonHelpers.h"
#include "Sections/MovieSceneEventSection.h"
#include "Sections/MovieSceneEventSectionBase.h"
#include "Sections/MovieSceneEventTriggerSection.h"
#include "Sections/MovieSceneEventRepeaterSection.h"
#include "Evaluation/MovieSceneEventTemplate.h"
#include "Evaluation/MovieSceneEvaluationTrack.h"
#include "Compilation/IMovieSceneTemplateGenerator.h"
#include "IMovieSceneTracksModule.h"
#include "Evaluation/MovieSceneEvaluationCustomVersion.h"
#include UE_INLINE_GENERATED_CPP_BY_NAME(MovieSceneEventTrack)
#define LOCTEXT_NAMESPACE "MovieSceneEventTrack"
/* UMovieSceneTrack interface
*****************************************************************************/
#if WITH_EDITORONLY_DATA
void UMovieSceneEventTrack::Serialize(FArchive& Ar)
{
Ar.UsingCustomVersion(FMovieSceneEvaluationCustomVersion::GUID);
if (Ar.IsLoading())
{
if (Ar.CustomVer(FMovieSceneEvaluationCustomVersion::GUID) < FMovieSceneEvaluationCustomVersion::EntityManager)
{
// Default for legacy content was AfterSpawn
EventPosition = EFireEventsAtPosition::AfterSpawn;
}
}
Super::Serialize(Ar);
}
void UMovieSceneEventTrack::PostRename(UObject* OldOuter, const FName OldName)
{
if (OldOuter != GetOuter())
{
Super::PostRename(OldOuter, OldName);
for (UMovieSceneSection* Section : Sections)
{
if (UMovieSceneEventSectionBase* EventSection = Cast<UMovieSceneEventSectionBase>(Section))
{
EventSection->PostDuplicateSectionEvent.Execute(EventSection);
}
}
}
}
#endif// WITH_EDITOR
void UMovieSceneEventTrack::AddSection(UMovieSceneSection& Section)
{
Sections.Add(&Section);
}
bool UMovieSceneEventTrack::SupportsType(TSubclassOf<UMovieSceneSection> SectionClass) const
{
return SectionClass == UMovieSceneEventSection::StaticClass();
}
UMovieSceneSection* UMovieSceneEventTrack::CreateNewSection()
{
return NewObject<UMovieSceneEventTriggerSection>(this, NAME_None, RF_Transactional);
}
const TArray<UMovieSceneSection*>& UMovieSceneEventTrack::GetAllSections() const
{
return Sections;
}
bool UMovieSceneEventTrack::HasSection(const UMovieSceneSection& Section) const
{
return Sections.Contains(&Section);
}
bool UMovieSceneEventTrack::IsEmpty() const
{
return (Sections.Num() == 0);
}
void UMovieSceneEventTrack::RemoveAllAnimationData()
{
Sections.Empty();
}
void UMovieSceneEventTrack::RemoveSection(UMovieSceneSection& Section)
{
Sections.Remove(&Section);
}
void UMovieSceneEventTrack::RemoveSectionAt(int32 SectionIndex)
{
Sections.RemoveAt(SectionIndex);
}
EMovieSceneCompileResult UMovieSceneEventTrack::CustomCompile(FMovieSceneEvaluationTrack& Track, const FMovieSceneTrackCompilerArgs& Args) const
{
// Don't run the legacy track compile for tracks that don't contain contain legacy event sections
const bool bContainsLegacySections = Sections.ContainsByPredicate([](UMovieSceneSection* InSection){ return InSection && InSection->IsA<UMovieSceneEventSection>(); });
if (!bContainsLegacySections)
{
return EMovieSceneCompileResult::Failure;
}
return Compile(Track, Args);
}
FMovieSceneEvalTemplatePtr UMovieSceneEventTrack::CreateTemplateForSection(const UMovieSceneSection& InSection) const
{
if (const UMovieSceneEventSection* LegacyEventSection = Cast<const UMovieSceneEventSection>(&InSection))
{
return FMovieSceneEventSectionTemplate(*LegacyEventSection, *this);
}
return FMovieSceneEvalTemplatePtr();
}
void UMovieSceneEventTrack::PostCompile(FMovieSceneEvaluationTrack& Track, const FMovieSceneTrackCompilerArgs& Args) const
{
switch (EventPosition)
{
case EFireEventsAtPosition::AtStartOfEvaluation:
Track.SetEvaluationGroup(IMovieSceneTracksModule::GetEvaluationGroupName(EBuiltInEvaluationGroup::PreEvaluation));
break;
case EFireEventsAtPosition::AtEndOfEvaluation:
Track.SetEvaluationGroup(IMovieSceneTracksModule::GetEvaluationGroupName(EBuiltInEvaluationGroup::PostEvaluation));
break;
default:
Track.SetEvaluationGroup(IMovieSceneTracksModule::GetEvaluationGroupName(EBuiltInEvaluationGroup::SpawnObjects));
Track.SetEvaluationPriority(UMovieSceneSpawnTrack::GetEvaluationPriority() - 100);
break;
}
Track.SetEvaluationMethod(EEvaluationMethod::Swept);
}
void UMovieSceneEventTrack::PopulateDeterminismData(FMovieSceneDeterminismData& OutData, const TRange<FFrameNumber>& Range) const
{
OutData.bParentSequenceRequiresLowerFence = true;
OutData.bParentSequenceRequiresUpperFence = true;
}
#if WITH_EDITORONLY_DATA
FText UMovieSceneEventTrack::GetDefaultDisplayName() const
{
return LOCTEXT("TrackName", "Events");
}
#endif
#undef LOCTEXT_NAMESPACE