Tweak last commit to not affect base face set.

This commit is contained in:
Joseph Eagar 2021-08-27 21:54:15 -07:00
parent e4b36fb6bc
commit b21595cdf9
8 changed files with 52 additions and 24 deletions

View File

@ -874,4 +874,3 @@ typedef struct SculptLayerEntry {
#ifdef __cplusplus
}
#endif

View File

@ -1630,7 +1630,7 @@ static bool sculpt_modifiers_active(Scene *scene, Sculpt *sd, Object *ob)
return false;
}
char BKE_get_fset_boundary_symflag(Object *object)
char BKE_get_fset_boundary_symflag(Object *object)
{
const Mesh *mesh = BKE_mesh_from_object(object);
return mesh->flag & ME_SCULPT_MIRROR_FSET_BOUNDARIES ? mesh->symmetry : 0;
@ -1674,7 +1674,7 @@ static void sculpt_update_object(Depsgraph *depsgraph,
ss->shapekey_active = (mmd == NULL) ? BKE_keyblock_from_object(ob) : NULL;
ss->boundary_symmetry = (int) BKE_get_fset_boundary_symflag(ob);
ss->boundary_symmetry = (int)BKE_get_fset_boundary_symflag(ob);
/* NOTE: Weight pPaint require mesh info for loop lookup, but it never uses multires code path,
* so no extra checks is needed here. */

View File

@ -4007,7 +4007,8 @@ void BKE_pbvh_set_stroke_id(PBVH *pbvh, int stroke_id)
pbvh->stroke_id = stroke_id;
}
void BKE_pbvh_set_symmetry(PBVH *pbvh, int symmetry, int boundary_symmetry) {
void BKE_pbvh_set_symmetry(PBVH *pbvh, int symmetry, int boundary_symmetry)
{
if (symmetry == pbvh->symmetry && boundary_symmetry == pbvh->boundary_symmetry) {
return;
}
@ -4019,7 +4020,7 @@ void BKE_pbvh_set_symmetry(PBVH *pbvh, int symmetry, int boundary_symmetry) {
BMIter iter;
BMVert *v;
BM_ITER_MESH(v, &iter, pbvh->bm, BM_VERTS_OF_MESH) {
BM_ITER_MESH (v, &iter, pbvh->bm, BM_VERTS_OF_MESH) {
MDynTopoVert *mv = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, v);
mv->flag |= DYNVERT_NEED_BOUNDARY;

View File

@ -1362,26 +1362,35 @@ typedef struct FSetTemp {
bool boundary;
} FSetTemp;
static int do_fset_sym(int fset, const int symflag, const float *co) {
static int do_fset_sym(int fset, const int symflag, const float *co)
{
fset = abs(fset);
//surely we don't need more then 8 million face sets?
// don't affect base face set
if (fset == 1) {
return 1;
}
// surely we don't need more then 8 million face sets?
if (co[0] < 0.0f) {
fset |= (symflag&1) << 24;
fset |= (symflag & 1) << 24;
}
if (co[1] < 0.0f) {
fset |= (symflag&2) << 24;
fset |= (symflag & 2) << 24;
}
if (co[2] < 0.0f) {
fset |= (symflag&4) << 24;
fset |= (symflag & 4) << 24;
}
return fset;
}
void bke_pbvh_update_vert_boundary(int cd_dyn_vert, int cd_faceset_offset, BMVert *v, int bound_symmetry)
void bke_pbvh_update_vert_boundary(int cd_dyn_vert,
int cd_faceset_offset,
BMVert *v,
int bound_symmetry)
{
MDynTopoVert *mv = BKE_PBVH_DYNVERT(cd_dyn_vert, v);
@ -1436,7 +1445,8 @@ void bke_pbvh_update_vert_boundary(int cd_dyn_vert, int cd_faceset_offset, BMVer
}
if (e->l) {
int fset = do_fset_sym(BM_ELEM_CD_GET_INT(e->l->f, cd_faceset_offset), bound_symmetry, v2->co);
int fset = do_fset_sym(
BM_ELEM_CD_GET_INT(e->l->f, cd_faceset_offset), bound_symmetry, v2->co);
if (e->l->f->len > 3) {
mv->flag |= DYNVERT_NEED_TRIANGULATE;
@ -1477,8 +1487,9 @@ void bke_pbvh_update_vert_boundary(int cd_dyn_vert, int cd_faceset_offset, BMVer
// also check e->l->radial_next, in case we are not manifold
// which can mess up the loop order
if (e->l->radial_next != e->l) {
//fset = abs(BM_ELEM_CD_GET_INT(e->l->radial_next->f, cd_faceset_offset));
fset = do_fset_sym(BM_ELEM_CD_GET_INT(e->l->radial_next->f, cd_faceset_offset), bound_symmetry, v2->co);
// fset = abs(BM_ELEM_CD_GET_INT(e->l->radial_next->f, cd_faceset_offset));
fset = do_fset_sym(
BM_ELEM_CD_GET_INT(e->l->radial_next->f, cd_faceset_offset), bound_symmetry, v2->co);
if (e->l->radial_next->f->len > 3) {
mv->flag |= DYNVERT_NEED_TRIANGULATE;
@ -1586,7 +1597,10 @@ void bke_pbvh_update_vert_boundary(int cd_dyn_vert, int cd_faceset_offset, BMVer
BLI_array_free(fsets);
}
void BKE_pbvh_update_vert_boundary(int cd_dyn_vert, int cd_faceset_offset, BMVert *v, int bound_symmetry)
void BKE_pbvh_update_vert_boundary(int cd_dyn_vert,
int cd_faceset_offset,
BMVert *v,
int bound_symmetry)
{
bke_pbvh_update_vert_boundary(cd_dyn_vert, cd_faceset_offset, v, bound_symmetry);
}
@ -1598,7 +1612,8 @@ void BKE_pbvh_recalc_bmesh_boundary(PBVH *pbvh)
BMIter iter;
BM_ITER_MESH (v, &iter, pbvh->bm, BM_VERTS_OF_MESH) {
bke_pbvh_update_vert_boundary(pbvh->cd_dyn_vert, pbvh->cd_faceset_offset, v, pbvh->boundary_symmetry);
bke_pbvh_update_vert_boundary(
pbvh->cd_dyn_vert, pbvh->cd_faceset_offset, v, pbvh->boundary_symmetry);
}
}
@ -1728,7 +1743,8 @@ void BKE_pbvh_build_bmesh(PBVH *pbvh,
mv->flag = DYNVERT_NEED_DISK_SORT;
bke_pbvh_update_vert_boundary(pbvh->cd_dyn_vert, pbvh->cd_faceset_offset, v, pbvh->boundary_symmetry);
bke_pbvh_update_vert_boundary(
pbvh->cd_dyn_vert, pbvh->cd_faceset_offset, v, pbvh->boundary_symmetry);
BKE_pbvh_bmesh_update_valence(pbvh->cd_dyn_vert, (SculptVertRef){(intptr_t)v});
copy_v3_v3(mv->origco, v->co);

View File

@ -320,14 +320,18 @@ bool pbvh_bmesh_node_limit_ensure(PBVH *pbvh, int node_index);
void pbvh_bmesh_check_nodes(PBVH *pbvh);
void bke_pbvh_insert_face_finalize(PBVH *pbvh, BMFace *f, const int ni);
void bke_pbvh_insert_face(PBVH *pbvh, struct BMFace *f);
void bke_pbvh_update_vert_boundary(int cd_dyn_vert, int cd_faceset_offset, BMVert *v, int bound_symmetry);
void bke_pbvh_update_vert_boundary(int cd_dyn_vert,
int cd_faceset_offset,
BMVert *v,
int bound_symmetry);
BLI_INLINE bool pbvh_check_vert_boundary(PBVH *pbvh, struct BMVert *v)
{
MDynTopoVert *mv = BM_ELEM_CD_GET_VOID_P(v, pbvh->cd_dyn_vert);
if (mv->flag & DYNVERT_NEED_BOUNDARY) {
bke_pbvh_update_vert_boundary(pbvh->cd_dyn_vert, pbvh->cd_faceset_offset, v, pbvh->boundary_symmetry);
bke_pbvh_update_vert_boundary(
pbvh->cd_dyn_vert, pbvh->cd_faceset_offset, v, pbvh->boundary_symmetry);
return true;
}

View File

@ -1230,7 +1230,8 @@ bool SCULPT_vertex_has_unique_face_set(const SculptSession *ss, SculptVertRef in
MDynTopoVert *mv = BKE_PBVH_DYNVERT(ss->cd_dyn_vert, v);
if (mv->flag & DYNVERT_NEED_BOUNDARY) {
BKE_pbvh_update_vert_boundary(ss->cd_dyn_vert, ss->cd_faceset_offset, v, ss->cache->boundary_symmetry);
BKE_pbvh_update_vert_boundary(
ss->cd_dyn_vert, ss->cd_faceset_offset, v, ss->cache->boundary_symmetry);
}
return !(mv->flag & DYNVERT_FSET_BOUNDARY);
@ -1595,7 +1596,10 @@ SculptCornerType SCULPT_vertex_is_corner(const SculptSession *ss,
MDynTopoVert *mv = BKE_PBVH_DYNVERT(ss->cd_dyn_vert, v);
if (mv->flag & DYNVERT_NEED_BOUNDARY) {
BKE_pbvh_update_vert_boundary(ss->cd_dyn_vert, ss->cd_faceset_offset, (BMVert *)vertex.i, ss->cache->boundary_symmetry);
BKE_pbvh_update_vert_boundary(ss->cd_dyn_vert,
ss->cd_faceset_offset,
(BMVert *)vertex.i,
ss->cache->boundary_symmetry);
}
ret = 0;
@ -1665,7 +1669,10 @@ SculptBoundaryType SCULPT_vertex_is_boundary(const SculptSession *ss,
MDynTopoVert *mv = BKE_PBVH_DYNVERT(ss->cd_dyn_vert, ((BMVert *)(vertex.i)));
if (mv->flag & DYNVERT_NEED_BOUNDARY) {
BKE_pbvh_update_vert_boundary(ss->cd_dyn_vert, ss->cd_faceset_offset, (BMVert *)vertex.i, ss->cache->boundary_symmetry);
BKE_pbvh_update_vert_boundary(ss->cd_dyn_vert,
ss->cd_faceset_offset,
(BMVert *)vertex.i,
ss->cache->boundary_symmetry);
}
int flag = 0;

View File

@ -839,7 +839,8 @@ void SCULPT_dynamic_topology_enable_ex(Main *bmain, Depsgraph *depsgraph, Scene
mv->flag |= DYNVERT_NEED_DISK_SORT | DYNVERT_NEED_VALENCE;
BKE_pbvh_update_vert_boundary(ss->cd_dyn_vert, ss->cd_faceset_offset, v, ss->boundary_symmetry);
BKE_pbvh_update_vert_boundary(
ss->cd_dyn_vert, ss->cd_faceset_offset, v, ss->boundary_symmetry);
BKE_pbvh_bmesh_update_valence(ss->cd_dyn_vert, (SculptVertRef){.i = (intptr_t)v});
// persistent base

View File

@ -1090,7 +1090,7 @@ typedef struct StrokeCache {
/* Symmetry index between 0 and 7 bit combo 0 is Brush only;
* 1 is X mirror; 2 is Y mirror; 3 is XY; 4 is Z; 5 is XZ; 6 is YZ; 7 is XYZ */
int symmetry;
int boundary_symmetry; //controls splitting face sets by mirror axis
int boundary_symmetry; // controls splitting face sets by mirror axis
int mirror_symmetry_pass; /* The symmetry pass we are currently on between 0 and 7. */
float true_view_normal[3];
float view_normal[3];