From 020d7a56515ccd51fdaef8eadfe2d35f76bd4238 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Mon, 27 Aug 2007 13:29:09 +0000 Subject: [PATCH] Added support for controlling the draw order on Cameras on each GraphcisContext via the Camera::setRenderOrder parameters --- src/osg/GraphicsContext.cpp | 21 +++++++++++++++++++-- src/osgViewer/HelpHandler.cpp | 1 + src/osgViewer/StatsHandler.cpp | 1 + 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/osg/GraphicsContext.cpp b/src/osg/GraphicsContext.cpp index 8777fe096..a59450b50 100644 --- a/src/osg/GraphicsContext.cpp +++ b/src/osg/GraphicsContext.cpp @@ -644,10 +644,27 @@ void GraphicsContext::removeAllOperations() _operationsBlock->set(false); } + +struct CameraRenderOrderSortOp +{ + inline bool operator() (const Camera* lhs,const Camera* rhs) const + { + if (lhs->getRenderOrder()getRenderOrder()) return true; + if (rhs->getRenderOrder()getRenderOrder()) return false; + return lhs->getRenderOrderNum()getRenderOrderNum(); + } +}; + + void GraphicsContext::runOperations() { - for(osg::GraphicsContext::Cameras::iterator itr = _cameras.begin(); - itr != _cameras.end(); + // sort the cameras into order + typedef std::vector CameraVector; + CameraVector camerasCopy(_cameras.begin(),_cameras.end()); + std::sort(camerasCopy.begin(), camerasCopy.end(), CameraRenderOrderSortOp()); + + for(CameraVector::iterator itr = camerasCopy.begin(); + itr != camerasCopy.end(); ++itr) { osg::Camera* camera = *itr; diff --git a/src/osgViewer/HelpHandler.cpp b/src/osgViewer/HelpHandler.cpp index 50beaa1a7..59a710a18 100644 --- a/src/osgViewer/HelpHandler.cpp +++ b/src/osgViewer/HelpHandler.cpp @@ -28,6 +28,7 @@ HelpHandler::HelpHandler(osg::ApplicationUsage* au): { _camera = new osg::Camera; _camera->setRenderer(new Renderer(_camera.get())); + _camera->setRenderOrder(osg::Camera::POST_RENDER, 11); } diff --git a/src/osgViewer/StatsHandler.cpp b/src/osgViewer/StatsHandler.cpp index a1e7e8bf9..ca3165e51 100644 --- a/src/osgViewer/StatsHandler.cpp +++ b/src/osgViewer/StatsHandler.cpp @@ -224,6 +224,7 @@ void StatsHandler::setUpHUDCamera(osgViewer::Viewer* viewer) } _camera->setViewport(0, 0, window->getTraits()->width, window->getTraits()->height); + _camera->setRenderOrder(osg::Camera::POST_RENDER, 10); _camera->setProjectionMatrix(osg::Matrix::ortho2D(0,1280,0,1024)); _camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);