[Bf-blender-cvs] [19695109741] sculpt-dev: Sculpt: Minor bmesh refactor, made tool flags a CD layer
Joseph Eagar
noreply at git.blender.org
Mon Oct 4 09:10:43 CEST 2021
Commit: 196951097413d0de96e50e7616a62bec31171213
Author: Joseph Eagar
Date: Sun Oct 3 20:46:44 2021 -0700
Branches: sculpt-dev
https://developer.blender.org/rB196951097413d0de96e50e7616a62bec31171213
Sculpt: Minor bmesh refactor, made tool flags a CD layer
The way toolflags reallocated the entire mesh
just to add or remove one pointer from BMEdge/Vert/Face
was highly broken. Now a CD layer is used instead.
===================================================================
M source/blender/blenkernel/intern/customdata.c
M source/blender/blenkernel/intern/pbvh_bmesh.c
M source/blender/bmesh/bmesh_class.h
M source/blender/bmesh/intern/bmesh_construct.c
M source/blender/bmesh/intern/bmesh_core.c
M source/blender/bmesh/intern/bmesh_core.h
M source/blender/bmesh/intern/bmesh_interp.c
M source/blender/bmesh/intern/bmesh_mesh.c
M source/blender/bmesh/intern/bmesh_mesh_convert.c
M source/blender/bmesh/intern/bmesh_mesh_duplicate.c
M source/blender/bmesh/intern/bmesh_mods.c
M source/blender/bmesh/intern/bmesh_operator_api.h
M source/blender/bmesh/intern/bmesh_operator_api_inline.h
M source/blender/bmesh/intern/bmesh_operators.c
M source/blender/bmesh/intern/bmesh_private.h
M source/blender/bmesh/operators/bmo_dupe.c
M source/blender/bmesh/operators/bmo_removedoubles.c
M source/blender/editors/sculpt_paint/sculpt_face_set.c
M source/blender/makesdna/DNA_customdata_types.h
M source/blender/makesdna/DNA_meshdata_types.h
===================================================================
diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c
index dd66a4ccaf3..47735542f5f 100644
--- a/source/blender/blenkernel/intern/customdata.c
+++ b/source/blender/blenkernel/intern/customdata.c
@@ -1563,11 +1563,6 @@ static void layerDynTopoVert_interp(
mv->origmask = origmask;
}
-static void layerCopy_noop(const void *UNUSED(source), void *UNUSED(dest), int UNUSED(count))
-{
- // do nothing
-}
-
static void layerInterp_noop(const void **UNUSED(sources),
const float *UNUSED(weights),
const float *UNUSED(sub_weights),
@@ -1987,7 +1982,16 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = {
NULL, // flag singleton layer
layerDynTopoVert_copy,
NULL,
- layerDynTopoVert_interp}};
+ layerDynTopoVert_interp},
+ /*54 CD_BMESH_TOOLFLAGS */
+ {sizeof(MToolFlags),
+ "MToolFlags",
+ 1,
+ NULL, // flag singleton layer
+ NULL,
+ NULL,
+ layerInterp_noop},
+};
static const char *LAYERTYPENAMES[CD_NUMTYPES] = {
/* 0-4 */
@@ -3752,7 +3756,7 @@ void CustomData_bmesh_do_versions_update_active_layers(CustomData *fdata, Custom
void CustomData_bmesh_init_pool(CustomData *data, int totelem, const char htype)
{
- return CustomData_bmesh_init_pool_ex(data, totelem, htype, __func__);
+ CustomData_bmesh_init_pool_ex(data, totelem, htype, __func__);
}
void CustomData_bmesh_init_pool_ex(CustomData *data,
@@ -3928,7 +3932,7 @@ void CustomData_bmesh_free_block_data(CustomData *data, void *block)
}
}
-static void CustomData_bmesh_alloc_block(CustomData *data, void **block)
+ATTR_NO_OPT static void CustomData_bmesh_alloc_block(CustomData *data, void **block)
{
if (*block) {
CustomData_bmesh_free_block(data, block);
@@ -3936,6 +3940,18 @@ static void CustomData_bmesh_alloc_block(CustomData *data, void **block)
if (data->totsize > 0) {
*block = BLI_mempool_alloc(data->pool);
+
+ /*clear toolflags pointer when created for the first time*/
+ int cd_tflags = data->typemap[CD_TOOLFLAGS];
+ if (cd_tflags != -1) {
+ cd_tflags = data->layers[cd_tflags].offset;
+
+ char *ptr = (char *)*block;
+ ptr += cd_tflags;
+
+ MToolFlags *flags = (MToolFlags *)ptr;
+ flags->flag = NULL;
+ }
}
else {
*block = NULL;
@@ -3968,15 +3984,14 @@ void CustomData_bmesh_free_block_data_exclude_by_type(CustomData *data,
static void CustomData_bmesh_set_default_n(CustomData *data, void **block, int n)
{
- int offset = data->layers[n].offset;
- const LayerTypeInfo *typeInfo = layerType_getInfo(data->layers[n].type);
-
- /* can't allow this to be called on CD_MESH_ID */
-
- if (data->layers[n].type == CD_MESH_ID) {
+ if (ELEM(data->layers[n].type, CD_TOOLFLAGS, CD_MESH_ID)) {
+ /* do not do toolflags or mesh ids */
return;
}
+ int offset = data->layers[n].offset;
+ const LayerTypeInfo *typeInfo = layerType_getInfo(data->layers[n].type);
+
if (typeInfo->set_default) {
typeInfo->set_default(POINTER_OFFSET(*block, offset), 1);
}
@@ -3985,9 +4000,9 @@ static void CustomData_bmesh_set_default_n(CustomData *data, void **block, int n
}
}
-void CustomData_bmesh_set_default(CustomData *data, void **block)
+ATTR_NO_OPT void CustomData_bmesh_set_default(CustomData *data, void **block)
{
- if (*block == NULL) {
+ if (!*block) {
CustomData_bmesh_alloc_block(data, block);
}
@@ -4005,15 +4020,30 @@ void CustomData_bmesh_swap_data_simple(CustomData *data, void **block1, void **b
*block1 = *block2;
*block2 = tmp;
+ int cd_tflags = data->typemap[CD_TOOLFLAGS];
+ cd_tflags = cd_tflags != -1 ? data->layers[cd_tflags].offset : -1;
+
// unswap ids if they exist
- if (cd_id != -1 && *block1 && *block2) {
- int itmp;
- int *id1 = (int *)(((char *)*block1) + cd_id);
- int *id2 = (int *)(((char *)*block2) + cd_id);
+ if (*block1 && *block2) {
+ if (cd_id != -1) {
+ int itmp;
+ int *id1 = (int *)(((char *)*block1) + cd_id);
+ int *id2 = (int *)(((char *)*block2) + cd_id);
+
+ itmp = *id1;
+ *id1 = *id2;
+ *id2 = itmp;
+ }
+
+ if (cd_tflags != -1) {
+ MToolFlags tmp;
+ MToolFlags *flags1 = (MToolFlags *)(((char *)*block1) + cd_tflags);
+ MToolFlags *flags2 = (MToolFlags *)(((char *)*block2) + cd_tflags);
- itmp = *id1;
- *id1 = *id2;
- *id2 = itmp;
+ tmp = *flags1;
+ *flags1 = *flags2;
+ *flags2 = tmp;
+ }
}
}
@@ -4044,8 +4074,8 @@ void CustomData_bmesh_swap_data(CustomData *source,
dest_i_start++;
}
- if (source->layers[src_i].type == CD_MESH_ID) {
- // do not swap ids
+ if (ELEM(source->layers[src_i].type, CD_MESH_ID, CD_TOOLFLAGS)) {
+ // do not swap ids or toolflags
continue;
}
@@ -4096,6 +4126,14 @@ void CustomData_bmesh_copy_data_exclude_by_type(const CustomData *source,
* would cause too much duplicate code, so add a check instead. */
const bool no_mask = (mask_exclude == 0);
+ /*
+ Note that we don't handle id/toolflag layers specially here,
+ instead relying on CD_ELEM_NO_COPY semantics.
+
+ This is so BM_data_layer_add can reallocate customdata blocks without
+ zeroing those two layers.
+ */
+
if (*dest_block == NULL) {
CustomData_bmesh_alloc_block(dest, dest_block);
if (*dest_block) {
@@ -4135,6 +4173,9 @@ void CustomData_bmesh_copy_data_exclude_by_type(const CustomData *source,
/* if we found a matching layer, copy the data */
if (STREQ(dest->layers[dest_i].name, source->layers[src_i].name)) {
if (no_mask || ((CD_TYPE_AS_MASK(dest->layers[dest_i].type) & mask_exclude) == 0)) {
+ /* CD_FLAG_ELEM_NOCOPY is used to forcibly exclude copying CD_MESH_ID and CD_TOOLFLAGS
+ layers */
+
if (dest->layers[dest_i].flag & CD_FLAG_ELEM_NOCOPY) {
break;
}
@@ -4463,6 +4504,12 @@ void CustomData_bmesh_interp(CustomData *data,
for (int i = 0; i < data->totlayer; i++) {
CustomDataLayer *layer = &data->layers[i];
const LayerTypeInfo *typeInfo = layerType_getInfo(layer->type);
+
+ // ignore id and toolflag layers
+ if (ELEM(layer->type, CD_MESH_ID, CD_TOOLFLAGS)) {
+ continue;
+ }
+
if (typeInfo->interp) {
for (int j = 0; j < count; j++) {
sources[j] = POINTER_OFFSET(src_blocks[j], layer->offset);
diff --git a/source/blender/blenkernel/intern/pbvh_bmesh.c b/source/blender/blenkernel/intern/pbvh_bmesh.c
index 58b3a3ffde0..ce25fb8780c 100644
--- a/source/blender/blenkernel/intern/pbvh_bmesh.c
+++ b/source/blender/blenkernel/intern/pbvh_bmesh.c
@@ -5348,13 +5348,40 @@ ATTR_NO_OPT void BKE_pbvh_bmesh_from_saved_indices(PBVH *pbvh)
BLI_array_free(ltable);
}
+extern char dyntopop_node_idx_layer_id[];
+extern char dyntopop_faces_areas_layer_id[];
+
+static void pbvh_bmesh_fetch_cdrefs(PBVH *pbvh)
+{
+ BMesh *bm = pbvh->bm;
+
+ int idx = CustomData_get_named_layer_index(
+ &bm->vdata, CD_PROP_INT32, dyntopop_node_idx_layer_id);
+ pbvh->cd_vert_node_offset = bm->vdata.layers[idx].offset;
+
+ idx = CustomData_get_named_layer_index(&bm->pdata, CD_PROP_INT32, dyntopop_node_idx_layer_id);
+ pbvh->cd_face_node_offset = bm->pdata.layers[idx].offset;
+
+ idx = CustomData_get_named_layer_index(&bm->pdata, CD_PROP_FLOAT, dyntopop_faces_areas_layer_id);
+ pbvh->cd_face_area = bm->pdata.layers[idx].offset;
+
+ pbvh->cd_vert_mask_offset = CustomData_get_offset(&bm->vdata, CD_PAINT_MASK);
+ pbvh->cd_vcol_offset = CustomData_get_offset(&bm->vdata, CD_PROP_COLOR);
+ pbvh->cd_faceset_offset = CustomData_get_offset(&bm->pdata, CD_SCULPT_FACE_SETS);
+ pbvh->cd_dyn_vert = CustomData_get_offset(&bm->vdata, CD_DYNTOPO_VERT);
+}
+
void BKE_pbvh_bmesh_set_toolflags(PBVH *pbvh, bool use_toolflags)
{
if (use_toolflags == pbvh->bm->use_toolflags) {
return;
}
- BKE_pbvh_bmesh_save_indices(pbvh);
+ // BKE_pbvh_bmesh_save_indices(pbvh);
BM_mesh_toolflags_set(pbvh->bm, use_toolflags);
- BKE_pbvh_bmesh_from_saved_indices(pbvh);
+
+ // customdata layout might've changed
+ pbvh_bmesh_fetch_cdrefs(pbvh);
+
+ // BKE_pbvh_bmesh_from_saved_indices(pbvh);
}
diff --git a/source/blender/bmesh/bmesh_class.h b/source/blender/bmesh/bmesh_class.h
index c687896dfd8..94e89ab32e4 100644
--- a/source/blender/bmesh/bmesh_class.h
+++ b/source/blender/bmesh/bmesh_class.h
@@ -114,10 +114,9 @@ typedef struct BMVert {
struct BMEdge *e;
} BMVert;
-typedef struct BMVert_OFlag {
- BMVert base;
- struct BMFlagLayer *oflags;
-} BMVert_OFlag;
+#define BMVert_OFlag BMVert
+#define BMEdge_OFlag BMEdge
+#define BMFace_OFlag BMFace
/* disk link structure, only used by edges */
typedef struct BMDiskLink {
@@ -153,11 +152,6 @@ typedef struct BMEdge {
BMDiskLink v1_disk_link, v2_disk_link;
} BMEdge;
-typedef struct BMEdge_OFlag {
- BMEdge base;
- struct BMFlagLayer *oflags;
-} BMEdge_OFlag;
-
typedef struct BMLoop {
BMHeader head;
/* notice no flags layer */
@@ -287,11 +281,6 @@ typedef struct BMFace {
// short _pad[3];
} BMFace;
-typedef struct BMFace_OFlag {
- BMFace base;
- struct BMFlagLayer *oflags;
-} BMFace_OFlag;
-
typedef struct BMFlagLayer {
short f; /* flags */
} BMFlagLayer;
diff --git a/source/blender/bmesh/intern/bmesh_construct.c b/source/blender/bmesh/intern/bmesh_construct.c
index 80d6331df88..af53abc4ca5 100644
--- a/source/blender/bmesh/intern/bmesh_construct.c
+++ b/source/blender/bmesh/intern/bmesh_construct.c
@@ -795,28 +795,28 @@ void BM_elem_attrs_copy_ex(BMesh *bm_src,
bm_dst,
(const BMVert *)ele_src,
(BMVert *)ele_dst,
- cd_mask_exclude | CD_MASK_MESH_ID);
+ cd_mask_exclude | CD_MASK_MESH_ID | CD_MASK_TOOLFLAGS);
break;
case BM_EDGE:
bm_edge_attrs_copy(bm_src,
bm_dst,
(const BMEdge *)ele_src,
(BMEdge *)ele_dst,
- cd_mask_exclude | CD_MASK_MESH_ID);
+ cd_mask_exclude | CD_MASK_MESH_ID | CD_MASK_TOOLFLAGS);
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list