summaryrefslogtreecommitdiff
path: root/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Wires/OutputPort.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Wires/OutputPort.cs')
-rw-r--r--Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Wires/OutputPort.cs306
1 files changed, 306 insertions, 0 deletions
diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Wires/OutputPort.cs b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Wires/OutputPort.cs
new file mode 100644
index 00000000..3050aa85
--- /dev/null
+++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Wires/OutputPort.cs
@@ -0,0 +1,306 @@
+// Amplify Shader Editor - Visual Shader Editing Tool
+// Copyright (c) Amplify Creations, Lda <info@amplify.pt>
+
+using UnityEditor;
+using UnityEngine;
+
+namespace AmplifyShaderEditor
+{
+ [System.Serializable]
+ public sealed class OutputPort : WirePort
+ {
+ public delegate void OnNewPreviewRTCreated();
+ public OnNewPreviewRTCreated OnNewPreviewRTCreatedEvent;
+
+ [SerializeField]
+ private bool m_connectedToMasterNode;
+
+ [SerializeField]
+ private bool[] m_isLocalValue = { false, false};
+
+ [SerializeField]
+ private string[] m_localOutputValue = { string.Empty,string.Empty};
+
+ //[SerializeField]
+ //private int m_isLocalWithPortType = 0;
+
+ private RenderTexture m_outputPreview = null;
+ private Material m_outputMaskMaterial = null;
+
+ private int m_indexPreviewOffset = 0;
+
+ public OutputPort( ParentNode owner, int nodeId, int portId, WirePortDataType dataType, string name ) : base( nodeId, portId, dataType, name )
+ {
+ LabelSize = Vector2.zero;
+ OnNewPreviewRTCreatedEvent += owner.SetPreviewDirtyFromOutputs;
+ }
+
+ public string ErrorValue
+ {
+ get
+ {
+ string value = string.Empty;
+ switch( m_dataType )
+ {
+ default:
+ case WirePortDataType.OBJECT:
+ case WirePortDataType.INT:
+ case WirePortDataType.FLOAT: value = "(0)"; break;
+ case WirePortDataType.FLOAT2: value = "half2(0,0)"; break;
+ case WirePortDataType.FLOAT3: value = "half3(0,0,0)"; break;
+ case WirePortDataType.COLOR:
+ case WirePortDataType.FLOAT4: value = "half4(0,0,0,0)"; break;
+ case WirePortDataType.FLOAT3x3: value = "half3x3(0,0,0,0,0,0,0,0,0)"; break;
+ case WirePortDataType.FLOAT4x4: value = "half4x4(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)"; break;
+ }
+ return value;
+ }
+ }
+
+ public bool ConnectedToMasterNode
+ {
+ get { return m_connectedToMasterNode; }
+ set { m_connectedToMasterNode = value; }
+ }
+
+ public override void FullDeleteConnections()
+ {
+ UIUtils.DeleteConnection( false, m_nodeId, m_portId, true, true );
+ }
+
+ public bool HasConnectedNode
+ {
+ get
+ {
+ int count = m_externalReferences.Count;
+ for( int i = 0; i < count; i++ )
+ {
+ if( UIUtils.GetNode( m_externalReferences[ i ].NodeId ).IsConnected )
+ return true;
+ }
+ return false;
+ }
+ }
+ public InputPort GetInputConnection( int connID = 0 )
+ {
+ if( connID < m_externalReferences.Count )
+ {
+ return UIUtils.GetNode( m_externalReferences[ connID ].NodeId ).GetInputPortByUniqueId( m_externalReferences[ connID ].PortId );
+ }
+ return null;
+ }
+
+ public ParentNode GetInputNode( int connID = 0 )
+ {
+ if( connID < m_externalReferences.Count )
+ {
+ return UIUtils.GetNode( m_externalReferences[ connID ].NodeId );
+ }
+ return null;
+ }
+
+ public override void NotifyExternalRefencesOnChange()
+ {
+ for( int i = 0; i < m_externalReferences.Count; i++ )
+ {
+ ParentNode node = UIUtils.GetNode( m_externalReferences[ i ].NodeId );
+ if( node )
+ {
+ node.CheckSpherePreview();
+ InputPort port = node.GetInputPortByUniqueId( m_externalReferences[ i ].PortId );
+ port.UpdateInfoOnExternalConn( m_nodeId, m_portId, m_dataType );
+ node.OnConnectedOutputNodeChanges( m_externalReferences[ i ].PortId, m_nodeId, m_portId, m_name, m_dataType );
+ }
+ }
+ }
+
+ public void ChangeTypeWithRestrictions( WirePortDataType newType, int restrictions )
+ {
+ if( m_dataType != newType )
+ {
+ DataType = newType;
+ for( int i = 0; i < m_externalReferences.Count; i++ )
+ {
+ ParentNode inNode = UIUtils.GetNode( m_externalReferences[ i ].NodeId );
+ InputPort inputPort = inNode.GetInputPortByUniqueId( m_externalReferences[ i ].PortId );
+
+ bool valid = false;
+ if( restrictions == 0 )
+ {
+ valid = true;
+ }
+ else
+ {
+ valid = ( restrictions & (int)inputPort.DataType ) != 0;
+ }
+
+ if( valid )
+ {
+ inNode.CheckSpherePreview();
+ inputPort.UpdateInfoOnExternalConn( m_nodeId, m_portId, m_dataType );
+ inNode.OnConnectedOutputNodeChanges( m_externalReferences[ i ].PortId, m_nodeId, m_portId, m_name, m_dataType );
+ }
+ else
+ {
+ InvalidateConnection( m_externalReferences[ i ].NodeId, m_externalReferences[ i ].PortId );
+ inputPort.InvalidateConnection( NodeId, PortId );
+ i--;
+ }
+ }
+ }
+ }
+
+ public override void ChangePortId( int newPortId )
+ {
+ if( IsConnected )
+ {
+ int count = ExternalReferences.Count;
+ for( int connIdx = 0; connIdx < count; connIdx++ )
+ {
+ int nodeId = ExternalReferences[ connIdx ].NodeId;
+ int portId = ExternalReferences[ connIdx ].PortId;
+ ParentNode node = UIUtils.GetNode( nodeId );
+ if( node != null )
+ {
+ InputPort inputPort = node.GetInputPortByUniqueId( portId );
+ int inputCount = inputPort.ExternalReferences.Count;
+ for( int j = 0; j < inputCount; j++ )
+ {
+ if( inputPort.ExternalReferences[ j ].NodeId == NodeId &&
+ inputPort.ExternalReferences[ j ].PortId == PortId )
+ {
+ inputPort.ExternalReferences[ j ].PortId = newPortId;
+ }
+ }
+ }
+ }
+ }
+
+ PortId = newPortId;
+ }
+
+ public string ConfigOutputLocalValue( PrecisionType precisionType, string value, string customName, MasterNodePortCategory category )
+ {
+ int idx = UIUtils.PortCategorytoAttayIdx( category );
+ ParentGraph currentGraph = UIUtils.GetNode( NodeId ).ContainerGraph;
+ string autoGraphId = currentGraph.GraphId > 0 ? "_g" + currentGraph.GraphId : string.Empty;
+ m_localOutputValue[idx] = string.IsNullOrEmpty( customName ) ? ( "temp_output_" + m_nodeId + "_" + PortId + autoGraphId ) : customName;
+ m_isLocalValue[idx] = true;
+ //m_isLocalWithPortType |= (int)category;
+ return string.Format( Constants.LocalValueDecWithoutIdent, UIUtils.PrecisionWirePortToCgType( precisionType, DataType ), m_localOutputValue[idx], value );
+ }
+
+ public void SetLocalValue( string value, MasterNodePortCategory category )
+ {
+ int idx = UIUtils.PortCategorytoAttayIdx( category );
+ m_isLocalValue[idx] = true;
+ m_localOutputValue[ idx ] = value;
+ //m_isLocalWithPortType |= (int)category;
+ }
+
+ public void ResetLocalValue()
+ {
+ for( int i = 0; i < m_localOutputValue.Length; i++ )
+ {
+ m_localOutputValue[ i ] = string.Empty;
+ m_isLocalValue[i] = false;
+ }
+ //m_isLocalWithPortType = 0;
+ }
+
+ public void ResetLocalValueIfNot( MasterNodePortCategory category )
+ {
+ int idx = UIUtils.PortCategorytoAttayIdx( category );
+ for( int i = 0; i < m_localOutputValue.Length; i++ )
+ {
+ if( i != idx )
+ {
+ m_localOutputValue[ i ] = string.Empty;
+ m_isLocalValue[ i ] = false;
+ }
+ }
+ }
+
+ public void ResetLocalValueOnCategory( MasterNodePortCategory category )
+ {
+ int idx = UIUtils.PortCategorytoAttayIdx( category );
+ m_localOutputValue[ idx ] = string.Empty;
+ m_isLocalValue[ idx ] = false;
+ }
+
+ public bool IsLocalOnCategory( MasterNodePortCategory category )
+ {
+ int idx = UIUtils.PortCategorytoAttayIdx( category );
+ return m_isLocalValue[ idx ];
+ //return ( m_isLocalWithPortType & (int)category ) != 0; ;
+ }
+
+ public override void ForceClearConnection()
+ {
+ UIUtils.DeleteConnection( false, m_nodeId, m_portId, false, true );
+ }
+
+ public bool IsLocalValue( MasterNodePortCategory category )
+ {
+ int idx = UIUtils.PortCategorytoAttayIdx( category );
+ return m_isLocalValue[ idx ];
+ }
+
+ public string LocalValue(MasterNodePortCategory category)
+ {
+ int idx = UIUtils.PortCategorytoAttayIdx( category );
+ return m_localOutputValue[idx];
+ }
+
+ public RenderTexture OutputPreviewTexture
+ {
+ get
+ {
+ if( m_outputPreview == null )
+ {
+ m_outputPreview = new RenderTexture( 128, 128, 0, RenderTextureFormat.ARGBFloat, RenderTextureReadWrite.Linear );
+ m_outputPreview.wrapMode = TextureWrapMode.Repeat;
+ if( OnNewPreviewRTCreatedEvent != null )
+ OnNewPreviewRTCreatedEvent();
+ }
+
+ return m_outputPreview;
+ }
+ set { m_outputPreview = value; }
+ }
+
+ public int IndexPreviewOffset
+ {
+ get { return m_indexPreviewOffset; }
+ set { m_indexPreviewOffset = value; }
+ }
+
+ public override void Destroy()
+ {
+ base.Destroy();
+ if( m_outputPreview != null )
+ UnityEngine.ScriptableObject.DestroyImmediate( m_outputPreview );
+ m_outputPreview = null;
+
+ if( m_outputMaskMaterial != null )
+ UnityEngine.ScriptableObject.DestroyImmediate( m_outputMaskMaterial );
+ m_outputMaskMaterial = null;
+
+ OnNewPreviewRTCreatedEvent = null;
+ }
+
+ public Material MaskingMaterial
+ {
+ get
+ {
+ if( m_outputMaskMaterial == null )
+ {
+ //m_outputMaskMaterial = new Material( AssetDatabase.LoadAssetAtPath<Shader>( AssetDatabase.GUIDToAssetPath( "9c34f18ebe2be3e48b201b748c73dec0" ) ) );
+ m_outputMaskMaterial = new Material( UIUtils.MaskingShader );
+ }
+ return m_outputMaskMaterial;
+ }
+ //set { m_outputMaskMaterial = value; }
+ }
+ }
+}