Files
UnrealEngine/Engine/Source/Runtime/MovieScene/Private/Conditions/MovieSceneGroupCondition.cpp
2025-05-18 13:04:45 +08:00

69 lines
2.4 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "Conditions/MovieSceneGroupCondition.h"
#include "EntitySystem/MovieSceneSharedPlaybackState.h"
#include "Engine/World.h"
#include "MovieSceneCommonHelpers.h"
#include "Algo/AllOf.h"
uint32 UMovieSceneGroupCondition::ComputeCacheKey(FGuid BindingGuid, FMovieSceneSequenceID SequenceID, TSharedRef<const UE::MovieScene::FSharedPlaybackState> SharedPlaybackState, UObject* EntityOwner) const
{
// Combine our pointer's hash with sub-conditions hashes
uint32 HashResult = GetTypeHash(this);
for(const FMovieSceneConditionContainer& SubCondition : SubConditions)
{
if (SubCondition.Condition)
{
HashResult = HashCombineFast(HashResult, SubCondition.Condition->ComputeCacheKey(BindingGuid, SequenceID, SharedPlaybackState, EntityOwner));
}
}
return HashResult;
}
bool UMovieSceneGroupCondition::EvaluateConditionInternal(FGuid BindingGuid, FMovieSceneSequenceID SequenceID, TSharedRef<const UE::MovieScene::FSharedPlaybackState> SharedPlaybackState) const
{
bool bResult = (Operator == EMovieSceneGroupConditionOperator::And);
UMovieSceneSignedObject* ConditionOwner = GetTypedOuter<UMovieSceneSignedObject>();
for (const FMovieSceneConditionContainer& ConditionContainer : SubConditions)
{
if (ConditionContainer.Condition)
{
// We use MovieSceneHelpers::EvaluateSequenceCondition below to allow cacheing of calls to our sub-conditions where relevant.
bool bLocalResult = MovieSceneHelpers::EvaluateSequenceCondition(BindingGuid, SequenceID, ConditionContainer.Condition, ConditionOwner, SharedPlaybackState);
switch (Operator)
{
case EMovieSceneGroupConditionOperator::And:
if (!bLocalResult)
{
return false;
}
break;
case EMovieSceneGroupConditionOperator::Or:
if (bLocalResult)
{
return true;
}
break;
case EMovieSceneGroupConditionOperator::Xor:
if (bLocalResult && !bResult)
{
bResult = true;
}
else if (bLocalResult && bResult)
{
return false;
}
break;
}
}
}
return bResult;
}
bool UMovieSceneGroupCondition::CanCacheResult(TSharedRef<const UE::MovieScene::FSharedPlaybackState> SharedPlaybackState) const
{
return Algo::AllOf(SubConditions, [SharedPlaybackState](const FMovieSceneConditionContainer& SubCondition) { return !SubCondition.Condition || SubCondition.Condition->CanCacheResult(SharedPlaybackState);});
}