00001 #ifndef BLOOMENTHAL_H
00002 #define BLOOMENTHAL_H
00003
00004 #include "Implicit/Implicit.h"
00005 #include "jbvertices.h"
00006
00007 #define RES 10
00008
00009 #define JB_L 0
00010 #define JB_R 1
00011 #define JB_B 2
00012 #define JB_T 3
00013 #define JB_N 4
00014 #define JB_F 5
00015 #define JB_LBN 0
00016 #define JB_LBF 1
00017 #define JB_LTN 2
00018 #define JB_LTF 3
00019 #define JB_RBN 4
00020 #define JB_RBF 5
00021 #define JB_RTN 6
00022 #define JB_RTF 7
00023
00024
00025
00026
00027 #define RAND() ((rand()&32767)/32767.)
00028 #define HASHBIT (5)
00029 #define HSIZE (size_t)(1<<(3*HASHBIT))
00030 #define MASK ((1<<HASHBIT)-1)
00031 #define HASH(i,j,k) \
00032 ((((((i)&MASK)<<HASHBIT)|((j)&MASK))<<HASHBIT)|((k)&MASK))
00033 #define BIT(i, bit) (((i)>>(bit))&1)
00034 #define FLIP(i,bit) ((i)^1<<(bit))
00035
00036 class jbTest {
00037 public:
00038 gmVector3 pt;
00039 double value;
00040 int ok;
00041 };
00042
00043 class jbCornerlist {
00044 public:
00045 int i, j, k;
00046 double value;
00047 jbCornerlist *next;
00048 };
00049
00050 class jbCube {
00051 public:
00052 int i, j, k;
00053 jbCornerlist *corners[8];
00054 };
00055
00056 class jbCubes {
00057 public:
00058 jbCube cube;
00059 jbCubes *next;
00060 };
00061
00062 class jbCenterlist {
00063 public:
00064 int i, j, k;
00065 jbCenterlist *next;
00066 };
00067
00068 class jbEdgelist {
00069 public:
00070 int i1, j1, k1, i2, j2, k2;
00071 int vid;
00072 jbEdgelist *next;
00073 };
00074
00075 class jbIntlist {
00076 public:
00077 int i;
00078 jbIntlist *next;
00079 };
00080
00081 class jbIntlists {
00082 public:
00083 jbIntlist *list;
00084 jbIntlists *next;
00085 };
00086
00087 class jbProcess {
00088 public:
00089
00090 Implicit *f;
00091 int (*triproc)(int i1, int i2,
00092 int i3, jbVertices vertices);
00093 double size, delta;
00094 int bounds;
00095 gmVector3 start;
00096 jbCubes *cubes;
00097 jbVertices vertices;
00098 jbCenterlist **centers;
00099 jbCornerlist **corners;
00100 jbEdgelist **edges;
00101
00102 char *polygonize (
00103
00104 Implicit *f,
00105 double size,
00106 int bounds,
00107 gmVector3 x,
00108 int (*triproc)(int i1, int i2, int i3, jbVertices vertices)
00109 );
00110 char *marchingcubes (
00111 Implicit *f,
00112 double size,
00113 gmVector3 x0, gmVector3 x1,
00114 int (*triproc)(int i1, int i2, int i3, jbVertices vertices)
00115 );
00116 void freeprocess();
00117 void testface (int i, int j, int k, jbCube *old, int face, int c1, int c2, int c3, int c4);
00118 gmVector3 setpoint (int i, int j, int k);
00119 jbCornerlist *setcorner (int i, int j, int k);
00120 jbTest find(int sign, gmVector3 x);
00121 int dotet (jbCube *cube, int c1, int c2, int c3, int c4);
00122 int setcenter(int i, int j, int k);
00123 void setedge (int i1, int j1, int k1, int i2, int j2, int k2, int vid);
00124 int getedge (int i1, int j1, int k1, int i2, int j2, int k2);
00125 int vertid (jbCornerlist *c1, jbCornerlist *c2);
00126 gmVector3 converge (gmVector3 p1, gmVector3 p2, double v);
00127
00128 };
00129
00130 char *mycalloc (int nitems, int nbytes);
00131
00132 #endif
00133