summaryrefslogtreecommitdiff
path: root/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/StaticSwitch.cs
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2020-10-23 13:08:43 +0800
committerchai <chaifix@163.com>2020-10-23 13:08:43 +0800
commitb82da95b5181ac8bbae38efb13e950d5e88a4caa (patch)
tree48a6f3269276484bbc7cfc95f0651f40a2176aa1 /Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/StaticSwitch.cs
parent917e9e0b320775634dc2e710f7deac74fd0822f0 (diff)
*移动amplify shader editor到third party目录
Diffstat (limited to 'Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/StaticSwitch.cs')
-rw-r--r--Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/StaticSwitch.cs1197
1 files changed, 1197 insertions, 0 deletions
diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/StaticSwitch.cs b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/StaticSwitch.cs
new file mode 100644
index 00000000..6704cbee
--- /dev/null
+++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/StaticSwitch.cs
@@ -0,0 +1,1197 @@
+// Amplify Shader Editor - Visual Shader vEditing Tool
+// Copyright (c) Amplify Creations, Lda <info@amplify.pt>
+
+using UnityEngine;
+using UnityEditor;
+using System;
+
+namespace AmplifyShaderEditor
+{
+ [Serializable]
+ [NodeAttributes( "Static Switch", "Logical Operators", "Creates a shader keyword toggle", Available = true )]
+ public sealed class StaticSwitch : PropertyNode
+ {
+ private float InstanceIconWidth = 19;
+ private float InstanceIconHeight = 19;
+ private readonly Color ReferenceHeaderColor = new Color( 0f, 0.5f, 0.585f, 1.0f );
+
+ [SerializeField]
+ private int m_defaultValue = 0;
+
+ [SerializeField]
+ private int m_materialValue = 0;
+
+ [SerializeField]
+ private int m_multiCompile = 0;
+
+ [SerializeField]
+ private int m_currentKeywordId = 0;
+
+ [SerializeField]
+ private string m_currentKeyword = string.Empty;
+
+ [SerializeField]
+ private bool m_createToggle = true;
+
+ private const string IsLocalStr = "Is Local";
+#if UNITY_2019_1_OR_NEWER
+ [SerializeField]
+ private bool m_isLocal = true;
+#else
+ [SerializeField]
+ private bool m_isLocal = false;
+#endif
+ private GUIContent m_checkContent;
+ private GUIContent m_popContent;
+
+ private int m_conditionId = -1;
+
+ private const int MinComboSize = 50;
+ private const int MaxComboSize = 105;
+
+ private Rect m_varRect;
+ private Rect m_imgRect;
+ private bool m_editing;
+
+ public enum KeywordModeType
+ {
+ Toggle = 0,
+ ToggleOff,
+ KeywordEnum,
+ }
+
+ public enum StaticSwitchVariableMode
+ {
+ Create = 0,
+ Fetch,
+ Reference
+ }
+
+ [SerializeField]
+ private KeywordModeType m_keywordModeType = KeywordModeType.Toggle;
+
+ [SerializeField]
+ private StaticSwitch m_reference = null;
+
+ private const string StaticSwitchStr = "Static Switch";
+ private const string MaterialToggleStr = "Material Toggle";
+
+ private const string ToggleMaterialValueStr = "Material Value";
+ private const string ToggleDefaultValueStr = "Default Value";
+
+ private const string AmountStr = "Amount";
+ private const string KeywordStr = "Keyword";
+ private const string CustomStr = "Custom";
+ private const string ToggleTypeStr = "Toggle Type";
+ private const string TypeStr = "Type";
+ private const string ModeStr = "Mode";
+ private const string KeywordTypeStr = "Keyword Type";
+
+ private const string KeywordNameStr = "Keyword Name";
+ public readonly static string[] KeywordTypeList = { "Shader Feature", "Multi Compile"/*, "Define Symbol"*/ };
+ public readonly static int[] KeywordTypeInt = { 0, 1/*, 2*/ };
+
+ [SerializeField]
+ private string[] m_defaultKeywordNames = { "Key0", "Key1", "Key2", "Key3", "Key4", "Key5", "Key6", "Key7", "Key8" };
+
+ [SerializeField]
+ private string[] m_keywordEnumList = { "Key0", "Key1" };
+
+ [SerializeField]
+ private StaticSwitchVariableMode m_staticSwitchVarMode = StaticSwitchVariableMode.Create;
+
+ [SerializeField]
+ private int m_referenceArrayId = -1;
+
+ [SerializeField]
+ private int m_referenceNodeId = -1;
+
+ private int m_keywordEnumAmount = 2;
+
+ private bool m_isStaticSwitchDirty = false;
+
+ private Rect m_iconPos;
+
+ protected override void CommonInit( int uniqueId )
+ {
+ base.CommonInit( uniqueId );
+ AddOutputPort( WirePortDataType.FLOAT, Constants.EmptyPortValue );
+ AddInputPort( WirePortDataType.FLOAT, false, "False", -1, MasterNodePortCategory.Fragment, 1 );
+ AddInputPort( WirePortDataType.FLOAT, false, "True", -1, MasterNodePortCategory.Fragment, 0 );
+ for( int i = 2; i < 9; i++ )
+ {
+ AddInputPort( WirePortDataType.FLOAT, false, m_defaultKeywordNames[ i ] );
+ m_inputPorts[ i ].Visible = false;
+ }
+ m_headerColor = new Color( 0.0f, 0.55f, 0.45f, 1f );
+ m_customPrefix = KeywordStr + " ";
+ m_autoWrapProperties = false;
+ m_freeType = false;
+ m_useVarSubtitle = true;
+ m_allowPropertyDuplicates = true;
+ m_showTitleWhenNotEditing = false;
+ m_currentParameterType = PropertyType.Property;
+
+ m_checkContent = new GUIContent();
+ m_checkContent.image = UIUtils.CheckmarkIcon;
+
+ m_popContent = new GUIContent();
+ m_popContent.image = UIUtils.PopupIcon;
+
+ m_previewShaderGUID = "0b708c11c68e6a9478ac97fe3643eab1";
+ m_showAutoRegisterUI = true;
+ }
+
+ public override void SetPreviewInputs()
+ {
+ base.SetPreviewInputs();
+
+ if( m_conditionId == -1 )
+ m_conditionId = Shader.PropertyToID( "_Condition" );
+
+ StaticSwitch node = ( m_staticSwitchVarMode == StaticSwitchVariableMode.Reference && m_reference != null ) ? m_reference : this;
+
+ if( m_createToggle )
+ PreviewMaterial.SetInt( m_conditionId, node.MaterialValue );
+ else
+ PreviewMaterial.SetInt( m_conditionId, node.DefaultValue );
+ }
+
+ protected override void OnUniqueIDAssigned()
+ {
+ base.OnUniqueIDAssigned();
+
+ if( m_createToggle )
+ UIUtils.RegisterPropertyNode( this );
+ else
+ UIUtils.UnregisterPropertyNode( this );
+
+ if( CurrentVarMode != StaticSwitchVariableMode.Reference )
+ {
+ ContainerGraph.StaticSwitchNodes.AddNode( this );
+ }
+
+ if( UniqueId > -1 )
+ ContainerGraph.StaticSwitchNodes.OnReorderEventComplete += OnReorderEventComplete;
+ }
+
+ public override void Destroy()
+ {
+ base.Destroy();
+ UIUtils.UnregisterPropertyNode( this );
+ if( CurrentVarMode != StaticSwitchVariableMode.Reference )
+ {
+ ContainerGraph.StaticSwitchNodes.RemoveNode( this );
+ }
+
+ if( UniqueId > -1 )
+ ContainerGraph.StaticSwitchNodes.OnReorderEventComplete -= OnReorderEventComplete;
+ }
+
+ void OnReorderEventComplete()
+ {
+ if( CurrentVarMode == StaticSwitchVariableMode.Reference )
+ {
+ if( m_reference != null )
+ {
+ m_referenceArrayId = ContainerGraph.StaticSwitchNodes.GetNodeRegisterIdx( m_reference.UniqueId );
+ }
+ }
+ }
+
+ public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true )
+ {
+ base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode );
+ UpdateConnections();
+ }
+
+ public override void OnConnectedOutputNodeChanges( int inputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type )
+ {
+ base.OnConnectedOutputNodeChanges( inputPortId, otherNodeId, otherPortId, name, type );
+ UpdateConnections();
+ }
+
+ public override void OnInputPortDisconnected( int portId )
+ {
+ base.OnInputPortDisconnected( portId );
+ UpdateConnections();
+ }
+
+ private void UpdateConnections()
+ {
+ WirePortDataType mainType = WirePortDataType.FLOAT;
+
+ int highest = UIUtils.GetPriority( mainType );
+ for( int i = 0; i < m_inputPorts.Count; i++ )
+ {
+ if( m_inputPorts[ i ].IsConnected )
+ {
+ WirePortDataType portType = m_inputPorts[ i ].GetOutputConnection().DataType;
+ if( UIUtils.GetPriority( portType ) > highest )
+ {
+ mainType = portType;
+ highest = UIUtils.GetPriority( portType );
+ }
+ }
+ }
+
+ for( int i = 0; i < m_inputPorts.Count; i++ )
+ {
+ m_inputPorts[ i ].ChangeType( mainType, false );
+ }
+
+ m_outputPorts[ 0 ].ChangeType( mainType, false );
+ }
+
+ public override string GetPropertyValue()
+ {
+ if( m_createToggle )
+ if( m_keywordModeType == KeywordModeType.KeywordEnum && m_keywordEnumAmount > 0 )
+ return PropertyAttributes + "[" + m_keywordModeType.ToString() + "(" + GetKeywordEnumPropertyList() + ")] " + m_propertyName + "(\"" + m_propertyInspectorName + "\", Float) = " + m_defaultValue;
+ else
+ return PropertyAttributes + "[" + m_keywordModeType.ToString() + "(" + GetPropertyValStr() + ")] " + m_propertyName + "(\"" + m_propertyInspectorName + "\", Float) = " + m_defaultValue;
+ else
+ return string.Empty;
+ }
+
+ public string KeywordEnum( int index )
+ {
+ if( m_createToggle )
+ {
+ return string.IsNullOrEmpty( PropertyName ) ? KeywordEnumList( index ) : ( PropertyName + "_" + KeywordEnumList( index ) );
+ }
+ else
+ {
+ return string.IsNullOrEmpty( PropertyName ) ? KeywordEnumList( index ) : ( PropertyName + KeywordEnumList( index ) );
+ }
+ }
+
+ public string KeywordEnumList( int index )
+ {
+ if( CurrentVarMode == StaticSwitchVariableMode.Fetch )
+ return m_keywordEnumList[ index ];
+ else
+ {
+ return m_createToggle ? m_keywordEnumList[ index ].ToUpper() : m_keywordEnumList[ index ];
+ }
+
+ }
+ public override string PropertyName
+ {
+ get
+ {
+ if( CurrentVarMode == StaticSwitchVariableMode.Fetch )
+ return m_currentKeyword;
+ else
+ {
+ return m_createToggle ? base.PropertyName.ToUpper() : base.PropertyName;
+ }
+ }
+ }
+
+ public override string GetPropertyValStr()
+ {
+ if( m_keywordModeType == KeywordModeType.KeywordEnum )
+ return PropertyName;
+ else if( CurrentVarMode == StaticSwitchVariableMode.Fetch )
+ return m_currentKeyword;
+ else
+ return PropertyName + OnOffStr;
+ }
+
+ private string GetKeywordEnumPropertyList()
+ {
+ string result = string.Empty;
+ for( int i = 0; i < m_keywordEnumList.Length; i++ )
+ {
+ if( i == 0 )
+ result = m_keywordEnumList[ i ];
+ else
+ result += "," + m_keywordEnumList[ i ];
+ }
+ return result;
+ }
+
+ private string GetKeywordEnumPragmaList()
+ {
+ string result = string.Empty;
+ for( int i = 0; i < m_keywordEnumList.Length; i++ )
+ {
+ if( i == 0 )
+ result = KeywordEnum( i );
+ else
+ result += " " + KeywordEnum( i );
+ }
+ return result;
+ }
+
+ public override string GetUniformValue()
+ {
+ return string.Empty;
+ }
+
+ public override bool GetUniformData( out string dataType, out string dataName, ref bool fullValue )
+ {
+ dataType = string.Empty;
+ dataName = string.Empty;
+ return false;
+ }
+
+ public override void DrawProperties()
+ {
+ //base.DrawProperties();
+ NodeUtils.DrawPropertyGroup( ref m_propertiesFoldout, Constants.ParameterLabelStr, PropertyGroup );
+ NodeUtils.DrawPropertyGroup( ref m_visibleCustomAttrFoldout, CustomAttrStr, DrawCustomAttributes, DrawCustomAttrAddRemoveButtons );
+ CheckPropertyFromInspector();
+ }
+
+ void DrawEnumList()
+ {
+ EditorGUI.BeginChangeCheck();
+ KeywordEnumAmount = EditorGUILayoutIntSlider( AmountStr, KeywordEnumAmount, 2, 9 );
+ if( EditorGUI.EndChangeCheck() )
+ {
+ CurrentSelectedInput = Mathf.Clamp( CurrentSelectedInput, 0, KeywordEnumAmount - 1 );
+ UpdateLabels();
+ }
+ EditorGUI.indentLevel++;
+ for( int i = 0; i < m_keywordEnumList.Length; i++ )
+ {
+ EditorGUI.BeginChangeCheck();
+ m_keywordEnumList[ i ] = EditorGUILayoutTextField( "Item " + i, m_keywordEnumList[ i ] );
+ if( EditorGUI.EndChangeCheck() )
+ {
+ m_keywordEnumList[ i ] = UIUtils.RemoveInvalidEnumCharacters( m_keywordEnumList[ i ] );
+ m_keywordEnumList[ i ] = m_keywordEnumList[ i ].Replace( " ", "" ); // sad face :( does not support spaces
+ m_inputPorts[ i ].Name = m_keywordEnumList[ i ];
+ m_defaultKeywordNames[ i ] = m_inputPorts[ i ].Name;
+ }
+ }
+ EditorGUI.indentLevel--;
+ }
+
+ public void UpdateLabels()
+ {
+ int maxinputs = m_keywordModeType == KeywordModeType.KeywordEnum ? KeywordEnumAmount : 2;
+ KeywordEnumAmount = Mathf.Clamp( KeywordEnumAmount, 0, maxinputs );
+ m_keywordEnumList = new string[ maxinputs ];
+
+ for( int i = 0; i < maxinputs; i++ )
+ {
+ m_keywordEnumList[ i ] = m_defaultKeywordNames[ i ];
+ m_inputPorts[ i ].Name = m_keywordEnumList[ i ];
+ }
+
+ if( m_keywordModeType != KeywordModeType.KeywordEnum )
+ {
+ m_inputPorts[ 0 ].Name = "False";
+ m_inputPorts[ 1 ].Name = "True";
+ }
+
+ for( int i = 0; i < m_inputPorts.Count; i++ )
+ {
+ m_inputPorts[ i ].Visible = ( i < maxinputs );
+ }
+ m_sizeIsDirty = true;
+ m_isStaticSwitchDirty = true;
+ }
+
+ void PropertyGroup()
+ {
+ EditorGUI.BeginChangeCheck();
+ CurrentVarMode = (StaticSwitchVariableMode)EditorGUILayoutEnumPopup( ModeStr, CurrentVarMode );
+ if( EditorGUI.EndChangeCheck() )
+ {
+ if( CurrentVarMode == StaticSwitchVariableMode.Fetch )
+ {
+ m_keywordModeType = KeywordModeType.Toggle;
+ UpdateLabels();
+ }
+
+ if( CurrentVarMode == StaticSwitchVariableMode.Reference )
+ {
+ UIUtils.UnregisterPropertyNode( this );
+ }
+ else
+ {
+ if( m_createToggle )
+ UIUtils.RegisterPropertyNode( this );
+ else
+ UIUtils.UnregisterPropertyNode( this );
+ }
+ }
+
+ if( CurrentVarMode == StaticSwitchVariableMode.Create )
+ {
+ EditorGUI.BeginChangeCheck();
+ m_multiCompile = EditorGUILayoutIntPopup( KeywordTypeStr, m_multiCompile, KeywordTypeList, KeywordTypeInt );
+ if( EditorGUI.EndChangeCheck() )
+ {
+ BeginPropertyFromInspectorCheck();
+ }
+ }
+ else if( CurrentVarMode == StaticSwitchVariableMode.Reference )
+ {
+ string[] arr = ContainerGraph.StaticSwitchNodes.NodesArr;
+ bool guiEnabledBuffer = GUI.enabled;
+ if( arr != null && arr.Length > 0 )
+ {
+ GUI.enabled = true;
+ }
+ else
+ {
+ m_referenceArrayId = -1;
+ GUI.enabled = false;
+ }
+
+ EditorGUI.BeginChangeCheck();
+ m_referenceArrayId = EditorGUILayoutPopup( Constants.AvailableReferenceStr, m_referenceArrayId, arr );
+ if( EditorGUI.EndChangeCheck() )
+ {
+ m_reference = ContainerGraph.StaticSwitchNodes.GetNode( m_referenceArrayId );
+ if( m_reference != null )
+ {
+ m_referenceNodeId = m_reference.UniqueId;
+ CheckReferenceValues( true );
+ }
+ else
+ {
+ m_referenceArrayId = -1;
+ m_referenceNodeId = -1;
+ }
+ }
+ GUI.enabled = guiEnabledBuffer;
+
+ return;
+ }
+
+ if( CurrentVarMode == StaticSwitchVariableMode.Create )
+ {
+ EditorGUI.BeginChangeCheck();
+ m_keywordModeType = (KeywordModeType)EditorGUILayoutEnumPopup( TypeStr, m_keywordModeType );
+ if( EditorGUI.EndChangeCheck() )
+ {
+ UpdateLabels();
+ }
+ }
+
+ if( m_keywordModeType != KeywordModeType.KeywordEnum )
+ {
+ if( CurrentVarMode == StaticSwitchVariableMode.Create )
+ {
+ ShowPropertyInspectorNameGUI();
+ ShowPropertyNameGUI( true );
+ bool guiEnabledBuffer = GUI.enabled;
+ GUI.enabled = false;
+ EditorGUILayout.TextField( KeywordNameStr, GetPropertyValStr() );
+ GUI.enabled = guiEnabledBuffer;
+ }
+
+ }
+ else
+ {
+ if( CurrentVarMode == StaticSwitchVariableMode.Create )
+ {
+ ShowPropertyInspectorNameGUI();
+ ShowPropertyNameGUI( true );
+ DrawEnumList();
+ }
+
+ }
+
+ if( CurrentVarMode == StaticSwitchVariableMode.Fetch )
+ {
+ //ShowPropertyInspectorNameGUI();
+ EditorGUI.BeginChangeCheck();
+ m_currentKeywordId = EditorGUILayoutPopup( KeywordStr, m_currentKeywordId, UIUtils.AvailableKeywords );
+ if( EditorGUI.EndChangeCheck() )
+ {
+ if( m_currentKeywordId != 0 )
+ {
+ m_currentKeyword = UIUtils.AvailableKeywords[ m_currentKeywordId ];
+ }
+ }
+
+ if( m_currentKeywordId == 0 )
+ {
+ EditorGUI.BeginChangeCheck();
+ m_currentKeyword = EditorGUILayoutTextField( CustomStr, m_currentKeyword );
+ if( EditorGUI.EndChangeCheck() )
+ {
+ m_currentKeyword = UIUtils.RemoveInvalidCharacters( m_currentKeyword );
+ }
+ }
+ }
+
+#if UNITY_2019_1_OR_NEWER
+ m_isLocal = EditorGUILayoutToggle( IsLocalStr, m_isLocal );
+#endif
+
+ if( CurrentVarMode == StaticSwitchVariableMode.Create )
+ {
+ ShowAutoRegister();
+ }
+
+ EditorGUI.BeginChangeCheck();
+ m_createToggle = EditorGUILayoutToggle( MaterialToggleStr, m_createToggle );
+ if( EditorGUI.EndChangeCheck() )
+ {
+ if( m_createToggle )
+ UIUtils.RegisterPropertyNode( this );
+ else
+ UIUtils.UnregisterPropertyNode( this );
+ }
+
+
+ if( m_createToggle )
+ {
+ EditorGUILayout.BeginHorizontal();
+ GUILayout.Space( 20 );
+ m_propertyTab = GUILayout.Toolbar( m_propertyTab, LabelToolbarTitle );
+ EditorGUILayout.EndHorizontal();
+ switch( m_propertyTab )
+ {
+ default:
+ case 0:
+ {
+ EditorGUI.BeginChangeCheck();
+ if( m_keywordModeType != KeywordModeType.KeywordEnum )
+ m_materialValue = EditorGUILayoutToggle( ToggleMaterialValueStr, m_materialValue == 1 ) ? 1 : 0;
+ else
+ m_materialValue = EditorGUILayoutPopup( ToggleMaterialValueStr, m_materialValue, m_keywordEnumList );
+ if( EditorGUI.EndChangeCheck() )
+ m_requireMaterialUpdate = true;
+ }
+ break;
+ case 1:
+ {
+ if( m_keywordModeType != KeywordModeType.KeywordEnum )
+ m_defaultValue = EditorGUILayoutToggle( ToggleDefaultValueStr, m_defaultValue == 1 ) ? 1 : 0;
+ else
+ m_defaultValue = EditorGUILayoutPopup( ToggleDefaultValueStr, m_defaultValue, m_keywordEnumList );
+ }
+ break;
+ }
+ }
+
+ //EditorGUILayout.HelpBox( "Keyword Type:\n" +
+ // "The difference is that unused variants of \"Shader Feature\" shaders will not be included into game build while \"Multi Compile\" variants are included regardless of their usage.\n\n" +
+ // "So \"Shader Feature\" makes most sense for keywords that will be set on the materials, while \"Multi Compile\" for keywords that will be set from code globally.\n\n" +
+ // "You can set keywords using the material property using the \"Property Name\" or you can set the keyword directly using the \"Keyword Name\".", MessageType.None );
+ }
+
+ public override void CheckPropertyFromInspector( bool forceUpdate = false )
+ {
+ if( m_propertyFromInspector )
+ {
+ if( forceUpdate || ( EditorApplication.timeSinceStartup - m_propertyFromInspectorTimestamp ) > MaxTimestamp )
+ {
+ m_propertyFromInspector = false;
+ RegisterPropertyName( true, m_propertyInspectorName, m_autoGlobalName, m_underscoredGlobal );
+ m_propertyNameIsDirty = true;
+
+ if( CurrentVarMode != StaticSwitchVariableMode.Reference )
+ {
+ ContainerGraph.StaticSwitchNodes.UpdateDataOnNode( UniqueId, DataToArray );
+ }
+ }
+ }
+ }
+
+ public override void OnNodeLayout( DrawInfo drawInfo )
+ {
+ float finalSize = 0;
+ if( m_keywordModeType == KeywordModeType.KeywordEnum )
+ {
+ GUIContent dropdown = new GUIContent( m_inputPorts[ CurrentSelectedInput ].Name );
+ int cacheSize = UIUtils.GraphDropDown.fontSize;
+ UIUtils.GraphDropDown.fontSize = 10;
+ Vector2 calcSize = UIUtils.GraphDropDown.CalcSize( dropdown );
+ UIUtils.GraphDropDown.fontSize = cacheSize;
+ finalSize = Mathf.Clamp( calcSize.x, MinComboSize, MaxComboSize );
+ if( m_insideSize.x != finalSize )
+ {
+ m_insideSize.Set( finalSize, 25 );
+ m_sizeIsDirty = true;
+ }
+ }
+
+ base.OnNodeLayout( drawInfo );
+
+ if( m_keywordModeType != KeywordModeType.KeywordEnum )
+ {
+ m_varRect = m_remainingBox;
+ m_varRect.size = Vector2.one * 22 * drawInfo.InvertedZoom;
+ m_varRect.center = m_remainingBox.center;
+ if( m_showPreview )
+ m_varRect.y = m_remainingBox.y;
+ }
+ else
+ {
+ m_varRect = m_remainingBox;
+ m_varRect.width = finalSize * drawInfo.InvertedZoom;
+ m_varRect.height = 16 * drawInfo.InvertedZoom;
+ m_varRect.x = m_remainingBox.xMax - m_varRect.width;
+ 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;
+ }
+
+ CheckReferenceValues( false );
+
+ if( m_staticSwitchVarMode == StaticSwitchVariableMode.Reference )
+ {
+ m_iconPos = m_globalPosition;
+ m_iconPos.width = InstanceIconWidth * drawInfo.InvertedZoom;
+ m_iconPos.height = InstanceIconHeight * drawInfo.InvertedZoom;
+
+ m_iconPos.y += 10 * drawInfo.InvertedZoom;
+ m_iconPos.x += /*m_globalPosition.width - m_iconPos.width - */5 * drawInfo.InvertedZoom;
+ }
+
+ }
+
+ void CheckReferenceValues( bool forceUpdate )
+ {
+ if( m_staticSwitchVarMode == StaticSwitchVariableMode.Reference )
+ {
+ if( m_reference == null && m_referenceNodeId > 0 )
+ {
+ m_reference = ContainerGraph.GetNode( m_referenceNodeId ) as StaticSwitch;
+ m_referenceArrayId = ContainerGraph.StaticSwitchNodes.GetNodeRegisterIdx( m_referenceNodeId );
+ }
+
+ if( m_reference != null )
+ {
+ if( forceUpdate || m_reference.IsStaticSwitchDirty )
+ {
+ int count = m_inputPorts.Count;
+ for( int i = 0; i < count; i++ )
+ {
+ m_inputPorts[ i ].Name = m_reference.InputPorts[ i ].Name;
+ m_inputPorts[ i ].Visible = m_reference.InputPorts[ i ].Visible;
+ }
+ m_sizeIsDirty = true;
+ }
+ }
+ }
+ else
+ {
+ m_isStaticSwitchDirty = false;
+ }
+ }
+
+ public override void DrawGUIControls( DrawInfo drawInfo )
+ {
+ base.DrawGUIControls( drawInfo );
+
+ if( drawInfo.CurrentEventType != EventType.MouseDown || !m_createToggle )
+ return;
+
+ if( m_varRect.Contains( drawInfo.MousePosition ) )
+ {
+ m_editing = true;
+ }
+ else if( m_editing )
+ {
+ m_editing = false;
+ }
+ }
+
+ private int CurrentSelectedInput
+ {
+ get
+ {
+ return m_materialMode ? m_materialValue : m_defaultValue;
+ }
+ set
+ {
+ if( m_materialMode )
+ m_materialValue = value;
+ else
+ m_defaultValue = value;
+ }
+ }
+
+ public override void Draw( DrawInfo drawInfo )
+ {
+ base.Draw( drawInfo );
+ if( m_staticSwitchVarMode == StaticSwitchVariableMode.Reference )
+ return;
+
+ if( m_editing )
+ {
+ if( m_keywordModeType != KeywordModeType.KeywordEnum )
+ {
+ if( GUI.Button( m_varRect, GUIContent.none, UIUtils.GraphButton ) )
+ {
+ CurrentSelectedInput = CurrentSelectedInput == 1 ? 0 : 1;
+ PreviewIsDirty = true;
+ m_editing = false;
+ if( m_materialMode )
+ m_requireMaterialUpdate = true;
+ }
+
+ if( CurrentSelectedInput == 1 )
+ {
+ GUI.Label( m_varRect, m_checkContent, UIUtils.GraphButtonIcon );
+ }
+ }
+ else
+ {
+ EditorGUI.BeginChangeCheck();
+ CurrentSelectedInput = EditorGUIPopup( m_varRect, CurrentSelectedInput, m_keywordEnumList, UIUtils.GraphDropDown );
+ if( EditorGUI.EndChangeCheck() )
+ {
+ PreviewIsDirty = true;
+ m_editing = false;
+ if( m_materialMode )
+ m_requireMaterialUpdate = true;
+ }
+ }
+ }
+ }
+
+ public override void OnNodeRepaint( DrawInfo drawInfo )
+ {
+ base.OnNodeRepaint( drawInfo );
+
+ if( !m_isVisible )
+ return;
+
+ if( m_staticSwitchVarMode == StaticSwitchVariableMode.Reference )
+ {
+ GUI.Label( m_iconPos, string.Empty, UIUtils.GetCustomStyle( CustomStyle.SamplerTextureIcon ) );
+ return;
+ }
+
+ if( m_createToggle && ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD2 )
+ {
+ if( !m_editing )
+ {
+ if( m_keywordModeType != KeywordModeType.KeywordEnum )
+ {
+ GUI.Label( m_varRect, GUIContent.none, UIUtils.GraphButton );
+
+ if( CurrentSelectedInput == 1 )
+ GUI.Label( m_varRect, m_checkContent, UIUtils.GraphButtonIcon );
+ }
+ else
+ {
+ GUI.Label( m_varRect, m_keywordEnumList[ CurrentSelectedInput ], UIUtils.GraphDropDown );
+ GUI.Label( m_imgRect, m_popContent, UIUtils.GraphButtonIcon );
+ }
+ }
+ }
+ }
+
+ private string OnOffStr
+ {
+ get
+ {
+ StaticSwitch node = null;
+ switch( CurrentVarMode )
+ {
+ default:
+ case StaticSwitchVariableMode.Create:
+ case StaticSwitchVariableMode.Fetch:
+ node = this;
+ break;
+ case StaticSwitchVariableMode.Reference:
+ {
+ node = ( m_reference != null ) ? m_reference : this;
+ }
+ break;
+ }
+
+ if( !node.CreateToggle )
+ return string.Empty;
+
+ switch( node.KeywordModeTypeValue )
+ {
+ default:
+ case KeywordModeType.Toggle:
+ return "_ON";
+ case KeywordModeType.ToggleOff:
+ return "_OFF";
+ }
+ }
+ }
+ string GetStaticSwitchType()
+ {
+ string staticSwitchType = ( m_multiCompile == 1 ) ? "multi_compile" : "shader_feature";
+#if UNITY_2019_1_OR_NEWER
+ if( m_isLocal )
+ staticSwitchType += "_local";
+#endif
+ return staticSwitchType;
+ }
+
+ void RegisterPragmas( ref MasterNodeDataCollector dataCollector )
+ {
+ if( CurrentVarMode == StaticSwitchVariableMode.Create )
+ {
+ string staticSwitchType = GetStaticSwitchType();
+ if( m_keywordModeType == KeywordModeType.KeywordEnum )
+ {
+ if( m_multiCompile == 1 )
+ dataCollector.AddToPragmas( UniqueId, staticSwitchType + " " + GetKeywordEnumPragmaList() );
+ else if( m_multiCompile == 0 )
+ dataCollector.AddToPragmas( UniqueId, staticSwitchType + " " + GetKeywordEnumPragmaList() );
+ }
+ else
+ {
+ if( m_multiCompile == 1 )
+ dataCollector.AddToPragmas( UniqueId, staticSwitchType + " __ " + PropertyName + OnOffStr );
+ else if( m_multiCompile == 0 )
+ dataCollector.AddToPragmas( UniqueId, staticSwitchType + " " + PropertyName + OnOffStr );
+ }
+ }
+ }
+
+ protected override void RegisterProperty( ref MasterNodeDataCollector dataCollector )
+ {
+ if( m_staticSwitchVarMode == StaticSwitchVariableMode.Reference && m_reference != null )
+ {
+ m_reference.RegisterProperty( ref dataCollector );
+ m_reference.RegisterPragmas( ref dataCollector );
+ }
+ else
+ {
+ if( m_createToggle )
+ base.RegisterProperty( ref dataCollector );
+
+ RegisterPragmas( ref dataCollector );
+ }
+ }
+
+ 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 );
+
+ base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar );
+
+ StaticSwitch node = ( m_staticSwitchVarMode == StaticSwitchVariableMode.Reference && m_reference != null ) ? m_reference : this;
+
+ this.OrderIndex = node.RawOrderIndex;
+ this.OrderIndexOffset = node.OrderIndexOffset;
+ //if( m_keywordModeType == KeywordModeType.KeywordEnum )
+
+ //node.RegisterPragmas( ref dataCollector );
+
+ string outType = UIUtils.PrecisionWirePortToCgType( CurrentPrecisionType, m_outputPorts[ 0 ].DataType );
+
+ if( node.KeywordModeTypeValue == KeywordModeType.KeywordEnum )
+ {
+ string defaultKey = "\t" + outType + " staticSwitch" + OutputId + " = " + m_inputPorts[ node.DefaultValue ].GeneratePortInstructions( ref dataCollector ) + ";";
+
+ string[] allOutputs = new string[ node.KeywordEnumAmount ];
+ for( int i = 0; i < node.KeywordEnumAmount; i++ )
+ allOutputs[ i ] = m_inputPorts[ i ].GeneratePortInstructions( ref dataCollector );
+
+ for( int i = 0; i < node.KeywordEnumAmount; i++ )
+ {
+ string keyword = node.KeywordEnum( i );
+ if( i == 0 )
+ dataCollector.AddLocalVariable( UniqueId, "#if defined(" + keyword + ")", true );
+ else
+ dataCollector.AddLocalVariable( UniqueId, "#elif defined(" + keyword + ")", true );
+
+ if( node.DefaultValue == i )
+ dataCollector.AddLocalVariable( UniqueId, defaultKey, true );
+ else
+ dataCollector.AddLocalVariable( UniqueId, "\t" + outType + " staticSwitch" + OutputId + " = " + allOutputs[ i ] + ";", true );
+ }
+ dataCollector.AddLocalVariable( UniqueId, "#else", true );
+ dataCollector.AddLocalVariable( UniqueId, defaultKey, true );
+ dataCollector.AddLocalVariable( UniqueId, "#endif", true );
+ }
+ else
+ {
+ string falseCode = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector );
+ string trueCode = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector );
+
+ if( node.CurrentVarMode == StaticSwitchVariableMode.Fetch )
+ dataCollector.AddLocalVariable( UniqueId, "#ifdef " + node.CurrentKeyword, true );
+ else
+ dataCollector.AddLocalVariable( UniqueId, "#ifdef " + node.PropertyName + OnOffStr, true );
+ dataCollector.AddLocalVariable( UniqueId, "\t" + outType + " staticSwitch" + OutputId + " = " + trueCode + ";", true );
+ dataCollector.AddLocalVariable( UniqueId, "#else", true );
+ dataCollector.AddLocalVariable( UniqueId, "\t" + outType + " staticSwitch" + OutputId + " = " + falseCode + ";", true );
+ dataCollector.AddLocalVariable( UniqueId, "#endif", true );
+ }
+
+ m_outputPorts[ 0 ].SetLocalValue( "staticSwitch" + OutputId, dataCollector.PortCategory );
+ return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory );
+ }
+
+ public override void DrawTitle( Rect titlePos )
+ {
+ bool referenceMode = m_staticSwitchVarMode == StaticSwitchVariableMode.Reference && m_reference != null;
+ string subTitle = string.Empty;
+ string subTitleFormat = string.Empty;
+ if( referenceMode )
+ {
+ subTitle = m_reference.GetPropertyValStr();
+ subTitleFormat = Constants.SubTitleRefNameFormatStr;
+ }
+ else
+ {
+ subTitle = GetPropertyValStr();
+ subTitleFormat = Constants.SubTitleVarNameFormatStr;
+ }
+
+ SetAdditonalTitleTextOnCallback( subTitle, ( instance, newSubTitle ) => instance.AdditonalTitleContent.text = string.Format( subTitleFormat, newSubTitle ) );
+
+ if( !m_isEditing && ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD3 )
+ {
+ GUI.Label( titlePos, StaticSwitchStr, UIUtils.GetCustomStyle( CustomStyle.NodeTitle ) );
+ }
+ }
+
+ public override void UpdateMaterial( Material mat )
+ {
+ base.UpdateMaterial( mat );
+ if( UIUtils.IsProperty( m_currentParameterType ) && !InsideShaderFunction )
+ {
+ if( m_keywordModeType == KeywordModeType.KeywordEnum )
+ {
+ for( int i = 0; i < m_keywordEnumAmount; i++ )
+ {
+ string key = KeywordEnum( i );
+ mat.DisableKeyword( key );
+ }
+ mat.EnableKeyword( KeywordEnum( m_materialValue ));
+ mat.SetFloat( m_propertyName, m_materialValue );
+ }
+ else
+ {
+ int final = m_materialValue;
+ if( m_keywordModeType == KeywordModeType.ToggleOff )
+ final = final == 1 ? 0 : 1;
+ mat.SetFloat( m_propertyName, m_materialValue );
+ if( final == 1 )
+ mat.EnableKeyword( GetPropertyValStr() );
+ else
+ mat.DisableKeyword( GetPropertyValStr() );
+ }
+ }
+ }
+
+ public override void SetMaterialMode( Material mat, bool fetchMaterialValues )
+ {
+ base.SetMaterialMode( mat, fetchMaterialValues );
+ if( fetchMaterialValues && m_materialMode && UIUtils.IsProperty( m_currentParameterType ) && mat.HasProperty( m_propertyName ) )
+ {
+ m_materialValue = mat.GetInt( m_propertyName );
+ }
+ }
+
+ public override void ForceUpdateFromMaterial( Material material )
+ {
+ if( UIUtils.IsProperty( m_currentParameterType ) && material.HasProperty( m_propertyName ) )
+ {
+ m_materialValue = material.GetInt( m_propertyName );
+ PreviewIsDirty = true;
+ }
+ }
+
+ public override void ReadFromString( ref string[] nodeParams )
+ {
+ base.ReadFromString( ref nodeParams );
+ m_multiCompile = Convert.ToInt32( GetCurrentParam( ref nodeParams ) );
+ if( UIUtils.CurrentShaderVersion() > 14403 )
+ {
+ m_defaultValue = Convert.ToInt32( GetCurrentParam( ref nodeParams ) );
+ if( UIUtils.CurrentShaderVersion() > 14101 )
+ {
+ m_materialValue = Convert.ToInt32( GetCurrentParam( ref nodeParams ) );
+ }
+ }
+ else
+ {
+ m_defaultValue = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ) ? 1 : 0;
+ if( UIUtils.CurrentShaderVersion() > 14101 )
+ {
+ m_materialValue = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ) ? 1 : 0;
+ }
+ }
+
+ if( UIUtils.CurrentShaderVersion() > 13104 )
+ {
+ m_createToggle = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) );
+ m_currentKeyword = GetCurrentParam( ref nodeParams );
+ m_currentKeywordId = UIUtils.GetKeywordId( m_currentKeyword );
+ }
+ if( UIUtils.CurrentShaderVersion() > 14001 )
+ {
+ m_keywordModeType = (KeywordModeType)Enum.Parse( typeof( KeywordModeType ), GetCurrentParam( ref nodeParams ) );
+ }
+
+ if( UIUtils.CurrentShaderVersion() > 14403 )
+ {
+ KeywordEnumAmount = Convert.ToInt32( GetCurrentParam( ref nodeParams ) );
+ for( int i = 0; i < KeywordEnumAmount; i++ )
+ {
+ m_defaultKeywordNames[ i ] = GetCurrentParam( ref nodeParams );
+ }
+
+ UpdateLabels();
+ }
+
+ if( UIUtils.CurrentShaderVersion() > 16304 )
+ {
+ string currentVarMode = GetCurrentParam( ref nodeParams );
+ CurrentVarMode = (StaticSwitchVariableMode)Enum.Parse( typeof( StaticSwitchVariableMode ), currentVarMode );
+ if( CurrentVarMode == StaticSwitchVariableMode.Reference )
+ {
+ m_referenceNodeId = Convert.ToInt32( GetCurrentParam( ref nodeParams ) );
+ }
+ }
+ else
+ {
+ CurrentVarMode = (StaticSwitchVariableMode)m_variableMode;
+ }
+
+ if( CurrentVarMode == StaticSwitchVariableMode.Reference )
+ {
+ UIUtils.UnregisterPropertyNode( this );
+ }
+ else
+ {
+ if( m_createToggle )
+ UIUtils.RegisterPropertyNode( this );
+ else
+ UIUtils.UnregisterPropertyNode( this );
+ }
+
+ if( UIUtils.CurrentShaderVersion() > 16700 )
+ {
+ m_isLocal = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) );
+ }
+
+ SetMaterialToggleRetrocompatibility();
+
+ if( !m_isNodeBeingCopied && CurrentVarMode != StaticSwitchVariableMode.Reference )
+ {
+ ContainerGraph.StaticSwitchNodes.UpdateDataOnNode( UniqueId, DataToArray );
+ }
+ }
+
+ void SetMaterialToggleRetrocompatibility()
+ {
+ if( UIUtils.CurrentShaderVersion() < 17108 )
+ {
+ if( !m_createToggle && m_staticSwitchVarMode == StaticSwitchVariableMode.Create )
+ {
+ if( m_keywordModeType != KeywordModeType.KeywordEnum )
+ {
+ m_propertyName = m_propertyName.ToUpper() + "_ON";
+ }
+ else
+ {
+ m_propertyName = m_propertyName.ToUpper();
+ for( int i = 0; i < m_keywordEnumList.Length; i++ )
+ {
+ m_keywordEnumList[ i ] = "_" + m_keywordEnumList[ i ].ToUpper();
+ }
+ }
+ m_autoGlobalName = false;
+ }
+ }
+ }
+
+ public override void ReadFromDeprecated( ref string[] nodeParams, Type oldType = null )
+ {
+ base.ReadFromDeprecated( ref nodeParams, oldType );
+ {
+ m_currentKeyword = GetCurrentParam( ref nodeParams );
+ m_currentKeywordId = UIUtils.GetKeywordId( m_currentKeyword );
+ m_createToggle = false;
+ m_keywordModeType = KeywordModeType.Toggle;
+ m_variableMode = VariableMode.Fetch;
+ CurrentVarMode = StaticSwitchVariableMode.Fetch;
+ }
+ }
+
+ public override void WriteToString( ref string nodeInfo, ref string connectionsInfo )
+ {
+ base.WriteToString( ref nodeInfo, ref connectionsInfo );
+ IOUtils.AddFieldValueToString( ref nodeInfo, m_multiCompile );
+ IOUtils.AddFieldValueToString( ref nodeInfo, m_defaultValue );
+ IOUtils.AddFieldValueToString( ref nodeInfo, m_materialValue );
+ IOUtils.AddFieldValueToString( ref nodeInfo, m_createToggle );
+ IOUtils.AddFieldValueToString( ref nodeInfo, m_currentKeyword );
+ IOUtils.AddFieldValueToString( ref nodeInfo, m_keywordModeType );
+ IOUtils.AddFieldValueToString( ref nodeInfo, KeywordEnumAmount );
+ for( int i = 0; i < KeywordEnumAmount; i++ )
+ {
+ IOUtils.AddFieldValueToString( ref nodeInfo, m_keywordEnumList[ i ] );
+ }
+
+ IOUtils.AddFieldValueToString( ref nodeInfo, CurrentVarMode );
+ if( CurrentVarMode == StaticSwitchVariableMode.Reference )
+ {
+ int referenceId = ( m_reference != null ) ? m_reference.UniqueId : -1;
+ IOUtils.AddFieldValueToString( ref nodeInfo, referenceId );
+ }
+ IOUtils.AddFieldValueToString( ref nodeInfo, m_isLocal );
+ }
+
+ public override void RefreshExternalReferences()
+ {
+ base.RefreshExternalReferences();
+ CheckReferenceValues( true );
+ }
+
+ StaticSwitchVariableMode CurrentVarMode
+ {
+ get { return m_staticSwitchVarMode; }
+ set
+ {
+ if( m_staticSwitchVarMode != value )
+ {
+ if( value == StaticSwitchVariableMode.Reference )
+ {
+ ContainerGraph.StaticSwitchNodes.RemoveNode( this );
+ m_referenceArrayId = -1;
+ m_referenceNodeId = -1;
+ m_reference = null;
+ m_headerColorModifier = ReferenceHeaderColor;
+ }
+ else
+ {
+ m_headerColorModifier = Color.white;
+ ContainerGraph.StaticSwitchNodes.AddNode( this );
+ UpdateLabels();
+ }
+ }
+ m_staticSwitchVarMode = value;
+ }
+ }
+ public bool IsStaticSwitchDirty { get { return m_isStaticSwitchDirty; } }
+ public KeywordModeType KeywordModeTypeValue { get { return m_keywordModeType; } }
+ public int DefaultValue { get { return m_defaultValue; } }
+ public int MaterialValue { get { return m_materialValue; } }
+ public string CurrentKeyword { get { return m_currentKeyword; } }
+ public bool CreateToggle { get { return m_createToggle; } }
+
+ public int KeywordEnumAmount
+ {
+ get
+ {
+ return m_keywordEnumAmount;
+ }
+ set
+ {
+ m_keywordEnumAmount = value;
+ m_defaultValue = Mathf.Clamp( m_defaultValue, 0, m_keywordEnumAmount - 1 );
+ m_materialValue = Mathf.Clamp( m_defaultValue, 0, m_keywordEnumAmount - 1 );
+ }
+ }
+ }
+}