From 41a5e731a2e13a18110f3f1919c340425f32f452 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 29 Apr 2012 10:44:00 +0000 Subject: 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. --- source/blender/bmesh/intern/bmesh_opdefines.c | 20 ++++++++++++++++++++ .../blender/bmesh/intern/bmesh_operators_private.h | 1 + source/blender/bmesh/intern/bmesh_queries.c | 22 ++++++++++++++++++++++ source/blender/bmesh/intern/bmesh_queries.h | 1 + 4 files changed, 44 insertions(+) (limited to 'source/blender/bmesh/intern') 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 @@ -1108,6 +1108,25 @@ static BMOpDefine bmo_inset_def = { 0 }; +/* + * 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 * @@ -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 @@ -927,6 +927,28 @@ float BM_vert_calc_shell_factor(BMVert *v) return accum_shell / accum_angle; } +/** + * \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. * 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); -- cgit v1.2.3