diff options
author | Campbell Barton <ideasman42@gmail.com> | 2012-04-29 14:44:00 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2012-04-29 14:44:00 +0400 |
commit | 41a5e731a2e13a18110f3f1919c340425f32f452 (patch) | |
tree | d01fb6155d5cdebd114eb5a06a3b3f5c884cb50a /source/blender/bmesh/intern | |
parent | 3d1349609c955cd2e326904dbc48c7277e7d99ff (diff) |
bmesh: new wireframe tool
- makes wireframe from faces.
- options similar to inset (even offset, relative scale)
- copies face settings and loops (uvs, vcolors)
- optionally replaces the existing geometry.
Diffstat (limited to 'source/blender/bmesh/intern')
-rw-r--r-- | source/blender/bmesh/intern/bmesh_opdefines.c | 20 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_operators_private.h | 1 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_queries.c | 22 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_queries.h | 1 |
4 files changed, 44 insertions, 0 deletions
diff --git a/source/blender/bmesh/intern/bmesh_opdefines.c b/source/blender/bmesh/intern/bmesh_opdefines.c index 4b5c67c8671..8ffaf1875cf 100644 --- a/source/blender/bmesh/intern/bmesh_opdefines.c +++ b/source/blender/bmesh/intern/bmesh_opdefines.c @@ -1109,6 +1109,25 @@ static BMOpDefine bmo_inset_def = { }; /* + * Wire Frame + * + * Makes a wire copy of faces. + */ +static BMOpDefine bmo_wireframe_def = { + "wireframe", + {{BMO_OP_SLOT_ELEMENT_BUF, "faces"}, /* input faces */ + {BMO_OP_SLOT_ELEMENT_BUF, "faceout"}, /* output faces */ + {BMO_OP_SLOT_BOOL, "use_boundary"}, + {BMO_OP_SLOT_BOOL, "use_even_offset"}, + {BMO_OP_SLOT_FLT, "thickness"}, + {BMO_OP_SLOT_BOOL, "use_relative_offset"}, + {BMO_OP_SLOT_FLT, "depth"}, + {0} /* null-terminating sentinel */}, + bmo_wireframe_exec, + 0 +}; + +/* * Vertex Slide * * Translates vertes along an edge @@ -1192,6 +1211,7 @@ BMOpDefine *opdefines[] = { &bmo_bridge_loops_def, &bmo_solidify_def, &bmo_inset_def, + &bmo_wireframe_def, &bmo_vertex_slide_def, }; diff --git a/source/blender/bmesh/intern/bmesh_operators_private.h b/source/blender/bmesh/intern/bmesh_operators_private.h index 423b30a503a..e222c3422c0 100644 --- a/source/blender/bmesh/intern/bmesh_operators_private.h +++ b/source/blender/bmesh/intern/bmesh_operators_private.h @@ -100,5 +100,6 @@ void bmo_create_circle_exec(BMesh *bm, BMOperator *op); void bmo_bridge_loops_exec(BMesh *bm, BMOperator *op); void bmo_solidify_face_region_exec(BMesh *bm, BMOperator *op); void bmo_inset_exec(BMesh *bm, BMOperator *op); +void bmo_wireframe_exec(BMesh *bm, BMOperator *op); #endif /* __BMESH_OPERATORS_PRIVATE_H__ */ diff --git a/source/blender/bmesh/intern/bmesh_queries.c b/source/blender/bmesh/intern/bmesh_queries.c index 3543fd952bb..e9a35ff70a2 100644 --- a/source/blender/bmesh/intern/bmesh_queries.c +++ b/source/blender/bmesh/intern/bmesh_queries.c @@ -928,6 +928,28 @@ float BM_vert_calc_shell_factor(BMVert *v) } /** + * \note quite an obscure function. + * used in bmesh operators that have a relative scale options, + */ +float BM_vert_calc_mean_tagged_edge_length(BMVert *v) +{ + BMIter iter; + BMEdge *e; + int tot; + float length = 0.0f; + + BM_ITER_ELEM_INDEX (e, &iter, v, BM_EDGES_OF_VERT, tot) { + BMVert *v_other = BM_edge_other_vert(e, v); + if (BM_elem_flag_test(v_other, BM_ELEM_TAG)) { + length += BM_edge_calc_length(e); + } + } + + return length / (float)tot; +} + + +/** * Returns the edge existing between v1 and v2, or NULL if there isn't one. * * \note multiple edges may exist between any two vertices, and therefore diff --git a/source/blender/bmesh/intern/bmesh_queries.h b/source/blender/bmesh/intern/bmesh_queries.h index aefeb80c4f3..08e15884b3f 100644 --- a/source/blender/bmesh/intern/bmesh_queries.h +++ b/source/blender/bmesh/intern/bmesh_queries.h @@ -65,6 +65,7 @@ void BM_edge_calc_face_tangent(BMEdge *e, BMLoop *e_loop, float r_tangent[3]) float BM_vert_calc_edge_angle(BMVert *v); float BM_vert_calc_shell_factor(BMVert *v); +float BM_vert_calc_mean_tagged_edge_length(BMVert *v); BMEdge *BM_edge_exists(BMVert *v1, BMVert *v2); |