[Bf-blender-cvs] [9465b109af0] refactor-mesh-position-generic: Merge branch 'master' into refactor-mesh-position-generic

Hans Goudey noreply at git.blender.org
Fri Nov 11 02:44:13 CET 2022


Commit: 9465b109af0b70244a36f9e68493e316d9f8b56f
Author: Hans Goudey
Date:   Thu Nov 10 19:14:48 2022 -0600
Branches: refactor-mesh-position-generic
https://developer.blender.org/rB9465b109af0b70244a36f9e68493e316d9f8b56f

Merge branch 'master' into refactor-mesh-position-generic

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



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

diff --cc release/scripts/addons
index eb09be71a96,5a818af9508..c226f867aff
--- a/release/scripts/addons
+++ b/release/scripts/addons
@@@ -1,1 -1,1 +1,1 @@@
- Subproject commit eb09be71a96c4fe910fdc43373be5ec08b419d2c
 -Subproject commit 5a818af95080cccf04dfa8317f0e966bff515c64
++Subproject commit c226f867affd12881533a54c8c90ac6eebfaca6c
diff --cc source/blender/blenkernel/intern/mesh_legacy_convert.cc
index 66372c35ca5,23426f8c087..7f203252bc8
--- a/source/blender/blenkernel/intern/mesh_legacy_convert.cc
+++ b/source/blender/blenkernel/intern/mesh_legacy_convert.cc
@@@ -31,9 -29,258 +31,263 @@@
  #include "BKE_mesh_legacy_convert.h"
  #include "BKE_multires.h"
  
 +using blender::MutableSpan;
 +using blender::Span;
 +
+ /* -------------------------------------------------------------------- */
+ /** \name Legacy Edge Calculation
+  * \{ */
+ 
+ struct EdgeSort {
+   uint v1, v2;
+   char is_loose, is_draw;
+ };
+ 
+ /* edges have to be added with lowest index first for sorting */
+ static void to_edgesort(struct EdgeSort *ed, uint v1, uint v2, char is_loose, short is_draw)
+ {
+   if (v1 < v2) {
+     ed->v1 = v1;
+     ed->v2 = v2;
+   }
+   else {
+     ed->v1 = v2;
+     ed->v2 = v1;
+   }
+   ed->is_loose = is_loose;
+   ed->is_draw = is_draw;
+ }
+ 
+ static int vergedgesort(const void *v1, const void *v2)
+ {
+   const struct EdgeSort *x1 = static_cast<const struct EdgeSort *>(v1);
+   const struct EdgeSort *x2 = static_cast<const struct EdgeSort *>(v2);
+ 
+   if (x1->v1 > x2->v1) {
+     return 1;
+   }
+   if (x1->v1 < x2->v1) {
+     return -1;
+   }
+   if (x1->v2 > x2->v2) {
+     return 1;
+   }
+   if (x1->v2 < x2->v2) {
+     return -1;
+   }
+ 
+   return 0;
+ }
+ 
+ /* Create edges based on known verts and faces,
+  * this function is only used when loading very old blend files */
+ static void mesh_calc_edges_mdata(const MVert * /*allvert*/,
+                                   const MFace *allface,
+                                   MLoop *allloop,
+                                   const MPoly *allpoly,
+                                   int /*totvert*/,
+                                   int totface,
+                                   int /*totloop*/,
+                                   int totpoly,
+                                   const bool use_old,
+                                   MEdge **r_medge,
+                                   int *r_totedge)
+ {
+   const MPoly *mpoly;
+   const MFace *mface;
+   MEdge *medge, *med;
+   EdgeHash *hash;
+   struct EdgeSort *edsort, *ed;
+   int a, totedge = 0;
+   uint totedge_final = 0;
+   uint edge_index;
+ 
+   /* we put all edges in array, sort them, and detect doubles that way */
+ 
+   for (a = totface, mface = allface; a > 0; a--, mface++) {
+     if (mface->v4) {
+       totedge += 4;
+     }
+     else if (mface->v3) {
+       totedge += 3;
+     }
+     else {
+       totedge += 1;
+     }
+   }
+ 
+   if (totedge == 0) {
+     /* flag that mesh has edges */
+     (*r_medge) = (MEdge *)MEM_callocN(0, __func__);
+     (*r_totedge) = 0;
+     return;
+   }
+ 
+   ed = edsort = (EdgeSort *)MEM_mallocN(totedge * sizeof(struct EdgeSort), "EdgeSort");
+ 
+   for (a = totface, mface = allface; a > 0; a--, mface++) {
+     to_edgesort(ed++, mface->v1, mface->v2, !mface->v3, mface->edcode & ME_V1V2);
+     if (mface->v4) {
+       to_edgesort(ed++, mface->v2, mface->v3, 0, mface->edcode & ME_V2V3);
+       to_edgesort(ed++, mface->v3, mface->v4, 0, mface->edcode & ME_V3V4);
+       to_edgesort(ed++, mface->v4, mface->v1, 0, mface->edcode & ME_V4V1);
+     }
+     else if (mface->v3) {
+       to_edgesort(ed++, mface->v2, mface->v3, 0, mface->edcode & ME_V2V3);
+       to_edgesort(ed++, mface->v3, mface->v1, 0, mface->edcode & ME_V3V1);
+     }
+   }
+ 
+   qsort(edsort, totedge, sizeof(struct EdgeSort), vergedgesort);
+ 
+   /* count final amount */
+   for (a = totedge, ed = edsort; a > 1; a--, ed++) {
+     /* edge is unique when it differs from next edge, or is last */
+     if (ed->v1 != (ed + 1)->v1 || ed->v2 != (ed + 1)->v2) {
+       totedge_final++;
+     }
+   }
+   totedge_final++;
+ 
+   medge = (MEdge *)MEM_callocN(sizeof(MEdge) * totedge_final, __func__);
+ 
+   for (a = totedge, med = medge, ed = edsort; a > 1; a--, ed++) {
+     /* edge is unique when it differs from next edge, or is last */
+     if (ed->v1 != (ed + 1)->v1 || ed->v2 != (ed + 1)->v2) {
+       med->v1 = ed->v1;
+       med->v2 = ed->v2;
+       if (use_old == false || ed->is_draw) {
+         med->flag = ME_EDGEDRAW;
+       }
+       if (ed->is_loose) {
+         med->flag |= ME_LOOSEEDGE;
+       }
+ 
+       /* order is swapped so extruding this edge as a surface won't flip face normals
+        * with cyclic curves */
+       if (ed->v1 + 1 != ed->v2) {
+         SWAP(uint, med->v1, med->v2);
+       }
+       med++;
+     }
+     else {
+       /* Equal edge, merge the draw-flag. */
+       (ed + 1)->is_draw |= ed->is_draw;
+     }
+   }
+   /* last edge */
+   med->v1 = ed->v1;
+   med->v2 = ed->v2;
+   med->flag = ME_EDGEDRAW;
+   if (ed->is_loose) {
+     med->flag |= ME_LOOSEEDGE;
+   }
+ 
+   MEM_freeN(edsort);
+ 
+   /* set edge members of mloops */
+   hash = BLI_edgehash_new_ex(__func__, totedge_final);
+   for (edge_index = 0, med = medge; edge_index < totedge_final; edge_index++, med++) {
+     BLI_edgehash_insert(hash, med->v1, med->v2, POINTER_FROM_UINT(edge_index));
+   }
+ 
+   mpoly = allpoly;
+   for (a = 0; a < totpoly; a++, mpoly++) {
+     MLoop *ml, *ml_next;
+     int i = mpoly->totloop;
+ 
+     ml_next = allloop + mpoly->loopstart; /* first loop */
+     ml = &ml_next[i - 1];                 /* last loop */
+ 
+     while (i-- != 0) {
+       ml->e = POINTER_AS_UINT(BLI_edgehash_lookup(hash, ml->v, ml_next->v));
+       ml = ml_next;
+       ml_next++;
+     }
+   }
+ 
+   BLI_edgehash_free(hash, nullptr);
+ 
+   *r_medge = medge;
+   *r_totedge = totedge_final;
+ }
+ 
+ void BKE_mesh_calc_edges_legacy(Mesh *me, const bool use_old)
+ {
+   using namespace blender;
+   MEdge *medge;
+   int totedge = 0;
 -  const Span<MVert> verts = me->verts();
++  const Span<MVert> verts(static_cast<const MVert *>(CustomData_get_layer(&me->vdata, CD_MVERT)),
++                          me->totvert);
+   const Span<MPoly> polys = me->polys();
+   MutableSpan<MLoop> loops = me->loops_for_write();
+ 
+   mesh_calc_edges_mdata(verts.data(),
+                         (MFace *)CustomData_get_layer(&me->fdata, CD_MFACE),
+                         loops.data(),
+                         polys.data(),
+                         verts.size(),
+                         me->totface,
+                         loops.size(),
+                         polys.size(),
+                         use_old,
+                         &medge,
+                         &totedge);
+ 
+   if (totedge == 0) {
+     /* flag that mesh has edges */
+     me->totedge = 0;
+     return;
+   }
+ 
+   medge = (MEdge *)CustomData_add_layer(&me->edata, CD_MEDGE, CD_ASSIGN, medge, totedge);
+   me->totedge = totedge;
+ 
+   BKE_mesh_strip_loose_faces(me);
+ }
+ 
+ /** \} */
+ 
+ /* -------------------------------------------------------------------- */
+ /** \name CD Flag Initialization
+  * \{ */
+ 
+ void BKE_mesh_do_versions_cd_flag_init(Mesh *mesh)
+ {
+   using namespace blender;
+   if (UNLIKELY(mesh->cd_flag)) {
+     return;
+   }
+ 
 -  const Span<MVert> verts = mesh->verts();
++  const Span<MVert> verts(static_cast<const MVert *>(CustomData_get_layer(&mesh->vdata, CD_MVERT)),
++                          mesh->totvert);
+   const Span<MEdge> edges = mesh->edges();
+ 
+   for (const MVert &vert : verts) {
+     if (vert.bweight_legacy != 0) {
+       mesh->cd_flag |= ME_CDFLAG_VERT_BWEIGHT;
+       break;
+     }
+   }
+ 
+   for (const MEdge &edge : edges) {
+     if (edge.bweight_legacy != 0) {
+       mesh->cd_flag |= ME_CDFLAG_EDGE_BWEIGHT;
+       if (mesh->cd_flag & ME_CDFLAG_EDGE_CREASE) {
+         break;
+       }
+     }
+     if (edge.crease_legacy != 0) {
+       mesh->cd_flag |= ME_CDFLAG_EDGE_CREASE;
+       if (mesh->cd_flag & ME_CDFLAG_EDGE_BWEIGHT) {
+         break;
+       }
+     }
+   }
+ }
+ 
+ /** \} */
+ 
  /* -------------------------------------------------------------------- */
  /** \name NGon Tessellation (NGon to MFace Conversion)
   * \{ */
diff --cc source/blender/editors/sculpt_paint/sculpt.cc
index 6498d5f6281,684fcdbff9e..3021e058719
--- a/source/blender/editors/sculpt_paint/sculpt.cc
+++ b/source/blender/editors/sculpt_paint/sculpt.cc
@@@ -275,14 -276,14 +276,14 @@@ float (*SCULPT_mesh_deformed_positions_
    switch (BKE_pbvh_type(ss->pbvh)) {
      case PBVH_FACES:
        if (ss->shapekey_active || ss->deform_modifiers_active) {
 -        return BKE_pbvh_get_verts(ss->pbvh);
 +        return BKE_pbvh_get_positions(ss->pbvh);
        }
 -      return ss->mvert;
 +      return ss->positions;
      case PBVH_BMESH:
      case PBVH_GRIDS:
-       return NULL;
+       return nullptr;
    }
-   return NULL;
+   return nullptr;
  }
  
  float *SCULPT_brush_deform_target_vertex_co_get(SculptSession *ss,
diff --cc source/blender/editors/transform/transform_snap_object.cc
index d1cf7487c51,87c467d44d8..598b3f7f1b7
--- a/source/blender/editors/transform/transform_snap_object.cc
+++ b/source/blender/editors/transform/transform_snap_object.cc
@@@ -236,98 -234,32 +234,31 @@@ static void snap_editmesh_minmax(SnapOb
    }
  }
  
- static SnapData_Mesh *snap_object_data_mesh_get(SnapObjectContext *sctx,
-                                                 Object *ob_eval,
-                                                 const Mesh *me_eval,
-                                                 bool use_hide)
+ static void snap_object_data_mesh_get(SnapObjectContext *sctx,
+                                       Object *ob_eval,
+                                       const Mesh *me_eval,
+                                       bool use_hide,
+                                       BVHTreeFromMesh *r_treedata)
  {
-   SnapData_Mesh *sod;
-   bool init = false;
- 
 -  const Span<MVert> verts = me_eval->verts();
 +  const Span<float3> positions = me_eval->positions();
-   const Span<MEdge> edges 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list