Revision: 56972
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=56972
Author:   campbellbarton
Date:     2013-05-23 06:19:04 +0000 (Thu, 23 May 2013)
Log Message:
-----------
Support for bridge tool subdivisions, smoothing and shape along the profile.
also added the underlying subdivision as a standalone operator in the edge 
menu, named: subdivide edge-ring.
http://www.graphicall.org/ftp/ideasman42/bridge_subd.png

Modified Paths:
--------------
    trunk/blender/source/blender/blenlib/BLI_ghash.h
    trunk/blender/source/blender/bmesh/CMakeLists.txt
    trunk/blender/source/blender/bmesh/intern/bmesh_edgeloop.c
    trunk/blender/source/blender/bmesh/intern/bmesh_edgeloop.h
    trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c
    trunk/blender/source/blender/bmesh/intern/bmesh_operators.h
    trunk/blender/source/blender/bmesh/intern/bmesh_operators_private.h
    trunk/blender/source/blender/bmesh/intern/bmesh_queries.c
    trunk/blender/source/blender/bmesh/intern/bmesh_queries.h
    trunk/blender/source/blender/bmesh/operators/bmo_bridge.c
    trunk/blender/source/blender/bmesh/operators/bmo_subdivide.c
    trunk/blender/source/blender/editors/mesh/editmesh_tools.c
    trunk/blender/source/blender/editors/mesh/mesh_intern.h
    trunk/blender/source/blender/editors/mesh/mesh_ops.c

Added Paths:
-----------
    trunk/blender/source/blender/bmesh/operators/bmo_subdivide_edgering.c

Modified: trunk/blender/source/blender/blenlib/BLI_ghash.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_ghash.h    2013-05-23 03:35:57 UTC 
(rev 56971)
+++ trunk/blender/source/blender/blenlib/BLI_ghash.h    2013-05-23 06:19:04 UTC 
(rev 56972)
@@ -139,6 +139,11 @@
             BLI_ghashIterator_done(&gh_iter_) == false;                        
  \
             BLI_ghashIterator_step(&gh_iter_))
 
+#define GHASH_ITER_INDEX(gh_iter_, ghash_, i_)                                \
+       for (BLI_ghashIterator_init(&gh_iter_, ghash_), i_ = 0;                 
  \
+            BLI_ghashIterator_done(&gh_iter_) == false;                        
  \
+            BLI_ghashIterator_step(&gh_iter_), i_++)
+
 /* *** */
 
 unsigned int    BLI_ghashutil_ptrhash(const void *key);

Modified: trunk/blender/source/blender/bmesh/CMakeLists.txt
===================================================================
--- trunk/blender/source/blender/bmesh/CMakeLists.txt   2013-05-23 03:35:57 UTC 
(rev 56971)
+++ trunk/blender/source/blender/bmesh/CMakeLists.txt   2013-05-23 06:19:04 UTC 
(rev 56972)
@@ -62,6 +62,7 @@
        operators/bmo_smooth_laplacian.c
        operators/bmo_split_edges.c
        operators/bmo_subdivide.c
+       operators/bmo_subdivide_edgering.c
        operators/bmo_symmetrize.c
        operators/bmo_triangulate.c
        operators/bmo_unsubdivide.c

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_edgeloop.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_edgeloop.c  2013-05-23 
03:35:57 UTC (rev 56971)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_edgeloop.c  2013-05-23 
06:19:04 UTC (rev 56972)
@@ -504,9 +504,28 @@
        return el_store->co;
 }
 
-
+#define NODE_AS_V(n)  ((BMVert *)((LinkData *)n)->data)
 #define NODE_AS_CO(n) ((BMVert *)((LinkData *)n)->data)->co
 
+/**
+ * edges are assined to one vert -> the next.
+ */
+void BM_edgeloop_edges_get(struct BMEdgeLoopStore *el_store, BMEdge **e_arr)
+{
+       LinkData *node;
+       int i = 0;
+       for (node = el_store->verts.first; node && node->next; node = 
node->next) {
+               e_arr[i++] = BM_edge_exists(NODE_AS_V(node), 
NODE_AS_V(node->next));
+               BLI_assert(e_arr[i - 1] != NULL);
+       }
+
+       if (el_store->flag & BM_EDGELOOP_IS_CLOSED) {
+               e_arr[i] = BM_edge_exists(NODE_AS_V(el_store->verts.first), 
NODE_AS_V(el_store->verts.last));
+               BLI_assert(e_arr[i] != NULL);
+       }
+       BLI_assert(el_store->len == i + 1);
+}
+
 void BM_edgeloop_calc_center(BMesh *UNUSED(bm), BMEdgeLoopStore *el_store)
 {
        LinkData *node_curr = el_store->verts.last;

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_edgeloop.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_edgeloop.h  2013-05-23 
03:35:57 UTC (rev 56971)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_edgeloop.h  2013-05-23 
06:19:04 UTC (rev 56972)
@@ -54,6 +54,7 @@
 struct ListBase    *BM_edgeloop_verts_get(struct BMEdgeLoopStore *el_store);
 const float        *BM_edgeloop_normal_get(struct BMEdgeLoopStore *el_store);
 const float        *BM_edgeloop_center_get(struct BMEdgeLoopStore *el_store);
+void                BM_edgeloop_edges_get(struct BMEdgeLoopStore *el_store, 
BMEdge **e_arr);
 void                BM_edgeloop_calc_center(BMesh *bm, struct BMEdgeLoopStore 
*el_store);
 void                BM_edgeloop_calc_normal(BMesh *bm, struct BMEdgeLoopStore 
*el_store);
 void                BM_edgeloop_flip(BMesh *bm, struct BMEdgeLoopStore 
*el_store);
@@ -61,7 +62,11 @@
 
 bool                BM_edgeloop_overlap_check(struct BMEdgeLoopStore 
*el_store_a, struct BMEdgeLoopStore *el_store_b);
 
-#define BM_EDGELOOP_NEXT(el_store, elink) \
+#define BM_EDGELINK_NEXT(el_store, elink) \
        (elink)->next ? elink->next : (BM_edgeloop_is_closed(el_store) ? 
BM_edgeloop_verts_get(el_store)->first : NULL)
 
+#define BM_EDGELOOP_NEXT(el_store) \
+       (CHECK_TYPE_INLINE(el_store, struct BMEdgeLoopStore), \
+        (struct BMEdgeLoopStore *)((LinkData *)el_store)->next)
+
 #endif  /* __BMESH_EDGELOOP_H__ */

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c 2013-05-23 
03:35:57 UTC (rev 56971)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c 2013-05-23 
06:19:04 UTC (rev 56972)
@@ -523,6 +523,7 @@
        },
        /* slots_out */
        {{"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* new faces */
+        {"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* new edges */
         {{'\0'}},
        },
        bmo_bridge_loops_exec,
@@ -1022,6 +1023,28 @@
 };
 
 /*
+ * Subdivide Edge-Ring.
+ *
+ * Take an edge-ring, and supdivide with interpolation options.
+ */
+static BMOpDefine bmo_subdivide_edgering_def = {
+       "subdivide_edgering",
+       /* slots_in */
+       {{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* input vertices */
+        {"interp_mode", BMO_OP_SLOT_INT},
+        {"smooth", BMO_OP_SLOT_FLT},
+        {"cuts", BMO_OP_SLOT_INT},
+        {"profile_shape", BMO_OP_SLOT_INT},
+        {"profile_shape_factor", BMO_OP_SLOT_FLT},
+        {{'\0'}},
+       },
+       {{"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* output faces */
+        {{'\0'}}},  /* no output */
+       bmo_subdivide_edgering_exec,
+       BMO_OPTYPE_FLAG_UNTAN_MULTIRES | BMO_OPTYPE_FLAG_NORMALS_CALC | 
BMO_OPTYPE_FLAG_SELECT_FLUSH,
+};
+
+/*
  * Delete Geometry.
  *
  * Utility operator to delete geometry.
@@ -1756,6 +1779,7 @@
        &bmo_split_def,
        &bmo_split_edges_def,
        &bmo_subdivide_edges_def,
+       &bmo_subdivide_edgering_def,
        &bmo_symmetrize_def,
        &bmo_transform_def,
        &bmo_translate_def,

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_operators.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_operators.h 2013-05-23 
03:35:57 UTC (rev 56971)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_operators.h 2013-05-23 
06:19:04 UTC (rev 56972)
@@ -61,6 +61,18 @@
        SIM_CMP_LT
 };
 
+/* subdivide_edgering */
+enum {
+       /* just subdiv */
+       SUBD_RING_INTERP_LINEAR,
+
+       /* single bezier spline - curve follows bezier rotation */
+       SUBD_RING_INTERP_PATH,
+
+       /* beziers based on adjacent faces (fallback to tangent) */
+       SUBD_RING_INTERP_SURF,
+};
+
 /* similar face selection slot values */
 enum {
        SIMFACE_MATERIAL = 201,

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_operators_private.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_operators_private.h 
2013-05-23 03:35:57 UTC (rev 56971)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_operators_private.h 
2013-05-23 06:19:04 UTC (rev 56972)
@@ -97,6 +97,7 @@
 void bmo_split_edges_exec(BMesh *bm, BMOperator *op);
 void bmo_split_exec(BMesh *bm, BMOperator *op);
 void bmo_subdivide_edges_exec(BMesh *bm, BMOperator *op);
+void bmo_subdivide_edgering_exec(BMesh *bm, BMOperator *op);
 void bmo_symmetrize_exec(BMesh *bm, BMOperator *op);
 void bmo_transform_exec(BMesh *bm, BMOperator *op);
 void bmo_translate_exec(BMesh *bm, BMOperator *op);

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_queries.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_queries.c   2013-05-23 
03:35:57 UTC (rev 56971)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_queries.c   2013-05-23 
06:19:04 UTC (rev 56972)
@@ -1416,6 +1416,7 @@
        BMEdge *e;
 
        BLI_assert(v1 != v2);
+       BLI_assert(v1->head.htype == BM_VERT && v2->head.htype == BM_VERT);
 
        BM_ITER_ELEM (e, &iter, v1, BM_EDGES_OF_VERT) {
                if (e->v1 == v2 || e->v2 == v2)
@@ -1756,3 +1757,27 @@
 
        return vol;
 }
+
+float bmesh_subd_falloff_calc(const int falloff, float val)
+{
+       switch (falloff) {
+               case SUBD_FALLOFF_SMOOTH:
+                       val = 3.0f * val * val - 2.0f * val * val * val;
+                       break;
+               case SUBD_FALLOFF_SPHERE:
+                       val = sqrtf(2.0f * val - val * val);
+                       break;
+               case SUBD_FALLOFF_ROOT:
+                       val = sqrtf(val);
+                       break;
+               case SUBD_FALLOFF_SHARP:
+                       val = val * val;
+                       break;
+               case SUBD_FALLOFF_LIN:
+                       break;
+               default:
+                       BLI_assert(0);
+       }
+
+       return val;
+}

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_queries.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_queries.h   2013-05-23 
03:35:57 UTC (rev 56971)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_queries.h   2013-05-23 
06:19:04 UTC (rev 56972)
@@ -116,4 +116,7 @@
 
 float BM_mesh_calc_volume(BMesh *bm, bool is_signed);
 
+/* not really any good place  to put this */
+float bmesh_subd_falloff_calc(const int falloff, float val);
+
 #endif /* __BMESH_QUERIES_H__ */

Modified: trunk/blender/source/blender/bmesh/operators/bmo_bridge.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_bridge.c   2013-05-23 
03:35:57 UTC (rev 56971)
+++ trunk/blender/source/blender/bmesh/operators/bmo_bridge.c   2013-05-23 
06:19:04 UTC (rev 56972)
@@ -37,6 +37,7 @@
 #include "intern/bmesh_operators_private.h" /* own include */
 
 #define EDGE_MARK      4
+#define EDGE_OUT       8
 #define FACE_OUT       16
 
 /* el_a and el_b _must_ be same size */
@@ -129,6 +130,15 @@
        }
 }
 
+static void bm_face_edges_tag_out(BMesh *bm, BMFace *f)
+{
+       BMLoop *l_iter, *l_first;
+       l_iter = l_first = BM_FACE_FIRST_LOOP(f);
+       do {
+               BMO_elem_flag_enable(bm, l_iter->e, EDGE_OUT);
+       } while ((l_iter = l_iter->next) != l_first);
+}
+
 static bool bm_edge_test_cb(BMEdge *e, void *bm_v)
 {
        return BMO_elem_flag_test((BMesh *)bm_v, e, EDGE_MARK);
@@ -144,6 +154,7 @@
        int el_store_a_len, el_store_b_len;
        bool el_store_b_free = false;
        float el_dir[3];
+       const bool use_edgeout = true;
 
        el_store_a_len = BM_edgeloop_length_get((struct BMEdgeLoopStore 
*)el_store_a);
        el_store_b_len = BM_edgeloop_length_get((struct BMEdgeLoopStore 
*)el_store_b);
@@ -188,7 +199,7 @@
                        for (i = 0; i < 2; i++, winding_dir = -winding_dir) {
                                LinkData *el;
                                for (el = 
BM_edgeloop_verts_get(estore_pair[i])->first; el; el = el->next) {
-                                       LinkData *el_next = 
BM_EDGELOOP_NEXT(estore_pair[i], el);
+                                       LinkData *el_next = 
BM_EDGELINK_NEXT(estore_pair[i], el);
                                        if (el_next) {
                                                BMEdge *e = 
BM_edge_exists(el->data, el_next->data);
                                                if (e && 
BM_edge_is_boundary(e)) {
@@ -242,8 +253,8 @@
                        BMLoop *l_2_next = NULL;
 
                        if (is_closed) {
-                               el_a_next = BM_EDGELOOP_NEXT(el_store_a, el_a);

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