diff options
author | Jiri Hnidek <jiri.hnidek@tul.cz> | 2008-05-15 23:30:30 +0400 |
---|---|---|
committer | Jiri Hnidek <jiri.hnidek@tul.cz> | 2008-05-15 23:30:30 +0400 |
commit | ba6c6854ed1767dd80b05741ce72a114e253d09e (patch) | |
tree | 88641e881a054be1f7cccd2f5e0b5e410d9e18c6 | |
parent | 6e7744451be07141753a102c76aa768509b1d124 (diff) |
Last bug fix of #10999. This should finaly work (tested by jesterking).
-rw-r--r-- | source/blender/blenkernel/BKE_mball.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mball.c | 104 |
2 files changed, 65 insertions, 41 deletions
diff --git a/source/blender/blenkernel/BKE_mball.h b/source/blender/blenkernel/BKE_mball.h index d4fb2dbc8bf..0dfc8ae6b28 100644 --- a/source/blender/blenkernel/BKE_mball.h +++ b/source/blender/blenkernel/BKE_mball.h @@ -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); diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c index 242bcbf66d8..0a686f6aeba 100644 --- a/source/blender/blenkernel/intern/mball.c +++ b/source/blender/blenkernel/intern/mball.c @@ -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) |