]> git.mxchange.org Git - flightgear.git/blobdiff - src/Viewer/renderer.cxx
Prepare and implement reinit methods for instruments
[flightgear.git] / src / Viewer / renderer.cxx
index 981fa549ea675443c3a649b7ef47a78ebec77163..24f3f1d1894b0f12454c76745fee55df338b150c 100644 (file)
@@ -74,6 +74,7 @@
 #include <simgear/scene/model/animation.hxx>
 #include <simgear/scene/model/placement.hxx>
 #include <simgear/scene/sky/sky.hxx>
+#include <simgear/scene/util/DeletionManager.hxx>
 #include <simgear/scene/util/SGUpdateVisitor.hxx>
 #include <simgear/scene/util/RenderConstants.hxx>
 #include <simgear/scene/util/SGSceneUserData.hxx>
@@ -576,6 +577,7 @@ FGRenderer::init( void )
 
     if (!_classicalRenderer) {
         eventHandler->setChangeStatsCameraRenderOrder( true );
+        _sky->set_minimum_sky_visibility( 0.0 ); // A black sky appears for below that
     }
 }
 
@@ -701,12 +703,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 +731,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();
         }
     }
 
@@ -835,7 +829,7 @@ static osg::Camera* createShadowCascadeCamera( int no, int cascadeSize ) {
     oss << "CascadeCamera" << (no + 1);
     cascadeCam->setName( oss.str() );
     cascadeCam->setClearMask(0);
-    cascadeCam->setCullMask(~( simgear::MODELLIGHT_BIT /* | simgear::NO_SHADOW_BIT */ ) );
+    cascadeCam->setCullMask( simgear::CASTSHADOW_BIT );
     cascadeCam->setCullingMode( cascadeCam->getCullingMode() | osg::CullSettings::SMALL_FEATURE_CULLING );
     cascadeCam->setAllowEventFocus(false);
     cascadeCam->setReferenceFrame(osg::Transform::ABSOLUTE_RF_INHERIT_VIEWPOINT);
@@ -1051,6 +1045,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 +1075,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 );
@@ -1132,7 +1143,6 @@ FGRenderer::buildDeferredFullscreenCamera( flightgear::CameraInfo* info, const F
     ss->addUniform( _shadowDistances );
     ss->addUniform( _fogColor );
     ss->addUniform( _fogDensity );
-    ss->addUniform( _planes );
 
     osg::Geometry* g = osg::createTexturedQuadGeometry( osg::Vec3(-1.,-1.,0.), osg::Vec3(2.,0.,0.), osg::Vec3(0.,2.,0.) );
     g->setUseDisplayList(false);
@@ -1178,18 +1188,18 @@ FGRenderer::buildDeferredFullscreenCamera( flightgear::CameraInfo* info, osg::Gr
 }
 
 void
-FGRenderer::buildDeferredDisplayCamera( osg::Camera* camera, flightgear::CameraInfo* info, const std::string& name, osg::GraphicsContext* gc )
+FGRenderer::buildDeferredDisplayCamera( osg::Camera* camera, flightgear::CameraInfo* info, const FGRenderingPipeline::Stage* stage, osg::GraphicsContext* gc )
 {
     camera->setName( "DisplayC" );
-    camera->setCullCallback( new FGDeferredRenderingCameraCullCallback( name, info ) );
+    camera->setCullCallback( new FGDeferredRenderingCameraCullCallback( stage->name, info ) );
     camera->setReferenceFrame(Transform::ABSOLUTE_RF);
     camera->setAllowEventFocus(false);
     osg::Geometry* g = osg::createTexturedQuadGeometry( osg::Vec3(-1.,-1.,0.), osg::Vec3(2.,0.,0.), osg::Vec3(0.,2.,0.) );
     g->setUseDisplayList(false); //DEBUG
     simgear::EffectGeode* eg = new simgear::EffectGeode;
-    simgear::Effect* effect = simgear::makeEffect("Effects/display", true);
+    simgear::Effect* effect = simgear::makeEffect(stage->effect, true);
     if (!effect) {
-        SG_LOG(SG_VIEW, SG_ALERT, "Effects/display not found");
+        SG_LOG(SG_VIEW, SG_ALERT, stage->effect + " not found");
         return;
     }
     eg->setEffect(effect);
@@ -1201,6 +1211,25 @@ FGRenderer::buildDeferredDisplayCamera( osg::Camera* camera, flightgear::CameraI
 
     osg::StateSet* ss = camera->getOrCreateStateSet();
     ss->addUniform( _depthInColor );
+    ss->addUniform( info->projInverse );
+    ss->addUniform( info->viewInverse );
+    ss->addUniform( info->view );
+    ss->addUniform( info->bufferSize );
+    ss->addUniform( info->worldPosCart );
+    ss->addUniform( info->worldPosGeod );
+    ss->addUniform( info->shadowMatrix[0] );
+    ss->addUniform( info->shadowMatrix[1] );
+    ss->addUniform( info->shadowMatrix[2] );
+    ss->addUniform( info->shadowMatrix[3] );
+    ss->addUniform( _ambientFactor );
+    ss->addUniform( _sunDiffuse );
+    ss->addUniform( _sunSpecular );
+    ss->addUniform( _sunDirection );
+    ss->addUniform( _planes );
+    ss->addUniform( _shadowNumber );
+    ss->addUniform( _shadowDistances );
+    ss->addUniform( _fogColor );
+    ss->addUniform( _fogDensity );
 }
 
 void
@@ -1227,7 +1256,7 @@ FGRenderer::buildStage(CameraInfo* info,
         camera = buildDeferredFullscreenCamera(info, gc, stage);
     else if (stage->type == "display") {
         camera = mainCamera;
-        buildDeferredDisplayCamera(camera, info, stage->name, gc);
+        buildDeferredDisplayCamera(camera, info, stage, gc);
     } else
         throw sg_exception("Stage type is not supported");
 
@@ -1246,6 +1275,8 @@ osg::Node*
 FGRenderer::buildLightingSkyCloudsPass(FGRenderingPipeline::Pass* pass)
 {
     Group* group = new Group;
+    StateSet* ss = group->getOrCreateStateSet();
+    ss->setAttributeAndModes( new osg::ColorMask( true, true, true, false ), osg::StateAttribute::ON );
     group->addChild( _sky->getPreRoot() );
     group->addChild( _sky->getCloudRoot() );
     return group;
@@ -1258,6 +1289,8 @@ FGRenderer::buildLightingLightsPass(CameraInfo* info, FGRenderingPipeline::Pass*
     StateSet* ss = lightCam->getOrCreateStateSet();
     ss->addUniform( _planes );
     ss->addUniform( info->bufferSize );
+    ss->addUniform( _fogColor );
+    ss->addUniform( _fogDensity );
     lightCam->setName( "LightCamera" );
     lightCam->setClearMask(0);
     lightCam->setAllowEventFocus(false);
@@ -1266,7 +1299,7 @@ FGRenderer::buildLightingLightsPass(CameraInfo* info, FGRenderingPipeline::Pass*
     lightCam->setViewMatrix(osg::Matrix::identity());
     lightCam->setProjectionMatrix(osg::Matrix::identity());
     lightCam->setComputeNearFarMode(osg::CullSettings::DO_NOT_COMPUTE_NEAR_FAR);
-    lightCam->setCullMask( simgear::MODELLIGHT_BIT );
+    lightCam->setCullMask( simgear::MODELLIGHT_BIT | simgear::PANEL2D_BIT | simgear::PERMANENTLIGHT_BIT);
     lightCam->setInheritanceMask( osg::CullSettings::ALL_VARIABLES & ~osg::CullSettings::CULL_MASK );
     lightCam->addChild( mDeferredRealRoot.get() );
 
@@ -1494,7 +1527,9 @@ FGRenderer::setupView( void )
     stateSet = mRealRoot->getOrCreateStateSet();
     stateSet->setAttributeAndModes(new osg::Program, osg::StateAttribute::ON);
 
-       mDeferredRealRoot->addChild( mRealRoot.get() );
+    mDeferredRealRoot->addChild( mRealRoot.get() );
+
+    DeletionManager::install(mRealRoot.get());
 }
                                     
 // Update all Visuals (redraws anything graphics related)