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.
 
 
 

1021 lines
39 KiB

// Amplify Shader Editor - Visual Shader Editing Tool
// Copyright (c) Amplify Creations, Lda <info@amplify.pt>
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
namespace AmplifyShaderEditor
{
[Serializable]
public sealed class TemplateMultiPass : TemplateDataParent
{
[SerializeField]
private List<TemplateShaderPropertyData> m_availableShaderProperties = new List<TemplateShaderPropertyData>();
[SerializeField]
private List<TemplateSubShader> m_subShaders = new List<TemplateSubShader>();
[SerializeField]
private TemplateTagData m_propertyTag;
[SerializeField]
private TemplateIdManager m_templateIdManager;
[SerializeField]
private string m_shaderNameId = string.Empty;
[SerializeField]
private string m_shaderBody;
[SerializeField]
private TemplatePropertyContainer m_templateProperties = new TemplatePropertyContainer();
[SerializeField]
private TemplateShaderInfo m_shaderData;
[SerializeField]
private bool m_isSinglePass = false;
[SerializeField]
private int m_masterNodesRequired = 0;
[SerializeField]
TemplateInfoContainer m_customInspectorContainer = new TemplateInfoContainer();
[SerializeField]
TemplateInfoContainer m_dependenciesContainer = new TemplateInfoContainer();
[SerializeField]
TemplateInfoContainer m_fallbackContainer = new TemplateInfoContainer();
public TemplateMultiPass()
{
m_templateType = TemplateDataType.MultiPass;
}
public TemplateMultiPass( string name, string guid , bool isCommunity)
{
m_templateType = TemplateDataType.MultiPass;
Init( name, guid , isCommunity);
}
public override void Init( string name, string guid, bool isCommunity )
{
base.Init( name, guid, isCommunity );
TemplatesManager.CurrTemplateGUIDLoaded = guid;
LoadTemplateBody( guid );
Name = string.IsNullOrEmpty( name ) ? m_defaultShaderName : name;
}
void LoadTemplateBody( string guid )
{
m_guid = guid;
string datapath = AssetDatabase.GUIDToAssetPath( guid );
string shaderBody = string.Empty;
shaderBody = IOUtils.LoadTextFileFromDisk( datapath );
shaderBody = shaderBody.Replace( "\r\n", "\n" );
m_shaderData = TemplateShaderInfoUtil.CreateShaderData( shaderBody );
if( m_shaderData == null )
{
m_isValid = false;
return;
}
m_templateIdManager = new TemplateIdManager( shaderBody );
try
{
int nameBegin = shaderBody.IndexOf( TemplatesManager.TemplateShaderNameBeginTag );
if( nameBegin < 0 )
{
// Not a template
return;
}
int nameEnd = shaderBody.IndexOf( TemplatesManager.TemplateFullEndTag, nameBegin );
if( nameEnd < 0 )
return;
m_shaderBody = shaderBody;
int defaultBegin = nameBegin + TemplatesManager.TemplateShaderNameBeginTag.Length;
int defaultLength = nameEnd - defaultBegin;
m_defaultShaderName = shaderBody.Substring( defaultBegin, defaultLength );
int[] nameIdx = m_defaultShaderName.AllIndexesOf( "\"" );
nameIdx[ 0 ] += 1; // Ignore the " character from the string
m_defaultShaderName = m_defaultShaderName.Substring( nameIdx[ 0 ], nameIdx[ 1 ] - nameIdx[ 0 ] );
m_shaderNameId = shaderBody.Substring( nameBegin, nameEnd + TemplatesManager.TemplateFullEndTag.Length - nameBegin );
m_templateProperties.AddId( shaderBody, m_shaderNameId, false );
m_templateIdManager.RegisterId( nameBegin, m_shaderNameId, m_shaderNameId );
shaderBody = shaderBody.Substring( nameEnd + TemplatesManager.TemplateFullEndTag.Length );
}
catch( Exception e )
{
Debug.LogException( e );
m_isValid = false;
}
TemplateHelperFunctions.FetchDependencies( m_dependenciesContainer, ref m_shaderBody );
if( m_dependenciesContainer.IsValid )
{
int index = m_dependenciesContainer.Id.IndexOf( TemplatesManager.TemplateDependenciesListTag );
m_templateProperties.AddId( new TemplateProperty( m_dependenciesContainer.Id, m_dependenciesContainer.Id.Substring( 0, index ), true ) );
m_templateIdManager.RegisterId( m_dependenciesContainer.Index, m_dependenciesContainer.Id, m_dependenciesContainer.Id );
}
TemplateHelperFunctions.FetchCustomInspector( m_customInspectorContainer, ref m_shaderBody );
if( m_customInspectorContainer.IsValid )
{
int index = m_customInspectorContainer.Id.IndexOf( "CustomEditor" );
m_templateProperties.AddId( new TemplateProperty( m_customInspectorContainer.Id, m_customInspectorContainer.Id.Substring( 0, index ), true ) );
m_templateIdManager.RegisterId( m_customInspectorContainer.Index, m_customInspectorContainer.Id, m_customInspectorContainer.Id );
}
TemplateHelperFunctions.FetchFallback( m_fallbackContainer, ref m_shaderBody );
if( m_fallbackContainer.IsValid )
{
int index = m_fallbackContainer.Id.IndexOf( "Fallback" );
m_templateProperties.AddId( new TemplateProperty( m_fallbackContainer.Id, m_fallbackContainer.Id.Substring( 0, index ), true ) );
m_templateIdManager.RegisterId( m_fallbackContainer.Index, m_fallbackContainer.Id, m_fallbackContainer.Id );
}
// Shader body may have been changed to inject inexisting tags like fallback
m_templateIdManager.ShaderBody = m_shaderBody;
m_propertyTag = new TemplateTagData( m_shaderData.PropertyStartIdx, TemplatesManager.TemplatePropertyTag, true );
m_templateIdManager.RegisterId( m_shaderData.PropertyStartIdx, TemplatesManager.TemplatePropertyTag, TemplatesManager.TemplatePropertyTag );
m_templateProperties.AddId( shaderBody, TemplatesManager.TemplatePropertyTag, true );
Dictionary<string, TemplateShaderPropertyData> duplicatesHelper = new Dictionary<string, TemplateShaderPropertyData>();
TemplateHelperFunctions.CreateShaderPropertiesList( m_shaderData.Properties, ref m_availableShaderProperties, ref duplicatesHelper );
int subShaderCount = m_shaderData.SubShaders.Count;
int mainSubShaderIdx = -1;
int mainPassIdx = -1;
int firstVisibleSubShaderId = -1;
int firstVisiblePassId = -1;
bool foundMainPass = false;
bool foundFirstVisible = false;
for( int i = 0; i < subShaderCount; i++ )
{
TemplateSubShader subShader = new TemplateSubShader( i, m_templateIdManager, "SubShader" + i, m_shaderData.SubShaders[ i ], ref duplicatesHelper );
if( subShader.FoundMainPass )
{
if( !foundMainPass )
{
foundMainPass = true;
mainSubShaderIdx = i;
mainPassIdx = subShader.MainPass;
}
}
else if( subShader.MainPass > -1 )
{
if( !foundFirstVisible )
{
foundFirstVisible = true;
firstVisibleSubShaderId = i;
firstVisiblePassId = subShader.MainPass;
}
}
m_subShaders.Add( subShader );
m_masterNodesRequired += subShader.Passes.Count;
}
if( !foundMainPass && foundFirstVisible )
{
mainSubShaderIdx = firstVisibleSubShaderId;
mainPassIdx = firstVisiblePassId;
}
for( int subShaderIdx = 0; subShaderIdx < subShaderCount; subShaderIdx++ )
{
int passCount = m_subShaders[ subShaderIdx ].Passes.Count;
for( int passIdx = 0; passIdx < passCount; passIdx++ )
{
m_subShaders[ subShaderIdx ].Passes[ passIdx ].IsMainPass = ( mainSubShaderIdx == subShaderIdx && mainPassIdx == passIdx );
}
}
duplicatesHelper.Clear();
duplicatesHelper = null;
m_isSinglePass = ( m_subShaders.Count == 1 && m_subShaders[ 0 ].PassAmount == 1 );
}
public void ResetState()
{
m_templateIdManager.ResetRegistersState();
int subshaderCount = m_subShaders.Count;
for( int subShaderIdx = 0; subShaderIdx < subshaderCount; subShaderIdx++ )
{
m_subShaders[ subShaderIdx ].TemplateProperties.ResetTemplateUsageData();
int passCount = m_subShaders[ subShaderIdx ].Passes.Count;
for( int passIdx = 0; passIdx < passCount; passIdx++ )
{
m_subShaders[ subShaderIdx ].Passes[ passIdx ].TemplateProperties.ResetTemplateUsageData();
}
}
}
public override void Destroy()
{
m_templateProperties.Destroy();
m_templateProperties = null;
m_availableShaderProperties.Clear();
m_availableShaderProperties = null;
int subShaderCount = m_subShaders.Count;
for( int i = 0; i < subShaderCount; i++ )
{
m_subShaders[ i ].Destroy();
}
m_subShaders.Clear();
m_subShaders = null;
m_templateIdManager.Destroy();
m_templateIdManager = null;
}
public void SetSubShaderData( TemplateModuleDataType type, int subShaderId, string[] list )
{
string id = GetSubShaderDataId( type, subShaderId, false );
string body = string.Empty;
FillTemplateBody( subShaderId, -1, id, ref body, list );
SetSubShaderData( type, subShaderId, body );
}
public void SetSubShaderData( TemplateModuleDataType type, int subShaderId, List<PropertyDataCollector> list )
{
string id = GetSubShaderDataId( type, subShaderId, false );
string body = string.Empty;
FillTemplateBody( subShaderId, -1, id, ref body, list );
SetSubShaderData( type, subShaderId, body );
}
public void SetSubShaderData( TemplateModuleDataType type, int subShaderId, string text )
{
if( subShaderId >= m_subShaders.Count )
return;
string prefix = m_subShaders[ subShaderId ].Modules.UniquePrefix;
switch( type )
{
case TemplateModuleDataType.AllModules:
{
m_templateIdManager.SetReplacementText( prefix + TemplatesManager.TemplateAllModulesTag, text );
}
break;
case TemplateModuleDataType.ModuleShaderModel:
{
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.ShaderModel.Id, text );
}
break;
case TemplateModuleDataType.ModuleBlendMode:
{
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.BlendData.BlendModeId, text );
}
break;
case TemplateModuleDataType.ModuleBlendOp:
{
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.BlendData.BlendOpId, text );
}break;
case TemplateModuleDataType.ModuleAlphaToMask:
{
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.BlendData.AlphaToMaskId, text );
}
break;
case TemplateModuleDataType.ModuleCullMode:
{
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.CullModeData.CullModeId, text );
}
break;
case TemplateModuleDataType.ModuleColorMask:
{
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.ColorMaskData.ColorMaskId, text );
}
break;
case TemplateModuleDataType.ModuleStencil:
{
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.StencilData.StencilBufferId, text );
}
break;
case TemplateModuleDataType.ModuleZwrite:
{
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.DepthData.ZWriteModeId, text );
}
break;
case TemplateModuleDataType.ModuleZTest:
{
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.DepthData.ZTestModeId, text );
}
break;
case TemplateModuleDataType.ModuleZOffset:
{
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.DepthData.OffsetId, text );
}
break;
case TemplateModuleDataType.ModuleTag:
{
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.TagData.TagsId, text );
}
break;
case TemplateModuleDataType.ModuleGlobals:
{
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.GlobalsTag.Id, text );
}
break;
case TemplateModuleDataType.ModuleFunctions:
{
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.FunctionsTag.Id, text );
}
break;
case TemplateModuleDataType.ModulePragma:
{
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.PragmaTag.Id, text );
}
break;
case TemplateModuleDataType.ModulePass:
{
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.PassTag.Id, text );
}
break;
case TemplateModuleDataType.ModuleInputVert:
{
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.InputsVertTag.Id, text );
}
break;
case TemplateModuleDataType.ModuleInputFrag:
{
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.InputsFragTag.Id, text );
}
break;
}
}
public void SetPropertyData( string[] properties )
{
string body = string.Empty;
FillTemplateBody( -1, -1, TemplatesManager.TemplatePropertyTag, ref body, properties );
SetPropertyData( body );
}
public void SetPropertyData( string text )
{
m_templateIdManager.SetReplacementText( m_propertyTag.Id, text );
}
public string GetSubShaderDataId( TemplateModuleDataType type, int subShaderId, bool addPrefix )
{
if ( subShaderId >= m_subShaders.Count )
return string.Empty;
string prefix = string.Empty;
switch ( type )
{
case TemplateModuleDataType.AllModules:
{
prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty;
return prefix + TemplatesManager.TemplateAllModulesTag;
}
case TemplateModuleDataType.ModuleBlendMode:
{
prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty;
return prefix + m_subShaders[ subShaderId ].Modules.BlendData.BlendModeId;
}
case TemplateModuleDataType.ModuleBlendOp:
{
prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty;
return prefix + m_subShaders[ subShaderId ].Modules.BlendData.BlendOpId;
}
case TemplateModuleDataType.ModuleAlphaToMask:
{
prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty;
return prefix + m_subShaders[ subShaderId ].Modules.BlendData.AlphaToMaskId;
}
case TemplateModuleDataType.ModuleCullMode:
{
prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty;
return prefix + m_subShaders[ subShaderId ].Modules.CullModeData.CullModeId;
}
case TemplateModuleDataType.ModuleColorMask:
{
prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty;
return prefix + m_subShaders[ subShaderId ].Modules.ColorMaskData.ColorMaskId;
}
case TemplateModuleDataType.ModuleStencil:
{
prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty;
return prefix + m_subShaders[ subShaderId ].Modules.StencilData.StencilBufferId;
}
case TemplateModuleDataType.ModuleZwrite:
{
prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty;
return prefix + m_subShaders[ subShaderId ].Modules.DepthData.ZWriteModeId;
}
case TemplateModuleDataType.ModuleZTest:
{
prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty;
return prefix + m_subShaders[ subShaderId ].Modules.DepthData.ZTestModeId;
}
case TemplateModuleDataType.ModuleZOffset:
{
prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty;
return prefix + m_subShaders[ subShaderId ].Modules.DepthData.OffsetId;
}
case TemplateModuleDataType.ModuleTag:
{
prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty;
return prefix + m_subShaders[ subShaderId ].Modules.TagData.TagsId;
}
case TemplateModuleDataType.ModuleGlobals:
{
prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty;
return prefix + m_subShaders[ subShaderId ].Modules.GlobalsTag.Id;
}
case TemplateModuleDataType.ModuleFunctions:
{
prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty;
return prefix + m_subShaders[ subShaderId ].Modules.FunctionsTag.Id;
}
case TemplateModuleDataType.ModulePragma:
{
prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty;
return prefix + m_subShaders[ subShaderId ].Modules.PragmaTag.Id;
}
case TemplateModuleDataType.ModulePass:
{
prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty;
return prefix + m_subShaders[ subShaderId ].Modules.PassTag.Id;
}
case TemplateModuleDataType.ModuleInputVert:
{
prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty;
return prefix + m_subShaders[ subShaderId ].Modules.InputsVertTag.Id;
}
case TemplateModuleDataType.ModuleInputFrag:
{
prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty;
return prefix + m_subShaders[ subShaderId ].Modules.InputsFragTag.Id;
}
}
return string.Empty;
}
public string GetPassDataId( TemplateModuleDataType type, int subShaderId, int passId, bool addPrefix )
{
if( subShaderId >= m_subShaders.Count || passId >= m_subShaders[ subShaderId ].Passes.Count )
return string.Empty;
string prefix = string.Empty;
switch( type )
{
case TemplateModuleDataType.AllModules:
{
prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty;
return prefix + TemplatesManager.TemplateAllModulesTag;
}
case TemplateModuleDataType.ModuleBlendMode:
{
prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty;
return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.BlendData.BlendModeId;
}
case TemplateModuleDataType.ModuleBlendOp:
{
prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty;
return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.BlendData.BlendOpId;
}
case TemplateModuleDataType.ModuleAlphaToMask:
{
prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty;
return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.BlendData.AlphaToMaskId;
}
case TemplateModuleDataType.ModuleCullMode:
{
prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty;
return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.CullModeData.CullModeId;
}
case TemplateModuleDataType.ModuleColorMask:
{
prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty;
return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.ColorMaskData.ColorMaskId;
}
case TemplateModuleDataType.ModuleStencil:
{
prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty;
return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.StencilData.StencilBufferId;
}
case TemplateModuleDataType.ModuleZwrite:
{
prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty;
return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.DepthData.ZWriteModeId;
}
case TemplateModuleDataType.ModuleZTest:
{
prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty;
return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.DepthData.ZTestModeId;
}
case TemplateModuleDataType.ModuleZOffset:
{
prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty;
return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.DepthData.OffsetId;
}
case TemplateModuleDataType.ModuleTag:
{
prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty;
return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.TagData.TagsId;
}
case TemplateModuleDataType.ModuleGlobals:
{
prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty;
return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.GlobalsTag.Id;
}
case TemplateModuleDataType.ModuleFunctions:
{
prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty;
return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.FunctionsTag.Id;
}
case TemplateModuleDataType.ModulePragma:
{
prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty;
return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.PragmaTag.Id;
}
case TemplateModuleDataType.ModulePass:
{
prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty;
return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.PassTag.Id;
}
case TemplateModuleDataType.ModuleInputVert:
{
prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty;
return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.InputsVertTag.Id;
}
case TemplateModuleDataType.ModuleInputFrag:
{
prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty;
return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.InputsFragTag.Id;
}
case TemplateModuleDataType.PassVertexFunction:
{
prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix : string.Empty;
return prefix + m_subShaders[ subShaderId ].Passes[ passId ].VertexFunctionData.Id;
}
case TemplateModuleDataType.PassFragmentFunction:
{
prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix : string.Empty;
return prefix + m_subShaders[ subShaderId ].Passes[ passId ].FragmentFunctionData.Id;
}
case TemplateModuleDataType.PassVertexData:
{
prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix : string.Empty;
return prefix + m_subShaders[ subShaderId ].Passes[ passId ].VertexDataContainer.VertexDataId;
}
case TemplateModuleDataType.PassInterpolatorData:
{
prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix: string.Empty;
return prefix + m_subShaders[ subShaderId ].Passes[ passId ].InterpolatorDataContainer.InterpDataId;
}
}
return string.Empty;
}
public void SetPassData( TemplateModuleDataType type, int subShaderId, int passId, string[] list )
{
//if( list == null || list.Length == 0 )
// return;
string id = GetPassDataId( type, subShaderId, passId ,false);
string body = string.Empty;
FillTemplateBody( subShaderId, passId, id, ref body, list );
SetPassData( type, subShaderId, passId, body );
}
public void SetPassData( TemplateModuleDataType type, int subShaderId, int passId, List<PropertyDataCollector> list )
{
//if( list == null || list.Count == 0 )
// return;
string id = GetPassDataId( type, subShaderId, passId, false);
string body = string.Empty;
FillTemplateBody( subShaderId, passId, id, ref body, list );
SetPassData( type, subShaderId, passId, body );
}
public void SetPassData( TemplateModuleDataType type, int subShaderId, int passId, string text )
{
if( subShaderId >= m_subShaders.Count || passId >= m_subShaders[ subShaderId ].Passes.Count )
return;
string prefix = string.Empty;
switch( type )
{
//case TemplateModuleDataType.EndPass:
//{
// prefix = m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix;
// m_templateIdManager.SetReplacementText( prefix + TemplatesManager.TemplateEndPassTag, text );
//}
//break;
case TemplateModuleDataType.AllModules:
{
prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix;
m_templateIdManager.SetReplacementText( prefix + TemplatesManager.TemplateAllModulesTag, text );
}
break;
case TemplateModuleDataType.ModuleShaderModel:
{
prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix;
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.ShaderModel.Id, text );
}
break;
case TemplateModuleDataType.ModuleBlendMode:
{
prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix;
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.BlendData.BlendModeId, text );
}
break;
case TemplateModuleDataType.ModuleBlendOp:
{
prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix;
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.BlendData.BlendOpId, text );
}
break;
case TemplateModuleDataType.ModuleAlphaToMask:
{
prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix;
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.BlendData.AlphaToMaskId, text );
}
break;
case TemplateModuleDataType.ModuleCullMode:
{
prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix;
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.CullModeData.CullModeId, text );
}
break;
case TemplateModuleDataType.ModuleColorMask:
{
prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix;
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.ColorMaskData.ColorMaskId, text );
}
break;
case TemplateModuleDataType.ModuleStencil:
{
prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix;
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.StencilData.StencilBufferId, text );
}
break;
case TemplateModuleDataType.ModuleZwrite:
{
prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix;
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.DepthData.ZWriteModeId, text );
}
break;
case TemplateModuleDataType.ModuleZTest:
{
prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix;
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.DepthData.ZTestModeId, text );
}
break;
case TemplateModuleDataType.ModuleZOffset:
{
prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix;
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.DepthData.OffsetId, text );
}
break;
case TemplateModuleDataType.ModuleTag:
{
prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix;
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.TagData.TagsId, text );
}
break;
case TemplateModuleDataType.ModuleGlobals:
{
prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix;
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.GlobalsTag.Id, text );
}
break;
case TemplateModuleDataType.ModuleFunctions:
{
prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix;
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.FunctionsTag.Id, text );
}
break;
case TemplateModuleDataType.ModulePragma:
{
prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix;
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.PragmaTag.Id, text );
}
break;
case TemplateModuleDataType.ModulePass:
{
prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix;
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.PassTag.Id, text );
}
break;
case TemplateModuleDataType.ModuleInputVert:
{
prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix;
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.InputsVertTag.Id, text );
}
break;
case TemplateModuleDataType.ModuleInputFrag:
{
prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix;
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.InputsFragTag.Id, text );
}
break;
case TemplateModuleDataType.PassVertexFunction:
{
prefix = m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix;
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].VertexFunctionData.Id, text );
}
break;
case TemplateModuleDataType.PassFragmentFunction:
{
prefix = m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix;
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].FragmentFunctionData.Id, text );
}
break;
case TemplateModuleDataType.PassVertexData:
{
prefix = m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix;
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].VertexDataContainer.VertexDataId, text );
}
break;
case TemplateModuleDataType.PassInterpolatorData:
{
prefix = m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix;
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].InterpolatorDataContainer.InterpDataId, text );
}
break;
case TemplateModuleDataType.PassNameData:
{
prefix = m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix;
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].PassNameContainer.Id, text );
}
break;
}
}
public void SetPassInputData( int subShaderId, int passId, int inputId, string text )
{
if( subShaderId >= m_subShaders.Count ||
passId >= m_subShaders[ subShaderId ].Passes.Count ||
inputId >= m_subShaders[ subShaderId ].Passes[ passId ].InputDataList.Count )
return;
string prefix = m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix;
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].InputDataFromId( inputId ).TagId, text );
}
public void SetPassInputDataByArrayIdx( int subShaderId, int passId, int inputId, string text )
{
if( subShaderId >= m_subShaders.Count ||
passId >= m_subShaders[ subShaderId ].Passes.Count ||
inputId >= m_subShaders[ subShaderId ].Passes[ passId ].InputDataList.Count )
return;
string prefix = m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix;
m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].InputDataList[ inputId ].TagId, text );
}
public TemplateData CreateTemplateData( string name, string guid, int subShaderId, int passId )
{
if( subShaderId >= m_subShaders.Count ||
passId >= m_subShaders[ subShaderId ].Passes.Count )
return null;
if( string.IsNullOrEmpty( name ) )
name = m_defaultShaderName;
TemplateData templateData = ScriptableObject.CreateInstance<TemplateData>();
templateData.Name = name;
templateData.GUID = guid;
templateData.TemplateBody = m_shaderBody;
templateData.DefaultShaderName = m_defaultShaderName;
templateData.ShaderNameId = m_shaderNameId;
templateData.OrderId = m_orderId;
templateData.InputDataList = SubShaders[ subShaderId ].Passes[ passId ].InputDataList;
templateData.VertexDataContainer = SubShaders[ subShaderId ].Passes[ passId ].VertexDataContainer;
templateData.InterpolatorDataContainer = SubShaders[ subShaderId ].Passes[ passId ].InterpolatorDataContainer;
templateData.AvailableShaderProperties = m_availableShaderProperties;
templateData.VertexFunctionData = SubShaders[ subShaderId ].Passes[ passId ].VertexFunctionData;
templateData.FragmentFunctionData = SubShaders[ subShaderId ].Passes[ passId ].FragmentFunctionData;
templateData.BlendData = SubShaders[ subShaderId ].Passes[ passId ].Modules.BlendData;
templateData.CullModeData = SubShaders[ subShaderId ].Passes[ passId ].Modules.CullModeData;
templateData.ColorMaskData = SubShaders[ subShaderId ].Passes[ passId ].Modules.ColorMaskData;
templateData.StencilData = SubShaders[ subShaderId ].Passes[ passId ].Modules.StencilData;
templateData.DepthData = SubShaders[ subShaderId ].Passes[ passId ].Modules.DepthData;
templateData.TagData = SubShaders[ subShaderId ].Passes[ passId ].Modules.TagData;
//templateData.PropertyList = m_pr;
//private Dictionary<string, TemplateProperty> m_propertyDict = new Dictionary<string, TemplateProperty>();
return templateData;
}
public bool FillTemplateBody( int subShaderId, int passId, string id, ref string body, List<PropertyDataCollector> values )
{
if( values.Count == 0 )
{
return true;
}
string[] array = new string[ values.Count ];
for( int i = 0; i < values.Count; i++ )
{
array[ i ] = values[ i ].PropertyName;
}
return FillTemplateBody( subShaderId, passId, id, ref body, array );
}
public bool FillTemplateBody( int subShaderId, int passId, string id, ref string body, params string[] values )
{
if( values.Length == 0 )
{
if( id[ id.Length - 1] == '\n' )
body = "\n";
return true;
}
TemplatePropertyContainer propertyContainer = null;
if( subShaderId >= 0 )
{
if( passId >= 0 )
{
propertyContainer = SubShaders[ subShaderId ].Passes[ passId ].TemplateProperties;
}
else
{
propertyContainer = SubShaders[ subShaderId ].TemplateProperties;
}
}
else
{
propertyContainer = m_templateProperties;
}
propertyContainer.BuildInfo();
if( propertyContainer.PropertyDict.ContainsKey( id ) )
{
string finalValue = propertyContainer.PropertyDict[ id ].UseIndentationAtStart? propertyContainer.PropertyDict[ id ].Indentation:string.Empty;
for( int i = 0; i < values.Length; i++ )
{
if( propertyContainer.PropertyDict[ id ].AutoLineFeed )
{
string[] valuesArr = values[ i ].Split( '\n' );
for( int j = 0; j < valuesArr.Length; j++ )
{
//first value will be automatically indented by the string replace
finalValue += ( ( i == 0 && j == 0 ) ? string.Empty : propertyContainer.PropertyDict[ id ].Indentation ) + valuesArr[ j ];
finalValue += TemplatesManager.TemplateNewLine;
}
}
else
{
//first value will be automatically indented by the string replace
finalValue += ( i == 0 ? string.Empty : propertyContainer.PropertyDict[ id ].Indentation ) + values[ i ];
}
}
body = finalValue;
propertyContainer.PropertyDict[ id ].Used = true;
return true;
}
if( values.Length > 1 || !string.IsNullOrEmpty( values[ 0 ] ) )
{
UIUtils.ShowMessage( string.Format( "Attempting to write data into inexistant tag {0}. Please review the template {1} body and consider adding the missing tag.", id, m_defaultShaderName ), MessageSeverity.Error );
return false;
}
return true;
}
public bool FillVertexInstructions( int subShaderId, int passId, params string[] values )
{
TemplateFunctionData vertexFunctionData = SubShaders[ subShaderId ].Passes[ passId ].VertexFunctionData;
if( vertexFunctionData != null && !string.IsNullOrEmpty( vertexFunctionData.Id ) )
{
string body = string.Empty;
bool isValid = FillTemplateBody( subShaderId, passId, vertexFunctionData.Id, ref body, values );
SetPassData( TemplateModuleDataType.PassVertexFunction, subShaderId, passId, body );
return isValid;
}
if( values.Length > 0 )
{
UIUtils.ShowMessage( "Attemping to add vertex instructions on a template with no assigned vertex code area", MessageSeverity.Error );
return false;
}
return true;
}
public bool FillFragmentInstructions( int subShaderId, int passId, params string[] values )
{
TemplateFunctionData fragmentFunctionData = SubShaders[ subShaderId ].Passes[ passId ].FragmentFunctionData;
if( fragmentFunctionData != null && !string.IsNullOrEmpty( fragmentFunctionData.Id ) )
{
string body = string.Empty;
bool isValid = FillTemplateBody( subShaderId, passId, fragmentFunctionData.Id, ref body, values );
SetPassData( TemplateModuleDataType.PassFragmentFunction, subShaderId, passId, body );
return isValid;
}
if( values.Length > 0 )
{
UIUtils.ShowMessage( "Attemping to add fragment instructions on a template with no assigned vertex code area", MessageSeverity.Error );
return false;
}
return true;
}
public void SetShaderName( string name )
{
m_templateIdManager.SetReplacementText( m_shaderNameId, name );
}
public void SetCustomInspector( string customInspector )
{
if( m_customInspectorContainer.Index > -1 )
{
m_templateIdManager.SetReplacementText( m_customInspectorContainer.Id, m_templateProperties.PropertyDict[ m_customInspectorContainer.Id ].Indentation + customInspector );
}
}
public void SetFallback( string fallback )
{
if( m_fallbackContainer.Index > -1 )
{
m_templateIdManager.SetReplacementText( m_fallbackContainer.Id, m_templateProperties.PropertyDict[ m_fallbackContainer.Id ].Indentation + fallback );
}
}
public void SetDependencies( string dependencies )
{
if( m_dependenciesContainer.Index > -1 )
{
m_templateIdManager.SetReplacementText( m_dependenciesContainer.Id, dependencies );
}
}
private void OnEnable()
{
hideFlags = HideFlags.HideAndDontSave;
}
public override bool Reload()
{
m_propertyTag = null;
m_shaderNameId = string.Empty;
m_shaderBody = string.Empty;
m_isSinglePass = false;
m_masterNodesRequired = 0;
m_customInspectorContainer.Reset();
m_fallbackContainer.Reset();
m_dependenciesContainer.Reset();
m_availableShaderProperties.Clear();
int count = m_subShaders.Count;
for( int i = 0; i < count; i++ )
{
m_subShaders[ i ].Destroy();
}
m_subShaders.Clear();
m_templateIdManager.Reset();
if( m_shaderData != null )
m_shaderData.Destroy();
m_templateProperties.Reset();
string oldName = m_defaultShaderName;
LoadTemplateBody( m_guid );
if( m_communityTemplate )
Name = m_defaultShaderName;
return !oldName.Equals( m_defaultShaderName );
}
public TemplateSRPType SRPtype { get { return m_subShaders[ 0 ].Modules.SRPType; } }
//public bool SRPIsPBRHD { get { return m_subShaders[0].Modules.SRPIsPBRHD ; } }
public List<TemplateSubShader> SubShaders { get { return m_subShaders; } }
public List<TemplateShaderPropertyData> AvailableShaderProperties { get { return m_availableShaderProperties; } }
public TemplateTagData PropertyTag { get { return m_propertyTag; } }
public TemplateIdManager IdManager { get { return m_templateIdManager; } }
public TemplatePropertyContainer TemplateProperties { get { return m_templateProperties; } }
public TemplateInfoContainer CustomInspectorContainer { get { return m_customInspectorContainer; } }
public TemplateInfoContainer FallbackContainer { get { return m_fallbackContainer; } }
public bool IsSinglePass { get { return m_isSinglePass; } }
public int MasterNodesRequired { get { return m_masterNodesRequired; } }
}
}