Commit: 3d20bf75cbfa2ea6444a68af860b8ef1db5675a8
Author: Campbell Barton
Date:   Thu Feb 26 14:39:57 2015 +1100
Branches: master
https://developer.blender.org/rB3d20bf75cbfa2ea6444a68af860b8ef1db5675a8

BKE_mball: split tessellation into its own file

this has a lot of its own local structs, functions,
better to keep isolated from general metaball selection/library logic.

===================================================================

A       source/blender/blenkernel/BKE_mball_tessellate.h
M       source/blender/blenkernel/CMakeLists.txt
M       source/blender/blenkernel/intern/mball.c
A       source/blender/blenkernel/intern/mball_tessellate.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_mball_tessellate.h 
b/source/blender/blenkernel/BKE_mball_tessellate.h
new file mode 100644
index 0000000..e69de29
diff --git a/source/blender/blenkernel/CMakeLists.txt 
b/source/blender/blenkernel/CMakeLists.txt
index a826fe2..f19c106 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -119,6 +119,7 @@ set(SRC
        intern/mask_rasterize.c
        intern/material.c
        intern/mball.c
+       intern/mball_tessellate.c
        intern/mesh.c
        intern/mesh_evaluate.c
        intern/mesh_mapping.c
@@ -233,6 +234,7 @@ set(SRC
        BKE_mask.h
        BKE_material.h
        BKE_mball.h
+       BKE_mball_tessellate.h
        BKE_mesh.h
        BKE_mesh_mapping.h
        BKE_mesh_remap.h
diff --git a/source/blender/blenkernel/intern/mball.c 
b/source/blender/blenkernel/intern/mball.c
index ce20636..efc5b23 100644
--- a/source/blender/blenkernel/intern/mball.c
+++ b/source/blender/blenkernel/intern/mball.c
@@ -65,119 +65,6 @@
 #include "BKE_object.h"
 #include "BKE_material.h"
 
-/* Data types */
-
-typedef struct vertex {         /* surface vertex */
-       float co[3];  /* position and surface normal */
-       float no[3];
-} VERTEX;
-
-typedef struct vertices {       /* list of vertices in polygonization */
-       int count, max;             /* # vertices, max # allowed */
-       VERTEX *ptr;                /* dynamically allocated */
-} VERTICES;
-
-typedef struct corner {         /* corner of a cube */
-       int i, j, k;                /* (i, j, k) is index within lattice */
-       float co[3], value;       /* location and function value */
-       struct corner *next;
-} CORNER;
-
-typedef struct cube {           /* partitioning cell (cube) */
-       int i, j, k;                /* lattice location of cube */
-       CORNER *corners[8];         /* eight corners */
-} CUBE;
-
-typedef struct cubes {          /* linked list of cubes acting as stack */
-       CUBE cube;                  /* a single cube */
-       struct cubes *next;         /* remaining elements */
-} CUBES;
-
-typedef struct centerlist {     /* list of cube locations */
-       int i, j, k;                /* cube location */
-       struct centerlist *next;    /* remaining elements */
-} CENTERLIST;
-
-typedef struct edgelist {       /* list of edges */
-       int i1, j1, k1, i2, j2, k2; /* edge corner ids */
-       int vid;                    /* vertex id */
-       struct edgelist *next;      /* remaining elements */
-} EDGELIST;
-
-typedef struct intlist {        /* list of integers */
-       int i;                      /* an integer */
-       struct intlist *next;       /* remaining elements */
-} INTLIST;
-
-typedef struct intlists {       /* list of list of integers */
-       INTLIST *list;              /* a list of integers */
-       struct intlists *next;      /* remaining elements */
-} INTLISTS;
-
-/* dividing scene using octal tree makes polygonisation faster */
-typedef struct ml_pointer {
-       struct ml_pointer *next, *prev;
-       struct MetaElem *ml;
-} ml_pointer;
-
-typedef struct octal_node {
-       struct octal_node *nodes[8];/* children of current node */
-       struct octal_node *parent;  /* parent of current node */
-       struct ListBase elems;      /* ListBase of MetaElem pointers 
(ml_pointer) */
-       float x_min, y_min, z_min;  /* 1st border point */
-       float x_max, y_max, z_max;  /* 7th border point */
-       float x, y, z;              /* center of node */
-       int pos, neg;               /* number of positive and negative 
MetaElements in the node */
-       int count;                  /* number of MetaElems, which belongs to 
the node */
-} octal_node;
-
-typedef struct octal_tree {
-       struct octal_node *first;   /* first node */
-       int pos, neg;               /* number of positive and negative 
MetaElements in the scene */
-       short depth;                /* number of scene subdivision */
-} octal_tree;
-
-struct pgn_elements {
-       struct pgn_elements *next, *prev;
-       char *data;
-};
-
-typedef struct process {        /* parameters, function, storage */
-       /* ** old G_mb contents ** */
-       float thresh;
-       int totelem;
-       MetaElem **mainb;
-       octal_tree *metaball_tree;
-
-       /* ** old process contents ** */
-
-       /* what happens here? floats, I think. */
-       /*  float (*function)(void);     */     /* implicit surface function */
-       float (*function)(struct process *, float, float, float);
-       float size, delta;          /* cube size, normal delta */
-       int bounds;                 /* cube range within lattice */
-       CUBES *cubes;               /* active cubes */
-       VERTICES vertices;          /* surface vertices */
-       CENTERLIST **centers;       /* cube center hash table */
-       CORNER **corners;           /* corner value hash table */
-       EDGELIST **edges;           /* edge and vertex id hash table */
-
-       /* Runtime things */
-       int *indices;
-       int totindex, curindex;
-
-       int pgn_offset;
-       struct pgn_elements *pgn_current;
-       ListBase pgn_list;
-} PROCESS;
-
-/* Forward declarations */
-static int vertid(PROCESS *process, const CORNER *c1, const CORNER *c2, 
MetaBall *mb);
-static int setcenter(PROCESS *process, CENTERLIST *table[], const int i, const 
int j, const int k);
-static CORNER *setcorner(PROCESS *process, int i, int j, int k);
-static void converge(PROCESS *process, const float p1[3], const float p2[3], 
float v1, float v2,
-                     float p[3], MetaBall *mb, int f);
-
 /* Functions */
 
 void BKE_mball_unlink(MetaBall *mb)
@@ -558,1817 +445,6 @@ Object *BKE_mball_basis_find(Scene *scene, Object *basis)
        return basis;
 }
 
-
-/* ******************** ARITH ************************* */
-
-/* BASED AT CODE (but mostly rewritten) :
- * C code from the article
- * "An Implicit Surface Polygonizer"
- * by Jules Bloomenthal, [email protected]
- * in "Graphics Gems IV", Academic Press, 1994
- *
- * Authored by Jules Bloomenthal, Xerox PARC.
- * Copyright (c) Xerox Corporation, 1991.  All rights reserved.
- * Permission is granted to reproduce, use and distribute this code for
- * any and all purposes, provided that this notice appears in all copies. */
-
-#define RES 12 /* # converge iterations    */
-
-#define L   0  /* left direction:      -x, -i */
-#define R   1  /* right direction:     +x, +i */
-#define B   2  /* bottom direction: -y, -j */
-#define T   3  /* top direction:       +y, +j */
-#define N   4  /* near direction:      -z, -k */
-#define F   5  /* far direction:       +z, +k */
-#define LBN 0  /* left bottom near corner  */
-#define LBF 1  /* left bottom far corner   */
-#define LTN 2  /* left top near corner     */
-#define LTF 3  /* left top far corner      */
-#define RBN 4  /* right bottom near corner */
-#define RBF 5  /* right bottom far corner  */
-#define RTN 6  /* right top near corner    */
-#define RTF 7  /* right top far corner     */
-
-/* the LBN corner of cube (i, j, k), corresponds with location
- * (i-0.5)*size, (j-0.5)*size, (k-0.5)*size) */
-
-#define HASHBIT     (5)
-#define HASHSIZE    (size_t)(1 << (3 * HASHBIT))   /*! < hash table size 
(32768) */
-
-#define HASH(i, j, k) ((((( (i) & 31) << 5) | ( (j) & 31)) << 5) | ( (k) & 31) 
)
-
-#define MB_BIT(i, bit) (((i) >> (bit)) & 1)
-#define FLIP(i, bit) ((i) ^ 1 << (bit)) /* flip the given bit of i */
-
-
-/* **************** POLYGONIZATION ************************ */
-
-static void calc_mballco(MetaElem *ml, float vec[3])
-{
-       if (ml->mat) {
-               mul_m4_v3((float (*)[4])ml->mat, vec);
-       }
-}
-
-static float densfunc(MetaElem *ball, float x, float y, float z)
-{
-       float dist2;
-       float dvec[3] = {x, y, z};
-
-       mul_m4_v3((float (*)[4])ball->imat, dvec);
-
-       switch (ball->type) {
-               case MB_BALL:
-                       /* do nothing */
-                       break;
-               case MB_TUBE:
-                       if      (dvec[0] >  ball->expx) dvec[0] -= ball->expx;
-                       else if (dvec[0] < -ball->expx) dvec[0] += ball->expx;
-                       else                            dvec[0] = 0.0;
-                       break;
-               case MB_PLANE:
-                       if      (dvec[0] >  ball->expx) dvec[0] -= ball->expx;
-                       else if (dvec[0] < -ball->expx) dvec[0] += ball->expx;
-                       else                            dvec[0] = 0.0;
-                       if      (dvec[1] >  ball->expy) dvec[1] -= ball->expy;
-                       else if (dvec[1] < -ball->expy) dvec[1] += ball->expy;
-                       else                            dvec[1] = 0.0;
-                       break;
-               case MB_ELIPSOID:
-                       dvec[0] /= ball->expx;
-                       dvec[1] /= ball->expy;
-                       dvec[2] /= ball->expz;
-                       break;
-               case MB_CUBE:
-                       if      (dvec[0] >  ball->expx) dvec[0] -= ball->expx;
-                       else if (dvec[0] < -ball->expx) dvec[0] += ball->expx;
-                       else                            dvec[0] = 0.0;
-
-                       if      (dvec[1] >  ball->expy) dvec[1] -= ball->expy;
-                       else if (dvec[1] < -ball->expy) dvec[1] += ball->expy;
-                       else                            dvec[1] = 0.0;
-
-                       if      (dvec[2] >  ball->expz) dvec[2] -= ball->expz;
-                       else if (dvec[2] < -ball->expz) dvec[2] += ball->expz;
-                       else                            dvec[2] = 0.0;
-                       break;
-
-               /* *** deprecated, could be removed?, do-versioned at least *** 
*/
-               case MB_TUBEX:
-                       if      (dvec[0] >  ball->len) dvec[0] -= ball->len;
-                       else if (dvec[0] < -ball->len) dvec[0] += ball->len;
-                       else                           dvec[0] = 0.0;
-                       break;
-               case MB_TUBEY:
-                       if      (dvec[1] >  ball->len) dvec[1] -= ball->len;
-                       else if (dvec[1] < -ball->len) dvec[1] += ball->len;
-                       else                           dvec[1] = 0.0;
-                       break;
-               case MB_TUBEZ:
-                       if      (dvec[2] >  ball->len) dvec[2] -= ball->len;
-                       else if (dvec[2] < -ball->len) dvec[2] += ball->len;
-                       else                           dvec[2] = 0.0;
-                       break;
-               /* *** end deprecated *** */
-       }
-
-       dist2 = 1.0f - (len_squared_v3(dvec) / ball->rad2);
-
-       if ((ball->flag & MB_NEGATIVE) == 0) {
-               return (dist2 < 0.0f) ? -0.5f : (ball->s * dist2 * dist2 * 
dist2) - 0.5f;
-       }
-       else {
-               return (dist2 < 0.0f) ? 0.5f : 0.5f - (ball->s * dist2 * dist2 
* dist2);
-       }
-}
-
-static octal_node *find_metaball_octal_node(octal_node *node, float x, float 
y, float z, short depth)
-{
-       if (!depth) return node;
-       
-       if (z < node->z) {
-               if (y < node->y) {
-                       if (x < node->x) {
-                               if (node->nodes[0])
-                                       return 
find_metaball_octal_node(node->nodes[0], x, y, z, depth--);
-                               else
-                                       return node;
-                       }
-                       else {
-                               if (node->nodes[1])
-                                       return 
find_metaball_octal_node(node->nodes[1], x, y, z, depth--);
-                               else
-                                       return node;
-                       }
-               }
-               else {
-                       if (x < node->x) {
-                               if (node->nodes[3])
-                                       return 
find_metaball_octal_node(node->nodes[3], x, y

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to