diff options
Diffstat (limited to 'Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMasterNode.cs')
-rw-r--r-- | Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMasterNode.cs | 750 |
1 files changed, 750 insertions, 0 deletions
diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMasterNode.cs b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMasterNode.cs new file mode 100644 index 00000000..6d6c1de9 --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMasterNode.cs @@ -0,0 +1,750 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda <info@amplify.pt> + +// THIS FILE IS DEPRECATED AND SHOULD NOT BE USED + +#define SHOW_TEMPLATE_HELP_BOX + +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Template Master Node", "Master", "Shader Generated according to template rules", null, KeyCode.None, false, true, "Template MultiPass Master Node", typeof( TemplateMultiPassMasterNode ) )] + public sealed class TemplateMasterNode : MasterNode + { + private const string WarningMessage = "Templates is a feature that is still heavily under development and users may experience some problems.\nPlease email support@amplify.pt if any issue occurs."; + private const string CurrentTemplateLabel = "Current Template"; + private const string OpenTemplateStr = "Edit Template"; + + //protected const string SnippetsFoldoutStr = " Snippets"; + //[SerializeField] + //private bool m_snippetsFoldout = true; + + [NonSerialized] + private TemplateData m_currentTemplate = null; + + private bool m_fireTemplateChange = false; + private bool m_fetchMasterNodeCategory = false; + private bool m_reRegisterTemplateData = false; + + [SerializeField] + private string m_templateGUID = string.Empty; + + [SerializeField] + private string m_templateName = string.Empty; + + [SerializeField] + private TemplatesBlendModule m_blendOpHelper = new TemplatesBlendModule(); + + [SerializeField] + private TemplateCullModeModule m_cullModeHelper = new TemplateCullModeModule(); + + [SerializeField] + private TemplateColorMaskModule m_colorMaskHelper = new TemplateColorMaskModule(); + + [SerializeField] + private TemplatesStencilBufferModule m_stencilBufferHelper = new TemplatesStencilBufferModule(); + + [SerializeField] + private TemplateDepthModule m_depthOphelper = new TemplateDepthModule(); + + [SerializeField] + private TemplateTagsModule m_tagsHelper = new TemplateTagsModule(); + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_masterNodeCategory = 1;// First Template + m_marginPreviewLeft = 20; + m_insideSize.y = 60; + m_customPrecision = true; + } + + public override void ReleaseResources() + { + if( m_currentTemplate != null && m_currentTemplate.AvailableShaderProperties != null ) + { + // Unregister old template properties + int oldPropertyCount = m_currentTemplate.AvailableShaderProperties.Count; + for( int i = 0; i < oldPropertyCount; i++ ) + { + UIUtils.ReleaseUniformName( UniqueId, m_currentTemplate.AvailableShaderProperties[ i ].PropertyName ); + } + } + } + + public override void OnEnable() + { + base.OnEnable(); + m_reRegisterTemplateData = true; + } + + void FetchInfoFromTemplate() + { + if( m_currentTemplate.BlendData.DataCheck == TemplateDataCheck.Valid ) + m_blendOpHelper.ConfigureFromTemplateData( m_currentTemplate.BlendData ); + + if( m_currentTemplate.CullModeData.DataCheck == TemplateDataCheck.Valid ) + m_cullModeHelper.ConfigureFromTemplateData( m_currentTemplate.CullModeData ); + + if( m_currentTemplate.ColorMaskData.DataCheck == TemplateDataCheck.Valid ) + m_colorMaskHelper.ConfigureFromTemplateData( m_currentTemplate.ColorMaskData ); + + if( m_currentTemplate.StencilData.DataCheck == TemplateDataCheck.Valid ) + m_stencilBufferHelper.ConfigureFromTemplateData( m_currentTemplate.StencilData ); + + if( m_currentTemplate.DepthData.DataCheck == TemplateDataCheck.Valid ) + m_depthOphelper.ConfigureFromTemplateData( m_currentTemplate.DepthData ); + + if( m_currentTemplate.TagData.DataCheck == TemplateDataCheck.Valid ) + m_tagsHelper.ConfigureFromTemplateData( m_currentTemplate.TagData ); + } + + void FetchCurrentTemplate() + { + m_currentTemplate = m_containerGraph.ParentWindow.TemplatesManagerInstance.GetTemplate( m_templateGUID ) as TemplateData; + if( m_currentTemplate == null ) + { + m_currentTemplate = m_containerGraph.ParentWindow.TemplatesManagerInstance.GetTemplate( m_templateName ) as TemplateData; + } + + if( m_currentTemplate != null ) + { + if( m_inputPorts.Count != m_currentTemplate.InputDataList.Count ) + { + DeleteAllInputConnections( true ); + + List<TemplateInputData> inputDataList = m_currentTemplate.InputDataList; + int count = inputDataList.Count; + for( int i = 0; i < count; i++ ) + { + AddInputPort( inputDataList[ i ].DataType, false, inputDataList[ i ].PortName, inputDataList[ i ].OrderId, inputDataList[ i ].PortCategory, inputDataList[ i ].PortUniqueId ); + } + FetchInfoFromTemplate(); + } + else + { + List<TemplateInputData> inputDataList = m_currentTemplate.InputDataList; + int count = inputDataList.Count; + for( int i = 0; i < count; i++ ) + { + m_inputPorts[ i ].ChangeProperties( inputDataList[ i ].PortName, inputDataList[ i ].DataType, false ); + } + } + } + } + + public override void RefreshAvailableCategories() + { + FetchCurrentTemplate(); + + int templateCount = m_containerGraph.ParentWindow.TemplatesManagerInstance.TemplateCount; + m_availableCategories = new MasterNodeCategoriesData[ templateCount + 1 ]; + m_availableCategoryLabels = new GUIContent[ templateCount + 1 ]; + + m_availableCategories[ 0 ] = new MasterNodeCategoriesData( AvailableShaderTypes.SurfaceShader, string.Empty ); + m_availableCategoryLabels[ 0 ] = new GUIContent( "Surface" ); + if( m_currentTemplate == null ) + { + m_masterNodeCategory = -1; + } + + for( int i = 0; i < templateCount; i++ ) + { + int idx = i + 1; + TemplateData templateData = m_containerGraph.ParentWindow.TemplatesManagerInstance.GetTemplate( i ) as TemplateData; + + if( m_currentTemplate != null && m_currentTemplate.GUID.Equals( templateData.GUID ) ) + m_masterNodeCategory = idx; + + m_availableCategories[ idx ] = new MasterNodeCategoriesData( AvailableShaderTypes.Template, templateData.GUID ); + m_availableCategoryLabels[ idx ] = new GUIContent( templateData.Name ); + } + } + + void SetCategoryIdxFromTemplate() + { + int templateCount = m_containerGraph.ParentWindow.TemplatesManagerInstance.TemplateCount; + for( int i = 0; i < templateCount; i++ ) + { + int idx = i + 1; + TemplateData templateData = m_containerGraph.ParentWindow.TemplatesManagerInstance.GetTemplate( i ) as TemplateData; + if( templateData != null && m_currentTemplate != null && m_currentTemplate.GUID.Equals( templateData.GUID ) ) + m_masterNodeCategory = idx; + } + } + + public void SetTemplate( TemplateData newTemplate, bool writeDefaultData, bool fetchMasterNodeCategory ) + { + ReleaseResources(); + + if( newTemplate == null || newTemplate.InputDataList == null ) + return; + + m_fetchMasterNodeCategory = fetchMasterNodeCategory; + + DeleteAllInputConnections( true ); + m_currentTemplate = newTemplate; + m_currentShaderData = newTemplate.Name; + + List<TemplateInputData> inputDataList = newTemplate.InputDataList; + int count = inputDataList.Count; + for( int i = 0; i < count; i++ ) + { + AddInputPort( inputDataList[ i ].DataType, false, inputDataList[ i ].PortName, inputDataList[ i ].OrderId, inputDataList[ i ].PortCategory, inputDataList[ i ].PortUniqueId ); + } + + if( writeDefaultData ) + { + ShaderName = newTemplate.DefaultShaderName; + } + + RegisterProperties(); + m_fireTemplateChange = true; + m_templateGUID = newTemplate.GUID; + m_templateName = newTemplate.DefaultShaderName; + FetchInfoFromTemplate(); + } + + void RegisterProperties() + { + if( m_currentTemplate != null ) + { + m_reRegisterTemplateData = false; + // Register old template properties + int newPropertyCount = m_currentTemplate.AvailableShaderProperties.Count; + for( int i = 0; i < newPropertyCount; i++ ) + { + int nodeId = UIUtils.CheckUniformNameOwner( m_currentTemplate.AvailableShaderProperties[ i ].PropertyName ); + if( nodeId > -1 ) + { + ParentNode node = m_containerGraph.GetNode( nodeId ); + if( node != null ) + { + UIUtils.ShowMessage( string.Format( "Template requires property name {0} which is currently being used by {1}. Please rename it and reload template.", m_currentTemplate.AvailableShaderProperties[ i ].PropertyName, node.Attributes.Name ) ); + } + else + { + UIUtils.ShowMessage( string.Format( "Template requires property name {0} which is currently being on your graph. Please rename it and reload template.", m_currentTemplate.AvailableShaderProperties[ i ].PropertyName ) ); + } + } + else + { + UIUtils.RegisterUniformName( UniqueId, m_currentTemplate.AvailableShaderProperties[ i ].PropertyName ); + } + } + } + } + + public override void DrawProperties() + { + if( m_currentTemplate == null ) + return; + + base.DrawProperties(); + + bool generalIsVisible = ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedGeneralShaderOptions; + NodeUtils.DrawPropertyGroup( ref generalIsVisible, GeneralFoldoutStr, DrawGeneralOptions ); + ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedGeneralShaderOptions = generalIsVisible; + if( m_currentTemplate.BlendData.DataCheck == TemplateDataCheck.Valid ) + m_blendOpHelper.Draw( this ); + + + if( m_currentTemplate.StencilData.DataCheck == TemplateDataCheck.Valid ) + { + CullMode cullMode = ( m_currentTemplate.CullModeData.DataCheck == TemplateDataCheck.Valid ) ? m_cullModeHelper.CurrentCullMode : CullMode.Back; + m_stencilBufferHelper.Draw( this, cullMode ); + } + + if( m_currentTemplate.DepthData.DataCheck == TemplateDataCheck.Valid ) + m_depthOphelper.Draw( this ); + + if( m_currentTemplate.TagData.DataCheck == TemplateDataCheck.Valid ) + m_tagsHelper.Draw( this ); + + DrawMaterialInputs( UIUtils.MenuItemToolbarStyle ); + + // NodeUtils.DrawPropertyGroup( ref m_snippetsFoldout, SnippetsFoldoutStr, DrawSnippetOptions ); + if( GUILayout.Button( OpenTemplateStr ) && m_currentTemplate != null ) + { + try + { + string pathname = AssetDatabase.GUIDToAssetPath( m_currentTemplate.GUID ); + if( !string.IsNullOrEmpty( pathname ) ) + { + Shader selectedTemplate = AssetDatabase.LoadAssetAtPath<Shader>( pathname ); + if( selectedTemplate != null ) + { + AssetDatabase.OpenAsset( selectedTemplate, 1 ); + } + } + } + catch( Exception e ) + { + Debug.LogException( e ); + } + } + +#if SHOW_TEMPLATE_HELP_BOX + EditorGUILayout.HelpBox( WarningMessage, MessageType.Warning ); +#endif + + } + + public void DrawGeneralOptions() + { + DrawShaderName(); + DrawCurrentShaderType(); + EditorGUI.BeginChangeCheck(); + DrawPrecisionProperty( false ); + if( EditorGUI.EndChangeCheck() ) + ContainerGraph.CurrentPrecision = m_currentPrecisionType; + + if( m_currentTemplate.CullModeData.DataCheck == TemplateDataCheck.Valid ) + m_cullModeHelper.Draw( this ); + + if( m_currentTemplate.ColorMaskData.DataCheck == TemplateDataCheck.Valid ) + m_colorMaskHelper.Draw( this ); + } + + //public void DrawSnippetOptions() + //{ + // m_currentTemplate.DrawSnippetProperties( this ); + //} + + bool CreateInstructionsForList( ref List<InputPort> ports, ref string shaderBody, ref List<string> vertexInstructions, ref List<string> fragmentInstructions ) + { + if( ports.Count == 0 ) + return true; + + bool isValid = true; + UIUtils.CurrentWindow.CurrentGraph.ResetNodesLocalVariables(); + for( int i = 0; i < ports.Count; i++ ) + { + TemplateInputData inputData = m_currentTemplate.InputDataFromId( ports[ i ].PortId ); + if( ports[ i ].IsConnected ) + { + m_currentDataCollector.ResetInstructions(); + m_currentDataCollector.ResetVertexInstructions(); + + m_currentDataCollector.PortCategory = ports[ i ].Category; + string newPortInstruction = ports[ i ].GeneratePortInstructions( ref m_currentDataCollector ); + + + if( m_currentDataCollector.DirtySpecialLocalVariables ) + { + string cleanVariables = m_currentDataCollector.SpecialLocalVariables.Replace( "\t", string.Empty ); + m_currentDataCollector.AddInstructions( cleanVariables, false ); + m_currentDataCollector.ClearSpecialLocalVariables(); + } + + if( m_currentDataCollector.DirtyVertexVariables ) + { + string cleanVariables = m_currentDataCollector.VertexLocalVariables.Replace( "\t", string.Empty ); + m_currentDataCollector.AddVertexInstruction( cleanVariables, UniqueId, false ); + m_currentDataCollector.ClearVertexLocalVariables(); + } + + // fill functions + for( int j = 0; j < m_currentDataCollector.InstructionsList.Count; j++ ) + { + fragmentInstructions.Add( m_currentDataCollector.InstructionsList[ j ].PropertyName ); + } + + for( int j = 0; j < m_currentDataCollector.VertexDataList.Count; j++ ) + { + vertexInstructions.Add( m_currentDataCollector.VertexDataList[ j ].PropertyName ); + } + + isValid = m_currentTemplate.FillTemplateBody( inputData.TagId, ref shaderBody, newPortInstruction ) && isValid; + } + else + { + isValid = m_currentTemplate.FillTemplateBody( inputData.TagId, ref shaderBody, inputData.DefaultValue ) && isValid; + } + } + return isValid; + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + + if( m_currentTemplate == null ) + { + FetchCurrentTemplate(); + } + + if( m_reRegisterTemplateData ) + { + RegisterProperties(); + } + + if( m_containerGraph.IsInstancedShader ) + { + DrawInstancedIcon( drawInfo ); + } + + if( m_fetchMasterNodeCategory ) + { + if( m_availableCategories != null ) + { + m_fetchMasterNodeCategory = false; + SetCategoryIdxFromTemplate(); + } + } + + if( m_fireTemplateChange ) + { + m_fireTemplateChange = false; + m_containerGraph.FireMasterNodeReplacedEvent(); + } + } + + public override void UpdateFromShader( Shader newShader ) + { + if( m_currentMaterial != null ) + { + m_currentMaterial.shader = newShader; + } + CurrentShader = newShader; + } + + public override void UpdateMasterNodeMaterial( Material material ) + { + m_currentMaterial = material; + FireMaterialChangedEvt(); + } + + public override Shader Execute( string pathname, bool isFullPath ) + { + if( m_currentTemplate == null ) + return m_currentShader; + + //Create data collector + ForceReordering(); + base.Execute( pathname, isFullPath ); + + SetupNodeCategories(); + + m_currentDataCollector.TemplateDataCollectorInstance.BuildFromTemplateData( m_currentDataCollector, m_currentTemplate ); + int shaderPropertiesAmount = m_currentTemplate.AvailableShaderProperties.Count; + for( int i = 0; i < shaderPropertiesAmount; i++ ) + { + m_currentDataCollector.SoftRegisterUniform( m_currentTemplate.AvailableShaderProperties[ i ] ); + } + m_containerGraph.CheckPropertiesAutoRegister( ref m_currentDataCollector ); + + //Sort ports by both + List<InputPort> fragmentPorts = new List<InputPort>(); + List<InputPort> vertexPorts = new List<InputPort>(); + SortInputPorts( ref vertexPorts, ref fragmentPorts ); + + string shaderBody = m_currentTemplate.TemplateBody; + + List<string> vertexInstructions = new List<string>(); + List<string> fragmentInstructions = new List<string>(); + + bool validBody = true; + + validBody = CreateInstructionsForList( ref fragmentPorts, ref shaderBody, ref vertexInstructions, ref fragmentInstructions ) && validBody; + ContainerGraph.ResetNodesLocalVariablesIfNot( MasterNodePortCategory.Vertex ); + validBody = CreateInstructionsForList( ref vertexPorts, ref shaderBody, ref vertexInstructions, ref fragmentInstructions ) && validBody; + + m_currentTemplate.ResetTemplateUsageData(); + + // Fill vertex interpolators assignment + for( int i = 0; i < m_currentDataCollector.VertexInterpDeclList.Count; i++ ) + { + vertexInstructions.Add( m_currentDataCollector.VertexInterpDeclList[ i ] ); + } + + vertexInstructions.AddRange( m_currentDataCollector.TemplateDataCollectorInstance.GetInterpUnusedChannels() ); + //Fill common local variables and operations + + validBody = m_currentTemplate.FillVertexInstructions( ref shaderBody, vertexInstructions.ToArray() ) && validBody; + validBody = m_currentTemplate.FillFragmentInstructions( ref shaderBody, fragmentInstructions.ToArray() ) && validBody; + + // Add Instanced Properties + if( m_containerGraph.IsInstancedShader ) + { + m_currentDataCollector.TabifyInstancedVars(); + m_currentDataCollector.InstancedPropertiesList.Insert( 0, new PropertyDataCollector( -1, string.Format( IOUtils.InstancedPropertiesBegin, UIUtils.RemoveInvalidCharacters( m_shaderName ) ) ) ); + m_currentDataCollector.InstancedPropertiesList.Add( new PropertyDataCollector( -1, IOUtils.InstancedPropertiesEnd ) ); + m_currentDataCollector.UniformsList.AddRange( m_currentDataCollector.InstancedPropertiesList ); + } + + //Add Functions + m_currentDataCollector.UniformsList.AddRange( m_currentDataCollector.FunctionsList ); + + // Fill common tags + m_currentDataCollector.IncludesList.AddRange( m_currentDataCollector.PragmasList ); + + validBody = m_currentTemplate.FillTemplateBody( m_currentTemplate.ShaderNameId, ref shaderBody, string.Format( TemplatesManager.NameFormatter, m_shaderName ) ) && validBody; + validBody = m_currentTemplate.FillTemplateBody( TemplatesManager.TemplatePassTag, ref shaderBody, m_currentDataCollector.GrabPassList ) && validBody; + validBody = m_currentTemplate.FillTemplateBody( TemplatesManager.TemplatePragmaTag, ref shaderBody, m_currentDataCollector.IncludesList ) && validBody; + //validBody = m_currentTemplate.FillTemplateBody( TemplatesManager.TemplateTagsTag, ref shaderBody, m_currentDataCollector.TagsList ) && validBody; + validBody = m_currentTemplate.FillTemplateBody( TemplatesManager.TemplatePropertyTag, ref shaderBody, m_currentDataCollector.BuildUnformatedPropertiesStringArr() ) && validBody; + validBody = m_currentTemplate.FillTemplateBody( TemplatesManager.TemplateGlobalsTag, ref shaderBody, m_currentDataCollector.UniformsList ) && validBody; + validBody = m_currentTemplate.FillTemplateBody( m_currentTemplate.VertexDataId, ref shaderBody, m_currentDataCollector.VertexInputList.ToArray() ) && validBody; + validBody = m_currentTemplate.FillTemplateBody( m_currentTemplate.InterpDataId, ref shaderBody, m_currentDataCollector.InterpolatorList.ToArray() ) && validBody; + + if( m_currentTemplate.BlendData.ValidBlendMode ) + { + validBody = m_currentTemplate.FillTemplateBody( m_currentTemplate.BlendData.BlendModeId, ref shaderBody, m_blendOpHelper.CurrentBlendFactor ) && validBody; + } + + if( m_currentTemplate.BlendData.ValidBlendOp ) + { + validBody = m_currentTemplate.FillTemplateBody( m_currentTemplate.BlendData.BlendOpId, ref shaderBody, m_blendOpHelper.CurrentBlendOp ) && validBody; + } + + if( m_currentTemplate.BlendData.ValidAlphaToMask ) + { + validBody = m_currentTemplate.FillTemplateBody( m_currentTemplate.BlendData.AlphaToMaskId, ref shaderBody, m_blendOpHelper.CurrentAlphaToMask ) && validBody; + } + + if( m_currentTemplate.DepthData.ValidZWrite ) + { + validBody = m_currentTemplate.FillTemplateBody( m_currentTemplate.DepthData.ZWriteModeId, ref shaderBody, m_depthOphelper.CurrentZWriteMode ) && validBody; + } + + if( m_currentTemplate.DepthData.ValidZTest ) + { + validBody = m_currentTemplate.FillTemplateBody( m_currentTemplate.DepthData.ZTestModeId, ref shaderBody, m_depthOphelper.CurrentZTestMode ) && validBody; + } + + if( m_currentTemplate.DepthData.ValidOffset ) + { + validBody = m_currentTemplate.FillTemplateBody( m_currentTemplate.DepthData.OffsetId, ref shaderBody, m_depthOphelper.CurrentOffset ) && validBody; + } + + if( m_currentTemplate.CullModeData.DataCheck == TemplateDataCheck.Valid ) + { + validBody = m_currentTemplate.FillTemplateBody( m_currentTemplate.CullModeData.CullModeId, ref shaderBody, m_cullModeHelper.GenerateShaderData(false) ) && validBody; + } + + if( m_currentTemplate.ColorMaskData.DataCheck == TemplateDataCheck.Valid ) + { + validBody = m_currentTemplate.FillTemplateBody( m_currentTemplate.ColorMaskData.ColorMaskId, ref shaderBody, m_colorMaskHelper.GenerateShaderData( false ) ) && validBody; + } + + if( m_currentTemplate.StencilData.DataCheck == TemplateDataCheck.Valid ) + { + CullMode cullMode = ( m_currentTemplate.CullModeData.DataCheck == TemplateDataCheck.Valid ) ? m_cullModeHelper.CurrentCullMode : CullMode.Back; + validBody = m_currentTemplate.FillTemplateBody( m_currentTemplate.StencilData.StencilBufferId, ref shaderBody, m_stencilBufferHelper.CreateStencilOp( cullMode ) ) && validBody; + } + + if( m_currentTemplate.TagData.DataCheck == TemplateDataCheck.Valid ) + { + validBody = m_currentTemplate.FillTemplateBody( m_currentTemplate.TagData.TagsId, ref shaderBody, m_tagsHelper.GenerateTags() ) && validBody; + } + + if( m_currentDataCollector.TemplateDataCollectorInstance.HasVertexInputParams ) + { + validBody = m_currentTemplate.FillTemplateBody( TemplatesManager.TemplateInputsVertParamsTag, ref shaderBody, m_currentDataCollector.TemplateDataCollectorInstance.VertexInputParamsStr ) && validBody; + } + + if( m_currentDataCollector.TemplateDataCollectorInstance.HasFragmentInputParams ) + { + validBody = m_currentTemplate.FillTemplateBody( TemplatesManager.TemplateInputsFragParamsTag, ref shaderBody, m_currentDataCollector.TemplateDataCollectorInstance.FragInputParamsStr ) && validBody; + } + + m_currentTemplate.FillEmptyTags( ref shaderBody ); + + //m_currentTemplate.InsertSnippets( ref shaderBody ); + + vertexInstructions.Clear(); + vertexInstructions = null; + + fragmentInstructions.Clear(); + fragmentInstructions = null; + if( validBody ) + { + UpdateShaderAsset( ref pathname, ref shaderBody, isFullPath ); + } + + return m_currentShader; + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + try + { + ShaderName = GetCurrentParam( ref nodeParams ); + if( m_shaderName.Length > 0 ) + ShaderName = UIUtils.RemoveShaderInvalidCharacters( ShaderName ); + + string templateGUID = GetCurrentParam( ref nodeParams ); + string templateShaderName = string.Empty; + if( UIUtils.CurrentShaderVersion() > 13601 ) + { + templateShaderName = GetCurrentParam( ref nodeParams ); + } + + TemplateData template = m_containerGraph.ParentWindow.TemplatesManagerInstance.GetTemplate( templateGUID ) as TemplateData; + if( template != null ) + { + SetTemplate( template, false, true ); + } + else + { + template = m_containerGraph.ParentWindow.TemplatesManagerInstance.GetTemplateByName( templateShaderName ) as TemplateData; + if( template != null ) + { + SetTemplate( template, false, true ); + } + else + { + m_masterNodeCategory = -1; + } + } + + if( UIUtils.CurrentShaderVersion() > 13902 ) + { + //BLEND MODULE + if( m_currentTemplate.BlendData.ValidBlendMode ) + { + m_blendOpHelper.ReadBlendModeFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + if( m_currentTemplate.BlendData.ValidBlendOp ) + { + m_blendOpHelper.ReadBlendOpFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + //CULL MODE + if( m_currentTemplate.CullModeData.DataCheck == TemplateDataCheck.Valid ) + { + m_cullModeHelper.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + //COLOR MASK + if( m_currentTemplate.ColorMaskData.DataCheck == TemplateDataCheck.Valid ) + { + m_colorMaskHelper.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + //STENCIL BUFFER + if( m_currentTemplate.StencilData.DataCheck == TemplateDataCheck.Valid ) + { + m_stencilBufferHelper.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + } + + if( UIUtils.CurrentShaderVersion() > 14202 ) + { + //DEPTH OPTIONS + if( m_currentTemplate.DepthData.ValidZWrite ) + { + m_depthOphelper.ReadZWriteFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + if( m_currentTemplate.DepthData.ValidZTest ) + { + m_depthOphelper.ReadZTestFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + if( m_currentTemplate.DepthData.ValidOffset ) + { + m_depthOphelper.ReadOffsetFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + } + + //TAGS + if( UIUtils.CurrentShaderVersion() > 14301 ) + { + if( m_currentTemplate.TagData.DataCheck == TemplateDataCheck.Valid ) + m_tagsHelper.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + } + catch( Exception e ) + { + Debug.LogException( e, this ); + } + m_containerGraph.CurrentCanvasMode = NodeAvailability.TemplateShader; + m_containerGraph.CurrentPrecision = m_currentPrecisionType; + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_shaderName ); + IOUtils.AddFieldValueToString( ref nodeInfo, ( m_currentTemplate != null ) ? m_currentTemplate.GUID : string.Empty ); + IOUtils.AddFieldValueToString( ref nodeInfo, ( m_currentTemplate != null ) ? m_currentTemplate.DefaultShaderName : string.Empty ); + + //BLEND MODULE + if( m_currentTemplate.BlendData.ValidBlendMode ) + { + m_blendOpHelper.WriteBlendModeToString( ref nodeInfo ); + } + + if( m_currentTemplate.BlendData.ValidBlendOp ) + { + m_blendOpHelper.WriteBlendOpToString( ref nodeInfo ); + } + + //CULL MODULE + if( m_currentTemplate.CullModeData.DataCheck == TemplateDataCheck.Valid ) + { + m_cullModeHelper.WriteToString( ref nodeInfo ); + } + + //COLOR MASK MODULE + if( m_currentTemplate.ColorMaskData.DataCheck == TemplateDataCheck.Valid ) + { + m_colorMaskHelper.WriteToString( ref nodeInfo ); + } + + //STENCIL BUFFER MODULE + if( m_currentTemplate.StencilData.DataCheck == TemplateDataCheck.Valid ) + { + m_stencilBufferHelper.WriteToString( ref nodeInfo ); + } + + //DEPTH MODULE + if( m_currentTemplate.DepthData.ValidZWrite ) + { + m_depthOphelper.WriteZWriteToString( ref nodeInfo ); + } + + if( m_currentTemplate.DepthData.ValidZTest ) + { + m_depthOphelper.WriteZTestToString( ref nodeInfo ); + } + + if( m_currentTemplate.DepthData.ValidOffset ) + { + m_depthOphelper.WriteOffsetToString( ref nodeInfo ); + } + + //TAGS + if( m_currentTemplate.TagData.DataCheck == TemplateDataCheck.Valid ) + { + m_tagsHelper.WriteToString( ref nodeInfo ); + } + } + + public override void Destroy() + { + base.Destroy(); + m_currentTemplate = null; + m_blendOpHelper = null; + m_cullModeHelper = null; + m_colorMaskHelper.Destroy(); + m_colorMaskHelper = null; + m_stencilBufferHelper.Destroy(); + m_stencilBufferHelper = null; + m_tagsHelper.Destroy(); + m_tagsHelper = null; + + } + + public TemplateData CurrentTemplate { get { return m_currentTemplate; } } + } +} |