Editor/ShaderGraphPlus/Blackboard/Parameters/BlackboardSubgraphParameters.cs
namespace ShaderGraphPlus;

/// <summary>
/// Bool subgraph input parameter
/// </summary>
[Title( "Bool" ), Icon( "check_box" ), Category( "Input" ), Order( 0 )]
[SubgraphOnly]
public sealed class BoolSubgraphInputParameter : BlackboardSubgraphInputParameter<bool>
{
	[Hide, JsonIgnore]
	public override SubgraphPortType PortType => SubgraphPortType.Bool;

	public BoolSubgraphInputParameter() : base()
	{
		Value = false;
	}
}

/// <summary>
/// Bool subgraph output parameter
/// </summary>
[Title( "Bool" ), Icon( "check_box" ), Category( "Output" ), Order( 0 )]
[SubgraphOnly]
public sealed class BoolSubgraphOutputParameter : BlackboardSubgraphOutputParameter<bool>
{
	[Hide, JsonIgnore]
	public override SubgraphPortType PortType => SubgraphPortType.Bool;

	public BoolSubgraphOutputParameter() : base()
	{
	}
}

/// <summary>
/// Int subgraph input parameter
/// </summary>
[Title( "Int" ), Icon( "looks_one" ), Category( "Input" ), Order( 1 )]
[SubgraphOnly]
public sealed class IntSubgraphInputParameter : BlackboardSubgraphInputParameter<int>
{
	[Hide, JsonIgnore]
	public override SubgraphPortType PortType => SubgraphPortType.Int;

	[Group( "Range" )] public int Min { get; set; }
	[Group( "Range" )] public int Max { get; set; }

	public IntSubgraphInputParameter()
	{
		Value = 1;
		Min = 0;
		Max = 1;
	}
}

/// <summary>
/// Int subgraph output parameter
/// </summary>
[Title( "Int" ), Icon( "looks_one" ), Category( "Output" ), Order( 1 )]
[SubgraphOnly]
public sealed class IntSubgraphOutputParameter : BlackboardSubgraphOutputParameter<int>
{
	[Hide, JsonIgnore]
	public override SubgraphPortType PortType => SubgraphPortType.Int;

	public IntSubgraphOutputParameter() : base()
	{
	}
}

/// <summary>
/// Float subgraph input parameter
/// </summary>
[Title( "Float" ), Icon( "looks_one" ), Category( "Input" ), Order( 2 )]
[SubgraphOnly]
public sealed class FloatSubgraphInputParameter : BlackboardSubgraphInputParameter<float>
{
	[Hide, JsonIgnore]
	public override SubgraphPortType PortType => SubgraphPortType.Float;

	[Group( "Range" )] public float Min { get; set; }
	[Group( "Range" )] public float Max { get; set; }

	public FloatSubgraphInputParameter()
	{
		Value = 1.0f;
		Min = 0.0f;
		Max = 1.0f;
	}
}

/// <summary>
/// Float subgraph output parameter
/// </summary>
[Title( "Float" ), Icon( "looks_one" ), Category( "Output" ), Order( 2 )]
[SubgraphOnly]
public sealed class FloatSubgraphOutputParameter : BlackboardSubgraphOutputParameter<float>
{
	[Hide, JsonIgnore]
	public override SubgraphPortType PortType => SubgraphPortType.Float;

	public FloatSubgraphOutputParameter() : base()
	{
	}
}

/// <summary>
/// Float2 subgraph input parameter
/// </summary>
[Title( "Float2" ), Icon( "looks_two" ), Category( "Input" ), Order( 3 )]
[SubgraphOnly]
public sealed class Float2SubgraphInputParameter : BlackboardSubgraphInputParameter<Vector2>
{
	[Hide, JsonIgnore]
	public override SubgraphPortType PortType => SubgraphPortType.Vector2;

	[Group( "Range" )] public Vector2 Min { get; set; }
	[Group( "Range" )] public Vector2 Max { get; set; }

	public Float2SubgraphInputParameter()
	{
		Value = Vector2.One;
		Min = Vector2.Zero;
		Max = Vector2.One;
	}
}

/// <summary>
/// Float2 subgraph output parameter
/// </summary>
[Title( "Float2" ), Icon( "looks_two" ), Category( "Output" ), Order( 3 )]
[SubgraphOnly]
public sealed class Float2SubgraphOutputParameter : BlackboardSubgraphOutputParameter<Vector2>
{
	[Hide, JsonIgnore]
	public override SubgraphPortType PortType => SubgraphPortType.Vector2;

	public Float2SubgraphOutputParameter() : base()
	{
	}
}

/// <summary>
/// Float3 subgraph input parameter
/// </summary>
[Title( "Float3" ), Icon( "looks_3" ), Category( "Input" ), Order( 4 )]
[SubgraphOnly]
public sealed class Float3SubgraphInputParameter : BlackboardSubgraphInputParameter<Vector3>
{
	[Hide, JsonIgnore]
	public override SubgraphPortType PortType => SubgraphPortType.Vector3;

	[Group( "Range" )] public Vector3 Min { get; set; }
	[Group( "Range" )] public Vector3 Max { get; set; }

	public Float3SubgraphInputParameter()
	{
		Value = Vector3.One;
		Min = Vector3.Zero;
		Max = Vector3.One;
	}
}

/// <summary>
/// Float3 subgraph output parameter
/// </summary>
[Title( "Float3" ), Icon( "looks_3" ), Category( "Output" ), Order( 4 )]
[SubgraphOnly]
public sealed class Float3SubgraphOutputParameter : BlackboardSubgraphOutputParameter<Vector3>
{
	[Hide, JsonIgnore]
	public override SubgraphPortType PortType => SubgraphPortType.Vector3;

	public Float3SubgraphOutputParameter() : base()
	{
	}
}

/// <summary>
/// Float4 subgraph input parameter
/// </summary>
[Title( "Float4" ), Icon( "looks_4" ), Category( "Input" ), Order( 5 )]
[SubgraphOnly]
public sealed class Float4SubgraphInputParameter : BlackboardSubgraphInputParameter<Vector4>
{
	[Hide, JsonIgnore]
	public override SubgraphPortType PortType => SubgraphPortType.Vector4;

	[Group( "Range" )] public Vector4 Min { get; set; }
	[Group( "Range" )] public Vector4 Max { get; set; }

	public Float4SubgraphInputParameter()
	{
		Value = Vector4.One;
		Min = Vector4.Zero;
		Max = Vector4.One;
	}
}

/// <summary>
/// Float4 subgraph output parameter
/// </summary>
[Title( "Float4" ), Icon( "looks_4" ), Category( "Output" ), Order( 5 )]
[SubgraphOnly]
public sealed class Float4SubgraphOutputParameter : BlackboardSubgraphOutputParameter<Vector4>
{
	[Hide, JsonIgnore]
	public override SubgraphPortType PortType => SubgraphPortType.Vector4;

	public Float4SubgraphOutputParameter() : base()
	{
	}
}

/// <summary>
/// Color subgraph input parameter
/// </summary>
[Title( "Color" ), Icon( "palette" ), Category( "Input" ), Order( 6 )]
[SubgraphOnly]
public sealed class ColorSubgraphInputParameter : BlackboardSubgraphInputParameter<Color>
{
	[Hide, JsonIgnore]
	public override SubgraphPortType PortType => SubgraphPortType.Color;

	public ColorSubgraphInputParameter()
	{
		Value = Color.White;
	}
}

/// <summary>
/// Color subgraph output parameter
/// </summary>
[Title( "Color" ), Icon( "palette" ), Category( "Output" ), Order( 6 )]
[SubgraphOnly]
public sealed class ColorSubgraphOutputParameter : BlackboardSubgraphOutputParameter<Color>
{
	[Hide, JsonIgnore]
	public override SubgraphPortType PortType => SubgraphPortType.Color;

	public ColorSubgraphOutputParameter() : base()
	{
	}
}

/// <summary>
/// Float2x2 subgraph input parameter
/// </summary>
[Title( "Float2x2" ), Icon( "apps" ), Category( "Input" ), Order( 7 )]
[SubgraphOnly]
public sealed class Float2x2SubgraphInputParameter : BlackboardSubgraphInputParameter<Float2x2>
{
	[Hide, JsonIgnore]
	public override SubgraphPortType PortType => SubgraphPortType.Float2x2;

	public Float2x2SubgraphInputParameter() : base()
	{
		Value = new Float2x2();
	}
}

/// <summary>
/// Float2x2 subgraph output parameter
/// </summary>
[Title( "Float2x2" ), Icon( "apps" ), Category( "Output" ), Order( 7 )]
[SubgraphOnly]
public sealed class Float2x2SubgraphOutputParameter : BlackboardSubgraphOutputParameter<Float2x2>
{
	[Hide, JsonIgnore]
	public override SubgraphPortType PortType => SubgraphPortType.Float2x2;

	public Float2x2SubgraphOutputParameter() : base()
	{
	}
}

/// <summary>
/// Float3x3 subgraph input parameter
/// </summary>
[Title( "Float3x3" ), Icon( "apps" ), Order( 8 )]
[SubgraphOnly]
public sealed class Float3x3SubgraphInputParameter : BlackboardSubgraphInputParameter<Float3x3>
{
	[Hide, JsonIgnore]
	public override SubgraphPortType PortType => SubgraphPortType.Float3x3;

	public Float3x3SubgraphInputParameter() : base()
	{
		Value = new Float3x3();
	}
}

/// <summary>
/// Float3x3 subgraph output parameter
/// </summary>
[Title( "Float3x3" ), Icon( "apps" ), Order( 8 )]
[SubgraphOnly]
public sealed class Float3x3SubgraphOutputParameter : BlackboardSubgraphOutputParameter<Float3x3>
{
	[Hide, JsonIgnore]
	public override SubgraphPortType PortType => SubgraphPortType.Float3x3;

	public Float3x3SubgraphOutputParameter() : base()
	{
	}
}

/// <summary>
/// Float4x4 subgraph input parameter
/// </summary>
[Title( "Float4x4" ), Icon( "apps" ), Order( 9 )]
[SubgraphOnly]
public sealed class Float4x4SubgraphInputParameter : BlackboardSubgraphInputParameter<Float4x4>
{
	[Hide, JsonIgnore]
	public override SubgraphPortType PortType => SubgraphPortType.Float4x4;

	public Float4x4SubgraphInputParameter() : base()
	{
		Value = new Float4x4();
	}
}

/// <summary>
/// Float4x4 subgraph output parameter
/// </summary>
[Title( "Float4x4" ), Icon( "apps" ), Order( 9 )]
[SubgraphOnly]
public sealed class Float4x4SubgraphOutputParameter : BlackboardSubgraphOutputParameter<Float4x4>
{
	[Hide, JsonIgnore]
	public override SubgraphPortType PortType => SubgraphPortType.Float4x4;

	public Float4x4SubgraphOutputParameter() : base()
	{
	}
}

/// <summary>
/// Gradient subgraph input parameter 
/// </summary>
[Title( "Gradient" ), Icon( "gradient" ), Order( 10 )]
[SubgraphOnly]
public sealed class GradientSubgraphInputParameter : BlackboardSubgraphInputParameter<Gradient>
{
	[Hide, JsonIgnore]
	public override SubgraphPortType PortType => SubgraphPortType.Gradient;

	public GradientSubgraphInputParameter() : base()
	{
		Value = new Gradient();
	}
}


/// <summary>
/// Gradient subgraph output parameter 
/// </summary>
[Title( "Gradient" ), Icon( "gradient" ), Order( 10 )]
[SubgraphOnly]
public sealed class GradientSubgraphOutputParameter : BlackboardSubgraphOutputParameter<Gradient>
{
	[Hide, JsonIgnore]
	public override SubgraphPortType PortType => SubgraphPortType.Gradient;

	public GradientSubgraphOutputParameter() : base()
	{
	}
}

/// <summary>
/// Texture2D subgraph input parameter
/// </summary>
[Title( "Texture2D" ), Icon( "image" ), Order( 11 )]
public sealed class Texture2DSubgraphInputParameter : BlackboardSubgraphInputParameter<TextureInput>
{
	[Hide, JsonIgnore]
	public override SubgraphPortType PortType => SubgraphPortType.Texture2DObject;

	[Hide, JsonIgnore]
	public override bool IsRequired { get; set; } = true;

	public Texture2DSubgraphInputParameter() : base()
	{
		Value = new TextureInput()
		{
			ImageFormat = TextureFormat.DXT5,
			Type = TextureType.Tex2D,
			SrgbRead = true,
			DefaultColor = Color.White,
		};
		IsRequired = true;
	}
}


/// <summary>
/// Texture2D subgraph output parameter
/// </summary>
[Title( "Texture2D" ), Icon( "image" ), Order( 11 )]
[SubgraphOnly]
public sealed class Texture2DSubgraphOutputParameter : BlackboardSubgraphOutputParameter<TextureInput>
{
	[Hide, JsonIgnore]
	public override SubgraphPortType PortType => SubgraphPortType.Texture2DObject;

	public Texture2DSubgraphOutputParameter() : base()
	{
	}
}

/// <summary>
/// TextureCube subgraph input parameter
/// </summary>
[Title( "TextureCube" ), Icon( "image" ), Order( 12 )]
public sealed class TextureCubeSubgraphInputParameter : BlackboardSubgraphInputParameter<TextureInput>
{
	[Hide, JsonIgnore]
	public override SubgraphPortType PortType => SubgraphPortType.TextureCubeObject;

	[Hide, JsonIgnore]
	public override bool IsRequired { get; set; } = true;

	public TextureCubeSubgraphInputParameter() : base()
	{
		Value = new TextureInput()
		{
			ImageFormat = TextureFormat.DXT5,
			Type = TextureType.TexCube,
			SrgbRead = true,
			DefaultColor = Color.White,
		};
		IsRequired = true;
	}
}

/// <summary>
/// TextureCube subgraph output parameter
/// </summary>
[Title( "TextureCube" ), Icon( "image" ), Order( 12 )]
[SubgraphOnly]
public sealed class TextureCubeSubgraphOutputParameter : BlackboardSubgraphOutputParameter<TextureInput>
{
	[Hide, JsonIgnore]
	public override SubgraphPortType PortType => SubgraphPortType.TextureCubeObject;

	public TextureCubeSubgraphOutputParameter() : base()
	{
	}
}

/// <summary>
/// SamplerState subgraph input parameter
/// </summary>
[Title( "Sampler State" ), Icon( "colorize" ), Order( 13 )]
[SubgraphOnly]
public sealed class SamplerStateSubgraphInputParameter : BlackboardSubgraphInputParameter<Sampler>
{
	[Hide, JsonIgnore]
	public override SubgraphPortType PortType => SubgraphPortType.SamplerState;

	public SamplerStateSubgraphInputParameter() : base()
	{
		Value = new Sampler();
	}
}

/// <summary>
/// SamplerState subgraph output parameter
/// </summary>
[Title( "Sampler State" ), Icon( "colorize" ), Order( 13 )]
[SubgraphOnly]
public sealed class SamplerStateSubgraphOutputParameter : BlackboardSubgraphOutputParameter<Sampler>
{
	[Hide, JsonIgnore]
	public override SubgraphPortType PortType => SubgraphPortType.SamplerState;

	public SamplerStateSubgraphOutputParameter() : base()
	{
	}
}