Editor/ShaderGraphPlus/Nodes/Utility/Logic/BranchNode.cs

namespace ShaderGraphPlus.Nodes;

/// <summary>
/// If True, do this, if False, do that.
/// </summary>
[Title( "Branch" ), Category( "Utility/Logic" ), Icon( "alt_route" )]
public sealed class BranchNode : ShaderNodePlus
{
	[JsonIgnore, Hide, Browsable( false )]
	public override Color NodeTitleColor => ShaderGraphPlusTheme.NodeHeaderColors.LogicNode;

	[Hide]
	private bool IsSubgraph => (Graph is ShaderGraphPlus shaderGraph && shaderGraph.IsSubgraph);

	[Title( "Predicate" )]
	[Input( typeof( bool ) ), Hide]
	public NodeInput InputPredicate { get; set; }

	[Input, Hide]
	public NodeInput True { get; set; }

	[Input, Hide]
	public NodeInput False { get; set; }

	[Title( "Default Predicate" )]
	[InputDefault( nameof( InputPredicate ) )]
	public bool Enabled { get; set; } = true;

	[Output]
	[Hide]
	public NodeResult.Func Result => ( GraphCompiler compiler ) =>
	{
		var results = compiler.Result( True, False, 0.0f, 0.0f );
		var resultPredicate = compiler.ResultOrDefault( InputPredicate, Enabled );

		return new NodeResult( results.Item1.ResultType, $"{resultPredicate} ? {results.Item1} : {results.Item2}" );
	};
}