Revision: 42598
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42598
Author:   campbellbarton
Date:     2011-12-13 09:57:19 +0000 (Tue, 13 Dec 2011)
Log Message:
-----------
2 new bevel options for the operator and the modifier.

* even offset, uses same shell distance method as solidify to give even with 
beveled faces.
* distance offset, this is mostly for compatibility with the modifier in trunk 
which uses the bevel width as a distance rather then a percentage. at the 
moment this is awkward for the operator since it makes percent act differently 
where the 0-1 range doesnt make sense.

still need to bring back more options from trunks bevel modifier.

Modified Paths:
--------------
    
branches/bmesh/blender/release/scripts/startup/bl_ui/properties_data_modifier.py
    branches/bmesh/blender/source/blender/blenkernel/BKE_bmesh.h
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
    branches/bmesh/blender/source/blender/bmesh/operators/bevel.c
    branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c
    branches/bmesh/blender/source/blender/makesrna/intern/rna_modifier.c
    branches/bmesh/blender/source/blender/modifiers/intern/MOD_bevel.c

Modified: 
branches/bmesh/blender/release/scripts/startup/bl_ui/properties_data_modifier.py
===================================================================
--- 
branches/bmesh/blender/release/scripts/startup/bl_ui/properties_data_modifier.py
    2011-12-13 09:54:48 UTC (rev 42597)
+++ 
branches/bmesh/blender/release/scripts/startup/bl_ui/properties_data_modifier.py
    2011-12-13 09:57:19 UTC (rev 42598)
@@ -126,6 +126,12 @@
         split.prop(md, "width")
         split.prop(md, "use_only_vertices")
 
+        # BMESH_BRANCH ONLY
+        split = layout.split()
+        split.prop(md, "use_even_offset")
+        split.prop(md, "use_distance_offset")
+        # END BMESH_BRANCH ONLY
+
         layout.label(text="Limit Method:")
         layout.row().prop(md, "limit_method", expand=True)
         if md.limit_method == 'ANGLE':

Modified: branches/bmesh/blender/source/blender/blenkernel/BKE_bmesh.h
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/BKE_bmesh.h        
2011-12-13 09:54:48 UTC (rev 42597)
+++ branches/bmesh/blender/source/blender/blenkernel/BKE_bmesh.h        
2011-12-13 09:57:19 UTC (rev 42598)
@@ -209,6 +209,10 @@
 #define BME_BEVEL_RUNNING              (1<<9)
 #define BME_BEVEL_RES                  (1<<10)
 
+#define BME_BEVEL_EVEN                 (1<<11) /* this is a new setting not 
related to old (trunk bmesh bevel code) but adding
+                                         * here because they are mixed - 
campbell */
+#define BME_BEVEL_DIST                 (1<<12) /* same as above */
+
 typedef struct BME_TransData {
        BME_Mesh *bm; /* the bmesh the vert belongs to */
        BME_Vert *v;  /* pointer to the vert this tdata applies to */

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c        
2011-12-13 09:54:48 UTC (rev 42597)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c        
2011-12-13 09:57:19 UTC (rev 42598)
@@ -1012,7 +1012,10 @@
        {{BMOP_OPSLOT_ELEMENT_BUF, "geom"}, /* input edges and vertices */
         {BMOP_OPSLOT_ELEMENT_BUF, "face_spans"}, /* new geometry */
         {BMOP_OPSLOT_ELEMENT_BUF, "face_holes"}, /* new geometry */
-        {BMOP_OPSLOT_INT, "uselengths"}, /* grab edge lengths from a PROP_FLT 
customdata layer*/
+        {BMOP_OPSLOT_INT, "use_lengths"}, /* grab edge lengths from a PROP_FLT 
customdata layer*/
+        {BMOP_OPSLOT_INT, "use_even"}, /* corner vert placement: use 
shell/angle calculations  */
+        {BMOP_OPSLOT_INT, "use_dist"}, /* corner vert placement: evaluate 
percent as a distance,
+                                        * modifier uses this. We could do this 
as another float setting */
         {BMOP_OPSLOT_INT, "lengthlayer"}, /* which PROP_FLT layer to use*/
         {BMOP_OPSLOT_FLT, "percent"}, /* percentage to expand bevelled edges*/
         {0} /*null-terminating sentinel*/},

Modified: branches/bmesh/blender/source/blender/bmesh/operators/bevel.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/bevel.c       
2011-12-13 09:54:48 UTC (rev 42597)
+++ branches/bmesh/blender/source/blender/bmesh/operators/bevel.c       
2011-12-13 09:57:19 UTC (rev 42598)
@@ -30,11 +30,12 @@
        BMVert *newv1, *newv2;
 } EdgeTag;
 
-static void calc_corner_co(BMesh *bm, BMLoop *l, const float fac, float 
r_co[3])
+static void calc_corner_co(BMesh *bm, BMLoop *l, const float fac, float 
r_co[3], const short do_dist, const short do_even)
 {
-       float  no[3], l_vec_prev[3], l_vec_next[3], l_co_prev[3], l_co[3], 
l_co_next[3];
+       float  no[3], l_vec_prev[3], l_vec_next[3], l_co_prev[3], l_co[3], 
l_co_next[3], co_ofs[3];
        int is_concave;
 
+       /* first get the prev/next verts */
        if (l->f->len > 2) {
                copy_v3_v3(l_co_prev, l->prev->v->co);
                copy_v3_v3(l_co, l->v->co);
@@ -73,57 +74,69 @@
                is_concave = dot_v3v3(no, up) < 0.0f;
        }
 
-       if (1) {
-               /*simple percentage method */
 
+       /* now calculate the new location */
+       if (do_dist) { /* treat 'fac' as distance */
 
+               normalize_v3(l_vec_prev);
+               normalize_v3(l_vec_next);
+
+               add_v3_v3v3(co_ofs, l_vec_prev,l_vec_next);
+               normalize_v3(co_ofs);
+
+               if (do_even) {
+                       negate_v3(l_vec_next);
+                       mul_v3_fl(co_ofs, fac * shell_angle_to_dist(0.5f * 
angle_normalized_v3v3(l_vec_prev, l_vec_next)));
+                       /* negate_v3(l_vec_next); */ /* no need unless we use 
again */
+               }
+               else {
+                       mul_v3_fl(co_ofs, fac);
+               }
+       }
+       else { /* treat as 'fac' as a factor (0 - 1) */
+
                /* not strictly necessary, balance vectors
                 * so the longer edge doesn't skew the result,
                 * gives nicer, move even output */
                float medium= (normalize_v3(l_vec_prev) + 
normalize_v3(l_vec_next)) / 2.0f;
+               float angle= do_even ? angle_normalized_v3v3(l_vec_prev, 
l_vec_next) : 0.0f; /* get angle while normalized */
+
                mul_v3_fl(l_vec_prev, medium);
                mul_v3_fl(l_vec_next, medium);
-               /* done */
 
+               add_v3_v3v3(co_ofs, l_vec_prev, l_vec_next);
 
-               add_v3_v3(l_vec_prev, l_vec_next);
-               mul_v3_fl(l_vec_prev, fac * 0.5);
-
-               if (is_concave)
-                       negate_v3(l_vec_prev);
-
-               add_v3_v3v3(r_co, l_vec_prev, l->v->co);
+               /* done */
+               if (do_even) {
+                       negate_v3(l_vec_next);
+                       mul_v3_fl(co_ofs, (fac * 0.5) * 
shell_angle_to_dist(0.5f * angle));
+                       /* negate_v3(l_vec_next); */ /* no need unless we use 
again */
+               }
+               else {
+                       mul_v3_fl(co_ofs, fac * 0.5);
+               }
        }
-       else {
-               /* distance based */
-               float tvec[3];
-               float dist;
 
-               normalize_v3(l_vec_prev);
-               normalize_v3(l_vec_next);
+       /* apply delta vec */
+       if (is_concave)
+               negate_v3(co_ofs);
 
-               /* get the medium normalized direction */
-               add_v3_v3v3(tvec, l_vec_prev,l_vec_next);
-               normalize_v3(tvec);
+       add_v3_v3v3(r_co, co_ofs, l->v->co);
+}
 
-               /* for angle calculation */
-               negate_v3(l_vec_next);
 
-               dist= shell_angle_to_dist(angle_normalized_v3v3(l_vec_prev, 
l_vec_next) * 0.5);
+#define ETAG_SET(e, v, nv)  (                                                 \
+       (v) == (e)->v1 ?                                                        
  \
+               (etags[BM_GetIndex((e))].newv1 = (nv)) :                        
      \
+               (etags[BM_GetIndex((e))].newv2 = (nv))                          
      \
+       )
 
-               mul_v3_fl(tvec, fac * dist);
+#define ETAG_GET(e, v)  (                                                     \
+       (v) == (e)->v1 ?                                                        
  \
+               (etags[BM_GetIndex((e))].newv1) :                               
      \
+               (etags[BM_GetIndex((e))].newv2)                                 
      \
+       )
 
-               if (is_concave)
-                       negate_v3(tvec);
-
-               add_v3_v3v3(r_co, tvec, l->v->co);
-
-       }
-}
-
-#define ETAG_SET(e, v, nv) (v) == (e)->v1 ? (etags[BM_GetIndex((e))].newv1 = 
(nv)) : (etags[BM_GetIndex((e))].newv2 = (nv))
-#define ETAG_GET(e, v) ((v) == (e)->v1 ? (etags[BM_GetIndex((e))].newv1) : 
(etags[BM_GetIndex((e))].newv2))
-
 void bmesh_bevel_exec(BMesh *bm, BMOperator *op)
 {
        BMOIter siter;
@@ -142,9 +155,11 @@
        BLI_array_declare(edges);
        SmallHash hash;
        float fac = BMO_Get_Float(op, "percent");
+       const short do_even = BMO_Get_Int(op, "use_even");
+       const short do_dist = BMO_Get_Int(op, "use_dist");
        int i, li, has_elens, HasMDisps = CustomData_has_layer(&bm->ldata, 
CD_MDISPS);
        
-       has_elens = CustomData_has_layer(&bm->edata, CD_PROP_FLT) && 
BMO_Get_Int(op, "uselengths");
+       has_elens = CustomData_has_layer(&bm->edata, CD_PROP_FLT) && 
BMO_Get_Int(op, "use_lengths");
        if (has_elens) {
                li = BMO_Get_Int(op, "lengthlayer");
        }
@@ -314,7 +329,7 @@
                                if (BMO_TestFlag(bm, l->prev->e, BEVEL_FLAG))
                                {
                                        tag = tags + BM_GetIndex(l);
-                                       calc_corner_co(bm, l, fac, co);
+                                       calc_corner_co(bm, l, fac, co, do_dist, 
do_even);
                                        tag->newv = BM_Make_Vert(bm, co, l->v);
                                } else {
                                        tag = tags + BM_GetIndex(l);

Modified: branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c    
2011-12-13 09:54:48 UTC (rev 42597)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c    
2011-12-13 09:57:19 UTC (rev 42598)
@@ -4461,11 +4461,9 @@
        BMEdge *eed;
        BMOperator bmop;
        float factor= RNA_float_get(op->ptr, "percent"), fac=factor /*, dfac */ 
/* UNUSED */, df, s;
-       /*float p2 = RNA_float_get(op->ptr, "param2");
-       float p3 = RNA_float_get(op->ptr, "param3");
-       float p4 = RNA_float_get(op->ptr, "param4");
-       float p5 = RNA_float_get(op->ptr, "param5");*/
        int i, recursion = RNA_int_get(op->ptr, "recursion");
+       const int use_even= RNA_boolean_get(op->ptr, "use_even");
+       const int use_dist= RNA_boolean_get(op->ptr, "use_dist");
        float *w = NULL, ftot;
        int li;
        BLI_array_declare(w);
@@ -4500,7 +4498,7 @@
        for (i=0; i<BLI_array_count(w); i++) {
                fac = w[BLI_array_count(w)-i-1]*factor;
 
-               if (!EDBM_InitOpf(em, &bmop, op, "bevel geom=%hev percent=%f 
lengthlayer=%i uselengths=%i", BM_SELECT, fac, li, 1))
+               if (!EDBM_InitOpf(em, &bmop, op, "bevel geom=%hev percent=%f 
lengthlayer=%i use_lengths=%i use_even=%i use_dist=%i", BM_SELECT, fac, li, 1, 
use_even, use_dist))
                        return OPERATOR_CANCELLED;
                
                BMO_Exec_Op(em->bm, &bmop);
@@ -4535,10 +4533,10 @@
 
        RNA_def_float(ot->srna, "percent", 0.5f, -FLT_MAX, FLT_MAX, 
"Percentage", "", 0.0f, 1.0f);
        RNA_def_int(ot->srna, "recursion", 1, 1, 50, "Recursion Level", 
"Recursion Level", 1, 8);
-       //RNA_def_float(ot->srna, "param2", 1.0f, -FLT_MAX, FLT_MAX, "Parameter 
2", "", -1000.0f, 1000.0f);
-       //RNA_def_float(ot->srna, "param3", 0.5f, -FLT_MAX, FLT_MAX, "Parameter 
3", "", -1000.0f, 1000.0f);
-       //RNA_def_float(ot->srna, "param4", 0.5f, -FLT_MAX, FLT_MAX, "Parameter 
4", "", -1000.0f, 1000.0f);
-       //RNA_def_float(ot->srna, "param5", 0.5f, -FLT_MAX, FLT_MAX, "Parameter 
5", "", -1000.0f, 1000.0f);
+
+       RNA_def_boolean(ot->srna, "use_even", FALSE, "Even",     "Calculate 
evenly spaced bevel");
+       RNA_def_boolean(ot->srna, "use_dist", FALSE, "Distance", "Interpret the 
percent in blender units");
+
 }
 
 static int mesh_export_obj_exec(bContext *C, wmOperator *op)

Modified: branches/bmesh/blender/source/blender/makesrna/intern/rna_modifier.c
===================================================================
--- branches/bmesh/blender/source/blender/makesrna/intern/rna_modifier.c        
2011-12-13 09:54:48 UTC (rev 42597)
+++ branches/bmesh/blender/source/blender/makesrna/intern/rna_modifier.c        
2011-12-13 09:57:19 UTC (rev 42598)
@@ -2170,6 +2170,19 @@
 #endif

@@ 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