1
0
mirror of https://github.com/godotengine/godot.git synced 2025-12-02 16:48:55 +00:00

Separate visual shader code out of shader editor plugin and dialog

This commit is contained in:
Aaron Franke
2025-08-26 15:46:32 -07:00
parent 8deb221829
commit d6d60845fe
12 changed files with 532 additions and 208 deletions

View File

@@ -40,7 +40,8 @@
#include "editor/settings/editor_command_palette.h"
#include "editor/shader/shader_create_dialog.h"
#include "editor/shader/text_shader_editor.h"
#include "editor/shader/visual_shader_editor_plugin.h"
#include "editor/shader/text_shader_language_plugin.h"
#include "editor/shader/visual_shader_language_plugin.h"
#include "editor/themes/editor_scale.h"
#include "scene/gui/item_list.h"
#include "scene/gui/tab_container.h"
@@ -151,8 +152,12 @@ void ShaderEditorPlugin::edit(Object *p_object) {
}
}
es.shader_inc = Ref<ShaderInclude>(shader_include);
es.shader_editor = memnew(TextShaderEditor);
es.shader_editor->edit_shader_include(shader_include);
for (Ref<EditorShaderLanguagePlugin> shader_lang : EditorShaderLanguagePlugin::get_shader_languages_read_only()) {
if (shader_lang->handles_shader_include(es.shader_inc)) {
es.shader_editor = shader_lang->edit_shader_include(es.shader_inc);
break;
}
}
} else {
// If it's not a ShaderInclude, check for Shader.
Shader *shader = Object::cast_to<Shader>(p_object);
@@ -168,15 +173,15 @@ void ShaderEditorPlugin::edit(Object *p_object) {
}
// If we did not return, the shader needs to be opened in a new shader editor.
es.shader = Ref<Shader>(shader);
Ref<VisualShader> vs = es.shader;
if (vs.is_valid()) {
es.shader_editor = memnew(VisualShaderEditor);
} else {
es.shader_editor = memnew(TextShaderEditor);
for (Ref<EditorShaderLanguagePlugin> shader_lang : EditorShaderLanguagePlugin::get_shader_languages_read_only()) {
if (shader_lang->handles_shader(es.shader)) {
es.shader_editor = shader_lang->edit_shader(es.shader);
break;
}
}
es.shader_editor->edit_shader(es.shader);
}
ERR_FAIL_NULL_MSG(es.shader_editor, "ShaderEditorPlugin: Unable to edit shader because no suitable editor was found.");
// TextShaderEditor-specific setup code.
TextShaderEditor *text_shader_editor = Object::cast_to<TextShaderEditor>(es.shader_editor);
if (text_shader_editor) {
@@ -511,12 +516,12 @@ void ShaderEditorPlugin::_menu_item_pressed(int p_index) {
switch (p_index) {
case FILE_MENU_NEW: {
String base_path = FileSystemDock::get_singleton()->get_current_path().get_base_dir();
shader_create_dialog->config(base_path.path_join("new_shader"), false, false, 0);
shader_create_dialog->config(base_path.path_join("new_shader"), false, false, "Shader");
shader_create_dialog->popup_centered();
} break;
case FILE_MENU_NEW_INCLUDE: {
String base_path = FileSystemDock::get_singleton()->get_current_path().get_base_dir();
shader_create_dialog->config(base_path.path_join("new_shader"), false, false, 2);
shader_create_dialog->config(base_path.path_join("new_shader"), false, false, "ShaderInclude");
shader_create_dialog->popup_centered();
} break;
case FILE_MENU_OPEN: {
@@ -927,9 +932,18 @@ ShaderEditorPlugin::ShaderEditorPlugin() {
files_split->add_child(shader_create_dialog);
shader_create_dialog->connect("shader_created", callable_mp(this, &ShaderEditorPlugin::_shader_created));
shader_create_dialog->connect("shader_include_created", callable_mp(this, &ShaderEditorPlugin::_shader_include_created));
Ref<TextShaderLanguagePlugin> text_shader_lang;
text_shader_lang.instantiate();
EditorShaderLanguagePlugin::register_shader_language(text_shader_lang);
Ref<VisualShaderLanguagePlugin> visual_shader_lang;
visual_shader_lang.instantiate();
EditorShaderLanguagePlugin::register_shader_language(visual_shader_lang);
}
ShaderEditorPlugin::~ShaderEditorPlugin() {
EditorShaderLanguagePlugin::clear_registered_shader_languages();
memdelete(file_menu);
memdelete(make_floating);
}