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