[Bf-blender-cvs] [5910f9f9e91] master: Fix T70617: mesh.from_pydata() misses first edge if there are faces

Campbell Barton noreply at git.blender.org
Thu Oct 10 02:32:12 CEST 2019


Commit: 5910f9f9e914e0e2e99b63a1a329f04655ba866d
Author: Campbell Barton
Date:   Thu Oct 10 11:08:17 2019 +1100
Branches: master
https://developer.blender.org/rB5910f9f9e914e0e2e99b63a1a329f04655ba866d

Fix T70617: mesh.from_pydata() misses first edge if there are faces

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

M	release/scripts/modules/bpy_types.py
M	source/blender/blenkernel/intern/mesh_validate.c
M	source/blender/editors/mesh/mesh_data.c

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

diff --git a/release/scripts/modules/bpy_types.py b/release/scripts/modules/bpy_types.py
index 76c495c078d..6cb9600b9b4 100644
--- a/release/scripts/modules/bpy_types.py
+++ b/release/scripts/modules/bpy_types.py
@@ -441,11 +441,6 @@ class Mesh(bpy_types.ID):
 
            When an empty iterable is passed in, the edges are inferred from the polygons.
 
-           When non-emtpy, either:
-
-           - Edges must be provided for all polygons.
-           - Edges must be calculated afterwards using :class:`Mesh.update` with ``calc_edges=True``.
-
         :type edges: iterable object
         :arg faces:
 
@@ -481,11 +476,15 @@ class Mesh(bpy_types.ID):
         self.polygons.foreach_set("loop_start", loop_starts)
         self.polygons.foreach_set("vertices", vertex_indices)
 
-        # if no edges - calculate them
-        if faces and (not edges):
-            self.update(calc_edges=True)
-        elif edges:
-            self.update(calc_edges_loose=True)
+        if edges or faces:
+            self.update(
+                # Needed to either:
+                # - Calculate edges that don't exist for polygons.
+                # - Assign edges to polygon loops.
+                calc_edges=bool(faces),
+                # Flag loose edges.
+                calc_edges_loose=bool(edges),
+            )
 
     @property
     def edge_keys(self):
diff --git a/source/blender/blenkernel/intern/mesh_validate.c b/source/blender/blenkernel/intern/mesh_validate.c
index c8e75532075..fa03aec3e08 100644
--- a/source/blender/blenkernel/intern/mesh_validate.c
+++ b/source/blender/blenkernel/intern/mesh_validate.c
@@ -1619,6 +1619,12 @@ void BKE_mesh_calc_edges_loose(Mesh *mesh)
   for (int i = 0; i < mesh->totloop; i++, ml++) {
     mesh->medge[ml->e].flag &= ~ME_LOOSEEDGE;
   }
+  med = mesh->medge;
+  for (int i = 0; i < mesh->totedge; i++, med++) {
+    if (med->flag & ME_LOOSEEDGE) {
+      med->flag |= ME_EDGEDRAW;
+    }
+  }
 }
 
 /**
diff --git a/source/blender/editors/mesh/mesh_data.c b/source/blender/editors/mesh/mesh_data.c
index 569994bead1..a0d424e083c 100644
--- a/source/blender/editors/mesh/mesh_data.c
+++ b/source/blender/editors/mesh/mesh_data.c
@@ -880,14 +880,14 @@ void MESH_OT_customdata_custom_splitnormals_clear(wmOperatorType *ot)
 
 void ED_mesh_update(Mesh *mesh, bContext *C, bool calc_edges, bool calc_edges_loose)
 {
-  if (calc_edges_loose && mesh->totedge) {
-    BKE_mesh_calc_edges_loose(mesh);
-  }
-
   if (calc_edges || ((mesh->totpoly || mesh->totface) && mesh->totedge == 0)) {
     BKE_mesh_calc_edges(mesh, calc_edges, true);
   }
 
+  if (calc_edges_loose && mesh->totedge) {
+    BKE_mesh_calc_edges_loose(mesh);
+  }
+
   /* Default state is not to have tessface's so make sure this is the case. */
   BKE_mesh_tessface_clear(mesh);



More information about the Bf-blender-cvs mailing list