]> git.mxchange.org Git - flightgear.git/commitdiff
Rembrandt: Add debugging properties and fix transparency issues. Side effect: light...
authorFrederic Bouvier <fredfgfs01@free.fr>
Sat, 14 Jul 2012 11:07:13 +0000 (13:07 +0200)
committerFrederic Bouvier <fredfgfs01@free.fr>
Sat, 14 Jul 2012 11:07:41 +0000 (13:07 +0200)
src/Viewer/renderer.cxx
src/Viewer/renderingpipeline.cxx
src/Viewer/renderingpipeline.hxx

index 17ee89314c8bea920be5474083515ef596fc3e1b..054926c79e40ab47d58b5e7904200a710f5a675e 100644 (file)
@@ -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<osg::Switch> _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<FGRenderingPipeline::Pass> pass, stage->passes ) {
         ref_ptr<Node> 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 );
index da9cd09a377ca2c026048241cd26ef73c29f96b8..ab4f9640ac377cf9291e75aa194c3134023eb275 100644 (file)
@@ -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);
 }
index 9f165bd15b303ebdc9a9899f625bcf5bfc1c9f83..3be2cf49e7d5846e6c2f953752666e34bd4834ff 100644 (file)
@@ -61,6 +61,7 @@ public:
         std::string type;
         int orderNum;
         std::string effect;
+        std::string debugProperty;
     };
 
     struct Attachment : public Conditionable {