#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>
if (!_classicalRenderer) {
eventHandler->setChangeStatsCameraRenderOrder( true );
+ _sky->set_minimum_sky_visibility( 0.0 ); // A black sky appears for below that
}
}
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;
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();
}
}
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);
_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 )
{
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 );
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);
}
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);
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
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");
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;
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);
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() );
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)