From c1137f371d1bc7c36ca6ba77420e63a96b443bb8 Mon Sep 17 00:00:00 2001 From: Frederic Bouvier Date: Sat, 14 Jul 2012 13:07:13 +0200 Subject: [PATCH] Rembrandt: Add debugging properties and fix transparency issues. Side effect: light are not fogged (may be added in the light shader later) and depth buffer precision issues on light are more visible due to near plane really near (0.1m) --- src/Viewer/renderer.cxx | 33 ++++++++++++++++++++------------ src/Viewer/renderingpipeline.cxx | 1 + src/Viewer/renderingpipeline.hxx | 1 + 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/Viewer/renderer.cxx b/src/Viewer/renderer.cxx index 17ee89314..054926c79 100644 --- a/src/Viewer/renderer.cxx +++ b/src/Viewer/renderer.cxx @@ -701,12 +701,11 @@ public: cv->traverse( *camera ); if ( kind == GEOMETRY_CAMERA ) { - // Save transparent bins to render later + // Remove transparent bins. They will be renderer in the additional light stage (side effect) osgUtil::RenderStage* renderStage = cv->getRenderStage(); osgUtil::RenderBin::RenderBinList& rbl = renderStage->getRenderBinList(); for (osgUtil::RenderBin::RenderBinList::iterator rbi = rbl.begin(); rbi != rbl.end(); ) { if (rbi->second->getSortMode() == osgUtil::RenderBin::SORT_BACK_TO_FRONT) { - info->savedTransparentBins.insert( std::make_pair( rbi->first, rbi->second ) ); rbl.erase( rbi++ ); } else { ++rbi; @@ -730,13 +729,6 @@ public: info->shadowMatrix[i]->set( shadowMatrix ); } } - // Render saved transparent render bins - osgUtil::RenderStage* renderStage = cv->getRenderStage(); - osgUtil::RenderBin::RenderBinList& rbl = renderStage->getRenderBinList(); - for (osgUtil::RenderBin::RenderBinList::iterator rbi = info->savedTransparentBins.begin(); rbi != info->savedTransparentBins.end(); ++rbi ){ - rbl.insert( std::make_pair( rbi->first + 10000, rbi->second ) ); - } - info->savedTransparentBins.clear(); } } @@ -1051,6 +1043,18 @@ void FGRenderer::updateCascadeNumber(size_t num) _shadowNumber->set( (int)_numCascades ); } +class DebugPassListener : public SGPropertyChangeListener { +public: + DebugPassListener(osg::Switch* sw, int i) : _switch(sw), _index(i) {} + virtual void valueChanged(SGPropertyNode* node) { + _switch->setValue(_index, node->getBoolValue()); + } + +private: + osg::ref_ptr _switch; + int _index; +}; + osg::Camera* FGRenderer::buildDeferredLightingCamera( flightgear::CameraInfo* info, osg::GraphicsContext* gc, const FGRenderingPipeline::Stage* stage ) { @@ -1069,18 +1073,23 @@ FGRenderer::buildDeferredLightingCamera( flightgear::CameraInfo* info, osg::Grap buildAttachments(info, camera, stage->name, stage->attachments); camera->setDrawBuffer(GL_FRONT); camera->setReadBuffer(GL_FRONT); - camera->setClearColor( osg::Vec4( 0., 0., 0., 1. ) ); + camera->setClearColor( osg::Vec4( 0.5, 0.5, 0.5, 1. ) ); camera->setClearMask( GL_COLOR_BUFFER_BIT ); osg::StateSet* ss = camera->getOrCreateStateSet(); ss->setAttribute( new osg::Depth(osg::Depth::LESS, 0.0, 1.0, false) ); ss->addUniform( _depthInColor ); - osg::Group* lightingGroup = new osg::Group; + osg::Switch* lightingGroup = new osg::Switch; BOOST_FOREACH( osg::ref_ptr pass, stage->passes ) { ref_ptr node = buildPass(info, pass); - if (node.valid()) + if (node.valid()) { lightingGroup->addChild(node); + if (!pass->debugProperty.empty()) { + lightingGroup->setValue(lightingGroup->getNumChildren()-1, fgGetBool(pass->debugProperty)); + fgAddChangeListener(new DebugPassListener(lightingGroup, lightingGroup->getNumChildren()-1), pass->debugProperty); + } + } } camera->addChild( lightingGroup ); diff --git a/src/Viewer/renderingpipeline.cxx b/src/Viewer/renderingpipeline.cxx index da9cd09a3..ab4f9640a 100644 --- a/src/Viewer/renderingpipeline.cxx +++ b/src/Viewer/renderingpipeline.cxx @@ -274,6 +274,7 @@ FGRenderingPipeline::Pass::Pass(SGPropertyNode* prop) orderNum = prop->getIntValue("order-num", -1); effect = prop->getStringValue("effect", ""); + debugProperty = prop->getStringValue("debug-property", ""); parseCondition(prop); } diff --git a/src/Viewer/renderingpipeline.hxx b/src/Viewer/renderingpipeline.hxx index 9f165bd15..3be2cf49e 100644 --- a/src/Viewer/renderingpipeline.hxx +++ b/src/Viewer/renderingpipeline.hxx @@ -61,6 +61,7 @@ public: std::string type; int orderNum; std::string effect; + std::string debugProperty; }; struct Attachment : public Conditionable { -- 2.39.5