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:
authorJiri Hnidek <jiri.hnidek@tul.cz>2008-05-15 23:30:30 +0400
committerJiri Hnidek <jiri.hnidek@tul.cz>2008-05-15 23:30:30 +0400
commitba6c6854ed1767dd80b05741ce72a114e253d09e (patch)
tree88641e881a054be1f7cccd2f5e0b5e410d9e18c6
parent6e7744451be07141753a102c76aa768509b1d124 (diff)
Last bug fix of #10999. This should finaly work (tested by jesterking).
-rw-r--r--source/blender/blenkernel/BKE_mball.h2
-rw-r--r--source/blender/blenkernel/intern/mball.c104
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)