Editor/ShaderGraphPlus/ProjectConverter/Nodes/TransformConvert.cs

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

namespace ShaderGraphPlus.Internal;


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

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

		var newNode = new Nodes.Normalize();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;

		newNodes.Add( newNode );

		return newNodes;
	}
}

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

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

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

		var newNode = new TransformNormal();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;
		newNode.InputSpace = oldTransformNormalNode.InputSpace switch
		{
			VanillaNodes.NormalSpace.Tangent => NormalSpace.Tangent,
			VanillaNodes.NormalSpace.Object => NormalSpace.Object,
			VanillaNodes.NormalSpace.World => NormalSpace.World,
			_ => throw new NotImplementedException(),
		};

		newNodes.Add( newNode );

		return newNodes;
	}
}

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

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

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

		var newNode = new TileAndOffset();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;
		newNode.DefaultTile = oldTileAndOffsetNode.DefaultTile;
		newNode.DefaultOffset = oldTileAndOffsetNode.DefaultOffset;
		newNode.WrapTo01 = oldTileAndOffsetNode.WrapTo01;


		newNodes.Add( newNode );

		return newNodes;
	}

	public override Dictionary<string, string> GetNodeInputNameMappings()
	{
		var nameMappings = new Dictionary<string, string>()
		{
			{nameof( VanillaNodes.TileAndOffset.Coords ), nameof( TileAndOffset.UV )},
		};

		return nameMappings;
	}
}

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

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

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

		var newNode = new Blend();
		newNode.Identifier = oldNode.Identifier;
		newNode.Position = oldNode.Position;
		newNode.DefaultA = oldBlendNode.DefaultA;
		newNode.DefaultB = oldBlendNode.DefaultB;
		newNode.Fraction = oldBlendNode.Fraction;
		newNode.BlendMode = oldBlendNode.BlendMode switch
		{
			VanillaNodes.BlendNodeMode.Mix => BlendNodeMode.Mix,
			VanillaNodes.BlendNodeMode.Darken => BlendNodeMode.Darken,
			VanillaNodes.BlendNodeMode.Multiply => BlendNodeMode.Multiply,
			VanillaNodes.BlendNodeMode.ColorBurn => BlendNodeMode.ColorBurn,
			VanillaNodes.BlendNodeMode.LinearBurn => BlendNodeMode.LinearBurn,
			VanillaNodes.BlendNodeMode.Lighten => BlendNodeMode.Lighten,
			VanillaNodes.BlendNodeMode.Screen => BlendNodeMode.Screen,
			VanillaNodes.BlendNodeMode.ColorDodge => BlendNodeMode.ColorDodge,
			VanillaNodes.BlendNodeMode.LinearDodge => BlendNodeMode.LinearDodge,
			VanillaNodes.BlendNodeMode.Overlay => BlendNodeMode.Overlay,
			VanillaNodes.BlendNodeMode.SoftLight => BlendNodeMode.SoftLight,
			VanillaNodes.BlendNodeMode.HardLight => BlendNodeMode.HardLight,
			VanillaNodes.BlendNodeMode.VividLight => BlendNodeMode.VividLight,
			VanillaNodes.BlendNodeMode.LinearLight => BlendNodeMode.LinearLight,
			VanillaNodes.BlendNodeMode.HardMix => BlendNodeMode.HardMix,
			VanillaNodes.BlendNodeMode.Difference => BlendNodeMode.Difference,
			VanillaNodes.BlendNodeMode.Exclusion => BlendNodeMode.Exclusion,
			VanillaNodes.BlendNodeMode.Subtract => BlendNodeMode.Subtract,
			VanillaNodes.BlendNodeMode.Divide => BlendNodeMode.Divide,
			VanillaNodes.BlendNodeMode.Add => BlendNodeMode.Add,
			_ => throw new NotImplementedException(),
		};
		newNode.Clamp = oldBlendNode.Clamp;

		newNodes.Add( newNode );

		return newNodes;
	}
}