00001
00002
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00015
00016 #ifndef _VOLUME_MARCHING_CUBES_
00017 #define _VOLUME_MARCHING_CUBES_
00018
00019 #include <Medical/InventorMedical.h>
00020
00021 #include <Inventor/nodes/SoTriangleSet.h>
00022 #include <VolumeViz/nodes/SoVolumeData.h>
00023 #include <LDM/SoLDMTileID.h>
00024 #include <LDM/SoLDMDataAccess.h>
00025
00026 #include <vector>
00027
00028 class SoLDMTopoOctree;
00029
00030
00109 class INVENTORMEDICAL_API VolumeMarchingCubes
00110 {
00111 public:
00113 VolumeMarchingCubes();
00114
00116 ~VolumeMarchingCubes();
00117
00125 SoTriangleSet* getIsosurface( const SoVolumeData& volume, float isovalue );
00126
00130 size_t getNumTriangles() const;
00131
00135 float getIsovalue() const;
00136
00137 private:
00143 void marchVolume();
00144
00150 void marchTile( SbVec3i32 tileDim, SbVec3f tileMin, SbVec3f tileMax, void* tileData );
00151
00168 int marchCube( SbVec3f& corner, SbVec3f& size, float values[8], float isoval, SbVec3f vertices[15] );
00169
00176 float getVoxelValue( int i, int j, int k);
00177
00178
00179 SbVec3i32 m_voldim;
00180 SbBox3f m_volext;
00181 SbVec3i32 m_tiledim;
00182 SbVec3f m_tileSize;
00183 SbVec3f m_voxelSize;
00184 unsigned int m_voxelBytes;
00185 SoDataSet::DataType m_voxelType;
00186
00187
00188 SoVolumeData* m_volData;
00189 SoLDMDataAccess::DataInfo* m_dataInfo;
00190 SbVec3i32 m_tileMin;
00191 SbVec3i32 m_tileMax;
00192
00193
00194 std::vector<SbVec3f> m_vertices;
00195
00196
00197 float m_isoValue;
00198 int m_resolution;
00199 size_t m_numTriangles;
00200 };
00201
00202 #endif
00203