204 lines
6.1 KiB
C#
204 lines
6.1 KiB
C#
|
// 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
|
||
|
{
|
||
|
public enum InlineSamplerFilteringMode
|
||
|
{
|
||
|
Point,
|
||
|
Linear,
|
||
|
Trilinear
|
||
|
};
|
||
|
|
||
|
public enum InlineSamplerWrapMode
|
||
|
{
|
||
|
Clamp,
|
||
|
Repeat,
|
||
|
Mirror,
|
||
|
MirrorOnce
|
||
|
};
|
||
|
|
||
|
public enum InlineSamplerWrapCoordinates
|
||
|
{
|
||
|
All,
|
||
|
U,
|
||
|
V,
|
||
|
W
|
||
|
};
|
||
|
|
||
|
[Serializable]
|
||
|
public class InlineSamplerWrapOptions
|
||
|
{
|
||
|
public InlineSamplerWrapMode WrapMode = InlineSamplerWrapMode.Clamp;
|
||
|
public InlineSamplerWrapCoordinates Coordinates = InlineSamplerWrapCoordinates.All;
|
||
|
public string InlineValue
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
string name = "_"+WrapMode.ToString();
|
||
|
if( Coordinates != InlineSamplerWrapCoordinates.All )
|
||
|
name += Coordinates.ToString();
|
||
|
name += "_";
|
||
|
return name;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
[Serializable]
|
||
|
public class SamplerStateAutoGenerator
|
||
|
{
|
||
|
private const int MaxCount = 3;
|
||
|
private const float ButtonLayoutWidth = 15;
|
||
|
private const string AdditionalWrapsStr = "Additional Wraps";
|
||
|
private const string InlineSamplerStateStr = "Inline Sampler State";
|
||
|
|
||
|
[SerializeField]
|
||
|
private InlineSamplerFilteringMode m_filterMode = InlineSamplerFilteringMode.Point;
|
||
|
|
||
|
[SerializeField]
|
||
|
private InlineSamplerWrapOptions m_mainWrapMode = new InlineSamplerWrapOptions();
|
||
|
|
||
|
[SerializeField]
|
||
|
private List<InlineSamplerWrapOptions> m_additionalWrapOptions = new List<InlineSamplerWrapOptions>();
|
||
|
|
||
|
[SerializeField]
|
||
|
private bool m_visibleWrapsFoldout = false;
|
||
|
|
||
|
[SerializeField]
|
||
|
private bool m_visibleMainFoldout = false;
|
||
|
|
||
|
[NonSerialized]
|
||
|
private UndoParentNode m_owner;
|
||
|
|
||
|
public void Destroy()
|
||
|
{
|
||
|
m_mainWrapMode = null;
|
||
|
m_additionalWrapOptions.Clear();
|
||
|
m_additionalWrapOptions = null;
|
||
|
}
|
||
|
|
||
|
public string AddToDataCollector( ref MasterNodeDataCollector dataCollector )
|
||
|
{
|
||
|
string inlineSampler = "sampler_";
|
||
|
|
||
|
inlineSampler += m_filterMode.ToString();
|
||
|
inlineSampler += m_mainWrapMode.InlineValue;
|
||
|
|
||
|
int count = m_additionalWrapOptions.Count;
|
||
|
for( int i = 0; i < count; i++ )
|
||
|
{
|
||
|
inlineSampler += m_additionalWrapOptions[ i ].InlineValue;
|
||
|
}
|
||
|
return inlineSampler;
|
||
|
}
|
||
|
|
||
|
void DrawAddRemoveButtons()
|
||
|
{
|
||
|
int count = m_additionalWrapOptions.Count;
|
||
|
if( count < MaxCount && m_owner.GUILayoutButton( string.Empty, UIUtils.PlusStyle, GUILayout.Width( ButtonLayoutWidth ) ) )
|
||
|
{
|
||
|
m_additionalWrapOptions.Add( new InlineSamplerWrapOptions() );
|
||
|
EditorGUI.FocusTextInControl( null );
|
||
|
}
|
||
|
|
||
|
if( count > 0 && m_owner.GUILayoutButton( string.Empty, UIUtils.MinusStyle, GUILayout.Width( ButtonLayoutWidth ) ) )
|
||
|
{
|
||
|
m_additionalWrapOptions.RemoveAt( count - 1 );
|
||
|
EditorGUI.FocusTextInControl( null );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void Draw( UndoParentNode owner )
|
||
|
{
|
||
|
m_owner = owner;
|
||
|
NodeUtils.DrawNestedPropertyGroup( ref m_visibleMainFoldout, InlineSamplerStateStr, DrawMain );
|
||
|
}
|
||
|
|
||
|
void DrawMain()
|
||
|
{
|
||
|
m_filterMode = (InlineSamplerFilteringMode)m_owner.EditorGUILayoutEnumPopup( m_filterMode );
|
||
|
|
||
|
EditorGUILayout.BeginHorizontal();
|
||
|
m_mainWrapMode.WrapMode = (InlineSamplerWrapMode)m_owner.EditorGUILayoutEnumPopup( m_mainWrapMode.WrapMode );
|
||
|
m_mainWrapMode.Coordinates = (InlineSamplerWrapCoordinates)m_owner.EditorGUILayoutEnumPopup( m_mainWrapMode.Coordinates );
|
||
|
EditorGUILayout.EndHorizontal();
|
||
|
NodeUtils.DrawNestedPropertyGroup( ref m_visibleWrapsFoldout, AdditionalWrapsStr, DrawAdditionalWrapModes, DrawAddRemoveButtons );
|
||
|
}
|
||
|
|
||
|
void DrawAdditionalWrapModes()
|
||
|
{
|
||
|
EditorGUILayout.Space();
|
||
|
int count = m_additionalWrapOptions.Count;
|
||
|
for( int i = 0; i < count; i++ )
|
||
|
{
|
||
|
float maxWidth = 90;
|
||
|
EditorGUILayout.BeginHorizontal();
|
||
|
m_additionalWrapOptions[ i ].WrapMode = (InlineSamplerWrapMode)m_owner.EditorGUILayoutEnumPopup( m_additionalWrapOptions[ i ].WrapMode ,GUILayout.MaxWidth( maxWidth ) );
|
||
|
m_additionalWrapOptions[ i ].Coordinates = (InlineSamplerWrapCoordinates)m_owner.EditorGUILayoutEnumPopup( m_additionalWrapOptions[ i ].Coordinates, GUILayout.MaxWidth( maxWidth ) );
|
||
|
EditorGUILayout.EndHorizontal();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void ReadFromString( ref uint index, ref string[] nodeParams )
|
||
|
{
|
||
|
#if UNITY_2019_3_OR_NEWER
|
||
|
Enum.TryParse<InlineSamplerFilteringMode>( nodeParams[ index++ ], out m_filterMode );
|
||
|
Enum.TryParse<InlineSamplerWrapCoordinates>( nodeParams[ index++ ], out m_mainWrapMode.Coordinates );
|
||
|
|
||
|
int count = 0;
|
||
|
int.TryParse( nodeParams[ index++ ], out count );
|
||
|
for( int i = 0; i < count; i++ )
|
||
|
{
|
||
|
InlineSamplerWrapOptions option = new InlineSamplerWrapOptions();
|
||
|
|
||
|
Enum.TryParse<InlineSamplerWrapMode>( nodeParams[ index++ ], out option.WrapMode );
|
||
|
Enum.TryParse<InlineSamplerWrapCoordinates>( nodeParams[ index++ ], out option.Coordinates );
|
||
|
|
||
|
m_additionalWrapOptions.Add( option );
|
||
|
}
|
||
|
#else
|
||
|
m_filterMode =(InlineSamplerFilteringMode) Enum.Parse( typeof( InlineSamplerFilteringMode ), nodeParams[ index++ ] );
|
||
|
m_mainWrapMode.Coordinates = (InlineSamplerWrapCoordinates)Enum.Parse( typeof( InlineSamplerWrapCoordinates ),nodeParams[ index++ ] );
|
||
|
|
||
|
int count = 0;
|
||
|
int.TryParse( nodeParams[ index++ ], out count );
|
||
|
for( int i = 0; i < count; i++ )
|
||
|
{
|
||
|
InlineSamplerWrapOptions option = new InlineSamplerWrapOptions();
|
||
|
|
||
|
option.WrapMode = ( InlineSamplerWrapMode)Enum.Parse(typeof( InlineSamplerWrapMode ), nodeParams[ index++ ] );
|
||
|
option.Coordinates = ( InlineSamplerWrapCoordinates)Enum.Parse(typeof( InlineSamplerWrapCoordinates ), nodeParams[ index++ ] );
|
||
|
|
||
|
m_additionalWrapOptions.Add( option );
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
}
|
||
|
|
||
|
public void WriteToString( ref string nodeInfo )
|
||
|
{
|
||
|
IOUtils.AddFieldValueToString( ref nodeInfo, m_filterMode );
|
||
|
|
||
|
IOUtils.AddFieldValueToString( ref nodeInfo, m_mainWrapMode.WrapMode );
|
||
|
IOUtils.AddFieldValueToString( ref nodeInfo, m_mainWrapMode.Coordinates );
|
||
|
|
||
|
int count = m_additionalWrapOptions.Count;
|
||
|
IOUtils.AddFieldValueToString( ref nodeInfo, count );
|
||
|
if( count > 0 )
|
||
|
{
|
||
|
for( int i = 0; i < count; i++ )
|
||
|
{
|
||
|
IOUtils.AddFieldValueToString( ref nodeInfo, m_additionalWrapOptions[i].WrapMode );
|
||
|
IOUtils.AddFieldValueToString( ref nodeInfo, m_additionalWrapOptions[i].Coordinates );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|
||
|
}
|