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(); } });