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