summaryrefslogtreecommitdiff
path: root/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateLocalVarsNode.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateLocalVarsNode.cs')
-rw-r--r--Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateLocalVarsNode.cs258
1 files changed, 258 insertions, 0 deletions
diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateLocalVarsNode.cs b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateLocalVarsNode.cs
new file mode 100644
index 00000000..85898210
--- /dev/null
+++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateLocalVarsNode.cs
@@ -0,0 +1,258 @@
+// Amplify Shader Editor - Visual Shader Editing Tool
+// Copyright (c) Amplify Creations, Lda <info@amplify.pt>
+using UnityEngine;
+using UnityEditor;
+using System;
+using System.Collections.Generic;
+
+namespace AmplifyShaderEditor
+{
+ [Serializable]
+ [NodeAttributes( "Template Local Var Data", "Surface Data", "Select and use available local variable data from the template" )]
+ public sealed class TemplateLocalVarsNode : TemplateNodeParent
+ {
+ private List<TemplateLocalVarData> m_localVarsData = null;
+
+ [SerializeField]
+ private int m_currentDataIdx = -1;
+
+ [SerializeField]
+ private string m_dataName = string.Empty;
+
+ private string[] m_dataLabels = null;
+
+ private bool m_fetchDataId = false;
+ private UpperLeftWidgetHelper m_upperLeftWidgetHelper = new UpperLeftWidgetHelper();
+
+ void FetchDataId()
+ {
+ if( m_localVarsData != null && m_localVarsData.Count > 0 )
+ {
+ m_currentDataIdx = 0;
+ int count = m_localVarsData.Count;
+ m_dataLabels = new string[ count ];
+ for( int i = 0; i < count; i++ )
+ {
+ m_dataLabels[ i ] = m_localVarsData[ i ].LocalVarName;
+ if( m_localVarsData[ i ].LocalVarName.Equals( m_dataName ) )
+ {
+ m_currentDataIdx = i;
+ }
+ }
+ UpdateFromId();
+ }
+ else
+ {
+ m_currentDataIdx = -1;
+ }
+ }
+
+ void UpdateFromId()
+ {
+ if( m_localVarsData != null )
+ {
+ if( m_localVarsData.Count == 0 )
+ {
+ for( int i = 0; i < 4; i++ )
+ m_containerGraph.DeleteConnection( false, UniqueId, i, false, true );
+
+ m_headerColor = UIUtils.GetColorFromCategory( "Default" );
+ m_content.text = "None";
+ m_additionalContent.text = string.Empty;
+ m_outputPorts[ 0 ].ChangeProperties( "None", WirePortDataType.OBJECT, false );
+ ConfigurePorts();
+ return;
+ }
+
+ bool areCompatible = TemplateHelperFunctions.CheckIfCompatibles( m_outputPorts[ 0 ].DataType, m_localVarsData[ m_currentDataIdx ].DataType );
+ string category = m_localVarsData[ m_currentDataIdx ].Category == MasterNodePortCategory.Fragment ? "Surface Data" : "Vertex Data";
+ m_headerColor = UIUtils.GetColorFromCategory( category );
+ switch( m_localVarsData[ m_currentDataIdx ].DataType )
+ {
+ default:
+ case WirePortDataType.INT:
+ case WirePortDataType.FLOAT:
+ m_outputPorts[ 0 ].ChangeProperties( Constants.EmptyPortValue, m_localVarsData[ m_currentDataIdx ].DataType, false );
+ break;
+ case WirePortDataType.FLOAT2:
+ m_outputPorts[ 0 ].ChangeProperties( "XY", m_localVarsData[ m_currentDataIdx ].DataType, false );
+ break;
+ case WirePortDataType.FLOAT3:
+ m_outputPorts[ 0 ].ChangeProperties( "XYZ", m_localVarsData[ m_currentDataIdx ].DataType, false );
+ break;
+ case WirePortDataType.FLOAT4:
+ m_outputPorts[ 0 ].ChangeProperties( "XYZW", m_localVarsData[ m_currentDataIdx ].DataType, false );
+ break;
+ case WirePortDataType.COLOR:
+ m_outputPorts[ 0 ].ChangeProperties( "RGBA", m_localVarsData[ m_currentDataIdx ].DataType, false );
+ break;
+ }
+
+ ConfigurePorts();
+
+ if( !areCompatible )
+ {
+ m_containerGraph.DeleteConnection( false, UniqueId, 0, false, true );
+ }
+
+ m_dataName = m_localVarsData[ m_currentDataIdx ].LocalVarName;
+ m_content.text = m_dataName;
+ m_sizeIsDirty = true;
+ CheckWarningState();
+ }
+ }
+
+ public override void DrawProperties()
+ {
+ base.DrawProperties();
+ if( m_multiPassMode )
+ {
+ DrawMultipassProperties();
+ }
+
+ if( m_currentDataIdx > -1 )
+ {
+ EditorGUI.BeginChangeCheck();
+ m_currentDataIdx = EditorGUILayoutPopup( DataLabelStr, m_currentDataIdx, m_dataLabels );
+ if( EditorGUI.EndChangeCheck() )
+ {
+ UpdateFromId();
+ }
+ }
+ }
+ protected override void OnSubShaderChange()
+ {
+ FetchLocalVarData();
+ FetchDataId();
+ }
+
+ protected override void OnPassChange()
+ {
+ base.OnPassChange();
+ FetchLocalVarData();
+ FetchDataId();
+ }
+
+ void DrawMultipassProperties()
+ {
+ DrawSubShaderUI();
+ DrawPassUI();
+ }
+
+ public override void Draw( DrawInfo drawInfo )
+ {
+ base.Draw( drawInfo );
+ if( m_containerGraph.CurrentCanvasMode != NodeAvailability.TemplateShader )
+ return;
+
+ if( m_localVarsData == null || m_localVarsData.Count == 0 )
+ {
+ MasterNode masterNode = m_containerGraph.CurrentMasterNode;
+ if( masterNode.CurrentMasterNodeCategory == AvailableShaderTypes.Template )
+ {
+ FetchLocalVarData( masterNode );
+ }
+ }
+
+ if( m_fetchDataId )
+ {
+ m_fetchDataId = false;
+ FetchDataId();
+ }
+
+ if( m_currentDataIdx > -1 )
+ {
+ EditorGUI.BeginChangeCheck();
+ m_currentDataIdx = m_upperLeftWidgetHelper.DrawWidget( this, m_currentDataIdx, m_dataLabels );
+ if( EditorGUI.EndChangeCheck() )
+ {
+ UpdateFromId();
+ }
+ }
+ }
+
+ public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar )
+ {
+ if( m_localVarsData[ m_currentDataIdx ].Category != dataCollector.PortCategory )
+ {
+ UIUtils.ShowMessage( UniqueId, string.Format( "Local Var {0} can only work on ports of type {1}", m_localVarsData[ m_currentDataIdx ].LocalVarName, m_localVarsData[ m_currentDataIdx ].Category ) );
+ return m_outputPorts[ 0 ].ErrorValue;
+ }
+
+ if( m_multiPassMode )
+ {
+ if( dataCollector.TemplateDataCollectorInstance.MultipassSubshaderIdx != SubShaderIdx ||
+ dataCollector.TemplateDataCollectorInstance.MultipassPassIdx != PassIdx
+ )
+ {
+ UIUtils.ShowMessage( UniqueId, string.Format( "{0} is only intended for subshader {1} and pass {2}", m_dataLabels[ m_currentDataIdx ], SubShaderIdx, PassIdx ) );
+ return m_outputPorts[ outputId ].ErrorValue;
+ }
+ }
+
+ return GetOutputVectorItem( 0, outputId, m_dataName );
+ }
+
+ public override void ReadFromString( ref string[] nodeParams )
+ {
+ base.ReadFromString( ref nodeParams );
+ m_dataName = GetCurrentParam( ref nodeParams );
+ m_fetchDataId = true;
+ }
+
+ public override void WriteToString( ref string nodeInfo, ref string connectionsInfo )
+ {
+ base.WriteToString( ref nodeInfo, ref connectionsInfo );
+ IOUtils.AddFieldValueToString( ref nodeInfo, m_dataName );
+ }
+
+ public override void OnMasterNodeReplaced( MasterNode newMasterNode )
+ {
+ base.OnMasterNodeReplaced( newMasterNode );
+ if( newMasterNode.CurrentMasterNodeCategory == AvailableShaderTypes.Template )
+ {
+ FetchLocalVarData( newMasterNode );
+ }
+ else
+ {
+ m_localVarsData = null;
+ m_currentDataIdx = -1;
+ }
+ }
+
+ void FetchLocalVarData( MasterNode masterNode = null )
+ {
+ FetchMultiPassTemplate( masterNode );
+ if( m_multiPassMode )
+ {
+ if( m_templateMPData != null )
+ {
+ m_localVarsData = m_templateMPData.SubShaders[ SubShaderIdx ].Passes[ PassIdx ].LocalVarsList;
+ m_fetchDataId = true;
+ }
+ }
+ else
+ {
+ TemplateData currentTemplate = ( masterNode as TemplateMasterNode ).CurrentTemplate;
+ if( currentTemplate != null )
+ {
+ m_localVarsData = currentTemplate.LocalVarsList;
+ m_fetchDataId = true;
+ }
+ else
+ {
+ m_localVarsData = null;
+ m_currentDataIdx = -1;
+ }
+ }
+ }
+
+ public override void Destroy()
+ {
+ base.Destroy();
+ m_dataLabels = null;
+ m_localVarsData = null;
+ m_upperLeftWidgetHelper = null;
+ }
+ }
+}