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/BKE_mball.h | 1 - source/blender/blenkernel/intern/mball.c | 27 +++++++++------------------ 2 files changed, 9 insertions(+), 19 deletions(-) diff --git a/source/blender/blenkernel/BKE_mball.h b/source/blender/blenkernel/BKE_mball.h index 5d41f4e374e..8d7d205e847 100644 --- a/source/blender/blenkernel/BKE_mball.h +++ b/source/blender/blenkernel/BKE_mball.h @@ -97,7 +97,6 @@ typedef struct process { /* parameters, function, storage */ 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 */ 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