Commit: 924b13b03a78315aa380dce358e4c042cc24a8b4 Author: Joseph Eagar Date: Sun Mar 21 16:26:38 2021 -0700 Branches: temp_bmesh_multires https://developer.blender.org/rB924b13b03a78315aa380dce358e4c042cc24a8b4
* Added a new CustomData type for dyntopo vertex data: MDynTopoVert. It stores: - Original coordiates, colors and mask (which were previously four seperate layers). - A bitmask with (currently) one bitflag, whether or not a vertex is on a boundary. I needed to cache calculating vertex boundary state (which involves iterating over the edges surrounding a vertex) and got fed up with having so many CD layers for dyntopo. This struct consolidates them and saves having yet another layer just to store a flag. =================================================================== M source/blender/blenkernel/BKE_paint.h M source/blender/blenkernel/BKE_pbvh.h M source/blender/blenkernel/intern/customdata.c M source/blender/blenkernel/intern/paint.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/bmesh/intern/bmesh_log.c M source/blender/bmesh/intern/bmesh_log.h M source/blender/editors/sculpt_paint/paint_image_proj.c M source/blender/editors/sculpt_paint/sculpt.c M source/blender/editors/sculpt_paint/sculpt_dyntopo.c M source/blender/editors/sculpt_paint/sculpt_undo.c M source/blender/makesdna/DNA_brush_enums.h M source/blender/makesdna/DNA_customdata_types.h M source/blender/makesdna/DNA_meshdata_types.h =================================================================== diff --git a/source/blender/blenkernel/BKE_paint.h b/source/blender/blenkernel/BKE_paint.h index 3e5bf2570a6..41c58bc5469 100644 --- a/source/blender/blenkernel/BKE_paint.h +++ b/source/blender/blenkernel/BKE_paint.h @@ -495,6 +495,7 @@ typedef struct SculptSession { /* BMesh for dynamic topology sculpting */ struct BMesh *bm; + int cd_dyn_vert; int cd_vert_node_offset; int cd_face_node_offset; int cd_vcol_offset; @@ -617,7 +618,7 @@ typedef struct SculptSession { * Set #Main.is_memfile_undo_flush_needed when enabling. */ char needs_flush_to_id; - + char update_boundary_info_bmesh; } SculptSession; void BKE_sculptsession_free(struct Object *ob); diff --git a/source/blender/blenkernel/BKE_pbvh.h b/source/blender/blenkernel/BKE_pbvh.h index 1aff28813a8..fddc6a06bfc 100644 --- a/source/blender/blenkernel/BKE_pbvh.h +++ b/source/blender/blenkernel/BKE_pbvh.h @@ -224,15 +224,11 @@ void BKE_pbvh_build_bmesh(PBVH *pbvh, struct BMLog *log, const int cd_vert_node_offset, const int cd_face_node_offset, - const int cd_origco_offset, - const int cd_origno_offset, - const int cd_origvcol_offset); + const int cd_dyn_vert); void BKE_pbvh_update_offsets(PBVH *pbvh, const int cd_vert_node_offset, const int cd_face_node_offset, - const int cd_origco_offset, - const int cd_origno_offset, - const int cd_origvcol_offset); + const int cd_dyn_vert); void BKE_pbvh_free(PBVH *pbvh); /** update original data, only data whose r_** parameters are passed in will be updated*/ @@ -496,6 +492,7 @@ typedef struct PBVHVertexIter { struct TableGSet *bm_unique_verts, *bm_other_verts; struct CustomData *bm_vdata; + int cd_dyn_vert; int cd_vert_mask_offset; int cd_vcol_offset; @@ -511,12 +508,17 @@ typedef struct PBVHVertexIter { bool visible; } PBVHVertexIter; +#define BKE_PBVH_DYNVERT(cd_dyn_vert, v) ((MDynTopoVert *)BM_ELEM_CD_GET_VOID_P(v, cd_dyn_vert)) + void pbvh_vertex_iter_init(PBVH *pbvh, PBVHNode *node, PBVHVertexIter *vi, int mode); -#define BKE_pbvh_vertex_iter_begin(pbvh, node, vi, mode) \ - pbvh_vertex_iter_init(pbvh, node, &vi, mode); \ -\ - for (vi.i = 0, vi.g = 0; vi.g < vi.totgrid; vi.g++) { \ +#if 0 +# include "../bmesh/bmesh.h" +# include "DNA_meshdata_types.h" + +# define BKE_pbvh_vertex_iter_begin(pbvh, node, vi, mode) \ + pbvh_vertex_iter_init(pbvh, node, &vi, mode); \ + vi.i = vi.g = 0; \ if (vi.grids) { \ vi.width = vi.gridsize; \ vi.height = vi.gridsize; \ @@ -530,87 +532,203 @@ void pbvh_vertex_iter_init(PBVH *pbvh, PBVHNode *node, PBVHVertexIter *vi, int m vi.width = vi.totvert; \ vi.height = 1; \ } \ + while (BKE_pbvh_vertex_iter_step(pbvh, node, &vi, mode)) + +# define BKE_pbvh_vertex_iter_end ((void)0) + +__attribute__((optnone)) static bool BKE_pbvh_vertex_iter_step(PBVH *pbvh, + PBVHNode *node, + PBVHVertexIter *vi, + int mode) +{ + for (; vi->g < vi->totgrid; vi->g++) { + for (; vi->gy < vi->height; vi->gy++) { + for (; vi->gx < vi->width; vi->gx++, vi->i++) { + if (vi->grid) { + vi->co = CCG_elem_co(&vi->key, vi->grid); + vi->fno = CCG_elem_no(&vi->key, vi->grid); + vi->mask = vi->key.has_mask ? CCG_elem_mask(&vi->key, vi->grid) : NULL; + vi->grid = CCG_elem_next(&vi->key, vi->grid); + vi->index++; + vi->vertex.i++; + vi->visible = true; + if (vi->gh) { + if (BLI_BITMAP_TEST(vi->gh, vi->gy * vi->gridsize + vi->gx)) { + continue; + } + } + + return true; + } + else if (vi->mverts) { + vi->mvert = &vi->mverts[vi->vert_indices[vi->gx]]; + if (vi->respect_hide) { + vi->visible = !(vi->mvert->flag & ME_HIDE); + if (mode == PBVH_ITER_UNIQUE && !vi->visible) { + continue; + } + } + else { + BLI_assert(vi->visible); + } + vi->co = vi->mvert->co; + vi->no = vi->mvert->no; + vi->index = vi->vertex.i = vi->vert_indices[vi->i]; + if (vi->vmask) { + vi->mask = &vi->vmask[vi->index]; + } + if (vi->vcol) { + vi->col = vi->vcol[vi->index].color; + } + + return true; + } + else { + struct BMVert *bv = 0; + while (!bv) { + if (!vi->bm_cur_set->elems || vi->bi >= vi->bm_cur_set->cur) { + if (vi->bm_cur_set != vi->bm_other_verts && mode != PBVH_ITER_UNIQUE) { + vi->bm_cur_set = vi->bm_other_verts; + vi->bi = 0; + if (!vi->bm_cur_set->elems || vi->bi >= vi->bm_other_verts->cur) { + break; + } + } + else { + break; + } + } + else { + bv = (BMVert*) vi->bm_cur_set->elems[vi->bi++]; + } + } + if (!bv) { + continue; + } + vi->bm_vert = bv; + if (vi->cd_vcol_offset >= 0) { + MPropCol *vcol = (MPropCol*) BM_ELEM_CD_GET_VOID_P(bv, vi->cd_vcol_offset); + vi->col = vcol->color; + } + vi->vertex.i = (intptr_t)bv; + vi->index = BM_elem_index_get(vi->bm_vert); + vi->visible = !BM_elem_flag_test_bool(vi->bm_vert, BM_ELEM_HIDDEN); + if (mode == PBVH_ITER_UNIQUE && !vi->visible) { + continue; + } + + vi->co = vi->bm_vert->co; + vi->fno = vi->bm_vert->no; + vi->mask = &BKE_PBVH_DYNVERT(vi->cd_dyn_vert, vi->bm_vert)->mask; + return true; + } + } + } + } + + return false; +} + +#else +# define BKE_pbvh_vertex_iter_begin(pbvh, node, vi, mode) \ + pbvh_vertex_iter_init(pbvh, node, &vi, mode); \ \ - for (vi.gy = 0; vi.gy < vi.height; vi.gy++) { \ - for (vi.gx = 0; vi.gx < vi.width; vi.gx++, vi.i++) { \ - if (vi.grid) { \ - vi.co = CCG_elem_co(&vi.key, vi.grid); \ - vi.fno = CCG_elem_no(&vi.key, vi.grid); \ - vi.mask = vi.key.has_mask ? CCG_elem_mask(&vi.key, vi.grid) : NULL; \ - vi.grid = CCG_elem_next(&vi.key, vi.grid); \ - vi.index++; \ - vi.vertex.i++; \ - vi.visible = true; \ - if (vi.gh) { \ - if (BLI_BITMAP_TEST(vi.gh, vi.gy * vi.gridsize + vi.gx)) { \ - continue; \ + for (vi.i = 0, vi.g = 0; vi.g < vi.totgrid; vi.g++) { \ + if (vi.grids) { \ + vi.width = vi.gridsize; \ + vi.height = vi.gridsize; \ + vi.vertex.i = vi.index = vi.grid_indices[vi.g] * vi.key.grid_area - 1; \ + vi.grid = vi.grids[vi.grid_indices[vi.g]]; \ + if (mode == PBVH_ITER_UNIQUE) { \ + vi.gh = vi.grid_hidden[vi.grid_indices[vi.g]]; \ + } \ + } \ + else { \ + vi.width = vi.totvert; \ + vi.height = 1; \ + } \ +\ + for (vi.gy = 0; vi.gy < vi.height; vi.gy++) { \ + for (vi.gx = 0; vi.gx < vi.width; vi.gx++, vi.i++) { \ + if (vi.grid) { \ + vi.co = CCG_elem_co(&vi.key, vi.grid); \ + vi.fno = CCG_elem_no(&vi.key, vi.grid); \ + vi.mask = vi.key.has_mask ? CCG_elem_mask(&vi.key, vi.grid) : NULL; \ + vi.grid = CCG_elem_next(&vi.key, vi.grid); \ + vi.index++; \ + vi.vertex.i++; \ + vi.visible = true; \ + if (vi.gh) { \ + if (BLI_BITMAP_TEST(vi.gh, vi.gy * vi.gridsize + vi.gx)) { \ + continue; \ + } \ } \ } \ - } \ - else if (vi.mverts) { \ - vi.mvert = &vi.mverts[vi.vert_indices[vi.gx]]; \ - if (vi.respect_hide) { \ - vi.visible = !(vi.mvert->flag & ME_HIDE); \ - if (mode == PBVH_ITER_UNIQUE && !vi.visible) { \ - continue; \ + else if (vi.mverts) { \ + vi.mvert = &vi.mverts[vi.vert_indices[vi.gx]]; \ + if (vi.respect_hide) { \ + vi.visible = !(vi.mvert->flag & ME_HIDE); \ + if (mode == PBVH_ITER_UNIQUE && !vi.visible) { \ + continue; \ + } \ + } \ + else { \ + BLI_assert(vi.visible); \ + } \ + vi.co = vi.mvert->co; \ + vi.no = vi.mvert->no; \ + vi.index = vi.vertex.i = vi.vert_indices[vi.i]; \ + if (vi.vmask) { \ + vi.mask = &vi.vmask[vi.index]; \ + } \ + if (vi.vcol) { \ + vi.col = vi.vcol[vi.index].color; \ } \ } \ else { \ - BLI_assert(vi.visible); \ - } \ - vi.co = vi.mvert->co; \ - vi.no = vi.mvert->no; \ - vi.index = vi.vertex.i = vi.vert_indices[vi.i]; \ - if (vi.vmask) { \ - vi.mask = &vi.vmask[vi.index]; \ - } \ - if (vi.vcol) { \ - vi.col = vi.vcol[vi.index].color; \ - } \ - } \ - else { \ - BMVert *bv = NULL; \ - while (!bv) { \ - if (!vi.bm_cur_set->elems || vi.bi >= vi.bm_cur_set->cur) { \ - if (vi.bm_cur_set != vi.bm_other_verts && mode != PBVH_ITER_UNIQUE) { \ - vi.bm_cur_set = vi.bm_other_verts; \ - vi.bi = 0; \ - if (!vi.bm_cur_set->elems || vi.bi >= vi.bm_other_verts->cur) { \ + BMVert *bv = NULL; \ + while (!bv) { \ + if (!vi.bm_cur_set->elems || vi.bi >= vi.bm_cur_set->cur) { \ + if (vi.bm_cur_set != vi.bm_other_verts && mode != PBVH_ITER_UNIQUE) { \ + @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs