Changeset 8682

Show
Ignore:
Timestamp:
07/25/08 15:45:07
Author:
robert
Message:

Added ImageSequence? to .ive plugin, added support for multiple ImageThreads? in osgDB::ImagePager?

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • OpenSceneGraph/trunk/include/osg/ImageSequence

    r8663 r8682  
    106106        Images::iterator                _imageIterator; 
    107107        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; 
    108113 
    109114}; 
  • OpenSceneGraph/trunk/include/osgDB/ImagePager

    r8666 r8682  
    6767            std::string     _name; 
    6868        }; 
     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         
    6977 
    7078        virtual void requestImageFile(const std::string& fileName,osg::Object* attachmentPoint, double timeToMergeBy, const osg::FrameStamp* framestamp); 
     
    145153         
    146154        osg::ref_ptr<ReadQueue>     _readQueue; 
    147         osg::ref_ptr<ImageThread>   _imageThread; 
    148155         
     156        typedef std::vector< osg::ref_ptr<ImageThread> > ImageThreads; 
     157        ImageThreads                _imageThreads; 
     158         
     159        osg::ref_ptr<RequestQueue>  _completedQueue; 
    149160}; 
    150161 
  • OpenSceneGraph/trunk/src/osg/ImageSequence.cpp

    r8663 r8682  
    104104{ 
    105105    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 
    107151    computeTimePerImage(); 
    108  
    109     if (_imageIterator==_images.end()
     152     
     153    if (data()==0
    110154    { 
    111155        _imageIterator = _images.begin(); 
     
    170214            { 
    171215                _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; 
    174218                ++_fileNamesIterator; 
    175219 
     
    182226                } 
    183227 
     228                _filesRequested.push_back(FileNameImagePair(*_fileNamesIterator,0)); 
    184229                irh->requestImageFile(*_fileNamesIterator, this, _fileNamesIteratorTime, fs); 
    185230 
  • OpenSceneGraph/trunk/src/osgDB/ImagePager.cpp

    r8666 r8682  
    200200                else 
    201201                { 
    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); 
    207206                } 
    208207            } 
    209208 
    210209        } 
    211  
    212210        else 
    213211        { 
     
    243241     
    244242    _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")); 
    246247} 
    247248 
     
    255256    int result = 0; 
    256257 
    257     _imageThread->setDone(true); 
     258    for(ImageThreads::iterator itr = _imageThreads.begin(); 
     259        itr != _imageThreads.end(); 
     260        ++itr) 
     261    { 
     262        (*itr)->setDone(true); 
     263    } 
    258264 
    259265    // release the frameBlock and _databasePagerThreadBlock in case its holding up thread cancellation. 
    260266    _readQueue->release(); 
    261267 
    262     _imageThread->cancel(); 
     268    for(ImageThreads::iterator itr = _imageThreads.begin(); 
     269        itr != _imageThreads.end(); 
     270        ++itr) 
     271    { 
     272        (*itr)->cancel(); 
     273    } 
    263274 
    264275    _done = true; 
     
    290301            _startThreadCalled = true; 
    291302            _done = false; 
    292             _imageThread->startThread(); 
    293303             
     304            for(ImageThreads::iterator itr = _imageThreads.begin(); 
     305                itr != _imageThreads.end(); 
     306                ++itr) 
     307            { 
     308                (*itr)->startThread(); 
     309            } 
     310             
    294311        } 
    295312    } 
     
    299316{ 
    300317    //osg::notify(osg::NOTICE)<<"ImagePager::requiresUpdateSceneGraph()"<<std::endl; 
    301     return false
     318    return !(_completedQueue->_requestList.empty())
    302319} 
    303320 
    304321void ImagePager::updateSceneGraph(double currentFrameTime) 
    305322{ 
    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  
    4747    HeightFieldLayer.cpp 
    4848    Image.cpp 
     49    ImageSequence.cpp 
    4950    ImageLayer.cpp 
    5051    Impostor.cpp 
     
    154155    HeightFieldLayer.h 
    155156    Image.h 
     157    ImageSequence.h 
    156158    ImageLayer.h 
    157159    Impostor.h 
  • OpenSceneGraph/trunk/src/osgPlugins/ive/DataInputStream.cpp

    r8565 r8682  
    5151#include "Scissor.h" 
    5252#include "Image.h" 
     53#include "ImageSequence.h" 
    5354#include "PointSprite.h" 
    5455#include "Multisample.h" 
     
    955956     
    956957    return image; 
     958} 
     959 
     960osg::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    } 
    957983} 
    958984 
  • OpenSceneGraph/trunk/src/osgPlugins/ive/DataInputStream.h

    r7999 r8682  
    9292    osg::Image* readImage(std::string s); 
    9393    osg::Image* readImage(IncludeImageMode mode); 
     94    osg::Image* readImage(); 
    9495    osg::StateSet* readStateSet(); 
    9596    osg::StateAttribute* readStateAttribute(); 
  • OpenSceneGraph/trunk/src/osgPlugins/ive/DataOutputStream.cpp

    r8565 r8682  
    5454#include "Scissor.h" 
    5555#include "Image.h" 
     56#include "ImageSequence.h" 
    5657#include "PointSprite.h" 
    5758#include "Multisample.h" 
     
    10951096} 
    10961097 
     1098void 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 
    10971121void DataOutputStream::writeImage(IncludeImageMode mode, osg::Image *image) 
    10981122{ 
  • OpenSceneGraph/trunk/src/osgPlugins/ive/DataOutputStream.h

    r7999 r8682  
    9595    void writeNode(const osg::Node* sa); 
    9696    void writeImage(IncludeImageMode mode, osg::Image *image); 
     97    void writeImage(osg::Image *image); 
    9798 
    9899    void writeLayer(const osgTerrain::Layer* layer); 
  • OpenSceneGraph/trunk/src/osgPlugins/ive/IveVersion.h

    r8521 r8682  
    3838#define VERSION_0027 27 
    3939#define VERSION_0028 28 
     40#define VERSION_0029 29 
    4041 
    41 #define VERSION VERSION_0028 
     42#define VERSION VERSION_0029 
    4243 
    4344/* The BYTE_SEX tag is used to check the endian 
  • OpenSceneGraph/trunk/src/osgPlugins/ive/ReadWrite.h

    r8521 r8682  
    3939#define IVEAUTOTRANSFORM                0x00000030 
    4040#define IVEOCCLUSIONQUERYNODE           0x00000031 
     41#define IVEIMAGESEQUENCE                0x00000032 
    4142 
    4243// Node callbacks 
  • OpenSceneGraph/trunk/src/osgPlugins/ive/Texture1D.cpp

    r5013 r8682  
    3434 
    3535    // 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()); 
    4037} 
    4138 
     
    5653         
    5754        // 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(); 
    6156        if(image) { 
    6257            setImage(image); 
  • OpenSceneGraph/trunk/src/osgPlugins/ive/Texture2D.cpp

    r5013 r8682  
    3434 
    3535    // 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()); 
    4037} 
    4138 
     
    5552        // Read image. 
    5653         
    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(); 
    6155        if(image) { 
    6256            setImage(image); 
  • OpenSceneGraph/trunk/src/osgPlugins/ive/Texture3D.cpp

    r5013 r8682  
    3434 
    3535    // 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()); 
    4037} 
    4138 
     
    5653         
    5754        // 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(); 
    6156        if(image) { 
    6257            setImage(image); 
  • OpenSceneGraph/trunk/src/osgPlugins/ive/TextureCubeMap.cpp

    r5013 r8682  
    3939    out->writeInt(getNumMipmapLevels()); 
    4040 
    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); 
    4455 
    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    } 
    5163} 
    5264 
     
    7587        setNumMipmapLevels((unsigned int)in->readInt()); 
    7688 
    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(); 
    79102 
    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        } 
    86110         
    87111    } 
  • OpenSceneGraph/trunk/src/osgPlugins/ive/TextureRectangle.cpp

    r5013 r8682  
    3434 
    3535    // 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()); 
    4037} 
    4138 
     
    5653         
    5754        // 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(); 
    6156        if(image) { 
    6257            setImage(image);