Assignment for RMIT Mixed Reality in 2020
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.
 
 
 

862 lines
28 KiB

// 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; } }
}
}