Sculpt: fix problem with smooth brush defaults
Also wrapped some mv->flag OR's in a macro, that can be switched with a macro for debugging.
This commit is contained in:
parent
3d4e14b7e1
commit
12ff7b4297
|
@ -39,7 +39,7 @@ extern "C" {
|
|||
|
||||
/* Blender file format version. */
|
||||
#define BLENDER_FILE_VERSION BLENDER_VERSION
|
||||
#define BLENDER_FILE_SUBVERSION 32
|
||||
#define BLENDER_FILE_SUBVERSION 33
|
||||
|
||||
/* Minimum Blender version that supports reading file written with the current
|
||||
* version. Older Blender versions will test this and show a warning if the file
|
||||
|
|
|
@ -953,7 +953,19 @@ void BKE_pbvh_update_vert_boundary_grids(PBVH *pbvh,
|
|||
SculptVertRef vertex);
|
||||
|
||||
void BKE_pbvh_set_mdyntopo_verts(PBVH *pbvh, struct MDynTopoVert *mdyntopoverts);
|
||||
#if 0
|
||||
# include "DNA_meshdata_types.h"
|
||||
ATTR_NO_OPT static void MV_ADD_FLAG(MDynTopoVert *mv, int flag)
|
||||
{
|
||||
if (flag & DYNVERT_NEED_BOUNDARY) {
|
||||
flag |= flag;
|
||||
}
|
||||
|
||||
mv->flag |= flag;
|
||||
}
|
||||
#else
|
||||
# define MV_ADD_FLAG(mv, flag1) (mv)->flag |= (flag1)
|
||||
#endif
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -1244,6 +1244,7 @@ void BKE_brush_channelset_ui_init(Brush *brush, int tool)
|
|||
|
||||
SHOWWRK(normal_radius_factor);
|
||||
SHOWWRK(hardness);
|
||||
SHOWWRK(dyntopo_disabled);
|
||||
|
||||
switch (tool) {
|
||||
case SCULPT_TOOL_INFLATE:
|
||||
|
@ -1263,6 +1264,7 @@ void BKE_brush_channelset_ui_init(Brush *brush, int tool)
|
|||
SHOWWRK(smooth_deform_type);
|
||||
SHOWCTX(smooth_deform_type);
|
||||
SHOWWRK(projection);
|
||||
SHOWCTX(dyntopo_disabled);
|
||||
break;
|
||||
case SCULPT_TOOL_SCRAPE:
|
||||
case SCULPT_TOOL_FILL:
|
||||
|
@ -1596,6 +1598,8 @@ void BKE_brush_builtin_create(Brush *brush, int tool)
|
|||
BRUSHSET_SET_FLOAT(chset, spacing, 5.0f);
|
||||
BRUSHSET_SET_FLOAT(chset, strength, 0.3f);
|
||||
|
||||
BRUSHSET_SET_BOOL(chset, dyntopo_disabled, true);
|
||||
|
||||
ADDCH(surface_smooth_shape_preservation);
|
||||
ADDCH(surface_smooth_current_vertex);
|
||||
ADDCH(surface_smooth_iterations);
|
||||
|
|
|
@ -200,8 +200,9 @@ static void fix_mesh(PBVH *pbvh, BMesh *bm)
|
|||
v->e = NULL;
|
||||
MDynTopoVert *mv = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, v);
|
||||
|
||||
mv->flag |= DYNVERT_NEED_VALENCE | DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_DISK_SORT |
|
||||
DYNVERT_NEED_TRIANGULATE;
|
||||
MV_ADD_FLAG(mv,
|
||||
DYNVERT_NEED_VALENCE | DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_DISK_SORT |
|
||||
DYNVERT_NEED_TRIANGULATE);
|
||||
}
|
||||
|
||||
BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
|
||||
|
@ -804,7 +805,7 @@ static BMVert *pbvh_bmesh_vert_create(PBVH *pbvh,
|
|||
BMVert *v = BM_vert_create(pbvh->bm, co, NULL, BM_CREATE_NOP);
|
||||
MDynTopoVert *mv = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, v);
|
||||
|
||||
mv->flag |= DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_DISK_SORT | DYNVERT_NEED_VALENCE;
|
||||
MV_ADD_FLAG(mv, DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_DISK_SORT | DYNVERT_NEED_VALENCE);
|
||||
|
||||
if (v_example) {
|
||||
v->head.hflag = v_example->head.hflag;
|
||||
|
@ -925,7 +926,7 @@ static BMFace *pbvh_bmesh_face_create(PBVH *pbvh,
|
|||
}
|
||||
|
||||
MDynTopoVert *mv = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, l->v);
|
||||
mv->flag |= DYNVERT_NEED_DISK_SORT | DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_VALENCE;
|
||||
MV_ADD_FLAG(mv, DYNVERT_NEED_DISK_SORT | DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_VALENCE);
|
||||
|
||||
l = l->next;
|
||||
} while (l != f->l_first);
|
||||
|
@ -935,7 +936,7 @@ static BMFace *pbvh_bmesh_face_create(PBVH *pbvh,
|
|||
do {
|
||||
|
||||
MDynTopoVert *mv = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, l->v);
|
||||
mv->flag |= DYNVERT_NEED_DISK_SORT | DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_VALENCE;
|
||||
MV_ADD_FLAG(mv, DYNVERT_NEED_DISK_SORT | DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_VALENCE);
|
||||
} while ((l = l->next) != f->l_first);
|
||||
}
|
||||
|
||||
|
@ -978,7 +979,7 @@ BMVert *BKE_pbvh_vert_create_bmesh(
|
|||
BM_ELEM_CD_SET_INT(v, pbvh->cd_vert_node_offset, DYNTOPO_NODE_NONE);
|
||||
|
||||
MDynTopoVert *mv = BM_ELEM_CD_GET_VOID_P(v, pbvh->cd_dyn_vert);
|
||||
mv->flag |= DYNVERT_NEED_VALENCE | DYNVERT_NEED_DISK_SORT | DYNVERT_NEED_BOUNDARY;
|
||||
MV_ADD_FLAG(mv, DYNVERT_NEED_VALENCE | DYNVERT_NEED_DISK_SORT | DYNVERT_NEED_BOUNDARY);
|
||||
|
||||
copy_v3_v3(mv->origco, co);
|
||||
|
||||
|
@ -2539,7 +2540,7 @@ static bool check_vert_fan_are_tris(PBVH *pbvh, BMVert *v)
|
|||
do {
|
||||
MDynTopoVert *mv_l = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, l->v);
|
||||
|
||||
mv_l->flag |= DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_VALENCE | DYNVERT_NEED_DISK_SORT;
|
||||
MV_ADD_FLAG(mv_l, DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_VALENCE | DYNVERT_NEED_DISK_SORT);
|
||||
} while ((l = l->next) != f->l_first);
|
||||
BLI_array_append(fs, f);
|
||||
}
|
||||
|
@ -3131,8 +3132,8 @@ static void pbvh_bmesh_split_edge(EdgeQueueContext *eq_ctx,
|
|||
pbvh_check_vert_boundary(pbvh, e->v1);
|
||||
pbvh_check_vert_boundary(pbvh, e->v2);
|
||||
|
||||
mv1->flag |= DYNVERT_NEED_VALENCE | DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_DISK_SORT;
|
||||
mv2->flag |= DYNVERT_NEED_VALENCE | DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_DISK_SORT;
|
||||
MV_ADD_FLAG(mv1, DYNVERT_NEED_VALENCE | DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_DISK_SORT);
|
||||
MV_ADD_FLAG(mv2, DYNVERT_NEED_VALENCE | DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_DISK_SORT);
|
||||
|
||||
bool boundary = (mv1->flag & DYNVERT_ALL_BOUNDARY) && (mv2->flag & DYNVERT_ALL_BOUNDARY);
|
||||
|
||||
|
@ -3173,7 +3174,7 @@ static void pbvh_bmesh_split_edge(EdgeQueueContext *eq_ctx,
|
|||
&pbvh->bm->vdata, (const void **)vsrcs, (float *)vws, NULL, 2, v_new->head.data);
|
||||
|
||||
// bke_pbvh_update_vert_boundary(pbvh->cd_dyn_vert, pbvh->cd_faceset_offset, v_new);
|
||||
mv_new->flag |= DYNVERT_NEED_DISK_SORT | DYNVERT_NEED_VALENCE | DYNVERT_NEED_BOUNDARY;
|
||||
MV_ADD_FLAG(mv_new, DYNVERT_NEED_DISK_SORT | DYNVERT_NEED_VALENCE | DYNVERT_NEED_BOUNDARY);
|
||||
mv_new->flag &= ~DYNVERT_VALENCE_TEMP;
|
||||
|
||||
int ni_new2 = BM_ELEM_CD_GET_INT(v_new, pbvh->cd_vert_node_offset);
|
||||
|
@ -3207,9 +3208,9 @@ static void pbvh_bmesh_split_edge(EdgeQueueContext *eq_ctx,
|
|||
MDynTopoVert *mv2b = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, v2);
|
||||
MDynTopoVert *mv_opp = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, v_opp);
|
||||
|
||||
mv1b->flag |= DYNVERT_NEED_VALENCE | DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_DISK_SORT;
|
||||
mv2b->flag |= DYNVERT_NEED_VALENCE | DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_DISK_SORT;
|
||||
mv_opp->flag |= DYNVERT_NEED_VALENCE | DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_DISK_SORT;
|
||||
MV_ADD_FLAG(mv1b, DYNVERT_NEED_VALENCE | DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_DISK_SORT);
|
||||
MV_ADD_FLAG(mv2b, DYNVERT_NEED_VALENCE | DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_DISK_SORT);
|
||||
MV_ADD_FLAG(mv_opp, DYNVERT_NEED_VALENCE | DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_DISK_SORT);
|
||||
|
||||
if (ni != node_index && i == 0) {
|
||||
pbvh_bmesh_vert_ownership_transfer(pbvh, &pbvh->nodes[ni], v_new);
|
||||
|
@ -3778,7 +3779,7 @@ static void pbvh_bmesh_collapse_edge(PBVH *pbvh,
|
|||
|
||||
BM_LOOPS_OF_VERT_ITER_BEGIN (l, v_del) {
|
||||
MDynTopoVert *mv_l = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, l->next->v);
|
||||
mv_l->flag |= mupdateflag;
|
||||
MV_ADD_FLAG(mv_l, mupdateflag);
|
||||
|
||||
BLI_array_append(ls, l);
|
||||
totl++;
|
||||
|
@ -3787,7 +3788,7 @@ static void pbvh_bmesh_collapse_edge(PBVH *pbvh,
|
|||
|
||||
BM_LOOPS_OF_VERT_ITER_BEGIN (l, v_conn) {
|
||||
MDynTopoVert *mv_l = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, l->next->v);
|
||||
mv_l->flag |= mupdateflag;
|
||||
MV_ADD_FLAG(mv_l, mupdateflag);
|
||||
|
||||
BLI_array_append(ls, l);
|
||||
totl++;
|
||||
|
@ -3948,7 +3949,7 @@ static void pbvh_bmesh_collapse_edge(PBVH *pbvh,
|
|||
}
|
||||
|
||||
MDynTopoVert *mv1 = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, v);
|
||||
mv1->flag |= mupdateflag;
|
||||
MV_ADD_FLAG(mv1, mupdateflag);
|
||||
|
||||
BKE_pbvh_bmesh_remove_vertex(pbvh, v, true);
|
||||
|
||||
|
@ -3980,7 +3981,7 @@ static void pbvh_bmesh_collapse_edge(PBVH *pbvh,
|
|||
}
|
||||
|
||||
MDynTopoVert *mv_conn = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, v_conn);
|
||||
mv_conn->flag |= mupdateflag;
|
||||
MV_ADD_FLAG(mv_conn, mupdateflag);
|
||||
|
||||
bool wasbad = false;
|
||||
|
||||
|
@ -3996,7 +3997,7 @@ static void pbvh_bmesh_collapse_edge(PBVH *pbvh,
|
|||
|
||||
BMVert *v2 = BM_edge_other_vert(e2, v_conn);
|
||||
MDynTopoVert *mv2 = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, v2);
|
||||
mv2->flag |= mupdateflag;
|
||||
MV_ADD_FLAG(mv2, mupdateflag);
|
||||
|
||||
// kill wire edge
|
||||
if (!l) {
|
||||
|
@ -4050,7 +4051,7 @@ static void pbvh_bmesh_collapse_edge(PBVH *pbvh,
|
|||
// BM_vert_splice(pbvh->bm, v_del, v_conn);
|
||||
|
||||
MDynTopoVert *mv3 = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, v_conn);
|
||||
mv3->flag |= mupdateflag;
|
||||
MV_ADD_FLAG(mv3, mupdateflag);
|
||||
|
||||
if (BM_ELEM_CD_GET_INT(v_conn, pbvh->cd_vert_node_offset) == DYNTOPO_NODE_NONE) {
|
||||
printf("%s: error\n", __func__);
|
||||
|
@ -4149,7 +4150,7 @@ static void pbvh_bmesh_collapse_edge1(PBVH *pbvh,
|
|||
BMEdge *e2 = l->e;
|
||||
|
||||
MDynTopoVert *mv_l = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, l->v);
|
||||
mv_l->flag |= mupdateflag;
|
||||
MV_ADD_FLAG(mv_l, mupdateflag);
|
||||
|
||||
l = l->next;
|
||||
} while (l != f_adj->l_first);
|
||||
|
@ -4192,7 +4193,7 @@ static void pbvh_bmesh_collapse_edge1(PBVH *pbvh,
|
|||
|
||||
BM_LOOPS_OF_VERT_ITER_BEGIN (l, v_del) {
|
||||
MDynTopoVert *mv_l = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, l->v);
|
||||
mv_l->flag |= mupdateflag;
|
||||
MV_ADD_FLAG(mv_l, mupdateflag);
|
||||
|
||||
BLI_array_append(ls, l);
|
||||
totl++;
|
||||
|
@ -4201,7 +4202,7 @@ static void pbvh_bmesh_collapse_edge1(PBVH *pbvh,
|
|||
|
||||
BM_LOOPS_OF_VERT_ITER_BEGIN (l, v_conn) {
|
||||
MDynTopoVert *mv_l = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, l->v);
|
||||
mv_l->flag |= mupdateflag;
|
||||
MV_ADD_FLAG(mv_l, mupdateflag);
|
||||
|
||||
BLI_array_append(ls, l);
|
||||
totl++;
|
||||
|
@ -4340,8 +4341,8 @@ static void pbvh_bmesh_collapse_edge1(PBVH *pbvh,
|
|||
MDynTopoVert *mv2 = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, v_tri[1]);
|
||||
MDynTopoVert *mv3 = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, v_tri[2]);
|
||||
|
||||
mv2->flag |= mupdateflag;
|
||||
mv3->flag |= mupdateflag;
|
||||
MV_ADD_FLAG(mv2, mupdateflag);
|
||||
MV_ADD_FLAG(mv3, mupdateflag);
|
||||
|
||||
BLI_assert(!BM_face_exists(v_tri, 3));
|
||||
BMEdge *e_tri[3];
|
||||
|
@ -4436,7 +4437,7 @@ static void pbvh_bmesh_collapse_edge1(PBVH *pbvh,
|
|||
}
|
||||
|
||||
MDynTopoVert *mv_l = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, l->v);
|
||||
mv_l->flag |= mupdateflag;
|
||||
MV_ADD_FLAG(mv_l, mupdateflag);
|
||||
|
||||
l1 = l1->next;
|
||||
} while (l1 != f_del->l_first);
|
||||
|
@ -4507,7 +4508,7 @@ static void pbvh_bmesh_collapse_edge1(PBVH *pbvh,
|
|||
BMVert *v2 = BM_edge_other_vert(l->e, v_conn);
|
||||
MDynTopoVert *mv2 = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, v2);
|
||||
|
||||
mv2->flag |= mupdateflag;
|
||||
MV_ADD_FLAG(mv2, mupdateflag);
|
||||
|
||||
PBVHNode *f_node = pbvh_bmesh_node_from_face(pbvh, l->f);
|
||||
f_node->flag |= PBVH_UpdateDrawBuffers | PBVH_UpdateNormals | PBVH_UpdateBB |
|
||||
|
@ -4516,7 +4517,7 @@ static void pbvh_bmesh_collapse_edge1(PBVH *pbvh,
|
|||
BM_LOOPS_OF_VERT_ITER_END;
|
||||
|
||||
MDynTopoVert *mv_conn = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, v_conn);
|
||||
mv_conn->flag |= mupdateflag;
|
||||
MV_ADD_FLAG(mv_conn, mupdateflag);
|
||||
|
||||
MDynTopoVert *mv_del = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, v_del);
|
||||
mv_conn->flag |= mv_del->flag;
|
||||
|
@ -4540,9 +4541,9 @@ static void pbvh_bmesh_collapse_edge1(PBVH *pbvh,
|
|||
|
||||
// paranoia check, propegate update flags
|
||||
MDynTopoVert *mv_l = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, l->v);
|
||||
mv_l->flag |= mupdateflag;
|
||||
MV_ADD_FLAG(mv_l, mupdateflag);
|
||||
mv_l = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, l->next->v);
|
||||
mv_l->flag |= mupdateflag;
|
||||
MV_ADD_FLAG(mv_l, mupdateflag);
|
||||
|
||||
if (ni >= 0) {
|
||||
PBVHNode *node = pbvh->nodes + ni;
|
||||
|
@ -4809,7 +4810,7 @@ cleanup_valence_3_4(EdgeQueueContext *ectx,
|
|||
mv_l = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, l->v);
|
||||
}
|
||||
|
||||
mv_l->flag |= updateflag;
|
||||
MV_ADD_FLAG(mv_l, updateflag);
|
||||
|
||||
l = l->prev->radial_next;
|
||||
|
||||
|
@ -5008,9 +5009,9 @@ cleanup_valence_3_4(EdgeQueueContext *ectx,
|
|||
MDynTopoVert *mv2 = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, vs[1]);
|
||||
MDynTopoVert *mv3 = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, vs[2]);
|
||||
|
||||
mv1->flag |= updateflag;
|
||||
mv2->flag |= updateflag;
|
||||
mv3->flag |= updateflag;
|
||||
MV_ADD_FLAG(mv1, updateflag);
|
||||
MV_ADD_FLAG(mv2, updateflag);
|
||||
MV_ADD_FLAG(mv3, updateflag);
|
||||
|
||||
BMFace *f1 = NULL;
|
||||
bool ok1 = vs[0] != vs[1] && vs[1] != vs[2] && vs[0] != vs[2];
|
||||
|
@ -5043,9 +5044,9 @@ cleanup_valence_3_4(EdgeQueueContext *ectx,
|
|||
MDynTopoVert *mv2 = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, vs[1]);
|
||||
MDynTopoVert *mv3 = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, vs[2]);
|
||||
|
||||
mv1->flag |= updateflag;
|
||||
mv2->flag |= updateflag;
|
||||
mv3->flag |= updateflag;
|
||||
MV_ADD_FLAG(mv1, updateflag);
|
||||
MV_ADD_FLAG(mv2, updateflag);
|
||||
MV_ADD_FLAG(mv3, updateflag);
|
||||
|
||||
BMFace *example = NULL;
|
||||
if (v->e && v->e->l) {
|
||||
|
@ -5168,8 +5169,8 @@ static void on_vert_swap(BMVert *v1, BMVert *v2, void *userdata)
|
|||
MDynTopoVert *mv1 = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, v1);
|
||||
MDynTopoVert *mv2 = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, v2);
|
||||
|
||||
mv1->flag |= DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_VALENCE | DYNVERT_NEED_DISK_SORT;
|
||||
mv2->flag |= DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_VALENCE | DYNVERT_NEED_DISK_SORT;
|
||||
MV_ADD_FLAG(mv1, DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_VALENCE | DYNVERT_NEED_DISK_SORT);
|
||||
MV_ADD_FLAG(mv2, DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_VALENCE | DYNVERT_NEED_DISK_SORT);
|
||||
|
||||
int ni1 = BM_ELEM_CD_GET_INT(v1, pbvh->cd_vert_node_offset);
|
||||
int ni2 = BM_ELEM_CD_GET_INT(v2, pbvh->cd_vert_node_offset);
|
||||
|
@ -5891,7 +5892,7 @@ static void pbvh_split_edges(EdgeQueueContext *eq_ctx,
|
|||
l2->v->head.hflag &= ~SPLIT_TAG;
|
||||
|
||||
MDynTopoVert *mv = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, l2->v);
|
||||
mv->flag |= DYNVERT_NEED_VALENCE | DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_DISK_SORT;
|
||||
MV_ADD_FLAG(mv, DYNVERT_NEED_VALENCE | DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_DISK_SORT);
|
||||
|
||||
if (_j > 10000) {
|
||||
printf("infinite loop error 1\n");
|
||||
|
@ -6026,10 +6027,10 @@ static void pbvh_split_edges(EdgeQueueContext *eq_ctx,
|
|||
MDynTopoVert *mv = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, newv);
|
||||
|
||||
newv->head.hflag |= SPLIT_TAG;
|
||||
mv->flag |= DYNVERT_NEED_VALENCE | DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_DISK_SORT;
|
||||
MV_ADD_FLAG(mv, DYNVERT_NEED_VALENCE | DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_DISK_SORT);
|
||||
mv->stroke_id = pbvh->stroke_id;
|
||||
|
||||
mv->flag |= DYNVERT_NEED_DISK_SORT | DYNVERT_NEED_VALENCE | DYNVERT_NEED_BOUNDARY;
|
||||
MV_ADD_FLAG(mv, DYNVERT_NEED_DISK_SORT | DYNVERT_NEED_VALENCE | DYNVERT_NEED_BOUNDARY);
|
||||
mv->flag &= ~DYNVERT_VALENCE_TEMP;
|
||||
|
||||
BM_ELEM_CD_SET_INT(newv, pbvh->cd_vert_node_offset, DYNTOPO_NODE_NONE);
|
||||
|
|
|
@ -2327,7 +2327,7 @@ static void init_mdyntopo_layer_faces(SculptSession *ss, PBVH *pbvh, int totvert
|
|||
MDynTopoVert *mv = ss->mdyntopo_verts;
|
||||
|
||||
for (int i = 0; i < totvert; i++, mv++) {
|
||||
mv->flag = DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_VALENCE | DYNVERT_NEED_DISK_SORT;
|
||||
MV_ADD_FLAG(mv, DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_VALENCE | DYNVERT_NEED_DISK_SORT);
|
||||
mv->stroke_id = -1;
|
||||
|
||||
SculptVertRef vertex = {.i = i};
|
||||
|
@ -2342,7 +2342,7 @@ static void init_mdyntopo_layer_faces(SculptSession *ss, PBVH *pbvh, int totvert
|
|||
vertex);
|
||||
|
||||
// can't fully update boundary here, so still flag for update
|
||||
mv->flag |= DYNVERT_NEED_BOUNDARY;
|
||||
MV_ADD_FLAG(mv, DYNVERT_NEED_BOUNDARY);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2360,7 +2360,7 @@ static void init_mdyntopo_layer_grids(SculptSession *ss, PBVH *pbvh, int totvert
|
|||
MDynTopoVert *mv = ss->mdyntopo_verts;
|
||||
|
||||
for (int i = 0; i < totvert; i++, mv++) {
|
||||
mv->flag = DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_VALENCE | DYNVERT_NEED_DISK_SORT;
|
||||
MV_ADD_FLAG(mv, DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_VALENCE | DYNVERT_NEED_DISK_SORT);
|
||||
mv->stroke_id = -1;
|
||||
|
||||
SculptVertRef vertex = {.i = i};
|
||||
|
@ -2368,7 +2368,7 @@ static void init_mdyntopo_layer_grids(SculptSession *ss, PBVH *pbvh, int totvert
|
|||
BKE_pbvh_update_vert_boundary_grids(pbvh, ss->subdiv_ccg, vertex);
|
||||
|
||||
// can't fully update boundary here, so still flag for update
|
||||
mv->flag |= DYNVERT_NEED_BOUNDARY;
|
||||
MV_ADD_FLAG(mv, DYNVERT_NEED_BOUNDARY);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -4122,7 +4122,7 @@ void BKE_pbvh_set_symmetry(PBVH *pbvh, int symmetry, int boundary_symmetry)
|
|||
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;
|
||||
MV_ADD_FLAG(mv, DYNVERT_NEED_BOUNDARY);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -270,7 +270,7 @@ static void pbvh_bmesh_node_finalize(PBVH *pbvh,
|
|||
do {
|
||||
BMVert *v = l_iter->v;
|
||||
MDynTopoVert *mv = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, v);
|
||||
mv->flag |= DYNVERT_NEED_BOUNDARY;
|
||||
MV_ADD_FLAG(mv, DYNVERT_NEED_BOUNDARY);
|
||||
|
||||
if (!BLI_table_gset_haskey(n->bm_unique_verts, v)) {
|
||||
if (BM_ELEM_CD_GET_INT(v, cd_vert_node_offset) != DYNTOPO_NODE_NONE) {
|
||||
|
@ -2500,7 +2500,7 @@ void BKE_pbvh_bmesh_on_mesh_change(PBVH *pbvh)
|
|||
BM_ITER_MESH (v, &iter, pbvh->bm, BM_VERTS_OF_MESH) {
|
||||
MDynTopoVert *mv = BKE_PBVH_DYNVERT(cd_dyn_vert, v);
|
||||
|
||||
mv->flag |= DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_DISK_SORT | DYNVERT_NEED_TRIANGULATE;
|
||||
MV_ADD_FLAG(mv, DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_DISK_SORT | DYNVERT_NEED_TRIANGULATE);
|
||||
BKE_pbvh_bmesh_update_valence(pbvh->cd_dyn_vert, (SculptVertRef){.i = (intptr_t)v});
|
||||
}
|
||||
}
|
||||
|
@ -2594,7 +2594,7 @@ static void pbvh_bmesh_join_subnodes(PBVH *pbvh, PBVHNode *node, PBVHNode *paren
|
|||
BLI_table_gset_add(parent->bm_unique_verts, v);
|
||||
|
||||
MDynTopoVert *mv = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, v);
|
||||
mv->flag |= DYNVERT_NEED_BOUNDARY; // need to update DYNVERT_PBVH_BOUNDARY flags
|
||||
MV_ADD_FLAG(mv, DYNVERT_NEED_BOUNDARY); // need to update DYNVERT_PBVH_BOUNDARY flags
|
||||
|
||||
BM_ELEM_CD_SET_INT(v, pbvh->cd_vert_node_offset, DYNTOPO_NODE_NONE);
|
||||
}
|
||||
|
@ -3008,7 +3008,7 @@ static void pbvh_bmesh_balance_tree(PBVH *pbvh)
|
|||
|
||||
TGSET_ITER (v, node2->bm_unique_verts) {
|
||||
MDynTopoVert *mv = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, v);
|
||||
mv->flag |= DYNVERT_NEED_BOUNDARY;
|
||||
MV_ADD_FLAG(mv, DYNVERT_NEED_BOUNDARY);
|
||||
|
||||
BM_ELEM_CD_SET_INT(v, cd_vert_node, DYNTOPO_NODE_NONE);
|
||||
}
|
||||
|
|
|
@ -1779,6 +1779,15 @@ void blo_do_versions_300(FileData *fd, Library *UNUSED(lib), Main *bmain)
|
|||
}
|
||||
}
|
||||
|
||||
if (!MAIN_VERSION_ATLEAST(bmain, 300, 33)) {
|
||||
LISTBASE_FOREACH (Brush *, brush, &bmain->brushes) {
|
||||
if (brush->channels && brush->sculpt_tool == SCULPT_TOOL_SMOOTH) {
|
||||
BRUSHSET_SET_BOOL(brush->channels, dyntopo_disabled, true);
|
||||
BKE_brush_channelset_ui_init(brush, brush->sculpt_tool);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!MAIN_VERSION_ATLEAST(bmain, 300, 27)) {
|
||||
LISTBASE_FOREACH (Brush *, brush, &bmain->brushes) {
|
||||
if (brush->channels) {
|
||||
|
|
|
@ -1220,7 +1220,7 @@ void SCULPT_vertex_face_set_set(SculptSession *ss, SculptVertRef index, int face
|
|||
if (fset >= 0 && fset != abs(face_set)) {
|
||||
MDynTopoVert *mv = BKE_PBVH_DYNVERT(ss->cd_dyn_vert, v);
|
||||
|
||||
mv->flag |= DYNVERT_NEED_BOUNDARY;
|
||||
MV_ADD_FLAG(mv, DYNVERT_NEED_BOUNDARY);
|
||||
BM_ELEM_CD_SET_INT(l->f, ss->cd_faceset_offset, abs(face_set));
|
||||
}
|
||||
}
|
||||
|
@ -7064,7 +7064,7 @@ static void do_layer_brush_task_cb_ex(void *__restrict userdata,
|
|||
|
||||
float *disp_factor = BM_ELEM_CD_GET_VOID_P(l->v, cd_disp);
|
||||
MDynTopoVert *mv = BKE_PBVH_DYNVERT(ss->cd_dyn_vert, l->v);
|
||||
mv->flag |= DYNVERT_NEED_BOUNDARY;
|
||||
MV_ADD_FLAG(mv, DYNVERT_NEED_BOUNDARY);
|
||||
|
||||
if (cd_vcol >= 0) {
|
||||
MPropCol *col = BM_ELEM_CD_GET_VOID_P(l->v, cd_vcol);
|
||||
|
@ -9300,7 +9300,7 @@ static void SCULPT_run_command_list(
|
|||
cloth_nodes_undo = true;
|
||||
}
|
||||
|
||||
if (!SCULPT_TOOL_HAS_DYNTOPO(cmd->tool)) {
|
||||
if (!SCULPT_TOOL_HAS_DYNTOPO(cmd->tool) || SCULPT_get_int(ss, dyntopo_disabled, sd, brush)) {
|
||||
has_dyntopo = false;
|
||||
}
|
||||
|
||||
|
|
|
@ -396,7 +396,7 @@ static void do_draw_face_sets_brush_task_cb_ex(void *__restrict userdata,
|
|||
|
||||
MDynTopoVert *mv = ss->mdyntopo_verts + i;
|
||||
|
||||
mv->flag |= DYNVERT_NEED_BOUNDARY;
|
||||
MV_ADD_FLAG(mv, DYNVERT_NEED_BOUNDARY);
|
||||
|
||||
normal_short_to_float_v3(fno, v->no);
|
||||
float mask = ss->vmask ? ss->vmask[ml->v] : 0.0f;
|
||||
|
@ -494,7 +494,7 @@ static void do_draw_face_sets_brush_task_cb_ex(void *__restrict userdata,
|
|||
}
|
||||
|
||||
MDynTopoVert *mv = BKE_PBVH_DYNVERT(ss->cd_dyn_vert, l->v);
|
||||
mv->flag |= DYNVERT_NEED_BOUNDARY;
|
||||
MV_ADD_FLAG(mv, DYNVERT_NEED_BOUNDARY);
|
||||
} while ((l = l->next) != f->l_first);
|
||||
|
||||
if (ok) {
|
||||
|
@ -2355,7 +2355,7 @@ static void sculpt_face_set_extrude_id(Object *ob,
|
|||
BMLoop *l = f->l_first;
|
||||
do {
|
||||
MDynTopoVert *mv = BKE_PBVH_DYNVERT(cd_dyn_vert, l->v);
|
||||
mv->flag |= mupdateflag;
|
||||
MV_ADD_FLAG(mv, mupdateflag);
|
||||
} while ((l = l->next) != f->l_first);
|
||||
}
|
||||
|
||||
|
@ -2397,7 +2397,7 @@ static void sculpt_face_set_extrude_id(Object *ob,
|
|||
BMLoop *l = f->l_first;
|
||||
do {
|
||||
MDynTopoVert *mv = BKE_PBVH_DYNVERT(cd_dyn_vert, l->v);
|
||||
mv->flag |= mupdateflag;
|
||||
MV_ADD_FLAG(mv, mupdateflag);
|
||||
} while ((l = l->next) != f->l_first);
|
||||
}
|
||||
|
||||
|
@ -2431,7 +2431,7 @@ static void sculpt_face_set_extrude_id(Object *ob,
|
|||
if (cd_dyn_vert >= 0) {
|
||||
MDynTopoVert *mv = BM_ELEM_CD_GET_VOID_P(l->v, cd_dyn_vert);
|
||||
|
||||
mv->flag |= mupdateflag;
|
||||
MV_ADD_FLAG(mv, mupdateflag);
|
||||
}
|
||||
|
||||
if (BM_elem_flag_test(l->v, BM_ELEM_TAG)) {
|
||||
|
|
|
@ -459,8 +459,9 @@ static void bmesh_undo_on_vert_add(BMVert *v, void *userdata)
|
|||
BM_ELEM_CD_SET_INT(v, data->cd_vert_node_offset, -1);
|
||||
|
||||
MDynTopoVert *mv = BKE_PBVH_DYNVERT(data->cd_dyn_vert, v);
|
||||
mv->flag |= DYNVERT_NEED_DISK_SORT | DYNVERT_NEED_VALENCE | DYNVERT_NEED_TRIANGULATE |
|
||||
DYNVERT_NEED_BOUNDARY;
|
||||
MV_ADD_FLAG(mv,
|
||||
DYNVERT_NEED_DISK_SORT | DYNVERT_NEED_VALENCE | DYNVERT_NEED_TRIANGULATE |
|
||||
DYNVERT_NEED_BOUNDARY);
|
||||
}
|
||||
|
||||
static void bmesh_undo_on_face_kill(BMFace *f, void *userdata)
|
||||
|
@ -493,7 +494,7 @@ static void bmesh_undo_on_face_add(BMFace *f, void *userdata)
|
|||
BMLoop *l = f->l_first;
|
||||
do {
|
||||
MDynTopoVert *mv = BKE_PBVH_DYNVERT(data->cd_dyn_vert, l->v);
|
||||
mv->flag |= DYNVERT_NEED_DISK_SORT | DYNVERT_NEED_BOUNDARY;
|
||||
MV_ADD_FLAG(mv, DYNVERT_NEED_DISK_SORT | DYNVERT_NEED_BOUNDARY);
|
||||
|
||||
int ni_l = BM_ELEM_CD_GET_INT(l->v, data->cd_vert_node_offset);
|
||||
|
||||
|
@ -529,10 +530,12 @@ static void bmesh_undo_on_edge_kill(BMEdge *e, void *userdata)
|
|||
MDynTopoVert *mv1 = BKE_PBVH_DYNVERT(data->cd_dyn_vert, e->v1);
|
||||
MDynTopoVert *mv2 = BKE_PBVH_DYNVERT(data->cd_dyn_vert, e->v2);
|
||||
|
||||
mv1->flag |= DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_TRIANGULATE | DYNVERT_NEED_DISK_SORT |
|
||||
DYNVERT_NEED_VALENCE;
|
||||
mv2->flag |= DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_TRIANGULATE | DYNVERT_NEED_DISK_SORT |
|
||||
DYNVERT_NEED_VALENCE;
|
||||
MV_ADD_FLAG(mv1,
|
||||
DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_TRIANGULATE | DYNVERT_NEED_DISK_SORT |
|
||||
DYNVERT_NEED_VALENCE);
|
||||
MV_ADD_FLAG(mv2,
|
||||
DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_TRIANGULATE | DYNVERT_NEED_DISK_SORT |
|
||||
DYNVERT_NEED_VALENCE);
|
||||
}
|
||||
|
||||
static void bmesh_undo_on_edge_add(BMEdge *e, void *userdata)
|
||||
|
|
Loading…
Reference in New Issue