[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [32530] trunk/blender/source/blender/ blenkernel/intern/customdata.c: Fix #24139: Edge loop + Multi-Resolution modifier results weird artifacts

Sergey Sharybin g.ulairi at gmail.com
Sat Oct 16 22:43:17 CEST 2010


Revision: 32530
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=32530
Author:   nazgul
Date:     2010-10-16 22:43:16 +0200 (Sat, 16 Oct 2010)

Log Message:
-----------
Fix #24139: Edge loop + Multi-Resolution modifier results weird artifacts

- mdisp_corners used to return incorrect number of verts in some cases
- fixed memory corruption when face changed vertex count in
  edit mode (forgot displacement for such faces atm, could be changed
  in the future)

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

Modified: trunk/blender/source/blender/blenkernel/intern/customdata.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/customdata.c	2010-10-16 19:29:48 UTC (rev 32529)
+++ trunk/blender/source/blender/blenkernel/intern/customdata.c	2010-10-16 20:43:16 UTC (rev 32530)
@@ -442,8 +442,15 @@
 
 static int mdisp_corners(MDisps *s)
 {
-	/* silly trick because we don't get it from callback */
-	return (s->totdisp % (3*3) == 0)? 3: 4;
+	int lvl= 13;
+
+	while(lvl > 0) {
+		int side = (1 << (lvl-1)) + 1;
+		if ((s->totdisp % (side*side)) == 0) return s->totdisp / (side*side);
+		lvl--;
+	}
+
+	return 0;
 }
 
 static void layerSwap_mdisps(void *data, const int *ci)
@@ -452,19 +459,28 @@
 	float (*d)[3] = NULL;
 	int corners, cornersize, S;
 
-	/* this function is untested .. */
 	if(s->disps) {
-		corners = mdisp_corners(s);
-		cornersize = s->totdisp/corners;
+		int nverts= (ci[1] == 3) ? 4 : 3; /* silly way to know vertex count of face */
+		corners= mdisp_corners(s);
+		cornersize= s->totdisp/corners;
 
-		d = MEM_callocN(sizeof(float) * 3 * s->totdisp, "mdisps swap");
+		if(corners!=nverts) {
+			/* happens when face changed vertex count in edit mode
+			   if it happened, just forgot displacement */
 
+			MEM_freeN(s->disps);
+			s->disps= NULL;
+			s->totdisp= 0; /* flag to update totdisp */
+			return;
+		}
+
+		d= MEM_callocN(sizeof(float) * 3 * s->totdisp, "mdisps swap");
+
 		for(S = 0; S < corners; S++)
 			memcpy(d + cornersize*S, s->disps + cornersize*ci[S], cornersize*3*sizeof(float));
 		
-		if(s->disps)
-			MEM_freeN(s->disps);
-		s->disps = d;
+		MEM_freeN(s->disps);
+		s->disps= d;
 	}
 }
 





More information about the Bf-blender-cvs mailing list