diff options
Diffstat (limited to 'Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateInterpData.cs')
-rw-r--r-- | Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateInterpData.cs | 234 |
1 files changed, 234 insertions, 0 deletions
diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateInterpData.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateInterpData.cs new file mode 100644 index 00000000..6e5da580 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateInterpData.cs @@ -0,0 +1,234 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda <info@amplify.pt> + +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class TemplateInterpElement + { + public TemplateSemantics Semantic; + public bool[] AvailableChannels = { true, true, true, true }; + public bool IsFull = false; + public int Usage = 0; + public string Name; + + public TemplateInterpElement( TemplateInterpElement other ) + { + Semantic = other.Semantic; + for ( int i = 0; i < AvailableChannels.Length; i++ ) + { + AvailableChannels[ i ] = other.AvailableChannels[ i ]; + } + IsFull = other.IsFull; + Usage = other.Usage; + Name = other.Name; + } + + public TemplateInterpElement( TemplateSemantics semantic ) + { + Semantic = semantic; + int semanticId = TemplateHelperFunctions.SemanticToInt[ Semantic ]; + Name = ( semanticId == 0 ) ? TemplateHelperFunctions.BaseInterpolatorName : TemplateHelperFunctions.BaseInterpolatorName + semanticId.ToString(); + } + + public void SetAvailableChannelsFromString( string channels ) + { + for ( int i = 0; i < AvailableChannels.Length; i++ ) + { + AvailableChannels[ i ] = false; + } + Usage = AvailableChannels.Length; + + for ( int i = 0; i < channels.Length; i++ ) + { + switch ( channels[ i ] ) + { + case 'x': if ( !AvailableChannels[ 0 ] ) { AvailableChannels[ 0 ] = true; Usage--; } break; + case 'y': if ( !AvailableChannels[ 1 ] ) { AvailableChannels[ 1 ] = true; Usage--; } break; + case 'z': if ( !AvailableChannels[ 2 ] ) { AvailableChannels[ 2 ] = true; Usage--; } break; + case 'w': if ( !AvailableChannels[ 3 ] ) { AvailableChannels[ 3 ] = true; Usage--; } break; + } + } + } + + public TemplateVertexData RequestChannels( WirePortDataType type, bool isColor, string customName = null ) + { + if ( IsFull ) + return null; + + int channelsRequired = TemplateHelperFunctions.DataTypeChannelUsage[ type ]; + if ( channelsRequired == 0 ) + return null; + + int firstChannel = -1; + for ( int i = 0; i < AvailableChannels.Length; i++ ) + { + if ( AvailableChannels[ i ] ) + { + if ( firstChannel < 0 ) + { + firstChannel = i; + } + channelsRequired -= 1; + if ( channelsRequired == 0 ) + break; + } + } + + //did not found enough channels to fill request + if ( channelsRequired > 0 ) + return null; + + if( Usage == 0 && customName != null ) + { + Name = customName; + } + + Usage += 1; + TemplateVertexData data = null; + + if ( type == WirePortDataType.COLOR || type == WirePortDataType.FLOAT4 ) + { + // Automatically lock all channels + for ( int i = firstChannel; i < ( firstChannel + channelsRequired ); i++ ) + { + AvailableChannels[ i ] = false; + } + IsFull = true; + data = new TemplateVertexData( Semantic, type, Name ); + } + else + { + string[] swizzleArray = ( isColor ) ? TemplateHelperFunctions.ColorSwizzle : TemplateHelperFunctions.VectorSwizzle; + string channels = "."; + int count = firstChannel + TemplateHelperFunctions.DataTypeChannelUsage[ type ]; + for ( int i = firstChannel; i < count; i++ ) + { + AvailableChannels[ i ] = false; + channels += swizzleArray[ i ]; + if ( i == ( AvailableChannels.Length - 1 ) ) + { + IsFull = true; + } + } + + data = new TemplateVertexData( Semantic, type, Name, channels ); + } + return data; + } + } + + [Serializable] + public class TemplateInterpData + { + [SerializeField] + private string m_interpDataId = string.Empty; + + [SerializeField] + private int m_interpDataStartIdx = -1; + + [SerializeField] + private bool m_dynamicMax = false; + + public List<TemplateInterpElement> AvailableInterpolators = new List<TemplateInterpElement>(); + public List<TemplateVertexData> Interpolators = new List<TemplateVertexData>(); + public List<TemplateVertexData> RawInterpolators = new List<TemplateVertexData>(); + + public TemplateInterpData() { } + + public bool HasRawInterpolatorOfName( string name ) + { + return RawInterpolators.Exists( ( x ) => x.VarName.Equals( name )); + } + + public TemplateInterpData( TemplateInterpData other ) + { + m_dynamicMax = other.DynamicMax; + + foreach ( TemplateInterpElement data in other.AvailableInterpolators ) + { + AvailableInterpolators.Add( new TemplateInterpElement( data ) ); + } + + for ( int i = 0; i < other.Interpolators.Count; i++ ) + { + Interpolators.Add( new TemplateVertexData( other.Interpolators[ i ] ) ); + } + + for( int i = 0; i < other.RawInterpolators.Count; i++ ) + { + RawInterpolators.Add( new TemplateVertexData( other.RawInterpolators[ i ] ) ); + } + } + + + public void RecalculateAvailableInterpolators( int newMax ) + { + if( m_dynamicMax ) + { + if( !TemplateHelperFunctions.IntToSemantic.ContainsKey( ( newMax - 1 ) ) ) + { + Debug.LogWarning( "Attempting to add inexisting available interpolators" ); + return; + } + + if( AvailableInterpolators.Count > 0 ) + { + int currMax = 1 + TemplateHelperFunctions.SemanticToInt[ AvailableInterpolators[ AvailableInterpolators.Count - 1 ].Semantic ]; + if( newMax > currMax ) + { + int count = newMax - currMax; + for( int i = 0; i < count; i++ ) + { + AvailableInterpolators.Add( new TemplateInterpElement( TemplateHelperFunctions.IntToSemantic[ currMax + i ] )); + } + } + else if( newMax < currMax ) + { + int min = TemplateHelperFunctions.SemanticToInt[ AvailableInterpolators[ 0 ].Semantic ]; + if( newMax > min ) + { + int count = currMax - newMax; + for( int i = 0; i < count; i++ ) + { + AvailableInterpolators.RemoveAt( AvailableInterpolators.Count - 1 ); + } + } + } + } + } + } + + public void ReplaceNameOnInterpolator( TemplateSemantics semantic, string newName ) + { + for ( int i = 0; i < AvailableInterpolators.Count; i++ ) + { + if ( AvailableInterpolators[ i ].Semantic == semantic ) + { + AvailableInterpolators[ i ].Name = newName; + break; + } + } + } + + public void Destroy() + { + AvailableInterpolators.Clear(); + AvailableInterpolators = null; + + Interpolators.Clear(); + Interpolators = null; + + RawInterpolators.Clear(); + RawInterpolators = null; + } + + public string InterpDataId { get { return m_interpDataId; } set { m_interpDataId = value; } } + public int InterpDataStartIdx { get { return m_interpDataStartIdx; } set { m_interpDataStartIdx = value; } } + public bool DynamicMax { get { return m_dynamicMax; } set { m_dynamicMax = value; } } + } +} |