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>2015-11-03 12:30:54 +0300
committerCampbell Barton <ideasman42@gmail.com>2015-11-03 12:38:23 +0300
commitbed91b623f0a4511c0c163805bb253377d407765 (patch)
treebad23c2928882ff3db8fd1f71f1988ad05df0c73 /source/blender/bmesh/intern
parentf29f4c92f2b10e9707be151750dcbbba244f862b (diff)
Edge/Vert slide: improve multires interpolation
Need to re-interpolate the entire face, not just the connected loop. Also add BM_face_interp_multires()
Diffstat (limited to 'source/blender/bmesh/intern')
-rw-r--r--source/blender/bmesh/intern/bmesh_interp.c25
-rw-r--r--source/blender/bmesh/intern/bmesh_interp.h6
-rw-r--r--source/blender/bmesh/intern/bmesh_mods.c25
3 files changed, 37 insertions, 19 deletions
diff --git a/source/blender/bmesh/intern/bmesh_interp.c b/source/blender/bmesh/intern/bmesh_interp.c
index d74e5de6dd8..9925e155e62 100644
--- a/source/blender/bmesh/intern/bmesh_interp.c
+++ b/source/blender/bmesh/intern/bmesh_interp.c
@@ -527,6 +527,31 @@ void BM_loop_interp_multires(BMesh *bm, BMLoop *l_dst, const BMFace *f_src)
BM_loop_interp_multires_ex(bm, l_dst, f_src, f_dst_center, f_src_center, cd_loop_mdisp_offset);
}
+void BM_face_interp_multires_ex(
+ BMesh *bm, BMFace *f_dst, const BMFace *f_src,
+ const float f_dst_center[3], const float f_src_center[3], const int cd_loop_mdisp_offset)
+{
+ BMLoop *l_iter, *l_first;
+ l_iter = l_first = BM_FACE_FIRST_LOOP(f_dst);
+ do {
+ BM_loop_interp_multires_ex(
+ bm, l_iter, f_src,
+ f_dst_center, f_src_center, cd_loop_mdisp_offset);
+ } while ((l_iter = l_iter->next) != l_first);
+}
+
+void BM_face_interp_multires(BMesh *bm, BMFace *f_dst, const BMFace *f_src)
+{
+ const int cd_loop_mdisp_offset = CustomData_get_offset(&bm->ldata, CD_MDISPS);
+ float f_dst_center[3];
+ float f_src_center[3];
+
+ BM_face_calc_center_mean(f_dst, f_dst_center);
+ BM_face_calc_center_mean(f_src, f_src_center);
+
+ BM_face_interp_multires_ex(bm, f_dst, f_src, f_dst_center, f_src_center, cd_loop_mdisp_offset);
+}
+
/**
* smooths boundaries between multires grids,
* including some borders in adjacent faces
diff --git a/source/blender/bmesh/intern/bmesh_interp.h b/source/blender/bmesh/intern/bmesh_interp.h
index a08a0c90b77..dabdd23cf6f 100644
--- a/source/blender/bmesh/intern/bmesh_interp.h
+++ b/source/blender/bmesh/intern/bmesh_interp.h
@@ -35,6 +35,12 @@ void BM_loop_interp_multires_ex(
const float f_dst_center[3], const float f_src_center[3], const int cd_loop_mdisp_offset);
void BM_loop_interp_multires(
BMesh *bm, BMLoop *l_dst, const BMFace *f_src);
+
+void BM_face_interp_multires_ex(
+ BMesh *UNUSED(bm), BMFace *f_dst, const BMFace *f_src,
+ const float f_dst_center[3], const float f_src_center[3], const int cd_loop_mdisp_offset);
+void BM_face_interp_multires(BMesh *bm, BMFace *f_dst, const BMFace *f_src);
+
void BM_vert_interp_from_face(BMesh *bm, BMVert *v_dst, const BMFace *f_src);
void BM_data_interp_from_verts(BMesh *bm, const BMVert *v_src_1, const BMVert *v_src_2, BMVert *v_dst, const float fac);
diff --git a/source/blender/bmesh/intern/bmesh_mods.c b/source/blender/bmesh/intern/bmesh_mods.c
index 3bf97ef024a..1b693f8e97d 100644
--- a/source/blender/bmesh/intern/bmesh_mods.c
+++ b/source/blender/bmesh/intern/bmesh_mods.c
@@ -313,24 +313,16 @@ BMFace *BM_face_split(
if (f_new) {
/* handle multires update */
if (cd_loop_mdisp_offset != -1) {
- BMLoop *l_iter;
- BMLoop *l_first;
float f_dst_center[3];
float f_src_center[3];
BM_face_calc_center_mean(f_tmp, f_src_center);
BM_face_calc_center_mean(f, f_dst_center);
- l_iter = l_first = BM_FACE_FIRST_LOOP(f);
- do {
- BM_loop_interp_multires_ex(bm, l_iter, f_tmp, f_dst_center, f_src_center, cd_loop_mdisp_offset);
- } while ((l_iter = l_iter->next) != l_first);
+ BM_face_interp_multires_ex(bm, f, f_tmp, f_dst_center, f_src_center, cd_loop_mdisp_offset);
BM_face_calc_center_mean(f_new, f_dst_center);
- l_iter = l_first = BM_FACE_FIRST_LOOP(f_new);
- do {
- BM_loop_interp_multires_ex(bm, l_iter, f_tmp, f_dst_center, f_src_center, cd_loop_mdisp_offset);
- } while ((l_iter = l_iter->next) != l_first);
+ BM_face_interp_multires_ex(bm, f_new, f_tmp, f_dst_center, f_src_center, cd_loop_mdisp_offset);
#if 0
/* BM_face_multires_bounds_smooth doesn't flip displacement correct */
@@ -1229,7 +1221,7 @@ BMVert *BM_edge_split(BMesh *bm, BMEdge *e, BMVert *v, BMEdge **r_e, float fac)
for (j = 0; j < 2; j++) {
BMEdge *e1 = j ? *r_e : e;
- BMLoop *l, *l2;
+ BMLoop *l;
l = e1->l;
@@ -1241,17 +1233,12 @@ BMVert *BM_edge_split(BMesh *bm, BMEdge *e, BMVert *v, BMEdge **r_e, float fac)
do {
/* check this is an old face */
if (BM_ELEM_API_FLAG_TEST(l->f, _FLAG_OVERLAP)) {
- BMLoop *l2_first;
float f_center[3];
BM_face_calc_center_mean(l->f, f_center);
-
- l2 = l2_first = BM_FACE_FIRST_LOOP(l->f);
- do {
- BM_loop_interp_multires_ex(
- bm, l2, oldfaces[i],
- f_center, f_center_old, cd_loop_mdisp_offset);
- } while ((l2 = l2->next) != l2_first);
+ BM_face_interp_multires_ex(
+ bm, l->f, oldfaces[i],
+ f_center, f_center_old, cd_loop_mdisp_offset);
}
l = l->radial_next;
} while (l != e1->l);