[Bf-blender-cvs] [42948e2389d] sculpt-dev: sculpt-dev: Fix draw bug
Joseph Eagar
noreply at git.blender.org
Thu Oct 6 10:47:23 CEST 2022
Commit: 42948e2389dfdbc575496ab109367fd6c8b06721
Author: Joseph Eagar
Date: Thu Oct 6 01:47:05 2022 -0700
Branches: sculpt-dev
https://developer.blender.org/rB42948e2389dfdbc575496ab109367fd6c8b06721
sculpt-dev: Fix draw bug
===================================================================
M source/blender/blenkernel/BKE_paint.h
M source/blender/blenkernel/BKE_pbvh.h
M source/blender/blenkernel/intern/paint.cc
M source/blender/blenkernel/intern/pbvh_bmesh.c
M source/blender/blenkernel/intern/pbvh_intern.h
M source/blender/draw/intern/draw_pbvh.cc
===================================================================
diff --git a/source/blender/blenkernel/BKE_paint.h b/source/blender/blenkernel/BKE_paint.h
index 286b1f17b34..1628ab6b0d3 100644
--- a/source/blender/blenkernel/BKE_paint.h
+++ b/source/blender/blenkernel/BKE_paint.h
@@ -820,6 +820,9 @@ typedef struct SculptSession {
/* BMesh for dynamic topology sculpting */
struct BMesh *bm;
+ /* TODO: get rid of these cd_ members and use
+ * .attrs.XXX.bmesh_cd_offset directly.
+ */
int cd_sculpt_vert;
int cd_vert_node_offset;
int cd_face_node_offset;
@@ -827,6 +830,7 @@ typedef struct SculptSession {
int cd_vert_mask_offset;
int cd_faceset_offset;
int cd_face_areas;
+ int cd_hide_poly;
int totuv;
diff --git a/source/blender/blenkernel/BKE_pbvh.h b/source/blender/blenkernel/BKE_pbvh.h
index 8b8a3ac73a1..6c03c254f17 100644
--- a/source/blender/blenkernel/BKE_pbvh.h
+++ b/source/blender/blenkernel/BKE_pbvh.h
@@ -432,7 +432,8 @@ void BKE_pbvh_update_offsets(PBVH *pbvh,
const int cd_vert_node_offset,
const int cd_face_node_offset,
const int cd_sculpt_vert,
- const int cd_face_areas);
+ const int cd_face_areas,
+ const int cd_hide_poly);
void BKE_pbvh_update_bmesh_offsets(PBVH *pbvh, int cd_vert_node_offset, int cd_face_node_offset);
diff --git a/source/blender/blenkernel/intern/paint.cc b/source/blender/blenkernel/intern/paint.cc
index 0583068108f..c807d600280 100644
--- a/source/blender/blenkernel/intern/paint.cc
+++ b/source/blender/blenkernel/intern/paint.cc
@@ -3532,12 +3532,14 @@ static void sculptsession_bmesh_attr_update_internal(Object *ob)
if (ss->pbvh) {
int cd_sculpt_vert = CustomData_get_offset(&ss->bm->vdata, CD_DYNTOPO_VERT);
int cd_face_area = ss->attrs.face_areas ? ss->attrs.face_areas->bmesh_cd_offset : -1;
+ int cd_hide_poly = ss->attrs.hide_poly ? ss->attrs.hide_poly->bmesh_cd_offset : -1;
BKE_pbvh_update_offsets(ss->pbvh,
- ob->sculpt->attrs.dyntopo_node_id_vertex->bmesh_cd_offset,
- ob->sculpt->attrs.dyntopo_node_id_face->bmesh_cd_offset,
+ ss->attrs.dyntopo_node_id_vertex->bmesh_cd_offset,
+ ss->attrs.dyntopo_node_id_face->bmesh_cd_offset,
cd_sculpt_vert,
- cd_face_area);
+ cd_face_area,
+ cd_hide_poly);
}
}
@@ -3580,6 +3582,7 @@ static void sculptsession_bmesh_add_layers(Object *ob)
ss->cd_face_node_offset = ss->attrs.dyntopo_node_id_face->bmesh_cd_offset;
ss->cd_face_areas = ss->attrs.face_areas->bmesh_cd_offset;
ss->cd_sculpt_vert = ss->attrs.sculpt_vert->bmesh_cd_offset;
+ ss->cd_hide_poly = ss->attrs.hide_poly ? ss->attrs.hide_poly->bmesh_cd_offset : -1;
}
void BKE_sculpt_attributes_destroy_temporary_stroke(Object *ob)
@@ -3622,13 +3625,15 @@ static void update_bmesh_offsets(Mesh *me, SculptSession *ss)
ss->cd_faceset_offset = CustomData_get_offset_named(
&ss->bm->pdata, CD_PROP_INT32, ".sculpt_face_set");
ss->cd_face_areas = ss->attrs.face_areas ? ss->attrs.face_areas->bmesh_cd_offset : -1;
+ ss->cd_hide_poly = ss->attrs.hide_poly ? ss->attrs.hide_poly->bmesh_cd_offset : -1;
if (ss->pbvh) {
BKE_pbvh_update_offsets(ss->pbvh,
ss->cd_vert_node_offset,
ss->cd_face_node_offset,
ss->cd_sculpt_vert,
- ss->cd_face_areas);
+ ss->cd_face_areas,
+ ss->cd_hide_poly);
}
}
diff --git a/source/blender/blenkernel/intern/pbvh_bmesh.c b/source/blender/blenkernel/intern/pbvh_bmesh.c
index d0e45115438..9ce20bec6ff 100644
--- a/source/blender/blenkernel/intern/pbvh_bmesh.c
+++ b/source/blender/blenkernel/intern/pbvh_bmesh.c
@@ -252,6 +252,8 @@ static void pbvh_bmesh_node_finalize(PBVH *pbvh,
BB_reset(&n->orig_vb);
BMFace *f;
+ int cd_hide_poly = pbvh->cd_hide_poly;
+
TGSET_ITER (f, n->bm_faces) {
/* Update ownership of faces */
BM_ELEM_CD_SET_INT(f, cd_face_node_offset, node_index);
@@ -279,7 +281,7 @@ static void pbvh_bmesh_node_finalize(PBVH *pbvh,
BB_expand(&n->orig_vb, mv->origco);
} while ((l_iter = l_iter->next) != l_first);
- if (!BM_elem_flag_test(f, BM_ELEM_HIDDEN)) {
+ if (cd_hide_poly == -1 || !BM_ELEM_CD_GET_BOOL(f, cd_hide_poly)) {
has_visible = true;
}
}
@@ -876,6 +878,11 @@ void BKE_pbvh_bmesh_regen_node_verts(PBVH *pbvh)
/************************* Called from pbvh.c *************************/
+static bool pbvh_poly_hidden(PBVH *pbvh, BMFace *f)
+{
+ return pbvh->cd_hide_poly != -1 && BM_ELEM_CD_GET_BOOL(f, pbvh->cd_hide_poly);
+}
+
bool BKE_pbvh_bmesh_check_origdata(PBVH *pbvh, BMVert *v, int stroke_id)
{
PBVHVertRef vertex = {(intptr_t)v};
@@ -915,7 +922,7 @@ bool pbvh_bmesh_node_raycast(PBVH *pbvh,
BMFace *f = (BMFace *)tri->f.i;
- if (BM_elem_flag_test(f, BM_ELEM_HIDDEN)) {
+ if (pbvh_poly_hidden(pbvh, f)) {
continue;
}
@@ -1006,7 +1013,7 @@ bool BKE_pbvh_bmesh_node_raycast_detail(PBVH *pbvh,
BMVert *v3 = (BMVert *)node->tribuf->verts[tri->v[2]].i;
BMFace *f = (BMFace *)tri->f.i;
- if (BM_elem_flag_test(f, BM_ELEM_HIDDEN)) {
+ if (pbvh_poly_hidden(pbvh, f)) {
continue;
}
@@ -1047,7 +1054,7 @@ bool pbvh_bmesh_node_nearest_to_ray(PBVH *pbvh,
PBVHTri *tri = tribuf->tris + i;
BMFace *f = (BMFace *)tri->f.i;
- if (BM_elem_flag_test(f, BM_ELEM_HIDDEN)) {
+ if (pbvh_poly_hidden(pbvh, f)) {
continue;
}
@@ -1511,7 +1518,7 @@ static void pbvh_bmesh_create_leaf_fast_task_cb(void *__restrict userdata,
} while ((l_iter = l_iter->next) != l_first);
/* Update node bounding box */
- if (!BM_elem_flag_test(f, BM_ELEM_HIDDEN)) {
+ if (!pbvh_poly_hidden(pbvh, f)) {
has_visible = true;
}
@@ -2242,6 +2249,8 @@ void BKE_pbvh_build_bmesh(PBVH *pbvh,
{
// coalese_pbvh(pbvh, bm);
+ pbvh->cd_hide_poly = CustomData_get_offset_named(
+ &bm->pdata, CD_PROP_INT32, ".sculpt_face_areas");
pbvh->cd_face_area = cd_face_areas;
pbvh->cd_vert_node_offset = cd_vert_node_offset;
pbvh->cd_face_node_offset = cd_face_node_offset;
@@ -2849,7 +2858,7 @@ bool BKE_pbvh_bmesh_check_tris(PBVH *pbvh, PBVHNode *node)
INIT_MINMAX(min, max);
TGSET_ITER (f, node->bm_faces) {
- if (BM_elem_flag_test(f, BM_ELEM_HIDDEN)) {
+ if (pbvh_poly_hidden(pbvh, f)) {
continue;
}
@@ -3002,7 +3011,7 @@ bool BKE_pbvh_bmesh_check_tris(PBVH *pbvh, PBVHNode *node)
TGSET_ITER_END
TGSET_ITER (f, node->bm_faces) {
- if (BM_elem_flag_test(f, BM_ELEM_HIDDEN)) {
+ if (pbvh_poly_hidden(pbvh, f)) {
continue;
}
@@ -3996,8 +4005,10 @@ void BKE_pbvh_update_offsets(PBVH *pbvh,
const int cd_vert_node_offset,
const int cd_face_node_offset,
const int cd_sculpt_vert,
- const int cd_face_areas)
+ const int cd_face_areas,
+ const int cd_hide_poly)
{
+ pbvh->cd_hide_poly = cd_hide_poly;
pbvh->cd_face_node_offset = cd_face_node_offset;
pbvh->cd_vert_node_offset = cd_vert_node_offset;
pbvh->cd_face_area = cd_face_areas;
diff --git a/source/blender/blenkernel/intern/pbvh_intern.h b/source/blender/blenkernel/intern/pbvh_intern.h
index e140e4cdb65..f173742a163 100644
--- a/source/blender/blenkernel/intern/pbvh_intern.h
+++ b/source/blender/blenkernel/intern/pbvh_intern.h
@@ -240,6 +240,7 @@ struct PBVH {
int cd_faceset_offset;
int cd_face_area;
int cd_vcol_offset;
+ int cd_hide_poly;
int totuv;
diff --git a/source/blender/draw/intern/draw_pbvh.cc b/source/blender/draw/intern/draw_pbvh.cc
index dc1b33bcd12..9e4779eca81 100644
--- a/source/blender/draw/intern/draw_pbvh.cc
+++ b/source/blender/draw/intern/draw_pbvh.cc
@@ -712,13 +712,9 @@ struct PBVHBatches {
for (int i : IndexRange(args->tribuf->tottri)) {
PBVHTri *tri = args->tribuf->tris + i;
- BMLoop *l1 = reinterpret_cast<BMLoop *>(tri->l[0]);
- BMLoop *l2 = reinterpret_cast<BMLoop *>(tri->l[1]);
- BMLoop *l3 = reinterpret_cast<BMLoop *>(tri->l[2]);
-
- callback(l1);
- callback(l2);
- callback(l3);
+ for (int j = 0; j < 3; j++) {
+ callback(reinterpret_cast<BMLoop *>(tri->l[j]));
+ }
}
};
@@ -829,7 +825,7 @@ struct PBVHBatches {
int existing_num = GPU_vertbuf_get_vertex_len(vbo.vert_buf);
void *existing_data = GPU_vertbuf_get_data(vbo.vert_buf);
- int vert_count = tris_count * 6;
+ int vert_count = tris_count * 3;
if (existing_data == nullptr || existing_num != vert_count) {
/* Allocate buffer if not allocated yet or size changed. */
More information about the Bf-blender-cvs
mailing list