Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2013-04-07 09:13:00 +0400
committerCampbell Barton <ideasman42@gmail.com>2013-04-07 09:13:00 +0400
commit36cc2fd6da09c75a28b8c9d4871d513caaf2ac69 (patch)
tree170068ded2194ada00d0b86d4ac3cf5edfe92ac6 /source/blender/bmesh/operators/bmo_inset.c
parent6f1f897d342a632c959e3507a9de3c0df4f71eef (diff)
mesh inset tool - option to interpolate UV's vcols etc, on by default since this is almost always what you'd want.
currently only working for inset-individual, inset-region coming next.
Diffstat (limited to 'source/blender/bmesh/operators/bmo_inset.c')
-rw-r--r--source/blender/bmesh/operators/bmo_inset.c36
1 files changed, 23 insertions, 13 deletions
diff --git a/source/blender/bmesh/operators/bmo_inset.c b/source/blender/bmesh/operators/bmo_inset.c
index fdfe613366f..26574aaf57d 100644
--- a/source/blender/bmesh/operators/bmo_inset.c
+++ b/source/blender/bmesh/operators/bmo_inset.c
@@ -74,6 +74,7 @@ void bmo_inset_individual_exec(BMesh *bm, BMOperator *op)
const float thickness = BMO_slot_float_get(op->slots_in, "thickness");
const float depth = BMO_slot_float_get(op->slots_in, "depth");
const bool use_even_offset = BMO_slot_bool_get(op->slots_in, "use_even_offset");
+ const bool use_interpolate = BMO_slot_bool_get(op->slots_in, "use_interpolate");
/* Only tag faces in slot */
BM_mesh_elem_hflag_disable_all(bm, BM_FACE, BM_ELEM_TAG, false);
@@ -81,6 +82,7 @@ void bmo_inset_individual_exec(BMesh *bm, BMOperator *op)
BMO_slot_buffer_hflag_enable(bm, op->slots_in, "faces", BM_FACE, BM_ELEM_TAG, false);
BMO_ITER(f, &oiter, op->slots_in, "faces", BM_FACE) {
+ BMFace *f_new_inner;
BMLoop *l_iter, *l_first;
BMLoop *l_iter_inner = NULL;
int i;
@@ -152,20 +154,26 @@ void bmo_inset_individual_exec(BMesh *bm, BMOperator *op)
copy_v3_v3(eiinfo_arr[index].e_new->v1->co, v_new_co);
} while ((l_iter = l_iter->next) != l_first);
- {
- BMFace *f_new_inner;
- /* Create New Inset Faces */
- f_new_inner = BM_face_create(bm, f_verts, f_edges, f->len, 0);
- BLI_assert(f_new_inner != NULL); /* no reason it should fail */
- /* Copy Face Data */
- BM_elem_attrs_copy(bm, bm, f, f_new_inner);
- // Don't tag, gives more useful inner/outer select option
- // BMO_elem_flag_enable(bm, f_new_inner, ELE_NEW);
+ /* Create New Inset Faces */
+ f_new_inner = BM_face_create(bm, f_verts, f_edges, f->len, 0);
+ BLI_assert(f_new_inner != NULL); /* no reason it should fail */
+
+
+ // Don't tag, gives more useful inner/outer select option
+ // BMO_elem_flag_enable(bm, f_new_inner, ELE_NEW);
+
- l_iter_inner = BM_FACE_FIRST_LOOP(f_new_inner);
+ /* Copy Face Data */
+ /* interpolate loop data or just stretch */
+ if (use_interpolate) {
+ BM_face_interp_from_face(bm, f_new_inner, f);
+ }
+ else {
+ BM_elem_attrs_copy(bm, bm, f, f_new_inner);
}
+ l_iter_inner = BM_FACE_FIRST_LOOP(f_new_inner);
l_iter = l_first;
do {
BMFace *f_new_outer;
@@ -173,7 +181,9 @@ void bmo_inset_individual_exec(BMesh *bm, BMOperator *op)
BMLoop *l_a;
BMLoop *l_b;
- BM_elem_attrs_copy(bm, bm, l_iter, l_iter_inner);
+ if (use_interpolate == false) {
+ BM_elem_attrs_copy(bm, bm, l_iter, l_iter_inner);
+ }
f_new_outer = BM_face_create_quad_tri(bm,
l_iter->v,
@@ -203,8 +213,8 @@ void bmo_inset_individual_exec(BMesh *bm, BMOperator *op)
/* This loop should always have >1 radials
* (associated edge connects new and old face) */
- BM_elem_attrs_copy(bm, bm, l_iter, l_b);
- BM_elem_attrs_copy(bm, bm, l_iter->next, l_a);
+ BM_elem_attrs_copy(bm, bm, l_iter_inner, l_b);
+ BM_elem_attrs_copy(bm, bm, use_interpolate ? l_iter_inner->next : l_iter->next, l_a);
} while ((l_iter_inner = l_iter_inner->next),
(l_iter = l_iter->next) != l_first);