// Amplify Shader Editor - Visual Shader Editing Tool
|
|
// Copyright (c) Amplify Creations, Lda <info@amplify.pt>
|
|
|
|
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; } }
|
|
}
|
|
}
|