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 ) );
- }
- }
- }
|