cgroup->getViewer()->addSlave(camera, projection, view, useMasterSceneData);
installCullVisitor(camera);
int slaveIndex = cgroup->getViewer()->getNumSlaves() - 1;
- info->addCamera( MAIN_CAMERA, camera, slaveIndex );
+ info->addCamera( MAIN_CAMERA, camera, slaveIndex );
camera->setRenderOrder(Camera::POST_RENDER, slaveIndex);
cgroup->addCamera(info);
return info;
camera->setCullMask( ~simgear::MODELLIGHT_BIT );
camera->setName( "GeometryC" );
+ camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
camera->setGraphicsContext( gc );
camera->setCullCallback( new FGDeferredRenderingCameraCullCallback( name, info ) );
camera->setClearMask( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
camera->setClearColor( osg::Vec4( 0., 0., 0., 0. ) );
camera->setClearDepth( 1.0 );
+ camera->setColorMask(true, true, true, true);
camera->setRenderTargetImplementation( osg::Camera::FRAME_BUFFER_OBJECT );
camera->setRenderOrder(osg::Camera::NESTED_RENDER, 0);
camera->setViewport( new osg::Viewport );
cascadeCam->setName( oss.str() );
cascadeCam->setClearMask(0);
cascadeCam->setCullMask(~( simgear::MODELLIGHT_BIT /* | simgear::NO_SHADOW_BIT */ ) );
- cascadeCam->setCullingMode( cascadeCam->getCullingMode() & ~osg::CullSettings::SMALL_FEATURE_CULLING );
+ cascadeCam->setCullingMode( cascadeCam->getCullingMode() | osg::CullSettings::SMALL_FEATURE_CULLING );
cascadeCam->setAllowEventFocus(false);
cascadeCam->setReferenceFrame(osg::Transform::ABSOLUTE_RF_INHERIT_VIEWPOINT);
cascadeCam->setRenderOrder(osg::Camera::NESTED_RENDER);
_shadowNumber->set( (int)_numCascades );
}
-osg::Camera* FGRenderer::buildDeferredLightingCamera( CameraInfo* info, osg::GraphicsContext* gc, const std::string& name, const std::vector<ref_ptr<FGRenderingPipeline::Attachment> > &attachments )
-{
- osg::Camera* camera = new osg::Camera;
- info->addCamera(name, camera );
-
- camera->setCullCallback( new FGDeferredRenderingCameraCullCallback( name, info ) );
- camera->setAllowEventFocus(false);
- camera->setGraphicsContext(gc);
- camera->setViewport(new Viewport);
- camera->setName("LightingC");
- camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
- camera->setRenderOrder(osg::Camera::NESTED_RENDER, 50);
- camera->setRenderTargetImplementation( osg::Camera::FRAME_BUFFER_OBJECT );
- camera->setViewport( new osg::Viewport );
- buildAttachments(info, camera, name, attachments);
- camera->setDrawBuffer(GL_FRONT);
- camera->setReadBuffer(GL_FRONT);
- camera->setClearColor( osg::Vec4( 0., 0., 0., 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::Camera* quadCam1 = new osg::Camera;
- quadCam1->setName( "QuadCamera1" );
- quadCam1->setClearMask(0);
- quadCam1->setAllowEventFocus(false);
- quadCam1->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
- quadCam1->setRenderOrder(osg::Camera::NESTED_RENDER);
- quadCam1->setViewMatrix(osg::Matrix::identity());
- quadCam1->setProjectionMatrixAsOrtho2D(-1,1,-1,1);
- quadCam1->setComputeNearFarMode(osg::CullSettings::DO_NOT_COMPUTE_NEAR_FAR);
- ss = quadCam1->getOrCreateStateSet();
- ss->addUniform( _ambientFactor );
- ss->addUniform( info->projInverse );
- ss->addUniform( info->viewInverse );
- ss->addUniform( info->view );
- ss->addUniform( _sunDiffuse );
- ss->addUniform( _sunSpecular );
- ss->addUniform( _sunDirection );
- ss->addUniform( _planes );
- ss->addUniform( _shadowNumber );
- ss->addUniform( _shadowDistances );
-
- osg::Geometry* g = osg::createTexturedQuadGeometry( osg::Vec3(-1.,-1.,0.), osg::Vec3(2.,0.,0.), osg::Vec3(0.,2.,0.) );
- g->setUseDisplayList(false);
- simgear::EffectGeode* eg = new simgear::EffectGeode;
- simgear::Effect* effect = simgear::makeEffect("Effects/ambient", true);
- if (!effect) {
- SG_LOG(SG_VIEW, SG_ALERT, "Effects/ambient not found");
- return 0;
- }
- eg->setEffect( effect );
- g->setName( "AmbientQuad" );
- eg->setName("AmbientQuad");
- eg->setCullingActive(false);
- eg->addDrawable(g);
- quadCam1->addChild( eg );
-
- g = osg::createTexturedQuadGeometry( osg::Vec3(-1.,-1.,0.), osg::Vec3(2.,0.,0.), osg::Vec3(0.,2.,0.) );
- g->setUseDisplayList(false);
- g->setName( "SunlightQuad" );
- eg = new simgear::EffectGeode;
- effect = simgear::makeEffect("Effects/sunlight", true);
- if (!effect) {
- SG_LOG(SG_VIEW, SG_ALERT, "Effects/sunlight not found");
- return 0;
- }
- eg->setEffect( effect );
- eg->setName("SunlightQuad");
- eg->setCullingActive(false);
- eg->addDrawable(g);
- quadCam1->addChild( eg );
-
- osg::Camera* lightCam = new osg::Camera;
- ss = lightCam->getOrCreateStateSet();
- ss->addUniform( _planes );
- ss->addUniform( info->bufferSize );
- lightCam->setName( "LightCamera" );
- lightCam->setClearMask(0);
- lightCam->setAllowEventFocus(false);
- lightCam->setReferenceFrame(osg::Transform::RELATIVE_RF);
- lightCam->setRenderOrder(osg::Camera::NESTED_RENDER,1);
- 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->setInheritanceMask( osg::CullSettings::ALL_VARIABLES & ~osg::CullSettings::CULL_MASK );
- lightCam->addChild( mDeferredRealRoot.get() );
-
-
- osg::Camera* quadCam2 = new osg::Camera;
- quadCam2->setName( "QuadCamera1" );
- quadCam2->setClearMask(0);
- quadCam2->setAllowEventFocus(false);
- quadCam2->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
- quadCam2->setRenderOrder(osg::Camera::NESTED_RENDER,2);
- quadCam2->setViewMatrix(osg::Matrix::identity());
- quadCam2->setProjectionMatrixAsOrtho2D(-1,1,-1,1);
- quadCam2->setComputeNearFarMode(osg::CullSettings::DO_NOT_COMPUTE_NEAR_FAR);
- ss = quadCam2->getOrCreateStateSet();
- ss->addUniform( _ambientFactor );
- ss->addUniform( info->projInverse );
- ss->addUniform( info->viewInverse );
- ss->addUniform( info->view );
- ss->addUniform( _sunDiffuse );
- ss->addUniform( _sunSpecular );
- ss->addUniform( _sunDirection );
- ss->addUniform( _fogColor );
- ss->addUniform( _fogDensity );
- ss->addUniform( _planes );
-
- g = osg::createTexturedQuadGeometry( osg::Vec3(-1.,-1.,0.), osg::Vec3(2.,0.,0.), osg::Vec3(0.,2.,0.) );
- g->setUseDisplayList(false);
- g->setName( "FogQuad" );
- eg = new simgear::EffectGeode;
- effect = simgear::makeEffect("Effects/fog", true);
- if (!effect) {
- SG_LOG(SG_VIEW, SG_ALERT, "Effects/fog not found");
- return 0;
- }
- eg->setEffect( effect );
- eg->setName("FogQuad");
- eg->setCullingActive(false);
- eg->addDrawable(g);
- quadCam2->addChild( eg );
-
- lightingGroup->addChild( _sky->getPreRoot() );
- lightingGroup->addChild( _sky->getCloudRoot() );
- lightingGroup->addChild( quadCam1 );
- lightingGroup->addChild( lightCam );
- lightingGroup->addChild( quadCam2 );
-
- camera->addChild( lightingGroup );
-
- return camera;
-}
-
osg::Camera*
FGRenderer::buildDeferredLightingCamera( flightgear::CameraInfo* info, osg::GraphicsContext* gc, const FGRenderingPipeline::Stage* stage )
{
ss->addUniform( info->viewInverse );
ss->addUniform( info->view );
ss->addUniform( info->bufferSize );
+ ss->addUniform( info->worldPosCart );
+ ss->addUniform( info->worldPosGeod );
ss->addUniform( _ambientFactor );
ss->addUniform( _sunDiffuse );
ss->addUniform( _sunSpecular );
FGRenderingPipeline::Stage* stage,
CameraGroup* cgroup,
osg::Camera* mainCamera,
- osg::GraphicsContext* gc)
+ const osg::Matrix& view, const osg::Matrix& projection, osg::GraphicsContext* gc)
{
if (!stage->valid())
return;
ref_ptr<Camera> camera;
- if (stage->type == "geometry")
+ bool needOffsets = false;
+ if (stage->type == "geometry") {
camera = buildDeferredGeometryCamera(info, gc, stage->name, stage->attachments);
- else if (stage->type == "lighting-builtin")
- camera = buildDeferredLightingCamera(info, gc, stage->name, stage->attachments);
- else if (stage->type == "lighting")
+ needOffsets = true;
+ } else if (stage->type == "lighting") {
camera = buildDeferredLightingCamera(info, gc, stage);
- else if (stage->type == "shadow")
+ needOffsets = true;
+ } else if (stage->type == "shadow")
camera = buildDeferredShadowCamera(info, gc, stage->name, stage->attachments);
else if (stage->type == "fullscreen")
camera = buildDeferredFullscreenCamera(info, gc, stage);
} else
throw sg_exception("Stage type is not supported");
- cgroup->getViewer()->addSlave(camera, false);
+ if (needOffsets)
+ cgroup->getViewer()->addSlave(camera, projection, view, false);
+ else
+ cgroup->getViewer()->addSlave(camera, false);
installCullVisitor(camera);
int slaveIndex = cgroup->getViewer()->getNumSlaves() - 1;
if (stage->type == "display")
for (size_t i = 0; i < rpipe->stages.size(); ++i) {
osg::ref_ptr<FGRenderingPipeline::Stage> stage = rpipe->stages[i];
- buildStage(info, stage, cgroup, camera, gc);
+ buildStage(info, stage, cgroup, camera, view, projection, gc);
}
cgroup->addCamera(info);