[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [29735] trunk/blender/source/blender/ blenkernel: Fix #22051: crash when scaling parent metaball

Sergey Sharybin g.ulairi at gmail.com
Sun Jun 27 10:35:28 CEST 2010


Revision: 29735
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29735
Author:   nazgul
Date:     2010-06-27 10:35:27 +0200 (Sun, 27 Jun 2010)

Log Message:
-----------
Fix #22051: crash when scaling parent metaball

Keep the constant resolution for any motherball's scale

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_mball.h
    trunk/blender/source/blender/blenkernel/intern/mball.c

Modified: trunk/blender/source/blender/blenkernel/BKE_mball.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_mball.h	2010-06-27 07:45:57 UTC (rev 29734)
+++ trunk/blender/source/blender/blenkernel/BKE_mball.h	2010-06-27 08:35:27 UTC (rev 29735)
@@ -97,6 +97,7 @@
 	CENTERLIST **centers;		/* cube center hash table */
 	CORNER **corners;			/* corner value hash table */
 	EDGELIST **edges;			/* edge and vertex id hash table */
+	float scale[3];
 } PROCESS;
 
 /* dividing scene using octal tree makes polygonisation faster */

Modified: trunk/blender/source/blender/blenkernel/intern/mball.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mball.c	2010-06-27 07:45:57 UTC (rev 29734)
+++ trunk/blender/source/blender/blenkernel/intern/mball.c	2010-06-27 08:35:27 UTC (rev 29735)
@@ -876,11 +876,11 @@
 	c = (CORNER *) new_pgn_element(sizeof(CORNER));
 
 	c->i = i; 
-	c->x = ((float)i-0.5f)*p->size;
+	c->x = ((float)i-0.5f)*p->size/p->scale[0];
 	c->j = j; 
-	c->y = ((float)j-0.5f)*p->size;
+	c->y = ((float)j-0.5f)*p->size/p->scale[1];
 	c->k = k; 
-	c->z = ((float)k-0.5f)*p->size;
+	c->z = ((float)k-0.5f)*p->size/p->scale[2];
 	c->value = p->function(c->x, c->y, c->z);
 	
 	c->next = p->corners[index];
@@ -1409,9 +1409,9 @@
 					workp_v = in_v;
 					max_len = sqrt((out.x-in.x)*(out.x-in.x) + (out.y-in.y)*(out.y-in.y) + (out.z-in.z)*(out.z-in.z));
 
-					nx = abs((out.x - in.x)/mbproc->size);
-					ny = abs((out.y - in.y)/mbproc->size);
-					nz = abs((out.z - in.z)/mbproc->size);
+					nx = abs((out.x - in.x)/mbproc->size*mbproc->scale[0]);
+					ny = abs((out.y - in.y)/mbproc->size*mbproc->scale[1]);
+					nz = abs((out.z - in.z)/mbproc->size*mbproc->scale[2]);
 					
 					MAXN = MAX3(nx,ny,nz);
 					if(MAXN!=0.0f) {
@@ -1430,9 +1430,9 @@
 							if((tmp_v<0.0 && workp_v>=0.0)||(tmp_v>0.0 && workp_v<=0.0)) {
 
 								/* indexes of CUBE, which includes "first point" */
-								c_i= (int)floor(workp.x/mbproc->size);
-								c_j= (int)floor(workp.y/mbproc->size);
-								c_k= (int)floor(workp.z/mbproc->size);
+								c_i= (int)floor(workp.x/mbproc->size*mbproc->scale[0]);
+								c_j= (int)floor(workp.y/mbproc->size*mbproc->scale[1]);
+								c_k= (int)floor(workp.z/mbproc->size*mbproc->scale[2]);
 								
 								/* add CUBE (with indexes c_i, c_j, c_k) to the stack,
 								 * this cube includes found point of Implicit Surface */
@@ -2082,13 +2082,16 @@
 	DispList *dl;
 	int a, nr_cubes;
 	float *ve, *no, totsize, width;
-	
+	float smat[3][3];
+
 	mb= ob->data;
 
 	if(totelem==0) return;
 	if(!(G.rendering) && (mb->flag==MB_UPDATE_NEVER)) return;
 	if(G.moving && mb->flag==MB_UPDATE_FAST) return;
 
+	object_scale_to_mat3(ob, smat);
+
 	freedisplist(&ob->disp);
 	curindex= totindex= 0;
 	indices= 0;
@@ -2130,6 +2133,7 @@
 		width= mb->wiresize;
 		if(G.moving && mb->flag==MB_UPDATE_HALFRES) width*= 2;
 	}
+
 	/* nr_cubes is just for safety, minimum is totsize */
 	nr_cubes= (int)(0.5+totsize/width);
 
@@ -2140,6 +2144,11 @@
 	mbproc.cubes= 0;
 	mbproc.delta = width/(float)(RES*RES);
 
+	/* to keep constant resolution for any motherball scale */
+	mbproc.scale[0]= smat[0][0];
+	mbproc.scale[1]= smat[1][1];
+	mbproc.scale[2]= smat[2][2];
+
 	polygonize(&mbproc, mb);
 	
 	MEM_freeN(mainb);





More information about the Bf-blender-cvs mailing list