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