Added osgViewer::Viewer / osgViewer::GraphicsWindowsX11 usage.

This commit is contained in:
Robert Osfield
2006-12-19 16:12:29 +00:00
parent dcebe4daa0
commit 00ee8dffad
2 changed files with 125 additions and 12 deletions

View File

@@ -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)\

View File

@@ -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