[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