[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