diff --git a/Source/Editor/Content/Proxy/SceneProxy.cs b/Source/Editor/Content/Proxy/SceneProxy.cs
index 004c2aed7..d959b524a 100644
--- a/Source/Editor/Content/Proxy/SceneProxy.cs
+++ b/Source/Editor/Content/Proxy/SceneProxy.cs
@@ -1,6 +1,7 @@
// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved.
using System;
+using FlaxEditor.GUI.ContextMenu;
using FlaxEditor.Windows;
using FlaxEngine;
@@ -68,5 +69,15 @@ namespace FlaxEditor.Content
{
return new SceneItem(path, id);
}
+
+ ///
+ public override void OnContentWindowContextMenu(ContextMenu menu, ContentItem item)
+ {
+ var id = ((SceneItem)item).ID;
+ if (Level.FindScene(id) == null)
+ {
+ menu.AddButton("Open (additive)", () => { Editor.Instance.Scene.OpenScene(id, true); });
+ }
+ }
}
}
diff --git a/Source/Editor/Cooker/Steps/DeployDataStep.cpp b/Source/Editor/Cooker/Steps/DeployDataStep.cpp
index 80cb73c2b..59ff0d744 100644
--- a/Source/Editor/Cooker/Steps/DeployDataStep.cpp
+++ b/Source/Editor/Cooker/Steps/DeployDataStep.cpp
@@ -48,21 +48,21 @@ bool DeployDataStep::Perform(CookingData& data)
}
if (buildSettings.SkipDotnetPackaging && data.Tools->UseSystemDotnet())
{
- // Use system-installed .Net Runtime
+ // Use system-installed .NET Runtime
FileSystem::DeleteDirectory(dstDotnet);
}
else
{
- // Deploy .Net Runtime files
+ // Deploy .NET Runtime files
FileSystem::CreateDirectory(dstDotnet);
String srcDotnet = depsRoot / TEXT("Dotnet");
if (FileSystem::DirectoryExists(srcDotnet))
{
- // Use prebuilt .Net installation for that platform
- LOG(Info, "Using .Net Runtime {} at {}", data.Tools->GetName(), srcDotnet);
+ // Use prebuilt .NET installation for that platform
+ LOG(Info, "Using .NET Runtime {} at {}", data.Tools->GetName(), srcDotnet);
if (EditorUtilities::CopyDirectoryIfNewer(dstDotnet, srcDotnet, true))
{
- data.Error(TEXT("Failed to copy .Net runtime data files."));
+ data.Error(TEXT("Failed to copy .NET runtime data files."));
return true;
}
}
@@ -85,7 +85,7 @@ bool DeployDataStep::Perform(CookingData& data)
}
if (canUseSystemDotnet && (aotMode == DotNetAOTModes::None || aotMode == DotNetAOTModes::ILC))
{
- // Ask Flax.Build to provide .Net SDK location for the current platform
+ // Ask Flax.Build to provide .NET SDK location for the current platform
String sdks;
bool failed = ScriptsBuilder::RunBuildTool(String::Format(TEXT("-log -logMessagesOnly -logFileWithConsole -logfile=SDKs.txt -printSDKs {}"), GAME_BUILD_DOTNET_VER), data.CacheDirectory);
failed |= File::ReadAllText(data.CacheDirectory / TEXT("SDKs.txt"), sdks);
@@ -101,7 +101,7 @@ bool DeployDataStep::Perform(CookingData& data)
}
if (failed || !FileSystem::DirectoryExists(srcDotnet))
{
- data.Error(TEXT("Failed to get .Net SDK location for a current platform."));
+ data.Error(TEXT("Failed to get .NET SDK location for the current host platform."));
return true;
}
@@ -110,19 +110,25 @@ bool DeployDataStep::Perform(CookingData& data)
FileSystem::GetChildDirectories(versions, srcDotnet / TEXT("host/fxr"));
if (versions.Count() == 0)
{
- data.Error(TEXT("Failed to get .Net SDK location for a current platform."));
+ data.Error(TEXT("Failed to find any .NET hostfxr versions for the current host platform."));
return true;
}
for (String& version : versions)
{
version = String(StringUtils::GetFileName(version));
- if (!version.StartsWith(TEXT("7.")))
+ if (!version.StartsWith(TEXT("7.")) && !version.StartsWith(TEXT("8."))) // .NET 7 or .NET 8
version.Clear();
}
Sorting::QuickSort(versions);
const String version = versions.Last();
+ if (version.IsEmpty())
+ {
+ data.Error(TEXT("Failed to find supported .NET hostfxr version for the current host platform."));
+ return true;
+ }
+
FileSystem::NormalizePath(srcDotnet);
- LOG(Info, "Using .Net Runtime {} at {}", version, srcDotnet);
+ LOG(Info, "Using .NET Runtime {} at {}", version, srcDotnet);
// Check if previously deployed files are valid (eg. system-installed .NET was updated from version 7.0.3 to 7.0.5)
{
@@ -158,13 +164,13 @@ bool DeployDataStep::Perform(CookingData& data)
}
if (failed)
{
- data.Error(TEXT("Failed to copy .Net runtime data files."));
+ data.Error(TEXT("Failed to copy .NET runtime data files."));
return true;
}
}
else
{
- // Ask Flax.Build to provide .Net Host Runtime location for the target platform
+ // Ask Flax.Build to provide .NET Host Runtime location for the target platform
String sdks;
const Char *platformName, *archName;
data.GetBuildPlatformName(platformName, archName);
@@ -180,11 +186,11 @@ bool DeployDataStep::Perform(CookingData& data)
}
if (failed || !FileSystem::DirectoryExists(srcDotnet))
{
- data.Error(TEXT("Failed to get .Net SDK location for a current platform."));
+ data.Error(TEXT("Failed to get .NET SDK location for the current host platform."));
return true;
}
FileSystem::NormalizePath(srcDotnet);
- LOG(Info, "Using .Net Runtime {} at {}", TEXT("Host"), srcDotnet);
+ LOG(Info, "Using .NET Runtime {} at {}", TEXT("Host"), srcDotnet);
// Deploy runtime files
const Char* corlibPrivateName = TEXT("System.Private.CoreLib.dll");
@@ -249,7 +255,7 @@ bool DeployDataStep::Perform(CookingData& data)
DEPLOY_NATIVE_FILE("libmonosgen-2.0.dylib");
DEPLOY_NATIVE_FILE("libSystem.IO.Compression.Native.dylib");
DEPLOY_NATIVE_FILE("libSystem.Native.dylib");
- DEPLOY_NATIVE_FILE("libSystem.Net.Security.Native.dylib");
+ DEPLOY_NATIVE_FILE("libSystem.NET.Security.Native.dylib");
DEPLOY_NATIVE_FILE("libSystem.Security.Cryptography.Native.Apple.dylib");
break;
#undef DEPLOY_NATIVE_FILE
@@ -257,7 +263,7 @@ bool DeployDataStep::Perform(CookingData& data)
}
if (failed)
{
- data.Error(TEXT("Failed to copy .Net runtime data files."));
+ data.Error(TEXT("Failed to copy .NET runtime data files."));
return true;
}
}
@@ -278,7 +284,7 @@ bool DeployDataStep::Perform(CookingData& data)
}
if (ScriptsBuilder::RunBuildTool(args))
{
- data.Error(TEXT("Failed to optimize .Net class library."));
+ data.Error(TEXT("Failed to optimize .NET class library."));
return true;
}
}
diff --git a/Source/Editor/Editor.cpp b/Source/Editor/Editor.cpp
index 527bfeb6d..2cf9b9b8f 100644
--- a/Source/Editor/Editor.cpp
+++ b/Source/Editor/Editor.cpp
@@ -404,13 +404,23 @@ int32 Editor::LoadProduct()
// Create new project option
if (CommandLine::Options.NewProject)
+ {
+ Array projectFiles;
+ FileSystem::DirectoryGetFiles(projectFiles, projectPath, TEXT("*.flaxproj"), DirectorySearchOption::TopDirectoryOnly);
+ if (projectFiles.Count() == 1)
+ {
+ // Skip creating new project if it already exists
+ LOG(Info, "Skip creatinng new project because it already exists");
+ CommandLine::Options.NewProject.Reset();
+ }
+ }
+ if (CommandLine::Options.NewProject)
{
if (projectPath.IsEmpty())
projectPath = Platform::GetWorkingDirectory();
else if (!FileSystem::DirectoryExists(projectPath))
FileSystem::CreateDirectory(projectPath);
FileSystem::NormalizePath(projectPath);
-
String folderName = StringUtils::GetFileName(projectPath);
String tmpName;
for (int32 i = 0; i < folderName.Length(); i++)
diff --git a/Source/Editor/Editor.cs b/Source/Editor/Editor.cs
index b384b6515..393bf564e 100644
--- a/Source/Editor/Editor.cs
+++ b/Source/Editor/Editor.cs
@@ -1343,108 +1343,6 @@ namespace FlaxEditor
public float AutoRebuildNavMeshTimeoutMs;
}
- [StructLayout(LayoutKind.Sequential)]
- [NativeMarshalling(typeof(VisualScriptLocalMarshaller))]
- internal struct VisualScriptLocal
- {
- public string Value;
- public string ValueTypeName;
- public uint NodeId;
- public int BoxId;
- }
-
- [CustomMarshaller(typeof(VisualScriptLocal), MarshalMode.Default, typeof(VisualScriptLocalMarshaller))]
- internal static class VisualScriptLocalMarshaller
- {
- [StructLayout(LayoutKind.Sequential)]
- internal struct VisualScriptLocalNative
- {
- public IntPtr Value;
- public IntPtr ValueTypeName;
- public uint NodeId;
- public int BoxId;
- }
-
- internal static VisualScriptLocal ConvertToManaged(VisualScriptLocalNative unmanaged) => ToManaged(unmanaged);
- internal static VisualScriptLocalNative ConvertToUnmanaged(VisualScriptLocal managed) => ToNative(managed);
-
- internal static VisualScriptLocal ToManaged(VisualScriptLocalNative managed)
- {
- return new VisualScriptLocal()
- {
- Value = ManagedString.ToManaged(managed.Value),
- ValueTypeName = ManagedString.ToManaged(managed.ValueTypeName),
- NodeId = managed.NodeId,
- BoxId = managed.BoxId,
- };
- }
-
- internal static VisualScriptLocalNative ToNative(VisualScriptLocal managed)
- {
- return new VisualScriptLocalNative()
- {
- Value = ManagedString.ToNative(managed.Value),
- ValueTypeName = ManagedString.ToNative(managed.ValueTypeName),
- NodeId = managed.NodeId,
- BoxId = managed.BoxId,
- };
- }
-
- internal static void Free(VisualScriptLocalNative unmanaged)
- {
- ManagedString.Free(unmanaged.Value);
- ManagedString.Free(unmanaged.ValueTypeName);
- }
- }
-
- [StructLayout(LayoutKind.Sequential)]
- [NativeMarshalling(typeof(VisualScriptStackFrameMarshaller))]
- internal struct VisualScriptStackFrame
- {
- public VisualScript Script;
- public uint NodeId;
- public int BoxId;
- }
-
- [CustomMarshaller(typeof(VisualScriptStackFrame), MarshalMode.Default, typeof(VisualScriptStackFrameMarshaller))]
- internal static class VisualScriptStackFrameMarshaller
- {
- [StructLayout(LayoutKind.Sequential)]
- internal struct VisualScriptStackFrameNative
- {
- public IntPtr Script;
- public uint NodeId;
- public int BoxId;
- }
-
- internal static VisualScriptStackFrame ConvertToManaged(VisualScriptStackFrameNative unmanaged) => ToManaged(unmanaged);
- internal static VisualScriptStackFrameNative ConvertToUnmanaged(VisualScriptStackFrame managed) => ToNative(managed);
-
- internal static VisualScriptStackFrame ToManaged(VisualScriptStackFrameNative managed)
- {
- return new VisualScriptStackFrame()
- {
- Script = VisualScriptMarshaller.ConvertToManaged(managed.Script),
- NodeId = managed.NodeId,
- BoxId = managed.BoxId,
- };
- }
-
- internal static VisualScriptStackFrameNative ToNative(VisualScriptStackFrame managed)
- {
- return new VisualScriptStackFrameNative()
- {
- Script = VisualScriptMarshaller.ConvertToUnmanaged(managed.Script),
- NodeId = managed.NodeId,
- BoxId = managed.BoxId,
- };
- }
-
- internal static void Free(VisualScriptStackFrameNative unmanaged)
- {
- }
- }
-
internal void BuildCommand(string arg)
{
if (TryBuildCommand(arg))
@@ -1723,21 +1621,6 @@ namespace FlaxEditor
[LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_RunVisualScriptBreakpointLoopTick", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))]
internal static partial void Internal_RunVisualScriptBreakpointLoopTick(float deltaTime);
- [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_GetVisualScriptLocals", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))]
- [return: MarshalUsing(typeof(FlaxEngine.Interop.ArrayMarshaller<,>), CountElementName = "localsCount")]
- internal static partial VisualScriptLocal[] Internal_GetVisualScriptLocals(out int localsCount);
-
- [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_GetVisualScriptStackFrames", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))]
- [return: MarshalUsing(typeof(FlaxEngine.Interop.ArrayMarshaller<,>), CountElementName = "stackFrameCount")]
- internal static partial VisualScriptStackFrame[] Internal_GetVisualScriptStackFrames(out int stackFrameCount);
-
- [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_GetVisualScriptPreviousScopeFrame", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))]
- internal static partial VisualScriptStackFrame Internal_GetVisualScriptPreviousScopeFrame();
-
- [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_EvaluateVisualScriptLocal", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))]
- [return: MarshalAs(UnmanagedType.U1)]
- internal static partial bool Internal_EvaluateVisualScriptLocal(IntPtr script, ref VisualScriptLocal local);
-
[LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_DeserializeSceneObject", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))]
internal static partial void Internal_DeserializeSceneObject(IntPtr sceneObject, string json);
diff --git a/Source/Editor/GUI/Dialogs/ColorPickerDialog.cs b/Source/Editor/GUI/Dialogs/ColorPickerDialog.cs
index 27878a763..66512236c 100644
--- a/Source/Editor/GUI/Dialogs/ColorPickerDialog.cs
+++ b/Source/Editor/GUI/Dialogs/ColorPickerDialog.cs
@@ -3,6 +3,8 @@
using FlaxEditor.GUI.Input;
using FlaxEngine;
using FlaxEngine.GUI;
+using FlaxEngine.Json;
+using System.Collections.Generic;
namespace FlaxEditor.GUI.Dialogs
{
@@ -30,6 +32,8 @@ namespace FlaxEditor.GUI.Dialogs
private const float HSVMargin = 0.0f;
private const float ChannelsMargin = 4.0f;
private const float ChannelTextWidth = 12.0f;
+ private const float SavedColorButtonWidth = 20.0f;
+ private const float SavedColorButtonHeight = 20.0f;
private Color _initialValue;
private Color _value;
@@ -52,6 +56,9 @@ namespace FlaxEditor.GUI.Dialogs
private Button _cOK;
private Button _cEyedropper;
+ private List _savedColors = new List();
+ private List