00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef _SO_BASE_CONVERTER_
00025 #define _SO_BASE_CONVERTER_
00026
00027 #ifdef _MSC_VER
00028 #pragma warning( push )
00029 #pragma warning(disable:4251)
00030 #endif
00031
00032
00033 #include <LDM/nodes/SoDataSet.h>
00034 #include <Inventor/STL/vector>
00035 #include <Inventor/SbBox.h>
00036 #include <Inventor/SbPList.h>
00037
00038 #include <Inventor/threads/SbThreadMutex.h>
00039
00040 #include <LDM/readers/SoLDMReader.h>
00041 #include <LDM/compressors/SoDataCompressor.h>
00042
00043 class SoLDMTopoOctree;
00044 class ScJob;
00045 class SoVolumeHistogram;
00046 class SiBitFile;
00047 class SoDataCompressInfo;
00048 class SoPerfCounterManager;
00049 class SoConverterParameters;
00050
00316 class SoConverter {
00317
00318 public:
00319
00323 virtual ~SoConverter();
00324
00328 enum ConverterError{
00330 CVT_NO_ERROR = 0,
00332 CVT_INPUT_PARAMS_PROBLEM = -1,
00334 CVT_FILE_EXT_UNKNOWN = -2,
00336 CVT_CANT_OPEN_INPUT_FILE = -3,
00338 CVT_CANT_CREATE_DATA_FILE = -4,
00340 CVT_CANT_CREATE_HEADER_FILE = -5,
00342 CVT_NOT_ENOUGH_DISK_SPACE = -6,
00344 CVT_CANT_READ_INPUT_FILE = -7,
00346 CVT_ABORTED = -9,
00348 CVT_NOT_INITIALIZED = -10,
00350 CVT_NO_NODE = -998,
00352 CVT_NO_LDM_LICENSE = -999
00353 };
00354
00363 int convert( SoConverterParameters* parameters = NULL);
00364
00370 void setXmlCallback( void (*xmlCB)( FILE*, void * userData ), void * userData );
00371
00372 #if 1 SoDEPRECATED
00378 int convert( int argc, char ** argv);
00379 SoDEPRECATED
00381 int convert( const SbStringList& arguments );
00382
00383 #endif
00385 private:
00386
00387 enum MessageType{
00388 INIT = 1,
00389 BUILD_SLAB,
00390 BUILD_LEVEL,
00391 CLEAR
00392 };
00393
00394 char* m_slabBuffer;
00395 SbVec3i32 m_slabBufferDim;
00396 int64_t m_subSliceSize;
00397
00398
00399 SoVolumeHistogram* m_stat;
00400 double m_min, m_max;
00401 std::vector<int64_t> m_numValues;
00402 std::vector<double> m_values;
00403
00404 int m_numTilesGenerated;
00405 float m_progress;
00406
00407 struct Stat{
00408 double value;
00409 int64_t numValues;
00410 };
00411
00412 void checkProgress();
00413
00414
00415
00416 int m_dataSize;
00417
00418
00419 ConverterError init();
00420
00421 char* allocateSlabBuffer(int& _numTilesOnYAxis, SbVec3i32& _slabBufferDim, int64_t& _subSliceSize);
00422 int buildSlab2Level(SbBox3i32& slabBox, char*& slabBufferPtr, void* parentTile, void** octantTile,SbVec3i32& slabBufferDim, int64_t subSliceSize, std::vector<int>& fileIDsBuilt);
00423 void buildLevel(std::vector<int>&, int, int fromFileID = -1, int toFileID = -1);
00424 int initializeFiles( int argc, char ** argv );
00425 int initializeFiles( SoConverterParameters* parameters );
00426
00427 int writeSubVolume( const SbBox3i32 & subVolume, const void * data, SbBool doLowerResolution = TRUE, SbBool doOverlappingTiles = TRUE );
00428 int writeTile( const SoLDMTileID & tileID, void * data );
00429
00430 int writeSubVolume( const SbBox3i32 & subVolume, SoBufferObject* data, SbBool doLowerResolution = TRUE, SbBool doOverlappingTiles = TRUE );
00431 int writeTile( const SoLDMTileID & tileID, SoBufferObject* data );
00432
00433 const SoLDMTopoOctree* getTopo() { return m_LDMTopo; };
00434 int finalizeFiles( int retCode = 0 );
00435 int buildLevels( int fromLevel, int numLevels );
00436
00437 void * m_fout;
00438 SoConverterParameters* getParameters();
00439 void updateFileCompletion(std::vector<int>& fileIDs);
00440
00441 std::vector<SoDataSet::DatumElement> m_datum;
00442 bool m_isDataFloat;
00443 bool m_isDataSigned;
00444 size_t m_tileSize;
00445 int m_numSigBits;
00446
00447 private: protected:
00448 SoVolumeReader* m_reader;
00449
00451 SoConverter();
00452
00454 virtual void getSubSlice( const SbBox2i32& subSlice, int sliceNumber, void * data ) = 0;
00455
00456
00457 virtual SbBox3f getSize(int& error) = 0;
00458 virtual std::vector<SoDataSet::DatumElement> getDatum(int& error) = 0;
00459 virtual SbVec3i32 getDimension(int& error) = 0;
00460 virtual int getRange( double & rangeMin, double & rangeMax) = 0;
00461 virtual SoVolumeHistogram* getHistogram();
00462 virtual std::vector<SbVec2d>& getTileMinMax(int numTiles);
00463 virtual void closeInputFileHandles();
00464
00478 virtual void sampleTile ( const SbVec3i32& tileDim, int border, const void* const octantTile[8], const int octantExists[8], void* parentTile ) = 0;
00479 virtual void buildTile ( SbBox3i32& slabBox, SbVec3i32& slabBufferDim, void* slabBuffer, SbVec3i32& tileOrigin, void* tileBuffer );
00480 void buildTile ( const SbBox3i32& subVolume, const void* subVolumeBuffer, const SbBox3i32& tilePos, void* tileData, const SbBox3i32& intersection );
00481 virtual void outputHeader( FILE* ) {};
00482 virtual void outputTileBefore( int fileTileIndex, int dataSize, void *data, bool dataInverted );
00483 virtual void startConversion(){};
00484 virtual void endConversion(){};
00485
00486 virtual bool updateDataFile() { return true; }
00487 virtual int getSpecificOffset(bool aligned = true ) { return !aligned; }
00488 virtual SbString getOriginalFilename() const;
00489 virtual void setOriginalFileName(const SbString& originalFileName);
00490
00491
00493
00495 enum Abort {
00497 CVT_CONTINUE,
00499 CVT_ABORT
00500 };
00501
00505 enum SampleType
00506 {
00510 DECIMATION,
00514 AVERAGE
00515 };
00516
00524 virtual Abort progress( int numTilesGenerated, int numTilesToGenerate );
00525
00526 ConverterError buildHeader( const SbString&, bool conversionDone = false);
00527
00528 virtual void outputDataType(FILE* fout);
00529
00530 SbBox3f m_volumeSize;
00531
00532 void inputTile( int fileTileIndex, int dataSize, void *data, bool i = false );
00533 void printTime();
00534 int buildLevelMax();
00535 void outputTile( int fileTileIndex, int dataSize, void*, bool i = false );
00536
00537 void printCompressionInfos();
00538
00539 void (*m_xmlCB)( FILE*, void* );
00540 void *m_xmlCBUserData;
00541 SoLDMTopoOctree *m_LDMTopo;
00542
00543
00544 int64_t m_filesize;
00545 int64_t m_compressedFilesize;
00546 SbString m_fileCompletion;
00547 SbString m_fileCompletionName;
00548 SbString m_fileExt;
00549
00550
00551 int m_pid;
00552 int m_levelMax;
00553 bool m_thinDataSet;
00554 SbVec3i32 m_volumeDimension;
00555
00556
00557
00558 int m_numTilesToGenerate;
00559 bool m_abort;
00560 int getNumTileToGenerate(SbBox3i32& slabBox);
00561 SiBitFile* m_bitFile;
00562
00563
00564 SoDataCompressor *m_ldmCompressor;
00565 int64_t m_sizeOfTileIndex;
00566 char m_compressionType[256];
00567 SoDataCompressInfo* m_lastWrittenCompressInfo;
00568
00569
00570 bool m_fromInitializeFiles;
00571
00572
00573 void writeTileComplete(int fileID, bool writeHeader = false);
00574
00575
00576 void abortConversion();
00577
00578 void readSlab(SbBox3i32& slabBox, char*& slabBufferPtr,int64_t subSliceSize);
00579
00580
00581 SampleType m_sampleType;
00582
00583
00584
00585 static const char *m_dataTypeStr[];
00586 static const char *m_dataTypeXml[];
00587 int m_currentWordFormat;
00588
00589
00590 SoPerfCounterManager *m_perfManager;
00591 SoConverterParameters* m_parameters;
00592 SbString m_originalFileName;
00593
00594 virtual void adjustParameters() {};
00595 virtual void handleCustomTags(FILE*) {};
00596
00598 std::vector<SbVec2d> m_tileMinMax;
00599
00604 bool isFastUpdate();
00605
00606 private:
00607 bool m_userDefinedParameters;
00608 int64_t getCrc32(void* data, int dataSize, const SoDataCompressor::TileInfo& ti);
00609 void usage();
00610 template <typename T> void fillTile(void* ptrDst, int size, void* value );
00611
00612 template <typename T> void fillTileWithSingleValue(void* ptrDst, int size, T value );
00613
00615 SoConverter::ConverterError outputMinMaxInfos(FILE* fout);
00616
00618 void computeLowResMinMax(const SoLDMTileID& tileId);
00619
00620 bool m_bComplFileAlreadyExists;
00621
00623 void buildTileFast(int fileID, void* tileData, const SbVec3i32& tileOrigin);
00624
00625 static SbThreadMutex s_classMutex;
00626
00628 static bool s_doFastUpdate;
00629 };
00630
00631 inline void
00632 SoConverter::outputTileBefore( int , int , void *, bool )
00633 {
00634 }
00635
00636 inline SoConverterParameters*
00637 SoConverter::getParameters()
00638 {
00639 return m_parameters;
00640 }
00641
00642 inline SbString
00643 SoConverter::getOriginalFilename() const
00644 {
00645 return m_originalFileName;
00646 }
00647
00648 inline void
00649 SoConverter::setOriginalFileName(const SbString& originalFilename)
00650 {
00651 m_originalFileName = originalFilename;
00652 }
00653
00654 #ifdef _MSC_VER
00655 #pragma warning( pop )
00656 #endif
00657
00658 #endif //_SO_BASE_CONVERTER_
00659
00660
00661