[Bf-blender-cvs] [92bc610c36b] sculpt-dev: Merge remote-tracking branch 'origin' into sculpt-dev
Joseph Eagar
noreply at git.blender.org
Wed Oct 12 22:20:13 CEST 2022
Commit: 92bc610c36b6e4f36838b23bf4b61ea6c4a64eec
Author: Joseph Eagar
Date: Wed Oct 12 13:19:59 2022 -0700
Branches: sculpt-dev
https://developer.blender.org/rB92bc610c36b6e4f36838b23bf4b61ea6c4a64eec
Merge remote-tracking branch 'origin' into sculpt-dev
===================================================================
===================================================================
diff --cc source/blender/blenkernel/intern/mesh_fair.cc
index 5293dbcb680,5369bc782b6..22cb2ce0c5e
--- a/source/blender/blenkernel/intern/mesh_fair.cc
+++ b/source/blender/blenkernel/intern/mesh_fair.cc
@@@ -233,9 -220,8 +233,9 @@@ class MeshFairingContext : public Fairi
co_[i] = verts[i].co;
}
}
+#endif
- loop_to_poly_map_ = blender::mesh_topology::build_corner_to_poly_map(mpoly_, mloop_.size());
+ loop_to_poly_map_ = blender::mesh_topology::build_loop_to_poly_map(mpoly_, mloop_.size());
}
~MeshFairingContext() override
diff --cc source/blender/blenkernel/intern/multires.cc
index 35d6cc0d8f9,61cfe043927..ef3db5f3675
--- a/source/blender/blenkernel/intern/multires.cc
+++ b/source/blender/blenkernel/intern/multires.cc
@@@ -50,12 -41,10 +50,12 @@@
#include "DEG_depsgraph_query.h"
+#include "bmesh.h"
+#include "multires_inline.h"
#include "multires_reshape.h"
- #include <math.h>
- #include <string.h>
+ #include <cmath>
+ #include <cstring>
/* MULTIRES MODIFIER */
static const int multires_grid_tot[] = {
@@@ -456,13 -443,14 +454,13 @@@ void multires_force_sculpt_rebuild(Obje
SculptSession *ss = object->sculpt;
- if (ss->pbvh != NULL) {
+ if (ss->pbvh != nullptr) {
BKE_pbvh_free(ss->pbvh);
- object->sculpt->pbvh = NULL;
+ object->sculpt->pbvh = nullptr;
}
- MEM_SAFE_FREE(ss->pmap);
-
- MEM_SAFE_FREE(ss->pmap_mem);
+ BKE_pbvh_pmap_release(ss->pmap);
+ ss->pmap = NULL;
}
void multires_force_external_reload(Object *object)
@@@ -836,11 -825,8 +835,11 @@@ static void grid_tangent_matrix(float m
copy_v3_v3(mat[2], CCG_grid_elem_no(key, grid, x, y));
}
- typedef struct MultiresThreadedData {
+ struct MultiresThreadedData {
DispOp op;
+ MultiResSpace bmop;
+ BMesh *bm;
+ int lvl;
CCGElem **gridData, **subGridData;
CCGKey *key;
CCGKey *sub_key;
@@@ -849,452 -834,15 +848,452 @@@
MDisps *mdisps;
GridPaintMask *grid_paint_mask;
int *gridOffset;
+ int cd_mdisps_off, cd_mask_off;
int gridSize, dGridSize, dSkip;
float (*smat)[3];
+ bool has_grid_mask;
- } MultiresThreadedData;
+ };
- Object *multires_dump_grids_bmesh(Object *bmob, BMesh *bm)
++extern "C" Object *multires_dump_grids_bmesh(Object *bmob, BMesh *bm)
+{
+ if (!CustomData_has_layer(&bm->ldata, CD_MDISPS)) {
+ printf("multires_dump_grids_bmesh: error: no multires grids\n");
+ return NULL;
+ }
+
+ bool spaceset = false;
+
+ if (bm->multiresSpace != MULTIRES_SPACE_ABSOLUTE) {
+ BKE_multires_bmesh_space_set(bmob, bm, MULTIRES_SPACE_ABSOLUTE);
+ spaceset = true;
+ }
+
+ Main *bmain = G.main;
+ char *name = "multires_dump";
+
+ bContext *ctx = CTX_create();
+ CTX_data_main_set(ctx, bmain);
- CTX_wm_manager_set(ctx, G.main->wm.first);
- CTX_data_scene_set(ctx, G.main->scenes.first);
++ CTX_wm_manager_set(ctx, (wmWindowManager *)G.main->wm.first);
++ CTX_data_scene_set(ctx, (Scene *)G.main->scenes.first);
+
+ ViewLayer *view_layer = CTX_data_view_layer(ctx);
+ Object *ob = BKE_object_add_only_object(bmain, OB_MESH, name);
+ LayerCollection *layer_collection;
+
+ ob->data = BKE_object_obdata_add_from_type(bmain, OB_MESH, name);
+ DEG_id_tag_update_ex(
+ bmain, &ob->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_ANIMATION);
+ // DEG_id_tag_update_ex(
+ // bmain, &ob->data, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_ANIMATION);
+
+ layer_collection = BKE_layer_collection_get_active(view_layer);
+ BKE_collection_object_add(bmain, layer_collection->collection, ob);
+
+ DEG_id_type_tag(bmain, ID_OB);
+ DEG_relations_tag_update(bmain);
+ if (ob->data != NULL) {
+ DEG_id_tag_update_ex(bmain, (ID *)ob->data, ID_RECALC_EDITORS);
+ }
+
+ ob->modifiers.first = ob->modifiers.last = NULL;
+ zero_v3(ob->loc);
+
+ printf("users: %d\n", ob->id.us);
+
- Mesh *me = ob->data;
++ Mesh *me = (Mesh *)ob->data;
+
+ BMIter iter;
+ BMFace *f;
+
+ int cd_mdisp_off = CustomData_get_offset(&bm->ldata, CD_MDISPS);
+ int dimen = 0;
+
+ BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
+ BMLoop *l = f->l_first;
- MDisps *md = BM_ELEM_CD_GET_VOID_P(l, cd_mdisp_off);
++ MDisps *md = (MDisps *)BM_ELEM_CD_GET_VOID_P(l, cd_mdisp_off);
+ dimen = (int)floor(sqrt(md->totdisp) + 0.00001);
+ break;
+ }
+
+ if (!dimen) {
+ printf("multires_dump_grids_bmesh: error: corrupted multires data\n");
+ return NULL;
+ }
+
+ int totvert = bm->totloop * dimen * dimen;
+ int totface = bm->totloop * (dimen - 1) * (dimen - 1);
+ int totloop = totface * 4;
+
+ CustomData_free(&me->vdata, me->totvert);
+ CustomData_free(&me->edata, me->totedge);
+ CustomData_free(&me->fdata, me->totface);
+ CustomData_free(&me->ldata, me->totloop);
+ CustomData_free(&me->pdata, me->totpoly);
+
+ me->totvert = totvert;
+ me->totpoly = totface;
+ me->totloop = totloop;
+ me->totedge = totvert + totface;
+ me->totface = 0;
+ me->act_face = -1;
+
+ EdgeHash *eh = BLI_edgehash_new_ex("multires_dump_bmesh", me->totedge);
+
- MVert *mvert = me->totvert ?
- MEM_callocN(sizeof(MVert) * me->totvert, "multires_dump_grids_bmesh.vert") :
- NULL;
- MEdge *medge = me->totedge ?
- MEM_callocN(sizeof(MEdge) * me->totedge, "multires_dump_grids_bmesh.edge") :
- NULL;
- MLoop *mloop = me->totloop ?
- MEM_callocN(sizeof(MLoop) * me->totloop, "multires_dump_grids_bmesh.loop") :
- NULL;
- MPoly *mpoly = me->totpoly ?
- MEM_callocN(sizeof(MPoly) * me->totpoly, "multires_dump_grids_bmesh.poly") :
- NULL;
++ MVert *mvert = me->totvert ? (MVert *)MEM_callocN(sizeof(MVert) * me->totvert,
++ "multires_dump_grids_bmesh.vert") :
++ nullptr;
++ MEdge *medge = me->totedge ? (MEdge *)MEM_callocN(sizeof(MEdge) * me->totedge,
++ "multires_dump_grids_bmesh.edge") :
++ nullptr;
++ MLoop *mloop = me->totloop ? (MLoop *)MEM_callocN(sizeof(MLoop) * me->totloop,
++ "multires_dump_grids_bmesh.loop") :
++ nullptr;
++ MPoly *mpoly = me->totpoly ? (MPoly *)MEM_callocN(sizeof(MPoly) * me->totpoly,
++ "multires_dump_grids_bmesh.poly") :
++ nullptr;
+
+ me->cd_flag = 0;
+
- me->mvert = CustomData_add_layer(&me->vdata, CD_MVERT, CD_ASSIGN, mvert, me->totvert);
- me->medge = CustomData_add_layer(&me->edata, CD_MEDGE, CD_ASSIGN, medge, me->totedge);
- me->mloop = CustomData_add_layer(&me->ldata, CD_MLOOP, CD_ASSIGN, mloop, me->totloop);
- me->mpoly = CustomData_add_layer(&me->pdata, CD_MPOLY, CD_ASSIGN, mpoly, me->totpoly);
++ me->mvert = (MVert *)CustomData_add_layer(&me->vdata, CD_MVERT, CD_ASSIGN, mvert, me->totvert);
++ me->medge = (MEdge *)CustomData_add_layer(&me->edata, CD_MEDGE, CD_ASSIGN, medge, me->totedge);
++ me->mloop = (MLoop *)CustomData_add_layer(&me->ldata, CD_MLOOP, CD_ASSIGN, mloop, me->totloop);
++ me->mpoly = (MPoly *)CustomData_add_layer(&me->pdata, CD_MPOLY, CD_ASSIGN, mpoly, me->totpoly);
+
+ int loopi = 0;
+ int outli = 0;
+ int medi = 0;
+
+#define VINDEX(i, j) (loopi * dimen * dimen + ((j)*dimen + (i)))
+
+ // CustomData_daata_
+ BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
+ BMLoop *l = f->l_first;
+ do {
- MDisps *md = BM_ELEM_CD_GET_VOID_P(l, cd_mdisp_off);
++ MDisps *md = (MDisps *)BM_ELEM_CD_GET_VOID_P(l, cd_mdisp_off);
+
+ for (int i = 0; i < dimen; i++) {
+ for (int j = 0; j < dimen; j++) {
+ int vidx = loopi * dimen * dimen + (j * dimen + i);
+ int idx = j * dimen + i;
+ float *co = md->disps[idx];
+
+ MVert *mv = mvert + vidx;
+ copy_v3_v3(mv->co, co);
+ }
+ }
+
+ for (int i = 0; i < dimen - 1; i++) {
+ for (int j = 0; j < dimen - 1; j++) {
+ // do face
+ int fidx = loopi * (dimen - 1) * (dimen - 1) + (j * (dimen - 1) + i);
+ MPoly *mp = mpoly + fidx;
+
+ mp->totloop = 4;
+ mp->loopstart = outli;
+
+ MLoop *ml = mloop + outli;
+
+ ml[0].v = VINDEX(i, j);
+ ml[1].v = VINDEX(i, j + 1);
+ ml[2].v = VINDEX(i + 1, j + 1);
+ ml[3].v = VINDEX(i + 1, j);
+
+ for (int i2 = 0; i2 < 4; i2++) {
+ int a = ml[i2].v, b = ml[(i2 + 1) % 4].v;
+ int e;
+
+ if (!BLI_edgehash_haskey(eh, a, b)) {
+ BLI_edgehash_insert(eh, a, b, (void *)medi);
+ e = medi;
+
+ MEdge *med = medge + medi;
+
+ med->v1 = a;
+ med->v2 = b;
+
+ medi++;
+ }
+ else {
+ e = (int)BLI_edgehash_lookup(eh, a, b);
+ }
+
+ ml[i2].e = e;
+ }
+
+ outli += 4;
+ }
+ }
+
+ loopi++;
+ l = l->next;
+ } while (l != f->l_first);
+ }
+
+ for (int i = 0; i < me->totpoly; i++) {
+ if (!mpoly[i].totloop) {
+ printf("error 1! %d %d\n", i, me->totpoly);
+ }
+ if (mpoly[i].loopstart >= me->totloop) {
+ printf(
+ "error 2! %d %d l: %d totl: %d\n", i, me->totpoly, mpoly[i].loopstart, mpoly[i].totloop);
+ }
+ }
+
+ if (spaceset) {
+ BKE_multires_bmesh_space_set(bmob, bm, MULTIRES_SPACE_TANGENT);
+ }
+
+ BKE_mesh_calc_normals(me);
+
+ return ob;
+}
+
+//#define LIMIT_MAX_DISPLACEMENT
+
+static void multires_bmesh_space_set_cb(void *__restrict userdata,
+ const int pidx,
+ const TaskParallelTLS *__restrict UNUSED(tls))
+{
- MultiresThreadedData *tdata = userdata;
++ MultiresThreadedData *tdata = (MultiresThreadedData *)userdata;
+
+ int cd_mdisps_off = tdata->cd_mdisps_of
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list