[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [35807] branches/bmesh/blender/source/ blender/bmesh: =bmesh= bevel now interpolates vertex data.
Joseph Eagar
joeedh at gmail.com
Sun Mar 27 05:06:24 CEST 2011
Revision: 35807
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=35807
Author: joeedh
Date: 2011-03-27 03:06:21 +0000 (Sun, 27 Mar 2011)
Log Message:
-----------
=bmesh= bevel now interpolates vertex data. still need to make sure edge data, like creases, get copied over in all cases, though.
Modified Paths:
--------------
branches/bmesh/blender/source/blender/bmesh/bmesh.h
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_interp.c
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mods.c
branches/bmesh/blender/source/blender/bmesh/operators/bevel.c
Modified: branches/bmesh/blender/source/blender/bmesh/bmesh.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh.h 2011-03-27 02:56:41 UTC (rev 35806)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh.h 2011-03-27 03:06:21 UTC (rev 35807)
@@ -218,18 +218,20 @@
/*Interpolation*/
/*projects target onto source for customdata interpolation. note: only
- does loop customdata. note that multires is handled.*/
+ does loop customdata. multires is handled. */
void BM_face_interp_from_face(BMesh *bm, BMFace *target, BMFace *source);
-/*same as BM_face_interp_from_face, but only interpolates one loop, instead
- of all loops in a face*/
-void BM_loop_interp_from_face(BMesh *bm, BMLoop *target, BMFace *source);
+/*projects a single loop, target, onto source for customdata interpolation. multires is handled.
+ if do_vertex is true, target's vert data will also get interpolated.*/
+void BM_loop_interp_from_face(BMesh *bm, BMLoop *target, BMFace *source, int do_vertex);
+
/*smoothes boundaries between multires grids, including some borders in adjacent faces*/
void BM_multires_smooth_bounds(BMesh *bm, BMFace *f);
/*project the multires grid in target onto source's set of multires grids*/
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 ( struct BMesh *bm, struct BMVert *v1, struct BMVert *v2, struct BMVert *v, float fac );
void BM_Data_Facevert_Edgeinterp ( struct BMesh *bm, struct BMVert *v1, struct BMVert *v2, struct BMVert *v, struct BMEdge *e1, float fac );
void BM_add_data_layer ( BMesh *em, CustomData *data, int type );
Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_interp.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_interp.c 2011-03-27 02:56:41 UTC (rev 35806)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_interp.c 2011-03-27 03:06:21 UTC (rev 35807)
@@ -530,14 +530,16 @@
bmesh_loop_interp_mdisps(bm, target, source);
}
-void BM_loop_interp_from_face(BMesh *bm, BMLoop *target, BMFace *source)
+void BM_loop_interp_from_face(BMesh *bm, BMLoop *target, BMFace *source, int do_vertex)
{
BMLoop *l;
void **blocks=NULL;
+ void **vblocks=NULL;
float (*cos)[3]=NULL, *w=NULL, cent[3] = {0.0f, 0.0f, 0.0f};
BLI_array_staticdeclare(cos, 64);
BLI_array_staticdeclare(w, 64);
BLI_array_staticdeclare(blocks, 64);
+ BLI_array_staticdeclare(vblocks, 64);
int i;
BM_Copy_Attributes(bm, bm, source, target->f);
@@ -550,6 +552,10 @@
BLI_array_append(w, 0.0f);
BLI_array_append(blocks, l->head.data);
+
+ if (do_vertex)
+ BLI_array_append(vblocks, l->v->head.data);
+
l = l->next;
} while (l != bm_firstfaceloop(source));
@@ -566,7 +572,9 @@
/*interpolate*/
interp_weights_poly_v3(w, cos, source->len, target->v->co);
CustomData_bmesh_interp(&bm->ldata, blocks, w, NULL, source->len, target->head.data);
-
+ if (do_vertex)
+ CustomData_bmesh_interp(&bm->vdata, vblocks, w, NULL, source->len, target->v->head.data);
+
BLI_array_free(cos);
BLI_array_free(w);
BLI_array_free(blocks);
@@ -576,6 +584,47 @@
}
}
+
+void BM_vert_interp_from_face(BMesh *bm, BMVert *v, BMFace *source)
+{
+ BMLoop *l;
+ void **blocks=NULL;
+ float (*cos)[3]=NULL, *w=NULL, cent[3] = {0.0f, 0.0f, 0.0f};
+ BLI_array_staticdeclare(cos, 64);
+ BLI_array_staticdeclare(w, 64);
+ BLI_array_staticdeclare(blocks, 64);
+ int i;
+
+ l = bm_firstfaceloop(source);
+ do {
+ BLI_array_growone(cos);
+ copy_v3_v3(cos[BLI_array_count(cos)-1], l->v->co);
+ add_v3_v3(cent, cos[BLI_array_count(cos)-1]);
+
+ BLI_array_append(w, 0.0f);
+ BLI_array_append(blocks, l->v->head.data);
+ l = l->next;
+ } while (l != bm_firstfaceloop(source));
+
+ /*scale source face coordinates a bit, so points sitting directonly on an
+ edge will work.*/
+ mul_v3_fl(cent, 1.0f/(float)source->len);
+ for (i=0; i<source->len; i++) {
+ float vec[3];
+ sub_v3_v3v3(vec, cent, cos[i]);
+ mul_v3_fl(vec, 0.01);
+ add_v3_v3(cos[i], vec);
+ }
+
+ /*interpolate*/
+ interp_weights_poly_v3(w, cos, source->len, v->co);
+ CustomData_bmesh_interp(&bm->vdata, blocks, w, NULL, source->len, v->head.data);
+
+ BLI_array_free(cos);
+ BLI_array_free(w);
+ BLI_array_free(blocks);
+}
+
static void update_data_blocks(BMesh *bm, CustomData *olddata, CustomData *data)
{
BMIter iter;
Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mods.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mods.c 2011-03-27 02:56:41 UTC (rev 35806)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mods.c 2011-03-27 03:06:21 UTC (rev 35807)
@@ -310,13 +310,13 @@
l = bm_firstfaceloop(f);
do {
- BM_loop_interp_from_face(bm, l, of);
+ BM_loop_interp_from_face(bm, l, of, 0);
l = l->next;
} while (l != bm_firstfaceloop(f));
l = bm_firstfaceloop(nf);
do {
- BM_loop_interp_from_face(bm, l, of);
+ BM_loop_interp_from_face(bm, l, of, 0);
l = l->next;
} while (l != bm_firstfaceloop(nf));
Modified: branches/bmesh/blender/source/blender/bmesh/operators/bevel.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/bevel.c 2011-03-27 02:56:41 UTC (rev 35806)
+++ branches/bmesh/blender/source/blender/bmesh/operators/bevel.c 2011-03-27 03:06:21 UTC (rev 35807)
@@ -643,7 +643,7 @@
if (tag->newv != l->v || HasMDisps) {
BM_Copy_Attributes(bm, bm, l->f, l2->f);
- BM_loop_interp_from_face(bm, l2, l->f);
+ BM_loop_interp_from_face(bm, l2, l->f, 1);
} else {
BM_Copy_Attributes(bm, bm, l->f, l2->f);
BM_Copy_Attributes(bm, bm, l, l2);
@@ -687,18 +687,6 @@
BM_Copy_Attributes(bm, bm, lorig->f, l2->f);
BM_Copy_Attributes(bm, bm, lorig, l2);
}
-#if 0
- if (HasMDisps) {
- BMLoop *l2;
- BMIter liter2;
-
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_VERT, v) {
- BM_ITER(l2, &liter2, bm, BM_LOOPS_OF_FACE, l->f) {
- BM_loop_interp_multires(bm, l2, lorig->f);
- }
- }
- }
-#endif
}
}
More information about the Bf-blender-cvs
mailing list