00001
00018 #ifndef __MARCHINGCUBESDATA_H__ // {{{
00019 #define __MARCHINGCUBESDATA_H__
00020
00021
00022 #include <GL/gl.h>
00023 #include <list>
00024 #include <map>
00025 #include <vector>
00026
00027 #include "vuVector.h"
00028 #include "MarchingCubesGeneral.h"
00029 #include "MCGlobalData.h"
00030 #include "MCBProgressCallback.h"
00031
00032
00033
00162
00163
00164
00179 class MCMesh
00180 {
00181
00182 public:
00183
00188 typedef unsigned int index_t;
00193 #define MCD_ERROR (0xffffffff)
00194
00195 private:
00196
00198 #define MCM_DATA_EXTEND_DEFAULT 1000
00199
00201 #define MCM_SET_BIT(var, bit) var |= (1<<(bit))
00202
00204 #define MCM_BIT_SET(var, bit) ( ((var)&(1<<(bit))) == 1 )
00205
00207 #define MCM_UNSET_BIT(var, bit) var &= ( 0xffffffff ^ (1<<bit) );
00208
00213 struct MCData {
00214 float normal[3];
00215 float vertex[3];
00216
00217 inline void copyNormalFrom(const float *n);
00218 inline void copyVertexFrom(const float *n);
00219 };
00223 struct MCNormal {
00224 float normal[3];
00225 };
00226
00230 class MCVertex
00231 {
00232
00233 private:
00234
00240 index_t _idx;
00242 bool _indexed;
00247 vuVector _vertex;
00253 std::list<MCVertex *> _neighbours;
00254
00256 MCVertex() {}
00257
00258 public:
00259
00261 MCVertex(int idx);
00266 virtual ~MCVertex();
00267
00269 void AddNeigbour(MCVertex *v);
00271 void Vertex(vuVector &v);
00273 vuVector& Vertex();
00274
00276 void Idx(index_t idx);
00278 index_t Idx();
00280 bool Indexed();
00282 void resetIndexing();
00283
00284 };
00285
00289 class MCTriangle
00290 {
00291
00292 private:
00293
00297 int _type;
00298 #define MCT_COMPETE_FLAG 1
00299
00305 MCVertex *_vertices[3];
00310 unsigned short _vertCnt;
00316 std::list<MCTriangle *> _neighbours;
00317
00318 public:
00319
00321 MCTriangle(int type);
00323 virtual ~MCTriangle();
00324
00341 int AddVertex(MCVertex *v);
00345 MCVertex* GetVertex(int n);
00349 vuVector GetNormal();
00353 bool Complete();
00354
00355 MCMesh::index_t GetVertexIdx(int v);
00356
00360 int Type();
00361
00362 };
00363
00364
00365 private:
00366
00373 static const int _edgeMapping[12][3][4];
00377 MCData *_data;
00379 index_t _dataSize;
00383 index_t *_indices[256];
00385 index_t _indexSize[256];
00386
00387 float *_normalsArray;
00388 index_t _normalsArraySize;
00403 std::map<index_t, MCVertex *> _vertices;
00408 std::list<MCVertex *> _vertexList;
00410 std::vector<MCTriangle *> _triangles;
00412 bool _normalsPrepared;
00414 index_t _vertexSize;
00416 index_t _triangleSize;
00418 MCGlobalData *_gd;
00420 MCBProgressCallback *_progCB;
00421
00422
00423
00424
00425 private:
00426
00427 #define MCD_X_SHIFT (4)
00428 #define MCD_Y_SHIFT (9+4)
00429 #define MCD_Z_SHIFT (9+9+4)
00430 #define MCD_EDGE_MASK (0xF)
00431
00432 #define MCD_DIR_MASK (0x1FF)
00433
00434 #define MCD_X_MASK (MCD_DIR_MASK<<MCD_X_SHIFT)
00435 #define MCD_Y_MASK (MCD_DIR_MASK<<MCD_Y_SHIFT)
00436 #define MCD_Z_MASK (MCD_DIR_MASK<<MCD_Z_SHIFT)
00437 #define MCD_GET_EDGE(idx) ((idx)&MCD_EDGE_MASK)
00438 #define MCD_GET_X(idx) (((idx)&MCD_X_MASK)>>MCD_X_SHIFT)
00439 #define MCD_GET_Y(idx) (((idx)&MCD_Y_MASK)>>MCD_Y_SHIFT)
00440 #define MCD_GET_Z(idx) (((idx)&MCD_Z_MASK)>>MCD_Z_SHIFT)
00441
00453 inline index_t _getIndex(int x, int y, int z, int edge);
00460 void _compileData();
00465 void _compileNormalsArray();
00466
00467
00468
00469
00470 public:
00471
00477 MCMesh(MCGlobalData *gd, MCBProgressCallback *cb = 0);
00479 virtual ~MCMesh();
00480
00508 index_t AddVertex(int x, int y, int z, int edge, int triangle, vuVector& v);
00509
00522 index_t AddVertex(int idx, int triangle);
00523
00536 index_t GetVertex(int x, int y, int z, int edge);
00537
00543 int AddTriangle(int type);
00544
00549 void DebugPrint(void);
00550
00561 void prepare(void);
00562
00568 void render();
00569
00576 void drawNormals(bool mode);
00577
00582 bool drawNormals();
00583
00588 void drawNormalsSize(float size);
00589
00594 float drawNormalsSize();
00595
00597 index_t numTriangles();
00599 index_t numVertices();
00601 index_t numIndices();
00602
00603
00604
00605
00606 };
00607
00608
00609 #endif
00610
00611
00612