00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef _SO_VOLUME_DATA_
00024 #define _SO_VOLUME_DATA_
00025
00026 #ifdef _MSC_VER
00027 #pragma warning( push )
00028 #pragma warning(disable:4251)
00029 #endif
00030
00031 #include <Inventor/STL/map>
00032 #include <Inventor/STL/vector>
00033
00034 #include <Inventor/SbBox.h>
00035 #include <Inventor/SbPList.h>
00036 #include <Inventor/fields/SoSFBool.h>
00037 #include <Inventor/fields/SoSFEnum.h>
00038 #include <Inventor/fields/SoSFMemObj.h>
00039 #include <Inventor/fields/SoSFString.h>
00040 #include <Inventor/fields/SoSFUShort.h>
00041 #include <Inventor/fields/SoSFInt32.h>
00042 #include <Inventor/fields/SoSFArray3D.h>
00043
00044 #include <LDM/SoLDMDataAccess.h>
00045 #include <LDM/SoLDMMediator.h>
00046 #include <LDM/SoLDMTileID.h>
00047 #include <LDM/nodes/SoDataSet.h>
00048 #include <LDM/nodes/SoTransferFunction.h>
00049 #include <LDM/readers/SoVolumeReader.h>
00050
00051 #include <VolumeViz/nodes/SoVolumeRendering.h>
00052
00053 class SoGLRenderAction;
00054 class SoCallbackAction;
00055 class SoWriteAction;
00056 class SoVolumeReader;
00057 class SoCache;
00058 class SoState;
00059 class SoGLVolCacheList;
00060 class SoVolumeHistogram;
00061 class SoDataCompositor;
00062 class SoVolumeShader;
00063
00064
00065 class SoLDMTileManager;
00066 class SoLDMTileVisitor;
00067 class SoLDMNodeFrontManager;
00068 class SoLDMTextureManager;
00069 class SoLDMGeometry;
00070 class SoLDMResourceManager;
00071
00072
00073 class SoDataExtract;
00074 class LDMDefaultSliceAccessor;
00075 class SoVolumeData;
00076
00077 SO_PIMPL_PUBLIC_DECLARATION(SoVolumeData)
00078
00079
00713 class SoVolumeData : public SoDataSet, public SoVolumeRendering
00714 {
00715 SO_NODE_HEADER( SoVolumeData );
00716
00717 SO_PIMPL_PUBLIC_HEADER( SoVolumeData );
00718
00719 public:
00720 using SoDataSet::getTexData;
00721
00722
00723 typedef SoLDMDataAccess LDMDataAccess;
00724 typedef ::SoLDMResourceParameters SoLDMResourceParameters;
00725
00729 SoVolumeData();
00730
00756 SoSFBool usePalettedTexture;
00757
00758
00768 SoSFBool useSharedPalettedTexture;
00769
00778 SoSFBool useExtendedData;
00779
00799 SoSFArray3D data;
00800
00817 SoSFBool dataRGBA;
00818
00820 virtual SbBool getMinMax( int64_t &min, int64_t &max);
00821
00823 virtual SbBool getMinMax( double &min, double &max);
00824
00866 SbBool getHistogram( int &length, int64_t* &histogram);
00867
00876 void updateRegions(const SbBox3i32 *region, int num_regions);
00877
00885 void updateTilesInTextureMemory(SoLDMTileID* tiles, int numTiles);
00886
00893 virtual SbVec3f voxelToXYZ(const SbVec3f &dataPosition) const;
00894
00900 virtual SbBox3f voxelToXYZ(const SbBox3f& box) const;
00901
00907 virtual SbVec3f XYZToVoxel(const SbVec3f &dataPosition);
00908
00914 virtual SbBox3f XYZToVoxel(const SbBox3f &xyzBox);
00915
00921 void setRGBAData(const bool flag);
00922
00926 enum CoordinateType {
00930 COORDINATES_UNIFORM = SoVolumeReader::COORDINATES_UNIFORM,
00934 COORDINATES_RECTILINEAR = SoVolumeReader::COORDINATES_RECTILINEAR
00935 };
00936
00937 CoordinateType getCoordinateType() const;
00938
00944 enum Axis {
00945 X,
00946 Y,
00947 Z
00948 };
00949
00955 const std::vector<float>& getRectilinearCoordinates(Axis axis) const;
00956
00958 virtual SbBool startEditing(int &transactionId );
00959
00961 virtual int editTile( const SoLDMTileID& tileId, SoBufferObject* userData );
00962
00964 virtual int editSubVolume( const SbBox3i32& subVolume, SoBufferObject* userData );
00965
00967 virtual int editTile( const SoLDMTileID& tileId, const double& value );
00968
00970 virtual int editSubVolume( const SbBox3i32& subVolume, const double& value );
00971
00973 virtual int editSurfaceShape( const SoNode* surfaceShape, const float& thickness, const double& newValue );
00974
00976 virtual int editSolidShape( const SoNode* solidShape, const double& value );
00977
00979 virtual int editBoxes(
00980 const std::vector<SbVec3i32>& boxCenters,
00981 const int& boxSize,
00982 const double& newValue
00983 );
00984
00986 virtual SbBool finishEditing(int transactionId);
00987
00989 virtual SbBool undoEditing( int transactionId );
00990
00992 virtual SbBool redoEditing( int transactionId );
00993
00995 virtual SbBool saveEditing(bool recomputeLowerResolution = TRUE, const std::vector<char*> convertionParameters = std::vector<char*>(), SaveEditingCB* callback = NULL );
00996
00997 #if 1 SoDEPRECATED enum
01005 StorageHint {
01007 AUTO,
01009 TEX2D_MULTI,
01011 TEX2D = TEX2D_MULTI,
01013 TEX3D,
01015 MEMORY,
01016 #ifndef HIDDEN_FROM_DOC
01017
01018 VOLUMEPRO,
01020 TEX2D_SINGLE
01021 #endif // HIDDEN_FROM_DOC
01022 };
01023
01024 #endif
01027 #if 1 SoDEPRECATED enum
01033 SubMethod {
01035 NEAREST,
01037 MAX,
01039 AVERAGE
01040 };
01041 SoDEPRECATED enum
01046 OverMethod {
01048 NONE,
01050 CONSTANT,
01052 LINEAR,
01054 CUBIC
01055 };
01056 SoDEPRECATED
01069 SoVolumeData *reSampling( const SbVec3i32 &dimension, SoVolumeData::SubMethod subMethod, SoVolumeData::OverMethod = NONE);
01070 SoDEPRECATED
01076 SoVolumeData *subSetting( const SbBox3i32 ®ion );
01077 SoDEPRECATED
01082 void setTexMemorySize(int size);
01083 SoDEPRECATED
01088 int getTexMemorySize();
01089
01090 #endif
01092 private:
01093
01094 virtual void doAction( SoAction *action );
01095 virtual void GLRender( SoGLRenderAction *action );
01096 virtual void useFakeData(SoLDMTileID tileID, SoBufferObject* bufferObject);
01097
01098
01099
01100 virtual int32_t getRenderUnitID() const;
01101
01102 private:
01103
01105 SbVec3d getVoxelSize() const;
01106
01107 virtual void updateTile( const SbBox3i32 ®ion, const SoLDMTileID& tileId );
01108 virtual void drawTilesInMainMemory( SoGLRenderAction* action );
01109
01110 enum Cmd{
01111 CREATE_NODE,
01112 UPDATE_REGIONS,
01113 SET_LDM,
01114 SET_PAGING
01115 };
01116
01120 virtual void notify(SoNotList *list);
01121
01122 int64_t getValue (SbVec3i32 &pos, SbBool real = FALSE);
01123 double getValueD(const SbVec3i32 &pos, SbBool real = FALSE);
01124 int64_t loadDataValue(void* value, const SbVec3i32 &pos, void*& data, SoBufferObject *dataBufferObject, SbBool real);
01125
01126 static void initClass();
01127 static void exitClass();
01128
01129 virtual void updateColorTable(SoState *, SoTransferFunction *);
01130 void loadData(SoAction* action, SbBool& texLoadedOrReloaded);
01131
01132 SoTransferFunction::GLColorMapType installColorMap(SoState*, int alphaUse=0);
01133 SoTransferFunction::GLColorMapType getColorMapType(SoState*);
01134 SbVec3i32& getDimensionPowerOf2();
01135 SbVec3f& getTexRatio();
01136
01137
01138 void setLighting(SoState* state, SbBool);
01139 void setLightDirection(SoState* state,const SbVec3f&);
01140 void setLightIntensity(SoState* state,float);
01141
01142 virtual bool isPalettedTexture(SoState* state);
01143 int isSharedPalettedTexture();
01144
01145
01146 static void sceneGraphChangeCB(void* , SoSensor*);
01147
01149 void getVolumeTexGen(SbVec4d texGen[3]) const;
01150
01152 SbMatrix getVolumeTexGen() const;
01153
01155 SbVec3f getVolumeTextureRatio() const;
01156
01158 SbBox3f toTextureSpace(const SbBox3f& bbox) const;
01159
01160 void drawOctree(SoGLRenderAction* pGLRA);
01161
01162
01163 virtual int getTexPrec(SoState*state);
01164
01165 virtual void getDataOneObliqueSlice( const SbVec3i32& tileSize, SoBufferObject* tileData, int Zaxis, const SbPlane& plane, SoBufferObject* slicedata, int interp );
01166 virtual SoBufferObject* getDataOneSlice( const SbVec3i32& tileSize, SoBufferObject* tileData, int Zaxis, int slice);
01167
01168 SbBox3f getLDMOutliningBox();
01169
01174 virtual SoBufferObject *getTransformedTile(const SoLDMTileID& tile,
01175 const SoLDM::DataSetIdPair& p,
01176 SoState * state=NULL,
01177 const bool useExtendedData = false);
01178
01179
01182 SbBool saveEditing( SoVolumeWriter* writer, SaveEditingCB* callback = NULL );
01183
01187 const std::vector<float>& getInvertedRectilinearCoordinates(Axis axis) const;
01188
01192 virtual void drawXYZBox( SoGLRenderAction* action, BoxColor color, const SbBox3f& box );
01193
01197 virtual void drawIJKBox( SoGLRenderAction* action, BoxColor color, const SbBox3f& box, const SoLDMTileID& tile, bool subTile = false );
01198 virtual void drawIJKBox( SoGLRenderAction* action, BoxColor color, const SbBox3f& box, bool fullRes, bool subTile = false );
01199 virtual void drawIJKBox( SoGLRenderAction* action, BoxColor color, const SbBox3f& box, bool subTile = false );
01200
01201 void setupRectilinearCoordinates(const SbVec3i32&);
01202 bool isRectilinearCoordinatesUpdated(const SoVolumeShader* s);
01203 void resetRectilinearCoordinatesUpdated(const SoVolumeShader* s);
01204
01205 SbVec3f computeRectilinearCoordinate(const SbVec3f& vertex);
01206 SbBox3f computeRectilinearCoordinate(const SbBox3f& box);
01207
01208 SbVec3f computeInvertedRectilinearCoordinate(const SbVec3f& vertex);
01209 SbBox3f computeInvertedRectilinearCoordinate(const SbBox3f& box);
01210
01211 void setDefaultValue( const double defValue );
01212 double getDefaultValue() const;
01213
01217 SbBox3f getXYZCoordinates(const SbBox3i32& box, const SbBox3i32& cropped);
01218
01223 SbBox3f getSubtileXYZCoordinates(const SbBox3i32& fullTileBox,
01224 const SbBox3i32& subTileBox,
01225 const SbBox3i32& cropped);
01226
01227 virtual LDMSliceAccessor* getAppropriateSliceAccessor( const SoLDM::DataSetIdPair& p );
01228
01229 virtual SoLDMReader* getAppropriateLDMReader( const SbString& pathname);
01230
01231 private:
01232
01237 virtual void readerChanged();
01238
01242 virtual void setElement(SoState* state);
01243
01244 virtual SoVolumeReader *getAppropriateReader();
01245
01246
01247 virtual ~SoVolumeData();
01248 void releaseMemory();
01249
01250 virtual bool enableMultidata(SoState* state);
01251
01255 virtual void unload();
01256
01260 virtual void updateFilename();
01261
01265 virtual SbBool isRGBAData();
01266
01268 virtual void buildTile(SoLDMTileID tileID, SoBufferObject* buffer);
01269
01271 virtual void computeLighting( const SbVec3i32 & tileSize, SoBufferObject* rgbaBuffer );
01272
01273 SoINTERNAL private:
01274
01276 virtual SoLDMGeomElement* getAppropriateElement( SoLDMGeometry* v );
01277
01278 private:
01279
01281 void commonConstructor();
01282
01283 #if 1 SoDEPRECATED
01285 void updateColorTable( SoState *, SoVolumeData::StorageHint textype, SoTransferFunction * );
01286 #endif SoDEPRECATED
01289 SoSFEnum storageHint;
01290
01291
01293 SoSFInt32 volumeDataId;
01294 };
01295
01296 #ifdef _MSC_VER
01297 #pragma warning( pop )
01298 #endif
01299
01300 #endif // _SO_VOLUME_DATA_
01301
01302
01303