From 1a5f29cb07d3e7fd615578d72a7e1e90a501dd3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Wed, 25 Jun 2025 13:02:30 +0200 Subject: [PATCH] Overlay: Move text cache managment to the Overlay::Instance This avoid legacy code inside the DRWContext. Note that this change the draw order w.r.t. gizmos. Now the gizmos will hide the text. Moreover, streamline the condition for enabling text drawing in order to fix #78971. --- .../draw/engines/overlay/overlay_instance.cc | 21 ++++++++++-- .../draw/engines/overlay/overlay_instance.hh | 6 ++++ source/blender/draw/intern/DRW_render.hh | 2 -- source/blender/draw/intern/draw_context.cc | 34 +------------------ .../blender/draw/intern/draw_manager_text.cc | 6 ++-- .../blender/draw/intern/draw_manager_text.hh | 2 +- source/blender/draw/intern/draw_view_data.cc | 4 --- 7 files changed, 30 insertions(+), 45 deletions(-) diff --git a/source/blender/draw/engines/overlay/overlay_instance.cc b/source/blender/draw/engines/overlay/overlay_instance.cc index 8c4191c81ab..8a2e8fa8160 100644 --- a/source/blender/draw/engines/overlay/overlay_instance.cc +++ b/source/blender/draw/engines/overlay/overlay_instance.cc @@ -44,7 +44,7 @@ void Instance::init() state.is_depth_only_drawing = ctx->is_depth(); state.is_material_select = ctx->is_material_select(); state.draw_background = ctx->options.draw_background; - state.show_text = ctx->options.draw_text; + state.show_text = false; /* Note there might be less than 6 planes, but we always compute the 6 of them for simplicity. */ state.clipping_plane_count = clipping_enabled_ ? 6 : 0; @@ -86,6 +86,8 @@ void Instance::init() state.overlay = state.v3d->overlay; state.v3d_flag = state.v3d->flag; state.v3d_gridflag = state.v3d->gridflag; + state.show_text = !resources.is_selection() && !state.is_depth_only_drawing && + (ctx->v3d->overlay.flag & V3D_OVERLAY_HIDE_TEXT) == 0; } else { memset(&state.overlay, 0, sizeof(state.overlay)); @@ -426,10 +428,12 @@ void Instance::begin_sync() { /* TODO(fclem): Against design. Should not sync depending on view. */ View &view = View::default_get(); - state.dt = DRW_text_cache_ensure(); state.camera_position = view.viewinv().location(); state.camera_forward = view.viewinv().z_axis(); + DRW_text_cache_destroy(state.dt); + state.dt = DRW_text_cache_create(); + resources.begin_sync(state.clipping_plane_count); background.begin_sync(resources, state); @@ -955,9 +959,22 @@ void Instance::draw_v3d(Manager &manager, View &view) background.draw_output(resources.overlay_output_color_only_fb, manager, view); anti_aliasing.draw_output(resources.overlay_output_color_only_fb, manager, view); cursor.draw_output(resources.overlay_output_color_only_fb, manager, view); + + draw_text(resources.overlay_output_color_only_fb); } } +void Instance::draw_text(Framebuffer &framebuffer) +{ + if (state.show_text == false) { + return; + } + GPU_framebuffer_bind(framebuffer); + + GPU_depth_test(GPU_DEPTH_NONE); + DRW_text_cache_draw(state.dt, state.region, state.v3d); +} + bool Instance::object_is_selected(const ObjectRef &ob_ref) { return (ob_ref.object->base_flag & BASE_SELECTED); diff --git a/source/blender/draw/engines/overlay/overlay_instance.hh b/source/blender/draw/engines/overlay/overlay_instance.hh index 97a275c35f8..f05a93684c6 100644 --- a/source/blender/draw/engines/overlay/overlay_instance.hh +++ b/source/blender/draw/engines/overlay/overlay_instance.hh @@ -114,6 +114,10 @@ class Instance : public DrawEngine { Instance() : selection_type_(select::SelectionType::DISABLED){}; Instance(const SelectionType selection_type) : selection_type_(selection_type){}; + ~Instance() + { + DRW_text_cache_destroy(state.dt); + } blender::StringRefNull name_get() final { @@ -151,6 +155,8 @@ class Instance : public DrawEngine { void draw_v2d(Manager &manager, View &view); void draw_v3d(Manager &manager, View &view); + void draw_text(Framebuffer &framebuffer); + void ensure_weight_ramp_texture(); }; diff --git a/source/blender/draw/intern/DRW_render.hh b/source/blender/draw/intern/DRW_render.hh index 1fe858f9cf8..1911b0b7c6b 100644 --- a/source/blender/draw/intern/DRW_render.hh +++ b/source/blender/draw/intern/DRW_render.hh @@ -70,7 +70,6 @@ struct DrawEngine { static constexpr int GPU_INFO_SIZE = 512; /* IMA_MAX_RENDER_TEXT_SIZE */ char info[GPU_INFO_SIZE] = {'\0'}; - DRWTextStore *text_draw_cache = nullptr; bool used = false; @@ -275,7 +274,6 @@ struct DRWContext { struct { bool draw_background = false; - bool draw_text = false; } options; /** Convenience pointer to text_store owned by the viewport */ diff --git a/source/blender/draw/intern/draw_context.cc b/source/blender/draw/intern/draw_context.cc index 8aaf9fa527f..0af1d166298 100644 --- a/source/blender/draw/intern/draw_context.cc +++ b/source/blender/draw/intern/draw_context.cc @@ -148,12 +148,6 @@ DRWContext::DRWContext(Mode mode_, this->object_pose = nullptr; } - /* TODO(fclem): This belongs to the overlay engine. */ - if (this->v3d != nullptr && mode == DRWContext::VIEWPORT) { - this->options.draw_text = ((this->v3d->flag2 & V3D_HIDE_OVERLAYS) == 0 && - (this->v3d->overlay.flag & V3D_OVERLAY_HIDE_TEXT) == 0); - } - /* View layer can be lazily synced. */ BKE_view_layer_synced_ensure(this->scene, this->view_layer); @@ -760,18 +754,7 @@ void DRWContext::engines_init_and_sync(iter_callback_t iter_callback) view_data_active->manager->begin_sync(this->obact); - view_data_active->foreach_enabled_engine([&](DrawEngine &instance) { - /* TODO(fclem): Remove. Only there for overlay engine. */ - if (instance.text_draw_cache) { - DRW_text_cache_destroy(instance.text_draw_cache); - instance.text_draw_cache = nullptr; - } - if (text_store_p == nullptr) { - text_store_p = &instance.text_draw_cache; - } - - instance.begin_sync(); - }); + view_data_active->foreach_enabled_engine([&](DrawEngine &instance) { instance.begin_sync(); }); sync(iter_callback); @@ -800,16 +783,6 @@ void DRWContext::engines_draw_scene() } } -static void drw_engines_draw_text() -{ - DRWContext &ctx = drw_get(); - ctx.view_data_active->foreach_enabled_engine([&](DrawEngine &instance) { - if (instance.text_draw_cache) { - DRW_text_cache_draw(instance.text_draw_cache, ctx.region, ctx.v3d); - } - }); -} - void DRW_draw_region_engine_info(int xoffset, int *yoffset, int line_height) { DRWContext &ctx = drw_get(); @@ -1029,9 +1002,6 @@ static void drw_callbacks_post_scene(DRWContext &draw_ctx) DRW_draw_gizmo_3d(draw_ctx.evil_C, region); } - GPU_depth_test(GPU_DEPTH_NONE); - drw_engines_draw_text(); - DRW_draw_region_info(draw_ctx.evil_C, region); /* Annotations - temporary drawing buffer (screen-space). */ @@ -1149,10 +1119,8 @@ static void drw_callbacks_post_scene_2D(DRWContext &draw_ctx, View2D &v2d) blender::draw::command::StateSet::set(); GPU_depth_test(GPU_DEPTH_NONE); - drw_engines_draw_text(); if (do_annotations) { - GPU_depth_test(GPU_DEPTH_NONE); ED_annotation_draw_view2d(draw_ctx.evil_C, false); } } diff --git a/source/blender/draw/intern/draw_manager_text.cc b/source/blender/draw/intern/draw_manager_text.cc index 4719ab66e9b..ab3108309b6 100644 --- a/source/blender/draw/intern/draw_manager_text.cc +++ b/source/blender/draw/intern/draw_manager_text.cc @@ -131,7 +131,7 @@ void DRW_text_cache_add(DRWTextStore *dt, } } -static void drw_text_cache_draw_ex(DRWTextStore *dt, ARegion *region) +static void drw_text_cache_draw_ex(const DRWTextStore *dt, const ARegion *region) { ViewCachedString *vos; BLI_memiter_handle it; @@ -198,7 +198,7 @@ static void drw_text_cache_draw_ex(DRWTextStore *dt, ARegion *region) GPU_matrix_projection_set(original_proj); } -void DRW_text_cache_draw(DRWTextStore *dt, ARegion *region, View3D *v3d) +void DRW_text_cache_draw(const DRWTextStore *dt, const ARegion *region, const View3D *v3d) { ViewCachedString *vos; if (v3d) { @@ -242,7 +242,7 @@ void DRW_text_cache_draw(DRWTextStore *dt, ARegion *region, View3D *v3d) /* project first */ BLI_memiter_handle it; BLI_memiter_iter_init(dt->cache_strings, &it); - View2D *v2d = ®ion->v2d; + const View2D *v2d = ®ion->v2d; float viewmat[4][4]; rctf region_space = {0.0f, float(region->winx), 0.0f, float(region->winy)}; BLI_rctf_transform_calc_m4_pivot_min(&v2d->cur, ®ion_space, viewmat); diff --git a/source/blender/draw/intern/draw_manager_text.hh b/source/blender/draw/intern/draw_manager_text.hh index 73838b82cbe..c1ae8b7bd92 100644 --- a/source/blender/draw/intern/draw_manager_text.hh +++ b/source/blender/draw/intern/draw_manager_text.hh @@ -33,7 +33,7 @@ void DRW_text_cache_add(DRWTextStore *dt, const bool shadow = false, const bool align_center = false); -void DRW_text_cache_draw(DRWTextStore *dt, ARegion *region, View3D *v3d); +void DRW_text_cache_draw(const DRWTextStore *dt, const ARegion *region, const View3D *v3d); void DRW_text_edit_mesh_measure_stats(const ARegion *region, const View3D *v3d, diff --git a/source/blender/draw/intern/draw_view_data.cc b/source/blender/draw/intern/draw_view_data.cc index 291685e5904..c49c61ce4c4 100644 --- a/source/blender/draw/intern/draw_view_data.cc +++ b/source/blender/draw/intern/draw_view_data.cc @@ -94,8 +94,6 @@ void DRWViewData::clear(bool free_instance_data) if (free_instance_data) { foreach_engine([&](DrawEngine::Pointer &ptr) { if (ptr.instance) { - /* TODO Move where it belongs. */ - DRW_text_cache_destroy(ptr.instance->text_draw_cache); ptr.free_instance(); } }); @@ -126,8 +124,6 @@ void DRW_view_data_free_unused(DRWViewData *view_data) { view_data->foreach_engine([&](DrawEngine::Pointer &ptr) { if (ptr.instance && ptr.instance->used == false) { - /* TODO Move where it belongs. */ - DRW_text_cache_destroy(ptr.instance->text_draw_cache); ptr.free_instance(); } });