Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2010-07-06 15:44:45 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2010-07-06 15:44:45 +0400
commit137e53064cf65b736347b75f2580d82fe63d17ca (patch)
treec82e428b3121765e635c0cebfd4408788f943778 /source/blender
parent8049f9066c68c98cfacbce0a2372cf45190b4804 (diff)
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.
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/blenkernel/BKE_mball.h1
-rw-r--r--source/blender/blenkernel/intern/mball.c27
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);