]> git.mxchange.org Git - flightgear.git/blobdiff - src/Main/CameraGroup.cxx
Rembrandt: Restore rendering stats
[flightgear.git] / src / Main / CameraGroup.cxx
index 0cf9ad7a00a69e321d83119b011d3b502494bbc4..66c08ca2a8a726da5a91ac27e31ecdb885948437 100644 (file)
@@ -183,13 +183,17 @@ namespace flightgear
 {
 void CameraInfo::updateCameras()
 {
+    bufferSize->set( osg::Vec2f( width, height ) );
+
     for (CameraMap::iterator ii = cameras.begin(); ii != cameras.end(); ++ii ) {
         float f = ii->second.scaleFactor;
+        if ( f == 0.0f ) continue;
         ii->second.camera->getViewport()->setViewport(x*f, y*f, width*f, height*f);
     }
 
     for (RenderBufferMap::iterator ii = buffers.begin(); ii != buffers.end(); ++ii ) {
         float f = ii->second.scaleFactor;
+        if ( f == 0.0f ) continue;
         osg::Texture2D* texture = ii->second.texture.get();
         if ( texture->getTextureHeight() != height*f || texture->getTextureWidth() != width*f ) {
             texture->setTextureSize( width*f, height*f );
@@ -200,15 +204,20 @@ void CameraInfo::updateCameras()
 
 void CameraInfo::resized(double w, double h)
 {
+    bufferSize->set( osg::Vec2f( w, h ) );
+
     for (RenderBufferMap::iterator ii = buffers.begin(); ii != buffers.end(); ++ii) {
         float s = ii->second.scaleFactor;
+        if ( s == 0.0f ) continue;
         ii->second.texture->setTextureSize( w * s, h * s );
         ii->second.texture->dirtyTextureObject();
     }
 
     for (CameraMap::iterator ii = cameras.begin(); ii != cameras.end(); ++ii) {
         RenderStageInfo& rsi = ii->second;
-        if (!rsi.resizable || rsi.camera->getRenderTargetImplementation() != osg::Camera::FRAME_BUFFER_OBJECT)
+        if (!rsi.resizable ||
+                rsi.camera->getRenderTargetImplementation() != osg::Camera::FRAME_BUFFER_OBJECT ||
+                rsi.scaleFactor == 0.0f )
             continue;
 
         Viewport* vp = rsi.camera->getViewport();
@@ -241,6 +250,14 @@ osg::Camera* CameraInfo::getCamera(CameraKind k) const
     return ii->second.camera.get();
 }
 
+osg::Texture2D* CameraInfo::getBuffer(RenderBufferInfo::Kind k) const
+{
+    RenderBufferMap::const_iterator ii = buffers.find(k);
+    if (ii == buffers.end())
+        return 0;
+    return ii->second.texture.get();
+}
+
 int CameraInfo::getMainSlaveIndex() const
 {
     return cameras.find( MAIN_CAMERA )->second.slaveIndex;
@@ -350,6 +367,10 @@ void CameraGroup::update(const osg::Vec3d& position,
             bool projectionDone = false;
             Matrix projectionMatrix;
             for ( CameraMap::const_iterator ii = info->cameras.begin(); ii != info->cameras.end(); ++ii ) {
+                if ( ii->first == SHADOW_CAMERA ) {
+                    globals->get_renderer()->updateShadowCamera(info, position);
+                    continue;
+                }
                 if ( ii->second.fullscreen )
                     continue;
 
@@ -1035,19 +1056,23 @@ void CameraGroup::setCameraCullMasks(Node::NodeMask nm)
             continue;
         osg::ref_ptr<osg::Camera> farCamera = info->getCamera(FAR_CAMERA);
         osg::Camera* camera = info->getCamera( MAIN_CAMERA );
-        if ( camera == 0 )
-            camera = info->getCamera( GEOMETRY_CAMERA );
-        if (farCamera.valid() && farCamera->getNodeMask() != 0) {
-            camera->setCullMask(nm & ~simgear::BACKGROUND_BIT);
-            camera->setCullMaskLeft(nm & ~simgear::BACKGROUND_BIT);
-            camera->setCullMaskRight(nm & ~simgear::BACKGROUND_BIT);
-            farCamera->setCullMask(nm);
-            farCamera->setCullMaskLeft(nm);
-            farCamera->setCullMaskRight(nm);
+        if (camera) {
+            if (farCamera.valid() && farCamera->getNodeMask() != 0) {
+                camera->setCullMask(nm & ~simgear::BACKGROUND_BIT);
+                camera->setCullMaskLeft(nm & ~simgear::BACKGROUND_BIT);
+                camera->setCullMaskRight(nm & ~simgear::BACKGROUND_BIT);
+                farCamera->setCullMask(nm);
+                farCamera->setCullMaskLeft(nm);
+                farCamera->setCullMaskRight(nm);
+            } else {
+                camera->setCullMask(nm);
+                camera->setCullMaskLeft(nm);
+                camera->setCullMaskRight(nm);
+            }
         } else {
-            camera->setCullMask(nm);
-            camera->setCullMaskLeft(nm);
-            camera->setCullMaskRight(nm);
+            camera = info->getCamera( GEOMETRY_CAMERA );
+            if (camera == 0) continue;
+            camera->setCullMask( nm & ~simgear::MODELLIGHT_BIT );
         }
     }
 }