diff --git a/com.unity.render-pipelines.core/Editor/Drawing.meta b/com.unity.render-pipelines.core/Editor/Drawing.meta new file mode 100644 index 00000000000..cf7a35a15f0 --- /dev/null +++ b/com.unity.render-pipelines.core/Editor/Drawing.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 079a8e4faab04ff2929b3d925675cc2d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Decal/ShaderGraph/DecalMasterNode.cs b/com.unity.render-pipelines.high-definition/Editor/Material/Decal/ShaderGraph/DecalMasterNode.cs index 7cc71028619..009dc6d7091 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/Decal/ShaderGraph/DecalMasterNode.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/Decal/ShaderGraph/DecalMasterNode.cs @@ -17,7 +17,7 @@ namespace UnityEditor.Rendering.HighDefinition [Serializable] [Title("Master", "Decal (HDRP)")] [FormerName("UnityEditor.Experimental.Rendering.HDPipeline.DecalMasterNode")] - class DecalMasterNode : AbstractMaterialNode, IMasterNode, IHasSettings, ICanChangeShaderGUI, IMayRequirePosition, IMayRequireNormal, IMayRequireTangent + class DecalMasterNode : AbstractMaterialNode, IMasterNode, ICanChangeShaderGUI, IMayRequirePosition, IMayRequireNormal, IMayRequireTangent { public const string PositionSlotName = "Vertex Position"; public const string PositionSlotDisplayName = "Vertex Position"; @@ -112,6 +112,18 @@ bool MaterialTypeUsesSlotMask(SlotMask mask) return (activeMask & mask) != 0; } + // This property exists to expose shaderGUI Override info. to the inspector + [Inspectable("ShaderGUI", null)] + public ShaderGUIOverrideInfo ShaderGUIInfo + { + get => new ShaderGUIOverrideInfo(this.OverrideEnabled, this.ShaderGUIOverride); + set + { + this.ShaderGUIOverride = value.ShaderGUIOverride; + this.OverrideEnabled = value.OverrideEnabled; + } + } + [SerializeField] private string m_ShaderGUIOverride; public string ShaderGUIOverride { @@ -231,11 +243,6 @@ public sealed override void UpdateNodeAfterDeserialization() RemoveSlotsNameNotMatching(validSlots, true); } - public VisualElement CreateSettingsElement() - { - return new DecalSettingsView(this); - } - public string renderQueueTag { get @@ -347,6 +354,7 @@ public override void CollectShaderProperties(PropertyCollector collector, Genera [SerializeField] bool m_AffectsMetal = true; + [Inspectable("Affects Metal", true)] public ToggleData affectsMetal { get { return new ToggleData(m_AffectsMetal); } @@ -354,6 +362,7 @@ public ToggleData affectsMetal { if (m_AffectsMetal == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Affects Metal Change"); m_AffectsMetal = value.isOn; Dirty(ModificationScope.Graph); } @@ -362,6 +371,7 @@ public ToggleData affectsMetal [SerializeField] bool m_AffectsAO = true; + [Inspectable("Affects AO", true)] public ToggleData affectsAO { get { return new ToggleData(m_AffectsAO); } @@ -369,6 +379,7 @@ public ToggleData affectsAO { if (m_AffectsAO == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Affects AO Change"); m_AffectsAO = value.isOn; Dirty(ModificationScope.Graph); } @@ -377,6 +388,7 @@ public ToggleData affectsAO [SerializeField] bool m_AffectsSmoothness = true; + [Inspectable("Affects Smoothness", true)] public ToggleData affectsSmoothness { get { return new ToggleData(m_AffectsSmoothness); } @@ -384,6 +396,7 @@ public ToggleData affectsSmoothness { if (m_AffectsSmoothness == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Affects Smoothness Change"); m_AffectsSmoothness = value.isOn; Dirty(ModificationScope.Graph); } @@ -392,6 +405,7 @@ public ToggleData affectsSmoothness [SerializeField] bool m_AffectsAlbedo = true; + [Inspectable("Affects BaseColor", true)] public ToggleData affectsAlbedo { get { return new ToggleData(m_AffectsAlbedo); } @@ -399,6 +413,7 @@ public ToggleData affectsAlbedo { if (m_AffectsAlbedo == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Affects Albedo Change"); m_AffectsAlbedo = value.isOn; Dirty(ModificationScope.Graph); } @@ -407,6 +422,7 @@ public ToggleData affectsAlbedo [SerializeField] bool m_AffectsNormal = true; + [Inspectable("Affects Normal", true)] public ToggleData affectsNormal { get { return new ToggleData(m_AffectsNormal); } @@ -414,6 +430,7 @@ public ToggleData affectsNormal { if (m_AffectsNormal == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Affects Normal Change"); m_AffectsNormal = value.isOn; Dirty(ModificationScope.Graph); } @@ -422,6 +439,7 @@ public ToggleData affectsNormal [SerializeField] bool m_AffectsEmission = true; + [Inspectable("Affects Emission", true)] public ToggleData affectsEmission { get { return new ToggleData(m_AffectsEmission); } @@ -429,6 +447,7 @@ public ToggleData affectsEmission { if (m_AffectsEmission == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Affects Emission Change"); m_AffectsEmission = value.isOn; Dirty(ModificationScope.Graph); } diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Decal/ShaderGraph/DecalSettingsView.cs b/com.unity.render-pipelines.high-definition/Editor/Material/Decal/ShaderGraph/DecalSettingsView.cs deleted file mode 100644 index e3c1bc40a0f..00000000000 --- a/com.unity.render-pipelines.high-definition/Editor/Material/Decal/ShaderGraph/DecalSettingsView.cs +++ /dev/null @@ -1,136 +0,0 @@ -using UnityEngine.UIElements; -using UnityEditor.Graphing.Util; -using UnityEditor.ShaderGraph.Drawing; -using UnityEditor.ShaderGraph.Drawing.Controls; - -namespace UnityEditor.Rendering.HighDefinition.Drawing -{ - class DecalSettingsView : MasterNodeSettingsView - { - DecalMasterNode m_Node; - - Label CreateLabel(string text, int indentLevel) - { - string label = ""; - for (var i = 0; i < indentLevel; i++) - { - label += " "; - } - return new Label(label + text); - } - - public DecalSettingsView(DecalMasterNode node) : base(node) - { - m_Node = node; - PropertySheet ps = new PropertySheet(); - - int indentLevel = 0; - - ps.Add(new PropertyRow(CreateLabel("Affect BaseColor", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.affectsAlbedo.isOn; - toggle.RegisterValueChangedCallback(ChangeAffectsAlbedo); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Affects Normal", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.affectsNormal.isOn; - toggle.RegisterValueChangedCallback(ChangeAffectsNormal); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Affects Metal", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.affectsMetal.isOn; - toggle.RegisterValueChangedCallback(ChangeAffectsMetal); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Affects AO", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.affectsAO.isOn; - toggle.RegisterValueChangedCallback(ChangeAffectsAO); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Affects Smoothness", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.affectsSmoothness.isOn; - toggle.RegisterValueChangedCallback(ChangeAffectsSmoothness); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Affects Emission", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.affectsEmission.isOn; - toggle.RegisterValueChangedCallback(ChangeAffectsEmission); - }); - }); - - Add(ps); - Add(GetShaderGUIOverridePropertySheet()); - } - - void ChangeAffectsAlbedo(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Affects Albedo Change"); - ToggleData td = m_Node.affectsAlbedo; - td.isOn = evt.newValue; - m_Node.affectsAlbedo = td; - } - - void ChangeAffectsNormal(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Affects Normal Change"); - ToggleData td = m_Node.affectsNormal; - td.isOn = evt.newValue; - m_Node.affectsNormal = td; - } - - void ChangeAffectsMetal(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Affects Metal Change"); - ToggleData td = m_Node.affectsMetal; - td.isOn = evt.newValue; - m_Node.affectsMetal = td; - } - - void ChangeAffectsAO(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Affects AO Change"); - ToggleData td = m_Node.affectsAO; - td.isOn = evt.newValue; - m_Node.affectsAO = td; - } - - void ChangeAffectsSmoothness(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Affects Smoothness Change"); - ToggleData td = m_Node.affectsSmoothness; - td.isOn = evt.newValue; - m_Node.affectsSmoothness = td; - } - - void ChangeAffectsEmission(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Affects Emission Change"); - ToggleData td = m_Node.affectsEmission; - td.isOn = evt.newValue; - m_Node.affectsEmission = td; - } - - } -} diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Eye/ShaderGraph/EyeMasterNode.cs b/com.unity.render-pipelines.high-definition/Editor/Material/Eye/ShaderGraph/EyeMasterNode.cs index a6570d912b3..5e90169cdf7 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/Eye/ShaderGraph/EyeMasterNode.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/Eye/ShaderGraph/EyeMasterNode.cs @@ -11,6 +11,7 @@ using UnityEngine.Rendering; using UnityEditor.Rendering.HighDefinition.Drawing; using UnityEditor.Rendering.HighDefinition.ShaderGraph; +using UnityEditor.ShaderGraph.Drawing; // Include material common properties names using static UnityEngine.Rendering.HighDefinition.HDMaterialProperties; @@ -19,7 +20,7 @@ namespace UnityEditor.Rendering.HighDefinition { [Serializable] [Title("Master", "Eye (HDRP)(Preview)")] - class EyeMasterNode : AbstractMaterialNode, IMasterNode, IHasSettings, ICanChangeShaderGUI, IMayRequirePosition, IMayRequireNormal, IMayRequireTangent + class EyeMasterNode : AbstractMaterialNode, IMasterNode, ICanChangeShaderGUI, IMayRequirePosition, IMayRequireNormal, IMayRequireTangent { public const string PositionSlotName = "Vertex Position"; public const string PositionSlotDisplayName = "Vertex Position"; @@ -162,12 +163,50 @@ public SurfaceType surfaceType if (m_SurfaceType == value) return; + this.owner.owner.RegisterCompleteObjectUndo("Surface Type Change"); m_SurfaceType = value; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); } } + public AlphaMode GetAlphaMode(AlphaModeEye alphaModeLit) + { + switch (alphaModeLit) + { + case AlphaModeEye.Alpha: + return AlphaMode.Alpha; + case AlphaModeEye.Premultiply: + return AlphaMode.Premultiply; + case AlphaModeEye.Additive: + return AlphaMode.Additive; + default: + { + Debug.LogWarning("Not supported: " + alphaModeLit); + return AlphaMode.Alpha; + } + + } + } + + public AlphaModeEye GetAlphaModeLit(AlphaMode alphaMode) + { + switch (alphaMode) + { + case AlphaMode.Alpha: + return AlphaModeEye.Alpha; + case AlphaMode.Premultiply: + return AlphaModeEye.Premultiply; + case AlphaMode.Additive: + return AlphaModeEye.Additive; + default: + { + Debug.LogWarning("Not supported: " + alphaMode); + return AlphaModeEye.Alpha; + } + } + } + [SerializeField] AlphaMode m_AlphaMode; @@ -176,10 +215,14 @@ public AlphaMode alphaMode get { return m_AlphaMode; } set { - if (m_AlphaMode == value) + // Make sure the mapping is correct by handling each case. + var newValue = GetAlphaMode((AlphaModeEye)value); + + if (m_AlphaMode == newValue) return; - m_AlphaMode = value; + this.owner.owner.RegisterCompleteObjectUndo("Alpha Mode Change"); + m_AlphaMode = newValue; Dirty(ModificationScope.Graph); } } @@ -194,6 +237,7 @@ public ToggleData blendPreserveSpecular { if (m_BlendPreserveSpecular == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Blend Preserve Specular Change"); m_BlendPreserveSpecular = value.isOn; Dirty(ModificationScope.Graph); } @@ -209,6 +253,7 @@ public ToggleData transparencyFog { if (m_TransparencyFog == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Transparency Fog Change"); m_TransparencyFog = value.isOn; Dirty(ModificationScope.Graph); } @@ -224,6 +269,7 @@ public ToggleData alphaTest { if (m_AlphaTest == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Alpha Test Change"); m_AlphaTest = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -240,6 +286,7 @@ public ToggleData alphaTestDepthPrepass { if (m_AlphaTestDepthPrepass == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Alpha Test Depth Prepass Change"); m_AlphaTestDepthPrepass = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -256,6 +303,7 @@ public ToggleData alphaTestDepthPostpass { if (m_AlphaTestDepthPostpass == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Alpha Test Depth Postpass Change"); m_AlphaTestDepthPostpass = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -270,9 +318,13 @@ public int sortPriority get { return m_SortPriority; } set { - if (m_SortPriority == value) + var newValue = HDRenderQueue.ClampsTransparentRangePriority(value); + + if (m_SortPriority == newValue) return; - m_SortPriority = value; + + this.owner.owner.RegisterCompleteObjectUndo("Sort Priority Change"); + m_SortPriority = newValue; Dirty(ModificationScope.Graph); } } @@ -288,6 +340,7 @@ public DoubleSidedMode doubleSidedMode if (m_DoubleSidedMode == value) return; + this.owner.owner.RegisterCompleteObjectUndo("Double-Sided Mode Change"); m_DoubleSidedMode = value; Dirty(ModificationScope.Topological); } @@ -304,6 +357,7 @@ public MaterialType materialType if (m_MaterialType == value) return; + this.owner.owner.RegisterCompleteObjectUndo("Material Type Change"); m_MaterialType = value; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -313,6 +367,7 @@ public MaterialType materialType [SerializeField] bool m_ReceiveDecals = true; + [Inspectable("Receive Decals", true)] public ToggleData receiveDecals { get { return new ToggleData(m_ReceiveDecals); } @@ -327,6 +382,8 @@ public ToggleData receiveDecals [SerializeField] bool m_ReceivesSSR = true; + + [Inspectable("Receive SSR", true)] public ToggleData receiveSSR { get { return new ToggleData(m_ReceivesSSR); } @@ -334,6 +391,7 @@ public ToggleData receiveSSR { if (m_ReceivesSSR == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("SSR Change"); m_ReceivesSSR = value.isOn; Dirty(ModificationScope.Graph); } @@ -342,6 +400,7 @@ public ToggleData receiveSSR [SerializeField] bool m_AddPrecomputedVelocity = false; + [Inspectable("Add Precomputed Velocity", false)] public ToggleData addPrecomputedVelocity { get { return new ToggleData(m_AddPrecomputedVelocity); } @@ -349,6 +408,7 @@ public ToggleData addPrecomputedVelocity { if (m_AddPrecomputedVelocity == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Add Precomputed Velocity"); m_AddPrecomputedVelocity = value.isOn; Dirty(ModificationScope.Graph); } @@ -357,6 +417,7 @@ public ToggleData addPrecomputedVelocity [SerializeField] bool m_SubsurfaceScattering = false; + [Inspectable("Subsurface Scattering", false)] public ToggleData subsurfaceScattering { get { return new ToggleData(m_SubsurfaceScattering); } @@ -364,6 +425,7 @@ public ToggleData subsurfaceScattering { if (m_SubsurfaceScattering == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("SSS Change"); m_SubsurfaceScattering = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Graph); @@ -373,6 +435,7 @@ public ToggleData subsurfaceScattering [SerializeField] SpecularOcclusionMode m_SpecularOcclusionMode; + [Inspectable("Specular Occlusion Mode", SpecularOcclusionMode.Off)] public SpecularOcclusionMode specularOcclusionMode { get { return m_SpecularOcclusionMode; } @@ -381,6 +444,7 @@ public SpecularOcclusionMode specularOcclusionMode if (m_SpecularOcclusionMode == value) return; + this.owner.owner.RegisterCompleteObjectUndo("Specular Occlusion Mode Change"); m_SpecularOcclusionMode = value; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -390,6 +454,7 @@ public SpecularOcclusionMode specularOcclusionMode [SerializeField] bool m_overrideBakedGI; + [Inspectable("Override Baked GI", false)] public ToggleData overrideBakedGI { get { return new ToggleData(m_overrideBakedGI); } @@ -397,6 +462,8 @@ public ToggleData overrideBakedGI { if (m_overrideBakedGI == value.isOn) return; + + this.owner.owner.RegisterCompleteObjectUndo("overrideBakedGI Change"); m_overrideBakedGI = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -406,6 +473,7 @@ public ToggleData overrideBakedGI [SerializeField] bool m_depthOffset; + [Inspectable("Depth Offset", false)] public ToggleData depthOffset { get { return new ToggleData(m_depthOffset); } @@ -413,6 +481,7 @@ public ToggleData depthOffset { if (m_depthOffset == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("DepthOffset Change"); m_depthOffset = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -429,6 +498,7 @@ public ToggleData zWrite { if (m_ZWrite == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("ZWrite Change"); m_ZWrite = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Graph); @@ -445,6 +515,7 @@ public TransparentCullMode transparentCullMode if (m_transparentCullMode == value) return; + this.owner.owner.RegisterCompleteObjectUndo("Transparent Cull Mode Change"); m_transparentCullMode = value; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Graph); @@ -461,6 +532,7 @@ public CompareFunction zTest if (m_ZTest == value) return; + this.owner.owner.RegisterCompleteObjectUndo("ZTest Change"); m_ZTest = value; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Graph); @@ -470,6 +542,7 @@ public CompareFunction zTest [SerializeField] bool m_SupportLodCrossFade; + [Inspectable("Support LOD Crossfade", false)] public ToggleData supportLodCrossFade { get { return new ToggleData(m_SupportLodCrossFade); } @@ -477,6 +550,8 @@ public ToggleData supportLodCrossFade { if (m_SupportLodCrossFade == value.isOn) return; + + this.owner.owner.RegisterCompleteObjectUndo("Support LOD CrossFade Change"); m_SupportLodCrossFade = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Node); @@ -513,6 +588,27 @@ int ComputeMaterialNeedsUpdateHash() return hash; } + // This struct, and the corresponding property below it, exist to expose the HDLitMasterNode to the inspector for drawing settings + public struct HDEyeSettings + { + // Empty struct + } + + [Inspectable("HDRP Eye Settings", null)] + public HDEyeSettings HDRPEyeSettings { get; private set; } + + // This property exists to expose shaderGUI Override info. to the inspector + [Inspectable("ShaderGUI", null)] + public ShaderGUIOverrideInfo ShaderGUIInfo + { + get => new ShaderGUIOverrideInfo(this.OverrideEnabled, this.ShaderGUIOverride); + set + { + this.ShaderGUIOverride = value.ShaderGUIOverride; + this.OverrideEnabled = value.OverrideEnabled; + } + } + [SerializeField] private string m_ShaderGUIOverride; public string ShaderGUIOverride { @@ -681,11 +777,6 @@ public sealed override void UpdateNodeAfterDeserialization() RemoveSlotsNameNotMatching(validSlots, true); } - public VisualElement CreateSettingsElement() - { - return new EyeSettingsView(this); - } - public string renderQueueTag { get diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Eye/ShaderGraph/EyePropertyDrawer.cs b/com.unity.render-pipelines.high-definition/Editor/Material/Eye/ShaderGraph/EyePropertyDrawer.cs new file mode 100644 index 00000000000..a1be5655777 --- /dev/null +++ b/com.unity.render-pipelines.high-definition/Editor/Material/Eye/ShaderGraph/EyePropertyDrawer.cs @@ -0,0 +1,164 @@ +using System; +using System.Reflection; +using Drawing.Inspector; +using UnityEditor.ShaderGraph; +using UnityEditor.ShaderGraph.Drawing; +using UnityEditor.UIElements; +using UnityEngine.Rendering; +using UnityEngine.UIElements; + +namespace UnityEditor.Rendering.HighDefinition +{ + [SGPropertyDrawer(typeof(EyeMasterNode.HDEyeSettings))] + public class EyePropertyDrawer : IPropertyDrawer + { + IntegerField m_SortPriorityField; + + public Action inspectorUpdateDelegate { get; set; } + + private VisualElement CreateGUI(EyeMasterNode masterNode) + { + PropertySheet propertySheet = new PropertySheet(); + int indentLevel = 0; + + // Instantiate property drawers + var enumPropertyDrawer = new EnumPropertyDrawer(); + var toggleDataPropertyDrawer = new ToggleDataPropertyDrawer(); + var integerPropertyDrawer = new IntegerPropertyDrawer(); + + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => + { + masterNode.surfaceType = (SurfaceType) newValue; + this.inspectorUpdateDelegate(); + }, + masterNode.surfaceType, + "Surface Type", + SurfaceType.Opaque, + out var surfaceTypeVisualElement, + indentLevel)); + + if (masterNode.surfaceType == SurfaceType.Transparent) + { + ++indentLevel; + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.blendPreserveSpecular = newValue, + masterNode.blendPreserveSpecular, + "Blend Preserves Specular", + out var preserveSpecularLightingToggle, + indentLevel)); + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.transparencyFog = newValue, + masterNode.transparencyFog, + "Fog", + out var receiveFogToggle, + indentLevel)); + + propertySheet.Add(integerPropertyDrawer.CreateGUI(newValue => + { + m_SortPriorityField.value = masterNode.sortPriority; + masterNode.sortPriority = newValue; + inspectorUpdateDelegate(); + }, + masterNode.sortPriority, + "Sorting Priority", + out var sortPriorityField, + indentLevel)); + // Hold onto field reference for later + m_SortPriorityField = (IntegerField) sortPriorityField; + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.zWrite = newValue, + masterNode.zWrite, + "Depth Write", + out var depthWriteToggle, + indentLevel)); + + if (masterNode.doubleSidedMode == DoubleSidedMode.Disabled) + { + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => masterNode.transparentCullMode = (TransparentCullMode) newValue, + masterNode.transparentCullMode, + "Cull Mode", + masterNode.transparentCullMode, + out var cullModeVisualElement, + indentLevel)); + } + + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => masterNode.zTest = (CompareFunction) newValue, + masterNode.zTest, + "Depth Test", + masterNode.zTest, + out var depthTestVisualElement, + indentLevel)); + --indentLevel; + } + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => + { + masterNode.alphaTest = newValue; + this.inspectorUpdateDelegate(); + }, + masterNode.alphaTest, + "Alpha Clipping", + out var alphaClippingToggle, + indentLevel)); + + if (masterNode.surfaceType == SurfaceType.Transparent && masterNode.alphaTest.isOn) + { + ++indentLevel; + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.alphaTestDepthPrepass = newValue, + masterNode.alphaTestDepthPrepass, + "Alpha Cutoff Depth Prepass", + out var transparentDepthPrepassToggle, + indentLevel)); + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.alphaTestDepthPostpass = newValue, + masterNode.alphaTestDepthPostpass, + "Alpha Cutoff Depth Postpass", + out var transparentDepthPostpassToggle, + indentLevel)); + + --indentLevel; + } + + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => + { + masterNode.doubleSidedMode = (DoubleSidedMode) newValue; + this.inspectorUpdateDelegate(); + }, + masterNode.doubleSidedMode, + "Double-Sided", + DoubleSidedMode.Disabled, + out var doubleSidedModeVisualElement, + indentLevel)); + + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => + { + masterNode.materialType = (EyeMasterNode.MaterialType) newValue; + this.inspectorUpdateDelegate(); + }, + masterNode.materialType, + "Material Type", + EyeMasterNode.MaterialType.Eye, + out var materialTypeVisualElement, + indentLevel)); + + return propertySheet; + } + + public VisualElement DrawProperty(PropertyInfo propertyInfo, object actualObject, Inspectable attribute) + { + return this.CreateGUI((EyeMasterNode) actualObject); + } + } +} diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Eye/ShaderGraph/EyePropertyDrawer.cs.meta b/com.unity.render-pipelines.high-definition/Editor/Material/Eye/ShaderGraph/EyePropertyDrawer.cs.meta new file mode 100644 index 00000000000..59c14702a2e --- /dev/null +++ b/com.unity.render-pipelines.high-definition/Editor/Material/Eye/ShaderGraph/EyePropertyDrawer.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 811ebc59c3a24a5d87fe03473bdd29b7 +timeCreated: 1587039684 \ No newline at end of file diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Eye/ShaderGraph/EyeSettingsView.cs b/com.unity.render-pipelines.high-definition/Editor/Material/Eye/ShaderGraph/EyeSettingsView.cs deleted file mode 100644 index a466e85a917..00000000000 --- a/com.unity.render-pipelines.high-definition/Editor/Material/Eye/ShaderGraph/EyeSettingsView.cs +++ /dev/null @@ -1,458 +0,0 @@ -using System; -using UnityEditor.UIElements; -using UnityEngine; -using UnityEngine.UIElements; -using UnityEditor.Graphing.Util; -using UnityEditor.ShaderGraph; -using UnityEditor.ShaderGraph.Drawing; -using UnityEditor.ShaderGraph.Drawing.Controls; -using UnityEngine.Rendering.HighDefinition; -using UnityEngine.Rendering; - -namespace UnityEditor.Rendering.HighDefinition.Drawing -{ - class EyeSettingsView : MasterNodeSettingsView - { - EyeMasterNode m_Node; - - IntegerField m_SortPiorityField; - - Label CreateLabel(string text, int indentLevel) - { - string label = ""; - for (var i = 0; i < indentLevel; i++) - { - label += " "; - } - return new Label(label + text); - } - - public EyeSettingsView(EyeMasterNode node) : base(node) - { - m_Node = node; - PropertySheet ps = new PropertySheet(); - - int indentLevel = 0; - ps.Add(new PropertyRow(CreateLabel("Surface Type", indentLevel)), (row) => - { - row.Add(new EnumField(SurfaceType.Opaque), (field) => - { - field.value = m_Node.surfaceType; - field.RegisterValueChangedCallback(ChangeSurfaceType); - }); - }); - - if (m_Node.surfaceType == SurfaceType.Transparent) - { - ++indentLevel; - - ps.Add(new PropertyRow(CreateLabel("Blend Preserves Specular", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.blendPreserveSpecular.isOn; - toggle.OnToggleChanged(ChangeBlendPreserveSpecular); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Fog", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.transparencyFog.isOn; - toggle.OnToggleChanged(ChangeTransparencyFog); - }); - }); - - m_SortPiorityField = new IntegerField(); - ps.Add(new PropertyRow(CreateLabel("Sort Priority", indentLevel)), (row) => - { - row.Add(m_SortPiorityField, (field) => - { - field.value = m_Node.sortPriority; - field.RegisterValueChangedCallback(ChangeSortPriority); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Depth Write", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.zWrite.isOn; - toggle.OnToggleChanged(ChangeZWrite); - }); - }); - - if (m_Node.doubleSidedMode == DoubleSidedMode.Disabled) - { - ps.Add(new PropertyRow(CreateLabel("Cull Mode", indentLevel)), (row) => - { - row.Add(new EnumField(m_Node.transparentCullMode), (e) => - { - e.value = m_Node.transparentCullMode; - e.RegisterValueChangedCallback(ChangeTransparentCullMode); - }); - }); - } - - ps.Add(new PropertyRow(CreateLabel("Depth Test", indentLevel)), (row) => - { - row.Add(new EnumField(m_Node.zTest), (e) => - { - e.value = m_Node.zTest; - e.RegisterValueChangedCallback(ChangeZTest); - }); - }); - - --indentLevel; - } - - ps.Add(new PropertyRow(CreateLabel("Alpha Clipping", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.alphaTest.isOn; - toggle.OnToggleChanged(ChangeAlphaTest); - }); - }); - - if (m_Node.surfaceType == SurfaceType.Transparent && m_Node.alphaTest.isOn) - { - ++indentLevel; - ps.Add(new PropertyRow(CreateLabel("Alpha Cutoff Depth Prepass", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.alphaTestDepthPrepass.isOn; - toggle.OnToggleChanged(ChangeAlphaTestPrepass); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Alpha Cutoff Depth Postpass", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.alphaTestDepthPostpass.isOn; - toggle.OnToggleChanged(ChangeAlphaTestPostpass); - }); - }); - --indentLevel; - } - - ps.Add(new PropertyRow(CreateLabel("Double-Sided", indentLevel)), (row) => - { - row.Add(new EnumField(DoubleSidedMode.Disabled), (field) => - { - field.value = m_Node.doubleSidedMode; - field.RegisterValueChangedCallback(ChangeDoubleSidedMode); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Material Type", indentLevel)), (row) => - { - row.Add(new EnumField(EyeMasterNode.MaterialType.Eye), (field) => - { - field.value = m_Node.materialType; - field.RegisterValueChangedCallback(ChangeMaterialType); - }); - }); - - if (m_Node.surfaceType != SurfaceType.Transparent) - { - ps.Add(new PropertyRow(CreateLabel("Subsurface Scattering", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.subsurfaceScattering.isOn; - toggle.OnToggleChanged(ChangeSubsurfaceScattering); - }); - }); - } - - ps.Add(new PropertyRow(CreateLabel("Receive Decals", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.receiveDecals.isOn; - toggle.OnToggleChanged(ChangeDecal); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Receive SSR", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.receiveSSR.isOn; - toggle.OnToggleChanged(ChangeSSR); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Add Precomputed Velocity", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.addPrecomputedVelocity.isOn; - toggle.OnToggleChanged(ChangeAddPrecomputedVelocity); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Specular Occlusion Mode", indentLevel)), (row) => - { - row.Add(new EnumField(SpecularOcclusionMode.Off), (field) => - { - field.value = m_Node.specularOcclusionMode; - field.RegisterValueChangedCallback(ChangeSpecularOcclusionMode); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Override Baked GI", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.overrideBakedGI.isOn; - toggle.OnToggleChanged(ChangeoverrideBakedGI); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Depth Offset", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.depthOffset.isOn; - toggle.OnToggleChanged(ChangeDepthOffset); - }); - }); - - - ps.Add(new PropertyRow(CreateLabel("Support LOD CrossFade", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.supportLodCrossFade.isOn; - toggle.OnToggleChanged(ChangeSupportLODCrossFade); - }); - }); - - Add(ps); - Add(GetShaderGUIOverridePropertySheet()); - } - - void ChangeSurfaceType(ChangeEvent evt) - { - if (Equals(m_Node.surfaceType, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Surface Type Change"); - m_Node.surfaceType = (SurfaceType)evt.newValue; - } - - void ChangeDoubleSidedMode(ChangeEvent evt) - { - if (Equals(m_Node.doubleSidedMode, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Double-Sided Mode Change"); - m_Node.doubleSidedMode = (DoubleSidedMode)evt.newValue; - } - - void ChangeMaterialType(ChangeEvent evt) - { - if (Equals(m_Node.materialType, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Material Type Change"); - m_Node.materialType = (EyeMasterNode.MaterialType)evt.newValue; - } - - void ChangeSubsurfaceScattering(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("SSS Change"); - ToggleData td = m_Node.subsurfaceScattering; - td.isOn = evt.newValue; - m_Node.subsurfaceScattering = td; - } - - void ChangeBlendMode(ChangeEvent evt) - { - // Make sure the mapping is correct by handling each case. - AlphaMode alphaMode = GetAlphaMode((EyeMasterNode.AlphaModeEye)evt.newValue); - - if (Equals(m_Node.alphaMode, alphaMode)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Alpha Mode Change"); - m_Node.alphaMode = alphaMode; - } - - void ChangeBlendPreserveSpecular(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Blend Preserve Specular Change"); - ToggleData td = m_Node.blendPreserveSpecular; - td.isOn = evt.newValue; - m_Node.blendPreserveSpecular = td; - } - - void ChangeTransparencyFog(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Transparency Fog Change"); - ToggleData td = m_Node.transparencyFog; - td.isOn = evt.newValue; - m_Node.transparencyFog = td; - } - - void ChangeSortPriority(ChangeEvent evt) - { - m_Node.sortPriority = HDRenderQueue.ClampsTransparentRangePriority(evt.newValue); - // Force the text to match. - m_SortPiorityField.value = m_Node.sortPriority; - if (Equals(m_Node.sortPriority, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Sort Priority Change"); - } - - void ChangeZWrite(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("ZWrite Change"); - ToggleData td = m_Node.zWrite; - td.isOn = evt.newValue; - m_Node.zWrite = td; - } - - void ChangeAlphaTest(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Alpha Test Change"); - ToggleData td = m_Node.alphaTest; - td.isOn = evt.newValue; - m_Node.alphaTest = td; - } - - void ChangeAlphaTestPrepass(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Alpha Test Depth Prepass Change"); - ToggleData td = m_Node.alphaTestDepthPrepass; - td.isOn = evt.newValue; - m_Node.alphaTestDepthPrepass = td; - } - - void ChangeAlphaTestPostpass(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Alpha Test Depth Postpass Change"); - ToggleData td = m_Node.alphaTestDepthPostpass; - td.isOn = evt.newValue; - m_Node.alphaTestDepthPostpass = td; - } - - void ChangeDecal(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Decal Change"); - ToggleData td = m_Node.receiveDecals; - td.isOn = evt.newValue; - m_Node.receiveDecals = td; - } - - void ChangeSSR(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("SSR Change"); - ToggleData td = m_Node.receiveSSR; - td.isOn = evt.newValue; - m_Node.receiveSSR = td; - } - - void ChangeAddPrecomputedVelocity(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Add Precomputed Velocity"); - ToggleData td = m_Node.addPrecomputedVelocity; - td.isOn = evt.newValue; - m_Node.addPrecomputedVelocity = td; - } - - void ChangeSpecularOcclusionMode(ChangeEvent evt) - { - if (Equals(m_Node.specularOcclusionMode, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Specular Occlusion Mode Change"); - m_Node.specularOcclusionMode = (SpecularOcclusionMode)evt.newValue; - } - - void ChangeoverrideBakedGI(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("overrideBakedGI Change"); - ToggleData td = m_Node.overrideBakedGI; - td.isOn = evt.newValue; - m_Node.overrideBakedGI = td; - } - - void ChangeDepthOffset(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("DepthOffset Change"); - ToggleData td = m_Node.depthOffset; - td.isOn = evt.newValue; - m_Node.depthOffset = td; - } - - void ChangeTransparentCullMode(ChangeEvent evt) - { - if (Equals(m_Node.transparentCullMode, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Transparent Cull Mode Change"); - m_Node.transparentCullMode = (TransparentCullMode)evt.newValue; - } - - void ChangeZTest(ChangeEvent evt) - { - if (Equals(m_Node.zTest, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("ZTest Change"); - m_Node.zTest = (CompareFunction)evt.newValue; - } - - void ChangeSupportLODCrossFade(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Support LOD CrossFade Change"); - ToggleData td = m_Node.supportLodCrossFade; - td.isOn = evt.newValue; - m_Node.supportLodCrossFade = td; - } - - public AlphaMode GetAlphaMode(EyeMasterNode.AlphaModeEye alphaModeLit) - { - switch (alphaModeLit) - { - case EyeMasterNode.AlphaModeEye.Alpha: - return AlphaMode.Alpha; - case EyeMasterNode.AlphaModeEye.Premultiply: - return AlphaMode.Premultiply; - case EyeMasterNode.AlphaModeEye.Additive: - return AlphaMode.Additive; - default: - { - Debug.LogWarning("Not supported: " + alphaModeLit); - return AlphaMode.Alpha; - } - - } - } - - public EyeMasterNode.AlphaModeEye GetAlphaModeLit(AlphaMode alphaMode) - { - switch (alphaMode) - { - case AlphaMode.Alpha: - return EyeMasterNode.AlphaModeEye.Alpha; - case AlphaMode.Premultiply: - return EyeMasterNode.AlphaModeEye.Premultiply; - case AlphaMode.Additive: - return EyeMasterNode.AlphaModeEye.Additive; - default: - { - Debug.LogWarning("Not supported: " + alphaMode); - return EyeMasterNode.AlphaModeEye.Alpha; - } - } - } - } -} diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Eye/ShaderGraph/EyeSettingsView.cs.meta b/com.unity.render-pipelines.high-definition/Editor/Material/Eye/ShaderGraph/EyeSettingsView.cs.meta deleted file mode 100644 index 717d7ea547c..00000000000 --- a/com.unity.render-pipelines.high-definition/Editor/Material/Eye/ShaderGraph/EyeSettingsView.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: a16e0965efec43748ab4d96982eebc60 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Fabric/ShaderGraph/FabricMasterNode.cs b/com.unity.render-pipelines.high-definition/Editor/Material/Fabric/ShaderGraph/FabricMasterNode.cs index 11e1b446d60..5eb950c89a7 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/Fabric/ShaderGraph/FabricMasterNode.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/Fabric/ShaderGraph/FabricMasterNode.cs @@ -11,6 +11,7 @@ using UnityEditor.Rendering.HighDefinition.Drawing; using UnityEditor.ShaderGraph.Internal; using UnityEditor.Rendering.HighDefinition.ShaderGraph; +using UnityEditor.ShaderGraph.Drawing; // Include material common properties names using static UnityEngine.Rendering.HighDefinition.HDMaterialProperties; @@ -21,7 +22,7 @@ namespace UnityEditor.Rendering.HighDefinition [Title("Master", "Fabric (HDRP)")] [FormerName("UnityEditor.Experimental.Rendering.HDPipeline.FabricMasterNode")] [FormerName("UnityEditor.ShaderGraph.FabricMasterNode")] - class FabricMasterNode : AbstractMaterialNode, IMasterNode, IHasSettings, ICanChangeShaderGUI, IMayRequirePosition, IMayRequireNormal, IMayRequireTangent + class FabricMasterNode : AbstractMaterialNode, IMasterNode, ICanChangeShaderGUI, IMayRequirePosition, IMayRequireNormal, IMayRequireTangent { public const string PositionSlotName = "Vertex Position"; public const string PositionSlotDisplayName = "Vertex Position"; @@ -167,12 +168,50 @@ public SurfaceType surfaceType if (m_SurfaceType == value) return; + this.owner.owner.RegisterCompleteObjectUndo("Surface Type Change"); m_SurfaceType = value; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); } } + public AlphaMode GetAlphaMode(AlphaModeFabric alphaModeLit) + { + switch (alphaModeLit) + { + case AlphaModeFabric.Alpha: + return AlphaMode.Alpha; + case AlphaModeFabric.Premultiply: + return AlphaMode.Premultiply; + case AlphaModeFabric.Additive: + return AlphaMode.Additive; + default: + { + Debug.LogWarning("Not supported: " + alphaModeLit); + return AlphaMode.Alpha; + } + + } + } + + public AlphaModeFabric GetAlphaModeLit(AlphaMode alphaMode) + { + switch (alphaMode) + { + case AlphaMode.Alpha: + return AlphaModeFabric.Alpha; + case AlphaMode.Premultiply: + return AlphaModeFabric.Premultiply; + case AlphaMode.Additive: + return AlphaModeFabric.Additive; + default: + { + Debug.LogWarning("Not supported: " + alphaMode); + return AlphaModeFabric.Alpha; + } + } + } + [SerializeField] AlphaMode m_AlphaMode; @@ -181,9 +220,13 @@ public AlphaMode alphaMode get { return m_AlphaMode; } set { + // Make sure the mapping is correct by handling each case. + var newValue = GetAlphaMode((AlphaModeFabric)value); + if (m_AlphaMode == value) return; + this.owner.owner.RegisterCompleteObjectUndo("Alpha Mode Change"); m_AlphaMode = value; Dirty(ModificationScope.Graph); } @@ -199,6 +242,8 @@ public ToggleData blendPreserveSpecular { if (m_BlendPreserveSpecular == value.isOn) return; + + this.owner.owner.RegisterCompleteObjectUndo("Blend Preserve Specular Change"); m_BlendPreserveSpecular = value.isOn; Dirty(ModificationScope.Graph); } @@ -214,6 +259,8 @@ public ToggleData transparencyFog { if (m_TransparencyFog == value.isOn) return; + + this.owner.owner.RegisterCompleteObjectUndo("Transparency Fog Change"); m_TransparencyFog = value.isOn; Dirty(ModificationScope.Graph); } @@ -222,6 +269,7 @@ public ToggleData transparencyFog [SerializeField] bool m_AlphaTest; + [Inspectable("Alpha Clipping", false)] public ToggleData alphaTest { get { return new ToggleData(m_AlphaTest); } @@ -229,6 +277,8 @@ public ToggleData alphaTest { if (m_AlphaTest == value.isOn) return; + + this.owner.owner.RegisterCompleteObjectUndo("Alpha Test Change"); m_AlphaTest = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -243,9 +293,12 @@ public int sortPriority get { return m_SortPriority; } set { - if (m_SortPriority == value) + var newValue = HDRenderQueue.ClampsTransparentRangePriority(value); + if (m_SortPriority == newValue) return; - m_SortPriority = value; + + this.owner.owner.RegisterCompleteObjectUndo("Sort Priority Change"); + m_SortPriority = newValue; Dirty(ModificationScope.Graph); } } @@ -261,6 +314,7 @@ public DoubleSidedMode doubleSidedMode if (m_DoubleSidedMode == value) return; + this.owner.owner.RegisterCompleteObjectUndo("Double-Sided Mode Change"); m_DoubleSidedMode = value; Dirty(ModificationScope.Topological); } @@ -277,6 +331,7 @@ public MaterialType materialType if (m_MaterialType == value) return; + this.owner.owner.RegisterCompleteObjectUndo("Material Type Change"); m_MaterialType = value; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -286,6 +341,7 @@ public MaterialType materialType [SerializeField] bool m_ReceiveDecals = true; + [Inspectable("Receive Decals", true)] public ToggleData receiveDecals { get { return new ToggleData(m_ReceiveDecals); } @@ -293,6 +349,8 @@ public ToggleData receiveDecals { if (m_ReceiveDecals == value.isOn) return; + + this.owner.owner.RegisterCompleteObjectUndo("Decal Change"); m_ReceiveDecals = value.isOn; Dirty(ModificationScope.Graph); } @@ -300,6 +358,8 @@ public ToggleData receiveDecals [SerializeField] bool m_ReceivesSSR = true; + + [Inspectable("Receive SSR", true)] public ToggleData receiveSSR { get { return new ToggleData(m_ReceivesSSR); } @@ -307,6 +367,8 @@ public ToggleData receiveSSR { if (m_ReceivesSSR == value.isOn) return; + + this.owner.owner.RegisterCompleteObjectUndo("SSR Change"); m_ReceivesSSR = value.isOn; Dirty(ModificationScope.Graph); } @@ -315,6 +377,7 @@ public ToggleData receiveSSR [SerializeField] bool m_AddPrecomputedVelocity = false; + [Inspectable("Add Precomputed Velocity", false)] public ToggleData addPrecomputedVelocity { get { return new ToggleData(m_AddPrecomputedVelocity); } @@ -322,6 +385,7 @@ public ToggleData addPrecomputedVelocity { if (m_AddPrecomputedVelocity == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Add Precomputed Velocity"); m_AddPrecomputedVelocity = value.isOn; Dirty(ModificationScope.Graph); } @@ -337,6 +401,7 @@ public ToggleData energyConservingSpecular { if (m_EnergyConservingSpecular == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Energy Conserving Specular Change"); m_EnergyConservingSpecular = value.isOn; Dirty(ModificationScope.Graph); } @@ -352,6 +417,8 @@ public ToggleData transmission { if (m_Transmission == value.isOn) return; + + this.owner.owner.RegisterCompleteObjectUndo("Transmission Change"); m_Transmission = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Graph); @@ -368,6 +435,8 @@ public ToggleData subsurfaceScattering { if (m_SubsurfaceScattering == value.isOn) return; + + this.owner.owner.RegisterCompleteObjectUndo("SSS Change"); m_SubsurfaceScattering = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Graph); @@ -377,6 +446,7 @@ public ToggleData subsurfaceScattering [SerializeField] SpecularOcclusionMode m_SpecularOcclusionMode; + [Inspectable("Specular Occlusion Mode", SpecularOcclusionMode.Off)] public SpecularOcclusionMode specularOcclusionMode { get { return m_SpecularOcclusionMode; } @@ -385,6 +455,7 @@ public SpecularOcclusionMode specularOcclusionMode if (m_SpecularOcclusionMode == value) return; + this.owner.owner.RegisterCompleteObjectUndo("Specular Occlusion Mode Change"); m_SpecularOcclusionMode = value; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -394,6 +465,7 @@ public SpecularOcclusionMode specularOcclusionMode [SerializeField] bool m_overrideBakedGI; + [Inspectable("Override Baked GI", false)] public ToggleData overrideBakedGI { get { return new ToggleData(m_overrideBakedGI); } @@ -401,6 +473,8 @@ public ToggleData overrideBakedGI { if (m_overrideBakedGI == value.isOn) return; + + this.owner.owner.RegisterCompleteObjectUndo("overrideBakedGI Change"); m_overrideBakedGI = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -410,6 +484,7 @@ public ToggleData overrideBakedGI [SerializeField] bool m_depthOffset; + [Inspectable("Depth Offset", false)] public ToggleData depthOffset { get { return new ToggleData(m_depthOffset); } @@ -417,6 +492,8 @@ public ToggleData depthOffset { if (m_depthOffset == value.isOn) return; + + this.owner.owner.RegisterCompleteObjectUndo("DepthOffset Change"); m_depthOffset = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -433,6 +510,7 @@ public ToggleData zWrite { if (m_ZWrite == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("ZWrite Change"); m_ZWrite = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Graph); @@ -449,6 +527,7 @@ public TransparentCullMode transparentCullMode if (m_transparentCullMode == value) return; + this.owner.owner.RegisterCompleteObjectUndo("Transparent Cull Mode Change"); m_transparentCullMode = value; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Graph); @@ -465,6 +544,7 @@ public CompareFunction zTest if (m_ZTest == value) return; + this.owner.owner.RegisterCompleteObjectUndo("ZTest Change"); m_ZTest = value; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Graph); @@ -474,6 +554,7 @@ public CompareFunction zTest [SerializeField] bool m_SupportLodCrossFade; + [Inspectable("Support LOD CrossFade", false)] public ToggleData supportLodCrossFade { get { return new ToggleData(m_SupportLodCrossFade); } @@ -481,6 +562,8 @@ public ToggleData supportLodCrossFade { if (m_SupportLodCrossFade == value.isOn) return; + + this.owner.owner.RegisterCompleteObjectUndo("Support LOD CrossFade Change"); m_SupportLodCrossFade = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Node); @@ -517,6 +600,27 @@ int ComputeMaterialNeedsUpdateHash() return hash; } + // This struct, and the corresponding property below it, exist to expose the master node to the inspector for drawing settings + public struct FabricSettings + { + // Empty struct + } + + [Inspectable("HDRP Fabric Settings", null)] + public FabricSettings HDFabricSettings { get; private set; } + + // This property exists to expose shaderGUI Override info. to the inspector + [Inspectable("ShaderGUI", null)] + public ShaderGUIOverrideInfo ShaderGUIInfo + { + get => new ShaderGUIOverrideInfo(this.OverrideEnabled, this.ShaderGUIOverride); + set + { + this.ShaderGUIOverride = value.ShaderGUIOverride; + this.OverrideEnabled = value.OverrideEnabled; + } + } + [SerializeField] private string m_ShaderGUIOverride; public string ShaderGUIOverride { @@ -692,11 +796,6 @@ public sealed override void UpdateNodeAfterDeserialization() RemoveSlotsNameNotMatching(validSlots, true); } - public VisualElement CreateSettingsElement() - { - return new FabricSettingsView(this); - } - public string renderQueueTag { get diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Fabric/ShaderGraph/FabricPropertyDrawer.cs b/com.unity.render-pipelines.high-definition/Editor/Material/Fabric/ShaderGraph/FabricPropertyDrawer.cs new file mode 100644 index 00000000000..0428a28bae0 --- /dev/null +++ b/com.unity.render-pipelines.high-definition/Editor/Material/Fabric/ShaderGraph/FabricPropertyDrawer.cs @@ -0,0 +1,157 @@ +using System; +using System.Reflection; +using Drawing.Inspector; +using UnityEditor.ShaderGraph; +using UnityEditor.ShaderGraph.Drawing; +using UnityEditor.UIElements; +using UnityEngine.Rendering; +using UnityEngine.UIElements; + +namespace UnityEditor.Rendering.HighDefinition +{ + [SGPropertyDrawer(typeof(FabricMasterNode.FabricSettings))] + public class FabricPropertyDrawer : IPropertyDrawer + { + IntegerField m_SortPriorityField; + + public Action inspectorUpdateDelegate { get; set; } + + private VisualElement CreateGUI(FabricMasterNode masterNode) + { + PropertySheet propertySheet = new PropertySheet(); + int indentLevel = 0; + + // Instantiate property drawers + var enumPropertyDrawer = new EnumPropertyDrawer(); + var toggleDataPropertyDrawer = new ToggleDataPropertyDrawer(); + var integerPropertyDrawer = new IntegerPropertyDrawer(); + + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => + { + masterNode.surfaceType = (SurfaceType) newValue; + this.inspectorUpdateDelegate(); + }, + masterNode.surfaceType, + "Surface Type", + SurfaceType.Opaque, + out var surfaceTypeVisualElement, + indentLevel)); + + if (masterNode.surfaceType == SurfaceType.Transparent) + { + ++indentLevel; + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.blendPreserveSpecular = newValue, + masterNode.blendPreserveSpecular, + "Blend Preserves Specular", + out var preserveSpecularLightingToggle, + indentLevel)); + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.transparencyFog = newValue, + masterNode.transparencyFog, + "Fog", + out var receiveFogToggle, + indentLevel)); + + propertySheet.Add(integerPropertyDrawer.CreateGUI(newValue => + { + m_SortPriorityField.value = masterNode.sortPriority; + masterNode.sortPriority = newValue; + inspectorUpdateDelegate(); + }, + masterNode.sortPriority, + "Sorting Priority", + out var sortPriorityField, + indentLevel)); + // Hold onto field reference for later + m_SortPriorityField = (IntegerField) sortPriorityField; + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.zWrite = newValue, + masterNode.zWrite, + "Depth Write", + out var depthWriteToggle, + indentLevel)); + + if (masterNode.doubleSidedMode == DoubleSidedMode.Disabled) + { + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => masterNode.transparentCullMode = (TransparentCullMode) newValue, + masterNode.transparentCullMode, + "Cull Mode", + masterNode.transparentCullMode, + out var cullModeVisualElement, + indentLevel)); + } + + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => masterNode.zTest = (CompareFunction) newValue, + masterNode.zTest, + "Depth Test", + masterNode.zTest, + out var depthTestVisualElement, + indentLevel)); + --indentLevel; + } + + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => + { + masterNode.doubleSidedMode = (DoubleSidedMode) newValue; + this.inspectorUpdateDelegate(); + }, + masterNode.doubleSidedMode, + "Double-Sided", + DoubleSidedMode.Disabled, + out var doubleSidedModeVisualElement, + indentLevel)); + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.energyConservingSpecular = newValue, + masterNode.energyConservingSpecular, + "Energy Conserving Specular", + out var energyConservingSpecularToggle, + indentLevel)); + + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => + { + masterNode.materialType = (FabricMasterNode.MaterialType) newValue; + this.inspectorUpdateDelegate(); + }, + masterNode.materialType, + "Material Type", + FabricMasterNode.MaterialType.CottonWool, + out var materialTypeVisualElement, + indentLevel)); + + if (masterNode.surfaceType != SurfaceType.Transparent) + { + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.subsurfaceScattering = newValue, + masterNode.subsurfaceScattering, + "Subsurface Scattering", + out var subsurfaceScatteringToggle, + indentLevel)); + } + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.transmission = newValue, + masterNode.transmission, + "Transmission", + out var tranmissionToggle, + indentLevel)); + + return propertySheet; + } + + public VisualElement DrawProperty(PropertyInfo propertyInfo, object actualObject, Inspectable attribute) + { + return this.CreateGUI((FabricMasterNode) actualObject); + + } + } +} diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Fabric/ShaderGraph/FabricPropertyDrawer.cs.meta b/com.unity.render-pipelines.high-definition/Editor/Material/Fabric/ShaderGraph/FabricPropertyDrawer.cs.meta new file mode 100644 index 00000000000..983592edb8c --- /dev/null +++ b/com.unity.render-pipelines.high-definition/Editor/Material/Fabric/ShaderGraph/FabricPropertyDrawer.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d5c558c14396497d9a6b49dc02178b2d +timeCreated: 1587033123 \ No newline at end of file diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Fabric/ShaderGraph/FabricSettingsView.cs b/com.unity.render-pipelines.high-definition/Editor/Material/Fabric/ShaderGraph/FabricSettingsView.cs deleted file mode 100644 index 11de8857af2..00000000000 --- a/com.unity.render-pipelines.high-definition/Editor/Material/Fabric/ShaderGraph/FabricSettingsView.cs +++ /dev/null @@ -1,452 +0,0 @@ -using System; -using UnityEditor.UIElements; -using UnityEngine; -using UnityEngine.UIElements; -using UnityEditor.Graphing.Util; -using UnityEditor.ShaderGraph; -using UnityEditor.ShaderGraph.Drawing; -using UnityEditor.ShaderGraph.Drawing.Controls; -using UnityEngine.Rendering.HighDefinition; -using UnityEngine.Rendering; - -namespace UnityEditor.Rendering.HighDefinition.Drawing -{ - class FabricSettingsView : MasterNodeSettingsView - { - FabricMasterNode m_Node; - - IntegerField m_SortPiorityField; - - Label CreateLabel(string text, int indentLevel) - { - string label = ""; - for (var i = 0; i < indentLevel; i++) - { - label += " "; - } - return new Label(label + text); - } - - public FabricSettingsView(FabricMasterNode node) : base(node) - { - m_Node = node; - PropertySheet ps = new PropertySheet(); - - int indentLevel = 0; - ps.Add(new PropertyRow(CreateLabel("Surface Type", indentLevel)), (row) => - { - row.Add(new EnumField(SurfaceType.Opaque), (field) => - { - field.value = m_Node.surfaceType; - field.RegisterValueChangedCallback(ChangeSurfaceType); - }); - }); - - if (m_Node.surfaceType == SurfaceType.Transparent) - { - ++indentLevel; - - ps.Add(new PropertyRow(CreateLabel("Blend Preserves Specular", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.blendPreserveSpecular.isOn; - toggle.OnToggleChanged(ChangeBlendPreserveSpecular); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Fog", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.transparencyFog.isOn; - toggle.OnToggleChanged(ChangeTransparencyFog); - }); - }); - - m_SortPiorityField = new IntegerField(); - ps.Add(new PropertyRow(CreateLabel("Sort Priority", indentLevel)), (row) => - { - row.Add(m_SortPiorityField, (field) => - { - field.value = m_Node.sortPriority; - field.RegisterValueChangedCallback(ChangeSortPriority); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Depth Write", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.zWrite.isOn; - toggle.OnToggleChanged(ChangeZWrite); - }); - }); - - if (m_Node.doubleSidedMode == DoubleSidedMode.Disabled) - { - ps.Add(new PropertyRow(CreateLabel("Cull Mode", indentLevel)), (row) => - { - row.Add(new EnumField(m_Node.transparentCullMode), (e) => - { - e.value = m_Node.transparentCullMode; - e.RegisterValueChangedCallback(ChangeTransparentCullMode); - }); - }); - } - - ps.Add(new PropertyRow(CreateLabel("Depth Test", indentLevel)), (row) => - { - row.Add(new EnumField(m_Node.zTest), (e) => - { - e.value = m_Node.zTest; - e.RegisterValueChangedCallback(ChangeZTest); - }); - }); - - --indentLevel; - } - - ps.Add(new PropertyRow(CreateLabel("Alpha Clipping", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.alphaTest.isOn; - toggle.OnToggleChanged(ChangeAlphaTest); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Double-Sided", indentLevel)), (row) => - { - row.Add(new EnumField(DoubleSidedMode.Disabled), (field) => - { - field.value = m_Node.doubleSidedMode; - field.RegisterValueChangedCallback(ChangeDoubleSidedMode); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Energy Conserving Specular", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.energyConservingSpecular.isOn; - toggle.OnToggleChanged(ChangeEnergyConservingSpecular); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Material Type", indentLevel)), (row) => - { - row.Add(new EnumField(FabricMasterNode.MaterialType.CottonWool), (field) => - { - field.value = m_Node.materialType; - field.RegisterValueChangedCallback(ChangeMaterialType); - }); - }); - - if (m_Node.surfaceType != SurfaceType.Transparent) - { - ps.Add(new PropertyRow(CreateLabel("Subsurface Scattering", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.subsurfaceScattering.isOn; - toggle.OnToggleChanged(ChangeSubsurfaceScattering); - }); - }); - } - - ps.Add(new PropertyRow(CreateLabel("Transmission", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.transmission.isOn; - toggle.OnToggleChanged(ChangeTransmission); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Receive Decals", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.receiveDecals.isOn; - toggle.OnToggleChanged(ChangeDecal); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Receive SSR", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.receiveSSR.isOn; - toggle.OnToggleChanged(ChangeSSR); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Add Precomputed Velocity", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.addPrecomputedVelocity.isOn; - toggle.OnToggleChanged(ChangeAddPrecomputedVelocity); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Specular Occlusion Mode", indentLevel)), (row) => - { - row.Add(new EnumField(SpecularOcclusionMode.Off), (field) => - { - field.value = m_Node.specularOcclusionMode; - field.RegisterValueChangedCallback(ChangeSpecularOcclusionMode); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Override Baked GI", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.overrideBakedGI.isOn; - toggle.OnToggleChanged(ChangeoverrideBakedGI); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Depth Offset", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.depthOffset.isOn; - toggle.OnToggleChanged(ChangeDepthOffset); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Support LOD CrossFade", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.supportLodCrossFade.isOn; - toggle.OnToggleChanged(ChangeSupportLODCrossFade); - }); - }); - - Add(ps); - Add(GetShaderGUIOverridePropertySheet()); - } - - void ChangeSurfaceType(ChangeEvent evt) - { - if (Equals(m_Node.surfaceType, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Surface Type Change"); - m_Node.surfaceType = (SurfaceType)evt.newValue; - } - - void ChangeDoubleSidedMode(ChangeEvent evt) - { - if (Equals(m_Node.doubleSidedMode, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Double-Sided Mode Change"); - m_Node.doubleSidedMode = (DoubleSidedMode)evt.newValue; - } - - void ChangeMaterialType(ChangeEvent evt) - { - if (Equals(m_Node.materialType, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Material Type Change"); - m_Node.materialType = (FabricMasterNode.MaterialType)evt.newValue; - } - - void ChangeTransmission(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Transmission Change"); - ToggleData td = m_Node.transmission; - td.isOn = evt.newValue; - m_Node.transmission = td; - } - - void ChangeSubsurfaceScattering(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("SSS Change"); - ToggleData td = m_Node.subsurfaceScattering; - td.isOn = evt.newValue; - m_Node.subsurfaceScattering = td; - } - - void ChangeBlendMode(ChangeEvent evt) - { - // Make sure the mapping is correct by handling each case. - AlphaMode alphaMode = GetAlphaMode((FabricMasterNode.AlphaModeFabric)evt.newValue); - - if (Equals(m_Node.alphaMode, alphaMode)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Alpha Mode Change"); - m_Node.alphaMode = alphaMode; - } - - void ChangeBlendPreserveSpecular(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Blend Preserve Specular Change"); - ToggleData td = m_Node.blendPreserveSpecular; - td.isOn = evt.newValue; - m_Node.blendPreserveSpecular = td; - } - - void ChangeTransparencyFog(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Transparency Fog Change"); - ToggleData td = m_Node.transparencyFog; - td.isOn = evt.newValue; - m_Node.transparencyFog = td; - } - - void ChangeSortPriority(ChangeEvent evt) - { - m_Node.sortPriority = HDRenderQueue.ClampsTransparentRangePriority(evt.newValue); - // Force the text to match. - m_SortPiorityField.value = m_Node.sortPriority; - if (Equals(m_Node.sortPriority, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Sort Priority Change"); - } - - void ChangeZWrite(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("ZWrite Change"); - ToggleData td = m_Node.zWrite; - td.isOn = evt.newValue; - m_Node.zWrite = td; - } - - void ChangeAlphaTest(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Alpha Test Change"); - ToggleData td = m_Node.alphaTest; - td.isOn = evt.newValue; - m_Node.alphaTest = td; - } - - void ChangeDecal(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Decal Change"); - ToggleData td = m_Node.receiveDecals; - td.isOn = evt.newValue; - m_Node.receiveDecals = td; - } - - void ChangeSSR(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("SSR Change"); - ToggleData td = m_Node.receiveSSR; - td.isOn = evt.newValue; - m_Node.receiveSSR = td; - } - - void ChangeAddPrecomputedVelocity(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Add Precomputed Velocity"); - ToggleData td = m_Node.addPrecomputedVelocity; - td.isOn = evt.newValue; - m_Node.addPrecomputedVelocity = td; - } - - void ChangeEnergyConservingSpecular(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Energy Conserving Specular Change"); - ToggleData td = m_Node.energyConservingSpecular; - td.isOn = evt.newValue; - m_Node.energyConservingSpecular = td; - } - - void ChangeSpecularOcclusionMode(ChangeEvent evt) - { - if (Equals(m_Node.specularOcclusionMode, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Specular Occlusion Mode Change"); - m_Node.specularOcclusionMode = (SpecularOcclusionMode)evt.newValue; - } - - void ChangeoverrideBakedGI(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("overrideBakedGI Change"); - ToggleData td = m_Node.overrideBakedGI; - td.isOn = evt.newValue; - m_Node.overrideBakedGI = td; - } - - void ChangeDepthOffset(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("DepthOffset Change"); - ToggleData td = m_Node.depthOffset; - td.isOn = evt.newValue; - m_Node.depthOffset = td; - } - - void ChangeTransparentCullMode(ChangeEvent evt) - { - if (Equals(m_Node.transparentCullMode, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Transparent Cull Mode Change"); - m_Node.transparentCullMode = (TransparentCullMode)evt.newValue; - } - - void ChangeZTest(ChangeEvent evt) - { - if (Equals(m_Node.zTest, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("ZTest Change"); - m_Node.zTest = (CompareFunction)evt.newValue; - } - - void ChangeSupportLODCrossFade(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Support LOD CrossFade Change"); - ToggleData td = m_Node.supportLodCrossFade; - td.isOn = evt.newValue; - m_Node.supportLodCrossFade = td; - } - - public AlphaMode GetAlphaMode(FabricMasterNode.AlphaModeFabric alphaModeLit) - { - switch (alphaModeLit) - { - case FabricMasterNode.AlphaModeFabric.Alpha: - return AlphaMode.Alpha; - case FabricMasterNode.AlphaModeFabric.Premultiply: - return AlphaMode.Premultiply; - case FabricMasterNode.AlphaModeFabric.Additive: - return AlphaMode.Additive; - default: - { - Debug.LogWarning("Not supported: " + alphaModeLit); - return AlphaMode.Alpha; - } - - } - } - - public FabricMasterNode.AlphaModeFabric GetAlphaModeLit(AlphaMode alphaMode) - { - switch (alphaMode) - { - case AlphaMode.Alpha: - return FabricMasterNode.AlphaModeFabric.Alpha; - case AlphaMode.Premultiply: - return FabricMasterNode.AlphaModeFabric.Premultiply; - case AlphaMode.Additive: - return FabricMasterNode.AlphaModeFabric.Additive; - default: - { - Debug.LogWarning("Not supported: " + alphaMode); - return FabricMasterNode.AlphaModeFabric.Alpha; - } - } - } - } -} diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Hair/ShaderGraph/HairMasterNode.cs b/com.unity.render-pipelines.high-definition/Editor/Material/Hair/ShaderGraph/HairMasterNode.cs index 62d50b3ebb2..e3d796c5d7e 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/Hair/ShaderGraph/HairMasterNode.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/Hair/ShaderGraph/HairMasterNode.cs @@ -11,6 +11,7 @@ using UnityEditor.Rendering.HighDefinition.Drawing; using UnityEditor.ShaderGraph.Internal; using UnityEditor.Rendering.HighDefinition.ShaderGraph; +using UnityEditor.ShaderGraph.Drawing; // Include material common properties names using static UnityEngine.Rendering.HighDefinition.HDMaterialProperties; @@ -20,7 +21,7 @@ namespace UnityEditor.Rendering.HighDefinition [Serializable] [Title("Master", "Hair (HDRP)")] [FormerName("UnityEditor.Experimental.Rendering.HDPipeline.HairMasterNode")] - class HairMasterNode : AbstractMaterialNode, IMasterNode, IHasSettings, ICanChangeShaderGUI, IMayRequirePosition, IMayRequireNormal, IMayRequireTangent + class HairMasterNode : AbstractMaterialNode, IMasterNode, ICanChangeShaderGUI, IMayRequirePosition, IMayRequireNormal, IMayRequireTangent { public const string PositionSlotName = "Vertex Position"; public const string PositionSlotDisplayName = "Vertex Position"; @@ -192,6 +193,7 @@ public SurfaceType surfaceType if (m_SurfaceType == value) return; + this.owner.owner.RegisterCompleteObjectUndo("Surface Type Change"); m_SurfaceType = value; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -209,6 +211,7 @@ public AlphaMode alphaMode if (m_AlphaMode == value) return; + this.owner.owner.RegisterCompleteObjectUndo("Alpha Mode Change"); m_AlphaMode = value; Dirty(ModificationScope.Graph); } @@ -224,6 +227,7 @@ public ToggleData blendPreserveSpecular { if (m_BlendPreserveSpecular == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Blend Preserve Specular Change"); m_BlendPreserveSpecular = value.isOn; Dirty(ModificationScope.Graph); } @@ -239,6 +243,7 @@ public ToggleData transparencyFog { if (m_TransparencyFog == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Transparency Fog Change"); m_TransparencyFog = value.isOn; Dirty(ModificationScope.Graph); } @@ -254,6 +259,7 @@ public ToggleData alphaTest { if (m_AlphaTest == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Alpha Test Change"); m_AlphaTest = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -270,6 +276,7 @@ public ToggleData alphaTestDepthPrepass { if (m_AlphaTestDepthPrepass == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Alpha Test Depth Prepass Change"); m_AlphaTestDepthPrepass = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -286,6 +293,7 @@ public ToggleData alphaTestDepthPostpass { if (m_AlphaTestDepthPostpass == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Alpha Test Depth Postpass Change"); m_AlphaTestDepthPostpass = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -302,6 +310,7 @@ public ToggleData transparentWritesMotionVec { if (m_TransparentWritesMotionVec == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Transparent Writes Motion Vector Change"); m_TransparentWritesMotionVec = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -318,6 +327,7 @@ public ToggleData alphaTestShadow { if (m_AlphaTestShadow == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Alpha Test Shadow Change"); m_AlphaTestShadow = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -347,9 +357,13 @@ public int sortPriority get { return m_SortPriority; } set { - if (m_SortPriority == value) + var newValue = HDRenderQueue.ClampsTransparentRangePriority(value); + + if (m_SortPriority == newValue) return; - m_SortPriority = value; + + this.owner.owner.RegisterCompleteObjectUndo("Sort Priority Change"); + m_SortPriority = newValue; Dirty(ModificationScope.Graph); } } @@ -365,6 +379,7 @@ public DoubleSidedMode doubleSidedMode if (m_DoubleSidedMode == value) return; + this.owner.owner.RegisterCompleteObjectUndo("Double-Sided Mode Change"); m_DoubleSidedMode = value; Dirty(ModificationScope.Topological); } @@ -390,6 +405,7 @@ public MaterialType materialType [SerializeField] bool m_ReceiveDecals = true; + [Inspectable("Receive Decals", true)] public ToggleData receiveDecals { get { return new ToggleData(m_ReceiveDecals); } @@ -404,6 +420,8 @@ public ToggleData receiveDecals [SerializeField] bool m_ReceivesSSR = true; + + [Inspectable("Receive SSR", true)] public ToggleData receiveSSR { get { return new ToggleData(m_ReceivesSSR); } @@ -411,6 +429,7 @@ public ToggleData receiveSSR { if (m_ReceivesSSR == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("SSR Change"); m_ReceivesSSR = value.isOn; Dirty(ModificationScope.Graph); } @@ -419,6 +438,7 @@ public ToggleData receiveSSR [SerializeField] bool m_AddPrecomputedVelocity = false; + [Inspectable("Add Precomputed Velocity", false)] public ToggleData addPrecomputedVelocity { get { return new ToggleData(m_AddPrecomputedVelocity); } @@ -426,6 +446,7 @@ public ToggleData addPrecomputedVelocity { if (m_AddPrecomputedVelocity == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Add Precomputed Velocity"); m_AddPrecomputedVelocity = value.isOn; Dirty(ModificationScope.Graph); } @@ -435,6 +456,8 @@ public ToggleData addPrecomputedVelocity [SerializeField] bool m_UseLightFacingNormal = false; + + [Inspectable("Use Light Facing Normal", false)] public ToggleData useLightFacingNormal { get { return new ToggleData(m_UseLightFacingNormal); } @@ -442,6 +465,7 @@ public ToggleData useLightFacingNormal { if (m_UseLightFacingNormal == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Use Light Facing Normal Change"); m_UseLightFacingNormal = value.isOn; Dirty(ModificationScope.Graph); } @@ -450,6 +474,7 @@ public ToggleData useLightFacingNormal [SerializeField] bool m_SpecularAA; + [Inspectable("Geometric Specular AA", false)] public ToggleData specularAA { get { return new ToggleData(m_SpecularAA); } @@ -457,6 +482,8 @@ public ToggleData specularAA { if (m_SpecularAA == value.isOn) return; + + this.owner.owner.RegisterCompleteObjectUndo("Specular AA Change"); m_SpecularAA = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -496,6 +523,7 @@ public float specularAAThreshold [SerializeField] SpecularOcclusionMode m_SpecularOcclusionMode; + [Inspectable("Specular Occlusion Mode", SpecularOcclusionMode.Off)] public SpecularOcclusionMode specularOcclusionMode { get { return m_SpecularOcclusionMode; } @@ -504,6 +532,7 @@ public SpecularOcclusionMode specularOcclusionMode if (m_SpecularOcclusionMode == value) return; + this.owner.owner.RegisterCompleteObjectUndo("Specular Occlusion Mode Change"); m_SpecularOcclusionMode = value; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Graph); @@ -513,6 +542,7 @@ public SpecularOcclusionMode specularOcclusionMode [SerializeField] bool m_overrideBakedGI; + [Inspectable("Override Baked GI", false)] public ToggleData overrideBakedGI { get { return new ToggleData(m_overrideBakedGI); } @@ -520,6 +550,7 @@ public ToggleData overrideBakedGI { if (m_overrideBakedGI == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("overrideBakedGI Change"); m_overrideBakedGI = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -529,6 +560,7 @@ public ToggleData overrideBakedGI [SerializeField] bool m_depthOffset; + [Inspectable("Depth Offset", false)] public ToggleData depthOffset { get { return new ToggleData(m_depthOffset); } @@ -536,6 +568,7 @@ public ToggleData depthOffset { if (m_depthOffset == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("DepthOffset Change"); m_depthOffset = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -552,6 +585,7 @@ public ToggleData zWrite { if (m_ZWrite == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("ZWrite Change"); m_ZWrite = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Graph); @@ -568,6 +602,7 @@ public TransparentCullMode transparentCullMode if (m_transparentCullMode == value) return; + this.owner.owner.RegisterCompleteObjectUndo("Transparent Cull Mode Change"); m_transparentCullMode = value; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Graph); @@ -584,6 +619,7 @@ public CompareFunction zTest if (m_ZTest == value) return; + this.owner.owner.RegisterCompleteObjectUndo("ZTest Change"); m_ZTest = value; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Graph); @@ -593,6 +629,7 @@ public CompareFunction zTest [SerializeField] bool m_SupportLodCrossFade; + [Inspectable("Support LOD Crossfade", false)] public ToggleData supportLodCrossFade { get { return new ToggleData(m_SupportLodCrossFade); } @@ -600,6 +637,8 @@ public ToggleData supportLodCrossFade { if (m_SupportLodCrossFade == value.isOn) return; + + this.owner.owner.RegisterCompleteObjectUndo("Support LOD CrossFade Change"); m_SupportLodCrossFade = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Node); @@ -636,6 +675,27 @@ int ComputeMaterialNeedsUpdateHash() return hash; } + // This struct, and the corresponding property below it, exist to expose the master node to the inspector for drawing settings + public struct HairSettings + { + // Empty struct + } + + [Inspectable("HDRP Hair Settings", null)] + public HairSettings HDHairSettings { get; private set; } + + // This property exists to expose shaderGUI Override info. to the inspector + [Inspectable("ShaderGUI", null)] + public ShaderGUIOverrideInfo ShaderGUIInfo + { + get => new ShaderGUIOverrideInfo(this.OverrideEnabled, this.ShaderGUIOverride); + set + { + this.ShaderGUIOverride = value.ShaderGUIOverride; + this.OverrideEnabled = value.OverrideEnabled; + } + } + [SerializeField] private string m_ShaderGUIOverride; public string ShaderGUIOverride { @@ -803,11 +863,6 @@ public sealed override void UpdateNodeAfterDeserialization() RemoveSlotsNameNotMatching(validSlots, true); } - public VisualElement CreateSettingsElement() - { - return new HairSettingsView(this); - } - public string renderQueueTag { get diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Hair/ShaderGraph/HairPropertyDrawer.cs b/com.unity.render-pipelines.high-definition/Editor/Material/Hair/ShaderGraph/HairPropertyDrawer.cs new file mode 100644 index 00000000000..4a4e10b2bcc --- /dev/null +++ b/com.unity.render-pipelines.high-definition/Editor/Material/Hair/ShaderGraph/HairPropertyDrawer.cs @@ -0,0 +1,171 @@ +using System; +using System.Reflection; +using Drawing.Inspector; +using UnityEditor.ShaderGraph; +using UnityEditor.ShaderGraph.Drawing; +using UnityEditor.UIElements; +using UnityEngine.Rendering; +using UnityEngine.UIElements; + +namespace UnityEditor.Rendering.HighDefinition +{ + [SGPropertyDrawer(typeof(HairMasterNode.HairSettings))] + public class HairPropertyDrawer : IPropertyDrawer + { + IntegerField m_SortPriorityField; + + public Action inspectorUpdateDelegate { get; set; } + + private VisualElement CreateGUI(HairMasterNode masterNode) + { + PropertySheet propertySheet = new PropertySheet(); + int indentLevel = 0; + + // Instantiate property drawers + var enumPropertyDrawer = new EnumPropertyDrawer(); + var toggleDataPropertyDrawer = new ToggleDataPropertyDrawer(); + var integerPropertyDrawer = new IntegerPropertyDrawer(); + + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => + { + masterNode.surfaceType = (SurfaceType) newValue; + this.inspectorUpdateDelegate(); + }, + masterNode.surfaceType, + "Surface Type", + SurfaceType.Opaque, + out var surfaceTypeVisualElement, + indentLevel)); + + if (masterNode.surfaceType == SurfaceType.Transparent) + { + ++indentLevel; + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.blendPreserveSpecular = newValue, + masterNode.blendPreserveSpecular, + "Preserve Specular Lighting", + out var preserveSpecularLightingToggle, + indentLevel)); + + propertySheet.Add(integerPropertyDrawer.CreateGUI(newValue => + { + m_SortPriorityField.value = masterNode.sortPriority; + masterNode.sortPriority = newValue; + inspectorUpdateDelegate(); + }, + masterNode.sortPriority, + "Sorting Priority", + out var sortPriorityField, + indentLevel)); + // Hold onto field reference for later + m_SortPriorityField = (IntegerField) sortPriorityField; + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.transparencyFog = newValue, + masterNode.transparencyFog, + "Receive Fog", + out var receiveFogToggle, + indentLevel)); + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.backThenFrontRendering = newValue, + masterNode.backThenFrontRendering, + "Back Then Front Rendering", + out var backThenFrontToggle, + indentLevel)); + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.alphaTestDepthPrepass = newValue, + masterNode.alphaTestDepthPrepass, + "Transparent Depth Prepass", + out var transparentDepthPrepassToggle, + indentLevel)); + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.alphaTestDepthPostpass = newValue, + masterNode.alphaTestDepthPostpass, + "Transparent Depth Postpass", + out var transparentDepthPostpassToggle, + indentLevel)); + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.transparentWritesMotionVec = newValue, + masterNode.transparentWritesMotionVec, + "Transparent Writes Motion Vector", + out var transparentWritesMotionVectorToggle, + indentLevel)); + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.zWrite = newValue, + masterNode.zWrite, + "Depth Write", + out var depthWriteToggle, + indentLevel)); + + if (masterNode.doubleSidedMode == DoubleSidedMode.Disabled) + { + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => masterNode.transparentCullMode = (TransparentCullMode) newValue, + masterNode.transparentCullMode, + "Cull Mode", + masterNode.transparentCullMode, + out var cullModeVisualElement, + indentLevel)); + } + + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => masterNode.zTest = (CompareFunction) newValue, + masterNode.zTest, + "Depth Test", + masterNode.zTest, + out var depthTestVisualElement, + indentLevel)); + --indentLevel; + } + + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => + { + masterNode.doubleSidedMode = (DoubleSidedMode) newValue; + this.inspectorUpdateDelegate(); + }, + masterNode.doubleSidedMode, + "Double-Sided", + DoubleSidedMode.Disabled, + out var doubleSidedModeVisualElement, + indentLevel)); + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => + { + masterNode.alphaTest = newValue; + this.inspectorUpdateDelegate(); + }, + masterNode.alphaTest, + "Alpha Clipping", + out var alphaClippingToggle, + indentLevel)); + + if (masterNode.alphaTest.isOn) + { + ++indentLevel; + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.alphaTestShadow = newValue, + masterNode.alphaTestShadow, + "Use Shadow Threshold", + out var shadowThresholdVisualElement, + indentLevel)); + --indentLevel; + } + + return propertySheet; + } + + public VisualElement DrawProperty(PropertyInfo propertyInfo, object actualObject, Inspectable attribute) + { + return this.CreateGUI((HairMasterNode) actualObject); + } + } +} diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Hair/ShaderGraph/HairPropertyDrawer.cs.meta b/com.unity.render-pipelines.high-definition/Editor/Material/Hair/ShaderGraph/HairPropertyDrawer.cs.meta new file mode 100644 index 00000000000..531f3dab55b --- /dev/null +++ b/com.unity.render-pipelines.high-definition/Editor/Material/Hair/ShaderGraph/HairPropertyDrawer.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9c3f3d4e023e4adc95ef8545e2829e3d +timeCreated: 1587036562 \ No newline at end of file diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Hair/ShaderGraph/HairSettingsView.cs b/com.unity.render-pipelines.high-definition/Editor/Material/Hair/ShaderGraph/HairSettingsView.cs deleted file mode 100644 index ad68126e1cf..00000000000 --- a/com.unity.render-pipelines.high-definition/Editor/Material/Hair/ShaderGraph/HairSettingsView.cs +++ /dev/null @@ -1,504 +0,0 @@ -using System; -using UnityEditor.UIElements; -using UnityEngine; -using UnityEngine.UIElements; -using UnityEditor.Graphing.Util; -using UnityEditor.ShaderGraph; -using UnityEditor.ShaderGraph.Drawing; -using UnityEditor.ShaderGraph.Drawing.Controls; -using UnityEngine.Rendering.HighDefinition; -using UnityEngine.Rendering; - -namespace UnityEditor.Rendering.HighDefinition.Drawing -{ - class HairSettingsView : MasterNodeSettingsView - { - HairMasterNode m_Node; - - IntegerField m_SortPriorityField; - - Label CreateLabel(string text, int indentLevel) - { - string label = ""; - for (var i = 0; i < indentLevel; i++) - { - label += " "; - } - return new Label(label + text); - } - - public HairSettingsView(HairMasterNode node) : base(node) - { - m_Node = node; - PropertySheet ps = new PropertySheet(); - - int indentLevel = 0; - ps.Add(new PropertyRow(CreateLabel("Surface Type", indentLevel)), (row) => - { - row.Add(new EnumField(SurfaceType.Opaque), (field) => - { - field.value = m_Node.surfaceType; - field.RegisterValueChangedCallback(ChangeSurfaceType); - }); - }); - - if (m_Node.surfaceType == SurfaceType.Transparent) - { - ++indentLevel; - - ps.Add(new PropertyRow(CreateLabel("Preserve Specular Lighting", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.blendPreserveSpecular.isOn; - toggle.OnToggleChanged(ChangeBlendPreserveSpecular); - }); - }); - - m_SortPriorityField = new IntegerField(); - ps.Add(new PropertyRow(CreateLabel("Sorting Priority", indentLevel)), (row) => - { - row.Add(m_SortPriorityField, (field) => - { - field.value = m_Node.sortPriority; - field.RegisterValueChangedCallback(ChangeSortPriority); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Receive Fog", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.transparencyFog.isOn; - toggle.OnToggleChanged(ChangeTransparencyFog); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Back Then Front Rendering", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.backThenFrontRendering.isOn; - toggle.OnToggleChanged(ChangeBackThenFrontRendering); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Transparent Depth Prepass", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.alphaTestDepthPrepass.isOn; - toggle.OnToggleChanged(ChangeAlphaTestPrepass); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Transparent Depth Postpass", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.alphaTestDepthPostpass.isOn; - toggle.OnToggleChanged(ChangeAlphaTestPostpass); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Transparent Writes Motion Vector", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.transparentWritesMotionVec.isOn; - toggle.OnToggleChanged(ChangeTransparentWritesMotionVec); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Depth Write", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.zWrite.isOn; - toggle.OnToggleChanged(ChangeZWrite); - }); - }); - - if (m_Node.doubleSidedMode == DoubleSidedMode.Disabled) - { - ps.Add(new PropertyRow(CreateLabel("Cull Mode", indentLevel)), (row) => - { - row.Add(new EnumField(m_Node.transparentCullMode), (e) => - { - e.value = m_Node.transparentCullMode; - e.RegisterValueChangedCallback(ChangeTransparentCullMode); - }); - }); - } - - ps.Add(new PropertyRow(CreateLabel("Depth Test", indentLevel)), (row) => - { - row.Add(new EnumField(m_Node.zTest), (e) => - { - e.value = m_Node.zTest; - e.RegisterValueChangedCallback(ChangeZTest); - }); - }); - - --indentLevel; - } - - ps.Add(new PropertyRow(CreateLabel("Double-Sided", indentLevel)), (row) => - { - row.Add(new EnumField(DoubleSidedMode.Disabled), (field) => - { - field.value = m_Node.doubleSidedMode; - field.RegisterValueChangedCallback(ChangeDoubleSidedMode); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Alpha Clipping", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.alphaTest.isOn; - toggle.OnToggleChanged(ChangeAlphaTest); - }); - }); - - if (m_Node.alphaTest.isOn) - { - ++indentLevel; - ps.Add(new PropertyRow(CreateLabel("Use Shadow Threshold", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.alphaTestShadow.isOn; - toggle.OnToggleChanged(ChangeAlphaTestShadow); - }); - }); - --indentLevel; - } - - ps.Add(new PropertyRow(CreateLabel("Receive Decals", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.receiveDecals.isOn; - toggle.OnToggleChanged(ChangeDecal); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Receive SSR", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.receiveSSR.isOn; - toggle.OnToggleChanged(ChangeSSR); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Add Precomputed Velocity", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.addPrecomputedVelocity.isOn; - toggle.OnToggleChanged(ChangeAddPrecomputedVelocity); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Geometric Specular AA", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.specularAA.isOn; - toggle.OnToggleChanged(ChangeSpecularAA); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Specular Occlusion Mode", indentLevel)), (row) => - { - row.Add(new EnumField(SpecularOcclusionMode.Off), (field) => - { - field.value = m_Node.specularOcclusionMode; - field.RegisterValueChangedCallback(ChangeSpecularOcclusionMode); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Override Baked GI", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.overrideBakedGI.isOn; - toggle.OnToggleChanged(ChangeoverrideBakedGI); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Depth Offset", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.depthOffset.isOn; - toggle.OnToggleChanged(ChangeDepthOffset); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Use Light Facing Normal", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.useLightFacingNormal.isOn; - toggle.OnToggleChanged(ChangeUseLightFacingNormal); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Support LOD CrossFade", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.supportLodCrossFade.isOn; - toggle.OnToggleChanged(ChangeSupportLODCrossFade); - }); - }); - - Add(ps); - Add(GetShaderGUIOverridePropertySheet()); - } - - void ChangeSurfaceType(ChangeEvent evt) - { - if (Equals(m_Node.surfaceType, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Surface Type Change"); - m_Node.surfaceType = (SurfaceType)evt.newValue; - } - - void ChangeDoubleSidedMode(ChangeEvent evt) - { - if (Equals(m_Node.doubleSidedMode, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Double-Sided Mode Change"); - m_Node.doubleSidedMode = (DoubleSidedMode)evt.newValue; - } - - void ChangeBlendMode(ChangeEvent evt) - { - // Make sure the mapping is correct by handling each case. - AlphaMode alphaMode = GetAlphaMode((HairMasterNode.AlphaModeLit)evt.newValue); - - if (Equals(m_Node.alphaMode, alphaMode)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Alpha Mode Change"); - m_Node.alphaMode = alphaMode; - } - - void ChangeBlendPreserveSpecular(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Blend Preserve Specular Change"); - ToggleData td = m_Node.blendPreserveSpecular; - td.isOn = evt.newValue; - m_Node.blendPreserveSpecular = td; - } - - void ChangeTransparencyFog(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Transparency Fog Change"); - ToggleData td = m_Node.transparencyFog; - td.isOn = evt.newValue; - m_Node.transparencyFog = td; - } - - void ChangeBackThenFrontRendering(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Back Then Front Rendering Change"); - ToggleData td = m_Node.backThenFrontRendering; - td.isOn = evt.newValue; - m_Node.backThenFrontRendering = td; - } - - void ChangeSortPriority(ChangeEvent evt) - { - m_Node.sortPriority = HDRenderQueue.ClampsTransparentRangePriority(evt.newValue); - // Force the text to match. - m_SortPriorityField.value = m_Node.sortPriority; - if (Equals(m_Node.sortPriority, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Sort Priority Change"); - } - - void ChangeAlphaTest(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Alpha Test Change"); - ToggleData td = m_Node.alphaTest; - td.isOn = evt.newValue; - m_Node.alphaTest = td; - } - - void ChangeAlphaTestPrepass(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Alpha Test Depth Prepass Change"); - ToggleData td = m_Node.alphaTestDepthPrepass; - td.isOn = evt.newValue; - m_Node.alphaTestDepthPrepass = td; - } - - void ChangeAlphaTestPostpass(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Alpha Test Depth Postpass Change"); - ToggleData td = m_Node.alphaTestDepthPostpass; - td.isOn = evt.newValue; - m_Node.alphaTestDepthPostpass = td; - } - - void ChangeTransparentWritesMotionVec(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Transparent Writes Motion Vector Change"); - ToggleData td = m_Node.transparentWritesMotionVec; - td.isOn = evt.newValue; - m_Node.transparentWritesMotionVec = td; - } - - void ChangeAlphaTestShadow(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Alpha Test Shadow Change"); - ToggleData td = m_Node.alphaTestShadow; - td.isOn = evt.newValue; - m_Node.alphaTestShadow = td; - } - - void ChangeDecal(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Decal Change"); - ToggleData td = m_Node.receiveDecals; - td.isOn = evt.newValue; - m_Node.receiveDecals = td; - } - - void ChangeSSR(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("SSR Change"); - ToggleData td = m_Node.receiveSSR; - td.isOn = evt.newValue; - m_Node.receiveSSR = td; - } - - void ChangeAddPrecomputedVelocity(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Add Precomputed Velocity"); - ToggleData td = m_Node.addPrecomputedVelocity; - td.isOn = evt.newValue; - m_Node.addPrecomputedVelocity = td; - } - - void ChangeUseLightFacingNormal(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Use Light Facing Normal Change"); - ToggleData td = m_Node.useLightFacingNormal; - td.isOn = evt.newValue; - m_Node.useLightFacingNormal = td; - } - - void ChangeSpecularAA(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Specular AA Change"); - ToggleData td = m_Node.specularAA; - td.isOn = evt.newValue; - m_Node.specularAA = td; - } - - void ChangeSpecularOcclusionMode(ChangeEvent evt) - { - if (Equals(m_Node.specularOcclusionMode, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Specular Occlusion Mode Change"); - m_Node.specularOcclusionMode = (SpecularOcclusionMode)evt.newValue; - } - - void ChangeoverrideBakedGI(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("overrideBakedGI Change"); - ToggleData td = m_Node.overrideBakedGI; - td.isOn = evt.newValue; - m_Node.overrideBakedGI = td; - } - - void ChangeDepthOffset(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("DepthOffset Change"); - ToggleData td = m_Node.depthOffset; - td.isOn = evt.newValue; - m_Node.depthOffset = td; - } - - void ChangeZWrite(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("ZWrite Change"); - ToggleData td = m_Node.zWrite; - td.isOn = evt.newValue; - m_Node.zWrite = td; - } - - void ChangeTransparentCullMode(ChangeEvent evt) - { - if (Equals(m_Node.transparentCullMode, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Transparent Cull Mode Change"); - m_Node.transparentCullMode = (TransparentCullMode)evt.newValue; - } - - void ChangeZTest(ChangeEvent evt) - { - if (Equals(m_Node.zTest, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("ZTest Change"); - m_Node.zTest = (CompareFunction)evt.newValue; - } - - void ChangeSupportLODCrossFade(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Support LOD CrossFade Change"); - ToggleData td = m_Node.supportLodCrossFade; - td.isOn = evt.newValue; - m_Node.supportLodCrossFade = td; - } - - public AlphaMode GetAlphaMode(HairMasterNode.AlphaModeLit alphaModeLit) - { - switch (alphaModeLit) - { - case HairMasterNode.AlphaModeLit.Alpha: - return AlphaMode.Alpha; - case HairMasterNode.AlphaModeLit.Premultiply: - return AlphaMode.Premultiply; - case HairMasterNode.AlphaModeLit.Additive: - return AlphaMode.Additive; - default: - { - Debug.LogWarning("Not supported: " + alphaModeLit); - return AlphaMode.Alpha; - } - - } - } - - public HairMasterNode.AlphaModeLit GetAlphaModeLit(AlphaMode alphaMode) - { - switch (alphaMode) - { - case AlphaMode.Alpha: - return HairMasterNode.AlphaModeLit.Alpha; - case AlphaMode.Premultiply: - return HairMasterNode.AlphaModeLit.Premultiply; - case AlphaMode.Additive: - return HairMasterNode.AlphaModeLit.Additive; - default: - { - Debug.LogWarning("Not supported: " + alphaMode); - return HairMasterNode.AlphaModeLit.Alpha; - } - } - } - } -} diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Hair/ShaderGraph/HairSettingsView.cs.meta b/com.unity.render-pipelines.high-definition/Editor/Material/Hair/ShaderGraph/HairSettingsView.cs.meta deleted file mode 100644 index ab0b1913ab8..00000000000 --- a/com.unity.render-pipelines.high-definition/Editor/Material/Hair/ShaderGraph/HairSettingsView.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 32e16a9129dd75443a57732b47cfde94 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Lit/ShaderGraph/HDLitMasterNode.cs b/com.unity.render-pipelines.high-definition/Editor/Material/Lit/ShaderGraph/HDLitMasterNode.cs index cecc1eb5530..25387d4e317 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/Lit/ShaderGraph/HDLitMasterNode.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/Lit/ShaderGraph/HDLitMasterNode.cs @@ -11,6 +11,7 @@ using UnityEditor.Rendering.HighDefinition.Drawing; using UnityEditor.ShaderGraph.Internal; using UnityEditor.Rendering.HighDefinition.ShaderGraph; +using UnityEditor.ShaderGraph.Drawing; // Include material common properties names using static UnityEngine.Rendering.HighDefinition.HDMaterialProperties; @@ -21,7 +22,7 @@ namespace UnityEditor.Rendering.HighDefinition [Title("Master", "Lit (HDRP)")] [FormerName("UnityEditor.Experimental.Rendering.HDPipeline.HDLitMasterNode")] [FormerName("UnityEditor.ShaderGraph.HDLitMasterNode")] - class HDLitMasterNode : AbstractMaterialNode, IMasterNode, IHasSettings, ICanChangeShaderGUI, IMayRequirePosition, IMayRequireNormal, IMayRequireTangent + class HDLitMasterNode : AbstractMaterialNode, IMasterNode, ICanChangeShaderGUI, IMayRequirePosition, IMayRequireNormal, IMayRequireTangent { public const string AlbedoSlotName = "Albedo"; public const string AlbedoDisplaySlotName = "BaseColor"; @@ -201,6 +202,7 @@ bool MaterialTypeUsesSlotMask(SlotMask mask) [SerializeField] bool m_RayTracing; + [Inspectable("Ray Tracing (Preview)", false)] public ToggleData rayTracing { get { return new ToggleData(m_RayTracing); } @@ -209,6 +211,7 @@ public ToggleData rayTracing if (m_RayTracing == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Ray Tracing Flag Change"); m_RayTracing = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -226,12 +229,51 @@ public SurfaceType surfaceType if (m_SurfaceType == value) return; + this.owner.owner.RegisterCompleteObjectUndo("Surface Type Change"); m_SurfaceType = value; + // Trigger an update in the rendering pass after changing the surface type + this.renderingPass = renderingPass; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); } } + public AlphaMode GetAlphaMode(AlphaModeLit alphaModeLit) + { + switch (alphaModeLit) + { + case AlphaModeLit.Alpha: + return AlphaMode.Alpha; + case AlphaModeLit.Premultiply: + return AlphaMode.Premultiply; + case AlphaModeLit.Additive: + return AlphaMode.Additive; + default: + { + Debug.LogWarning("Not supported: " + alphaModeLit); + return AlphaMode.Alpha; + } + } + } + + public AlphaModeLit GetAlphaModeLit(AlphaMode alphaMode) + { + switch (alphaMode) + { + case AlphaMode.Alpha: + return AlphaModeLit.Alpha; + case AlphaMode.Premultiply: + return AlphaModeLit.Premultiply; + case AlphaMode.Additive: + return AlphaModeLit.Additive; + default: + { + Debug.LogWarning("Not supported: " + alphaMode); + return AlphaModeLit.Alpha; + } + } + } + [SerializeField] AlphaMode m_AlphaMode; @@ -240,9 +282,12 @@ public AlphaMode alphaMode get { return m_AlphaMode; } set { + if (m_AlphaMode == value) + return; + this.owner.owner.RegisterCompleteObjectUndo("Alpha Mode Change"); m_AlphaMode = value; Dirty(ModificationScope.Graph); } @@ -251,15 +296,45 @@ public AlphaMode alphaMode [SerializeField] HDRenderQueue.RenderQueueType m_RenderingPass = HDRenderQueue.RenderQueueType.Opaque; + HDRenderQueue.RenderQueueType UpdateRenderingPassValue(HDRenderQueue.RenderQueueType newValue) + { + HDRenderQueue.RenderQueueType renderingPass; + switch (surfaceType) + { + case SurfaceType.Opaque: + renderingPass = HDRenderQueue.GetOpaqueEquivalent(newValue); + break; + case SurfaceType.Transparent: + renderingPass = HDRenderQueue.GetTransparentEquivalent(newValue); + break; + default: + throw new ArgumentException("Unknown SurfaceType"); + } + + return renderingPass; + } + public HDRenderQueue.RenderQueueType renderingPass { get { return m_RenderingPass; } set { - if (m_RenderingPass == value) + switch (value) + { + case HDRenderQueue.RenderQueueType.Overlay: + case HDRenderQueue.RenderQueueType.Unknown: + case HDRenderQueue.RenderQueueType.Background: + throw new ArgumentException("Unexpected kind of RenderQueue, was " + value); + default: + break; + }; + + var newValue = UpdateRenderingPassValue(value); + if (m_RenderingPass == newValue) return; - m_RenderingPass = value; + this.owner.owner.RegisterCompleteObjectUndo("Rendering Pass Change"); + this.m_RenderingPass = renderingPass; Dirty(ModificationScope.Graph); } } @@ -274,6 +349,7 @@ public ToggleData blendPreserveSpecular { if (m_BlendPreserveSpecular == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Blend Preserve Specular Change"); m_BlendPreserveSpecular = value.isOn; Dirty(ModificationScope.Graph); } @@ -289,6 +365,7 @@ public ToggleData transparencyFog { if (m_TransparencyFog == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Transparency Fog Change"); m_TransparencyFog = value.isOn; Dirty(ModificationScope.Graph); } @@ -308,6 +385,7 @@ public ScreenSpaceRefraction.RefractionModel refractionModel if (m_RefractionModel == value) return; + this.owner.owner.RegisterCompleteObjectUndo("Refraction Model Change"); m_RefractionModel = value; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -324,6 +402,7 @@ public ToggleData distortion { if (m_Distortion == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Distortion Change"); m_Distortion = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -341,6 +420,7 @@ public DistortionMode distortionMode if (m_DistortionMode == value) return; + this.owner.owner.RegisterCompleteObjectUndo("Distortion Change"); m_DistortionMode = value; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -357,6 +437,7 @@ public ToggleData distortionDepthTest { if (m_DistortionDepthTest == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Distortion Depth Test Change"); m_DistortionDepthTest = value.isOn; Dirty(ModificationScope.Graph); } @@ -372,6 +453,7 @@ public ToggleData alphaTest { if (m_AlphaTest == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Alpha Test Change"); m_AlphaTest = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -388,6 +470,7 @@ public ToggleData alphaTestDepthPrepass { if (m_AlphaTestDepthPrepass == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Alpha Test Depth Prepass Change"); m_AlphaTestDepthPrepass = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -404,6 +487,7 @@ public ToggleData alphaTestDepthPostpass { if (m_AlphaTestDepthPostpass == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Alpha Test Depth Postpass Change"); m_AlphaTestDepthPostpass = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -420,6 +504,7 @@ public ToggleData transparentWritesMotionVec { if (m_TransparentWritesMotionVec == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Transparent Writes Motion Vector Change"); m_TransparentWritesMotionVec = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -436,6 +521,7 @@ public ToggleData alphaTestShadow { if (m_AlphaTestShadow == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Alpha Test Shadow Change"); m_AlphaTestShadow = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -452,6 +538,7 @@ public ToggleData backThenFrontRendering { if (m_BackThenFrontRendering == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Back Then Front Rendering Change"); m_BackThenFrontRendering = value.isOn; Dirty(ModificationScope.Graph); } @@ -465,9 +552,11 @@ public int sortPriority get { return m_SortPriority; } set { - if (m_SortPriority == value) + var newSortPriority = HDRenderQueue.ClampsTransparentRangePriority(value); + if (m_SortPriority == newSortPriority) return; - m_SortPriority = value; + this.owner.owner.RegisterCompleteObjectUndo("Sort Priority Change"); + m_SortPriority = newSortPriority; Dirty(ModificationScope.Graph); } } @@ -483,6 +572,7 @@ public DoubleSidedMode doubleSidedMode if (m_DoubleSidedMode == value) return; + this.owner.owner.RegisterCompleteObjectUndo("Double-Sided Mode Change"); m_DoubleSidedMode = value; Dirty(ModificationScope.Topological); } @@ -490,6 +580,7 @@ public DoubleSidedMode doubleSidedMode [SerializeField] NormalDropOffSpace m_NormalDropOffSpace; + [Inspectable("Fragment Normal Space", NormalDropOffSpace.Tangent)] public NormalDropOffSpace normalDropOffSpace { get { return m_NormalDropOffSpace; } @@ -498,6 +589,7 @@ public NormalDropOffSpace normalDropOffSpace if (m_NormalDropOffSpace == value) return; + this.owner.owner.RegisterCompleteObjectUndo("Normal Space Drop-Off Mode Change"); m_NormalDropOffSpace = value; if (!IsSlotConnected(NormalSlotId)) updateNormalSlot = true; @@ -519,6 +611,7 @@ public MaterialType materialType if (m_MaterialType == value) return; + this.owner.owner.RegisterCompleteObjectUndo("Material Type Change"); m_MaterialType = value; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -533,6 +626,7 @@ public ToggleData sssTransmission get { return new ToggleData(m_SSSTransmission); } set { + this.owner.owner.RegisterCompleteObjectUndo("SSS Transmission Change"); m_SSSTransmission = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -542,6 +636,7 @@ public ToggleData sssTransmission [SerializeField] bool m_ReceiveDecals = true; + [Inspectable("Receive Decals", true)] public ToggleData receiveDecals { get { return new ToggleData(m_ReceiveDecals); } @@ -549,6 +644,7 @@ public ToggleData receiveDecals { if (m_ReceiveDecals == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Decal Change"); m_ReceiveDecals = value.isOn; Dirty(ModificationScope.Graph); } @@ -563,6 +659,7 @@ public ToggleData receiveSSR { if (m_ReceivesSSR == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("SSR Change"); m_ReceivesSSR = value.isOn; Dirty(ModificationScope.Graph); } @@ -577,6 +674,7 @@ public ToggleData receiveSSRTransparent { if (m_ReceivesSSRTransparent == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("SSR Change"); m_ReceivesSSRTransparent = value.isOn; Dirty(ModificationScope.Graph); } @@ -585,6 +683,7 @@ public ToggleData receiveSSRTransparent [SerializeField] bool m_AddPrecomputedVelocity = false; + [Inspectable("Add Precomputed Velocity", false)] public ToggleData addPrecomputedVelocity { get { return new ToggleData(m_AddPrecomputedVelocity); } @@ -592,6 +691,7 @@ public ToggleData addPrecomputedVelocity { if (m_AddPrecomputedVelocity == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Add Precomputed Velocity"); m_AddPrecomputedVelocity = value.isOn; Dirty(ModificationScope.Graph); } @@ -607,6 +707,7 @@ public ToggleData energyConservingSpecular { if (m_EnergyConservingSpecular == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Energy Conserving Specular Change"); m_EnergyConservingSpecular = value.isOn; Dirty(ModificationScope.Graph); } @@ -615,6 +716,7 @@ public ToggleData energyConservingSpecular [SerializeField] bool m_SpecularAA; + [Inspectable("Geometric Specular AA", false)] public ToggleData specularAA { get { return new ToggleData(m_SpecularAA); } @@ -622,6 +724,7 @@ public ToggleData specularAA { if (m_SpecularAA == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Specular AA Change"); m_SpecularAA = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -661,6 +764,7 @@ public float specularAAThreshold [SerializeField] SpecularOcclusionMode m_SpecularOcclusionMode; + [Inspectable("Specular Occlusion Mode", SpecularOcclusionMode.Off)] public SpecularOcclusionMode specularOcclusionMode { get { return m_SpecularOcclusionMode; } @@ -669,6 +773,7 @@ public SpecularOcclusionMode specularOcclusionMode if (m_SpecularOcclusionMode == value) return; + this.owner.owner.RegisterCompleteObjectUndo("Specular Occlusion Mode Change"); m_SpecularOcclusionMode = value; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -694,6 +799,7 @@ public int diffusionProfile [SerializeField] bool m_overrideBakedGI; + [Inspectable("Override Baked GI", false)] public ToggleData overrideBakedGI { get { return new ToggleData(m_overrideBakedGI); } @@ -701,6 +807,7 @@ public ToggleData overrideBakedGI { if (m_overrideBakedGI == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("overrideBakedGI Change"); m_overrideBakedGI = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -710,6 +817,7 @@ public ToggleData overrideBakedGI [SerializeField] bool m_depthOffset; + [Inspectable("Depth Offset", false)] public ToggleData depthOffset { get { return new ToggleData(m_depthOffset); } @@ -717,6 +825,7 @@ public ToggleData depthOffset { if (m_depthOffset == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("DepthOffset Change"); m_depthOffset = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -732,7 +841,7 @@ public ToggleData zWrite { if (m_ZWrite == value.isOn) return; - + this.owner.owner.RegisterCompleteObjectUndo("ZWrite Change"); m_ZWrite = value.isOn; Dirty(ModificationScope.Graph); } @@ -748,6 +857,7 @@ public TransparentCullMode transparentCullMode if (m_transparentCullMode == value) return; + this.owner.owner.RegisterCompleteObjectUndo("Transparent Cull Mode Change"); m_transparentCullMode = value; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Graph); @@ -756,6 +866,7 @@ public TransparentCullMode transparentCullMode [SerializeField] CompareFunction m_ZTest = CompareFunction.LessEqual; + public CompareFunction zTest { get => m_ZTest; @@ -764,6 +875,7 @@ public CompareFunction zTest if (m_ZTest == value) return; + this.owner.owner.RegisterCompleteObjectUndo("ZTest Change"); m_ZTest = value; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Graph); @@ -773,6 +885,8 @@ public CompareFunction zTest [SerializeField] bool m_SupportLodCrossFade; + + [Inspectable("Support LOD CrossFade", false)] public ToggleData supportLodCrossFade { get { return new ToggleData(m_SupportLodCrossFade); } @@ -780,6 +894,8 @@ public ToggleData supportLodCrossFade { if (m_SupportLodCrossFade == value.isOn) return; + + this.owner.owner.RegisterCompleteObjectUndo("Support LOD CrossFade Change"); m_SupportLodCrossFade = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Node); @@ -818,6 +934,27 @@ int ComputeMaterialNeedsUpdateHash() return hash; } + // This struct, and the corresponding property below it, exist to expose the HDLitMasterNode to the inspector for drawing settings + public struct HDLitSettings + { + // Empty struct + } + + [Inspectable("HDRP Lit Settings", null)] + public HDLitSettings HDRPLitSettings { get; private set; } + + // This property exists to expose shaderGUI Override info. to the inspector + [Inspectable("ShaderGUI", null)] + public ShaderGUIOverrideInfo ShaderGUIInfo + { + get => new ShaderGUIOverrideInfo(this.OverrideEnabled, this.ShaderGUIOverride); + set + { + this.ShaderGUIOverride = value.ShaderGUIOverride; + this.OverrideEnabled = value.OverrideEnabled; + } + } + [SerializeField] private string m_ShaderGUIOverride; public string ShaderGUIOverride { @@ -1044,11 +1181,6 @@ public sealed override void UpdateNodeAfterDeserialization() RemoveSlotsNameNotMatching(validSlots, true); } - public VisualElement CreateSettingsElement() - { - return new HDLitSettingsView(this); - } - public string renderQueueTag { get diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Lit/ShaderGraph/HDLitPropertyDrawer.cs b/com.unity.render-pipelines.high-definition/Editor/Material/Lit/ShaderGraph/HDLitPropertyDrawer.cs new file mode 100644 index 00000000000..9bc58252d01 --- /dev/null +++ b/com.unity.render-pipelines.high-definition/Editor/Material/Lit/ShaderGraph/HDLitPropertyDrawer.cs @@ -0,0 +1,342 @@ +using System; +using System.Reflection; +using Drawing.Inspector; +using UnityEditor.ShaderGraph.Drawing; +using UnityEditor.UIElements; +using UnityEditor.Graphing.Util; +using UnityEditor.ShaderGraph; +using UnityEngine.Rendering; +using UnityEngine.Rendering.HighDefinition; +using UnityEngine.UIElements; + +namespace UnityEditor.Rendering.HighDefinition +{ + [SGPropertyDrawer(typeof(HDLitMasterNode.HDLitSettings))] + public class HDLitPropertyDrawer : IPropertyDrawer + { + IntegerField m_SortPriorityField; + + public Action inspectorUpdateDelegate { get; set; } + + internal VisualElement CreateGUI(HDLitMasterNode masterNode) + { + PropertySheet propertySheet = new PropertySheet(); + int indentLevel = 0; + + // Instantiate property drawers + var enumPropertyDrawer = new EnumPropertyDrawer(); + var toggleDataPropertyDrawer = new ToggleDataPropertyDrawer(); + var integerPropertyDrawer = new IntegerPropertyDrawer(); + + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => + { + masterNode.surfaceType = (SurfaceType) newValue; + this.inspectorUpdateDelegate(); + }, + masterNode.surfaceType, + "Surface Type", + SurfaceType.Opaque, + out var surfaceTypeVisualElement, + indentLevel)); + + indentLevel++; + + switch (masterNode.surfaceType) + { + case SurfaceType.Opaque: + propertySheet.Add(new PropertyRow(PropertyDrawerUtils.CreateLabel("Rendering Pass", indentLevel)), (row) => + { + var valueList = HDSubShaderUtilities.GetRenderingPassList(true, true); + + // #TODO: Inspector - Harvest these PopupFields for a GenericListPropertyDrawer + row.Add(new PopupField(valueList, HDRenderQueue.RenderQueueType.Opaque, HDSubShaderUtilities.RenderQueueName, HDSubShaderUtilities.RenderQueueName), (field) => + { + field.value = HDRenderQueue.GetOpaqueEquivalent(masterNode.renderingPass); + field.RegisterValueChangedCallback(evt => + { + masterNode.renderingPass = evt.newValue; + inspectorUpdateDelegate(); + }); + }); + }); + break; + case SurfaceType.Transparent: + propertySheet.Add(new PropertyRow(PropertyDrawerUtils.CreateLabel("Rendering Pass", indentLevel)), (row) => + { + Enum defaultValue; + switch (masterNode.renderingPass) // Migration + { + default: //when deserializing without issue, we still need to init the default to something even if not used. + case HDRenderQueue.RenderQueueType.Transparent: + defaultValue = HDRenderQueue.TransparentRenderQueue.Default; + break; + case HDRenderQueue.RenderQueueType.PreRefraction: + defaultValue = HDRenderQueue.TransparentRenderQueue.BeforeRefraction; + break; + } + + var valueList = HDSubShaderUtilities.GetRenderingPassList(false, true); + + row.Add(new PopupField(valueList, HDRenderQueue.RenderQueueType.Transparent, HDSubShaderUtilities.RenderQueueName, HDSubShaderUtilities.RenderQueueName), (field) => + { + field.value = HDRenderQueue.GetTransparentEquivalent(masterNode.renderingPass); + field.RegisterValueChangedCallback(evt => + { + masterNode.renderingPass = evt.newValue; + inspectorUpdateDelegate(); + }); + }); + }); + break; + default: + throw new ArgumentException("Unknown SurfaceType"); + } + --indentLevel; + + if (masterNode.surfaceType == SurfaceType.Transparent) + { + ++indentLevel; + if (!masterNode.HasRefraction()) + { + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => + { + masterNode.alphaMode = + masterNode.GetAlphaMode((HDLitMasterNode.AlphaModeLit) newValue); + }, + masterNode.GetAlphaModeLit(masterNode.alphaMode), + "Blending Mode", + HDLitMasterNode.AlphaModeLit.Additive, + out var blendModeVisualElement, + indentLevel)); + + ++indentLevel; + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.blendPreserveSpecular = newValue, + masterNode.blendPreserveSpecular, + "Preserve Specular Lighting", + out var preserveSpecularLightingToggle, + indentLevel)); + + --indentLevel; + } + + propertySheet.Add(integerPropertyDrawer.CreateGUI(newValue => + { + m_SortPriorityField.value = masterNode.sortPriority; + masterNode.sortPriority = newValue; + inspectorUpdateDelegate(); + }, + masterNode.sortPriority, + "Sorting Priority", + out var sortPriorityField, + indentLevel)); + + // Hold onto field reference for later + m_SortPriorityField = (IntegerField)sortPriorityField; + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.transparencyFog = newValue, + masterNode.transparencyFog, + "Receive Fog", + out var receiveFogToggle, + indentLevel)); + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.backThenFrontRendering = newValue, + masterNode.backThenFrontRendering, + "Back Then Front Rendering", + out var backThenFrontToggle, + indentLevel)); + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.alphaTestDepthPrepass = newValue, + masterNode.alphaTestDepthPrepass, + "Transparent Depth Prepass", + out var transparentDepthPrepassToggle, + indentLevel)); + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.alphaTestDepthPostpass = newValue, + masterNode.alphaTestDepthPostpass, + "Transparent Depth Postpass", + out var transparentDepthPostpassToggle, + indentLevel)); + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.transparentWritesMotionVec = newValue, + masterNode.transparentWritesMotionVec, + "Transparent Writes Motion Vector", + out var transparentWritesMotionVectorToggle, + indentLevel)); + + if (masterNode.renderingPass != HDRenderQueue.RenderQueueType.PreRefraction) + { + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => + { + masterNode.refractionModel = (ScreenSpaceRefraction.RefractionModel) newValue; + this.inspectorUpdateDelegate(); + }, + masterNode.refractionModel, + "Refraction Model", + ScreenSpaceRefraction.RefractionModel.None, + out var refractionModelVisualElement, + indentLevel)); + } + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => + { + masterNode.distortion = newValue; + inspectorUpdateDelegate(); + }, + masterNode.distortion, + "Distortion", + out var distortionToggle, + indentLevel)); + + if (masterNode.distortion.isOn) + { + ++indentLevel; + + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => masterNode.distortionMode = (DistortionMode)newValue, + masterNode.distortionMode, + "Distortion Blend Mode", + DistortionMode.Add, + out var distortionModeVisualElement, + indentLevel)); + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.distortionDepthTest = newValue, + masterNode.distortionDepthTest, + "Distortion Depth Test", + out var distortionDepthTestToggle, + indentLevel)); + + --indentLevel; + } + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.zWrite = newValue, + masterNode.zWrite, + "Depth Write", + out var depthWriteToggle, + indentLevel)); + + if (masterNode.doubleSidedMode == DoubleSidedMode.Disabled) + { + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => masterNode.transparentCullMode = (TransparentCullMode)newValue, + masterNode.transparentCullMode, + "Cull Mode", + masterNode.transparentCullMode, + out var cullModeVisualElement, + indentLevel)); + } + + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => masterNode.zTest = (CompareFunction)newValue, + masterNode.zTest, + "Depth Test", + masterNode.zTest, + out var depthTestVisualElement, + indentLevel)); + + --indentLevel; + } + + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => + { + masterNode.doubleSidedMode = (DoubleSidedMode) newValue; + this.inspectorUpdateDelegate(); + }, + masterNode.doubleSidedMode, + "Double-Sided", + DoubleSidedMode.Disabled, + out var doubleSidedModeVisualElement, + indentLevel)); + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => + { + masterNode.alphaTest = newValue; + this.inspectorUpdateDelegate(); + }, + masterNode.alphaTest, + "Alpha Clipping", + out var alphaClippingToggle, + indentLevel)); + + if (masterNode.alphaTest.isOn) + { + ++indentLevel; + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.alphaTestShadow = newValue, + masterNode.alphaTestShadow, + "Use Shadow Threshold", + out var shadowThresholdVisualElement, + indentLevel)); + --indentLevel; + } + + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => + { + masterNode.materialType = (HDLitMasterNode.MaterialType) newValue; + this.inspectorUpdateDelegate(); + }, + masterNode.materialType, + "Material Type", + HDLitMasterNode.MaterialType.Standard, + out var materialTypeVisualElement, + indentLevel)); + + ++indentLevel; + if (masterNode.materialType == HDLitMasterNode.MaterialType.SubsurfaceScattering) + { + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.sssTransmission = newValue, + masterNode.sssTransmission, + "Transmission", + out var transmissionToggle, + indentLevel)); + } + + if (masterNode.materialType == HDLitMasterNode.MaterialType.SpecularColor) + { + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.energyConservingSpecular = newValue, + masterNode.energyConservingSpecular, + "Energy Conserving Specular", + out var energyConservingSpecularToggle, + indentLevel)); + } + --indentLevel; + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => + { + if (masterNode.surfaceType == SurfaceType.Transparent) + masterNode.receiveSSRTransparent = newValue; + else + masterNode.receiveSSR = newValue; + }, + masterNode.surfaceType == SurfaceType.Transparent ? masterNode.receiveSSRTransparent : masterNode.receiveSSR, + "Receive SSR", + out var receiveSSRToggle, + indentLevel)); + + return propertySheet; + } + + public VisualElement DrawProperty(PropertyInfo propertyInfo, object actualObject, Inspectable attribute) + { + return this.CreateGUI((HDLitMasterNode) actualObject); + } + } +} diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Lit/ShaderGraph/HDLitPropertyDrawer.cs.meta b/com.unity.render-pipelines.high-definition/Editor/Material/Lit/ShaderGraph/HDLitPropertyDrawer.cs.meta new file mode 100644 index 00000000000..e3631a018f8 --- /dev/null +++ b/com.unity.render-pipelines.high-definition/Editor/Material/Lit/ShaderGraph/HDLitPropertyDrawer.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d27ed4b916fc475bb6919622fbe96c60 +timeCreated: 1586984939 \ No newline at end of file diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Lit/ShaderGraph/HDLitSettingsView.cs b/com.unity.render-pipelines.high-definition/Editor/Material/Lit/ShaderGraph/HDLitSettingsView.cs deleted file mode 100644 index e88c6123fb9..00000000000 --- a/com.unity.render-pipelines.high-definition/Editor/Material/Lit/ShaderGraph/HDLitSettingsView.cs +++ /dev/null @@ -1,774 +0,0 @@ -using System; -using UnityEditor.UIElements; -using UnityEngine; -using UnityEngine.UIElements; -using UnityEditor.Graphing.Util; -using UnityEditor.ShaderGraph; -using UnityEditor.ShaderGraph.Internal; -using UnityEditor.ShaderGraph.Drawing; -using UnityEditor.ShaderGraph.Drawing.Controls; -using UnityEngine.Rendering.HighDefinition; -using UnityEngine.Rendering; - -namespace UnityEditor.Rendering.HighDefinition.Drawing -{ - class HDLitSettingsView : MasterNodeSettingsView - { - HDLitMasterNode m_Node; - - IntegerField m_SortPriorityField; - - Label CreateLabel(string text, int indentLevel) - { - string label = ""; - for (var i = 0; i < indentLevel; i++) - { - label += " "; - } - return new Label(label + text); - } - - public HDLitSettingsView(HDLitMasterNode node) : base(node) - { - m_Node = node; - PropertySheet ps = new PropertySheet(); - - int indentLevel = 0; - - ps.Add(new PropertyRow(CreateLabel("Ray Tracing (Preview)", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.rayTracing.isOn; - toggle.RegisterValueChangedCallback(ChangeRayTracingFlag); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Surface Type", indentLevel)), (row) => - { - row.Add(new EnumField(SurfaceType.Opaque), (field) => - { - field.value = m_Node.surfaceType; - field.RegisterValueChangedCallback(ChangeSurfaceType); - }); - }); - - ++indentLevel; - switch (m_Node.surfaceType) - { - case SurfaceType.Opaque: - ps.Add(new PropertyRow(CreateLabel("Rendering Pass", indentLevel)), (row) => - { - var valueList = HDSubShaderUtilities.GetRenderingPassList(true, false); - - row.Add(new PopupField(valueList, HDRenderQueue.RenderQueueType.Opaque, HDSubShaderUtilities.RenderQueueName, HDSubShaderUtilities.RenderQueueName), (field) => - { - field.value = HDRenderQueue.GetOpaqueEquivalent(m_Node.renderingPass); - field.RegisterValueChangedCallback(ChangeRenderingPass); - }); - }); - break; - case SurfaceType.Transparent: - ps.Add(new PropertyRow(CreateLabel("Rendering Pass", indentLevel)), (row) => - { - Enum defaultValue; - switch (m_Node.renderingPass) // Migration - { - default: //when deserializing without issue, we still need to init the default to something even if not used. - case HDRenderQueue.RenderQueueType.Transparent: - defaultValue = HDRenderQueue.TransparentRenderQueue.Default; - break; - case HDRenderQueue.RenderQueueType.PreRefraction: - defaultValue = HDRenderQueue.TransparentRenderQueue.BeforeRefraction; - break; - } - - var valueList = HDSubShaderUtilities.GetRenderingPassList(false, false); - - row.Add(new PopupField(valueList, HDRenderQueue.RenderQueueType.Transparent, HDSubShaderUtilities.RenderQueueName, HDSubShaderUtilities.RenderQueueName), (field) => - { - field.value = HDRenderQueue.GetTransparentEquivalent(m_Node.renderingPass); - field.RegisterValueChangedCallback(ChangeRenderingPass); - }); - }); - break; - default: - throw new ArgumentException("Unknown SurfaceType"); - } - --indentLevel; - - if (m_Node.surfaceType == SurfaceType.Transparent) - { - ++indentLevel; - - if (!m_Node.HasRefraction()) - { - ps.Add(new PropertyRow(CreateLabel("Blending Mode", indentLevel)), (row) => - { - row.Add(new EnumField(HDLitMasterNode.AlphaModeLit.Additive), (field) => - { - field.value = GetAlphaModeLit(m_Node.alphaMode); - field.RegisterValueChangedCallback(ChangeBlendMode); - }); - }); - - ++indentLevel; - ps.Add(new PropertyRow(CreateLabel("Preserve Specular Lighting", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.blendPreserveSpecular.isOn; - toggle.OnToggleChanged(ChangeBlendPreserveSpecular); - }); - }); - --indentLevel; - } - - m_SortPriorityField = new IntegerField(); - ps.Add(new PropertyRow(CreateLabel("Sorting Priority", indentLevel)), (row) => - { - row.Add(m_SortPriorityField, (field) => - { - field.value = m_Node.sortPriority; - field.RegisterValueChangedCallback(ChangeSortPriority); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Receive Fog", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.transparencyFog.isOn; - toggle.OnToggleChanged(ChangeTransparencyFog); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Back Then Front Rendering", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.backThenFrontRendering.isOn; - toggle.OnToggleChanged(ChangeBackThenFrontRendering); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Transparent Depth Prepass", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.alphaTestDepthPrepass.isOn; - toggle.OnToggleChanged(ChangeAlphaTestPrepass); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Transparent Depth Postpass", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.alphaTestDepthPostpass.isOn; - toggle.OnToggleChanged(ChangeAlphaTestPostpass); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Transparent Writes Motion Vector", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.transparentWritesMotionVec.isOn; - toggle.OnToggleChanged(ChangeTransparentWritesMotionVec); - }); - }); - - if (m_Node.renderingPass != HDRenderQueue.RenderQueueType.PreRefraction) - { - ps.Add(new PropertyRow(CreateLabel("Refraction Model", indentLevel)), (row) => - { - row.Add(new EnumField(ScreenSpaceRefraction.RefractionModel.None), (field) => - { - field.value = m_Node.refractionModel; - field.RegisterValueChangedCallback(ChangeRefractionModel); - }); - }); - } - - ps.Add(new PropertyRow(CreateLabel("Distortion", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.distortion.isOn; - toggle.OnToggleChanged(ChangeDistortion); - }); - }); - - if (m_Node.distortion.isOn) - { - ++indentLevel; - ps.Add(new PropertyRow(CreateLabel("Distortion Blend Mode", indentLevel)), (row) => - { - row.Add(new EnumField(DistortionMode.Add), (field) => - { - field.value = m_Node.distortionMode; - field.RegisterValueChangedCallback(ChangeDistortionMode); - }); - }); - ps.Add(new PropertyRow(CreateLabel("Distortion Depth Test", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.distortionDepthTest.isOn; - toggle.OnToggleChanged(ChangeDistortionDepthTest); - }); - }); - --indentLevel; - } - - ps.Add(new PropertyRow(CreateLabel("Depth Write", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.zWrite.isOn; - toggle.OnToggleChanged(ChangeZWrite); - }); - }); - - if (m_Node.doubleSidedMode == DoubleSidedMode.Disabled) - { - ps.Add(new PropertyRow(CreateLabel("Cull Mode", indentLevel)), (row) => - { - row.Add(new EnumField(m_Node.transparentCullMode), (e) => - { - e.value = m_Node.transparentCullMode; - e.RegisterValueChangedCallback(ChangeTransparentCullMode); - }); - }); - } - - ps.Add(new PropertyRow(CreateLabel("Depth Test", indentLevel)), (row) => - { - row.Add(new EnumField(m_Node.zTest), (e) => - { - e.value = m_Node.zTest; - e.RegisterValueChangedCallback(ChangeZTest); - }); - }); - - --indentLevel; - } - - ps.Add(new PropertyRow(CreateLabel("Double-Sided", indentLevel)), (row) => - { - row.Add(new EnumField(DoubleSidedMode.Disabled), (field) => - { - field.value = m_Node.doubleSidedMode; - field.RegisterValueChangedCallback(ChangeDoubleSidedMode); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Fragment Normal Space", indentLevel)), (row) => - { - row.Add(new EnumField(NormalDropOffSpace.Tangent), (field) => - { - field.value = m_Node.normalDropOffSpace; - field.RegisterValueChangedCallback(ChangeSpaceOfNormalDropOffMode); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Alpha Clipping", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.alphaTest.isOn; - toggle.OnToggleChanged(ChangeAlphaTest); - }); - }); - - if (m_Node.alphaTest.isOn) - { - ++indentLevel; - ps.Add(new PropertyRow(CreateLabel("Use Shadow Threshold", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.alphaTestShadow.isOn; - toggle.OnToggleChanged(ChangeAlphaTestShadow); - }); - }); - --indentLevel; - } - - ps.Add(new PropertyRow(CreateLabel("Material Type", indentLevel)), (row) => - { - row.Add(new EnumField(HDLitMasterNode.MaterialType.Standard), (field) => - { - field.value = m_Node.materialType; - field.RegisterValueChangedCallback(ChangeMaterialType); - }); - }); - - ++indentLevel; - if (m_Node.materialType == HDLitMasterNode.MaterialType.SubsurfaceScattering) - { - ps.Add(new PropertyRow(CreateLabel("Transmission", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.sssTransmission.isOn; - toggle.OnToggleChanged(ChangeSSSTransmission); - }); - }); - } - - if (m_Node.materialType == HDLitMasterNode.MaterialType.SpecularColor) - { - ps.Add(new PropertyRow(CreateLabel("Energy Conserving Specular", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.energyConservingSpecular.isOn; - toggle.OnToggleChanged(ChangeEnergyConservingSpecular); - }); - }); - } - --indentLevel; - - ps.Add(new PropertyRow(CreateLabel("Receive Decals", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.receiveDecals.isOn; - toggle.OnToggleChanged(ChangeDecal); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Receive SSR", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - if (m_Node.surfaceType == SurfaceType.Transparent) - { - toggle.value = m_Node.receiveSSRTransparent.isOn; - toggle.OnToggleChanged(ChangeSSRTransparent); - } - else - { - toggle.value = m_Node.receiveSSR.isOn; - toggle.OnToggleChanged(ChangeSSR); - } - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Add Precomputed Velocity", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.addPrecomputedVelocity.isOn; - toggle.OnToggleChanged(ChangeAddPrecomputedVelocity); - }); - }); - - - ps.Add(new PropertyRow(CreateLabel("Geometric Specular AA", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.specularAA.isOn; - toggle.OnToggleChanged(ChangeSpecularAA); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Specular Occlusion Mode", indentLevel)), (row) => - { - row.Add(new EnumField(SpecularOcclusionMode.Off), (field) => - { - field.value = m_Node.specularOcclusionMode; - field.RegisterValueChangedCallback(ChangeSpecularOcclusionMode); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Override Baked GI", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.overrideBakedGI.isOn; - toggle.OnToggleChanged(ChangeoverrideBakedGI); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Depth Offset", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.depthOffset.isOn; - toggle.OnToggleChanged(ChangeDepthOffset); - }); - }); - ps.Add(new PropertyRow(CreateLabel("Support LOD CrossFade", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.supportLodCrossFade.isOn; - toggle.OnToggleChanged(ChangeSupportLODCrossFade); - }); - }); - - Add(ps); - Add(GetShaderGUIOverridePropertySheet()); - } - - void ChangeRayTracingFlag(ChangeEvent evt) - { - if (Equals(m_Node.rayTracing, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Ray Tracing Flag Change"); - ToggleData rt = m_Node.rayTracing; - rt.isOn = evt.newValue; - m_Node.rayTracing = rt; - } - - void ChangeSurfaceType(ChangeEvent evt) - { - if (Equals(m_Node.surfaceType, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Surface Type Change"); - m_Node.surfaceType = (SurfaceType)evt.newValue; - - UpdateRenderingPassValue(m_Node.renderingPass); - } - - void ChangeDoubleSidedMode(ChangeEvent evt) - { - if (Equals(m_Node.doubleSidedMode, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Double-Sided Mode Change"); - m_Node.doubleSidedMode = (DoubleSidedMode)evt.newValue; - } - - void ChangeSpaceOfNormalDropOffMode(ChangeEvent evt) - { - if (Equals(m_Node.normalDropOffSpace, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Normal Space Drop-Off Mode Change"); - m_Node.normalDropOffSpace = (NormalDropOffSpace)evt.newValue; - } - - void ChangeMaterialType(ChangeEvent evt) - { - if (Equals(m_Node.materialType, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Material Type Change"); - m_Node.materialType = (HDLitMasterNode.MaterialType)evt.newValue; - } - - void ChangeSSSTransmission(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("SSS Transmission Change"); - ToggleData td = m_Node.sssTransmission; - td.isOn = evt.newValue; - m_Node.sssTransmission = td; - } - - void ChangeBlendMode(ChangeEvent evt) - { - // Make sure the mapping is correct by handling each case. - - AlphaMode alphaMode = GetAlphaMode((HDLitMasterNode.AlphaModeLit)evt.newValue); - - if (Equals(m_Node.alphaMode, alphaMode)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Alpha Mode Change"); - m_Node.alphaMode = alphaMode; - } - - void ChangeRenderingPass(ChangeEvent evt) - { - switch (evt.newValue) - { - case HDRenderQueue.RenderQueueType.Overlay: - case HDRenderQueue.RenderQueueType.Unknown: - case HDRenderQueue.RenderQueueType.Background: - throw new ArgumentException("Unexpected kind of RenderQueue, was " + evt.newValue); - default: - break; - }; - UpdateRenderingPassValue(evt.newValue); - } - - void UpdateRenderingPassValue(HDRenderQueue.RenderQueueType newValue) - { - HDRenderQueue.RenderQueueType renderingPass; - switch (m_Node.surfaceType) - { - case SurfaceType.Opaque: - renderingPass = HDRenderQueue.GetOpaqueEquivalent(newValue); - break; - case SurfaceType.Transparent: - renderingPass = HDRenderQueue.GetTransparentEquivalent(newValue); - break; - default: - throw new ArgumentException("Unknown SurfaceType"); - } - - if (Equals(m_Node.renderingPass, renderingPass)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Rendering Pass Change"); - m_Node.renderingPass = renderingPass; - } - - void ChangeBlendPreserveSpecular(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Blend Preserve Specular Change"); - ToggleData td = m_Node.blendPreserveSpecular; - td.isOn = evt.newValue; - m_Node.blendPreserveSpecular = td; - } - - void ChangeTransparencyFog(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Transparency Fog Change"); - ToggleData td = m_Node.transparencyFog; - td.isOn = evt.newValue; - m_Node.transparencyFog = td; - } - - void ChangeRefractionModel(ChangeEvent evt) - { - if (Equals(m_Node.refractionModel, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Refraction Model Change"); - m_Node.refractionModel = (ScreenSpaceRefraction.RefractionModel)evt.newValue; - } - - void ChangeDistortion(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Distortion Change"); - ToggleData td = m_Node.distortion; - td.isOn = evt.newValue; - m_Node.distortion = td; - } - - void ChangeDistortionMode(ChangeEvent evt) - { - if (Equals(m_Node.distortionMode, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Distortion Mode Change"); - m_Node.distortionMode = (DistortionMode)evt.newValue; - } - - void ChangeDistortionDepthTest(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Distortion Depth Test Change"); - ToggleData td = m_Node.distortionDepthTest; - td.isOn = evt.newValue; - m_Node.distortionDepthTest = td; - } - - void ChangeBackThenFrontRendering(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Back Then Front Rendering Change"); - ToggleData td = m_Node.backThenFrontRendering; - td.isOn = evt.newValue; - m_Node.backThenFrontRendering = td; - } - - void ChangeSortPriority(ChangeEvent evt) - { - m_Node.sortPriority = HDRenderQueue.ClampsTransparentRangePriority(evt.newValue); - // Force the text to match. - m_SortPriorityField.value = m_Node.sortPriority; - if (Equals(m_Node.sortPriority, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Sort Priority Change"); - } - - void ChangeAlphaTest(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Alpha Test Change"); - ToggleData td = m_Node.alphaTest; - td.isOn = evt.newValue; - m_Node.alphaTest = td; - } - - void ChangeAlphaTestPrepass(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Alpha Test Depth Prepass Change"); - ToggleData td = m_Node.alphaTestDepthPrepass; - td.isOn = evt.newValue; - m_Node.alphaTestDepthPrepass = td; - } - - void ChangeAlphaTestPostpass(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Alpha Test Depth Postpass Change"); - ToggleData td = m_Node.alphaTestDepthPostpass; - td.isOn = evt.newValue; - m_Node.alphaTestDepthPostpass = td; - } - void ChangeTransparentWritesMotionVec(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Transparent Writes Motion Vector Change"); - ToggleData td = m_Node.transparentWritesMotionVec; - td.isOn = evt.newValue; - m_Node.transparentWritesMotionVec = td; - } - void ChangeAlphaTestShadow(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Alpha Test Shadow Change"); - ToggleData td = m_Node.alphaTestShadow; - td.isOn = evt.newValue; - m_Node.alphaTestShadow = td; - } - - void ChangeDecal(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Decal Change"); - ToggleData td = m_Node.receiveDecals; - td.isOn = evt.newValue; - m_Node.receiveDecals = td; - } - - void ChangeSSR(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("SSR Change"); - ToggleData td = m_Node.receiveSSR; - td.isOn = evt.newValue; - m_Node.receiveSSR = td; - } - - void ChangeSSRTransparent(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("SSR Change"); - ToggleData td = m_Node.receiveSSRTransparent; - td.isOn = evt.newValue; - m_Node.receiveSSRTransparent = td; - } - - void ChangeAddPrecomputedVelocity(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Add Precomputed Velocity"); - ToggleData td = m_Node.addPrecomputedVelocity; - td.isOn = evt.newValue; - m_Node.addPrecomputedVelocity = td; - } - - void ChangeSpecularAA(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Specular AA Change"); - ToggleData td = m_Node.specularAA; - td.isOn = evt.newValue; - m_Node.specularAA = td; - } - - void ChangeEnergyConservingSpecular(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Energy Conserving Specular Change"); - ToggleData td = m_Node.energyConservingSpecular; - td.isOn = evt.newValue; - m_Node.energyConservingSpecular = td; - } - - void ChangeSpecularOcclusionMode(ChangeEvent evt) - { - if (Equals(m_Node.specularOcclusionMode, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Specular Occlusion Mode Change"); - m_Node.specularOcclusionMode = (SpecularOcclusionMode)evt.newValue; - } - - void ChangeoverrideBakedGI(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("overrideBakedGI Change"); - ToggleData td = m_Node.overrideBakedGI; - td.isOn = evt.newValue; - m_Node.overrideBakedGI = td; - } - - void ChangeDepthOffset(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("DepthOffset Change"); - ToggleData td = m_Node.depthOffset; - td.isOn = evt.newValue; - m_Node.depthOffset = td; - } - - void ChangeSupportLODCrossFade(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Support LOD CrossFade Change"); - ToggleData td = m_Node.supportLodCrossFade; - td.isOn = evt.newValue; - m_Node.supportLodCrossFade = td; - } - - void ChangeZWrite(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("ZWrite Change"); - ToggleData td = m_Node.zWrite; - td.isOn = evt.newValue; - m_Node.zWrite = td; - } - - void ChangeTransparentCullMode(ChangeEvent evt) - { - if (Equals(m_Node.transparentCullMode, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Transparent Cull Mode Change"); - m_Node.transparentCullMode = (TransparentCullMode)evt.newValue; - } - - void ChangeZTest(ChangeEvent evt) - { - if (Equals(m_Node.zTest, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("ZTest Change"); - m_Node.zTest = (CompareFunction)evt.newValue; - } - - public AlphaMode GetAlphaMode(HDLitMasterNode.AlphaModeLit alphaModeLit) - { - switch (alphaModeLit) - { - case HDLitMasterNode.AlphaModeLit.Alpha: - return AlphaMode.Alpha; - case HDLitMasterNode.AlphaModeLit.Premultiply: - return AlphaMode.Premultiply; - case HDLitMasterNode.AlphaModeLit.Additive: - return AlphaMode.Additive; - default: - { - Debug.LogWarning("Not supported: " + alphaModeLit); - return AlphaMode.Alpha; - } - } - } - - public HDLitMasterNode.AlphaModeLit GetAlphaModeLit(AlphaMode alphaMode) - { - switch (alphaMode) - { - case AlphaMode.Alpha: - return HDLitMasterNode.AlphaModeLit.Alpha; - case AlphaMode.Premultiply: - return HDLitMasterNode.AlphaModeLit.Premultiply; - case AlphaMode.Additive: - return HDLitMasterNode.AlphaModeLit.Additive; - default: - { - Debug.LogWarning("Not supported: " + alphaMode); - return HDLitMasterNode.AlphaModeLit.Alpha; - } - } - } - } -} diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Lit/ShaderGraph/HDLitSettingsView.cs.meta b/com.unity.render-pipelines.high-definition/Editor/Material/Lit/ShaderGraph/HDLitSettingsView.cs.meta deleted file mode 100644 index e24452b95f8..00000000000 --- a/com.unity.render-pipelines.high-definition/Editor/Material/Lit/ShaderGraph/HDLitSettingsView.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 00b9f1cdcb0d93f40b3703a12d4c146f -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/StackLit/ShaderGraph/StackLitMasterNode.cs b/com.unity.render-pipelines.high-definition/Editor/Material/StackLit/ShaderGraph/StackLitMasterNode.cs index abf80d1f6a7..f4c30b92759 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/StackLit/ShaderGraph/StackLitMasterNode.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/StackLit/ShaderGraph/StackLitMasterNode.cs @@ -12,6 +12,7 @@ using UnityEditor.ShaderGraph.Internal; using UnityEngine.Rendering; using UnityEditor.Rendering.HighDefinition.ShaderGraph; +using UnityEditor.ShaderGraph.Drawing; // Include material common properties names using static UnityEngine.Rendering.HighDefinition.HDMaterialProperties; @@ -25,7 +26,7 @@ namespace UnityEditor.Rendering.HighDefinition [Title("Master", "StackLit (HDRP)")] [FormerName("UnityEditor.Experimental.Rendering.HDPipeline.StackLitMasterNode")] [FormerName("UnityEditor.ShaderGraph.StackLitMasterNode")] - class StackLitMasterNode : AbstractMaterialNode, IMasterNode, IHasSettings, ICanChangeShaderGUI, IMayRequirePosition, IMayRequireNormal, IMayRequireTangent + class StackLitMasterNode : AbstractMaterialNode, IMasterNode, ICanChangeShaderGUI, IMayRequirePosition, IMayRequireNormal, IMayRequireTangent { public const string PositionSlotName = "Vertex Position"; public const string PositionSlotDisplayName = "Vertex Position"; @@ -245,12 +246,50 @@ public SurfaceType surfaceType if (m_SurfaceType == value) return; + this.owner.owner.RegisterCompleteObjectUndo("Surface Type Change"); m_SurfaceType = value; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); } } + public AlphaMode GetAlphaMode(AlphaModeLit alphaModeLit) + { + switch (alphaModeLit) + { + case AlphaModeLit.Alpha: + return AlphaMode.Alpha; + case AlphaModeLit.Premultiply: + return AlphaMode.Premultiply; + case AlphaModeLit.Additive: + return AlphaMode.Additive; + default: + { + Debug.LogWarning("Not supported: " + alphaModeLit); + return AlphaMode.Alpha; + } + + } + } + + public AlphaModeLit GetAlphaModeLit(AlphaMode alphaMode) + { + switch (alphaMode) + { + case AlphaMode.Alpha: + return AlphaModeLit.Alpha; + case AlphaMode.Premultiply: + return AlphaModeLit.Premultiply; + case AlphaMode.Additive: + return AlphaModeLit.Additive; + default: + { + Debug.LogWarning("Not supported: " + alphaMode); + return AlphaModeLit.Alpha; + } + } + } + [SerializeField] AlphaMode m_AlphaMode; @@ -262,6 +301,7 @@ public AlphaMode alphaMode if (m_AlphaMode == value) return; + this.owner.owner.RegisterCompleteObjectUndo("Alpha Mode Change"); m_AlphaMode = value; Dirty(ModificationScope.Graph); } @@ -277,6 +317,7 @@ public ToggleData blendPreserveSpecular { if (m_BlendPreserveSpecular == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Blend Preserve Specular Change"); m_BlendPreserveSpecular = value.isOn; Dirty(ModificationScope.Graph); } @@ -292,6 +333,7 @@ public ToggleData transparencyFog { if (m_TransparencyFog == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Transparency Fog Change"); m_TransparencyFog = value.isOn; Dirty(ModificationScope.Graph); } @@ -307,6 +349,7 @@ public ToggleData distortion { if (m_Distortion == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Distortion Change"); m_Distortion = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -324,6 +367,7 @@ public DistortionMode distortionMode if (m_DistortionMode == value) return; + this.owner.owner.RegisterCompleteObjectUndo("Distortion Mode Change"); m_DistortionMode = value; UpdateNodeAfterDeserialization(); // TODOTODO: no need, ModificationScope.Graph is enough? Dirty(ModificationScope.Topological); @@ -340,6 +384,7 @@ public ToggleData distortionDepthTest { if (m_DistortionDepthTest == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Distortion Depth Test Change"); m_DistortionDepthTest = value.isOn; Dirty(ModificationScope.Graph); } @@ -348,6 +393,8 @@ public ToggleData distortionDepthTest [SerializeField] bool m_AlphaTest; + + [Inspectable("Alpha Clipping", false)] public ToggleData alphaTest { get { return new ToggleData(m_AlphaTest); } @@ -355,6 +402,7 @@ public ToggleData alphaTest { if (m_AlphaTest == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Alpha Test Change"); m_AlphaTest = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -369,9 +417,12 @@ public int sortPriority get { return m_SortPriority; } set { - if (m_SortPriority == value) + var newValue = HDRenderQueue.ClampsTransparentRangePriority(value); + if (m_SortPriority == newValue) return; - m_SortPriority = value; + + this.owner.owner.RegisterCompleteObjectUndo("Sort Priority Change"); + m_SortPriority = newValue; Dirty(ModificationScope.Graph); } } @@ -387,6 +438,7 @@ public DoubleSidedMode doubleSidedMode if (m_DoubleSidedMode == value) return; + this.owner.owner.RegisterCompleteObjectUndo("Double-Sided Mode Change"); m_DoubleSidedMode = value; Dirty(ModificationScope.Topological); } @@ -394,6 +446,8 @@ public DoubleSidedMode doubleSidedMode [SerializeField] NormalDropOffSpace m_NormalDropOffSpace; + + [Inspectable("Fragment Normal Space", NormalDropOffSpace.Tangent)] public NormalDropOffSpace normalDropOffSpace { get { return m_NormalDropOffSpace; } @@ -402,6 +456,7 @@ public NormalDropOffSpace normalDropOffSpace if (m_NormalDropOffSpace == value) return; + this.owner.owner.RegisterCompleteObjectUndo("Normal Space Drop-Off Mode Change"); m_NormalDropOffSpace = value; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -421,6 +476,7 @@ public StackLit.BaseParametrization baseParametrization if (m_BaseParametrization == value) return; + this.owner.owner.RegisterCompleteObjectUndo("Base Parametrization Change"); m_BaseParametrization = value; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -437,6 +493,7 @@ public ToggleData energyConservingSpecular { if (m_EnergyConservingSpecular == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Energy Conserving Specular Change"); m_EnergyConservingSpecular = value.isOn; Dirty(ModificationScope.Graph); } @@ -453,6 +510,7 @@ public StackLit.DualSpecularLobeParametrization dualSpecularLobeParametrization if (m_DualSpecularLobeParametrization == value) return; + this.owner.owner.RegisterCompleteObjectUndo("Dual Specular Lobe Parametrization Change"); m_DualSpecularLobeParametrization = value; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -473,6 +531,7 @@ public ToggleData anisotropy { if (m_Anisotropy == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Anisotropy Change"); m_Anisotropy = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -489,6 +548,7 @@ public ToggleData coat { if (m_Coat == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Coat Change"); m_Coat = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -505,6 +565,7 @@ public ToggleData coatNormal { if (m_CoatNormal == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Coat Normal Change"); m_CoatNormal = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -521,6 +582,7 @@ public ToggleData dualSpecularLobe { if (m_DualSpecularLobe == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("DualSpecularLobe Change"); m_DualSpecularLobe = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -537,6 +599,7 @@ public ToggleData capHazinessWrtMetallic { if (m_CapHazinessWrtMetallic == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("CapHazinessWrtMetallic Change"); m_CapHazinessWrtMetallic = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -553,6 +616,7 @@ public ToggleData iridescence { if (m_Iridescence == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Iridescence Change"); m_Iridescence = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -569,6 +633,7 @@ public ToggleData subsurfaceScattering { if (m_SubsurfaceScattering == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("SubsurfaceScattering Change"); m_SubsurfaceScattering = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -585,6 +650,7 @@ public ToggleData transmission { if (m_Transmission == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Transmission Change"); m_Transmission = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -596,6 +662,7 @@ public ToggleData transmission [SerializeField] bool m_ReceiveDecals = true; + [Inspectable("Receive Decals", true)] public ToggleData receiveDecals { get { return new ToggleData(m_ReceiveDecals); } @@ -603,6 +670,7 @@ public ToggleData receiveDecals { if (m_ReceiveDecals == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Receive Decals Change"); m_ReceiveDecals = value.isOn; Dirty(ModificationScope.Graph); } @@ -611,6 +679,7 @@ public ToggleData receiveDecals [SerializeField] bool m_ReceiveSSR = true; + [Inspectable("Receive SSR", true)] public ToggleData receiveSSR { get { return new ToggleData(m_ReceiveSSR); } @@ -618,6 +687,7 @@ public ToggleData receiveSSR { if (m_ReceiveSSR == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Receive SSR Change"); m_ReceiveSSR = value.isOn; Dirty(ModificationScope.Graph); } @@ -626,6 +696,7 @@ public ToggleData receiveSSR [SerializeField] bool m_AddPrecomputedVelocity = false; + [Inspectable("Add Precomputed Velocity", false)] public ToggleData addPrecomputedVelocity { get { return new ToggleData(m_AddPrecomputedVelocity); } @@ -633,6 +704,7 @@ public ToggleData addPrecomputedVelocity { if (m_AddPrecomputedVelocity == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Add Precomputed Velocity"); m_AddPrecomputedVelocity = value.isOn; Dirty(ModificationScope.Graph); } @@ -641,6 +713,7 @@ public ToggleData addPrecomputedVelocity [SerializeField] bool m_GeometricSpecularAA; + [Inspectable("Geometric Specular AA", false)] public ToggleData geometricSpecularAA { get { return new ToggleData(m_GeometricSpecularAA); } @@ -648,6 +721,7 @@ public ToggleData geometricSpecularAA { if (m_GeometricSpecularAA == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Specular AA Change"); m_GeometricSpecularAA = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -681,6 +755,7 @@ public SpecularOcclusionBaseMode screenSpaceSpecularOcclusionBaseMode if (m_ScreenSpaceSpecularOcclusionBaseMode == value) return; + this.owner.owner.RegisterCompleteObjectUndo("ScreenSpaceSpecularOcclusionBaseMode Change"); m_ScreenSpaceSpecularOcclusionBaseMode = value; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -695,9 +770,14 @@ public SpecularOcclusionBaseMode dataBasedSpecularOcclusionBaseMode get { return m_DataBasedSpecularOcclusionBaseMode; } set { + // StackLitMasterNode.SpecularOcclusionBaseModeSimple should always be a subset of StackLitMasterNode.SpecularOcclusionBaseMode: + if (Equals(this.dataBasedSpecularOcclusionBaseMode, (StackLitMasterNode.SpecularOcclusionBaseMode) value)) + return; + if (m_DataBasedSpecularOcclusionBaseMode == value) return; + this.owner.owner.RegisterCompleteObjectUndo("DataBasedSpecularOcclusionBaseMode Change"); m_DataBasedSpecularOcclusionBaseMode = value; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -715,6 +795,7 @@ public SpecularOcclusionAOConeSize screenSpaceSpecularOcclusionAOConeSize if (m_ScreenSpaceSpecularOcclusionAOConeSize == value) return; + this.owner.owner.RegisterCompleteObjectUndo("ScreenSpaceSpecularOcclusionAOConeSize Change"); m_ScreenSpaceSpecularOcclusionAOConeSize = value; Dirty(ModificationScope.Graph); } @@ -732,6 +813,7 @@ public SpecularOcclusionAOConeDir screenSpaceSpecularOcclusionAOConeDir if (m_ScreenSpaceSpecularOcclusionAOConeDir == value) return; + this.owner.owner.RegisterCompleteObjectUndo("ScreenSpaceSpecularOcclusionAOConeDir Change"); m_ScreenSpaceSpecularOcclusionAOConeDir = value; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -749,6 +831,7 @@ public SpecularOcclusionAOConeSize dataBasedSpecularOcclusionAOConeSize if (m_DataBasedSpecularOcclusionAOConeSize == value) return; + this.owner.owner.RegisterCompleteObjectUndo("DataBasedSpecularOcclusionAOConeSize Change"); m_DataBasedSpecularOcclusionAOConeSize = value; Dirty(ModificationScope.Graph); } @@ -783,6 +866,7 @@ public SpecularOcclusionConeFixupMethod specularOcclusionConeFixupMethod if (m_SpecularOcclusionConeFixupMethod == value) return; + this.owner.owner.RegisterCompleteObjectUndo("SpecularOcclusionConeFixupMethod Change"); m_SpecularOcclusionConeFixupMethod = value; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -801,6 +885,7 @@ public ToggleData anisotropyForAreaLights { if (m_AnisotropyForAreaLights == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("AnisotropyForAreaLights Change"); m_AnisotropyForAreaLights = value.isOn; Dirty(ModificationScope.Graph); } @@ -816,6 +901,7 @@ public ToggleData recomputeStackPerLight { if (m_RecomputeStackPerLight == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("RecomputeStackPerLight Change"); m_RecomputeStackPerLight = value.isOn; Dirty(ModificationScope.Graph); } @@ -831,6 +917,7 @@ public ToggleData honorPerLightMinRoughness { if (m_HonorPerLightMinRoughness == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("HonorPerLightMinRoughness Change"); m_HonorPerLightMinRoughness = value.isOn; Dirty(ModificationScope.Graph); } @@ -846,6 +933,7 @@ public ToggleData shadeBaseUsingRefractedAngles { if (m_ShadeBaseUsingRefractedAngles == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("ShadeBaseUsingRefractedAngles Change"); m_ShadeBaseUsingRefractedAngles = value.isOn; Dirty(ModificationScope.Graph); } @@ -861,6 +949,7 @@ public ToggleData debug { if (m_Debug == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("StackLit Debug Change"); m_Debug = value.isOn; Dirty(ModificationScope.Graph); } @@ -876,6 +965,7 @@ public ToggleData devMode { if (m_DevMode == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("StackLit DevMode Change"); m_DevMode = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -892,6 +982,7 @@ public ToggleData overrideBakedGI { if (m_overrideBakedGI == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("overrideBakedGI Change"); m_overrideBakedGI = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -908,6 +999,7 @@ public ToggleData depthOffset { if (m_depthOffset == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("DepthOffset Change"); m_depthOffset = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -924,6 +1016,7 @@ public ToggleData zWrite { if (m_ZWrite == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("ZWrite Change"); m_ZWrite = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -940,6 +1033,7 @@ public TransparentCullMode transparentCullMode if (m_transparentCullMode == value) return; + this.owner.owner.RegisterCompleteObjectUndo("Transparent Cull Mode Change"); m_transparentCullMode = value; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Graph); @@ -956,6 +1050,7 @@ public CompareFunction zTest if (m_ZTest == value) return; + this.owner.owner.RegisterCompleteObjectUndo("ZTest Change"); m_ZTest = value; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Graph); @@ -972,6 +1067,7 @@ public ToggleData supportLodCrossFade { if (m_SupportLodCrossFade == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Support LOD CrossFade Change"); m_SupportLodCrossFade = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Node); @@ -1007,6 +1103,27 @@ int ComputeMaterialNeedsUpdateHash() return hash; } + // This struct, and the corresponding property below it, exist to expose the StackLitMasterNode to the inspector for drawing settings + public struct StackLitSettings + { + // Empty struct + } + + [Inspectable("Stack Lit Settings", null)] + public StackLitSettings HDStackLitSettings { get; private set; } + + // This property exists to expose shaderGUI Override info. to the inspector + [Inspectable("ShaderGUI", null)] + public ShaderGUIOverrideInfo ShaderGUIInfo + { + get => new ShaderGUIOverrideInfo(this.OverrideEnabled, this.ShaderGUIOverride); + set + { + this.ShaderGUIOverride = value.ShaderGUIOverride; + this.OverrideEnabled = value.OverrideEnabled; + } + } + [SerializeField] private string m_ShaderGUIOverride; public string ShaderGUIOverride { @@ -1279,11 +1396,6 @@ public sealed override void UpdateNodeAfterDeserialization() RemoveSlotsNameNotMatching(validSlots, true); } - public VisualElement CreateSettingsElement() - { - return new StackLitSettingsView(this); - } - public string renderQueueTag { get diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/StackLit/ShaderGraph/StackLitPropertyDrawer.cs b/com.unity.render-pipelines.high-definition/Editor/Material/StackLit/ShaderGraph/StackLitPropertyDrawer.cs new file mode 100644 index 00000000000..6fb26eabb9c --- /dev/null +++ b/com.unity.render-pipelines.high-definition/Editor/Material/StackLit/ShaderGraph/StackLitPropertyDrawer.cs @@ -0,0 +1,564 @@ +using System; +using System.Reflection; +using Drawing.Inspector; +using UnityEditor.ShaderGraph; +using UnityEditor.ShaderGraph.Drawing; +using UnityEditor.UIElements; +using UnityEngine; +using UnityEngine.Rendering.HighDefinition; +using UnityEngine.UIElements; +using UnityEditor.Graphing.Util; +using UnityEditor.ShaderGraph.Drawing.Controls; +using UnityEngine.Rendering; + +namespace UnityEditor.Rendering.HighDefinition +{ + [SGPropertyDrawer(typeof(StackLitMasterNode.StackLitSettings))] + public class StackLitPropertyDrawer : IPropertyDrawer + { + IntegerField m_SortPriorityField; + EnumField m_screenSpaceSpecularOcclusionBaseModeVisualElement; + + public Action inspectorUpdateDelegate { get; set; } + + private VisualElement CreateGUI(StackLitMasterNode masterNode) + { + PropertySheet propertySheet = new PropertySheet(); + int indentLevel = 0; + + // Instantiate property drawers + var enumPropertyDrawer = new EnumPropertyDrawer(); + var toggleDataPropertyDrawer = new ToggleDataPropertyDrawer(); + var integerPropertyDrawer = new IntegerPropertyDrawer(); + + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => + { + masterNode.surfaceType = (SurfaceType) newValue; + this.inspectorUpdateDelegate(); + }, + masterNode.surfaceType, + "Surface Type", + SurfaceType.Opaque, + out var surfaceTypeVisualElement, + indentLevel)); + + if (masterNode.surfaceType == SurfaceType.Transparent) + { + ++indentLevel; + + // No refraction in StackLit, always show this: + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => + { + masterNode.alphaMode = + masterNode.GetAlphaMode((StackLitMasterNode.AlphaModeLit) newValue); + }, + masterNode.GetAlphaModeLit(masterNode.alphaMode), + "Blending Mode", + HDLitMasterNode.AlphaModeLit.Additive, + out var blendModeVisualElement, + indentLevel)); + + ++indentLevel; + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.blendPreserveSpecular = newValue, + masterNode.blendPreserveSpecular, + "Blend Preserves Specular", + out var preserveSpecularLightingToggle, + indentLevel)); + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.transparencyFog = newValue, + masterNode.transparencyFog, + "Fog", + out var receiveFogToggle, + indentLevel)); + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => + { + masterNode.distortion = newValue; + inspectorUpdateDelegate(); + }, + masterNode.distortion, + "Distortion", + out var distortionToggle, + indentLevel)); + + if (masterNode.distortion.isOn) + { + ++indentLevel; + + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => masterNode.distortionMode = (DistortionMode) newValue, + masterNode.distortionMode, + "Distortion Blend Mode", + DistortionMode.Add, + out var distortionModeVisualElement, + indentLevel)); + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.distortionDepthTest = newValue, + masterNode.distortionDepthTest, + "Distortion Depth Test", + out var distortionDepthTestToggle, + indentLevel)); + + --indentLevel; + } + + propertySheet.Add(integerPropertyDrawer.CreateGUI(newValue => + { + m_SortPriorityField.value = masterNode.sortPriority; + masterNode.sortPriority = newValue; + inspectorUpdateDelegate(); + }, + masterNode.sortPriority, + "Sorting Priority", + out var sortPriorityField, + indentLevel)); + // Hold onto field reference for later + m_SortPriorityField = (IntegerField) sortPriorityField; + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.zWrite = newValue, + masterNode.zWrite, + "Depth Write", + out var depthWriteToggle, + indentLevel)); + + if (masterNode.doubleSidedMode == DoubleSidedMode.Disabled) + { + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => masterNode.transparentCullMode = (TransparentCullMode) newValue, + masterNode.transparentCullMode, + "Cull Mode", + masterNode.transparentCullMode, + out var cullModeVisualElement, + indentLevel)); + } + + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => masterNode.zTest = (CompareFunction) newValue, + masterNode.zTest, + "Depth Test", + masterNode.zTest, + out var depthTestVisualElement, + indentLevel)); + } + + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => + { + masterNode.doubleSidedMode = (DoubleSidedMode) newValue; + this.inspectorUpdateDelegate(); + }, + masterNode.doubleSidedMode, + "Double-Sided", + DoubleSidedMode.Disabled, + out var doubleSidedModeVisualElement, + indentLevel)); + + // Rest of UI looks like this: + // + // baseParametrization + // energyConservingSpecular + // + // anisotropy + // coat + // coatNormal + // dualSpecularLobe + // dualSpecularLobeParametrization + // capHazinessWrtMetallic + // iridescence + // subsurfaceScattering + // transmission + // + // receiveDecals + // receiveSSR + // addPrecomputedVelocity + // geometricSpecularAA + // specularOcclusion + // + // anisotropyForAreaLights + // recomputeStackPerLight + // shadeBaseUsingRefractedAngles + + // Base parametrization: + + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => + { + masterNode.baseParametrization = (StackLit.BaseParametrization) newValue; + this.inspectorUpdateDelegate(); + }, + masterNode.baseParametrization, + "Base Color Parametrization", + StackLit.BaseParametrization.BaseMetallic, + out var baseParametrizationVisualElement, + indentLevel)); + + + if (masterNode.baseParametrization == StackLit.BaseParametrization.SpecularColor) + { + ++indentLevel; + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.energyConservingSpecular = newValue, + masterNode.energyConservingSpecular, + "Energy Conserving Specular", + out var energyConservingSpecularToggle, + indentLevel)); + --indentLevel; + } + + propertySheet.Add(new PropertyRow(PropertyDrawerUtils.CreateLabel("Material Core Features", indentLevel)), + (row) => { }); + ; + ++indentLevel; + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.anisotropy = newValue, + masterNode.anisotropy, + "Anisotropy", + out var anisotropyToggle, + indentLevel)); + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => + { + masterNode.coat = newValue; + this.inspectorUpdateDelegate(); + }, + masterNode.coat, + "Coat", + out var coatToggle, + indentLevel)); + + if (masterNode.coat.isOn) + { + ++indentLevel; + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.coatNormal = newValue, + masterNode.coatNormal, + "Coat Normal", + out var coatNormalToggle, + indentLevel)); + --indentLevel; + } + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => + { + masterNode.dualSpecularLobe = newValue; + this.inspectorUpdateDelegate(); + }, + masterNode.dualSpecularLobe, + "Dual Specular Lobe", + out var dualSpecularLobeToggle, + indentLevel)); + + if (masterNode.dualSpecularLobe.isOn) + { + ++indentLevel; + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => masterNode.dualSpecularLobeParametrization = + (StackLit.DualSpecularLobeParametrization) newValue, + masterNode.dualSpecularLobeParametrization, + "Dual SpecularLobe Parametrization", + StackLit.DualSpecularLobeParametrization.HazyGloss, + out var dualSpecularLobeParametrization, + indentLevel)); + + if (masterNode.baseParametrization == StackLit.BaseParametrization.BaseMetallic && + masterNode.dualSpecularLobeParametrization == StackLit.DualSpecularLobeParametrization.HazyGloss) + { + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.capHazinessWrtMetallic = newValue, + masterNode.capHazinessWrtMetallic, + "Cap Haziness For Non Metallic", + out var capHazinessToggle, + indentLevel)); + } + + --indentLevel; + } + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => + { + masterNode.iridescence = newValue; + this.inspectorUpdateDelegate(); + }, + masterNode.iridescence, + "Iridescence", + out var iridescenceToggle, + indentLevel)); + + if (masterNode.surfaceType != SurfaceType.Transparent) + { + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.subsurfaceScattering = newValue, + masterNode.subsurfaceScattering, + "Subsurface Scattering", + out var subsurfaceScatteringToggle, + indentLevel)); + } + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.transmission = newValue, + masterNode.transmission, + "Transmission", + out var tranmissionToggle, + indentLevel)); + --indentLevel; + + + if (masterNode.devMode.isOn) + { + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => + { + if (Equals(newValue, StackLitMasterNode.SpecularOcclusionBaseMode.Custom)) + { + Debug.LogWarning("Custom input not supported for SSAO based specular occlusion."); + // Make sure the UI field doesn't switch and stays in sync with the master node property: + m_screenSpaceSpecularOcclusionBaseModeVisualElement.value = + masterNode.screenSpaceSpecularOcclusionBaseMode; + return; + } + + masterNode.screenSpaceSpecularOcclusionBaseMode = + (StackLitMasterNode.SpecularOcclusionBaseMode) newValue; + this.inspectorUpdateDelegate(); + }, + masterNode.dualSpecularLobeParametrization, + "Specular Occlusion (from SSAO)", + StackLitMasterNode.SpecularOcclusionBaseMode.DirectFromAO, + out var screenSpaceSpecularOcclusionBaseModeVisualElement, + indentLevel)); + // Store for later use + m_screenSpaceSpecularOcclusionBaseModeVisualElement = + (EnumField) screenSpaceSpecularOcclusionBaseModeVisualElement; + + if (StackLitMasterNode.SpecularOcclusionModeUsesVisibilityCone(masterNode + .screenSpaceSpecularOcclusionBaseMode)) + { + ++indentLevel; + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => masterNode.screenSpaceSpecularOcclusionAOConeSize = + (StackLitMasterNode.SpecularOcclusionAOConeSize) newValue, + masterNode.screenSpaceSpecularOcclusionAOConeSize, + "Specular Occlusion (SS) AO Cone Weight", + StackLitMasterNode.SpecularOcclusionAOConeSize.CosWeightedAO, + out var specularOcclusionAoConeSizeVisualElement, + indentLevel)); + + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => + { + masterNode.screenSpaceSpecularOcclusionAOConeDir = + (StackLitMasterNode.SpecularOcclusionAOConeDir) newValue; + this.inspectorUpdateDelegate(); + }, + masterNode.screenSpaceSpecularOcclusionAOConeDir, + "Specular Occlusion (SS) AO Cone Dir", + StackLitMasterNode.SpecularOcclusionAOConeDir.ShadingNormal, + out var specularOcclusionAoConeDirVisualElement, + indentLevel)); + --indentLevel; + } + } + + // SpecularOcclusion from input AO (baked or data-based SO) + { + // #TODO: Inspector - Make this less redundant + if (masterNode.devMode.isOn) + { + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => + { + masterNode.dataBasedSpecularOcclusionBaseMode = + (StackLitMasterNode.SpecularOcclusionBaseMode) newValue; + this.inspectorUpdateDelegate(); + }, + masterNode.screenSpaceSpecularOcclusionAOConeDir, + "Specular Occlusion (from input AO)", + StackLitMasterNode.SpecularOcclusionBaseMode.DirectFromAO, + out var specularOcclusionBaseModeVisualElement, + indentLevel)); + } + else + { + // In non-dev mode, parse any enum value set to a method not shown in the simple UI as SPTD (highest quality) method: + StackLitMasterNode.SpecularOcclusionBaseModeSimple simpleUIEnumValue = + Enum.TryParse(masterNode.dataBasedSpecularOcclusionBaseMode.ToString(), + out StackLitMasterNode.SpecularOcclusionBaseModeSimple parsedValue) + ? parsedValue + : StackLitMasterNode.SpecularOcclusionBaseModeSimple.SPTDIntegrationOfBentAO; + + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => + { + masterNode.dataBasedSpecularOcclusionBaseMode = + (StackLitMasterNode.SpecularOcclusionBaseMode) newValue; + this.inspectorUpdateDelegate(); + }, + masterNode.dataBasedSpecularOcclusionBaseMode, + "Specular Occlusion (from input AO)", + simpleUIEnumValue, + out var specularOcclusionBaseModeVisualElement, + indentLevel)); + } + + if (StackLitMasterNode.SpecularOcclusionModeUsesVisibilityCone( + masterNode.dataBasedSpecularOcclusionBaseMode)) + { + ++indentLevel; + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => masterNode.dataBasedSpecularOcclusionAOConeSize = + (StackLitMasterNode.SpecularOcclusionAOConeSize) newValue, + masterNode.dataBasedSpecularOcclusionAOConeSize, + "Specular Occlusion AO Cone Weight", + StackLitMasterNode.SpecularOcclusionAOConeSize.CosWeightedBentCorrectAO, + out var specularOcclusionAoConeSizeVisualElement, + indentLevel)); + --indentLevel; + } + } + + if (masterNode.SpecularOcclusionUsesBentNormal()) + { + if (masterNode.devMode.isOn) + { + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => + { + masterNode.specularOcclusionConeFixupMethod = + (StackLitMasterNode.SpecularOcclusionConeFixupMethod) newValue; + }, + masterNode.specularOcclusionConeFixupMethod, + "Specular Occlusion Bent Cone Fixup", + StackLitMasterNode.SpecularOcclusionConeFixupMethod.Off, + out var specularOcclusionConeFixupMethodVisualElement, + indentLevel)); + } + else + { + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => + { + if ((newValue.isOn == false && Equals(masterNode.specularOcclusionConeFixupMethod, + StackLitMasterNode.SpecularOcclusionConeFixupMethod.Off)) + || (newValue.isOn && Equals(masterNode.specularOcclusionConeFixupMethod, + StackLitMasterNode.SpecularOcclusionConeFixupMethod.BoostAndTilt))) + return; + + masterNode.specularOcclusionConeFixupMethod = newValue.isOn + ? StackLitMasterNode.SpecularOcclusionConeFixupMethod.BoostAndTilt + : StackLitMasterNode.SpecularOcclusionConeFixupMethod.Off; + }, + new ToggleData(masterNode.specularOcclusionConeFixupMethod != + StackLitMasterNode.SpecularOcclusionConeFixupMethod.Off), + "Specular Occlusion Bent Cone Fixup", + out var specularOcclusionConeFixupMethodVisualElement, + indentLevel)); + + } + } + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.supportLodCrossFade = newValue, + masterNode.supportLodCrossFade, + "Support LOD CrossFade", + out var LODCrossfadeToggle, + indentLevel)); + + propertySheet.Add(new PropertyRow(PropertyDrawerUtils.CreateLabel("Advanced Options", indentLevel)), (row) => {} );; + ++indentLevel; + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.anisotropyForAreaLights = newValue, + masterNode.anisotropyForAreaLights, + "Anisotropy for Area Lights", + out var anisotropyForAreaLightsToggle, + indentLevel)); + + { + propertySheet.Add(new PropertyRow(PropertyDrawerUtils.CreateLabel("Per Punctual/Directional Lights:", indentLevel)), (row) => {} ); + ++indentLevel; + + if (masterNode.coat.isOn) + { + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.shadeBaseUsingRefractedAngles = newValue, + masterNode.shadeBaseUsingRefractedAngles, + "Base Layer Uses Refracted Angles", + out var shadeBaseUsingRefractedAnglesToggle, + indentLevel)); + } + + if (masterNode.coat.isOn || masterNode.iridescence.isOn) + { + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.recomputeStackPerLight = newValue, + masterNode.recomputeStackPerLight, + "Recompute Stack & Iridescence", + out var shadeBaseUsingRefractedAnglesToggle, + indentLevel)); + } + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.honorPerLightMinRoughness = newValue, + masterNode.honorPerLightMinRoughness, + "Honor Per Light Max Smoothness", + out var honorPerLightMinRoughnessToggle, + indentLevel)); + + --indentLevel; + }; + + // Uncomment to show the dev mode UI: + //propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + // newValue => masterNode.devMode = newValue, + // masterNode.devMode, + // "Enable Dev Mode", + // out var devModeToggle, + // indentLevel)); + + if (masterNode.devMode.isOn) + { + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.debug = newValue, + masterNode.debug, + "Show And Enable StackLit Debugs", + out var debugToggle, + indentLevel)); + } + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.overrideBakedGI = newValue, + masterNode.overrideBakedGI, + "Override Baked GI", + out var overrideBakedGIToggle, + indentLevel)); + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.depthOffset = newValue, + masterNode.depthOffset, + "Depth Offset", + out var depthOffsetToggle, + indentLevel)); + + --indentLevel; + + return propertySheet; + } + + public VisualElement DrawProperty(PropertyInfo propertyInfo, object actualObject, Inspectable attribute) + { + return this.CreateGUI((StackLitMasterNode) actualObject); + } + } +} diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/StackLit/ShaderGraph/StackLitPropertyDrawer.cs.meta b/com.unity.render-pipelines.high-definition/Editor/Material/StackLit/ShaderGraph/StackLitPropertyDrawer.cs.meta new file mode 100644 index 00000000000..bd686f99e27 --- /dev/null +++ b/com.unity.render-pipelines.high-definition/Editor/Material/StackLit/ShaderGraph/StackLitPropertyDrawer.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 965db0d612a24e4bbf73e7612d9fb6c9 +timeCreated: 1587022702 \ No newline at end of file diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/StackLit/ShaderGraph/StackLitSettingsView.cs b/com.unity.render-pipelines.high-definition/Editor/Material/StackLit/ShaderGraph/StackLitSettingsView.cs deleted file mode 100644 index c8ad96c0930..00000000000 --- a/com.unity.render-pipelines.high-definition/Editor/Material/StackLit/ShaderGraph/StackLitSettingsView.cs +++ /dev/null @@ -1,1038 +0,0 @@ -using System; -using UnityEditor.UIElements; -using UnityEngine; -using UnityEngine.UIElements; -using UnityEditor.Graphing.Util; -using UnityEditor.ShaderGraph; -using UnityEditor.ShaderGraph.Internal; -using UnityEditor.ShaderGraph.Drawing; -using UnityEditor.ShaderGraph.Drawing.Controls; -using UnityEditor.Rendering.HighDefinition; -using UnityEngine.Rendering.HighDefinition; -using UnityEngine.Rendering; - -namespace UnityEditor.Rendering.HighDefinition.Drawing -{ - class StackLitSettingsView : MasterNodeSettingsView - { - StackLitMasterNode m_Node; - - IntegerField m_SortPiorityField; - - Label CreateLabel(string text, int indentLevel) - { - string label = ""; - for (var i = 0; i < indentLevel; i++) - { - label += " "; - } - return new Label(label + text); - } - - public StackLitSettingsView(StackLitMasterNode node) : base(node) - { - m_Node = node; - PropertySheet ps = new PropertySheet(); - - int indentLevel = 0; - ps.Add(new PropertyRow(CreateLabel("Surface Type", indentLevel)), (row) => - { - row.Add(new EnumField(SurfaceType.Opaque), (field) => - { - field.value = m_Node.surfaceType; - field.RegisterValueChangedCallback(ChangeSurfaceType); - }); - }); - - if (m_Node.surfaceType == SurfaceType.Transparent) - { - ++indentLevel; - - // No refraction in StackLit, always show this: - ps.Add(new PropertyRow(CreateLabel("Blending Mode", indentLevel)), (row) => - { - row.Add(new EnumField(StackLitMasterNode.AlphaModeLit.Additive), (field) => - { - field.value = GetAlphaModeLit(m_Node.alphaMode); - field.RegisterValueChangedCallback(ChangeBlendMode); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Blend Preserves Specular", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.blendPreserveSpecular.isOn; - toggle.OnToggleChanged(ChangeBlendPreserveSpecular); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Fog", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.transparencyFog.isOn; - toggle.OnToggleChanged(ChangeTransparencyFog); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Distortion", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.distortion.isOn; - toggle.OnToggleChanged(ChangeDistortion); - }); - }); - - if (m_Node.distortion.isOn) - { - ++indentLevel; - ps.Add(new PropertyRow(CreateLabel("Distortion Blend Mode", indentLevel)), (row) => - { - row.Add(new EnumField(DistortionMode.Add), (field) => - { - field.value = m_Node.distortionMode; - field.RegisterValueChangedCallback(ChangeDistortionMode); - }); - }); - ps.Add(new PropertyRow(CreateLabel("Distortion Depth Test", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.distortionDepthTest.isOn; - toggle.OnToggleChanged(ChangeDistortionDepthTest); - }); - }); - --indentLevel; - } - - m_SortPiorityField = new IntegerField(); - ps.Add(new PropertyRow(CreateLabel("Sort Priority", indentLevel)), (row) => - { - row.Add(m_SortPiorityField, (field) => - { - field.value = m_Node.sortPriority; - field.RegisterValueChangedCallback(ChangeSortPriority); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Depth Write", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.zWrite.isOn; - toggle.OnToggleChanged(ChangeZWrite); - }); - }); - - if (m_Node.doubleSidedMode == DoubleSidedMode.Disabled) - { - ps.Add(new PropertyRow(CreateLabel("Cull Mode", indentLevel)), (row) => - { - row.Add(new EnumField(m_Node.transparentCullMode), (e) => - { - e.value = m_Node.transparentCullMode; - e.RegisterValueChangedCallback(ChangeTransparentCullMode); - }); - }); - } - - ps.Add(new PropertyRow(CreateLabel("Depth Test", indentLevel)), (row) => - { - row.Add(new EnumField(m_Node.zTest), (e) => - { - e.value = m_Node.zTest; - e.RegisterValueChangedCallback(ChangeZTest); - }); - }); - - --indentLevel; - } - - ps.Add(new PropertyRow(CreateLabel("Alpha Clipping", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.alphaTest.isOn; - toggle.OnToggleChanged(ChangeAlphaTest); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Double-Sided", indentLevel)), (row) => - { - row.Add(new EnumField(DoubleSidedMode.Disabled), (field) => - { - field.value = m_Node.doubleSidedMode; - field.RegisterValueChangedCallback(ChangeDoubleSidedMode); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Fragment Normal Space", indentLevel)), (row) => - { - row.Add(new EnumField(NormalDropOffSpace.Tangent), (field) => - { - field.value = m_Node.normalDropOffSpace; - field.RegisterValueChangedCallback(ChangeSpaceOfNormalDropOffMode); - }); - }); - - // Rest of UI looks like this: - // - // baseParametrization - // energyConservingSpecular - // - // anisotropy - // coat - // coatNormal - // dualSpecularLobe - // dualSpecularLobeParametrization - // capHazinessWrtMetallic - // iridescence - // subsurfaceScattering - // transmission - // - // receiveDecals - // receiveSSR - // addPrecomputedVelocity - // geometricSpecularAA - // specularOcclusion - // - // anisotropyForAreaLights - // recomputeStackPerLight - // shadeBaseUsingRefractedAngles - - // Base parametrization: - - ps.Add(new PropertyRow(CreateLabel("Base Color Parametrization", indentLevel)), (row) => - { - row.Add(new EnumField(StackLit.BaseParametrization.BaseMetallic), (field) => - { - field.value = m_Node.baseParametrization; - field.RegisterValueChangedCallback(ChangeBaseParametrization); - }); - }); - - if (m_Node.baseParametrization == StackLit.BaseParametrization.SpecularColor) - { - ++indentLevel; - ps.Add(new PropertyRow(CreateLabel("Energy Conserving Specular", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.energyConservingSpecular.isOn; - toggle.OnToggleChanged(ChangeEnergyConservingSpecular); - }); - }); - --indentLevel; - } - - // Material type enables: - ps.Add(new PropertyRow(CreateLabel("Material Core Features", indentLevel)), (row) => {} ); - ++indentLevel; - - ps.Add(new PropertyRow(CreateLabel("Anisotropy", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.anisotropy.isOn; - toggle.OnToggleChanged(ChangeAnisotropy); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Coat", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.coat.isOn; - toggle.OnToggleChanged(ChangeCoat); - }); - }); - - if (m_Node.coat.isOn) - { - ++indentLevel; - ps.Add(new PropertyRow(CreateLabel("Coat Normal", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.coatNormal.isOn; - toggle.OnToggleChanged(ChangeCoatNormal); - }); - }); - --indentLevel; - } - - ps.Add(new PropertyRow(CreateLabel("Dual Specular Lobe", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.dualSpecularLobe.isOn; - toggle.OnToggleChanged(ChangeDualSpecularLobe); - }); - }); - - if (m_Node.dualSpecularLobe.isOn) - { - ++indentLevel; - ps.Add(new PropertyRow(CreateLabel("Dual SpecularLobe Parametrization", indentLevel)), (row) => - { - row.Add(new EnumField(StackLit.DualSpecularLobeParametrization.HazyGloss), (field) => - { - field.value = m_Node.dualSpecularLobeParametrization; - field.RegisterValueChangedCallback(ChangeDualSpecularLobeParametrization); - }); - }); - if ((m_Node.baseParametrization == StackLit.BaseParametrization.BaseMetallic) - && (m_Node.dualSpecularLobeParametrization == StackLit.DualSpecularLobeParametrization.HazyGloss)) - { - ps.Add(new PropertyRow(CreateLabel("Cap Haziness For Non Metallic", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.capHazinessWrtMetallic.isOn; - toggle.OnToggleChanged(ChangeCapHazinessWrtMetallic); - }); - }); - } - --indentLevel; - } - - ps.Add(new PropertyRow(CreateLabel("Iridescence", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.iridescence.isOn; - toggle.OnToggleChanged(ChangeIridescence); - }); - }); - - if (m_Node.surfaceType != SurfaceType.Transparent) - { - ps.Add(new PropertyRow(CreateLabel("Subsurface Scattering", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.subsurfaceScattering.isOn; - toggle.OnToggleChanged(ChangeSubsurfaceScattering); - }); - }); - } - - ps.Add(new PropertyRow(CreateLabel("Transmission", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.transmission.isOn; - toggle.OnToggleChanged(ChangeTransmission); - }); - }); - --indentLevel; // ...Material type enables. - - ps.Add(new PropertyRow(CreateLabel("Receive Decals", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.receiveDecals.isOn; - toggle.OnToggleChanged(ChangeReceiveDecals); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Receive SSR", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.receiveSSR.isOn; - toggle.OnToggleChanged(ChangeReceiveSSR); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Add Precomputed Velocity", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.addPrecomputedVelocity.isOn; - toggle.OnToggleChanged(ChangeAddPrecomputedVelocity); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Geometric Specular AA", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.geometricSpecularAA.isOn; - toggle.OnToggleChanged(ChangeGeometricSpecularAA); - }); - }); - - //ps.Add(new PropertyRow(CreateLabel("Specular Occlusion (main enable)", indentLevel)), (row) => - //{ - // row.Add(new Toggle(), (toggle) => - // { - // toggle.value = m_Node.specularOcclusion.isOn; - // toggle.OnToggleChanged(ChangeSpecularOcclusion); - // }); - //}); - - // SpecularOcclusion from SSAO - if (m_Node.devMode.isOn) - { - // Only in dev mode do we show controls for SO fed from SSAO: otherwise, we keep the default which is DirectFromAO - ps.Add(new PropertyRow(CreateLabel("Specular Occlusion (from SSAO)", indentLevel)), (row) => - { - row.Add(new EnumField(StackLitMasterNode.SpecularOcclusionBaseMode.DirectFromAO), (field) => - { - field.value = m_Node.screenSpaceSpecularOcclusionBaseMode; - field.RegisterValueChangedCallback(ChangeScreenSpaceSpecularOcclusionBaseMode); - }); - - }); - if (StackLitMasterNode.SpecularOcclusionModeUsesVisibilityCone(m_Node.screenSpaceSpecularOcclusionBaseMode)) - { - ++indentLevel; - ps.Add(new PropertyRow(CreateLabel("Specular Occlusion (SS) AO Cone Weight", indentLevel)), (row) => - { - row.Add(new EnumField(StackLitMasterNode.SpecularOcclusionAOConeSize.CosWeightedAO), (field) => - { - field.value = m_Node.screenSpaceSpecularOcclusionAOConeSize; - field.RegisterValueChangedCallback(ChangeScreenSpaceSpecularOcclusionAOConeSize); - }); - }); - ps.Add(new PropertyRow(CreateLabel("Specular Occlusion (SS) AO Cone Dir", indentLevel)), (row) => - { - row.Add(new EnumField(StackLitMasterNode.SpecularOcclusionAOConeDir.ShadingNormal), (field) => - { - field.value = m_Node.screenSpaceSpecularOcclusionAOConeDir; - field.RegisterValueChangedCallback(ChangeScreenSpaceSpecularOcclusionAOConeDir); - }); - }); - --indentLevel; - } - } - - // SpecularOcclusion from input AO (baked or data-based SO) - { - ps.Add(new PropertyRow(CreateLabel("Specular Occlusion (from input AO)", indentLevel)), (row) => - { - if (m_Node.devMode.isOn) - { - row.Add(new EnumField(StackLitMasterNode.SpecularOcclusionBaseMode.DirectFromAO), (field) => - { - field.value = m_Node.dataBasedSpecularOcclusionBaseMode; - field.RegisterValueChangedCallback(ChangeDataBasedSpecularOcclusionBaseMode); - }); - } - else - { - row.Add(new EnumField(StackLitMasterNode.SpecularOcclusionBaseModeSimple.DirectFromAO), (field) => - { - // In non-dev mode, parse any enum value set to a method not shown in the simple UI as SPTD (highest quality) method: - StackLitMasterNode.SpecularOcclusionBaseModeSimple simpleUIEnumValue = - Enum.TryParse(m_Node.dataBasedSpecularOcclusionBaseMode.ToString(), out StackLitMasterNode.SpecularOcclusionBaseModeSimple parsedValue) ? - parsedValue : StackLitMasterNode.SpecularOcclusionBaseModeSimple.SPTDIntegrationOfBentAO; - field.value = simpleUIEnumValue; - field.RegisterValueChangedCallback(ChangeDataBasedSpecularOcclusionBaseModeSimpleUI); - }); - } - }); - if (StackLitMasterNode.SpecularOcclusionModeUsesVisibilityCone(m_Node.dataBasedSpecularOcclusionBaseMode)) - { - ++indentLevel; - ps.Add(new PropertyRow(CreateLabel("Specular Occlusion AO Cone Weight", indentLevel)), (row) => - { - row.Add(new EnumField(StackLitMasterNode.SpecularOcclusionAOConeSize.CosWeightedBentCorrectAO), (field) => - { - field.value = m_Node.dataBasedSpecularOcclusionAOConeSize; - field.RegisterValueChangedCallback(ChangeDataBasedSpecularOcclusionAOConeSize); - }); - }); - --indentLevel; - } - } - - if (m_Node.SpecularOcclusionUsesBentNormal()) - { - if (m_Node.devMode.isOn) - { - ps.Add(new PropertyRow(CreateLabel("Specular Occlusion Bent Cone Fixup", indentLevel)), (row) => - { - row.Add(new EnumField(StackLitMasterNode.SpecularOcclusionConeFixupMethod.Off), (field) => - { - field.value = m_Node.specularOcclusionConeFixupMethod; - field.RegisterValueChangedCallback(ChangeSpecularOcclusionConeFixupMethod); - }); - }); - } - else - { - // Just show a simple toggle when not in dev mode - ps.Add(new PropertyRow(CreateLabel("Specular Occlusion Bent Cone Fixup", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.specularOcclusionConeFixupMethod != StackLitMasterNode.SpecularOcclusionConeFixupMethod.Off; - toggle.OnToggleChanged(ChangeSpecularOcclusionConeFixupMethodSimpleUI); - }); - }); - } - } - - ps.Add(new PropertyRow(CreateLabel("Support LOD CrossFade", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.supportLodCrossFade.isOn; - toggle.OnToggleChanged(ChangeSupportLODCrossFade); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Advanced Options", indentLevel)), (row) => {} ); - ++indentLevel; - - ps.Add(new PropertyRow(CreateLabel("Anisotropy For Area Lights", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.anisotropyForAreaLights.isOn; - toggle.OnToggleChanged(ChangeAnisotropyForAreaLights); - }); - }); - - // Per Punctual/Directional Lights - { - ps.Add(new PropertyRow(CreateLabel("Per Punctual/Directional Lights:", indentLevel)), (row) => { }); - ++indentLevel; - - if (m_Node.coat.isOn) - { - ps.Add(new PropertyRow(CreateLabel("Base Layer Uses Refracted Angles", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.shadeBaseUsingRefractedAngles.isOn; - toggle.OnToggleChanged(ChangeShadeBaseUsingRefractedAngles); - }); - }); - } - if (m_Node.coat.isOn || m_Node.iridescence.isOn) - { - ps.Add(new PropertyRow(CreateLabel("Recompute Stack & Iridescence", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.recomputeStackPerLight.isOn; - toggle.OnToggleChanged(ChangeRecomputeStackPerLight); - }); - }); - } - ps.Add(new PropertyRow(CreateLabel("Honor Per Light Max Smoothness", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.honorPerLightMinRoughness.isOn; - toggle.OnToggleChanged(ChangeHonorPerLightMinRoughness); - }); - }); - - --indentLevel; - } // Per Punctual/Directional Lights - - // Uncomment to show the dev mode UI: - // - //ps.Add(new PropertyRow(CreateLabel("Enable Dev Mode", indentLevel)), (row) => - //{ - // row.Add(new Toggle(), (toggle) => - // { - // toggle.value = m_Node.devMode.isOn; - // toggle.OnToggleChanged(ChangeDevMode); - // }); - //}); - - if (m_Node.devMode.isOn) - { - ps.Add(new PropertyRow(CreateLabel("Show And Enable StackLit Debugs", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.debug.isOn; - toggle.OnToggleChanged(ChangeDebug); - }); - }); - } - - ps.Add(new PropertyRow(CreateLabel("Override Baked GI", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.overrideBakedGI.isOn; - toggle.OnToggleChanged(ChangeoverrideBakedGI); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Depth Offset", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.depthOffset.isOn; - toggle.OnToggleChanged(ChangeDepthOffset); - }); - }); - - --indentLevel; //...Advanced options - - Add(ps); - Add(GetShaderGUIOverridePropertySheet()); - } - - void ChangeSurfaceType(ChangeEvent evt) - { - if (Equals(m_Node.surfaceType, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Surface Type Change"); - m_Node.surfaceType = (SurfaceType)evt.newValue; - } - - void ChangeDoubleSidedMode(ChangeEvent evt) - { - if (Equals(m_Node.doubleSidedMode, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Double-Sided Mode Change"); - m_Node.doubleSidedMode = (DoubleSidedMode)evt.newValue; - } - - void ChangeSpaceOfNormalDropOffMode(ChangeEvent evt) - { - if (Equals(m_Node.normalDropOffSpace, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Normal Space Drop-Off Mode Change"); - m_Node.normalDropOffSpace = (NormalDropOffSpace)evt.newValue; - } - - void ChangeBaseParametrization(ChangeEvent evt) - { - if (Equals(m_Node.baseParametrization, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Base Parametrization Change"); - m_Node.baseParametrization = (StackLit.BaseParametrization)evt.newValue; - } - - void ChangeDualSpecularLobeParametrization(ChangeEvent evt) - { - if (Equals(m_Node.dualSpecularLobeParametrization, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Dual Specular Lobe Parametrization Change"); - m_Node.dualSpecularLobeParametrization = (StackLit.DualSpecularLobeParametrization)evt.newValue; - } - - void ChangeBlendMode(ChangeEvent evt) - { - // Make sure the mapping is correct by handling each case. - AlphaMode alphaMode = GetAlphaMode((StackLitMasterNode.AlphaModeLit)evt.newValue); - - if (Equals(m_Node.alphaMode, alphaMode)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Alpha Mode Change"); - m_Node.alphaMode = alphaMode; - } - - void ChangeBlendPreserveSpecular(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Blend Preserve Specular Change"); - ToggleData td = m_Node.blendPreserveSpecular; - td.isOn = evt.newValue; - m_Node.blendPreserveSpecular = td; - } - - void ChangeTransparencyFog(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Transparency Fog Change"); - ToggleData td = m_Node.transparencyFog; - td.isOn = evt.newValue; - m_Node.transparencyFog = td; - } - - void ChangeDistortion(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Distortion Change"); - ToggleData td = m_Node.distortion; - td.isOn = evt.newValue; - m_Node.distortion = td; - } - - void ChangeDistortionMode(ChangeEvent evt) - { - if (Equals(m_Node.distortionMode, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Distortion Mode Change"); - m_Node.distortionMode = (DistortionMode)evt.newValue; - } - - void ChangeDistortionDepthTest(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Distortion Depth Test Change"); - ToggleData td = m_Node.distortionDepthTest; - td.isOn = evt.newValue; - m_Node.distortionDepthTest = td; - } - - void ChangeSortPriority(ChangeEvent evt) - { - m_Node.sortPriority = HDRenderQueue.ClampsTransparentRangePriority(evt.newValue); - // Force the text to match. - m_SortPiorityField.value = m_Node.sortPriority; - if (Equals(m_Node.sortPriority, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Sort Priority Change"); - } - - void ChangeAlphaTest(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Alpha Test Change"); - ToggleData td = m_Node.alphaTest; - td.isOn = evt.newValue; - m_Node.alphaTest = td; - } - - void ChangeReceiveDecals(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Receive Decals Change"); - ToggleData td = m_Node.receiveDecals; - td.isOn = evt.newValue; - m_Node.receiveDecals = td; - } - - void ChangeReceiveSSR(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Receive SSR Change"); - ToggleData td = m_Node.receiveSSR; - td.isOn = evt.newValue; - m_Node.receiveSSR = td; - } - - void ChangeAddPrecomputedVelocity(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Add Precomputed Velocity"); - ToggleData td = m_Node.addPrecomputedVelocity; - td.isOn = evt.newValue; - m_Node.addPrecomputedVelocity = td; - } - - void ChangeGeometricSpecularAA(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Specular AA Change"); - ToggleData td = m_Node.geometricSpecularAA; - td.isOn = evt.newValue; - m_Node.geometricSpecularAA = td; - } - - void ChangeEnergyConservingSpecular(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Energy Conserving Specular Change"); - ToggleData td = m_Node.energyConservingSpecular; - td.isOn = evt.newValue; - m_Node.energyConservingSpecular = td; - } - - void ChangeAnisotropy(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Anisotropy Change"); - ToggleData td = m_Node.anisotropy; - td.isOn = evt.newValue; - m_Node.anisotropy = td; - } - - void ChangeCoat(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Coat Change"); - ToggleData td = m_Node.coat; - td.isOn = evt.newValue; - m_Node.coat = td; - } - - void ChangeCoatNormal(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Coat Normal Change"); - ToggleData td = m_Node.coatNormal; - td.isOn = evt.newValue; - m_Node.coatNormal = td; - } - - void ChangeDualSpecularLobe(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("DualSpecularLobe Change"); - ToggleData td = m_Node.dualSpecularLobe; - td.isOn = evt.newValue; - m_Node.dualSpecularLobe = td; - } - - void ChangeCapHazinessWrtMetallic(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("CapHazinessWrtMetallic Change"); - ToggleData td = m_Node.capHazinessWrtMetallic; - td.isOn = evt.newValue; - m_Node.capHazinessWrtMetallic = td; - } - - void ChangeIridescence(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Iridescence Change"); - ToggleData td = m_Node.iridescence; - td.isOn = evt.newValue; - m_Node.iridescence = td; - } - - void ChangeSubsurfaceScattering(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("SubsurfaceScattering Change"); - ToggleData td = m_Node.subsurfaceScattering; - td.isOn = evt.newValue; - m_Node.subsurfaceScattering = td; - } - - void ChangeTransmission(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Transmission Change"); - ToggleData td = m_Node.transmission; - td.isOn = evt.newValue; - m_Node.transmission = td; - } - - //void ChangeSpecularOcclusion(ChangeEvent evt) - //{ - // m_Node.owner.owner.RegisterCompleteObjectUndo("SpecularOcclusion Change"); - // ToggleData td = m_Node.specularOcclusion; - // td.isOn = evt.newValue; - // m_Node.specularOcclusion = td; - //} - - void ChangeScreenSpaceSpecularOcclusionBaseMode(ChangeEvent evt) - { - if (Equals(m_Node.screenSpaceSpecularOcclusionBaseMode, evt.newValue)) - return; - - if (Equals(evt.newValue, StackLitMasterNode.SpecularOcclusionBaseMode.Custom)) - { - Debug.LogWarning("Custom input not supported for SSAO based specular occlusion."); - // Make sure the UI field doesn't switch and stays in synch with the master node property: - if (evt.currentTarget is EnumField enumField) - { - enumField.value = m_Node.screenSpaceSpecularOcclusionBaseMode; - } - return; - } - - m_Node.owner.owner.RegisterCompleteObjectUndo("ScreenSpaceSpecularOcclusionBaseMode Change"); - m_Node.screenSpaceSpecularOcclusionBaseMode = (StackLitMasterNode.SpecularOcclusionBaseMode)evt.newValue; - } - - void ChangeScreenSpaceSpecularOcclusionAOConeSize(ChangeEvent evt) - { - if (Equals(m_Node.screenSpaceSpecularOcclusionAOConeSize, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("ScreenSpaceSpecularOcclusionAOConeSize Change"); - m_Node.screenSpaceSpecularOcclusionAOConeSize = (StackLitMasterNode.SpecularOcclusionAOConeSize)evt.newValue; - } - - void ChangeScreenSpaceSpecularOcclusionAOConeDir(ChangeEvent evt) - { - if (Equals(m_Node.screenSpaceSpecularOcclusionAOConeDir, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("ScreenSpaceSpecularOcclusionAOConeDir Change"); - m_Node.screenSpaceSpecularOcclusionAOConeDir = (StackLitMasterNode.SpecularOcclusionAOConeDir)evt.newValue; - } - - void ChangeDataBasedSpecularOcclusionBaseMode(ChangeEvent evt) - { - if (Equals(m_Node.dataBasedSpecularOcclusionBaseMode, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("DataBasedSpecularOcclusionBaseMode Change"); - m_Node.dataBasedSpecularOcclusionBaseMode = (StackLitMasterNode.SpecularOcclusionBaseMode)evt.newValue; - } - - void ChangeDataBasedSpecularOcclusionBaseModeSimpleUI(ChangeEvent evt) - { - // StackLitMasterNode.SpecularOcclusionBaseModeSimple should always be a subset of StackLitMasterNode.SpecularOcclusionBaseMode: - if (Equals(m_Node.dataBasedSpecularOcclusionBaseMode, (StackLitMasterNode.SpecularOcclusionBaseMode) evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("DataBasedSpecularOcclusionBaseMode (simple UI) Change"); - m_Node.dataBasedSpecularOcclusionBaseMode = (StackLitMasterNode.SpecularOcclusionBaseMode)evt.newValue; - } - - void ChangeDataBasedSpecularOcclusionAOConeSize(ChangeEvent evt) - { - if (Equals(m_Node.dataBasedSpecularOcclusionAOConeSize, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("DataBasedSpecularOcclusionAOConeSize Change"); - m_Node.dataBasedSpecularOcclusionAOConeSize = (StackLitMasterNode.SpecularOcclusionAOConeSize)evt.newValue; - } - - void ChangeSpecularOcclusionConeFixupMethod(ChangeEvent evt) - { - if (Equals(m_Node.specularOcclusionConeFixupMethod, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("SpecularOcclusionConeFixupMethod Change"); - m_Node.specularOcclusionConeFixupMethod = (StackLitMasterNode.SpecularOcclusionConeFixupMethod)evt.newValue; - } - - void ChangeSpecularOcclusionConeFixupMethodSimpleUI(ChangeEvent evt) - { - if ( (evt.newValue == false && Equals(m_Node.specularOcclusionConeFixupMethod, StackLitMasterNode.SpecularOcclusionConeFixupMethod.Off)) - || (evt.newValue == true && Equals(m_Node.specularOcclusionConeFixupMethod, StackLitMasterNode.SpecularOcclusionConeFixupMethod.BoostAndTilt)) ) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("SpecularOcclusionConeFixupMethod Change"); - - m_Node.specularOcclusionConeFixupMethod = evt.newValue ? StackLitMasterNode.SpecularOcclusionConeFixupMethod.BoostAndTilt - : StackLitMasterNode.SpecularOcclusionConeFixupMethod.Off; - } - - void ChangeAnisotropyForAreaLights(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("AnisotropyForAreaLights Change"); - ToggleData td = m_Node.anisotropyForAreaLights; - td.isOn = evt.newValue; - m_Node.anisotropyForAreaLights = td; - } - - void ChangeoverrideBakedGI(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("overrideBakedGI Change"); - ToggleData td = m_Node.overrideBakedGI; - td.isOn = evt.newValue; - m_Node.overrideBakedGI = td; - } - - void ChangeRecomputeStackPerLight(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("RecomputeStackPerLight Change"); - ToggleData td = m_Node.recomputeStackPerLight; - td.isOn = evt.newValue; - m_Node.recomputeStackPerLight = td; - } - - void ChangeHonorPerLightMinRoughness(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("HonorPerLightMinRoughness Change"); - ToggleData td = m_Node.honorPerLightMinRoughness; - td.isOn = evt.newValue; - m_Node.honorPerLightMinRoughness = td; - } - - void ChangeShadeBaseUsingRefractedAngles(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("ShadeBaseUsingRefractedAngles Change"); - ToggleData td = m_Node.shadeBaseUsingRefractedAngles; - td.isOn = evt.newValue; - m_Node.shadeBaseUsingRefractedAngles = td; - } - - void ChangeDevMode(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("StackLit DevMode Change"); - ToggleData td = m_Node.devMode; - td.isOn = evt.newValue; - m_Node.devMode = td; - } - - void ChangeDebug(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("StackLit Debug Change"); - ToggleData td = m_Node.debug; - td.isOn = evt.newValue; - m_Node.debug = td; - } - - void ChangeDepthOffset(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("DepthOffset Change"); - ToggleData td = m_Node.depthOffset; - td.isOn = evt.newValue; - m_Node.depthOffset = td; - } - - void ChangeZWrite(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("ZWrite Change"); - ToggleData td = m_Node.zWrite; - td.isOn = evt.newValue; - m_Node.zWrite = td; - } - - void ChangeTransparentCullMode(ChangeEvent evt) - { - if (Equals(m_Node.transparentCullMode, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Transparent Cull Mode Change"); - m_Node.transparentCullMode = (TransparentCullMode)evt.newValue; - } - - void ChangeZTest(ChangeEvent evt) - { - if (Equals(m_Node.zTest, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("ZTest Change"); - m_Node.zTest = (CompareFunction)evt.newValue; - } - - void ChangeSupportLODCrossFade(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Support LOD CrossFade Change"); - ToggleData td = m_Node.supportLodCrossFade; - td.isOn = evt.newValue; - m_Node.supportLodCrossFade = td; - } - - public AlphaMode GetAlphaMode(StackLitMasterNode.AlphaModeLit alphaModeLit) - { - switch (alphaModeLit) - { - case StackLitMasterNode.AlphaModeLit.Alpha: - return AlphaMode.Alpha; - case StackLitMasterNode.AlphaModeLit.Premultiply: - return AlphaMode.Premultiply; - case StackLitMasterNode.AlphaModeLit.Additive: - return AlphaMode.Additive; - default: - { - Debug.LogWarning("Not supported: " + alphaModeLit); - return AlphaMode.Alpha; - } - - } - } - - public StackLitMasterNode.AlphaModeLit GetAlphaModeLit(AlphaMode alphaMode) - { - switch (alphaMode) - { - case AlphaMode.Alpha: - return StackLitMasterNode.AlphaModeLit.Alpha; - case AlphaMode.Premultiply: - return StackLitMasterNode.AlphaModeLit.Premultiply; - case AlphaMode.Additive: - return StackLitMasterNode.AlphaModeLit.Additive; - default: - { - Debug.LogWarning("Not supported: " + alphaMode); - return StackLitMasterNode.AlphaModeLit.Alpha; - } - } - } - } -} diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/StackLit/ShaderGraph/StackLitSettingsView.cs.meta b/com.unity.render-pipelines.high-definition/Editor/Material/StackLit/ShaderGraph/StackLitSettingsView.cs.meta deleted file mode 100644 index 8315539b31c..00000000000 --- a/com.unity.render-pipelines.high-definition/Editor/Material/StackLit/ShaderGraph/StackLitSettingsView.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 8181fef146d3d7a4ab3a814e8963dbf2 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Unlit/ShaderGraph/HDUnlitMasterNode.cs b/com.unity.render-pipelines.high-definition/Editor/Material/Unlit/ShaderGraph/HDUnlitMasterNode.cs index 615d43f145e..473c6a3f02b 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/Unlit/ShaderGraph/HDUnlitMasterNode.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/Unlit/ShaderGraph/HDUnlitMasterNode.cs @@ -22,7 +22,7 @@ namespace UnityEditor.Rendering.HighDefinition [Serializable] [FormerName("UnityEditor.Experimental.Rendering.HDPipeline.HDUnlitMasterNode")] [Title("Master", "Unlit (HDRP)")] - class HDUnlitMasterNode : AbstractMaterialNode, IMasterNode, IHasSettings, ICanChangeShaderGUI, IMayRequirePosition, IMayRequireNormal, IMayRequireTangent + class HDUnlitMasterNode : AbstractMaterialNode, IMasterNode, ICanChangeShaderGUI, IMayRequirePosition, IMayRequireNormal, IMayRequireTangent { public const string ColorSlotName = "Color"; public const string AlphaSlotName = "Alpha"; @@ -48,6 +48,15 @@ class HDUnlitMasterNode : AbstractMaterialNode, IMasterNode, IHasSettings, ICanC public const int VertexTangentSlotId = 14; public const int ShadowTintSlotId = 15; + // This struct exists to expose the HDUnlitMasterNode to the inspector for drawing settings + public struct HDUnlitSettings + { + // Empty struct + } + + [Inspectable("HDRP Unlit Settings", null)] + public HDUnlitSettings HDRPUnlitSettings { get; private set; } + // Don't support Multiply public enum AlphaModeLit { @@ -67,6 +76,7 @@ public SurfaceType surfaceType if (m_SurfaceType == value) return; + this.owner.owner.RegisterCompleteObjectUndo("Surface Type Change"); m_SurfaceType = value; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -84,11 +94,49 @@ public AlphaMode alphaMode if (m_AlphaMode == value) return; + this.owner.owner.RegisterCompleteObjectUndo("Alpha Mode Change"); m_AlphaMode = value; Dirty(ModificationScope.Graph); } } + public AlphaMode GetAlphaMode(AlphaModeLit alphaModeLit) + { + switch (alphaModeLit) + { + case HDUnlitMasterNode.AlphaModeLit.Alpha: + return AlphaMode.Alpha; + case HDUnlitMasterNode.AlphaModeLit.Premultiply: + return AlphaMode.Premultiply; + case HDUnlitMasterNode.AlphaModeLit.Additive: + return AlphaMode.Additive; + default: + { + Debug.LogWarning("Not supported: " + alphaModeLit); + return AlphaMode.Alpha; + } + } + } + + public AlphaModeLit GetAlphaModeLit(AlphaMode alphaMode) + { + switch (alphaMode) + { + case AlphaMode.Alpha: + return HDUnlitMasterNode.AlphaModeLit.Alpha; + case AlphaMode.Premultiply: + return HDUnlitMasterNode.AlphaModeLit.Premultiply; + case AlphaMode.Additive: + return HDUnlitMasterNode.AlphaModeLit.Additive; + default: + { + Debug.LogWarning("Not supported: " + alphaMode); + return HDUnlitMasterNode.AlphaModeLit.Alpha; + } + } + } + + [SerializeField] HDRenderQueue.RenderQueueType m_RenderingPass = HDRenderQueue.RenderQueueType.Opaque; @@ -100,6 +148,30 @@ public HDRenderQueue.RenderQueueType renderingPass if (m_RenderingPass == value) return; + switch (value) + { + case HDRenderQueue.RenderQueueType.Overlay: + case HDRenderQueue.RenderQueueType.Unknown: + case HDRenderQueue.RenderQueueType.Background: + throw new ArgumentException("Unexpected kind of RenderQueue, was " + value); + default: + break; + }; + + HDRenderQueue.RenderQueueType renderingPass; + switch (surfaceType) + { + case SurfaceType.Opaque: + renderingPass = HDRenderQueue.GetOpaqueEquivalent(value); + break; + case SurfaceType.Transparent: + renderingPass = HDRenderQueue.GetTransparentEquivalent(value); + break; + default: + throw new ArgumentException("Unknown SurfaceType"); + } + + this.owner.owner.RegisterCompleteObjectUndo("Rendering Pass Change"); m_RenderingPass = value; Dirty(ModificationScope.Graph); } @@ -115,6 +187,7 @@ public ToggleData transparencyFog { if (m_TransparencyFog == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Transparency Fog Change"); m_TransparencyFog = value.isOn; Dirty(ModificationScope.Graph); } @@ -135,6 +208,7 @@ public ToggleData distortion { if (m_Distortion == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Distortion Change"); m_Distortion = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -151,7 +225,7 @@ public DistortionMode distortionMode { if (m_DistortionMode == value) return; - + this.owner.owner.RegisterCompleteObjectUndo("Distortion Mode Change"); m_DistortionMode = value; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -168,6 +242,7 @@ public ToggleData distortionOnly { if (m_DistortionOnly == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Distortion Only Change"); m_DistortionOnly = value.isOn; Dirty(ModificationScope.Graph); } @@ -183,6 +258,7 @@ public ToggleData distortionDepthTest { if (m_DistortionDepthTest == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Distortion Depth Test Change"); m_DistortionDepthTest = value.isOn; Dirty(ModificationScope.Graph); } @@ -191,6 +267,7 @@ public ToggleData distortionDepthTest [SerializeField] bool m_AlphaTest; + [Inspectable("Alpha Clipping", false)] public ToggleData alphaTest { get { return new ToggleData(m_AlphaTest); } @@ -198,6 +275,7 @@ public ToggleData alphaTest { if (m_AlphaTest == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Alpha Test Change"); m_AlphaTest = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -212,9 +290,11 @@ public int sortPriority get { return m_SortPriority; } set { - if (m_SortPriority == value) + var newSortPriority = HDRenderQueue.ClampsTransparentRangePriority(value); + if (m_SortPriority == newSortPriority) return; - m_SortPriority = value; + this.owner.owner.RegisterCompleteObjectUndo("Sort Priority Change"); + m_SortPriority = newSortPriority; Dirty(ModificationScope.Graph); } } @@ -229,6 +309,7 @@ public ToggleData doubleSided { if (m_DoubleSided == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Double-Sided Change"); m_DoubleSided = value.isOn; Dirty(ModificationScope.Topological); } @@ -244,6 +325,7 @@ public ToggleData zWrite { if (m_ZWrite == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("ZWrite Change"); m_ZWrite = value.isOn; Dirty(ModificationScope.Graph); } @@ -259,6 +341,7 @@ public TransparentCullMode transparentCullMode if (m_transparentCullMode == value) return; + this.owner.owner.RegisterCompleteObjectUndo("Transparent Cull Mode Change"); m_transparentCullMode = value; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Graph); @@ -275,6 +358,7 @@ public CompareFunction zTest if (m_ZTest == value) return; + this.owner.owner.RegisterCompleteObjectUndo("ZTest Change"); m_ZTest = value; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Graph); @@ -284,6 +368,7 @@ public CompareFunction zTest [SerializeField] bool m_AddPrecomputedVelocity = false; + [Inspectable("Add Precomputed Velocity", false)] public ToggleData addPrecomputedVelocity { get { return new ToggleData(m_AddPrecomputedVelocity); } @@ -291,6 +376,7 @@ public ToggleData addPrecomputedVelocity { if (m_AddPrecomputedVelocity == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Add Precomputed Velocity"); m_AddPrecomputedVelocity = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Graph); @@ -300,6 +386,7 @@ public ToggleData addPrecomputedVelocity [SerializeField] bool m_EnableShadowMatte = false; + [Inspectable("Shadow Matte", false)] public ToggleData enableShadowMatte { get { return new ToggleData(m_EnableShadowMatte); } @@ -307,6 +394,7 @@ public ToggleData enableShadowMatte { if (m_EnableShadowMatte == value.isOn) return; + this.owner.owner.RegisterCompleteObjectUndo("Shadow Matte"); m_EnableShadowMatte = value.isOn; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Graph); @@ -329,6 +417,18 @@ public ToggleData dotsInstancing } } + // This property exists to expose shaderGUI Override info. to the inspector + [Inspectable("ShaderGUI", null)] + public ShaderGUIOverrideInfo ShaderGUIInfo + { + get => new ShaderGUIOverrideInfo(this.OverrideEnabled, this.ShaderGUIOverride); + set + { + this.ShaderGUIOverride = value.ShaderGUIOverride; + this.OverrideEnabled = value.OverrideEnabled; + } + } + [SerializeField] private string m_ShaderGUIOverride; public string ShaderGUIOverride { @@ -394,11 +494,6 @@ public sealed override void UpdateNodeAfterDeserialization() RemoveSlotsNameNotMatching(validSlots, true); } - public VisualElement CreateSettingsElement() - { - return new HDUnlitSettingsView(this); - } - public string renderQueueTag { get diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Unlit/ShaderGraph/HDUnlitPropertyDrawer.cs b/com.unity.render-pipelines.high-definition/Editor/Material/Unlit/ShaderGraph/HDUnlitPropertyDrawer.cs new file mode 100644 index 00000000000..d6bae2ba599 --- /dev/null +++ b/com.unity.render-pipelines.high-definition/Editor/Material/Unlit/ShaderGraph/HDUnlitPropertyDrawer.cs @@ -0,0 +1,222 @@ +using System; +using System.Reflection; +using Drawing.Inspector; +using UnityEditor.ShaderGraph.Drawing; +using UnityEditor.UIElements; +using UnityEngine.Rendering.HighDefinition; +using UnityEngine.UIElements; +using UnityEditor.Graphing.Util; +using UnityEditor.ShaderGraph; +using UnityEditor.ShaderGraph.Drawing.Controls; +using UnityEngine.Rendering; + +namespace UnityEditor.Rendering.HighDefinition +{ + [SGPropertyDrawer(typeof(HDUnlitMasterNode.HDUnlitSettings))] + class HDUnlitPropertyDrawer : IPropertyDrawer + { + IntegerField m_SortPriorityField; + + // All property views explicitly defined here are because there are other properties that depend on them when they change + // We need to be able to detect that and respond to it + private VisualElement CreateGUI(HDUnlitMasterNode masterNode) + { + PropertySheet propertySheet = new PropertySheet(); + int indentLevel = 0; + + // Instantiate property drawers + var enumPropertyDrawer = new EnumPropertyDrawer(); + var toggleDataPropertyDrawer = new ToggleDataPropertyDrawer(); + var integerPropertyDrawer = new IntegerPropertyDrawer(); + + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => + { + masterNode.surfaceType = (SurfaceType) newValue; + this.inspectorUpdateDelegate(); + }, + masterNode.surfaceType, + "Surface Type", + SurfaceType.Opaque, + out var surfaceTypeVisualElement, + indentLevel)); + + indentLevel++; + + switch (masterNode.surfaceType) + { + case SurfaceType.Opaque: + propertySheet.Add(new PropertyRow(PropertyDrawerUtils.CreateLabel("Rendering Pass", indentLevel)), (row) => + { + var valueList = HDSubShaderUtilities.GetRenderingPassList(true, true); + + row.Add(new PopupField(valueList, HDRenderQueue.RenderQueueType.Opaque, HDSubShaderUtilities.RenderQueueName, HDSubShaderUtilities.RenderQueueName), (field) => + { + field.value = HDRenderQueue.GetOpaqueEquivalent(masterNode.renderingPass); + field.RegisterValueChangedCallback(evt => + { + masterNode.renderingPass = evt.newValue; + inspectorUpdateDelegate(); + }); + }); + }); + break; + case SurfaceType.Transparent: + propertySheet.Add(new PropertyRow(PropertyDrawerUtils.CreateLabel("Rendering Pass", indentLevel)), (row) => + { + Enum defaultValue; + switch (masterNode.renderingPass) // Migration + { + default: //when deserializing without issue, we still need to init the default to something even if not used. + case HDRenderQueue.RenderQueueType.Transparent: + defaultValue = HDRenderQueue.TransparentRenderQueue.Default; + break; + case HDRenderQueue.RenderQueueType.PreRefraction: + defaultValue = HDRenderQueue.TransparentRenderQueue.BeforeRefraction; + break; + } + + var valueList = HDSubShaderUtilities.GetRenderingPassList(false, true); + + row.Add(new PopupField(valueList, HDRenderQueue.RenderQueueType.Transparent, HDSubShaderUtilities.RenderQueueName, HDSubShaderUtilities.RenderQueueName), (field) => + { + field.value = HDRenderQueue.GetTransparentEquivalent(masterNode.renderingPass); + field.RegisterValueChangedCallback(evt => + { + masterNode.renderingPass = evt.newValue; + inspectorUpdateDelegate(); + }); + }); + }); + break; + default: + throw new ArgumentException("Unknown SurfaceType"); + } + --indentLevel; + + if (masterNode.surfaceType == SurfaceType.Transparent) + { + ++indentLevel; + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => + { + masterNode.alphaMode = + masterNode.GetAlphaMode((HDUnlitMasterNode.AlphaModeLit) newValue); + }, + masterNode.GetAlphaModeLit(masterNode.alphaMode), + "Blending Mode", + HDUnlitMasterNode.AlphaModeLit.Additive, + out var blendModeVisualElement, + indentLevel)); + + propertySheet.Add(integerPropertyDrawer.CreateGUI(newValue => + { + m_SortPriorityField.value = masterNode.sortPriority; + masterNode.sortPriority = newValue; + inspectorUpdateDelegate(); + }, + masterNode.sortPriority, + "Sorting Priority", + out var sortPriorityField, + indentLevel)); + // Hold onto field reference for later + m_SortPriorityField = (IntegerField)sortPriorityField; + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.transparencyFog = newValue, + masterNode.transparencyFog, + "Receive Fog", + out var receiveFogToggle, + indentLevel)); + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => + { + masterNode.distortion = newValue; + inspectorUpdateDelegate(); + }, + masterNode.distortion, + "Distortion", + out var distortionToggle, + indentLevel)); + + if (masterNode.distortion.isOn) + { + ++indentLevel; + + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => masterNode.distortionMode = (DistortionMode)newValue, + masterNode.distortionMode, + "Distortion Blend Mode", + DistortionMode.Add, + out var distortionModeVisualElement, + indentLevel)); + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.distortionOnly = newValue, + masterNode.distortionOnly, + "Distortion Only", + out var distortionOnlyToggle, + indentLevel)); + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.distortionDepthTest = newValue, + masterNode.distortionDepthTest, + "Distortion Depth Test", + out var distortionDepthTestToggle, + indentLevel)); + + --indentLevel; + } + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => masterNode.zWrite = newValue, + masterNode.zWrite, + "Depth Write", + out var zWriteTestToggle, + indentLevel)); + + if (!masterNode.doubleSided.isOn) + { + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => masterNode.transparentCullMode = (TransparentCullMode)newValue, + masterNode.transparentCullMode, + "Cull Mode", + masterNode.transparentCullMode, + out var transparentCullModeVisualElement, + indentLevel)); + } + + propertySheet.Add(enumPropertyDrawer.CreateGUI( + newValue => masterNode.zTest = (CompareFunction)newValue, + masterNode.zTest, + "Depth Test", + masterNode.zTest, + out var zTestVisualElement, + indentLevel)); + + --indentLevel; + } + + propertySheet.Add(toggleDataPropertyDrawer.CreateGUI( + newValue => + { + masterNode.doubleSided = newValue; + this.inspectorUpdateDelegate(); + }, + masterNode.doubleSided, + "Double-Sided", + out var doubleSidedToggle, + indentLevel)); + + return propertySheet; + } + + public Action inspectorUpdateDelegate { get; set; } + + public VisualElement DrawProperty(PropertyInfo propertyInfo, object actualObject, Inspectable attribute) + { + return this.CreateGUI((HDUnlitMasterNode) actualObject); + } + } +} diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Unlit/ShaderGraph/HDUnlitPropertyDrawer.cs.meta b/com.unity.render-pipelines.high-definition/Editor/Material/Unlit/ShaderGraph/HDUnlitPropertyDrawer.cs.meta new file mode 100644 index 00000000000..30f858360f7 --- /dev/null +++ b/com.unity.render-pipelines.high-definition/Editor/Material/Unlit/ShaderGraph/HDUnlitPropertyDrawer.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 035e620b9f2f4a09906bf5184b2fe913 +timeCreated: 1586969514 \ No newline at end of file diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Unlit/ShaderGraph/HDUnlitSettingsView.cs b/com.unity.render-pipelines.high-definition/Editor/Material/Unlit/ShaderGraph/HDUnlitSettingsView.cs deleted file mode 100644 index 1e880e147c5..00000000000 --- a/com.unity.render-pipelines.high-definition/Editor/Material/Unlit/ShaderGraph/HDUnlitSettingsView.cs +++ /dev/null @@ -1,439 +0,0 @@ -using System; -using UnityEditor.UIElements; -using UnityEngine; -using UnityEngine.UIElements; -using UnityEditor.Graphing.Util; -using UnityEditor.ShaderGraph; -using UnityEditor.ShaderGraph.Drawing; -using UnityEditor.ShaderGraph.Drawing.Controls; -using UnityEditor.Rendering.HighDefinition; -using UnityEngine.Rendering.HighDefinition; -using UnityEngine.Rendering; - -namespace UnityEditor.Rendering.HighDefinition.Drawing -{ - class HDUnlitSettingsView : MasterNodeSettingsView - { - HDUnlitMasterNode m_Node; - - IntegerField m_SortPiorityField; - - Label CreateLabel(string text, int indentLevel) - { - string label = ""; - for (var i = 0; i < indentLevel; i++) - { - label += " "; - } - return new Label(label + text); - } - - public HDUnlitSettingsView(HDUnlitMasterNode node) : base(node) - { - m_Node = node; - PropertySheet ps = new PropertySheet(); - - int indentLevel = 0; - ps.Add(new PropertyRow(CreateLabel("Surface Type", indentLevel)), (row) => - { - row.Add(new EnumField(SurfaceType.Opaque), (field) => - { - field.value = m_Node.surfaceType; - field.RegisterValueChangedCallback(ChangeSurfaceType); - }); - }); - - ++indentLevel; - switch (m_Node.surfaceType) - { - case SurfaceType.Opaque: - ps.Add(new PropertyRow(CreateLabel("Rendering Pass", indentLevel)), (row) => - { - var valueList = HDSubShaderUtilities.GetRenderingPassList(true, true); - - row.Add(new PopupField(valueList, HDRenderQueue.RenderQueueType.Opaque, HDSubShaderUtilities.RenderQueueName, HDSubShaderUtilities.RenderQueueName), (field) => - { - field.value = HDRenderQueue.GetOpaqueEquivalent(m_Node.renderingPass); - field.RegisterValueChangedCallback(ChangeRenderingPass); - }); - }); - break; - case SurfaceType.Transparent: - ps.Add(new PropertyRow(CreateLabel("Rendering Pass", indentLevel)), (row) => - { - Enum defaultValue; - switch (m_Node.renderingPass) // Migration - { - default: //when deserializing without issue, we still need to init the default to something even if not used. - case HDRenderQueue.RenderQueueType.Transparent: - defaultValue = HDRenderQueue.TransparentRenderQueue.Default; - break; - case HDRenderQueue.RenderQueueType.PreRefraction: - defaultValue = HDRenderQueue.TransparentRenderQueue.BeforeRefraction; - break; - } - - var valueList = HDSubShaderUtilities.GetRenderingPassList(false, true); - - row.Add(new PopupField(valueList, HDRenderQueue.RenderQueueType.Transparent, HDSubShaderUtilities.RenderQueueName, HDSubShaderUtilities.RenderQueueName), (field) => - { - field.value = HDRenderQueue.GetTransparentEquivalent(m_Node.renderingPass); - field.RegisterValueChangedCallback(ChangeRenderingPass); - }); - }); - break; - default: - throw new ArgumentException("Unknown SurfaceType"); - } - --indentLevel; - - if (m_Node.surfaceType == SurfaceType.Transparent) - { - ++indentLevel; - ps.Add(new PropertyRow(CreateLabel("Blending Mode", indentLevel)), (row) => - { - row.Add(new EnumField(HDUnlitMasterNode.AlphaModeLit.Additive), (field) => - { - field.value = GetAlphaModeLit(m_Node.alphaMode); - field.RegisterValueChangedCallback(ChangeBlendMode); - }); - }); - - m_SortPiorityField = new IntegerField(); - ps.Add(new PropertyRow(CreateLabel("Sorting Priority", indentLevel)), (row) => - { - row.Add(m_SortPiorityField, (field) => - { - field.value = m_Node.sortPriority; - field.RegisterValueChangedCallback(ChangeSortPriority); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Receive Fog", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.transparencyFog.isOn; - toggle.OnToggleChanged(ChangeTransparencyFog); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Distortion", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.distortion.isOn; - toggle.OnToggleChanged(ChangeDistortion); - }); - }); - - if (m_Node.distortion.isOn) - { - ++indentLevel; - ps.Add(new PropertyRow(CreateLabel("Distortion Blend Mode", indentLevel)), (row) => - { - row.Add(new EnumField(DistortionMode.Add), (field) => - { - field.value = m_Node.distortionMode; - field.RegisterValueChangedCallback(ChangeDistortionMode); - }); - }); - ps.Add(new PropertyRow(CreateLabel("Distortion Only", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.distortionOnly.isOn; - toggle.OnToggleChanged(ChangeDistortionOnly); - }); - }); - ps.Add(new PropertyRow(CreateLabel("Distortion Depth Test", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.distortionDepthTest.isOn; - toggle.OnToggleChanged(ChangeDistortionDepthTest); - }); - }); - --indentLevel; - } - - ps.Add(new PropertyRow(CreateLabel("Depth Write", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.zWrite.isOn; - toggle.OnToggleChanged(ChangeZWrite); - }); - }); - - if (!m_Node.doubleSided.isOn) - { - ps.Add(new PropertyRow(CreateLabel("Cull Mode", indentLevel)), (row) => - { - row.Add(new EnumField(m_Node.transparentCullMode), (e) => - { - e.value = m_Node.transparentCullMode; - e.RegisterValueChangedCallback(ChangeTransparentCullMode); - }); - }); - } - - ps.Add(new PropertyRow(CreateLabel("Depth Test", indentLevel)), (row) => - { - row.Add(new EnumField(m_Node.zTest), (e) => - { - e.value = m_Node.zTest; - e.RegisterValueChangedCallback(ChangeZTest); - }); - }); - - --indentLevel; - } - - ps.Add(new PropertyRow(new Label("Double-Sided")), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.doubleSided.isOn; - toggle.OnToggleChanged(ChangeDoubleSided); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Alpha Clipping", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.alphaTest.isOn; - toggle.OnToggleChanged(ChangeAlphaTest); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Add Precomputed Velocity", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.addPrecomputedVelocity.isOn; - toggle.OnToggleChanged(ChangeAddPrecomputedVelocity); - }); - }); - - ps.Add(new PropertyRow(CreateLabel("Shadow Matte", indentLevel)), (row) => - { - row.Add(new Toggle(), (toggle) => - { - toggle.value = m_Node.enableShadowMatte.isOn; - toggle.OnToggleChanged(ChangeEnableShadowMatte); - }); - }); - - Add(ps); - Add(GetShaderGUIOverridePropertySheet()); - } - - void ChangeSurfaceType(ChangeEvent evt) - { - if (Equals(m_Node.surfaceType, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Surface Type Change"); - m_Node.surfaceType = (SurfaceType)evt.newValue; - - UpdateRenderingPassValue(m_Node.renderingPass); - } - - void ChangeDoubleSided(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Double-Sided Change"); - ToggleData td = m_Node.doubleSided; - td.isOn = evt.newValue; - m_Node.doubleSided = td; - } - - void ChangeBlendMode(ChangeEvent evt) - { - // Make sure the mapping is correct by handling each case. - - AlphaMode alphaMode = GetAlphaMode((HDUnlitMasterNode.AlphaModeLit)evt.newValue); - - if (Equals(m_Node.alphaMode, alphaMode)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Alpha Mode Change"); - m_Node.alphaMode = alphaMode; - } - - void ChangeTransparencyFog(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Transparency Fog Change"); - ToggleData td = m_Node.transparencyFog; - td.isOn = evt.newValue; - m_Node.transparencyFog = td; - } - - void ChangeRenderingPass(ChangeEvent evt) - { - switch (evt.newValue) - { - case HDRenderQueue.RenderQueueType.Overlay: - case HDRenderQueue.RenderQueueType.Unknown: - case HDRenderQueue.RenderQueueType.Background: - throw new ArgumentException("Unexpected kind of RenderQueue, was " + evt.newValue); - default: - break; - }; - UpdateRenderingPassValue(evt.newValue); - } - - void UpdateRenderingPassValue(HDRenderQueue.RenderQueueType newValue) - { - HDRenderQueue.RenderQueueType renderingPass; - switch (m_Node.surfaceType) - { - case SurfaceType.Opaque: - renderingPass = HDRenderQueue.GetOpaqueEquivalent(newValue); - break; - case SurfaceType.Transparent: - renderingPass = HDRenderQueue.GetTransparentEquivalent(newValue); - break; - default: - throw new ArgumentException("Unknown SurfaceType"); - } - - if (Equals(m_Node.renderingPass, renderingPass)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Rendering Pass Change"); - m_Node.renderingPass = renderingPass; - } - - void ChangeDistortion(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Distortion Change"); - ToggleData td = m_Node.distortion; - td.isOn = evt.newValue; - m_Node.distortion = td; - } - - void ChangeDistortionMode(ChangeEvent evt) - { - if (Equals(m_Node.distortionMode, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Distortion Mode Change"); - m_Node.distortionMode = (DistortionMode)evt.newValue; - } - - void ChangeDistortionOnly(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Distortion Only Change"); - ToggleData td = m_Node.distortionOnly; - td.isOn = evt.newValue; - m_Node.distortionDepthTest = td; - } - - void ChangeDistortionDepthTest(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Distortion Depth Test Change"); - ToggleData td = m_Node.distortionDepthTest; - td.isOn = evt.newValue; - m_Node.distortionDepthTest = td; - } - - void ChangeSortPriority(ChangeEvent evt) - { - m_Node.sortPriority = HDRenderQueue.ClampsTransparentRangePriority(evt.newValue); - // Force the text to match. - m_SortPiorityField.value = m_Node.sortPriority; - if (Equals(m_Node.sortPriority, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Sort Priority Change"); - } - - void ChangeAlphaTest(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Alpha Test Change"); - ToggleData td = m_Node.alphaTest; - td.isOn = evt.newValue; - m_Node.alphaTest = td; - } - - void ChangeAddPrecomputedVelocity(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Add Precomputed Velocity"); - ToggleData td = m_Node.addPrecomputedVelocity; - td.isOn = evt.newValue; - m_Node.addPrecomputedVelocity = td; - } - - void ChangeEnableShadowMatte(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("Shadow Matte"); - ToggleData td = m_Node.enableShadowMatte; - td.isOn = evt.newValue; - m_Node.enableShadowMatte = td; - } - - void ChangeZWrite(ChangeEvent evt) - { - m_Node.owner.owner.RegisterCompleteObjectUndo("ZWrite Change"); - ToggleData td = m_Node.zWrite; - td.isOn = evt.newValue; - m_Node.zWrite = td; - } - - void ChangeTransparentCullMode(ChangeEvent evt) - { - if (Equals(m_Node.transparentCullMode, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("Transparent Cull Mode Change"); - m_Node.transparentCullMode = (TransparentCullMode)evt.newValue; - } - - void ChangeZTest(ChangeEvent evt) - { - if (Equals(m_Node.zTest, evt.newValue)) - return; - - m_Node.owner.owner.RegisterCompleteObjectUndo("ZTest Change"); - m_Node.zTest = (CompareFunction)evt.newValue; - } - - public AlphaMode GetAlphaMode(HDUnlitMasterNode.AlphaModeLit alphaModeLit) - { - switch (alphaModeLit) - { - case HDUnlitMasterNode.AlphaModeLit.Alpha: - return AlphaMode.Alpha; - case HDUnlitMasterNode.AlphaModeLit.Premultiply: - return AlphaMode.Premultiply; - case HDUnlitMasterNode.AlphaModeLit.Additive: - return AlphaMode.Additive; - default: - { - Debug.LogWarning("Not supported: " + alphaModeLit); - return AlphaMode.Alpha; - } - } - } - - public HDUnlitMasterNode.AlphaModeLit GetAlphaModeLit(AlphaMode alphaMode) - { - switch (alphaMode) - { - case AlphaMode.Alpha: - return HDUnlitMasterNode.AlphaModeLit.Alpha; - case AlphaMode.Premultiply: - return HDUnlitMasterNode.AlphaModeLit.Premultiply; - case AlphaMode.Additive: - return HDUnlitMasterNode.AlphaModeLit.Additive; - default: - { - Debug.LogWarning("Not supported: " + alphaMode); - return HDUnlitMasterNode.AlphaModeLit.Alpha; - } - } - } - } -} diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Unlit/ShaderGraph/HDUnlitSettingsView.cs.meta b/com.unity.render-pipelines.high-definition/Editor/Material/Unlit/ShaderGraph/HDUnlitSettingsView.cs.meta deleted file mode 100644 index 27342fdb336..00000000000 --- a/com.unity.render-pipelines.high-definition/Editor/Material/Unlit/ShaderGraph/HDUnlitSettingsView.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 775f9331f25e19640bcba701363f3f36 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.render-pipelines.universal/Editor/ShaderGraph/MasterNodes/SpriteLitMasterNode.cs b/com.unity.render-pipelines.universal/Editor/ShaderGraph/MasterNodes/SpriteLitMasterNode.cs index b97d65ead9e..af3502696dc 100644 --- a/com.unity.render-pipelines.universal/Editor/ShaderGraph/MasterNodes/SpriteLitMasterNode.cs +++ b/com.unity.render-pipelines.universal/Editor/ShaderGraph/MasterNodes/SpriteLitMasterNode.cs @@ -4,6 +4,7 @@ using UnityEditor.Graphing; using UnityEngine; using UnityEditor.ShaderGraph; +using UnityEditor.ShaderGraph.Drawing; using UnityEditor.ShaderGraph.Internal; using UnityEngine.UIElements; @@ -12,7 +13,7 @@ namespace UnityEditor.Experimental.Rendering.Universal [Serializable] [Title("Master", "Sprite Lit (Experimental)")] [FormerName("UnityEditor.Experimental.Rendering.LWRP.SpriteLitMasterNode")] - class SpriteLitMasterNode : AbstractMaterialNode, IMasterNode, IHasSettings, ICanChangeShaderGUI, IMayRequirePosition, IMayRequireNormal, IMayRequireTangent + class SpriteLitMasterNode : AbstractMaterialNode, IMasterNode, ICanChangeShaderGUI, IMayRequirePosition, IMayRequireNormal, IMayRequireTangent { public const string PositionName = "Vertex Position"; public const string NormalName = "Vertex Normal"; @@ -28,6 +29,18 @@ class SpriteLitMasterNode : AbstractMaterialNode, IMasterNode, IHasSettings, ICa public const int VertNormalSlotId = 10; public const int VertTangentSlotId = 11; + // This property exists to expose shaderGUI Override info. to the inspector + [Inspectable("ShaderGUI", null)] + public ShaderGUIOverrideInfo ShaderGUIInfo + { + get => new ShaderGUIOverrideInfo(this.OverrideEnabled, this.ShaderGUIOverride); + set + { + this.ShaderGUIOverride = value.ShaderGUIOverride; + this.OverrideEnabled = value.OverrideEnabled; + } + } + [SerializeField] private string m_ShaderGUIOverride; public string ShaderGUIOverride { @@ -72,11 +85,6 @@ public sealed override void UpdateNodeAfterDeserialization() }); } - public VisualElement CreateSettingsElement() - { - return new SpriteSettingsView(this); - } - public string renderQueueTag => $"{RenderQueue.Transparent}"; public string renderTypeTag => $"{RenderType.Transparent}"; diff --git a/com.unity.render-pipelines.universal/Editor/ShaderGraph/MasterNodes/SpriteSettingsView.cs b/com.unity.render-pipelines.universal/Editor/ShaderGraph/MasterNodes/SpriteSettingsView.cs deleted file mode 100644 index 61815c589da..00000000000 --- a/com.unity.render-pipelines.universal/Editor/ShaderGraph/MasterNodes/SpriteSettingsView.cs +++ /dev/null @@ -1,13 +0,0 @@ -using UnityEditor.ShaderGraph; -using UnityEditor.ShaderGraph.Drawing; - -namespace UnityEditor.Experimental.Rendering.Universal -{ - class SpriteSettingsView : MasterNodeSettingsView - { - public SpriteSettingsView(AbstractMaterialNode node) : base(node) - { - Add(GetShaderGUIOverridePropertySheet()); - } - } -} diff --git a/com.unity.render-pipelines.universal/Editor/ShaderGraph/MasterNodes/SpriteSettingsView.cs.meta b/com.unity.render-pipelines.universal/Editor/ShaderGraph/MasterNodes/SpriteSettingsView.cs.meta deleted file mode 100644 index 53ad68a7dfb..00000000000 --- a/com.unity.render-pipelines.universal/Editor/ShaderGraph/MasterNodes/SpriteSettingsView.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 80b080eab50bfbe4e80c04b9e39eb969 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.render-pipelines.universal/Editor/ShaderGraph/MasterNodes/SpriteUnlitMasterNode.cs b/com.unity.render-pipelines.universal/Editor/ShaderGraph/MasterNodes/SpriteUnlitMasterNode.cs index eb0b3850c50..5a2bc9bce4d 100644 --- a/com.unity.render-pipelines.universal/Editor/ShaderGraph/MasterNodes/SpriteUnlitMasterNode.cs +++ b/com.unity.render-pipelines.universal/Editor/ShaderGraph/MasterNodes/SpriteUnlitMasterNode.cs @@ -5,6 +5,7 @@ using UnityEngine; using UnityEngine.UIElements; using UnityEditor.ShaderGraph; +using UnityEditor.ShaderGraph.Drawing; using UnityEditor.ShaderGraph.Internal; namespace UnityEditor.Experimental.Rendering.Universal @@ -12,7 +13,7 @@ namespace UnityEditor.Experimental.Rendering.Universal [Serializable] [Title("Master", "Sprite Unlit (Experimental)")] [FormerName("UnityEditor.Experimental.Rendering.LWRP.SpriteUnlitMasterNode")] - class SpriteUnlitMasterNode : AbstractMaterialNode, IMasterNode, IHasSettings, ICanChangeShaderGUI, IMayRequirePosition, IMayRequireNormal, IMayRequireTangent + class SpriteUnlitMasterNode : AbstractMaterialNode, IMasterNode, ICanChangeShaderGUI, IMayRequirePosition, IMayRequireNormal, IMayRequireTangent { public const string PositionName = "Vertex Position"; public const string NormalName = "Vertex Normal"; @@ -25,6 +26,18 @@ class SpriteUnlitMasterNode : AbstractMaterialNode, IMasterNode, IHasSettings, I public const int VertNormalSlotId = 10; public const int VertTangentSlotId = 11; + // This property exists to expose shaderGUI Override info. to the inspector + [Inspectable("ShaderGUI", null)] + public ShaderGUIOverrideInfo ShaderGUIInfo + { + get => new ShaderGUIOverrideInfo(this.OverrideEnabled, this.ShaderGUIOverride); + set + { + this.ShaderGUIOverride = value.ShaderGUIOverride; + this.OverrideEnabled = value.OverrideEnabled; + } + } + [SerializeField] private string m_ShaderGUIOverride; public string ShaderGUIOverride { @@ -65,11 +78,6 @@ public sealed override void UpdateNodeAfterDeserialization() }); } - public VisualElement CreateSettingsElement() - { - return new SpriteSettingsView(this); - } - public string renderQueueTag => $"{RenderQueue.Transparent}"; public string renderTypeTag => $"{RenderType.Transparent}"; diff --git a/com.unity.shadergraph/CHANGELOG.md b/com.unity.shadergraph/CHANGELOG.md index 4fc5e9cafea..541809bddd6 100644 --- a/com.unity.shadergraph/CHANGELOG.md +++ b/com.unity.shadergraph/CHANGELOG.md @@ -6,6 +6,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [Unreleased] ### Added +- Added the Internal Inspector which allows the user to view data contained in selected nodes and properties in a new floating graph sub-window. Also added support for custom property drawers to let you visualize any data type you like and expose it to the inspector. - Added samples for Procedural Patterns to the package. - You can now use the right-click context menu to delete Sticky Notes. - You can now save your graph as a new Asset. diff --git a/com.unity.shadergraph/Editor/Data/Interfaces/ICanChangeShaderGUI.cs b/com.unity.shadergraph/Editor/Data/Interfaces/ICanChangeShaderGUI.cs index 0fc0f3ad9f2..e76630ff369 100644 --- a/com.unity.shadergraph/Editor/Data/Interfaces/ICanChangeShaderGUI.cs +++ b/com.unity.shadergraph/Editor/Data/Interfaces/ICanChangeShaderGUI.cs @@ -1,3 +1,12 @@ +using System; +using System.Reflection; +using System.Text.RegularExpressions; +using Drawing.Inspector; +using UnityEditor.Graphing.Util; +using UnityEditor.Rendering; +using UnityEditor.ShaderGraph; +using UnityEditor.ShaderGraph.Drawing; +using UnityEngine; using UnityEngine.UIElements; namespace UnityEditor.Graphing @@ -16,4 +25,184 @@ bool OverrideEnabled set; } } + + public struct ShaderGUIOverrideInfo + { + public bool OverrideEnabled; + public string ShaderGUIOverride; + + public ShaderGUIOverrideInfo(bool overrideEnabled, string shaderGuiOverride) + { + this.OverrideEnabled = overrideEnabled; + this.ShaderGUIOverride = shaderGuiOverride; + } + } + + [SGPropertyDrawer(typeof(ShaderGUIOverrideInfo))] + class ShaderGUIOverridePropertyDrawer : IPropertyDrawer + { + internal delegate void ChangeValueCallback(ShaderGUIOverrideInfo newValue); + private const string k_InvalidShaderGUI = "No class named {0} which derives from ShaderGUI was found in this project."; + + private AbstractMaterialNode m_MasterNode; + // Need to keep a copy here as structs are value types and not reference types + // Need to keep this value updated or else the lambdas operate on stale data + private ShaderGUIOverrideInfo m_ShaderGUIOverrideInfo; + + public void GetPropertyData(AbstractMaterialNode masterNode) + { + this.m_MasterNode = masterNode; + } + + private VisualElement CreateGUI( + ChangeValueCallback valueChangedCallback, + ShaderGUIOverrideInfo actualObject, + out VisualElement shaderGUIOverrideField) + { + m_ShaderGUIOverrideInfo = actualObject; + var propertySheet = new PropertySheet(); + shaderGUIOverrideField = null; + + string storedValue = actualObject.ShaderGUIOverride; + string preferredGUI = GraphUtil.CurrentPipelinePreferredShaderGUI(m_MasterNode as IMasterNode); + + var boolPropertyDrawer = new BoolPropertyDrawer(); + propertySheet.Add(boolPropertyDrawer.CreateGUI( + newValue => + { + m_ShaderGUIOverrideInfo.OverrideEnabled = newValue; + if (m_ShaderGUIOverrideInfo.OverrideEnabled) + { + // Display the pipeline's default upon activation, if it has one. Otherwise set up field to display user setting. + if (string.IsNullOrEmpty(storedValue) && !string.IsNullOrEmpty(preferredGUI)) + { + ProcessShaderGUIField(preferredGUI); + } + else + { + ProcessShaderGUIField(storedValue); + } + } + valueChangedCallback(m_ShaderGUIOverrideInfo); + AddWarningIfNeeded(m_ShaderGUIOverrideInfo); + // Update the inspector after this value is changed as it needs to trigger a re-draw to expose the ShaderGUI text field + this.inspectorUpdateDelegate(); + }, + m_ShaderGUIOverrideInfo.OverrideEnabled, + "Override ShaderGUI", + out var boolKeywordField)); + + + if (actualObject.OverrideEnabled) + { + var textPropertyDrawer = new TextPropertyDrawer(); + propertySheet.Add(textPropertyDrawer.CreateGUI( + newValue => + { + if (m_ShaderGUIOverrideInfo.ShaderGUIOverride == newValue) + return; + + ProcessShaderGUIField(newValue); + valueChangedCallback(m_ShaderGUIOverrideInfo); + AddWarningIfNeeded(m_ShaderGUIOverrideInfo); + }, + m_ShaderGUIOverrideInfo.ShaderGUIOverride, + "ShaderGUI", + out var propertyTextField + )); + + // Reset to default if the value is ever set to null and override is enabled + if (string.IsNullOrEmpty(storedValue)) + { + m_ShaderGUIOverrideInfo.ShaderGUIOverride = preferredGUI; + } + + var textField = (TextField) propertyTextField; + textField.value = m_ShaderGUIOverrideInfo.ShaderGUIOverride; + shaderGUIOverrideField = textField; + textField.isDelayed = true; + } + else + { + // Upon disable, set the value back to null (for pipeline switching reasons, among other reasons) + if (storedValue == preferredGUI) + { + m_ShaderGUIOverrideInfo.ShaderGUIOverride = null; + valueChangedCallback(m_ShaderGUIOverrideInfo); + AddWarningIfNeeded(m_ShaderGUIOverrideInfo); + } + } + + propertySheet.styleSheets.Add(Resources.Load("Styles/PropertyRow")); + return propertySheet; + } + + void ProcessShaderGUIField(string newValue) + { + string sanitizedInput = Regex.Replace(newValue, @"(?:[^A-Za-z0-9._])|(?:\s)", ""); + if (HasPreferredGUI() && string.IsNullOrEmpty(sanitizedInput)) + { + var defaultGUI = GraphUtil.CurrentPipelinePreferredShaderGUI(m_MasterNode as IMasterNode); + m_ShaderGUIOverrideInfo.ShaderGUIOverride = defaultGUI; + } + else + { + m_ShaderGUIOverrideInfo.ShaderGUIOverride = sanitizedInput; + } + } + + public Action inspectorUpdateDelegate { get; set; } + + public VisualElement DrawProperty(PropertyInfo propertyInfo, object actualObject, Inspectable attribute) + { + return this.CreateGUI( + // Use the setter from the provided property as the callback + newValue => propertyInfo.GetSetMethod(true).Invoke(actualObject, new object[] {newValue}), + (ShaderGUIOverrideInfo) propertyInfo.GetValue(actualObject), + out var textArrayField); + } + + // Add a warning to the node if the ShaderGUI is not found by Unity. + private void AddWarningIfNeeded(ShaderGUIOverrideInfo shaderGuiOverrideInfo) + { + if (shaderGuiOverrideInfo.OverrideEnabled && shaderGuiOverrideInfo.ShaderGUIOverride != null && !ValidCustomEditorType(shaderGuiOverrideInfo.ShaderGUIOverride)) + { + m_MasterNode.owner.messageManager?.ClearNodesFromProvider(m_MasterNode, m_MasterNode.ToEnumerable()); + m_MasterNode.owner.messageManager?.AddOrAppendError(m_MasterNode, m_MasterNode.guid, + new ShaderMessage(string.Format(k_InvalidShaderGUI, shaderGuiOverrideInfo.ShaderGUIOverride), ShaderCompilerMessageSeverity.Warning)); + } + else + { + m_MasterNode.owner.messageManager?.ClearNodesFromProvider(m_MasterNode, m_MasterNode.ToEnumerable()); + } + } + + // Matches what trunk does to extract CustomEditors (Editor/Mono/Inspector/ShaderGUI.cs: ExtractCustomEditorType) + private bool ValidCustomEditorType(string customEditorName) + { + if (string.IsNullOrEmpty(customEditorName)) + { + if (HasPreferredGUI()) + { + return false; + } + return true; // No default, so this is valid. + } + + var unityEditorFullName = $"UnityEditor.{customEditorName}"; // For convenience: adding UnityEditor namespace is not needed in the shader + foreach (var type in TypeCache.GetTypesDerivedFrom()) + { + if (type.FullName.Equals(customEditorName, StringComparison.Ordinal) || type.FullName.Equals(unityEditorFullName, StringComparison.Ordinal)) + { + return typeof(ShaderGUI).IsAssignableFrom(type); + } + } + return false; + } + + private bool HasPreferredGUI() + { + return !string.IsNullOrEmpty(GraphUtil.CurrentPipelinePreferredShaderGUI(m_MasterNode as IMasterNode)); + } + } } diff --git a/com.unity.shadergraph/Editor/Data/Interfaces/IInspectable.cs b/com.unity.shadergraph/Editor/Data/Interfaces/IInspectable.cs new file mode 100644 index 00000000000..e7c2df78793 --- /dev/null +++ b/com.unity.shadergraph/Editor/Data/Interfaces/IInspectable.cs @@ -0,0 +1,39 @@ +using System; +using System.Reflection; +using Drawing.Inspector; +using UnityEngine.UIElements; + +namespace UnityEditor.ShaderGraph.Drawing +{ + [AttributeUsage(AttributeTargets.Property)] + public class Inspectable : Attribute + { + // String value to use in the Property name TextLabel + public string labelName { get; private set; } + + // The default value of this property + public object defaultValue { get; private set; } + + // String value to supply if you wish to use a custom style when drawing this property + public string customStyleName { get; private set; } + + public Inspectable(string labelName, object defaultValue, string customStyleName = "") + { + this.labelName = labelName; + this.defaultValue = defaultValue; + this.customStyleName = customStyleName; + } + } + + interface IInspectable + { + string displayName { get; } + object GetObjectToInspect(); + + PropertyInfo[] GetPropertyInfo(); + + // Used to provide any data needed by the property drawer from the inspectable + // The inspectorUpdateDelegate is used to trigger an inspector update + void SupplyDataToPropertyDrawer(IPropertyDrawer propertyDrawer, Action inspectorUpdateDelegate); + } +} diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Fabric/ShaderGraph/FabricSettingsView.cs.meta b/com.unity.shadergraph/Editor/Data/Interfaces/IInspectable.cs.meta similarity index 83% rename from com.unity.render-pipelines.high-definition/Editor/Material/Fabric/ShaderGraph/FabricSettingsView.cs.meta rename to com.unity.shadergraph/Editor/Data/Interfaces/IInspectable.cs.meta index 33bf72a5e24..4d35ab2c784 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/Fabric/ShaderGraph/FabricSettingsView.cs.meta +++ b/com.unity.shadergraph/Editor/Data/Interfaces/IInspectable.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: dbe8d40ff0e92474a8f400bfad8310bc +guid: 52cd086fd60734d89b34f49bd73e7510 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/com.unity.shadergraph/Editor/Data/MasterNodes/PBRMasterNode.cs b/com.unity.shadergraph/Editor/Data/MasterNodes/PBRMasterNode.cs index 7616842492e..e8658171111 100644 --- a/com.unity.shadergraph/Editor/Data/MasterNodes/PBRMasterNode.cs +++ b/com.unity.shadergraph/Editor/Data/MasterNodes/PBRMasterNode.cs @@ -12,7 +12,7 @@ namespace UnityEditor.ShaderGraph { [Serializable] [Title("Master", "PBR")] - class PBRMasterNode : AbstractMaterialNode, IMasterNode, IHasSettings, ICanChangeShaderGUI, IMayRequirePosition, IMayRequireNormal, IMayRequireTangent + class PBRMasterNode : AbstractMaterialNode, IMasterNode, ICanChangeShaderGUI, IMayRequirePosition, IMayRequireNormal, IMayRequireTangent { public const string AlbedoSlotName = "Albedo"; public const string NormalSlotName = "Normal"; @@ -49,6 +49,7 @@ public enum Model [SerializeField] Model m_Model = Model.Metallic; + [Inspectable("Workflow", PBRMasterNode.Model.Metallic)] public Model model { get { return m_Model; } @@ -57,6 +58,7 @@ public Model model if (m_Model == value) return; + this.owner.owner.RegisterCompleteObjectUndo("Work Flow Change"); m_Model = value; UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Topological); @@ -66,6 +68,7 @@ public Model model [SerializeField] SurfaceType m_SurfaceType; + [Inspectable("Surface", SurfaceType.Opaque)] public SurfaceType surfaceType { get { return m_SurfaceType; } @@ -74,6 +77,7 @@ public SurfaceType surfaceType if (m_SurfaceType == value) return; + this.owner.owner.RegisterCompleteObjectUndo("Surface Change"); m_SurfaceType = value; Dirty(ModificationScope.Graph); } @@ -82,6 +86,7 @@ public SurfaceType surfaceType [SerializeField] AlphaMode m_AlphaMode; + [Inspectable("Blend", AlphaMode.Additive)] public AlphaMode alphaMode { get { return m_AlphaMode; } @@ -90,6 +95,7 @@ public AlphaMode alphaMode if (m_AlphaMode == value) return; + this.owner.owner.RegisterCompleteObjectUndo("Alpha Mode Change"); m_AlphaMode = value; Dirty(ModificationScope.Graph); } @@ -98,6 +104,7 @@ public AlphaMode alphaMode [SerializeField] bool m_TwoSided; + [Inspectable("Two Sided", false)] public ToggleData twoSided { get { return new ToggleData(m_TwoSided); } @@ -105,13 +112,23 @@ public ToggleData twoSided { if (m_TwoSided == value.isOn) return; + + this.owner.owner.RegisterCompleteObjectUndo("Two Sided Change"); m_TwoSided = value.isOn; Dirty(ModificationScope.Graph); } } + void ChangeTwoSided(ChangeEvent evt) + { + ToggleData td = this.twoSided; + td.isOn = evt.newValue; + this.twoSided = td; + } + [SerializeField] NormalDropOffSpace m_NormalDropOffSpace; + [Inspectable("Fragment Normal Space", NormalDropOffSpace.Tangent)] public NormalDropOffSpace normalDropOffSpace { get { return m_NormalDropOffSpace; } @@ -145,18 +162,41 @@ public ToggleData dotsInstancing } } + // This property exists to expose shaderGUI Override info. to the inspector + [Inspectable("ShaderGUI", null)] + public ShaderGUIOverrideInfo ShaderGUIInfo + { + get => new ShaderGUIOverrideInfo(this.OverrideEnabled, this.ShaderGUIOverride); + set + { + this.ShaderGUIOverride = value.ShaderGUIOverride; + this.OverrideEnabled = value.OverrideEnabled; + } + } + [SerializeField] private string m_ShaderGUIOverride; + public string ShaderGUIOverride { get => m_ShaderGUIOverride; - set => m_ShaderGUIOverride = value; + set + { + this.owner.owner.RegisterCompleteObjectUndo("Changed ShaderGUI Field"); + m_ShaderGUIOverride = value; + Dirty(ModificationScope.Graph); + } } [SerializeField] private bool m_OverrideEnabled; + public bool OverrideEnabled { get => m_OverrideEnabled; - set => m_OverrideEnabled = value; + set + { + this.owner.owner.RegisterCompleteObjectUndo("Changed ShaderGUI Override Enabled"); + m_OverrideEnabled = value; + } } public PBRMasterNode() @@ -164,7 +204,6 @@ public PBRMasterNode() UpdateNodeAfterDeserialization(); } - public sealed override void UpdateNodeAfterDeserialization() { base.UpdateNodeAfterDeserialization(); @@ -222,11 +261,6 @@ public sealed override void UpdateNodeAfterDeserialization() }, true); } - public VisualElement CreateSettingsElement() - { - return new PBRSettingsView(this); - } - public string renderQueueTag { get diff --git a/com.unity.shadergraph/Editor/Data/MasterNodes/UnlitMasterNode.cs b/com.unity.shadergraph/Editor/Data/MasterNodes/UnlitMasterNode.cs index 4ce5d080ffb..d74e6732125 100644 --- a/com.unity.shadergraph/Editor/Data/MasterNodes/UnlitMasterNode.cs +++ b/com.unity.shadergraph/Editor/Data/MasterNodes/UnlitMasterNode.cs @@ -12,7 +12,7 @@ namespace UnityEditor.ShaderGraph { [Serializable] [Title("Master", "Unlit")] - class UnlitMasterNode : AbstractMaterialNode, IMasterNode, IHasSettings, ICanChangeShaderGUI, IMayRequirePosition, IMayRequireNormal, IMayRequireTangent + class UnlitMasterNode : AbstractMaterialNode, IMasterNode, ICanChangeShaderGUI, IMayRequirePosition, IMayRequireNormal, IMayRequireTangent { public const string ColorSlotName = "Color"; public const string AlphaSlotName = "Alpha"; @@ -31,6 +31,7 @@ class UnlitMasterNode : AbstractMaterialNode, IMasterNode, IHasSettings, ICanCha [SerializeField] SurfaceType m_SurfaceType; + [Inspectable("Surface", SurfaceType.Opaque)] public SurfaceType surfaceType { get { return m_SurfaceType; } @@ -47,6 +48,7 @@ public SurfaceType surfaceType [SerializeField] AlphaMode m_AlphaMode; + [Inspectable("Blend", AlphaMode.Additive)] public AlphaMode alphaMode { get { return m_AlphaMode; } @@ -63,6 +65,7 @@ public AlphaMode alphaMode [SerializeField] bool m_TwoSided; + [Inspectable("Two Sided", false)] public ToggleData twoSided { get { return new ToggleData(m_TwoSided); } @@ -106,6 +109,18 @@ public ToggleData dotsInstancing } } + // This property exists to expose shaderGUI Override info. to the inspector + [Inspectable("ShaderGUI", null)] + public ShaderGUIOverrideInfo ShaderGUIInfo + { + get => new ShaderGUIOverrideInfo(this.OverrideEnabled, this.ShaderGUIOverride); + set + { + this.ShaderGUIOverride = value.ShaderGUIOverride; + this.OverrideEnabled = value.OverrideEnabled; + } + } + [SerializeField] private string m_ShaderGUIOverride; public string ShaderGUIOverride { @@ -151,11 +166,6 @@ public sealed override void UpdateNodeAfterDeserialization() }); } - public VisualElement CreateSettingsElement() - { - return new UnlitSettingsView(this); - } - public string renderQueueTag { get diff --git a/com.unity.shadergraph/Editor/Drawing/Blackboard/BlackboardFieldKeywordView.cs b/com.unity.shadergraph/Editor/Drawing/Blackboard/BlackboardFieldKeywordView.cs deleted file mode 100644 index a5df43bffd1..00000000000 --- a/com.unity.shadergraph/Editor/Drawing/Blackboard/BlackboardFieldKeywordView.cs +++ /dev/null @@ -1,287 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text.RegularExpressions; -using System.Globalization; -using UnityEditor.Graphing; -using UnityEditor.Graphing.Util; -using UnityEngine; -using UnityEditor.UIElements; -using UnityEngine.UIElements; -using Toggle = UnityEngine.UIElements.Toggle; -using UnityEditor.Experimental.GraphView; -using UnityEditorInternal; -using UnityEditor.ShaderGraph.Internal; - -namespace UnityEditor.ShaderGraph.Drawing -{ - class BlackboardFieldKeywordView : BlackboardFieldView - { - private ReorderableList m_ReorderableList; - private IMGUIContainer m_Container; - private int m_SelectedIndex; - private ShaderKeyword m_Keyword; - - public BlackboardFieldKeywordView(BlackboardField blackboardField, GraphData graph, ShaderInput input) - : base (blackboardField, graph, input) - { - } - - public override void BuildCustomFields(ShaderInput input) - { - m_Keyword = input as ShaderKeyword; - if(m_Keyword == null) - return; - - // KeywordDefinition - var keywordDefinitionField = new EnumField((Enum)m_Keyword.keywordDefinition); - keywordDefinitionField.RegisterValueChangedCallback(evt => - { - graph.owner.RegisterCompleteObjectUndo("Change Keyword Type"); - if (m_Keyword.keywordDefinition == (KeywordDefinition)evt.newValue) - return; - m_Keyword.keywordDefinition = (KeywordDefinition)evt.newValue; - Rebuild(); - }); - AddRow("Definition", keywordDefinitionField, !m_Keyword.isBuiltIn); - - // KeywordScope - if(m_Keyword.keywordDefinition != KeywordDefinition.Predefined) - { - var keywordScopeField = new EnumField((Enum)m_Keyword.keywordScope); - keywordScopeField.RegisterValueChangedCallback(evt => - { - graph.owner.RegisterCompleteObjectUndo("Change Keyword Type"); - if (m_Keyword.keywordScope == (KeywordScope)evt.newValue) - return; - m_Keyword.keywordScope = (KeywordScope)evt.newValue; - }); - AddRow("Scope", keywordScopeField, !m_Keyword.isBuiltIn); - } - - switch(m_Keyword.keywordType) - { - case KeywordType.Boolean: - BuildBooleanKeywordField(m_Keyword); - break; - case KeywordType.Enum: - BuildEnumKeywordField(m_Keyword); - break; - default: - throw new ArgumentOutOfRangeException(); - } - } - - void BuildBooleanKeywordField(ShaderKeyword keyword) - { - // Default field - var field = new Toggle() { value = keyword.value == 1 }; - field.OnToggleChanged(evt => - { - graph.owner.RegisterCompleteObjectUndo("Change property value"); - keyword.value = evt.newValue ? 1 : 0; - DirtyNodes(ModificationScope.Graph); - }); - AddRow("Default", field); - } - - void BuildEnumKeywordField(ShaderKeyword keyword) - { - // Clamp value between entry list - int value = Mathf.Clamp(keyword.value, 0, keyword.entries.Count - 1); - - // Default field - var field = new PopupField(keyword.entries.Select(x => x.displayName).ToList(), value); - field.RegisterValueChangedCallback(evt => - { - graph.owner.RegisterCompleteObjectUndo("Change Keyword Value"); - keyword.value = field.index; - DirtyNodes(ModificationScope.Graph); - }); - AddRow("Default", field); - - // Entries - m_Container = new IMGUIContainer(() => OnGUIHandler ()) { name = "ListContainer" }; - AddRow("Entries", m_Container, !keyword.isBuiltIn); - } - - public ShaderKeyword keyword => m_Keyword; - - private void OnGUIHandler() - { - if(m_ReorderableList == null) - { - RecreateList(); - AddCallbacks(); - } - - m_ReorderableList.index = m_SelectedIndex; - m_ReorderableList.DoLayoutList(); - } - - internal void RecreateList() - { - // Create reorderable list from entries - m_ReorderableList = new ReorderableList(m_Keyword.entries, typeof(KeywordEntry), true, true, true, true); - } - - private void AddCallbacks() - { - // Draw Header - m_ReorderableList.drawHeaderCallback = (Rect rect) => - { - int indent = 14; - var displayRect = new Rect(rect.x + indent, rect.y, (rect.width - indent) / 2, rect.height); - EditorGUI.LabelField(displayRect, "Display Name"); - var referenceRect = new Rect((rect.x + indent) + (rect.width - indent) / 2, rect.y, (rect.width - indent) / 2, rect.height); - EditorGUI.LabelField(referenceRect, "Reference Suffix"); - }; - - // Draw Element - m_ReorderableList.drawElementCallback = (Rect rect, int index, bool isActive, bool isFocused) => - { - KeywordEntry entry = ((KeywordEntry)m_ReorderableList.list[index]); - EditorGUI.BeginChangeCheck(); - - var displayName = EditorGUI.DelayedTextField( new Rect(rect.x, rect.y, rect.width / 2, EditorGUIUtility.singleLineHeight), entry.displayName, EditorStyles.label); - var referenceName = EditorGUI.DelayedTextField( new Rect(rect.x + rect.width / 2, rect.y, rect.width / 2, EditorGUIUtility.singleLineHeight), entry.referenceName, EditorStyles.label); - - displayName = GetDuplicateSafeDisplayName(entry.id, displayName); - referenceName = GetDuplicateSafeReferenceName(entry.id, referenceName.ToUpper()); - - if (EditorGUI.EndChangeCheck()) - { - m_Keyword.entries[index] = new KeywordEntry(entry.id, displayName, referenceName); - - DirtyNodes(); - Rebuild(); - } - }; - - // Element height - m_ReorderableList.elementHeightCallback = (int indexer) => - { - return m_ReorderableList.elementHeight; - }; - - // Can add - m_ReorderableList.onCanAddCallback = (ReorderableList list) => - { - return list.count < KeywordNode.k_MaxEnumEntries; - }; - - // Can remove - m_ReorderableList.onCanRemoveCallback = (ReorderableList list) => - { - return list.count > KeywordNode.k_MinEnumEntries; - }; - - // Add callback delegates - m_ReorderableList.onSelectCallback += SelectEntry; - m_ReorderableList.onAddCallback += AddEntry; - m_ReorderableList.onRemoveCallback += RemoveEntry; - m_ReorderableList.onReorderCallback += ReorderEntries; - } - - private void SelectEntry(ReorderableList list) - { - m_SelectedIndex = list.index; - } - - private void AddEntry(ReorderableList list) - { - graph.owner.RegisterCompleteObjectUndo("Add Keyword Entry"); - - int index = GetFirstUnusedID(); - if (index <= 0) - return; // Error has already occured, don't attempt to add this entry. - - var displayName = GetDuplicateSafeDisplayName(index, "New"); - var referenceName = GetDuplicateSafeReferenceName(index, "NEW"); - - // Add new entry - m_Keyword.entries.Add(new KeywordEntry(index, displayName, referenceName)); - - // Update Blackboard & Nodes - DirtyNodes(); - Rebuild(); - graph.OnKeywordChanged(); - m_SelectedIndex = list.list.Count - 1; - } - - // Allowed indicies are 1-MAX_ENUM_ENTRIES - private int GetFirstUnusedID() - { - List ususedIDs = new List(); - - foreach (KeywordEntry keywordEntry in m_Keyword.entries) - { - ususedIDs.Add(keywordEntry.id); - } - - for (int x = 1; x <= KeywordNode.k_MaxEnumEntries; x++) - { - if (!ususedIDs.Contains(x)) - return x; - } - - Debug.LogError("GetFirstUnusedID: Attempting to get unused ID when all IDs are used."); - return -1; - } - - private void RemoveEntry(ReorderableList list) - { - graph.owner.RegisterCompleteObjectUndo("Remove Keyword Entry"); - - // Remove entry - m_SelectedIndex = list.index; - var selectedEntry = (KeywordEntry)m_ReorderableList.list[list.index]; - m_Keyword.entries.Remove(selectedEntry); - - // Clamp value within new entry range - int value = Mathf.Clamp(m_Keyword.value, 0, m_Keyword.entries.Count - 1); - m_Keyword.value = value; - - // Update Blackboard & Nodes - DirtyNodes(); - Rebuild(); - graph.OnKeywordChanged(); - m_SelectedIndex = m_SelectedIndex >= list.list.Count - 1 ? list.list.Count - 1 : m_SelectedIndex; - } - - private void ReorderEntries(ReorderableList list) - { - DirtyNodes(); - } - - public string GetDuplicateSafeDisplayName(int id, string name) - { - name = name.Trim(); - var entryList = m_ReorderableList.list as List; - return GraphUtil.SanitizeName(entryList.Where(p => p.id != id).Select(p => p.displayName), "{0} ({1})", name); - } - - public string GetDuplicateSafeReferenceName(int id, string name) - { - name = name.Trim(); - name = Regex.Replace(name, @"(?:[^A-Za-z_0-9])|(?:\s)", "_"); - var entryList = m_ReorderableList.list as List; - return GraphUtil.SanitizeName(entryList.Where(p => p.id != id).Select(p => p.referenceName), "{0}_{1}", name); - } - - public override void DirtyNodes(ModificationScope modificationScope = ModificationScope.Node) - { - foreach (var node in graph.GetNodes()) - { - node.UpdateNode(); - node.Dirty(modificationScope); - } - - // Cant determine if Sub Graphs contain the keyword so just update them - foreach (var node in graph.GetNodes()) - { - node.Dirty(modificationScope); - } - } - } -} diff --git a/com.unity.shadergraph/Editor/Drawing/Blackboard/BlackboardFieldKeywordView.cs.meta b/com.unity.shadergraph/Editor/Drawing/Blackboard/BlackboardFieldKeywordView.cs.meta deleted file mode 100644 index 36dd8326f4f..00000000000 --- a/com.unity.shadergraph/Editor/Drawing/Blackboard/BlackboardFieldKeywordView.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 760efc4b9b9e58d4bb8ab27436fcf9e5 -timeCreated: 1516704904 \ No newline at end of file diff --git a/com.unity.shadergraph/Editor/Drawing/Blackboard/BlackboardFieldPropertyView.cs b/com.unity.shadergraph/Editor/Drawing/Blackboard/BlackboardFieldPropertyView.cs deleted file mode 100644 index 3ec1dab5322..00000000000 --- a/com.unity.shadergraph/Editor/Drawing/Blackboard/BlackboardFieldPropertyView.cs +++ /dev/null @@ -1,707 +0,0 @@ -using System; -using System.Linq; -using System.Globalization; -using UnityEditor.Graphing; -using UnityEditor.Graphing.Util; -using UnityEngine; -using UnityEditor.UIElements; -using UnityEngine.UIElements; -using Toggle = UnityEngine.UIElements.Toggle; -using UnityEditor.Experimental.GraphView; -using UnityEditor.ShaderGraph.Internal; - -namespace UnityEditor.ShaderGraph.Drawing -{ - class BlackboardFieldPropertyView : BlackboardFieldView - { - public BlackboardFieldPropertyView(BlackboardField blackboardField, GraphData graph, ShaderInput input) - : base (blackboardField, graph, input) - { - } - - public override void BuildCustomFields(ShaderInput input) - { - AbstractShaderProperty property = input as AbstractShaderProperty; - if(property == null) - return; - - switch(input) - { - case Vector1ShaderProperty vector1Property: - BuildVector1PropertyField(vector1Property); - break; - case Vector2ShaderProperty vector2Property: - BuildVector2PropertyField(vector2Property); - break; - case Vector3ShaderProperty vector3Property: - BuildVector3PropertyField(vector3Property); - break; - case Vector4ShaderProperty vector4Property: - BuildVector4PropertyField(vector4Property); - break; - case ColorShaderProperty colorProperty: - BuildColorPropertyField(colorProperty); - break; - case Texture2DShaderProperty texture2DProperty: - BuildTexture2DPropertyField(texture2DProperty); - break; - case Texture2DArrayShaderProperty texture2DArrayProperty: - BuildTexture2DArrayPropertyField(texture2DArrayProperty); - break; - case Texture3DShaderProperty texture3DProperty: - BuildTexture3DPropertyField(texture3DProperty); - break; - case CubemapShaderProperty cubemapProperty: - BuildCubemapPropertyField(cubemapProperty); - break; - case BooleanShaderProperty booleanProperty: - BuildBooleanPropertyField(booleanProperty); - break; - case Matrix2ShaderProperty matrix2Property: - BuildMatrix2PropertyField(matrix2Property); - break; - case Matrix3ShaderProperty matrix3Property: - BuildMatrix3PropertyField(matrix3Property); - break; - case Matrix4ShaderProperty matrix4Property: - BuildMatrix4PropertyField(matrix4Property); - break; - case SamplerStateShaderProperty samplerStateProperty: - BuildSamplerStatePropertyField(samplerStateProperty); - break; - case GradientShaderProperty gradientProperty: - BuildGradientPropertyField(gradientProperty); - break; - default: - throw new ArgumentOutOfRangeException(); - } - - // Precision - var precisionField = new EnumField((Enum)property.precision); - precisionField.RegisterValueChangedCallback(evt => - { - graph.owner.RegisterCompleteObjectUndo("Change Precision"); - if (property.precision == (Precision)evt.newValue) - return; - - property.precision = (Precision)evt.newValue; - graph.ValidateGraph(); - precisionField.MarkDirtyRepaint(); - DirtyNodes(); - }); - AddRow("Precision", precisionField); - if (property.isGpuInstanceable) - { - Toggle gpuInstancedToogle = new Toggle { value = property.gpuInstanced }; - gpuInstancedToogle.OnToggleChanged(evt => - { - graph.owner.RegisterCompleteObjectUndo("Change Hybrid Instanced Toggle"); - property.gpuInstanced = evt.newValue; - DirtyNodes(ModificationScope.Graph); - }); - AddRow("Hybrid Instanced (experimental)", gpuInstancedToogle); - } - - } - - void BuildVector1PropertyField(Vector1ShaderProperty property) - { - switch (property.floatType) - { - case FloatType.Slider: - { - float min = Mathf.Min(property.value, property.rangeValues.x); - float max = Mathf.Max(property.value, property.rangeValues.y); - property.rangeValues = new Vector2(min, max); - - var defaultField = new FloatField { value = property.value }; - var minField = new FloatField { value = property.rangeValues.x }; - var maxField = new FloatField { value = property.rangeValues.y }; - - defaultField.RegisterValueChangedCallback(evt => - { - property.value = (float)evt.newValue; - this.MarkDirtyRepaint(); - }); - defaultField.Q("unity-text-input").RegisterCallback(evt => - { - graph.owner.RegisterCompleteObjectUndo("Change Property Value"); - float minValue = Mathf.Min(property.value, property.rangeValues.x); - float maxValue = Mathf.Max(property.value, property.rangeValues.y); - property.rangeValues = new Vector2(minValue, maxValue); - minField.value = minValue; - maxField.value = maxValue; - DirtyNodes(); - }); - minField.RegisterValueChangedCallback(evt => - { - graph.owner.RegisterCompleteObjectUndo("Change Range Property Minimum"); - property.rangeValues = new Vector2((float)evt.newValue, property.rangeValues.y); - DirtyNodes(); - }); - minField.Q("unity-text-input").RegisterCallback(evt => - { - property.value = Mathf.Max(Mathf.Min(property.value, property.rangeValues.y), property.rangeValues.x); - defaultField.value = property.value; - DirtyNodes(); - }); - maxField.RegisterValueChangedCallback(evt => - { - graph.owner.RegisterCompleteObjectUndo("Change Range Property Maximum"); - property.rangeValues = new Vector2(property.rangeValues.x, (float)evt.newValue); - DirtyNodes(); - }); - maxField.Q("unity-text-input").RegisterCallback(evt => - { - property.value = Mathf.Max(Mathf.Min(property.value, property.rangeValues.y), property.rangeValues.x); - defaultField.value = property.value; - DirtyNodes(); - }); - - AddRow("Default", defaultField); - AddRow("Min", minField); - AddRow("Max", maxField); - } - break; - case FloatType.Integer: - { - property.value = (int)property.value; - var defaultField = new IntegerField { value = (int)property.value }; - defaultField.RegisterValueChangedCallback(evt => - { - graph.owner.RegisterCompleteObjectUndo("Change Property Value"); - property.value = (int)evt.newValue; - DirtyNodes(); - }); - AddRow("Default", defaultField); - } - break; - default: - { - var defaultField = new FloatField { value = property.value }; - defaultField.RegisterValueChangedCallback(evt => - { - graph.owner.RegisterCompleteObjectUndo("Change Property Value"); - property.value = (float)evt.newValue; - DirtyNodes(); - }); - AddRow("Default", defaultField); - } - break; - } - - if(!graph.isSubGraph) - { - var modeField = new EnumField(property.floatType); - modeField.RegisterValueChangedCallback(evt => - { - graph.owner.RegisterCompleteObjectUndo("Change Vector1 Mode"); - property.floatType = (FloatType)evt.newValue; - Rebuild(); - }); - AddRow("Mode", modeField); - } - } - - void BuildVector2PropertyField(Vector2ShaderProperty property) - { - var field = new Vector2Field { value = property.value }; - - field.Q("unity-x-input").Q("unity-text-input").RegisterCallback(keyDownCallback); - field.Q("unity-x-input").Q("unity-text-input").RegisterCallback(focusOutCallback); - field.Q("unity-y-input").Q("unity-text-input").RegisterCallback(keyDownCallback); - field.Q("unity-y-input").Q("unity-text-input").RegisterCallback(focusOutCallback); - - // Called after KeyDownEvent - field.RegisterValueChangedCallback(evt => - { - // Only true when setting value via FieldMouseDragger - // Undo recorded once per dragger release - if (undoGroup == -1) - graph.owner.RegisterCompleteObjectUndo("Change property value"); - - property.value = evt.newValue; - DirtyNodes(); - }); - AddRow("Default", field); - } - - void BuildVector3PropertyField(Vector3ShaderProperty property) - { - var field = new Vector3Field { value = property.value }; - - field.Q("unity-x-input").Q("unity-text-input").RegisterCallback(keyDownCallback); - field.Q("unity-x-input").Q("unity-text-input").RegisterCallback(focusOutCallback); - field.Q("unity-y-input").Q("unity-text-input").RegisterCallback(keyDownCallback); - field.Q("unity-y-input").Q("unity-text-input").RegisterCallback(focusOutCallback); - field.Q("unity-z-input").Q("unity-text-input").RegisterCallback(keyDownCallback); - field.Q("unity-z-input").Q("unity-text-input").RegisterCallback(focusOutCallback); - - // Called after KeyDownEvent - field.RegisterValueChangedCallback(evt => - { - // Only true when setting value via FieldMouseDragger - // Undo recorded once per dragger release - if (undoGroup == -1) - graph.owner.RegisterCompleteObjectUndo("Change property value"); - - property.value = evt.newValue; - DirtyNodes(); - }); - AddRow("Default", field); - } - - void BuildVector4PropertyField(Vector4ShaderProperty property) - { - var field = new Vector4Field { value = property.value }; - - field.Q("unity-x-input").Q("unity-text-input").RegisterCallback(keyDownCallback); - field.Q("unity-x-input").Q("unity-text-input").RegisterCallback(focusOutCallback); - field.Q("unity-y-input").Q("unity-text-input").RegisterCallback(keyDownCallback); - field.Q("unity-y-input").Q("unity-text-input").RegisterCallback(focusOutCallback); - field.Q("unity-z-input").Q("unity-text-input").RegisterCallback(keyDownCallback); - field.Q("unity-z-input").Q("unity-text-input").RegisterCallback(focusOutCallback); - field.Q("unity-w-input").Q("unity-text-input").RegisterCallback(keyDownCallback); - field.Q("unity-w-input").Q("unity-text-input").RegisterCallback(focusOutCallback); - - // Called after KeyDownEvent - field.RegisterValueChangedCallback(evt => - { - // Only true when setting value via FieldMouseDragger - // Undo recorded once per dragger release - if (undoGroup == -1) - graph.owner.RegisterCompleteObjectUndo("Change property value"); - - property.value = evt.newValue; - DirtyNodes(); - }); - AddRow("Default", field); - } - - void BuildColorPropertyField(ColorShaderProperty property) - { - var colorField = new ColorField { value = property.value, showEyeDropper = false, hdr = property.colorMode == ColorMode.HDR }; - colorField.RegisterValueChangedCallback(evt => - { - graph.owner.RegisterCompleteObjectUndo("Change property value"); - property.value = evt.newValue; - DirtyNodes(); - }); - AddRow("Default", colorField); - - if(!graph.isSubGraph) - { - var colorModeField = new EnumField((Enum)property.colorMode); - colorModeField.RegisterValueChangedCallback(evt => - { - graph.owner.RegisterCompleteObjectUndo("Change Color Mode"); - if (property.colorMode == (ColorMode)evt.newValue) - return; - property.colorMode = (ColorMode)evt.newValue; - colorField.hdr = property.colorMode == ColorMode.HDR; - colorField.MarkDirtyRepaint(); - DirtyNodes(); - }); - AddRow("Mode", colorModeField); - } - } - - void BuildTexture2DPropertyField(Texture2DShaderProperty property) - { - var field = new ObjectField { value = property.value.texture, objectType = typeof(Texture) }; - field.RegisterValueChangedCallback(evt => - { - graph.owner.RegisterCompleteObjectUndo("Change property value"); - property.value.texture = (Texture)evt.newValue; - DirtyNodes(); - }); - AddRow("Default", field); - - var defaultMode = (Enum)Texture2DShaderProperty.DefaultType.Grey; - var textureMode = property.generatePropertyBlock ? (Enum)property.defaultType : defaultMode; - var defaultModeField = new EnumField(textureMode); - defaultModeField.RegisterValueChangedCallback(evt => - { - graph.owner.RegisterCompleteObjectUndo("Change Texture Mode"); - if (property.defaultType == (Texture2DShaderProperty.DefaultType)evt.newValue) - return; - property.defaultType = (Texture2DShaderProperty.DefaultType)evt.newValue; - DirtyNodes(ModificationScope.Graph); - }); - AddRow("Mode", defaultModeField, !graph.isSubGraph && property.generatePropertyBlock); - } - - void BuildTexture2DArrayPropertyField(Texture2DArrayShaderProperty property) - { - var field = new ObjectField { value = property.value.textureArray, objectType = typeof(Texture2DArray) }; - field.RegisterValueChangedCallback(evt => - { - graph.owner.RegisterCompleteObjectUndo("Change property value"); - property.value.textureArray = (Texture2DArray)evt.newValue; - DirtyNodes(); - }); - AddRow("Default", field); - } - - void BuildTexture3DPropertyField(Texture3DShaderProperty property) - { - var field = new ObjectField { value = property.value.texture, objectType = typeof(Texture3D) }; - field.RegisterValueChangedCallback(evt => - { - graph.owner.RegisterCompleteObjectUndo("Change property value"); - property.value.texture = (Texture3D)evt.newValue; - DirtyNodes(); - }); - AddRow("Default", field); - } - - void BuildCubemapPropertyField(CubemapShaderProperty property) - { - var field = new ObjectField { value = property.value.cubemap, objectType = typeof(Cubemap) }; - field.RegisterValueChangedCallback(evt => - { - graph.owner.RegisterCompleteObjectUndo("Change property value"); - property.value.cubemap = (Cubemap)evt.newValue; - DirtyNodes(); - }); - AddRow("Default", field); - } - - void BuildBooleanPropertyField(BooleanShaderProperty property) - { - var field = new Toggle() { value = property.value }; - field.OnToggleChanged(evt => - { - graph.owner.RegisterCompleteObjectUndo("Change property value"); - property.value = evt.newValue; - DirtyNodes(); - }); - AddRow("Default", field); - } - - void BuildMatrix2PropertyField(Matrix2ShaderProperty property) - { - var row0Field = new Vector2Field { value = property.value.GetRow(0) }; - row0Field.RegisterValueChangedCallback(evt => - { - graph.owner.RegisterCompleteObjectUndo("Change Property Value"); - Vector2 row1 = property.value.GetRow(1); - property.value = new Matrix4x4() - { - m00 = evt.newValue.x, - m01 = evt.newValue.y, - m02 = 0, - m03 = 0, - m10 = row1.x, - m11 = row1.y, - m12 = 0, - m13 = 0, - m20 = 0, - m21 = 0, - m22 = 0, - m23 = 0, - m30 = 0, - m31 = 0, - m32 = 0, - m33 = 0, - }; - DirtyNodes(); - }); - AddRow("Default", row0Field); - - var row1Field = new Vector2Field { value = property.value.GetRow(1) }; - row1Field.RegisterValueChangedCallback(evt => - { - graph.owner.RegisterCompleteObjectUndo("Change Property Value"); - Vector2 row0 = property.value.GetRow(0); - property.value = new Matrix4x4() - { - m00 = row0.x, - m01 = row0.y, - m02 = 0, - m03 = 0, - m10 = evt.newValue.x, - m11 = evt.newValue.y, - m12 = 0, - m13 = 0, - m20 = 0, - m21 = 0, - m22 = 0, - m23 = 0, - m30 = 0, - m31 = 0, - m32 = 0, - m33 = 0, - }; - DirtyNodes(); - }); - AddRow("", row1Field); - } - - void BuildMatrix3PropertyField(Matrix3ShaderProperty property) - { - var row0Field = new Vector3Field { value = property.value.GetRow(0) }; - row0Field.RegisterValueChangedCallback(evt => - { - graph.owner.RegisterCompleteObjectUndo("Change Property Value"); - Vector3 row1 = property.value.GetRow(1); - Vector3 row2 = property.value.GetRow(2); - property.value = new Matrix4x4() - { - m00 = evt.newValue.x, - m01 = evt.newValue.y, - m02 = evt.newValue.z, - m03 = 0, - m10 = row1.x, - m11 = row1.y, - m12 = row1.z, - m13 = 0, - m20 = row2.x, - m21 = row2.y, - m22 = row2.z, - m23 = 0, - m30 = 0, - m31 = 0, - m32 = 0, - m33 = 0, - }; - DirtyNodes(); - }); - AddRow("Default", row0Field); - - var row1Field = new Vector3Field { value = property.value.GetRow(1) }; - row1Field.RegisterValueChangedCallback(evt => - { - graph.owner.RegisterCompleteObjectUndo("Change Property Value"); - Vector3 row0 = property.value.GetRow(0); - Vector3 row2 = property.value.GetRow(2); - property.value = new Matrix4x4() - { - m00 = row0.x, - m01 = row0.y, - m02 = row0.z, - m03 = 0, - m10 = evt.newValue.x, - m11 = evt.newValue.y, - m12 = evt.newValue.z, - m13 = 0, - m20 = row2.x, - m21 = row2.y, - m22 = row2.z, - m23 = 0, - m30 = 0, - m31 = 0, - m32 = 0, - m33 = 0, - }; - DirtyNodes(); - }); - - AddRow("", row1Field); - var row2Field = new Vector3Field { value = property.value.GetRow(2) }; - row2Field.RegisterValueChangedCallback(evt => - { - graph.owner.RegisterCompleteObjectUndo("Change Property Value"); - Vector3 row0 = property.value.GetRow(0); - Vector3 row1 = property.value.GetRow(1); - property.value = new Matrix4x4() - { - m00 = row0.x, - m01 = row0.y, - m02 = row0.z, - m03 = 0, - m10 = row1.x, - m11 = row1.y, - m12 = row1.z, - m13 = 0, - m20 = evt.newValue.x, - m21 = evt.newValue.y, - m22 = evt.newValue.z, - m23 = 0, - m30 = 0, - m31 = 0, - m32 = 0, - m33 = 0, - }; - DirtyNodes(); - }); - AddRow("", row2Field); - } - - void BuildMatrix4PropertyField(Matrix4ShaderProperty property) - { - var row0Field = new Vector4Field { value = property.value.GetRow(0) }; - row0Field.RegisterValueChangedCallback(evt => - { - graph.owner.RegisterCompleteObjectUndo("Change Property Value"); - Vector4 row1 = property.value.GetRow(1); - Vector4 row2 = property.value.GetRow(2); - Vector4 row3 = property.value.GetRow(3); - property.value = new Matrix4x4() - { - m00 = evt.newValue.x, - m01 = evt.newValue.y, - m02 = evt.newValue.z, - m03 = evt.newValue.w, - m10 = row1.x, - m11 = row1.y, - m12 = row1.z, - m13 = row1.w, - m20 = row2.x, - m21 = row2.y, - m22 = row2.z, - m23 = row2.w, - m30 = row3.x, - m31 = row3.y, - m32 = row3.z, - m33 = row3.w, - }; - DirtyNodes(); - }); - AddRow("Default", row0Field); - - var row1Field = new Vector4Field { value = property.value.GetRow(1) }; - row1Field.RegisterValueChangedCallback(evt => - { - graph.owner.RegisterCompleteObjectUndo("Change Property Value"); - Vector4 row0 = property.value.GetRow(0); - Vector4 row2 = property.value.GetRow(2); - Vector4 row3 = property.value.GetRow(3); - property.value = new Matrix4x4() - { - m00 = row0.x, - m01 = row0.y, - m02 = row0.z, - m03 = row0.w, - m10 = evt.newValue.x, - m11 = evt.newValue.y, - m12 = evt.newValue.z, - m13 = evt.newValue.w, - m20 = row2.x, - m21 = row2.y, - m22 = row2.z, - m23 = row2.w, - m30 = row3.x, - m31 = row3.y, - m32 = row3.z, - m33 = row3.w, - }; - DirtyNodes(); - }); - AddRow("", row1Field); - - var row2Field = new Vector4Field { value = property.value.GetRow(2) }; - row2Field.RegisterValueChangedCallback(evt => - { - graph.owner.RegisterCompleteObjectUndo("Change Property Value"); - Vector4 row0 = property.value.GetRow(0); - Vector4 row1 = property.value.GetRow(1); - Vector4 row3 = property.value.GetRow(3); - property.value = new Matrix4x4() - { - m00 = row0.x, - m01 = row0.y, - m02 = row0.z, - m03 = row0.w, - m10 = row1.x, - m11 = row1.y, - m12 = row1.z, - m13 = row1.w, - m20 = evt.newValue.x, - m21 = evt.newValue.y, - m22 = evt.newValue.z, - m23 = evt.newValue.w, - m30 = row3.x, - m31 = row3.y, - m32 = row3.z, - m33 = row3.w, - }; - DirtyNodes(); - }); - AddRow("", row2Field); - - var row3Field = new Vector4Field { value = property.value.GetRow(3) }; - row3Field.RegisterValueChangedCallback(evt => - { - graph.owner.RegisterCompleteObjectUndo("Change Property Value"); - Vector4 row0 = property.value.GetRow(0); - Vector4 row1 = property.value.GetRow(1); - Vector4 row2 = property.value.GetRow(2); - property.value = new Matrix4x4() - { - m00 = row0.x, - m01 = row0.y, - m02 = row0.z, - m03 = row0.w, - m10 = row1.x, - m11 = row1.y, - m12 = row1.z, - m13 = row1.w, - m20 = row2.x, - m21 = row2.y, - m22 = row2.z, - m23 = row2.w, - m30 = evt.newValue.x, - m31 = evt.newValue.y, - m32 = evt.newValue.z, - m33 = evt.newValue.w, - }; - DirtyNodes(); - }); - AddRow("", row3Field); - } - - void BuildSamplerStatePropertyField(SamplerStateShaderProperty property) - { - var filterField = new EnumField(property.value.filter); - filterField.RegisterValueChangedCallback(evt => - { - graph.owner.RegisterCompleteObjectUndo("Change Property Value"); - TextureSamplerState state = property.value; - state.filter = (TextureSamplerState.FilterMode)evt.newValue; - property.value = state; - Rebuild(); - DirtyNodes(ModificationScope.Graph); - }); - AddRow("Filter", filterField); - - var wrapField = new EnumField(property.value.wrap); - wrapField.RegisterValueChangedCallback(evt => - { - graph.owner.RegisterCompleteObjectUndo("Change Property Value"); - TextureSamplerState state = property.value; - state.wrap = (TextureSamplerState.WrapMode)evt.newValue; - property.value = state; - Rebuild(); - DirtyNodes(ModificationScope.Graph); - }); - AddRow("Wrap", wrapField); - } - - void BuildGradientPropertyField(GradientShaderProperty property) - { - var field = new GradientField { value = property.value }; - field.RegisterValueChangedCallback(evt => - { - graph.owner.RegisterCompleteObjectUndo("Change Property Value"); - property.value = evt.newValue; - DirtyNodes(); - }); - AddRow("Default", field); - } - - public override void DirtyNodes(ModificationScope modificationScope = ModificationScope.Node) - { - var colorManager = GetFirstAncestorOfType().colorManager; - var nodes = GetFirstAncestorOfType().graphView.Query().ToList(); - - colorManager.SetNodesDirty(nodes); - colorManager.UpdateNodeViews(nodes); - - foreach (var node in graph.GetNodes()) - { - node.Dirty(modificationScope); - } - } - } -} diff --git a/com.unity.shadergraph/Editor/Drawing/Blackboard/BlackboardFieldPropertyView.cs.meta b/com.unity.shadergraph/Editor/Drawing/Blackboard/BlackboardFieldPropertyView.cs.meta deleted file mode 100644 index 58e2696eed0..00000000000 --- a/com.unity.shadergraph/Editor/Drawing/Blackboard/BlackboardFieldPropertyView.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: d71f7c86172344198783dacd26515c28 -timeCreated: 1516704904 \ No newline at end of file diff --git a/com.unity.shadergraph/Editor/Drawing/Blackboard/BlackboardFieldView.cs b/com.unity.shadergraph/Editor/Drawing/Blackboard/BlackboardFieldView.cs index 696c76aad82..8c370c200d3 100644 --- a/com.unity.shadergraph/Editor/Drawing/Blackboard/BlackboardFieldView.cs +++ b/com.unity.shadergraph/Editor/Drawing/Blackboard/BlackboardFieldView.cs @@ -1,126 +1,100 @@ using System; -using System.Collections.Generic; using System.Linq; +using System.Collections.Generic; +using System.Reflection; +using System.Text.RegularExpressions; +using Drawing.Inspector; using UnityEngine; using UnityEngine.UIElements; +using UnityEditor.UIElements; using UnityEditor.Graphing; using UnityEditor.Graphing.Util; using UnityEditor.Experimental.GraphView; using UnityEditor.ShaderGraph.Internal; +using UnityEditorInternal; namespace UnityEditor.ShaderGraph.Drawing { - abstract class BlackboardFieldView : VisualElement + class BlackboardFieldView : BlackboardField, IInspectable { - readonly BlackboardField m_BlackboardField; readonly GraphData m_Graph; public GraphData graph => m_Graph; ShaderInput m_Input; - Toggle m_ExposedToogle; - TextField m_ReferenceNameField; - List m_Rows; - public List rows => m_Rows; - - int m_UndoGroup = -1; - public int undoGroup => m_UndoGroup; + [Inspectable("Shader Input", null)] + public ShaderInput shaderInput => m_Input; static Type s_ContextualMenuManipulator = AppDomain.CurrentDomain.GetAssemblies().SelectMany(x => x.GetTypesOrNothing()).FirstOrDefault(t => t.FullName == "UnityEngine.UIElements.ContextualMenuManipulator"); - IManipulator m_ResetReferenceMenu; - EventCallback m_KeyDownCallback; - public EventCallback keyDownCallback => m_KeyDownCallback; - EventCallback m_FocusOutCallback; - public EventCallback focusOutCallback => m_FocusOutCallback; + // Common + IManipulator m_ResetReferenceMenu; - public BlackboardFieldView(BlackboardField blackboardField, GraphData graph, ShaderInput input) + private void DirtyNodes(ModificationScope modificationScope = ModificationScope.Node) { - styleSheets.Add(Resources.Load("Styles/ShaderGraphBlackboard")); - m_BlackboardField = blackboardField; - m_Graph = graph; - m_Input = input; - m_Rows = new List(); - - m_KeyDownCallback = new EventCallback(evt => - { - // Record Undo for input field edit - if (m_UndoGroup == -1) - { - m_UndoGroup = Undo.GetCurrentGroup(); - graph.owner.RegisterCompleteObjectUndo("Change property value"); - } - // Handle scaping input field edit - if (evt.keyCode == KeyCode.Escape && m_UndoGroup > -1) - { - Undo.RevertAllDownToGroup(m_UndoGroup); - m_UndoGroup = -1; - evt.StopPropagation(); - } - // Dont record Undo again until input field is unfocused - m_UndoGroup++; - this.MarkDirtyRepaint(); - }); - - m_FocusOutCallback = new EventCallback(evt => + switch(m_Input) { - // Reset UndoGroup when done editing input field - m_UndoGroup = -1; - }); - - BuildDefaultFields(input); - BuildCustomFields(input); - - AddToClassList("sgblackboardFieldView"); + case AbstractShaderProperty property: + var colorManager = GetFirstAncestorOfType().colorManager; + var nodes = GetFirstAncestorOfType().graphView.Query().ToList(); + + colorManager.SetNodesDirty(nodes); + colorManager.UpdateNodeViews(nodes); + + foreach (var node in graph.GetNodes()) + { + node.Dirty(modificationScope); + } + break; + case ShaderKeyword keyword: + foreach (var node in graph.GetNodes()) + { + node.UpdateNode(); + node.Dirty(modificationScope); + } + + // Cant determine if Sub Graphs contain the keyword so just update them + foreach (var node in graph.GetNodes()) + { + node.Dirty(modificationScope); + } + break; + default: + throw new ArgumentOutOfRangeException(); + } } - void BuildDefaultFields(ShaderInput input) + // When the properties are changed, this delegate is used to trigger an update in the view that represents those properties + private Action m_propertyViewUpdateTrigger; + private ShaderInputPropertyDrawer.ChangeReferenceNameCallback m_resetReferenceNameTrigger; + + public string displayName { - if(!m_Graph.isSubGraph) + get { - m_ExposedToogle = new Toggle(); - m_ExposedToogle.OnToggleChanged(evt => + switch(m_Input) { - m_Graph.owner.RegisterCompleteObjectUndo("Change Exposed Toggle"); - input.generatePropertyBlock = evt.newValue; - m_BlackboardField.icon = input.generatePropertyBlock ? BlackboardProvider.exposedIcon : null; - Rebuild(); - DirtyNodes(ModificationScope.Graph); - }); - m_ExposedToogle.value = input.generatePropertyBlock && input.isExposable; - AddRow("Exposed", m_ExposedToogle, input.isExposable); + case AbstractShaderProperty property: + return $"{m_Input.displayName} (Property)"; + case ShaderKeyword keyword: + return $"{m_Input.displayName} (Keyword)"; + default: + throw new ArgumentOutOfRangeException(); + } } + } - if(!m_Graph.isSubGraph || input is ShaderKeyword) - { - m_ReferenceNameField = new TextField(512, false, false, ' ') { isDelayed = true }; - m_ReferenceNameField.styleSheets.Add(Resources.Load("Styles/PropertyNameReferenceField")); - m_ReferenceNameField.value = input.referenceName; - m_ReferenceNameField.RegisterValueChangedCallback(evt => - { - m_Graph.owner.RegisterCompleteObjectUndo("Change Reference Name"); - if (m_ReferenceNameField.value != m_Input.referenceName) - m_Graph.SanitizeGraphInputReferenceName(input, evt.newValue); - - m_ReferenceNameField.value = input.referenceName; - if (string.IsNullOrEmpty(input.overrideReferenceName)) - m_ReferenceNameField.RemoveFromClassList("modified"); - else - m_ReferenceNameField.AddToClassList("modified"); - - Rebuild(); - DirtyNodes(ModificationScope.Graph); - UpdateReferenceNameResetMenu(); - }); - if (!string.IsNullOrEmpty(input.overrideReferenceName)) - m_ReferenceNameField.AddToClassList("modified"); - - AddRow("Reference", m_ReferenceNameField, input.isRenamable); - } + public BlackboardFieldView(GraphData graph, ShaderInput input, Texture icon, string text, string typeText) : base(icon, text, typeText) + { + styleSheets.Add(Resources.Load("Styles/ShaderGraphBlackboard")); + m_Graph = graph; + m_Input = input; } - public abstract void BuildCustomFields(ShaderInput input); - public abstract void DirtyNodes(ModificationScope modificationScope = ModificationScope.Node); + public object GetObjectToInspect() + { + return shaderInput; + } void UpdateReferenceNameResetMenu() { @@ -141,53 +115,119 @@ void BuildContextualMenu(ContextualMenuPopulateEvent evt) evt.menu.AppendAction("Reset Reference", e => { m_Input.overrideReferenceName = null; - m_ReferenceNameField.value = m_Input.referenceName; - m_ReferenceNameField.RemoveFromClassList("modified"); + this.m_resetReferenceNameTrigger(shaderInput.referenceName); DirtyNodes(ModificationScope.Graph); }, DropdownMenuAction.AlwaysEnabled); } - public VisualElement AddRow(string labelText, VisualElement control, bool enabled = true) +#region PropertyDrawers + public void SupplyDataToPropertyDrawer(IPropertyDrawer propertyDrawer, Action inspectorUpdateDelegate) { - VisualElement rowView = CreateRow(labelText, control, enabled); - Add(rowView); - m_Rows.Add(rowView); - return rowView; + if(propertyDrawer is ShaderInputPropertyDrawer shaderInputPropertyDrawer) + { + shaderInputPropertyDrawer.GetPropertyData(m_Graph.isSubGraph, + this.ChangeExposedField, + this.ChangeReferenceNameField, + () => { m_Graph.OnKeywordChanged(); }, + this.ChangePropertyValue, + this.RegisterPropertyChangeUndo, + this.MarkNodesAsDirty); + + this.m_propertyViewUpdateTrigger = inspectorUpdateDelegate; + this.m_resetReferenceNameTrigger = shaderInputPropertyDrawer._resetReferenceNameCallback; + } } - public void Rebuild() + public PropertyInfo[] GetPropertyInfo() { - // Delete all rows - for (int i = 0; i < m_Rows.Count; i++) - { - if (m_Rows[i].parent == this) - Remove(m_Rows[i]); - } + return this.GetType().GetProperties(); + } + + void ChangeExposedField(bool newValue) + { + m_Input.generatePropertyBlock = newValue; + icon = m_Input.generatePropertyBlock ? BlackboardProvider.exposedIcon : null; + } + + void ChangeReferenceNameField(string newValue) + { + if (newValue != m_Input.referenceName) + m_Graph.SanitizeGraphInputReferenceName(m_Input, newValue); - // Rebuild - BuildDefaultFields(m_Input); - BuildCustomFields(m_Input); + UpdateReferenceNameResetMenu(); } - VisualElement CreateRow(string labelText, VisualElement control, bool enabled) + void RegisterPropertyChangeUndo(string actionName) { - VisualElement rowView = new VisualElement(); + m_Graph.owner.RegisterCompleteObjectUndo(actionName); + } + + void MarkNodesAsDirty(bool triggerPropertyViewUpdate = false, ModificationScope modificationScope = ModificationScope.Node) + { + DirtyNodes(modificationScope); + if(triggerPropertyViewUpdate) + this.m_propertyViewUpdateTrigger(); + } - rowView.AddToClassList("rowView"); + void ChangePropertyValue(object newValue) + { + var property = m_Input as AbstractShaderProperty; + if(property == null) + return; - if(!string.IsNullOrEmpty(labelText)) + switch(property) { - Label label = new Label(labelText); - label.SetEnabled(enabled); - label.AddToClassList("rowViewLabel"); - rowView.Add(label); + case BooleanShaderProperty booleanProperty: + booleanProperty.value = (bool) newValue; + break; + case Vector1ShaderProperty vector1Property: + vector1Property.value = (float) newValue; + break; + case Vector2ShaderProperty vector2Property: + vector2Property.value = (Vector2) newValue; + break; + case Vector3ShaderProperty vector3Property: + vector3Property.value = (Vector3) newValue; + break; + case Vector4ShaderProperty vector4Property: + vector4Property.value = (Vector4) newValue; + break; + case ColorShaderProperty colorProperty: + colorProperty.value = (Color) newValue; + break; + case Texture2DShaderProperty texture2DProperty: + texture2DProperty.value.texture = (Texture) newValue; + break; + case Texture2DArrayShaderProperty texture2DArrayProperty: + texture2DArrayProperty.value.textureArray = (Texture2DArray) newValue; + break; + case Texture3DShaderProperty texture3DProperty: + texture3DProperty.value.texture = (Texture3D) newValue; + break; + case CubemapShaderProperty cubemapProperty: + cubemapProperty.value.cubemap = (Cubemap) newValue; + break; + case Matrix2ShaderProperty matrix2Property: + matrix2Property.value = (Matrix4x4) newValue; + break; + case Matrix3ShaderProperty matrix3Property: + matrix3Property.value = (Matrix4x4) newValue; + break; + case Matrix4ShaderProperty matrix4Property: + matrix4Property.value = (Matrix4x4) newValue; + break; + case SamplerStateShaderProperty samplerStateProperty: + samplerStateProperty.value = (TextureSamplerState) newValue; + break; + case GradientShaderProperty gradientProperty: + gradientProperty.value = (Gradient) newValue; + break; + default: + throw new ArgumentOutOfRangeException(); } - control.AddToClassList("rowViewControl"); - control.SetEnabled(enabled); - - rowView.Add(control); - return rowView; + this.MarkDirtyRepaint(); } +#endregion } } diff --git a/com.unity.shadergraph/Editor/Drawing/Blackboard/BlackboardProvider.cs b/com.unity.shadergraph/Editor/Drawing/Blackboard/BlackboardProvider.cs index 33774d6b2b6..5f7a222bedd 100644 --- a/com.unity.shadergraph/Editor/Drawing/Blackboard/BlackboardProvider.cs +++ b/com.unity.shadergraph/Editor/Drawing/Blackboard/BlackboardProvider.cs @@ -26,13 +26,6 @@ class BlackboardProvider bool m_EditPathCancelled = false; List m_SelectedNodes = new List(); - Dictionary m_ExpandedInputs = new Dictionary(); - - public Dictionary expandedInputs - { - get { return m_ExpandedInputs; } - } - public string assetName { get { return blackboard.title; } @@ -260,8 +253,13 @@ void EditTextRequested(Blackboard blackboard, VisualElement visualElement, strin } } - public void HandleGraphChanges() + public void HandleGraphChanges(bool wasUndoRedoPerformed) { + var selection = new List(blackboard.selection); + + // How to maintain selections if the entire graph is basically reinitialized every time undo/redo occurs? + // Provider is persistent, might have to store some last selected entry thing maybe? + // Need to account for change in count of inputs removed or if the same element isn't there then dont select it, somehow foreach (var inputGuid in m_Graph.removedInputs) { BlackboardRow row; @@ -277,9 +275,9 @@ public void HandleGraphChanges() AddInputRow(input, index: m_Graph.GetGraphInputIndex(input)); } - foreach (var expandedInput in expandedInputs) + if (wasUndoRedoPerformed && m_Graph.addedInputs.Count() == m_Graph.removedInputs.Count()) { - SessionState.SetBool($"Unity.ShaderGraph.Input.{expandedInput.Key}.isExpanded", expandedInput.Value); + oldSelection = selection; } if (m_Graph.movedInputs.Any()) @@ -293,9 +291,10 @@ public void HandleGraphChanges() foreach (var keyword in m_Graph.keywords) m_KeywordSection.Add(m_InputRows[keyword.guid]); } - m_ExpandedInputs.Clear(); } + private List oldSelection { get; set; } = new List(); + void AddInputRow(ShaderInput input, bool create = false, int index = -1) { if (m_InputRows.ContainsKey(input.guid)) @@ -307,7 +306,7 @@ void AddInputRow(ShaderInput input, bool create = false, int index = -1) input.generatePropertyBlock = input.isExposable; } - BlackboardField field = null; + BlackboardFieldView field = null; BlackboardRow row = null; switch(input) @@ -315,9 +314,9 @@ void AddInputRow(ShaderInput input, bool create = false, int index = -1) case AbstractShaderProperty property: { var icon = (m_Graph.isSubGraph || (property.isExposable && property.generatePropertyBlock)) ? exposedIcon : null; - field = new BlackboardField(icon, property.displayName, property.propertyType.ToString()) { userData = property }; - var propertyView = new BlackboardFieldPropertyView(field, m_Graph, property); - row = new BlackboardRow(field, propertyView) { userData = input }; + field = new BlackboardFieldView(m_Graph, property, icon, property.displayName, property.propertyType.ToString()) { userData = property }; + field.RegisterCallback(UpdateSelectionAfterUndoRedo); + row = new BlackboardRow(field, null); if (index < 0 || index > m_InputRows.Count) index = m_InputRows.Count; @@ -336,9 +335,9 @@ void AddInputRow(ShaderInput input, bool create = false, int index = -1) string typeText = keyword.keywordType.ToString() + " Keyword"; typeText = keyword.isBuiltIn ? "Built-in " + typeText : typeText; - field = new BlackboardField(icon, keyword.displayName, typeText) { userData = keyword }; - var keywordView = new BlackboardFieldKeywordView(field, m_Graph, keyword); - row = new BlackboardRow(field, keywordView); + field = new BlackboardFieldView(m_Graph, keyword, icon, keyword.displayName, typeText) { userData = keyword }; + field.RegisterCallback(UpdateSelectionAfterUndoRedo); + row = new BlackboardRow(field, null); if (index < 0 || index > m_InputRows.Count) index = m_InputRows.Count; @@ -354,16 +353,13 @@ void AddInputRow(ShaderInput input, bool create = false, int index = -1) throw new ArgumentOutOfRangeException(); } - if(field == null || row == null) - return; - - var pill = row.Q(); - pill.RegisterCallback(evt => OnMouseHover(evt, input)); - pill.RegisterCallback(evt => OnMouseHover(evt, input)); - pill.RegisterCallback(OnDragUpdatedEvent); + field.RegisterCallback(evt => OnMouseHover(evt, input)); + field.RegisterCallback(evt => OnMouseHover(evt, input)); + field.RegisterCallback(OnDragUpdatedEvent); + // Removing the expand button from the blackboard, its added by default var expandButton = row.Q