[Bf-blender-cvs] [0502b0103ff] temp_bmesh_multires: Merge branch 'master' into temp_bmesh_multires
Joseph Eagar
noreply at git.blender.org
Sun Jul 11 11:23:34 CEST 2021
Commit: 0502b0103ffd074cee88c5614987537369b9d59e
Author: Joseph Eagar
Date: Sun Jul 11 05:23:24 2021 -0400
Branches: temp_bmesh_multires
https://developer.blender.org/rB0502b0103ffd074cee88c5614987537369b9d59e
Merge branch 'master' into temp_bmesh_multires
===================================================================
===================================================================
diff --cc release/datafiles/locale
index 78591466c33,4833954c0ac..1ab25ca4f20
--- a/release/datafiles/locale
+++ b/release/datafiles/locale
@@@ -1,1 -1,1 +1,1 @@@
- Subproject commit 78591466c335ab055e11729d8af814ce7ce6edc9
-Subproject commit 4833954c0ac85cc407e1d5a153aa11b1d1823ec0
++Subproject commit 1ab25ca4f208edc8fb6c3551b3050ce3ad50ad7c
diff --cc release/scripts/startup/bl_ui/space_view3d_toolbar.py
index cb2a7daf076,46fed79332d..713f4f0d4bb
--- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
@@@ -1013,8 -943,8 +1013,10 @@@ class VIEW3D_PT_sculpt_symmetry(Panel,
layout.separator()
++ import bpy
layout.prop(sculpt, "symmetrize_direction")
layout.operator("sculpt.symmetrize")
++ layout.prop(bpy.types.WindowManager.operator_properties_last("sculpt.symmetrize"), "merge_tolerance")
class VIEW3D_PT_sculpt_symmetry_for_topbar(Panel):
diff --cc source/blender/blenkernel/intern/pbvh_bmesh.c
index b99bbaeb62f,d3d7f02ecad..555b902365e
--- a/source/blender/blenkernel/intern/pbvh_bmesh.c
+++ b/source/blender/blenkernel/intern/pbvh_bmesh.c
@@@ -3572,1086 -1953,126 +3572,1086 @@@ void BKE_pbvh_build_bmesh(PBVH *pbvh
MEM_freeN(nodeinfo);
}
-/* Collapse short edges, subdivide long edges */
-bool BKE_pbvh_bmesh_update_topology(PBVH *pbvh,
- PBVHTopologyUpdateMode mode,
- const float center[3],
- const float view_normal[3],
- float radius,
- const bool use_frontface,
- const bool use_projected)
-{
- /* 2 is enough for edge faces - manifold edge */
- BLI_buffer_declare_static(BMLoop *, edge_loops, BLI_BUFFER_NOP, 2);
- BLI_buffer_declare_static(BMFace *, deleted_faces, BLI_BUFFER_NOP, 32);
- const int cd_vert_mask_offset = CustomData_get_offset(&pbvh->bm->vdata, CD_PAINT_MASK);
- const int cd_vert_node_offset = pbvh->cd_vert_node_offset;
- const int cd_face_node_offset = pbvh->cd_face_node_offset;
+/*
+static double last_update_time[128] = {
+ 0,
+};
+*/
+
+bool BKE_pbvh_bmesh_update_topology_nodes(PBVH *pbvh,
+ bool (*searchcb)(PBVHNode *node, void *data),
+ void (*undopush)(PBVHNode *node, void *data),
+ void *searchdata,
+ PBVHTopologyUpdateMode mode,
+ const float center[3],
+ const float view_normal[3],
+ float radius,
+ const bool use_frontface,
+ const bool use_projected,
+ int sym_axis,
+ bool updatePBVH,
+ DyntopoMaskCB mask_cb,
+ void *mask_cb_data)
+{
+ bool modified = false;
+
+ for (int i = 0; i < pbvh->totnode; i++) {
+ PBVHNode *node = pbvh->nodes + i;
+
+ if (!(node->flag & PBVH_Leaf) || !searchcb(node, searchdata)) {
+ continue;
+ }
+
+ if (node->flag & PBVH_Leaf) {
+ node->flag |= PBVH_UpdateCurvatureDir;
+ undopush(node, searchdata);
+
+ BKE_pbvh_node_mark_topology_update(pbvh->nodes + i);
+ }
+ }
+
+ modified = modified || BKE_pbvh_bmesh_update_topology(pbvh,
+ mode,
+ center,
+ view_normal,
+ radius,
+ use_frontface,
+ use_projected,
+ sym_axis,
+ updatePBVH,
+ mask_cb,
+ mask_cb_data);
+
+ return modified;
+}
+
+// this function is being buggy under clang's optimizer, at least on windows
+#ifdef __clang__
+# define CLANG_OPT_BUG __attribute__((optnone))
+#else
+# define CLANG_OPT_BUG
+#endif
+
+CLANG_OPT_BUG static bool cleanup_valence_3_4(PBVH *pbvh,
+ const float center[3],
+ const float view_normal[3],
+ float radius,
+ const bool use_frontface,
+ const bool use_projected)
+{
+ bool modified = false;
+
+ float radius2 = radius * 1.25;
+ float rsqr = radius2 * radius2;
+
+ GSet *vset = BLI_gset_ptr_new("vset");
+
+ for (int n = 0; n < pbvh->totnode; n++) {
+ PBVHNode *node = pbvh->nodes + n;
+
+ /* Check leaf nodes marked for topology update */
+ bool ok = (node->flag & PBVH_Leaf) && (node->flag & PBVH_UpdateTopology);
+ ok = ok && !(node->flag & (PBVH_FullyHidden | PBVH_Delete));
+
+ if (!ok) {
+ continue;
+ }
+
+ BMVert *v;
+
+ TGSET_ITER (v, node->bm_unique_verts) {
+ if (len_squared_v3v3(v->co, center) >= rsqr || !v->e) {
+ continue;
+ }
+
+ const int val = BM_vert_edge_count(v);
+ if (val != 4 && val != 3) {
+ continue;
+ }
+
+ BMIter iter;
+ BMLoop *l;
+ BMLoop *ls[4];
+ BMVert *vs[4];
+
+ l = v->e->l;
+
+ if (!l) {
+ continue;
+ }
+
+ if (l->v != v) {
+ l = l->next;
+ }
+
+ bool bad = false;
+ int i = 0;
+
+ for (int j = 0; j < val; j++) {
+ ls[i++] = l->v == v ? l->next : l;
+
+ l = l->prev->radial_next;
+
+ if (l->v != v) {
+ l = l->next;
+ }
+
+ if (l->radial_next == l || l->radial_next->radial_next != l) {
+ bad = true;
+ break;
+ }
+
+ for (int k = 0; k < j; k++) {
+ if (ls[k]->v == ls[j]->v) {
+ if (ls[j]->next->v != v) {
+ ls[j] = ls[j]->next;
+ }
+ else {
+ bad = true;
+ break;
+ }
+ }
+
+ if (ls[k]->f == ls[j]->f) {
+ bad = true;
+ break;
+ }
+ }
+ }
+
+ if (bad) {
+ continue;
+ }
+
+ BM_log_vert_removed(pbvh->bm_log, v, pbvh->cd_vert_mask_offset);
+ pbvh_bmesh_vert_remove(pbvh, v);
+
+ BMFace *f;
+ BM_ITER_ELEM (f, &iter, v, BM_FACES_OF_VERT) {
+ int ni2 = BM_ELEM_CD_GET_INT(f, pbvh->cd_face_node_offset);
+
+ if (ni2 != DYNTOPO_NODE_NONE) {
+ PBVHNode *node2 = pbvh->nodes + ni2;
+
+ // BLI_table_gset_remove(node2->bm_unique_verts, v, NULL);
+ // BLI_table_gset_remove(node2->bm_other_verts, v, NULL);
+
+ pbvh_bmesh_face_remove(pbvh, f, true, true);
+ }
+ }
+
+ modified = true;
+
+ l = v->e->l;
+
+ vs[0] = ls[0]->v;
+ vs[1] = ls[1]->v;
+ vs[2] = ls[2]->v;
+
+ BMFace *f1 = NULL;
+ if (vs[0] != vs[1] && vs[1] != vs[2] && vs[0] != vs[2]) {
+ f1 = pbvh_bmesh_face_create(pbvh, n, vs, NULL, l->f, false, false);
+ normal_tri_v3(
+ f1->no, f1->l_first->v->co, f1->l_first->next->v->co, f1->l_first->prev->v->co);
+ }
+ else {
+ // printf("eek1!\n");
+ }
+
+ if (val == 4 && vs[0] != vs[2] && vs[2] != vs[3] && vs[0] != vs[3]) {
+ vs[0] = ls[0]->v;
+ vs[1] = ls[2]->v;
+ vs[2] = ls[3]->v;
+
+ BMFace *f2 = pbvh_bmesh_face_create(pbvh, n, vs, NULL, v->e->l->f, false, false);
+
+ CustomData_bmesh_swap_data_simple(
+ &pbvh->bm->ldata, &f2->l_first->prev->head.data, &ls[3]->head.data);
+
+ CustomData_bmesh_copy_data(
+ &pbvh->bm->ldata, &pbvh->bm->ldata, ls[0]->head.data, &f2->l_first->head.data);
+ CustomData_bmesh_copy_data(
+ &pbvh->bm->ldata, &pbvh->bm->ldata, ls[2]->head.data, &f2->l_first->next->head.data);
+
+ normal_tri_v3(
+ f2->no, f2->l_first->v->co, f2->l_first->next->v->co, f2->l_first->prev->v->co);
+ BM_log_face_added(pbvh->bm_log, f2);
+ }
+
+ if (f1) {
+ CustomData_bmesh_swap_data_simple(
+ &pbvh->bm->ldata, &f1->l_first->head.data, &ls[0]->head.data);
+ CustomData_bmesh_swap_data_simple(
+ &pbvh->bm->ldata, &f1->l_first->next->head.data, &ls[1]->head.data);
+ CustomData_bmesh_swap_data_simple(
+ &pbvh->bm->ldata, &f1->l_first->prev->head.data, &ls[2]->head.data);
+
+ BM_log_face_added(pbvh->bm_log, f1);
+ }
+
+ BM_vert_kill(pbvh->bm, v);
+ }
+ TGSET_ITER_END
+ }
+
+ BLI_gset_free(vset, NULL);
+
+ if (modified) {
+ pbvh->bm->elem_index_dirty |= BM_VERT | BM_FACE | BM_EDGE;
+ pbvh->bm->elem_table_dirty |= BM_VERT | BM_FACE | BM_EDGE;
+ }
+
+ return modified;
+}
+
+/* Collapse short edges, subdivide long edges */
+bool BKE_pbvh_bmesh_update_topology(PBVH *pbvh,
+ PBVHTopologyUpdateMode mode,
+ const float center[3],
+ const float view_normal[3],
+ float radius,
+ const bool use_frontface,
+ const bool use_projected,
+ int sym_axis,
+ bool updatePBVH,
+ DyntopoMaskCB mask_cb,
+ void *mask_cb_data)
+{
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list