Init
This commit is contained in:
@ -0,0 +1,121 @@
|
||||
// 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user