bevel now only takes manifold edges (so it doesnt need to check for them)
This commit is contained in:
@@ -32,20 +32,27 @@
|
|||||||
|
|
||||||
void bmo_bevel_exec(BMesh *bm, BMOperator *op)
|
void bmo_bevel_exec(BMesh *bm, BMOperator *op)
|
||||||
{
|
{
|
||||||
BMOIter siter;
|
|
||||||
BMVert *v;
|
|
||||||
|
|
||||||
const float offset = BMO_slot_float_get(op, "offset");
|
const float offset = BMO_slot_float_get(op, "offset");
|
||||||
const int seg = BMO_slot_int_get(op, "segments");
|
const int seg = BMO_slot_int_get(op, "segments");
|
||||||
|
|
||||||
if (offset > 0) {
|
if (offset > 0) {
|
||||||
|
BMOIter siter;
|
||||||
|
BMEdge *e;
|
||||||
|
BMVert *v;
|
||||||
|
|
||||||
/* first flush 'geom' into flags, this makes it possible to check connected data */
|
/* first flush 'geom' into flags, this makes it possible to check connected data */
|
||||||
BM_mesh_elem_hflag_disable_all(bm, BM_VERT | BM_EDGE, BM_ELEM_TAG, FALSE);
|
BM_mesh_elem_hflag_disable_all(bm, BM_VERT | BM_EDGE, BM_ELEM_TAG, FALSE);
|
||||||
|
|
||||||
BMO_ITER (v, &siter, bm, op, "geom", BM_VERT | BM_EDGE) {
|
BMO_ITER (v, &siter, bm, op, "geom", BM_VERT) {
|
||||||
BM_elem_flag_enable(v, BM_ELEM_TAG);
|
BM_elem_flag_enable(v, BM_ELEM_TAG);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BMO_ITER (e, &siter, bm, op, "geom", BM_EDGE) {
|
||||||
|
if (BM_edge_is_manifold(e)) {
|
||||||
|
BM_elem_flag_enable(e, BM_ELEM_TAG);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
BM_mesh_bevel(bm, offset, seg);
|
BM_mesh_bevel(bm, offset, seg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1414,13 +1414,9 @@ static void bevel_vert_construct(BMesh *bm, BevelParams *bp, BMVert *v)
|
|||||||
|
|
||||||
BM_ITER_ELEM (bme, &iter, v, BM_EDGES_OF_VERT) {
|
BM_ITER_ELEM (bme, &iter, v, BM_EDGES_OF_VERT) {
|
||||||
if (BM_elem_flag_test(bme, BM_ELEM_TAG)) {
|
if (BM_elem_flag_test(bme, BM_ELEM_TAG)) {
|
||||||
if (BM_edge_is_manifold(bme)) {
|
BLI_assert(BM_edge_is_manifold(bme));
|
||||||
nsel++;
|
nsel++;
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
BM_elem_flag_disable(bme, BM_ELEM_TAG);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nsel == 0)
|
if (nsel == 0)
|
||||||
@@ -1672,6 +1668,7 @@ static void bevel_build_edge_polygons(BMesh *bm, BevelParams *bp, BMEdge *bme)
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* currently only bevels BM_ELEM_TAG'd verts and edges
|
* currently only bevels BM_ELEM_TAG'd verts and edges
|
||||||
|
* all tagged edges _must_ be manifold.
|
||||||
*/
|
*/
|
||||||
void BM_mesh_bevel(BMesh *bm, const float offset, const float segments)
|
void BM_mesh_bevel(BMesh *bm, const float offset, const float segments)
|
||||||
{
|
{
|
||||||
|
@@ -134,11 +134,13 @@ static DerivedMesh *applyModifier(ModifierData *md, struct Object *UNUSED(ob),
|
|||||||
else {
|
else {
|
||||||
/* crummy, is there a way just to operator on all? - campbell */
|
/* crummy, is there a way just to operator on all? - campbell */
|
||||||
BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
|
BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
|
||||||
|
if (BM_edge_is_manifold(e)) {
|
||||||
BM_elem_flag_enable(e, BM_ELEM_TAG);
|
BM_elem_flag_enable(e, BM_ELEM_TAG);
|
||||||
BM_elem_flag_enable(e->v1, BM_ELEM_TAG);
|
BM_elem_flag_enable(e->v1, BM_ELEM_TAG);
|
||||||
BM_elem_flag_enable(e->v2, BM_ELEM_TAG);
|
BM_elem_flag_enable(e->v2, BM_ELEM_TAG);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
BM_mesh_bevel(bm, bmd->value, segments);
|
BM_mesh_bevel(bm, bmd->value, segments);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user