diff options
Diffstat (limited to 'Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateOptionsUIHelper.cs')
-rw-r--r-- | Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateOptionsUIHelper.cs | 862 |
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; } } + + } +} |