Commit: 0424ee86f0082db3a62f2f833bca63dd2e899dae
Author: Clément Foucault
Date:   Wed Dec 5 20:33:28 2018 +0100
Branches: blender2.8
https://developer.blender.org/rB0424ee86f0082db3a62f2f833bca63dd2e899dae

Fix T58407: Wire frames are not showing with subdivision surfaces

===================================================================

M       source/blender/draw/intern/draw_cache_impl_mesh.c
M       source/blender/draw/modes/overlay_mode.c

===================================================================

diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c 
b/source/blender/draw/intern/draw_cache_impl_mesh.c
index 3a87cd70a45..3904cdc78af 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -4413,7 +4413,6 @@ static GPUTexture 
*mesh_batch_cache_get_edges_overlay_texture_buf(
 {
        BLI_assert(rdata->types & (MR_DATATYPE_VERT | MR_DATATYPE_EDGE | 
MR_DATATYPE_LOOP | MR_DATATYPE_LOOPTRI));
 
-       BLI_assert(rdata->edit_bmesh == NULL); /* Not supported in edit mode */
 
        if (cache->edges_face_overlay_tx != NULL) {
                return cache->edges_face_overlay_tx;
@@ -5109,6 +5108,28 @@ void DRW_mesh_batch_cache_get_wireframes_face_texbuf(
        if (cache->edges_face_overlay_tx == NULL || cache->pos_in_order_tx == 
NULL) {
                const int options = MR_DATATYPE_VERT | MR_DATATYPE_EDGE | 
MR_DATATYPE_LOOP | MR_DATATYPE_LOOPTRI;
 
+               /* Hack to show the final result. */
+               BMesh *bm_mapped = NULL;
+               const int *p_origindex = NULL;
+               const bool use_em_final = (
+                       me->edit_btmesh &&
+                       me->edit_btmesh->mesh_eval_final &&
+                       (me->edit_btmesh->mesh_eval_final->runtime.is_original 
== false));
+               Mesh me_fake;
+               if (use_em_final) {
+                       /* Pass in mapped args. */
+                       bm_mapped = me->edit_btmesh->bm;
+                       p_origindex = 
CustomData_get_layer(&me->edit_btmesh->mesh_eval_final->pdata, CD_ORIGINDEX);
+                       if (p_origindex == NULL) {
+                               bm_mapped = NULL;
+                       }
+
+                       me_fake = *me->edit_btmesh->mesh_eval_final;
+                       me_fake.mat = me->mat;
+                       me_fake.totcol = me->totcol;
+                       me = &me_fake;
+               }
+
                MeshRenderData *rdata = mesh_render_data_create(me, options);
 
                mesh_batch_cache_get_edges_overlay_texture_buf(rdata, cache, 
reduce_len);
diff --git a/source/blender/draw/modes/overlay_mode.c 
b/source/blender/draw/modes/overlay_mode.c
index 43ec7ab26bb..46330d4d81c 100644
--- a/source/blender/draw/modes/overlay_mode.c
+++ b/source/blender/draw/modes/overlay_mode.c
@@ -23,8 +23,10 @@
  *  \ingroup draw_engine
  */
 
+#include "DNA_mesh_types.h"
 #include "DNA_view3d_types.h"
 
+#include "BKE_editmesh.h"
 #include "BKE_object.h"
 
 #include "GPU_shader.h"
@@ -251,8 +253,20 @@ static void overlay_cache_populate(void *vedata, Object 
*ob)
            (ob->dtx & OB_DRAWWIRE) ||
            (ob->dt == OB_WIRE))
        {
-               /* Don't do that in edit Mesh mode. */
-               if (((ob != draw_ctx->object_edit) && 
!BKE_object_is_in_editmode(ob)) || ob->type != OB_MESH) {
+               bool has_edit_mesh_cage = false;
+               if (ob->type == OB_MESH) {
+                       /* TODO: Should be its own function. */
+                       Mesh *me = (Mesh *)ob->data;
+                       BMEditMesh *embm = me->edit_btmesh;
+                       if (embm) {
+                               has_edit_mesh_cage = embm->mesh_eval_cage && 
(embm->mesh_eval_cage != embm->mesh_eval_final);
+                       }
+               }
+
+               /* Don't do that in edit Mesh mode, unless there is a modifier 
preview. */
+               if ((((ob != draw_ctx->object_edit) && 
!BKE_object_is_in_editmode(ob)) || has_edit_mesh_cage) ||
+                       ob->type != OB_MESH)
+               {
                        const bool is_active = (ob == draw_ctx->obact);
                        const bool is_sculpt_mode = is_active && 
(draw_ctx->object_mode & OB_MODE_SCULPT) != 0;
                        const bool all_wires = 
(stl->g_data->overlay.wireframe_threshold == 1.0f) ||
@@ -295,7 +309,7 @@ static void overlay_cache_populate(void *vedata, Object *ob)
                                DRW_cache_object_face_wireframe_get(ob, &verts, 
&faceids, &tri_count, reduced_tri_len);
                                if (verts) {
                                        float *rim_col = ts.colorWire;
-                                       if ((ob->base_flag & BASE_SELECTED) != 
0) {
+                                       if (!has_edit_mesh_cage && 
((ob->base_flag & BASE_SELECTED) != 0)) {
                                                rim_col = (ob == 
draw_ctx->obact) ? ts.colorActive : ts.colorSelect;
                                        }
                                        DRWPass *pass = (all_wires) ? 
psl->face_wireframe_full_pass : psl->face_wireframe_pass;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to