[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