From 137e53064cf65b736347b75f2580d82fe63d17ca Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 6 Jul 2010 11:44:45 +0000 Subject: Revert revision 29735: Fix #22051: crash when scaling parent metaball. Keep the constant resolution for any motherball's scale. This avoids running out of memory when scaling the metaball down, but there's a reason it depends on this scaling, for example for instancing it's more useful to have this. It also doesn't really solve the problem but only moves it, it's still possible to run out of memory with different setups/scales. --- source/blender/blenkernel/intern/mball.c | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) (limited to 'source/blender/blenkernel/intern') diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c index da9740a1486..a97bec670d6 100644 --- a/source/blender/blenkernel/intern/mball.c +++ b/source/blender/blenkernel/intern/mball.c @@ -889,11 +889,11 @@ CORNER *setcorner (PROCESS* p, int i, int j, int k) c = (CORNER *) new_pgn_element(sizeof(CORNER)); c->i = i; - c->x = ((float)i-0.5f)*p->size/p->scale[0]; + c->x = ((float)i-0.5f)*p->size; c->j = j; - c->y = ((float)j-0.5f)*p->size/p->scale[1]; + c->y = ((float)j-0.5f)*p->size; c->k = k; - c->z = ((float)k-0.5f)*p->size/p->scale[2]; + c->z = ((float)k-0.5f)*p->size; c->value = p->function(c->x, c->y, c->z); c->next = p->corners[index]; @@ -1422,9 +1422,9 @@ void find_first_points(PROCESS *mbproc, MetaBall *mb, int a) 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*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]); + nx = abs((out.x - in.x)/mbproc->size); + ny = abs((out.y - in.y)/mbproc->size); + nz = abs((out.z - in.z)/mbproc->size); MAXN = MAX3(nx,ny,nz); if(MAXN!=0.0f) { @@ -1443,9 +1443,9 @@ void find_first_points(PROCESS *mbproc, MetaBall *mb, int a) 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*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]); + c_i= (int)floor(workp.x/mbproc->size); + c_j= (int)floor(workp.y/mbproc->size); + c_k= (int)floor(workp.z/mbproc->size); /* add CUBE (with indexes c_i, c_j, c_k) to the stack, * this cube includes found point of Implicit Surface */ @@ -2095,7 +2095,6 @@ void metaball_polygonize(Scene *scene, Object *ob, ListBase *dispbase) DispList *dl; int a, nr_cubes; float *ve, *no, totsize, width; - float smat[3][3]; mb= ob->data; @@ -2103,8 +2102,6 @@ void metaball_polygonize(Scene *scene, Object *ob, ListBase *dispbase) if(!(G.rendering) && (mb->flag==MB_UPDATE_NEVER)) return; if(G.moving && mb->flag==MB_UPDATE_FAST) return; - object_scale_to_mat3(ob, smat); - curindex= totindex= 0; indices= 0; thresh= mb->thresh; @@ -2145,7 +2142,6 @@ void metaball_polygonize(Scene *scene, Object *ob, ListBase *dispbase) 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); @@ -2156,11 +2152,6 @@ void metaball_polygonize(Scene *scene, Object *ob, ListBase *dispbase) 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); -- cgit v1.2.3