Added osgViewer::Viewer / osgViewer::GraphicsWindowsX11 usage.
This commit is contained in:
@@ -4,7 +4,7 @@ include $(TOPDIR)/Make/makedefs
|
||||
CXXFILES =\
|
||||
osgcamera.cpp\
|
||||
|
||||
LIBS += -losgDB -losgUtil -losg $(GL_LIBS) $(X_LIBS) $(OTHER_LIBS) -lOpenThreads
|
||||
LIBS += -losgViewer -losgGA -losgDB -losgUtil -losg $(GL_LIBS) $(X_LIBS) $(OTHER_LIBS) -lOpenThreads
|
||||
|
||||
INSTFILES = \
|
||||
$(CXXFILES)\
|
||||
|
||||
@@ -16,11 +16,126 @@
|
||||
#include <osgDB/DynamicLibrary>
|
||||
#include <osgDB/Registry>
|
||||
|
||||
#include <osgViewer/View>
|
||||
|
||||
#include <map>
|
||||
#include <list>
|
||||
#include <iostream>
|
||||
|
||||
|
||||
#if !defined(_WIN32)
|
||||
|
||||
#include <osgViewer/GraphicsWindowX11>
|
||||
#include <osgViewer/Viewer>
|
||||
|
||||
void renderCamera(osg::Camera* camera)
|
||||
{
|
||||
osg::GraphicsContext* gc = camera->getGraphicsContext();
|
||||
if (!gc) return;
|
||||
|
||||
osgUtil::SceneView* sceneView = dynamic_cast<osgUtil::SceneView*>(camera->getRenderingCache(0));
|
||||
if (!sceneView) return;
|
||||
|
||||
gc->makeCurrent();
|
||||
|
||||
sceneView->cull();
|
||||
sceneView->draw();
|
||||
|
||||
gc->swapBuffers();
|
||||
}
|
||||
|
||||
void setUpFrameStamp(osg::Camera* camera, osg::FrameStamp* frameStamp, osg::Node* loadedModel)
|
||||
{
|
||||
osgUtil::SceneView* sceneView = dynamic_cast<osgUtil::SceneView*>(camera->getRenderingCache(0));
|
||||
if (!sceneView) return;
|
||||
|
||||
sceneView->setFrameStamp(frameStamp);
|
||||
|
||||
sceneView->setSceneData(loadedModel);
|
||||
|
||||
}
|
||||
|
||||
int main( int argc, char **argv )
|
||||
{
|
||||
if (argc<2)
|
||||
{
|
||||
std::cout << argv[0] <<": requires filename argument." << std::endl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
// load the scene.
|
||||
osg::ref_ptr<osg::Node> loadedModel = osgDB::readNodeFile(argv[1]);
|
||||
if (!loadedModel)
|
||||
{
|
||||
std::cout << argv[0] <<": No data loaded." << std::endl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
// initialize the view to look at the center of the scene graph
|
||||
const osg::BoundingSphere& bs = loadedModel->getBound();
|
||||
osg::Matrix viewMatrix;
|
||||
viewMatrix.makeLookAt(bs.center()-osg::Vec3(0.0,2.0f*bs.radius(),0.0),bs.center(),osg::Vec3(0.0f,0.0f,1.0f));
|
||||
|
||||
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
|
||||
viewer->setUpViewAcrossAllScreens();
|
||||
viewer->realize();
|
||||
|
||||
viewer->getCamera()->setClearColor(osg::Vec4f(0.6f,0.6f,0.8f,1.0f));
|
||||
|
||||
osg::ref_ptr<osg::FrameStamp> frameStamp = new osg::FrameStamp;
|
||||
|
||||
unsigned int frameNum = 0;
|
||||
|
||||
osgUtil::UpdateVisitor updateVisitor;
|
||||
updateVisitor.setFrameStamp(frameStamp.get());
|
||||
|
||||
setUpFrameStamp(viewer->getCamera(), frameStamp.get(), loadedModel.get());
|
||||
for(unsigned i=0; i<viewer->getNumSlaves(); ++i)
|
||||
{
|
||||
osg::View::Slave& slave = viewer->getSlave(i);
|
||||
setUpFrameStamp(slave._camera.get(), frameStamp.get(), loadedModel.get());
|
||||
}
|
||||
|
||||
// record the timer tick at the start of rendering.
|
||||
osg::Timer_t start_tick = osg::Timer::instance()->tick();
|
||||
osg::Timer_t previous_tick = start_tick;
|
||||
|
||||
while(true)
|
||||
{
|
||||
osg::Timer_t current_tick = osg::Timer::instance()->tick();
|
||||
|
||||
frameStamp->setReferenceTime(osg::Timer::instance()->delta_s(start_tick,current_tick));
|
||||
frameStamp->setFrameNumber(frameNum++);
|
||||
|
||||
//std::cout<<"Frame rate "<<1.0/osg::Timer::instance()->delta_s(previous_tick,current_tick)<<std::endl;
|
||||
previous_tick = current_tick;
|
||||
|
||||
// do the update traversal.
|
||||
loadedModel->accept(updateVisitor);
|
||||
|
||||
|
||||
viewer->getCamera()->setViewMatrix(viewMatrix);
|
||||
|
||||
viewer->updateSlaves();
|
||||
|
||||
if (viewer->getCamera() && viewer->getCamera()->getGraphicsContext()) renderCamera(viewer->getCamera());
|
||||
|
||||
for(unsigned i=0; i<viewer->getNumSlaves(); ++i)
|
||||
{
|
||||
osg::View::Slave& slave = viewer->getSlave(i);
|
||||
if (slave._camera.valid() && slave._camera->getGraphicsContext()) renderCamera(slave._camera.get());
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#else
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// ORIGINAL osgcamera example code.
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
@@ -155,18 +270,14 @@ int main( int argc, char **argv )
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
osg::ref_ptr<osgViewer::View> view = new osgViewer::View;
|
||||
view->setUpViewAcrossAllScreens();
|
||||
|
||||
|
||||
|
||||
|
||||
unsigned int numScreens = wsi->getNumScreens();
|
||||
for(unsigned int i=0; i<numScreens; ++i)
|
||||
{
|
||||
osg::GraphicsContext::ScreenIdentifier si;
|
||||
si._screenNum = 0;
|
||||
|
||||
unsigned int width, height;
|
||||
wsi->getScreenResolution(si, width, height);
|
||||
|
||||
std::cout<<"screen= "<<i<<" width="<<width<<" height="<<height<<std::endl;
|
||||
}
|
||||
|
||||
|
||||
unsigned int numberCameras = numScreens;
|
||||
while (arguments.read("--cameras",numberCameras)) {}
|
||||
@@ -409,3 +520,5 @@ int main( int argc, char **argv )
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user