Fix for inset bug (edge rail had feedback loop with direction)
also disable edge-rail by default.
This commit is contained in:
parent
f88776bb5c
commit
2a25676168
@ -395,6 +395,9 @@ void bmo_inset_region_exec(BMesh *bm, BMOperator *op)
|
||||
const float thickness = BMO_slot_float_get(op->slots_in, "thickness");
|
||||
const float depth = BMO_slot_float_get(op->slots_in, "depth");
|
||||
|
||||
/* store vert coords in normals, needed for 'use_edge_rail' */
|
||||
#define USE_VERTNORMAL_HACK
|
||||
|
||||
int edge_info_len = 0;
|
||||
|
||||
BMIter iter;
|
||||
@ -453,6 +456,11 @@ void bmo_inset_region_exec(BMesh *bm, BMOperator *op)
|
||||
|
||||
BM_elem_index_set(e, -1); /* set_dirty! */
|
||||
}
|
||||
|
||||
#ifdef USE_VERTNORMAL_HACK
|
||||
copy_v3_v3(e->v1->no, e->v1->co);
|
||||
copy_v3_v3(e->v2->no, e->v2->co);
|
||||
#endif
|
||||
}
|
||||
bm->elem_index_dirty |= BM_EDGE;
|
||||
|
||||
@ -564,6 +572,9 @@ void bmo_inset_region_exec(BMesh *bm, BMOperator *op)
|
||||
|
||||
/* in some cases the edge doesn't split off */
|
||||
if (r_vout_len == 1) {
|
||||
#ifdef USE_VERTNORMAL_HACK
|
||||
copy_v3_v3(vout[0]->no, vout[0]->co);
|
||||
#endif
|
||||
MEM_freeN(vout);
|
||||
continue;
|
||||
}
|
||||
@ -575,6 +586,10 @@ void bmo_inset_region_exec(BMesh *bm, BMOperator *op)
|
||||
int vert_edge_tag_tot = 0;
|
||||
int vecpair[2];
|
||||
|
||||
#ifdef USE_VERTNORMAL_HACK
|
||||
copy_v3_v3(v_split->no, v_split->co);
|
||||
#endif
|
||||
|
||||
/* find adjacent */
|
||||
BM_ITER_ELEM (e, &iter, v_split, BM_EDGES_OF_VERT) {
|
||||
if (BM_elem_flag_test(e, BM_ELEM_TAG) &&
|
||||
@ -628,7 +643,17 @@ void bmo_inset_region_exec(BMesh *bm, BMOperator *op)
|
||||
if (l_other_a->v == l_other_b->v) {
|
||||
/* both edges faces are adjacent, but we don't need to know the shared edge
|
||||
* having both verts is enough. */
|
||||
sub_v3_v3v3(tvec, l_other_a->v->co, v_split->co);
|
||||
const float *co_other;
|
||||
|
||||
/* note that we can't use 'l_other_a->v' directly since it
|
||||
* may be inset and give a feedback loop. */
|
||||
#ifdef USE_VERTNORMAL_HACK
|
||||
co_other = l_other_a->v->no;
|
||||
#else
|
||||
co_other = l_other_a->v->co;
|
||||
#endif
|
||||
|
||||
sub_v3_v3v3(tvec, co_other, v_split->co);
|
||||
is_mid = false;
|
||||
}
|
||||
else if (compare_v3v3(f_a->no, f_b->no, 0.001f) == false) {
|
||||
|
@ -503,7 +503,7 @@ void MESH_OT_inset(wmOperatorType *ot)
|
||||
RNA_def_boolean(ot->srna, "use_boundary", true, "Boundary", "Inset face boundaries");
|
||||
RNA_def_boolean(ot->srna, "use_even_offset", true, "Offset Even", "Scale the offset to give more even thickness");
|
||||
RNA_def_boolean(ot->srna, "use_relative_offset", false, "Offset Relative", "Scale the offset by surrounding geometry");
|
||||
RNA_def_boolean(ot->srna, "use_edge_rail", true, "Edge Rail", "Inset the region along existing edges");
|
||||
RNA_def_boolean(ot->srna, "use_edge_rail", false, "Edge Rail", "Inset the region along existing edges");
|
||||
|
||||
prop = RNA_def_float(ot->srna, "thickness", 0.01f, 0.0f, FLT_MAX, "Thickness", "", 0.0f, 10.0f);
|
||||
/* use 1 rather then 10 for max else dragging the button moves too far */
|
||||
|
Loading…
Reference in New Issue
Block a user