Changeset 8682
- Timestamp:
- 07/25/08 15:45:07
- Files:
-
- OpenSceneGraph/trunk/include/osg/ImageSequence (modified) (1 diff)
- OpenSceneGraph/trunk/include/osgDB/ImagePager (modified) (2 diffs)
- OpenSceneGraph/trunk/src/osg/ImageSequence.cpp (modified) (3 diffs)
- OpenSceneGraph/trunk/src/osgDB/ImagePager.cpp (modified) (5 diffs)
- OpenSceneGraph/trunk/src/osgPlugins/ive/CMakeLists.txt (modified) (2 diffs)
- OpenSceneGraph/trunk/src/osgPlugins/ive/DataInputStream.cpp (modified) (2 diffs)
- OpenSceneGraph/trunk/src/osgPlugins/ive/DataInputStream.h (modified) (1 diff)
- OpenSceneGraph/trunk/src/osgPlugins/ive/DataOutputStream.cpp (modified) (2 diffs)
- OpenSceneGraph/trunk/src/osgPlugins/ive/DataOutputStream.h (modified) (1 diff)
- OpenSceneGraph/trunk/src/osgPlugins/ive/ImageSequence.cpp (added)
- OpenSceneGraph/trunk/src/osgPlugins/ive/ImageSequence.h (added)
- OpenSceneGraph/trunk/src/osgPlugins/ive/IveVersion.h (modified) (1 diff)
- OpenSceneGraph/trunk/src/osgPlugins/ive/ReadWrite.h (modified) (1 diff)
- OpenSceneGraph/trunk/src/osgPlugins/ive/Texture1D.cpp (modified) (2 diffs)
- OpenSceneGraph/trunk/src/osgPlugins/ive/Texture2D.cpp (modified) (2 diffs)
- OpenSceneGraph/trunk/src/osgPlugins/ive/Texture3D.cpp (modified) (2 diffs)
- OpenSceneGraph/trunk/src/osgPlugins/ive/TextureCubeMap.cpp (modified) (2 diffs)
- OpenSceneGraph/trunk/src/osgPlugins/ive/TextureRectangle.cpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
OpenSceneGraph/trunk/include/osg/ImageSequence
r8663 r8682 106 106 Images::iterator _imageIterator; 107 107 double _imageIteratorTime; 108 109 typedef std::pair< std::string, osg::ref_ptr<osg::Image> > FileNameImagePair; 110 typedef std::list< FileNameImagePair > FileNameImageList; 111 112 FileNameImageList _filesRequested; 108 113 109 114 }; OpenSceneGraph/trunk/include/osgDB/ImagePager
r8666 r8682 67 67 std::string _name; 68 68 }; 69 70 71 ImageThread* getImageThread(unsigned int i) { return _imageThreads[i].get(); } 72 73 const ImageThread* getImageThread(unsigned int i) const { return _imageThreads[i].get(); } 74 75 unsigned int getNumImageThreads() const { return _imageThreads.size(); } 76 69 77 70 78 virtual void requestImageFile(const std::string& fileName,osg::Object* attachmentPoint, double timeToMergeBy, const osg::FrameStamp* framestamp); … … 145 153 146 154 osg::ref_ptr<ReadQueue> _readQueue; 147 osg::ref_ptr<ImageThread> _imageThread;148 155 156 typedef std::vector< osg::ref_ptr<ImageThread> > ImageThreads; 157 ImageThreads _imageThreads; 158 159 osg::ref_ptr<RequestQueue> _completedQueue; 149 160 }; 150 161 OpenSceneGraph/trunk/src/osg/ImageSequence.cpp
r8663 r8682 104 104 { 105 105 OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex); 106 _images.push_back(image); 106 107 if (!_filesRequested.empty()) 108 { 109 // follows is a mechanism that ensures that requested images 110 // get merged in the correct time order. 111 if (_filesRequested.front().first != image->getFileName()) 112 { 113 for(FileNameImageList::iterator itr = _filesRequested.begin(); 114 itr != _filesRequested.end(); 115 ++itr) 116 { 117 if (itr->first == image->getFileName()) 118 { 119 osg::notify(osg::NOTICE)<<"inserting image into waiting stake : "<<image->getFileName()<<std::endl; 120 itr->second = image; 121 return; 122 } 123 } 124 // osg::notify(osg::NOTICE)<<"image not expected : "<<image->getFileName()<<std::endl; 125 _images.push_back(image); 126 } 127 else 128 { 129 // osg::notify(osg::NOTICE)<<"merging image in order expected : "<<image->getFileName()<<std::endl; 130 _images.push_back(image); 131 132 _filesRequested.pop_front(); 133 134 FileNameImageList::iterator itr; 135 for(itr = _filesRequested.begin(); 136 itr != _filesRequested.end() && itr->second.valid(); 137 ++itr) 138 { 139 // osg::notify(osg::NOTICE)<<" merging previously loaded, but out of order file : "<<itr->first<<std::endl; 140 _images.push_back(itr->second); 141 } 142 143 _filesRequested.erase(_filesRequested.begin(), itr); 144 } 145 } 146 else 147 { 148 _images.push_back(image); 149 } 150 107 151 computeTimePerImage(); 108 109 if ( _imageIterator==_images.end())152 153 if (data()==0) 110 154 { 111 155 _imageIterator = _images.begin(); … … 170 214 { 171 215 _fileNamesIteratorTime += _timePerImage; 172 osg::notify(osg::NOTICE)<<" _fileNamesIteratorTime = "<<_fileNamesIteratorTime<<std::endl;173 osg::notify(osg::NOTICE)<<" need to preLoad = "<<*_fileNamesIterator<<std::endl;216 //osg::notify(osg::NOTICE)<<" _fileNamesIteratorTime = "<<_fileNamesIteratorTime<<std::endl; 217 //osg::notify(osg::NOTICE)<<" need to preLoad = "<<*_fileNamesIterator<<std::endl; 174 218 ++_fileNamesIterator; 175 219 … … 182 226 } 183 227 228 _filesRequested.push_back(FileNameImagePair(*_fileNamesIterator,0)); 184 229 irh->requestImageFile(*_fileNamesIterator, this, _fileNamesIteratorTime, fs); 185 230 OpenSceneGraph/trunk/src/osgDB/ImagePager.cpp
r8666 r8682 200 200 else 201 201 { 202 osg::Texture* texture = dynamic_cast<osg::Texture*>(imageRequest->_objectToAttachTo.get()); 203 if (texture) 204 { 205 texture->setImage(0, image.get()); 206 } 202 imageRequest->_loadedImage = image; 203 204 OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_pager->_completedQueue->_requestMutex); 205 _pager->_completedQueue->_requestList.push_back(imageRequest); 207 206 } 208 207 } 209 208 210 209 } 211 212 210 else 213 211 { … … 243 241 244 242 _readQueue = new ReadQueue(this,"Image Queue"); 245 _imageThread = new ImageThread(this, ImageThread::HANDLE_ALL_REQUESTS, "Image Thread"); 243 _completedQueue = new RequestQueue; 244 _imageThreads.push_back(new ImageThread(this, ImageThread::HANDLE_ALL_REQUESTS, "Image Thread 1")); 245 _imageThreads.push_back(new ImageThread(this, ImageThread::HANDLE_ALL_REQUESTS, "Image Thread 2")); 246 _imageThreads.push_back(new ImageThread(this, ImageThread::HANDLE_ALL_REQUESTS, "Image Thread 3")); 246 247 } 247 248 … … 255 256 int result = 0; 256 257 257 _imageThread->setDone(true); 258 for(ImageThreads::iterator itr = _imageThreads.begin(); 259 itr != _imageThreads.end(); 260 ++itr) 261 { 262 (*itr)->setDone(true); 263 } 258 264 259 265 // release the frameBlock and _databasePagerThreadBlock in case its holding up thread cancellation. 260 266 _readQueue->release(); 261 267 262 _imageThread->cancel(); 268 for(ImageThreads::iterator itr = _imageThreads.begin(); 269 itr != _imageThreads.end(); 270 ++itr) 271 { 272 (*itr)->cancel(); 273 } 263 274 264 275 _done = true; … … 290 301 _startThreadCalled = true; 291 302 _done = false; 292 _imageThread->startThread();293 303 304 for(ImageThreads::iterator itr = _imageThreads.begin(); 305 itr != _imageThreads.end(); 306 ++itr) 307 { 308 (*itr)->startThread(); 309 } 310 294 311 } 295 312 } … … 299 316 { 300 317 //osg::notify(osg::NOTICE)<<"ImagePager::requiresUpdateSceneGraph()"<<std::endl; 301 return false;318 return !(_completedQueue->_requestList.empty()); 302 319 } 303 320 304 321 void ImagePager::updateSceneGraph(double currentFrameTime) 305 322 { 306 //osg::notify(osg::NOTICE)<<"ImagePager::updateSceneGraph(double currentFrameTime)"<<std::endl; 307 } 308 323 OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_completedQueue->_requestMutex); 324 325 for(RequestQueue::RequestList::iterator itr = _completedQueue->_requestList.begin(); 326 itr != _completedQueue->_requestList.end(); 327 ++itr) 328 { 329 ImageRequest* imageRequest = itr->get(); 330 osg::Texture* texture = dynamic_cast<osg::Texture*>(imageRequest->_objectToAttachTo.get()); 331 if (texture) 332 { 333 texture->setImage(0, imageRequest->_loadedImage.get()); 334 } 335 else 336 { 337 osg::notify(osg::NOTICE)<<"ImagePager::updateSceneGraph() : error, image request attachment type not handled yet."<<std::endl; 338 } 339 } 340 341 _completedQueue->_requestList.clear(); 342 } 343 OpenSceneGraph/trunk/src/osgPlugins/ive/CMakeLists.txt
r8521 r8682 47 47 HeightFieldLayer.cpp 48 48 Image.cpp 49 ImageSequence.cpp 49 50 ImageLayer.cpp 50 51 Impostor.cpp … … 154 155 HeightFieldLayer.h 155 156 Image.h 157 ImageSequence.h 156 158 ImageLayer.h 157 159 Impostor.h OpenSceneGraph/trunk/src/osgPlugins/ive/DataInputStream.cpp
r8565 r8682 51 51 #include "Scissor.h" 52 52 #include "Image.h" 53 #include "ImageSequence.h" 53 54 #include "PointSprite.h" 54 55 #include "Multisample.h" … … 955 956 956 957 return image; 958 } 959 960 osg::Image* DataInputStream::readImage() 961 { 962 if ( getVersion() >= VERSION_0029 ) 963 { 964 int id = peekInt(); 965 if(id == IVEIMAGESEQUENCE) 966 { 967 osg::ImageSequence* image = new osg::ImageSequence(); 968 ((ive::ImageSequence*)image)->read(this); 969 return image; 970 } 971 else 972 { 973 readInt(); 974 IncludeImageMode includeImg = (IncludeImageMode)readChar(); 975 return readImage(includeImg); 976 } 977 } 978 else 979 { 980 IncludeImageMode includeImg = (IncludeImageMode)readChar(); 981 return readImage(includeImg); 982 } 957 983 } 958 984 OpenSceneGraph/trunk/src/osgPlugins/ive/DataInputStream.h
r7999 r8682 92 92 osg::Image* readImage(std::string s); 93 93 osg::Image* readImage(IncludeImageMode mode); 94 osg::Image* readImage(); 94 95 osg::StateSet* readStateSet(); 95 96 osg::StateAttribute* readStateAttribute(); OpenSceneGraph/trunk/src/osgPlugins/ive/DataOutputStream.cpp
r8565 r8682 54 54 #include "Scissor.h" 55 55 #include "Image.h" 56 #include "ImageSequence.h" 56 57 #include "PointSprite.h" 57 58 #include "Multisample.h" … … 1095 1096 } 1096 1097 1098 void DataOutputStream::writeImage(osg::Image *image) 1099 { 1100 if ( getVersion() >= VERSION_0029) 1101 { 1102 osg::ImageSequence* is = dynamic_cast<osg::ImageSequence*>(image); 1103 if (is) 1104 { 1105 ((ive::ImageSequence*)(is))->write(this); 1106 } 1107 else 1108 { 1109 writeInt(IVEIMAGE); 1110 writeChar(getIncludeImageMode()); 1111 writeImage(getIncludeImageMode(),image); 1112 } 1113 } 1114 else 1115 { 1116 writeChar(getIncludeImageMode()); 1117 writeImage(getIncludeImageMode(),image); 1118 } 1119 } 1120 1097 1121 void DataOutputStream::writeImage(IncludeImageMode mode, osg::Image *image) 1098 1122 { OpenSceneGraph/trunk/src/osgPlugins/ive/DataOutputStream.h
r7999 r8682 95 95 void writeNode(const osg::Node* sa); 96 96 void writeImage(IncludeImageMode mode, osg::Image *image); 97 void writeImage(osg::Image *image); 97 98 98 99 void writeLayer(const osgTerrain::Layer* layer); OpenSceneGraph/trunk/src/osgPlugins/ive/IveVersion.h
r8521 r8682 38 38 #define VERSION_0027 27 39 39 #define VERSION_0028 28 40 #define VERSION_0029 29 40 41 41 #define VERSION VERSION_002 842 #define VERSION VERSION_0029 42 43 43 44 /* The BYTE_SEX tag is used to check the endian OpenSceneGraph/trunk/src/osgPlugins/ive/ReadWrite.h
r8521 r8682 39 39 #define IVEAUTOTRANSFORM 0x00000030 40 40 #define IVEOCCLUSIONQUERYNODE 0x00000031 41 #define IVEIMAGESEQUENCE 0x00000032 41 42 42 43 // Node callbacks OpenSceneGraph/trunk/src/osgPlugins/ive/Texture1D.cpp
r5013 r8682 34 34 35 35 // Should we include images date in stream 36 IncludeImageMode includeImg = out->getIncludeImageMode(); 37 out->writeChar(includeImg); 38 39 out->writeImage(includeImg,getImage()); 36 out->writeImage(getImage()); 40 37 } 41 38 … … 56 53 57 54 // Should we read image data from stream 58 IncludeImageMode includeImg = (IncludeImageMode)in->readChar(); 59 60 osg::Image *image = in->readImage(includeImg); 55 osg::Image *image = in->readImage(); 61 56 if(image) { 62 57 setImage(image); OpenSceneGraph/trunk/src/osgPlugins/ive/Texture2D.cpp
r5013 r8682 34 34 35 35 // Should we include images date in stream 36 IncludeImageMode includeImg = out->getIncludeImageMode(); 37 out->writeChar(includeImg); 38 39 out->writeImage(includeImg,getImage()); 36 out->writeImage(getImage()); 40 37 } 41 38 … … 55 52 // Read image. 56 53 57 // Should we read image data from stream 58 IncludeImageMode includeImg = (IncludeImageMode)in->readChar(); 59 60 osg::Image *image = in->readImage(includeImg); 54 osg::Image *image = in->readImage(); 61 55 if(image) { 62 56 setImage(image); OpenSceneGraph/trunk/src/osgPlugins/ive/Texture3D.cpp
r5013 r8682 34 34 35 35 // Should we include images date in stream 36 IncludeImageMode includeImg = out->getIncludeImageMode(); 37 out->writeChar(includeImg); 38 39 out->writeImage(includeImg,getImage()); 36 out->writeImage(getImage()); 40 37 } 41 38 … … 56 53 57 54 // Should we read image data from stream 58 IncludeImageMode includeImg = (IncludeImageMode)in->readChar(); 59 60 osg::Image *image = in->readImage(includeImg); 55 osg::Image *image = in->readImage(); 61 56 if(image) { 62 57 setImage(image); OpenSceneGraph/trunk/src/osgPlugins/ive/TextureCubeMap.cpp
r5013 r8682 39 39 out->writeInt(getNumMipmapLevels()); 40 40 41 // Should we include images date in stream 42 IncludeImageMode includeImg = out->getIncludeImageMode(); 43 out->writeChar(includeImg); 41 if (out->getVersion() >= VERSION_0029) 42 { 43 out->writeImage(getImage(osg::TextureCubeMap::POSITIVE_X)); 44 out->writeImage(getImage(osg::TextureCubeMap::NEGATIVE_X)); 45 out->writeImage(getImage(osg::TextureCubeMap::POSITIVE_Y)); 46 out->writeImage(getImage(osg::TextureCubeMap::NEGATIVE_Y)); 47 out->writeImage(getImage(osg::TextureCubeMap::POSITIVE_Z)); 48 out->writeImage(getImage(osg::TextureCubeMap::NEGATIVE_Z)); 49 } 50 else 51 { 52 // Should we include images date in stream 53 IncludeImageMode includeImg = out->getIncludeImageMode(); 54 out->writeChar(includeImg); 44 55 45 out->writeImage(includeImg,getImage(osg::TextureCubeMap::POSITIVE_X)); 46 out->writeImage(includeImg,getImage(osg::TextureCubeMap::NEGATIVE_X)); 47 out->writeImage(includeImg,getImage(osg::TextureCubeMap::POSITIVE_Y)); 48 out->writeImage(includeImg,getImage(osg::TextureCubeMap::NEGATIVE_Y)); 49 out->writeImage(includeImg,getImage(osg::TextureCubeMap::POSITIVE_Z)); 50 out->writeImage(includeImg,getImage(osg::TextureCubeMap::NEGATIVE_Z)); 56 out->writeImage(includeImg,getImage(osg::TextureCubeMap::POSITIVE_X)); 57 out->writeImage(includeImg,getImage(osg::TextureCubeMap::NEGATIVE_X)); 58 out->writeImage(includeImg,getImage(osg::TextureCubeMap::POSITIVE_Y)); 59 out->writeImage(includeImg,getImage(osg::TextureCubeMap::NEGATIVE_Y)); 60 out->writeImage(includeImg,getImage(osg::TextureCubeMap::POSITIVE_Z)); 61 out->writeImage(includeImg,getImage(osg::TextureCubeMap::NEGATIVE_Z)); 62 } 51 63 } 52 64 … … 75 87 setNumMipmapLevels((unsigned int)in->readInt()); 76 88 77 // Should we read image data from stream 78 IncludeImageMode includeImg = (IncludeImageMode)in->readChar(); 89 if (in->getVersion() >= VERSION_0029) 90 { 91 setImage(osg::TextureCubeMap::POSITIVE_X,in->readImage()); 92 setImage(osg::TextureCubeMap::NEGATIVE_X,in->readImage()); 93 setImage(osg::TextureCubeMap::POSITIVE_Y,in->readImage()); 94 setImage(osg::TextureCubeMap::NEGATIVE_Y,in->readImage()); 95 setImage(osg::TextureCubeMap::POSITIVE_Z,in->readImage()); 96 setImage(osg::TextureCubeMap::NEGATIVE_Z,in->readImage()); 97 } 98 else 99 { 100 // Should we read image data from stream 101 IncludeImageMode includeImg = (IncludeImageMode)in->readChar(); 79 102 80 setImage(osg::TextureCubeMap::POSITIVE_X,in->readImage(includeImg)); 81 setImage(osg::TextureCubeMap::NEGATIVE_X,in->readImage(includeImg)); 82 setImage(osg::TextureCubeMap::POSITIVE_Y,in->readImage(includeImg)); 83 setImage(osg::TextureCubeMap::NEGATIVE_Y,in->readImage(includeImg)); 84 setImage(osg::TextureCubeMap::POSITIVE_Z,in->readImage(includeImg)); 85 setImage(osg::TextureCubeMap::NEGATIVE_Z,in->readImage(includeImg)); 103 setImage(osg::TextureCubeMap::POSITIVE_X,in->readImage(includeImg)); 104 setImage(osg::TextureCubeMap::NEGATIVE_X,in->readImage(includeImg)); 105 setImage(osg::TextureCubeMap::POSITIVE_Y,in->readImage(includeImg)); 106 setImage(osg::TextureCubeMap::NEGATIVE_Y,in->readImage(includeImg)); 107 setImage(osg::TextureCubeMap::POSITIVE_Z,in->readImage(includeImg)); 108 setImage(osg::TextureCubeMap::NEGATIVE_Z,in->readImage(includeImg)); 109 } 86 110 87 111 } OpenSceneGraph/trunk/src/osgPlugins/ive/TextureRectangle.cpp
r5013 r8682 34 34 35 35 // Should we include images date in stream 36 IncludeImageMode includeImg = out->getIncludeImageMode(); 37 out->writeChar(includeImg); 38 39 out->writeImage(includeImg,getImage()); 36 out->writeImage(getImage()); 40 37 } 41 38 … … 56 53 57 54 // Should we read image data from stream 58 IncludeImageMode includeImg = (IncludeImageMode)in->readChar(); 59 60 osg::Image *image = in->readImage(includeImg); 55 osg::Image *image = in->readImage(); 61 56 if(image) { 62 57 setImage(image);
