Editor/ShaderGraphPlus/ProjectConverter/Nodes/ChannelConvert.cs
using ShaderGraphPlus.Nodes;
using VanillaGraph = Editor.ShaderGraph;
using VanillaNodes = Editor.ShaderGraph.Nodes;
using ShaderGraphBaseNode = Editor.ShaderGraph.BaseNode;

namespace ShaderGraphPlus.Internal;

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

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

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

		var newNode = new SplitVector();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;

		newNodes.Add( newNode );

		return newNodes;
	}
}

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

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

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

		var newNode = new CombineVector();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;
		newNode.DefaultX = oldCombineVectorNode.DefaultX;
		newNode.DefaultY = oldCombineVectorNode.DefaultY;
		newNode.DefaultZ = oldCombineVectorNode.DefaultZ;
		newNode.DefaultW = oldCombineVectorNode.DefaultW;

		newNodes.Add( newNode );

		return newNodes;
	}
}

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

	private SwizzleChannel GetSwizzle( VanillaNodes.SwizzleChannel vanillaSwizzleChannel )
	{
		return vanillaSwizzleChannel switch
		{
			VanillaNodes.SwizzleChannel.Red => SwizzleChannel.Red,
			VanillaNodes.SwizzleChannel.Green => SwizzleChannel.Green,
			VanillaNodes.SwizzleChannel.Blue => SwizzleChannel.Blue,
			VanillaNodes.SwizzleChannel.Alpha => SwizzleChannel.Alpha,
			_ => throw new NotImplementedException(),
		};
	}

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

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

		var newNode = new SwizzleVector();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;
		newNode.RedOut = GetSwizzle( oldSwizzleVectorNode.RedOut );
		newNode.GreenOut = GetSwizzle( oldSwizzleVectorNode.GreenOut );
		newNode.BlueOut = GetSwizzle( oldSwizzleVectorNode.BlueOut );
		newNode.AlphaOut = GetSwizzle( oldSwizzleVectorNode.AlphaOut );

		newNodes.Add( newNode );

		return newNodes;
	}
}

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

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

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

		var newNode = new AppendVector();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;

		newNodes.Add( newNode );

		return newNodes;
	}
}