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


namespace ShaderGraphPlus.Internal;

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

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

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

		var newNode = new Add();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;
		newNode.DefaultA = oldAddNode.DefaultA;
		newNode.DefaultB = oldAddNode.DefaultB;

		//newNode.SetInputs( oldAddNode.Inputs );

		newNodes.Add( newNode );

		return newNodes;
	}
}

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

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

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

		var newNode = new Subtract();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;
		newNode.DefaultA = oldSubtractNode.DefaultA;
		newNode.DefaultB = oldSubtractNode.DefaultB;

		newNodes.Add( newNode );

		return newNodes;
	}
}

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

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

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

		var newNode = new Multiply();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;
		newNode.DefaultA = oldMultiplyNode.DefaultA;
		newNode.DefaultB = oldMultiplyNode.DefaultB;

		newNodes.Add( newNode );

		return newNodes;
	}
}

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

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

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

		var newNode = new Divide();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;
		newNode.DefaultA = oldDivideNode.DefaultA;
		newNode.DefaultB = oldDivideNode.DefaultB;

		newNodes.Add( newNode );

		return newNodes;
	}
}

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

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

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

		var newNode = new Mod();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;
		newNode.DefaultA = oldModNode.DefaultA;
		newNode.DefaultB = oldModNode.DefaultB;

		newNodes.Add( newNode );

		return newNodes;
	}
}

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

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

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

		var newNode = new Lerp();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;
		newNode.DefaultA = oldLerpNode.DefaultA;
		newNode.DefaultB = oldLerpNode.DefaultB;
		newNode.Fraction = oldLerpNode.Fraction;

		newNodes.Add( newNode );

		return newNodes;
	}
}

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

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

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

		var newNode = new CrossProduct();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;
		newNode.DefaultA = oldCrossProductNode.DefaultA;
		newNode.DefaultB = oldCrossProductNode.DefaultB;

		newNodes.Add( newNode );

		return newNodes;
	}
}

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

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

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

		var newNode = new RemapValue();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;
		newNode.In = oldRemapValueNode.In;
		newNode.InMin = oldRemapValueNode.InMin;
		newNode.InMax = oldRemapValueNode.InMax;
		newNode.OutMin = oldRemapValueNode.OutMin;
		newNode.OutMax = oldRemapValueNode.OutMax;
		newNode.Clamp = oldRemapValueNode.Clamp;

		newNodes.Add( newNode );

		return newNodes;
	}
}

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

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

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

		var newNode = new Arctan2();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;
		newNode.DefaultY = oldArctan2Node.DefaultX;
		newNode.DefaultX = oldArctan2Node.DefaultY;

		newNodes.Add( newNode );

		return newNodes;
	}
}

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

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

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

		var newNode = new Power();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;
		newNode.DefaultA = oldPowerNode.DefaultA;
		newNode.DefaultB = oldPowerNode.DefaultB;

		newNodes.Add( newNode );

		return newNodes;
	}
}