Editor/ShaderGraphPlus/ProjectConverter/Node Core/ParameterConvert.cs

Editor extension helpers for converting vanilla ShaderGraph parameter UI data to ShaderGraphPlus parameter UI types. It defines two extension methods that map UIType, groups, priority and numeric metadata from the legacy VanillaGraph.ParameterUI into new FloatParameterUI and GenericParameterUI instances. The file also contains commented-out converter classes for various numeric and color parameter nodes that show intended conversion logic from vanilla nodes to new parameter/blackboard nodes.

Reflection
using Editor;
using ShaderGraphPlus.Nodes;
using VanillaGraph = Editor.ShaderGraph;
using VanillaNodes = Editor.ShaderGraph.Nodes;
using ShaderGraphBaseNode = Editor.ShaderGraph.BaseNode;

namespace ShaderGraphPlus.Internal;

file static class VanillaParameterUIExentions
{
	internal static FloatParameterUI ConvertVanillaUI( this VanillaGraph.ParameterUI parameterUI )
	{
		var newUi = new FloatParameterUI();

		newUi.Type = parameterUI.Type switch
		{
			VanillaGraph.UIType.Default => UIType.Default,
			VanillaGraph.UIType.Slider => UIType.Slider,
			VanillaGraph.UIType.Color => UIType.Default,
			_ => throw new NotImplementedException(),
		};

		newUi.Step = parameterUI.Step;
		newUi.Priority = parameterUI.Priority;
		newUi.PrimaryGroup = new() { Name = parameterUI.PrimaryGroup.Name, Priority = parameterUI.PrimaryGroup.Priority };
		newUi.SecondaryGroup = new() { Name = parameterUI.SecondaryGroup.Name, Priority = parameterUI.SecondaryGroup.Priority };

		return newUi;
	}

	internal static GenericParameterUI ConvertToGenericParameterUI( this VanillaGraph.ParameterUI parameterUI )
	{
		var newUi = new GenericParameterUI();

		newUi.Priority = parameterUI.Priority;
		newUi.PrimaryGroup = new() { Name = parameterUI.PrimaryGroup.Name, Priority = parameterUI.PrimaryGroup.Priority };
		newUi.SecondaryGroup = new() { Name = parameterUI.SecondaryGroup.Name, Priority = parameterUI.SecondaryGroup.Priority };

		return newUi;
	}
}


// TODO
/*
internal class FloatNodeConvert : BaseNodeConvert
{
	public override Type NodeTypeToConvert => typeof( VanillaNodes.Float );

	public override IEnumerable<BaseNodePlus> Convert( ProjectConverter converter, ShaderGraphBaseNode oldNode )
	{
		var newNodes = new List<BaseNodePlus>();
		var oldFloatNode = oldNode as VanillaNodes.Float;

		//SGPLog.Info( "Convert float node" );

		if ( string.IsNullOrWhiteSpace( oldFloatNode.Name ) )
		{
			var newConstantNode = new FloatConstantNode();
			newConstantNode.Value = oldFloatNode.Value;
			newConstantNode.Min = oldFloatNode.Min;
			newConstantNode.Max = oldFloatNode.Max;
			newConstantNode.Step = oldFloatNode.Step;

			newNodes.Add( newConstantNode );
		}
		else
		{
			var newNode = new FloatParameterNode
			{
				ParameterIdentifier = Guid.NewGuid(),
				Identifier = oldNode.Identifier,
				Position = oldNode.Position,
				Name = oldFloatNode.Name,
				Value = oldFloatNode.Value,
				Min = oldFloatNode.Min,
				Max = oldFloatNode.Max,
				IsAttribute = oldFloatNode.IsAttribute,
				UI = oldFloatNode.UI.ConvertVanillaUI()
			};

			BlackboardParameter blackboardParameter = new FloatParameter()
			{
				Identifier = newNode.ParameterIdentifier,
				Name = newNode.Name,
				Value = newNode.Value,
				Min = newNode.Min,
				Max = newNode.Max,
				UI = newNode.UI
			};

			converter.AddBlackboardParameter( blackboardParameter );

			newNodes.Add( newNode );
		}

		return newNodes;
	}
}

internal class Float2NodeConvert : BaseNodeConvert
{
	public override Type NodeTypeToConvert => typeof( VanillaNodes.Float2 );

	public override IEnumerable<BaseNodePlus> Convert( ProjectConverter converter, ShaderGraphBaseNode oldNode )
	{
		var newNodes = new List<BaseNodePlus>();
		var oldFloat2Node = oldNode as VanillaNodes.Float2;

		//SGPLog.Info( "Convert float2 node" );

		if ( string.IsNullOrWhiteSpace( oldFloat2Node.Name ) )
		{
			var newConstantNode = new Float2ConstantNode();
			newConstantNode.Value = oldFloat2Node.Value;
			newConstantNode.Min = oldFloat2Node.Min;
			newConstantNode.Max = oldFloat2Node.Max;
			newConstantNode.Step = oldFloat2Node.Step;

			newNodes.Add( newConstantNode );
		}
		else
		{
			var newNode = new Float2ParameterNode
			{
				ParameterIdentifier = Guid.NewGuid(),
				Identifier = oldNode.Identifier,
				Position = oldNode.Position,
				Name = oldFloat2Node.Name,
				Value = oldFloat2Node.Value,
				Min = oldFloat2Node.Min,
				Max = oldFloat2Node.Max,
				IsAttribute = oldFloat2Node.IsAttribute,
				UI = oldFloat2Node.UI.ConvertVanillaUI()
			};

			BlackboardParameter blackboardParameter = new Float2Parameter()
			{
				Identifier = newNode.ParameterIdentifier,
				Name = newNode.Name,
				Value = newNode.Value,
				Min = newNode.Min,
				Max = newNode.Max,
				UI = newNode.UI
			};

			converter.AddBlackboardParameter( blackboardParameter );

			newNodes.Add( newNode );
		}

		return newNodes;
	}
}

internal class Float3NodeConvert : BaseNodeConvert
{
	public override Type NodeTypeToConvert => typeof( VanillaNodes.Float3 );

	public override IEnumerable<BaseNodePlus> Convert( ProjectConverter converter, ShaderGraphBaseNode oldNode )
	{
		var newNodes = new List<BaseNodePlus>();
		var oldFloat3Node = oldNode as VanillaNodes.Float3;

		//SGPLog.Info( "Convert float3 node" );

		if ( string.IsNullOrWhiteSpace( oldFloat3Node.Name ) )
		{
			var newConstantNode = new Float3ConstantNode();
			newConstantNode.Value = oldFloat3Node.Value;
			newConstantNode.Min = oldFloat3Node.Min;
			newConstantNode.Max = oldFloat3Node.Max;
			newConstantNode.Step = oldFloat3Node.Step;

			newNodes.Add( newConstantNode );
		}
		else
		{
			var newNode = new Float3ParameterNode
			{
				ParameterIdentifier = Guid.NewGuid(),
				Identifier = oldNode.Identifier,
				Position = oldNode.Position,
				Name = oldFloat3Node.Name,
				Value = oldFloat3Node.Value,
				Min = oldFloat3Node.Min,
				Max = oldFloat3Node.Max,
				IsAttribute = oldFloat3Node.IsAttribute,
				UI = oldFloat3Node.UI.ConvertVanillaUI()
			};

			BlackboardParameter blackboardParameter = new Float3Parameter()
			{
				Identifier = newNode.ParameterIdentifier,
				Name = newNode.Name,
				Value = newNode.Value,
				Min = newNode.Min,
				Max = newNode.Max,
				UI = newNode.UI
			};

			converter.AddBlackboardParameter( blackboardParameter );

			newNodes.Add( newNode );
		}

		return newNodes;
	}
}

internal class Float4NodeConvert : BaseNodeConvert
{
	public override Type NodeTypeToConvert => typeof( VanillaNodes.Float4 );

	public override IEnumerable<BaseNodePlus> Convert( ProjectConverter converter, ShaderGraphBaseNode oldNode )
	{
		var newNodes = new List<BaseNodePlus>();
		var oldFloat4Node = oldNode as VanillaNodes.Float4;

		//SGPLog.Info( "Convert float4 node" );

		if ( string.IsNullOrWhiteSpace( oldFloat4Node.Name ) )
		{
			var newConstantNode = new ColorConstantNode();
			newConstantNode.Value = oldFloat4Node.Value;

			newNodes.Add( newConstantNode );
		}
		else
		{
			var parameterType = oldFloat4Node.UI.Type;

			if ( parameterType == VanillaGraph.UIType.Color )
			{
				var newNode = new ColorParameterNode
				{
					ParameterIdentifier = Guid.NewGuid(),
					Identifier = oldNode.Identifier,
					Position = oldNode.Position,
					Value = oldFloat4Node.Value,
					Name = oldFloat4Node.Name,
					IsAttribute = oldFloat4Node.IsAttribute,
					UI = oldFloat4Node.UI.ConvertToColorParameterUI()
				};

				BlackboardParameter blackboardParameter = new ColorParameter()
				{
					Identifier = newNode.ParameterIdentifier,
					Name = newNode.Name,
					Value = newNode.Value,
					UI = newNode.UI,
				};

				converter.AddBlackboardParameter( blackboardParameter );

				newNodes.Add( newNode );
			}
			else
			{
				var newNode = new Float4ParameterNode
				{
					ParameterIdentifier = Guid.NewGuid(),
					Identifier = oldNode.Identifier,
					Position = oldNode.Position,
					Value = oldFloat4Node.Value,
					Name = oldFloat4Node.Name,
					IsAttribute = oldFloat4Node.IsAttribute,
					UI = oldFloat4Node.UI.ConvertVanillaUI()
				};

				BlackboardParameter blackboardParameter = new Float4Parameter()
				{
					Identifier = newNode.ParameterIdentifier,
					Name = newNode.Name,
					Value = newNode.Value,
					UI = newNode.UI,
				};

				converter.AddBlackboardParameter( blackboardParameter );

				newNodes.Add( newNode );
			}
		}

		return newNodes;
	}
}
*/