[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