#include <osgViewer/Viewer>
#include <osgViewer/GraphicsWindow>
#include <osg/Node>
#include <osg/Geode>
#include <osg/Group>
#include <osg/Camera>
#include <osg/Image>
#include <osg/BufferObject>
#include <osgDB/ReadFile>
#include <osgDB/WriteFile>
#include <osgUtil/Optimizer>
#include <iostream>
#include <osgGA/GUIEventHandler>
#include <osgGA/TrackballManipulator>
osg::ref_ptr<osg::Image> image_c =
new osg::Image() ;
struct CaptureCallback:
public osg::Camera::DrawCallback
{
CaptureCallback(osg::ref_ptr<osg::Image> image)
{
image_ = image ;
}
~CaptureCallback(){}
virtual void operator()(
const osg::Camera &camera)
const
{
osg::ref_ptr<osg::GraphicsContext::WindowingSystemInterface> wsi = osg::GraphicsContext::getWindowingSystemInterface() ;
unsigned int width , height ;
wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(
0) , width , height) ;
image_->allocateImage(width , height ,
1 , GL_RGB , GL_UNSIGNED_BYTE) ;
image_->readPixels(
0 ,
0 , width , height , GL_RGB , GL_UNSIGNED_BYTE) ;
}
private:
osg::ref_ptr<osg::Image> image_ ;
};
class ImageHandler:
public osgGA::GUIEventHandler
{
public:
ImageHandler()
{
}
~ImageHandler(){}
bool handle(
const osgGA::GUIEventAdapter& ea , osgGA::GUIActionAdapter& aa)
{
osg::ref_ptr<osgViewer::Viewer> viewer =
dynamic_cast<osgViewer::Viewer *>(&aa) ;
if (viewer == NULL)
{
return false ;
}
static int _screenCaptureSequence =
0 ;
switch (ea.getEventType())
{
case osgGA::GUIEventAdapter::KEYDOWN:
{
if (ea.getKey() ==
'c' || ea.getKey() ==
'C')
{
char filename[
128] ;
sprintf(filename ,
"ScreenShotM.bmp" , _screenCaptureSequence) ;
_screenCaptureSequence++ ;
osgDB::writeImageFile(*(image_c.get()) , filename) ;
}
}
break;
default:
return false ;
}
return true ;
}
};
int main()
{
osg::ref_ptr<osg::Node> node = osgDB::readNodeFile(
"cow.osg") ;
osg::ref_ptr<osg::Group> root =
new osg::Group ;
root->addChild(node.get()) ;
osg::ref_ptr<osgViewer::Viewer> viewer =
new osgViewer::Viewer ;
osgUtil::Optimizer optimizer ;
optimizer.optimize(root.get()) ;
viewer->getCamera()->setPostDrawCallback(
new CaptureCallback(image_c.get())) ;
viewer->setSceneData(root.get()) ;
viewer->addEventHandler(
new ImageHandler()) ;
viewer->realize() ;
viewer->run() ;
return 1 ;
}
转载请注明原文地址: https://ju.6miu.com/read-7400.html