You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

254 lines
7.4 KiB

// Amplify Shader Editor - Visual Shader Editing Tool
// Copyright (c) Amplify Creations, Lda <info@amplify.pt>
using UnityEngine;
using UnityEditor;
using System;
namespace AmplifyShaderEditor
{
[Serializable]
[NodeAttributes( "[Old]Append", "Vector Operators", "Append channels to create a new component",null,KeyCode.V,true,true,"Append",typeof(DynamicAppendNode))]
public sealed class AppendNode : ParentNode
{
private const string OutputTypeStr = "Output type";
[SerializeField]
private WirePortDataType m_selectedOutputType = WirePortDataType.FLOAT4;
[SerializeField]
private int m_selectedOutputTypeInt = 2;
[SerializeField]
private float[] m_defaultValues = { 0, 0, 0, 0 };
private string[] m_defaultValuesStr = { "[0]", "[1]", "[2]", "[3]" };
private readonly string[] m_outputValueTypes ={ "Vector2",
"Vector3",
"Vector4",
"Color"};
protected override void CommonInit( int uniqueId )
{
base.CommonInit( uniqueId );
AddInputPort( WirePortDataType.FLOAT, false, "[0]" );
AddInputPort( WirePortDataType.FLOAT, false, "[1]" );
AddInputPort( WirePortDataType.FLOAT, false, "[2]" );
AddInputPort( WirePortDataType.FLOAT, false, "[3]" );
AddOutputPort( m_selectedOutputType, Constants.EmptyPortValue );
m_textLabelWidth = 90;
m_autoWrapProperties = true;
m_previewShaderGUID = "d80ac81aabf643848a4eaa76f2f88d65";
}
public override void Draw( DrawInfo drawInfo )
{
base.Draw( drawInfo );
if ( m_dropdownEditing )
{
EditorGUI.BeginChangeCheck();
m_selectedOutputTypeInt = EditorGUIPopup( m_dropdownRect, m_selectedOutputTypeInt, m_outputValueTypes, UIUtils.PropertyPopUp );
if ( EditorGUI.EndChangeCheck() )
{
SetupPorts();
m_dropdownEditing = false;
}
}
}
void SetupPorts()
{
switch ( m_selectedOutputTypeInt )
{
case 0: m_selectedOutputType = WirePortDataType.FLOAT2; break;
case 1: m_selectedOutputType = WirePortDataType.FLOAT3; break;
case 2: m_selectedOutputType = WirePortDataType.FLOAT4; break;
case 3: m_selectedOutputType = WirePortDataType.COLOR; break;
}
UpdatePorts();
}
public override void DrawProperties()
{
base.DrawProperties();
EditorGUILayout.BeginVertical();
EditorGUI.BeginChangeCheck();
m_selectedOutputTypeInt = EditorGUILayoutPopup( OutputTypeStr, m_selectedOutputTypeInt, m_outputValueTypes );
if ( EditorGUI.EndChangeCheck() )
{
SetupPorts();
}
int count = 0;
switch ( m_selectedOutputType )
{
case WirePortDataType.FLOAT4:
case WirePortDataType.COLOR:
{
count = 4;
}
break;
case WirePortDataType.FLOAT3:
{
count = 3;
}
break;
case WirePortDataType.FLOAT2:
{
count = 2;
}
break;
case WirePortDataType.OBJECT:
case WirePortDataType.FLOAT:
case WirePortDataType.INT:
case WirePortDataType.FLOAT3x3:
case WirePortDataType.FLOAT4x4:
{ }
break;
}
for ( int i = 0; i < count; i++ )
{
if ( !m_inputPorts[ i ].IsConnected )
m_defaultValues[ i ] = EditorGUILayoutFloatField( m_defaultValuesStr[ i ], m_defaultValues[ i ] );
}
EditorGUILayout.EndVertical();
}
void UpdatePorts()
{
m_sizeIsDirty = true;
ChangeOutputType( m_selectedOutputType, false );
switch ( m_selectedOutputType )
{
case WirePortDataType.FLOAT4:
case WirePortDataType.OBJECT:
case WirePortDataType.COLOR:
{
m_inputPorts[ 0 ].Visible = true;
m_inputPorts[ 1 ].Visible = true;
m_inputPorts[ 2 ].Visible = true;
m_inputPorts[ 3 ].Visible = true;
}
break;
case WirePortDataType.FLOAT3:
{
m_inputPorts[ 0 ].Visible = true;
m_inputPorts[ 1 ].Visible = true;
m_inputPorts[ 2 ].Visible = true;
m_inputPorts[ 3 ].Visible = false;
if ( m_inputPorts[ 3 ].IsConnected )
UIUtils.DeleteConnection( true, UniqueId, 3, false, true );
}
break;
case WirePortDataType.FLOAT2:
{
m_inputPorts[ 0 ].Visible = true;
m_inputPorts[ 1 ].Visible = true;
m_inputPorts[ 2 ].Visible = false;
if ( m_inputPorts[ 2 ].IsConnected )
UIUtils.DeleteConnection( true, UniqueId, 2, false, true );
m_inputPorts[ 3 ].Visible = false;
if ( m_inputPorts[ 3 ].IsConnected )
UIUtils.DeleteConnection( true, UniqueId, 3, false, true );
}
break;
case WirePortDataType.FLOAT:
case WirePortDataType.INT:
case WirePortDataType.FLOAT3x3:
case WirePortDataType.FLOAT4x4:
{ }
break;
}
}
public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar )
{
if ( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) )
return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory );
string value = string.Empty;
switch ( m_selectedOutputType )
{
case WirePortDataType.FLOAT4:
case WirePortDataType.OBJECT:
case WirePortDataType.COLOR:
{
value = "float4( ";
for ( int i = 0; i < 4; i++ )
{
value += m_inputPorts[ i ].IsConnected ? InputPorts[ i ].GenerateShaderForOutput( ref dataCollector, WirePortDataType.FLOAT, ignoreLocalVar, true ) : m_defaultValues[ i ].ToString();
if ( i != 3 )
value += " , ";
}
value += " )";
}
break;
case WirePortDataType.FLOAT3:
{
value = "float3( ";
for ( int i = 0; i < 3; i++ )
{
value += m_inputPorts[ i ].IsConnected ? InputPorts[ i ].GenerateShaderForOutput( ref dataCollector, WirePortDataType.FLOAT, ignoreLocalVar, true ) : m_defaultValues[ i ].ToString();
if ( i != 2 )
value += " , ";
}
value += " )";
}
break;
case WirePortDataType.FLOAT2:
{
value = "float2( ";
for ( int i = 0; i < 2; i++ )
{
value += m_inputPorts[ i ].IsConnected ? InputPorts[ i ].GenerateShaderForOutput( ref dataCollector, WirePortDataType.FLOAT, ignoreLocalVar, true ) : m_defaultValues[ i ].ToString();
if ( i != 1 )
value += " , ";
}
value += " )";
}
break;
case WirePortDataType.FLOAT:
case WirePortDataType.INT:
case WirePortDataType.FLOAT3x3:
case WirePortDataType.FLOAT4x4:
{ }
break;
}
RegisterLocalVariable( 0, value, ref dataCollector, "appendResult" + OutputId );
return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory );
}
public override void ReadFromString( ref string[] nodeParams )
{
base.ReadFromString( ref nodeParams );
m_selectedOutputType = ( WirePortDataType ) Enum.Parse( typeof( WirePortDataType ), GetCurrentParam( ref nodeParams ) );
switch ( m_selectedOutputType )
{
case WirePortDataType.FLOAT2: m_selectedOutputTypeInt = 0; break;
case WirePortDataType.FLOAT3: m_selectedOutputTypeInt = 1; break;
case WirePortDataType.FLOAT4: m_selectedOutputTypeInt = 2; break;
case WirePortDataType.COLOR: m_selectedOutputTypeInt = 3; break;
}
for ( int i = 0; i < m_defaultValues.Length; i++ )
{
m_defaultValues[ i ] = Convert.ToSingle( GetCurrentParam( ref nodeParams ) );
}
UpdatePorts();
}
public override void WriteToString( ref string nodeInfo, ref string connectionsInfo )
{
base.WriteToString( ref nodeInfo, ref connectionsInfo );
IOUtils.AddFieldValueToString( ref nodeInfo, m_selectedOutputType );
for ( int i = 0; i < m_defaultValues.Length; i++ )
{
IOUtils.AddFieldValueToString( ref nodeInfo, m_defaultValues[ i ] );
}
}
}
}