[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16916] trunk/blender/source/blender/ blenkernel/intern/displist.c: Bugfix #17746

Ton Roosendaal ton at blender.org
Sat Oct 4 14:31:54 CEST 2008


Revision: 16916
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16916
Author:   ton
Date:     2008-10-04 14:31:54 +0200 (Sat, 04 Oct 2008)

Log Message:
-----------
Bugfix #17746

Curve deform did not work yet on Text and Curve objects, this because it
was not providing the entire array of vertices, for a proper detection of
min/max bounds of the full input.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/displist.c

Modified: trunk/blender/source/blender/blenkernel/intern/displist.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/displist.c	2008-10-04 12:23:57 UTC (rev 16915)
+++ trunk/blender/source/blender/blenkernel/intern/displist.c	2008-10-04 12:31:54 UTC (rev 16916)
@@ -1253,14 +1253,41 @@
 
 	for (; md; md=md->next) {
 		ModifierTypeInfo *mti = modifierType_getInfo(md->type);
-
+		
 		if ((md->mode & required_mode) != required_mode) continue;
 		if (mti->isDisabled && mti->isDisabled(md)) continue;
 		if (mti->type!=eModifierTypeType_OnlyDeform && mti->type!=eModifierTypeType_DeformOrConstruct) continue;
 
-		for (dl=dispbase->first; dl; dl=dl->next) {
-			mti->deformVerts(md, ob, NULL, (float(*)[3]) dl->verts, (dl->type==DL_INDEX3)?dl->nr:dl->parts*dl->nr);
+		/* need to put all verts in 1 block for curve deform */
+		if(md->type==eModifierType_Curve) {
+			float *allverts, *fp;
+			int totvert= 0;
+			
+			for (dl=dispbase->first; dl; dl=dl->next)
+				totvert+= (dl->type==DL_INDEX3)?dl->nr:dl->parts*dl->nr;
+			
+			fp= allverts= MEM_mallocN(totvert*sizeof(float)*3, "temp vert");
+			for (dl=dispbase->first; dl; dl=dl->next) {
+				int offs= 3 * ((dl->type==DL_INDEX3)?dl->nr:dl->parts*dl->nr);
+				memcpy(fp, dl->verts, sizeof(float) * offs);
+				fp+= offs;
+			}
+			
+			mti->deformVerts(md, ob, NULL, (float(*)[3]) allverts, totvert);
+			
+			fp= allverts;
+			for (dl=dispbase->first; dl; dl=dl->next) {
+				int offs= 3 * ((dl->type==DL_INDEX3)?dl->nr:dl->parts*dl->nr);
+				memcpy(dl->verts, fp, sizeof(float) * offs);
+				fp+= offs;
+			}
+			MEM_freeN(allverts);
 		}
+		else {
+			for (dl=dispbase->first; dl; dl=dl->next) {
+				mti->deformVerts(md, ob, NULL, (float(*)[3]) dl->verts, (dl->type==DL_INDEX3)?dl->nr:dl->parts*dl->nr);
+			}
+		}
 	}
 
 	if (deformedVerts) {





More information about the Bf-blender-cvs mailing list