Files
UnrealEngine/Engine/Plugins/Experimental/SceneState/Source/SceneStateMachineEditor/Private/SceneStateMachineConduitCompiler.cpp
2025-05-18 13:04:45 +08:00

81 lines
2.5 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "SceneStateMachineConduitCompiler.h"
#include "ISceneStateMachineCompilerContext.h"
#include "Nodes/SceneStateMachineConduitNode.h"
#include "SceneStateConduitGraph.h"
namespace UE::SceneState::Editor
{
FStateMachineConduitCompiler::FStateMachineConduitCompiler(const FCompileParams& InParams)
: Params(InParams)
{
check(Params.ConduitNode);
}
bool FStateMachineConduitCompiler::Compile(FStateMachineConduitCompileResult& OutResult)
{
if (!CompileConduitGraph())
{
return false;
}
CompileExitTransitions();
OutResult = MoveTemp(Result);
return true;
}
bool FStateMachineConduitCompiler::CompileConduitGraph()
{
// Defaults to SkippedAlwaysTrue if there's no valid graph to compile
FTransitionGraphCompileResult GraphCompileResult;
GraphCompileResult.ReturnCode = ETransitionGraphCompileReturnCode::SkippedAlwaysTrue;
// Compile conduit graph if present
if (USceneStateConduitGraph* ConduitGraph = Cast<USceneStateConduitGraph>(Params.ConduitNode->GetBoundGraph()))
{
GraphCompileResult = Params.Context.CompileTransitionGraph(ConduitGraph);
}
// Do not create any transition if the compilation failed
// or if the transition will always lead to a false evaluation
if (GraphCompileResult.ReturnCode == ETransitionGraphCompileReturnCode::Failed || GraphCompileResult.ReturnCode == ETransitionGraphCompileReturnCode::SkippedAlwaysFalse)
{
return false;
}
// Transition compilation was skipped because it's going to always return true
// mark evaluation as always true
if (GraphCompileResult.ReturnCode == ETransitionGraphCompileReturnCode::SkippedAlwaysTrue)
{
Result.Conduit.EvaluationFlags |= ESceneStateTransitionEvaluationFlags::EvaluationEventAlwaysTrue;
}
if (Params.ConduitNode->ShouldWaitForTasksToFinish())
{
Result.Conduit.EvaluationFlags |= ESceneStateTransitionEvaluationFlags::WaitForTasksToFinish;
}
Result.ConduitLink.EventName = GraphCompileResult.EventName;
Result.ConduitLink.ResultPropertyName = GraphCompileResult.ResultPropertyName;
return true;
}
void FStateMachineConduitCompiler::CompileExitTransitions()
{
const FStateMachineTransitionCompiler::FCompileParams CompileParams
{
.Context = Params.Context,
.Node = Params.ConduitNode,
.StateNodeIndexMap = Params.StateNodeIndexMap,
.ConduitNodeIndexMap = Params.ConduitNodeIndexMap,
};
FStateMachineTransitionCompiler TransitionCompiler(CompileParams);
TransitionCompiler.Compile(Result.TransitionCompileResult);
}
} // UE::SceneState::Editor