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 SoNodeDependencies;
00059 class SoState;
00060 class SoGLVolCacheList;
00061 class SoVolumeHistogram;
00062 class SoDataCompositor;
00063 class SoVolumeShader;
00064
00065
00066 class SoLDMTileManager;
00067 class SoLDMTileVisitor;
00068 class SoLDMNodeFrontManager;
00069 class SoLDMTextureManager;
00070 class SoLDMGeometry;
00071 class SoLDMResourceManager;
00072
00073
00074 class SoDataExtract;
00075 class LDMDefaultSliceAccessor;
00076 class SoVolumeData;
00077
00710 class SoVolumeData : public SoDataSet, public SoVolumeRendering
00711 {
00712 SO_NODE_HEADER( SoVolumeData );
00713
00714 public:
00715 using SoDataSet::getTexData;
00716
00717
00718 typedef SoLDMDataAccess LDMDataAccess;
00719 typedef SoLDMMediator::LDMManagerAccess LDMManagerAccess;
00720 typedef ::LDMResourceParameter LDMResourceParameter;
00721
00725 SoVolumeData();
00726
00752 SoSFBool usePalettedTexture;
00753
00754
00764 SoSFBool useSharedPalettedTexture;
00765
00774 SoSFBool useExtendedData;
00775
00795 SoSFArray3D data;
00796
00813 SoSFBool dataRGBA;
00814
00816 virtual SbBool getMinMax( int64_t &min, int64_t &max);
00817
00819 virtual SbBool getMinMax( double &min, double &max);
00820
00862
00863
00864
00865 SbBool getHistogram( int &length, int64_t* &histogram);
00866
00875 void updateRegions(const SbBox3i32 *region, int num_regions);
00876
00884 void updateTilesInTextureMemory(SoLDMTileID* tiles, int numTiles);
00885
00892 virtual SbVec3f voxelToXYZ(const SbVec3f &dataPosition) const;
00893
00899 virtual SbBox3f voxelToXYZ(const SbBox3f& box) const;
00900
00906 virtual SbVec3f XYZToVoxel(const SbVec3f &dataPosition);
00907
00913 virtual SbBox3f XYZToVoxel(const SbBox3f &xyzBox);
00914
00920 void setRGBAData(const bool flag);
00921
00922
00923 #if 1 SoDEPRECATED
00929 SoVolumeData* subSetting( const SbBox3s& region );
00930 SoDEPRECATED
00936 void updateRegions( const SbBox3s *region, int num_regions );
00937 SoDEPRECATED
00943 void loadRegions( const SbBox3s *region, int num_regions, SoState* state, SoTransferFunction* transFunc );
00944 SoDEPRECATED
00949 void setSubSamplingLevel(const SbVec3s& ROISampling, const SbVec3s& secondarySampling);
00950 SoDEPRECATED
00956 void getSubSamplingLevel(SbVec3s &ROISampling, SbVec3s &secondarySampling);
00957 SoDEPRECATED
00962 void setPageSize(SbVec3s& size);
00963 SoDEPRECATED
00968 void setVolumeData( const SbVec3s &dimension, void *data,
00969 SoDataSet::DataType type=UNSIGNED_BYTE,
00970 int numSignificantBits = 0 );
00971
00972 #endif
00975 #if 1
00977 #ifndef HIDDEN_FROM_DOC
00978
00982 SoSFInt32 volumeDataId;
00983 #else
00984 SoDEPRECATED
00985 SoSFInt32 volumeDataId;
00986 #endif
00987 SoDEPRECATED
00989 void setVolumeSize( const SbBox3f &size );
00990 SoDEPRECATED
00992 const SbBox3f& getVolumeSize();
00993 SoDEPRECATED
01002 void setVolumeData( const SbVec3i32 &dimension, SoMemoryObject* data, SoDataSet::DataType type=UNSIGNED_BYTE, int numSignificantBits = 0 );
01003 SoDEPRECATED
01008 void setVolumeData( const SbVec3i32 &dimension, void *data, SoDataSet::DataType type=UNSIGNED_BYTE, int numSignificantBits = 0 );
01009 SoDEPRECATED
01011 SbBool getVolumeData( SbVec3i32 &dimension, void *&data, SoDataSet::DataType &type, int *numSignificantBits = NULL );
01012 SoDEPRECATED
01028 SbBool getMinMax( int &min, int &max);
01029
01030 SoDEPRECATED
01032 SbBool getVolumeData( SbVec3s &dimension, void *&data,
01033 SoDataSet::DataType &type, int *numSignificantBits = NULL );
01034 SoDEPRECATED
01048 SbBool getHistogram ( int &length, int* &histogram);
01049 SoDEPRECATED
01051 static int getMaxNumVolumes() ;
01052
01053 #endif
01055 #if 1 SoDEPRECATED
01065 void setPaging(SbBool);
01066 SoDEPRECATED
01068 SbVec3i32 getDimension() { return SoDataSet::getDimension(); }
01069
01070 #endif
01073 #if 1 SoDEPRECATED
01081 SoSFEnum storageHint;
01082 SoDEPRECATED enum
01085 StorageHint {
01087 AUTO,
01089 TEX2D_MULTI,
01091 TEX2D = TEX2D_MULTI,
01093 TEX3D,
01095 MEMORY,
01096 #ifndef HIDDEN_FROM_DOC
01097
01098 VOLUMEPRO,
01100 TEX2D_SINGLE
01101 #endif // HIDDEN_FROM_DOC
01102 };
01103
01104 #endif
01107 #if 1 SoDEPRECATED
01113 SbVec3i32 getPageSize();
01114 SoDEPRECATED enum
01119 SubMethod {
01121 NEAREST,
01123 MAX,
01125 AVERAGE
01126 };
01127 SoDEPRECATED enum
01132 OverMethod {
01134 NONE,
01136 CONSTANT,
01138 LINEAR,
01140 CUBIC
01141 };
01142 SoDEPRECATED
01151 void enableSubSampling(SbBool enable);
01152 SoDEPRECATED
01157 SbBool isSubSamplingEnabled(){ return FALSE; }
01158 SoDEPRECATED
01164 void enableAutoSubSampling(SbBool enable);
01165 SoDEPRECATED
01170 SbBool isAutoSubSamplingEnabled(){ return FALSE; }
01171 SoDEPRECATED
01177 void enableAutoUnSampling(SbBool enable);
01178 SoDEPRECATED
01183 SbBool isAutoUnSamplingEnabled(){ return FALSE; }
01184 SoDEPRECATED
01190 void unSample();
01191 SoDEPRECATED
01199 void setSubSamplingMethod(SubMethod method);
01200 SoDEPRECATED
01212 void setSubSamplingLevel(const SbVec3i32& ROISampling, const SbVec3i32& secondarySampling);
01213 SoDEPRECATED
01219 void getSubSamplingLevel(SbVec3i32 &ROISampling, SbVec3i32 &secondarySampling);
01220 SoDEPRECATED
01233 SoVolumeData *reSampling( const SbVec3i32 &dimension, SoVolumeData::SubMethod subMethod, SoVolumeData::OverMethod = NONE);
01234 SoDEPRECATED
01240 SoVolumeData *subSetting( const SbBox3i32 ®ion );
01241 SoDEPRECATED
01246 void setTexMemorySize(int size);
01247 SoDEPRECATED
01252 int getTexMemorySize();
01253 SoDEPRECATED
01258 void setPageSize(int size);
01259 SoDEPRECATED
01264 void setPageSize(SbVec3i32& size);
01265 SoDEPRECATED
01297 void loadRegions(const SbBox3i32 * region, int num_regions,SoState* state,SoTransferFunction* transFunc);
01298 SoDEPRECATED
01303 SbBool isPaging();
01304
01305 #endif
01307 private:
01308
01310 SbVec3d getVoxelSize() const;
01311
01312 virtual void updateTile( const SbBox3i32 ®ion, const SoLDMTileID& tileId );
01313 virtual void drawTilesInMainMemory(SoState *state);
01314
01315 enum Cmd{
01316 CREATE_NODE,
01317 UPDATE_REGIONS,
01318 SET_LDM,
01319 SET_PAGING
01320 };
01321
01325 virtual void notify(SoNotList *list);
01326
01327 int64_t getValue (SbVec3i32 &pos, SbBool real = FALSE);
01328 double getValueD(const SbVec3i32 &pos, SbBool real = FALSE);
01329 int64_t loadDataValue(void* value, const SbVec3i32 &pos, void*& data, SoBufferObject *dataBufferObject, SbBool real);
01330
01331 static void initClass();
01332 static void exitClass();
01333
01334 virtual void updateColorTable(SoState *, SoTransferFunction *);
01335 void loadData(SoAction* action, SbBool& texLoadedOrReloaded);
01336
01337 SoTransferFunction::GLColorMapType installColorMap(SoState*, int alphaUse=0);
01338 SoTransferFunction::GLColorMapType getColorMapType(SoState*);
01339 SbVec3i32& getDimensionPowerOf2();
01340 SbVec3f& getTexRatio();
01341
01342
01343 void setLighting(SoState* state, SbBool);
01344 void setLightDirection(SoState* state,const SbVec3f&);
01345 void setLightIntensity(SoState* state,float);
01346
01347 virtual bool isPalettedTexture(SoState* state);
01348 int isSharedPalettedTexture();
01349
01350
01351 static void sceneGraphChangeCB(void* , SoSensor*);
01352
01353
01354 #if 1 SoDEPRECATED
01357 void updateColorTable(SoState *, SoVolumeData::StorageHint textype,SoTransferFunction *);
01358
01359 #endif
01361 private:
01362
01363 virtual void doAction( SoAction *action );
01364 virtual void GLRender( SoGLRenderAction *action );
01365 virtual SoLDMTileManager::LDMSliceAccessor* getAppropriateSliceAccessor(const SoLDM::DataSetIdPair& p);
01366 virtual SoLDMReader* getAppropriateLDMReader( const SbString& pathname);
01367 virtual void useFakeData(SoLDMTileID tileID, SoBufferObject* bufferObject);
01368
01369
01370
01371 virtual int32_t getRenderUnitID() const;
01372
01373 private:
01374 virtual SoLDMGeomElement* getAppropriateElement(SoLDMGeometry* v);
01375
01377 void getVolumeTexGen(SbVec4d texGen[3]) const;
01378
01380 SbMatrix getVolumeTexGen() const;
01381
01383 SbVec3f getVolumeTextureRatio() const;
01384
01386 SbBox3f toTextureSpace(const SbBox3f& bbox) const;
01387
01388 private:
01389
01394 virtual void readerChanged();
01395
01399 virtual void setElement(SoState* state);
01400
01401 virtual SoVolumeReader *getAppropriateReader();
01402
01403
01404 virtual ~SoVolumeData();
01405 void releaseMemory();
01406
01407 virtual bool enableMultidata(SoState* state);
01408
01409
01410 virtual void readChar();
01411
01415 virtual void unload();
01416
01420 virtual void updateFilename();
01421
01425 virtual SbBool isRGBAData();
01426
01428 virtual void buildTile(SoLDMTileID tileID, SoBufferObject* buffer);
01429
01430 private:
01435 void resetData();
01436
01438 void forceStorageHint();
01439
01443 void updateData3D();
01444
01445
01446
01447 static SoDataExtract* s_dataExtractAlgorithms;
01448
01449 void releaseTextures(SoState* state);
01450 void setDimension(const SbVec3i32 &);
01451 void setDimensionPowerOf2();
01452
01453 SbBool initData(SoState*);
01454 SbBool initReader();
01455 private:
01456
01457 void drawOctree(SoGLRenderAction* pGLRA);
01458
01459
01460 virtual int getTexPrec(SoState*state);
01461
01462 private:
01463
01464
01465 SbBool m_tilesInRAMalreadyDrawn;
01466
01467
01468 SoDataCompositor* m_dataCompositor;
01469
01470 void extendData(int, void*);
01471 void extendData1(int, int, void*);
01472
01473 void computeStatData(SbBool flag = FALSE);
01474 int fswGetDataChar(SbBox3f &, DataType &, SbVec3i32 &);
01475 void fswAbort();
01476 void fswSkipSlice(int);
01477 void* fswGetNextSlice(int);
01478 void fswEnd();
01479
01480 void *m_fswSliceData;
01481 SoCache *m_texElementDependency;
01482 SoNodeDependencies* m_dataRangeElementDependency;
01483 SbVec3i32 m_dimensionPowerOf2;
01484 SbVec3f m_texRatio;
01485 SbBool m_lighting;
01486 int m_lightDir[3];
01487 int m_lightInt;
01488 int m_ambCol[3];
01489 int m_specCol[3];
01490 int m_shininess;
01491
01492 SoGLVolCacheList* m_VRTexList;
01493
01495
01496
01497
01498
01499
01501 friend class SoLDMMediator::LDMManagerAccess;
01502
01503 std::map<const SoVolumeShader *, bool> m_rectilinearCoordinatesUpdated;
01505 #if 1 SoDEPRECATED
01508 int64_t subSample(SoDataSet::DataType,int,SbVec3i32&,void*,int,int,int,int,SoVolumeData::SubMethod);
01509 SoDEPRECATED
01511 double subSampleD(SoDataSet::DataType,int,SbVec3i32&,void*,int,int,int,int,SoVolumeData::SubMethod);
01512
01513 #endif
01515 private:
01516 virtual void getDataOneObliqueSlice( const SbVec3i32& tileSize, SoBufferObject* tileData, int Zaxis, const SbPlane& plane, SoBufferObject* slicedata, int interp );
01517 virtual SoBufferObject* getDataOneSlice( const SbVec3i32& tileSize, SoBufferObject* tileData, int Zaxis, int slice);
01518
01519 virtual void computeLighting( const SbVec3i32 & tileSize, SoBufferObject* rgbaBuffer );
01520 SbBox3f getLDMOutliningBox();
01521
01526 virtual SoBufferObject* getTransformedTile(const SoLDMTileID& tile,
01527 const SoLDM::DataSetIdPair& p,
01528 SoState * state=NULL,
01529 const bool useExtendedData = false);
01530
01531 public:
01535 enum CoordinateType {
01539 COORDINATES_UNIFORM = SoVolumeReader::COORDINATES_UNIFORM,
01543 COORDINATES_RECTILINEAR = SoVolumeReader::COORDINATES_RECTILINEAR
01544 };
01545
01546 CoordinateType getCoordinateType() const
01547 {
01548 return m_coordinateType;
01549 }
01550
01556 enum Axis {
01557 X,
01558 Y,
01559 Z
01560 };
01561
01567 const std::vector<float>& getRectilinearCoordinates(Axis axis) const;
01568
01570 virtual SbBool startEditing(int &transactionId );
01571
01573 virtual int editTile( const SoLDMTileID& tileId, SoBufferObject* userData );
01574
01576 virtual int editSubVolume( const SbBox3i32& subVolume, SoBufferObject* userData );
01577
01579 virtual int editTile( const SoLDMTileID& tileId, const double& value );
01580
01582 virtual int editSubVolume( const SbBox3i32& subVolume, const double& value );
01583
01585 virtual int editSurfaceShape( const SoNode* surfaceShape, const float& thickness, const double& newValue );
01586
01588 virtual int editSolidShape( const SoNode* solidShape, const double& value );
01589
01591 virtual int editBoxes(
01592 const std::vector<SbVec3i32>& boxCenters,
01593 const int& boxSize,
01594 const double& newValue
01595 );
01596
01598 virtual SbBool finishEditing(int transactionId);
01599
01601 virtual SbBool undoEditing( int transactionId );
01602
01604 virtual SbBool redoEditing( int transactionId );
01605
01607 virtual SbBool saveEditing(bool recomputeLowerResolution = TRUE, const std::vector<char*> convertionParameters = std::vector<char*>(), SaveEditingCB* callback = NULL );
01608
01609 private:
01610
01613 SbBool saveEditing( SoVolumeWriter* writer, SaveEditingCB* callback = NULL );
01614
01618 const std::vector<float>& getInvertedRectilinearCoordinates(Axis axis) const;
01619
01623 virtual void drawXYZBox(SoState* state, BoxColor color, const SbBox3f& box);
01624
01628 virtual void drawIJKBox(SoState* state, BoxColor color, const SbBox3f& box, const SoLDMTileID& tile,
01629 bool subTile = false);
01630 virtual void drawIJKBox(SoState* state, BoxColor color, const SbBox3f& box, bool fullRes, bool subTile = false);
01631 virtual void drawIJKBox(SoState* state, BoxColor color, const SbBox3f& box, bool subTile = false);
01632
01633 void setupRectilinearCoordinates(const SbVec3i32&);
01634 bool isRectilinearCoordinatesUpdated(const SoVolumeShader* s);
01635 void resetRectilinearCoordinatesUpdated(const SoVolumeShader* s);
01636
01637 SbVec3f computeRectilinearCoordinate(const SbVec3f& vertex);
01638 SbBox3f computeRectilinearCoordinate(const SbBox3f& box);
01639
01640 SbVec3f computeInvertedRectilinearCoordinate(const SbVec3f& vertex);
01641 SbBox3f computeInvertedRectilinearCoordinate(const SbBox3f& box);
01642
01643 void setDefaultValue( const double defValue );
01644 double getDefaultValue() const;
01645
01649 SbBox3f getXYZCoordinates(const SbBox3i32& box, const SbBox3i32& cropped);
01650
01655 SbBox3f getSubtileXYZCoordinates(const SbBox3i32& fullTileBox,
01656 const SbBox3i32& subTileBox,
01657 const SbBox3i32& cropped);
01658
01659 private:
01660
01667 virtual SbBool doSaveEditing( SoVolumeWriter* writer, std::vector<SbBox3i32>& savedRegion, SaveEditingCB callback = NULL );
01668
01669 private:
01671 void bindVolumeDataToDrawStyle(SoAction* action);
01672
01673 template <typename T> void copySliceData(const SbVec3i32& pageSize,
01674 SoBufferObject *pageData, int Zaxis,
01675 const SbPlane& plane, SoBufferObject *slicedata, int interpVal);
01676
01677 std::vector<float> m_invertedRectilinearCoordinates[3];
01678 std::vector<float> m_rectilinearCoordinates[3];
01679 CoordinateType m_coordinateType;
01680
01684 void setVolumeDataCompatibily(const SbVec3i32 &dimension,
01685 void* dataPtr,
01686 SoDataSet::DataType type = UNSIGNED_BYTE,
01687 int numSignificantBits = 0);
01688
01690 static void drawPoint(SoLDMTileID &tileID,int level,float levelmax);
01691
01692 int m_numRenderCaches;
01693 SbThreadMutex* m_threadMutex;
01694
01695
01696 double m_defaultValue;
01697
01700 SbBool m_editingStackDirty;
01701 };
01702
01703 #ifdef _MSC_VER
01704 #pragma warning( pop )
01705 #endif
01706
01707 #endif // _SO_VOLUME_DATA_
01708
01709
01710