[Bf-blender-cvs] [12f87d02c68] temp_bmesh_multires: commit prior to small cleanup
Joseph Eagar
noreply at git.blender.org
Fri Aug 27 11:01:26 CEST 2021
Commit: 12f87d02c686c7d35dc3f2f02b2bf28e81106dd0
Author: Joseph Eagar
Date: Wed Aug 25 03:01:56 2021 -0700
Branches: temp_bmesh_multires
https://developer.blender.org/rB12f87d02c686c7d35dc3f2f02b2bf28e81106dd0
commit prior to small cleanup
===================================================================
M source/blender/blenkernel/intern/dyntopo.c
M source/blender/blenkernel/intern/pbvh.c
M source/blender/blenkernel/intern/pbvh_bmesh.c
M source/blender/blenkernel/intern/pbvh_intern.h
M source/blender/editors/sculpt_paint/sculpt_intern.h
M source/blender/gpu/intern/gpu_buffers.c
===================================================================
diff --git a/source/blender/blenkernel/intern/dyntopo.c b/source/blender/blenkernel/intern/dyntopo.c
index 22852e2d163..991a01b87e7 100644
--- a/source/blender/blenkernel/intern/dyntopo.c
+++ b/source/blender/blenkernel/intern/dyntopo.c
@@ -2823,11 +2823,12 @@ cleanup_valence_3_4(EdgeQueueContext *ectx,
int ni = BM_ELEM_CD_GET_INT(v, pbvh->cd_vert_node_offset);
if (ni >= 0 && BLI_table_gset_haskey(pbvh->nodes[ni].bm_other_verts, v)) {
- printf("error! %d\n", (int)BLI_table_gset_haskey(pbvh->nodes[ni].bm_unique_verts, v));
+ printf("cleanup_valence_3_4 error! %d\n",
+ (int)BLI_table_gset_haskey(pbvh->nodes[ni].bm_unique_verts, v));
BLI_table_gset_remove(pbvh->nodes[ni].bm_other_verts, v, NULL);
}
else if (ni < 0) {
- printf("error!\n");
+ printf("cleanup_valence_3_4 error!\n");
// attempt to recover
@@ -3055,8 +3056,13 @@ bool BKE_pbvh_bmesh_update_topology(PBVH *pbvh,
}
# endif
+ float brusharea = radius / (pbvh->bm_min_edge_len * 0.5f + pbvh->bm_max_edge_len * 0.5f);
+ brusharea = brusharea * brusharea * M_PI;
+
int max_steps = (int)((float)DYNTOPO_MAX_ITER * ratio);
+ printf("max_steps %d\n", max_steps);
+
pbvh_bmesh_check_nodes(pbvh);
modified |= pbvh_bmesh_collapse_short_edges(&eq_ctx, pbvh, &deleted_faces, max_steps);
pbvh_bmesh_check_nodes(pbvh);
@@ -3078,7 +3084,7 @@ bool BKE_pbvh_bmesh_update_topology(PBVH *pbvh,
long_edge_queue_create(
&eq_ctx, pbvh, center, view_normal, radius, use_frontface, use_projected);
-# ifdef SKINNY_EDGE_FIX
+# if 0 /// def SKINNY_EDGE_FIX
// prevent remesher thrashing by throttling edge splitting in pathological case of skinny edges
float avg_elen = eq_ctx.avg_elen;
if (eq_ctx.totedge > 0.0f) {
@@ -3091,13 +3097,22 @@ bool BKE_pbvh_bmesh_update_topology(PBVH *pbvh,
if (avg_elen > 0.0f) {
ratio = (pbvh->bm_max_edge_len * 0.5 + emin * 0.5) / avg_elen;
- ratio = MAX2(ratio, 0.05f);
+ ratio = MAX2(ratio, 0.75f);
ratio = MIN2(ratio, 1.0f);
}
}
+# else
+ ratio = 1.0f;
# endif
+ float brusharea = radius / (pbvh->bm_min_edge_len * 0.5f + pbvh->bm_max_edge_len * 0.5f);
+ brusharea = brusharea * brusharea * M_PI;
+
int max_steps = (int)((float)DYNTOPO_MAX_ITER * ratio);
+ max_steps = (int)(brusharea * ratio * 1.0f);
+
+ printf("brusharea: %.2f, ratio: %.2f\n", brusharea, ratio);
+ printf("max_steps %d\n", max_steps);
pbvh_bmesh_check_nodes(pbvh);
modified |= pbvh_bmesh_subdivide_long_edges(&eq_ctx, pbvh, &edge_loops, max_steps);
@@ -3347,7 +3362,7 @@ static const int splitmap[43][16] = {
{6, -1, 3, -1, 5, -1, 1, -1}, // 42
};
-static void pbvh_split_edges(PBVH *pbvh, BMesh *bm, BMEdge **edges, int totedge)
+ATTR_NO_OPT static void pbvh_split_edges(PBVH *pbvh, BMesh *bm, BMEdge **edges, int totedge)
{
BMFace **faces = NULL;
BLI_array_staticdeclare(faces, 512);
@@ -3388,7 +3403,7 @@ static void pbvh_split_edges(PBVH *pbvh, BMesh *bm, BMEdge **edges, int totedge)
l2->v->head.hflag &= ~SPLIT_TAG;
MDynTopoVert *mv = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, l2->v);
- mv->flag |= DYNVERT_NEED_VALENCE;
+ mv->flag |= DYNVERT_NEED_VALENCE | DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_DISK_SORT;
} while ((l2 = l2->next) != l->f->l_first);
l->f->head.hflag &= ~SPLIT_TAG;
@@ -3419,7 +3434,8 @@ static void pbvh_split_edges(PBVH *pbvh, BMesh *bm, BMEdge **edges, int totedge)
BMFace *f = faces[i];
BMLoop *l = f->l_first;
- pbvh_bmesh_face_remove(pbvh, f, true, false, false);
+ // pbvh_bmesh_face_remove(pbvh, f, true, false, false);
+ BM_log_face_removed(pbvh->bm_log, f);
int mask = 0;
int j = 0;
@@ -3450,9 +3466,45 @@ static void pbvh_split_edges(PBVH *pbvh, BMesh *bm, BMEdge **edges, int totedge)
MDynTopoVert *mv = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, newv);
newv->head.hflag |= SPLIT_TAG;
- mv->flag |= DYNVERT_NEED_VALENCE;
+ mv->flag |= DYNVERT_NEED_VALENCE | DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_DISK_SORT;
+
+# if 1
+ int ni = BM_ELEM_CD_GET_INT(e->v1, pbvh->cd_vert_node_offset);
+
+ if (ni == DYNTOPO_NODE_NONE) {
+ ni = BM_ELEM_CD_GET_INT(e->v2, pbvh->cd_vert_node_offset);
+ }
+
+ if (ni != DYNTOPO_NODE_NONE) {
+ PBVHNode *node = pbvh->nodes + ni;
+
+ BLI_table_gset_add(node->bm_unique_verts, newv);
+ BMIter iter;
+ BMFace *f;
+
+# if 0
+ BM_ITER_ELEM (f, &iter, newv, BM_FACES_OF_VERT) {
+ int ni2 = BM_ELEM_CD_GET_INT(f, pbvh->cd_face_node_offset);
+
+ if (ni != ni2 && ni2 != DYNTOPO_NODE_NONE) {
+ PBVHNode *node2 = pbvh->nodes + ni2;
+
+ BLI_table_gset_add(node2->bm_other_verts, newv);
+ }
+ }
+# endif
+
+ BM_ELEM_CD_SET_INT(newv, pbvh->cd_vert_node_offset, ni);
+ }
+ else {
+ BM_ELEM_CD_SET_INT(newv, pbvh->cd_vert_node_offset, DYNTOPO_NODE_NONE);
+ printf("eek!");
+ }
+# else
BM_ELEM_CD_SET_INT(newv, pbvh->cd_vert_node_offset, DYNTOPO_NODE_NONE);
+# endif
+
BM_log_vert_added(pbvh->bm_log, newv, pbvh->cd_vert_mask_offset);
}
@@ -3460,6 +3512,8 @@ static void pbvh_split_edges(PBVH *pbvh, BMesh *bm, BMEdge **edges, int totedge)
BMFace *f = faces[i];
int mask = 0;
+ int ni = BM_ELEM_CD_GET_INT(f, pbvh->cd_face_node_offset);
+
BMLoop *l = f->l_first;
int j = 0;
do {
@@ -3524,6 +3578,20 @@ static void pbvh_split_edges(PBVH *pbvh, BMesh *bm, BMEdge **edges, int totedge)
BMFace *newf = BM_face_split(bm, f2, l1, l2, &rl, NULL, false);
if (newf) {
+ bool ok = ni != DYNTOPO_NODE_NONE;
+ ok = ok && BM_ELEM_CD_GET_INT(v1, pbvh->cd_vert_node_offset) != DYNTOPO_NODE_NONE;
+ ok = ok && BM_ELEM_CD_GET_INT(v2, pbvh->cd_vert_node_offset) != DYNTOPO_NODE_NONE;
+
+ if (ok) {
+ PBVHNode *node = pbvh->nodes + ni;
+
+ BLI_table_gset_add(node->bm_faces, newf);
+ BM_ELEM_CD_SET_INT(newf, pbvh->cd_face_node_offset, ni);
+ }
+ else {
+ BM_ELEM_CD_SET_INT(newf, pbvh->cd_face_node_offset, DYNTOPO_NODE_NONE);
+ }
+
newfaces[count++] = newf;
f2 = newf;
}
@@ -3534,10 +3602,50 @@ static void pbvh_split_edges(PBVH *pbvh, BMesh *bm, BMEdge **edges, int totedge)
}
for (j = 0; j < count; j++) {
- BKE_pbvh_bmesh_add_face(pbvh, newfaces[j], true, false);
+ if (BM_ELEM_CD_GET_INT(newfaces[j], pbvh->cd_face_node_offset) == DYNTOPO_NODE_NONE) {
+ BKE_pbvh_bmesh_add_face(pbvh, newfaces[j], false, true);
+ }
+ else {
+ BMFace *f = newfaces[j];
+ if (f->len != 3) {
+ printf("eek! f->len was not 3! len: %d\n", f->len);
+ }
+
+ // add face verts to bm_other_verts
+
+ int lastni2 = -1;
+
+ BMLoop *l = f->l_first;
+ do {
+ BMEdge *e = l->v->e;
+
+ do {
+ BMLoop *l2 = e->l;
+ do {
+ int ni = BM_ELEM_CD_GET_INT(l->v, pbvh->cd_vert_node_offset);
+ int ni2 = BM_ELEM_CD_GET_INT(l2->f, pbvh->cd_face_node_offset);
+
+ if (ni2 != ni && ni2 != lastni2 && ni2 != DYNTOPO_NODE_NONE) {
+ PBVHNode *node = pbvh->nodes + ni2;
+
+ BLI_table_gset_add(node->bm_other_verts, l->v);
+ lastni2 = ni2;
+ }
+ } while ((l2 = l2->radial_next) != e->l);
+
+ e = l->v == e->v1 ? e->v1_disk_link.next : e->v2_disk_link.next;
+ } while (e != l->v->e);
+ } while ((l = l->next) != f->l_first);
+ }
+
+ BM_log_face_added(pbvh->bm_log, newfaces[j]);
}
- BKE_pbvh_bmesh_add_face(pbvh, f, true, false);
+ if (BM_ELEM_CD_GET_INT(f, pbvh->cd_face_node_offset) == DYNTOPO_NODE_NONE) {
+ BKE_pbvh_bmesh_add_face(pbvh, f, false, true);
+ }
+
+ BM_log_face_added(pbvh->bm_log, f);
}
BLI_array_free(faces);
diff --git a/source/blender/blenkernel/intern/pbvh.c b/source/blender/blenkernel/intern/pbvh.c
index ebfd85b4658..0c604daa0f3 100644
--- a/source/blender/blenkernel/intern/pbvh.c
+++ b/source/blender/blenkernel/intern/pbvh.c
@@ -81,6 +81,27 @@ void BB_reset(BB *bb)
bb->bmax[0] = bb->bmax[1] = bb->bmax[2] = -FLT_MAX;
}
+void BB_intersect(BB *r_out, BB *a, BB *b)
+{
+ for (int i = 0; i < 3; i++) {
+ r_out->bmin[i] = max_ff(a->bmin[i], b->bmin[i]);
+ r_out->bmax[i] = min_ff(a->bmax[i], b->bmax[i]);
+
+ if (r_out->bmax[i] < r_out->bmin[i]) {
+ r_out->bmax[i] = r_out->bmin[i] = 0.0f;
+ }
+ }
+}
+
+float BB_volume(const BB *bb)
+{
+ float dx = bb->bmax[0] - bb->bmin[0];
+ float dy = bb->bmax[1] - bb->bmin[1];
+ float dz = bb->bmax[2] - bb->bmin[2];
+
+ return dx * dy * dz;
+}
+
/* Expand the bounding box to include a new coordinate */
void BB_expand(BB *bb, const float co[3])
{
diff --git a/source/blender/blenkernel/intern/pbvh_bmesh.c b/source/blender/blenkernel/intern/pbvh_bmesh.c
index e57c6f631d8..341e1cf61c5 100644
--- a/source/blender/blenkernel/intern/pbvh_bmesh.c
+++ b/source/blender/blenkernel/intern/pbvh_bmesh.c
@@ -170,6 +170,12 @@ void pbvh_bmesh_check_nodes(PBVH *pbvh)
TGSET_ITER (f, node->bm_faces) {
if (!f || f->head.htype != BM_FACE) {
printf("corruption in pbvh! bm_faces\n");
+ continue;
+ }
+
+ int ni = BM_ELEM_CD_GET_INT(f, pbvh->cd_face_node_offset);
+ if (pbvh->nodes + ni != node) {
+ printf("face in multiple nodes!\n");
}
}
TGSET_ITER_END;
@@ -596,7 +602,7 @@ void bke_pbvh_insert_face(PBVH *pbvh, struct BMFace *f)
}
if (ni < 0 || !(pbvh->nodes[ni].flag & PBVH_Leaf)) {
- fprintf(stderr, "pbvh error!\n");
+ fprintf(stderr, "pbvh error! failed to find node to insert face into!\n");
fflush(stderr);
return;
}
@@ -1422,10 +1428,7 @@ void bke_pbvh_update_vert_boundary(int cd_dyn_vert, int cd_faceset_offset, BMVer
e = e->v1 == v ? e->v1_disk_link.next : e->v2_disk_link.next;
} while (e != v->e);
- if (fset1 && fset2) {
- mv->flag |= DYNVERT_FSET_BOUNDARY;
- }
-
+#if 0
if (fset2 && !fset3) {
int n = MIN2(fset1_count, fset2_count);
float max
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list