summaryrefslogtreecommitdiff
path: root/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/TexturePropertyNode.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/TexturePropertyNode.cs')
-rw-r--r--Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/TexturePropertyNode.cs1175
1 files changed, 1175 insertions, 0 deletions
diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/TexturePropertyNode.cs b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/TexturePropertyNode.cs
new file mode 100644
index 00000000..6f3e1016
--- /dev/null
+++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/TexturePropertyNode.cs
@@ -0,0 +1,1175 @@
+// Amplify Shader Editor - Visual Shader Editing Tool
+// Copyright (c) Amplify Creations, Lda <info@amplify.pt>
+
+using UnityEngine;
+using UnityEditor;
+using System;
+
+namespace AmplifyShaderEditor
+{
+ public enum TexturePropertyValues
+ {
+ white,
+ black,
+ gray,
+ bump
+ }
+
+ public enum TextureType
+ {
+ Texture1D,
+ Texture2D,
+ Texture3D,
+ Cube,
+ Texture2DArray,
+ ProceduralTexture
+ }
+
+ public enum AutoCastType
+ {
+ Auto = 0,
+ LockedToTexture1D,
+ LockedToTexture2D,
+ LockedToTexture3D,
+ LockedToCube,
+ LockedToTexture2DArray
+ }
+
+
+ [Serializable]
+ [NodeAttributes( "Texture Object", "Textures", "Represents a Texture Asset. Can be used in samplers <b>Tex</b> inputs or shader function inputs to reuse the same texture multiple times.", SortOrderPriority = 1 )]
+ public class TexturePropertyNode : PropertyNode
+ {
+ private const string ObjectSelectorCmdStr = "ObjectSelectorClosed";
+
+ protected readonly string[] AvailablePropertyTypeLabels = { PropertyType.Property.ToString(), PropertyType.Global.ToString() };
+ protected readonly int[] AvailablePropertyTypeValues = { (int)PropertyType.Property, (int)PropertyType.Global };
+
+ protected const int OriginalFontSizeUpper = 9;
+ protected const int OriginalFontSizeLower = 9;
+
+ protected const string DefaultTextureStr = "Default Texture";
+ protected const string AutoCastModeStr = "Auto-Cast Mode";
+
+ protected const string AutoUnpackNormalsStr = "Normal";
+
+ [SerializeField]
+ protected Texture m_defaultValue;
+
+ [SerializeField]
+ protected Texture m_materialValue;
+
+ [SerializeField]
+ protected TexturePropertyValues m_defaultTextureValue;
+
+ [SerializeField]
+ protected bool m_isNormalMap;
+
+ [SerializeField]
+ protected System.Type m_textureType = typeof( Texture2D );
+
+ [SerializeField]
+ protected int m_useSamplerArrayIdx = -1;
+
+ //[SerializeField]
+ //protected bool m_isTextureFetched;
+
+ //[SerializeField]
+ //protected string m_textureFetchedValue;
+
+ [SerializeField]
+ protected TextureType m_currentType = TextureType.Texture2D;
+
+ [SerializeField]
+ protected AutoCastType m_autocastMode = AutoCastType.Auto;
+
+ protected int PreviewSizeX = 128;
+ protected int PreviewSizeY = 128;
+
+ protected bool m_linearTexture;
+
+ protected TexturePropertyNode m_textureProperty = null;
+
+ protected bool m_drawPicker;
+
+ protected bool m_drawAutocast = true;
+
+ protected int m_cachedSamplerId = -1;
+ protected int m_cachedSamplerIdArray = -1;
+ protected int m_cachedSamplerIdCube = -1;
+ protected int m_cachedSamplerId3D = -1;
+ protected int m_defaultId = -1;
+ protected int m_typeId = -1;
+
+ private TextureType m_previousType = TextureType.Texture2D;
+ private string m_labelText = "None (Texture2D)";
+
+ protected bool m_isEditingPicker;
+
+ public TexturePropertyNode() : base() { }
+ public TexturePropertyNode( int uniqueId, float x, float y, float width, float height ) : base( uniqueId, x, y, width, height ) { }
+ protected override void CommonInit( int uniqueId )
+ {
+ base.CommonInit( uniqueId );
+ GlobalTypeWarningText = string.Format( GlobalTypeWarningText, "Texture" );
+ m_defaultTextureValue = TexturePropertyValues.white;
+ m_insideSize.Set( PreviewSizeX, PreviewSizeY + 5 );
+ AddOutputPort( WirePortDataType.SAMPLER2D, "Tex" );
+ m_outputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.SAMPLER1D, WirePortDataType.SAMPLER2D, WirePortDataType.SAMPLER3D, WirePortDataType.SAMPLERCUBE, WirePortDataType.OBJECT );
+ m_currentParameterType = PropertyType.Property;
+ m_customPrefix = "Texture ";
+ m_drawPrecisionUI = false;
+ m_showVariableMode = true;
+ m_freeType = false;
+ m_drawPicker = true;
+ m_hasLeftDropdown = true;
+ m_textLabelWidth = 115;
+ m_longNameSize = 225;
+ m_availableAttribs.Add( new PropertyAttributes( "No Scale Offset", "[NoScaleOffset]" ) );
+ m_availableAttribs.Add( new PropertyAttributes( "Normal", "[Normal]" ) );
+ m_availableAttribs.Add( new PropertyAttributes( "Single Line Texture", "[SingleLineTexture]" ) );
+ m_showPreview = true;
+ m_drawPreviewExpander = false;
+ m_drawPreview = false;
+ m_drawPreviewMaskButtons = false;
+ m_previewShaderGUID = "e53988745ec6e034694ee2640cd3d372";
+ }
+
+ public override void AfterCommonInit()
+ {
+ base.AfterCommonInit();
+ m_hasLeftDropdown = true;
+ }
+
+ protected void SetPreviewTexture( Texture newValue )
+ {
+ if( newValue is Cubemap )
+ {
+ PreviewMaterial.SetInt( m_typeId, 3 );
+
+ if( m_cachedSamplerIdCube == -1 )
+ m_cachedSamplerIdCube = Shader.PropertyToID( "_Cube" );
+
+ PreviewMaterial.SetTexture( m_cachedSamplerIdCube, newValue as Cubemap );
+ }
+ else if( newValue is Texture2DArray )
+ {
+ PreviewMaterial.SetInt( m_typeId, 4 );
+
+ if( m_cachedSamplerIdArray == -1 )
+ m_cachedSamplerIdArray = Shader.PropertyToID( "_Array" );
+
+ PreviewMaterial.SetTexture( m_cachedSamplerIdArray, newValue as Texture2DArray );
+ }
+ else if( newValue is Texture3D )
+ {
+ PreviewMaterial.SetInt( m_typeId, 2 );
+
+ if( m_cachedSamplerId3D == -1 )
+ m_cachedSamplerId3D = Shader.PropertyToID( "_Sampler3D" );
+
+ PreviewMaterial.SetTexture( m_cachedSamplerId3D, newValue as Texture3D );
+ }
+ else
+ {
+ PreviewMaterial.SetInt( m_typeId, 1 );
+
+ if( m_cachedSamplerId == -1 )
+ m_cachedSamplerId = Shader.PropertyToID( "_Sampler" );
+
+ PreviewMaterial.SetTexture( m_cachedSamplerId, newValue );
+ }
+ }
+
+ public override void SetPreviewInputs()
+ {
+ base.SetPreviewInputs();
+
+ if( Value == null )
+ {
+ if( m_defaultId == -1 )
+ m_defaultId = Shader.PropertyToID( "_Default" );
+
+ PreviewMaterial.SetInt( m_defaultId, ( (int)m_defaultTextureValue ) + 1 );
+ m_previewMaterialPassId = 0;
+ }
+ else
+ {
+ if( m_defaultId == -1 )
+ m_defaultId = Shader.PropertyToID( "_Default" );
+
+ PreviewMaterial.SetInt( m_defaultId, 0 );
+
+ if( m_typeId == -1 )
+ m_typeId = Shader.PropertyToID( "_Type" );
+
+ m_previewMaterialPassId = 1;
+ SetPreviewTexture( Value );
+ //if( Value is Cubemap )
+ //{
+ // PreviewMaterial.SetInt( m_typeId, 3 );
+
+ // if( m_cachedSamplerIdCube == -1 )
+ // m_cachedSamplerIdCube = Shader.PropertyToID( "_Cube" );
+
+ // PreviewMaterial.SetTexture( m_cachedSamplerIdCube, Value as Cubemap );
+ //}
+ //else if( Value is Texture2DArray )
+ //{
+ // PreviewMaterial.SetInt( m_typeId, 4 );
+
+ // if( m_cachedSamplerIdArray == -1 )
+ // m_cachedSamplerIdArray = Shader.PropertyToID( "_Array" );
+
+ // PreviewMaterial.SetTexture( m_cachedSamplerIdArray, Value as Texture2DArray );
+ //}
+ //else if( Value is Texture3D )
+ //{
+ // PreviewMaterial.SetInt( m_typeId, 2 );
+
+ // if( m_cachedSamplerId3D == -1 )
+ // m_cachedSamplerId3D = Shader.PropertyToID( "_Sampler3D" );
+
+ // PreviewMaterial.SetTexture( m_cachedSamplerId3D, Value as Texture3D );
+ //}
+ //else
+ //{
+ // PreviewMaterial.SetInt( m_typeId, 1 );
+
+ // if( m_cachedSamplerId == -1 )
+ // m_cachedSamplerId = Shader.PropertyToID( "_Sampler" );
+
+ // PreviewMaterial.SetTexture( m_cachedSamplerId, Value );
+ //}
+ }
+ }
+
+ protected override void OnUniqueIDAssigned()
+ {
+ base.OnUniqueIDAssigned();
+ m_textureProperty = this;
+ UIUtils.RegisterPropertyNode( this );
+ UIUtils.RegisterTexturePropertyNode( this );
+ }
+
+ protected void ConfigTextureData( TextureType type )
+ {
+ switch( m_autocastMode )
+ {
+ case AutoCastType.Auto:
+ {
+ m_currentType = type;
+ }
+ break;
+ case AutoCastType.LockedToTexture1D:
+ {
+ m_currentType = TextureType.Texture1D;
+ }
+ break;
+ case AutoCastType.LockedToTexture2DArray:
+ {
+ m_currentType = TextureType.Texture2DArray;
+ }
+ break;
+ case AutoCastType.LockedToTexture2D:
+ {
+ m_currentType = TextureType.Texture2D;
+ }
+ break;
+ case AutoCastType.LockedToTexture3D:
+ {
+ m_currentType = TextureType.Texture3D;
+ }
+ break;
+ case AutoCastType.LockedToCube:
+ {
+ m_currentType = TextureType.Cube;
+ }
+ break;
+ }
+
+ ConfigTextureType();
+ }
+
+ protected void ConfigTextureType()
+ {
+ switch( m_currentType )
+ {
+ case TextureType.Texture1D:
+ {
+ m_textureType = typeof( Texture );
+ }
+ break;
+ case TextureType.Texture2DArray:
+ {
+ m_textureType = typeof( Texture2DArray );
+ }
+ break;
+ case TextureType.Texture2D:
+ {
+ m_textureType = typeof( Texture2D );
+ }
+ break;
+ case TextureType.Texture3D:
+ {
+ m_textureType = typeof( Texture3D );
+ }
+ break;
+ case TextureType.Cube:
+ {
+ m_textureType = typeof( Cubemap );
+ }
+ break;
+#if !UNITY_2018_1_OR_NEWER
+ // Disabling Substance Deprecated warning
+#pragma warning disable 0618
+ case TextureType.ProceduralTexture:
+ {
+ m_textureType = typeof( ProceduralTexture );
+ }
+ break;
+#pragma warning restore 0618
+#endif
+
+ }
+ }
+
+ protected void DrawTexturePropertyType()
+ {
+ PropertyType parameterType = (PropertyType)EditorGUILayoutIntPopup( ParameterTypeStr, (int)m_currentParameterType, AvailablePropertyTypeLabels, AvailablePropertyTypeValues );
+ if( parameterType != m_currentParameterType )
+ {
+ ChangeParameterType( parameterType );
+ }
+ }
+
+ // Texture1D
+ public string GetTexture1DPropertyValue()
+ {
+ return PropertyName + "(\"" + m_propertyInspectorName + "\", 2D) = \"" + m_defaultTextureValue + "\" {}";
+ }
+
+ public string GetTexture1DUniformValue()
+ {
+ return "uniform sampler1D " + PropertyName + ";";
+ }
+
+ // Texture2D
+ public string GetTexture2DPropertyValue()
+ {
+ return PropertyName + "(\"" + m_propertyInspectorName + "\", 2D) = \"" + m_defaultTextureValue + "\" {}";
+ }
+
+ public string GetTexture2DUniformValue()
+ {
+ ParentGraph outsideGraph = UIUtils.CurrentWindow.OutsideGraph;
+ if( outsideGraph.SamplingThroughMacros )
+ {
+ if( outsideGraph.IsSRP )
+ {
+ if( m_useSamplerArrayIdx == 0 )
+ return string.Format( Constants.TexDeclarationSRPMacros[ TextureType.Texture2D ], PropertyName );
+ else
+ return string.Format( Constants.TexDeclarationNoSamplerSRPMacros[ TextureType.Texture2D ], PropertyName );
+ }
+ else
+ {
+ if( m_useSamplerArrayIdx == 0 )
+ return string.Format( Constants.TexDeclarationStandardMacros[ TextureType.Texture2D ], PropertyName );
+ else
+ return string.Format( Constants.TexDeclarationNoSamplerStandardMacros[ TextureType.Texture2D ], PropertyName );
+ }
+
+ }
+
+ if( PropertyName == "_CameraDepthTexture" )
+ return Constants.CameraDepthTextureValue;
+ else
+ return "uniform sampler2D " + PropertyName + ";";
+ }
+
+ //Texture3D
+ public string GetTexture3DPropertyValue()
+ {
+ return PropertyName + "(\"" + m_propertyInspectorName + "\", 3D) = \"" + m_defaultTextureValue + "\" {}";
+ }
+
+ public string GetTexture3DUniformValue()
+ {
+ ParentGraph outsideGraph = UIUtils.CurrentWindow.OutsideGraph;
+ if( outsideGraph.SamplingThroughMacros )
+ {
+ if( outsideGraph.IsSRP )
+ {
+ if( m_useSamplerArrayIdx == 0 )
+ return string.Format( Constants.TexDeclarationSRPMacros[ TextureType.Texture3D ], PropertyName );
+ else
+ return string.Format( Constants.TexDeclarationNoSamplerSRPMacros[ TextureType.Texture3D ], PropertyName );
+ }
+ else
+ {
+ if( m_useSamplerArrayIdx == 0 )
+ return string.Format( Constants.TexDeclarationStandardMacros[ TextureType.Texture3D ], PropertyName );
+ else
+ return string.Format( Constants.TexDeclarationNoSamplerStandardMacros[ TextureType.Texture3D ], PropertyName );
+ }
+ }
+ return "uniform sampler3D " + PropertyName + ";";
+ }
+
+ // Cube
+ public string GetCubePropertyValue()
+ {
+ return PropertyName + "(\"" + m_propertyInspectorName + "\", CUBE) = \"" + m_defaultTextureValue + "\" {}";
+ }
+
+ public string GetCubeUniformValue()
+ {
+ ParentGraph outsideGraph = UIUtils.CurrentWindow.OutsideGraph;
+ if( outsideGraph.SamplingThroughMacros )
+ {
+ if( outsideGraph.IsSRP )
+ {
+ if( m_useSamplerArrayIdx == 0 )
+ return string.Format( Constants.TexDeclarationSRPMacros[ TextureType.Cube ], PropertyName );
+ else
+ return string.Format( Constants.TexDeclarationNoSamplerSRPMacros[ TextureType.Cube ], PropertyName );
+ }
+ else
+ {
+ if( m_useSamplerArrayIdx == 0 )
+ return string.Format( Constants.TexDeclarationStandardMacros[ TextureType.Cube ], PropertyName );
+ else
+ return string.Format( Constants.TexDeclarationNoSamplerStandardMacros[ TextureType.Cube ], PropertyName );
+ }
+ }
+
+ return "uniform samplerCUBE " + PropertyName + ";";
+ }
+
+ // Texture2DArray
+ public string GetTexture2DArrayPropertyValue()
+ {
+ return PropertyName + "(\"" + m_propertyInspectorName + "\", 2DArray) = \"" + m_defaultTextureValue + "\" {}";
+ }
+
+ public string GetTexture2DArrayUniformValue()
+ {
+ ParentGraph outsideGraph = UIUtils.CurrentWindow.OutsideGraph;
+ if( outsideGraph.SamplingThroughMacros )
+ {
+ if( outsideGraph.IsSRP )
+ {
+ if( m_useSamplerArrayIdx == 0 )
+ return string.Format( Constants.TexDeclarationSRPMacros[ TextureType.Texture2DArray ], PropertyName );
+ else
+ return string.Format( Constants.TexDeclarationNoSamplerSRPMacros[ TextureType.Texture2DArray ], PropertyName );
+ }
+ else
+ {
+ if( m_useSamplerArrayIdx == 0 )
+ return string.Format( Constants.TexDeclarationStandardMacros[ TextureType.Texture2DArray ], PropertyName );
+ else
+ return string.Format( Constants.TexDeclarationNoSamplerStandardMacros[ TextureType.Texture2DArray ], PropertyName );
+ }
+ }
+
+ return "uniform TEXTURE2D_ARRAY( " + PropertyName + " );" + "\nuniform SAMPLER( sampler" + PropertyName + " );";
+ }
+
+ public override void DrawMainPropertyBlock()
+ {
+ DrawTexturePropertyType();
+ base.DrawMainPropertyBlock();
+ }
+
+ public override void DrawSubProperties()
+ {
+ ShowDefaults();
+
+
+ EditorGUI.BeginChangeCheck();
+ Type currType = ( m_autocastMode == AutoCastType.Auto ) ? typeof( Texture ) : m_textureType;
+ m_defaultValue = EditorGUILayoutObjectField( Constants.DefaultValueLabel, m_defaultValue, currType, false ) as Texture;
+ if( EditorGUI.EndChangeCheck() )
+ {
+ CheckTextureImporter( true );
+ SetAdditonalTitleText( string.Format( Constants.PropertyValueLabel, GetPropertyValStr() ) );
+ }
+ }
+
+ public override void DrawMaterialProperties()
+ {
+ ShowDefaults();
+
+ EditorGUI.BeginChangeCheck();
+ Type currType = ( m_autocastMode == AutoCastType.Auto ) ? typeof( Texture ) : m_textureType;
+ m_materialValue = EditorGUILayoutObjectField( Constants.MaterialValueLabel, m_materialValue, currType, false ) as Texture;
+ if( EditorGUI.EndChangeCheck() )
+ {
+ CheckTextureImporter( true );
+ SetAdditonalTitleText( string.Format( Constants.PropertyValueLabel, GetPropertyValStr() ) );
+ }
+ }
+
+ new void ShowDefaults()
+ {
+ m_defaultTextureValue = (TexturePropertyValues)EditorGUILayoutEnumPopup( DefaultTextureStr, m_defaultTextureValue );
+
+ if( !m_drawAutocast )
+ return;
+
+ AutoCastType newAutoCast = (AutoCastType)EditorGUILayoutEnumPopup( AutoCastModeStr, m_autocastMode );
+ if( newAutoCast != m_autocastMode )
+ {
+ m_autocastMode = newAutoCast;
+ if( m_autocastMode != AutoCastType.Auto )
+ {
+ ConfigTextureData( m_currentType );
+ ConfigureInputPorts();
+ ConfigureOutputPorts();
+ }
+ }
+ }
+
+ private void ConfigurePortsFromReference()
+ {
+ m_sizeIsDirty = true;
+ }
+
+ public virtual void ConfigureOutputPorts()
+ {
+ switch( m_currentType )
+ {
+ case TextureType.Texture1D:
+ m_outputPorts[ 0 ].ChangeType( WirePortDataType.SAMPLER1D, false );
+ break;
+ case TextureType.ProceduralTexture:
+ case TextureType.Texture2D:
+ m_outputPorts[ 0 ].ChangeType( WirePortDataType.SAMPLER2D, false );
+ break;
+ case TextureType.Texture3D:
+ m_outputPorts[ 0 ].ChangeType( WirePortDataType.SAMPLER3D, false );
+ break;
+ case TextureType.Cube:
+ m_outputPorts[ 0 ].ChangeType( WirePortDataType.SAMPLERCUBE, false );
+ break;
+ case TextureType.Texture2DArray:
+ m_outputPorts[ 0 ].ChangeType( WirePortDataType.SAMPLER2D, false );
+ break;
+ }
+
+ m_sizeIsDirty = true;
+ }
+
+ public virtual void ConfigureInputPorts()
+ {
+ }
+
+ public virtual void AdditionalCheck()
+ {
+ }
+
+ public virtual void CheckTextureImporter( bool additionalCheck, bool writeDefault = true )
+ {
+ m_requireMaterialUpdate = true;
+ Texture texture = m_materialMode ? m_materialValue : m_defaultValue;
+ TextureImporter importer = AssetImporter.GetAtPath( AssetDatabase.GetAssetPath( texture ) ) as TextureImporter;
+ if( importer != null )
+ {
+
+#if UNITY_5_5_OR_NEWER
+ m_isNormalMap = importer.textureType == TextureImporterType.NormalMap;
+#else
+ m_isNormalMap = importer.normalmap;
+#endif
+ if( writeDefault && !UIUtils.IsLoading )
+ {
+ if( m_defaultTextureValue == TexturePropertyValues.bump && !m_isNormalMap )
+ m_defaultTextureValue = TexturePropertyValues.white;
+ else if( m_isNormalMap )
+ m_defaultTextureValue = TexturePropertyValues.bump;
+ }
+
+ if( additionalCheck )
+ AdditionalCheck();
+ m_linearTexture = !importer.sRGBTexture;
+ }
+
+ if( ( texture as Texture2DArray ) != null )
+ {
+ ConfigTextureData( TextureType.Texture2DArray );
+ }
+ else if( ( texture as Texture2D ) != null )
+ {
+ ConfigTextureData( TextureType.Texture2D );
+ }
+ else if( ( texture as Texture3D ) != null )
+ {
+ ConfigTextureData( TextureType.Texture3D );
+ }
+ else if( ( texture as Cubemap ) != null )
+ {
+ ConfigTextureData( TextureType.Cube );
+ }
+#if !UNITY_2018_1_OR_NEWER
+ // Disabling Substance Deprecated warning
+#pragma warning disable 0618
+ else if( ( texture as ProceduralTexture ) != null )
+ {
+ ConfigTextureData( TextureType.ProceduralTexture );
+ }
+#pragma warning restore 0618
+#endif
+
+ ConfigureInputPorts();
+ ConfigureOutputPorts();
+ }
+
+ public override void OnObjectDropped( UnityEngine.Object obj )
+ {
+ base.OnObjectDropped( obj );
+ ConfigFromObject( obj );
+ }
+
+ public override void SetupFromCastObject( UnityEngine.Object obj )
+ {
+ base.SetupFromCastObject( obj );
+ ConfigFromObject( obj );
+ }
+
+ protected void ConfigFromObject( UnityEngine.Object obj, bool writeDefault = true, bool additionalCheck = true )
+ {
+ Texture texture = obj as Texture;
+ if( texture )
+ {
+ m_materialValue = texture;
+ m_defaultValue = texture;
+ CheckTextureImporter( additionalCheck, writeDefault );
+ }
+ }
+
+
+
+ public override void DrawGUIControls( DrawInfo drawInfo )
+ {
+ base.DrawGUIControls( drawInfo );
+
+ if( !( drawInfo.CurrentEventType == EventType.MouseDown || drawInfo.CurrentEventType == EventType.MouseUp || drawInfo.CurrentEventType == EventType.ExecuteCommand || drawInfo.CurrentEventType == EventType.DragPerform ) )
+ return;
+
+ bool insideBox = m_previewRect.Contains( drawInfo.MousePosition );
+
+ bool closePicker = false;
+ if( insideBox )
+ {
+ m_isEditingPicker = true;
+ }
+ else if( m_isEditingPicker && !insideBox && drawInfo.CurrentEventType != EventType.ExecuteCommand )
+ {
+ closePicker = true;
+ }
+
+ if( m_isEditingPicker && drawInfo.CurrentEventType == EventType.ExecuteCommand &&
+ Event.current.commandName.Equals( ObjectSelectorCmdStr ) )
+ {
+ closePicker = true;
+ }
+
+ if( closePicker )
+ {
+ GUI.FocusControl( null );
+ m_isEditingPicker = false;
+ }
+
+ }
+
+ public override void OnNodeLayout( DrawInfo drawInfo )
+ {
+ base.OnNodeLayout( drawInfo );
+ ConfigTextureType();
+ }
+
+ public override void Draw( DrawInfo drawInfo )
+ {
+ base.Draw( drawInfo );
+ if( m_dropdownEditing )
+ {
+ PropertyType parameterType = (PropertyType)EditorGUIIntPopup( m_dropdownRect, (int)m_currentParameterType, AvailablePropertyTypeLabels, AvailablePropertyTypeValues, UIUtils.PropertyPopUp );
+ if( parameterType != m_currentParameterType )
+ {
+ ChangeParameterType( parameterType );
+ DropdownEditing = false;
+ }
+ }
+
+ if( m_isEditingPicker && m_drawPicker && m_currentParameterType != PropertyType.Global )
+ {
+ Rect hitRect = m_previewRect;
+ hitRect.height = 14 * drawInfo.InvertedZoom;
+ hitRect.y = m_previewRect.yMax - hitRect.height;
+ hitRect.width = 4 * 14 * drawInfo.InvertedZoom;
+
+ bool restoreMouse = false;
+ if( Event.current.type == EventType.MouseDown && hitRect.Contains( drawInfo.MousePosition ) )
+ {
+ restoreMouse = true;
+ Event.current.type = EventType.Ignore;
+ }
+
+ EditorGUI.BeginChangeCheck();
+ m_colorBuffer = GUI.color;
+ GUI.color = Color.clear;
+ Type currType = ( m_autocastMode == AutoCastType.Auto ) ? typeof( Texture ) : m_textureType;
+ if( m_materialMode )
+ {
+ m_materialValue = EditorGUIObjectField( m_previewRect, m_materialValue, currType, false ) as Texture;
+ }
+ else
+ {
+ m_defaultValue = EditorGUIObjectField( m_previewRect, m_defaultValue, currType, false ) as Texture;
+ }
+ GUI.color = m_colorBuffer;
+
+ if( EditorGUI.EndChangeCheck() )
+ {
+ CheckTextureImporter( true );
+ SetTitleText( m_propertyInspectorName );
+ SetAdditonalTitleText( string.Format( Constants.PropertyValueLabel, GetPropertyValStr() ) );
+ ConfigureInputPorts();
+ ConfigureOutputPorts();
+ BeginDelayedDirtyProperty();
+ PreviewIsDirty = true;
+ }
+ //else if( drawInfo.CurrentEventType == EventType.ExecuteCommand )
+ //{
+ // GUI.FocusControl( null );
+ // m_isEditingPicker = false;
+ //}
+
+ if( restoreMouse )
+ {
+ Event.current.type = EventType.MouseDown;
+ }
+
+ if( ( drawInfo.CurrentEventType == EventType.MouseDown || drawInfo.CurrentEventType == EventType.MouseUp ) )
+ DrawPreviewMaskButtonsLayout( drawInfo, m_previewRect );
+ }
+
+ if( !m_drawPicker )
+ return;
+
+ if( drawInfo.CurrentEventType == EventType.Repaint )
+ {
+ DrawTexturePicker( drawInfo );
+ }
+ }
+
+
+
+ protected void DrawTexturePicker( DrawInfo drawInfo )
+ {
+ Rect newRect = m_previewRect;
+ Texture currentValue = m_materialMode ? m_materialValue : m_defaultValue;
+
+ //???
+ //m_showPreview = true;
+ bool showButtons = m_currentParameterType != PropertyType.Global;
+
+ if( currentValue == null )
+ GUI.Label( newRect, string.Empty, UIUtils.ObjectFieldThumb );
+ else
+ DrawPreview( drawInfo, m_previewRect );
+
+ if( ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD2 )
+ {
+ Rect butRect = m_previewRect;
+ butRect.y -= 1;
+ butRect.x += 1;
+
+ Rect smallButton = newRect;
+ smallButton.height = 14 * drawInfo.InvertedZoom;
+ smallButton.y = newRect.yMax - smallButton.height - 2;
+ smallButton.width = 40 * drawInfo.InvertedZoom;
+ smallButton.x = newRect.xMax - smallButton.width - 2;
+ if( currentValue == null )
+ {
+ if( m_previousType != m_currentType )
+ {
+ m_previousType = m_currentType;
+ m_labelText = "None (" + m_currentType.ToString() + ")";
+ }
+
+ GUI.Label( newRect, m_labelText, UIUtils.ObjectFieldThumbOverlay );
+ }
+ else if( showButtons )
+ {
+ DrawPreviewMaskButtonsRepaint( drawInfo, butRect );
+ }
+
+ if( showButtons )
+ GUI.Label( smallButton, "Select", UIUtils.GetCustomStyle( CustomStyle.SamplerButton ) );
+ }
+
+ GUI.Label( newRect, string.Empty, UIUtils.GetCustomStyle( CustomStyle.SamplerFrame ) );
+ }
+
+ public string BaseGenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar )
+ {
+ base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalVar );
+ return PropertyName;
+ }
+
+ public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar )
+ {
+ return BaseGenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalVar );
+ }
+
+ public override void UpdateMaterial( Material mat )
+ {
+ base.UpdateMaterial( mat );
+ if( UIUtils.IsProperty( m_currentParameterType ) && !InsideShaderFunction )
+ {
+ OnPropertyNameChanged();
+ if( mat.HasProperty( PropertyName ) )
+ {
+ mat.SetTexture( PropertyName, m_materialValue );
+ }
+ }
+ }
+
+ public override void SetMaterialMode( Material mat, bool fetchMaterialValues )
+ {
+ base.SetMaterialMode( mat, fetchMaterialValues );
+ if( fetchMaterialValues && m_materialMode && UIUtils.IsProperty( m_currentParameterType ) )
+ {
+ if( mat.HasProperty( PropertyName ) )
+ {
+ m_materialValue = mat.GetTexture( PropertyName );
+ CheckTextureImporter( false, false );
+ }
+ }
+ }
+
+ public override void ForceUpdateFromMaterial( Material material )
+ {
+ if( UIUtils.IsProperty( m_currentParameterType ) && material.HasProperty( PropertyName ) )
+ {
+ m_materialValue = material.GetTexture( PropertyName );
+ CheckTextureImporter( false, false );
+ PreviewIsDirty = true;
+ }
+ }
+
+ public override bool UpdateShaderDefaults( ref Shader shader, ref TextureDefaultsDataColector defaultCol/* ref string metaStr */)
+ {
+ if( m_defaultValue != null )
+ {
+ defaultCol.AddValue( PropertyName, m_defaultValue );
+ }
+
+ return true;
+ }
+
+ public override void ReadFromString( ref string[] nodeParams )
+ {
+ base.ReadFromString( ref nodeParams );
+ ReadAdditionalData( ref nodeParams );
+ if( UIUtils.CurrentShaderVersion() > 17101 )
+ {
+ m_useSamplerArrayIdx = Convert.ToInt32( GetCurrentParam( ref nodeParams ) );
+ }
+ }
+
+ public virtual void ReadAdditionalData( ref string[] nodeParams )
+ {
+ string defaultTextureGUID = GetCurrentParam( ref nodeParams );
+ //m_defaultValue = AssetDatabase.LoadAssetAtPath<Texture>( textureName );
+ if( UIUtils.CurrentShaderVersion() > 14101 )
+ {
+ m_defaultValue = AssetDatabase.LoadAssetAtPath<Texture>( AssetDatabase.GUIDToAssetPath( defaultTextureGUID ) );
+ string materialTextureGUID = GetCurrentParam( ref nodeParams );
+ m_materialValue = AssetDatabase.LoadAssetAtPath<Texture>( AssetDatabase.GUIDToAssetPath( materialTextureGUID ) );
+ }
+ else
+ {
+ m_defaultValue = AssetDatabase.LoadAssetAtPath<Texture>( defaultTextureGUID );
+ }
+
+ m_isNormalMap = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) );
+ m_defaultTextureValue = (TexturePropertyValues)Enum.Parse( typeof( TexturePropertyValues ), GetCurrentParam( ref nodeParams ) );
+ m_autocastMode = (AutoCastType)Enum.Parse( typeof( AutoCastType ), GetCurrentParam( ref nodeParams ) );
+ if( UIUtils.CurrentShaderVersion() > 15306 )
+ {
+ m_currentType = (TextureType)Enum.Parse( typeof( TextureType ), GetCurrentParam( ref nodeParams ) );
+ }
+ else
+ {
+ m_currentType = TextureType.Texture2D;
+ }
+
+ ConfigTextureData( m_currentType );
+
+ //ConfigFromObject( m_defaultValue );
+ if( m_materialValue == null )
+ {
+ ConfigFromObject( m_defaultValue );
+ }
+ else
+ {
+ CheckTextureImporter( true, true );
+ }
+ ConfigureInputPorts();
+ ConfigureOutputPorts();
+ }
+
+ public override void ReadAdditionalClipboardData( ref string[] nodeParams )
+ {
+ base.ReadAdditionalClipboardData( ref nodeParams );
+ string textureName = GetCurrentParam( ref nodeParams );
+ m_materialValue = AssetDatabase.LoadAssetAtPath<Texture>( textureName );
+ }
+
+ public override void WriteToString( ref string nodeInfo, ref string connectionsInfo )
+ {
+ base.WriteToString( ref nodeInfo, ref connectionsInfo );
+ WriteAdditionalToString( ref nodeInfo, ref connectionsInfo );
+ if( m_useSamplerArrayIdx > 0 )
+ {
+ TexturePropertyNode samplerNode = UIUtils.GetTexturePropertyNode( m_useSamplerArrayIdx - 1 );
+ IOUtils.AddFieldValueToString( ref nodeInfo, ( samplerNode != null ? samplerNode.UniqueId : -1 ) );
+ }
+ else
+ {
+ IOUtils.AddFieldValueToString( ref nodeInfo, -1 );
+ }
+ }
+
+ public virtual void WriteAdditionalToString( ref string nodeInfo, ref string connectionsInfo )
+ {
+ //IOUtils.AddFieldValueToString( ref nodeInfo, ( m_defaultValue != null ) ? AssetDatabase.GetAssetPath( m_defaultValue ) : Constants.NoStringValue );
+ IOUtils.AddFieldValueToString( ref nodeInfo, ( m_defaultValue != null ) ? AssetDatabase.AssetPathToGUID( AssetDatabase.GetAssetPath( m_defaultValue ) ) : Constants.NoStringValue );
+ IOUtils.AddFieldValueToString( ref nodeInfo, ( m_materialValue != null ) ? AssetDatabase.AssetPathToGUID( AssetDatabase.GetAssetPath( m_materialValue ) ) : Constants.NoStringValue );
+ IOUtils.AddFieldValueToString( ref nodeInfo, m_isNormalMap.ToString() );
+ IOUtils.AddFieldValueToString( ref nodeInfo, m_defaultTextureValue );
+ IOUtils.AddFieldValueToString( ref nodeInfo, m_autocastMode );
+ IOUtils.AddFieldValueToString( ref nodeInfo, m_currentType );
+ }
+
+ public override void WriteAdditionalClipboardData( ref string nodeInfo )
+ {
+ base.WriteAdditionalClipboardData( ref nodeInfo );
+ IOUtils.AddFieldValueToString( ref nodeInfo, ( m_materialValue != null ) ? AssetDatabase.GetAssetPath( m_materialValue ) : Constants.NoStringValue );
+ }
+
+ public override void Destroy()
+ {
+ base.Destroy();
+ m_defaultValue = null;
+ m_materialValue = null;
+ m_textureProperty = null;
+ UIUtils.UnregisterPropertyNode( this );
+ UIUtils.UnregisterTexturePropertyNode( this );
+ }
+
+ public override string GetPropertyValStr()
+ {
+ return m_materialMode ? ( m_materialValue != null ? m_materialValue.name : IOUtils.NO_TEXTURES ) : ( m_defaultValue != null ? m_defaultValue.name : IOUtils.NO_TEXTURES );
+ }
+
+ public override string GetPropertyValue()
+ {
+ switch( m_currentType )
+ {
+ case TextureType.Texture1D:
+ {
+ return PropertyAttributes + GetTexture1DPropertyValue();
+ }
+ case TextureType.ProceduralTexture:
+ case TextureType.Texture2D:
+ {
+ return PropertyAttributes + GetTexture2DPropertyValue();
+ }
+ case TextureType.Texture3D:
+ {
+ return PropertyAttributes + GetTexture3DPropertyValue();
+ }
+ case TextureType.Cube:
+ {
+ return PropertyAttributes + GetCubePropertyValue();
+ }
+ case TextureType.Texture2DArray:
+ {
+ return PropertyAttributes + GetTexture2DArrayPropertyValue();
+ }
+ }
+ return string.Empty;
+ }
+
+ public override string GetUniformValue()
+ {
+ switch( m_currentType )
+ {
+ case TextureType.Texture1D:
+ {
+ return GetTexture1DUniformValue();
+ }
+ case TextureType.ProceduralTexture:
+ case TextureType.Texture2D:
+ {
+ return GetTexture2DUniformValue();
+ }
+ case TextureType.Texture3D:
+ {
+ return GetTexture3DUniformValue();
+ }
+ case TextureType.Cube:
+ {
+ return GetCubeUniformValue();
+ }
+ case TextureType.Texture2DArray:
+ {
+ return GetTexture2DArrayUniformValue();
+ }
+ }
+
+ return string.Empty;
+ }
+
+ public override bool GetUniformData( out string dataType, out string dataName, ref bool fullValue )
+ {
+ m_excludeUniform = false;
+ ParentGraph outsideGraph = UIUtils.CurrentWindow.OutsideGraph;
+ if( outsideGraph.SamplingThroughMacros )
+ {
+ if( outsideGraph.IsSRP )
+ {
+ if( Constants.TexDeclarationSRPMacros.ContainsKey( m_currentType ) )
+ {
+ if( m_useSamplerArrayIdx == 0 )
+ dataName = string.Format( Constants.TexDeclarationSRPMacros[ m_currentType ], PropertyName );
+ else
+ dataName = string.Format( Constants.TexDeclarationNoSamplerSRPMacros[ m_currentType ], PropertyName );
+ dataType = string.Empty;
+ fullValue = true;
+ return true;
+ }
+ }
+ else if( Constants.TexDeclarationStandardMacros.ContainsKey( m_currentType ) )
+ {
+ if( m_useSamplerArrayIdx == 0 )
+ dataName = string.Format( Constants.TexDeclarationStandardMacros[ m_currentType ], PropertyName );
+ else
+ dataName = string.Format( Constants.TexDeclarationNoSamplerStandardMacros[ m_currentType ], PropertyName );
+ dataType = string.Empty;
+ fullValue = true;
+ return true;
+ }
+ }
+
+ if( PropertyName == "_CameraDepthTexture" )
+ {
+ m_excludeUniform = true;
+ dataType = "UNITY_DECLARE_DEPTH_TEXTURE(";
+ dataName = m_propertyName + " )";
+ return true;
+ }
+
+ if( m_currentType == TextureType.Texture2DArray )
+ {
+ MasterNode masterNode = UIUtils.CurrentWindow.OutsideGraph.CurrentMasterNode;
+ if( masterNode.CurrentDataCollector.IsTemplate && masterNode.CurrentDataCollector.IsSRP )
+ {
+ dataType = "TEXTURE2D_ARRAY( " + PropertyName + "";
+ dataName = ");\nuniform SAMPLER( sampler" + PropertyName + " )";
+ return true;
+ }
+ dataType = "UNITY_DECLARE_TEX2DARRAY(";
+ dataName = m_propertyName + " )";
+ return true;
+ }
+
+
+ dataType = UIUtils.TextureTypeToCgType( m_currentType );
+ dataName = m_propertyName;
+ return true;
+ }
+
+ public virtual string CurrentPropertyReference
+ {
+ get
+ {
+ string propertyName = string.Empty;
+ propertyName = PropertyName;
+ return propertyName;
+ }
+ }
+
+ public Texture Value
+ {
+ get { return m_materialMode ? m_materialValue : m_defaultValue; }
+ set
+ {
+ if( m_materialMode )
+ m_materialValue = value;
+ else
+ m_defaultValue = value;
+ }
+ }
+
+ public Texture MaterialValue
+ {
+ get { return m_materialValue; }
+ set { m_materialValue = value; }
+ }
+
+ public Texture DefaultValue
+ {
+ get { return m_defaultValue; }
+ set { m_defaultValue = value; }
+ }
+
+ public void SetInspectorName( string newName )
+ {
+ m_propertyInspectorName = newName;
+ }
+
+ public void SetPropertyName( string newName )
+ {
+ m_propertyName = newName;
+ }
+
+ public bool IsValid { get { return m_materialMode ? ( m_materialValue != null ) : ( m_defaultValue != null ); } }
+
+ public virtual bool IsNormalMap { get { return m_isNormalMap; } }
+ public bool IsLinearTexture { get { return m_linearTexture; } }
+
+ public override void OnPropertyNameChanged()
+ {
+ base.OnPropertyNameChanged();
+ UIUtils.UpdateTexturePropertyDataNode( UniqueId, PropertyName );
+ }
+
+ public override void SetGlobalValue() { Shader.SetGlobalTexture( m_propertyName, m_defaultValue ); }
+ public override void FetchGlobalValue() { m_materialValue = Shader.GetGlobalTexture( m_propertyName ); }
+ public override string DataToArray { get { return PropertyName; } }
+ public TextureType CurrentType { get { return m_currentType; } }
+
+ public bool DrawAutocast
+ {
+ get { return m_drawAutocast; }
+ set { m_drawAutocast = value; }
+ }
+
+ public TexturePropertyValues DefaultTextureValue
+ {
+ get { return m_defaultTextureValue; }
+ set { m_defaultTextureValue = value; }
+ }
+
+ public AutoCastType AutocastMode
+ {
+ get { return m_autocastMode; }
+ }
+ }
+}