[Bf-blender-cvs] [b4cc9b67fc7] sculpt-dev: sculpt-dev: Dyntopo collapse now works with new id system
Joseph Eagar
noreply at git.blender.org
Sat Jan 28 09:35:04 CET 2023
Commit: b4cc9b67fc7d4e0546d5606b94db8f4dccee7fea
Author: Joseph Eagar
Date: Sat Jan 28 00:34:05 2023 -0800
Branches: sculpt-dev
https://developer.blender.org/rBb4cc9b67fc7d4e0546d5606b94db8f4dccee7fea
sculpt-dev: Dyntopo collapse now works with new id system
. . .but subdivide is now broken.
===================================================================
M source/blender/blenkernel/intern/dyntopo.cc
M source/blender/blenkernel/intern/dyntopo_collapse.cc
M source/blender/bmesh/intern/bmesh_idmap.cc
M source/blender/bmesh/intern/bmesh_log.c
M source/blender/editors/sculpt_paint/sculpt_face_set.cc
===================================================================
diff --git a/source/blender/blenkernel/intern/dyntopo.cc b/source/blender/blenkernel/intern/dyntopo.cc
index 09c8acc393d..28e456c76a3 100644
--- a/source/blender/blenkernel/intern/dyntopo.cc
+++ b/source/blender/blenkernel/intern/dyntopo.cc
@@ -80,7 +80,6 @@ static void edge_queue_create_local(struct EdgeQueueContext *eq_ctx,
const bool use_projected,
PBVHTopologyUpdateMode local_mode);
-
BLI_INLINE void surface_smooth_v_safe(PBVH *pbvh, BMVert *v, float fac)
{
float co[3];
@@ -714,7 +713,7 @@ static float maskcb_get(EdgeQueueContext *eq_ctx, BMVert *v1, BMVert *v2)
return min_ff(w1, w2);
//}
- return (w1 + w2) * 0.5f;
+ // return (w1 + w2) * 0.5f;
}
return 1.0f;
@@ -1392,8 +1391,7 @@ bool check_face_is_tri(PBVH *pbvh, BMFace *f)
ATTR_NO_OPT bool destroy_nonmanifold_fins(PBVH *pbvh, BMEdge *e_root)
{
- return false;
-
+#if 0
bm_logstack_push();
static int max_faces = 64;
@@ -1436,7 +1434,6 @@ ATTR_NO_OPT bool destroy_nonmanifold_fins(PBVH *pbvh, BMEdge *e_root)
continue;
}
- void **val = nullptr;
BMFace *f2 = l->radial_next->f;
if (visit.add(f2)) {
@@ -1469,7 +1466,7 @@ ATTR_NO_OPT bool destroy_nonmanifold_fins(PBVH *pbvh, BMEdge *e_root)
return false;
}
- printf("manifold fin size: %d\n", minfs.size());
+ printf("manifold fin size: %d\n", (int)minfs.size());
const int tag = BM_ELEM_TAG_ALT;
for (int i = 0; i < minfs.size(); i++) {
@@ -1534,9 +1531,9 @@ ATTR_NO_OPT bool destroy_nonmanifold_fins(PBVH *pbvh, BMEdge *e_root)
}
pbvh_bmesh_face_remove(pbvh, f, true, false, false);
-#ifdef USE_NEW_IDMAP
+# ifdef USE_NEW_IDMAP
BM_idmap_release(pbvh->bm_idmap, (BMElem *)f, true);
-#endif
+# endif
BM_face_kill(pbvh->header.bm, f);
}
@@ -1547,9 +1544,9 @@ ATTR_NO_OPT bool destroy_nonmanifold_fins(PBVH *pbvh, BMEdge *e_root)
if (!e->l) {
BM_log_edge_removed(pbvh->bm_log, e);
-#ifdef USE_NEW_IDMAP
+# ifdef USE_NEW_IDMAP
BM_idmap_release(pbvh->bm_idmap, (BMElem *)e, true);
-#endif
+# endif
BM_edge_kill(pbvh->header.bm, e);
}
}
@@ -1561,9 +1558,9 @@ ATTR_NO_OPT bool destroy_nonmanifold_fins(PBVH *pbvh, BMEdge *e_root)
pbvh_bmesh_vert_remove(pbvh, v);
BM_log_vert_removed(pbvh->bm_log, v, pbvh->cd_vert_mask_offset);
-#ifdef USE_NEW_IDMAP
+# ifdef USE_NEW_IDMAP
BM_idmap_release(pbvh->bm_idmap, (BMElem *)v, true);
-#endif
+# endif
BM_vert_kill(pbvh->header.bm, v);
}
else {
@@ -1576,6 +1573,9 @@ ATTR_NO_OPT bool destroy_nonmanifold_fins(PBVH *pbvh, BMEdge *e_root)
bm_logstack_pop();
return true;
+#else
+ return false;
+#endif
}
bool check_for_fins(PBVH *pbvh, BMVert *v)
@@ -3192,16 +3192,6 @@ static void pbvh_split_edges(EdgeQueueContext *eq_ctx,
for (int i = 0; i < totedge; i++) {
BMEdge *e = edges[i];
-#if 0
- BMLoop *l = e->l;
- while (e->l) {
- BMFace *f = e->l->f;
- BM_log_face_removed(pbvh->bm_log, f);
- BKE_pbvh_bmesh_remove_face(pbvh, f, false);
- BM_idmap_release(pbvh->bm_idmap, (BMElem *)f, true);
- BM_face_kill(pbvh->header.bm, f);
- }
-#endif
check_vert_fan_are_tris(pbvh, e->v1);
check_vert_fan_are_tris(pbvh, e->v2);
}
@@ -3287,7 +3277,6 @@ static void pbvh_split_edges(EdgeQueueContext *eq_ctx,
BMFace *f = faces[i];
BMLoop *l = f->l_first;
- // pbvh_bmesh_face_remove(pbvh, f, true, false, false);
if (!ignore_isolated_edges) {
f->head.hflag |= SPLIT_TAG;
BM_log_face_pre(pbvh->bm_log, f);
diff --git a/source/blender/blenkernel/intern/dyntopo_collapse.cc b/source/blender/blenkernel/intern/dyntopo_collapse.cc
index 33ab9617891..029c8a873aa 100644
--- a/source/blender/blenkernel/intern/dyntopo_collapse.cc
+++ b/source/blender/blenkernel/intern/dyntopo_collapse.cc
@@ -47,6 +47,11 @@ using blender::Vector;
namespace blender::dyntopo {
+typedef struct TraceData {
+ PBVH *pbvh;
+ BMEdge *e;
+} TraceData;
+
// copied from decimate modifier code
inline bool bm_edge_collapse_is_degenerate_topology(BMEdge *e_first)
{
@@ -130,128 +135,6 @@ inline bool bm_edge_collapse_is_degenerate_topology(BMEdge *e_first)
return false;
}
-typedef struct TraceData {
- PBVH *pbvh;
- blender::Set<void *> visit;
- BMEdge *e;
-} TraceData;
-
-ATTR_NO_OPT void col_on_vert_kill(BMesh *bm, BMVert *v, void *userdata)
-{
- TraceData *data = (TraceData *)userdata;
- PBVH *pbvh = data->pbvh;
-
- if (BM_ELEM_CD_GET_INT(v, pbvh->cd_vert_node_offset) != DYNTOPO_NODE_NONE) {
- // printf("vert pbvh remove!\n");
- blender::dyntopo::pbvh_bmesh_vert_remove(pbvh, v);
- }
-
- if (!data->visit.add(static_cast<void *>(v))) {
- // printf("vert kill!\n");
- BM_log_vert_pre(pbvh->bm_log, v);
-#ifdef USE_NEW_IDMAP
- BM_idmap_release(pbvh->bm_idmap, reinterpret_cast<BMElem *>(v), true);
-#endif
- }
-}
-
-ATTR_NO_OPT void col_on_edge_kill(BMesh *bm, BMEdge *e, void *userdata)
-{
- TraceData *data = (TraceData *)userdata;
- PBVH *pbvh = data->pbvh;
-
- if (!data->visit.add(static_cast<void *>(e))) {
- // printf("edge kill!\n");
- BM_log_edge_pre(pbvh->bm_log, e);
-#ifdef USE_NEW_IDMAP
- BM_idmap_release(pbvh->bm_idmap, reinterpret_cast<BMElem *>(e), true);
-#endif
- }
-}
-
-ATTR_NO_OPT void col_on_face_kill(BMesh *bm, BMFace *f, void *userdata)
-{
- TraceData *data = (TraceData *)userdata;
- PBVH *pbvh = data->pbvh;
-
- if (BM_ELEM_CD_GET_INT(f, pbvh->cd_face_node_offset) != DYNTOPO_NODE_NONE) {
- pbvh_bmesh_face_remove(pbvh, f, false, false, false);
- }
-
- if (!data->visit.add(static_cast<void *>(f))) {
- BM_log_face_pre(pbvh->bm_log, f);
-#ifdef USE_NEW_IDMAP
- BM_idmap_release(pbvh->bm_idmap, reinterpret_cast<BMElem *>(f), true);
-#endif
- }
-}
-
-ATTR_NO_OPT static void collapse_restore_id(BMIdMap *idmap, BMElem *elem)
-{
- int id = BM_idmap_get_id(idmap, elem);
-
- if (id < 0 || id >= idmap->map_size || idmap->map[id]) {
- BM_idmap_alloc(idmap, elem);
- }
- else {
- BM_idmap_assign(idmap, elem, id);
- }
-}
-
-ATTR_NO_OPT void col_on_vert_add(BMesh *bm, BMVert *v, void *userdata)
-{
- TraceData *data = (TraceData *)userdata;
- PBVH *pbvh = data->pbvh;
-
- if (!data->visit.add(static_cast<void *>(v))) {
- // return;
- }
-
- pbvh_boundary_update_bmesh(pbvh, v);
-
- MSculptVert *mv = (MSculptVert *)BM_ELEM_CD_GET_VOID_P(v, data->pbvh->cd_sculpt_vert);
- mv->flag |= SCULPTVERT_NEED_VALENCE | SCULPTVERT_NEED_DISK_SORT;
-
- collapse_restore_id(pbvh->bm_idmap, (BMElem *)v);
- BM_log_vert_post(pbvh->bm_log, v);
-}
-
-ATTR_NO_OPT void col_on_edge_add(BMesh *bm, BMEdge *e, void *userdata)
-{
- TraceData *data = (TraceData *)userdata;
- PBVH *pbvh = data->pbvh;
-
- if (!data->visit.add(static_cast<void *>(e))) {
- // return;
- }
-
- collapse_restore_id(pbvh->bm_idmap, (BMElem *)e);
- BM_log_edge_post(pbvh->bm_log, e);
-}
-
-ATTR_NO_OPT void col_on_face_add(BMesh *bm, BMFace *f, void *userdata)
-{
- TraceData *data = (TraceData *)userdata;
- PBVH *pbvh = data->pbvh;
-
- if (!data->visit.add(static_cast<void *>(f))) {
- // return;
- }
-
- if (bm_elem_is_free((BMElem *)f, BM_FACE)) {
- printf("%s: error, f was freed!\n", __func__);
- return;
- }
-
- if (BM_ELEM_CD_GET_INT(f, pbvh->cd_face_node_offset) != DYNTOPO_NODE_NONE) {
- pbvh_bmesh_face_remove(pbvh, f, false, false, false);
- }
-
- collapse_restore_id(pbvh->bm_idmap, (BMElem *)f);
- BM_log_face_post(pbvh->bm_log, f);
- BKE_pbvh_bmesh_add_face(pbvh, f, false, false);
-}
-
/* Faces *outside* the ring region are tagged with facetag, used to detect
* border edges.
*/
@@ -382,31 +265,11 @@ ATTR_NO_OPT void vert_ring_do_apply(BMVert *v,
const int COLLAPSE_TAG = BM_ELEM_INTERNAL_TAG;
const int COLLAPSE_FACE_TAG = BM_ELEM_TAG_ALT;
-ATTR_NO_OPT static void vert_ring_do_old(BMVert *v,
- void (*callback)(BMElem *elem, void *userdata),
- void *userdata,
- int tag,
- int facetag,
- int depth)
-{
- if (!v->e) {
- v->head.hflag &= ~tag;
- callback((BMElem *)v, userdata);
- return;
- }
-
- vert_ring_do_tag(v, tag, facetag, depth);
- vert_ring_untag_inner_faces(v, tag, facetag, depth);
- vert_ring_do_apply(v, callback, userdata, tag, facetag, depth);
-}
-
ATTR_NO_OPT static void collapse_ring_callback_pre(BMElem *elem, void *userdata)
{
TraceData *data = static_cast<TraceData *>(userdata);
- if (!data->visit.add(static_cast<void *>(elem))) {
- return;
- }
+ BM_idmap_check_assign(data->pbvh->bm_idmap, elem);
switch (elem->head.htype) {
case BM_VERT: {
@@ -414,44 +277,74 @@ ATTR_NO_OPT static void collapse_ring_callback_pre(BMElem *elem, void *userdata)
BM_log_vert_removed(data->pbvh->bm_log, v, -1);
pbvh_bmesh_vert_remove(data->pbvh, v);
+ BM_idmap_release(data->pbvh->bm_idmap, elem, false);
break;
}
case BM_EDGE: {
BMEdge *e = reinterpret_cast<BMEdge *>(elem);
BM_log_edge_removed(data->pbvh->bm_log, e);
+ BM_idmap_release(data->pbvh->bm_idmap, elem, false);
break;
}
case BM_FACE: {
BMFace *f = reinterpret_cast<BMFace *>(elem);
BM_log_face_removed(data->pbvh->bm_log, f);
pbvh_bmesh_face_remove(data->pbvh, f, false, false, false);
+ BM_idmap_release(data->pbvh->bm_idmap, elem, false);
break;
}
}
}
-ATTR_NO_OPT static void collapse_ring_callback_post(BMElem *elem, void *userdata)
+ATTR_NO_OPT static void check_new_elem_id(BMElem *elem, TraceData *data)
{
- TraceData *data = static_cast<TraceData *>(userdata);
+ int id = BM_ELEM_CD_GET_INT(elem, data->pbvh->bm_idmap->cd_id_off[elem->head.htype]);
+ if (id >= 0) {
+ BMElem *existing = id < data->pbvh->bm_idmap->map_size ?
+ BM_idmap_lookup(data->pbvh->bm_idmap, id) :
+ nullptr;
+
+ if (existing) {
+ BM_idmap_release(data->pbvh->bm_idmap, existing, true);
+ }
- if (!data->visit.add(static_ca
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list