summaryrefslogtreecommitdiff
path: root/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateOptionsUIHelper.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateOptionsUIHelper.cs')
-rw-r--r--Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateOptionsUIHelper.cs862
1 files changed, 862 insertions, 0 deletions
diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateOptionsUIHelper.cs b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateOptionsUIHelper.cs
new file mode 100644
index 00000000..06d346b3
--- /dev/null
+++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateOptionsUIHelper.cs
@@ -0,0 +1,862 @@
+// Amplify Shader Editor - Visual Shader Editing Tool
+// Copyright (c) Amplify Creations, Lda <info@amplify.pt>
+
+using UnityEngine;
+using UnityEditor;
+using System;
+using System.Collections.Generic;
+
+namespace AmplifyShaderEditor
+{
+ [Serializable]
+ public class TemplateOptionsUIHelper
+ {
+ private const string CustomOptionsLabel = " Custom Options";
+
+ private bool m_isSubShader = false;
+
+ [SerializeField]
+ private bool m_passCustomOptionsFoldout = true;
+
+ [SerializeField]
+ private string m_passCustomOptionsLabel = CustomOptionsLabel;
+
+ [SerializeField]
+ private int m_passCustomOptionsSizeCheck = 0;
+
+ [SerializeField]
+ private List<TemplateOptionUIItem> m_passCustomOptionsUI = new List<TemplateOptionUIItem>();
+
+ [NonSerialized]
+ private Dictionary<string, TemplateOptionUIItem> m_passCustomOptionsUIDict = new Dictionary<string, TemplateOptionUIItem>();
+
+ [NonSerialized]
+ private TemplateMultiPassMasterNode m_owner;
+
+ [NonSerialized]
+ private string[] m_readOptionNames;
+
+ [NonSerialized]
+ private string[] m_readOptionSelections;
+
+ [SerializeField]
+ private List<TemplateOptionPortItem> m_passCustomOptionsPorts = new List<TemplateOptionPortItem>();
+
+ public TemplateOptionsUIHelper( bool isSubShader )
+ {
+ m_isSubShader = isSubShader;
+ }
+
+ public void CopyOptionsValuesFrom( TemplateOptionsUIHelper origin )
+ {
+ for( int i = 0; i < origin.PassCustomOptionsUI.Count; i++ )
+ {
+ m_passCustomOptionsUI[ i ].CopyValuesFrom( origin.PassCustomOptionsUI[ i ] );
+ }
+ }
+
+ public void Destroy()
+ {
+ for( int i = 0; i < m_passCustomOptionsUI.Count; i++ )
+ {
+ m_passCustomOptionsUI[ i ].Destroy();
+ }
+
+ m_passCustomOptionsUI.Clear();
+ m_passCustomOptionsUI = null;
+
+ m_passCustomOptionsUIDict.Clear();
+ m_passCustomOptionsUIDict = null;
+
+ m_passCustomOptionsPorts.Clear();
+ m_passCustomOptionsPorts = null;
+ }
+
+ public void DrawCustomOptions( TemplateMultiPassMasterNode owner )
+ {
+ m_owner = owner;
+
+ if( m_passCustomOptionsUI.Count > 0 )
+ {
+ NodeUtils.DrawNestedPropertyGroup( ref m_passCustomOptionsFoldout, m_passCustomOptionsLabel, DrawCustomOptionsBlock );
+ }
+ }
+
+ public void DrawCustomOptionsBlock()
+ {
+ float currWidth = EditorGUIUtility.labelWidth;
+#if UNITY_2019_3_OR_NEWER
+ float size = Mathf.Max( UIUtils.CurrentWindow.ParametersWindow.TransformedArea.width * 0.385f, 0 );
+#else
+ float size = Mathf.Max( UIUtils.CurrentWindow.ParametersWindow.TransformedArea.width * 0.34f, 0 );
+#endif
+ EditorGUIUtility.labelWidth = size;
+ for( int i = 0; i < m_passCustomOptionsUI.Count; i++ )
+ {
+ m_passCustomOptionsUI[ i ].Draw( m_owner );
+ }
+ EditorGUILayout.Space();
+ EditorGUIUtility.labelWidth = currWidth;
+ }
+
+ public void OnCustomOptionSelected( bool isRefreshing, bool invertAction, TemplateMultiPassMasterNode owner, TemplateOptionUIItem uiItem, params TemplateActionItem[] validActions )
+ {
+ uiItem.CheckOnExecute = false;
+ for( int i = 0; i < validActions.Length; i++ )
+ {
+ AseOptionsActionType actionType = validActions[ i ].ActionType;
+ if( invertAction )
+ {
+ if( !TemplateOptionsToolsHelper.InvertAction( validActions[ i ].ActionType, ref actionType ) )
+ {
+ continue;
+ }
+ }
+
+ switch( actionType )
+ {
+ case AseOptionsActionType.ShowOption:
+ {
+ TemplateOptionUIItem item = m_passCustomOptionsUI.Find( x => ( x.Options.Name.Equals( validActions[ i ].ActionData ) ) );
+ if( item != null )
+ {
+ if( isRefreshing )
+ {
+ string optionId = validActions[ i ].PassName + validActions[ i ].ActionData + "Option";
+ owner.ContainerGraph.ParentWindow.TemplatesManagerInstance.SetOptionsValue( optionId, true );
+ }
+
+ // this prevents options from showing up when loading by checking if they were hidden by another option
+ // it works on the assumption that an option that may possible hide this one is checked first
+ if( !isRefreshing )
+ item.IsVisible = true;
+ else if( item.WasVisible )
+ item.IsVisible = true;
+
+ if( !invertAction && validActions[ i ].ActionDataIdx > -1 )
+ item.CurrentOption = validActions[ i ].ActionDataIdx;
+
+ item.CheckEnDisable();
+ }
+ else
+ {
+ Debug.LogFormat( "Could not find Option {0} for action {1}", validActions[ i ].ActionData, validActions[ i ].ActionType );
+ }
+ }
+ break;
+ case AseOptionsActionType.HideOption:
+ {
+ TemplateOptionUIItem item = m_passCustomOptionsUI.Find( x => ( x.Options.Name.Equals( validActions[ i ].ActionData ) ) );
+ if( item != null )
+ {
+ bool flag = false;
+ if( isRefreshing )
+ {
+ string optionId = validActions[ i ].PassName + validActions[ i ].ActionData + "Option";
+ flag = owner.ContainerGraph.ParentWindow.TemplatesManagerInstance.SetOptionsValue( optionId, false );
+ }
+
+ item.IsVisible = false || flag;
+ if( !invertAction && validActions[ i ].ActionDataIdx > -1 )
+ item.CurrentOption = validActions[ i ].ActionDataIdx;
+
+ item.CheckEnDisable();
+ }
+ else
+ {
+ Debug.LogFormat( "Could not find Option {0} for action {1}", validActions[ i ].ActionData, validActions[ i ].ActionType );
+ }
+ }
+ break;
+ case AseOptionsActionType.SetOption:
+ {
+ if( !uiItem.IsVisible )
+ break;
+
+ TemplateOptionUIItem item = m_passCustomOptionsUI.Find( x => ( x.Options.Name.Equals( validActions[ i ].ActionData ) ) );
+ if( item != null )
+ {
+ item.CurrentOption = validActions[ i ].ActionDataIdx;
+ item.Refresh();
+ }
+ else
+ {
+ Debug.LogFormat( "Could not find Option {0} for action {1}", validActions[ i ].ActionData, validActions[ i ].ActionType );
+ }
+ }
+ break;
+ case AseOptionsActionType.HidePort:
+ {
+ TemplateMultiPassMasterNode passMasterNode = owner;
+ if( !string.IsNullOrEmpty( validActions[ i ].PassName ) )
+ {
+ passMasterNode = owner.ContainerGraph.GetMasterNodeOfPass( validActions[ i ].PassName,owner.LODIndex );
+ }
+
+ if( passMasterNode != null )
+ {
+ InputPort port = validActions[ i ].ActionDataIdx > -1 ?
+ passMasterNode.GetInputPortByUniqueId( validActions[ i ].ActionDataIdx ) :
+ passMasterNode.InputPorts.Find( x => x.Name.Equals( validActions[ i ].ActionData ) );
+ if( port != null )
+ {
+ if( isRefreshing )
+ {
+ string optionId = validActions[ i ].PassName + port.Name;
+ owner.ContainerGraph.ParentWindow.TemplatesManagerInstance.SetOptionsValue( optionId, port.IsConnected );
+ port.Visible = port.IsConnected;
+ }
+ else
+ {
+ port.Visible = false;
+ }
+ passMasterNode.SizeIsDirty = true;
+ }
+ else
+ {
+ Debug.LogFormat( "Could not find port {0},{1} for action {2}", validActions[ i ].ActionDataIdx, validActions[ i ].ActionData, validActions[ i ].ActionType );
+ }
+ }
+ else
+ {
+ Debug.LogFormat( "Could not find pass {0} for action {1} on {2}", validActions[ i ].PassName, validActions[ i ].ActionType, validActions[ i ].ActionData );
+ }
+ }
+ break;
+ case AseOptionsActionType.ShowPort:
+ {
+ if( !uiItem.IsVisible )
+ break;
+
+ TemplateMultiPassMasterNode passMasterNode = owner;
+ if( !string.IsNullOrEmpty( validActions[ i ].PassName ) )
+ {
+ passMasterNode = owner.ContainerGraph.GetMasterNodeOfPass( validActions[ i ].PassName, owner.LODIndex );
+ }
+
+ if( passMasterNode != null )
+ {
+ InputPort port = validActions[ i ].ActionDataIdx > -1 ?
+ passMasterNode.GetInputPortByUniqueId( validActions[ i ].ActionDataIdx ) :
+ passMasterNode.InputPorts.Find( x => x.Name.Equals( validActions[ i ].ActionData ) );
+ if( port != null )
+ {
+ if( isRefreshing )
+ {
+ string optionId = validActions[ i ].PassName + port.Name;
+ owner.ContainerGraph.ParentWindow.TemplatesManagerInstance.SetOptionsValue( optionId, true );
+ }
+
+ port.Visible = true;
+ passMasterNode.SizeIsDirty = true;
+ }
+ else
+ {
+ Debug.LogFormat( "Could not find port {0},{1} for action {2}", validActions[ i ].ActionDataIdx, validActions[ i ].ActionData, validActions[ i ].ActionType );
+ }
+ }
+ else
+ {
+ Debug.LogFormat( "Could not find pass {0} for action {1} on {2}", validActions[ i ].PassName, validActions[ i ].ActionType, validActions[ i ].ActionData );
+ }
+ }
+ break;
+ case AseOptionsActionType.SetPortName:
+ {
+ if( !uiItem.IsVisible )
+ break;
+
+ TemplateMultiPassMasterNode passMasterNode = owner;
+ if( !string.IsNullOrEmpty( validActions[ i ].PassName ) )
+ {
+ passMasterNode = owner.ContainerGraph.GetMasterNodeOfPass( validActions[ i ].PassName, owner.LODIndex );
+ }
+
+ if( passMasterNode != null )
+ {
+ InputPort port = passMasterNode.GetInputPortByUniqueId( validActions[ i ].ActionDataIdx );
+ if( port != null )
+ {
+ port.Name = validActions[ i ].ActionData;
+ passMasterNode.SizeIsDirty = true;
+ }
+ else
+ {
+ Debug.LogFormat( "Could not find port {0},{1} for action {2}", validActions[ i ].ActionDataIdx, validActions[ i ].ActionData, validActions[ i ].ActionType );
+ }
+ }
+ else
+ {
+ Debug.LogFormat( "Could not find pass {0} for action {1} on {2}", validActions[ i ].PassName, validActions[ i ].ActionType, validActions[ i ].ActionData );
+ }
+ }
+ break;
+ case AseOptionsActionType.SetDefine:
+ {
+ if( !uiItem.IsVisible )
+ {
+ uiItem.CheckOnExecute = true;
+ break;
+ }
+
+ //Debug.Log( "DEFINE " + validActions[ i ].ActionData );
+ if( validActions[ i ].AllPasses )
+ {
+ string actionData = validActions[ i ].ActionData;
+ string defineValue = string.Empty;
+ if( actionData.StartsWith( "pragma" ) )
+ {
+ defineValue = "#" + actionData;
+ }
+ else
+ {
+ defineValue = "#define " + validActions[ i ].ActionData;
+ }
+ if( isRefreshing )
+ {
+ owner.ContainerGraph.ParentWindow.TemplatesManagerInstance.SetOptionsValue( defineValue, true );
+ }
+ List<TemplateMultiPassMasterNode> nodes = owner.ContainerGraph.GetMultiPassMasterNodes( owner.LODIndex );
+ int count = nodes.Count;
+ for( int nodeIdx = 0; nodeIdx < count; nodeIdx++ )
+ {
+ nodes[ nodeIdx ].OptionsDefineContainer.AddDefine( defineValue, false );
+ }
+ }
+ else if( !string.IsNullOrEmpty( validActions[ i ].PassName ) )
+ {
+ TemplateMultiPassMasterNode passMasterNode = owner.ContainerGraph.GetMasterNodeOfPass( validActions[ i ].PassName, owner.LODIndex );
+ if( passMasterNode != null )
+ {
+ string actionData = validActions[ i ].ActionData;
+ string defineValue = string.Empty;
+ if( actionData.StartsWith( "pragma" ) )
+ {
+ defineValue = "#" + actionData;
+ }
+ else
+ {
+ defineValue = "#define " + validActions[ i ].ActionData;
+ }
+ if( isRefreshing )
+ {
+ string optionsId = validActions[ i ].PassName + defineValue;
+ owner.ContainerGraph.ParentWindow.TemplatesManagerInstance.SetOptionsValue( optionsId, true );
+ }
+ passMasterNode.OptionsDefineContainer.AddDefine( defineValue, false );
+ }
+ else
+ {
+ Debug.LogFormat( "Could not find pass {0} for action {1} on {2}", validActions[ i ].PassName, validActions[ i ].ActionType, validActions[ i ].ActionData );
+ }
+ }
+ else
+ {
+ uiItem.CheckOnExecute = true;
+ }
+ }
+ break;
+ case AseOptionsActionType.RemoveDefine:
+ {
+ //Debug.Log( "UNDEFINE " + validActions[ i ].ActionData );
+ if( validActions[ i ].AllPasses )
+ {
+ string actionData = validActions[ i ].ActionData;
+ string defineValue = string.Empty;
+ if( actionData.StartsWith( "pragma" ) )
+ {
+ defineValue = "#" + actionData;
+ }
+ else
+ {
+ defineValue = "#define " + validActions[ i ].ActionData;
+ }
+
+ bool flag = false;
+ if( isRefreshing )
+ {
+ flag = owner.ContainerGraph.ParentWindow.TemplatesManagerInstance.SetOptionsValue( defineValue, false );
+ }
+
+ if( !flag )
+ {
+ List<TemplateMultiPassMasterNode> nodes = owner.ContainerGraph.GetMultiPassMasterNodes( owner.LODIndex );
+ int count = nodes.Count;
+ for( int nodeIdx = 0; nodeIdx < count; nodeIdx++ )
+ {
+ nodes[ nodeIdx ].OptionsDefineContainer.RemoveDefine( defineValue );
+ }
+ }
+ }
+ else if( !string.IsNullOrEmpty( validActions[ i ].PassName ) )
+ {
+ TemplateMultiPassMasterNode passMasterNode = owner.ContainerGraph.GetMasterNodeOfPass( validActions[ i ].PassName, owner.LODIndex );
+ if( passMasterNode != null )
+ {
+ string actionData = validActions[ i ].ActionData;
+ string defineValue = string.Empty;
+ if( actionData.StartsWith( "pragma" ) )
+ {
+ defineValue = "#" + actionData;
+ }
+ else
+ {
+ defineValue = "#define " + validActions[ i ].ActionData;
+ }
+ bool flag = false;
+ if( isRefreshing )
+ {
+ string optionId = validActions[ i ].PassName + defineValue;
+ flag = owner.ContainerGraph.ParentWindow.TemplatesManagerInstance.SetOptionsValue( optionId, false );
+ }
+ if( !flag )
+ {
+ passMasterNode.OptionsDefineContainer.RemoveDefine( defineValue );
+ }
+ }
+ else
+ {
+ Debug.LogFormat( "Could not find pass {0} for action {1} on {2}", validActions[ i ].PassName, validActions[ i ].ActionType, validActions[ i ].ActionData );
+ }
+ }
+ else
+ {
+ uiItem.CheckOnExecute = false;
+ }
+ }
+ break;
+ case AseOptionsActionType.SetUndefine:
+ {
+ if( !uiItem.IsVisible )
+ {
+ uiItem.CheckOnExecute = true;
+ break;
+ }
+
+ if( validActions[ i ].AllPasses )
+ {
+ string defineValue = "#undef " + validActions[ i ].ActionData;
+ if( isRefreshing )
+ {
+ owner.ContainerGraph.ParentWindow.TemplatesManagerInstance.SetOptionsValue( defineValue, true );
+ }
+ List<TemplateMultiPassMasterNode> nodes = owner.ContainerGraph.GetMultiPassMasterNodes(owner.LODIndex);
+ int count = nodes.Count;
+ for( int nodeIdx = 0; nodeIdx < count; nodeIdx++ )
+ {
+ nodes[ nodeIdx ].OptionsDefineContainer.AddDefine( defineValue, false );
+ }
+ }
+ else if( !string.IsNullOrEmpty( validActions[ i ].PassName ) )
+ {
+ TemplateMultiPassMasterNode passMasterNode = owner.ContainerGraph.GetMasterNodeOfPass( validActions[ i ].PassName, owner.LODIndex );
+ if( passMasterNode != null )
+ {
+ string defineValue = "#undef " + validActions[ i ].ActionData;
+ if( isRefreshing )
+ {
+ string optionsId = validActions[ i ].PassName + defineValue;
+ owner.ContainerGraph.ParentWindow.TemplatesManagerInstance.SetOptionsValue( optionsId, true );
+ }
+ passMasterNode.OptionsDefineContainer.AddDefine( defineValue, false );
+ }
+ else
+ {
+ Debug.LogFormat( "Could not find pass {0} for action {1} on {2}", validActions[ i ].PassName, validActions[ i ].ActionType, validActions[ i ].ActionData );
+ }
+ }
+ else
+ {
+ uiItem.CheckOnExecute = true;
+ }
+ }
+ break;
+ case AseOptionsActionType.RemoveUndefine:
+ {
+ if( validActions[ i ].AllPasses )
+ {
+ string defineValue = "#undef " + validActions[ i ].ActionData;
+ bool flag = false;
+ if( isRefreshing )
+ {
+ flag = owner.ContainerGraph.ParentWindow.TemplatesManagerInstance.SetOptionsValue( defineValue, false );
+ }
+
+ if( !flag )
+ {
+ List<TemplateMultiPassMasterNode> nodes = owner.ContainerGraph.GetMultiPassMasterNodes( owner.LODIndex );
+ int count = nodes.Count;
+ for( int nodeIdx = 0; nodeIdx < count; nodeIdx++ )
+ {
+ nodes[ nodeIdx ].OptionsDefineContainer.RemoveDefine( defineValue );
+ }
+ }
+ }
+ else if( !string.IsNullOrEmpty( validActions[ i ].PassName ) )
+ {
+ TemplateMultiPassMasterNode passMasterNode = owner.ContainerGraph.GetMasterNodeOfPass( validActions[ i ].PassName, owner.LODIndex );
+ if( passMasterNode != null )
+ {
+ bool flag = false;
+ string defineValue = "#undef " + validActions[ i ].ActionData;
+ if( isRefreshing )
+ {
+ string optionId = validActions[ i ].PassName + defineValue;
+ flag = owner.ContainerGraph.ParentWindow.TemplatesManagerInstance.SetOptionsValue( optionId, false );
+ }
+
+ if( !flag )
+ {
+ passMasterNode.OptionsDefineContainer.RemoveDefine( defineValue );
+ }
+ }
+ else
+ {
+ Debug.LogFormat( "Could not find pass {0} for action {1} on {2}", validActions[ i ].PassName, validActions[ i ].ActionType, validActions[ i ].ActionData );
+ }
+ }
+ else
+ {
+ uiItem.CheckOnExecute = false;
+ }
+ }
+ break;
+ case AseOptionsActionType.ExcludePass:
+ {
+ string optionId = validActions[ i ].ActionData + "Pass";
+ bool flag = isRefreshing ? owner.ContainerGraph.ParentWindow.TemplatesManagerInstance.SetOptionsValue( optionId, false ) : false;
+ if( !flag )
+ owner.SetPassVisible( validActions[ i ].ActionData, false );
+ }
+ break;
+ case AseOptionsActionType.IncludePass:
+ {
+ if( !uiItem.IsVisible )
+ break;
+
+ string optionId = validActions[ i ].ActionData + "Pass";
+ owner.ContainerGraph.ParentWindow.TemplatesManagerInstance.SetOptionsValue( optionId, true );
+ owner.SetPassVisible( validActions[ i ].ActionData, true );
+ }
+ break;
+ case AseOptionsActionType.SetPropertyOnPass:
+ {
+ //Debug.Log( "PASSPROP " + validActions[ i ].ActionData );
+ //Refresh happens on hotcode reload and shader load and in those situation
+ // The property own serialization handles its setup
+ if( isRefreshing )
+ continue;
+
+ if( !string.IsNullOrEmpty( validActions[ i ].PassName ) )
+ {
+ TemplateMultiPassMasterNode passMasterNode = owner.ContainerGraph.GetMasterNodeOfPass( validActions[ i ].PassName, owner.LODIndex );
+ if( passMasterNode != null )
+ {
+ passMasterNode.SetPropertyActionFromItem( passMasterNode.PassModule, validActions[ i ] );
+ }
+ else
+ {
+ Debug.LogFormat( "Could not find pass {0} for action {1} on {2}", validActions[ i ].PassName, validActions[ i ].ActionType, validActions[ i ].ActionData );
+ }
+ }
+ else
+ {
+ owner.SetPropertyActionFromItem( owner.PassModule, validActions[ i ] );
+ }
+ }
+ break;
+ case AseOptionsActionType.SetPropertyOnSubShader:
+ {
+ //Refresh happens on hotcode reload and shader load and in those situation
+ // The property own serialization handles its setup
+ if( isRefreshing )
+ continue;
+
+ owner.SetPropertyActionFromItem( owner.SubShaderModule, validActions[ i ] );
+ }
+ break;
+ case AseOptionsActionType.SetShaderProperty:
+ {
+ //This action is only check when shader is compiled over
+ //the TemplateMultiPassMasterNode via the on CheckPropertyChangesOnOptions() method
+ }
+ break;
+ case AseOptionsActionType.SetMaterialProperty:
+ {
+ if( isRefreshing )
+ continue;
+
+ if( !uiItem.IsVisible )
+ break;
+
+ if( owner.ContainerGraph.CurrentMaterial != null )
+ {
+ string prop = validActions[ i ].ActionData;
+ if( owner.ContainerGraph.CurrentMaterial.HasProperty( prop ) )
+ {
+ if( uiItem.Options.UIWidget == AseOptionsUIWidget.Float || uiItem.Options.UIWidget == AseOptionsUIWidget.FloatRange )
+ owner.ContainerGraph.CurrentMaterial.SetFloat( prop, uiItem.CurrentFieldValue );
+ else
+ owner.ContainerGraph.CurrentMaterial.SetInt( prop, (int)uiItem.CurrentFieldValue );
+
+ if( ASEMaterialInspector.Instance != null )
+ ASEMaterialInspector.Instance.Repaint();
+ }
+ }
+ }
+ break;
+ }
+ }
+ }
+
+ public void SetupCustomOptionsFromTemplate( TemplateMultiPassMasterNode owner, bool newTemplate )
+ {
+ TemplateOptionsContainer customOptionsContainer = m_isSubShader ? owner.SubShader.CustomOptionsContainer : owner.Pass.CustomOptionsContainer;
+
+ if( !newTemplate && customOptionsContainer.Body.Length == m_passCustomOptionsSizeCheck )
+ {
+ for( int i = 0; i < m_passCustomOptionsUI.Count; i++ )
+ {
+ if( m_passCustomOptionsUI[ i ].EmptyEvent )
+ {
+ if( m_isSubShader )
+ {
+ m_passCustomOptionsUI[ i ].OnActionPerformedEvt += owner.OnCustomSubShaderOptionSelected;
+ }
+ else
+ {
+ m_passCustomOptionsUI[ i ].OnActionPerformedEvt += owner.OnCustomPassOptionSelected;
+ }
+ }
+ }
+ return;
+ }
+
+ m_passCustomOptionsLabel = string.IsNullOrEmpty( customOptionsContainer.Name ) ? CustomOptionsLabel : " " + customOptionsContainer.Name;
+
+ for( int i = 0; i < m_passCustomOptionsUI.Count; i++ )
+ {
+ m_passCustomOptionsUI[ i ].Destroy();
+ }
+
+ m_passCustomOptionsUI.Clear();
+ m_passCustomOptionsUIDict.Clear();
+ m_passCustomOptionsPorts.Clear();
+
+ if( customOptionsContainer.Enabled )
+ {
+ m_passCustomOptionsSizeCheck = customOptionsContainer.Body.Length;
+ for( int i = 0; i < customOptionsContainer.Options.Length; i++ )
+ {
+ switch( customOptionsContainer.Options[ i ].Type )
+ {
+ case AseOptionsType.Option:
+ {
+ TemplateOptionUIItem item = new TemplateOptionUIItem( customOptionsContainer.Options[ i ] );
+ if( m_isSubShader )
+ {
+ item.OnActionPerformedEvt += owner.OnCustomSubShaderOptionSelected;
+ }
+ else
+ {
+ item.OnActionPerformedEvt += owner.OnCustomPassOptionSelected;
+ }
+
+ m_passCustomOptionsUI.Add( item );
+ m_passCustomOptionsUIDict.Add( customOptionsContainer.Options[ i ].Id, item );
+ }
+ break;
+ case AseOptionsType.Port:
+ {
+ TemplateOptionPortItem item = new TemplateOptionPortItem( owner, customOptionsContainer.Options[ i ] );
+ m_passCustomOptionsPorts.Add( item );
+ //if( m_isSubShader )
+ //{
+ // if( string.IsNullOrEmpty( customOptionsContainer.Options[ i ].Id ) )
+ // {
+ // //No pass name selected. inject on all passes
+ // TemplateOptionPortItem item = new TemplateOptionPortItem( owner, customOptionsContainer.Options[ i ] );
+ // m_passCustomOptionsPorts.Add( item );
+ // }
+ // else if( customOptionsContainer.Options[ i ].Id.Equals( owner.PassName ) )
+ // {
+ // TemplateOptionPortItem item = new TemplateOptionPortItem( owner, customOptionsContainer.Options[ i ] );
+ // m_passCustomOptionsPorts.Add( item );
+ // }
+ //}
+ //else
+ //{
+ // TemplateOptionPortItem item = new TemplateOptionPortItem( owner, customOptionsContainer.Options[ i ] );
+ // m_passCustomOptionsPorts.Add( item );
+ //}
+ }
+ break;
+ case AseOptionsType.Field:
+ {
+ TemplateOptionUIItem item = new TemplateOptionUIItem( customOptionsContainer.Options[ i ] );
+ if( m_isSubShader )
+ {
+ item.OnActionPerformedEvt += owner.OnCustomSubShaderOptionSelected;
+ }
+ else
+ {
+ item.OnActionPerformedEvt += owner.OnCustomPassOptionSelected;
+ }
+
+ m_passCustomOptionsUI.Add( item );
+ m_passCustomOptionsUIDict.Add( customOptionsContainer.Options[ i ].Id, item );
+ }
+ break;
+ }
+ }
+ }
+ else
+ {
+ m_passCustomOptionsSizeCheck = 0;
+ }
+ }
+
+ public void SetCustomOptionsInfo( TemplateMultiPassMasterNode masterNode, ref MasterNodeDataCollector dataCollector )
+ {
+ if( masterNode == null )
+ return;
+
+ for( int i = 0; i < m_passCustomOptionsUI.Count; i++ )
+ {
+ m_passCustomOptionsUI[ i ].FillDataCollector( ref dataCollector );
+ }
+
+ for( int i = 0; i < m_passCustomOptionsPorts.Count; i++ )
+ {
+ m_passCustomOptionsPorts[ i ].FillDataCollector( masterNode, ref dataCollector );
+ }
+ }
+
+ public void CheckImediateActionsForPort( TemplateMultiPassMasterNode masterNode , int portId )
+ {
+ for( int i = 0; i < m_passCustomOptionsPorts.Count; i++ )
+ {
+ m_passCustomOptionsPorts[ i ].CheckImediateActionsForPort( masterNode, portId );
+ }
+ }
+
+ public void SetSubShaderCustomOptionsPortsInfo( TemplateMultiPassMasterNode masterNode, ref MasterNodeDataCollector dataCollector )
+ {
+ if( masterNode == null )
+ return;
+
+
+ //for( int i = 0; i < m_passCustomOptionsPorts.Count; i++ )
+ //{
+ // if( string.IsNullOrEmpty( m_passCustomOptionsPorts[ i ].Options.Id ) ||
+ // masterNode.PassUniqueName.Equals( m_passCustomOptionsPorts[ i ].Options.Id ) )
+ // {
+ // m_passCustomOptionsPorts[ i ].FillDataCollector( masterNode, ref dataCollector );
+ // }
+ //}
+
+ for( int i = 0; i < m_passCustomOptionsPorts.Count; i++ )
+ {
+ m_passCustomOptionsPorts[ i ].SubShaderFillDataCollector( masterNode, ref dataCollector );
+ }
+ }
+
+ public void RefreshCustomOptionsDict()
+ {
+ if( m_passCustomOptionsUIDict.Count != m_passCustomOptionsUI.Count )
+ {
+ m_passCustomOptionsUIDict.Clear();
+ int count = m_passCustomOptionsUI.Count;
+ for( int i = 0; i < count; i++ )
+ {
+ m_passCustomOptionsUIDict.Add( m_passCustomOptionsUI[ i ].Options.Id, m_passCustomOptionsUI[ i ] );
+ }
+ }
+ }
+
+ public void ReadFromString( ref uint index, ref string[] nodeParams )
+ {
+ RefreshCustomOptionsDict();
+ int savedOptions = Convert.ToInt32( nodeParams[ index++ ] );
+
+ m_readOptionNames = new string[ savedOptions ];
+ m_readOptionSelections = new string[ savedOptions ];
+
+ for( int i = 0; i < savedOptions; i++ )
+ {
+ string optionName = nodeParams[ index++ ];
+ string optionSelection = nodeParams[ index++ ];
+ m_readOptionNames[ i ] = optionName;
+ m_readOptionSelections[ i ] = optionSelection;
+
+ }
+ }
+
+ public void SetReadOptions()
+ {
+ if( m_readOptionNames != null && m_readOptionSelections != null )
+ {
+ for( int i = 0; i < m_readOptionNames.Length; i++ )
+ {
+ if( m_passCustomOptionsUIDict.ContainsKey( m_readOptionNames[ i ] ) )
+ {
+ if( m_passCustomOptionsUIDict[ m_readOptionNames[ i ] ].Options.Type == AseOptionsType.Field )
+ {
+ m_passCustomOptionsUIDict[ m_readOptionNames[ i ] ].FieldValue.ReadFromSingle( m_readOptionSelections[ i ] );
+ foreach( var item in m_passCustomOptionsUIDict[ m_readOptionNames[ i ] ].Options.ActionsPerOption.Rows )
+ {
+ if( item.Columns.Length>0 && item.Columns[ 0 ].ActionType == AseOptionsActionType.SetMaterialProperty )
+ {
+ if( UIUtils.CurrentWindow.CurrentGraph.CurrentMaterial != null )
+ {
+ if( UIUtils.CurrentWindow.CurrentGraph.CurrentMaterial.HasProperty( item.Columns[ 0 ].ActionData ) )
+ {
+ m_passCustomOptionsUIDict[ m_readOptionNames[ i ] ].CurrentFieldValue = UIUtils.CurrentWindow.CurrentGraph.CurrentMaterial.GetFloat( item.Columns[ 0 ].ActionData );
+ }
+ }
+ }
+ }
+ }
+ else
+ m_passCustomOptionsUIDict[ m_readOptionNames[ i ] ].CurrentOptionIdx = Convert.ToInt32( m_readOptionSelections[ i ] );
+ }
+ }
+ }
+ }
+
+ public void Refresh()
+ {
+ int count = m_passCustomOptionsUI.Count;
+ for( int i = 0; i < count; i++ )
+ {
+ m_passCustomOptionsUI[ i ].Refresh();
+ }
+ }
+
+ public void CheckDisable()
+ {
+ int count = m_passCustomOptionsUI.Count;
+ for( int i = 0; i < count; i++ )
+ {
+ m_passCustomOptionsUI[ i ].CheckEnDisable();
+ }
+ }
+
+ public void WriteToString( ref string nodeInfo )
+ {
+ int optionsCount = m_passCustomOptionsUI.Count;
+ IOUtils.AddFieldValueToString( ref nodeInfo, optionsCount );
+ for( int i = 0; i < optionsCount; i++ )
+ {
+ IOUtils.AddFieldValueToString( ref nodeInfo, m_passCustomOptionsUI[ i ].Options.Id );
+ if( m_passCustomOptionsUI[ i ].Options.Type == AseOptionsType.Field )
+ IOUtils.AddFieldValueToString( ref nodeInfo, m_passCustomOptionsUI[ i ].FieldValue.WriteToSingle() );
+ else
+ IOUtils.AddFieldValueToString( ref nodeInfo, m_passCustomOptionsUI[ i ].CurrentOption );
+ }
+ }
+
+ public List<TemplateOptionUIItem> PassCustomOptionsUI { get { return m_passCustomOptionsUI; } }
+
+ }
+}