diff --git a/com.unity.visualeffectgraph/CHANGELOG.md b/com.unity.visualeffectgraph/CHANGELOG.md index 6d3fe2f44ab..0a82993a6c5 100644 --- a/com.unity.visualeffectgraph/CHANGELOG.md +++ b/com.unity.visualeffectgraph/CHANGELOG.md @@ -61,6 +61,7 @@ The version number for this package has increased due to a version update of a r - Fix space issues with blocks and operators taking a camera as input - Generated shaderName are now consistent with displayed system names - Don't lose SRP output specific data when SRP package is not present +- Add cleaner Update Mode inspector [Case 1258463](https://issuetracker.unity3d.com/product/unity/issues/guid/1258463/) ## [8.0.1] - 2020-02-25 diff --git a/com.unity.visualeffectgraph/Editor/Inspector/VFXAssetEditor.cs b/com.unity.visualeffectgraph/Editor/Inspector/VFXAssetEditor.cs index feae7c6a1d8..ef88f45fd0b 100644 --- a/com.unity.visualeffectgraph/Editor/Inspector/VFXAssetEditor.cs +++ b/com.unity.visualeffectgraph/Editor/Inspector/VFXAssetEditor.cs @@ -414,13 +414,103 @@ public override void OnInspectorGUI() GUI.enabled = AssetDatabase.IsOpenForEdit(this.target, StatusQueryOptions.UseCachedIfPossible); + VFXUpdateMode initialUpdateMode = (VFXUpdateMode)0; + bool? initialFixedDeltaTime = null; + bool? initialProcessEveryFrame = null; + bool? initialIgnoreGameTimeScale = null; + if (resourceUpdateModeProperty.hasMultipleDifferentValues) + { + var resourceUpdateModeProperties = resourceUpdateModeProperty.serializedObject.targetObjects + .Select(o => new SerializedObject(o) + .FindProperty(resourceUpdateModeProperty.propertyPath)) + .ToArray(); //N.B.: This will create garbage + var allDeltaTime = resourceUpdateModeProperties.Select(o => ((VFXUpdateMode)o.intValue & VFXUpdateMode.DeltaTime) == VFXUpdateMode.DeltaTime) + .Distinct(); + var allProcessEveryFrame = resourceUpdateModeProperties.Select(o => ((VFXUpdateMode)o.intValue & VFXUpdateMode.ExactFixedTimeStep) == VFXUpdateMode.ExactFixedTimeStep) + .Distinct(); + var allIgnoreScale = resourceUpdateModeProperties.Select(o => ((VFXUpdateMode)o.intValue & VFXUpdateMode.IgnoreTimeScale) == VFXUpdateMode.IgnoreTimeScale) + .Distinct(); + if (allDeltaTime.Count() == 1) + initialFixedDeltaTime = !allDeltaTime.First(); + if (allProcessEveryFrame.Count() == 1) + initialProcessEveryFrame = allProcessEveryFrame.First(); + if (allIgnoreScale.Count() == 1) + initialIgnoreGameTimeScale = allIgnoreScale.First(); + } + else + { + initialUpdateMode = (VFXUpdateMode)resourceUpdateModeProperty.intValue; + initialFixedDeltaTime = !((initialUpdateMode & VFXUpdateMode.DeltaTime) == VFXUpdateMode.DeltaTime); + initialProcessEveryFrame = (initialUpdateMode & VFXUpdateMode.ExactFixedTimeStep) == VFXUpdateMode.ExactFixedTimeStep; + initialIgnoreGameTimeScale = (initialUpdateMode & VFXUpdateMode.IgnoreTimeScale) == VFXUpdateMode.IgnoreTimeScale; + } + + EditorGUI.showMixedValue = !initialFixedDeltaTime.HasValue; + var deltaTimeContent = EditorGUIUtility.TrTextContent("Fixed Delta Time", "If enabled, use visual effect manager fixed delta time mode, otherwise, use the default Time.deltaTime."); + var processEveryFrameContent = EditorGUIUtility.TrTextContent("Exact Fixed Time", "Only relevant when using Fixed Delta Time. When enabled, several updates can be processed per frame (e.g.: if a frame is 10ms and the fixed frame rate is set to 5 ms, the effect will update twice with a 5ms deltaTime instead of once with a 10ms deltaTime). This method is expensive and should only be used for high-end scenarios."); + var ignoreTimeScaleContent = EditorGUIUtility.TrTextContent("Ignore Time Scale", "When enabled, the computed visual effect delta time ignores the game Time Scale value (Play Rate is still applied)."); + EditorGUI.BeginChangeCheck(); - EditorGUI.showMixedValue = resourceUpdateModeProperty.hasMultipleDifferentValues; - VFXUpdateMode newUpdateMode = (VFXUpdateMode)EditorGUILayout.EnumPopup(EditorGUIUtility.TrTextContent("Update Mode", "Specifies whether particles are updated using a fixed timestep (Fixed Delta Time), or in a frame-rate independent manner (Delta Time)."), (VFXUpdateMode)resourceUpdateModeProperty.intValue); + + VisualEffectEditor.ShowHeader(EditorGUIUtility.TrTextContent("Update mode"), false, false); + bool newFixedDeltaTime = EditorGUILayout.Toggle(deltaTimeContent, initialFixedDeltaTime ?? false); + bool newExactFixedTimeStep = false; + EditorGUI.showMixedValue = !initialProcessEveryFrame.HasValue; + EditorGUI.BeginDisabledGroup((!initialFixedDeltaTime.HasValue || !initialFixedDeltaTime.Value) && !resourceUpdateModeProperty.hasMultipleDifferentValues); + newExactFixedTimeStep = EditorGUILayout.Toggle(processEveryFrameContent, initialProcessEveryFrame ?? false); + EditorGUI.EndDisabledGroup(); + EditorGUI.showMixedValue = !initialIgnoreGameTimeScale.HasValue; + bool newIgnoreTimeScale = EditorGUILayout.Toggle(ignoreTimeScaleContent, initialIgnoreGameTimeScale ?? false); + if (EditorGUI.EndChangeCheck()) { - resourceUpdateModeProperty.intValue = (int)newUpdateMode; - resourceObject.ApplyModifiedProperties(); + if (!resourceUpdateModeProperty.hasMultipleDifferentValues) + { + var newUpdateMode = (VFXUpdateMode)0; + if (!newFixedDeltaTime) + newUpdateMode = newUpdateMode | VFXUpdateMode.DeltaTime; + if (newExactFixedTimeStep) + newUpdateMode = newUpdateMode | VFXUpdateMode.ExactFixedTimeStep; + if (newIgnoreTimeScale) + newUpdateMode = newUpdateMode | VFXUpdateMode.IgnoreTimeScale; + + resourceUpdateModeProperty.intValue = (int)newUpdateMode; + resourceObject.ApplyModifiedProperties(); + } + else + { + var resourceUpdateModeProperties = resourceUpdateModeProperty.serializedObject.targetObjects.Select(o => new SerializedObject(o).FindProperty(resourceUpdateModeProperty.propertyPath)); + foreach (var property in resourceUpdateModeProperties) + { + var updateMode = (VFXUpdateMode)property.intValue; + + if (initialFixedDeltaTime.HasValue) + { + if (!newFixedDeltaTime) + updateMode = updateMode | VFXUpdateMode.DeltaTime; + else + updateMode = updateMode & ~VFXUpdateMode.DeltaTime; + } + else + { + if (newFixedDeltaTime) + updateMode = updateMode & ~VFXUpdateMode.DeltaTime; + } + + if (newExactFixedTimeStep) + updateMode = updateMode | VFXUpdateMode.ExactFixedTimeStep; + else if (initialProcessEveryFrame.HasValue) + updateMode = updateMode & ~VFXUpdateMode.ExactFixedTimeStep; + + if (newIgnoreTimeScale) + updateMode = updateMode | VFXUpdateMode.IgnoreTimeScale; + else if (initialIgnoreGameTimeScale.HasValue) + updateMode = updateMode & ~VFXUpdateMode.IgnoreTimeScale; + + property.intValue = (int)updateMode; + property.serializedObject.ApplyModifiedProperties(); + } + } } EditorGUILayout.BeginHorizontal();