[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44991] trunk/blender/source/blender/bmesh : bmesh inset:
Campbell Barton
ideasman42 at gmail.com
Mon Mar 19 10:47:41 CET 2012
Revision: 44991
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44991
Author: campbellbarton
Date: 2012-03-19 09:47:32 +0000 (Mon, 19 Mar 2012)
Log Message:
-----------
bmesh inset:
fix hole when 2+ faces a vert but no edges (would make a hole), now splice the verts back together.
Modified Paths:
--------------
trunk/blender/source/blender/bmesh/intern/bmesh_core.c
trunk/blender/source/blender/bmesh/intern/bmesh_core.h
trunk/blender/source/blender/bmesh/operators/bmo_inset.c
Modified: trunk/blender/source/blender/bmesh/intern/bmesh_core.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_core.c 2012-03-19 08:49:49 UTC (rev 44990)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_core.c 2012-03-19 09:47:32 UTC (rev 44991)
@@ -1704,7 +1704,7 @@
*
* \return Success
*/
-static int bm_vert_splice(BMesh *bm, BMVert *v, BMVert *vtarget)
+int BM_vert_splice(BMesh *bm, BMVert *v, BMVert *vtarget)
{
BMEdge *e;
BMLoop *l;
@@ -2006,7 +2006,7 @@
/* And then glue the rest back together */
for (i = 1; i < len - 1; i++) {
- bm_vert_splice(bm, vtar[i], vtar[0]);
+ BM_vert_splice(bm, vtar[i], vtar[0]);
}
}
}
Modified: trunk/blender/source/blender/bmesh/intern/bmesh_core.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_core.h 2012-03-19 08:49:49 UTC (rev 44990)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_core.h 2012-03-19 09:47:32 UTC (rev 44991)
@@ -40,8 +40,9 @@
void BM_edge_kill(BMesh *bm, BMEdge *e);
void BM_vert_kill(BMesh *bm, BMVert *v);
+int bmesh_edge_separate(BMesh *bm, BMEdge *e, BMLoop *l_sep);
int BM_edge_splice(BMesh *bm, BMEdge *e, BMEdge *etarget);
-int bmesh_edge_separate(BMesh *bm, BMEdge *e, BMLoop *l_sep);
+int BM_vert_splice(BMesh *bm, BMVert *v, BMVert *vtarget);
int bmesh_vert_separate(BMesh *bm, BMVert *v, BMVert ***r_vout, int *r_vout_len);
Modified: trunk/blender/source/blender/bmesh/operators/bmo_inset.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_inset.c 2012-03-19 08:49:49 UTC (rev 44990)
+++ trunk/blender/source/blender/bmesh/operators/bmo_inset.c 2012-03-19 09:47:32 UTC (rev 44991)
@@ -56,9 +56,6 @@
* - separate these edges and tag vertices, set their index to point to the original edge.
* - build faces between old/new edges.
* - inset the new edges into their faces.
- *
- * TODO
- * - close tares when 2 corners touch.
*/
void bmo_inset_exec(BMesh *bm, BMOperator *op)
@@ -174,8 +171,12 @@
/* comment the first part because we know this verts in a tagged face */
if (/* v->e && */BM_elem_flag_test(v, BM_ELEM_TAG)) {
BMVert **vout;
- int r_vout_len = 0;
+ int r_vout_len;
+ BMVert *v_glue = NULL;
+ /* disable touching twice, this _will_ happen if the flags not disabled */
+ BM_elem_flag_disable(v, BM_ELEM_TAG);
+
bmesh_vert_separate(bm, v, &vout, &r_vout_len);
v = NULL; /* don't use again */
@@ -183,25 +184,20 @@
BMVert *v_split = vout[k]; /* only to avoid vout[k] all over */
/* need to check if this vertex is from a */
- BMIter itersub;
int vert_edge_tag_tot = 0;
int vecpair[2];
/* find adjacent */
- BM_ITER(e, &itersub, bm, BM_EDGES_OF_VERT, v_split) {
+ BM_ITER(e, &iter, bm, BM_EDGES_OF_VERT, v_split) {
if (BM_edge_is_boundary(e) && /* this will be true because bmesh_edge_separate() has run */
BM_elem_flag_test(e, BM_ELEM_TAG) &&
BM_elem_flag_test(e->l->f, BM_ELEM_TAG))
{
- /* disable touching twice, this _will_ happen if the flags not disabled */
- BM_elem_flag_disable(v_split, BM_ELEM_TAG);
-
if (vert_edge_tag_tot < 2) {
vecpair[vert_edge_tag_tot] = BM_elem_index_get(e);
BLI_assert(vecpair[vert_edge_tag_tot] != -1);
}
- // BM_elem_flag_disable(e, BM_ELEM_SMOOTH); // testing only
vert_edge_tag_tot++;
}
}
@@ -311,6 +307,29 @@
/* apply the offset */
madd_v3_v3fl(v_split->co, tvec, thickness);
}
+
+ /* this saves expensive/slow glue check for common cases */
+ if (r_vout_len > 2) {
+ int ok = TRUE;
+ /* last step, NULL this vertex if has a tagged face */
+ BM_ITER(f, &iter, bm, BM_FACES_OF_VERT, v_split) {
+ if (BM_elem_flag_test(f, BM_ELEM_TAG)) {
+ ok = FALSE;
+ break;
+ }
+ }
+
+ if (ok) {
+ if (v_glue == NULL) {
+ v_glue = v_split;
+ }
+ else {
+ BM_vert_splice(bm, v_split, v_glue);
+ }
+ }
+ }
+ /* end glue */
+
}
MEM_freeN(vout);
}
More information about the Bf-blender-cvs
mailing list