using System; using System.Collections.Generic; using UnityEditor.Graphing; using UnityEditor.ShaderGraph.Drawing.Slots; using UnityEditor.ShaderGraph.Internal; using UnityEngine; using UnityEngine.UIElements; namespace UnityEditor.ShaderGraph { [Serializable] class Texture2DInputMaterialSlot : Texture2DMaterialSlot { [SerializeField] private SerializableTexture m_Texture = new SerializableTexture(); [SerializeField] private Texture2DShaderProperty.DefaultType m_DefaultType = Texture2DShaderProperty.DefaultType.White; public Texture texture { get { return m_Texture.texture; } set { m_Texture.texture = value; } } public Texture2DShaderProperty.DefaultType defaultType { get { return m_DefaultType; } set { m_DefaultType = value; } } public Texture2DInputMaterialSlot() {} public Texture2DInputMaterialSlot( int slotId, string displayName, string shaderOutputName, ShaderStageCapability stageCapability = ShaderStageCapability.All, bool hidden = false) : base(slotId, displayName, shaderOutputName, SlotType.Input, stageCapability, hidden) {} public override VisualElement InstantiateControl() { return new TextureSlotControlView(this); } public override string GetDefaultValue(GenerationMode generationMode) { var matOwner = owner as AbstractMaterialNode; if (matOwner == null) throw new Exception(string.Format("Slot {0} either has no owner, or the owner is not a {1}", this, typeof(AbstractMaterialNode))); return matOwner.GetVariableNameForSlot(id); } public override void AddDefaultProperty(PropertyCollector properties, GenerationMode generationMode) { var matOwner = owner as AbstractMaterialNode; if (matOwner == null) throw new Exception(string.Format("Slot {0} either has no owner, or the owner is not a {1}", this, typeof(AbstractMaterialNode))); var prop = new Texture2DShaderProperty(); prop.overrideReferenceName = matOwner.GetVariableNameForSlot(id); prop.modifiable = false; prop.generatePropertyBlock = true; prop.value.texture = texture; prop.defaultType = defaultType; properties.AddShaderProperty(prop); } public override void GetPreviewProperties(List properties, string name) { var pp = new PreviewProperty(PropertyType.Texture2D) { name = name, textureValue = texture, }; properties.Add(pp); } public override void CopyValuesFrom(MaterialSlot foundSlot) { var slot = foundSlot as Texture2DInputMaterialSlot; if (slot != null) m_Texture = slot.m_Texture; } } }