Fix #107768: vertex paint selection with retopology overlay #107833

Open
YimingWu wants to merge 1 commits from ChengduLittleA/blender:retopo_select into main

When changing the target branch, be careful to rebase the branch in your fork to match. See documentation.
4 changed files with 29 additions and 6 deletions

View File

@ -117,10 +117,10 @@ void OVERLAY_edit_uv_init(OVERLAY_Data *vedata)
const bool show_modified_uvs = sima->flag & SI_DRAWSHADOW;
const bool is_tiled_image = image && (image->source == IMA_SRC_TILED);
const bool do_edges_only = (ts->uv_flag & UV_SYNC_SELECTION) ?
/* NOTE: Ignore #SCE_SELECT_EDGE because a single selected edge
* on the mesh may cause single UV vertices to be selected. */
false :
(ts->uv_selectmode == UV_SELECT_EDGE);
/* NOTE: Ignore #SCE_SELECT_EDGE because a single selected edge
* on the mesh may cause single UV vertices to be selected. */
false :
(ts->uv_selectmode == UV_SELECT_EDGE);
const bool do_faces = ((sima->flag & SI_NO_DRAWFACES) == 0);
const bool do_face_dots = (ts->uv_flag & UV_SYNC_SELECTION) ?
(ts->selectmode & SCE_SELECT_FACE) != 0 :

View File

@ -217,7 +217,7 @@ static void select_cache_populate(void *vedata, Object *ob)
const bool retopology_occlusion = RETOPOLOGY_ENABLED(draw_ctx->v3d) &&
!XRAY_ENABLED(draw_ctx->v3d);
if (retopology_occlusion && !DRW_object_is_in_edit_mode(ob)) {
if (retopology_occlusion && !DRW_object_should_not_occlude(ob)) {
if (ob->dt >= OB_SOLID) {
struct GPUBatch *geom_faces = DRW_mesh_batch_cache_get_surface(ob->data);
DRW_shgroup_call_obmat(stl->g_data->shgrp_occlude, geom_faces, ob->object_to_world);

View File

@ -877,6 +877,14 @@ bool DRW_object_is_renderable(const struct Object *ob);
* This will not be the case when one of the objects are influenced by modifiers.
*/
bool DRW_object_is_in_edit_mode(const struct Object *ob);
/**
* Should `ob` be used for occlusion in selection when in weight and vertex paint mode, this
* is needed for when retopology overlay is enabled to still be able to render IDs for face
* and vertex selection.
*/
bool DRW_object_should_not_occlude(const Object *ob);
/**
* Return whether this object is visible depending if
* we are rendering or drawing in the viewport.

View File

@ -210,6 +210,21 @@ bool DRW_object_is_in_edit_mode(const Object *ob)
return false;
}
bool DRW_object_should_not_occlude(const Object *ob)
{
if (DRW_object_is_in_edit_mode(ob)) {
return true;
}
if (ob->type == OB_MESH && (ob->mode & OB_MODE_VERTEX_PAINT) ||
(ob->mode & OB_MODE_WEIGHT_PAINT)) {
Mesh *me = ob->data;
if ((ME_EDIT_PAINT_SEL_MODE(me))) {
return true;
}
}
return false;
}
int DRW_object_visibility_in_active_context(const Object *ob)
{
const eEvaluationMode mode = DRW_state_is_scene_render() ? DAG_EVAL_RENDER : DAG_EVAL_VIEWPORT;
@ -2788,7 +2803,7 @@ void DRW_draw_select_id(Depsgraph *depsgraph, ARegion *region, View3D *v3d, cons
* It also has non-mesh objects however, which are not supported here. */
continue;
}
if (DRW_object_is_in_edit_mode(ob)) {
if (DRW_object_should_not_occlude(ob)) {
/* Only background (non-edit) objects are used for occlusion. */
continue;
}