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