// Amplify Shader Editor - Visual Shader Editing Tool // Copyright (c) Amplify Creations, Lda using System; using System.Collections.Generic; using UnityEngine; using UnityEditor; namespace AmplifyShaderEditor { // UI STRUCTURES [Serializable] public class TemplateOptionUIItem { public delegate void OnActionPerformed( bool isRefreshing, bool invertAction, TemplateOptionUIItem uiItem, params TemplateActionItem[] validActions ); public event OnActionPerformed OnActionPerformedEvt; [SerializeField] private bool m_isVisible = true; [SerializeField] private bool m_wasVisible = true; [SerializeField] private int m_currentOption = 0; [SerializeField] private TemplateOptionsItem m_options; [SerializeField] private bool m_checkOnExecute = false; [SerializeField] private bool m_invertActionOnDeselection = false; public TemplateOptionUIItem( TemplateOptionsItem options ) { m_options = options; if( m_options.Type == AseOptionsType.Field ) { m_options.FieldValue.FloatValue = m_options.DefaultFieldValue; } else { m_currentOption = m_options.DefaultOptionIndex; } m_invertActionOnDeselection = options.Setup == AseOptionItemSetup.InvertActionOnDeselection; } public void CopyValuesFrom( TemplateOptionUIItem origin ) { m_isVisible = origin.IsVisible; m_wasVisible = origin.WasVisible; m_currentOption = origin.CurrentOption; m_options.FieldValue.FloatValue = origin.CurrentFieldValue; m_checkOnExecute = origin.CheckOnExecute; m_invertActionOnDeselection = origin.InvertActionOnDeselection; } public void Draw( UndoParentNode owner ) { if( m_isVisible ) { int lastOption = m_currentOption; EditorGUI.BeginChangeCheck(); switch( m_options.UIWidget ) { case AseOptionsUIWidget.Dropdown: { m_currentOption = owner.EditorGUILayoutPopup( m_options.Name, m_currentOption, m_options.DisplayOptions ); } break; case AseOptionsUIWidget.Toggle: { m_currentOption = owner.EditorGUILayoutToggle( m_options.Name, m_currentOption == 1 ) ? 1 : 0; } break; case AseOptionsUIWidget.Float: { if( m_options.FieldInline ) { m_options.FieldValue.FloatField( ref owner, m_options.Name ); if( m_options.FieldValue.Active ) m_currentOption = 1; else m_currentOption = 0; } else { m_options.FieldValue.FloatValue = owner.EditorGUILayoutFloatField( m_options.Name, m_options.FieldValue.FloatValue ); } } break; case AseOptionsUIWidget.Int: { if( m_options.FieldInline ) { m_options.FieldValue.IntField( ref owner, m_options.Name ); if( m_options.FieldValue.Active ) m_currentOption = 1; else m_currentOption = 0; } else m_options.FieldValue.FloatValue = owner.EditorGUILayoutIntField( m_options.Name, (int)m_options.FieldValue.FloatValue ); } break; case AseOptionsUIWidget.FloatRange: { if( m_options.FieldInline ) { m_options.FieldValue.SliderField( ref owner, m_options.Name, m_options.FieldMin, m_options.FieldMax ); if( m_options.FieldValue.Active ) m_currentOption = 1; else m_currentOption = 0; } else m_options.FieldValue.FloatValue = owner.EditorGUILayoutSlider( m_options.Name, m_options.FieldValue.FloatValue, m_options.FieldMin, m_options.FieldMax ); } break; case AseOptionsUIWidget.IntRange: { if( m_options.FieldInline ) { m_options.FieldValue.IntSlider( ref owner, m_options.Name, (int)m_options.FieldMin, (int)m_options.FieldMax ); if( m_options.FieldValue.Active ) m_currentOption = 1; else m_currentOption = 0; } else m_options.FieldValue.FloatValue = owner.EditorGUILayoutIntSlider( m_options.Name, (int)m_options.FieldValue.FloatValue, (int)m_options.FieldMin, (int)m_options.FieldMax ); } break; } if( EditorGUI.EndChangeCheck() ) { if( OnActionPerformedEvt != null ) { if( m_invertActionOnDeselection ) OnActionPerformedEvt( false, lastOption != m_options.DisableIdx, this, m_options.ActionsPerOption[ lastOption ] ); OnActionPerformedEvt( false, false, this, m_options.ActionsPerOption[ m_currentOption ] ); } } } } public void CheckEnDisable() { //string deb = string.Empty;// "-- Checked --" + m_options.Name+" "+ m_isVisible + " "+ m_wasVisible; if( m_isVisible ) { if( !m_wasVisible ) { //deb = "-- Enable --" + m_options.Name; //Debug.Log( deb ); if( OnActionPerformedEvt != null ) { if( m_invertActionOnDeselection ) { for( int i = 0; i < m_options.Count; i++ ) { if( i != m_currentOption && i != m_options.DisableIdx ) { OnActionPerformedEvt( false, true, this, m_options.ActionsPerOption[ i ] ); } } } OnActionPerformedEvt( false, false, this, m_options.ActionsPerOption[ m_currentOption ] ); //if( !m_isVisible ) //OnActionPerformedEvt( isRefreshing, false, this, m_options.ActionsPerOption[ m_options.DisableIdx ] ); } } m_wasVisible = true; } else if( m_wasVisible ) { //deb = "-- Disable --" + m_options.Name; //Debug.Log( deb ); m_wasVisible = false; if( OnActionPerformedEvt != null ) { OnActionPerformedEvt( false, false, this, m_options.ActionsPerOption[ m_options.DisableIdx ] ); } } } public void FillDataCollector( ref MasterNodeDataCollector dataCollector ) { if( m_isVisible && m_checkOnExecute ) { for( int i = 0; i < m_options.ActionsPerOption[ m_currentOption ].Length; i++ ) { switch( m_options.ActionsPerOption[ m_currentOption ][ i ].ActionType ) { case AseOptionsActionType.SetDefine: { dataCollector.AddToDefines( -1, m_options.ActionsPerOption[ m_currentOption ][ i ].ActionData ); } break; case AseOptionsActionType.SetUndefine: { dataCollector.AddToDefines( -1, m_options.ActionsPerOption[ m_currentOption ][ i ].ActionData, false ); } break; } } } } public void Refresh() { if( OnActionPerformedEvt != null ) { if( m_invertActionOnDeselection ) { for( int i = 0; i < m_options.Count; i++ ) { if( i != m_currentOption && i != m_options.DisableIdx ) { OnActionPerformedEvt( true, true, this, m_options.ActionsPerOption[ i ] ); } } } OnActionPerformedEvt( true, false, this, m_options.ActionsPerOption[ m_currentOption ] ); } } public TemplateOptionsItem Options { get { return m_options; } } public void Destroy() { OnActionPerformedEvt = null; } public bool IsVisible { get { return m_isVisible; } set { m_isVisible = value; } } public bool WasVisible { get { return m_wasVisible; } set { m_wasVisible = value; } } public bool CheckOnExecute { get { return m_checkOnExecute; } set { m_checkOnExecute = value; } } public InlineProperty FieldValue { get { return m_options.FieldValue; } set { m_options.FieldValue = value; } } public float CurrentFieldValue { get { return m_options.FieldValue.FloatValue; } set { m_options.FieldValue.FloatValue = value; } } public int CurrentOption { get { return m_currentOption; } set { m_currentOption = Mathf.Clamp( value, 0, m_options.Options.Length - 1 ); // why refreshing here? //Refresh(); } } public int CurrentOptionIdx { set { m_currentOption = Mathf.Clamp( value, 0, m_options.Options.Length - 1 ); } } public bool EmptyEvent { get { return OnActionPerformedEvt == null; } } public TemplateActionItemGrid.TemplateActionItemRow CurrentOptionActions { get { return m_options.ActionsPerOption.Rows[m_currentOption]; } } public bool InvertActionOnDeselection { get { return m_invertActionOnDeselection; } } } }