Revision: 60983
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60983
Author:   dfelinto
Date:     2013-10-29 02:42:51 +0000 (Tue, 29 Oct 2013)
Log Message:
-----------
Triangulate Modifier: using different ngon and quad methods

Quads: Beauty, Fixed, Fixed Alternate, Shortest Diagonal
Ngons: Beauty, Scanfill

* Shortest Diagonal is the default method in the modifier (popular
  elsewhere), but beauty is the default in Ctrl+T).

* Remove the need for output slot and beauty operator to be called
after Clt+T

Patch with collaborations and reviewed by Campbell Barton

Modified Paths:
--------------
    trunk/blender/release/scripts/startup/bl_ui/properties_data_modifier.py
    trunk/blender/source/blender/blenloader/intern/readfile.c
    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/intern/bmesh_queries.h
    trunk/blender/source/blender/bmesh/operators/bmo_triangulate.c
    trunk/blender/source/blender/bmesh/tools/bmesh_beautify.c
    trunk/blender/source/blender/bmesh/tools/bmesh_beautify.h
    trunk/blender/source/blender/bmesh/tools/bmesh_triangulate.c
    trunk/blender/source/blender/bmesh/tools/bmesh_triangulate.h
    trunk/blender/source/blender/editors/mesh/editmesh_tools.c
    trunk/blender/source/blender/editors/mesh/mesh_ops.c
    trunk/blender/source/blender/editors/sculpt_paint/sculpt.c
    trunk/blender/source/blender/makesdna/DNA_modifier_types.h
    trunk/blender/source/blender/makesrna/RNA_enum_types.h
    trunk/blender/source/blender/makesrna/intern/rna_modifier.c
    trunk/blender/source/blender/modifiers/intern/MOD_triangulate.c

Modified: 
trunk/blender/release/scripts/startup/bl_ui/properties_data_modifier.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_ui/properties_data_modifier.py     
2013-10-29 01:06:50 UTC (rev 60982)
+++ trunk/blender/release/scripts/startup/bl_ui/properties_data_modifier.py     
2013-10-29 02:42:51 UTC (rev 60983)
@@ -1099,8 +1099,15 @@
         col.prop(md, "use_z_symmetry")
 
     def TRIANGULATE(self, layout, ob, md):
-        layout.prop(md, "use_beauty")
+        row = layout.row()
 
+        col = row.column()
+        col.label(text="Quad Method:")
+        col.prop(md, "quad_method", text="")
+        col = row.column()
+        col.label(text="Ngon Method:")
+        col.prop(md, "ngon_method", text="")
+
     def UV_WARP(self, layout, ob, md):
         split = layout.split()
         col = split.column()

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c   2013-10-29 
01:06:50 UTC (rev 60982)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c   2013-10-29 
02:42:51 UTC (rev 60983)
@@ -9758,6 +9758,26 @@
                }
        }
 
+       if (!DNA_struct_elem_find(fd->filesdna, "TriangulateModifierData", 
"int", "quad_method")) {
+               Object *ob;
+               for (ob = main->object.first; ob; ob = ob->id.next) {
+                       ModifierData *md;
+                       for (md = ob->modifiers.first; md; md = md->next) {
+                               if (md->type == eModifierType_Triangulate) {
+                                       TriangulateModifierData *tmd = 
(TriangulateModifierData *)md;
+                                       if ((tmd->flag & 
MOD_TRIANGULATE_BEAUTY)) {
+                                               tmd->quad_method = 
MOD_TRIANGULATE_QUAD_BEAUTY;
+                                               tmd->ngon_method = 
MOD_TRIANGULATE_NGON_BEAUTY;
+                                       }
+                                       else {
+                                               tmd->quad_method = 
MOD_TRIANGULATE_QUAD_FIXED;
+                                               tmd->ngon_method = 
MOD_TRIANGULATE_NGON_SCANFILL;
+                                       }
+                               }
+                       }
+               }
+       }
+
        /* WATCH IT!!!: pointers from libdata have not been converted yet here! 
*/
        /* WATCH IT 2!: Userdef struct init see do_versions_userdef() above! */
 

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c 2013-10-29 
01:06:50 UTC (rev 60982)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c 2013-10-29 
02:42:51 UTC (rev 60983)
@@ -1028,7 +1028,8 @@
        "triangulate",
        /* slots_in */
        {{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
-        {"use_beauty", BMO_OP_SLOT_BOOL},
+        {"quad_method", BMO_OP_SLOT_INT},
+        {"ngon_method", BMO_OP_SLOT_INT},
         {{'\0'}},
        },
        /* slots_out */

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_polygon.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_polygon.c   2013-10-29 
01:06:50 UTC (rev 60982)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_polygon.c   2013-10-29 
02:42:51 UTC (rev 60983)
@@ -29,6 +29,7 @@
  */
 
 #include "DNA_listBase.h"
+#include "DNA_modifier_types.h"
 
 #include "BLI_alloca.h"
 #include "BLI_math.h"
@@ -817,7 +818,9 @@
 void BM_face_triangulate(BMesh *bm, BMFace *f,
                          BMFace **r_faces_new,
                          MemArena *sf_arena,
-                         const bool use_beauty, const bool use_tag)
+                         const int quad_method,
+                         const int ngon_method,
+                         const bool use_tag)
 {
        BMLoop *l_iter, *l_first, *l_new;
        BMFace *f_new;
@@ -825,6 +828,7 @@
        int nf_i = 0;
        BMEdge **edge_array;
        int edge_array_len;
+       bool use_beauty = (ngon_method == MOD_TRIANGULATE_NGON_BEAUTY);
 
 #define SF_EDGE_IS_BOUNDARY 0xff
 
@@ -832,9 +836,67 @@
 
 
        if (f->len == 4) {
+               BMVert *v1, *v2;
                l_first = BM_FACE_FIRST_LOOP(f);
 
-               f_new = BM_face_split(bm, f, l_first->v, 
l_first->next->next->v, &l_new, NULL, false);
+               switch (quad_method) {
+                       case MOD_TRIANGULATE_QUAD_FIXED:
+                       {
+                               v1 = l_first->v;
+                               v2 = l_first->next->next->v;
+                               break;
+                       }
+                       case MOD_TRIANGULATE_QUAD_ALTERNATE:
+                       {
+                               v1 = l_first->next->v;
+                               v2 = l_first->prev->v;
+                               break;
+                       }
+                       case MOD_TRIANGULATE_QUAD_SHORTEDGE:
+                       {
+                               BMVert *v3, *v4;
+                               float d1, d2;
+
+                               v1 = l_first->v;
+                               v2 = l_first->next->next->v;
+                               v3 = l_first->next->v;
+                               v4 = l_first->prev->v;
+
+                               d1 = len_squared_v3v3(v1->co, v2->co);
+                               d2 = len_squared_v3v3(v3->co, v4->co);
+
+                               if (d2 < d1) {
+                                       v1 = v3;
+                                       v2 = v4;
+                               }
+                               break;
+                       }
+                       case MOD_TRIANGULATE_QUAD_BEAUTY:
+                       default:
+                       {
+                               BMVert *v3, *v4;
+                               float cost;
+
+                               v1 = l_first->next->v;
+                               v2 = l_first->next->next->v;
+                               v3 = l_first->prev->v;
+                               v4 = l_first->v;
+
+                               cost = BM_verts_calc_rotate_beauty(v1, v2, v3, 
v4, 0, 0);
+
+                               if (cost < 0.0f) {
+                                       v1 = v4;
+                                       //v2 = v2;
+                               }
+                               else {
+                                       //v1 = v1;
+                                       v2 = v3;
+                               }
+                               break;
+                       }
+               }
+
+               f_new = BM_face_split(bm, f, v1, v2, &l_new, NULL, false);
                copy_v3_v3(f_new->no, f->no);
 
                if (use_tag) {

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_polygon.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_polygon.h   2013-10-29 
01:06:50 UTC (rev 60982)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_polygon.h   2013-10-29 
02:42:51 UTC (rev 60983)
@@ -54,7 +54,8 @@
 
 void  BM_face_triangulate(BMesh *bm, BMFace *f, BMFace **newfaces,
                           struct MemArena *sf_arena,
-                          const bool use_beauty, const bool use_tag) 
ATTR_NONNULL(1, 2);
+                          const int quad_method, const int ngon_method,
+                          const bool use_tag) ATTR_NONNULL(1, 2);
 
 void  BM_face_legal_splits(BMFace *f, BMLoop *(*loops)[2], int len) 
ATTR_NONNULL();
 

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_queries.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_queries.h   2013-10-29 
01:06:50 UTC (rev 60982)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_queries.h   2013-10-29 
02:42:51 UTC (rev 60983)
@@ -37,6 +37,7 @@
 bool    BM_vert_in_edge(const BMEdge *e, const BMVert *v);
 bool    BM_verts_in_edge(BMVert *v1, BMVert *v2, BMEdge *e);
 
+float   BM_verts_calc_length(BMVert *v1, BMVert *v2);
 float   BM_edge_calc_length(BMEdge *e);
 float   BM_edge_calc_length_squared(BMEdge *e);
 bool    BM_edge_face_pair(BMEdge *e, BMFace **r_fa, BMFace **r_fb);

Modified: trunk/blender/source/blender/bmesh/operators/bmo_triangulate.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_triangulate.c      
2013-10-29 01:06:50 UTC (rev 60982)
+++ trunk/blender/source/blender/bmesh/operators/bmo_triangulate.c      
2013-10-29 02:42:51 UTC (rev 60983)
@@ -42,13 +42,15 @@
 
 void bmo_triangulate_exec(BMesh *bm, BMOperator *op)
 {
-       const bool use_beauty = BMO_slot_bool_get(op->slots_in, "use_beauty");
+       const int quad_method = BMO_slot_int_get(op->slots_in, "quad_method");
+       const int ngon_method = BMO_slot_int_get(op->slots_in, "ngon_method");
+
        BMOpSlot *slot_facemap_out = BMO_slot_get(op->slots_out, 
"face_map.out");
 
        BM_mesh_elem_hflag_disable_all(bm, BM_FACE | BM_EDGE, BM_ELEM_TAG, 
false);
        BMO_slot_buffer_hflag_enable(bm, op->slots_in, "faces", BM_FACE, 
BM_ELEM_TAG, false);
 
-       BM_mesh_triangulate(bm, use_beauty, true, op, slot_facemap_out);
+       BM_mesh_triangulate(bm, quad_method, ngon_method, true, op, 
slot_facemap_out);
 
        BMO_slot_buffer_from_enabled_hflag(bm, op, op->slots_out, "edges.out", 
BM_EDGE, BM_ELEM_TAG);
        BMO_slot_buffer_from_enabled_hflag(bm, op, op->slots_out, "faces.out", 
BM_FACE, BM_ELEM_TAG);

Modified: trunk/blender/source/blender/bmesh/tools/bmesh_beautify.c
===================================================================
--- trunk/blender/source/blender/bmesh/tools/bmesh_beautify.c   2013-10-29 
01:06:50 UTC (rev 60982)
+++ trunk/blender/source/blender/bmesh/tools/bmesh_beautify.c   2013-10-29 
02:42:51 UTC (rev 60983)
@@ -252,19 +252,13 @@
        return FLT_MAX;
 }
 
-static float bm_edge_calc_rotate_beauty(const BMEdge *e, const short flag, 
const short method)
+float BM_verts_calc_rotate_beauty(
+const BMVert *v1, const BMVert *v2, const BMVert *v3, const BMVert *v4, const 
short flag, const short method)
 {
        /* not a loop (only to be able to break out) */
        do {
-               const float *v1, *v2, *v3, *v4;
-
-               v1 = e->l->prev->v->co;               /* first face co */
-               v2 = e->l->v->co;                     /* e->v1 or e->v2*/
-               v3 = e->l->radial_next->prev->v->co;  /* second face co */
-               v4 = e->l->next->v->co;               /* e->v1 or e->v2*/
-
                if (flag & VERT_RESTRICT_TAG) {
-                       BMVert *v_a = e->l->prev->v, *v_b = 
e->l->radial_next->prev->v;
+                       const BMVert *v_a = v1, *v_b = v3;
                        if (BM_elem_flag_test(v_a, BM_ELEM_TAG) ==  
BM_elem_flag_test(v_b, BM_ELEM_TAG)) {
                                break;
                        }
@@ -277,15 +271,26 @@
 
                switch (method) {
                        case 0:
-                               return bm_edge_calc_rotate_beauty__area(v1, v2, 
v3, v4);
+                               return bm_edge_calc_rotate_beauty__area(v1->co, 
v2->co, v3->co, v4->co);
                        default:
-                               return bm_edge_calc_rotate_beauty__angle(v1, 
v2, v3, v4);
+                               return 
bm_edge_calc_rotate_beauty__angle(v1->co, v2->co, v3->co, v4->co);
                }
        } while (false);
 
        return FLT_MAX;
 }
 
+static float bm_edge_calc_rotate_beauty(const BMEdge *e, const short flag, 
const short method)
+{
+       const BMVert *v1, *v2, *v3, *v4;
+       v1 = e->l->prev->v;               /* first vert co */
+       v2 = e->l->v;                     /* e->v1 or e->v2*/
+       v3 = e->l->radial_next->prev->v;  /* second vert co */
+       v4 = e->l->next->v;               /* e->v1 or e->v2*/
+
+       return BM_verts_calc_rotate_beauty(v1, v2, v3, v4, flag, method);
+}
+
 /* -------------------------------------------------------------------- */
 /* Update the edge cost of rotation in the heap */
 

Modified: trunk/blender/source/blender/bmesh/tools/bmesh_beautify.h
===================================================================
--- trunk/blender/source/blender/bmesh/tools/bmesh_beautify.h   2013-10-29 
01:06:50 UTC (rev 60982)
+++ trunk/blender/source/blender/bmesh/tools/bmesh_beautify.h   2013-10-29 
02:42:51 UTC (rev 60983)
@@ -35,4 +35,8 @@
                            const short flag, const short method,
                            const short oflag_edge, const short oflag_face);
 

@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to