Skip to content

Commit ba38685

Browse files
committed
Vfx/feature/filter enum (#243)
* Allow filtering enums values in VFXModels. * Add an explicit GetHashCode() to default NameNType. * Update CHANGELOG.md * Update VFXHDRPSubOutput.cs * fix based on review
1 parent f0e09f2 commit ba38685

12 files changed

Lines changed: 100 additions & 14 deletions

File tree

com.unity.render-pipelines.high-definition/Editor/VFXGraph/VFXHDRPSubOutput.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ class VFXHDRPSubOutput : VFXSRPSubOutput
1616
[VFXSetting(VFXSettingAttribute.VisibleFlags.InInspector), Header("HDRP"), Tooltip("Specifies when in the render queue particles are drawn. This is useful for drawing particles behind refractive surfaces like frosted glass, for performance gains by rendering them in low resolution, or to draw particles after post processing so they are not affected by effects such as Depth of Field.")]
1717
public TransparentRenderQueue transparentRenderQueue = TransparentRenderQueue.Default;
1818

19+
20+
21+
1922
// Caps
2023
public override bool supportsExposure { get { return true; } }
2124
public override bool supportsMotionVector
@@ -41,6 +44,18 @@ protected override IEnumerable<string> filteredOutSettings
4144
}
4245
}
4346

47+
public override IEnumerable<int> GetFilteredOutEnumerators(string name)
48+
{
49+
switch (name)
50+
{
51+
case "opaqueRenderQueue":
52+
return new int[] { (int)OpaqueRenderQueue.Raytracing };
53+
case "transparentRenderQueue":
54+
return new int[] { (int)TransparentRenderQueue.Raytracing };
55+
}
56+
return null;
57+
}
58+
4459
public override string GetBlendModeStr()
4560
{
4661
bool isOffscreen = transparentRenderQueue == TransparentRenderQueue.LowResolution || transparentRenderQueue == TransparentRenderQueue.AfterPostProcessing;

com.unity.visualeffectgraph/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
2424
- Noise evaluation now performed on CPU when possible
2525
- Range and Min attributes support on int and uint parameters
2626
- New Construct Matrix from Vector4 operator
27+
- Allow filtering enums in VFXModels' VFXSettings.
2728

2829
### Fixed
2930
- Moved VFX Event Tester Window visibility to Component Play Controls SceneView Window

com.unity.visualeffectgraph/Editor/Controls/VFXEnumField.cs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using System;
14
using UnityEngine;
25
using UnityEngine.UIElements;
36
using UnityEditor.VFX.UI;
@@ -11,6 +14,10 @@ class VFXEnumField : ValueControl<int>
1114
TextElement m_ValueText;
1215
System.Type m_EnumType;
1316

17+
public IEnumerable<int> filteredOutValues { get; set; }
18+
19+
public Action<VFXEnumField> OnDisplayMenu;
20+
1421
void CreateHierarchy()
1522
{
1623
AddToClassList("unity-enum-field");
@@ -29,13 +36,15 @@ void CreateHierarchy()
2936

3037
void OnClick()
3138
{
39+
if (OnDisplayMenu != null)
40+
OnDisplayMenu(this);
3241
GenericMenu menu = new GenericMenu();
3342

3443
foreach (string val in System.Enum.GetNames(m_EnumType))
3544
{
3645
int valueInt = (int)System.Enum.Parse(m_EnumType, val);
37-
38-
menu.AddItem(new GUIContent(ObjectNames.NicifyVariableName(val)), valueInt == m_Value, ChangeValue, valueInt);
46+
if(filteredOutValues == null || !filteredOutValues.Any(t=>t == valueInt))
47+
menu.AddItem(new GUIContent(ObjectNames.NicifyVariableName(val)), valueInt == m_Value, ChangeValue, valueInt);
3948
}
4049
menu.DropDown(m_DropDownButton.worldBound);
4150
}

com.unity.visualeffectgraph/Editor/GraphView/Elements/Controllers/VFXDataAnchorController.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@ public override string name
6767

6868
public Type portType { get; set; }
6969

70+
71+
IEnumerable<int> IPropertyRMProvider.filteredOutEnumerators { get { return null; } }
72+
7073
public Type storageType
7174
{
7275
get

com.unity.visualeffectgraph/Editor/GraphView/Elements/Controllers/VFXParameterController.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ public VFXSubParameterController[] children
6767
return m_Children;
6868
}
6969
}
70+
IEnumerable<int> IPropertyRMProvider.filteredOutEnumerators { get { return null; } }
7071

7172
VFXCoordinateSpace IPropertyRMProvider.space
7273
{
@@ -213,6 +214,7 @@ public object value
213214
}
214215
}
215216

217+
IEnumerable<int> IPropertyRMProvider.filteredOutEnumerators { get { return null; } }
216218
public string name
217219
{
218220
get { return m_Min ? "Min" : "Max"; }
@@ -336,6 +338,7 @@ void OnSlotChanged()
336338
return;
337339
NotifyChange(ValueChanged);
338340
}
341+
IEnumerable<int> IPropertyRMProvider.filteredOutEnumerators { get { return null; } }
339342

340343
Dictionary<string, VFXSubParameterController> m_ChildrenByPath = new Dictionary<string, VFXSubParameterController>();
341344

com.unity.visualeffectgraph/Editor/GraphView/Elements/Controllers/VFXParameterNodeController.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,7 @@ bool IPropertyRMProvider.editable
227227
bool IPropertyRMProvider.expandableIfShowsEverything { get { return false; } }
228228

229229

230+
IEnumerable<int> IPropertyRMProvider.filteredOutEnumerators { get { return null; } }
230231
public object value
231232
{
232233
get

com.unity.visualeffectgraph/Editor/GraphView/Elements/Controllers/VFXSettingController.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ public virtual bool expandable
7272
}
7373
bool IPropertyRMProvider.expandableIfShowsEverything { get { return false; } }
7474

75+
76+
IEnumerable<int> IPropertyRMProvider.filteredOutEnumerators { get { return (m_Owner as VFXModel).GetFilteredOutEnumerators(name); } }
77+
7578
public virtual string iconName
7679
{
7780
get { return portType.Name; }

com.unity.visualeffectgraph/Editor/GraphView/Views/Properties/PropertyRM.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ interface IPropertyRMProvider
2828
Type portType { get; }
2929
int depth {get; }
3030
bool editable { get; }
31+
32+
IEnumerable<int> filteredOutEnumerators { get; }
3133
void RetractPath();
3234
void ExpandPath();
3335
}
@@ -67,6 +69,9 @@ object IPropertyRMProvider.value
6769
m_Setter((T)value);
6870
}
6971
}
72+
73+
IEnumerable<int> IPropertyRMProvider.filteredOutEnumerators { get { return null; } }
74+
7075
string IPropertyRMProvider.name
7176
{
7277
get { return m_Name; }

com.unity.visualeffectgraph/Editor/GraphView/Views/Properties/SimplePropertiesRM.cs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,7 @@
33
using System.Reflection;
44
using UnityEngine;
55
using UnityEngine.UIElements;
6-
using UnityEditor.UIElements;
7-
using UnityEditor.VFX;
8-
using UnityEditor.VFX.UIElements;
9-
using Object = UnityEngine.Object;
10-
using Type = System.Type;
116
using EnumField = UnityEditor.VFX.UIElements.VFXEnumField;
12-
using VFXVector2Field = UnityEditor.VFX.UI.VFXVector2Field;
13-
using VFXVector4Field = UnityEditor.VFX.UI.VFXVector4Field;
147

158
namespace UnityEditor.VFX.UI
169
{
@@ -40,7 +33,15 @@ public override float GetPreferredControlWidth()
4033

4134
public override ValueControl<int> CreateField()
4235
{
43-
return new EnumField(m_Label, m_Provider.portType);
36+
var field = new EnumField(m_Label, m_Provider.portType);
37+
field.OnDisplayMenu = OnDisplayMenu;
38+
39+
return field;
40+
}
41+
42+
void OnDisplayMenu(EnumField field)
43+
{
44+
field.filteredOutValues = provider.filteredOutEnumerators;
4445
}
4546
}
4647

com.unity.visualeffectgraph/Editor/Inspector/VFXSlotContainerEditor.cs

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,16 +33,28 @@ protected virtual SerializedProperty FindProperty(VFXSetting setting)
3333
return serializedObject.FindProperty(setting.field.Name);
3434
}
3535

36+
struct NameNType
37+
{
38+
public string name;
39+
public Type type;
40+
41+
public override int GetHashCode()
42+
{
43+
return name.GetHashCode() * 23 + type.GetHashCode();
44+
}
45+
}
46+
3647
public virtual void DoInspectorGUI()
3748
{
3849
var slotContainer = targets[0] as VFXModel;
39-
IEnumerable<VFXSetting> settingFields = slotContainer.GetSettings(false, VFXSettingAttribute.VisibleFlags.InInspector);
50+
List<VFXSetting> settingFields = slotContainer.GetSettings(false, VFXSettingAttribute.VisibleFlags.InInspector).ToList();
4051

4152
for (int i = 1; i < targets.Length; ++i)
4253
{
43-
IEnumerable<VFXSetting> otherSettingFields = (targets[i] as VFXModel).GetSettings(false, VFXSettingAttribute.VisibleFlags.InInspector);
54+
IEnumerable<VFXSetting> otherSettingFields = (targets[i] as VFXModel).GetSettings(false, VFXSettingAttribute.VisibleFlags.InInspector).ToArray() ;
4455

45-
settingFields = settingFields.Intersect(otherSettingFields);
56+
var excluded = new HashSet<NameNType>(settingFields.Select(t => new NameNType() { name = t.name, type = t.field.FieldType }).Except(otherSettingFields.Select(t => new NameNType() { name = t.name, type = t.field.FieldType })));
57+
settingFields.RemoveAll(t => excluded.Any( u=> u.name == t.name));
4658
}
4759

4860
foreach (var prop in settingFields.Select(t => new KeyValuePair<FieldInfo, SerializedProperty>(t.field, FindProperty(t))).Where(t => t.Value != null))
@@ -59,6 +71,32 @@ public virtual void DoInspectorGUI()
5971
prop.Value.stringValue = strings[result];
6072
}
6173
}
74+
else if(prop.Key.FieldType.IsEnum)
75+
{
76+
GUIContent[] enumNames = null;
77+
int[] enumValues = null;
78+
79+
Array enums = Enum.GetValues(prop.Key.FieldType);
80+
List<int> values = new List<int>(enums.Length);
81+
for (int i = 0; i < enums.Length; ++i)
82+
{
83+
values.Add((int)enums.GetValue(i));
84+
}
85+
86+
foreach (var target in targets)
87+
{
88+
VFXModel targetIte = target as VFXModel;
89+
90+
var filteredValues = targetIte.GetFilteredOutEnumerators(prop.Key.Name);
91+
if (filteredValues != null)
92+
foreach (int val in filteredValues)
93+
values.Remove(val);
94+
}
95+
enumNames = values.Select(t => new GUIContent(Enum.GetName(prop.Key.FieldType, t))).ToArray();
96+
enumValues = values.ToArray();
97+
98+
EditorGUILayout.IntPopup(prop.Value,enumNames,enumValues );
99+
}
62100
else
63101
{
64102
bool visibleChildren = EditorGUILayout.PropertyField(prop.Value);

0 commit comments

Comments
 (0)