[Bf-blender-cvs] [8dcca698e09] sculpt-dev: sculpt-dev: add missing file

Joseph Eagar noreply at git.blender.org
Fri Oct 7 11:13:42 CEST 2022


Commit: 8dcca698e0925b40e3a40027d77814404d476bfe
Author: Joseph Eagar
Date:   Fri Oct 7 02:13:26 2022 -0700
Branches: sculpt-dev
https://developer.blender.org/rB8dcca698e0925b40e3a40027d77814404d476bfe

sculpt-dev: add missing file

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

A	source/blender/bmesh/intern/bmesh_mesh_convert_threaded.cc

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

diff --git a/source/blender/bmesh/intern/bmesh_mesh_convert_threaded.cc b/source/blender/bmesh/intern/bmesh_mesh_convert_threaded.cc
new file mode 100644
index 00000000000..fdb4104483a
--- /dev/null
+++ b/source/blender/bmesh/intern/bmesh_mesh_convert_threaded.cc
@@ -0,0 +1,1374 @@
+#if 1
+#  include "MEM_guardedalloc.h"
+
+#  include "BLI_compiler_attrs.h"
+#  include "BLI_compiler_compat.h"
+#  include "BLI_index_range.hh"
+#  include "BLI_map.hh"
+#  include "BLI_math_vec_types.hh"
+#  include "BLI_set.hh"
+#  include "BLI_task.h"
+#  include "BLI_task.hh"
+#  include "BLI_vector.hh"
+
+#  include "DNA_key_types.h"
+#  include "DNA_mesh_types.h"
+#  include "DNA_meshdata_types.h"
+#  include "DNA_modifier_types.h"
+#  include "DNA_object_types.h"
+
+#  include "BKE_customdata.h"
+#  include "BKE_mesh.h"
+#  include "BKE_mesh_runtime.h"
+#  include "BKE_multires.h"
+
+#  include "BKE_key.h"
+#  include "BKE_main.h"
+
+#  include "DEG_depsgraph_query.h"
+
+#  include "atomic_ops.h"
+#  include "bmesh.h"
+#  include "intern/bmesh_private.h" /* For element checking. */
+
+using blender::float2;
+using blender::float3;
+using blender::IndexRange;
+using blender::Map;
+using blender::Set;
+using blender::Vector;
+using namespace blender::threading;
+
+ATTR_NO_OPT extern "C" void BM_mesh_bm_to_me_threaded(
+    Main *bmain, Object *ob, BMesh *bm, Mesh *me, const struct BMeshToMeshParams *params)
+{
+  BM_mesh_elem_index_ensure(bm, BM_VERT | BM_EDGE | BM_FACE);
+  BM_mesh_elem_table_ensure(bm, BM_VERT | BM_EDGE | BM_FACE);
+
+  CustomData_reset(&me->vdata);
+  CustomData_reset(&me->edata);
+  CustomData_reset(&me->ldata);
+  CustomData_reset(&me->pdata);
+
+  me->totvert = bm->totvert;
+  me->totedge = bm->totedge;
+  me->totloop = bm->totloop;
+  me->totpoly = bm->totface;
+  me->totface = 0;
+
+  CustomData_merge(&bm->vdata,
+                   &me->vdata,
+                   params->cd_mask_extra.vmask | CD_MASK_MESH.vmask,
+                   CD_CONSTRUCT,
+                   bm->totvert);
+  CustomData_merge(&bm->edata,
+                   &me->edata,
+                   params->cd_mask_extra.emask | CD_MASK_MESH.emask,
+                   CD_CONSTRUCT,
+                   bm->totedge);
+  CustomData_merge(&bm->ldata,
+                   &me->ldata,
+                   params->cd_mask_extra.lmask | CD_MASK_MESH.lmask,
+                   CD_CONSTRUCT,
+                   bm->totloop);
+  CustomData_merge(&bm->pdata,
+                   &me->pdata,
+                   params->cd_mask_extra.pmask | CD_MASK_MESH.pmask,
+                   CD_CONSTRUCT,
+                   bm->totface);
+
+  MVert *mvert = me->mvert = static_cast<MVert *>(
+      CustomData_add_layer(&me->vdata, CD_MVERT, CD_CONSTRUCT, nullptr, bm->totvert));
+  MEdge *medge = static_cast<MEdge *>(
+      CustomData_add_layer(&me->vdata, CD_MEDGE, CD_CONSTRUCT, nullptr, bm->totedge));
+  MLoop *mloop = static_cast<MLoop *>(
+      CustomData_add_layer(&me->vdata, CD_MLOOP, CD_CONSTRUCT, nullptr, bm->totloop));
+  MPoly *mpoly = static_cast<MPoly *>(
+      CustomData_add_layer(&me->vdata, CD_MPOLY, CD_CONSTRUCT, nullptr, bm->totface));
+  float(*normals)[3] = BKE_mesh_vertex_normals_for_write(me);
+
+  bool *hide_vert = static_cast<bool *>(
+      CustomData_get_layer_named(&me->vdata, CD_PROP_BOOL, ".hide_vert"));
+  bool *hide_edge = static_cast<bool *>(
+      CustomData_get_layer_named(&me->vdata, CD_PROP_BOOL, ".hide_edge"));
+  bool *hide_poly = static_cast<bool *>(
+      CustomData_get_layer_named(&me->pdata, CD_PROP_BOOL, ".hide_poly"));
+
+  parallel_for(IndexRange(bm->totvert), 512, [&](IndexRange range) {
+    for (int i : range) {
+      MVert *mv = mvert + i;
+      BMVert *v = bm->vtable[i];
+
+      copy_v3_v3(mv->co, v->co);
+      copy_v3_v3(normals[i], v->no);
+
+      CustomData_from_bmesh_block(&bm->vdata, &me->vdata, v->head.data, i);
+
+      if (hide_vert) {
+        hide_vert[i] = v->head.hflag & BM_ELEM_HIDDEN;
+      }
+    }
+  });
+
+  parallel_for(IndexRange(bm->totedge), 512, [&](IndexRange range) {
+    for (int i : range) {
+      MEdge *med = medge + i;
+      BMEdge *e = bm->etable[i];
+
+      med->v1 = e->v1->head.index;
+      med->v2 = e->v2->head.index;
+
+      CustomData_from_bmesh_block(&bm->edata, &me->edata, e->head.data, i);
+
+      if (hide_edge) {
+        hide_edge[i] = e->head.hflag & BM_ELEM_HIDDEN;
+      }
+    }
+  });
+
+  BMIter iter;
+  BMFace *f;
+  int loop_i = 0;
+
+  BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
+    BMLoop *l = f->l_first;
+    do {
+      l->head.index = loop_i++;
+    } while ((l = l->next) != f->l_first);
+  }
+
+  int *material_index = static_cast<int *>(
+      CustomData_get_layer_named(&me->pdata, CD_PROP_INT32, "material_index"));
+
+  parallel_for(IndexRange(bm->totface), 512, [&](IndexRange range) {
+    for (int i : range) {
+      MPoly *mp = mpoly + i;
+      BMFace *f = bm->ftable[i];
+
+      mp->loopstart = f->l_first->head.index;
+      mp->totloop = 0;
+      mp->flag = 0;
+
+      if (material_index) {
+        material_index[i] = f->mat_nr;
+      }
+
+      CustomData_from_bmesh_block(&bm->pdata, &me->pdata, f->head.data, i);
+      if (hide_poly) {
+        hide_poly[i] = f->head.hflag & BM_ELEM_HIDDEN;
+      }
+
+      BMLoop *l = f->l_first;
+      do {
+        int l_i = l->head.index;
+        MLoop *ml = mloop + l_i;
+
+        ml->v = l->v->head.index;
+        ml->e = l->e->head.index;
+
+        CustomData_from_bmesh_block(&bm->ldata, &me->ldata, l->head.data, l_i);
+        mp->totloop++;
+      } while ((l = l->next) != f->l_first);
+    }
+  });
+}
+#endif
+
+#if 0
+#  include "DNA_key_types.h"
+#  include "DNA_mesh_types.h"
+#  include "DNA_meshdata_types.h"
+#  include "DNA_modifier_types.h"
+#  include "DNA_object_types.h"
+
+#  include "MEM_guardedalloc.h"
+
+#  include "BLI_alloca.h"
+#  include "BLI_compiler_attrs.h"
+#  include "BLI_listbase.h"
+#  include "BLI_math_vector.h"
+#  include "BLI_task.h"
+#  include "BLI_threads.h"
+
+#  include "BKE_customdata.h"
+#  include "BKE_mesh.h"
+#  include "BKE_mesh_runtime.h"
+#  include "BKE_multires.h"
+
+#  include "BKE_key.h"
+#  include "BKE_main.h"
+
+#  include "DEG_depsgraph_query.h"
+
+#  include "bmesh.h"
+#  include "intern/bmesh_private.h" /* For element checking. */
+
+#  include "BLI_task.h"
+
+#  include "atomic_ops.h"
+
+#  define ECHUNK 512
+#  define VCHUNK 512
+#  define FCHUNK 512
+#  define LCHUNK 1024
+
+typedef struct BMThreadData {
+  BMesh *bm;
+  Object *ob;
+  const Mesh *me;
+
+  struct BMeshFromMeshParams *params;
+
+  void **vdata, **edata, **ldata, **fdata;
+  int totdv, totde, totdl, totdf;
+  int vsize, esize, lsize, fsize;
+
+  int vchunk, echunk, lchunk, fchunk;
+
+  BMVert **verts;
+  BMEdge **edges;
+  BMLoop **loops;
+  BMFace **faces;
+
+  float (**shape_key_table)[3];
+  int tot_shape_keys;
+
+  int cd_vert_bweight;
+  int cd_edge_bweight;
+  int cd_crease;
+
+  int cdvsize, cdesize, cdlsize, cdfsize;
+
+  // chunk sizes
+  int totcv, totce, totcl, totcf;
+} BMThreadData;
+
+#  define ELEM_NEXT(type, ptr, size) ((type *)(((char *)ptr) + size))
+
+static void bm_vert_task(void *__restrict userdata,
+                         const int n,
+                         const TaskParallelTLS *__restrict tls)
+{
+  BMThreadData *data = userdata;
+  BMesh *bm = data->bm;
+  const Mesh *me = data->me;
+
+  int starti = n * VCHUNK;
+
+  int ilen = starti + VCHUNK > bm->totvert ? bm->totvert - starti : VCHUNK;
+  MVert *mv = me->mvert + starti;
+  BMVert *v = data->verts[n];
+  char *cdblock = data->vdata ? (char *)data->vdata[n] : NULL;
+
+  for (int i = 0; i < ilen; i++, mv++) {
+    if (cdblock) {
+      v->head.data = (void *)cdblock;
+      cdblock += data->cdvsize;
+    }
+    else {
+      v->head.data = NULL;
+    }
+
+    v->head.htype = BM_VERT;
+    v->head.hflag = BM_vert_flag_from_mflag(mv->flag);
+    v->head.api_flag = 0;
+
+    copy_v3_v3(v->co, mv->co);
+    // XXX normal_short_to_float_v3(v->no, mv->no);
+
+    v->e = NULL;
+    v->head.index = i + starti;
+    v = ELEM_NEXT(BMVert, v, data->vsize);
+  }
+
+  if (data->vdata) {
+    v = data->verts[n];
+    for (int i = 0; i < ilen; i++) {
+      CustomData_to_bmesh_block(&me->vdata, &bm->vdata, i + starti, &v->head.data, true);
+      v = ELEM_NEXT(BMVert, v, data->vsize);
+    }
+  }
+}
+
+static void bm_edge_task(void *__restrict userdata,
+                         const int n,
+                         const TaskParallelTLS *__restrict tls)
+{
+  BMThreadData *data = userdata;
+  BMesh *bm = data->bm;
+  const Mesh *me = data->me;
+
+  int starti = n * ECHUNK;
+
+  int ilen = starti + ECHUNK > bm->totedge ? bm->totedge - starti : ECHUNK;
+  MEdge *med = me->medge + starti;
+  BMEdge *e = data->edges[n];
+  char *cdblock = data->edata ? (char *)data->edata[n] : NULL;
+
+  for (int i = 0; i < ilen; i++, med++) {
+    if (cdblock) {
+      e->head.data = (void *)cdblock;
+      cdblock += data->cdesize;
+    }
+    else {
+      e->head.data = NULL;
+    }
+
+    e->head.htype = BM_EDGE;
+    e->head.hflag = BM_edge_flag_from_mflag(med->flag);
+    e->head.api_flag = 0;
+
+    e->v1 = &data->verts[med->v1 / VCHUNK][med->v1 % VCHUNK];
+    e->v2 = &data->verts[med->v2 / VCHUNK][med->v2 % VCHUNK];
+
+    e->l = NULL;
+    e->v1_disk_link.next = e->v1_disk_link.prev = NULL;
+    e->v2_disk_link.next = e->v2_disk_link.prev = NULL;
+
+    e = ELEM_NEXT(BMEdge, e, data->esize);
+  }
+
+  if (data->edata) {
+    e = data->edges[n];
+    for (int i = 0; i < ilen; i++) {
+      CustomData_to_bmesh_block(&me->edata, &bm->edata, i + starti, &e->head.data, true);
+      e = ELEM_NEXT(BMEdge, e, data->esize);
+    }
+  }
+}
+
+static void bm_loop_task(void *__restrict userdata,
+                         const int n,
+                         const TaskParallelTLS *__restrict tls)
+{
+  BMThreadData *data = userdata;
+  BMesh *bm = data->bm;
+  const Mesh *me = data->me;
+
+  int starti = n * LCHUNK;
+
+  int ilen = starti + LCHUNK > bm->totloop ? bm->totloop - starti : LCHUNK;
+  MLoop *ml = me->mloop + starti;
+  BMLoop *l = data->loops[n];
+  char *cdblock = data->ldata ? (char *)data->ldata[n] : NULL;
+
+  for (int i = 0; i < ilen; i++

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list