diff options
author | chai <chaifix@163.com> | 2020-10-23 13:08:43 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2020-10-23 13:08:43 +0800 |
commit | b82da95b5181ac8bbae38efb13e950d5e88a4caa (patch) | |
tree | 48a6f3269276484bbc7cfc95f0651f40a2176aa1 /Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex | |
parent | 917e9e0b320775634dc2e710f7deac74fd0822f0 (diff) |
*移动amplify shader editor到third party目录
Diffstat (limited to 'Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex')
41 files changed, 1868 insertions, 0 deletions
diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/BillboardNode.cs b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/BillboardNode.cs new file mode 100644 index 00000000..0cb8787a --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/BillboardNode.cs @@ -0,0 +1,123 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda <info@amplify.pt> + +using System; +using UnityEngine; +using UnityEditor; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Billboard", "Miscellaneous", "Calculates new Vertex positions and normals to achieve a billboard effect." )] + public sealed class BillboardNode : ParentNode + { + private const string ErrorMessage = "Billboard node should only be connected to vertex ports."; + private const string WarningMessage = "This node is a bit different from all others as it injects the necessary code into the vertex body and writes directly on the vertex position and normal.\nIt outputs a value of 0 so it can be connected directly to a vertex port.\n[Only if that port is a relative vertex offset]."; + + [SerializeField] + private BillboardType m_billboardType = BillboardType.Cylindrical; + + [SerializeField] + private bool m_rotationIndependent = false; + + private UpperLeftWidgetHelper m_upperLeftWidget = new UpperLeftWidgetHelper(); + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddOutputPort( WirePortDataType.FLOAT3, "Out" ); + m_textLabelWidth = 115; + m_hasLeftDropdown = true; + SetAdditonalTitleText( string.Format( Constants.SubTitleTypeFormatStr, m_billboardType ) ); + } + + public override void Destroy() + { + base.Destroy(); + m_upperLeftWidget = null; + } + + public override void AfterCommonInit() + { + base.AfterCommonInit(); + + if( PaddingTitleLeft == 0 ) + { + PaddingTitleLeft = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + if( PaddingTitleRight == 0 ) + PaddingTitleRight = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + } + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + m_upperLeftWidget.DrawWidget<BillboardType>( ref m_billboardType, this, OnWidgetUpdate ); + } + + private readonly Action<ParentNode> OnWidgetUpdate = ( x ) => + { + x.SetAdditonalTitleText( string.Format( Constants.SubTitleTypeFormatStr, ( x as BillboardNode ).Type ) ); + }; + + public override void DrawProperties() + { + base.DrawProperties(); + NodeUtils.DrawPropertyGroup( ref m_propertiesFoldout, Constants.ParameterLabelStr, () => + { + EditorGUI.BeginChangeCheck(); + m_billboardType = (BillboardType)EditorGUILayoutEnumPopup( BillboardOpHelper.BillboardTypeStr, m_billboardType ); + if( EditorGUI.EndChangeCheck() ) + { + SetAdditonalTitleText( string.Format( Constants.SubTitleTypeFormatStr, m_billboardType ) ); + } + m_rotationIndependent = EditorGUILayoutToggle( BillboardOpHelper.BillboardRotIndStr, m_rotationIndependent ); + } ); + EditorGUILayout.HelpBox( WarningMessage, MessageType.Warning ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( dataCollector.IsFragmentCategory ) + { + UIUtils.ShowMessage( UniqueId, ErrorMessage,MessageSeverity.Error ); + return m_outputPorts[0].ErrorValue; + } + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].ErrorValue; + + m_outputPorts[ 0 ].SetLocalValue( "0", dataCollector.PortCategory ); + string vertexPosValue = dataCollector.IsTemplate ? dataCollector.TemplateDataCollectorInstance.GetVertexPosition( WirePortDataType.OBJECT, CurrentPrecisionType ) : "v.vertex"; + string vertexNormalValue = dataCollector.IsTemplate ? dataCollector.TemplateDataCollectorInstance.GetVertexNormal( CurrentPrecisionType ) : "v.normal"; + bool vertexIsFloat3 = false; + if( dataCollector.IsTemplate ) + { + InterpDataHelper info = dataCollector.TemplateDataCollectorInstance.GetInfo( TemplateInfoOnSematics.POSITION ); + if( info != null ) + { + vertexIsFloat3 = info.VarType == WirePortDataType.FLOAT3; + } + } + + BillboardOpHelper.FillDataCollector( ref dataCollector, m_billboardType, m_rotationIndependent, vertexPosValue, vertexNormalValue, vertexIsFloat3 ); + + return "0"; + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_billboardType = (BillboardType)Enum.Parse( typeof( BillboardType ), GetCurrentParam( ref nodeParams ) ); + m_rotationIndependent = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_billboardType ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_rotationIndependent ); + SetAdditonalTitleText( string.Format( Constants.SubTitleTypeFormatStr, m_billboardType ) ); + } + + public BillboardType Type { get { return m_billboardType; } } + } +} diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/BillboardNode.cs.meta b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/BillboardNode.cs.meta new file mode 100644 index 00000000..7b2c540b --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/BillboardNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 08fd3dd8f623aca42b7eb9962a89753d +timeCreated: 1501161489 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/BitangentVertexDataNode.cs b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/BitangentVertexDataNode.cs new file mode 100644 index 00000000..828a4993 --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/BitangentVertexDataNode.cs @@ -0,0 +1,37 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda <info@amplify.pt> + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Vertex Bitangent", "Vertex Data", "Calculated bitangent vector in object space, can be used in both local vertex offset and fragment outputs. Already has tangent sign and object transform into account" )] + public sealed class BitangentVertexDataNode : ParentNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddOutputVectorPorts( WirePortDataType.FLOAT3, "XYZ" ); + m_drawPreviewAsSphere = true; + m_previewShaderGUID = "76873532ab67d2947beaf07151383cbe"; + } + + public override void PropagateNodeData( NodeData nodeData, ref MasterNodeDataCollector dataCollector ) + { + base.PropagateNodeData( nodeData, ref dataCollector ); + dataCollector.DirtyNormal = true; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + if ( dataCollector.PortCategory == MasterNodePortCategory.Fragment || dataCollector.PortCategory == MasterNodePortCategory.Debug ) + { + dataCollector.ForceNormal = true; + dataCollector.AddToInput( UniqueId, SurfaceInputs.WORLD_NORMAL, CurrentPrecisionType ); + dataCollector.AddToInput( UniqueId, SurfaceInputs.INTERNALDATA, addSemiColon: false ); + } + + string vertexBitangent = GeneratorUtils.GenerateVertexBitangent( ref dataCollector, UniqueId, CurrentPrecisionType ); + return GetOutputVectorItem( 0, outputId, vertexBitangent ); + } + } +} diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/BitangentVertexDataNode.cs.meta b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/BitangentVertexDataNode.cs.meta new file mode 100644 index 00000000..1c5ff97a --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/BitangentVertexDataNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 839ecbdfc8ed4fd4d8a08ec07f7159fa +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/ColorVertexDataNode.cs b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/ColorVertexDataNode.cs new file mode 100644 index 00000000..0cea1618 --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/ColorVertexDataNode.cs @@ -0,0 +1,18 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda <info@amplify.pt> + +using UnityEngine; +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "[VS] Vertex Color", "Vertex Data", "Vertex color. Only works on Vertex Shaders ports ( p.e. Local Vertex Offset Port ).", null,KeyCode.None,true,true,"Vertex Color",typeof(VertexColorNode))] + public sealed class ColorVertexDataNode : VertexDataNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_currentVertexData = "color"; + ConvertFromVectorToColorPorts(); + } + } +} diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/ColorVertexDataNode.cs.meta b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/ColorVertexDataNode.cs.meta new file mode 100644 index 00000000..b8990fe9 --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/ColorVertexDataNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ca76669baa9fa204b8ce5200eb07c1db +timeCreated: 1481126959 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/NormalVertexDataNode.cs b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/NormalVertexDataNode.cs new file mode 100644 index 00000000..b5fc4b5f --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/NormalVertexDataNode.cs @@ -0,0 +1,44 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda <info@amplify.pt> + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Vertex Normal", "Vertex Data", "Vertex normal vector in object space, can be used in both local vertex offset and fragment outputs" )] + public sealed class NormalVertexDataNode : VertexDataNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_currentVertexData = "normal"; + ChangeOutputProperties( 0, "XYZ", WirePortDataType.FLOAT3 ); + m_outputPorts[ 4 ].Visible = false; + m_drawPreviewAsSphere = true; + m_previewShaderGUID = "6b24b06c33f9fe84c8a2393f13ab5406"; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + string vertexNormal = string.Empty; + + if( dataCollector.MasterNodeCategory == AvailableShaderTypes.Template ) + { + vertexNormal = dataCollector.TemplateDataCollectorInstance.GetVertexNormal( CurrentPrecisionType ); + return GetOutputVectorItem( 0, outputId, vertexNormal ); + } + + if( dataCollector.PortCategory == MasterNodePortCategory.Fragment || dataCollector.PortCategory == MasterNodePortCategory.Debug ) + { + dataCollector.AddToInput( UniqueId, SurfaceInputs.WORLD_NORMAL, CurrentPrecisionType ); + if( dataCollector.DirtyNormal ) + { + dataCollector.AddToInput( UniqueId, SurfaceInputs.INTERNALDATA, addSemiColon: false ); + dataCollector.ForceNormal = true; + } + } + + vertexNormal = GeneratorUtils.GenerateVertexNormal( ref dataCollector, UniqueId, CurrentPrecisionType ); + return GetOutputVectorItem( 0, outputId, vertexNormal ); + } + } +} diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/NormalVertexDataNode.cs.meta b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/NormalVertexDataNode.cs.meta new file mode 100644 index 00000000..62b8c9d6 --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/NormalVertexDataNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 4c7b60515f9cf6043bf8d03531d268f9 +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/ObjectScaleNode.cs b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/ObjectScaleNode.cs new file mode 100644 index 00000000..6dd1b8d3 --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/ObjectScaleNode.cs @@ -0,0 +1,75 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda <info@amplify.pt> + +using System; +using UnityEngine; +using UnityEditor; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Object Scale", "Vertex Data", "Object Scale extracted directly from its transform matrix" )] + public class ObjectScaleNode : ParentNode + { + private const string RotationIndependentScaleStr = "Rotation Independent Scale"; + + [SerializeField] + private bool m_rotationIndependentScale = false; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddOutputVectorPorts( WirePortDataType.FLOAT3, "XYZ" ); + m_drawPreviewAsSphere = true; + m_previewShaderGUID = "5540033c6c52f51468938c1a42bd2730"; + m_textLabelWidth = 180; + UpdateMaterialPass(); + m_autoWrapProperties = true; + } + + public override void DrawProperties() + { + base.DrawProperties(); + EditorGUI.BeginChangeCheck(); + m_rotationIndependentScale = EditorGUILayoutToggle( RotationIndependentScaleStr, m_rotationIndependentScale ); + if( EditorGUI.EndChangeCheck() ) + { + UpdateMaterialPass(); + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + string objectScale = m_rotationIndependentScale ? GeneratorUtils.GenerateRotationIndependentObjectScale( ref dataCollector, UniqueId ): + GeneratorUtils.GenerateObjectScale( ref dataCollector, UniqueId ); + + return GetOutputVectorItem( 0, outputId, objectScale ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + if( UIUtils.CurrentShaderVersion() < 17402 ) + { + m_rotationIndependentScale = false; + } + else + { + m_rotationIndependentScale = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + UpdateMaterialPass(); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_rotationIndependentScale ); + } + + void UpdateMaterialPass() + { + m_previewMaterialPassId = m_rotationIndependentScale ? 1 : 0; + PreviewIsDirty = true; + } + + } +} diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/ObjectScaleNode.cs.meta b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/ObjectScaleNode.cs.meta new file mode 100644 index 00000000..7103bef2 --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/ObjectScaleNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ef1fe46d0cc472e45ad13ac737db2c1e +timeCreated: 1493993914 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/OutlineNode.cs b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/OutlineNode.cs new file mode 100644 index 00000000..cec8fb39 --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/OutlineNode.cs @@ -0,0 +1,366 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda <info@amplify.pt> + +using System; + +using UnityEngine; +using UnityEditor; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Outline", "Miscellaneous", "Uses vertices to simulate an outline around the object" )] + public sealed class OutlineNode : ParentNode + { + enum OutlineAlphaModes + { + None = 0, + Masked, + Transparent, + AlphaPremultiplied + }; + + private const string CullModePortNameStr = "Cull Mode"; + private const string AlphaModePortNameStr = "Alpha"; + private const string MaskedModePortNamStr = "Opacity Mask"; + private const string OutlineAlphaModeStr = "Alpha Mode"; + private const string OpacityMaskClipValueStr = "Mask Clip Value"; + private const string ErrorMessage = "Outline node should only be connected to vertex ports."; + + [SerializeField] + private bool m_noFog = true; + + [SerializeField] + private string[] AvailableOutlineModes = { "Vertex Offset", "Vertex Scale", "Custom" }; + + [SerializeField] + private int[] AvailableOutlineValues = { 0, 1, 2 }; + + [SerializeField] + private int m_currentSelectedMode = 0; + + [SerializeField] + private OutlineAlphaModes m_currentAlphaMode = OutlineAlphaModes.None; + + private UpperLeftWidgetHelper m_upperLeftWidget = new UpperLeftWidgetHelper(); + + [NonSerialized] + private StandardSurfaceOutputNode m_masterNode = null; + + [SerializeField] + private int m_zTestMode = 0; + + [SerializeField] + private int m_zWriteMode = 0; + + [SerializeField] + private CullMode m_cullMode = CullMode.Front; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + + AddOutputPort( WirePortDataType.FLOAT3, "Out" ); + + AddInputPort( WirePortDataType.FLOAT3, false, "Color", -1, MasterNodePortCategory.Fragment, 0 ); + AddInputPort( WirePortDataType.FLOAT, false, "Alpha", -1, MasterNodePortCategory.Fragment, 2 ); + AddInputPort( WirePortDataType.FLOAT, false, "Width", -1, MasterNodePortCategory.Fragment, 1 ); + GetInputPortByUniqueId( 2 ).Visible = false; + m_textLabelWidth = 115; + m_hasLeftDropdown = true; + SetAdditonalTitleText( string.Format( Constants.SubTitleTypeFormatStr, AvailableOutlineModes[ m_currentSelectedMode ] ) ); + } + + public override void PropagateNodeData( NodeData nodeData, ref MasterNodeDataCollector dataCollector ) + { + base.PropagateNodeData( nodeData, ref dataCollector ); + if( GetInputPortByUniqueId( 0 ).IsConnected ) + dataCollector.UsingCustomOutlineColor = true; + + if( GetInputPortByUniqueId( 1 ).IsConnected ) + dataCollector.UsingCustomOutlineWidth = true; + + if( GetInputPortByUniqueId( 2 ).IsConnected ) + dataCollector.UsingCustomOutlineAlpha = true; + + if( !dataCollector.IsTemplate ) + { + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.ZWriteMode = m_zWriteMode; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.OffsetMode = m_currentSelectedMode; + } + } + + public override void AfterCommonInit() + { + base.AfterCommonInit(); + + if( PaddingTitleLeft == 0 ) + { + PaddingTitleLeft = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + if( PaddingTitleRight == 0 ) + PaddingTitleRight = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + } + } + + public override void Destroy() + { + base.Destroy(); + m_upperLeftWidget = null; + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + EditorGUI.BeginChangeCheck(); + m_currentSelectedMode = m_upperLeftWidget.DrawWidget( this, m_currentSelectedMode, AvailableOutlineModes ); + if( EditorGUI.EndChangeCheck() ) + { + SetAdditonalTitleText( string.Format( Constants.SubTitleTypeFormatStr, AvailableOutlineModes[ m_currentSelectedMode ] ) ); + UpdatePorts(); + } + } + + void CheckAlphaPortVisibility() + { + InputPort alphaPort = GetInputPortByUniqueId( 2 ); + if( m_currentAlphaMode != OutlineAlphaModes.None ) + { + if( !alphaPort.Visible ) + alphaPort.Visible = true; + + if( m_currentAlphaMode == OutlineAlphaModes.Masked ) + { + GetInputPortByUniqueId( 2 ).Name = MaskedModePortNamStr; + } + else + { + GetInputPortByUniqueId( 2 ).Name = AlphaModePortNameStr; + } + m_sizeIsDirty = true; + } + + if( m_currentAlphaMode == OutlineAlphaModes.None && alphaPort.Visible ) + { + alphaPort.Visible = false; + m_sizeIsDirty = true; + } + } + + public override void DrawProperties() + { + base.DrawProperties(); + NodeUtils.DrawPropertyGroup( ref m_propertiesFoldout, Constants.ParameterLabelStr, () => + { + EditorGUI.BeginChangeCheck(); + m_currentSelectedMode = EditorGUILayoutIntPopup( "Type", m_currentSelectedMode, AvailableOutlineModes, AvailableOutlineValues ); + if( EditorGUI.EndChangeCheck() ) + { + SetAdditonalTitleText( string.Format( Constants.SubTitleTypeFormatStr, AvailableOutlineModes[ m_currentSelectedMode ] ) ); + UpdatePorts(); + } + + EditorGUI.BeginChangeCheck(); + m_currentAlphaMode = (OutlineAlphaModes)EditorGUILayoutEnumPopup( OutlineAlphaModeStr, m_currentAlphaMode ); + if( EditorGUI.EndChangeCheck() ) + { + CheckAlphaPortVisibility(); + } + + if( m_currentAlphaMode == OutlineAlphaModes.Masked ) + { + if( m_masterNode == null ) + { + m_masterNode = UIUtils.CurrentWindow.OutsideGraph.CurrentMasterNode as StandardSurfaceOutputNode; + } + + if( m_masterNode != null ) + { + m_masterNode.ShowOpacityMaskValueUI(); + } + } + + m_cullMode = (CullMode)EditorGUILayoutEnumPopup( CullModePortNameStr, m_cullMode ); + m_zWriteMode = EditorGUILayoutPopup( ZBufferOpHelper.ZWriteModeStr, m_zWriteMode, ZBufferOpHelper.ZWriteModeValues ); + m_zTestMode = EditorGUILayoutPopup( ZBufferOpHelper.ZTestModeStr, m_zTestMode, ZBufferOpHelper.ZTestModeLabels ); + m_noFog = EditorGUILayoutToggle( "No Fog", m_noFog ); + + } ); + } + + void UpdatePorts() + { + if( m_currentSelectedMode == 2 ) //custom mode + { + GetInputPortByUniqueId( 1 ).ChangeProperties( "Offset", WirePortDataType.FLOAT3, false ); + } + else + { + GetInputPortByUniqueId( 1 ).ChangeProperties( "Width", WirePortDataType.FLOAT, false ); + } + + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( dataCollector.IsTemplate ) + return m_outputPorts[0].ErrorValue; + + if( dataCollector.IsFragmentCategory ) + { + UIUtils.ShowMessage( UniqueId, ErrorMessage ); + return m_outputPorts[ 0 ].ErrorValue; + } + + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].ErrorValue; + + m_outputPorts[ 0 ].SetLocalValue( "0", dataCollector.PortCategory ); + + StandardSurfaceOutputNode masterNode = UIUtils.CurrentWindow.OutsideGraph.CurrentMasterNode as StandardSurfaceOutputNode; + + MasterNodeDataCollector outlineDataCollector = new MasterNodeDataCollector(); + outlineDataCollector.IsOutlineDataCollector = true; + outlineDataCollector.DirtyNormal = true; + InputPort colorPort = GetInputPortByUniqueId( 0 ); + InputPort alphaPort = GetInputPortByUniqueId( 2 ); + InputPort vertexPort = GetInputPortByUniqueId( 1 ); + + if( vertexPort.IsConnected ) + { + outlineDataCollector.PortCategory = MasterNodePortCategory.Vertex; + string outlineWidth = vertexPort.GenerateShaderForOutput( ref outlineDataCollector, vertexPort.DataType, true, true ); + outlineDataCollector.AddToVertexLocalVariables( UniqueId, PrecisionType.Float, vertexPort.DataType, "outlineVar", outlineWidth ); + + outlineDataCollector.AddVertexInstruction( outlineDataCollector.SpecialLocalVariables, UniqueId, false ); + outlineDataCollector.ClearSpecialLocalVariables(); + + outlineDataCollector.AddVertexInstruction( outlineDataCollector.VertexLocalVariables, UniqueId, false ); + outlineDataCollector.ClearVertexLocalVariables(); + + // need to check whether this breaks other outputs or not + UIUtils.CurrentWindow.OutsideGraph.ResetNodesLocalVariables(); + } + + outlineDataCollector.PortCategory = MasterNodePortCategory.Fragment; + string outlineColor = colorPort.GeneratePortInstructions( ref outlineDataCollector );// "\to.Emission = " + colorPort.GeneratePortInstructions( ref outlineDataCollector ) + ";"; + string alphaValue = alphaPort.Visible ? alphaPort.GeneratePortInstructions( ref outlineDataCollector ) : string.Empty; + + bool addTabs = outlineDataCollector.DirtySpecialLocalVariables || alphaPort.Available; + outlineDataCollector.AddInstructions( "\t" + outlineDataCollector.SpecialLocalVariables.TrimStart( '\t' ) ); + outlineDataCollector.ClearSpecialLocalVariables(); + outlineDataCollector.AddInstructions( ( addTabs ? "\t\t\t" : "" ) + "o.Emission = " + outlineColor + ";" ); + if( alphaPort.Visible ) + { + if( m_currentAlphaMode == OutlineAlphaModes.Masked ) + { + float maskClipValue = 0.5f; + + if( masterNode != null ) + maskClipValue = masterNode.OpacityMaskClipValue; + + if( masterNode.InlineOpacityMaskClipValue.IsValid ) + { + RangedFloatNode fnode = UIUtils.GetNode( masterNode.InlineOpacityMaskClipValue.NodeId ) as RangedFloatNode; + if( fnode != null ) + { + outlineDataCollector.AddToProperties( fnode.UniqueId, fnode.GetPropertyValue(), fnode.OrderIndex ); + outlineDataCollector.AddToUniforms( fnode.UniqueId, fnode.GetUniformValue() ); + } + else + { + IntNode inode = UIUtils.GetNode( masterNode.InlineOpacityMaskClipValue.NodeId ) as IntNode; + outlineDataCollector.AddToProperties( inode.UniqueId, inode.GetPropertyValue(), inode.OrderIndex ); + outlineDataCollector.AddToUniforms( inode.UniqueId, inode.GetUniformValue() ); + } + } + else + { + outlineDataCollector.AddToProperties( -1, string.Format( IOUtils.MaskClipValueProperty, OpacityMaskClipValueStr, maskClipValue ), -1 ); + outlineDataCollector.AddToUniforms( -1, string.Format( IOUtils.MaskClipValueUniform, maskClipValue ) ); + } + + outlineDataCollector.AddInstructions( ( addTabs ? "\n\t\t\t" : "" ) + "clip( " + alphaValue + " - " + masterNode.InlineOpacityMaskClipValue.GetValueOrProperty( IOUtils.MaskClipValueName, false ) + " );" ); + } + else + { + outlineDataCollector.AddInstructions( ( addTabs ? "\n\t\t\t" : "" ) + "o.Alpha = " + alphaValue + ";" ); + } + } + + if( outlineDataCollector.UsingWorldNormal ) + outlineDataCollector.AddInstructions( ( addTabs ? "\n\t\t\t" : "" ) + "o.Normal = float3(0,0,-1);" ); + + if( masterNode != null ) + { + //masterNode.AdditionalIncludes.AddToDataCollector( ref outlineDataCollector ); + //masterNode.AdditionalPragmas.AddToDataCollector( ref outlineDataCollector ); + //masterNode.AdditionalDefines.AddToDataCollector( ref outlineDataCollector ); + masterNode.AdditionalDirectives.AddAllToDataCollector( ref outlineDataCollector ); + } + + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.InputList = outlineDataCollector.InputList; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.Inputs = outlineDataCollector.Inputs; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.DirtyInput = outlineDataCollector.DirtyInputs; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.Includes = outlineDataCollector.Includes; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.Pragmas = outlineDataCollector.Pragmas; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.Defines = outlineDataCollector.Defines; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.Uniforms = outlineDataCollector.Uniforms; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.InstancedProperties = outlineDataCollector.InstancedProperties; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.GrabPasses = outlineDataCollector.GrabPass; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.UniformList = outlineDataCollector.UniformsList; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.InstancedPropertiesList = outlineDataCollector.InstancedPropertiesList; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.VertexData = outlineDataCollector.VertexData; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.Instructions = outlineDataCollector.Instructions; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.Functions = outlineDataCollector.Functions; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.LocalFunctions = outlineDataCollector.LocalFunctions; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.OutlineCullMode = m_cullMode; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.ZTestMode = m_zTestMode; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.ZWriteMode = m_zWriteMode; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.OffsetMode = m_currentSelectedMode; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.CustomNoFog = m_noFog; + dataCollector.CustomOutlineSelectedAlpha = (int)m_currentAlphaMode; + + for( int i = 0; i < outlineDataCollector.PropertiesList.Count; i++ ) + { + dataCollector.AddToProperties( UniqueId, outlineDataCollector.PropertiesList[ i ].PropertyName, outlineDataCollector.PropertiesList[ i ].OrderIndex ); + } + + UIUtils.CurrentWindow.OutsideGraph.ResetNodesLocalVariablesIfNot( MasterNodePortCategory.Vertex ); + return "0"; + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_currentSelectedMode = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + m_noFog = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + if( UIUtils.CurrentShaderVersion() > 14202 ) + m_currentAlphaMode = (OutlineAlphaModes)Enum.Parse( typeof( OutlineAlphaModes ), GetCurrentParam( ref nodeParams ) ); + + if( UIUtils.CurrentShaderVersion() > 14302 ) + { + m_zWriteMode = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + m_zTestMode = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + } + + if( UIUtils.CurrentShaderVersion() > 15304 ) + { + m_cullMode = (CullMode)Enum.Parse( typeof( CullMode ), GetCurrentParam( ref nodeParams ) ); + } + + SetAdditonalTitleText( string.Format( Constants.SubTitleTypeFormatStr, AvailableOutlineModes[ m_currentSelectedMode ] ) ); + UpdatePorts(); + CheckAlphaPortVisibility(); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_currentSelectedMode ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_noFog ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_currentAlphaMode ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_zWriteMode ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_zTestMode ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_cullMode ); + } + } +} diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/OutlineNode.cs.meta b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/OutlineNode.cs.meta new file mode 100644 index 00000000..60f49a8e --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/OutlineNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 24f267627c002964badad2901309c96a +timeCreated: 1501161489 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/PosVertexDataNode.cs b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/PosVertexDataNode.cs new file mode 100644 index 00000000..a71ed207 --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/PosVertexDataNode.cs @@ -0,0 +1,138 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda <info@amplify.pt> + +using System; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Vertex Position", "Vertex Data", "Vertex position vector in object space, can be used in both local vertex offset and fragment outputs" )] + public sealed class PosVertexDataNode : VertexDataNode + { + private const string PropertyLabel = "Size"; + private readonly string[] SizeLabels = { "XYZ", "XYZW" }; + + [SerializeField] + private int m_sizeOption = 0; + + private UpperLeftWidgetHelper m_upperLeftWidget = new UpperLeftWidgetHelper(); + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_currentVertexData = "vertex"; + ChangeOutputProperties( 0, "XYZ", WirePortDataType.FLOAT3 ); + m_drawPreviewAsSphere = true; + m_outputPorts[ 4 ].Visible = false; + m_hasLeftDropdown = true; + m_autoWrapProperties = true; + m_previewShaderGUID = "a5c14f759dd021b4b8d4b6eeb85ac227"; + } + + public override void Destroy() + { + base.Destroy(); + m_upperLeftWidget = null; + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + EditorGUI.BeginChangeCheck(); + m_sizeOption = m_upperLeftWidget.DrawWidget( this, m_sizeOption, SizeLabels ); + if( EditorGUI.EndChangeCheck() ) + { + UpdatePorts(); + } + } + + public override void DrawProperties() + { + EditorGUI.BeginChangeCheck(); + m_sizeOption = EditorGUILayoutPopup( PropertyLabel, m_sizeOption, SizeLabels ); + if ( EditorGUI.EndChangeCheck() ) + { + UpdatePorts(); + } + } + + void UpdatePorts() + { + if ( m_sizeOption == 0 ) + { + ChangeOutputProperties( 0, SizeLabels[ 0 ], WirePortDataType.FLOAT3, false ); + m_outputPorts[ 4 ].Visible = false; + } + else + { + ChangeOutputProperties( 0, SizeLabels[ 1 ], WirePortDataType.FLOAT4, false ); + m_outputPorts[ 4 ].Visible = true; + } + } + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + + if ( dataCollector.MasterNodeCategory == AvailableShaderTypes.Template ) + { + string vertexPos = dataCollector.TemplateDataCollectorInstance.GetVertexPosition( ( m_sizeOption == 0 ) ? WirePortDataType.FLOAT3 : WirePortDataType.FLOAT4, CurrentPrecisionType ); + return GetOutputVectorItem( 0, outputId, vertexPos ); + } + + + if ( dataCollector.PortCategory == MasterNodePortCategory.Fragment || dataCollector.PortCategory == MasterNodePortCategory.Debug ) + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalVar ); + + WirePortDataType sizeType = m_sizeOption == 0 ? WirePortDataType.FLOAT3 : WirePortDataType.FLOAT4; + + string vertexPosition = GeneratorUtils.GenerateVertexPosition( ref dataCollector, UniqueId, sizeType ); + return GetOutputVectorItem( 0, outputId, vertexPosition ); + + //if ( dataCollector.PortCategory == MasterNodePortCategory.Vertex || dataCollector.PortCategory == MasterNodePortCategory.Tessellation ) + //{ + // string vertexVar = base.GenerateShaderForOutput( 0, ref dataCollector, ignoreLocalVar ); + // if ( outputId != 0 ) + // { + // return GetOutputVectorItem( 0, outputId, vertexVar ); + // } + // else if ( m_sizeOption == 0 ) + // { + // vertexVar += ".xyz"; + // } + + // return vertexVar; + //} + //else + //{ + + // string vertexVar = GeneratorUtils.GenerateVertexPositionOnFrag( ref dataCollector, UniqueId, m_currentPrecisionType ); + // if ( outputId != 0 ) + // { + // return GetOutputVectorItem( 0, outputId, vertexVar ); + // } + // else if ( m_sizeOption == 0 ) + // { + // vertexVar += ".xyz"; + // } + // return GetOutputVectorItem( 0, outputId, vertexVar ); + //} + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + if ( UIUtils.CurrentShaderVersion() > 7101 ) + { + m_sizeOption = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + UpdatePorts(); + } + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_sizeOption ); + } + } +} diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/PosVertexDataNode.cs.meta b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/PosVertexDataNode.cs.meta new file mode 100644 index 00000000..9ff223e8 --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/PosVertexDataNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: fc77801277f0faf4ca0be33f565b5604 +timeCreated: 1481126960 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TangentSignVertexDataNode.cs b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TangentSignVertexDataNode.cs new file mode 100644 index 00000000..f9beb05c --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TangentSignVertexDataNode.cs @@ -0,0 +1,23 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda <info@amplify.pt> + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Vertex Tangent Sign", "Vertex Data", "Vertex tangent sign in object space, return the W value of tangent vector that contains only the sign of the tangent" )] + public sealed class TangentSignVertexDataNode : ParentNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddOutputVectorPorts( WirePortDataType.FLOAT, "Sign" ); + m_drawPreviewAsSphere = true; + m_previewShaderGUID = "f5466d126f4bb1f49917eac88b1cb6af"; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + return GeneratorUtils.GenerateVertexTangentSign( ref dataCollector, UniqueId, CurrentPrecisionType ); ; + } + } +} diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TangentSignVertexDataNode.cs.meta b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TangentSignVertexDataNode.cs.meta new file mode 100644 index 00000000..c07ffb6c --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TangentSignVertexDataNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 1f79f23d5c10c9e4fb6a59c1ef70f6fc +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TangentVertexDataNode.cs b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TangentVertexDataNode.cs new file mode 100644 index 00000000..da6d25ff --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TangentVertexDataNode.cs @@ -0,0 +1,120 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda <info@amplify.pt> +using System; +using UnityEditor; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Vertex Tangent", "Vertex Data", "Vertex tangent vector in object space, can be used in both local vertex offset and fragment outputs" )] + public sealed class TangentVertexDataNode : VertexDataNode + { + private const string PropertyLabel = "Size"; + private readonly string[] SizeLabels = { "XYZ", "XYZW" }; + + [SerializeField] + private int m_sizeOption = 0; + + private UpperLeftWidgetHelper m_upperLeftWidget = new UpperLeftWidgetHelper(); + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_currentVertexData = "tangent"; + ChangeOutputProperties( 0, "XYZ", WirePortDataType.FLOAT3 ); + m_outputPorts[ 4 ].Visible = false; + m_drawPreviewAsSphere = true; + m_hasLeftDropdown = true; + m_previewShaderGUID = "0a44bb521d06d6143a4acbc3602037f8"; + } + + public override void Destroy() + { + base.Destroy(); + m_upperLeftWidget = null; + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + EditorGUI.BeginChangeCheck(); + m_sizeOption = m_upperLeftWidget.DrawWidget( this, m_sizeOption, SizeLabels ); + if( EditorGUI.EndChangeCheck() ) + { + UpdatePorts(); + } + } + + public override void DrawProperties() + { + EditorGUI.BeginChangeCheck(); + m_sizeOption = EditorGUILayoutPopup( PropertyLabel, m_sizeOption, SizeLabels ); + if( EditorGUI.EndChangeCheck() ) + { + UpdatePorts(); + } + } + + void UpdatePorts() + { + if( m_sizeOption == 0 ) + { + ChangeOutputProperties( 0, SizeLabels[ 0 ], WirePortDataType.FLOAT3, false ); + m_outputPorts[ 4 ].Visible = false; + } + else + { + ChangeOutputProperties( 0, SizeLabels[ 1 ], WirePortDataType.FLOAT4, false ); + m_outputPorts[ 4 ].Visible = true; + } + } + + public override void PropagateNodeData( NodeData nodeData, ref MasterNodeDataCollector dataCollector ) + { + base.PropagateNodeData( nodeData, ref dataCollector ); + dataCollector.DirtyNormal = true; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + string vertexTangent = string.Empty; + if ( dataCollector.MasterNodeCategory == AvailableShaderTypes.Template ) + { + vertexTangent = dataCollector.TemplateDataCollectorInstance.GetVertexTangent( WirePortDataType.FLOAT4, CurrentPrecisionType ); + if( m_sizeOption == 0 ) + vertexTangent += ".xyz"; + + return GetOutputVectorItem( 0, outputId, vertexTangent ); + } + + if ( dataCollector.PortCategory == MasterNodePortCategory.Fragment || dataCollector.PortCategory == MasterNodePortCategory.Debug ) + { + dataCollector.ForceNormal = true; + dataCollector.AddToInput( UniqueId, SurfaceInputs.WORLD_NORMAL, CurrentPrecisionType ); + dataCollector.AddToInput( UniqueId, SurfaceInputs.INTERNALDATA, addSemiColon: false ); + } + + WirePortDataType sizeType = m_sizeOption == 0 ? WirePortDataType.FLOAT3 : WirePortDataType.FLOAT4; + + vertexTangent = GeneratorUtils.GenerateVertexTangent( ref dataCollector, UniqueId, CurrentPrecisionType, sizeType ); + return GetOutputVectorItem( 0, outputId, vertexTangent ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + if( UIUtils.CurrentShaderVersion() > 16100 ) + { + m_sizeOption = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + UpdatePorts(); + } + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_sizeOption ); + } + } +} diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TangentVertexDataNode.cs.meta b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TangentVertexDataNode.cs.meta new file mode 100644 index 00000000..2ce6f77a --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TangentVertexDataNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b544118f39abfe84581b8249973d52c5 +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation.meta b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation.meta new file mode 100644 index 00000000..89948ec8 --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 518d8e72c2385b9488817fee5368f56c +folderAsset: yes +timeCreated: 1482150091 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/DistanceBasedTessNode.cs b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/DistanceBasedTessNode.cs new file mode 100644 index 00000000..c49df07f --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/DistanceBasedTessNode.cs @@ -0,0 +1,30 @@ + +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda <info@amplify.pt> + + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Distance-based Tessellation", "Miscellaneous", "Calculates tessellation based on distance from camera" )] + public sealed class DistanceBasedTessNode : TessellationParentNode + { + private const string FunctionBody = "UnityDistanceBasedTess( v0.vertex, v1.vertex, v2.vertex, {0},{1},{2})"; + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT, false,"Factor"); + AddInputPort( WirePortDataType.FLOAT, false, "Min Dist" ); + AddInputPort( WirePortDataType.FLOAT, false, "Max Dist" ); + AddOutputPort( WirePortDataType.FLOAT4, Constants.EmptyPortValue ); + } + + protected override string BuildTessellationFunction( ref MasterNodeDataCollector dataCollector ) + { + return string.Format( FunctionBody, + m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ), + m_inputPorts[ 2 ].GeneratePortInstructions( ref dataCollector ), + m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ) ); + } + } +} diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/DistanceBasedTessNode.cs.meta b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/DistanceBasedTessNode.cs.meta new file mode 100644 index 00000000..18016c1b --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/DistanceBasedTessNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5a83fb450d164d34bb756f46b3f4290e +timeCreated: 1482150091 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/EdgeLengthCullTessNode.cs b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/EdgeLengthCullTessNode.cs new file mode 100644 index 00000000..48c5db07 --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/EdgeLengthCullTessNode.cs @@ -0,0 +1,27 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda <info@amplify.pt> + + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Edge Length Tessellation With Cull", "Miscellaneous", "Tessellation level computed based on triangle edge length on the screen with patch frustum culling" )] + public sealed class EdgeLengthCullTessNode : TessellationParentNode + { + private const string FunctionBody = "UnityEdgeLengthBasedTessCull( v0.vertex, v1.vertex, v2.vertex, {0},{1})"; + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT, false, "Edge Length" ); + AddInputPort( WirePortDataType.FLOAT, false, "Max Disp." ); + AddOutputPort( WirePortDataType.FLOAT4, Constants.EmptyPortValue ); + } + + protected override string BuildTessellationFunction( ref MasterNodeDataCollector dataCollector ) + { + return string.Format( FunctionBody, + m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ), + m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ) ); + } + } +} diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/EdgeLengthCullTessNode.cs.meta b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/EdgeLengthCullTessNode.cs.meta new file mode 100644 index 00000000..20d4dd27 --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/EdgeLengthCullTessNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 4b09c64ce2fd06a4cb4036d8cc0f8b2a +timeCreated: 1482150962 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/EdgeLengthTessNode.cs b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/EdgeLengthTessNode.cs new file mode 100644 index 00000000..f4905bf1 --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/EdgeLengthTessNode.cs @@ -0,0 +1,23 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda <info@amplify.pt> + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Edge Length Tessellation", "Miscellaneous", "Tessellation level computed based on triangle edge length on the screen" )] + public sealed class EdgeLengthTessNode : TessellationParentNode + { + private const string FunctionBody = "UnityEdgeLengthBasedTess (v0.vertex, v1.vertex, v2.vertex, {0})"; + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT, false, "Edge Length" ); + AddOutputPort( WirePortDataType.FLOAT4, Constants.EmptyPortValue ); + } + + protected override string BuildTessellationFunction( ref MasterNodeDataCollector dataCollector ) + { + return string.Format( FunctionBody, m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ) ); + } + } +} diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/EdgeLengthTessNode.cs.meta b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/EdgeLengthTessNode.cs.meta new file mode 100644 index 00000000..2c936ef7 --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/EdgeLengthTessNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: abe3e8fa4d49c9742a95ac801fd14d7d +timeCreated: 1482150962 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/TessellationParentNode.cs b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/TessellationParentNode.cs new file mode 100644 index 00000000..be14febc --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/TessellationParentNode.cs @@ -0,0 +1,29 @@ +namespace AmplifyShaderEditor +{ + public class TessellationParentNode : ParentNode + { + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_useInternalPortData = true; + } + + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if ( dataCollector.PortCategory != MasterNodePortCategory.Tessellation ) + { + UIUtils.ShowMessage( UniqueId, m_nodeAttribs.Name + " can only be used on Master Node Tessellation port" ); + return "(-1)"; + } + + return BuildTessellationFunction( ref dataCollector ); + } + + protected virtual string BuildTessellationFunction( ref MasterNodeDataCollector dataCollector ) + { + return string.Empty; + } + } +} diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/TessellationParentNode.cs.meta b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/TessellationParentNode.cs.meta new file mode 100644 index 00000000..0799224c --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/TessellationParentNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 79c24faef1fec884d937e74bdc9209da +timeCreated: 1482162387 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TexCoord1VertexDataNode.cs b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TexCoord1VertexDataNode.cs new file mode 100644 index 00000000..5297ac7d --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TexCoord1VertexDataNode.cs @@ -0,0 +1,16 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda <info@amplify.pt> + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "[VS] Vertex TexCoord1", "Vertex Data", "Second set of vertex texture coordinates. Only works on Vertex Shaders ports ( p.e. Local Vertex Offset Port )." ,null,UnityEngine.KeyCode.None,true,true, "[VS] Vertex TexCoord" )] + public sealed class TexCoord1VertexDataNode : VertexDataNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_currentVertexData = "texcoord1"; + } + } +} diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TexCoord1VertexDataNode.cs.meta b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TexCoord1VertexDataNode.cs.meta new file mode 100644 index 00000000..68529273 --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TexCoord1VertexDataNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ebd7eb3a7f6149e4e9dacbcda2d8089f +timeCreated: 1481126960 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TexCoordVertexDataNode.cs b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TexCoordVertexDataNode.cs new file mode 100644 index 00000000..832b02a2 --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TexCoordVertexDataNode.cs @@ -0,0 +1,235 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda <info@amplify.pt> + +using System; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Vertex TexCoord", "Vertex Data", "Vertex texture coordinates, can be used in both local vertex offset and fragment outputs", tags: "uv" )] + public sealed class TexCoordVertexDataNode : VertexDataNode + { + [SerializeField] + private int m_texcoordSize = 2; + + [SerializeField] + private int m_index = 0; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_currentVertexData = "texcoord"; + ChangeOutputProperties( 0, "UV", WirePortDataType.FLOAT2, false ); + m_outputPorts[ 1 ].Name = "U"; + m_outputPorts[ 2 ].Name = "V"; + m_outputPorts[ 3 ].Visible = false; + m_outputPorts[ 4 ].Visible = false; + m_outputPorts[ 3 ].Name = "W"; + m_outputPorts[ 4 ].Name = "T"; + m_autoWrapProperties = true; + m_hasLeftDropdown = true; + m_previewShaderGUID = "6c1bee77276896041bbb73b1b9e7f8ac"; + } + + public override void DrawProperties() + { + base.DrawProperties(); + EditorGUI.BeginChangeCheck(); + m_texcoordSize = EditorGUILayoutIntPopup( Constants.AvailableUVSizesLabel, m_texcoordSize, Constants.AvailableUVSizesStr, Constants.AvailableUVSizes ); + if( EditorGUI.EndChangeCheck() ) + { + UpdateOutput(); + } + + EditorGUI.BeginChangeCheck(); + m_index = EditorGUILayoutIntPopup( Constants.AvailableUVChannelLabel, m_index, Constants.AvailableUVSetsStr, Constants.AvailableUVChannels ); + if( EditorGUI.EndChangeCheck() ) + { + m_currentVertexData = ( m_index == 0 ) ? "texcoord" : "texcoord" + Constants.AvailableUVChannelsStr[ m_index ]; + } + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + + if( m_dropdownEditing ) + { + EditorGUI.BeginChangeCheck(); + m_texcoordSize = EditorGUIIntPopup( m_dropdownRect, m_texcoordSize, Constants.AvailableUVSizesStr, Constants.AvailableUVSizes, UIUtils.PropertyPopUp ); + if( EditorGUI.EndChangeCheck() ) + { + UpdateOutput(); + DropdownEditing = false; + } + } + } + + private void UpdateOutput() + { + if( m_texcoordSize == 3 ) + { + m_outputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT3, false ); + m_outputPorts[ 0 ].Name = "UVW"; + m_outputPorts[ 3 ].Visible = true; + m_outputPorts[ 4 ].Visible = false; + } + else if( m_texcoordSize == 4 ) + { + m_outputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT4, false ); + m_outputPorts[ 0 ].Name = "UVWT"; + m_outputPorts[ 3 ].Visible = true; + m_outputPorts[ 4 ].Visible = true; + } + else + { + m_texcoordSize = 2; + m_outputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT2, false ); + m_outputPorts[ 0 ].Name = "UV"; + m_outputPorts[ 3 ].Visible = false; + m_outputPorts[ 4 ].Visible = false; + } + m_sizeIsDirty = true; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + if( dataCollector.IsTemplate ) + { + if( !dataCollector.TemplateDataCollectorInstance.HasUV( m_index ) ) + { + dataCollector.TemplateDataCollectorInstance.RegisterUV( m_index, m_outputPorts[ 0 ].DataType ); + } + + if( dataCollector.TemplateDataCollectorInstance.HasUV( m_index ) ) + { + InterpDataHelper info = dataCollector.TemplateDataCollectorInstance.GetUVInfo( m_index ); + if( outputId == 0 ) + { + return dataCollector.TemplateDataCollectorInstance.GetUVName( m_index, m_outputPorts[ 0 ].DataType ); + } + else if( outputId <= TemplateHelperFunctions.DataTypeChannelUsage[ info.VarType ] ) + { + return GetOutputVectorItem( 0, outputId, info.VarName ); + } + Debug.LogWarning( "Attempting to access inexisting UV channel" ); + } + else + { + Debug.LogWarning( "Attempting to access non-registered UV" ); + } + return "0"; + } + + if( dataCollector.PortCategory == MasterNodePortCategory.Fragment || dataCollector.PortCategory == MasterNodePortCategory.Debug ) + { + if( m_texcoordSize > 2 ) + dataCollector.UsingHigherSizeTexcoords = true; + } + + WirePortDataType size = (WirePortDataType)( 1 << ( m_texcoordSize + 1 ) ); + string texcoords = GeneratorUtils.GenerateAutoUVs( ref dataCollector, UniqueId, m_index, null, size ); + return GetOutputVectorItem( 0, outputId, texcoords ); + } + + /// <summary> + /// Generates UV properties and uniforms and returns the varible name to use in the fragment shader + /// </summary> + /// <param name="dataCollector"></param> + /// <param name="uniqueId"></param> + /// <param name="index"></param> + /// <returns>frag variable name</returns> + static public string GenerateFragUVs( ref MasterNodeDataCollector dataCollector, int uniqueId, int index, string propertyName = null, WirePortDataType size = WirePortDataType.FLOAT2 ) + { + string dummyPropUV = "_texcoord" + ( index > 0 ? ( index + 1 ).ToString() : "" ); + string dummyUV = "uv" + ( index > 0 ? ( index + 1 ).ToString() : "" ) + dummyPropUV; + + dataCollector.AddToProperties( uniqueId, "[HideInInspector] " + dummyPropUV + "( \"\", 2D ) = \"white\" {}", 100 ); + dataCollector.AddToInput( uniqueId, dummyUV, size ); + + string result = Constants.InputVarStr + "." + dummyUV; + if( !string.IsNullOrEmpty( propertyName ) ) + { + dataCollector.AddToUniforms( uniqueId, "uniform float4 " + propertyName + "_ST;" ); + dataCollector.AddToLocalVariables( uniqueId, PrecisionType.Float, size, "uv" + propertyName, result + " * " + propertyName + "_ST.xy + " + propertyName + "_ST.zw" ); + result = "uv" + propertyName; + } + + return result; + } + + static public string GenerateVertexUVs( ref MasterNodeDataCollector dataCollector, int uniqueId, int index, string propertyName = null, WirePortDataType size = WirePortDataType.FLOAT2 ) + { + + string result = Constants.VertexShaderInputStr + ".texcoord"; + if( index > 0 ) + { + result += index.ToString(); + } + + switch( size ) + { + default: + case WirePortDataType.FLOAT2: + { + result += ".xy"; + } + break; + case WirePortDataType.FLOAT3: + { + result += ".xyz"; + } + break; + case WirePortDataType.FLOAT4: break; + } + + if( !string.IsNullOrEmpty( propertyName ) ) + { + dataCollector.AddToUniforms( uniqueId, "uniform float4 " + propertyName + "_ST;" ); + dataCollector.AddToVertexLocalVariables( uniqueId, UIUtils.WirePortToCgType( size ) + " uv" + propertyName + " = " + Constants.VertexShaderInputStr + ".texcoord" + ( index > 0 ? index.ToString() : string.Empty ) + " * " + propertyName + "_ST.xy + " + propertyName + "_ST.zw;" ); + result = "uv" + propertyName; + } + + return result; + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + if( UIUtils.CurrentShaderVersion() > 2502 ) + { + m_index = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + } + + if( UIUtils.CurrentShaderVersion() > 5111 ) + { + m_texcoordSize = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + UpdateOutput(); + } + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_index ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_texcoordSize ); + } + + public override void PropagateNodeData( NodeData nodeData, ref MasterNodeDataCollector dataCollector ) + { + base.PropagateNodeData( nodeData, ref dataCollector ); + if( dataCollector.IsTemplate ) + { + dataCollector.TemplateDataCollectorInstance.SetUVUsage( m_index, m_texcoordSize ); + } + else if( m_index > 3 ) + { + dataCollector.AddCustomAppData( string.Format( TemplateHelperFunctions.TexUVFullSemantic, m_index ) ); + } + } + + + } +} diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TexCoordVertexDataNode.cs.meta b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TexCoordVertexDataNode.cs.meta new file mode 100644 index 00000000..54fd39ff --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TexCoordVertexDataNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b865968ce22b9d949993e5e60126eb11 +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexBinormalNode.cs b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexBinormalNode.cs new file mode 100644 index 00000000..70a7d7b5 --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexBinormalNode.cs @@ -0,0 +1,48 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda <info@amplify.pt> +// +// Custom Node Vertex Binormal World +// Donated by Community Member Kebrus + +using UnityEngine; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "World Bitangent", "Surface Data", "Per pixel world bitangent vector", null, KeyCode.None, true, false, null, null, "kebrus" )] + public sealed class VertexBinormalNode : ParentNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddOutputVectorPorts( WirePortDataType.FLOAT3, "XYZ" ); + m_drawPreviewAsSphere = true; + m_previewShaderGUID = "76873532ab67d2947beaf07151383cbe"; + } + + public override void PropagateNodeData( NodeData nodeData, ref MasterNodeDataCollector dataCollector ) + { + base.PropagateNodeData( nodeData, ref dataCollector ); + dataCollector.DirtyNormal = true; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if ( dataCollector.IsTemplate ) + return GetOutputVectorItem( 0, outputId, dataCollector.TemplateDataCollectorInstance.GetWorldBinormal( CurrentPrecisionType ) ); + + if( dataCollector.PortCategory == MasterNodePortCategory.Fragment || dataCollector.PortCategory == MasterNodePortCategory.Debug ) + { + dataCollector.ForceNormal = true; + + dataCollector.AddToInput( UniqueId, SurfaceInputs.WORLD_NORMAL, CurrentPrecisionType ); + dataCollector.AddToInput( UniqueId, SurfaceInputs.INTERNALDATA, addSemiColon: false ); + } + + string worldBitangent = GeneratorUtils.GenerateWorldBitangent( ref dataCollector, UniqueId ); + + return GetOutputVectorItem( 0, outputId, worldBitangent ); + } + } +} diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexBinormalNode.cs.meta b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexBinormalNode.cs.meta new file mode 100644 index 00000000..b990b9a0 --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexBinormalNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 8ae297dac4e208f4e86c8f7a022fc5bd +timeCreated: 1481126957 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexColorNode.cs b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexColorNode.cs new file mode 100644 index 00000000..53ef5763 --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexColorNode.cs @@ -0,0 +1,47 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda <info@amplify.pt> + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Vertex Color", "Vertex Data", "Vertex color interpolated on fragment" )] + public sealed class VertexColorNode : VertexDataNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_currentVertexData = "color"; + m_outputPorts[ 0 ].Name = "RGBA"; + ConvertFromVectorToColorPorts(); + m_drawPreviewAsSphere = true; + m_previewShaderGUID = "ca1d22db6470c5f4d9f93a9873b4f5bc"; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + if( dataCollector.MasterNodeCategory == AvailableShaderTypes.Template ) + { + string color = dataCollector.TemplateDataCollectorInstance.GetVertexColor( CurrentPrecisionType ); + return GetOutputColorItem( 0, outputId, color ); + } + + if( dataCollector.PortCategory == MasterNodePortCategory.Vertex || dataCollector.PortCategory == MasterNodePortCategory.Tessellation ) + { + return base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalVar ); + } + else + { + dataCollector.AddToInput( UniqueId, SurfaceInputs.COLOR ); + string result = Constants.InputVarStr + "." + Constants.ColorVariable; + switch( outputId ) + { + case 1: result += ".r"; break; + case 2: result += ".g"; break; + case 3: result += ".b"; break; + case 4: result += ".a"; break; + } + return result; + } + } + } +} diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexColorNode.cs.meta b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexColorNode.cs.meta new file mode 100644 index 00000000..ac1eee78 --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexColorNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6271f602b9ab61e4c9a96a91e473c1e0 +timeCreated: 1481126956 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexDataNode.cs b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexDataNode.cs new file mode 100644 index 00000000..9fa8cffd --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexDataNode.cs @@ -0,0 +1,50 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda <info@amplify.pt> + +using UnityEngine; +using System; + +namespace AmplifyShaderEditor +{ + //public enum VertexData + //{ + // vertex = 0, + // tangent, + // normal, + // texcoord, + // texcoord1, + // color + //} + + [Serializable] + public class VertexDataNode : ParentNode + { + [SerializeField] + protected string m_currentVertexData; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_currentVertexData = "vertex"; + +// Type type = typeof( StandardSurfaceOutputNode ); + //m_restictions.AddPortRestriction( type, 0 ); + //m_restictions.AddPortRestriction( type, 2 ); + //m_restictions.AddPortRestriction( type, 3 ); + //m_restictions.AddPortRestriction( type, 4 ); + //m_restictions.AddPortRestriction( type, 5 ); + //m_restictions.AddPortRestriction( type, 6 ); + //m_restictions.AddPortRestriction( type, 7 ); + //m_restictions.AddPortRestriction( type, 8 ); + //m_restictions.AddPortRestriction( type, 9 ); + //m_restictions.AddPortRestriction( type, 10 ); + AddOutputVectorPorts( WirePortDataType.FLOAT4, "Out" ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalVar ); + return GetOutputVectorItem( 0, outputId, Constants.VertexShaderInputStr + "." + m_currentVertexData ); + } + } +} diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexDataNode.cs.meta b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexDataNode.cs.meta new file mode 100644 index 00000000..66737ecd --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexDataNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: e5f8fa23e49e4be478b283a704459767 +timeCreated: 1481126960 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexTangentNode.cs b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexTangentNode.cs new file mode 100644 index 00000000..b4e6064f --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexTangentNode.cs @@ -0,0 +1,50 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda <info@amplify.pt> +// +// Custom Node Vertex Tangent World +// Donated by Community Member Kebrus + +using UnityEngine; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "World Tangent", "Surface Data", "Per pixel world tangent vector", null, KeyCode.None, true, false, null, null, "kebrus" )] + public sealed class VertexTangentNode : ParentNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddOutputVectorPorts( WirePortDataType.FLOAT3, "XYZ" ); + m_drawPreviewAsSphere = true; + m_previewShaderGUID = "61f0b80493c9b404d8c7bf56d59c3f81"; + } + + public override void PropagateNodeData( NodeData nodeData, ref MasterNodeDataCollector dataCollector ) + { + base.PropagateNodeData( nodeData , ref dataCollector ); + dataCollector.DirtyNormal = true; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if ( dataCollector.IsTemplate ) + { + return GetOutputVectorItem( 0, outputId, dataCollector.TemplateDataCollectorInstance.GetWorldTangent( CurrentPrecisionType ) ); + } + + if( dataCollector.PortCategory == MasterNodePortCategory.Fragment || dataCollector.PortCategory == MasterNodePortCategory.Debug ) + { + dataCollector.ForceNormal = true; + + dataCollector.AddToInput( UniqueId, SurfaceInputs.WORLD_NORMAL, CurrentPrecisionType ); + dataCollector.AddToInput( UniqueId, SurfaceInputs.INTERNALDATA, addSemiColon: false ); + } + + string worldTangent = GeneratorUtils.GenerateWorldTangent( ref dataCollector, UniqueId ); + + return GetOutputVectorItem( 0, outputId, worldTangent ); + } + } +} diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexTangentNode.cs.meta b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexTangentNode.cs.meta new file mode 100644 index 00000000..d3f0bbf2 --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexTangentNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3aca1dfe55df44d4cbaf99d5a40f7470 +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexToFragmentNode.cs b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexToFragmentNode.cs new file mode 100644 index 00000000..844675f4 --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexToFragmentNode.cs @@ -0,0 +1,120 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda <info@amplify.pt> +// +// Custom Node Vertex To Fragment +// Donated by Jason Booth - http://u3d.as/DND + +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Vertex To Fragment", "Miscellaneous", "Pass vertex data to the pixel shader", null, KeyCode.None, true, false, null, null, "Jason Booth - http://u3d.as/DND" )] + public sealed class VertexToFragmentNode : SingleInputOp + { + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_inputPorts[ 0 ].AddPortForbiddenTypes( WirePortDataType.FLOAT3x3, + WirePortDataType.FLOAT4x4, + WirePortDataType.SAMPLER1D, + WirePortDataType.SAMPLER2D, + WirePortDataType.SAMPLER3D, + WirePortDataType.SAMPLERCUBE ); + m_inputPorts[ 0 ].Name = "(VS) In"; + m_outputPorts[ 0 ].Name = "Out"; + m_useInternalPortData = false; + m_previewShaderGUID = "74e4d859fbdb2c0468de3612145f4929"; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + string varName = GenerateInputInVertex( ref dataCollector, 0, "vertexToFrag" + OutputId,true ); + m_outputPorts[ 0 ].SetLocalValue( varName, dataCollector.PortCategory ); + + return varName; + + ////TEMPLATES + //if( dataCollector.IsTemplate ) + //{ + // if( !dataCollector.IsFragmentCategory ) + // return m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + + // string varName = "vertexToFrag" + OutputId; + // if( dataCollector.TemplateDataCollectorInstance.HasCustomInterpolatedData( varName ) ) + // return varName; + + // MasterNodePortCategory category = dataCollector.PortCategory; + // dataCollector.PortCategory = MasterNodePortCategory.Vertex; + // bool dirtyVertexVarsBefore = dataCollector.DirtyVertexVariables; + // ContainerGraph.ResetNodesLocalVariablesIfNot( this, MasterNodePortCategory.Vertex ); + + // string data = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + + // dataCollector.PortCategory = category; + // if( !dirtyVertexVarsBefore && dataCollector.DirtyVertexVariables ) + // { + // dataCollector.AddVertexInstruction( dataCollector.VertexLocalVariables, UniqueId, false ); + // dataCollector.ClearVertexLocalVariables(); + // ContainerGraph.ResetNodesLocalVariablesIfNot( this, MasterNodePortCategory.Vertex ); + // } + + // ContainerGraph.ResetNodesLocalVariablesIfNot( this, MasterNodePortCategory.Fragment ); + + // dataCollector.TemplateDataCollectorInstance.RegisterCustomInterpolatedData( varName, m_inputPorts[ 0 ].DataType, m_currentPrecisionType, data ); + // //return varName; + + // m_outputPorts[ 0 ].SetLocalValue( varName ); + // return m_outputPorts[ 0 ].LocalValue; + //} + + ////SURFACE + //{ + // if( !dataCollector.IsFragmentCategory ) + // { + // return m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + // } + + // if( dataCollector.TesselationActive ) + // { + // UIUtils.ShowMessage( "Unable to use Vertex to Frag when Tessellation is active" ); + // return m_outputPorts[ 0 ].ErrorValue; + // } + + + // string interpName = "data" + OutputId; + // dataCollector.AddToInput( UniqueId, interpName, m_inputPorts[ 0 ].DataType, m_currentPrecisionType ); + + // MasterNodePortCategory portCategory = dataCollector.PortCategory; + // dataCollector.PortCategory = MasterNodePortCategory.Vertex; + + // bool dirtyVertexVarsBefore = dataCollector.DirtyVertexVariables; + + // ContainerGraph.ResetNodesLocalVariablesIfNot( this, MasterNodePortCategory.Vertex ); + + // string vertexVarValue = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + // dataCollector.AddLocalVariable( UniqueId, Constants.VertexShaderOutputStr + "." + interpName, vertexVarValue + ";" ); + + // dataCollector.PortCategory = portCategory; + + // if( !dirtyVertexVarsBefore && dataCollector.DirtyVertexVariables ) + // { + // dataCollector.AddVertexInstruction( dataCollector.VertexLocalVariables, UniqueId, false ); + // dataCollector.ClearVertexLocalVariables(); + // ContainerGraph.ResetNodesLocalVariablesIfNot( this, MasterNodePortCategory.Vertex ); + // } + + // ContainerGraph.ResetNodesLocalVariablesIfNot( this, MasterNodePortCategory.Fragment ); + + // //return Constants.InputVarStr + "." + interpName; + + // m_outputPorts[ 0 ].SetLocalValue( Constants.InputVarStr + "." + interpName ); + // return m_outputPorts[ 0 ].LocalValue; + //} + } + } +} diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexToFragmentNode.cs.meta b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexToFragmentNode.cs.meta new file mode 100644 index 00000000..0131f745 --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexToFragmentNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 9ecea5c13558ad4499dd4bc558670b8e +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: |