| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 | // Amplify Shader Editor - Visual Shader Editing Tool// Copyright (c) Amplify Creations, Lda <info@amplify.pt>using System;using System.Collections.Generic;using System.Text.RegularExpressions;namespace AmplifyShaderEditor{	[Serializable]	public class TemplatePassInfo	{		public string Modules;		public string Data;		public int GlobalStartIdx = -1;		public int LocalStartIdx = -1;	}	[Serializable]	public class TemplateSubShaderInfo	{		public string Data;		public string Modules;		public int StartIdx = -1;		public List<TemplatePassInfo> Passes = new List<TemplatePassInfo>();		public void Destroy()		{			Passes.Clear();			Passes = null;		}	}	[Serializable]	public class TemplateShaderInfo	{		public string Body;		public string Properties;		public int PropertyStartIdx = -1;		public List<TemplateSubShaderInfo> SubShaders = new List<TemplateSubShaderInfo>();		public void Destroy()		{			int count = SubShaders.Count;			for( int i = 0; i < count; i++ )			{				SubShaders[ i ].Destroy();			}			SubShaders.Clear();			SubShaders = null;		}	}	public class TemplateShaderInfoUtil	{		public static TemplateShaderInfo CreateShaderData( string body )		{			int nameBegin = body.IndexOf( TemplatesManager.TemplateShaderNameBeginTag );			if( nameBegin < 0 )			{				// Not a template				return null;			}			TemplateShaderInfo shaderData = null;			//SHADER			MatchCollection shaderMatch = Regex.Matches( body, "\\bShader\\b" );			if( shaderMatch.Count > 0 )			{				//SUBSHADER				MatchCollection subShaderMatch = Regex.Matches( body, TemplatesManager.TemplateMPSubShaderTag );				int subShaderAmount = subShaderMatch.Count;				if( subShaderAmount > 0 )				{					shaderData = new TemplateShaderInfo();					shaderData.Body = body;					int length = subShaderMatch[ 0 ].Index - shaderMatch[ 0 ].Groups[ 0 ].Index;					shaderData.Properties = body.Substring( shaderMatch[ 0 ].Index, length );					shaderData.PropertyStartIdx = body.IndexOf( TemplatesManager.TemplatePropertyTag );					for( int subShaderIdx = 0; subShaderIdx < subShaderAmount; subShaderIdx++ )					{						TemplateSubShaderInfo subShaderData = new TemplateSubShaderInfo();						int subshaderBeginIndex = subShaderMatch[ subShaderIdx ].Index;						int subShaderEndIndex = ( subShaderIdx == ( subShaderAmount - 1 ) ) ? body.Length - 1 : subShaderMatch[ subShaderIdx + 1 ].Index;						subShaderData.Data = body.Substring( subshaderBeginIndex, subShaderEndIndex - subshaderBeginIndex );						subShaderData.StartIdx = subshaderBeginIndex;						//PASS						MatchCollection passMatch = Regex.Matches( subShaderData.Data, TemplatesManager.TemplatePassTagPattern );						if( passMatch.Count == 0 )						{							passMatch = Regex.Matches( subShaderData.Data, TemplatesManager.TemplateMPPassTag );						}						int passCount = passMatch.Count;						if( passCount > 0 )						{							int lastPassIndex = subShaderData.Data.LastIndexOf( TemplatesManager.TemplatePassesEndTag );							if( lastPassIndex < 0 )							{								lastPassIndex = subShaderData.Data.Length - 1;							}							subShaderData.Modules = subShaderData.Data.Substring( 0, passMatch[ 0 ].Index );							for( int passIdx = 0; passIdx < passCount; passIdx++ )							{								int passBeginIndex = passMatch[ passIdx ].Index;								int passEndIdx = ( passIdx == ( passCount - 1 ) ) ? lastPassIndex : passMatch[ passIdx + 1 ].Index;								TemplatePassInfo passData = new TemplatePassInfo();								passData.Data = subShaderData.Data.Substring( passBeginIndex, passEndIdx - passBeginIndex );								passData.GlobalStartIdx = subshaderBeginIndex + passBeginIndex;								passData.LocalStartIdx = passBeginIndex;								subShaderData.Passes.Add( passData );							}							shaderData.SubShaders.Add( subShaderData );						}					}				}			}			return shaderData;		}	}}
 |