Files
FlaxEngine/Source/Editor/Managed/ManagedEditor.h

253 lines
9.0 KiB
C++

// Copyright (c) 2012-2024 Wojciech Figat. All rights reserved.
#pragma once
#include "Engine/Scripting/ScriptingObject.h"
#include "Engine/Platform/Window.h"
#include "Engine/ShadowsOfMordor/Types.h"
#include "Engine/Tools/TextureTool/TextureTool.h"
#include "Engine/Tools/ModelTool/ModelTool.h"
#include "Engine/Tools/AudioTool/AudioTool.h"
namespace CSG
{
class Brush;
}
/// <summary>
/// The main managed editor class. Editor root object.
/// </summary>
API_CLASS(Namespace="FlaxEditor", Name="Editor", NoSpawn, NoConstructor) class ManagedEditor : private ScriptingObject
{
DECLARE_SCRIPTING_TYPE_NO_SPAWN(ManagedEditor);
static Guid ObjectID;
struct InternalOptions
{
byte AutoReloadScriptsOnMainWindowFocus = 1;
byte ForceScriptCompilationOnStartup = 1;
byte UseAssetImportPathRelative = 1;
byte AutoRebuildCSG = 1;
float AutoRebuildCSGTimeoutMs = 50;
byte AutoRebuildNavMesh = 1;
float AutoRebuildNavMeshTimeoutMs = 100;
};
static InternalOptions ManagedEditorOptions;
public:
/// <summary>
/// Initializes a new instance of the <see cref="ManagedEditor"/> class.
/// </summary>
ManagedEditor();
/// <summary>
/// Finalizes an instance of the <see cref="ManagedEditor"/> class.
/// </summary>
~ManagedEditor();
public:
/// <summary>
/// Initializes managed editor.
/// </summary>
void Init();
void BeforeRun();
/// <summary>
/// Updates managed editor.
/// </summary>
void Update();
/// <summary>
/// Exits managed editor.
/// </summary>
void Exit();
/// <summary>
/// Gets the main window created by the c# editor.
/// </summary>
/// <returns>The main window</returns>
Window* GetMainWindow();
/// <summary>
/// Determines whether this managed editor allows reload scripts (based on editor state).
/// </summary>
bool CanReloadScripts();
/// <summary>
/// Determines whether this managed editor allows to reload scripts by auto (based on editor options).
/// </summary>
bool CanAutoReloadScripts() const
{
return ManagedEditorOptions.AutoReloadScriptsOnMainWindowFocus != 0;
}
/// <summary>
/// Determines whether this managed editor allows auto build CSG mesh on brush modification (based on editor state and settings).
/// </summary>
bool CanAutoBuildCSG();
/// <summary>
/// Determines whether this managed editor allows auto build navigation mesh on scene modification (based on editor state and settings).
/// </summary>
bool CanAutoBuildNavMesh();
public:
/// <summary>
/// Checks whenever the game viewport is focused by the user (eg. can receive input).
/// </summary>
/// <returns>True if game viewport is focused, otherwise false.</returns>
bool HasGameViewportFocus() const;
/// <summary>
/// Gives focus to the game viewport (game can receive input).
/// </summary>
void FocusGameViewport() const;
/// <summary>
/// Converts the screen-space position to the game viewport position.
/// </summary>
/// <param name="screenPos">The screen-space position.</param>
/// <returns>The game viewport position.</returns>
Float2 ScreenToGameViewport(const Float2& screenPos) const;
/// <summary>
/// Converts the game viewport position to the screen-space position.
/// </summary>
/// <param name="viewportPos">The game viewport position.</param>
/// <returns>The screen-space position.</returns>
Float2 GameViewportToScreen(const Float2& viewportPos) const;
/// <summary>
/// Gets the game window used to simulate game in editor. Can be used to capture input for the game scripts.
/// </summary>
/// <param name="forceGet">True if always get the window, otherwise only if focused.</param>
/// <returns>The window or null if hidden.</returns>
Window* GetGameWindow(bool forceGet = false);
/// <summary>
/// Gets the size of the game window output.
/// </summary>
/// <returns>The size.</returns>
Float2 GetGameWindowSize();
/// <summary>
/// Called when application code calls exit. Editor may end play mode or exit normally.
/// </summary>
/// <returns>True if exit engine, otherwise false.</returns>
bool OnAppExit();
/// <summary>
/// Requests play mode when the editor is in edit mode ( once ).
/// </summary>
void RequestStartPlayOnEditMode();
public:
/// <summary>
/// Imports the asset file to the target location.
/// </summary>
/// <param name="inputPath">The source file path.</param>
/// <param name="outputPath">The result asset file path.</param>
/// <param name="arg">The custom argument 9native data).</param>
/// <returns>True if importing failed, otherwise false.</returns>
API_FUNCTION() static bool Import(String inputPath, String outputPath, void* arg = nullptr);
#if COMPILE_WITH_TEXTURE_TOOL
/// <summary>
/// Imports the texture asset file to the target location.
/// </summary>
/// <param name="inputPath">The source file path.</param>
/// <param name="outputPath">The result asset file path.</param>
/// <param name="options">The import settings.</param>
/// <returns>True if importing failed, otherwise false.</returns>
API_FUNCTION() static bool Import(const String& inputPath, const String& outputPath, const TextureTool::Options& options);
/// <summary>
/// Tries the restore the asset import options from the target resource file.
/// </summary>
/// <param name="options">The options.</param>
/// <param name="assetPath">The asset path.</param>
/// <returns>True settings has been restored, otherwise false.</returns>
API_FUNCTION() static bool TryRestoreImportOptions(API_PARAM(Ref) TextureTool::Options& options, String assetPath);
#endif
#if COMPILE_WITH_MODEL_TOOL
/// <summary>
/// Imports the model asset file to the target location.
/// </summary>
/// <param name="inputPath">The source file path.</param>
/// <param name="outputPath">The result asset file path.</param>
/// <param name="options">The import settings.</param>
/// <returns>True if importing failed, otherwise false.</returns>
API_FUNCTION() static bool Import(const String& inputPath, const String& outputPath, const ModelTool::Options& options);
/// <summary>
/// Tries the restore the asset import options from the target resource file.
/// </summary>
/// <param name="options">The options.</param>
/// <param name="assetPath">The asset path.</param>
/// <returns>True settings has been restored, otherwise false.</returns>
API_FUNCTION() static bool TryRestoreImportOptions(API_PARAM(Ref) ModelTool::Options& options, String assetPath);
#endif
#if COMPILE_WITH_AUDIO_TOOL
/// <summary>
/// Imports the audio asset file to the target location.
/// </summary>
/// <param name="inputPath">The source file path.</param>
/// <param name="outputPath">The result asset file path.</param>
/// <param name="options">The import settings.</param>
/// <returns>True if importing failed, otherwise false.</returns>
API_FUNCTION() static bool Import(const String& inputPath, const String& outputPath, const AudioTool::Options& options);
/// <summary>
/// Tries the restore the asset import options from the target resource file.
/// </summary>
/// <param name="options">The options.</param>
/// <param name="assetPath">The asset path.</param>
/// <returns>True settings has been restored, otherwise false.</returns>
API_FUNCTION() static bool TryRestoreImportOptions(API_PARAM(Ref) AudioTool::Options& options, String assetPath);
#endif
/// <summary>
/// Creates a new asset at the target location.
/// </summary>
/// <param name="tag">New asset type.</param>
/// <param name="outputPath">Output asset path.</param>
API_FUNCTION() static bool CreateAsset(const String& tag, String outputPath);
public:
API_STRUCT(Internal, NoDefault) struct VisualScriptStackFrame
{
DECLARE_SCRIPTING_TYPE_MINIMAL(VisualScriptStackFrame);
API_FIELD() class VisualScript* Script;
API_FIELD() uint32 NodeId;
API_FIELD() int32 BoxId;
};
API_STRUCT(Internal, NoDefault) struct VisualScriptLocal
{
DECLARE_SCRIPTING_TYPE_MINIMAL(VisualScriptLocal);
API_FIELD() String Value;
API_FIELD() String ValueTypeName;
API_FIELD() uint32 NodeId;
API_FIELD() int32 BoxId;
};
API_FUNCTION(Internal) static Array<VisualScriptStackFrame> GetVisualScriptStackFrames();
API_FUNCTION(Internal) static VisualScriptStackFrame GetVisualScriptPreviousScopeFrame();
API_FUNCTION(Internal) static Array<VisualScriptLocal> GetVisualScriptLocals();
API_FUNCTION(Internal) static bool EvaluateVisualScriptLocal(VisualScript* script, API_PARAM(Ref) VisualScriptLocal& local);
API_FUNCTION(Internal) static void WipeOutLeftoverSceneObjects();
private:
void OnEditorAssemblyLoaded(MAssembly* assembly);
public:
// [ScriptingObject]
void DestroyManaged() override;
};