diff options
author | Campbell Barton <ideasman42@gmail.com> | 2012-03-04 06:18:17 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2012-03-04 06:18:17 +0400 |
commit | d99888d786ae46ea6ac8ac4a435d38789861207e (patch) | |
tree | 185d10e14aeabe98284365e693c3d2029472518f | |
parent | 88e0bcfbe1407d6a93c2907bd6e9ce9d9d2976fa (diff) |
bmesh: add back feature from 2.4x Ctrl+Shift+T subdivides quads in the alternate direction.
-rw-r--r-- | source/blender/bmesh/intern/bmesh_opdefines.c | 1 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_polygon.c | 101 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_polygon.h | 3 | ||||
-rw-r--r-- | source/blender/bmesh/operators/bmo_triangulate.c | 9 | ||||
-rw-r--r-- | source/blender/editors/mesh/bmesh_tools.c | 5 | ||||
-rw-r--r-- | source/blender/editors/mesh/mesh_ops.c | 3 |
6 files changed, 77 insertions, 45 deletions
diff --git a/source/blender/bmesh/intern/bmesh_opdefines.c b/source/blender/bmesh/intern/bmesh_opdefines.c index 37df243d3fc..e9c25fd4bbc 100644 --- a/source/blender/bmesh/intern/bmesh_opdefines.c +++ b/source/blender/bmesh/intern/bmesh_opdefines.c @@ -676,6 +676,7 @@ static BMOpDefine bmo_triangulate_def = { {BMO_OP_SLOT_ELEMENT_BUF, "edgeout"}, {BMO_OP_SLOT_ELEMENT_BUF, "faceout"}, {BMO_OP_SLOT_MAPPING, "facemap"}, + {BMO_OP_SLOT_BOOL, "use_beauty"}, {0} /* null-terminating sentine */}, bmo_triangulate_exec, BMO_OP_FLAG_UNTAN_MULTIRES diff --git a/source/blender/bmesh/intern/bmesh_polygon.c b/source/blender/bmesh/intern/bmesh_polygon.c index 67bdec16a05..52dc134980c 100644 --- a/source/blender/bmesh/intern/bmesh_polygon.c +++ b/source/blender/bmesh/intern/bmesh_polygon.c @@ -703,55 +703,77 @@ static int goodline(float (*projectverts)[3], BMFace *f, int v1i, } /** - * \brief FIND EAR + * \brief Find Ear * * Used by tesselator to find * the next triangle to 'clip off' * of a polygon while tessellating. + * + * \param use_beauty Currently only applies to quads, can be extended later on. + * */ -static BMLoop *find_ear(BMesh *UNUSED(bm), BMFace *f, float (*verts)[3], const int nvert) +static BMLoop *find_ear(BMesh *UNUSED(bm), BMFace *f, float (*verts)[3], const int nvert, const int use_beauty) { - BMVert *v1, *v2, *v3; BMLoop *bestear = NULL; BMLoop *l_iter; BMLoop *l_first; - /* float angle, bestangle = 180.0f; */ - int isear /*, i = 0 */; - - l_iter = l_first = BM_FACE_FIRST_LOOP(f); - do { - isear = 1; - - v1 = l_iter->prev->v; - v2 = l_iter->v; - v3 = l_iter->next->v; - if (BM_edge_exists(v1, v3)) { - isear = 0; - } - else if (!goodline(verts, f, BM_elem_index_get(v1), BM_elem_index_get(v2), BM_elem_index_get(v3), nvert)) { - isear = 0; - } + if (f->len == 4) { + BMLoop *larr[4]; + int i = 0; - if (isear) { -#if 0 - /* if this code comes back, it needs to be converted to radians */ - angle = angle_v3v3v3(verts[v1->head.eflag2], verts[v2->head.eflag2], verts[v3->head.eflag2]); - if (!bestear || ABS(angle - 45.0f) < bestangle) { - bestear = l; - bestangle = ABS(45.0f - angle); + l_iter = l_first = BM_FACE_FIRST_LOOP(f); + do { + larr[i] = l_iter; + i++; + } while ((l_iter = l_iter->next) != l_first); + + /* pick 0/1 based on best lenth */ + bestear = larr[(((len_squared_v3v3(larr[0]->v->co, larr[2]->v->co) > + len_squared_v3v3(larr[1]->v->co, larr[3]->v->co))) != use_beauty)]; + + } + else { + BMVert *v1, *v2, *v3; + + /* float angle, bestangle = 180.0f; */ + int isear /*, i = 0 */; + + l_iter = l_first = BM_FACE_FIRST_LOOP(f); + do { + isear = 1; + + v1 = l_iter->prev->v; + v2 = l_iter->v; + v3 = l_iter->next->v; + + if (BM_edge_exists(v1, v3)) { + isear = 0; + } + else if (!goodline(verts, f, BM_elem_index_get(v1), BM_elem_index_get(v2), BM_elem_index_get(v3), nvert)) { + isear = 0; } - - if (angle > 20 && angle < 90) break; - if (angle < 100 && i > 5) break; - i += 1; -#endif - bestear = l_iter; - break; - } - } while ((l_iter = l_iter->next) != l_first); + if (isear) { + #if 0 + /* if this code comes back, it needs to be converted to radians */ + angle = angle_v3v3v3(verts[v1->head.eflag2], verts[v2->head.eflag2], verts[v3->head.eflag2]); + if (!bestear || ABS(angle - 45.0f) < bestangle) { + bestear = l; + bestangle = ABS(45.0f - angle); + } + + if (angle > 20 && angle < 90) break; + if (angle < 100 && i > 5) break; + i += 1; + #endif + + bestear = l_iter; + break; + } + } while ((l_iter = l_iter->next) != l_first); + } return bestear; } @@ -772,7 +794,8 @@ static BMLoop *find_ear(BMesh *UNUSED(bm), BMFace *f, float (*verts)[3], const i * \note newedgeflag sets a flag layer flag, obviously not the header flag. */ void BM_face_triangulate(BMesh *bm, BMFace *f, float (*projectverts)[3], - const short newedge_oflag, const short newface_oflag, BMFace **newfaces) + const short newedge_oflag, const short newface_oflag, BMFace **newfaces, + const short use_beauty) { int i, done, nvert, nf_i = 0; BMLoop *newl, *nextloop; @@ -806,7 +829,7 @@ void BM_face_triangulate(BMesh *bm, BMFace *f, float (*projectverts)[3], done = 0; while (!done && f->len > 3) { done = 1; - l_iter = find_ear(bm, f, projectverts, nvert); + l_iter = find_ear(bm, f, projectverts, nvert, use_beauty); if (l_iter) { done = 0; /* v = l->v; */ /* UNUSED */ @@ -848,7 +871,7 @@ void BM_face_triangulate(BMesh *bm, BMFace *f, float (*projectverts)[3], if (!f) { printf("triangle fan step of triangulator failed.\n"); - /* NULL-terminat */ + /* NULL-terminate */ if (newfaces) newfaces[nf_i] = NULL; return; } @@ -861,7 +884,7 @@ void BM_face_triangulate(BMesh *bm, BMFace *f, float (*projectverts)[3], } } - /* NULL-terminat */ + /* NULL-terminate */ if (newfaces) newfaces[nf_i] = NULL; } diff --git a/source/blender/bmesh/intern/bmesh_polygon.h b/source/blender/bmesh/intern/bmesh_polygon.h index 9ee1714d125..49fe2d7a809 100644 --- a/source/blender/bmesh/intern/bmesh_polygon.h +++ b/source/blender/bmesh/intern/bmesh_polygon.h @@ -43,7 +43,8 @@ void BM_face_normal_flip(BMesh *bm, BMFace *f); int BM_face_point_inside_test(BMesh *bm, BMFace *f, const float co[3]); void BM_face_triangulate(BMesh *bm, BMFace *f, float (*projectverts)[3], - const short newedge_oflag, const short newface_oflag, BMFace **newfaces); + const short newedge_oflag, const short newface_oflag, BMFace **newfaces, + const short use_beauty); void BM_face_legal_splits(BMesh *bm, BMFace *f, BMLoop *(*loops)[2], int len); diff --git a/source/blender/bmesh/operators/bmo_triangulate.c b/source/blender/bmesh/operators/bmo_triangulate.c index 527ffd9a080..2029d595af7 100644 --- a/source/blender/bmesh/operators/bmo_triangulate.c +++ b/source/blender/bmesh/operators/bmo_triangulate.c @@ -47,7 +47,8 @@ void bmo_triangulate_exec(BMesh *bm, BMOperator *op) float (*projectverts)[3] = NULL; BLI_array_declare(projectverts); int i, lastlen = 0 /* , count = 0 */; - + const int use_beauty = BMO_slot_bool_get(op, "use_beauty"); + face = BMO_iter_new(&siter, bm, op, "faces", BM_FACE); for ( ; face; face = BMO_iter_step(&siter)) { if (lastlen < face->len) { @@ -61,7 +62,7 @@ void bmo_triangulate_exec(BMesh *bm, BMOperator *op) } } - BM_face_triangulate(bm, face, projectverts, EDGE_NEW, FACE_NEW, newfaces); + BM_face_triangulate(bm, face, projectverts, EDGE_NEW, FACE_NEW, newfaces, use_beauty); BMO_slot_map_ptr_insert(bm, op, "facemap", face, face); for (i = 0; newfaces[i]; i++) { @@ -159,7 +160,7 @@ void bmo_triangle_fill_exec(BMesh *bm, BMOperator *op) BMOIter siter; BMEdge *e; BMOperator bmop; - ScanFillEdge *eed; + /* ScanFillEdge *eed; */ /* UNUSED */ ScanFillVert *eve, *v1, *v2; ScanFillFace *efa; SmallHash hash; @@ -185,7 +186,7 @@ void bmo_triangle_fill_exec(BMesh *bm, BMOperator *op) v1 = BLI_smallhash_lookup(&hash, (uintptr_t)e->v1); v2 = BLI_smallhash_lookup(&hash, (uintptr_t)e->v2); - eed = BLI_addfilledge(v1, v2); + /* eed = */ BLI_addfilledge(v1, v2); /* eed->tmp.p = e; */ /* UNUSED */ } diff --git a/source/blender/editors/mesh/bmesh_tools.c b/source/blender/editors/mesh/bmesh_tools.c index 79164d87e98..487f954e4b3 100644 --- a/source/blender/editors/mesh/bmesh_tools.c +++ b/source/blender/editors/mesh/bmesh_tools.c @@ -3450,8 +3450,9 @@ static int quads_convert_to_tris_exec(bContext *C, wmOperator *op) { Object *obedit = CTX_data_edit_object(C); BMEditMesh *em = BMEdit_FromObject(obedit); + int use_beauty = RNA_boolean_get(op->ptr, "use_beauty"); - if (!EDBM_CallOpf(em, op, "triangulate faces=%hf", BM_ELEM_SELECT)) + if (!EDBM_CallOpf(em, op, "triangulate faces=%hf use_beauty=%b", BM_ELEM_SELECT, use_beauty)) return OPERATOR_CANCELLED; DAG_id_tag_update(obedit->data, OB_RECALC_DATA); @@ -3472,6 +3473,8 @@ void MESH_OT_quads_convert_to_tris(wmOperatorType *ot) /* flags */ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO; + + RNA_def_boolean(ot->srna, "use_beauty", 1, "Beauty", "Use best triangulation division (currently quads only)"); } static int tris_convert_to_quads_exec(bContext *C, wmOperator *op) diff --git a/source/blender/editors/mesh/mesh_ops.c b/source/blender/editors/mesh/mesh_ops.c index 1c38a9d3cd3..33108ff6f83 100644 --- a/source/blender/editors/mesh/mesh_ops.c +++ b/source/blender/editors/mesh/mesh_ops.c @@ -309,6 +309,9 @@ void ED_keymap_mesh(wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "MESH_OT_beautify_fill", FKEY, KM_PRESS, KM_SHIFT|KM_ALT, 0); WM_keymap_add_item(keymap, "MESH_OT_quads_convert_to_tris", TKEY, KM_PRESS, KM_CTRL, 0); + kmi = WM_keymap_add_item(keymap, "MESH_OT_quads_convert_to_tris", TKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0); + RNA_boolean_set(kmi->ptr, "use_beauty", FALSE); + WM_keymap_add_item(keymap, "MESH_OT_tris_convert_to_quads", JKEY, KM_PRESS, KM_ALT, 0); WM_keymap_add_item(keymap, "MESH_OT_rip_move",VKEY, KM_PRESS, 0, 0); |