diff --git a/examples/osgcamera/GNUmakefile b/examples/osgcamera/GNUmakefile index 745fae01d..c44bd7a25 100644 --- a/examples/osgcamera/GNUmakefile +++ b/examples/osgcamera/GNUmakefile @@ -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)\ diff --git a/examples/osgcamera/osgcamera.cpp b/examples/osgcamera/osgcamera.cpp index e074767ec..9a8609253 100644 --- a/examples/osgcamera/osgcamera.cpp +++ b/examples/osgcamera/osgcamera.cpp @@ -16,11 +16,126 @@ #include #include +#include + #include #include #include +#if !defined(_WIN32) + +#include +#include + +void renderCamera(osg::Camera* camera) +{ + osg::GraphicsContext* gc = camera->getGraphicsContext(); + if (!gc) return; + + osgUtil::SceneView* sceneView = dynamic_cast(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(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 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 viewer = new osgViewer::Viewer; + viewer->setUpViewAcrossAllScreens(); + viewer->realize(); + + viewer->getCamera()->setClearColor(osg::Vec4f(0.6f,0.6f,0.8f,1.0f)); + + osg::ref_ptr 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; igetNumSlaves(); ++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)<accept(updateVisitor); + + + viewer->getCamera()->setViewMatrix(viewMatrix); + + viewer->updateSlaves(); + + if (viewer->getCamera() && viewer->getCamera()->getGraphicsContext()) renderCamera(viewer->getCamera()); + + for(unsigned i=0; igetNumSlaves(); ++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 view = new osgViewer::View; + view->setUpViewAcrossAllScreens(); + + + + unsigned int numScreens = wsi->getNumScreens(); - for(unsigned int i=0; igetScreenResolution(si, width, height); - - std::cout<<"screen= "<