[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44629] trunk/blender/source/blender: bmesh: add back feature from 2. 4x Ctrl+Shift+T subdivides quads in the alternate direction.
Campbell Barton
ideasman42 at gmail.com
Sun Mar 4 03:18:23 CET 2012
Revision: 44629
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44629
Author: campbellbarton
Date: 2012-03-04 02:18:17 +0000 (Sun, 04 Mar 2012)
Log Message:
-----------
bmesh: add back feature from 2.4x Ctrl+Shift+T subdivides quads in the alternate direction.
Modified Paths:
--------------
trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c
trunk/blender/source/blender/bmesh/intern/bmesh_polygon.c
trunk/blender/source/blender/bmesh/intern/bmesh_polygon.h
trunk/blender/source/blender/bmesh/operators/bmo_triangulate.c
trunk/blender/source/blender/editors/mesh/bmesh_tools.c
trunk/blender/source/blender/editors/mesh/mesh_ops.c
Modified: trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c 2012-03-04 02:09:02 UTC (rev 44628)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c 2012-03-04 02:18:17 UTC (rev 44629)
@@ -676,6 +676,7 @@
{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
Modified: trunk/blender/source/blender/bmesh/intern/bmesh_polygon.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_polygon.c 2012-03-04 02:09:02 UTC (rev 44628)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_polygon.c 2012-03-04 02:18:17 UTC (rev 44629)
@@ -703,56 +703,78 @@
}
/**
- * \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;
}
-
- if (angle > 20 && angle < 90) break;
- if (angle < 100 && i > 5) break;
- i += 1;
-#endif
+ else if (!goodline(verts, f, BM_elem_index_get(v1), BM_elem_index_get(v2), BM_elem_index_get(v3), nvert)) {
+ isear = 0;
+ }
- 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 @@
* \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 @@
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 @@
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 @@
}
}
- /* NULL-terminat */
+ /* NULL-terminate */
if (newfaces) newfaces[nf_i] = NULL;
}
Modified: trunk/blender/source/blender/bmesh/intern/bmesh_polygon.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_polygon.h 2012-03-04 02:09:02 UTC (rev 44628)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_polygon.h 2012-03-04 02:18:17 UTC (rev 44629)
@@ -43,7 +43,8 @@
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);
Modified: trunk/blender/source/blender/bmesh/operators/bmo_triangulate.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_triangulate.c 2012-03-04 02:09:02 UTC (rev 44628)
+++ trunk/blender/source/blender/bmesh/operators/bmo_triangulate.c 2012-03-04 02:18:17 UTC (rev 44629)
@@ -47,7 +47,8 @@
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 @@
}
}
- 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 @@
BMOIter siter;
BMEdge *e;
BMOperator bmop;
- ScanFillEdge *eed;
+ /* ScanFillEdge *eed; */ /* UNUSED */
ScanFillVert *eve, *v1, *v2;
ScanFillFace *efa;
SmallHash hash;
@@ -185,7 +186,7 @@
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 */
}
Modified: trunk/blender/source/blender/editors/mesh/bmesh_tools.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/bmesh_tools.c 2012-03-04 02:09:02 UTC (rev 44628)
+++ trunk/blender/source/blender/editors/mesh/bmesh_tools.c 2012-03-04 02:18:17 UTC (rev 44629)
@@ -3450,8 +3450,9 @@
{
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 @@
/* 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)
Modified: trunk/blender/source/blender/editors/mesh/mesh_ops.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/mesh_ops.c 2012-03-04 02:09:02 UTC (rev 44628)
+++ trunk/blender/source/blender/editors/mesh/mesh_ops.c 2012-03-04 02:18:17 UTC (rev 44629)
@@ -309,6 +309,9 @@
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);
More information about the Bf-blender-cvs
mailing list