diff options
author | Campbell Barton <ideasman42@gmail.com> | 2012-08-23 09:19:40 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2012-08-23 09:19:40 +0400 |
commit | 6e90903bafa54ae25b887bd6bddeef787c3c5a29 (patch) | |
tree | da30cc381466f1978acba64349d6db7997db1ffe /source/blender/bmesh | |
parent | c0c575751d27198fc5bda18f0d51fafca4c3a967 (diff) |
- add BM_data_interp_from_edges() function (matches BM_data_interp_from_verts).
- bridge-merged now merges edge customdata and flags for verts and edges.
Diffstat (limited to 'source/blender/bmesh')
-rw-r--r-- | source/blender/bmesh/intern/bmesh_interp.c | 52 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_interp.h | 1 | ||||
-rw-r--r-- | source/blender/bmesh/operators/bmo_connect.c | 4 |
3 files changed, 40 insertions, 17 deletions
diff --git a/source/blender/bmesh/intern/bmesh_interp.c b/source/blender/bmesh/intern/bmesh_interp.c index 9453932b684..16488501651 100644 --- a/source/blender/bmesh/intern/bmesh_interp.c +++ b/source/blender/bmesh/intern/bmesh_interp.c @@ -45,47 +45,67 @@ #include "bmesh.h" #include "intern/bmesh_private.h" -/** - * \brief Data, Interp From Verts - * - * Interpolates per-vertex data from two sources to a target. - */ -void BM_data_interp_from_verts(BMesh *bm, BMVert *v1, BMVert *v2, BMVert *v, const float fac) +/* edge and vertex share, currently theres no need to have different logic */ +static void bm_data_interp_from_elem(BMesh *bm, BMElem *ele1, BMElem *ele2, BMElem *ele_dst, const float fac) { - if (v1->head.data && v2->head.data) { + if (ele1->head.data && ele2->head.data) { /* first see if we can avoid interpolation */ if (fac <= 0.0f) { - if (v1 == v) { + if (ele1 == ele_dst) { /* do nothing */ } else { - CustomData_bmesh_free_block(&bm->vdata, &v->head.data); - CustomData_bmesh_copy_data(&bm->vdata, &bm->vdata, v1->head.data, &v->head.data); + CustomData_bmesh_free_block(&bm->vdata, &ele_dst->head.data); + CustomData_bmesh_copy_data(&bm->vdata, &bm->vdata, ele1->head.data, &ele_dst->head.data); } } else if (fac >= 1.0f) { - if (v2 == v) { + if (ele2 == ele_dst) { /* do nothing */ } else { - CustomData_bmesh_free_block(&bm->vdata, &v->head.data); - CustomData_bmesh_copy_data(&bm->vdata, &bm->vdata, v2->head.data, &v->head.data); + CustomData_bmesh_free_block(&bm->vdata, &ele_dst->head.data); + CustomData_bmesh_copy_data(&bm->vdata, &bm->vdata, ele2->head.data, &ele_dst->head.data); } } else { void *src[2]; float w[2]; - src[0] = v1->head.data; - src[1] = v2->head.data; + src[0] = ele1->head.data; + src[1] = ele2->head.data; w[0] = 1.0f - fac; w[1] = fac; - CustomData_bmesh_interp(&bm->vdata, src, w, NULL, 2, v->head.data); + CustomData_bmesh_interp(&bm->vdata, src, w, NULL, 2, ele_dst->head.data); } } } /** + * \brief Data, Interp From Verts + * + * Interpolates per-vertex data from two sources to a target. + * + * \note This is an exact match to #BM_data_interp_from_edges + */ +void BM_data_interp_from_verts(BMesh *bm, BMVert *v1, BMVert *v2, BMVert *v, const float fac) +{ + bm_data_interp_from_elem(bm, (BMElem *)v1, (BMElem *)v2, (BMElem *)v, fac); +} + +/** + * \brief Data, Interp From Edges + * + * Interpolates per-edge data from two sources to a target. + * + * \note This is an exact match to #BM_data_interp_from_verts + */ +void BM_data_interp_from_edges(BMesh *bm, BMEdge *e1, BMEdge *e2, BMEdge *e, const float fac) +{ + bm_data_interp_from_elem(bm, (BMElem *)e1, (BMElem *)e2, (BMElem *)e, fac); +} + +/** * \brief Data Vert Average * * Sets all the customdata (e.g. vert, loop) associated with a vert diff --git a/source/blender/bmesh/intern/bmesh_interp.h b/source/blender/bmesh/intern/bmesh_interp.h index 3380a3e6b1b..8be963f5798 100644 --- a/source/blender/bmesh/intern/bmesh_interp.h +++ b/source/blender/bmesh/intern/bmesh_interp.h @@ -31,6 +31,7 @@ void BM_loop_interp_multires(BMesh *bm, BMLoop *target, BMFace *source); void BM_vert_interp_from_face(BMesh *bm, BMVert *v, BMFace *source); void BM_data_interp_from_verts(BMesh *bm, BMVert *v1, BMVert *v2, BMVert *v, const float fac); +void BM_data_interp_from_edges(BMesh *bm, BMEdge *e1, BMEdge *e2, BMEdge *e, const float fac); void BM_data_interp_face_vert_edge(BMesh *bm, BMVert *v1, BMVert *v2, BMVert *v, BMEdge *e1, const float fac); void BM_data_layer_add(BMesh *em, CustomData *data, int type); void BM_data_layer_add_named(BMesh *bm, CustomData *data, int type, const char *name); diff --git a/source/blender/bmesh/operators/bmo_connect.c b/source/blender/bmesh/operators/bmo_connect.c index 055e61596ee..c9a0d74de38 100644 --- a/source/blender/bmesh/operators/bmo_connect.c +++ b/source/blender/bmesh/operators/bmo_connect.c @@ -457,10 +457,12 @@ void bmo_bridge_loops_exec(BMesh *bm, BMOperator *op) for (i = 0; i < vert_len; i++) { BM_data_interp_from_verts(bm, vv1[i], vv2[i], vv2[i], merge_factor); interp_v3_v3v3(vv2[i]->co, vv1[i]->co, vv2[i]->co, merge_factor); + BM_elem_flag_merge(vv1[i], vv2[i]); BM_vert_splice(bm, vv1[i], vv2[i]); } for (i = 0; i < edge_len; i++) { - //BM_data_interp_from_edge(bm, vv1[i], vv2[i], vv2[i], merge_factor); + BM_data_interp_from_edges(bm, ee1[i], ee2[i], ee2[i], merge_factor); + BM_elem_flag_merge(ee1[i], ee2[i]); BM_edge_splice(bm, ee1[i], ee2[i]); } } |