[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [56972] trunk/blender/source/blender: Support for bridge tool subdivisions, smoothing and shape along the profile.

Campbell Barton ideasman42 at gmail.com
Thu May 23 08:19:05 CEST 2013


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



More information about the Bf-blender-cvs mailing list