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_MEDIATOR_
00024 #define _SO_MEDIATOR_
00025
00026 #ifdef _MSC_VER
00027 #pragma warning( push )
00028 #pragma warning(disable:4251)
00029 #endif
00030
00031 #include <Inventor/STL/vector>
00032 #include <Inventor/SbBox.h>
00033 #include <LDM/SoLDMTileID.h>
00034 #include <LDM/SoLDMResourceManager.h>
00035 #include <LDM/nodes/SoLDMResourceParameters.h>
00036
00037 #include <LDM/SoLDMDataAccess.h>
00038
00039 #include <LDM/elements/SoDataSetElement.h>
00040
00041
00042
00043 class SoLDMTileVisitor;
00044 class SoLDMProximityVisitor;
00045 class SoLDMMultiIOTileManager;
00046 class SoLDMNodeFrontManager;
00047 class SoLDMTextureManager;
00048 class SoLDMGeometry;
00049 class SoLDMResourceManager;
00050 class SoDataCompositor;
00051 class LDMDefaultSliceAccessor;
00052 class SoGLRenderAction;
00053 class SoDataSet;
00054 class SoState;
00055 class SoLdmParameterNode;
00056 class SoBufferObject;
00057 class SbThreadSemaphore;
00058 class SoDataSetId;
00059 class SoLdmValuationAction;
00060 class SoLDMTileInfo;
00061 class SoLDMTileManager;
00062 class LDMSliceAccessor;
00063
00064
00082 {
00083 public:
00085 SoLDMMediator();
00086
00088 virtual ~SoLDMMediator();
00089
00090 private:
00091
00092 void registerNode(const SoLDM::DataSetIdPair& dsIdPair, bool sync);
00093 void unregisterNode(const SoLDM::DataSetIdPair& dsIdPair, SoLDMMediator *newMediator = NULL);
00094
00095 void readTile(int dataSetId, SoLDMTileID tileID, unsigned char* buffer, bool transform) ;
00096
00097 void readTile(const int dataSetId, const SoLDMTileID tileID, SoBufferObject* buffer, const bool transform) ;
00098
00099 size_t readTile(SoLDMTileInfo* tileInfo, const int dataSetId, bool transform);
00100
00101 uint64_t getTileSize(int dataSetId, const SoLDMTileID* tileId = NULL)const ;
00102 SbVec3i32 getTileDimension()const ;
00103
00104 const SbVec3i32& getDimension()const ;
00105 const SbBox3f& getExtent()const ;
00106 int getOverlapping() const
00107 {
00108 return 0;
00109 }
00110
00111 void renderNotify()const;
00112
00116 const std::vector<int>& getNumData() const ;
00117
00118 SbBool getBbox(SoLDMTileID tileID, SbBox3f& box)const;
00119 bool getCenter(SoLDMTileID tileID, SbVec3f& center)const;
00120
00121
00122 SbBool getListChange(){return m_listChange;};
00123
00125 int getDataEntry(unsigned short id)const ;
00126 int getDataEntry(SoDataSet*)const ;
00127
00129 bool hasMultiDataError() const
00130 {
00131 return m_multiDataError;
00132 }
00133
00135 private:
00136
00138 void registerWithIds(SoDataSet* ds, std::vector<int> ids, bool sync);
00139
00141 void unregisterAllIds(SoDataSet* ds, SoLDMMediator* newMediator = NULL);
00142
00144 void unregisterAll();
00145
00146 SoLDMTileManager* getTileManager() { return m_tileManager; }
00147 SoLDMTextureManager* getTextureManager() { return m_textureManager; }
00148 SoLDMGeometry* getVVizGeometry() { return m_vvizGeometry; }
00149 SoLDMNodeFrontManager* getNodeFrontManager() { return m_nodeFrontManager; }
00150
00151 LDMSliceAccessor* getSliceAccessor(const SoLDM::DataSetIdPair& p)const;
00152 void startRenderTraversal(SoLdmValuationAction*, SoDataSet*);
00153
00154 void updateRegions(const SbBox3i32* region, int numRegions);
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165 void checkList(SoAction* action, SoDataCompositor* dc);
00166
00167
00168
00169
00170
00171
00172 int getBiggestBufferEntry() const;
00173
00174
00175
00176 void restartLoadingThread();
00177
00178
00179 void updateDataIds() ;
00180
00181 SoDataSet* getVolumeOfId(unsigned short dataSetId)const;
00182 void getVolumeElements(SoLDM::DataSetIdPairList& dsIdPairList) const;
00183
00185 void getDataSetList(SoLDM::DsVector& dsList) const;
00186
00188 void getDataSetIds(const SoDataSet* ds, std::vector<int>& ids) const;
00189
00193 SoDataSet* getFirstDataSet() const
00194 {
00195 if (m_volumeDataList.empty())
00196 return NULL;
00197
00198 return m_volumeDataList[0].dsIdPair.first;
00199 }
00200
00204 const SoLDM::DataSetIdPair& getFirstDataSetIdPair() const;
00205
00209 const SoLDM::DataSetIdPairList& getDsIds() const
00210 {
00211 return m_dataDsIds;
00212 }
00213
00214
00215 void addToLDM();
00216
00217 SoDataCompositor* getDataCompositor()const { return m_dc; }
00218 void setDataCompositor(SoDataCompositor *dc);
00219
00221 struct DataSetInfo
00222 {
00223 SoLDM::DataSetIdPair dsIdPair;
00224 int bufferId;
00225 };
00226 typedef std::vector<DataSetInfo> DataSetInfoList;
00227
00228 DataSetInfoList & getVolumeDataList();
00229
00236 bool isAlreadyInFixResMode() const
00237 {
00238 return m_isTileVisitorFixedRes;
00239 }
00240
00241 #if 1 SoDEPRECATED
00248 void useFixedTileVisitor(bool flag)
00249 {
00250 m_isTileVisitorFixedRes = flag;
00251 }
00252 #endif
00253
00265 void setTileVisitor( SoLDMTileVisitor* visitor, bool ownedByUser = true );
00266
00274 void setTileManager( SoLDMTileManager* tilemgr, SbBool ownedByUser = TRUE );
00275
00279 SoLDMTileVisitor* getTileVisitor()
00280 {
00281 return m_tileVisitor;
00282 }
00283
00287 bool isTileVisitorOwnedByUser() const { return m_userVisitor; }
00288
00289 private:
00290 SoLDMTextureManager* m_textureManager;
00291 SoLDMGeometry* m_vvizGeometry;
00292 SoDataCompositor* m_dc;
00293 SoLDMTileVisitor* m_tileVisitor;
00294 SoLDMNodeFrontManager* m_nodeFrontManager;
00295 SoLDMTileManager* m_tileManager;
00296
00297
00298 bool m_userVisitor;
00299 SoLDMProximityVisitor* m_internalVisitor;
00300 bool m_userTileManager;
00301 SoLDMMultiIOTileManager* m_internalTileManager;
00302
00303 const DataSetInfo& getDataInfo(const SoLDM::DataSetIdPair& dsIdPair) const;
00304
00305 bool isUsedByLDM() { return m_isUsedByLDM; }
00306 void setUsedByLDM(bool flag) { m_isUsedByLDM = flag; }
00307 bool m_isUsedByLDM;
00308
00310 std::vector<int> m_dataIds ;
00311 SoLDM::DataSetIdPairList m_dataDsIds;
00312
00313 std::vector<DataSetInfo> m_volumeDataList;
00314 bool isInList(const SoLDM::DataSetIdPair& dsIdPair)const;
00315
00316
00317 std::vector<int> m_availBufferEntry;
00318
00319 void addToList(const SoLDM::DataSetIdPair& dsIdPair);
00320 void removeFromList(const SoLDM::DataSetIdPair& dsIdPair);
00321 void setListChange(bool val){m_listChange = val;};
00322 bool m_listChange;
00324
00325 void createLDMCore();
00326 void deleteLDMCore();
00327
00328 void setMinResolutionThreshold();
00329
00334 bool isMultiDataPossible();
00335
00337 bool m_multiDataError;
00338
00340 static int s_debugMediator;
00341
00342 private:
00343 SoLDMDataAccess& getDataAccess ( int id = -1 );
00344 SoLDMDataAccess& getDataAccess ( SoDataSet* ds );
00345
00348 SoLDMResourceManager* getResourceManager(int id);
00349
00350 SoLDMResourceParameters* getResourceParameter( int dataEntry );
00351 SoLDMResourceParameters* getFirstResourceParameter();
00352
00353 private:
00354
00355 bool m_isTileVisitorFixedRes;
00356
00357
00358
00359 typedef std::map<SbThreadId_t, SoLDMDataAccess*> t_dataAccessList;
00360
00361 t_dataAccessList m_ldmDataAccessList;
00362 SbThreadMutex* m_semDataAccessList;
00363
00364 };
00365
00366 #ifdef _MSC_VER
00367 #pragma warning( pop )
00368 #endif
00369
00370 #endif
00371
00372
00373