Merge pull request #76176 from YuriSizov/editor-extracted-interface-commencing

Decouple `EditorInterface` from `EditorPlugin`
This commit is contained in:
Rémi Verschelde 2023-04-18 23:41:20 +02:00
commit 5bb46d6064
No known key found for this signature in database
GPG Key ID: C3336907360768E1
25 changed files with 632 additions and 481 deletions

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="EditorInterface" inherits="Node" version="4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
<class name="EditorInterface" inherits="Object" version="4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
<brief_description>
Godot editor's interface.
</brief_description>
@ -34,7 +34,7 @@
Edits the given [Script]. The line and column on which to open the script can also be specified. The script will be open with the user-configured editor for the script's language which may be an external editor.
</description>
</method>
<method name="get_base_control">
<method name="get_base_control" qualifiers="const">
<return type="Control" />
<description>
Returns the main container of Godot editor's window. For example, you can use it to retrieve the size of the container and place your controls accordingly.
@ -60,20 +60,20 @@
Returns the current path being viewed in the [FileSystemDock].
</description>
</method>
<method name="get_edited_scene_root">
<method name="get_edited_scene_root" qualifiers="const">
<return type="Node" />
<description>
Returns the edited (current) scene's root [Node].
</description>
</method>
<method name="get_editor_main_screen">
<method name="get_editor_main_screen" qualifiers="const">
<return type="VBoxContainer" />
<description>
Returns the editor control responsible for main screen plugins and tools. Use it with plugins that implement [method EditorPlugin._has_main_screen].
[b]Warning:[/b] Removing and freeing this node will render a part of the editor useless and may cause a crash.
</description>
</method>
<method name="get_editor_paths">
<method name="get_editor_paths" qualifiers="const">
<return type="EditorPaths" />
<description>
Returns the [EditorPaths] singleton.
@ -86,13 +86,13 @@
[b]Note:[/b] This value is set via the [code]interface/editor/display_scale[/code] and [code]interface/editor/custom_display_scale[/code] editor settings. Editor must be restarted for changes to be properly applied.
</description>
</method>
<method name="get_editor_settings">
<method name="get_editor_settings" qualifiers="const">
<return type="EditorSettings" />
<description>
Returns the editor's [EditorSettings] instance.
</description>
</method>
<method name="get_file_system_dock">
<method name="get_file_system_dock" qualifiers="const">
<return type="FileSystemDock" />
<description>
Returns the editor's [FileSystemDock] instance.
@ -118,19 +118,19 @@
Returns the name of the scene that is being played. If no scene is currently being played, returns an empty string.
</description>
</method>
<method name="get_resource_filesystem">
<method name="get_resource_filesystem" qualifiers="const">
<return type="EditorFileSystem" />
<description>
Returns the editor's [EditorFileSystem] instance.
</description>
</method>
<method name="get_resource_previewer">
<method name="get_resource_previewer" qualifiers="const">
<return type="EditorResourcePreview" />
<description>
Returns the editor's [EditorResourcePreview] instance.
</description>
</method>
<method name="get_script_editor">
<method name="get_script_editor" qualifiers="const">
<return type="ScriptEditor" />
<description>
Returns the editor's [ScriptEditor] instance.
@ -143,7 +143,7 @@
Returns an array containing the paths of the currently selected files (and directories) in the [FileSystemDock].
</description>
</method>
<method name="get_selection">
<method name="get_selection" qualifiers="const">
<return type="EditorSelection" />
<description>
Returns the editor's [EditorSelection] instance.
@ -158,12 +158,6 @@
Shows the given property on the given [param object] in the editor's Inspector dock. If [param inspector_only] is [code]true[/code], plugins will not attempt to edit [param object].
</description>
</method>
<method name="is_movie_maker_enabled" qualifiers="const">
<return type="bool" />
<description>
Returns [code]true[/code] if Movie Maker mode is enabled in the editor. See also [method set_movie_maker_enabled]. See [MovieWriter] for more information.
</description>
</method>
<method name="is_playing_scene" qualifiers="const">
<return type="bool" />
<description>
@ -253,13 +247,6 @@
Sets the editor's current main screen to the one specified in [param name]. [param name] must match the text of the tab in question exactly ([code]2D[/code], [code]3D[/code], [code]Script[/code], [code]AssetLib[/code]).
</description>
</method>
<method name="set_movie_maker_enabled">
<return type="void" />
<param index="0" name="enabled" type="bool" />
<description>
Sets whether Movie Maker mode is enabled in the editor. See also [method is_movie_maker_enabled]. See [MovieWriter] for more information.
</description>
</method>
<method name="set_plugin_enabled">
<return type="void" />
<param index="0" name="plugin" type="String" />
@ -279,5 +266,8 @@
<member name="distraction_free_mode" type="bool" setter="set_distraction_free_mode" getter="is_distraction_free_mode_enabled">
If [code]true[/code], enables distraction-free mode which hides side docks to increase the space available for the main view.
</member>
<member name="movie_maker_enabled" type="bool" setter="set_movie_maker_enabled" getter="is_movie_maker_enabled">
If [code]true[/code], the Movie Maker mode is enabled in the editor. See [MovieWriter] for more information.
</member>
</members>
</class>

View File

@ -532,7 +532,7 @@
<method name="get_editor_interface">
<return type="EditorInterface" />
<description>
Returns the [EditorInterface] object that gives you control over Godot editor's window and its functionalities.
Returns the [EditorInterface] singleton. It provides access to some parts of the editor GUI as well as various inner states and tools.
</description>
</method>
<method name="get_export_as_menu">

View File

@ -9,7 +9,7 @@
Accessing the settings can be done using the following methods, such as:
[codeblocks]
[gdscript]
var settings = EditorInterface.get_editor_settings()
var settings = get_editor_interface().get_editor_settings()
# `settings.set("some/property", 10)` also works as this class overrides `_set()` internally.
settings.set_setting("some/property", 10)
# `settings.get("some/property")` also works as this class overrides `_get()` internally.

437
editor/editor_interface.cpp Normal file
View File

@ -0,0 +1,437 @@
/**************************************************************************/
/* editor_interface.cpp */
/**************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/**************************************************************************/
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
/* "Software"), to deal in the Software without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of the Software, and to */
/* permit persons to whom the Software is furnished to do so, subject to */
/* the following conditions: */
/* */
/* The above copyright notice and this permission notice shall be */
/* included in all copies or substantial portions of the Software. */
/* */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/**************************************************************************/
#include "editor_interface.h"
#include "editor/editor_command_palette.h"
#include "editor/editor_node.h"
#include "editor/editor_paths.h"
#include "editor/editor_resource_preview.h"
#include "editor/editor_scale.h"
#include "editor/editor_settings.h"
#include "editor/filesystem_dock.h"
#include "editor/inspector_dock.h"
#include "main/main.h"
#include "scene/gui/box_container.h"
#include "scene/gui/control.h"
EditorInterface *EditorInterface::singleton = nullptr;
void EditorInterface::restart_editor(bool p_save) {
if (p_save) {
EditorNode::get_singleton()->save_all_scenes();
}
EditorNode::get_singleton()->restart_editor();
}
// Editor tools.
EditorCommandPalette *EditorInterface::get_command_palette() const {
return EditorCommandPalette::get_singleton();
}
EditorFileSystem *EditorInterface::get_resource_file_system() const {
return EditorFileSystem::get_singleton();
}
EditorPaths *EditorInterface::get_editor_paths() const {
return EditorPaths::get_singleton();
}
EditorResourcePreview *EditorInterface::get_resource_previewer() const {
return EditorResourcePreview::get_singleton();
}
EditorSelection *EditorInterface::get_selection() const {
return EditorNode::get_singleton()->get_editor_selection();
}
Ref<EditorSettings> EditorInterface::get_editor_settings() const {
return EditorSettings::get_singleton();
}
TypedArray<Texture2D> EditorInterface::_make_mesh_previews(const TypedArray<Mesh> &p_meshes, int p_preview_size) {
Vector<Ref<Mesh>> meshes;
for (int i = 0; i < p_meshes.size(); i++) {
meshes.push_back(p_meshes[i]);
}
Vector<Ref<Texture2D>> textures = make_mesh_previews(meshes, nullptr, p_preview_size);
TypedArray<Texture2D> ret;
for (int i = 0; i < textures.size(); i++) {
ret.push_back(textures[i]);
}
return ret;
}
Vector<Ref<Texture2D>> EditorInterface::make_mesh_previews(const Vector<Ref<Mesh>> &p_meshes, Vector<Transform3D> *p_transforms, int p_preview_size) {
int size = p_preview_size;
RID scenario = RS::get_singleton()->scenario_create();
RID viewport = RS::get_singleton()->viewport_create();
RS::get_singleton()->viewport_set_update_mode(viewport, RS::VIEWPORT_UPDATE_ALWAYS);
RS::get_singleton()->viewport_set_scenario(viewport, scenario);
RS::get_singleton()->viewport_set_size(viewport, size, size);
RS::get_singleton()->viewport_set_transparent_background(viewport, true);
RS::get_singleton()->viewport_set_active(viewport, true);
RID viewport_texture = RS::get_singleton()->viewport_get_texture(viewport);
RID camera = RS::get_singleton()->camera_create();
RS::get_singleton()->viewport_attach_camera(viewport, camera);
RID light = RS::get_singleton()->directional_light_create();
RID light_instance = RS::get_singleton()->instance_create2(light, scenario);
RID light2 = RS::get_singleton()->directional_light_create();
RS::get_singleton()->light_set_color(light2, Color(0.7, 0.7, 0.7));
RID light_instance2 = RS::get_singleton()->instance_create2(light2, scenario);
EditorProgress ep("mlib", TTR("Creating Mesh Previews"), p_meshes.size());
Vector<Ref<Texture2D>> textures;
for (int i = 0; i < p_meshes.size(); i++) {
Ref<Mesh> mesh = p_meshes[i];
if (!mesh.is_valid()) {
textures.push_back(Ref<Texture2D>());
continue;
}
Transform3D mesh_xform;
if (p_transforms != nullptr) {
mesh_xform = (*p_transforms)[i];
}
RID inst = RS::get_singleton()->instance_create2(mesh->get_rid(), scenario);
RS::get_singleton()->instance_set_transform(inst, mesh_xform);
AABB aabb = mesh->get_aabb();
Vector3 ofs = aabb.get_center();
aabb.position -= ofs;
Transform3D xform;
xform.basis = Basis().rotated(Vector3(0, 1, 0), -Math_PI / 6);
xform.basis = Basis().rotated(Vector3(1, 0, 0), Math_PI / 6) * xform.basis;
AABB rot_aabb = xform.xform(aabb);
float m = MAX(rot_aabb.size.x, rot_aabb.size.y) * 0.5;
if (m == 0) {
textures.push_back(Ref<Texture2D>());
continue;
}
xform.origin = -xform.basis.xform(ofs); //-ofs*m;
xform.origin.z -= rot_aabb.size.z * 2;
xform.invert();
xform = mesh_xform * xform;
RS::get_singleton()->camera_set_transform(camera, xform * Transform3D(Basis(), Vector3(0, 0, 3)));
RS::get_singleton()->camera_set_orthogonal(camera, m * 2, 0.01, 1000.0);
RS::get_singleton()->instance_set_transform(light_instance, xform * Transform3D().looking_at(Vector3(-2, -1, -1), Vector3(0, 1, 0)));
RS::get_singleton()->instance_set_transform(light_instance2, xform * Transform3D().looking_at(Vector3(+1, -1, -2), Vector3(0, 1, 0)));
ep.step(TTR("Thumbnail..."), i);
DisplayServer::get_singleton()->process_events();
Main::iteration();
Main::iteration();
Ref<Image> img = RS::get_singleton()->texture_2d_get(viewport_texture);
ERR_CONTINUE(!img.is_valid() || img->is_empty());
Ref<ImageTexture> it = ImageTexture::create_from_image(img);
RS::get_singleton()->free(inst);
textures.push_back(it);
}
RS::get_singleton()->free(viewport);
RS::get_singleton()->free(light);
RS::get_singleton()->free(light_instance);
RS::get_singleton()->free(light2);
RS::get_singleton()->free(light_instance2);
RS::get_singleton()->free(camera);
RS::get_singleton()->free(scenario);
return textures;
}
void EditorInterface::set_plugin_enabled(const String &p_plugin, bool p_enabled) {
EditorNode::get_singleton()->set_addon_plugin_enabled(p_plugin, p_enabled, true);
}
bool EditorInterface::is_plugin_enabled(const String &p_plugin) const {
return EditorNode::get_singleton()->is_addon_plugin_enabled(p_plugin);
}
// Editor GUI.
Control *EditorInterface::get_base_control() const {
return EditorNode::get_singleton()->get_gui_base();
}
VBoxContainer *EditorInterface::get_editor_main_screen() const {
return EditorNode::get_singleton()->get_main_screen_control();
}
ScriptEditor *EditorInterface::get_script_editor() const {
return ScriptEditor::get_singleton();
}
void EditorInterface::set_main_screen_editor(const String &p_name) {
EditorNode::get_singleton()->select_editor_by_name(p_name);
}
void EditorInterface::set_distraction_free_mode(bool p_enter) {
EditorNode::get_singleton()->set_distraction_free_mode(p_enter);
}
bool EditorInterface::is_distraction_free_mode_enabled() const {
return EditorNode::get_singleton()->is_distraction_free_mode_enabled();
}
float EditorInterface::get_editor_scale() const {
return EDSCALE;
}
// Editor docks.
FileSystemDock *EditorInterface::get_file_system_dock() const {
return FileSystemDock::get_singleton();
}
void EditorInterface::select_file(const String &p_file) {
FileSystemDock::get_singleton()->select_file(p_file);
}
Vector<String> EditorInterface::get_selected_paths() const {
return FileSystemDock::get_singleton()->get_selected_paths();
}
String EditorInterface::get_current_path() const {
return FileSystemDock::get_singleton()->get_current_path();
}
String EditorInterface::get_current_directory() const {
return FileSystemDock::get_singleton()->get_current_directory();
}
EditorInspector *EditorInterface::get_inspector() const {
return InspectorDock::get_inspector_singleton();
}
// Object/Resource/Node editing.
void EditorInterface::inspect_object(Object *p_obj, const String &p_for_property, bool p_inspector_only) {
EditorNode::get_singleton()->push_item(p_obj, p_for_property, p_inspector_only);
}
void EditorInterface::edit_resource(const Ref<Resource> &p_resource) {
EditorNode::get_singleton()->edit_resource(p_resource);
}
void EditorInterface::edit_node(Node *p_node) {
EditorNode::get_singleton()->edit_node(p_node);
}
void EditorInterface::edit_script(const Ref<Script> &p_script, int p_line, int p_col, bool p_grab_focus) {
ScriptEditor::get_singleton()->edit(p_script, p_line, p_col, p_grab_focus);
}
void EditorInterface::open_scene_from_path(const String &scene_path) {
if (EditorNode::get_singleton()->is_changing_scene()) {
return;
}
EditorNode::get_singleton()->open_request(scene_path);
}
void EditorInterface::reload_scene_from_path(const String &scene_path) {
if (EditorNode::get_singleton()->is_changing_scene()) {
return;
}
EditorNode::get_singleton()->reload_scene(scene_path);
}
Node *EditorInterface::get_edited_scene_root() const {
return EditorNode::get_singleton()->get_edited_scene();
}
PackedStringArray EditorInterface::get_open_scenes() const {
PackedStringArray ret;
Vector<EditorData::EditedScene> scenes = EditorNode::get_editor_data().get_edited_scenes();
int scns_amount = scenes.size();
for (int idx_scn = 0; idx_scn < scns_amount; idx_scn++) {
if (scenes[idx_scn].root == nullptr) {
continue;
}
ret.push_back(scenes[idx_scn].root->get_scene_file_path());
}
return ret;
}
Error EditorInterface::save_scene() {
if (!get_edited_scene_root()) {
return ERR_CANT_CREATE;
}
if (get_edited_scene_root()->get_scene_file_path().is_empty()) {
return ERR_CANT_CREATE;
}
save_scene_as(get_edited_scene_root()->get_scene_file_path());
return OK;
}
void EditorInterface::save_scene_as(const String &p_scene, bool p_with_preview) {
EditorNode::get_singleton()->save_scene_to_path(p_scene, p_with_preview);
}
// Scene playback.
void EditorInterface::play_main_scene() {
EditorNode::get_singleton()->run_play();
}
void EditorInterface::play_current_scene() {
EditorNode::get_singleton()->run_play_current();
}
void EditorInterface::play_custom_scene(const String &scene_path) {
EditorNode::get_singleton()->run_play_custom(scene_path);
}
void EditorInterface::stop_playing_scene() {
EditorNode::get_singleton()->run_stop();
}
bool EditorInterface::is_playing_scene() const {
return EditorNode::get_singleton()->is_run_playing();
}
String EditorInterface::get_playing_scene() const {
return EditorNode::get_singleton()->get_run_playing_scene();
}
void EditorInterface::set_movie_maker_enabled(bool p_enabled) {
EditorNode::get_singleton()->set_movie_maker_enabled(p_enabled);
}
bool EditorInterface::is_movie_maker_enabled() const {
return EditorNode::get_singleton()->is_movie_maker_enabled();
}
// Base.
void EditorInterface::_bind_methods() {
ClassDB::bind_method(D_METHOD("restart_editor", "save"), &EditorInterface::restart_editor, DEFVAL(true));
// Editor tools.
ClassDB::bind_method(D_METHOD("get_command_palette"), &EditorInterface::get_command_palette);
ClassDB::bind_method(D_METHOD("get_resource_filesystem"), &EditorInterface::get_resource_file_system);
ClassDB::bind_method(D_METHOD("get_editor_paths"), &EditorInterface::get_editor_paths);
ClassDB::bind_method(D_METHOD("get_resource_previewer"), &EditorInterface::get_resource_previewer);
ClassDB::bind_method(D_METHOD("get_selection"), &EditorInterface::get_selection);
ClassDB::bind_method(D_METHOD("get_editor_settings"), &EditorInterface::get_editor_settings);
ClassDB::bind_method(D_METHOD("make_mesh_previews", "meshes", "preview_size"), &EditorInterface::_make_mesh_previews);
ClassDB::bind_method(D_METHOD("set_plugin_enabled", "plugin", "enabled"), &EditorInterface::set_plugin_enabled);
ClassDB::bind_method(D_METHOD("is_plugin_enabled", "plugin"), &EditorInterface::is_plugin_enabled);
// Editor GUI.
ClassDB::bind_method(D_METHOD("get_base_control"), &EditorInterface::get_base_control);
ClassDB::bind_method(D_METHOD("get_editor_main_screen"), &EditorInterface::get_editor_main_screen);
ClassDB::bind_method(D_METHOD("get_script_editor"), &EditorInterface::get_script_editor);
ClassDB::bind_method(D_METHOD("set_main_screen_editor", "name"), &EditorInterface::set_main_screen_editor);
ClassDB::bind_method(D_METHOD("set_distraction_free_mode", "enter"), &EditorInterface::set_distraction_free_mode);
ClassDB::bind_method(D_METHOD("is_distraction_free_mode_enabled"), &EditorInterface::is_distraction_free_mode_enabled);
ClassDB::bind_method(D_METHOD("get_editor_scale"), &EditorInterface::get_editor_scale);
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "distraction_free_mode"), "set_distraction_free_mode", "is_distraction_free_mode_enabled");
// Editor docks.
ClassDB::bind_method(D_METHOD("get_file_system_dock"), &EditorInterface::get_file_system_dock);
ClassDB::bind_method(D_METHOD("select_file", "file"), &EditorInterface::select_file);
ClassDB::bind_method(D_METHOD("get_selected_paths"), &EditorInterface::get_selected_paths);
ClassDB::bind_method(D_METHOD("get_current_path"), &EditorInterface::get_current_path);
ClassDB::bind_method(D_METHOD("get_current_directory"), &EditorInterface::get_current_directory);
ClassDB::bind_method(D_METHOD("get_inspector"), &EditorInterface::get_inspector);
// Object/Resource/Node editing.
ClassDB::bind_method(D_METHOD("inspect_object", "object", "for_property", "inspector_only"), &EditorInterface::inspect_object, DEFVAL(String()), DEFVAL(false));
ClassDB::bind_method(D_METHOD("edit_resource", "resource"), &EditorInterface::edit_resource);
ClassDB::bind_method(D_METHOD("edit_node", "node"), &EditorInterface::edit_node);
ClassDB::bind_method(D_METHOD("edit_script", "script", "line", "column", "grab_focus"), &EditorInterface::edit_script, DEFVAL(-1), DEFVAL(0), DEFVAL(true));
ClassDB::bind_method(D_METHOD("open_scene_from_path", "scene_filepath"), &EditorInterface::open_scene_from_path);
ClassDB::bind_method(D_METHOD("reload_scene_from_path", "scene_filepath"), &EditorInterface::reload_scene_from_path);
ClassDB::bind_method(D_METHOD("get_open_scenes"), &EditorInterface::get_open_scenes);
ClassDB::bind_method(D_METHOD("get_edited_scene_root"), &EditorInterface::get_edited_scene_root);
ClassDB::bind_method(D_METHOD("save_scene"), &EditorInterface::save_scene);
ClassDB::bind_method(D_METHOD("save_scene_as", "path", "with_preview"), &EditorInterface::save_scene_as, DEFVAL(true));
// Scene playback.
ClassDB::bind_method(D_METHOD("play_main_scene"), &EditorInterface::play_main_scene);
ClassDB::bind_method(D_METHOD("play_current_scene"), &EditorInterface::play_current_scene);
ClassDB::bind_method(D_METHOD("play_custom_scene", "scene_filepath"), &EditorInterface::play_custom_scene);
ClassDB::bind_method(D_METHOD("stop_playing_scene"), &EditorInterface::stop_playing_scene);
ClassDB::bind_method(D_METHOD("is_playing_scene"), &EditorInterface::is_playing_scene);
ClassDB::bind_method(D_METHOD("get_playing_scene"), &EditorInterface::get_playing_scene);
ClassDB::bind_method(D_METHOD("set_movie_maker_enabled", "enabled"), &EditorInterface::set_movie_maker_enabled);
ClassDB::bind_method(D_METHOD("is_movie_maker_enabled"), &EditorInterface::is_movie_maker_enabled);
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "movie_maker_enabled"), "set_movie_maker_enabled", "is_movie_maker_enabled");
}
void EditorInterface::create() {
memnew(EditorInterface);
}
void EditorInterface::free() {
ERR_FAIL_COND(singleton == nullptr);
memdelete(singleton);
}
EditorInterface::EditorInterface() {
ERR_FAIL_COND(singleton != nullptr);
singleton = this;
}

143
editor/editor_interface.h Normal file
View File

@ -0,0 +1,143 @@
/**************************************************************************/
/* editor_interface.h */
/**************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/**************************************************************************/
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
/* "Software"), to deal in the Software without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of the Software, and to */
/* permit persons to whom the Software is furnished to do so, subject to */
/* the following conditions: */
/* */
/* The above copyright notice and this permission notice shall be */
/* included in all copies or substantial portions of the Software. */
/* */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/**************************************************************************/
#ifndef EDITOR_INTERFACE_H
#define EDITOR_INTERFACE_H
#include "core/io/resource.h"
#include "core/object/class_db.h"
#include "core/object/object.h"
#include "core/object/script_language.h"
class Control;
class EditorCommandPalette;
class EditorFileSystem;
class EditorInspector;
class EditorPaths;
class EditorResourcePreview;
class EditorSelection;
class EditorSettings;
class FileSystemDock;
class Mesh;
class Node;
class ScriptEditor;
class Texture2D;
class VBoxContainer;
class EditorInterface : public Object {
GDCLASS(EditorInterface, Object);
static EditorInterface *singleton;
// Editor tools.
TypedArray<Texture2D> _make_mesh_previews(const TypedArray<Mesh> &p_meshes, int p_preview_size);
protected:
static void _bind_methods();
public:
static EditorInterface *get_singleton() { return singleton; }
void restart_editor(bool p_save = true);
// Editor tools.
EditorCommandPalette *get_command_palette() const;
EditorFileSystem *get_resource_file_system() const;
EditorPaths *get_editor_paths() const;
EditorResourcePreview *get_resource_previewer() const;
EditorSelection *get_selection() const;
Ref<EditorSettings> get_editor_settings() const;
Vector<Ref<Texture2D>> make_mesh_previews(const Vector<Ref<Mesh>> &p_meshes, Vector<Transform3D> *p_transforms, int p_preview_size);
void set_plugin_enabled(const String &p_plugin, bool p_enabled);
bool is_plugin_enabled(const String &p_plugin) const;
// Editor GUI.
Control *get_base_control() const;
VBoxContainer *get_editor_main_screen() const;
ScriptEditor *get_script_editor() const;
void set_main_screen_editor(const String &p_name);
void set_distraction_free_mode(bool p_enter);
bool is_distraction_free_mode_enabled() const;
float get_editor_scale() const;
// Editor docks.
FileSystemDock *get_file_system_dock() const;
void select_file(const String &p_file);
Vector<String> get_selected_paths() const;
String get_current_path() const;
String get_current_directory() const;
EditorInspector *get_inspector() const;
// Object/Resource/Node editing.
void inspect_object(Object *p_obj, const String &p_for_property = String(), bool p_inspector_only = false);
void edit_resource(const Ref<Resource> &p_resource);
void edit_node(Node *p_node);
void edit_script(const Ref<Script> &p_script, int p_line = -1, int p_col = 0, bool p_grab_focus = true);
void open_scene_from_path(const String &scene_path);
void reload_scene_from_path(const String &scene_path);
PackedStringArray get_open_scenes() const;
Node *get_edited_scene_root() const;
Error save_scene();
void save_scene_as(const String &p_scene, bool p_with_preview = true);
// Scene playback.
void play_main_scene();
void play_current_scene();
void play_custom_scene(const String &scene_path);
void stop_playing_scene();
bool is_playing_scene() const;
String get_playing_scene() const;
void set_movie_maker_enabled(bool p_enabled);
bool is_movie_maker_enabled() const;
// Base.
static void create();
static void free();
EditorInterface();
};
#endif // EDITOR_INTERFACE_H

View File

@ -75,6 +75,7 @@
#include "editor/editor_folding.h"
#include "editor/editor_help.h"
#include "editor/editor_inspector.h"
#include "editor/editor_interface.h"
#include "editor/editor_layouts_dialog.h"
#include "editor/editor_log.h"
#include "editor/editor_native_shader_source_visualizer.h"
@ -7901,11 +7902,6 @@ EditorNode::EditorNode() {
print_verbose("Asset Library not available (due to using Web editor, or SSL support disabled).");
}
// Add interface before adding plugins.
editor_interface = memnew(EditorInterface);
add_child(editor_interface);
// More visually meaningful to have this later.
raise_bottom_panel_item(AnimationPlayerEditor::get_singleton());

View File

@ -65,6 +65,7 @@ class TabContainer;
class TextureRect;
class TextureProgressBar;
class Tree;
class VBoxContainer;
class VSplitContainer;
class Window;
@ -269,7 +270,6 @@ private:
EditorCommandPalette *command_palette = nullptr;
EditorExport *editor_export = nullptr;
EditorInterface *editor_interface = nullptr;
EditorLog *log = nullptr;
EditorNativeShaderSourceVisualizer *native_shader_source_visualizer = nullptr;
EditorPlugin *editor_plugin_screen = nullptr;

View File

@ -91,8 +91,7 @@ String EditorPaths::get_feature_profiles_dir() const {
}
void EditorPaths::create() {
ERR_FAIL_COND(singleton != nullptr);
memnew(EditorPaths());
memnew(EditorPaths);
}
void EditorPaths::free() {
@ -111,6 +110,7 @@ void EditorPaths::_bind_methods() {
}
EditorPaths::EditorPaths() {
ERR_FAIL_COND(singleton != nullptr);
singleton = this;
project_data_dir = ProjectSettings::get_singleton()->get_project_data_path();

View File

@ -31,15 +31,13 @@
#include "editor_plugin.h"
#include "editor/debugger/editor_debugger_node.h"
#include "editor/editor_command_palette.h"
#include "editor/editor_file_system.h"
#include "editor/editor_inspector.h"
#include "editor/editor_interface.h"
#include "editor/editor_node.h"
#include "editor/editor_paths.h"
#include "editor/editor_resource_preview.h"
#include "editor/editor_settings.h"
#include "editor/editor_translation_parser.h"
#include "editor/editor_undo_redo_manager.h"
#include "editor/export/editor_export.h"
#include "editor/filesystem_dock.h"
#include "editor/gui/editor_title_bar.h"
#include "editor/import/editor_import_plugin.h"
#include "editor/import/resource_importer_scene.h"
@ -51,362 +49,10 @@
#include "editor/plugins/script_editor_plugin.h"
#include "editor/project_settings_editor.h"
#include "editor/scene_tree_dock.h"
#include "main/main.h"
#include "scene/3d/camera_3d.h"
#include "scene/gui/popup_menu.h"
#include "servers/rendering_server.h"
TypedArray<Texture2D> EditorInterface::_make_mesh_previews(const TypedArray<Mesh> &p_meshes, int p_preview_size) {
Vector<Ref<Mesh>> meshes;
for (int i = 0; i < p_meshes.size(); i++) {
meshes.push_back(p_meshes[i]);
}
Vector<Ref<Texture2D>> textures = make_mesh_previews(meshes, nullptr, p_preview_size);
TypedArray<Texture2D> ret;
for (int i = 0; i < textures.size(); i++) {
ret.push_back(textures[i]);
}
return ret;
}
Vector<Ref<Texture2D>> EditorInterface::make_mesh_previews(const Vector<Ref<Mesh>> &p_meshes, Vector<Transform3D> *p_transforms, int p_preview_size) {
int size = p_preview_size;
RID scenario = RS::get_singleton()->scenario_create();
RID viewport = RS::get_singleton()->viewport_create();
RS::get_singleton()->viewport_set_update_mode(viewport, RS::VIEWPORT_UPDATE_ALWAYS);
RS::get_singleton()->viewport_set_scenario(viewport, scenario);
RS::get_singleton()->viewport_set_size(viewport, size, size);
RS::get_singleton()->viewport_set_transparent_background(viewport, true);
RS::get_singleton()->viewport_set_active(viewport, true);
RID viewport_texture = RS::get_singleton()->viewport_get_texture(viewport);
RID camera = RS::get_singleton()->camera_create();
RS::get_singleton()->viewport_attach_camera(viewport, camera);
RID light = RS::get_singleton()->directional_light_create();
RID light_instance = RS::get_singleton()->instance_create2(light, scenario);
RID light2 = RS::get_singleton()->directional_light_create();
RS::get_singleton()->light_set_color(light2, Color(0.7, 0.7, 0.7));
RID light_instance2 = RS::get_singleton()->instance_create2(light2, scenario);
EditorProgress ep("mlib", TTR("Creating Mesh Previews"), p_meshes.size());
Vector<Ref<Texture2D>> textures;
for (int i = 0; i < p_meshes.size(); i++) {
Ref<Mesh> mesh = p_meshes[i];
if (!mesh.is_valid()) {
textures.push_back(Ref<Texture2D>());
continue;
}
Transform3D mesh_xform;
if (p_transforms != nullptr) {
mesh_xform = (*p_transforms)[i];
}
RID inst = RS::get_singleton()->instance_create2(mesh->get_rid(), scenario);
RS::get_singleton()->instance_set_transform(inst, mesh_xform);
AABB aabb = mesh->get_aabb();
Vector3 ofs = aabb.get_center();
aabb.position -= ofs;
Transform3D xform;
xform.basis = Basis().rotated(Vector3(0, 1, 0), -Math_PI / 6);
xform.basis = Basis().rotated(Vector3(1, 0, 0), Math_PI / 6) * xform.basis;
AABB rot_aabb = xform.xform(aabb);
float m = MAX(rot_aabb.size.x, rot_aabb.size.y) * 0.5;
if (m == 0) {
textures.push_back(Ref<Texture2D>());
continue;
}
xform.origin = -xform.basis.xform(ofs); //-ofs*m;
xform.origin.z -= rot_aabb.size.z * 2;
xform.invert();
xform = mesh_xform * xform;
RS::get_singleton()->camera_set_transform(camera, xform * Transform3D(Basis(), Vector3(0, 0, 3)));
RS::get_singleton()->camera_set_orthogonal(camera, m * 2, 0.01, 1000.0);
RS::get_singleton()->instance_set_transform(light_instance, xform * Transform3D().looking_at(Vector3(-2, -1, -1), Vector3(0, 1, 0)));
RS::get_singleton()->instance_set_transform(light_instance2, xform * Transform3D().looking_at(Vector3(+1, -1, -2), Vector3(0, 1, 0)));
ep.step(TTR("Thumbnail..."), i);
DisplayServer::get_singleton()->process_events();
Main::iteration();
Main::iteration();
Ref<Image> img = RS::get_singleton()->texture_2d_get(viewport_texture);
ERR_CONTINUE(!img.is_valid() || img->is_empty());
Ref<ImageTexture> it = ImageTexture::create_from_image(img);
RS::get_singleton()->free(inst);
textures.push_back(it);
}
RS::get_singleton()->free(viewport);
RS::get_singleton()->free(light);
RS::get_singleton()->free(light_instance);
RS::get_singleton()->free(light2);
RS::get_singleton()->free(light_instance2);
RS::get_singleton()->free(camera);
RS::get_singleton()->free(scenario);
return textures;
}
void EditorInterface::set_main_screen_editor(const String &p_name) {
EditorNode::get_singleton()->select_editor_by_name(p_name);
}
VBoxContainer *EditorInterface::get_editor_main_screen() {
return EditorNode::get_singleton()->get_main_screen_control();
}
void EditorInterface::edit_resource(const Ref<Resource> &p_resource) {
EditorNode::get_singleton()->edit_resource(p_resource);
}
void EditorInterface::edit_node(Node *p_node) {
EditorNode::get_singleton()->edit_node(p_node);
}
void EditorInterface::edit_script(const Ref<Script> &p_script, int p_line, int p_col, bool p_grab_focus) {
ScriptEditor::get_singleton()->edit(p_script, p_line, p_col, p_grab_focus);
}
void EditorInterface::open_scene_from_path(const String &scene_path) {
if (EditorNode::get_singleton()->is_changing_scene()) {
return;
}
EditorNode::get_singleton()->open_request(scene_path);
}
void EditorInterface::reload_scene_from_path(const String &scene_path) {
if (EditorNode::get_singleton()->is_changing_scene()) {
return;
}
EditorNode::get_singleton()->reload_scene(scene_path);
}
void EditorInterface::play_main_scene() {
EditorNode::get_singleton()->run_play();
}
void EditorInterface::play_current_scene() {
EditorNode::get_singleton()->run_play_current();
}
void EditorInterface::play_custom_scene(const String &scene_path) {
EditorNode::get_singleton()->run_play_custom(scene_path);
}
void EditorInterface::stop_playing_scene() {
EditorNode::get_singleton()->run_stop();
}
bool EditorInterface::is_playing_scene() const {
return EditorNode::get_singleton()->is_run_playing();
}
String EditorInterface::get_playing_scene() const {
return EditorNode::get_singleton()->get_run_playing_scene();
}
Node *EditorInterface::get_edited_scene_root() {
return EditorNode::get_singleton()->get_edited_scene();
}
PackedStringArray EditorInterface::get_open_scenes() const {
PackedStringArray ret;
Vector<EditorData::EditedScene> scenes = EditorNode::get_editor_data().get_edited_scenes();
int scns_amount = scenes.size();
for (int idx_scn = 0; idx_scn < scns_amount; idx_scn++) {
if (scenes[idx_scn].root == nullptr) {
continue;
}
ret.push_back(scenes[idx_scn].root->get_scene_file_path());
}
return ret;
}
ScriptEditor *EditorInterface::get_script_editor() {
return ScriptEditor::get_singleton();
}
void EditorInterface::select_file(const String &p_file) {
FileSystemDock::get_singleton()->select_file(p_file);
}
Vector<String> EditorInterface::get_selected_paths() const {
return FileSystemDock::get_singleton()->get_selected_paths();
}
String EditorInterface::get_current_path() const {
return FileSystemDock::get_singleton()->get_current_path();
}
String EditorInterface::get_current_directory() const {
return FileSystemDock::get_singleton()->get_current_directory();
}
void EditorInterface::inspect_object(Object *p_obj, const String &p_for_property, bool p_inspector_only) {
EditorNode::get_singleton()->push_item(p_obj, p_for_property, p_inspector_only);
}
EditorFileSystem *EditorInterface::get_resource_file_system() {
return EditorFileSystem::get_singleton();
}
FileSystemDock *EditorInterface::get_file_system_dock() {
return FileSystemDock::get_singleton();
}
EditorSelection *EditorInterface::get_selection() {
return EditorNode::get_singleton()->get_editor_selection();
}
Ref<EditorSettings> EditorInterface::get_editor_settings() {
return EditorSettings::get_singleton();
}
EditorPaths *EditorInterface::get_editor_paths() {
return EditorPaths::get_singleton();
}
EditorResourcePreview *EditorInterface::get_resource_previewer() {
return EditorResourcePreview::get_singleton();
}
Control *EditorInterface::get_base_control() {
return EditorNode::get_singleton()->get_gui_base();
}
float EditorInterface::get_editor_scale() const {
return EDSCALE;
}
void EditorInterface::set_plugin_enabled(const String &p_plugin, bool p_enabled) {
EditorNode::get_singleton()->set_addon_plugin_enabled(p_plugin, p_enabled, true);
}
bool EditorInterface::is_plugin_enabled(const String &p_plugin) const {
return EditorNode::get_singleton()->is_addon_plugin_enabled(p_plugin);
}
void EditorInterface::set_movie_maker_enabled(bool p_enabled) {
EditorNode::get_singleton()->set_movie_maker_enabled(p_enabled);
}
bool EditorInterface::is_movie_maker_enabled() const {
return EditorNode::get_singleton()->is_movie_maker_enabled();
}
EditorInspector *EditorInterface::get_inspector() const {
return InspectorDock::get_inspector_singleton();
}
Error EditorInterface::save_scene() {
if (!get_edited_scene_root()) {
return ERR_CANT_CREATE;
}
if (get_edited_scene_root()->get_scene_file_path().is_empty()) {
return ERR_CANT_CREATE;
}
save_scene_as(get_edited_scene_root()->get_scene_file_path());
return OK;
}
void EditorInterface::save_scene_as(const String &p_scene, bool p_with_preview) {
EditorNode::get_singleton()->save_scene_to_path(p_scene, p_with_preview);
}
void EditorInterface::set_distraction_free_mode(bool p_enter) {
EditorNode::get_singleton()->set_distraction_free_mode(p_enter);
}
void EditorInterface::restart_editor(bool p_save) {
if (p_save) {
EditorNode::get_singleton()->save_all_scenes();
}
EditorNode::get_singleton()->restart_editor();
}
bool EditorInterface::is_distraction_free_mode_enabled() const {
return EditorNode::get_singleton()->is_distraction_free_mode_enabled();
}
EditorCommandPalette *EditorInterface::get_command_palette() const {
return EditorCommandPalette::get_singleton();
}
EditorInterface *EditorInterface::singleton = nullptr;
void EditorInterface::_bind_methods() {
ClassDB::bind_method(D_METHOD("inspect_object", "object", "for_property", "inspector_only"), &EditorInterface::inspect_object, DEFVAL(String()), DEFVAL(false));
ClassDB::bind_method(D_METHOD("get_selection"), &EditorInterface::get_selection);
ClassDB::bind_method(D_METHOD("get_editor_settings"), &EditorInterface::get_editor_settings);
ClassDB::bind_method(D_METHOD("get_script_editor"), &EditorInterface::get_script_editor);
ClassDB::bind_method(D_METHOD("get_base_control"), &EditorInterface::get_base_control);
ClassDB::bind_method(D_METHOD("get_editor_scale"), &EditorInterface::get_editor_scale);
ClassDB::bind_method(D_METHOD("edit_resource", "resource"), &EditorInterface::edit_resource);
ClassDB::bind_method(D_METHOD("edit_node", "node"), &EditorInterface::edit_node);
ClassDB::bind_method(D_METHOD("edit_script", "script", "line", "column", "grab_focus"), &EditorInterface::edit_script, DEFVAL(-1), DEFVAL(0), DEFVAL(true));
ClassDB::bind_method(D_METHOD("open_scene_from_path", "scene_filepath"), &EditorInterface::open_scene_from_path);
ClassDB::bind_method(D_METHOD("reload_scene_from_path", "scene_filepath"), &EditorInterface::reload_scene_from_path);
ClassDB::bind_method(D_METHOD("play_main_scene"), &EditorInterface::play_main_scene);
ClassDB::bind_method(D_METHOD("play_current_scene"), &EditorInterface::play_current_scene);
ClassDB::bind_method(D_METHOD("play_custom_scene", "scene_filepath"), &EditorInterface::play_custom_scene);
ClassDB::bind_method(D_METHOD("stop_playing_scene"), &EditorInterface::stop_playing_scene);
ClassDB::bind_method(D_METHOD("is_playing_scene"), &EditorInterface::is_playing_scene);
ClassDB::bind_method(D_METHOD("get_playing_scene"), &EditorInterface::get_playing_scene);
ClassDB::bind_method(D_METHOD("get_open_scenes"), &EditorInterface::get_open_scenes);
ClassDB::bind_method(D_METHOD("get_edited_scene_root"), &EditorInterface::get_edited_scene_root);
ClassDB::bind_method(D_METHOD("get_resource_previewer"), &EditorInterface::get_resource_previewer);
ClassDB::bind_method(D_METHOD("get_resource_filesystem"), &EditorInterface::get_resource_file_system);
ClassDB::bind_method(D_METHOD("get_editor_main_screen"), &EditorInterface::get_editor_main_screen);
ClassDB::bind_method(D_METHOD("make_mesh_previews", "meshes", "preview_size"), &EditorInterface::_make_mesh_previews);
ClassDB::bind_method(D_METHOD("select_file", "file"), &EditorInterface::select_file);
ClassDB::bind_method(D_METHOD("get_selected_paths"), &EditorInterface::get_selected_paths);
ClassDB::bind_method(D_METHOD("get_current_path"), &EditorInterface::get_current_path);
ClassDB::bind_method(D_METHOD("get_current_directory"), &EditorInterface::get_current_directory);
ClassDB::bind_method(D_METHOD("get_file_system_dock"), &EditorInterface::get_file_system_dock);
ClassDB::bind_method(D_METHOD("get_editor_paths"), &EditorInterface::get_editor_paths);
ClassDB::bind_method(D_METHOD("get_command_palette"), &EditorInterface::get_command_palette);
ClassDB::bind_method(D_METHOD("set_plugin_enabled", "plugin", "enabled"), &EditorInterface::set_plugin_enabled);
ClassDB::bind_method(D_METHOD("is_plugin_enabled", "plugin"), &EditorInterface::is_plugin_enabled);
ClassDB::bind_method(D_METHOD("set_movie_maker_enabled", "enabled"), &EditorInterface::set_movie_maker_enabled);
ClassDB::bind_method(D_METHOD("is_movie_maker_enabled"), &EditorInterface::is_movie_maker_enabled);
ClassDB::bind_method(D_METHOD("get_inspector"), &EditorInterface::get_inspector);
ClassDB::bind_method(D_METHOD("save_scene"), &EditorInterface::save_scene);
ClassDB::bind_method(D_METHOD("save_scene_as", "path", "with_preview"), &EditorInterface::save_scene_as, DEFVAL(true));
ClassDB::bind_method(D_METHOD("restart_editor", "save"), &EditorInterface::restart_editor, DEFVAL(true));
ClassDB::bind_method(D_METHOD("set_main_screen_editor", "name"), &EditorInterface::set_main_screen_editor);
ClassDB::bind_method(D_METHOD("set_distraction_free_mode", "enter"), &EditorInterface::set_distraction_free_mode);
ClassDB::bind_method(D_METHOD("is_distraction_free_mode_enabled"), &EditorInterface::is_distraction_free_mode_enabled);
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "distraction_free_mode"), "set_distraction_free_mode", "is_distraction_free_mode_enabled");
}
EditorInterface::EditorInterface() {
singleton = this;
}
///////////////////////////////////////////
void EditorPlugin::add_custom_type(const String &p_type, const String &p_base, const Ref<Script> &p_script, const Ref<Texture2D> &p_icon) {
EditorNode::get_editor_data().add_custom_type(p_type, p_base, p_script, p_icon);
}

View File

@ -38,101 +38,20 @@
class Node3D;
class Button;
class PopupMenu;
class EditorCommandPalette;
class EditorDebuggerPlugin;
class EditorExport;
class EditorExportPlugin;
class EditorFileSystem;
class EditorImportPlugin;
class EditorInspector;
class EditorInspectorPlugin;
class EditorInterface;
class EditorNode3DGizmoPlugin;
class EditorPaths;
class EditorResourceConversionPlugin;
class EditorResourcePreview;
class EditorSceneFormatImporter;
class EditorScenePostImportPlugin;
class EditorSelection;
class EditorSettings;
class EditorToolAddons;
class EditorTranslationParserPlugin;
class EditorUndoRedoManager;
class FileSystemDock;
class ScriptCreateDialog;
class ScriptEditor;
class VBoxContainer;
class EditorInterface : public Node {
GDCLASS(EditorInterface, Node);
protected:
static void _bind_methods();
static EditorInterface *singleton;
TypedArray<Texture2D> _make_mesh_previews(const TypedArray<Mesh> &p_meshes, int p_preview_size);
public:
static EditorInterface *get_singleton() { return singleton; }
VBoxContainer *get_editor_main_screen();
void edit_resource(const Ref<Resource> &p_resource);
void edit_node(Node *p_node);
void edit_script(const Ref<Script> &p_script, int p_line = -1, int p_col = 0, bool p_grab_focus = true);
void open_scene_from_path(const String &scene_path);
void reload_scene_from_path(const String &scene_path);
void play_main_scene();
void play_current_scene();
void play_custom_scene(const String &scene_path);
void stop_playing_scene();
bool is_playing_scene() const;
String get_playing_scene() const;
Node *get_edited_scene_root();
PackedStringArray get_open_scenes() const;
ScriptEditor *get_script_editor();
EditorCommandPalette *get_command_palette() const;
void select_file(const String &p_file);
Vector<String> get_selected_paths() const;
String get_current_path() const;
String get_current_directory() const;
void inspect_object(Object *p_obj, const String &p_for_property = String(), bool p_inspector_only = false);
EditorSelection *get_selection();
//EditorImportExport *get_import_export();
Ref<EditorSettings> get_editor_settings();
EditorPaths *get_editor_paths();
EditorResourcePreview *get_resource_previewer();
EditorFileSystem *get_resource_file_system();
FileSystemDock *get_file_system_dock();
Control *get_base_control();
float get_editor_scale() const;
void set_plugin_enabled(const String &p_plugin, bool p_enabled);
bool is_plugin_enabled(const String &p_plugin) const;
void set_movie_maker_enabled(bool p_enabled);
bool is_movie_maker_enabled() const;
EditorInspector *get_inspector() const;
Error save_scene();
void save_scene_as(const String &p_scene, bool p_with_preview = true);
void restart_editor(bool p_save = true);
Vector<Ref<Texture2D>> make_mesh_previews(const Vector<Ref<Mesh>> &p_meshes, Vector<Transform3D> *p_transforms, int p_preview_size);
void set_main_screen_editor(const String &p_name);
void set_distraction_free_mode(bool p_enter);
bool is_distraction_free_mode_enabled() const;
EditorInterface();
};
class EditorPlugin : public Node {
GDCLASS(EditorPlugin, Node);

View File

@ -30,6 +30,7 @@
#include "editor_run_script.h"
#include "editor/editor_interface.h"
#include "editor/editor_node.h"
void EditorScript::add_root_node(Node *p_node) {

View File

@ -31,9 +31,11 @@
#ifndef EDITOR_RUN_SCRIPT_H
#define EDITOR_RUN_SCRIPT_H
#include "core/object/gdvirtual.gen.inc"
#include "core/object/ref_counted.h"
#include "editor/editor_plugin.h"
#include "core/object/script_language.h"
class EditorInterface;
class EditorNode;
class EditorScript : public RefCounted {

View File

@ -31,10 +31,11 @@
#ifndef SCENE_TREE_EDITOR_H
#define SCENE_TREE_EDITOR_H
#include "editor/editor_data.h"
#include "scene/gui/dialogs.h"
#include "scene/gui/tree.h"
class EditorSelection;
class SceneTreeEditor : public Control {
GDCLASS(SceneTreeEditor, Control);

View File

@ -40,6 +40,7 @@ class CanvasItemEditorViewport;
class ConfirmationDialog;
class EditorData;
class EditorZoomWidget;
class EditorSelection;
class HScrollBar;
class HSplitContainer;
class MenuButton;

View File

@ -45,6 +45,7 @@
#include "scene/gui/separator.h"
#include "scene/gui/texture_rect.h"
class EditorSelection;
class GridContainer;
// Inspector controls.

View File

@ -34,6 +34,7 @@
#include "core/core_string_names.h"
#include "core/input/input.h"
#include "core/os/keyboard.h"
#include "editor/editor_interface.h"
#include "editor/editor_node.h"
#include "editor/editor_scale.h"
#include "editor/editor_settings.h"
@ -780,7 +781,7 @@ CurveEditorPlugin::CurveEditorPlugin() {
curve_plugin.instantiate();
EditorInspector::add_inspector_plugin(curve_plugin);
get_editor_interface()->get_resource_previewer()->add_preview_generator(memnew(CurvePreviewGenerator));
EditorInterface::get_singleton()->get_resource_previewer()->add_preview_generator(memnew(CurvePreviewGenerator));
}
//-----------------------------------

View File

@ -30,6 +30,7 @@
#include "gpu_particles_collision_sdf_editor_plugin.h"
#include "editor/editor_interface.h"
#include "editor/editor_node.h"
#include "editor/gui/editor_file_dialog.h"
@ -193,7 +194,7 @@ GPUParticlesCollisionSDF3DEditorPlugin::GPUParticlesCollisionSDF3DEditorPlugin()
probe_file->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE);
probe_file->add_filter("*.exr");
probe_file->connect("file_selected", callable_mp(this, &GPUParticlesCollisionSDF3DEditorPlugin::_sdf_save_path_and_bake));
get_editor_interface()->get_base_control()->add_child(probe_file);
EditorInterface::get_singleton()->get_base_control()->add_child(probe_file);
probe_file->set_title(TTR("Select path for SDF Texture"));
GPUParticlesCollisionSDF3D::bake_begin_function = bake_func_begin;

View File

@ -30,6 +30,7 @@
#include "mesh_library_editor_plugin.h"
#include "editor/editor_interface.h"
#include "editor/editor_node.h"
#include "editor/editor_settings.h"
#include "editor/gui/editor_file_dialog.h"

View File

@ -44,6 +44,7 @@ class ColorPickerButton;
class ConfirmationDialog;
class DirectionalLight3D;
class EditorData;
class EditorSelection;
class EditorSpinSlider;
class HSplitContainer;
class LineEdit;

View File

@ -32,6 +32,7 @@
#include "core/config/project_settings.h"
#include "core/io/resource_loader.h"
#include "editor/editor_interface.h"
#include "editor/editor_node.h"
#include "editor/editor_scale.h"
#include "editor/editor_settings.h"

View File

@ -34,6 +34,7 @@
#include "core/os/mutex.h"
#include "editor/editor_interface.h"
#include "editor/editor_node.h"
#include "editor/editor_scale.h"
#include "editor/editor_settings.h"
@ -209,7 +210,7 @@ void TilesEditorPlugin::make_visible(bool p_visible) {
}
bool TilesEditorPlugin::is_tile_map_selected() {
TypedArray<Node> selection = get_editor_interface()->get_selection()->get_selected_nodes();
TypedArray<Node> selection = EditorInterface::get_singleton()->get_selection()->get_selected_nodes();
if (selection.size() == 1 && Object::cast_to<TileMap>(selection[0])) {
return true;
}

View File

@ -30,6 +30,7 @@
#include "voxel_gi_editor_plugin.h"
#include "editor/editor_interface.h"
#include "editor/editor_node.h"
#include "editor/gui/editor_file_dialog.h"
@ -190,7 +191,7 @@ VoxelGIEditorPlugin::VoxelGIEditorPlugin() {
probe_file->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE);
probe_file->add_filter("*.res");
probe_file->connect("file_selected", callable_mp(this, &VoxelGIEditorPlugin::_voxel_gi_save_path_and_bake));
get_editor_interface()->get_base_control()->add_child(probe_file);
EditorInterface::get_singleton()->get_base_control()->add_child(probe_file);
probe_file->set_title(TTR("Select path for VoxelGI Data File"));
VoxelGI::bake_begin_function = bake_func_begin;

View File

@ -35,6 +35,7 @@
#include "editor/editor_command_palette.h"
#include "editor/editor_feature_profile.h"
#include "editor/editor_file_system.h"
#include "editor/editor_interface.h"
#include "editor/editor_node.h"
#include "editor/editor_paths.h"
#include "editor/editor_resource_picker.h"
@ -230,10 +231,14 @@ void register_editor_types() {
GLOBAL_DEF("editor/version_control/plugin_name", "");
GLOBAL_DEF("editor/version_control/autoload_on_startup", false);
EditorInterface::create();
}
void unregister_editor_types() {
EditorNode::cleanup();
EditorInterface::free();
if (EditorPaths::get_singleton()) {
EditorPaths::free();
}

View File

@ -31,12 +31,13 @@
#ifndef SCENE_TREE_DOCK_H
#define SCENE_TREE_DOCK_H
#include "editor/editor_data.h"
#include "editor/gui/scene_tree_editor.h"
#include "editor/script_create_dialog.h"
#include "scene/gui/box_container.h"
#include "scene/resources/animation.h"
class EditorData;
class EditorSelection;
class EditorQuickOpen;
class MenuButton;
class ReparentDialog;

View File

@ -34,6 +34,7 @@
#include "editor_network_profiler.h"
#include "replication_editor.h"
#include "editor/editor_interface.h"
#include "editor/editor_node.h"
void MultiplayerEditorDebugger::_bind_methods() {
@ -119,7 +120,7 @@ MultiplayerEditorPlugin::MultiplayerEditorPlugin() {
}
void MultiplayerEditorPlugin::_open_request(const String &p_path) {
get_editor_interface()->open_scene_from_path(p_path);
EditorInterface::get_singleton()->open_scene_from_path(p_path);
}
void MultiplayerEditorPlugin::_notification(int p_what) {