// 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 DuplicatePreventionBuffer
|
|
{
|
|
private const string VectorNameStr = "Vector ";
|
|
private const string TextureSampleNameStr = "Texture Sample ";
|
|
private const string MatrixNameStr = "Matrix ";
|
|
private const string IntNameStr = "Int ";
|
|
private const string FloatNameStr = "Float ";
|
|
private const string ColorNameStr = "Color ";
|
|
|
|
[SerializeField]
|
|
private int[] m_availableUVChannelsArray = { -1, -1, -1, -1 };
|
|
private string[] m_availableUVChannelsNamesArray = { "null",
|
|
"null",
|
|
"null",
|
|
"null" };
|
|
|
|
private Dictionary<string, int> m_availablePropertyNames = new Dictionary<string, int>();
|
|
private Dictionary<string, int> m_availableUniformNames = new Dictionary<string, int>();
|
|
private Dictionary<string, int> m_availableLocalVariableNames = new Dictionary<string, int>();
|
|
|
|
public void ReleaseAllUVChannels()
|
|
{
|
|
for ( int i = 0; i < m_availableUVChannelsArray.Length; i++ )
|
|
{
|
|
m_availableUVChannelsArray[ i ] = -1;
|
|
}
|
|
}
|
|
|
|
public bool RegisterUVChannel( int nodeId, int channelId, string name )
|
|
{
|
|
if ( channelId < 0 ||
|
|
channelId > ( m_availableUVChannelsArray.Length - 1 ) ||
|
|
m_availableUVChannelsArray[ channelId ] >= 0 )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
m_availableUVChannelsArray[ channelId ] = nodeId;
|
|
m_availableUVChannelsNamesArray[ channelId ] = name;
|
|
return true;
|
|
}
|
|
|
|
|
|
public bool ReleaseUVChannel( int nodeId, int channelId )
|
|
{
|
|
if ( channelId < 0 ||
|
|
channelId > ( m_availableUVChannelsArray.Length - 1 ) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if ( m_availableUVChannelsArray[ channelId ] == nodeId )
|
|
{
|
|
m_availableUVChannelsArray[ channelId ] = -1;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public int RegisterFirstAvailableChannel( int nodeId , string name)
|
|
{
|
|
for ( int i = 0; i < m_availableUVChannelsArray.Length; i++ )
|
|
{
|
|
if ( m_availableUVChannelsArray[ i ] == -1 )
|
|
{
|
|
m_availableUVChannelsArray[ i ] = nodeId;
|
|
m_availableUVChannelsNamesArray[ i ] = name;
|
|
return i;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
public bool IsChannelAvailable( int channelId )
|
|
{
|
|
if ( channelId < 0 ||
|
|
channelId > ( m_availableUVChannelsArray.Length - 1 ) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
return ( m_availableUVChannelsArray[ channelId ] < 0 );
|
|
}
|
|
|
|
public int GetFirstOccupiedChannel()
|
|
{
|
|
for ( int i = 0; i < 4; i++ )
|
|
{
|
|
if ( m_availableUVChannelsArray[ i ] > -1 )
|
|
return i;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
public string GetChannelName( int channelId )
|
|
{
|
|
if ( channelId < 0 ||
|
|
channelId > ( m_availableUVChannelsArray.Length - 1 ) )
|
|
{
|
|
return string.Empty;
|
|
}
|
|
|
|
return m_availableUVChannelsNamesArray[ channelId ] ;
|
|
}
|
|
|
|
public void SetChannelName( int channelId , string name )
|
|
{
|
|
if ( channelId < 0 ||
|
|
channelId > ( m_availableUVChannelsArray.Length - 1 ) )
|
|
{
|
|
return;
|
|
}
|
|
m_availableUVChannelsNamesArray[ channelId ] = name;
|
|
}
|
|
|
|
public bool RegisterLocalVariableName( int nodeId, string name )
|
|
{
|
|
if ( name.Length == 0 )
|
|
return false;
|
|
|
|
if ( m_availableLocalVariableNames.ContainsKey( name ) )
|
|
{
|
|
if ( m_availableLocalVariableNames[ name ] > -1 )
|
|
{
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
m_availableLocalVariableNames[ name ] = nodeId;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
m_availableLocalVariableNames.Add( name, nodeId );
|
|
return true;
|
|
}
|
|
|
|
public int CheckUniformNameOwner( string name )
|
|
{
|
|
if ( name.Length == 0 )
|
|
return -1;
|
|
|
|
if ( m_availableUniformNames.ContainsKey( name ) )
|
|
{
|
|
return m_availableUniformNames[ name ];
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
public bool RegisterUniformName( int nodeId, string name )
|
|
{
|
|
if ( name.Length == 0 )
|
|
return false;
|
|
|
|
if ( m_availableUniformNames.ContainsKey( name ) )
|
|
{
|
|
if ( m_availableUniformNames[ name ] > -1 )
|
|
{
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
m_availableUniformNames[ name ] = nodeId;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
m_availableUniformNames.Add( name, nodeId );
|
|
return true;
|
|
}
|
|
|
|
public void DumpUniformNames()
|
|
{
|
|
string val = "CONTENTS\n";
|
|
foreach ( KeyValuePair<string, int> kvp in m_availableUniformNames )
|
|
{
|
|
val += ( "key " + kvp.Key + " : value " + kvp.Value + "\n" );
|
|
}
|
|
}
|
|
|
|
public void DumpLocalVariableNames()
|
|
{
|
|
string val = "CONTENTS\n";
|
|
foreach ( KeyValuePair<string, int> kvp in m_availableLocalVariableNames )
|
|
{
|
|
val += ( "key " + kvp.Key + " : value " + kvp.Value + "\n" );
|
|
}
|
|
}
|
|
|
|
|
|
public bool ReleaseUniformName( int nodeId, string name )
|
|
{
|
|
if ( !string.IsNullOrEmpty(name) && name.Length == 0 )
|
|
return false;
|
|
|
|
if ( m_availableUniformNames.ContainsKey( name ) )
|
|
{
|
|
if ( m_availableUniformNames[ name ] == nodeId )
|
|
{
|
|
m_availableUniformNames.Remove( name );
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public bool ReleaseLocalVariableName( int nodeId, string name )
|
|
{
|
|
if ( name.Length == 0 )
|
|
return false;
|
|
|
|
if ( m_availableLocalVariableNames.ContainsKey( name ) )
|
|
{
|
|
if ( m_availableLocalVariableNames[ name ] == nodeId )
|
|
{
|
|
m_availableLocalVariableNames.Remove( name );
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public void ReleaseAllUniformNames()
|
|
{
|
|
m_availableUniformNames.Clear();
|
|
}
|
|
|
|
public void ReleaseAllLocalVariableNames()
|
|
{
|
|
m_availableLocalVariableNames.Clear();
|
|
}
|
|
|
|
public void GetFirstAvailableName( int nodeId, WirePortDataType type , out string outProperty , out string outInspector, bool useCustomPrefix = false, string customPrefix = null)
|
|
{
|
|
string name = string.Empty;
|
|
if ( useCustomPrefix && customPrefix != null )
|
|
{
|
|
name = customPrefix;
|
|
}
|
|
else
|
|
{
|
|
switch ( type )
|
|
{
|
|
case WirePortDataType.OBJECT:
|
|
case WirePortDataType.FLOAT:
|
|
{
|
|
name = FloatNameStr;
|
|
}
|
|
break;
|
|
case WirePortDataType.INT:
|
|
{
|
|
name = IntNameStr;
|
|
}
|
|
break;
|
|
case WirePortDataType.FLOAT2:
|
|
case WirePortDataType.FLOAT3:
|
|
case WirePortDataType.FLOAT4:
|
|
{
|
|
name = VectorNameStr;
|
|
}
|
|
break;
|
|
case WirePortDataType.FLOAT3x3:
|
|
case WirePortDataType.FLOAT4x4:
|
|
{
|
|
name = MatrixNameStr;
|
|
}
|
|
break;
|
|
case WirePortDataType.COLOR:
|
|
{
|
|
name = ColorNameStr;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
int count = 0;
|
|
bool foundName = false;
|
|
while ( !foundName )
|
|
{
|
|
string inspectorName = name + count;
|
|
string propertyName = UIUtils.GeneratePropertyName( inspectorName , PropertyType.Property );
|
|
|
|
if ( IsUniformNameAvailable( propertyName ) )
|
|
{
|
|
outInspector = inspectorName;
|
|
outProperty = propertyName;
|
|
RegisterUniformName( nodeId, propertyName );
|
|
return;
|
|
}
|
|
count += 1;
|
|
}
|
|
outProperty = string.Empty;
|
|
outInspector = string.Empty;
|
|
UIUtils.ShowMessage( "Could not find a valid name " + MessageSeverity.Warning );
|
|
}
|
|
|
|
public bool IsUniformNameAvailable( string name )
|
|
{
|
|
if ( m_availableUniformNames.ContainsKey( name ) && m_availableUniformNames[ name ] > -1 )
|
|
return false;
|
|
return true;
|
|
}
|
|
|
|
public bool IsLocalvariableNameAvailable( string name )
|
|
{
|
|
if ( m_availableLocalVariableNames.ContainsKey( name ) && m_availableLocalVariableNames[ name ] > -1 )
|
|
return false;
|
|
return true;
|
|
}
|
|
|
|
public bool GetPropertyName( int nodeId, string name )
|
|
{
|
|
if ( m_availablePropertyNames.ContainsKey( name ) )
|
|
{
|
|
if ( m_availablePropertyNames[ name ] > -1 )
|
|
{
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
m_availablePropertyNames[ name ] = nodeId;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
m_availablePropertyNames.Add( name, nodeId );
|
|
return true;
|
|
}
|
|
|
|
|
|
public bool ReleasePropertyName( int nodeId, string name )
|
|
{
|
|
if ( m_availablePropertyNames.ContainsKey( name ) )
|
|
{
|
|
if ( m_availablePropertyNames[ name ] == nodeId )
|
|
{
|
|
m_availablePropertyNames[ name ] = -1;
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public void ReleaseAllPropertyNames()
|
|
{
|
|
m_availablePropertyNames.Clear();
|
|
}
|
|
|
|
public bool IsPropertyNameAvailable( string name )
|
|
{
|
|
if ( m_availablePropertyNames.ContainsKey( name ) && m_availablePropertyNames[ name ] > -1 )
|
|
return false;
|
|
return true;
|
|
}
|
|
|
|
public void ReleaseAllData()
|
|
{
|
|
ReleaseAllUVChannels();
|
|
ReleaseAllUniformNames();
|
|
ReleaseAllPropertyNames();
|
|
ReleaseAllLocalVariableNames();
|
|
}
|
|
}
|
|
}
|