[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