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 SoDEPRECATED
00389 void listenToServer(int argc, char** argv);
00390
00391 #endif
00393 private:
00394
00395 enum MessageType{
00396 INIT = 1,
00397 BUILD_SLAB,
00398 BUILD_LEVEL,
00399 CLEAR
00400 };
00401
00402 char* m_slabBuffer;
00403 SbVec3i32 m_slabBufferDim;
00404 int64_t m_subSliceSize;
00405
00406
00407 SoVolumeHistogram* m_stat;
00408 double m_min, m_max;
00409 std::vector<int64_t> m_numValues;
00410 std::vector<double> m_values;
00411
00412 int m_numTilesGenerated;
00413 float m_progress;
00414
00415 struct Stat{
00416 double value;
00417 int64_t numValues;
00418 };
00419
00420 void checkProgress();
00421
00422
00423
00424 int m_dataSize;
00425
00426
00427 ConverterError init();
00428
00429 char* allocateSlabBuffer(int& _numTilesOnYAxis, SbVec3i32& _slabBufferDim, int64_t& _subSliceSize);
00430 int buildSlab2Level(SbBox3i32& slabBox, char*& slabBufferPtr, void* parentTile, void** octantTile,SbVec3i32& slabBufferDim, int64_t subSliceSize, std::vector<int>& fileIDsBuilt);
00431 void buildLevel(std::vector<int>&, int, int fromFileID = -1, int toFileID = -1);
00432 int initializeFiles( int argc, char ** argv );
00433 int initializeFiles( SoConverterParameters* parameters );
00434
00435 int writeSubVolume( const SbBox3i32 & subVolume, const void * data, SbBool doLowerResolution = TRUE, SbBool doOverlappingTiles = TRUE );
00436 int writeTile( const SoLDMTileID & tileID, void * data );
00437
00438 int writeSubVolume( const SbBox3i32 & subVolume, SoBufferObject* data, SbBool doLowerResolution = TRUE, SbBool doOverlappingTiles = TRUE );
00439 int writeTile( const SoLDMTileID & tileID, SoBufferObject* data );
00440
00441 const SoLDMTopoOctree* getTopo() { return m_LDMTopo; };
00442 int finalizeFiles( int retCode = 0 );
00443 int buildLevels( int fromLevel, int numLevels );
00444
00445 void * m_fout;
00446 SoConverterParameters* getParameters();
00447 void updateFileCompletion(std::vector<int>& fileIDs);
00448
00449 std::vector<SoDataSet::DatumElement> m_datum;
00450 bool m_isDataFloat;
00451 bool m_isDataSigned;
00452 size_t m_tileSize;
00453 int m_numSigBits;
00454
00455 private: protected:
00456 SoVolumeReader* m_reader;
00457
00461 SoConverter(SbBool isClient = FALSE);
00462
00464 virtual void getSubSlice( const SbBox2i32& subSlice, int sliceNumber, void * data ) = 0;
00465
00466
00467 virtual SbBox3f getSize(int& error) = 0;
00468 virtual std::vector<SoDataSet::DatumElement> getDatum(int& error) = 0;
00469 virtual SbVec3i32 getDimension(int& error) = 0;
00470 virtual int getRange( double & rangeMin, double & rangeMax) = 0;
00471 virtual SoVolumeHistogram* getHistogram();
00472 virtual std::vector<SbVec2d>& getTileMinMax(int numTiles);
00473 virtual void closeInputFileHandles();
00474
00488 virtual void sampleTile ( const SbVec3i32& tileDim, int border, const void* const octantTile[8], const int octantExists[8], void* parentTile ) = 0;
00489 virtual void buildTile ( SbBox3i32& slabBox, SbVec3i32& slabBufferDim, void* slabBuffer, SbVec3i32& tileOrigin, void* tileBuffer );
00490 void buildTile ( const SbBox3i32& subVolume, const void* subVolumeBuffer, const SbBox3i32& tilePos, void* tileData, const SbBox3i32& intersection );
00491 virtual void outputHeader( FILE* ) {};
00492 virtual void outputTileBefore( int fileTileIndex, int dataSize, void *data, bool dataInverted );
00493 virtual void startConversion(){};
00494 virtual void endConversion(){};
00495
00496 virtual bool updateDataFile() { return true; }
00497 virtual int getSpecificOffset(bool aligned = true ) { return !aligned; }
00498 virtual SbString getOriginalFilename() const;
00499 virtual void setOriginalFileName(const SbString& originalFileName);
00500
00501
00503
00505 enum Abort {
00507 CVT_CONTINUE,
00509 CVT_ABORT
00510 };
00511
00515 enum SampleType
00516 {
00520 DECIMATION,
00524 AVERAGE
00525 };
00526
00534 virtual Abort progress( int numTilesGenerated, int numTilesToGenerate );
00535
00536 ConverterError buildHeader( const SbString&, bool conversionDone = false);
00537
00538 virtual void outputDataType(FILE* fout);
00539
00540 SbBox3f m_volumeSize;
00541
00542 void inputTile( int fileTileIndex, int dataSize, void *data, bool i = false );
00543 void printTime();
00544 int buildLevelMax();
00545 void outputTile( int fileTileIndex, int dataSize, void*, bool i = false );
00546
00547 void printCompressionInfos();
00548
00549 void (*m_xmlCB)( FILE*, void* );
00550 void *m_xmlCBUserData;
00551 SoLDMTopoOctree *m_LDMTopo;
00552
00553
00554 int64_t m_filesize;
00555 int64_t m_compressedFilesize;
00556 SbString m_fileCompletion;
00557 SbString m_fileCompletionName;
00558 SbString m_fileExt;
00559
00560
00561 int m_pid;
00562 int m_levelMax;
00563 bool m_thinDataSet;
00564 SbVec3i32 m_volumeDimension;
00565
00566
00567
00568 int m_numTilesToGenerate;
00569 bool m_abort;
00570 int getNumTileToGenerate(SbBox3i32& slabBox);
00571 SiBitFile* m_bitFile;
00572
00573
00574 SoDataCompressor *m_ldmCompressor;
00575 int64_t m_sizeOfTileIndex;
00576 char m_compressionType[256];
00577 SoDataCompressInfo* m_lastWrittenCompressInfo;
00578
00579
00580 bool m_fromInitializeFiles;
00581
00582
00583 void writeTileComplete(int fileID, bool writeHeader = false);
00584
00585
00586 void abortConversion();
00587
00588 void readSlab(SbBox3i32& slabBox, char*& slabBufferPtr,int64_t subSliceSize);
00589
00590
00591 SampleType m_sampleType;
00592
00593
00594
00595 static const char *m_dataTypeStr[];
00596 static const char *m_dataTypeXml[];
00597 int m_currentWordFormat;
00598
00599
00600 SoPerfCounterManager *m_perfManager;
00601 SoConverterParameters* m_parameters;
00602 SbString m_originalFileName;
00603
00604 virtual void adjustParameters() {};
00605 virtual void handleCustomTags(FILE*) {};
00606
00608 std::vector<SbVec2d> m_tileMinMax;
00609
00614 bool isFastUpdate();
00615
00616 private:
00617 bool m_userDefinedParameters;
00618 int64_t getCrc32(void* data, int dataSize, const SoDataCompressor::TileInfo& ti);
00619 void usage();
00620 template <typename T> void fillTile(void* ptrDst, int size, void* value );
00621
00622 template <typename T> void fillTileWithSingleValue(void* ptrDst, int size, T value );
00623
00625 SoConverter::ConverterError outputMinMaxInfos(FILE* fout);
00626
00628 void computeLowResMinMax(const SoLDMTileID& tileId);
00629
00630 bool m_bComplFileAlreadyExists;
00631
00633 void buildTileFast(int fileID, void* tileData, const SbVec3i32& tileOrigin);
00634
00635 static SbThreadMutex s_classMutex;
00636
00638 static bool s_doFastUpdate;
00639 };
00640
00641 inline void
00642 SoConverter::outputTileBefore( int , int , void *, bool )
00643 {
00644 }
00645
00646 inline SoConverterParameters*
00647 SoConverter::getParameters()
00648 {
00649 return m_parameters;
00650 }
00651
00652 inline SbString
00653 SoConverter::getOriginalFilename() const
00654 {
00655 return m_originalFileName;
00656 }
00657
00658 inline void
00659 SoConverter::setOriginalFileName(const SbString& originalFilename)
00660 {
00661 m_originalFileName = originalFilename;
00662 }
00663
00664 #ifdef _MSC_VER
00665 #pragma warning( pop )
00666 #endif
00667
00668 #endif //_SO_BASE_CONVERTER_
00669
00670
00671