diff options
author | BlueCube3310 <53150244+BlueCube3310@users.noreply.github.com> | 2024-05-30 13:53:26 +0200 |
---|---|---|
committer | BlueCube3310 <53150244+BlueCube3310@users.noreply.github.com> | 2024-08-16 18:20:55 +0200 |
commit | e0f30d30e2cf7cfba460756a788b4bcf5b9feb54 (patch) | |
tree | dcdcc6ffeea5669f6776230af3eba848c79d7a0e /editor/plugins/texture_3d_editor_plugin.cpp | |
parent | 96be44c0ec4bafcb08d78be1a584b751b424db9f (diff) | |
download | redot-engine-e0f30d30e2cf7cfba460756a788b4bcf5b9feb54.tar.gz |
Improve layered texture preview
Diffstat (limited to 'editor/plugins/texture_3d_editor_plugin.cpp')
-rw-r--r-- | editor/plugins/texture_3d_editor_plugin.cpp | 127 |
1 files changed, 93 insertions, 34 deletions
diff --git a/editor/plugins/texture_3d_editor_plugin.cpp b/editor/plugins/texture_3d_editor_plugin.cpp index fa90e982fe..9fce79622a 100644 --- a/editor/plugins/texture_3d_editor_plugin.cpp +++ b/editor/plugins/texture_3d_editor_plugin.cpp @@ -30,8 +30,25 @@ #include "texture_3d_editor_plugin.h" +#include "editor/editor_string_names.h" +#include "editor/themes/editor_scale.h" #include "scene/gui/label.h" +// Shader sources. + +constexpr const char *texture_3d_shader = R"( + // Texture3DEditor preview shader. + + shader_type canvas_item; + + uniform sampler3D tex; + uniform float layer; + + void fragment() { + COLOR = textureLod(tex, vec3(UV, layer), 0.0); + } +)"; + void Texture3DEditor::_texture_rect_draw() { texture_rect->draw_rect(Rect2(Point2(), texture_rect->get_size()), Color(1, 1, 1, 1)); } @@ -48,6 +65,13 @@ void Texture3DEditor::_notification(int p_what) { draw_texture_rect(checkerboard, Rect2(Point2(), size), true); } break; + + case NOTIFICATION_THEME_CHANGED: { + if (info) { + Ref<Font> metadata_label_font = get_theme_font(SNAME("expression"), EditorStringName(EditorFonts)); + info->add_theme_font_override(SceneStringName(font), metadata_label_font); + } + } break; } } @@ -55,35 +79,27 @@ void Texture3DEditor::_texture_changed() { if (!is_visible()) { return; } + + setting = true; + _update_gui(); + setting = false; + + _update_material(true); queue_redraw(); } -void Texture3DEditor::_update_material() { +void Texture3DEditor::_update_material(bool p_texture_changed) { material->set_shader_parameter("layer", (layer->get_value() + 0.5) / texture->get_depth()); - material->set_shader_parameter("tex", texture->get_rid()); - - String format = Image::get_format_name(texture->get_format()); - - String text; - text = itos(texture->get_width()) + "x" + itos(texture->get_height()) + "x" + itos(texture->get_depth()) + " " + format; - info->set_text(text); + if (p_texture_changed) { + material->set_shader_parameter("tex", texture->get_rid()); + } } void Texture3DEditor::_make_shaders() { shader.instantiate(); - shader->set_code(R"( -// Texture3DEditor preview shader. - -shader_type canvas_item; - -uniform sampler3D tex; -uniform float layer; + shader->set_code(texture_3d_shader); -void fragment() { - COLOR = textureLod(tex, vec3(UV, layer), 0.0); -} -)"); material.instantiate(); material->set_shader(shader); } @@ -113,6 +129,41 @@ void Texture3DEditor::_texture_rect_update_area() { texture_rect->set_size(Vector2(tex_width, tex_height)); } +void Texture3DEditor::_update_gui() { + if (texture.is_null()) { + return; + } + + _texture_rect_update_area(); + + layer->set_max(texture->get_depth() - 1); + + const String format = Image::get_format_name(texture->get_format()); + + if (texture->has_mipmaps()) { + const int mip_count = Image::get_image_required_mipmaps(texture->get_width(), texture->get_height(), texture->get_format()); + const int memory = Image::get_image_data_size(texture->get_width(), texture->get_height(), texture->get_format(), true) * texture->get_depth(); + + info->set_text(vformat(String::utf8("%d×%d×%d %s\n") + TTR("%s Mipmaps") + "\n" + TTR("Memory: %s"), + texture->get_width(), + texture->get_height(), + texture->get_depth(), + format, + mip_count, + String::humanize_size(memory))); + + } else { + const int memory = Image::get_image_data_size(texture->get_width(), texture->get_height(), texture->get_format(), false) * texture->get_depth(); + + info->set_text(vformat(String::utf8("%d×%d×%d %s\n") + TTR("No Mipmaps") + "\n" + TTR("Memory: %s"), + texture->get_width(), + texture->get_height(), + texture->get_depth(), + format, + String::humanize_size(memory))); + } +} + void Texture3DEditor::edit(Ref<Texture3D> p_texture) { if (!texture.is_null()) { texture->disconnect_changed(callable_mp(this, &Texture3DEditor::_texture_changed)); @@ -126,15 +177,17 @@ void Texture3DEditor::edit(Ref<Texture3D> p_texture) { } texture->connect_changed(callable_mp(this, &Texture3DEditor::_texture_changed)); - queue_redraw(); texture_rect->set_material(material); + setting = true; - layer->set_max(texture->get_depth() - 1); layer->set_value(0); layer->show(); - _update_material(); + _update_gui(); setting = false; - _texture_rect_update_area(); + + _update_material(true); + queue_redraw(); + } else { hide(); } @@ -142,36 +195,43 @@ void Texture3DEditor::edit(Ref<Texture3D> p_texture) { Texture3DEditor::Texture3DEditor() { set_texture_repeat(TextureRepeat::TEXTURE_REPEAT_ENABLED); - set_custom_minimum_size(Size2(1, 150)); + set_custom_minimum_size(Size2(1, 256.0) * EDSCALE); texture_rect = memnew(Control); texture_rect->set_mouse_filter(MOUSE_FILTER_IGNORE); - add_child(texture_rect); texture_rect->connect(SceneStringName(draw), callable_mp(this, &Texture3DEditor::_texture_rect_draw)); + add_child(texture_rect); + layer = memnew(SpinBox); layer->set_step(1); layer->set_max(100); - layer->set_h_grow_direction(GROW_DIRECTION_BEGIN); + layer->set_modulate(Color(1, 1, 1, 0.8)); - add_child(layer); + layer->set_h_grow_direction(GROW_DIRECTION_BEGIN); layer->set_anchor(SIDE_RIGHT, 1); layer->set_anchor(SIDE_LEFT, 1); layer->connect(SceneStringName(value_changed), callable_mp(this, &Texture3DEditor::_layer_changed)); + add_child(layer); + info = memnew(Label); + info->add_theme_color_override(SceneStringName(font_color), Color(1, 1, 1)); + info->add_theme_color_override("font_shadow_color", Color(0, 0, 0)); + info->add_theme_font_size_override(SceneStringName(font_size), 14 * EDSCALE); + info->add_theme_color_override("font_outline_color", Color(0, 0, 0)); + info->add_theme_constant_override("outline_size", 8 * EDSCALE); + info->set_h_grow_direction(GROW_DIRECTION_BEGIN); info->set_v_grow_direction(GROW_DIRECTION_BEGIN); - info->add_theme_color_override(SceneStringName(font_color), Color(1, 1, 1, 1)); - info->add_theme_color_override("font_shadow_color", Color(0, 0, 0, 0.5)); - info->add_theme_constant_override("shadow_outline_size", 1); - info->add_theme_constant_override("shadow_offset_x", 2); - info->add_theme_constant_override("shadow_offset_y", 2); - add_child(info); + info->set_h_size_flags(Control::SIZE_SHRINK_END); + info->set_v_size_flags(Control::SIZE_SHRINK_END); info->set_anchor(SIDE_RIGHT, 1); info->set_anchor(SIDE_LEFT, 1); info->set_anchor(SIDE_BOTTOM, 1); info->set_anchor(SIDE_TOP, 1); + + add_child(info); } Texture3DEditor::~Texture3DEditor() { @@ -180,7 +240,6 @@ Texture3DEditor::~Texture3DEditor() { } } -// bool EditorInspectorPlugin3DTexture::can_handle(Object *p_object) { return Object::cast_to<Texture3D>(p_object) != nullptr; } |