00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifndef _SO_DATA_SET_
00028 #define _SO_DATA_SET_
00029
00030 #ifdef _MSC_VER
00031 #pragma warning( push )
00032 #pragma warning(disable:4251)
00033 #endif
00034
00035
00036 #include <Inventor/SbBox.h>
00037 #include <Inventor/SbLinear.h>
00038 #include <Inventor/fields/SoSFBool.h>
00039 #include <Inventor/fields/SoSFBox3f.h>
00040 #include <Inventor/fields/SoSFEnum.h>
00041 #include <Inventor/fields/SoSFFieldContainer.h>
00042 #include <Inventor/fields/SoSFFilePathString.h>
00043 #include <Inventor/fields/SoSFFloat.h>
00044 #include <Inventor/SbDataType.h>
00045 #include <Inventor/fields/SoSFInt32.h>
00046 #include <Inventor/fields/SoSFNode.h>
00047 #include <Inventor/fields/SoSFString.h>
00048 #include <Inventor/fields/SoSFUShort.h>
00049 #include <Inventor/misc/SoMemoryObject.h>
00050 #include <Inventor/misc/SoRef.h>
00051 #include <Inventor/nodes/SoNode.h>
00052 #include <LDM/SoLDM.h>
00053 #include <LDM/SoLDMMediator.h>
00054 #include <LDM/SoLDMTileID.h>
00055 #include <LDM/SoLDMTileManager.h>
00056 #include <LDM/fields/SoSFLDMResourceParameters.h>
00057 #include <LDM/fields/SoSFLDMDataTransform.h>
00058 #include <LDM/nodes/SoLDMResourceParameters.h>
00059 #include <LDM/nodes/SoTransferFunction.h>
00060 #include <Inventor/sys/SoGLType.h>
00061
00062
00063 #include <Inventor/devices/SoCpuBufferObject.h>
00064
00065
00066 class SoGLRenderAction;
00067 class SoCallbackAction;
00068 class SoWriteAction;
00069 class SoState;
00070 class SoLDMGeomElement;
00071 class SoLDMGeometry;
00072 class SoLDMReader;
00073 class SoTransferFunction;
00074 class SoMultiDataSeparator;
00075 class SoVolumeHistogram;
00076 class SoVolumeReader;
00077 class SoPerfCounterManager;
00078 class SoPerfCounter;
00079 class SoBufferObject;
00080 class SoCpuBufferUniform;
00081 class SoGLTexture;
00082 class SoCache;
00083
00084 class SoDataExtract;
00085 class SoConversion;
00086 class SoAlgorithms;
00087 class SoLDMAlgorithms;
00088 class SoLdmValuationAction;
00089 class SoDataRange;
00090
00091 class SoVolumeWriter;
00092
00132 class SoDataSet : public SoNode
00133 {
00134 SO_NODE_ABSTRACT_HEADER( SoDataSet );
00135
00136 public:
00137
00153 SoSFInt32 dataSetId;
00154
00179 SoSFFilePathString fileName;
00180
00188 SoSFBool useCompressedTexture;
00189
00202 SoSFUShort texturePrecision;
00203
00213 SoSFBox3f extent;
00214
00235 SoSFLDMDataTransform dataTransform;
00236
00244 SoSFBool allocateResourceOnRender;
00245
00249 const SbVec3i32& getDimension();
00250
00254 SbVec3i32 getTileDimension();
00255
00259 unsigned int getDatumSize();
00260
00268 virtual size_t readTile( SoBufferObject*& bufferObject, SoLDMTileID tileID, bool transform );
00269
00275 virtual void readTile(SoLDMTileID tileID, SoBufferObject* buffer, bool transform);
00276
00285 virtual void writeTile( SoLDMTileID tileID, SoBufferObject* buffer, SoVolumeWriter* writer );
00286
00291 SoSFLDMResourceParameters ldmResourceParameters;
00292
00297 SoLDMDataAccess & getLdmDataAccess();
00298
00306 virtual SbBool startEditing( int& transactionId );
00307
00316 virtual SbBool finishEditing( int transactionId );
00317
00326 virtual int editTile( const SoLDMTileID& tileId, SoBufferObject* userData );
00327
00337 virtual int editSubVolume( const SbBox3i32& subVolume, SoBufferObject* userData );
00338
00343 virtual int editTile( const SoLDMTileID& tileId, const double& value );
00344
00350 virtual int editSubVolume( const SbBox3i32& subVolume, const double& value );
00351
00364 virtual int editSurfaceShape( const SoNode* surfaceShape, const float& thickness, const double& value );
00365
00385 virtual int editSolidShape( const SoNode* solidShape, const double& value );
00386
00394 virtual int editBoxes(
00395 const std::vector<SbVec3i32>& boxCenters,
00396 const int& boxSize,
00397 const double& newValue
00398 );
00399
00411 virtual SbBool undoEditing( int transactionId );
00412
00424 virtual SbBool redoEditing( int transactionId );
00425
00426
00442 typedef SbBool SaveEditingCB( SoDataSet* dataSet,
00443 SoVolumeWriter* writer,
00444 int tilesRemaining,
00445 int totalTiles );
00485 virtual SbBool saveEditing( bool recomputeLowerResolution = TRUE,
00486 const std::vector<char*> conversionParameters = std::vector<char*>(), SaveEditingCB* callback = NULL );
00487
00491 virtual bool hasEditedTile();
00492
00496 SoLDMTileManager *getTileManager() { return getLdmManagerAccess().getTileManager(); }
00497
00501 SoLDMTextureManager *getTextureManager() { return getLdmManagerAccess().getTextureManager(); }
00502
00503 #if 1 SoDEPRECATED
00509 SoLDMTileVisitor* getTileVisitor();
00510 SoDEPRECATED
00515 void setTileVisitor( SoLDMTileVisitor* tileVisitor );
00516 SoDEPRECATED
00521 SoLDMGeometry *getVVizGeometry();
00522
00523 #endif
00524
00528 SoLDMNodeFrontManager *getNodeFrontManager() { return getLdmManagerAccess().getNodeFrontManager(); }
00529
00536 SoLDMReader* getLDMReader();
00537
00544 void setLDMReader(SoLDMReader* reader);
00545
00553 inline SoVolumeReader* getReader()
00554 {return (SoVolumeReader*)m_reader.ptr();};
00555
00556
00564 inline SoVolumeReader* getReader() const
00565 { return (SoVolumeReader*)m_reader.ptr(); };
00566
00570 enum DataType {
00572 UNSIGNED_BYTE = SbDataType::UNSIGNED_BYTE,
00574 UNSIGNED_SHORT = SbDataType::UNSIGNED_SHORT,
00576 UNSIGNED_INT32 = SbDataType::UNSIGNED_INT32,
00578 SIGNED_BYTE = SbDataType::SIGNED_BYTE,
00580 SIGNED_SHORT = SbDataType::SIGNED_SHORT,
00582 SIGNED_INT32 = SbDataType::SIGNED_INT32,
00584 FLOAT = SbDataType::FLOAT
00585 };
00586
00587
00591 static int dataSize( DataType dataType );
00592
00596 static SbBool isDataSigned( DataType dataType );
00597
00601 static SbBool isDataFloat( DataType dataType );
00602
00606 int numSigBits() const;
00607
00620 virtual SbBool getMinMax( int64_t &min, int64_t &max);
00621
00635 virtual SbBool getMinMax( double &min, double &max);
00636
00640 DataType getDataType();
00641
00645 int getDataSize();
00646
00666 void setReader( SoVolumeReader &reader, SbBool takeOwnership = FALSE );
00667
00672 static int getMaxNumDataSets() ;
00673
00674 #if 1 SoDEPRECATED
00681 SoLDMResourceParameters& getLdmResourceParameter();
00682
00683 #endif
00685 #if 1 SoDEPRECATED
00688 virtual void readTile(SoLDMTileID tileID, unsigned char* buffer, bool transform);
00689
00717 typedef void SoLDMDataTransformFunction(SoDataSet* ds,
00718 const SbVec3i32& bufferDimension,
00719 void* bufferToTransform,
00720 const SbBox3i32& dataBox,
00721 int resolutionLevel,
00722 void* userData);
00723 SoDEPRECATED
00733 void setLDMDataTransformFunction(SoLDMDataTransformFunction* func, void* userData = NULL);
00734
00735 #endif
00737 #if 1 SoDEPRECATED
00746 inline SbBool isTimeDependent()
00747 { return FALSE; }
00748 SoDEPRECATED
00756 inline int getNumTimeSteps()
00757 { return 1; }
00758 SoDEPRECATED
00764 int getOverlapping();
00765 SoDEPRECATED
00770 void setLDM(SbBool state);
00771
00772 #endif
00774 SoEXTENDER_Documented public:
00775
00778 SoLDMMediator::LDMManagerAccess &getLdmManagerAccess() { return m_mediator->ldmManagerAccess; }
00779
00793 void resetReader();
00794
00795 private:
00796
00797 virtual void callback( SoCallbackAction *action );
00798 virtual void GLRender( SoGLRenderAction *action );
00799 virtual void getBoundingBox(SoGetBoundingBoxAction *action);
00800 virtual void pick(SoPickAction *action) ;
00801 virtual void write(SoWriteAction *action);
00802
00806 inline virtual void useFakeData(SoLDMTileID , SoBufferObject* ) {};
00807
00808 private:
00809
00810
00811
00812
00813 typedef std::map<SoLDMTileID, uint64_t> tileSigInCacheMap;
00814
00815 static void initClass();
00816 static void exitClass();
00817
00819 static bool isReallyOfType(SoDataSet* ds, const SoType& type, bool derived);
00820
00826 bool isGPUDataRange( SoState* state );
00827
00833 SoBufferObject* getEditedTile( SoBufferObject* tileBuffer, const SoLDMTileID& tileId );
00834
00839 virtual SoBufferObject *getTransformedTile(const SoLDMTileID& tile,
00840 const SoLDM::DataSetIdPair& p,
00841 SoState * state=NULL,
00842 const bool useExtendedData = false);
00843
00845 SbBool isTileEdited( const SoLDMTileID& tileId );
00846
00847
00848
00849 static int getNumInstance()
00850 { return s_numInstance; }
00851
00853 SB_THREAD_TLS_HEADER();
00854
00855 typedef std::vector<SoGLTexture*> TextureList;
00856
00858 SoLDM::DataSetIdPair getDataSetIdPair(SoState* state) const;
00859
00860 SoMultiDataSeparator *getMultiDataSeparator() { return m_MultiDataSeparator; }
00861 void setMultiDataSeparator(SoMultiDataSeparator *mds);
00862
00866 virtual void notify(SoNotList *list);
00867
00871 void sendParametersToLDM(SoLdmValuationAction* action);
00872
00877 virtual SoLDMGeomElement* getAppropriateElement(SoLDMGeometry* v) = 0;
00878
00879
00880 void ignoredByMultiDataSeparator(bool state);
00881 bool isIgnoredByMultiDataSeparator() { return m_ignoredByMultiDataSeparator; }
00882
00883
00884 virtual bool getDataCharRead() { return m_dataCharRead;};
00885
00886
00887 int getIndTexPrec() const;
00888 virtual void doAction( SoAction *action );
00889 bool loadInMemory(SoState* s = NULL);
00890 void setListChange(bool val){m_listChange = val;};
00891 bool getListChange(){return m_listChange;};
00892
00893
00894
00895
00896
00897
00898
00899 inline unsigned short getResourcesState() const
00900 { return m_resourcesState;};
00901
00902
00903
00904
00905
00906 void setResourcesState( const SoLDMResourceManager::State flag, bool value );
00907
00908
00909 SbVec3i32 getEyeDataCoord(SoState* state);
00910
00917 int getZaxis(SoState *state, const SbBox3f& volBbox) const;
00918
00922 SbVec3f getVolCenterToEyeVector(SoState *state, const SbBox3f& volBbox) const;
00923
00925 SbVec3f getObjectSpaceEyeAxis(SoState *state) const;
00926
00927
00928 void setAccumulate(bool val){m_toAccumulate = val;};
00929 bool isAccumulated(){return m_toAccumulate;};
00930 bool m_toAccumulate;
00931 SbBool getCurrentMatrixDifference(SoState*, SbMatrix&);
00932
00933
00934 void lookForSceneGraphChange(SoAction* action);
00935
00936
00937 virtual SoBufferObject* getDataOneSlice( const SbVec3i32& tileSize, SoBufferObject* tileData, int Zaxis, int slice);
00938 virtual void releaseDataOneSlice(SoBufferObject *sliceDataBuffer);
00939
00940
00941
00942 virtual SoLDMTileManager::LDMSliceAccessor* getAppropriateSliceAccessor(const SoLDM::DataSetIdPair& p);
00943 virtual SoLDMReader* getAppropriateLDMReader( const SbString& )
00944 { return NULL; };
00945
00946
00951 virtual bool getBbox(SoLDMTileID tileId, SbBox3f& box);
00952
00953
00954 bool getCenter(SoLDMTileID tileID, SbVec3f& center)const;
00955
00956 SoLDMMediator* getMediator(){return m_mediator;};
00957 void setMediator(SoLDMMediator* m);
00958
00959 virtual bool createTex(int Zaxis, SoState *state, const SbVec3i32 &tileSize, SoBufferObject *tileDataBuffer, SoTransferFunction *transferFunction,
00960 SoBufferObject*& textureBufferObject, int alphaUse = 0);
00961
00962
00964 void* getTexData(const void* tileBuffer,
00965 int numElem,
00966 SoTransferFunction* transferFunction,
00967 int alphaUse,
00968 int texPrec,
00969 void *textureBuffer,
00970 SoDataRange* datarange,
00971 SoDataCompositor* dataCompositor);
00972
00973
00974
00975
00976
00977 SoBufferObject* getTexData(SoBufferObject* tileBufferObject,
00978 SoTransferFunction* transferFunction,
00979 int alphaUse,
00980 int texPrec,
00981 SoBufferObject* textureBufferObject,
00982 SoDataRange* dataRange,
00983 SoDataCompositor* dataCompositor);
00984
00985 template <typename DataClassIn>
00986 static SoBufferObject *permuteData(const SbVec3i32& , SoBufferObject* , int );
00987
00988 inline virtual void computeLighting( const SbVec3i32& , SoBufferObject* ) {};
00989 int getRGBAInternalFormat() const;
00990
00991 virtual void updateColorTable(SoState *, SoTransferFunction *);
00992
00993 SoLDMResourceManager& getResourceManager() { return *m_resourceManager; }
00994
00999 virtual int getTexPrec(SoState*);
01000
01006 void getTextureFormat(SoTransferFunction::GLColorMapType colorMapType,
01007 GLenum& format,
01008 GLenum& dataType,
01009 GLint& internalFormat) const;
01010
01011
01012 virtual void drawTilesInMainMemory(SoState *state);
01013
01014
01015
01016 void copyLDMParameters(SoLDMMediator *mediator);
01017
01023 virtual bool isMultidataEnabled() const { return m_multidataEnabled; }
01024
01025
01026 enum BoxColor {
01027 GREY,
01028 RED,
01029 BLUE,
01030 GREEN,
01031 FULL_RES_GREY,
01032 FULL_RES_GREEN
01033 };
01034
01035 enum FieldId {
01036 MAX_MAIN_MEMORY = 0,
01037 MAX_TILES_IN_MAIN_MEMORY,
01038 LOAD_POLICY,
01039 LOAD_NOTIFICATION_RATE,
01040 MAX_TEX_MEMORY,
01041 MAX_TILES_IN_TEX_MEMORY,
01042 TEX3_LOAD_RATE,
01043 MAX_2D_TEXTURES,
01044 TEX2_LOAD_RATE,
01045 MIN_RESOLUTION_THRESHOLD,
01046 MAX_RESOLUTION_THRESHOLD,
01047 TILE_SIZE,
01048 FIX_PARAMS,
01049 OVERLAPPING,
01050 TILE_HALF_LIFE,
01051 FIXED_RESOLUTION_MODE,
01052 LAST_ID
01053 };
01054
01059 unsigned short getId() const
01060 { return m_id; }
01061
01065 inline bool hasReadError()
01066 { return m_hasReadError; };
01067
01071 inline bool isEmpty()
01072 {
01073 const SbVec3i32& dim = getDimension();
01074 return ( dim[0] == 0 || dim[1] == 0 || dim[2] == 0 );
01075 };
01076
01081 struct DatumElement{
01082 SoDataSet::DataType type;
01083 int num;
01084 };
01085
01092 float convertToNormalizedTextureSpace(SoState *state, const float data);
01093
01097 inline void setFirstTraversalDone(bool flag)
01098 { m_firstTraversalDone = flag; }
01099
01103 inline bool isFirstTraversalDone() const
01104 { return m_firstTraversalDone;}
01105
01106 virtual bool isPalettedTexture(SoState*);
01107
01108
01109
01110
01111 virtual uint64_t getTileSignature(const SoLDMTileID& tileId);
01112
01113
01114 uint64_t getUniqueId();
01115
01121 inline void setOwnedReader( SoVolumeReader &reader )
01122 { setReader( reader, TRUE ); };
01123
01124
01125
01126
01127
01128
01129 void refVolRender( int contextId );
01130 void unrefVolRender( int contextId );
01131
01138 int getBestEqualResolution() const;
01139
01144 void computeBestEqualResolution();
01145
01146 private:
01147
01149 SoDataSet();
01150
01152 virtual ~SoDataSet();
01153
01157 virtual void setElement(SoState* state);
01158
01162 inline bool isUsingUserExtent()
01163 { return m_useUserExtent; };
01164
01165
01166
01167
01168
01169
01170
01171
01172 virtual bool enableMultidata(SoState* state);
01173
01174
01175 virtual SoVolumeReader* getAppropriateReader();
01176
01178 bool m_forcePow2TileDim;
01179
01180
01181 SoRef<SoFieldContainer> m_reader;
01182 SbBool m_internalReader;
01183
01184
01185 bool m_listChange;
01186
01187 bool load(SoState*);
01188 virtual void unload();
01189 virtual void releaseMemory();
01190
01191 bool assignLDMMediator(SoState* state);
01192 bool m_multidataEnabled;
01193
01194 SbVec3i32 m_dimension;
01195 bool m_initialized;
01196
01197 SbDataType m_type;
01198 int m_numBits;
01199 bool m_isDataFloat;
01200 bool m_isDataSigned;
01201 unsigned int m_datumSize;
01202
01203 bool m_deletedFlag;
01204
01205 bool m_dataCharRead;
01206
01207 SbString m_filename;
01208 virtual void updateFilename();
01209
01210
01211 void dataIDChanged(int newId);
01212 unsigned short m_id;
01213
01214 void ldmResourceParamChanged();
01215
01219 virtual void readerChanged();
01220
01225 void extentChanged();
01226
01227 void initReader();
01228 void setType(SbDataType);
01229
01230
01231 void getFilePathName( SbString& pathName, SbString& fileExtension);
01232
01233 virtual SoLDMMediator *createMediator();
01234 SoLDMMediator* m_mediator;
01235
01236 SoMultiDataSeparator *m_MultiDataSeparator;
01237 bool m_ignoredByMultiDataSeparator;
01238
01239 SoLDMResourceManager* m_resourceManager;
01240
01241 virtual int isSharedPalettedTexture() { return FALSE; }
01242
01243 void getTransferFunction(SoTransferFunction *transferFunction, int alphaUse,
01244 int &shift, int &offset, int &nrgba, unsigned int * &rgba);
01245
01246 SbVec3i32 getPow2(SbVec3i32) const;
01247
01248
01249 void drawTiles(SoState *state, const SoLDM::TileIdVector& tileIDs,
01250 const SbVec4f &tileColor, const SbVec4f &maxLevelColor,
01251 size_t maxLineWidth);
01252 template<class DataType>
01253 void buildSlice(SoCpuBufferObject& slice, const SbVec3i32& min, const SbVec3i32& max, const SbVec2i32 sampleStep);
01254
01255 template<typename _DataType>
01256 void buildLine(SoCpuBufferObject& line, const SbVec3i32& min, const SbVec3i32& max, const int sampleStep );
01257
01258
01259
01260
01261 virtual void buildTile(SoLDMTileID tileID, SoBufferObject* buffer);
01262
01263
01264 virtual void readChar();
01265
01266
01267 virtual void setUseUserUndefinedValue(bool useUserUndefinedValue);
01268
01269 bool m_useUserExtent;
01270
01271 SoVolumeHistogram *m_histogram;
01272
01273
01274 SoCache* m_dataCompositorCache;
01275
01279 struct MTstruct {
01280 SoBufferObject *tmpTexture;
01281 SoCpuBufferUniform *tmpTextureUniform;
01282 SoBufferObject *tmpColormap;
01283 SoBufferObject *tmpTexturePermute;
01284 };
01285
01286
01287 SoINTERNAL private:
01288 SoSFFieldContainer customReader;
01289 SoSFBool customReaderOwnerShip;
01290
01295 SoSFLDMDataTransform editingStack;
01296
01297 virtual void ldmAction(SoLdmValuationAction* action);
01298
01302 virtual SbBool isRGBAData();
01303
01304 private:
01306 void updateDataSetId(SoState* state);
01307
01309 void enableThinVolume();
01310
01311
01312 void updateCompositorCache(SoState *state);
01313
01317 bool isValidDimension(const SbVec3i32& dim) const;
01318
01322 void displayReadError(int err);
01323
01328 SbVec3i32 clampTileDimension(const SbVec3i32& tileDim) const;
01329
01333 static const unsigned int MAX_DATASET_DIMENSION;
01334
01338 static const int MAX_TILE_DIMENSION;
01339
01340 bool isIdUsed(int id, std::vector<SoDataSet*>);
01341
01342 #ifndef HIDDEN_FROM_DOC
01343 friend class SoLDMMediator;
01344 friend class SoLDMMediator::LDMManagerAccess;
01345 friend class SoCpuBufferFromVolumeReader;
01346 #endif
01347
01348
01349
01350
01351 template<typename _DataType>
01352 void buildTileByLine(const SbBox3i32& tileBox, SoBufferObject* bufferObject);
01353
01354
01355
01356
01357
01358
01359 template<typename _DataType>
01360 void buildTileBySlice(const SbBox3i32& tileBox, SoBufferObject* bufferObject);
01361
01362
01363 bool m_filenameChange;
01364
01368 bool m_hasReadError;
01369
01370 bool m_accumulate;
01371
01372 SoPerfCounterManager* m_perf;
01373
01374
01375 SoPerfCounter* m_nbTexGen;
01376 SoPerfCounter* m_byteGetTexData;
01377 SoPerfCounter* m_timeCreateTex;
01378 SoPerfCounter* m_timeGetTexData;
01379
01380 static SoAlgorithms* s_algorithms;
01381 static SoLDMAlgorithms* s_LDMAlgorithms;
01382
01383 bool m_firstTraversalDone;
01384 friend class SoLdmValuationAction;
01385 bool m_ldmUseInMemCompression;
01386
01387 static int s_numInstance;
01388
01389
01390
01391
01392
01393 unsigned short m_resourcesState;
01394
01395 static uint64_t s_lasUniqId;
01396
01397
01398
01399 static SbThreadMutex s_sigCacheMutex;
01400
01401
01402 tileSigInCacheMap m_tileSigInCache;
01403
01404
01405
01406
01407 std::map<int, int> m_mapContextIdRef;
01408
01409
01410
01411 int m_bestEqualResolution;
01412
01414 static bool s_GPUDataRange;
01415 };
01416
01417 #ifdef _MSC_VER
01418 #pragma warning( pop )
01419 #endif
01420
01421 #endif // _SO_DATA_SET_
01422
01423
01424