Skip to content

Commit f202a3d

Browse files
committed
Add a material preview to visual shader editor
1 parent 1bd740d commit f202a3d

6 files changed

+491
-91
lines changed

editor/plugins/material_editor_plugin.cpp

+31-2
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include "core/config/project_settings.h"
3434
#include "editor/editor_node.h"
3535
#include "editor/editor_settings.h"
36+
#include "editor/editor_string_names.h"
3637
#include "editor/editor_undo_redo_manager.h"
3738
#include "editor/themes/editor_scale.h"
3839
#include "scene/3d/camera_3d.h"
@@ -41,6 +42,7 @@
4142
#include "scene/gui/box_container.h"
4243
#include "scene/gui/button.h"
4344
#include "scene/gui/color_rect.h"
45+
#include "scene/gui/label.h"
4446
#include "scene/gui/subviewport_container.h"
4547
#include "scene/main/viewport.h"
4648
#include "scene/resources/3d/fog_material.h"
@@ -80,11 +82,15 @@ void MaterialEditor::_notification(int p_what) {
8082

8183
sphere_switch->set_icon(theme_cache.sphere_icon);
8284
box_switch->set_icon(theme_cache.box_icon);
85+
86+
error_label->add_theme_color_override(SceneStringName(font_color), get_theme_color(SNAME("error_color"), EditorStringName(Editor)));
8387
} break;
8488

8589
case NOTIFICATION_DRAW: {
86-
Size2 size = get_size();
87-
draw_texture_rect(theme_cache.checkerboard, Rect2(Point2(), size), true);
90+
if (!is_unsupported_shader_mode) {
91+
Size2 size = get_size();
92+
draw_texture_rect(theme_cache.checkerboard, Rect2(Point2(), size), true);
93+
}
8894
} break;
8995
}
9096
}
@@ -99,23 +105,32 @@ void MaterialEditor::_update_rotation() {
99105
void MaterialEditor::edit(Ref<Material> p_material, const Ref<Environment> &p_env) {
100106
material = p_material;
101107
camera->set_environment(p_env);
108+
109+
is_unsupported_shader_mode = false;
102110
if (!material.is_null()) {
103111
Shader::Mode mode = p_material->get_shader_mode();
104112
switch (mode) {
105113
case Shader::MODE_CANVAS_ITEM:
114+
layout_error->hide();
106115
layout_3d->hide();
107116
layout_2d->show();
108117
vc->hide();
109118
rect_instance->set_material(material);
110119
break;
111120
case Shader::MODE_SPATIAL:
121+
layout_error->hide();
112122
layout_2d->hide();
113123
layout_3d->show();
114124
vc->show();
115125
sphere_instance->set_material_override(material);
116126
box_instance->set_material_override(material);
117127
break;
118128
default:
129+
layout_error->show();
130+
layout_2d->hide();
131+
layout_3d->hide();
132+
vc->hide();
133+
is_unsupported_shader_mode = true;
119134
break;
120135
}
121136
} else {
@@ -175,6 +190,20 @@ MaterialEditor::MaterialEditor() {
175190

176191
layout_2d->set_visible(false);
177192

193+
layout_error = memnew(VBoxContainer);
194+
layout_error->set_alignment(BoxContainer::ALIGNMENT_CENTER);
195+
layout_error->set_anchors_and_offsets_preset(PRESET_FULL_RECT);
196+
197+
error_label = memnew(Label);
198+
error_label->set_text(TTR("Preview is not available for this shader mode."));
199+
error_label->set_horizontal_alignment(HORIZONTAL_ALIGNMENT_CENTER);
200+
error_label->set_vertical_alignment(VERTICAL_ALIGNMENT_CENTER);
201+
error_label->set_autowrap_mode(TextServer::AUTOWRAP_WORD_SMART);
202+
203+
layout_error->add_child(error_label);
204+
layout_error->hide();
205+
add_child(layout_error);
206+
178207
// Spatial
179208

180209
vc = memnew(SubViewportContainer);

editor/plugins/material_editor_plugin.h

+5
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ class MeshInstance3D;
4545
class SubViewport;
4646
class SubViewportContainer;
4747
class Button;
48+
class Label;
4849

4950
class MaterialEditor : public Control {
5051
GDCLASS(MaterialEditor, Control);
@@ -69,6 +70,10 @@ class MaterialEditor : public Control {
6970
Ref<SphereMesh> sphere_mesh;
7071
Ref<BoxMesh> box_mesh;
7172

73+
VBoxContainer *layout_error = nullptr;
74+
Label *error_label = nullptr;
75+
bool is_unsupported_shader_mode = false;
76+
7277
HBoxContainer *layout_3d = nullptr;
7378

7479
Ref<Material> material;

0 commit comments

Comments
 (0)