Files
UnrealEngine/Engine/Source/Runtime/MovieSceneTracks/Private/Systems/MovieSceneFadeSystem.cpp
Brandyn / Techy fcc1b09210 init
2026-04-04 15:40:51 -05:00

238 lines
8.7 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "Systems/MovieSceneFadeSystem.h"
#include "Async/TaskGraphInterfaces.h"
#include "Engine/Engine.h"
#include "Engine/GameInstance.h"
#include "EngineGlobals.h"
#include "EntitySystem/BuiltInComponentTypes.h"
#include "EntitySystem/BuiltInComponentTypes.h"
#include "Evaluation/PreAnimatedState/MovieScenePreAnimatedStateStorage.h"
#include "Evaluation/PreAnimatedState/MovieScenePreAnimatedStorageID.inl"
#include "Evaluation/ViewportSettingsPlaybackCapability.h"
#include "GameFramework/PlayerController.h"
#include "IMovieScenePlayer.h"
#include "MovieSceneExecutionToken.h"
#include "MovieSceneSequence.h"
#include "MovieSceneTracksComponentTypes.h"
#include "Sections/MovieSceneFadeSection.h"
#include UE_INLINE_GENERATED_CPP_BY_NAME(MovieSceneFadeSystem)
namespace UE::MovieScene
{
struct FViewportSettingsPlaybackCapabilityCompatibilityWrapper
{
FViewportSettingsPlaybackCapabilityCompatibilityWrapper(TSharedRef<FSharedPlaybackState> SharedPlaybackState)
{
ViewportSettingsCapability = SharedPlaybackState->FindCapability<FViewportSettingsPlaybackCapability>();
Player = FPlayerIndexPlaybackCapability::GetPlayer(SharedPlaybackState);
}
void SetViewportSettings(const TMap<FViewportClient*, EMovieSceneViewportParams>& ViewportParamsMap)
{
if (ViewportSettingsCapability)
{
ViewportSettingsCapability->SetViewportSettings(ViewportParamsMap);
}
else if (Player)
{
PRAGMA_DISABLE_DEPRECATION_WARNINGS
Player->SetViewportSettings(ViewportParamsMap);
PRAGMA_ENABLE_DEPRECATION_WARNINGS
}
}
void GetViewportSettings(TMap<FViewportClient*, EMovieSceneViewportParams>& ViewportParamsMap) const
{
if (ViewportSettingsCapability)
{
ViewportSettingsCapability->GetViewportSettings(ViewportParamsMap);
}
else if (Player)
{
PRAGMA_DISABLE_DEPRECATION_WARNINGS
Player->GetViewportSettings(ViewportParamsMap);
PRAGMA_ENABLE_DEPRECATION_WARNINGS
}
}
FViewportSettingsPlaybackCapability* ViewportSettingsCapability;
IMovieScenePlayer* Player;
};
struct FFadeUtil
{
static void ApplyFade(TSharedRef<FSharedPlaybackState> SharedPlaybackState, float FadeValue, const FLinearColor& FadeColor, bool bFadeAudio)
{
// Set editor preview/fade
EMovieSceneViewportParams ViewportParams;
ViewportParams.SetWhichViewportParam = ( EMovieSceneViewportParams::SetViewportParam )( EMovieSceneViewportParams::SVP_FadeAmount | EMovieSceneViewportParams::SVP_FadeColor );
ViewportParams.FadeAmount = FadeValue;
ViewportParams.FadeColor = FadeColor;
FViewportSettingsPlaybackCapabilityCompatibilityWrapper ViewportSettingsCapability(SharedPlaybackState);
TMap<FViewportClient*, EMovieSceneViewportParams> ViewportParamsMap;
ViewportSettingsCapability.GetViewportSettings(ViewportParamsMap);
for (auto ViewportParamsPair : ViewportParamsMap)
{
ViewportParamsMap[ViewportParamsPair.Key] = ViewportParams;
}
ViewportSettingsCapability.SetViewportSettings(ViewportParamsMap);
// Set runtime fade
UObject* PlaybackContext = SharedPlaybackState->GetPlaybackContext();
UWorld* World = PlaybackContext ? PlaybackContext->GetWorld() : nullptr;
if( World && ( World->WorldType == EWorldType::Game || World->WorldType == EWorldType::PIE ) )
{
APlayerController* PlayerController = World->GetGameInstance()->GetFirstLocalPlayerController();
if( PlayerController != nullptr && IsValid(PlayerController->PlayerCameraManager) )
{
PlayerController->PlayerCameraManager->SetManualCameraFade( FadeValue, FadeColor, bFadeAudio );
}
}
}
};
struct FPreAnimatedFadeState
{
float FadeValue;
FLinearColor FadeColor;
bool bFadeAudio;
static FPreAnimatedFadeState SaveState(UObject* PlaybackContext)
{
float FadeAmount = 0.f;
FLinearColor FadeColor = FLinearColor::Black;
bool bFadeAudio = false;
UWorld* World = PlaybackContext ? PlaybackContext->GetWorld() : nullptr;
if (World && (World->WorldType == EWorldType::Game || World->WorldType == EWorldType::PIE))
{
APlayerController* PlayerController = World->GetGameInstance()->GetFirstLocalPlayerController();
if (PlayerController != nullptr && IsValid(PlayerController->PlayerCameraManager))
{
FadeAmount = PlayerController->PlayerCameraManager->FadeAmount;
FadeColor = PlayerController->PlayerCameraManager->FadeColor;
bFadeAudio = PlayerController->PlayerCameraManager->bFadeAudio;
}
}
return FPreAnimatedFadeState{ FadeAmount, FadeColor, bFadeAudio };
}
void RestoreState(const FMovieSceneAnimTypeID& Unused, const FRestoreStateParams& Params)
{
TSharedPtr<FSharedPlaybackState> SharedPlaybackState = Params.GetTerminalPlaybackState();
if (!ensure(SharedPlaybackState))
{
return;
}
FFadeUtil::ApplyFade(SharedPlaybackState.ToSharedRef(), FadeValue, FadeColor, bFadeAudio);
}
};
struct FPreAnimatedFadeStateStorage : TSimplePreAnimatedStateStorage<FMovieSceneAnimTypeID, FPreAnimatedFadeState>
{
static TAutoRegisterPreAnimatedStorageID<FPreAnimatedFadeStateStorage> StorageID;
FPreAnimatedStorageID GetStorageType() const override { return StorageID; }
};
TAutoRegisterPreAnimatedStorageID<FPreAnimatedFadeStateStorage> FPreAnimatedFadeStateStorage::StorageID;
struct FEvaluateFade
{
const FInstanceRegistry* InstanceRegistry;
TSharedPtr<FPreAnimatedFadeStateStorage> PreAnimatedStorage;
FEvaluateFade(const FInstanceRegistry* InInstanceRegistry, TSharedPtr<FPreAnimatedFadeStateStorage> InPreAnimatedStorage)
: InstanceRegistry(InInstanceRegistry)
, PreAnimatedStorage(InPreAnimatedStorage)
{}
void ForEachAllocation(const FEntityAllocation* Allocation, TRead<FMovieSceneEntityID> EntityIDs, TRead<FRootInstanceHandle> RootInstanceHandles, TRead<FFadeComponentData> FadeComponents, TRead<double> FadeAmounts) const
{
static const TMovieSceneAnimTypeID<FEvaluateFade> AnimTypeID;
const FBuiltInComponentTypes* BuiltInComponents = FBuiltInComponentTypes::Get();
const int32 Num = Allocation->Num();
const bool bWantsRestoreState = Allocation->HasComponent(BuiltInComponents->Tags.RestoreState);
const FMovieSceneAnimTypeID Key = AnimTypeID;
for (int32 Index = 0; Index < Num; ++Index)
{
FRootInstanceHandle RootInstanceHandle = RootInstanceHandles[Index];
const FSequenceInstance& Instance = InstanceRegistry->GetInstance(RootInstanceHandle);
UObject* PlaybackContext = Instance.GetSharedPlaybackState()->GetPlaybackContext();
PreAnimatedStorage->BeginTrackingEntity(EntityIDs[Index], bWantsRestoreState, RootInstanceHandle, Key);
PreAnimatedStorage->CachePreAnimatedValue(Key, [PlaybackContext](const FMovieSceneAnimTypeID&) { return FPreAnimatedFadeState::SaveState(PlaybackContext); });
const FFadeComponentData& FadeComponent(FadeComponents[Index]);
FFadeUtil::ApplyFade(Instance.GetSharedPlaybackState(), FadeAmounts[Index], FadeComponent.FadeColor, FadeComponent.bFadeAudio);
}
}
};
} // namespace UE::MovieScene
UMovieSceneFadeSystem::UMovieSceneFadeSystem(const FObjectInitializer& ObjInit)
: Super(ObjInit)
{
using namespace UE::MovieScene;
RelevantComponent = FMovieSceneTracksComponentTypes::Get()->Fade;
Phase = ESystemPhase::Scheduling;
if (HasAnyFlags(RF_ClassDefaultObject))
{
const FBuiltInComponentTypes* BuiltInComponents = FBuiltInComponentTypes::Get();
DefineComponentConsumer(GetClass(), BuiltInComponents->DoubleResult[0]);
}
}
void UMovieSceneFadeSystem::OnLink()
{
using namespace UE::MovieScene;
PreAnimatedStorage = Linker->PreAnimatedState.GetOrCreateStorage<FPreAnimatedFadeStateStorage>();
}
void UMovieSceneFadeSystem::OnSchedulePersistentTasks(UE::MovieScene::IEntitySystemScheduler* TaskScheduler)
{
using namespace UE::MovieScene;
const FBuiltInComponentTypes* BuiltInComponents = FBuiltInComponentTypes::Get();
const FMovieSceneTracksComponentTypes* TrackComponents = FMovieSceneTracksComponentTypes::Get();
FEntityTaskBuilder()
.ReadEntityIDs()
.Read(BuiltInComponents->RootInstanceHandle)
.Read(TrackComponents->Fade)
.Read(BuiltInComponents->DoubleResult[0])
.SetDesiredThread(Linker->EntityManager.GetGatherThread())
.Schedule_PerAllocation<FEvaluateFade>(& Linker->EntityManager, TaskScheduler, Linker->GetInstanceRegistry(), PreAnimatedStorage);
}
void UMovieSceneFadeSystem::OnRun(FSystemTaskPrerequisites& InPrerequisites, FSystemSubsequentTasks& Subsequents)
{
using namespace UE::MovieScene;
const FBuiltInComponentTypes* BuiltInComponents = FBuiltInComponentTypes::Get();
const FMovieSceneTracksComponentTypes* TrackComponents = FMovieSceneTracksComponentTypes::Get();
FEntityTaskBuilder()
.ReadEntityIDs()
.Read(BuiltInComponents->RootInstanceHandle)
.Read(TrackComponents->Fade)
.Read(BuiltInComponents->DoubleResult[0])
.SetDesiredThread(Linker->EntityManager.GetGatherThread())
.Dispatch_PerAllocation<FEvaluateFade>(& Linker->EntityManager, InPrerequisites, &Subsequents, Linker->GetInstanceRegistry(), PreAnimatedStorage);
}