Changeset 13191 for OpenSceneGraph/trunk/src/osg/ImageSequence.cpp
- Timestamp:
- 05/23/13 20:29:47 (6 hours ago)
- Files:
-
- 1 modified
-
OpenSceneGraph/trunk/src/osg/ImageSequence.cpp (modified) (18 diffs)
Legend:
- Unmodified
- Added
- Removed
-
OpenSceneGraph/trunk/src/osg/ImageSequence.cpp
r13186 r13191 23 23 using namespace osg; 24 24 25 ImageSequence::ImageData::ImageData() 26 { 27 } 28 29 ImageSequence::ImageData::ImageData(const ImageData& id): 30 _filename(id._filename), 31 _image(id._image), 32 _imageRequest(id._imageRequest) 33 { 34 } 35 36 ImageSequence::ImageData& ImageSequence::ImageData::operator = (const ImageSequence::ImageData& rhs) 37 { 38 if (&rhs!=this) 39 { 40 _filename = rhs._filename; 41 _image = rhs._image; 42 _imageRequest = rhs._imageRequest; 43 } 44 return *this; 45 } 46 25 47 ImageSequence::ImageSequence() 26 48 { … … 97 119 void ImageSequence::computeTimePerImage() 98 120 { 99 if (!_fileNames.empty()) _timePerImage = _length / double(_fileNames.size()); 100 else if (!_images.empty()) _timePerImage = _length / double(_images.size()); 121 if (!_imageDataList.empty()) _timePerImage = _length / double(_imageDataList.size()); 101 122 else _timePerImage = _length; 102 123 } … … 106 127 OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex); 107 128 108 if (pos>=_ fileNames.size()) _fileNames.resize(pos);109 _ fileNames[pos]= fileName;129 if (pos>=_imageDataList.size()) _imageDataList.resize(pos); 130 _imageDataList[pos]._filename = fileName; 110 131 } 111 132 … … 113 134 { 114 135 OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex); 115 return pos<_ fileNames.size() ? _fileNames[pos]: std::string();136 return pos<_imageDataList.size() ? _imageDataList[pos]._filename : std::string(); 116 137 } 117 138 … … 119 140 { 120 141 OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex); 121 _fileNames.push_back(fileName); 142 _imageDataList.push_back(ImageData()); 143 _imageDataList.back()._filename = fileName; 122 144 computeTimePerImage(); 123 145 } … … 127 149 OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex); 128 150 129 OSG_INFO<<"ImageSequence::setImage("<<pos<<","<<image->getFileName()<<")"<<std::endl; 130 131 if (pos>=_images.size()) _images.resize(pos+1); 132 133 _images[pos] = image; 134 135 // prune from file requested list. 136 FilesRequested::iterator itr = _filesRequested.find(image->getFileName()); 137 if (itr!=_filesRequested.end()) _filesRequested.erase(itr); 151 if (pos>=_imageDataList.size()) _imageDataList.resize(pos+1); 152 153 _imageDataList[pos]._image = image; 154 _imageDataList[pos]._filename = image->getFileName(); 138 155 } 139 156 … … 141 158 { 142 159 OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex); 143 return pos<_image s.size() ? _images[pos].get() : 0;160 return pos<_imageDataList.size() ? _imageDataList[pos]._image.get() : 0; 144 161 } 145 162 … … 147 164 { 148 165 OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex); 149 return pos<_image s.size() ? _images[pos].get() : 0;166 return pos<_imageDataList.size() ? _imageDataList[pos]._image.get() : 0; 150 167 } 151 168 … … 157 174 158 175 // OSG_NOTICE<<"merging image in order expected : "<<image->getFileName()<<std::endl; 159 _images.push_back(image); 176 _imageDataList.push_back(ImageData()); 177 _imageDataList.back()._image = image; 160 178 161 179 computeTimePerImage(); … … 163 181 if (data()==0) 164 182 { 165 setImageToChild(_image s.front().get());166 } 167 } 168 169 void ImageSequence::setImageToChild( const osg::Image* image)170 { 171 // OSG_NOTICE<<"setImageToChild("<<image<<")"<<std::endl;172 183 setImageToChild(_imageDataList.size()-1); 184 } 185 } 186 187 void ImageSequence::setImageToChild(int pos) 188 { 189 190 const osg::Image* image = (pos>=0 && pos<static_cast<int>(_imageDataList.size())) ? _imageDataList[pos]._image.get() : 0; 173 191 if (image==0) return; 174 192 175 193 // check to see if data is changing, if not don't apply 176 if (image->data() == data()) return; 194 if (image->data() == data()) 195 { 196 return; 197 } 198 199 200 if (_mode==PAGE_AND_DISCARD_USED_IMAGES && _previousAppliedImageIndex>=0) 201 { 202 if (_previousAppliedImageIndex<pos) 203 { 204 OSG_INFO<<"Moving forward from "<<_previousAppliedImageIndex<<" to "<<pos<<std::endl; 205 while(_previousAppliedImageIndex<pos) 206 { 207 _imageDataList[_previousAppliedImageIndex]._image = 0; 208 OSG_INFO<<" deleting "<<_previousAppliedImageIndex<<std::endl; 209 ++_previousAppliedImageIndex; 210 } 211 } 212 else if (_previousAppliedImageIndex>pos) 213 { 214 OSG_INFO<<"Moving back from "<<_previousAppliedImageIndex<<" to "<<pos<<std::endl; 215 while(_previousAppliedImageIndex>pos) 216 { 217 _imageDataList[_previousAppliedImageIndex]._image = 0; 218 OSG_INFO<<" deleting "<<_previousAppliedImageIndex<<std::endl; 219 --_previousAppliedImageIndex; 220 } 221 } 222 } 223 224 225 _previousAppliedImageIndex = pos; 177 226 178 227 setImage(image->s(),image->t(),image->r(), … … 198 247 if (time<0.0) return 0; 199 248 int index = int(time/_timePerImage); 200 if (index>=int(_image s.size())) return int(_images.size())-1;249 if (index>=int(_imageDataList.size())) return int(_imageDataList.size())-1; 201 250 return index; 202 251 } … … 223 272 { 224 273 time = _seekTime; 274 useDirectTimeRequest = true; 225 275 _referenceTime = fs->getSimulationTime() - time/_timeMultiplier; 226 276 } … … 248 298 _seekTimeSet = false; 249 299 250 bool pruneOldImages = false; 251 252 switch(_mode) 253 { 254 case(PRE_LOAD_ALL_IMAGES): 255 { 256 if (irh && _fileNames.size()>_images.size()) 257 { 258 FileNames::iterator itr = _fileNames.begin(); 259 for(unsigned int i=0;i<_images.size();++i) ++itr; 260 261 for(; itr!=_fileNames.end(); ++itr) 262 { 263 osg::Image* image = irh->readImageFile(*itr); 264 _images.push_back(image); 265 } 266 } 267 268 irh = 0; 269 break; 270 } 271 case(PAGE_AND_RETAIN_IMAGES): 272 { 273 break; 274 } 275 case(PAGE_AND_DISCARD_USED_IMAGES): 276 { 277 pruneOldImages = true; 278 break; 300 if (irh && _mode==PRE_LOAD_ALL_IMAGES) 301 { 302 for(ImageDataList::iterator itr = _imageDataList.begin(); 303 itr != _imageDataList.end(); 304 ++itr) 305 { 306 if (!(itr->_image) && !(itr->_filename.empty())) 307 { 308 itr->_image = irh->readImageFile(itr->_filename); 309 } 279 310 } 280 311 } … … 283 314 // OSG_NOTICE<<"time= "<<time<<" _timePerImage="<<_timePerImage<<" index="<<index<<" _length="<<_length<<std::endl; 284 315 285 if (index>=int(_images.size())) index = int(_images.size())-1; 286 287 if (index>=0 && index<int(_images.size())) 288 { 289 if (pruneOldImages) 290 { 316 if (index>=int(_imageDataList.size())) index = int(_imageDataList.size())-1; 317 318 if (index>=0 && index<int(_imageDataList.size())) 319 { 320 // need to find the nearest relevant change. 321 if (!_imageDataList[index]._image) 322 { 291 323 if (_previousAppliedImageIndex<index) 292 324 { 293 325 OSG_DEBUG<<"ImageSequence::update(..) Moving forward by "<<index-_previousAppliedImageIndex<<std::endl; 294 while (index>=0 && !_image s[index].valid())326 while (index>=0 && !_imageDataList[index]._image.valid()) 295 327 { 296 328 --index; … … 300 332 { 301 333 OSG_DEBUG<<"ImageSequence::update(..) Moving back by "<<_previousAppliedImageIndex-index<<std::endl; 302 while (index<static_cast<int>(_image s.size()) && !_images[index].valid())334 while (index<static_cast<int>(_imageDataList.size()) && !_imageDataList[index]._image.valid()) 303 335 { 304 336 ++index; 305 337 } 306 338 } 339 } 340 341 if (index>=0 && index!=_previousAppliedImageIndex) 342 { 343 setImageToChild(index); 344 } 345 } 346 347 // OSG_NOTICE<<"time = "<<time<<std::endl; 348 349 if (!irh) return; 350 351 if (useDirectTimeRequest) 352 { 353 int i = int(time/_timePerImage); 354 if ((i>=int(_imageDataList.size()) || !_imageDataList[i]._image)) 355 { 356 i = osg::clampTo<int>(i, 0, _imageDataList.size()-1); 357 358 OSG_INFO<<"Requesting file, entry="<<i<<" : _fileNames[i]="<<_imageDataList[i]._filename<<std::endl; 359 irh->requestImageFile(_imageDataList[i]._filename, this, i, time, fs, _imageDataList[i]._imageRequest, _readOptions.get()); 360 } 361 } 362 else 363 { 364 double preLoadTime = time + osg::minimum(irh->getPreLoadTime()*_timeMultiplier, _length); 365 366 int startLoadIndex = int(time/_timePerImage); 367 if (startLoadIndex>=int(_imageDataList.size())) startLoadIndex = int(_imageDataList.size())-1; 368 if (startLoadIndex<0) startLoadIndex = 0; 369 370 int endLoadIndex = int(preLoadTime/_timePerImage); 371 if (endLoadIndex>=int(_imageDataList.size())) 372 { 373 if (looping) 374 { 375 endLoadIndex -= int(_imageDataList.size()); 376 } 307 377 else 308 378 { 309 // OSG_NOTICE<<"ImageSequence::update(..) Same index."<<std::endl; 310 } 311 } 312 313 if (index>=0) 314 { 315 // OSG_NOTICE<<"at time "<<time<<" setting child = "<<index<<std::endl; 316 317 if (_previousAppliedImageIndex!=index) 318 { 319 if (_previousAppliedImageIndex >= 0 && 320 _previousAppliedImageIndex<int(_images.size()) && 321 pruneOldImages) 379 endLoadIndex = int(_imageDataList.size())-1; 380 } 381 } 382 if (endLoadIndex<0) endLoadIndex = 0; 383 384 double requestTime = time; 385 386 if (endLoadIndex<startLoadIndex) 387 { 388 for(int i=startLoadIndex; i<int(_imageDataList.size()); ++i) 389 { 390 if (!_imageDataList[i]._image) 322 391 { 323 _images[_previousAppliedImageIndex] = 0; 324 } 325 326 setImageToChild(_images[index].get()); 327 328 _previousAppliedImageIndex = index; 329 } 330 } 331 } 332 333 // OSG_NOTICE<<"time = "<<time<<std::endl; 334 335 if (!irh) return; 336 337 if (useDirectTimeRequest) 338 { 339 int i = int(time/_timePerImage); 340 if ((i>=int(_images.size()) || !_images[i])) 341 { 342 i = osg::clampTo<int>(i, 0, _fileNames.size()-1); 343 if (_filesRequested.count(_fileNames[i])==0) 344 { 345 OSG_INFO<<"Requesting file, entry="<<i<<" : _fileNames[i]="<<_fileNames[i]<<std::endl; 346 //_filesRequested.insert(_fileNames[i]); 347 irh->requestImageFile(_fileNames[i], this, i, time, fs); 348 } 349 else 350 { 351 OSG_DEBUG<<"File already requested, entry="<<i<<" : _fileNames[i]="<<_fileNames[i]<<std::endl; 352 } 353 } 354 } 355 else 356 { 357 double preLoadTime = time + osg::minimum(irh->getPreLoadTime()*_timeMultiplier, _length); 358 359 int startLoadIndex = int(time/_timePerImage); 360 if (startLoadIndex>=int(_images.size())) startLoadIndex = int(_images.size())-1; 361 if (startLoadIndex<0) startLoadIndex = 0; 362 363 int endLoadIndex = int(preLoadTime/_timePerImage); 364 if (endLoadIndex>=int(_fileNames.size())) 365 { 366 if (looping) 367 { 368 endLoadIndex -= int(_fileNames.size()); 369 } 370 else 371 { 372 endLoadIndex = int(_fileNames.size())-1; 373 } 374 } 375 if (endLoadIndex<0) endLoadIndex = 0; 376 377 double requestTime = time; 378 379 if (endLoadIndex<startLoadIndex) 380 { 381 for(int i=startLoadIndex; i<int(_fileNames.size()); ++i) 382 { 383 if ((i>=int(_images.size()) || !_images[i]) && _filesRequested.count(_fileNames[i])==0) 384 { 385 //_filesRequested.insert(_fileNames[i]); 386 irh->requestImageFile(_fileNames[i], this, i, requestTime, fs); 392 irh->requestImageFile(_imageDataList[i]._filename, this, i, requestTime, fs, _imageDataList[i]._imageRequest, _readOptions.get()); 387 393 } 388 394 requestTime += _timePerImage; … … 391 397 for(int i=0; i<=endLoadIndex; ++i) 392 398 { 393 if ( (i>=int(_images.size()) || !_images[i]) && _filesRequested.count(_fileNames[i])==0)399 if (!_imageDataList[i]._image) 394 400 { 395 //_filesRequested.insert(_fileNames[i]); 396 irh->requestImageFile(_fileNames[i], this, i, requestTime, fs); 401 irh->requestImageFile(_imageDataList[i]._filename, this, i, requestTime, fs, _imageDataList[i]._imageRequest, _readOptions.get()); 397 402 } 398 403 requestTime += _timePerImage; … … 403 408 for(int i=startLoadIndex; i<=endLoadIndex; ++i) 404 409 { 405 if ( (i>=int(_images.size()) || !_images[i]) && _filesRequested.count(_fileNames[i])==0)410 if (!_imageDataList[i]._image) 406 411 { 407 //_filesRequested.insert(_fileNames[i]); 408 irh->requestImageFile(_fileNames[i], this, i, requestTime, fs); 412 irh->requestImageFile(_imageDataList[i]._filename, this, i, requestTime, fs, _imageDataList[i]._imageRequest, _readOptions.get()); 409 413 } 410 414 requestTime += _timePerImage; … … 412 416 } 413 417 414 415 } 416 417 } 418 } 419 420 }
