Last bug fix of #10999. This should finaly work (tested by jesterking).
authorJiri Hnidek <jiri.hnidek@tul.cz>
Thu, 15 May 2008 19:30:30 +0000 (19:30 +0000)
committerJiri Hnidek <jiri.hnidek@tul.cz>
Thu, 15 May 2008 19:30:30 +0000 (19:30 +0000)
source/blender/blenkernel/BKE_mball.h
source/blender/blenkernel/intern/mball.c

index d4fb2dbc8bf40a5c5d520797cc8902b29cacef8a..0dfc8ae6b28704ddfe0bd1f25ce80bab390fc4b8 100644 (file)
@@ -150,7 +150,7 @@ void add_cube(PROCESS *mbproc, int i, int j, int k, int count);
 void find_first_points(PROCESS *mbproc, struct MetaBall *mb, int a);
 
 void fill_metaball_octal_node(octal_node *node, struct MetaElem *ml, short i);
-void subdivide_metaball_octal_node(octal_node *node, float *size, short depth);
+void subdivide_metaball_octal_node(octal_node *node, float size_x, float size_y, float size_z, short depth);
 void free_metaball_octal_node(octal_node *node);
 void init_metaball_octal_tree(int depth);
 void polygonize(PROCESS *mbproc, struct MetaBall *mb);
index 242bcbf66d89f6691a6a379114278116d4f214c4..0a686f6aeba6bfef66bf710c20c1bd3f75b90fad 100644 (file)
@@ -1709,15 +1709,13 @@ void fill_metaball_octal_node(octal_node *node, MetaElem *ml, short i)
  *  +------+------+
  *  
  */
-void subdivide_metaball_octal_node(octal_node *node, float *size, short depth)
+void subdivide_metaball_octal_node(octal_node *node, float size_x, float size_y, float size_z, short depth)
 {
        MetaElem *ml;
        ml_pointer *ml_p;
        float x,y,z;
        int a,i;
 
-       if(depth==0) return;
-
        /* create new nodes */
        for(a=0;a<8;a++){
                node->nodes[a]= MEM_mallocN(sizeof(octal_node),"octal_node");
@@ -1731,45 +1729,71 @@ void subdivide_metaball_octal_node(octal_node *node, float *size, short depth)
                node->nodes[a]->pos= 0;
        }
 
-       size[0]/=2; size[1]/=2; size[2]/=2;
+       size_x /= 2;
+       size_y /= 2;
+       size_z /= 2;
        
        /* center of node */
-       node->x= x= node->x_min + size[0];
-       node->y= y= node->y_min + size[1];
-       node->z= z= node->z_min + size[2];
+       node->x = x = node->x_min + size_x;
+       node->y = y = node->y_min + size_y;
+       node->z = z = node->z_min + size_z;
 
        /* setting up of border points of new nodes */
-       node->nodes[0]->x_min= node->x_min;
-       node->nodes[0]->y_min= node->y_min;
-       node->nodes[0]->z_min= node->z_min;
-       
-       node->nodes[1]->x_min= x;
-       node->nodes[1]->y_min= node->y_min;
-       node->nodes[1]->z_min= node->z_min;
-
-       node->nodes[2]->x_min= x;
-       node->nodes[2]->y_min= y;
-       node->nodes[2]->z_min= node->z_min;
-
-       node->nodes[3]->x_min= node->x_min;
-       node->nodes[3]->y_min= y;
-       node->nodes[3]->z_min= node->z_min;
-
-       node->nodes[4]->x_min= node->x_min;
-       node->nodes[4]->y_min= node->y_min;
-       node->nodes[4]->z_min= z;
-       
-       node->nodes[5]->x_min= x;
-       node->nodes[5]->y_min= node->y_min;
-       node->nodes[5]->z_min= z;
-
-       node->nodes[6]->x_min= x;
-       node->nodes[6]->y_min= y;
-       node->nodes[6]->z_min= z;
-
-       node->nodes[7]->x_min= node->x_min;
-       node->nodes[7]->y_min= y;
-       node->nodes[7]->z_min= z;
+       node->nodes[0]->x_min = node->x_min;
+       node->nodes[0]->y_min = node->y_min;
+       node->nodes[0]->z_min = node->z_min;
+       node->nodes[0]->x = node->nodes[0]->x_min + size_x/2;
+       node->nodes[0]->y = node->nodes[0]->y_min + size_y/2;
+       node->nodes[0]->z = node->nodes[0]->z_min + size_z/2;
+       
+       node->nodes[1]->x_min = x;
+       node->nodes[1]->y_min = node->y_min;
+       node->nodes[1]->z_min = node->z_min;
+       node->nodes[1]->x = node->nodes[1]->x_min + size_x/2;
+       node->nodes[1]->y = node->nodes[1]->y_min + size_y/2;
+       node->nodes[1]->z = node->nodes[1]->z_min + size_z/2;
+
+       node->nodes[2]->x_min = x;
+       node->nodes[2]->y_min = y;
+       node->nodes[2]->z_min = node->z_min;
+       node->nodes[2]->x = node->nodes[2]->x_min + size_x/2;
+       node->nodes[2]->y = node->nodes[2]->y_min + size_y/2;
+       node->nodes[2]->z = node->nodes[2]->z_min + size_z/2;
+
+       node->nodes[3]->x_min = node->x_min;
+       node->nodes[3]->y_min = y;
+       node->nodes[3]->z_min = node->z_min;
+       node->nodes[3]->x = node->nodes[3]->x_min + size_x/2;
+       node->nodes[3]->y = node->nodes[3]->y_min + size_y/2;
+       node->nodes[3]->z = node->nodes[3]->z_min + size_z/2;
+
+       node->nodes[4]->x_min = node->x_min;
+       node->nodes[4]->y_min = node->y_min;
+       node->nodes[4]->z_min = z;
+       node->nodes[4]->x = node->nodes[4]->x_min + size_x/2;
+       node->nodes[4]->y = node->nodes[4]->y_min + size_y/2;
+       node->nodes[4]->z = node->nodes[4]->z_min + size_z/2;
+       
+       node->nodes[5]->x_min = x;
+       node->nodes[5]->y_min = node->y_min;
+       node->nodes[5]->z_min = z;
+       node->nodes[5]->x = node->nodes[5]->x_min + size_x/2;
+       node->nodes[5]->y = node->nodes[5]->y_min + size_y/2;
+       node->nodes[5]->z = node->nodes[5]->z_min + size_z/2;
+
+       node->nodes[6]->x_min = x;
+       node->nodes[6]->y_min = y;
+       node->nodes[6]->z_min = z;
+       node->nodes[6]->x = node->nodes[6]->x_min + size_x/2;
+       node->nodes[6]->y = node->nodes[6]->y_min + size_y/2;
+       node->nodes[6]->z = node->nodes[6]->z_min + size_z/2;
+
+       node->nodes[7]->x_min = node->x_min;
+       node->nodes[7]->y_min = y;
+       node->nodes[7]->z_min = z;
+       node->nodes[7]->x = node->nodes[7]->x_min + size_x/2;
+       node->nodes[7]->y = node->nodes[7]->y_min + size_y/2;
+       node->nodes[7]->z = node->nodes[7]->z_min + size_z/2;
 
        ml_p= node->elems.first;
        
@@ -1936,7 +1960,7 @@ void subdivide_metaball_octal_node(octal_node *node, float *size, short depth)
        if(depth>0){
                for(a=0;a<8;a++){
                        if(node->nodes[a]->count > 0) /* if node is not empty, then it is subdivided */
-                               subdivide_metaball_octal_node(node->nodes[a], size, depth);
+                               subdivide_metaball_octal_node(node->nodes[a], size_x, size_y, size_z, depth);
                }
        }
 }
@@ -2008,7 +2032,7 @@ void init_metaball_octal_tree(int depth)
        size[2]= node->z_max - node->z_min;
 
        /* first node is subdivided recursively */
-       subdivide_metaball_octal_node(node, size, metaball_tree->depth);
+       subdivide_metaball_octal_node(node, size[0], size[1], size[2], metaball_tree->depth);
 }
 
 void metaball_polygonize(Object *ob)