]> git.mxchange.org Git - flightgear.git/commitdiff
Make Rembrandt compatible with multi screen
authorFrederic Bouvier <fredfgfs01@free.fr>
Sat, 19 May 2012 13:43:49 +0000 (15:43 +0200)
committerFrederic Bouvier <fredfgfs01@free.fr>
Sat, 19 May 2012 13:43:49 +0000 (15:43 +0200)
src/Viewer/renderer.cxx
src/Viewer/renderer.hxx

index 5056b724a8a57ad504b7be2f1eafad2fb5575aab..5b32f9283e92e8ea3b6d16391e79c4a4cd193df5 100644 (file)
@@ -668,7 +668,7 @@ FGRenderer::buildClassicalPipeline(CameraGroup* cgroup, unsigned flags, osg::Cam
     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;
@@ -788,11 +788,13 @@ osg::Camera* FGRenderer::buildDeferredGeometryCamera( CameraInfo* info, osg::Gra
 
     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 );
@@ -1072,6 +1074,7 @@ osg::Camera* FGRenderer::buildDeferredLightingCamera( CameraInfo* info, osg::Gra
     camera->setReadBuffer(GL_FRONT);
     camera->setClearColor( osg::Vec4( 0., 0., 0., 1. ) );
     camera->setClearMask( GL_COLOR_BUFFER_BIT );
+    camera->setColorMask(true, true, true, true);
     osg::StateSet* ss = camera->getOrCreateStateSet();
     ss->setAttribute( new osg::Depth(osg::Depth::LESS, 0.0, 1.0, false) );
     ss->addUniform( _depthInColor );
@@ -1344,19 +1347,23 @@ FGRenderer::buildStage(CameraInfo* info,
                         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")
+        needOffsets = true;
+    } 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);
@@ -1366,7 +1373,10 @@ FGRenderer::buildStage(CameraInfo* info,
     } 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")
@@ -1452,7 +1462,7 @@ CameraInfo* FGRenderer::buildCameraFromRenderingPipeline(FGRenderingPipeline* rp
     
     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);
index e870fb1219951b76b5da561eda25cf4df0165596..2343014aaac8c4e5747401a8894ca0ba38419c43 100644 (file)
@@ -142,7 +142,7 @@ protected:
                                         const osg::Matrix& view, const osg::Matrix& projection, osg::GraphicsContext* gc);
 
     void buildBuffers(FGRenderingPipeline* rpipe, flightgear::CameraInfo* info);
-    void buildStage(flightgear::CameraInfo* info, FGRenderingPipeline::Stage* stage, flightgear::CameraGroup* cgroup, osg::Camera* mainCamera, osg::GraphicsContext* gc);
+    void buildStage(flightgear::CameraInfo* info, FGRenderingPipeline::Stage* stage, flightgear::CameraGroup* cgroup, osg::Camera* mainCamera, const osg::Matrix& view, const osg::Matrix& projection, osg::GraphicsContext* gc);
     osg::Node* buildPass(flightgear::CameraInfo* info, FGRenderingPipeline::Pass* pass);
     osg::Node* buildLightingSkyCloudsPass(FGRenderingPipeline::Pass* pass);
     osg::Node* buildLightingLightsPass(flightgear::CameraInfo* info, FGRenderingPipeline::Pass* pass);