Revision: 59860
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=59860
Author:   campbellbarton
Date:     2013-09-05 22:58:35 +0000 (Thu, 05 Sep 2013)
Log Message:
-----------
grid-fill now detects non-square grids (this is what users would expect)

http://www.graphicall.org/ftp/ideasman42/gridfill_detect_nonsquare.png

Modified Paths:
--------------
    trunk/blender/source/blender/editors/mesh/editmesh_tools.c

Modified: trunk/blender/source/blender/editors/mesh/editmesh_tools.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_tools.c  2013-09-05 
22:24:12 UTC (rev 59859)
+++ trunk/blender/source/blender/editors/mesh/editmesh_tools.c  2013-09-05 
22:58:35 UTC (rev 59860)
@@ -45,6 +45,7 @@
 #include "BLI_noise.h"
 #include "BLI_math.h"
 #include "BLI_rand.h"
+#include "BLI_sort_utils.h"
 
 #include "BKE_material.h"
 #include "BKE_context.h"
@@ -2834,6 +2835,7 @@
        RNA_def_boolean(ot->srna, "use_beauty", true, "Beauty", "Use best 
triangulation division");
 }
 
+
 /* -------------------------------------------------------------------- */
 /* Grid Fill (and helper functions) */
 
@@ -2861,11 +2863,12 @@
 /**
  * non-essential utility function to select 2 open edge loops from a closed 
loop.
  */
-static void edbm_fill_grid_prepare(BMesh *bm, int span, int offset)
+static void edbm_fill_grid_prepare(BMesh *bm, int offset, int *r_span, bool 
span_calc)
 {
        BMEdge *e;
        BMIter iter;
        int count;
+       int span = *r_span;
 
        ListBase eloops = {NULL};
        struct BMEdgeLoopStore *el_store;
@@ -2923,10 +2926,55 @@
                }
 
                MEM_freeN(edges);
+
+
+               if (span_calc) {
+                       /* calculate the span by finding the next corner in 
'verts'
+                        * we dont know what defines a corner exactly so find 
the 4 verts
+                        * in the loop with the greatest angle.
+                        * Tag them and use the first tagged vertex to 
calcualte the span.
+                        *
+                        * note: we may have already checked 
'edbm_fill_grid_vert_tag_angle()' on each
+                        * vert, but advantage of de-duplicating is minimal. */
+                       struct SortPointerByFloat *ele_sort = 
MEM_mallocN(sizeof(*ele_sort) * verts_len, __func__);
+                       LinkData *v_link;
+                       for (v_link = verts->first, i = 0; v_link; v_link = 
v_link->next, i++) {
+                               BMVert *v = v_link->data;
+                               const float angle = 
edbm_fill_grid_vert_tag_angle(v);
+                               ele_sort[i].sort_value = angle;
+                               ele_sort[i].data = v;
+
+                               BM_elem_flag_disable(v, BM_ELEM_TAG);
+                       }
+
+                       qsort(ele_sort, verts_len, sizeof(*ele_sort), 
BLI_sortutil_cmp_float_reverse);
+
+                       for (i = 0; i < 4; i++) {
+                               BMVert *v = ele_sort[i].data;
+                               BM_elem_flag_enable(v, BM_ELEM_TAG);
+                       }
+
+                       /* now find the first... */
+                       for (v_link = verts->first, i = 0; i < verts_len / 2; 
v_link = v_link->next, i++) {
+                               BMVert *v = v_link->data;
+                               if (BM_elem_flag_test(v, BM_ELEM_TAG)) {
+                                       if (v != v_act) {
+                                               span = i;
+                                               // printf("Span found %d\n", 
span);
+                                               break;
+                                       }
+                               }
+                       }
+                       MEM_freeN(ele_sort);
+               }
+               /* end span calc */
+
        }
        /* else let the bmesh-operator handle it */
 
        BM_mesh_edgeloops_free(&eloops);
+
+       *r_span = span;
 }
 
 static int edbm_fill_grid_exec(bContext *C, wmOperator *op)
@@ -2937,13 +2985,14 @@
        const short use_smooth = edbm_add_edge_face__smooth_get(em->bm);
        const int totedge_orig = em->bm->totedge;
        const int totface_orig = em->bm->totface;
-
        const bool use_prepare = true;
 
+
        if (use_prepare) {
                /* use when we have a single loop selected */
                PropertyRNA *prop_span = RNA_struct_find_property(op->ptr, 
"span");
                PropertyRNA *prop_offset = RNA_struct_find_property(op->ptr, 
"offset");
+               bool calc_span;
 
                const int clamp = em->bm->totvertsel;
                int span;
@@ -2952,19 +3001,24 @@
                if (RNA_property_is_set(op->ptr, prop_span)) {
                        span = RNA_property_int_get(op->ptr, prop_span);
                        span = min_ii(span, (clamp / 2) - 1);
+                       calc_span = false;
                }
                else {
                        span = clamp / 4;
+                       calc_span = true;
                }
-               RNA_property_int_set(op->ptr, prop_span, span);
 
                offset = RNA_property_int_get(op->ptr, prop_offset);
                offset = mod_i(offset, clamp);
 
                /* in simple cases, move selection for tags, but also support 
more advanced cases */
-               edbm_fill_grid_prepare(em->bm, span, offset);
+               edbm_fill_grid_prepare(em->bm, offset, &span, calc_span);
+
+               RNA_property_int_set(op->ptr, prop_span, span);
        }
+       /* end tricky prepare code */
 
+
        if (!EDBM_op_init(em, &bmop, op,
                          "grid_fill edges=%he mat_nr=%i use_smooth=%b",
                          use_prepare ? BM_ELEM_TAG : BM_ELEM_SELECT, 
em->mat_nr, use_smooth))

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to