123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- using UnityEngine;
- using UnityEditor;
- using System;
- namespace AmplifyShaderEditor
- {
- [Serializable]
- [NodeAttributes( "Parallax Mapping", "UV Coordinates", "Calculates offseted UVs for parallax mapping" )]
- public sealed class ParallaxMappingNode : ParentNode
- {
- private enum ParallaxType { Normal, Planar }
- [SerializeField]
- private int m_selectedParallaxTypeInt = 0;
- [SerializeField]
- private ParallaxType m_selectedParallaxType = ParallaxType.Normal;
- private readonly string[] m_parallaxTypeStr = { "Normal", "Planar" };
- private int m_cachedPropertyId = -1;
- private UpperLeftWidgetHelper m_upperLeftWidget = new UpperLeftWidgetHelper();
- protected override void CommonInit( int uniqueId )
- {
- base.CommonInit( uniqueId );
- AddInputPort( WirePortDataType.FLOAT2, false, "UV" );
- AddInputPort( WirePortDataType.FLOAT, false, "Height" );
- AddInputPort( WirePortDataType.FLOAT, false, "Scale" );
- AddInputPort( WirePortDataType.FLOAT3, false, "ViewDir (tan)" );
- AddOutputPort( WirePortDataType.FLOAT2, "Out" );
- m_useInternalPortData = true;
- m_autoDrawInternalPortData = true;
- m_autoWrapProperties = true;
- m_textLabelWidth = 105;
- UpdateTitle();
- m_forceDrawPreviewAsPlane = true;
- m_hasLeftDropdown = true;
- m_previewShaderGUID = "589f12f68e00ac74286815aa56053fcc";
- }
- public override void Destroy()
- {
- base.Destroy();
- m_upperLeftWidget = null;
- }
- public override void SetPreviewInputs()
- {
- base.SetPreviewInputs();
- if( m_cachedPropertyId == -1 )
- m_cachedPropertyId = Shader.PropertyToID( "_ParallaxType" );
- PreviewMaterial.SetFloat( m_cachedPropertyId, ( m_selectedParallaxType == ParallaxType.Normal ? 0 : 1 ) );
- }
- public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar )
- {
- base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar );
- string textcoords = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector );
- string height = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector );
- string scale = m_inputPorts[ 2 ].GeneratePortInstructions( ref dataCollector );
- string viewDirTan = m_inputPorts[ 3 ].GeneratePortInstructions( ref dataCollector );
- string localVarName = "Offset" + OutputId;
- string calculation = "";
- switch( m_selectedParallaxType )
- {
- default:
- case ParallaxType.Normal:
- calculation = "( ( " + height + " - 1 ) * " + viewDirTan + ".xy * " + scale + " ) + " + textcoords;
- break;
- case ParallaxType.Planar:
- calculation = "( ( " + height + " - 1 ) * ( " + viewDirTan + ".xy / " + viewDirTan + ".z ) * " + scale + " ) + " + textcoords;
- break;
- }
- dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, m_outputPorts[ 0 ].DataType, localVarName, calculation );
- //dataCollector.AddToLocalVariables( UniqueId, m_currentPrecisionType, m_outputPorts[ 0 ].DataType, localVarName, calculation );
- return GetOutputVectorItem( 0, outputId, localVarName );
- }
- public override void Draw( DrawInfo drawInfo )
- {
- base.Draw( drawInfo );
- EditorGUI.BeginChangeCheck();
- m_selectedParallaxTypeInt = m_upperLeftWidget.DrawWidget( this, m_selectedParallaxTypeInt, m_parallaxTypeStr );
- if( EditorGUI.EndChangeCheck() )
- {
- switch( m_selectedParallaxTypeInt )
- {
- default:
- case 0: m_selectedParallaxType = ParallaxType.Normal; break;
- case 1: m_selectedParallaxType = ParallaxType.Planar; break;
- }
- UpdateTitle();
- }
- }
- public override void DrawProperties()
- {
- base.DrawProperties();
-
- EditorGUI.BeginChangeCheck();
- m_selectedParallaxTypeInt = EditorGUILayoutPopup( "Parallax Type", m_selectedParallaxTypeInt, m_parallaxTypeStr );
- if( EditorGUI.EndChangeCheck() )
- {
- switch( m_selectedParallaxTypeInt )
- {
- default:
- case 0: m_selectedParallaxType = ParallaxType.Normal; break;
- case 1: m_selectedParallaxType = ParallaxType.Planar; break;
- }
- UpdateTitle();
- }
- EditorGUILayout.HelpBox( "Normal type does a cheaper approximation thats view dependent while Planar is more accurate but generates higher aliasing artifacts at steep angles.", MessageType.None );
- }
- void UpdateTitle()
- {
- m_additionalContent.text = string.Format( Constants.SubTitleTypeFormatStr, m_parallaxTypeStr[ m_selectedParallaxTypeInt ] );
- }
- public override void ReadFromString( ref string[] nodeParams )
- {
- base.ReadFromString( ref nodeParams );
- m_selectedParallaxType = (ParallaxType)Enum.Parse( typeof( ParallaxType ), GetCurrentParam( ref nodeParams ) );
- switch( m_selectedParallaxType )
- {
- default:
- case ParallaxType.Normal: m_selectedParallaxTypeInt = 0; break;
- case ParallaxType.Planar: m_selectedParallaxTypeInt = 1; break;
- }
- UpdateTitle();
- }
- public override void WriteToString( ref string nodeInfo, ref string connectionsInfo )
- {
- base.WriteToString( ref nodeInfo, ref connectionsInfo );
- IOUtils.AddFieldValueToString( ref nodeInfo, m_selectedParallaxType );
- }
- }
- }
|