| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 | // Amplify Shader Editor - Visual Shader Editing Tool// Copyright (c) Amplify Creations, Lda <info@amplify.pt>using UnityEngine;using UnityEditor;using System;namespace AmplifyShaderEditor{	[Serializable]	[NodeAttributes( "Scale", "Math Operators", "Scales input value by a float factor" )]	public sealed class ScaleNode : ParentNode	{		private const string ScaleFactorStr = "Scale";		[SerializeField]		private float m_scaleFactor = 1;		private int m_cachedPropertyId = -1;		private const float LabelWidth = 8;		protected override void CommonInit( int uniqueId )		{			base.CommonInit( uniqueId );			AddInputPort( WirePortDataType.FLOAT, false, " " );			AddOutputPort( WirePortDataType.FLOAT, " " );			m_insideSize.Set( 50, 10 );			m_autoWrapProperties = true;			m_previewShaderGUID = "6d8ec9d9dab62c44aa2dcc0e3987760d";		}		public override void SetPreviewInputs()		{			base.SetPreviewInputs();			if ( m_cachedPropertyId == -1 )				m_cachedPropertyId = Shader.PropertyToID( "_ScaleFloat" );			PreviewMaterial.SetFloat( m_cachedPropertyId, m_scaleFactor );		}		public override void DrawProperties()		{			base.DrawProperties();			m_scaleFactor = EditorGUILayoutFloatField( ScaleFactorStr, m_scaleFactor );		}		public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true )		{			base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode );			m_inputPorts[ 0 ].MatchPortToConnection();			m_outputPorts[ 0 ].ChangeType( m_inputPorts[ 0 ].DataType, false );		}		public override void OnConnectedOutputNodeChanges( int outputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type )		{			base.OnConnectedOutputNodeChanges( outputPortId, otherNodeId, otherPortId, name, type );			m_inputPorts[ 0 ].MatchPortToConnection();			m_outputPorts[ 0 ].ChangeType( InputPorts[ 0 ].DataType, false );		}		public override void OnNodeLayout( DrawInfo drawInfo )		{			base.OnNodeLayout( drawInfo );			m_propertyDrawPos.x = m_remainingBox.x + Constants.FLOAT_WIDTH_SPACING * drawInfo.InvertedZoom * 0.5f;			m_propertyDrawPos.y = m_remainingBox.y + Constants.INPUT_PORT_DELTA_Y * drawInfo.InvertedZoom * 0.5f;			m_propertyDrawPos.width = drawInfo.InvertedZoom * Constants.FLOAT_DRAW_WIDTH_FIELD_SIZE;			m_propertyDrawPos.height = drawInfo.InvertedZoom * Constants.FLOAT_DRAW_HEIGHT_FIELD_SIZE;		}		public override void DrawGUIControls( DrawInfo drawInfo )		{			base.DrawGUIControls( drawInfo );			if ( drawInfo.CurrentEventType != EventType.MouseDown )				return;			Rect hitBox = m_remainingBox;			hitBox.xMin -= LabelWidth * drawInfo.InvertedZoom;			bool insideBox = hitBox.Contains( drawInfo.MousePosition );			if ( insideBox )			{				GUI.FocusControl( null );				m_isEditingFields = true;			}			else if ( m_isEditingFields && !insideBox )			{				GUI.FocusControl( null );				m_isEditingFields = false;			}		}		private bool m_isEditingFields;		private float m_previousValue;		private string m_fieldText = "0";		public override void Draw( DrawInfo drawInfo )		{			base.Draw( drawInfo );			if ( !m_isVisible )				return;			if ( m_isEditingFields )			{				UIUtils.DrawFloat( this, ref m_propertyDrawPos, ref m_scaleFactor, LabelWidth );			}			else if ( drawInfo.CurrentEventType == EventType.Repaint )			{				Rect fakeField = m_propertyDrawPos;				fakeField.xMin += LabelWidth * drawInfo.InvertedZoom;				Rect fakeLabel = m_propertyDrawPos;				fakeLabel.xMax = fakeField.xMin;				EditorGUIUtility.AddCursorRect( fakeLabel, MouseCursor.SlideArrow );				EditorGUIUtility.AddCursorRect( fakeField, MouseCursor.Text );				if ( m_previousValue != m_scaleFactor )				{					m_previousValue = m_scaleFactor;					m_fieldText = m_scaleFactor.ToString();				}				GUI.Label( fakeField, m_fieldText, UIUtils.MainSkin.textField );			}		}		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 portResult = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector );			string result = "( " + portResult + " * " + m_scaleFactor + " )";			return CreateOutputLocalVariable( 0, result, ref dataCollector );		}		public override void WriteToString( ref string nodeInfo, ref string connectionsInfo )		{			base.WriteToString( ref nodeInfo, ref connectionsInfo );			IOUtils.AddFieldValueToString( ref nodeInfo, m_scaleFactor );		}		public override void ReadFromString( ref string[] nodeParams )		{			base.ReadFromString( ref nodeParams );			m_scaleFactor = Convert.ToSingle( GetCurrentParam( ref nodeParams ) );		}	}}
 |