diff --git a/.github/workflows/build_ios.yml b/.github/workflows/build_ios.yml index 0f27619f7..cd2a46b42 100644 --- a/.github/workflows/build_ios.yml +++ b/.github/workflows/build_ios.yml @@ -19,7 +19,7 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v3 with: - dotnet-version: 8.0.x + dotnet-version: 9.0.x - name: Setup .NET Workload run: | dotnet workload install ios @@ -33,4 +33,4 @@ jobs: git lfs pull - name: Build run: | - ./Development/Scripts/Mac/CallBuildTool.sh -build -log -dotnet=8 -arch=ARM64 -platform=iOS -configuration=Release -buildtargets=FlaxGame + ./Development/Scripts/Mac/CallBuildTool.sh -build -log -dotnet=9 -arch=ARM64 -platform=iOS -configuration=Release -buildtargets=FlaxGame diff --git a/Source/Editor/Surface/ContextMenu/VisjectCM.cs b/Source/Editor/Surface/ContextMenu/VisjectCM.cs index 42c863789..21d0e7470 100644 --- a/Source/Editor/Surface/ContextMenu/VisjectCM.cs +++ b/Source/Editor/Surface/ContextMenu/VisjectCM.cs @@ -412,7 +412,7 @@ namespace FlaxEditor.Surface.ContextMenu { group.UnlockChildrenRecursive(); // TODO: Improve filtering to be based on boxes with the most common things instead of first box - if (_contextSensitiveSearchEnabled && _selectedBoxes[0] != null) + if (_contextSensitiveSearchEnabled && _selectedBoxes.Count > 0 && _selectedBoxes[0] != null) UpdateFilters(); else SortGroups(); @@ -424,7 +424,7 @@ namespace FlaxEditor.Surface.ContextMenu OnSearchFilterChanged(); } } - else if (_contextSensitiveSearchEnabled) + else if (_contextSensitiveSearchEnabled && _selectedBoxes.Count > 0) { // TODO: Filtering could be improved here as well group.EvaluateVisibilityWithBox(_selectedBoxes[0]); @@ -462,7 +462,7 @@ namespace FlaxEditor.Surface.ContextMenu Parent = group }; } - if (_contextSensitiveSearchEnabled) + if (_contextSensitiveSearchEnabled && _selectedBoxes.Count > 0) group.EvaluateVisibilityWithBox(_selectedBoxes[0]); group.SortChildren(); if (ShowExpanded) @@ -476,7 +476,7 @@ namespace FlaxEditor.Surface.ContextMenu if (!isLayoutLocked) { - if (_contextSensitiveSearchEnabled && _selectedBoxes[0] != null) + if (_contextSensitiveSearchEnabled && _selectedBoxes.Count != 0 && _selectedBoxes[0] != null) UpdateFilters(); else SortGroups(); diff --git a/Source/Editor/Viewport/PrefabWindowViewport.cs b/Source/Editor/Viewport/PrefabWindowViewport.cs index 39c126c37..362aeacf6 100644 --- a/Source/Editor/Viewport/PrefabWindowViewport.cs +++ b/Source/Editor/Viewport/PrefabWindowViewport.cs @@ -257,16 +257,23 @@ namespace FlaxEditor.Viewport /// public void SaveActiveUIScalingOption() { - var defaultKey = $"{Prefab.ID}:DefaultViewportScalingIndex"; + if (!Prefab) + return; + var id = Prefab.ID; + var defaultKey = $"{id}:DefaultViewportScalingIndex"; Editor.Instance.ProjectCache.SetCustomData(defaultKey, _defaultScaleActiveIndex.ToString()); - var customKey = $"{Prefab.ID}:CustomViewportScalingIndex"; + var customKey = $"{id}:CustomViewportScalingIndex"; Editor.Instance.ProjectCache.SetCustomData(customKey, _customScaleActiveIndex.ToString()); } private void LoadCustomUIScalingOption() { + if (!Prefab) + return; + var id = Prefab.ID; Prefab.WaitForLoaded(); - var defaultKey = $"{Prefab.ID}:DefaultViewportScalingIndex"; + + var defaultKey = $"{id}:DefaultViewportScalingIndex"; if (Editor.Instance.ProjectCache.TryGetCustomData(defaultKey, out string defaultData)) { if (int.TryParse(defaultData, out var index)) @@ -286,7 +293,7 @@ namespace FlaxEditor.Viewport } } - var customKey = $"{Prefab.ID}:CustomViewportScalingIndex"; + var customKey = $"{id}:CustomViewportScalingIndex"; if (Editor.Instance.ProjectCache.TryGetCustomData(customKey, out string data)) { if (int.TryParse(data, out var index)) diff --git a/Source/Editor/Windows/GameWindow.cs b/Source/Editor/Windows/GameWindow.cs index 9a68bd216..96c8dad22 100644 --- a/Source/Editor/Windows/GameWindow.cs +++ b/Source/Editor/Windows/GameWindow.cs @@ -889,12 +889,12 @@ namespace FlaxEditor.Windows if (!_cursorVisible) Screen.CursorVisible = true; Screen.CursorLock = CursorLockMode.None; - } - if (Editor.IsPlayMode && IsDocked && IsSelected && RootWindow.FocusedControl == null) - { - // Game UI cleared focus so regain it to maintain UI navigation just like game window does - FlaxEngine.Scripting.InvokeOnUpdate(Focus); + if (Editor.IsPlayMode && IsDocked && IsSelected && RootWindow.FocusedControl == null) + { + // Game UI cleared focus so regain it to maintain UI navigation just like game window does + FlaxEngine.Scripting.InvokeOnUpdate(Focus); + } } } diff --git a/Source/Engine/GraphicsDevice/Vulkan/GPUContextVulkan.cpp b/Source/Engine/GraphicsDevice/Vulkan/GPUContextVulkan.cpp index 2afb18349..00af99154 100644 --- a/Source/Engine/GraphicsDevice/Vulkan/GPUContextVulkan.cpp +++ b/Source/Engine/GraphicsDevice/Vulkan/GPUContextVulkan.cpp @@ -192,6 +192,7 @@ void GPUContextVulkan::AddImageBarrier(VkImage image, VkImageLayout srcLayout, V void GPUContextVulkan::AddImageBarrier(GPUTextureViewVulkan* handle, VkImageLayout dstLayout) { + ASSERT(handle->Owner); auto& state = handle->Owner->State; const auto subresourceIndex = handle->SubresourceIndex; if (subresourceIndex == -1) @@ -516,7 +517,7 @@ void GPUContextVulkan::UpdateDescriptorSets(const SpirvShaderDescriptorInfo& des case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: { auto handle = (GPUTextureViewVulkan*)handles[slot]; - if (!handle) + if (!handle || !handle->Owner) { const auto dummy = _device->HelperResources.GetDummyTexture(descriptor.ResourceType); switch (descriptor.ResourceType) diff --git a/Source/Engine/Physics/Colliders/CharacterController.cpp b/Source/Engine/Physics/Colliders/CharacterController.cpp index a874a9947..66c6da79b 100644 --- a/Source/Engine/Physics/Colliders/CharacterController.cpp +++ b/Source/Engine/Physics/Colliders/CharacterController.cpp @@ -5,6 +5,7 @@ #include "Engine/Physics/Physics.h" #include "Engine/Physics/PhysicsBackend.h" #include "Engine/Physics/PhysicsScene.h" +#include "Engine/Profiler/ProfilerCPU.h" #include "Engine/Engine/Time.h" #define CC_MIN_SIZE 0.001f @@ -178,6 +179,7 @@ CharacterController::CollisionFlags CharacterController::SimpleMove(const Vector CharacterController::CollisionFlags CharacterController::Move(const Vector3& displacement) { + PROFILE_CPU(); CollisionFlags result = CollisionFlags::None; if (_controller && !_isUpdatingTransform) { @@ -377,7 +379,10 @@ void CharacterController::AddMovement(const Vector3& translation, const Quaterni displacement += GetPhysicsScene()->GetGravity() * deltaTime; } - Move(displacement); + if (!displacement.IsZero()) + { + Move(displacement); + } if (!rotation.IsIdentity()) { diff --git a/Source/Engine/Serialization/JsonWriters.h b/Source/Engine/Serialization/JsonWriters.h index cb0cce52f..836357ecf 100644 --- a/Source/Engine/Serialization/JsonWriters.h +++ b/Source/Engine/Serialization/JsonWriters.h @@ -32,6 +32,7 @@ public: } public: + using JsonWriter::Key; // [JsonWriter] void Key(const char* str, int32 length) override diff --git a/Source/Engine/UI/GUI/Common/Slider.cs b/Source/Engine/UI/GUI/Common/Slider.cs index e02b67ab2..8c7b022fe 100644 --- a/Source/Engine/UI/GUI/Common/Slider.cs +++ b/Source/Engine/UI/GUI/Common/Slider.cs @@ -390,7 +390,7 @@ public class Slider : ContainerControl } // Draw thumb - var thumbColorV = _isSliding ? ThumbColorSelected : (_mouseOverThumb ? ThumbColorHighlighted : ThumbColor); + var thumbColorV = _isSliding ? ThumbColorSelected : (_mouseOverThumb || IsNavFocused ? ThumbColorHighlighted : ThumbColor); if (ThumbBrush != null) ThumbBrush.Draw(_thumbRect, thumbColorV); else diff --git a/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libopenal.a b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libopenal.a index 50e16252f..56f94fadc 100644 --- a/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libopenal.a +++ b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libopenal.a @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b94c2ea831342ad274ec95aba3161dceba1334d36a6d620ec015e9f26170bc58 -size 1133976 +oid sha256:c21850fc0279c8fe42a6b3af528134c345d44d6ce5921c8703f9c794aa97846b +size 1449056 diff --git a/Source/Platforms/Mac/Binaries/ThirdParty/x64/libopenal.a b/Source/Platforms/Mac/Binaries/ThirdParty/x64/libopenal.a index 7d293b971..6680c4301 100644 --- a/Source/Platforms/Mac/Binaries/ThirdParty/x64/libopenal.a +++ b/Source/Platforms/Mac/Binaries/ThirdParty/x64/libopenal.a @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:16e3a75cde5920b0eabc918e74691aa934775cbb22ac28bb0673cebabc998fae -size 1106264 +oid sha256:30d9af62b52ea829876dfc7cf6c0fa9318cf4682be0af7f483fa0ee5de17e5a5 +size 1530336 diff --git a/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libopenal.a b/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libopenal.a index e50f5c112..b928082a2 100644 --- a/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libopenal.a +++ b/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libopenal.a @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:22566cafc8a508056b8a50674cf8f214354bd8decb5c4aeba349c7c3de818207 -size 1500864 +oid sha256:ac3e90b2cb7968c49353bebbd475237728b4dc27b731486899a38a538c480715 +size 1434048 diff --git a/Source/Tools/Flax.Build/Deps/Dependencies/OpenAL.cs b/Source/Tools/Flax.Build/Deps/Dependencies/OpenAL.cs index 447b91498..034b2a4b8 100644 --- a/Source/Tools/Flax.Build/Deps/Dependencies/OpenAL.cs +++ b/Source/Tools/Flax.Build/Deps/Dependencies/OpenAL.cs @@ -52,6 +52,7 @@ namespace Flax.Deps.Dependencies var version = "1.24.3"; var configuration = "Release"; var dstIncludePath = Path.Combine(options.ThirdPartyFolder, "OpenAL"); + var noSSL = true; // OpenAL Soft website has broken certs foreach (var platform in options.Platforms) { @@ -87,7 +88,7 @@ namespace Flax.Deps.Dependencies // Get the binaries var packagePath = Path.Combine(root, "package.zip"); if (!File.Exists(packagePath)) - Downloader.DownloadFileFromUrlToPath("https://openal-soft.org/openal-binaries/openal-soft-" + version + "-bin.zip", packagePath); + Downloader.DownloadFileFromUrlToPath("https://openal-soft.org/openal-binaries/openal-soft-" + version + "-bin.zip", packagePath, noSSL); using (ZipArchive archive = ZipFile.Open(packagePath, ZipArchiveMode.Read)) { if (!Directory.Exists(root)) @@ -135,7 +136,7 @@ namespace Flax.Deps.Dependencies // Get the source var packagePath = Path.Combine(root, "package.zip"); File.Delete(packagePath); - Downloader.DownloadFileFromUrlToPath("https://openal-soft.org/openal-releases/openal-soft-" + version + ".tar.bz2", packagePath); + Downloader.DownloadFileFromUrlToPath("https://openal-soft.org/openal-releases/openal-soft-" + version + ".tar.bz2", packagePath, noSSL); Utilities.Run("tar", "xjf " + packagePath.Replace('\\', '/'), null, root, Utilities.RunOptions.ConsoleLogOutput); // Use separate build directory @@ -166,7 +167,7 @@ namespace Flax.Deps.Dependencies // Get the source var packagePath = Path.Combine(root, "package.zip"); File.Delete(packagePath); - Downloader.DownloadFileFromUrlToPath("https://openal-soft.org/openal-releases/openal-soft-" + version + ".tar.bz2", packagePath); + Downloader.DownloadFileFromUrlToPath("https://openal-soft.org/openal-releases/openal-soft-" + version + ".tar.bz2", packagePath, noSSL); if (Platform.BuildTargetPlatform == TargetPlatform.Windows) { var sevenZip = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), "7-Zip", "7z.exe"); @@ -206,7 +207,7 @@ namespace Flax.Deps.Dependencies // Get the source var packagePath = Path.Combine(root, "package.zip"); File.Delete(packagePath); - Downloader.DownloadFileFromUrlToPath("https://openal-soft.org/openal-releases/openal-soft-" + version + ".tar.bz2", packagePath); + Downloader.DownloadFileFromUrlToPath("https://openal-soft.org/openal-releases/openal-soft-" + version + ".tar.bz2", packagePath, noSSL); Utilities.Run("tar", "xjf " + packagePath.Replace('\\', '/'), null, root, Utilities.RunOptions.ConsoleLogOutput); // Use separate build directory @@ -241,7 +242,7 @@ namespace Flax.Deps.Dependencies var packagePath = Path.Combine(root, "package.zip"); if (!File.Exists(packagePath)) { - Downloader.DownloadFileFromUrlToPath("https://openal-soft.org/openal-releases/openal-soft-" + version + ".tar.bz2", packagePath); + Downloader.DownloadFileFromUrlToPath("https://openal-soft.org/openal-releases/openal-soft-" + version + ".tar.bz2", packagePath, noSSL); Utilities.Run("tar", "xjf " + packagePath.Replace('\\', '/'), null, root, Utilities.RunOptions.ConsoleLogOutput); } diff --git a/Source/Tools/Flax.Build/Deps/Downloader.cs b/Source/Tools/Flax.Build/Deps/Downloader.cs index 57da4a2ee..84b807b13 100644 --- a/Source/Tools/Flax.Build/Deps/Downloader.cs +++ b/Source/Tools/Flax.Build/Deps/Downloader.cs @@ -14,20 +14,20 @@ namespace Flax.Deps /// static class Downloader { - private static bool IgnoreSSL = false; + private static bool NoSSL = false; private const string GoogleDriveDomain = "drive.google.com"; private const string GoogleDriveDomain2 = "https://drive.google.com"; // Normal example: FileDownloader.DownloadFileFromURLToPath( "http://example.com/file/download/link", @"C:\file.txt" ); // Drive example: FileDownloader.DownloadFileFromURLToPath( "http://drive.google.com/file/d/FILEID/view?usp=sharing", @"C:\file.txt" ); - public static FileInfo DownloadFileFromUrlToPath(string url, string path) + public static FileInfo DownloadFileFromUrlToPath(string url, string path, bool noSSL = false) { Log.Info(string.Format("Downloading {0} to {1}", url, path)); if (File.Exists(path)) File.Delete(path); if (url.StartsWith(GoogleDriveDomain) || url.StartsWith(GoogleDriveDomain2)) - return DownloadGoogleDriveFileFromUrlToPath(url, path); - return DownloadFileFromUrlToPath(url, path, null); + return DownloadGoogleDriveFileFromUrlToPath(url, path, noSSL); + return DownloadFileFromUrlToPath(url, path, null, noSSL); } private static FileInfo DownloadFileFromUrlToPathRaw(string url, string path, HttpClient httpClient) @@ -49,16 +49,14 @@ namespace Flax.Deps return new FileInfo(path); } - private static FileInfo DownloadFileFromUrlToPath(string url, string path, HttpClient httpClient) + private static FileInfo DownloadFileFromUrlToPath(string url, string path, HttpClient httpClient, bool noSSL) { try { if (httpClient == null) { - using (httpClient = GetHttpClient()) - { + using (httpClient = GetHttpClient(noSSL)) return DownloadFileFromUrlToPathRaw(url, path, httpClient); - } } return DownloadFileFromUrlToPathRaw(url, path, httpClient); } @@ -126,12 +124,12 @@ namespace Flax.Deps // Downloading large files from Google Drive prompts a warning screen and // requires manual confirmation. Consider that case and try to confirm the download automatically // if warning prompt occurs - private static FileInfo DownloadGoogleDriveFileFromUrlToPath(string url, string path) + private static FileInfo DownloadGoogleDriveFileFromUrlToPath(string url, string path, bool noSSL) { // You can comment the statement below if the provided url is guaranteed to be in the following format: // https://drive.google.com/uc?id=FILEID&export=download url = GetGoogleDriveDownloadLinkFromUrl(url); - using (var httpClient = GetHttpClient()) + using (var httpClient = GetHttpClient(noSSL)) { FileInfo downloadedFile; @@ -139,7 +137,7 @@ namespace Flax.Deps // but works in the second attempt for (int i = 0; i < 2; i++) { - downloadedFile = DownloadFileFromUrlToPath(url, path, httpClient); + downloadedFile = DownloadFileFromUrlToPath(url, path, httpClient, noSSL); if (downloadedFile == null) return null; @@ -172,7 +170,7 @@ namespace Flax.Deps url = "https://drive.google.com" + content.Substring(linkIndex, linkEnd - linkIndex).Replace("&", "&"); } - downloadedFile = DownloadFileFromUrlToPath(url, path, httpClient); + downloadedFile = DownloadFileFromUrlToPath(url, path, httpClient, noSSL); return downloadedFile; } } @@ -211,11 +209,10 @@ namespace Flax.Deps return string.Format("https://drive.google.com/uc?id={0}&export=download", url.Substring(index, closingIndex - index)); } - private static HttpClient GetHttpClient() + private static HttpClient GetHttpClient(bool noSSL) { - if (IgnoreSSL) + if (noSSL || NoSSL) { - Log.Warning("Accessing HTTP with SSL certificate validation disabled!"); var handler = new HttpClientHandler(); handler.ClientCertificateOptions = ClientCertificateOption.Manual; handler.ServerCertificateCustomValidationCallback = (httpRequestMessage, cert, cetChain, policyErrors) => true; diff --git a/Source/Tools/Flax.Build/Projects/VisualStudioCode/VisualStudioCodeProjectGenerator.cs b/Source/Tools/Flax.Build/Projects/VisualStudioCode/VisualStudioCodeProjectGenerator.cs index 12b9d1e4e..d3f5faca4 100644 --- a/Source/Tools/Flax.Build/Projects/VisualStudioCode/VisualStudioCodeProjectGenerator.cs +++ b/Source/Tools/Flax.Build/Projects/VisualStudioCode/VisualStudioCodeProjectGenerator.cs @@ -342,6 +342,8 @@ namespace Flax.Build.Projects.VisualStudioCode json.BeginArray("args"); { + if (configuration.Platform == TargetPlatform.Linux || configuration.Platform == TargetPlatform.Mac) + json.AddUnnamedField("-std"); json.AddUnnamedField("-project"); json.AddUnnamedField(buildToolWorkspace); json.AddUnnamedField("-skipCompile"); @@ -395,6 +397,8 @@ namespace Flax.Build.Projects.VisualStudioCode json.AddField("program", Path.Combine(Globals.EngineRoot, "Binaries", "Editor", editorFolder, configuration.ConfigurationName, "FlaxEditor")); json.BeginArray("args"); { + if (configuration.Platform == TargetPlatform.Linux || configuration.Platform == TargetPlatform.Mac) + json.AddUnnamedField("-std"); json.AddUnnamedField("-project"); json.AddUnnamedField(buildToolWorkspace); json.AddUnnamedField("-skipCompile");