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.
 
 
 

229 lines
6.7 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( "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 );
}
}
}