Show
Ignore:
Timestamp:
05/25/08 23:35:39 (7 years ago)
Author:
robert
Message:

Added option for controlling whether the front buffer is read at the start of the
frame or the back buffer at the end of the frame.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/examples/osgscreencapture/osgscreencapture.cpp

    r8334 r8338  
    4444        }; 
    4545     
     46        enum FramePosition 
     47        { 
     48            START_FRAME, 
     49            END_FRAME 
     50        }; 
     51     
    4652        struct ContextData : public osg::Referenced 
    4753        { 
    4854         
    49             ContextData(osg::GraphicsContext* gc, Mode mode, const std::string& name): 
     55            ContextData(osg::GraphicsContext* gc, Mode mode, FramePosition position, const std::string& name): 
    5056                _gc(gc), 
    5157                _mode(mode), 
     58                _position(position), 
    5259                _fileName(name), 
    5360                _pixelFormat(GL_BGR), 
     
    126133            osg::GraphicsContext*   _gc; 
    127134            Mode                    _mode; 
     135            FramePosition           _position; 
    128136            std::string             _fileName; 
    129137             
     
    140148        }; 
    141149     
    142         WindowCaptureCallback(Mode mode): 
    143             _mode(mode) 
    144         { 
    145         } 
     150        WindowCaptureCallback(Mode mode, FramePosition position): 
     151            _mode(mode), 
     152            _position(position) 
     153        { 
     154        } 
     155 
     156        FramePosition getFramePosition() const { return _position; } 
    146157 
    147158        ContextData* createContextData(osg::GraphicsContext* gc) const 
     
    149160            std::stringstream filename; 
    150161            filename << "test_"<<_contextDataMap.size()<<".jpg"; 
    151             return new ContextData(gc, _mode, filename.str()); 
     162            return new ContextData(gc, _mode, _position, filename.str()); 
    152163        } 
    153164         
     
    163174        virtual void operator () (osg::RenderInfo& renderInfo) const 
    164175        { 
     176            if (_position==START_FRAME) 
     177            { 
     178                glReadBuffer(GL_FRONT); 
     179            } 
     180            else 
     181            { 
     182                glReadBuffer(GL_BACK); 
     183            } 
     184 
    165185            osg::GraphicsContext* gc = renderInfo.getState()->getGraphicsContext(); 
    166186            osg::ref_ptr<ContextData> cd = getContextData(gc); 
     
    171191 
    172192        Mode                        _mode;         
     193        FramePosition               _position; 
    173194        mutable OpenThreads::Mutex  _mutex; 
    174195        mutable ContextDataMap      _contextDataMap; 
     
    375396void addCallbackToViewer(osgViewer::ViewerBase& viewer, WindowCaptureCallback* callback) 
    376397{ 
    377     osgViewer::ViewerBase::Windows windows; 
    378     viewer.getWindows(windows); 
    379     for(osgViewer::ViewerBase::Windows::iterator itr = windows.begin(); 
    380         itr != windows.end(); 
    381         ++itr) 
    382     { 
    383         osgViewer::GraphicsWindow* window = *itr; 
    384         osg::GraphicsContext::Cameras& cameras = window->getCameras(); 
    385         osg::Camera* lastCamera = 0; 
    386         for(osg::GraphicsContext::Cameras::iterator cam_itr = cameras.begin(); 
    387             cam_itr != cameras.end(); 
    388             ++cam_itr) 
    389         { 
     398     
     399    if (callback->getFramePosition()==WindowCaptureCallback::START_FRAME) 
     400    { 
     401        osgViewer::ViewerBase::Windows windows; 
     402        viewer.getWindows(windows); 
     403        for(osgViewer::ViewerBase::Windows::iterator itr = windows.begin(); 
     404            itr != windows.end(); 
     405            ++itr) 
     406        { 
     407            osgViewer::GraphicsWindow* window = *itr; 
     408            osg::GraphicsContext::Cameras& cameras = window->getCameras(); 
     409            osg::Camera* firstCamera = 0; 
     410            for(osg::GraphicsContext::Cameras::iterator cam_itr = cameras.begin(); 
     411                cam_itr != cameras.end(); 
     412                ++cam_itr) 
     413            { 
     414                if (firstCamera) 
     415                { 
     416                    if ((*cam_itr)->getRenderOrder() < firstCamera->getRenderOrder()) 
     417                    { 
     418                        firstCamera = (*cam_itr); 
     419                    } 
     420                    if ((*cam_itr)->getRenderOrder() == firstCamera->getRenderOrder() && 
     421                        (*cam_itr)->getRenderOrderNum() < firstCamera->getRenderOrderNum()) 
     422                    { 
     423                        firstCamera = (*cam_itr); 
     424                    } 
     425                } 
     426                else 
     427                { 
     428                    firstCamera = *cam_itr; 
     429                } 
     430            } 
     431 
     432            if (firstCamera) 
     433            { 
     434                osg::notify(osg::NOTICE)<<"First camera "<<firstCamera<<std::endl; 
     435 
     436                firstCamera->setFinalDrawCallback(callback); 
     437            } 
     438            else 
     439            { 
     440                osg::notify(osg::NOTICE)<<"No camera found"<<std::endl; 
     441            } 
     442        } 
     443    } 
     444    else 
     445    {     
     446        osgViewer::ViewerBase::Windows windows; 
     447        viewer.getWindows(windows); 
     448        for(osgViewer::ViewerBase::Windows::iterator itr = windows.begin(); 
     449            itr != windows.end(); 
     450            ++itr) 
     451        { 
     452            osgViewer::GraphicsWindow* window = *itr; 
     453            osg::GraphicsContext::Cameras& cameras = window->getCameras(); 
     454            osg::Camera* lastCamera = 0; 
     455            for(osg::GraphicsContext::Cameras::iterator cam_itr = cameras.begin(); 
     456                cam_itr != cameras.end(); 
     457                ++cam_itr) 
     458            { 
     459                if (lastCamera) 
     460                { 
     461                    if ((*cam_itr)->getRenderOrder() > lastCamera->getRenderOrder()) 
     462                    { 
     463                        lastCamera = (*cam_itr); 
     464                    } 
     465                    if ((*cam_itr)->getRenderOrder() == lastCamera->getRenderOrder() && 
     466                        (*cam_itr)->getRenderOrderNum() >= lastCamera->getRenderOrderNum()) 
     467                    { 
     468                        lastCamera = (*cam_itr); 
     469                    } 
     470                } 
     471                else 
     472                { 
     473                    lastCamera = *cam_itr; 
     474                } 
     475            } 
     476 
    390477            if (lastCamera) 
    391478            { 
    392                 if ((*cam_itr)->getRenderOrder() > (*cam_itr)->getRenderOrder()) 
    393                 { 
    394                     lastCamera = (*cam_itr); 
    395                 } 
    396                 if ((*cam_itr)->getRenderOrder() == lastCamera->getRenderOrder() && 
    397                     (*cam_itr)->getRenderOrderNum() >= lastCamera->getRenderOrderNum()) 
    398                 { 
    399                     lastCamera = (*cam_itr); 
    400                 } 
     479                osg::notify(osg::NOTICE)<<"Last camera "<<lastCamera<<std::endl; 
     480 
     481                lastCamera->setFinalDrawCallback(callback); 
    401482            } 
    402483            else 
    403484            { 
    404                 lastCamera = *cam_itr; 
    405             } 
    406         } 
    407          
    408         if (lastCamera) 
    409         { 
    410             osg::notify(osg::NOTICE)<<"Last camera "<<lastCamera<<std::endl; 
    411              
    412             lastCamera->setFinalDrawCallback(callback); 
    413         } 
    414         else 
    415         { 
    416             osg::notify(osg::NOTICE)<<"No camera found"<<std::endl; 
     485                osg::notify(osg::NOTICE)<<"No camera found"<<std::endl; 
     486            } 
    417487        } 
    418488    } 
     
    427497    arguments.getApplicationUsage()->setDescription(arguments.getApplicationName()+" is the standard OpenSceneGraph example which loads and visualises 3d models."); 
    428498    arguments.getApplicationUsage()->setCommandLineUsage(arguments.getApplicationName()+" [options] filename ..."); 
    429     arguments.getApplicationUsage()->addCommandLineOption("--image <filename>","Load an image and render it on a quad"); 
    430     arguments.getApplicationUsage()->addCommandLineOption("--dem <filename>","Load an image/DEM and render it on a HeightField"); 
    431499 
    432500    osgViewer::Viewer viewer(arguments); 
     
    499567    viewer.addEventHandler(new osgViewer::LODScaleHandler); 
    500568 
     569    WindowCaptureCallback::FramePosition position = WindowCaptureCallback::END_FRAME; 
     570    while (arguments.read("--start-frame")) position = WindowCaptureCallback::START_FRAME; 
     571    while (arguments.read("--end-frame")) position = WindowCaptureCallback::END_FRAME; 
     572 
    501573    WindowCaptureCallback::Mode mode = WindowCaptureCallback::DOUBLE_PBO; 
    502574    while (arguments.read("--no-pbo")) mode = WindowCaptureCallback::READ_PIXELS; 
     
    531603    viewer.realize(); 
    532604     
    533     addCallbackToViewer(viewer, new WindowCaptureCallback(mode)); 
     605    addCallbackToViewer(viewer, new WindowCaptureCallback(mode, position)); 
    534606 
    535607    return viewer.run();