diff options
author | Campbell Barton <ideasman42@gmail.com> | 2013-04-07 15:41:37 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2013-04-07 15:41:37 +0400 |
commit | b1ac23c5bd63cdf5bb6cf27fb62dc332d8d9cc39 (patch) | |
tree | 29e3348b47b7180c3295e843f7bd3c84c48aa2fc /source/blender/bmesh/intern | |
parent | eb495b2a8a331e74bdcedd9c0d5415b4c20a136d (diff) |
Mesh Tool,
inset interpolation now works for 'inset_region', enabled by default.
Example:
http://www.graphicall.org/ftp/ideasman42/inset_interpolation_new.png
Diffstat (limited to 'source/blender/bmesh/intern')
-rw-r--r-- | source/blender/bmesh/intern/bmesh_interp.c | 36 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_interp.h | 2 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_opdefines.c | 1 |
3 files changed, 28 insertions, 11 deletions
diff --git a/source/blender/bmesh/intern/bmesh_interp.c b/source/blender/bmesh/intern/bmesh_interp.c index 120618a90e2..b6585811fd5 100644 --- a/source/blender/bmesh/intern/bmesh_interp.c +++ b/source/blender/bmesh/intern/bmesh_interp.c @@ -167,6 +167,29 @@ void BM_data_interp_face_vert_edge(BMesh *bm, BMVert *v1, BMVert *UNUSED(v2), BM * * \note Only handles loop customdata. multires is handled. */ +void BM_face_interp_from_face_ex(BMesh *bm, BMFace *target, BMFace *source, + void **blocks, float (*cos_2d)[2], float axis_mat[3][3]) +{ + BMLoop *l_iter; + BMLoop *l_first; + + float *w = BLI_array_alloca(w, source->len); + float co[2]; + int i; + + if (source != target) + BM_elem_attrs_copy(bm, bm, source, target); + + /* interpolate */ + i = 0; + l_iter = l_first = BM_FACE_FIRST_LOOP(target); + do { + mul_v2_m3v3(co, axis_mat, l_iter->v->co); + interp_weights_poly_v2(w, cos_2d, source->len, co); + CustomData_bmesh_interp(&bm->ldata, blocks, w, NULL, source->len, l_iter->head.data); + } while (i++, (l_iter = l_iter->next) != l_first); +} + void BM_face_interp_from_face(BMesh *bm, BMFace *target, BMFace *source) { BMLoop *l_iter; @@ -176,14 +199,11 @@ void BM_face_interp_from_face(BMesh *bm, BMFace *target, BMFace *source) float (*cos_2d)[2] = BLI_array_alloca(cos_2d, source->len); float *w = BLI_array_alloca(w, source->len); float axis_mat[3][3]; /* use normal to transform into 2d xy coords */ - float co[2]; int i; /* convert the 3d coords into 2d for projection */ axis_dominant_v3_to_m3(axis_mat, source->no); - BM_elem_attrs_copy(bm, bm, source, target); - i = 0; l_iter = l_first = BM_FACE_FIRST_LOOP(source); do { @@ -191,14 +211,8 @@ void BM_face_interp_from_face(BMesh *bm, BMFace *target, BMFace *source) blocks[i] = l_iter->head.data; } while (i++, (l_iter = l_iter->next) != l_first); - /* interpolate */ - i = 0; - l_iter = l_first = BM_FACE_FIRST_LOOP(target); - do { - mul_v2_m3v3(co, axis_mat, l_iter->v->co); - interp_weights_poly_v2(w, cos_2d, source->len, co); - CustomData_bmesh_interp(&bm->ldata, blocks, w, NULL, source->len, l_iter->head.data); - } while (i++, (l_iter = l_iter->next) != l_first); + BM_face_interp_from_face_ex(bm, target, source, + blocks, cos_2d, axis_mat); } /** diff --git a/source/blender/bmesh/intern/bmesh_interp.h b/source/blender/bmesh/intern/bmesh_interp.h index 3563ed1f40e..1a1ca241224 100644 --- a/source/blender/bmesh/intern/bmesh_interp.h +++ b/source/blender/bmesh/intern/bmesh_interp.h @@ -42,6 +42,8 @@ void BM_data_layer_copy(BMesh *bm, CustomData *data, int type, int src_n, int d float BM_elem_float_data_get(CustomData *cd, void *element, int type); void BM_elem_float_data_set(CustomData *cd, void *element, int type, const float val); +void BM_face_interp_from_face_ex(BMesh *bm, BMFace *target, BMFace *source, + void **blocks, float (*cos_2d)[2], float axis_mat[3][3]); void BM_face_interp_from_face(BMesh *bm, BMFace *target, BMFace *source); void BM_loop_interp_from_face(BMesh *bm, BMLoop *target, BMFace *source, const bool do_vertex, const bool do_multires); diff --git a/source/blender/bmesh/intern/bmesh_opdefines.c b/source/blender/bmesh/intern/bmesh_opdefines.c index 41e18756559..9006f3893a2 100644 --- a/source/blender/bmesh/intern/bmesh_opdefines.c +++ b/source/blender/bmesh/intern/bmesh_opdefines.c @@ -1533,6 +1533,7 @@ static BMOpDefine bmo_inset_region_def = { {{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* input faces */ {"use_boundary", BMO_OP_SLOT_BOOL}, {"use_even_offset", BMO_OP_SLOT_BOOL}, + {"use_interpolate", BMO_OP_SLOT_BOOL}, {"use_relative_offset", BMO_OP_SLOT_BOOL}, {"thickness", BMO_OP_SLOT_FLT}, {"depth", BMO_OP_SLOT_FLT}, |