Assignment for RMIT Mixed Reality in 2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

121 lines
3.8 KiB

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