| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237 | // 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 TemplatePassId	{		public string PassId;		public bool RemoveFromShader;	}	[Serializable]	public class TemplateTag	{		public string Tag = string.Empty;		public string Replacement = string.Empty;		public string Output = string.Empty;		public TemplateTag( string tag, string replacement = null )		{			Tag = tag;			if( replacement != null )			{				Replacement = replacement;				Output = replacement;			}		}	}	[Serializable]	public class TemplateId	{		public int StartIdx = -1;		public string UniqueID;		public string Tag;		public string ReplacementText;		public bool IsReplaced = false;		public bool EmptyReplacer = false;		public TemplateId( int bodyIdx, string uniqueID, string tag, bool emptyReplacer = false )		{			StartIdx = bodyIdx;			UniqueID = uniqueID;			Tag = tag;			EmptyReplacer = emptyReplacer;			ReplacementText = emptyReplacer ? string.Empty : tag;		}		public void SetReplacementText( string replacementText )		{			ReplacementText = replacementText;			IsReplaced = true;		}		public void Reset()		{			ReplacementText = EmptyReplacer?string.Empty:Tag;			IsReplaced = false;		}	}	[Serializable]	public class TemplateIdManager	{		[SerializeField]		private bool m_isSorted = false;		[SerializeField]		private string m_shaderBody;		[SerializeField]		private List<TemplateId> m_registeredIds = new List<TemplateId>();		[SerializeField]		private List<TemplateTag> m_registeredTags = new List<TemplateTag>();		[SerializeField]		private List<TemplatePassId> m_registeredPassIds = new List<TemplatePassId>();		private Dictionary<string, TemplateId> m_registeredIdsDict = new Dictionary<string, TemplateId>();		public TemplateIdManager( string shaderBody )		{			m_shaderBody = shaderBody;		}		public void Destroy()		{			m_registeredPassIds.Clear();			m_registeredPassIds = null;			m_registeredTags.Clear();			m_registeredTags = null;			m_registeredIds.Clear();			m_registeredIds = null;			if( m_registeredIdsDict != null )			{				m_registeredIdsDict.Clear();				m_registeredIdsDict = null;			}		}		void RefreshIds()		{			if( m_registeredIdsDict == null )			{				m_registeredIdsDict = new Dictionary<string, TemplateId>();			}			if( m_registeredIdsDict.Count != m_registeredIds.Count )			{				m_registeredIdsDict.Clear();				int count = m_registeredIds.Count;				for( int i = 0; i < count; i++ )				{					m_registeredIdsDict.Add( m_registeredIds[ i ].UniqueID, m_registeredIds[ i ] );				}			}		}		public void RegisterId( int bodyIdx, string uniqueID, string tag, bool emptyReplacer = false )		{			if( bodyIdx < 0 )				return;			RefreshIds();			TemplateId templateId = new TemplateId( bodyIdx, uniqueID, tag, emptyReplacer );			m_registeredIds.Add( templateId );			m_registeredIdsDict.Add( uniqueID, templateId );		}		public void RegisterTag( string tag, string replacement = null )		{			m_registeredTags.Add( new TemplateTag( tag, replacement ) );		}		public void RegisterPassId( string passId )		{			m_registeredPassIds.Add( new TemplatePassId() { PassId = passId, RemoveFromShader = false } );		}		public void SetPassIdUsage( int idx , bool removeFromShader )		{			m_registeredPassIds[ idx ].RemoveFromShader = removeFromShader;		}		public void SetReplacementText( string uniqueId, string replacementText )		{			RefreshIds();			if( m_registeredIdsDict.ContainsKey( uniqueId ) && m_registeredIdsDict[ uniqueId ].StartIdx >= 0 )				m_registeredIdsDict[ uniqueId ].SetReplacementText( replacementText );		}		public string BuildShader()		{			if( !m_isSorted )			{				m_registeredIds.Sort( ( x, y ) => { return x.StartIdx.CompareTo( y.StartIdx ); } );			}			int idCount = m_registeredIds.Count;			int offset = 0;			string finalShaderBody = m_shaderBody;			for( int i = 0; i < idCount; i++ )			{				if( m_registeredIds[ i ].StartIdx >= 0 && m_registeredIds[ i ].IsReplaced )				{					finalShaderBody = finalShaderBody.ReplaceAt( m_registeredIds[ i ].Tag, m_registeredIds[ i ].ReplacementText, offset + m_registeredIds[ i ].StartIdx );					offset += ( m_registeredIds[ i ].ReplacementText.Length - m_registeredIds[ i ].Tag.Length );				}			}			int count = m_registeredPassIds.Count;			for( int i = 0; i < count; i++ )			{				if( m_registeredPassIds[ i ].RemoveFromShader )					finalShaderBody = finalShaderBody.Replace( m_registeredPassIds[ i ].PassId, string.Empty );			}			for( int i = 0; i < idCount; i++ )			{				if( !m_registeredIds[ i ].IsReplaced && !m_registeredIds[ i ].Tag.Equals( m_registeredIds[ i ].ReplacementText ) )				{					finalShaderBody = finalShaderBody.Replace( m_registeredIds[ i ].Tag, m_registeredIds[ i ].ReplacementText );				}			}						count = m_registeredTags.Count;			for( int i = 0; i < count; i++ )			{				TemplateTag tag = m_registeredTags[ i ];				finalShaderBody = finalShaderBody.Replace( tag.Tag, tag.Replacement );				tag.Replacement = tag.Output;			}			//finalShaderBody = finalShaderBody.Replace( TemplatesManager.TemplateExcludeFromGraphTag, string.Empty );			//finalShaderBody = finalShaderBody.Replace( TemplatesManager.TemplateMainPassTag, string.Empty );			return finalShaderBody;		}		public void ResetRegistersState()		{			int count = m_registeredIds.Count;			for( int i = 0; i < count; i++ )			{				m_registeredIds[ i ].Reset();			}		}		public void Reset()		{			m_registeredIds.Clear();			if( m_registeredIdsDict == null )			{				m_registeredIdsDict = new Dictionary<string, TemplateId>();			}			else			{				m_registeredIdsDict.Clear();			}		}		public string ShaderBody		{			get { return m_shaderBody; }			set { m_shaderBody = value; }		}		public List<TemplateTag> RegisteredTags { get { return m_registeredTags; } set { m_registeredTags = value; } }	}}
 |