Edit Mesh: Fix buggy occlusion when in xray mode.
[blender.git] / source / blender / draw / modes / edit_mesh_mode.c
index 26648ecab0782e5ca256145d72833df618be81b0..700132e0ee4620ba57387be5b40fc3d4deddc0bd 100644 (file)
@@ -134,6 +134,7 @@ typedef struct EDIT_MESH_PrivateData {
        DRWShadingGroup *facedot_occluded_shgrp;
        DRWShadingGroup *facefill_occluded_shgrp;
 
+       bool do_zbufclip;
 } EDIT_MESH_PrivateData; /* Transient data */
 
 /* *********** FUNCTIONS *********** */
@@ -352,8 +353,6 @@ static void EDIT_MESH_cache_init(void *vedata)
        const DRWContextState *draw_ctx = DRW_context_state_get();
        View3D *v3d = draw_ctx->v3d;
 
-       bool do_zbufclip = ((v3d->flag & V3D_ZBUF_SELECT) == 0);
-
        static float zero = 0.0f;
 
        if (!stl->g_data) {
@@ -361,6 +360,11 @@ static void EDIT_MESH_cache_init(void *vedata)
                stl->g_data = MEM_mallocN(sizeof(*stl->g_data), __func__);
        }
 
+
+       const bool xray_enabled = ((draw_ctx->v3d->shading.flag & V3D_SHADING_XRAY) != 0) &&
+                                  (draw_ctx->v3d->drawtype < OB_MATERIAL);
+       stl->g_data->do_zbufclip = ((v3d->flag & V3D_ZBUF_SELECT) == 0) || xray_enabled;
+
        {
                psl->vcolor_faces = DRW_pass_create(
                        "Vert Color Pass",
@@ -403,7 +407,7 @@ static void EDIT_MESH_cache_init(void *vedata)
                DRW_shgroup_uniform_vec4(stl->g_data->lnormals_shgrp, "color", ts.colorLNormal, 1);
        }
 
-       if (!do_zbufclip) {
+       if (!stl->g_data->do_zbufclip) {
                psl->edit_face_overlay = edit_mesh_create_overlay_pass(
                        &face_mod, DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_WRITE_DEPTH | DRW_STATE_BLEND,
                        &stl->g_data->face_overlay_shgrp, &stl->g_data->ledges_overlay_shgrp,
@@ -519,7 +523,7 @@ static void EDIT_MESH_cache_populate(void *vedata, Object *ob)
                                }
                        }
 
-                       if ((v3d->flag & V3D_ZBUF_SELECT) == 0) {
+                       if (stl->g_data->do_zbufclip) {
                                edit_mesh_add_ob_to_pass(
                                        scene, ob, stl->g_data->face_occluded_shgrp, stl->g_data->ledges_occluded_shgrp,
                                        stl->g_data->lverts_occluded_shgrp, stl->g_data->facedot_occluded_shgrp,
@@ -550,6 +554,7 @@ static void EDIT_MESH_cache_populate(void *vedata, Object *ob)
 static void EDIT_MESH_draw_scene(void *vedata)
 {
        EDIT_MESH_PassList *psl = ((EDIT_MESH_Data *)vedata)->psl;
+       EDIT_MESH_StorageList *stl = ((EDIT_MESH_Data *)vedata)->stl;
        EDIT_MESH_FramebufferList *fbl = ((EDIT_MESH_Data *)vedata)->fbl;
        DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
 
@@ -557,7 +562,7 @@ static void EDIT_MESH_draw_scene(void *vedata)
 
        DRW_draw_pass(psl->depth_hidden_wire);
 
-       if (psl->edit_face_occluded) {
+       if (stl->g_data->do_zbufclip) {
                float clearcol[4] = {0.0f, 0.0f, 0.0f, 0.0f};
                /* render facefill */
                DRW_draw_pass(psl->facefill_occlude);