diff --git a/source/blender/draw/engines/overlay/overlay_next_instance.cc b/source/blender/draw/engines/overlay/overlay_next_instance.cc index c1062c12d56..16a540b4eee 100644 --- a/source/blender/draw/engines/overlay/overlay_next_instance.cc +++ b/source/blender/draw/engines/overlay/overlay_next_instance.cc @@ -564,7 +564,8 @@ void Instance::draw_v3d(Manager &manager, View &view) origins.draw_color_only(resources.overlay_color_only_fb, manager, view); } - { + + if (state.is_depth_only_drawing == false) { /* Output pass. */ GPU_framebuffer_bind(resources.overlay_output_fb); GPU_framebuffer_clear_color(resources.overlay_output_fb, clear_color); diff --git a/source/blender/editors/curve/editcurve_paint.cc b/source/blender/editors/curve/editcurve_paint.cc index 3a32bf2d915..865377ecd3b 100644 --- a/source/blender/editors/curve/editcurve_paint.cc +++ b/source/blender/editors/curve/editcurve_paint.cc @@ -1108,13 +1108,18 @@ static int curve_draw_invoke(bContext *C, wmOperator *op, const wmEvent *event) /* needed or else the draw matrix can be incorrect */ view3d_operator_needs_opengl(C); - eV3DDepthOverrideMode depth_mode = V3D_DEPTH_NO_OVERLAYS; + eV3DDepthOverrideMode depth_mode = V3D_DEPTH_ALL; if (cps->flag & CURVE_PAINT_FLAG_DEPTH_ONLY_SELECTED) { depth_mode = V3D_DEPTH_SELECTED_ONLY; } - ED_view3d_depth_override( - cdd->vc.depsgraph, cdd->vc.region, cdd->vc.v3d, nullptr, depth_mode, &cdd->depths); + ED_view3d_depth_override(cdd->vc.depsgraph, + cdd->vc.region, + cdd->vc.v3d, + nullptr, + depth_mode, + false, + &cdd->depths); if (cdd->depths != nullptr) { cdd->project.use_depth = true; diff --git a/source/blender/editors/curves/intern/curves_draw.cc b/source/blender/editors/curves/intern/curves_draw.cc index c5e36fd42c2..a6cae803823 100644 --- a/source/blender/editors/curves/intern/curves_draw.cc +++ b/source/blender/editors/curves/intern/curves_draw.cc @@ -1091,13 +1091,18 @@ static int curves_draw_invoke(bContext *C, wmOperator *op, const wmEvent *event) /* needed or else the draw matrix can be incorrect */ view3d_operator_needs_opengl(C); - eV3DDepthOverrideMode depth_mode = V3D_DEPTH_NO_OVERLAYS; + eV3DDepthOverrideMode depth_mode = V3D_DEPTH_ALL; if (cps->flag & CURVE_PAINT_FLAG_DEPTH_ONLY_SELECTED) { depth_mode = V3D_DEPTH_SELECTED_ONLY; } - ED_view3d_depth_override( - cdd->vc.depsgraph, cdd->vc.region, cdd->vc.v3d, nullptr, depth_mode, &cdd->depths); + ED_view3d_depth_override(cdd->vc.depsgraph, + cdd->vc.region, + cdd->vc.v3d, + nullptr, + depth_mode, + false, + &cdd->depths); if (cdd->depths != nullptr) { cdd->project.use_depth = true; diff --git a/source/blender/editors/gpencil_legacy/annotate_paint.cc b/source/blender/editors/gpencil_legacy/annotate_paint.cc index 85dc98d136d..763ea3de54b 100644 --- a/source/blender/editors/gpencil_legacy/annotate_paint.cc +++ b/source/blender/editors/gpencil_legacy/annotate_paint.cc @@ -658,12 +658,12 @@ static short annotation_stroke_addpoint(tGPsdata *p, mode = V3D_DEPTH_SELECTED_ONLY; } else { - mode = V3D_DEPTH_NO_OVERLAYS; + mode = V3D_DEPTH_ALL; } } view3d_region_operator_needs_opengl(p->win, p->region); - ED_view3d_depth_override(p->depsgraph, p->region, v3d, nullptr, mode, nullptr); + ED_view3d_depth_override(p->depsgraph, p->region, v3d, nullptr, mode, false, nullptr); } /* convert screen-coordinates to appropriate coordinates (and store them) */ @@ -1226,7 +1226,7 @@ static void annotation_stroke_doeraser(tGPsdata *p) View3D *v3d = static_cast(p->area->spacedata.first); view3d_region_operator_needs_opengl(p->win, p->region); ED_view3d_depth_override( - p->depsgraph, p->region, v3d, nullptr, V3D_DEPTH_NO_GPENCIL, &p->depths); + p->depsgraph, p->region, v3d, nullptr, V3D_DEPTH_NO_GPENCIL, false, &p->depths); } } @@ -1690,13 +1690,13 @@ static void annotation_paint_strokeend(tGPsdata *p) mode = V3D_DEPTH_SELECTED_ONLY; } else { - mode = V3D_DEPTH_NO_OVERLAYS; + mode = V3D_DEPTH_ALL; } } /* need to restore the original projection settings before packing up */ view3d_region_operator_needs_opengl(p->win, p->region); ED_view3d_depth_override( - p->depsgraph, p->region, v3d, nullptr, mode, is_eraser ? nullptr : &p->depths); + p->depsgraph, p->region, v3d, nullptr, mode, false, is_eraser ? nullptr : &p->depths); } /* check if doing eraser or not */ diff --git a/source/blender/editors/grease_pencil/intern/grease_pencil_edit.cc b/source/blender/editors/grease_pencil/intern/grease_pencil_edit.cc index 9a91cd26eae..23a55db120c 100644 --- a/source/blender/editors/grease_pencil/intern/grease_pencil_edit.cc +++ b/source/blender/editors/grease_pencil/intern/grease_pencil_edit.cc @@ -2835,7 +2835,8 @@ static int grease_pencil_reproject_exec(bContext *C, wmOperator *op) ViewDepths *view_depths = nullptr; if (mode == ReprojectMode::Surface) { - ED_view3d_depth_override(depsgraph, region, v3d, nullptr, V3D_DEPTH_NO_GPENCIL, &view_depths); + ED_view3d_depth_override( + depsgraph, region, v3d, nullptr, V3D_DEPTH_NO_GPENCIL, false, &view_depths); } const bke::AttrDomain selection_domain = ED_grease_pencil_edit_selection_domain_get( diff --git a/source/blender/editors/grease_pencil/intern/grease_pencil_utils.cc b/source/blender/editors/grease_pencil/intern/grease_pencil_utils.cc index 9ce8b201667..28b3c918994 100644 --- a/source/blender/editors/grease_pencil/intern/grease_pencil_utils.cc +++ b/source/blender/editors/grease_pencil/intern/grease_pencil_utils.cc @@ -288,7 +288,7 @@ void DrawingPlacement::cache_viewport_depths(Depsgraph *depsgraph, ARegion *regi mode = V3D_DEPTH_NO_GPENCIL; } } - ED_view3d_depth_override(depsgraph, region, view3d, nullptr, mode, &this->depth_cache_); + ED_view3d_depth_override(depsgraph, region, view3d, nullptr, mode, false, &this->depth_cache_); } void DrawingPlacement::set_origin_to_nearest_stroke(const float2 co) diff --git a/source/blender/editors/include/ED_view3d.hh b/source/blender/editors/include/ED_view3d.hh index 39c7ed0d00e..59a9a779fc1 100644 --- a/source/blender/editors/include/ED_view3d.hh +++ b/source/blender/editors/include/ED_view3d.hh @@ -182,8 +182,8 @@ void ED_view3d_lastview_store(RegionView3D *rv3d); /* Depth buffer */ enum eV3DDepthOverrideMode { - /** Redraw viewport without overlays. */ - V3D_DEPTH_NO_OVERLAYS = 0, + /** Redraw viewport with all objects. */ + V3D_DEPTH_ALL = 0, /** Redraw viewport without Grease Pencil. */ V3D_DEPTH_NO_GPENCIL, /** Redraw viewport with Grease Pencil only. */ @@ -198,12 +198,21 @@ enum eV3DDepthOverrideMode { * Redraw the viewport depth buffer. * Call #ED_view3d_has_depth_buffer_updated if you want to check if the viewport already has depth * buffer updated. + * + * \param use_overlay: When enabled and the `v3d` has overlays enabled, show overlays. + * A rule of thumb for this value is: + * - For viewport navigation the value should be true. + * Since the user may want to inspect non-geometry contents of their scene. + * - For painting and other tools, the value should be false. + * Since it's not typically desirable to paint onto the cameras frame or spot-light, + * nor use these depths for object placement. */ void ED_view3d_depth_override(Depsgraph *depsgraph, ARegion *region, View3D *v3d, Object *obact, eV3DDepthOverrideMode mode, + bool use_overlay, ViewDepths **r_depths); void ED_view3d_depths_free(ViewDepths *depths); bool ED_view3d_depth_read_cached(const ViewDepths *vd, diff --git a/source/blender/editors/interface/eyedroppers/eyedropper_depth.cc b/source/blender/editors/interface/eyedroppers/eyedropper_depth.cc index 8fb591552cd..3e430eb1289 100644 --- a/source/blender/editors/interface/eyedroppers/eyedropper_depth.cc +++ b/source/blender/editors/interface/eyedroppers/eyedropper_depth.cc @@ -268,7 +268,8 @@ static void depthdropper_depth_sample_pt(bContext *C, view3d_operator_needs_opengl(C); /* Ensure the depth buffer is updated for #ED_view3d_autodist. */ - ED_view3d_depth_override(depsgraph, region, v3d, nullptr, V3D_DEPTH_NO_GPENCIL, nullptr); + ED_view3d_depth_override( + depsgraph, region, v3d, nullptr, V3D_DEPTH_NO_GPENCIL, false, nullptr); if (ED_view3d_autodist(region, v3d, mval, co, nullptr)) { const float mval_center_fl[2] = {float(region->winx) / 2, float(region->winy) / 2}; diff --git a/source/blender/editors/object/object_transform.cc b/source/blender/editors/object/object_transform.cc index bcbaddc5714..06c680a6051 100644 --- a/source/blender/editors/object/object_transform.cc +++ b/source/blender/editors/object/object_transform.cc @@ -2089,7 +2089,7 @@ static int object_transform_axis_target_invoke(bContext *C, wmOperator *op, cons ViewDepths *depths = nullptr; ED_view3d_depth_override( - vc.depsgraph, vc.region, vc.v3d, nullptr, V3D_DEPTH_NO_GPENCIL, &depths); + vc.depsgraph, vc.region, vc.v3d, nullptr, V3D_DEPTH_NO_GPENCIL, false, &depths); #ifdef USE_RENDER_OVERRIDE vc.v3d->flag2 = flag2_prev; diff --git a/source/blender/editors/physics/particle_edit.cc b/source/blender/editors/physics/particle_edit.cc index 7cdbab815be..5c13e2493c3 100644 --- a/source/blender/editors/physics/particle_edit.cc +++ b/source/blender/editors/physics/particle_edit.cc @@ -524,6 +524,7 @@ static void PE_set_view3d_data(bContext *C, PEData *data) data->vc.v3d, data->vc.obact, V3D_DEPTH_OBJECT_ONLY, + false, &data->depths); } } diff --git a/source/blender/editors/sculpt_paint/paint_image_proj.cc b/source/blender/editors/sculpt_paint/paint_image_proj.cc index a3ce8c8ec77..0d22a0df658 100644 --- a/source/blender/editors/sculpt_paint/paint_image_proj.cc +++ b/source/blender/editors/sculpt_paint/paint_image_proj.cc @@ -5813,7 +5813,8 @@ void paint_proj_stroke(const bContext *C, view3d_operator_needs_opengl(C); /* Ensure the depth buffer is updated for #ED_view3d_autodist. */ - ED_view3d_depth_override(depsgraph, region, v3d, nullptr, V3D_DEPTH_NO_GPENCIL, nullptr); + ED_view3d_depth_override( + depsgraph, region, v3d, nullptr, V3D_DEPTH_NO_GPENCIL, false, nullptr); if (!ED_view3d_autodist(region, v3d, mval_i, cursor, nullptr)) { return; diff --git a/source/blender/editors/space_view3d/view3d_draw.cc b/source/blender/editors/space_view3d/view3d_draw.cc index 10850f5ff0e..79a9ebddeae 100644 --- a/source/blender/editors/space_view3d/view3d_draw.cc +++ b/source/blender/editors/space_view3d/view3d_draw.cc @@ -2378,6 +2378,7 @@ void ED_view3d_depth_override(Depsgraph *depsgraph, View3D *v3d, Object *obact, eV3DDepthOverrideMode mode, + bool use_overlay, ViewDepths **r_depths) { if (v3d->runtime.flag & V3D_RUNTIME_DEPTHBUF_OVERRIDDEN) { @@ -2395,6 +2396,10 @@ void ED_view3d_depth_override(Depsgraph *depsgraph, /* Setting these temporarily is not nice */ v3d->flag &= ~V3D_SELECT_OUTLINE; + if (v3d->flag2 & V3D_HIDE_OVERLAYS) { + use_overlay = false; + } + /* Tools may request depth outside of regular drawing code. */ UI_Theme_Store(&theme_state); UI_SetTheme(SPACE_VIEW3D, RGN_TYPE_WINDOW); @@ -2421,21 +2426,21 @@ void ED_view3d_depth_override(Depsgraph *depsgraph, * yet available. */ if (viewport != nullptr) { switch (mode) { - case V3D_DEPTH_NO_OVERLAYS: - DRW_draw_depth_loop(depsgraph, region, v3d, viewport, true, true, false, false); + case V3D_DEPTH_ALL: + DRW_draw_depth_loop(depsgraph, region, v3d, viewport, true, true, use_overlay, false); break; case V3D_DEPTH_NO_GPENCIL: - DRW_draw_depth_loop(depsgraph, region, v3d, viewport, false, true, false, false); + DRW_draw_depth_loop(depsgraph, region, v3d, viewport, false, true, use_overlay, false); break; case V3D_DEPTH_GPENCIL_ONLY: - DRW_draw_depth_loop(depsgraph, region, v3d, viewport, true, false, false, false); + DRW_draw_depth_loop(depsgraph, region, v3d, viewport, true, false, use_overlay, false); break; case V3D_DEPTH_OBJECT_ONLY: DRW_draw_depth_object( scene, region, v3d, viewport, DEG_get_evaluated_object(depsgraph, obact)); break; case V3D_DEPTH_SELECTED_ONLY: - DRW_draw_depth_loop(depsgraph, region, v3d, viewport, false, true, false, true); + DRW_draw_depth_loop(depsgraph, region, v3d, viewport, false, true, use_overlay, true); break; } diff --git a/source/blender/editors/space_view3d/view3d_edit.cc b/source/blender/editors/space_view3d/view3d_edit.cc index 48e4324e5f7..807e6ad7425 100644 --- a/source/blender/editors/space_view3d/view3d_edit.cc +++ b/source/blender/editors/space_view3d/view3d_edit.cc @@ -854,7 +854,7 @@ void ED_view3d_cursor3d_position(bContext *C, view3d_operator_needs_opengl(C); /* Ensure the depth buffer is updated for #ED_view3d_autodist. */ - ED_view3d_depth_override(depsgraph, region, v3d, nullptr, V3D_DEPTH_NO_OVERLAYS, nullptr); + ED_view3d_depth_override(depsgraph, region, v3d, nullptr, V3D_DEPTH_ALL, false, nullptr); if (ED_view3d_autodist(region, v3d, mval, r_cursor_co, nullptr)) { depth_used = true; diff --git a/source/blender/editors/space_view3d/view3d_navigate.cc b/source/blender/editors/space_view3d/view3d_navigate.cc index aa0a7662950..4bba2d970e1 100644 --- a/source/blender/editors/space_view3d/view3d_navigate.cc +++ b/source/blender/editors/space_view3d/view3d_navigate.cc @@ -207,7 +207,8 @@ static eViewOpsFlag navigate_pivot_get(bContext *C, negate_v3_v3(fallback_depth_pt, static_cast(region->regiondata)->ofs); if (!ED_view3d_has_depth_buffer_updated(depsgraph, v3d)) { - ED_view3d_depth_override(depsgraph, region, v3d, nullptr, V3D_DEPTH_NO_GPENCIL, nullptr); + ED_view3d_depth_override( + depsgraph, region, v3d, nullptr, V3D_DEPTH_NO_GPENCIL, true, nullptr); } const bool is_set = ED_view3d_autodist(region, v3d, event->mval, r_pivot, fallback_depth_pt); diff --git a/source/blender/editors/space_view3d/view3d_navigate_view_center_pick.cc b/source/blender/editors/space_view3d/view3d_navigate_view_center_pick.cc index 2c813e7df9c..dae6e74ea05 100644 --- a/source/blender/editors/space_view3d/view3d_navigate_view_center_pick.cc +++ b/source/blender/editors/space_view3d/view3d_navigate_view_center_pick.cc @@ -38,7 +38,7 @@ static int viewcenter_pick_invoke(bContext *C, wmOperator *op, const wmEvent *ev view3d_operator_needs_opengl(C); /* Ensure the depth buffer is updated for #ED_view3d_autodist. */ - ED_view3d_depth_override(depsgraph, region, v3d, nullptr, V3D_DEPTH_NO_GPENCIL, nullptr); + ED_view3d_depth_override(depsgraph, region, v3d, nullptr, V3D_DEPTH_NO_GPENCIL, true, nullptr); if (ED_view3d_autodist(region, v3d, event->mval, new_ofs, nullptr)) { /* pass */ diff --git a/source/blender/editors/space_view3d/view3d_navigate_zoom_border.cc b/source/blender/editors/space_view3d/view3d_navigate_zoom_border.cc index e61b31868a1..f0cd126aaa1 100644 --- a/source/blender/editors/space_view3d/view3d_navigate_zoom_border.cc +++ b/source/blender/editors/space_view3d/view3d_navigate_zoom_border.cc @@ -58,8 +58,13 @@ static int view3d_zoom_border_exec(bContext *C, wmOperator *op) ED_view3d_dist_range_get(v3d, dist_range); - ED_view3d_depth_override( - CTX_data_ensure_evaluated_depsgraph(C), region, v3d, nullptr, V3D_DEPTH_NO_GPENCIL, nullptr); + ED_view3d_depth_override(CTX_data_ensure_evaluated_depsgraph(C), + region, + v3d, + nullptr, + V3D_DEPTH_NO_GPENCIL, + true, + nullptr); { /* avoid allocating the whole depth buffer */ ViewDepths depth_temp = {0};