forked from bartvdbraak/blender
Fix in mball last May 15th causes a hang (eternal loop) in mball.c,
a division by zero was not handled (weird though, only shows in OSX PPC. no optimize, debug build.)
This commit is contained in:
parent
54be27b40e
commit
3effe8060d
@ -1374,36 +1374,37 @@ void find_first_points(PROCESS *mbproc, MetaBall *mb, int a)
|
|||||||
nz = abs((out.z - in.z)/mbproc->size);
|
nz = abs((out.z - in.z)/mbproc->size);
|
||||||
|
|
||||||
MAXN = MAX3(nx,ny,nz);
|
MAXN = MAX3(nx,ny,nz);
|
||||||
|
if(MAXN!=0.0f) {
|
||||||
|
dx = (out.x - in.x)/MAXN;
|
||||||
|
dy = (out.y - in.y)/MAXN;
|
||||||
|
dz = (out.z - in.z)/MAXN;
|
||||||
|
|
||||||
dx = (out.x - in.x)/MAXN;
|
len = 0.0;
|
||||||
dy = (out.y - in.y)/MAXN;
|
while(len<=max_len) {
|
||||||
dz = (out.z - in.z)/MAXN;
|
workp.x += dx;
|
||||||
|
workp.y += dy;
|
||||||
|
workp.z += dz;
|
||||||
|
/* compute value of implicite function */
|
||||||
|
tmp_v = mbproc->function(workp.x, workp.y, workp.z);
|
||||||
|
/* add cube to the stack, when value of implicite function crosses zero value */
|
||||||
|
if((tmp_v<0.0 && workp_v>=0.0)||(tmp_v>0.0 && workp_v<=0.0)) {
|
||||||
|
|
||||||
len = 0.0;
|
/* indexes of CUBE, which includes "first point" */
|
||||||
while(len<=max_len) {
|
c_i= (int)floor(workp.x/mbproc->size);
|
||||||
workp.x += dx;
|
c_j= (int)floor(workp.y/mbproc->size);
|
||||||
workp.y += dy;
|
c_k= (int)floor(workp.z/mbproc->size);
|
||||||
workp.z += dz;
|
|
||||||
/* compute value of implicite function */
|
|
||||||
tmp_v = mbproc->function(workp.x, workp.y, workp.z);
|
|
||||||
/* add cube to the stack, when value of implicite function crosses zero value */
|
|
||||||
if((tmp_v<0.0 && workp_v>=0.0)||(tmp_v>0.0 && workp_v<=0.0)) {
|
|
||||||
|
|
||||||
/* indexes of CUBE, which includes "first point" */
|
/* add CUBE (with indexes c_i, c_j, c_k) to the stack,
|
||||||
c_i= (int)floor(workp.x/mbproc->size);
|
* this cube includes found point of Implicit Surface */
|
||||||
c_j= (int)floor(workp.y/mbproc->size);
|
if (ml->flag & MB_NEGATIVE)
|
||||||
c_k= (int)floor(workp.z/mbproc->size);
|
add_cube(mbproc, c_i, c_j, c_k, 2);
|
||||||
|
else
|
||||||
|
add_cube(mbproc, c_i, c_j, c_k, 1);
|
||||||
|
}
|
||||||
|
len = sqrt((workp.x-in.x)*(workp.x-in.x) + (workp.y-in.y)*(workp.y-in.y) + (workp.z-in.z)*(workp.z-in.z));
|
||||||
|
workp_v = tmp_v;
|
||||||
|
|
||||||
/* add CUBE (with indexes c_i, c_j, c_k) to the stack,
|
|
||||||
* this cube includes found point of Implicit Surface */
|
|
||||||
if (ml->flag & MB_NEGATIVE)
|
|
||||||
add_cube(mbproc, c_i, c_j, c_k, 2);
|
|
||||||
else
|
|
||||||
add_cube(mbproc, c_i, c_j, c_k, 1);
|
|
||||||
}
|
}
|
||||||
len = sqrt((workp.x-in.x)*(workp.x-in.x) + (workp.y-in.y)*(workp.y-in.y) + (workp.z-in.z)*(workp.z-in.z));
|
|
||||||
workp_v = tmp_v;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user