[Bf-blender-cvs] [3d6798962c2] master: Fix T86762: Inconsistent show of result of modifier Screw in edit mode

Germano Cavalcante noreply at git.blender.org
Thu Apr 8 18:08:54 CEST 2021


Commit: 3d6798962c209f20baffe1d4b6db89831da94068
Author: Germano Cavalcante
Date:   Thu Apr 8 13:04:18 2021 -0300
Branches: master
https://developer.blender.org/rB3d6798962c209f20baffe1d4b6db89831da94068

Fix T86762: Inconsistent show of result of modifier Screw in edit mode

To check if an "is_mesh_verts_only" mesh, the overlay engine checks if the
mesh has no "totedge" and has "totvert".

However, sometimes this engine can check the wrong mesh since editmesh
works on `embm->mesh_eval_final`.

Reviewed By: fclem

Differential Revision: https://developer.blender.org/D10917

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

M	source/blender/draw/engines/overlay/overlay_wireframe.c

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

diff --git a/source/blender/draw/engines/overlay/overlay_wireframe.c b/source/blender/draw/engines/overlay/overlay_wireframe.c
index 7ba5fb3a426..b428d8b4ab8 100644
--- a/source/blender/draw/engines/overlay/overlay_wireframe.c
+++ b/source/blender/draw/engines/overlay/overlay_wireframe.c
@@ -177,8 +177,22 @@ void OVERLAY_wireframe_cache_populate(OVERLAY_Data *vedata,
   const bool all_wires = (ob->dtx & OB_DRAW_ALL_EDGES) != 0;
   const bool is_xray = (ob->dtx & OB_DRAW_IN_FRONT) != 0;
   const bool is_mesh = ob->type == OB_MESH;
-  const bool is_mesh_verts_only = is_mesh && (((Mesh *)ob->data)->totedge == 0 &&
-                                              ((Mesh *)ob->data)->totvert > 0);
+  const bool is_edit_mode = DRW_object_is_in_edit_mode(ob);
+  bool has_edit_mesh_cage = false;
+  bool is_mesh_verts_only = false;
+  if (is_mesh && is_edit_mode) {
+    /* TODO: Should be its own function. */
+    Mesh *me = ob->data;
+    BMEditMesh *embm = me->edit_mesh;
+    if (embm) {
+      has_edit_mesh_cage = embm->mesh_eval_cage && (embm->mesh_eval_cage != embm->mesh_eval_final);
+      if (embm->mesh_eval_final) {
+        me = embm->mesh_eval_final;
+      }
+    }
+    is_mesh_verts_only = me->totedge == 0 && me->totvert > 0;
+  }
+
   const bool use_wire = !is_mesh_verts_only && ((pd->overlay.flag & V3D_OVERLAY_WIREFRAMES) ||
                                                 (ob->dtx & OB_DRAWWIRE) || (ob->dt == OB_WIRE));
 
@@ -261,17 +275,6 @@ void OVERLAY_wireframe_cache_populate(OVERLAY_Data *vedata,
     }
   }
 
-  const bool is_edit_mode = DRW_object_is_in_edit_mode(ob);
-  bool has_edit_mesh_cage = false;
-  if (is_mesh && is_edit_mode) {
-    /* TODO: Should be its own function. */
-    Mesh *me = (Mesh *)ob->data;
-    BMEditMesh *embm = me->edit_mesh;
-    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 (use_wire && (!is_mesh || (!is_edit_mode || has_edit_mesh_cage))) {
     const bool is_sculpt_mode = ((ob->mode & OB_MODE_SCULPT) != 0) && (ob->sculpt != NULL);



More information about the Bf-blender-cvs mailing list