Tweak last commit to not affect base face set.
This commit is contained in:
parent
e4b36fb6bc
commit
b21595cdf9
|
@ -874,4 +874,3 @@ typedef struct SculptLayerEntry {
|
|||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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];
|
||||
|
|
Loading…
Reference in New Issue