From 003ccf5642d888f7677f04ee011877ce90ffff0a Mon Sep 17 00:00:00 2001 From: Unity Technologies Date: Wed, 7 Aug 2024 05:59:10 +0000 Subject: [PATCH] Unity 6000.0.14f1 C# reference source code --- Editor/Mono/Audio/AudioContainerWindow.cs | 48 +++- Editor/Mono/BuildProfile/BuildProfile.cs | 15 +- .../Mono/BuildProfile/BuildProfileContext.cs | 20 ++ .../BuildProfilePlayerSettings.cs | 18 +- Editor/Mono/EditorUtility.bindings.cs | 18 +- Editor/Mono/Handles/HandleUtility.cs | 13 +- Editor/Mono/Handles/Handles.cs | 6 +- .../PlayerSettingsEditor.cs | 57 +++-- .../Modules/DefaultBuildProfileExtension.cs | 5 + Editor/Mono/PlayerSettings.bindings.cs | 7 +- Editor/Mono/PlayerSettingsAndroid.bindings.cs | 6 + Editor/Mono/SceneView/SceneView.cs | 14 +- .../BuildProfilePlayerSettingsEditor.cs | 22 +- .../BuildProfileEditor/BuildProfileWindow.cs | 3 +- .../AssetStore/AssetStoreVersionList.cs | 16 +- .../Editor/Services/Common/BaseVersionList.cs | 12 +- .../Editor/Services/Common/Package.cs | 4 +- .../Services/Common/PlaceholderVersionList.cs | 2 - .../Editor/Services/Common/VersionsFilter.cs | 5 +- .../Services/Interfaces/IVersionList.cs | 14 +- .../Services/Packages/Actions/AddAction.cs | 2 +- .../Packages/Actions/DownloadUpdateAction.cs | 16 +- .../Packages/Actions/ImportUpdateAction.cs | 2 +- .../Packages/Actions/ReDownloadAction.cs | 4 +- .../Packages/Actions/ReImportAction.cs | 2 +- .../Services/Packages/Actions/ResetAction.cs | 2 +- .../Services/Packages/Actions/UpdateAction.cs | 2 +- .../Services/Packages/PackageDatabase.cs | 12 +- .../Editor/Services/Upm/UpmPackageVersion.cs | 13 +- .../Editor/Services/Upm/UpmVersionList.cs | 209 ++++-------------- .../Editor/UI/PackageDetailsHeader.cs | 8 +- .../PackageDetailsFeatureDependenciesTab.cs | 24 +- .../PackageDetailsVersionHistoryItem.cs | 48 ++-- .../PackageDetailsVersionsTab.cs | 7 +- .../PackageManagerUI/Editor/UI/PackageItem.cs | 43 ++-- .../Editor/UI/PackageListView.cs | 6 +- .../Editor/UI/PackageSelectionEditor.cs | 4 +- .../PackageTagLabel/PackageReleaseTagLabel.cs | 5 +- .../ContactModification.bindings.cs | 37 +++- .../ScriptBindings/Physics.bindings.cs | 30 --- .../ScriptBindings/Physics2D.bindings.cs | 50 ++++- .../Managed/Colliders/Collider2DEditorBase.cs | 31 ++- .../Managed/Rigidbody/Rigidbody2DEditor.cs | 8 +- .../ScriptBindings/SpriteMask.bindings.cs | 7 +- .../Managed/TextAssets/FontAsset.cs | 9 +- .../TextAssets/FontAsset/FontAssetFactory.cs | 142 ++++++------ .../ScriptBindings/Tilemap.bindings.cs | 1 + .../Binding/BuilderBindingUtility.cs | 9 +- .../BuilderBindingUxmlAtttributesView.cs | 4 +- .../Inspector/Binding/BuilderBindingView.cs | 161 ++++++++------ .../Inspector/Binding/BuilderBindingWindow.cs | 6 +- .../Binding/BuilderDataSourceAndPathView.cs | 8 +- .../Builder/Inspector/BuilderInspector.cs | 8 +- .../Inspector/BuilderInspectorAttributes.cs | 26 +-- .../Inspector/BuilderInspectorHeader.cs | 4 +- .../Editor/Builder/Library/BuilderLibrary.cs | 7 +- .../Builder/Library/BuilderLibraryTreeView.cs | 2 + .../BuilderUxmlAttributesView.cs | 51 ++--- .../StyleField/DimensionStyleField.cs | 1 + Modules/UIElements/Core/Events/EventBase.cs | 4 +- .../UIElements/Core/Events/PointerEvents.cs | 122 +++++++--- .../SerializedObjectBindingToBaseField.cs | 2 + README.md | 2 +- 63 files changed, 801 insertions(+), 645 deletions(-) diff --git a/Editor/Mono/Audio/AudioContainerWindow.cs b/Editor/Mono/Audio/AudioContainerWindow.cs index d4688da1ba..371d59363a 100644 --- a/Editor/Mono/Audio/AudioContainerWindow.cs +++ b/Editor/Mono/Audio/AudioContainerWindow.cs @@ -298,6 +298,7 @@ void SubscribeToGUICallbacksAndEvents() SubscribeToClipListCallbacksAndEvents(); SubscribeToAutomaticTriggerCallbacksAndEvents(); SubscribeToTooltipCallbacksAndEvents(); + SubscribeToAudioMasterMuteCallbacksAndEvents(); m_IsSubscribedToGUICallbacksAndEvents = true; } @@ -314,6 +315,7 @@ void UnsubscribeFromGUICallbacksAndEvents() UnsubscribeFromClipListCallbacksAndEvents(); UnsubscribeFromAutomaticTriggerCallbacksAndEvents(); UnsubscribeFromTooltipCallbacksAndEvents(); + UnsubscribeFromAudioMasterMuteCallbacksAndEvents(); m_IsSubscribedToGUICallbacksAndEvents = false; } @@ -425,8 +427,8 @@ void UpdateTransportButtonStates() { var editorIsPaused = EditorApplication.isPaused; - m_PlayStopButton?.SetEnabled(State.IsReadyToPlay() && !editorIsPaused); - m_SkipButton?.SetEnabled(State.IsPlayingOrPaused() && State.AudioContainer.triggerMode == AudioRandomContainerTriggerMode.Automatic && !editorIsPaused); + m_PlayStopButton?.SetEnabled(State.IsReadyToPlay() && !editorIsPaused && !EditorUtility.audioMasterMute); + m_SkipButton?.SetEnabled(State.IsPlayingOrPaused() && State.AudioContainer.triggerMode == AudioRandomContainerTriggerMode.Automatic && !editorIsPaused && !EditorUtility.audioMasterMute); var image = State.IsPlayingOrPaused() @@ -1126,27 +1128,44 @@ void SubscribeToTooltipCallbacksAndEvents() rootVisualElement.RegisterCallback(ShowTooltip, TrickleDown.TrickleDown); } + void SubscribeToAudioMasterMuteCallbacksAndEvents() + { + EditorUtility.onAudioMasterMuteWasUpdated += OnAudioMasterMuteChanged; + } + void UnsubscribeFromTooltipCallbacksAndEvents() { rootVisualElement.UnregisterCallback(ShowTooltip); } + void UnsubscribeFromAudioMasterMuteCallbacksAndEvents() + { + EditorUtility.onAudioMasterMuteWasUpdated -= OnAudioMasterMuteChanged; + } + void ShowTooltip(TooltipEvent evt) { var name = (evt.target as VisualElement).name; if (name == "play-button" || name == "play-button-image") { - var mode = State.IsPlayingOrPaused() ? "Stop" : "Play"; - var shortcut = ShortcutManager.instance.GetShortcutBinding("Audio/Play-stop Audio Random Container"); - - if (shortcut.Equals(ShortcutBinding.empty)) + if (EditorUtility.audioMasterMute) { - evt.tooltip = mode; + evt.tooltip = "Previewing is disabled when the game view is muted. To enable previewing unmute the game view."; } else { - evt.tooltip = mode + " (" + shortcut + ")"; + var mode = State.IsPlayingOrPaused() ? "Stop" : "Play"; + var shortcut = ShortcutManager.instance.GetShortcutBinding("Audio/Play-stop Audio Random Container"); + + if (shortcut.Equals(ShortcutBinding.empty)) + { + evt.tooltip = mode; + } + else + { + evt.tooltip = mode + " (" + shortcut + ")"; + } } evt.rect = (evt.target as VisualElement).worldBound; @@ -1267,6 +1286,17 @@ void OnCountRandomizationButtonClicked() State.AudioContainer.loopCountRandomizationEnabled = !State.AudioContainer.loopCountRandomizationEnabled; } + void OnAudioMasterMuteChanged(bool isMuted) + { + if (isMuted && State.IsPlayingOrPaused()) + { + State.Stop(); + ClearClipFieldProgressBars(); + } + + UpdateTransportButtonStates(); + } + #endregion #region GlobalEditorCallbackHandlers @@ -1425,7 +1455,7 @@ static void Preview(ShortcutArguments args) { var audioContainerWindow = focusedWindow as AudioContainerWindow; - if (audioContainerWindow != null && audioContainerWindow.IsDisplayingTarget()) + if (audioContainerWindow != null && audioContainerWindow.IsDisplayingTarget() && !EditorUtility.audioMasterMute) { audioContainerWindow.OnPlayStopButtonClicked(); } diff --git a/Editor/Mono/BuildProfile/BuildProfile.cs b/Editor/Mono/BuildProfile/BuildProfile.cs index 6136561954..3c86b13790 100644 --- a/Editor/Mono/BuildProfile/BuildProfile.cs +++ b/Editor/Mono/BuildProfile/BuildProfile.cs @@ -127,6 +127,9 @@ internal PlayerSettings playerSettings set { m_PlayerSettings = value; } } + [VisibleToOtherModules] + internal Action OnPlayerSettingsUpdatedFromYAML; + // TODO: Return server IBuildTargets for server build profiles. (https://jira.unity3d.com/browse/PLAT-6612) /// /// Get the IBuildTarget of the build profile. @@ -202,14 +205,10 @@ void OnEnable() void OnDisable() { - RemovePlayerSettings(); - - // Active profile YAML may be read from disk during startup or - // Asset Database refresh, flush pending changes to disk. - if (BuildProfileContext.instance.activeProfile != this) - return; - - AssetDatabase.SaveAssetIfDirty(this); + // OnDisable is called when entering play mode, during domain reloads, or when the object is destroyed. + // Avoid removing player settings for the first two cases to prevent slow syncs (e.g., color space) caused by global manager updates. + if (!EditorApplication.isUpdating) + RemovePlayerSettings(); } [MenuItem("CONTEXT/BuildProfile/Reset", false)] diff --git a/Editor/Mono/BuildProfile/BuildProfileContext.cs b/Editor/Mono/BuildProfile/BuildProfileContext.cs index 017cb5a7d5..adfb8a0adb 100644 --- a/Editor/Mono/BuildProfile/BuildProfileContext.cs +++ b/Editor/Mono/BuildProfile/BuildProfileContext.cs @@ -634,6 +634,26 @@ static string GetActiveBuildProfilePath() return string.Empty; } + [RequiredByNativeCode] + static bool HasActiveProfileWithPlayerSettings(out int instanceID) + { + var activeProfile = instance.activeProfile; + if (activeProfile?.playerSettings != null) + { + instanceID = activeProfile.GetInstanceID(); + return true; + } + + instanceID = 0; + return false; + } + + [RequiredByNativeCode] + static void UpdateActiveProfilePlayerSettingsObjectFromYAML() + { + instance.activeProfile?.UpdatePlayerSettingsObjectFromYAML(); + } + static bool ShouldReturnActiveProfile(BuildTarget buildTarget, StandaloneBuildSubtarget subtarget, string sharedSetting = null) { if (!string.IsNullOrEmpty(sharedSetting)) diff --git a/Editor/Mono/BuildProfile/BuildProfilePlayerSettings.cs b/Editor/Mono/BuildProfile/BuildProfilePlayerSettings.cs index a0905b0f99..e6bd2faf7f 100644 --- a/Editor/Mono/BuildProfile/BuildProfilePlayerSettings.cs +++ b/Editor/Mono/BuildProfile/BuildProfilePlayerSettings.cs @@ -82,6 +82,15 @@ internal void LoadPlayerSettings() DeserializePlayerSettings(); } + internal void UpdatePlayerSettingsObjectFromYAML() + { + if (!HasSerializedPlayerSettings()) + return; + + PlayerSettings.UpdatePlayerSettingsObjectFromYAML(playerSettings, m_PlayerSettingsYaml.GetYamlString()); + OnPlayerSettingsUpdatedFromYAML?.Invoke(); + } + internal void CreatePlayerSettingsFromGlobal() { if (m_PlayerSettings != null || BuildProfileContext.IsClassicPlatformProfile(this)) @@ -102,6 +111,8 @@ internal void RemovePlayerSettings(bool clearYaml = false) if (BuildProfileContext.IsClassicPlatformProfile(this)) return; + UpdateGlobalManagerPlayerSettings(activeWillBeRemoved: true); + if (m_PlayerSettings != null) { DestroyImmediate(m_PlayerSettings, true); @@ -112,7 +123,7 @@ internal void RemovePlayerSettings(bool clearYaml = false) m_PlayerSettingsYaml.Clear(); } - UpdateGlobalManagerPlayerSettings(activeWillBeRemoved: true); + OnPlayerSettingsUpdatedFromYAML?.Invoke(); } internal static void CleanUpPlayerSettingsForDeletedBuildProfiles(IList currentBuildProfiles) @@ -160,7 +171,10 @@ internal void DeserializePlayerSettings() if (!HasSerializedPlayerSettings()) return; - m_PlayerSettings = PlayerSettings.DeserializeFromYAMLString(m_PlayerSettingsYaml.GetYamlString()); + if (m_PlayerSettings == null) + m_PlayerSettings = PlayerSettings.DeserializeFromYAMLString(m_PlayerSettingsYaml.GetYamlString()); + else + UpdatePlayerSettingsObjectFromYAML(); s_LoadedPlayerSettings.Add(m_PlayerSettings); UpdateGlobalManagerPlayerSettings(); } diff --git a/Editor/Mono/EditorUtility.bindings.cs b/Editor/Mono/EditorUtility.bindings.cs index 6e9446198b..547e113fb2 100644 --- a/Editor/Mono/EditorUtility.bindings.cs +++ b/Editor/Mono/EditorUtility.bindings.cs @@ -241,12 +241,28 @@ public static bool ExtractOggFile(Object obj, string path) [FreeFunction("GetApplication().GetActiveNativePlatformSupportModuleName")] internal static extern string GetActiveNativePlatformSupportModuleName(); - public static extern bool audioMasterMute + internal static extern bool Internal_AudioMasterMute { [FreeFunction("GetAudioManager().GetMasterGroupMute")] get; [FreeFunction("GetAudioManager().SetMasterGroupMute")] set; } + public static bool audioMasterMute + { + get { return Internal_AudioMasterMute; } + set + { + if (value != Internal_AudioMasterMute) + { + Internal_AudioMasterMute = value; + onAudioMasterMuteWasUpdated?.Invoke(value); + } + } + } + + internal delegate void AudioMasterMuteWasUpdated(bool value); + internal static event AudioMasterMuteWasUpdated onAudioMasterMuteWasUpdated; + internal static extern void LaunchBugReporter(); internal static extern bool audioProfilingEnabled diff --git a/Editor/Mono/Handles/HandleUtility.cs b/Editor/Mono/Handles/HandleUtility.cs index 4e1eb7b04e..9065801724 100644 --- a/Editor/Mono/Handles/HandleUtility.cs +++ b/Editor/Mono/Handles/HandleUtility.cs @@ -1904,12 +1904,13 @@ internal static void FilterRendererIDs(Renderer[] renderers, out int[] parentRen childRendererIDs = tempChildRendererIDs.ToArray(); } - internal static void FilterInstanceIDs(IEnumerable gameObjects, out int[] parentInstanceIDs, out int[] childInstanceIDs) + internal static void FilterInstanceIDs(IEnumerable gameObjects, out int[] parentInstanceIDs, out int[] childInstanceIDs, out HashSet childInstanceIDsHashSet) { if (gameObjects.Count() == 0) { parentInstanceIDs = new int[0]; childInstanceIDs = new int[0]; + childInstanceIDsHashSet = null; return; } @@ -1924,7 +1925,7 @@ internal static void FilterInstanceIDs(IEnumerable gameObjects, out tempParentInstanceIDs.Add(go.GetInstanceID()); } - var tempChildInstanceIDs = new HashSet(); + childInstanceIDsHashSet = new HashSet(); foreach (var go in gameObjects) { var childRenderers = go.GetComponentsInChildren(); @@ -1932,7 +1933,7 @@ internal static void FilterInstanceIDs(IEnumerable gameObjects, out { var id = childRenderers[i].GetInstanceID(); if (!tempParentInstanceIDs.Contains(id)) - tempChildInstanceIDs.Add(id); + childInstanceIDsHashSet.Add(id); } var childTerrains = go.GetComponentsInChildren(); @@ -1940,7 +1941,7 @@ internal static void FilterInstanceIDs(IEnumerable gameObjects, out { var id = childTerrains[i].GetInstanceID(); if (!tempParentInstanceIDs.Contains(id)) - tempChildInstanceIDs.Add(id); + childInstanceIDsHashSet.Add(id); } // Script components can issue Render commands that are rendered in the outline so we need to take that in account @@ -1952,12 +1953,12 @@ internal static void FilterInstanceIDs(IEnumerable gameObjects, out continue; var id = script.gameObject.GetInstanceID(); if (!tempParentInstanceIDs.Contains(id)) - tempChildInstanceIDs.Add(id); + childInstanceIDsHashSet.Add(id); } } parentInstanceIDs = tempParentInstanceIDs.ToArray(); - childInstanceIDs = tempChildInstanceIDs.ToArray(); + childInstanceIDs = childInstanceIDsHashSet.ToArray(); } static bool HasMatchingInstanceID(int[] ids, int id, int cutoff) diff --git a/Editor/Mono/Handles/Handles.cs b/Editor/Mono/Handles/Handles.cs index 653821d1f1..40b6bbbca5 100644 --- a/Editor/Mono/Handles/Handles.cs +++ b/Editor/Mono/Handles/Handles.cs @@ -1470,7 +1470,7 @@ public static void DrawOutline(Renderer[] renderers, Color color, float fillOpac public static void DrawOutline(GameObject[] objects, Color parentNodeColor, Color childNodeColor, float fillOpacity = 0) { int[] parentRenderers, childRenderers; - HandleUtility.FilterInstanceIDs(objects, out parentRenderers, out childRenderers); + HandleUtility.FilterInstanceIDs(objects, out parentRenderers, out childRenderers, out _); DrawOutline(parentRenderers, childRenderers, parentNodeColor, childNodeColor, fillOpacity); } @@ -1487,7 +1487,7 @@ public static void DrawOutline(GameObject[] objects, Color color, float fillOpac public static void DrawOutline(List objects, Color parentNodeColor, Color childNodeColor, float fillOpacity = 0) { int[] parentRenderers, childRenderers; - HandleUtility.FilterInstanceIDs((GameObject[])NoAllocHelpers.ExtractArrayFromList(objects), out parentRenderers, out childRenderers); + HandleUtility.FilterInstanceIDs((GameObject[])NoAllocHelpers.ExtractArrayFromList(objects), out parentRenderers, out childRenderers, out _); DrawOutline(parentRenderers, childRenderers, parentNodeColor, childNodeColor, fillOpacity); } @@ -1516,7 +1516,7 @@ internal static void DrawOutlineOrWireframeInternal(Color parentNodeColor, Color internal static void DrawSubmeshOutline(Color parentNodeColor, Color childNodeColor, float outlineAlpha, int submeshOutlineMaterialId) { int[] parentRenderers, childRenderers; - HandleUtility.FilterInstanceIDs(Selection.gameObjects, out parentRenderers, out childRenderers); + HandleUtility.FilterInstanceIDs(Selection.gameObjects, out parentRenderers, out childRenderers, out _); // RenderOutline will swap color.a and outlineAlpha so we reverse it here to preserve correct behavior wrt Color settings in Preferences var parentOutlineAlpha = parentNodeColor.a; diff --git a/Editor/Mono/Inspector/PlayerSettingsEditor/PlayerSettingsEditor.cs b/Editor/Mono/Inspector/PlayerSettingsEditor/PlayerSettingsEditor.cs index e45fd7938b..3ddaeddf28 100644 --- a/Editor/Mono/Inspector/PlayerSettingsEditor/PlayerSettingsEditor.cs +++ b/Editor/Mono/Inspector/PlayerSettingsEditor/PlayerSettingsEditor.cs @@ -327,6 +327,7 @@ PlayerSettingsIconsEditor iconsEditor SerializedProperty m_VulkanNumSwapchainBuffers; SerializedProperty m_VulkanEnableLateAcquireNextImage; SerializedProperty m_VulkanEnableCommandBufferRecycling; + SerializedProperty m_VulkanEnableSetSRGBWrite; // iOS, tvOS #pragma warning disable 169 @@ -437,6 +438,12 @@ PlayerSettingsIconsEditor iconsEditor SerializedProperty m_LightmapStreamingEnabled; SerializedProperty m_LightmapStreamingPriority; + SerializedProperty m_EnableOpenGLProfilerGPURecorders; + + SerializedProperty m_EnableFrameTimingStats; + + SerializedProperty m_AllowHDRDisplaySupport; + SerializedProperty m_UseHDRDisplay; SerializedProperty m_HDRBitDepth; // WebGPU @@ -655,6 +662,7 @@ void OnEnable() m_VulkanNumSwapchainBuffers = FindPropertyAssert("vulkanNumSwapchainBuffers"); m_VulkanEnableLateAcquireNextImage = FindPropertyAssert("vulkanEnableLateAcquireNextImage"); m_VulkanEnableCommandBufferRecycling = FindPropertyAssert("vulkanEnableCommandBufferRecycling"); + m_VulkanEnableSetSRGBWrite = FindPropertyAssert("vulkanEnableSetSRGBWrite"); m_FullscreenMode = FindPropertyAssert("fullscreenMode"); m_VisibleInBackground = FindPropertyAssert("visibleInBackground"); m_AllowFullscreenSwitch = FindPropertyAssert("allowFullscreenSwitch"); @@ -663,6 +671,12 @@ void OnEnable() m_ForceSingleInstance = FindPropertyAssert("forceSingleInstance"); m_UseFlipModelSwapchain = FindPropertyAssert("useFlipModelSwapchain"); + m_AllowHDRDisplaySupport = FindPropertyAssert("allowHDRDisplaySupport"); + m_UseHDRDisplay = FindPropertyAssert("useHDRDisplay"); + m_HDRBitDepth = FindPropertyAssert("hdrBitDepth"); + m_EnableFrameTimingStats = FindPropertyAssert("enableFrameTimingStats"); + m_EnableOpenGLProfilerGPURecorders = FindPropertyAssert("enableOpenGLProfilerGPURecorders"); + m_RequireES31 = FindPropertyAssert("openGLRequireES31"); m_RequireES31AEP = FindPropertyAssert("openGLRequireES31AEP"); m_RequireES32 = FindPropertyAssert("openGLRequireES32"); @@ -930,7 +944,7 @@ private bool HasReasonToCompile() private bool SupportsRunInBackground(NamedBuildTarget buildTarget) { - return buildTarget == NamedBuildTarget.Standalone || buildTarget == NamedBuildTarget.Android; + return buildTarget == NamedBuildTarget.Standalone; } private void OnPresetSelectorClosed() @@ -2047,7 +2061,7 @@ private void OtherSectionRenderingGUI(BuildPlatform platform, ISettingEditorExte int selectedValue = m_ActiveColorSpace.enumValueIndex; EditorGUILayout.PropertyField(m_ActiveColorSpace, SettingsContent.activeColorSpace); - if (EditorGUI.EndChangeCheck()) + if (EditorGUI.EndChangeCheck() && IsActivePlayerSettingsEditor()) { if (m_ActiveColorSpace.enumValueIndex != selectedValue && EditorUtility.DisplayDialog("Changing Color Space", SettingsContent.changeColorSpaceString, $"Change to {(ColorSpace)m_ActiveColorSpace.enumValueIndex}", "Cancel")) { @@ -2468,8 +2482,8 @@ private void OtherSectionRenderingGUI(BuildPlatform platform, ISettingEditorExte // Tickbox for Frame Timing Stats. if (platform.namedBuildTarget.ToBuildTargetGroup() == BuildTargetGroup.Standalone || platform.namedBuildTarget == NamedBuildTarget.WindowsStoreApps || platform.namedBuildTarget == NamedBuildTarget.WebGL || (settingsExtension != null && settingsExtension.SupportsFrameTimingStatistics())) { - PlayerSettings.enableFrameTimingStats = EditorGUILayout.Toggle(SettingsContent.enableFrameTimingStats, PlayerSettings.enableFrameTimingStats); - if (PlayerSettings.enableFrameTimingStats) + EditorGUILayout.PropertyField(m_EnableFrameTimingStats, SettingsContent.enableFrameTimingStats); + if (m_EnableFrameTimingStats.boolValue) { EditorGUILayout.HelpBox(SettingsContent.openGLFrameTimingStatsOnGPURecordersOffInfo.text, MessageType.Info); } @@ -2478,12 +2492,12 @@ private void OtherSectionRenderingGUI(BuildPlatform platform, ISettingEditorExte // Tickbox for OpenGL-only option to toggle Profiler GPU Recorders. if (platform.namedBuildTarget == NamedBuildTarget.Standalone || platform.namedBuildTarget == NamedBuildTarget.Android || platform.namedBuildTarget == NamedBuildTarget.EmbeddedLinux || platform.namedBuildTarget == NamedBuildTarget.QNX) { - PlayerSettings.enableOpenGLProfilerGPURecorders = EditorGUILayout.Toggle(SettingsContent.enableOpenGLProfilerGPURecorders, PlayerSettings.enableOpenGLProfilerGPURecorders); + EditorGUILayout.PropertyField(m_EnableOpenGLProfilerGPURecorders, SettingsContent.enableOpenGLProfilerGPURecorders); // Add different notes/warnings depending on the tickbox combinations. // These concern Frame Timing Stats as well as Profiler GPU Recorders, // so are listed below both to (hopefully) highlight that they're linked. - if (PlayerSettings.enableOpenGLProfilerGPURecorders) + if (m_EnableOpenGLProfilerGPURecorders.boolValue) { EditorGUILayout.HelpBox(SettingsContent.openGLFrameTimingStatsOffGPURecordersOnInfo.text, MessageType.Info); } @@ -2492,29 +2506,29 @@ private void OtherSectionRenderingGUI(BuildPlatform platform, ISettingEditorExte if (hdrDisplaySupported) { bool requestRepaint = false; - bool oldAllowHDRDisplaySupport = PlayerSettings.allowHDRDisplaySupport; - PlayerSettings.allowHDRDisplaySupport = EditorGUILayout.Toggle(SettingsContent.allowHDRDisplay, oldAllowHDRDisplaySupport); - if (oldAllowHDRDisplaySupport != PlayerSettings.allowHDRDisplaySupport) + bool oldAllowHDRDisplaySupport = m_AllowHDRDisplaySupport.boolValue; + EditorGUILayout.PropertyField(m_AllowHDRDisplaySupport, SettingsContent.allowHDRDisplay); + if (oldAllowHDRDisplaySupport != m_AllowHDRDisplaySupport.boolValue) requestRepaint = true; - using (new EditorGUI.DisabledScope(!PlayerSettings.allowHDRDisplaySupport)) + using (new EditorGUI.DisabledScope(!m_AllowHDRDisplaySupport.boolValue)) { using (new EditorGUI.IndentLevelScope()) { - bool oldUseHDRDisplay = PlayerSettings.useHDRDisplay; - PlayerSettings.useHDRDisplay = EditorGUILayout.Toggle(SettingsContent.useHDRDisplay, oldUseHDRDisplay); + bool oldUseHDRDisplay = m_UseHDRDisplay.boolValue; + EditorGUILayout.PropertyField(m_UseHDRDisplay, SettingsContent.useHDRDisplay); - if (oldUseHDRDisplay != PlayerSettings.useHDRDisplay) + if (oldUseHDRDisplay != m_UseHDRDisplay.boolValue) requestRepaint = true; if (platform.namedBuildTarget.ToBuildTargetGroup() == BuildTargetGroup.Standalone || platform.namedBuildTarget == NamedBuildTarget.WindowsStoreApps || platform.namedBuildTarget == NamedBuildTarget.iOS) { - using (new EditorGUI.DisabledScope(!PlayerSettings.useHDRDisplay)) + using (new EditorGUI.DisabledScope(!m_UseHDRDisplay.boolValue)) { using (new EditorGUI.IndentLevelScope()) { EditorGUI.BeginChangeCheck(); - HDRDisplayBitDepth oldBitDepth = PlayerSettings.hdrBitDepth; + HDRDisplayBitDepth oldBitDepth = (HDRDisplayBitDepth)m_HDRBitDepth.intValue; HDRDisplayBitDepth[] bitDepthValues = { HDRDisplayBitDepth.BitDepth10, HDRDisplayBitDepth.BitDepth16 }; GUIContent hdrBitDepthLabel = EditorGUIUtility.TrTextContent("Swap Chain Bit Depth", "Affects the bit depth of the final swap chain format and color space."); GUIContent[] hdrBitDepthNames = { EditorGUIUtility.TrTextContent("Bit Depth 10"), EditorGUIUtility.TrTextContent("Bit Depth 16") }; @@ -2522,7 +2536,7 @@ private void OtherSectionRenderingGUI(BuildPlatform platform, ISettingEditorExte HDRDisplayBitDepth bitDepth = BuildEnumPopup(hdrBitDepthLabel, oldBitDepth, bitDepthValues, hdrBitDepthNames); if (EditorGUI.EndChangeCheck()) { - PlayerSettings.hdrBitDepth = bitDepth; + m_HDRBitDepth.intValue = (int)bitDepth; if (oldBitDepth != bitDepth) requestRepaint = true; } @@ -2532,7 +2546,7 @@ private void OtherSectionRenderingGUI(BuildPlatform platform, ISettingEditorExte } } - if (PlayerSettings.allowHDRDisplaySupport && GraphicsSettings.currentRenderPipeline != null && !SupportedRenderingFeatures.active.supportsHDR) + if (m_AllowHDRDisplaySupport.boolValue && GraphicsSettings.currentRenderPipeline != null && !SupportedRenderingFeatures.active.supportsHDR) { EditorGUILayout.HelpBox(SettingsContent.hdrOutputRequireHDRRenderingWarning.text, MessageType.Info); } @@ -2725,9 +2739,14 @@ private void OtherSectionVulkanSettingsGUI(BuildPlatform platform, ISettingEdito GUILayout.Label(SettingsContent.vulkanSettingsTitle, EditorStyles.boldLabel); if (!IsPreset()) { - PlayerSettings.vulkanEnableSetSRGBWrite = EditorGUILayout.Toggle(SettingsContent.vulkanEnableSetSRGBWrite, PlayerSettings.vulkanEnableSetSRGBWrite); + EditorGUILayout.PropertyField(m_VulkanEnableSetSRGBWrite, SettingsContent.vulkanEnableSetSRGBWrite); EditorGUILayout.PropertyField(m_VulkanNumSwapchainBuffers, SettingsContent.vulkanNumSwapchainBuffers); - PlayerSettings.vulkanNumSwapchainBuffers = (UInt32)m_VulkanNumSwapchainBuffers.intValue; + + // Not a No-OP, VulkanNumSwapchainBuffers has native work that should run when active setting changes. + if (IsActivePlayerSettingsEditor()) + { + PlayerSettings.vulkanNumSwapchainBuffers = m_VulkanNumSwapchainBuffers.uintValue; + } } EditorGUILayout.PropertyField(m_VulkanEnableLateAcquireNextImage, SettingsContent.vulkanEnableLateAcquireNextImage); EditorGUILayout.PropertyField(m_VulkanEnableCommandBufferRecycling, SettingsContent.vulkanEnableCommandBufferRecycling); diff --git a/Editor/Mono/Modules/DefaultBuildProfileExtension.cs b/Editor/Mono/Modules/DefaultBuildProfileExtension.cs index 73bdcaf788..e71a7a88fc 100644 --- a/Editor/Mono/Modules/DefaultBuildProfileExtension.cs +++ b/Editor/Mono/Modules/DefaultBuildProfileExtension.cs @@ -161,6 +161,11 @@ public VisualElement CreateCommonSettingsGUI(SerializedObject serializedObject, return new IMGUIContainer( () => { + if (serializedObject == null || !serializedObject.isValid) + { + return; + } + var oldLabelWidth = EditorGUIUtility.labelWidth; EditorGUIUtility.labelWidth = labelWidth; serializedObject.UpdateIfRequiredOrScript(); diff --git a/Editor/Mono/PlayerSettings.bindings.cs b/Editor/Mono/PlayerSettings.bindings.cs index 8f247d0a73..37eac8814d 100644 --- a/Editor/Mono/PlayerSettings.bindings.cs +++ b/Editor/Mono/PlayerSettings.bindings.cs @@ -259,7 +259,7 @@ public enum GfxThreadingMode // Split Graphics Jobs. // Main thread starts worker threads to write Unity graphics commands. // Render thread reads Unity graphics commands converts them to native graphics commands. - // The render thread also starts worker threads to write native graphics commands. + // The render thread also starts worker threads to write native graphics commands. SplitJobs = 6 } @@ -1529,7 +1529,7 @@ public static string applicationIdentifier // Application bundle version for the TVOS platform [NativeProperty("TVOSApplicationVersion")] public static extern string tvOSBundleVersion { get; set; } - + // Application bundle version shared between iOS & Android platforms [NativeProperty("ApplicationVersion")] public static extern string bundleVersion { get; set; } @@ -1769,6 +1769,9 @@ internal static extern bool iosCopyPluginsCodeInsteadOfSymlink [StaticAccessor("PlayerSettings", StaticAccessorType.DoubleColon)] internal static extern PlayerSettings DeserializeFromYAMLString(string yamlSettings); + [StaticAccessor("PlayerSettings", StaticAccessorType.DoubleColon)] + internal static extern void UpdatePlayerSettingsObjectFromYAML(PlayerSettings playerSettings, string yamlSettings); + internal static extern bool platformRequiresReadableAssets { get; set; } } } diff --git a/Editor/Mono/PlayerSettingsAndroid.bindings.cs b/Editor/Mono/PlayerSettingsAndroid.bindings.cs index 5274328e57..e76b783c69 100644 --- a/Editor/Mono/PlayerSettingsAndroid.bindings.cs +++ b/Editor/Mono/PlayerSettingsAndroid.bindings.cs @@ -296,6 +296,12 @@ public static extern bool resizeableActivity set; } + public static bool runWithoutFocus + { + set => runInBackground = value; + get => runInBackground; + } + // Full screen mode. Full screen window or windowed. public static extern FullScreenMode fullscreenMode { diff --git a/Editor/Mono/SceneView/SceneView.cs b/Editor/Mono/SceneView/SceneView.cs index 218ee0d241..19106eb47c 100644 --- a/Editor/Mono/SceneView/SceneView.cs +++ b/Editor/Mono/SceneView/SceneView.cs @@ -263,10 +263,13 @@ static void OnSelectedObjectWasDestroyed(int unused) static void OnNonSelectedObjectWasDestroyed(int instanceID) { - if (s_CachedChildRenderersForOutlining != null && s_CachedChildRenderersForOutlining.Contains(instanceID)) + if ((!s_ActiveEditorsDirty) || (!s_SelectionCacheDirty)) { - s_ActiveEditorsDirty = true; - s_SelectionCacheDirty = true; + if (s_CachedChildRenderersForOutliningHashSet != null && s_CachedChildRenderersForOutliningHashSet.Contains(instanceID)) + { + s_ActiveEditorsDirty = true; + s_SelectionCacheDirty = true; + } } } @@ -461,6 +464,7 @@ public bool sceneLighting internal bool m_WasFocused = false; static int[] s_CachedParentRenderersForOutlining, s_CachedChildRenderersForOutlining; + static HashSet s_CachedChildRenderersForOutliningHashSet; [Serializable] public class SceneViewState @@ -2278,7 +2282,7 @@ private void DoDrawCamera(Rect windowSpaceCameraRect, Rect groupSpaceCameraRect, { if (s_SelectionCacheDirty) { - HandleUtility.FilterInstanceIDs(Selection.gameObjects, out s_CachedParentRenderersForOutlining, out s_CachedChildRenderersForOutlining); + HandleUtility.FilterInstanceIDs(Selection.gameObjects, out s_CachedParentRenderersForOutlining, out s_CachedChildRenderersForOutlining, out s_CachedChildRenderersForOutliningHashSet); s_SelectionCacheDirty = false; } @@ -2392,7 +2396,7 @@ void RenderFilteredScene(Rect groupSpaceCameraRect) { if (s_SelectionCacheDirty) { - HandleUtility.FilterInstanceIDs(Selection.gameObjects, out s_CachedParentRenderersForOutlining, out s_CachedChildRenderersForOutlining); + HandleUtility.FilterInstanceIDs(Selection.gameObjects, out s_CachedParentRenderersForOutlining, out s_CachedChildRenderersForOutlining, out s_CachedChildRenderersForOutliningHashSet); s_SelectionCacheDirty = false; } diff --git a/Modules/BuildProfileEditor/BuildProfilePlayerSettingsEditor.cs b/Modules/BuildProfileEditor/BuildProfilePlayerSettingsEditor.cs index b33d90a0f9..017b5429e9 100644 --- a/Modules/BuildProfileEditor/BuildProfilePlayerSettingsEditor.cs +++ b/Modules/BuildProfileEditor/BuildProfilePlayerSettingsEditor.cs @@ -38,6 +38,8 @@ internal class BuildProfilePlayerSettingsEditor BuildProfile m_Profile; SerializedObject m_ProfileSerializedObject; + bool m_PlayerSettingsYamlUpdated = false; + internal static BuildProfilePlayerSettingsEditor CreatePlayerSettingsUI(VisualElement root, SerializedObject buildProfileSerializedObject) { var buildProfilePlayerSettingsEditor = new BuildProfilePlayerSettingsEditor(); @@ -66,10 +68,16 @@ internal static BuildProfilePlayerSettingsEditor CreatePlayerSettingsUI(VisualEl internal void EditorUpdate() { - if (m_PlayerSettingsEditor != null && m_Profile.playerSettings == null) + if (m_PlayerSettingsYamlUpdated) { RemovePlayerSettingsInspector(); - ShowPlayerSettingsHelpBox(); + + if (m_Profile.playerSettings == null) + ShowPlayerSettingsHelpBox(); + else + ShowPlayerSettingsEditor(); + + m_PlayerSettingsYamlUpdated = false; } } @@ -115,6 +123,9 @@ internal void ShowPlayerSettingsEditor() m_PlayerSettingsOptions.clicked += PlayerSettingsOptionMenu; m_PlayerSettingsOptions.Show(); m_PlayerSettingsFoldout.Show(); + + m_Profile.OnPlayerSettingsUpdatedFromYAML -= OnPlayerSettingsUpdatedFromYAML; + m_Profile.OnPlayerSettingsUpdatedFromYAML += OnPlayerSettingsUpdatedFromYAML; } void HidePlayerSettingsEditor() @@ -159,6 +170,11 @@ void OnPlayerSettingsEditorChanged(SerializedObject playerSettingsSerializedObje UpdateBuildProfile(); } + void OnPlayerSettingsUpdatedFromYAML() + { + m_PlayerSettingsYamlUpdated = true; + } + void ShowPlayerSettingsHelpBox() { m_PlayerSettingsFoldout.Hide(); @@ -197,7 +213,6 @@ void RemovePlayerSettings() HidePlayerSettingsEditor(); BuildProfileModuleUtil.RemovePlayerSettings(m_Profile); UpdateBuildProfile(); - ShowPlayerSettingsHelpBox(); CheckPropertiesThatRequireRecompilation(targetName, customScriptingDefines, customAdditionalCompilerArguments); } @@ -245,7 +260,6 @@ void UpdateBuildProfile() BuildProfileModuleUtil.SerializePlayerSettings(m_Profile); m_ProfileSerializedObject.ApplyModifiedProperties(); EditorUtility.SetDirty(m_Profile); - AssetDatabase.SaveAssetIfDirty(m_Profile); } } } diff --git a/Modules/BuildProfileEditor/BuildProfileWindow.cs b/Modules/BuildProfileEditor/BuildProfileWindow.cs index ec40cb790e..b5b76b921f 100644 --- a/Modules/BuildProfileEditor/BuildProfileWindow.cs +++ b/Modules/BuildProfileEditor/BuildProfileWindow.cs @@ -325,7 +325,8 @@ void Update() // We need to detect when a build profile asset that is selected in inspector // gets deleted. Since we want to avoid using asset post processors for performance // reason, we check it in update - if (buildProfileEditor?.buildProfile == null && + if (buildProfileEditor != null && + buildProfileEditor.buildProfile == null && m_BuildProfileSelection?.IsSingleSelection() == true) { DestroyImmediate(buildProfileEditor); diff --git a/Modules/PackageManagerUI/Editor/Services/AssetStore/AssetStoreVersionList.cs b/Modules/PackageManagerUI/Editor/Services/AssetStore/AssetStoreVersionList.cs index 3ea9c324ac..9f7372e555 100644 --- a/Modules/PackageManagerUI/Editor/Services/AssetStore/AssetStoreVersionList.cs +++ b/Modules/PackageManagerUI/Editor/Services/AssetStore/AssetStoreVersionList.cs @@ -26,8 +26,18 @@ internal class AssetStoreVersionList : BaseVersionList public override IPackageVersion imported => m_ImportedIndex < 0 ? null : m_Versions[m_ImportedIndex]; [SerializeField] - private int m_RecommendedIndex = -1; - public override IPackageVersion recommended => m_RecommendedIndex < 0 ? null : m_Versions[m_RecommendedIndex]; + private int m_SuggestedUpdateIndex = -1; + + public override IPackageVersion suggestedUpdate + { + get + { + if (m_SuggestedUpdateIndex < 0) + return null; + var version = m_Versions[m_SuggestedUpdateIndex]; + return version.uploadId == primary.uploadId ? null : version; + } + } public override IPackageVersion primary => imported ?? importAvailable ?? latest; @@ -44,7 +54,7 @@ public AssetStoreVersionList(AssetStoreProductInfo productInfo, AssetStoreLocalI m_ImportAvailableIndex = localInfo == null ? -1 : m_Versions.FindIndex(v => v.uploadId == localInfo.uploadId); m_ImportedIndex = importedPackage == null ? -1 : m_Versions.FindIndex(v => v.uploadId == importedPackage.uploadId); - m_RecommendedIndex = updateInfo == null ? -1 : m_Versions.FindIndex(v => v.uploadId == updateInfo.recommendedUploadId); + m_SuggestedUpdateIndex = updateInfo == null ? -1 : m_Versions.FindIndex(v => v.uploadId == updateInfo.recommendedUploadId); } private void CreateAndAddToSortedVersions(AssetStoreProductInfo productInfo, AssetStoreLocalInfo localInfo, AssetStoreImportedPackage importedPackage, long? uploadId) diff --git a/Modules/PackageManagerUI/Editor/Services/Common/BaseVersionList.cs b/Modules/PackageManagerUI/Editor/Services/Common/BaseVersionList.cs index 2da56d360d..9c72f1b945 100644 --- a/Modules/PackageManagerUI/Editor/Services/Common/BaseVersionList.cs +++ b/Modules/PackageManagerUI/Editor/Services/Common/BaseVersionList.cs @@ -21,19 +21,15 @@ internal abstract class BaseVersionList : IVersionList public virtual IPackageVersion imported => null; - public abstract IPackageVersion recommended { get; } + public virtual IPackageVersion recommended => null; - public abstract IPackageVersion primary { get; } - - public virtual IPackageVersion lifecycleVersion => null; + public virtual IPackageVersion suggestedUpdate => null; - public virtual bool isNonLifecycleVersionInstalled => false; - - public virtual bool hasLifecycleVersion => false; + public abstract IPackageVersion primary { get; } public virtual int numUnloadedVersions => 0; - public virtual IPackageVersion GetUpdateTarget(IPackageVersion version) => recommended; + public virtual IPackageVersion GetUpdateTarget(IPackageVersion version) => suggestedUpdate; public abstract IEnumerator GetEnumerator(); diff --git a/Modules/PackageManagerUI/Editor/Services/Common/Package.cs b/Modules/PackageManagerUI/Editor/Services/Common/Package.cs index 57f9e23e26..553e779703 100644 --- a/Modules/PackageManagerUI/Editor/Services/Common/Package.cs +++ b/Modules/PackageManagerUI/Editor/Services/Common/Package.cs @@ -69,9 +69,7 @@ public PackageState state if (primary.isInstalled && !primary.isDirectDependency) return PackageState.InstalledAsDependency; - var recommended = versions.recommended; - var latestKeyVersion = versions.key.LastOrDefault(); - if (recommended != null && primary != recommended && ((primary.isInstalled && primary != latestKeyVersion) || primary.HasTag(PackageTag.LegacyFormat)) && !primary.HasTag(PackageTag.Local)) + if (versions.suggestedUpdate != null) return PackageState.UpdateAvailable; if (primary.importedAssets?.Any() == true) diff --git a/Modules/PackageManagerUI/Editor/Services/Common/PlaceholderVersionList.cs b/Modules/PackageManagerUI/Editor/Services/Common/PlaceholderVersionList.cs index 8b5884150f..971ebf52d1 100644 --- a/Modules/PackageManagerUI/Editor/Services/Common/PlaceholderVersionList.cs +++ b/Modules/PackageManagerUI/Editor/Services/Common/PlaceholderVersionList.cs @@ -17,8 +17,6 @@ internal class PlaceholderVersionList : BaseVersionList public override IPackageVersion latest => m_Versions[0]; - public override IPackageVersion recommended => m_Versions[0]; - public override IPackageVersion primary => m_Versions[0]; public PlaceholderVersionList(PlaceholderPackageVersion version) diff --git a/Modules/PackageManagerUI/Editor/Services/Common/VersionsFilter.cs b/Modules/PackageManagerUI/Editor/Services/Common/VersionsFilter.cs index 66df3c8673..5dbf24e257 100644 --- a/Modules/PackageManagerUI/Editor/Services/Common/VersionsFilter.cs +++ b/Modules/PackageManagerUI/Editor/Services/Common/VersionsFilter.cs @@ -11,7 +11,6 @@ internal static class VersionsFilter { public static UpmVersionList GetFilteredVersionList(UpmVersionList versionList, bool seeAllVersions, bool showPreRelease) { - // Only filter on Lifecycle tags if is a Unity package and the `seeAllVersions` option is not checked if (seeAllVersions || versionList.Any(v => v.availableRegistry != RegistryType.UnityRegistry)) return versionList; @@ -36,7 +35,7 @@ public static UpmVersionList GetFilteredVersionList(UpmVersionList versionList, } if (numVersionsFilteredOut <= 0) return versionList; - return new UpmVersionList(filteredVersions, versionList.lifecycleVersionString, versionList.lifecycleNextVersion); + return new UpmVersionList(filteredVersions, versionList.recommended?.versionString); } public static UpmVersionList UnloadVersionsIfNeeded(UpmVersionList versionList, bool loadAllVersions) @@ -50,7 +49,7 @@ public static UpmVersionList UnloadVersionsIfNeeded(UpmVersionList versionList, var numVersionsToUnload = numTotalVersions - keyVersions.Length; if (numVersionsToUnload <= 0) return versionList; - return new UpmVersionList(keyVersions, versionList.lifecycleVersionString, versionList.lifecycleNextVersion, numVersionsToUnload); + return new UpmVersionList(keyVersions, versionList.recommended?.versionString, numVersionsToUnload); } } } diff --git a/Modules/PackageManagerUI/Editor/Services/Interfaces/IVersionList.cs b/Modules/PackageManagerUI/Editor/Services/Interfaces/IVersionList.cs index e2e4a688b3..3253d3d536 100644 --- a/Modules/PackageManagerUI/Editor/Services/Interfaces/IVersionList.cs +++ b/Modules/PackageManagerUI/Editor/Services/Interfaces/IVersionList.cs @@ -18,18 +18,14 @@ internal interface IVersionList : IEnumerable IPackageVersion imported { get; } - // the recommended version to install or update to + // the version recommended by Unity, this should only be set for Unity packages IPackageVersion recommended { get; } - // the primary version is most important version that we want to show to the user - // it will be the default that will be displayed if no versions are selected - IPackageVersion primary { get; } - - IPackageVersion lifecycleVersion { get; } + IPackageVersion suggestedUpdate { get; } - bool isNonLifecycleVersionInstalled { get; } - - bool hasLifecycleVersion { get; } + // the primary version is the most important version that we want to show to the user + // it is the default version that will be displayed in the list as well as in the details + IPackageVersion primary { get; } IPackageVersion GetUpdateTarget(IPackageVersion version); diff --git a/Modules/PackageManagerUI/Editor/Services/Packages/Actions/AddAction.cs b/Modules/PackageManagerUI/Editor/Services/Packages/Actions/AddAction.cs index 777d385102..6aff66a835 100644 --- a/Modules/PackageManagerUI/Editor/Services/Packages/Actions/AddAction.cs +++ b/Modules/PackageManagerUI/Editor/Services/Packages/Actions/AddAction.cs @@ -45,7 +45,7 @@ protected override bool TriggerActionImplementation(IPackageVersion version) if (customizedDependencies.Any()) { var packageNameAndVersions = string.Join("\n\u2022 ", - customizedDependencies.Select(package => $"{package.displayName} - {package.versions.lifecycleVersion.version}").ToArray()); + customizedDependencies.Select(package => $"{package.displayName} - {package.versions.recommended.version}").ToArray()); var title = string.Format(L10n.Tr("Installing {0}"), version.GetDescriptor()); var message = customizedDependencies.Length == 1 ? diff --git a/Modules/PackageManagerUI/Editor/Services/Packages/Actions/DownloadUpdateAction.cs b/Modules/PackageManagerUI/Editor/Services/Packages/Actions/DownloadUpdateAction.cs index 063cadf5ee..3a2a017b6f 100644 --- a/Modules/PackageManagerUI/Editor/Services/Packages/Actions/DownloadUpdateAction.cs +++ b/Modules/PackageManagerUI/Editor/Services/Packages/Actions/DownloadUpdateAction.cs @@ -30,17 +30,17 @@ public override string GetTooltip(IPackageVersion version, bool isInProgress) return L10n.Tr("The download request has been sent. Please wait for the download to start."); var result = string.Format(L10n.Tr("Click to download the recommended version of this {0}."), version.GetDescriptor()); - if (IsAdaptedPackageUpdate(version.package.versions?.recommended, version.package.versions?.importAvailable)) + if (IsAdaptedPackageUpdate(version.package.versions?.suggestedUpdate, version.package.versions?.importAvailable)) result += L10n.Tr("\n*This package update has been adapted for this current version of Unity."); return result; } public override string GetText(IPackageVersion version, bool isInProgress) { - var recommended = version.package.versions.recommended; - if (string.IsNullOrEmpty(recommended?.versionString)) + var suggestedUpdate = version.package.versions.suggestedUpdate; + if (string.IsNullOrEmpty(suggestedUpdate?.versionString)) return L10n.Tr("Download update"); - return string.Format(IsAdaptedPackageUpdate(recommended, version.package.versions.importAvailable) ? L10n.Tr("Download update {0}*") : L10n.Tr("Download update {0}"), recommended.versionString); + return string.Format(IsAdaptedPackageUpdate(suggestedUpdate, version.package.versions.importAvailable) ? L10n.Tr("Download update {0}*") : L10n.Tr("Download update {0}"), suggestedUpdate.versionString); } public override string GetMultiSelectText(IPackageVersion version, bool isInProgress) @@ -55,15 +55,15 @@ public override bool IsInProgress(IPackageVersion version) // Adapted package update refers to the edge case where a publisher can publish different packages for different unity versions, resulting us // sometimes recommending user to update to a package with the same version string (or even lower version string) - private static bool IsAdaptedPackageUpdate(IPackageVersion recommended, IPackageVersion importAvailable) + private static bool IsAdaptedPackageUpdate(IPackageVersion suggestedUpdate, IPackageVersion importAvailable) { - return recommended?.versionString == importAvailable?.versionString || recommended?.uploadId < importAvailable?.uploadId; + return suggestedUpdate?.versionString == importAvailable?.versionString || suggestedUpdate?.uploadId < importAvailable?.uploadId; } private static bool IsUpdateAvailable(IPackageVersion version) { var importAvailable = version.package.versions.importAvailable; - var recommended = version.package.versions.recommended; - return importAvailable != null && recommended != null && recommended.uploadId != importAvailable.uploadId; + var suggestedUpdate = version.package.versions.suggestedUpdate; + return importAvailable != null && suggestedUpdate != null && suggestedUpdate.uploadId != importAvailable.uploadId; } } diff --git a/Modules/PackageManagerUI/Editor/Services/Packages/Actions/ImportUpdateAction.cs b/Modules/PackageManagerUI/Editor/Services/Packages/Actions/ImportUpdateAction.cs index 4156965cf9..ff1099ec00 100644 --- a/Modules/PackageManagerUI/Editor/Services/Packages/Actions/ImportUpdateAction.cs +++ b/Modules/PackageManagerUI/Editor/Services/Packages/Actions/ImportUpdateAction.cs @@ -22,7 +22,7 @@ public override bool IsVisible(IPackageVersion version) var versions = version.package.versions; return base.IsVisible(version) && versions.imported != null && - versions.importAvailable.uploadId == versions.recommended?.uploadId && + versions.importAvailable.uploadId == versions.suggestedUpdate?.uploadId && versions.importAvailable.uploadId != versions.imported.uploadId; } diff --git a/Modules/PackageManagerUI/Editor/Services/Packages/Actions/ReDownloadAction.cs b/Modules/PackageManagerUI/Editor/Services/Packages/Actions/ReDownloadAction.cs index e1996b83b4..a0e56da9ea 100644 --- a/Modules/PackageManagerUI/Editor/Services/Packages/Actions/ReDownloadAction.cs +++ b/Modules/PackageManagerUI/Editor/Services/Packages/Actions/ReDownloadAction.cs @@ -41,8 +41,8 @@ public override bool IsInProgress(IPackageVersion version) private static bool IsUpToDateOrNoUpdateFound(IPackageVersion version) { - var recommended = version.package.versions?.recommended; + var suggestedUpdate = version.package.versions?.suggestedUpdate; var importAvailable = version.package.versions?.importAvailable; - return importAvailable != null && (recommended == null || recommended.uploadId == importAvailable.uploadId); + return importAvailable != null && (suggestedUpdate == null || suggestedUpdate.uploadId == importAvailable.uploadId); } } diff --git a/Modules/PackageManagerUI/Editor/Services/Packages/Actions/ReImportAction.cs b/Modules/PackageManagerUI/Editor/Services/Packages/Actions/ReImportAction.cs index ff0139eaaf..2868427516 100644 --- a/Modules/PackageManagerUI/Editor/Services/Packages/Actions/ReImportAction.cs +++ b/Modules/PackageManagerUI/Editor/Services/Packages/Actions/ReImportAction.cs @@ -18,7 +18,7 @@ public override bool IsVisible(IPackageVersion version) { var versions = version.package.versions; return base.IsVisible(version) && versions.imported != null && - (versions.importAvailable.uploadId != versions.recommended?.uploadId || versions.importAvailable.uploadId == versions.imported.uploadId); + (versions.importAvailable.uploadId != versions.suggestedUpdate?.uploadId || versions.importAvailable.uploadId == versions.imported.uploadId); } public override string GetTooltip(IPackageVersion version, bool isInProgress) diff --git a/Modules/PackageManagerUI/Editor/Services/Packages/Actions/ResetAction.cs b/Modules/PackageManagerUI/Editor/Services/Packages/Actions/ResetAction.cs index 0778498203..8bb16b9dec 100644 --- a/Modules/PackageManagerUI/Editor/Services/Packages/Actions/ResetAction.cs +++ b/Modules/PackageManagerUI/Editor/Services/Packages/Actions/ResetAction.cs @@ -33,7 +33,7 @@ protected override bool TriggerActionImplementation(IPackageVersion version) return false; var packageNameAndVersions = string.Join("\n\u2022 ", - packagesToUninstall.Select(package => $"{package.displayName} - {package.versions.lifecycleVersion.version}").ToArray()); + packagesToUninstall.Select(package => $"{package.displayName} - {package.versions.recommended.version}").ToArray()); var title = string.Format(L10n.Tr("Resetting {0}"), version.GetDescriptor()); var message = packagesToUninstall.Length == 1 ? diff --git a/Modules/PackageManagerUI/Editor/Services/Packages/Actions/UpdateAction.cs b/Modules/PackageManagerUI/Editor/Services/Packages/Actions/UpdateAction.cs index 3710286530..e3ac8f6c77 100644 --- a/Modules/PackageManagerUI/Editor/Services/Packages/Actions/UpdateAction.cs +++ b/Modules/PackageManagerUI/Editor/Services/Packages/Actions/UpdateAction.cs @@ -75,7 +75,7 @@ protected override bool TriggerActionImplementation(IPackageVersion version) if (customizedDependencies.Any()) { var packageNameAndVersions = string.Join("\n\u2022 ", - customizedDependencies.Select(package => $"{package.displayName} - {package.versions.lifecycleVersion.version}").ToArray()); + customizedDependencies.Select(package => $"{package.displayName} - {package.versions.recommended.version}").ToArray()); var title = string.Format(L10n.Tr("Updating {0}"), version.GetDescriptor()); var message = customizedDependencies.Length == 1 ? diff --git a/Modules/PackageManagerUI/Editor/Services/Packages/PackageDatabase.cs b/Modules/PackageManagerUI/Editor/Services/Packages/PackageDatabase.cs index 2b2b65e449..387766282f 100644 --- a/Modules/PackageManagerUI/Editor/Services/Packages/PackageDatabase.cs +++ b/Modules/PackageManagerUI/Editor/Services/Packages/PackageDatabase.cs @@ -28,7 +28,6 @@ internal interface IPackageDatabase : IService IEnumerable GetFeaturesThatUseThisPackage(IPackageVersion version); IPackage[] GetCustomizedDependencies(IPackageVersion version, bool? rootDependenciesOnly = null); IEnumerable GetSamples(IPackageVersion version); - IPackageVersion GetLifecycleOrPrimaryVersion(string packageUniqueId); void OnPackagesModified(IList modified, bool isProgressUpdated = false); void UpdatePackages(IList toAddOrUpdate = null, IList toRemove = null); @@ -184,8 +183,9 @@ public IPackage[] GetCustomizedDependencies(IPackageVersion version, bool? rootD { return version?.dependencies?.Select(d => GetPackage(d.name)).Where(p => { - return p?.versions.isNonLifecycleVersionInstalled == true - && (rootDependenciesOnly == null || p.versions.installed.isDirectDependency == rootDependenciesOnly); + var installed = p?.versions.installed; + return installed != null && p.versions.recommended?.isInstalled == false + && (rootDependenciesOnly == null || installed.isDirectDependency == rootDependenciesOnly); }).ToArray() ?? new IPackage[0]; } @@ -203,12 +203,6 @@ public IEnumerable GetSamples(IPackageVersion version) return samples; } - public IPackageVersion GetLifecycleOrPrimaryVersion(string packageUniqueId) - { - var versions = GetPackage(packageUniqueId)?.versions; - return versions?.lifecycleVersion ?? versions?.primary; - } - public void OnAfterDeserialize() { foreach (var p in m_SerializedPackages) diff --git a/Modules/PackageManagerUI/Editor/Services/Upm/UpmPackageVersion.cs b/Modules/PackageManagerUI/Editor/Services/Upm/UpmPackageVersion.cs index 141286f58b..4b2784e36b 100644 --- a/Modules/PackageManagerUI/Editor/Services/Upm/UpmPackageVersion.cs +++ b/Modules/PackageManagerUI/Editor/Services/Upm/UpmPackageVersion.cs @@ -234,23 +234,20 @@ private void RefreshTags(PackageInfo packageInfo) if (!HasTag(PackageTag.Unity) || HasTag(PackageTag.Deprecated) || isInvalidSemVerInManifest) return; - var isLifecycleVersionValid = SemVersionParser.TryParse(packageInfo.unityLifecycle?.version, out var lifecycleVersionParsed); if (m_Version?.HasPreReleaseVersionTag() == true) { // must match exactly to be release candidate - if (m_VersionString == packageInfo.unityLifecycle?.version) + if (m_VersionString == packageInfo.versions.recommended) m_Tag |= PackageTag.ReleaseCandidate; else m_Tag |= PackageTag.PreRelease; } - else if ((version?.Major == 0 && string.IsNullOrEmpty(version?.Prerelease)) || - m_Version?.IsExperimental() == true || - "Preview".Equals(version?.Prerelease.Split('.')[0], StringComparison.InvariantCultureIgnoreCase)) + else if ((m_Version?.Major == 0 && string.IsNullOrEmpty(m_Version?.Prerelease)) || + m_Version?.IsExperimental() == true || + "Preview".Equals(m_Version?.Prerelease.Split('.')[0], StringComparison.InvariantCultureIgnoreCase)) m_Tag |= PackageTag.Experimental; - else if (isLifecycleVersionValid && m_Version?.IsEqualOrPatchOf(lifecycleVersionParsed) == true) - { + else if (SemVersionParser.TryParse(packageInfo.versions.recommended, out var parsedSemVer) && m_Version?.IsEqualOrPatchOf(parsedSemVer) == true) m_Tag |= PackageTag.Release; - } } public override string GetDescriptor(bool isFirstLetterCapitalized = false) diff --git a/Modules/PackageManagerUI/Editor/Services/Upm/UpmVersionList.cs b/Modules/PackageManagerUI/Editor/Services/Upm/UpmVersionList.cs index d543eb4275..5679cee194 100644 --- a/Modules/PackageManagerUI/Editor/Services/Upm/UpmVersionList.cs +++ b/Modules/PackageManagerUI/Editor/Services/Upm/UpmVersionList.cs @@ -11,7 +11,7 @@ namespace UnityEditor.PackageManager.UI.Internal { [Serializable] - internal class UpmVersionList : BaseVersionList, ISerializationCallbackReceiver + internal class UpmVersionList : BaseVersionList { [SerializeField] private List m_Versions; @@ -24,64 +24,23 @@ public override IEnumerable key { get { - var installed = this.installed; - var resolvedLifecycleVersion = this.resolvedLifecycleVersion; - var resolvedLifecycleNextVersion = this.resolvedLifecycleNextVersion; + var installedVersion = installed; + var recommendedVersion = recommended; // if installed is experimental, return all versions higher than it - if (installed?.HasTag(PackageTag.Experimental) == true) - return m_Versions.Where(v => v == resolvedLifecycleVersion || v == resolvedLifecycleNextVersion - || v.version >= installed.version).Cast(); + if (installedVersion != null && installedVersion.HasTag(PackageTag.Experimental)) + return m_Versions.Where(v => v == recommendedVersion || v.version >= installedVersion.version); - var recommended = this.recommended; var keyVersions = new HashSet(); - if (recommended != null) - keyVersions.Add(recommended); + if (installedVersion != null) + keyVersions.Add(installedVersion); - if (installed != null) - keyVersions.Add(installed); + keyVersions.Add(recommendedVersion ?? latest); - if (resolvedLifecycleVersion != null) - { - keyVersions.Add(resolvedLifecycleVersion); - - // if the lifecycle.version is Release Candidate for this Editor version, still need to check if the release version is available - // and add that - if (resolvedLifecycleVersion.HasTag(PackageTag.ReleaseCandidate) && resolvedLifecycleVersion.version?.HasPreReleaseVersionTag() == true) - { - var latestReleasePatchOfUnityLifecycleVersion = m_Versions.LastOrDefault(v => !v.HasTag(PackageTag.PreRelease | PackageTag.ReleaseCandidate | PackageTag.Experimental) && - (v.version?.IsPatchOf(resolvedLifecycleVersion.version) == true || v.version?.IsMajorMinorPatchEqualTo(resolvedLifecycleVersion.version) == true)); - - if (latestReleasePatchOfUnityLifecycleVersion != null) - keyVersions.Add(latestReleasePatchOfUnityLifecycleVersion); - } - } - // if no version is set but installed is release, check if there exists a patch of it to add - else if (installed?.HasTag(PackageTag.Release) == true) - { - var latestReleasePatchOfInstalled = m_Versions.LastOrDefault(v => v.HasTag(PackageTag.Release) - && v.version?.IsPatchOf(installed.version) == true); - - if (latestReleasePatchOfInstalled != null) - keyVersions.Add(latestReleasePatchOfInstalled); - } - - // now add the proper Pre-Release version to key versions; latestUnityLifecycleNextVersion takes priority - if (resolvedLifecycleNextVersion != null) - keyVersions.Add(resolvedLifecycleNextVersion); - // if nextVersion is not set but the installed version is Pre-Release, add the latest iteration on it to key versions - else if (installed?.HasTag(PackageTag.PreRelease) == true) - { - var keyPreRelease = m_Versions.LastOrDefault(v => v.HasTag(PackageTag.PreRelease) - && (v.version?.IsHigherPreReleaseIterationOf(installed.version) == true)); - - if (keyPreRelease != null) - keyVersions.Add(keyPreRelease); - } - - if (!keyVersions.Any()) - keyVersions.Add(primary); + var suggestedUpdateVersion = suggestedUpdate; + if (suggestedUpdateVersion != null) + keyVersions.Add(suggestedUpdateVersion); return keyVersions.OrderBy(v => v.version); } @@ -92,115 +51,50 @@ public override IEnumerable key public override IPackageVersion installed => m_InstalledIndex < 0 ? null : m_Versions[m_InstalledIndex]; [SerializeField] - private string m_LifecycleVersionString; - private SemVersion? m_LifecycleVersion; - internal string lifecycleVersionString => m_LifecycleVersionString; + private int m_RecommendedIndex; + public override IPackageVersion recommended => m_RecommendedIndex < 0 ? null : m_Versions[m_RecommendedIndex]; - // the lifeCycle version from the Editor manifest, if it exists - public override IPackageVersion lifecycleVersion + public override IPackageVersion suggestedUpdate { get { - return m_LifecycleVersion == null ? null : m_Versions.FirstOrDefault(v => !v.HasTag(PackageTag.Custom | PackageTag.Local | PackageTag.Git) && v.version == m_LifecycleVersion); - } - } + var installedVersion = installed; + if (installedVersion == null || installedVersion.HasTag(PackageTag.VersionLocked | PackageTag.InstalledFromPath)) + return null; - // the latest patch of lifecycle version if it exists, or the exact - // version if version is set to a pre-release - private IPackageVersion resolvedLifecycleVersion - { - get - { - // if it has a -pre tag in the version, it's a Release Candidate, and we must return the exact version which matches, not a - // higher patch or iteration - if (m_LifecycleVersion?.HasPreReleaseVersionTag() == true) - return m_Versions.LastOrDefault(v => v.HasTag(PackageTag.ReleaseCandidate) && - v.version == m_LifecycleVersion); - // otherwise, it's either Release or tagged as Release Candidate because Editor is in Alpha or Beta, and we should - // take the latest patch of it - else - return m_Versions.LastOrDefault(v => !v.HasTag(PackageTag.PreRelease | PackageTag.Experimental) && - ((v.version?.IsPatchOf(m_LifecycleVersion) == true) || v.version == m_LifecycleVersion)); - } - } + if (installedVersion.HasTag(PackageTag.Experimental) || m_Versions.Any(v => v.availableRegistry != RegistryType.UnityRegistry)) + return latest.isInstalled ? null : latest; - [SerializeField] - private string m_LifecycleNextVersionString; - private SemVersion? m_LifecycleNextVersion; - internal string lifecycleNextVersion => m_LifecycleNextVersionString; - private IPackageVersion resolvedLifecycleNextVersion - { - get - { - return m_Versions.LastOrDefault(v => v.version?.IsEqualOrPatchOf(m_LifecycleNextVersion) == true); - } - } + var recommendedVersion = recommended; + if (recommendedVersion is { isInstalled: false } && recommendedVersion.version >= installedVersion.version) + return recommendedVersion; - public void OnBeforeSerialize() - { - // do nothing + var latestSafePatch = GetLatestSafePatch(installedVersion); + return latestSafePatch is { isInstalled: true } ? null : latestSafePatch; + } } - public void OnAfterDeserialize() + // A "safe" patch is a patch that is not lower in safety level (regarding prerelease) compared to the original version. For example, + // `1.0.1` is a safe patch for both `1.0.0-pre.0` and `1.0.0`, however + // `1.0.1-pre.1` is NOT a safe patch for `1.0.0` but can be considered a safe patch for `1.0.0-pre.0` + private IPackageVersion GetLatestSafePatch(IPackageVersion version) { - SemVersionParser.TryParse(m_LifecycleVersionString, out m_LifecycleVersion); - SemVersionParser.TryParse(m_LifecycleNextVersionString, out m_LifecycleNextVersion); + if (version == null) + return null; + var availableVersions = m_Versions.Where(i => i != version && !i.HasTag(PackageTag.InstalledFromPath)).ToArray(); + if (availableVersions.Length == 0) + return null; + var patchVersionString = SemVersionHelper.MaxSatisfying(version.versionString, availableVersions.Select(v => v.versionString).ToArray(), ResolutionStrategy.HighestPatch, !string.IsNullOrEmpty(version.version?.Prerelease)); + return string.IsNullOrEmpty(patchVersionString) ? null : availableVersions.LastOrDefault(v => v.versionString == patchVersionString); } public override IPackageVersion latest => m_Versions.LastOrDefault(); - public override IPackageVersion recommended - { - get - { - var installed = this.installed; - if (installed != null && installed.HasTag(PackageTag.VersionLocked)) - return installed; - - if (m_Versions.Any(v => v.availableRegistry != RegistryType.UnityRegistry)) - return latest; - - // for Unity packages, we should only recommend versions that have been tested with the Editor; - // this means they have to be either the lifecycle version or nextVersion in the manifest - // lifecycle version will take precedence over nextVersion - var resolvedLifecycleVersion = this.resolvedLifecycleVersion; - var resolvedLifecycleNextVersion = this.resolvedLifecycleNextVersion; - - var recommendedLifecycleVersion = resolvedLifecycleVersion; - - if (installed == null) - return recommendedLifecycleVersion - ?? resolvedLifecycleNextVersion; - // nextVersion, since in pre-release, will only be recommended if it's higher than the installed - else - { - var useNextVersion = resolvedLifecycleNextVersion != null && resolvedLifecycleNextVersion.version > installed.version; - return recommendedLifecycleVersion - ?? (useNextVersion ? resolvedLifecycleNextVersion : null); - } - } - } - public override IPackageVersion primary => installed ?? recommended ?? latest; - - public override bool isNonLifecycleVersionInstalled => CheckIsNonLifecycleVersionInstalled(installed, lifecycleVersion); - - // If the user installs a local, git or embedded package with the same version string as the lifecycle version, it is consider as a non lifecycle version - // We also consider that installation as the `lifecycle` version. Patches of lifecycle version are also considered lifecycle version. - // We might change this behaviour later - internal static bool CheckIsNonLifecycleVersionInstalled(IPackageVersion installed, IPackageVersion lifecycleVersion) - { - return installed != null && lifecycleVersion != null && (installed.HasTag(PackageTag.Custom | PackageTag.Git) || installed.version?.IsEqualOrPatchOf(lifecycleVersion.version) != true); - } - - public override bool hasLifecycleVersion => m_LifecycleVersion != null || m_LifecycleNextVersion != null; - public override IPackageVersion GetUpdateTarget(IPackageVersion version) { - if (version?.isInstalled == true && version != recommended) - return key.LastOrDefault() ?? version; - return version; + return version?.isInstalled == true ? suggestedUpdate ?? version : version; } // This function is only used to update the object, not to actually perform the add operation @@ -223,7 +117,7 @@ private static int AddToSortedVersions(List sortedVersions, U if (versionToAdd.version != null && (sortedVersions[i].version?.CompareTo(versionToAdd.version) ?? -1) < 0) continue; // note that the difference between this and the previous function is that - // two upm package versions could have the the same version but different package id + // two upm package versions could have the same version but different package id if (sortedVersions[i].packageId == versionToAdd.packageId) { sortedVersions[i] = versionToAdd; @@ -246,8 +140,7 @@ public UpmVersionList(PackageInfo searchInfo, PackageInfo installedInfo, Registr var mainVersion = new UpmPackageVersion(mainInfo, mainInfo == installedInfo, availableRegistry); m_Versions = mainInfo.versions.compatible.Select(v => { - SemVersion? version; - SemVersionParser.TryParse(v, out version); + SemVersionParser.TryParse(v, out var version); return new UpmPackageVersion(mainInfo, false, version, mainVersion.displayName, availableRegistry); }).ToList(); AddToSortedVersions(m_Versions, mainVersion); @@ -255,20 +148,17 @@ public UpmVersionList(PackageInfo searchInfo, PackageInfo installedInfo, Registr if (mainInfo != installedInfo && installedInfo != null) AddInstalledVersion(new UpmPackageVersion(installedInfo, true, availableRegistry)); } - m_InstalledIndex = m_Versions.FindIndex(v => v.isInstalled); - var recommendedVersion = mainInfo?.unityLifecycle?.recommendedVersion; - if (string.IsNullOrEmpty(recommendedVersion)) - recommendedVersion = mainInfo?.unityLifecycle?.version; - SetLifecycleVersions(recommendedVersion, mainInfo?.unityLifecycle?.nextVersion); + m_InstalledIndex = m_Versions?.FindIndex(v => v.isInstalled) ?? -1; + SetRecommendedVersion(mainInfo?.versions.recommended); UpdateExtraPackageInfos(extraVersions, availableRegistry); m_NumUnloadedVersions = 0; } - public UpmVersionList(IEnumerable versions, string unityLifecycleInfoVersion = null, string unityLifecycleInfoNextVersion = null, int numUnloadedVersions = 0) + public UpmVersionList(IEnumerable versions, string recommendedVersionString = null, int numUnloadedVersions = 0) { m_Versions = versions?.ToList() ?? new List(); m_InstalledIndex = m_Versions.FindIndex(v => v.isInstalled); - SetLifecycleVersions(unityLifecycleInfoVersion, unityLifecycleInfoNextVersion); + SetRecommendedVersion(recommendedVersionString); m_NumUnloadedVersions = numUnloadedVersions; } @@ -281,15 +171,12 @@ private void UpdateExtraPackageInfos(Dictionary extraVersio version.UpdatePackageInfo(packageInfo, availableRegistry); } - private void SetLifecycleVersions(string unityLifecycleInfoVersion, string unityLifecycleInfoNextVersion) + private void SetRecommendedVersion(string versionString) { - m_LifecycleVersionString = unityLifecycleInfoVersion; - m_LifecycleNextVersionString = unityLifecycleInfoNextVersion; - - if (!string.IsNullOrEmpty(m_LifecycleVersionString)) - SemVersionParser.TryParse(m_LifecycleVersionString, out m_LifecycleVersion); - if (!string.IsNullOrEmpty(m_LifecycleNextVersionString)) - SemVersionParser.TryParse(m_LifecycleNextVersionString, out m_LifecycleNextVersion); + if (!string.IsNullOrEmpty(versionString)) + m_RecommendedIndex = m_Versions.FindIndex(v => v.HasTag(PackageTag.Unity) && v.versionString == versionString); + else + m_RecommendedIndex = -1; } public override IEnumerator GetEnumerator() diff --git a/Modules/PackageManagerUI/Editor/UI/PackageDetailsHeader.cs b/Modules/PackageManagerUI/Editor/UI/PackageDetailsHeader.cs index 87144bc02c..0d991cd95d 100644 --- a/Modules/PackageManagerUI/Editor/UI/PackageDetailsHeader.cs +++ b/Modules/PackageManagerUI/Editor/UI/PackageDetailsHeader.cs @@ -285,10 +285,10 @@ private void RefreshVersionInfoIcon() return; } - // In Lifecycle V2, if a Unity package doesn't have a lifecycle version (listed in the editor manifest), + // If a Unity package doesn't have a recommended version (decided by versions set in the editor manifest or remote manifest override), // then that package is not considered part of the Unity Editor "product" and we need to let users know. var unityVersionString = m_Application.unityVersion; - if (!m_Package.versions.hasLifecycleVersion && m_Version.HasTag(PackageTag.Unity) && !m_Version.HasTag(PackageTag.BuiltIn)) + if (m_Version.HasTag(PackageTag.Unity) && !m_Version.HasTag(PackageTag.BuiltIn) && m_Package.versions.recommended == null) { UIUtils.SetElementDisplay(versionInfoIcon, true); versionInfoIcon.tooltip = string.Format(L10n.Tr("This package is not officially supported for Unity {0}."), unityVersionString); @@ -296,10 +296,8 @@ private void RefreshVersionInfoIcon() } // We want to let users know when they are using a version different than the recommended. - // The recommended version is the resolvedLifecycleVersion or the resolvedLifecycleNextVersion. // However, we don't want to show the info icon if the version currently installed - // is a higher patch version of the one in the editor manifest (still considered - // recommended). + // is a higher patch version of the one in the editor manifest (still considered recommended). var recommended = m_Package.versions.recommended; if (m_Version.isInstalled && m_Package.state != PackageState.InstalledAsDependency diff --git a/Modules/PackageManagerUI/Editor/UI/PackageDetailsTabs/PackageDetailsFeatureDependenciesTab.cs b/Modules/PackageManagerUI/Editor/UI/PackageDetailsTabs/PackageDetailsFeatureDependenciesTab.cs index 0c9c85af32..e9b0f54051 100644 --- a/Modules/PackageManagerUI/Editor/UI/PackageDetailsTabs/PackageDetailsFeatureDependenciesTab.cs +++ b/Modules/PackageManagerUI/Editor/UI/PackageDetailsTabs/PackageDetailsFeatureDependenciesTab.cs @@ -96,12 +96,12 @@ public FeatureState GetFeatureState(IPackageVersion version) if (installedVersion == null) return FeatureState.None; - var isNonLifecycleVersionInstalled = package.versions.isNonLifecycleVersionInstalled; + var recommendedVersionExistsButNotInstalled = package.versions.recommended?.isInstalled == false; // User manually decide to install a different version - if ((installedVersion.isDirectDependency && isNonLifecycleVersionInstalled) || installedVersion.HasTag(PackageTag.InDevelopment)) + if ((installedVersion.isDirectDependency && recommendedVersionExistsButNotInstalled) || installedVersion.HasTag(PackageTag.InDevelopment)) return FeatureState.Customized; // The installed version is changed by the SAT solver, not overridden by user - if (isNonLifecycleVersionInstalled) + if (recommendedVersionExistsButNotInstalled) return FeatureState.Info; return FeatureState.None; @@ -127,7 +127,8 @@ protected override void RefreshContent(IPackageVersion version) dependencyList.Clear(); foreach (var dependency in version.dependencies) { - var packageVersion = m_PackageDatabase.GetLifecycleOrPrimaryVersion(dependency.name); + var dependencyPackage = m_PackageDatabase.GetPackage(dependency.name); + var packageVersion = dependencyPackage?.versions.recommended ?? dependencyPackage?.versions.primary; var featureState = GetFeatureState(packageVersion); var item = packageVersion != null ? new FeatureDependencyItem(version, packageVersion, featureState) : new FeatureDependencyItem(dependency.name); @@ -149,19 +150,20 @@ private void OnDependencyItemClicked(IPackageVersion version, string dependencyN private void RefreshSelection(IPackageVersion version = null) { - var selectedDependencyPackageId = m_PackageManagerPrefs.selectedFeatureDependency; + var selectedDependencyPackageName = m_PackageManagerPrefs.selectedFeatureDependency; if (version == null) { var dependencies = m_FeatureVersion?.dependencies; if (dependencies?.Any() != true) return; - if (string.IsNullOrEmpty(selectedDependencyPackageId) || !dependencies.Any(d => d.name == selectedDependencyPackageId)) + if (string.IsNullOrEmpty(selectedDependencyPackageName) || !dependencies.Any(d => d.name == selectedDependencyPackageName)) { - selectedDependencyPackageId = dependencies[0].name; - m_PackageManagerPrefs.selectedFeatureDependency = selectedDependencyPackageId; + selectedDependencyPackageName = dependencies[0].name; + m_PackageManagerPrefs.selectedFeatureDependency = selectedDependencyPackageName; } - version = m_PackageDatabase.GetLifecycleOrPrimaryVersion(selectedDependencyPackageId); + var dependencyPackage = m_PackageDatabase.GetPackage(selectedDependencyPackageName); + version = dependencyPackage?.versions.recommended ?? dependencyPackage?.versions.primary; } // If the package is not installed and not discoverable, we have to display the package's ID name (ex: com.unity.adaptiveperformance.samsung.android) @@ -173,9 +175,9 @@ private void RefreshSelection(IPackageVersion version = null) UIUtils.SetElementDisplay(dependencyInfoBox, showElementsInDetailsView); foreach (var item in dependencyList.Children().OfType()) - item.EnableInClassList(k_SelectedClassName, item.packageName == selectedDependencyPackageId); + item.EnableInClassList(k_SelectedClassName, item.packageName == selectedDependencyPackageName); - dependencyTitle.value = version?.displayName ?? selectedDependencyPackageId; + dependencyTitle.value = version?.displayName ?? selectedDependencyPackageName; dependencyDesc.value = version?.description ?? L10n.Tr("This package will be automatically installed with this feature."); if (!showElementsInDetailsView) diff --git a/Modules/PackageManagerUI/Editor/UI/PackageDetailsTabs/PackageDetailsVersionHistoryItem.cs b/Modules/PackageManagerUI/Editor/UI/PackageDetailsTabs/PackageDetailsVersionHistoryItem.cs index 995395a5da..4d76867dd8 100644 --- a/Modules/PackageManagerUI/Editor/UI/PackageDetailsTabs/PackageDetailsVersionHistoryItem.cs +++ b/Modules/PackageManagerUI/Editor/UI/PackageDetailsTabs/PackageDetailsVersionHistoryItem.cs @@ -34,8 +34,6 @@ public PackageDetailsVersionHistoryItem(IResourceLoader resourceLoader, IApplicationProxy applicationProxy, IPackageLinkFactory packageLinkFactory, IPackageVersion version, - bool multipleVersionsVisible, - bool isLatestVersion, bool expanded, PackageAction action) { @@ -69,7 +67,7 @@ public PackageDetailsVersionHistoryItem(IResourceLoader resourceLoader, m_Button = new PackageToolBarSimpleButton(action); versionHistoryItemToggleRightContainer.Add(m_Button.element); } - Refresh(multipleVersionsVisible, isLatestVersion); + Refresh(); } public void StopSpinner() @@ -78,56 +76,46 @@ public void StopSpinner() versionHistoryItemToggleSpinner?.Stop(); } - private void Refresh(bool multipleVersionsVisible, bool isLatestVersion) + private void Refresh() { var isVisible = m_Version != null; UIUtils.SetElementDisplay(this, isVisible); if (!isVisible) return; - RefreshHeader(multipleVersionsVisible, isLatestVersion); + RefreshHeader(); RefreshContent(); m_Button?.Refresh(m_Version); } - private void RefreshHeader(bool multipleVersionsVisible, bool isLatestVersion) + private void RefreshHeader() { versionHistoryItemToggle.text = m_Version?.versionString; m_VersionHistoryItemTag.Refresh(m_Version); - RefreshState(multipleVersionsVisible, isLatestVersion); + RefreshState(); } - private void RefreshState(bool multipleVersionsVisible, bool isLatestVersion) + private void RefreshState() { + versionHistoryItemState.text = string.Empty; + versionHistoryItemState.tooltip = string.Empty; + if (m_Version == null) - { - versionHistoryItemState.text = string.Empty; return; - } var primary = m_Version.package.versions.primary; - var recommended = m_Version.package.versions.recommended; - var versionInManifest = primary?.versionInManifest; - var stateText = string.Empty; - - if (m_Version == primary) + if (m_Version == primary && m_Version.isInstalled) + versionHistoryItemState.text = m_Version.isDirectDependency ? L10n.Tr("Installed") : L10n.Tr("Installed as dependency"); + else if (m_Version != primary && primary.versionInManifest == m_Version.versionString) + versionHistoryItemState.text = L10n.Tr("Requested"); + else if (m_Version == m_Version.package.versions.recommended) { - if (m_Version.isInstalled) - stateText = L10n.Tr(m_Version.isDirectDependency ? "Installed" : "Installed as dependency"); - else if (m_Version == recommended && multipleVersionsVisible && m_Version.HasTag(PackageTag.Unity)) - stateText = L10n.Tr("Recommended"); - else if (!m_Version.HasTag(PackageTag.Unity) && multipleVersionsVisible && isLatestVersion) - stateText = L10n.Tr("Latest"); + versionHistoryItemState.text = L10n.Tr("Recommended"); + versionHistoryItemState.tooltip = L10n.Tr("Recommended for this Unity release"); } - else if (versionInManifest == m_Version.versionString) - stateText = L10n.Tr("Requested"); - else if (m_Version == recommended && m_Version.HasTag(PackageTag.Unity)) - stateText = L10n.Tr("Recommended"); - else if ((primary.isInstalled || !m_Version.HasTag(PackageTag.Unity)) && isLatestVersion) - stateText = L10n.Tr("Latest"); - - versionHistoryItemState.text = stateText; + else if (m_Version == m_Version.package.versions.latest) + versionHistoryItemState.text = L10n.Tr("Latest"); } private void RefreshContent() diff --git a/Modules/PackageManagerUI/Editor/UI/PackageDetailsTabs/PackageDetailsVersionsTab.cs b/Modules/PackageManagerUI/Editor/UI/PackageDetailsTabs/PackageDetailsVersionsTab.cs index 0997cef5dd..76cc9550e3 100644 --- a/Modules/PackageManagerUI/Editor/UI/PackageDetailsTabs/PackageDetailsVersionsTab.cs +++ b/Modules/PackageManagerUI/Editor/UI/PackageDetailsTabs/PackageDetailsVersionsTab.cs @@ -62,7 +62,7 @@ public PackageDetailsVersionsTab(IUnityConnectProxy unityConnect, m_VersionsShowOthersButton = new Button { name = "versionsShowAllButton", text = L10n.Tr("See other versions") }; m_VersionsToolbar.Add(m_VersionsShowOthersButton); - + m_LoadingLabel = new Label { name = "versionsLoadingLabel", text = L10n.Tr("Loading...") }; m_Container.Add(m_LoadingLabel); @@ -115,9 +115,7 @@ protected override void RefreshContent(IPackageVersion version) UIUtils.SetElementDisplay(m_VersionsToolbar, seeVersionsToolbar); UIUtils.SetElementDisplay(m_LoadingLabel, false); - var latestVersion = m_Version.package?.versions.latest; var primaryVersion = m_Version.package?.versions.primary; - var multipleVersionsVisible = versions.Skip(1).Any(); foreach (var v in versions.Reverse()) { @@ -133,7 +131,6 @@ protected override void RefreshContent(IPackageVersion version) action = new AddAction(m_OperationDispatcher, m_ApplicationProxy, m_PackageDatabase); var isExpanded = m_PackageManagerPrefs.IsVersionHistoryItemExpanded(v.uniqueId); - var isLatest = v == latestVersion; var versionHistoryItem = new PackageDetailsVersionHistoryItem(m_ResourceLoader, m_PackageDatabase, m_OperationDispatcher, @@ -141,8 +138,6 @@ protected override void RefreshContent(IPackageVersion version) m_ApplicationProxy, m_PackageLinkFactory, v, - multipleVersionsVisible, - isLatest, isExpanded, action); versionHistoryItem.onToggleChanged += expanded => m_PackageManagerPrefs.SetVersionHistoryItemExpanded(versionHistoryItem.version?.uniqueId, expanded); diff --git a/Modules/PackageManagerUI/Editor/UI/PackageItem.cs b/Modules/PackageManagerUI/Editor/UI/PackageItem.cs index 3634ec664c..57070719dc 100644 --- a/Modules/PackageManagerUI/Editor/UI/PackageItem.cs +++ b/Modules/PackageManagerUI/Editor/UI/PackageItem.cs @@ -185,27 +185,9 @@ private bool RefreshSpinner() private void RefreshFeatureState() { - var featureState = FeatureState.None; - foreach (var dependency in targetVersion.dependencies) + if (GetFeatureState(targetVersion) == FeatureState.Customized) { - var packageVersion = m_PackageDatabase.GetLifecycleOrPrimaryVersion(dependency.name); - if (packageVersion == null) - continue; - - var installedVersion = packageVersion.package?.versions.installed; - if (installedVersion == null) - continue; - // User manually decide to install a different version - else if ((installedVersion.isDirectDependency && package.versions.isNonLifecycleVersionInstalled) || installedVersion.HasTag(PackageTag.InDevelopment)) - { - featureState = FeatureState.Customized; - break; - } - } - - if (featureState == FeatureState.Customized) - { - m_CurrentFeatureState = featureState.ToString().ToLower(); + m_CurrentFeatureState = FeatureState.Customized.ToString().ToLower(); m_InfoStateIcon.AddToClassList(m_CurrentFeatureState); m_InfoStateIcon.tooltip = L10n.Tr("This feature has been manually customized"); } @@ -216,6 +198,27 @@ private void RefreshFeatureState() } } + private FeatureState GetFeatureState(IPackageVersion featureVersion) + { + if (featureVersion?.isInstalled != true) + return FeatureState.None; + + foreach (var dependency in featureVersion.dependencies) + { + var dependencyPackage = m_PackageDatabase.GetPackage(dependency.name); + var installedVersion = dependencyPackage?.versions.installed; + if (installedVersion == null) + continue; + + if (installedVersion.HasTag(PackageTag.InDevelopment)) + return FeatureState.Customized; + + if (installedVersion.isDirectDependency && dependencyPackage.versions.recommended?.isInstalled == false) + return FeatureState.Customized; + } + return FeatureState.None; + } + public void RefreshSelection() { var enable = package != null && m_PageManager.activePage.GetSelection().Contains(package.uniqueId); diff --git a/Modules/PackageManagerUI/Editor/UI/PackageListView.cs b/Modules/PackageManagerUI/Editor/UI/PackageListView.cs index 3499cb1f25..c6320b50c9 100644 --- a/Modules/PackageManagerUI/Editor/UI/PackageListView.cs +++ b/Modules/PackageManagerUI/Editor/UI/PackageListView.cs @@ -83,7 +83,7 @@ private void UnbindItem(VisualElement item, int index) { var package = (item as PackageItem)?.package; var product = package?.product; - if(product == null) + if (product == null) return; m_BackgroundFetchHandler.RemoveFromFetchProductInfoQueue(product.id); @@ -105,7 +105,7 @@ private void BindItem(VisualElement item, int index) m_PackageItemsLookup[visualState.packageUniqueId] = packageItem; var product = package?.product; - if(product == null) + if (product == null) return; if (package.versions.primary.HasTag(PackageTag.Placeholder)) @@ -272,8 +272,6 @@ public void OnKeyDownShortcut(KeyDownEvent evt) evt.StopPropagation(); break; } - - Focus(); } public void OnNavigationMoveShortcut(NavigationMoveEvent evt) diff --git a/Modules/PackageManagerUI/Editor/UI/PackageSelectionEditor.cs b/Modules/PackageManagerUI/Editor/UI/PackageSelectionEditor.cs index 4c4cbf22d7..5367ab4cfb 100644 --- a/Modules/PackageManagerUI/Editor/UI/PackageSelectionEditor.cs +++ b/Modules/PackageManagerUI/Editor/UI/PackageSelectionEditor.cs @@ -238,7 +238,7 @@ private void DrawDependencyListElement(Rect rect, int index, bool isActive, bool if (package != null) { packageName = string.IsNullOrEmpty(package.displayName) ? package.name : package.displayName; - var versionToUse = package.versions.lifecycleVersion ?? package.versions.primary; + var versionToUse = package.versions.recommended ?? package.versions.primary; if (versionString == "default") versionString = versionToUse?.versionString ?? dependency.version; @@ -256,7 +256,7 @@ private void DrawDependencyListElement(Rect rect, int index, bool isActive, bool rect.width = w / 3 - 4; EditorGUI.SelectableLabel(rect, versionString); } - + private bool IsPackageEditable() { if (m_Version == null || !m_Version.HasTag(PackageTag.Custom)) diff --git a/Modules/PackageManagerUI/Editor/UI/PackageTagLabel/PackageReleaseTagLabel.cs b/Modules/PackageManagerUI/Editor/UI/PackageTagLabel/PackageReleaseTagLabel.cs index b0ab1cbdf9..141a55463b 100644 --- a/Modules/PackageManagerUI/Editor/UI/PackageTagLabel/PackageReleaseTagLabel.cs +++ b/Modules/PackageManagerUI/Editor/UI/PackageTagLabel/PackageReleaseTagLabel.cs @@ -3,13 +3,12 @@ // https://unity3d.com/legal/licenses/Unity_Reference_Only_License using System.Linq; -using UnityEngine.UIElements; namespace UnityEditor.PackageManager.UI.Internal { internal class PackageReleaseTagLabel : PackageBaseTagLabel { - private IPackageDatabase m_PackageDatabase; + private readonly IPackageDatabase m_PackageDatabase; public PackageReleaseTagLabel(IPackageDatabase packageDatabase) { m_PackageDatabase = packageDatabase; @@ -22,7 +21,7 @@ private bool IsVisible(IPackageVersion version) if (!version.HasTag(PackageTag.Release)) return false; if (version.HasTag(PackageTag.Feature)) - return version.dependencies != null && version.dependencies.All(d => m_PackageDatabase.GetLifecycleOrPrimaryVersion(d.name)?.HasTag(PackageTag.Release) == true); + return version.dependencies != null && version.dependencies.All(d => m_PackageDatabase.GetPackage(d.name)?.versions.recommended?.HasTag(PackageTag.Release) == true); return true; } diff --git a/Modules/Physics/ScriptBindings/ContactModification.bindings.cs b/Modules/Physics/ScriptBindings/ContactModification.bindings.cs index 151f00ed82..299a954be8 100644 --- a/Modules/Physics/ScriptBindings/ContactModification.bindings.cs +++ b/Modules/Physics/ScriptBindings/ContactModification.bindings.cs @@ -7,6 +7,7 @@ using System.Runtime.InteropServices; using Unity.Collections; using Unity.Collections.LowLevel.Unsafe; +using UnityEngine.Bindings; namespace UnityEngine { @@ -39,7 +40,10 @@ private static unsafe void PhysXOnSceneContactModify(PhysicsScene scene, IntPtr } } + [StructLayout(LayoutKind.Sequential)] + [NativeHeader("Modules/Physics/PhysicsCollisionGeometry.h")] + [NativeHeader("Modules/Physics/PhysXContactModification.h")] public struct ModifiableContactPair { private IntPtr actor; @@ -57,15 +61,30 @@ public struct ModifiableContactPair private int numContacts; private IntPtr contacts; - public int colliderInstanceID => Physics.ResolveShapeToInstanceID(shape); - public int otherColliderInstanceID => Physics.ResolveShapeToInstanceID(otherShape); - public int bodyInstanceID => Physics.ResolveActorToInstanceID(actor); - public int otherBodyInstanceID => Physics.ResolveActorToInstanceID(otherActor); + [FreeFunction("Physics::PhysxCompatibility::TranslateTriangleIndex", true)] + extern internal static uint TranslateTriangleIndex(IntPtr shapePtr, uint rawIndex); + + [FreeFunction("Physics::PhysxCompatibility::ResolveShapeToInstanceID", true)] + extern internal static int ResolveShapeToInstanceID(IntPtr shapePtr); + + [FreeFunction("Physics::PhysxCompatibility::ResolveActorToInstanceID", true)] + extern internal static int ResolveActorToInstanceID(IntPtr actorPtr); + + [FreeFunction("Physics::PhysxCompatibility::GetActorLinearVelocity", true)] + extern internal static Vector3 GetActorLinearVelocity(IntPtr actorPtr); + + [FreeFunction("Physics::PhysxCompatibility::GetActorAngularVelocity", true)] + extern internal static Vector3 GetActorAngularVelocity(IntPtr actorPtr); + + public int colliderInstanceID => ResolveShapeToInstanceID(shape); + public int otherColliderInstanceID => ResolveShapeToInstanceID(otherShape); + public int bodyInstanceID => ResolveActorToInstanceID(actor); + public int otherBodyInstanceID => ResolveActorToInstanceID(otherActor); - public Vector3 bodyVelocity => Physics.GetActorLinearVelocity(actor); - public Vector3 bodyAngularVelocity => Physics.GetActorAngularVelocity(actor); - public Vector3 otherBodyVelocity => Physics.GetActorLinearVelocity(otherActor); - public Vector3 otherBodyAngularVelocity => Physics.GetActorAngularVelocity(otherActor); + public Vector3 bodyVelocity => GetActorLinearVelocity(actor); + public Vector3 bodyAngularVelocity => GetActorAngularVelocity(actor); + public Vector3 otherBodyVelocity => GetActorLinearVelocity(otherActor); + public Vector3 otherBodyAngularVelocity => GetActorAngularVelocity(otherActor); public int contactCount => numContacts; @@ -183,7 +202,7 @@ public unsafe uint GetFaceIndex(int i) var item = new IntPtr(contacts.ToInt64() + numContacts * sizeof(ModifiableContact) + (numContacts + i) * sizeof(int)); uint rawIndex = *(uint*)item; - return Physics.TranslateTriangleIndex(otherShape, rawIndex); + return TranslateTriangleIndex(otherShape, rawIndex); } return 0xffffFFFF; diff --git a/Modules/Physics/ScriptBindings/Physics.bindings.cs b/Modules/Physics/ScriptBindings/Physics.bindings.cs index 7e5b578f0f..394e490c19 100644 --- a/Modules/Physics/ScriptBindings/Physics.bindings.cs +++ b/Modules/Physics/ScriptBindings/Physics.bindings.cs @@ -1066,51 +1066,21 @@ public static void BakeMesh(int meshID, bool convex) [StaticAccessor("PhysicsManager", StaticAccessorType.DoubleColon)] internal static extern void DisconnectPhysicsSDKVisualDebugger(); - [StaticAccessor("PhysicsManager", StaticAccessorType.DoubleColon)] - internal static extern Collider ResolveShapeToCollider(IntPtr shapePtr); - - [StaticAccessor("PhysicsManager", StaticAccessorType.DoubleColon)] - internal static extern Component ResolveActorToComponent(IntPtr actorPtr); - - [ThreadSafe] - [StaticAccessor("PhysicsManager", StaticAccessorType.DoubleColon)] - internal static extern int ResolveShapeToInstanceID(IntPtr shapePtr); - - [ThreadSafe] - [StaticAccessor("PhysicsManager", StaticAccessorType.DoubleColon)] - internal static extern int ResolveActorToInstanceID(IntPtr actorPtr); - [StaticAccessor("PhysicsManager", StaticAccessorType.DoubleColon)] extern internal static Collider GetColliderByInstanceID(int instanceID); [StaticAccessor("PhysicsManager", StaticAccessorType.DoubleColon)] internal static extern Component GetBodyByInstanceID(int instanceID); - [ThreadSafe] - [StaticAccessor("PhysicsManager", StaticAccessorType.DoubleColon)] - internal static extern uint TranslateTriangleIndex(IntPtr shapePtr, uint rawIndex); - [ThreadSafe] [StaticAccessor("PhysicsManager", StaticAccessorType.DoubleColon)] internal static extern uint TranslateTriangleIndexFromID(int instanceID, uint faceIndex); - [ThreadSafe] - [StaticAccessor("PhysicsManager", StaticAccessorType.DoubleColon)] - internal static extern bool IsShapeTrigger(IntPtr shapePtr); - [StaticAccessor("PhysicsManager", StaticAccessorType.DoubleColon)] private static extern void SendOnCollisionEnter(Component component, Collision collision); [StaticAccessor("PhysicsManager", StaticAccessorType.DoubleColon)] private static extern void SendOnCollisionStay(Component component, Collision collision); [StaticAccessor("PhysicsManager", StaticAccessorType.DoubleColon)] private static extern void SendOnCollisionExit(Component component, Collision collision); - - [ThreadSafe] - [StaticAccessor("PhysicsManager", StaticAccessorType.DoubleColon)] - internal static extern Vector3 GetActorLinearVelocity(IntPtr actorPtr); - - [ThreadSafe] - [StaticAccessor("PhysicsManager", StaticAccessorType.DoubleColon)] - internal static extern Vector3 GetActorAngularVelocity(IntPtr actorPtr); } } diff --git a/Modules/Physics2D/ScriptBindings/Physics2D.bindings.cs b/Modules/Physics2D/ScriptBindings/Physics2D.bindings.cs index ec6b268482..e4759e51a8 100644 --- a/Modules/Physics2D/ScriptBindings/Physics2D.bindings.cs +++ b/Modules/Physics2D/ScriptBindings/Physics2D.bindings.cs @@ -2225,6 +2225,25 @@ public enum PhysicsShapeType2D Edges = 3, } + // The method used to combine both material values. + public enum PhysicsMaterialCombine2D + { + // The average of both material values. + Average = 0, + + // The geometric mean of both material values. + Mean, + + // The product of both material values. + Multiply, + + // The minium of both material values. + Minimum, + + // The maximum of both material values. + Maximum + } + #endregion #region Structures @@ -3004,6 +3023,12 @@ public struct ContactPoint2D [NativeName("relativeVelocity")] private Vector2 m_RelativeVelocity; + [NativeName("friction")] + private float m_Friction; + + [NativeName("bounciness")] + private float m_Bounciness; + [NativeName("separation")] private float m_Separation; @@ -3046,6 +3071,12 @@ public struct ContactPoint2D // The relative velocity between the two colliders at the contact point. public Vector2 relativeVelocity { get { return m_RelativeVelocity; } } + // The effective friction used here (post PhysicsMaterial2D combination). + public float friction { get { return m_Friction; } } + + // The effective bounciness used here (post PhysicsMaterial2D combination). + public float bounciness { get { return m_Bounciness; } } + // The first collider in contact. public Collider2D collider { get { return Object.FindObjectFromInstanceID(m_Collider) as Collider2D; } } @@ -3953,6 +3984,12 @@ extern public PhysicsMaterial2D sharedMaterial // Gets the effective bounciness used by the collider. extern public float bounciness { get; } + // Gets the method used to combine both material friction values. + extern public PhysicsMaterialCombine2D frictionCombine { get; } + + // Gets the method used to combine both material bounce values. + extern public PhysicsMaterialCombine2D bounceCombine { get; } + // Get whether this collider is currently touching a specific collider or not. extern public bool IsTouching([NotNull] Collider2D collider); @@ -5092,14 +5129,23 @@ public sealed partial class PhysicsMaterial2D : Object // Creates a new material named /name/. public PhysicsMaterial2D(string name) { Create_Internal(this, name); } + // Get combined values. + extern static public float GetCombinedValues(float valueA, float valueB, PhysicsMaterialCombine2D materialCombineA, PhysicsMaterialCombine2D materialCombineB); + [NativeMethod("Create_Binding")] extern static private void Create_Internal([Writable] PhysicsMaterial2D scriptMaterial, string name); - // How bouncy is the surface? A value of 0 will not bounce. A value of 1 will bounce without any loss of energy. + // Controls how bouncy the surface contact is. A value of 0 will not bounce whereas a value of 1 will bounce without any loss of energy. extern public float bounciness { get; set; } - // The friction. + // Controls how much friction is used for the surface contact. A value of 0 is no friction whereas any higher value increases the friction. extern public float friction { get; set; } + + // The method used to combine both material friction values. + extern public PhysicsMaterialCombine2D frictionCombine { get; set; } + + // The method used to combine both material bounciness values. + extern public PhysicsMaterialCombine2D bounceCombine { get; set; } } #endregion diff --git a/Modules/Physics2DEditor/Managed/Colliders/Collider2DEditorBase.cs b/Modules/Physics2DEditor/Managed/Colliders/Collider2DEditorBase.cs index d71614c6f7..3d42540ab6 100644 --- a/Modules/Physics2DEditor/Managed/Colliders/Collider2DEditorBase.cs +++ b/Modules/Physics2DEditor/Managed/Colliders/Collider2DEditorBase.cs @@ -22,6 +22,7 @@ protected class Styles private readonly AnimBool m_ShowDensity = new AnimBool(); private readonly AnimBool m_ShowLayerOverrides = new AnimBool(); private readonly AnimBool m_ShowInfo = new AnimBool(); + private readonly AnimBool m_ShowInfo_Material = new AnimBool(); private readonly AnimBool m_ShowContacts = new AnimBool(); Vector2 m_ContactScrollPosition; @@ -29,6 +30,8 @@ protected class Styles private SavedBool m_ShowLayerOverridesFoldout; private SavedBool m_ShowInfoFoldout; + private SavedBool m_ShowInfo_MaterialFoldout; + private SavedBool m_ShowContactsFoldout; private bool m_RequiresConstantRepaint; private SerializedProperty m_Material; @@ -65,7 +68,15 @@ public virtual void OnEnable() m_ShowInfo.valueChanged.AddListener(Repaint); m_ShowInfoFoldout = new SavedBool($"{target.GetType()}.ShowInfoFoldout", false); m_ShowInfo.value = m_ShowInfoFoldout.value; + + m_ShowInfo_Material.valueChanged.AddListener(Repaint); + m_ShowInfo_MaterialFoldout = new SavedBool($"{target.GetType()}.ShowInfo_MaterialFoldout", false); + m_ShowInfo_Material.value = m_ShowInfo_MaterialFoldout.value; + m_ShowContacts.valueChanged.AddListener(Repaint); + m_ShowContactsFoldout = new SavedBool($"{target.GetType()}.ShowContactsFoldout", false); + m_ShowContacts.value = m_ShowContactsFoldout.value; + m_ContactScrollPosition = Vector2.zero; m_Material = serializedObject.FindProperty("m_Material"); @@ -96,6 +107,7 @@ public virtual void OnDisable() m_ShowDensity.valueChanged.RemoveListener(Repaint); m_ShowLayerOverrides.valueChanged.RemoveListener(Repaint); m_ShowInfo.valueChanged.RemoveListener(Repaint); + m_ShowInfo_Material.valueChanged.RemoveListener(Repaint); m_ShowContacts.valueChanged.RemoveListener(Repaint); m_ShowCompositeRedundants.valueChanged.RemoveListener(Repaint); @@ -198,9 +210,20 @@ private void ShowColliderInfoProperties() var collider = targets[0] as Collider2D; EditorGUI.BeginDisabledGroup(true); EditorGUILayout.ObjectField("Attached Body", collider.attachedRigidbody, typeof(Rigidbody2D), false); - EditorGUILayout.FloatField("Friction", collider.friction); - EditorGUILayout.FloatField("Bounciness", collider.bounciness); EditorGUILayout.FloatField("Shape Count", collider.shapeCount); + + EditorGUI.indentLevel++; + m_ShowInfo_MaterialFoldout.value = m_ShowInfo_Material.target = EditorGUILayout.Foldout(m_ShowInfo_Material.target, "Material", true); + if (EditorGUILayout.BeginFadeGroup(m_ShowInfo_Material.faded)) + { + EditorGUILayout.FloatField("Friction", collider.friction); + EditorGUILayout.FloatField("Bounciness", collider.bounciness); + EditorGUILayout.EnumPopup("Friction Combine", collider.frictionCombine); + EditorGUILayout.EnumPopup("Bounciness Combine", collider.bounceCombine); + } + EditorGUILayout.EndFadeGroup(); + EditorGUI.indentLevel--; + if (collider.isActiveAndEnabled) EditorGUILayout.BoundsField("Bounds", collider.bounds); EditorGUI.EndDisabledGroup(); @@ -230,7 +253,7 @@ bool ShouldShowDensity() void ShowContacts(Collider2D collider) { EditorGUI.indentLevel++; - m_ShowContacts.target = EditorGUILayout.Foldout(m_ShowContacts.target, "Contacts", true); + m_ShowContactsFoldout.value = m_ShowContacts.target = EditorGUILayout.Foldout(m_ShowContacts.target, "Contacts", true); if (EditorGUILayout.BeginFadeGroup(m_ShowContacts.faded)) { var contactCount = collider.GetContacts(m_Contacts); @@ -252,6 +275,8 @@ void ShowContacts(Collider2D collider) EditorGUILayout.Vector2Field("Relative Velocity", contact.relativeVelocity); EditorGUILayout.FloatField("Normal Impulse", contact.normalImpulse); EditorGUILayout.FloatField("Tangent Impulse", contact.tangentImpulse); + EditorGUILayout.FloatField("Friction", contact.friction); + EditorGUILayout.FloatField("Bounciness", contact.bounciness); EditorGUILayout.ObjectField("Collider", contact.collider, typeof(Collider2D), false); EditorGUILayout.ObjectField("Rigidbody", contact.rigidbody, typeof(Rigidbody2D), false); EditorGUILayout.ObjectField("OtherRigidbody", contact.otherRigidbody, typeof(Rigidbody2D), false); diff --git a/Modules/Physics2DEditor/Managed/Rigidbody/Rigidbody2DEditor.cs b/Modules/Physics2DEditor/Managed/Rigidbody/Rigidbody2DEditor.cs index aef7c541f7..e631395acf 100644 --- a/Modules/Physics2DEditor/Managed/Rigidbody/Rigidbody2DEditor.cs +++ b/Modules/Physics2DEditor/Managed/Rigidbody/Rigidbody2DEditor.cs @@ -44,6 +44,7 @@ internal class Rigidbody2DEditor : Editor private SavedBool m_ShowLayerOverridesFoldout; private SavedBool m_ShowInfoFoldout; + private SavedBool m_ShowContactsFoldout; private bool m_RequiresConstantRepaint; const int k_ToggleOffset = 30; @@ -77,10 +78,15 @@ public void OnEnable() m_ShowLayerOverrides.valueChanged.AddListener(Repaint); m_ShowLayerOverridesFoldout = new SavedBool($"{target.GetType() }.ShowLayerOverridesFoldout", false); m_ShowLayerOverrides.value = m_ShowLayerOverridesFoldout.value; + m_ShowInfo.valueChanged.AddListener(Repaint); m_ShowInfoFoldout = new SavedBool($"{target.GetType()}.ShowInfoFoldout", false); m_ShowInfo.value = m_ShowInfoFoldout.value; + m_ShowContacts.valueChanged.AddListener(Repaint); + m_ShowContactsFoldout = new SavedBool($"{target.GetType()}.ShowContactsFoldout", false); + m_ShowContacts.value = m_ShowContactsFoldout.value; + m_ContactScrollPosition = Vector2.zero; m_RequiresConstantRepaint = false; @@ -239,7 +245,7 @@ private void ShowBodyInfoProperties() void ShowContacts(Rigidbody2D body) { EditorGUI.indentLevel++; - m_ShowContacts.target = EditorGUILayout.Foldout(m_ShowContacts.target, "Contacts", true); + m_ShowContactsFoldout.value = m_ShowContacts.target = EditorGUILayout.Foldout(m_ShowContacts.target, "Contacts", true); if (EditorGUILayout.BeginFadeGroup(m_ShowContacts.faded)) { var contactCount = body.GetContacts(m_Contacts); diff --git a/Modules/SpriteMask/Public/ScriptBindings/SpriteMask.bindings.cs b/Modules/SpriteMask/Public/ScriptBindings/SpriteMask.bindings.cs index 718e5cd321..bf0597ad9f 100644 --- a/Modules/SpriteMask/Public/ScriptBindings/SpriteMask.bindings.cs +++ b/Modules/SpriteMask/Public/ScriptBindings/SpriteMask.bindings.cs @@ -2,11 +2,8 @@ // Copyright (c) Unity Technologies. For terms of use, see // https://unity3d.com/legal/licenses/Unity_Reference_Only_License -using System; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; using UnityEngine.Bindings; -using UnityEngine.Scripting; +using UnityEngine.Rendering; namespace UnityEngine { @@ -41,6 +38,6 @@ public enum MaskSource [StaticAccessor("SpriteUtilityBindings", StaticAccessorType.DoubleColon)] internal static class SpriteMaskUtility { - extern internal static bool HasSpriteMaskInLayerRange(short lower, short upper); + extern internal static bool HasSpriteMaskInLayerRange(SortingLayerRange range); } } diff --git a/Modules/TextCoreTextEngine/Managed/TextAssets/FontAsset.cs b/Modules/TextCoreTextEngine/Managed/TextAssets/FontAsset.cs index 06f20ae490..43b08a1a4d 100644 --- a/Modules/TextCoreTextEngine/Managed/TextAssets/FontAsset.cs +++ b/Modules/TextCoreTextEngine/Managed/TextAssets/FontAsset.cs @@ -182,6 +182,7 @@ public Font sourceFontFile [VisibleToOtherModules("UnityEngine.UIElementsModule")] [SerializeField] internal string m_SourceFontFilePath; +#nullable enable public AtlasPopulationMode atlasPopulationMode { get { return m_AtlasPopulationMode; } @@ -262,7 +263,7 @@ public List glyphTable } [SerializeField] internal List m_GlyphTable = new List(); - +#nullable restore /// /// Dictionary used to lookup glyphs contained in the font asset by their index. /// @@ -606,20 +607,22 @@ public static FontAsset CreateFontAsset(string familyName, string styleName, int return fontAsset; } - internal static FontAsset CreateFontAssetInternal(string familyName, string styleName, int pointSize = 90) +#nullable enable + internal static FontAsset? CreateFontAssetInternal(string familyName, string styleName, int pointSize = 90) { if (FontEngine.TryGetSystemFontReference(familyName, styleName, out FontReference fontRef)) return CreateFontAsset(fontRef.filePath, fontRef.faceIndex, pointSize, 9, GlyphRenderMode.SDFAA, 1024, 1024, AtlasPopulationMode.DynamicOS, true); return null; } - internal static FontAsset CreateFontAsset(string familyName, string styleName, float pointSize, int padding, GlyphRenderMode renderMode) + internal static FontAsset? CreateFontAsset(string familyName, string styleName, float pointSize, int padding, GlyphRenderMode renderMode) { if (FontEngine.TryGetSystemFontReference(familyName, styleName, out FontReference fontRef)) return CreateFontAsset(fontRef.filePath, fontRef.faceIndex, pointSize, padding, renderMode, 1024, 1024, AtlasPopulationMode.DynamicOS, true); return null; } +#nullable restore /// /// Create a List of Font Assets with a list of fallbacks defined by FamilyNames, all regular styles diff --git a/Modules/TextCoreTextEngine/Managed/TextAssets/FontAsset/FontAssetFactory.cs b/Modules/TextCoreTextEngine/Managed/TextAssets/FontAsset/FontAssetFactory.cs index 84e9676e8a..8ba9ba4cf1 100644 --- a/Modules/TextCoreTextEngine/Managed/TextAssets/FontAsset/FontAssetFactory.cs +++ b/Modules/TextCoreTextEngine/Managed/TextAssets/FontAsset/FontAssetFactory.cs @@ -3,28 +3,28 @@ // https://unity3d.com/legal/licenses/Unity_Reference_Only_License using System.Collections.Generic; -using UnityEngine; using UnityEngine.TextCore.LowLevel; namespace UnityEngine.TextCore.Text; +#nullable enable internal class FontAssetFactory { const GlyphRenderMode k_DefaultEditorBitmapGlyphRenderMode = GlyphRenderMode.SMOOTH_HINTED; static readonly HashSet visitedFontAssets = new(); - public static FontAsset CloneFontAssetWithBitmapRendering(FontAsset baseFontAsset, float fontSize) + public static FontAsset? CloneFontAssetWithBitmapRendering(FontAsset baseFontAsset, float fontSize) { visitedFontAssets.Clear(); return CloneFontAssetWithBitmapRenderingInternal(baseFontAsset, fontSize); } - static FontAsset CloneFontAssetWithBitmapRenderingInternal(FontAsset baseFontAsset, float fontSize) + static FontAsset? CloneFontAssetWithBitmapRenderingInternal(FontAsset baseFontAsset, float fontSize) { visitedFontAssets.Add(baseFontAsset); - FontAsset resultFontAsset = CloneFontAssetWithBitmapSettings(baseFontAsset, fontSize); + FontAsset? resultFontAsset = CloneFontAssetWithBitmapSettings(baseFontAsset, fontSize); - if (resultFontAsset) + if (resultFontAsset != null) { ProcessFontWeights(resultFontAsset, baseFontAsset, fontSize); ProcessFallbackFonts(resultFontAsset, baseFontAsset, fontSize); @@ -33,28 +33,31 @@ static FontAsset CloneFontAssetWithBitmapRenderingInternal(FontAsset baseFontAss return resultFontAsset; } - static FontAsset CloneFontAssetWithBitmapSettings(FontAsset source, float size) + static FontAsset? CloneFontAssetWithBitmapSettings(FontAsset source, float size) { bool shouldInstantiate = source.atlasRenderMode != GlyphRenderMode.SDFAA || !source.IsEditorFont || source.sourceFontFile == null; - FontAsset newFontAsset; + FontAsset? newFontAsset; if (source.atlasPopulationMode == AtlasPopulationMode.DynamicOS) { newFontAsset = FontAsset.CreateFontAsset(source.faceInfo.familyName, source.faceInfo.styleName, size, 6, k_DefaultEditorBitmapGlyphRenderMode); - SetupFontAssetForBitmapSettings(newFontAsset); + if(newFontAsset != null) SetupFontAssetForBitmapSettings(newFontAsset); } else if (shouldInstantiate) // Color Glyph or Empty Container { newFontAsset = Object.Instantiate(source); - newFontAsset.fallbackFontAssetTable = new List(); - newFontAsset.m_IsClone = true; - newFontAsset.IsEditorFont = true; - SetHideFlags(newFontAsset); + if (newFontAsset != null) + { + newFontAsset.fallbackFontAssetTable = new List(); + newFontAsset.m_IsClone = true; + newFontAsset.IsEditorFont = true; + SetHideFlags(newFontAsset); + } } else { newFontAsset = FontAsset.CreateFontAsset(source.sourceFontFile, size, 6, k_DefaultEditorBitmapGlyphRenderMode, source.atlasWidth, source.atlasHeight); - SetupFontAssetForBitmapSettings(newFontAsset); + if (newFontAsset != null) SetupFontAssetForBitmapSettings(newFontAsset); } return newFontAsset; @@ -97,70 +100,82 @@ static void ProcessFallbackFonts(FontAsset resultFontAsset, FontAsset baseFontAs static readonly string k_SystemFontName = "Lucida Grande" ; - internal static FontAsset CreateDefaultEditorFontAsset(Font font, Shader shader) + internal static FontAsset? CreateDefaultEditorFontAsset(Font font, Shader shader) { - FontAsset fontAsset; + if(font == null) + return null; + + FontAsset? fontAsset=null; if (font.name == "System Normal" || font.name == "System Small" || font.name == "System Big" || font.name == "System Warning") { fontAsset = FontAsset.CreateFontAssetInternal(k_SystemFontName, "Regular", 90); - fontAsset.InternalDynamicOS = true; - - var boldFontAsset = FontAsset.CreateFontAssetInternal(k_SystemFontName, "Bold", 90); - if (boldFontAsset) - { - boldFontAsset.InternalDynamicOS = true; - fontAsset.fontWeightTable[7].regularTypeface = boldFontAsset; - SetupFontAssetSettings(boldFontAsset, shader); - } - - var boldItalicFontAsset = FontAsset.CreateFontAssetInternal(k_SystemFontName, "Bold Italic", 90); - if (boldItalicFontAsset) - { - boldItalicFontAsset.InternalDynamicOS = true; - fontAsset.fontWeightTable[7].italicTypeface = boldItalicFontAsset; - SetupFontAssetSettings(boldItalicFontAsset, shader); - } - - var italicFontAsset = FontAsset.CreateFontAssetInternal(k_SystemFontName, "Italic", 90); - if (italicFontAsset) + if (fontAsset != null) { - italicFontAsset.InternalDynamicOS = true; - fontAsset.fontWeightTable[4].italicTypeface = italicFontAsset; - SetupFontAssetSettings(italicFontAsset, shader); + fontAsset.InternalDynamicOS = true; + + var boldFontAsset = FontAsset.CreateFontAssetInternal(k_SystemFontName, "Bold", 90); + if (boldFontAsset != null) + { + boldFontAsset.InternalDynamicOS = true; + fontAsset.fontWeightTable[7].regularTypeface = boldFontAsset; + SetupFontAssetSettings(boldFontAsset, shader); + } + + var boldItalicFontAsset = FontAsset.CreateFontAssetInternal(k_SystemFontName, "Bold Italic", 90); + if (boldItalicFontAsset != null) + { + boldItalicFontAsset.InternalDynamicOS = true; + fontAsset.fontWeightTable[7].italicTypeface = boldItalicFontAsset; + SetupFontAssetSettings(boldItalicFontAsset, shader); + } + + var italicFontAsset = FontAsset.CreateFontAssetInternal(k_SystemFontName, "Italic", 90); + if (italicFontAsset != null) + { + italicFontAsset.InternalDynamicOS = true; + fontAsset.fontWeightTable[4].italicTypeface = italicFontAsset; + SetupFontAssetSettings(italicFontAsset, shader); + } } } else if (font.name == "System Normal Bold" || font.name == "System Small Bold") { fontAsset = FontAsset.CreateFontAssetInternal(k_SystemFontName, "Bold", 90); - fontAsset.InternalDynamicOS = true; + if (fontAsset != null) + { + fontAsset.InternalDynamicOS = true; + } } else if (font.name == "Inter-Regular") { fontAsset = FontAsset.CreateFontAssetInternal("Inter", "Regular", 90); - fontAsset.InternalDynamicOS = true; - - var boldFontAsset = FontAsset.CreateFontAssetInternal("Inter", "Bold", 90); - if (boldFontAsset) - { - boldFontAsset.InternalDynamicOS = true; - fontAsset.fontWeightTable[7].regularTypeface = boldFontAsset; - SetupFontAssetSettings(boldFontAsset, shader); - } - - var italicFontAsset = FontAsset.CreateFontAssetInternal("Inter", "Italic", 90); - if (italicFontAsset) - { - italicFontAsset.InternalDynamicOS = true; - fontAsset.fontWeightTable[4].italicTypeface = italicFontAsset; - SetupFontAssetSettings(italicFontAsset, shader); - } - - var boldItalicFontAsset = FontAsset.CreateFontAssetInternal("Inter", "Bold Italic", 90); - if (boldItalicFontAsset) + if (fontAsset != null) { - boldItalicFontAsset.InternalDynamicOS = true; - fontAsset.fontWeightTable[7].italicTypeface = boldItalicFontAsset; - SetupFontAssetSettings(boldItalicFontAsset, shader); + fontAsset.InternalDynamicOS = true; + + var boldFontAsset = FontAsset.CreateFontAssetInternal("Inter", "Bold", 90); + if (boldFontAsset != null) + { + boldFontAsset.InternalDynamicOS = true; + fontAsset.fontWeightTable[7].regularTypeface = boldFontAsset; + SetupFontAssetSettings(boldFontAsset, shader); + } + + var italicFontAsset = FontAsset.CreateFontAssetInternal("Inter", "Italic", 90); + if (italicFontAsset != null) + { + italicFontAsset.InternalDynamicOS = true; + fontAsset.fontWeightTable[4].italicTypeface = italicFontAsset; + SetupFontAssetSettings(italicFontAsset, shader); + } + + var boldItalicFontAsset = FontAsset.CreateFontAssetInternal("Inter", "Bold Italic", 90); + if (boldItalicFontAsset != null) + { + boldItalicFontAsset.InternalDynamicOS = true; + fontAsset.fontWeightTable[7].italicTypeface = boldItalicFontAsset; + SetupFontAssetSettings(boldItalicFontAsset, shader); + } } } else @@ -168,7 +183,8 @@ internal static FontAsset CreateDefaultEditorFontAsset(Font font, Shader shader) fontAsset = FontAsset.CreateFontAsset(font, 90, 9, GlyphRenderMode.SDFAA, 1024, 1024, shader, AtlasPopulationMode.Dynamic, true); } - SetupFontAssetSettings(fontAsset, shader); + if (fontAsset != null) + SetupFontAssetSettings(fontAsset, shader); return fontAsset; } diff --git a/Modules/Tilemap/ScriptBindings/Tilemap.bindings.cs b/Modules/Tilemap/ScriptBindings/Tilemap.bindings.cs index 10d7bca2c7..ed621d9db6 100644 --- a/Modules/Tilemap/ScriptBindings/Tilemap.bindings.cs +++ b/Modules/Tilemap/ScriptBindings/Tilemap.bindings.cs @@ -30,6 +30,7 @@ public enum TileAnimationFlags PauseAnimation = 1 << 1, UpdatePhysics = 1 << 2, UnscaledTime = 1 << 3, + SyncAnimation = 1 << 4, } [RequireComponent(typeof(Transform))] diff --git a/Modules/UIBuilder/Editor/Builder/Inspector/Binding/BuilderBindingUtility.cs b/Modules/UIBuilder/Editor/Builder/Inspector/Binding/BuilderBindingUtility.cs index 3cf3f5b5e2..db34809f65 100644 --- a/Modules/UIBuilder/Editor/Builder/Inspector/Binding/BuilderBindingUtility.cs +++ b/Modules/UIBuilder/Editor/Builder/Inspector/Binding/BuilderBindingUtility.cs @@ -116,18 +116,11 @@ private static void OpenBindingWindowToCreateOrEdit(string property, bool openTo worldBound = GUIUtility.GUIToScreenRect(worldBound); - var message = openToCreate ? BuilderConstants.AddBindingTitle : BuilderConstants.EditBindingTitle; - // Calls the active Binding window if (BuilderBindingWindow.activeWindow != null) BuilderBindingWindow.activeWindow.Close(); - var wnd = BuilderBindingWindow.Open(message, worldBound, windowSize); - - if (openToCreate) - wnd.view.StartCreatingBinding(property, inspector); - else - wnd.view.StartEditingBinding(property, inspector); + BuilderBindingWindow.Open(openToCreate, property, inspector, worldBound, windowSize); } /// diff --git a/Modules/UIBuilder/Editor/Builder/Inspector/Binding/BuilderBindingUxmlAtttributesView.cs b/Modules/UIBuilder/Editor/Builder/Inspector/Binding/BuilderBindingUxmlAtttributesView.cs index 6b6173158a..8683ddba20 100644 --- a/Modules/UIBuilder/Editor/Builder/Inspector/Binding/BuilderBindingUxmlAtttributesView.cs +++ b/Modules/UIBuilder/Editor/Builder/Inspector/Binding/BuilderBindingUxmlAtttributesView.cs @@ -167,7 +167,7 @@ internal override void UnsetAllAttributes() UndoRecordDocument(BuilderConstants.ChangeAttributeValueUndoMessage); var builder = Builder.ActiveWindow; - var styleRows = fieldsContainer.Query().ToList(); + var styleRows = attributesContainer.Query().ToList(); foreach (var styleRow in styleRows) { var fields = styleRow.GetLinkedFieldElements(); @@ -275,7 +275,7 @@ protected override void GenerateSerializedAttributeFields() m_ConvertersToSourceField = row.GetLinkedFieldElements()[0]; } - fieldsContainer.Add(root); + attributesContainer.Add(root); // Add any additional fields from inherited types. var property = m_CurrentElementSerializedObject.FindProperty(bindingSerializedPropertyRootPath); diff --git a/Modules/UIBuilder/Editor/Builder/Inspector/Binding/BuilderBindingView.cs b/Modules/UIBuilder/Editor/Builder/Inspector/Binding/BuilderBindingView.cs index e2ddec0d48..62e7bc9cde 100644 --- a/Modules/UIBuilder/Editor/Builder/Inspector/Binding/BuilderBindingView.cs +++ b/Modules/UIBuilder/Editor/Builder/Inspector/Binding/BuilderBindingView.cs @@ -17,17 +17,56 @@ namespace Unity.UI.Builder /// internal class BuilderBindingView : VisualElement, IBuilderSelectionNotifier { + class BindingTypeComparer : IComparer + { + public int Compare(BindingType x, BindingType y) + { + // Ensure that DataBinding is the first entry. + if (x.type == typeof(DataBinding)) + return -1; + return y.type == typeof(DataBinding) + ? 1 + : string.Compare(x.displayName, y.displayName, StringComparison.Ordinal); + } + } + + struct BindingType + { + public Type type; + public string uxmlFullName; + public string displayName; + } + private const string k_UssClassName = "unity-builder-binding-view"; - private List m_UxmlBindingTypeNames = new(); + private static readonly BindingType[] k_UxmlBindingTypes; + private static readonly List k_UxmlBindingTypeDisplayNames = new(); + + static BuilderBindingView() + { + k_UxmlBindingTypes = LoadAllAvailableBindingClasses(); + } + + static int IndexOfBindingType(string uxmlFullName) + { + for (var i = 0; i < k_UxmlBindingTypes.Length; ++i) + { + if (string.CompareOrdinal(k_UxmlBindingTypes[i].uxmlFullName, uxmlFullName) == 0) + return i; + } + + return -1; + } + + private BuilderInspector m_Inspector; private bool m_IsCreatingBinding; // Make it internal for tests - internal TextField m_PropertyField; - internal Label m_TypeLabel; - internal DropdownField m_BindingTypeField; - internal VisualElement m_FieldsContainer; + internal TextField m_BindingIdField; + internal Label m_TargetPropertyTypeName; + internal DropdownField m_BindingTypeDropdown; + internal VisualElement m_BindingAttributesContainer; internal BuilderBindingUxmlAttributesView m_AttributesView; internal Button m_OkButton; internal Button m_CancelButton; @@ -78,35 +117,33 @@ private set /// public BuilderBindingView() { - var template = BuilderPackageUtilities.LoadAssetAtPath( - BuilderConstants.UIBuilderPackagePath + "/Inspector/BindingWindow.uxml"); + var template = BuilderPackageUtilities.LoadAssetAtPath(BuilderConstants.UIBuilderPackagePath + "/Inspector/BindingWindow.uxml"); template.CloneTree(this); AddToClassList(k_UssClassName); - m_PropertyField = this.Q("propertyField"); - m_TypeLabel = this.Q