// 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( "Debug Switch", "Logical Operators", "Hard Switch between any of its input ports" )]
|
|
public class SwitchNode : ParentNode
|
|
{
|
|
private const string Info = "This is a Debug node which only generates the source for the selected port. This means that no properties are generated for other ports and information might be lost.";
|
|
private const string InputPortName = "In ";
|
|
|
|
private const string CurrSelectedStr = "Current";
|
|
private const string MaxAmountStr = "Max Amount";
|
|
private const int MaxAllowedAmount = 8;
|
|
|
|
[SerializeField]
|
|
private string[] m_availableInputsLabels = { "In 0", "In 1" };
|
|
|
|
[SerializeField]
|
|
private int[] m_availableInputsValues = { 0, 1 };
|
|
|
|
[SerializeField]
|
|
private int m_currentSelectedInput = 0;
|
|
|
|
[SerializeField]
|
|
private int m_maxAmountInputs = 2;
|
|
|
|
private int m_cachedPropertyId = -1;
|
|
|
|
private GUIContent m_popContent;
|
|
|
|
private Rect m_varRect;
|
|
private Rect m_imgRect;
|
|
private bool m_editing;
|
|
|
|
protected override void CommonInit( int uniqueId )
|
|
{
|
|
base.CommonInit( uniqueId );
|
|
for( int i = 0; i < MaxAllowedAmount; i++ )
|
|
{
|
|
AddInputPort( WirePortDataType.FLOAT, false, InputPortName + i );
|
|
m_inputPorts[ i ].Visible = ( i < 2 );
|
|
}
|
|
AddOutputPort( WirePortDataType.FLOAT, " " );
|
|
|
|
m_popContent = new GUIContent();
|
|
m_popContent.image = UIUtils.PopupIcon;
|
|
|
|
m_insideSize.Set( 50, 25 );
|
|
m_textLabelWidth = 100;
|
|
m_autoWrapProperties = false;
|
|
m_previewShaderGUID = "a58e46feaa5e3d14383bfeac24d008bc";
|
|
}
|
|
|
|
public override void SetPreviewInputs()
|
|
{
|
|
base.SetPreviewInputs();
|
|
|
|
if( m_cachedPropertyId == -1 )
|
|
m_cachedPropertyId = Shader.PropertyToID( "_Current" );
|
|
|
|
PreviewMaterial.SetInt( m_cachedPropertyId, m_currentSelectedInput );
|
|
}
|
|
|
|
public override void OnConnectedOutputNodeChanges( int inputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type )
|
|
{
|
|
m_inputPorts[ inputPortId ].MatchPortToConnection();
|
|
if( inputPortId == m_currentSelectedInput )
|
|
m_outputPorts[ 0 ].ChangeType( m_inputPorts[ inputPortId ].DataType, false );
|
|
}
|
|
|
|
public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true )
|
|
{
|
|
base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode );
|
|
m_inputPorts[ portId ].MatchPortToConnection();
|
|
if( portId == m_currentSelectedInput )
|
|
m_outputPorts[ 0 ].ChangeType( m_inputPorts[ portId ].DataType, false );
|
|
}
|
|
|
|
public void UpdateLabels()
|
|
{
|
|
m_availableInputsLabels = new string[ m_maxAmountInputs ];
|
|
m_availableInputsValues = new int[ m_maxAmountInputs ];
|
|
|
|
for( int i = 0; i < m_maxAmountInputs; i++ )
|
|
{
|
|
m_availableInputsLabels[ i ] = InputPortName + i;
|
|
m_availableInputsValues[ i ] = i;
|
|
}
|
|
}
|
|
|
|
//void UpdateOutput()
|
|
//{
|
|
// m_outputPorts[ 0 ].ChangeProperties( m_inputPorts[ m_currentSelectedInput ].Name, m_inputPorts[ m_currentSelectedInput ].DataType, false );
|
|
// m_sizeIsDirty = true;
|
|
//}
|
|
|
|
public override void OnNodeLayout( DrawInfo drawInfo )
|
|
{
|
|
base.OnNodeLayout( drawInfo );
|
|
|
|
m_varRect = m_remainingBox;
|
|
m_varRect.width = 50 * drawInfo.InvertedZoom;
|
|
m_varRect.height = 16 * drawInfo.InvertedZoom;
|
|
m_varRect.x = m_remainingBox.xMax - m_varRect.width;
|
|
//m_varRect.x += m_remainingBox.width * 0.5f - m_varRect.width * 0.5f;
|
|
m_varRect.y += 1 * drawInfo.InvertedZoom;
|
|
|
|
m_imgRect = m_varRect;
|
|
m_imgRect.x = m_varRect.xMax - 16 * drawInfo.InvertedZoom;
|
|
m_imgRect.width = 16 * drawInfo.InvertedZoom;
|
|
m_imgRect.height = m_imgRect.width;
|
|
}
|
|
|
|
public override void DrawGUIControls( DrawInfo drawInfo )
|
|
{
|
|
base.DrawGUIControls( drawInfo );
|
|
|
|
if( drawInfo.CurrentEventType != EventType.MouseDown )
|
|
return;
|
|
|
|
if( m_varRect.Contains( drawInfo.MousePosition ) )
|
|
{
|
|
m_editing = true;
|
|
}
|
|
else if( m_editing )
|
|
{
|
|
m_editing = false;
|
|
}
|
|
}
|
|
|
|
public override void Draw( DrawInfo drawInfo )
|
|
{
|
|
base.Draw( drawInfo );
|
|
|
|
if( m_editing )
|
|
{
|
|
EditorGUI.BeginChangeCheck();
|
|
m_currentSelectedInput = EditorGUIIntPopup( m_varRect, m_currentSelectedInput, m_availableInputsLabels, m_availableInputsValues, UIUtils.GraphDropDown );
|
|
if( EditorGUI.EndChangeCheck() )
|
|
{
|
|
m_editing = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
public override void OnNodeRepaint( DrawInfo drawInfo )
|
|
{
|
|
base.OnNodeRepaint( drawInfo );
|
|
|
|
if( !m_isVisible )
|
|
return;
|
|
|
|
if( !m_editing && ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD4 )
|
|
{
|
|
GUI.Label( m_varRect, m_availableInputsLabels[ m_currentSelectedInput ], UIUtils.GraphDropDown );
|
|
GUI.Label( m_imgRect, m_popContent, UIUtils.GraphButtonIcon );
|
|
}
|
|
}
|
|
|
|
public override void DrawProperties()
|
|
{
|
|
base.DrawProperties();
|
|
NodeUtils.DrawPropertyGroup( ref m_propertiesFoldout, Constants.ParameterLabelStr, DrawDebugOptions );
|
|
|
|
EditorGUILayout.HelpBox( Info, MessageType.Warning );
|
|
}
|
|
|
|
void DrawDebugOptions()
|
|
{
|
|
EditorGUI.BeginChangeCheck();
|
|
m_maxAmountInputs = EditorGUILayoutIntSlider( MaxAmountStr, m_maxAmountInputs, 2, MaxAllowedAmount );
|
|
if( EditorGUI.EndChangeCheck() )
|
|
{
|
|
for( int i = 0; i < MaxAllowedAmount; i++ )
|
|
{
|
|
m_inputPorts[ i ].Visible = ( i < m_maxAmountInputs );
|
|
}
|
|
|
|
if( m_currentSelectedInput >= m_maxAmountInputs )
|
|
{
|
|
m_currentSelectedInput = m_maxAmountInputs - 1;
|
|
}
|
|
|
|
UpdateLabels();
|
|
m_sizeIsDirty = true;
|
|
}
|
|
|
|
m_currentSelectedInput = EditorGUILayoutIntPopup( CurrSelectedStr, m_currentSelectedInput, m_availableInputsLabels, m_availableInputsValues );
|
|
}
|
|
|
|
public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar )
|
|
{
|
|
return m_inputPorts[ m_currentSelectedInput ].GeneratePortInstructions( ref dataCollector );
|
|
}
|
|
|
|
public override void ReadFromString( ref string[] nodeParams )
|
|
{
|
|
base.ReadFromString( ref nodeParams );
|
|
m_currentSelectedInput = Convert.ToInt32( GetCurrentParam( ref nodeParams ) );
|
|
m_maxAmountInputs = Convert.ToInt32( GetCurrentParam( ref nodeParams ) );
|
|
|
|
for( int i = 0; i < MaxAllowedAmount; i++ )
|
|
{
|
|
m_inputPorts[ i ].Visible = ( i < m_maxAmountInputs );
|
|
}
|
|
|
|
if( m_currentSelectedInput >= m_maxAmountInputs )
|
|
{
|
|
m_currentSelectedInput = m_maxAmountInputs - 1;
|
|
}
|
|
|
|
UpdateLabels();
|
|
m_sizeIsDirty = true;
|
|
}
|
|
|
|
public override void WriteToString( ref string nodeInfo, ref string connectionsInfo )
|
|
{
|
|
base.WriteToString( ref nodeInfo, ref connectionsInfo );
|
|
IOUtils.AddFieldValueToString( ref nodeInfo, m_currentSelectedInput );
|
|
IOUtils.AddFieldValueToString( ref nodeInfo, m_maxAmountInputs );
|
|
}
|
|
}
|
|
}
|