Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

MarchingCubesData.h

Go to the documentation of this file.
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 // {{{ Page: Marching Cubes Data
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                 }; // }}} MCVertex
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                 }; // }}} MCTriangle
00363 
00364         // {{{ Private Member Variables:
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                 //MCData                                *_normalsArray;
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         // }}} Private Member Variables
00423 
00424         // {{{ Private Member Functions:
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                                 // 1111 binary
00432 #define MCD_DIR_MASK            (0x1FF)
00433                                 // 111111111 binary
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         // }}} Private Member Functions
00468 
00469         // {{{ Public Member Functions:
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         // }}} Public Member Functions:
00604 
00605 
00606 }; // }}} MCMesh
00607 
00608 
00609 #endif /* }}} __MARCHINGCUBESDATA_H__ */
00610 
00611 
00612 // vim:fdm=marker:fdc=4:tw=100

Generated on Wed Dec 15 21:20:29 2004 for vuVolume by  doxygen 1.3.9.1