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:
authorTon Roosendaal <ton@blender.org>2008-05-18 17:57:47 +0400
committerTon Roosendaal <ton@blender.org>2008-05-18 17:57:47 +0400
commit3effe8060d3222436f41b8a5681a09caf18bff93 (patch)
tree89ac0e14c7c6ff9a5ec812dbe7139d3f5aeaf984
parent54be27b40e6d0c3ae826662b0a08b1c5aee6e87c (diff)
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.)
-rw-r--r--source/blender/blenkernel/intern/mball.c57
1 files changed, 29 insertions, 28 deletions
diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c
index 0a686f6aeba..79205814ae7 100644
--- a/source/blender/blenkernel/intern/mball.c
+++ b/source/blender/blenkernel/intern/mball.c
@@ -1374,36 +1374,37 @@ void find_first_points(PROCESS *mbproc, MetaBall *mb, int a)
nz = abs((out.z - in.z)/mbproc->size);
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;
+
+ len = 0.0;
+ while(len<=max_len) {
+ 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)) {
+
+ /* 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);
+
+ /* 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;
- dx = (out.x - in.x)/MAXN;
- dy = (out.y - in.y)/MAXN;
- dz = (out.z - in.z)/MAXN;
-
- len = 0.0;
- while(len<=max_len) {
- 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)) {
-
- /* 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);
-
- /* 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;
-
}
}
}