]> git.mxchange.org Git - flightgear.git/commitdiff
Add simple conditions (no opengl related tests) to buffers, stages and attachments
authorFrederic Bouvier <fredfgfs01@free.fr>
Fri, 11 May 2012 22:14:36 +0000 (00:14 +0200)
committerFrederic Bouvier <fredfgfs01@free.fr>
Sat, 12 May 2012 11:45:40 +0000 (13:45 +0200)
src/Viewer/CameraGroup.cxx
src/Viewer/renderer.cxx
src/Viewer/renderingpipeline.cxx
src/Viewer/renderingpipeline.hxx

index 87bfe3c9bfc243be6163a78dcf295588f9b54648..71b11d0656eac85bf87cdb8b45b08e5e52f74149 100644 (file)
@@ -32,7 +32,6 @@
 #include <simgear/structure/OSGVersion.hxx>
 #include <simgear/scene/material/EffectCullVisitor.hxx>
 #include <simgear/scene/util/RenderConstants.hxx>
-#include <simgear/scene/tgdb/userdata.hxx>
 
 #include <algorithm>
 #include <cstring>
@@ -1036,8 +1035,6 @@ CameraInfo* CameraGroup::buildGUICamera(SGPropertyNode* cameraNode,
 CameraGroup* CameraGroup::buildCameraGroup(osgViewer::Viewer* viewer,
                                            SGPropertyNode* gnode)
 {
-    sgUserDataInit( globals->get_props() );
-
     CameraGroup* cgroup = new CameraGroup(viewer);
     for (int i = 0; i < gnode->nChildren(); ++i) {
         SGPropertyNode* pNode = gnode->getChild(i);
index 75e2e42164de19ee164967ff3ba9a6f610ef4cae..731eefcedeaff936c1d5064464fe0523c7c8f8b2 100644 (file)
@@ -79,6 +79,7 @@
 #include <simgear/scene/util/SGSceneUserData.hxx>
 #include <simgear/scene/tgdb/GroundLightManager.hxx>
 #include <simgear/scene/tgdb/pt_lights.hxx>
+#include <simgear/scene/tgdb/userdata.hxx>
 #include <simgear/structure/OSGUtils.hxx>
 #include <simgear/props/props.hxx>
 #include <simgear/timing/sg_time.hxx>
@@ -502,6 +503,8 @@ public:
 void
 FGRenderer::init( void )
 {
+    sgUserDataInit( globals->get_props() );
+
     _classicalRenderer = !fgGetBool("/sim/rendering/rembrandt/enabled", false);
     _shadowMapSize    = fgGetInt( "/sim/rendering/shadows/map-size", 4096 );
     fgAddChangeListener( new ShadowMapSizeListener, "/sim/rendering/shadows/map-size" );
@@ -822,6 +825,13 @@ osg::Camera* FGRenderer::buildDefaultDeferredGeometryCamera( CameraInfo* info, o
     return buildDeferredGeometryCamera(info, gc, GEOMETRY_CAMERA, attachments);
 }
 
+void buildAttachments(CameraInfo* info, osg::Camera* camera, const std::string& name, const std::vector<ref_ptr<FGRenderingPipeline::Attachment> > &attachments) {
+    BOOST_FOREACH(ref_ptr<FGRenderingPipeline::Attachment> attachment, attachments) {
+        if (attachment->valid())
+            attachBufferToCamera( info, camera, attachment->component, name, attachment->buffer );
+    }
+}
+
 osg::Camera* FGRenderer::buildDeferredGeometryCamera( CameraInfo* info, osg::GraphicsContext* gc, const std::string& name, const std::vector<ref_ptr<FGRenderingPipeline::Attachment> > &attachments )
 {
     osg::Camera* camera = new osg::Camera;
@@ -837,9 +847,7 @@ osg::Camera* FGRenderer::buildDeferredGeometryCamera( CameraInfo* info, osg::Gra
     camera->setRenderTargetImplementation( osg::Camera::FRAME_BUFFER_OBJECT );
     camera->setRenderOrder(osg::Camera::NESTED_RENDER, 0);
     camera->setViewport( new osg::Viewport );
-    BOOST_FOREACH(ref_ptr<FGRenderingPipeline::Attachment> attachment, attachments) {
-        attachBufferToCamera( info, camera, attachment->component, name, attachment->buffer );
-    }
+    buildAttachments(info, camera, name, attachments);
     camera->setDrawBuffer(GL_FRONT);
     camera->setReadBuffer(GL_FRONT);
 
@@ -907,9 +915,7 @@ osg::Camera* FGRenderer::buildDeferredShadowCamera( CameraInfo* info, osg::Graph
     mainShadowCamera->setAllowEventFocus(false);
     mainShadowCamera->setGraphicsContext(gc);
     mainShadowCamera->setRenderTargetImplementation( osg::Camera::FRAME_BUFFER_OBJECT );
-    BOOST_FOREACH(ref_ptr<FGRenderingPipeline::Attachment> attachment, attachments) {
-        attachBufferToCamera( info, mainShadowCamera, attachment->component, name, attachment->buffer );
-    }
+    buildAttachments(info, mainShadowCamera, name, attachments);
     mainShadowCamera->setComputeNearFarMode(osg::Camera::DO_NOT_COMPUTE_NEAR_FAR);
     mainShadowCamera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
     mainShadowCamera->setProjectionMatrix(osg::Matrix::identity());
@@ -1131,9 +1137,7 @@ osg::Camera* FGRenderer::buildDeferredLightingCamera( CameraInfo* info, osg::Gra
     camera->setRenderOrder(osg::Camera::NESTED_RENDER, 50);
     camera->setRenderTargetImplementation( osg::Camera::FRAME_BUFFER_OBJECT );
     camera->setViewport( new osg::Viewport );
-    BOOST_FOREACH(ref_ptr<FGRenderingPipeline::Attachment> attachment, attachments) {
-        attachBufferToCamera( info, camera, attachment->component, name, attachment->buffer );
-    }
+    buildAttachments(info, camera, name, attachments);
     camera->setDrawBuffer(GL_FRONT);
     camera->setReadBuffer(GL_FRONT);
     camera->setClearColor( osg::Vec4( 0., 0., 0., 1. ) );
@@ -1289,9 +1293,7 @@ FGRenderer::buildDeferredFullscreenCamera( flightgear::CameraInfo* info, osg::Gr
     camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
     camera->setRenderOrder(osg::Camera::NESTED_RENDER, stage->orderNum);
     camera->setRenderTargetImplementation( osg::Camera::FRAME_BUFFER_OBJECT );
-    BOOST_FOREACH(ref_ptr<FGRenderingPipeline::Attachment> attachment, stage->attachments) {
-        attachBufferToCamera( info, camera, attachment->component, stage->name, attachment->buffer );
-    }
+    buildAttachments(info, camera, stage->name, stage->attachments);
     camera->setDrawBuffer(GL_FRONT);
     camera->setReadBuffer(GL_FRONT);
     camera->setClearColor( osg::Vec4( 1., 1., 1., 1. ) );
@@ -1405,6 +1407,9 @@ void FGRenderer::buildStage(FGRenderingPipeline* rpipe, CameraInfo* info,
                                         const osg::Matrix& projection,
                                         osg::GraphicsContext* gc)
 {
+    if (!stage->valid())
+        return;
+
     ref_ptr<Camera> camera;
     if (stage->type == "geometry")
         camera = buildDeferredGeometryCamera(info, gc, stage->name, stage->attachments);
@@ -1432,15 +1437,17 @@ void FGRenderer::buildBuffers(FGRenderingPipeline* rpipe, CameraInfo* info)
 {
     for (size_t i = 0; i < rpipe->buffers.size(); ++i) {
         osg::ref_ptr<FGRenderingPipeline::Buffer> buffer = rpipe->buffers[i];
-        bool fullscreen = buffer->width == -1 && buffer->height == -1;
-        info->addBuffer(buffer->name, buildDeferredBuffer( buffer->internalFormat,
-                                                            buffer->sourceFormat,
-                                                            buffer->sourceType,
-                                                            buffer->wrapMode,
-                                                            buffer->shadowComparison),
-                        fullscreen ? buffer->scaleFactor : 0.0f);
-        if (!fullscreen) {
-            info->getBuffer(buffer->name)->setTextureSize(buffer->width, buffer->height);
+        if (buffer->valid()) {
+            bool fullscreen = buffer->width == -1 && buffer->height == -1;
+            info->addBuffer(buffer->name, buildDeferredBuffer( buffer->internalFormat,
+                                                                buffer->sourceFormat,
+                                                                buffer->sourceType,
+                                                                buffer->wrapMode,
+                                                                buffer->shadowComparison),
+                            fullscreen ? buffer->scaleFactor : 0.0f);
+            if (!fullscreen) {
+                info->getBuffer(buffer->name)->setTextureSize(buffer->width, buffer->height);
+            }
         }
     }
 }
index 9b3cd96064abf787039eca60909bf00422c24ec0..1dc3043d6c49da4c28ee824e9d8f9674dc150597 100644 (file)
@@ -85,6 +85,40 @@ FGRenderingPipeline* makeRenderingPipeline(const std::string& name,
 
 }
 
+void
+FGRenderingPipeline::Conditionable::parseCondition(SGPropertyNode* prop)
+{
+    const SGPropertyNode* predProp = prop->getChild("condition");
+    if (!predProp) {
+        setAlwaysValid(true);
+    } else {
+        try {
+            flightgear::PipelinePredParser parser;
+            SGExpressionb* validExp = dynamic_cast<SGExpressionb*>(parser.read(predProp->getChild(0)));
+            if (validExp)
+                setValidExpression(validExp);
+            else
+                throw simgear::expression::ParseError("pipeline condition is not a boolean expression");
+        }
+        catch (simgear::expression::ParseError& except)
+        {
+            SG_LOG(SG_INPUT, SG_ALERT,
+                   "parsing pipeline condition " << except.getMessage());
+            setAlwaysValid(false);
+        }
+    }
+}
+
+void FGRenderingPipeline::Conditionable::setValidExpression(SGExpressionb* exp)
+{
+    _validExpression = exp;
+}
+
+bool FGRenderingPipeline::Conditionable::valid()
+{
+    return _alwaysValid || _validExpression->getValue();
+}
+
 template<typename T>
 void findAttrOrHex(const simgear::effect::EffectPropertyMap<T>& pMap,
               const SGPropertyNode* prop,
@@ -172,11 +206,23 @@ FGRenderingPipeline::Buffer::Buffer(SGPropertyNode* prop)
     if (!nameProp.valid()) {
         throw sg_exception("Buffer name is mandatory");
     }
+    internalFormat = GL_RGBA8;
+    sourceFormat = GL_RGBA;
+    sourceType = GL_UNSIGNED_BYTE;
+    wrapMode = GL_CLAMP_TO_BORDER_ARB;
     name = nameProp->getStringValue();
-    findAttrOrHex(internalFormats, prop->getChild("internal-format"), internalFormat);
-    findAttrOrHex(sourceFormats, prop->getChild("source-format"), sourceFormat);
-    findAttrOrHex(sourceTypes, prop->getChild("source-type"), sourceType);
-    findAttrOrHex(wrapModes, prop->getChild("wrap-mode"), wrapMode);
+    SGPropertyNode* internalFormatProp = prop->getChild("internal-format");
+    if (internalFormatProp)
+        findAttrOrHex(internalFormats, internalFormatProp, internalFormat);
+    SGPropertyNode* sourceFormatProp = prop->getChild("source-format");
+    if (sourceFormatProp)
+        findAttrOrHex(sourceFormats, sourceFormatProp, sourceFormat);
+    SGPropertyNode* sourceTypeProp = prop->getChild("source-type");
+    if (sourceTypeProp)
+        findAttrOrHex(sourceTypes, sourceTypeProp, sourceType);
+    SGPropertyNode* wrapModeProp = prop->getChild("wrap-mode");
+    if (wrapModeProp)
+        findAttrOrHex(wrapModes, wrapModeProp, wrapMode);
     SGConstPropertyNode_ptr widthProp = getPropertyChild(prop, "width");
     if (!widthProp.valid())
         width = -1;
@@ -195,6 +241,8 @@ FGRenderingPipeline::Buffer::Buffer(SGPropertyNode* prop)
 
     scaleFactor = prop->getFloatValue("scale-factor", 1.f);
     shadowComparison = prop->getBoolValue("shadow-comparison", false);
+
+    parseCondition(prop);
 }
 
 simgear::effect::EffectNameValue<osg::Camera::BufferComponent> componentsInit[] =
@@ -232,6 +280,8 @@ FGRenderingPipeline::Stage::Stage(SGPropertyNode* prop)
     for (int i = 0; i < (int)attachments.size(); ++i) {
         this->attachments.push_back(new FGRenderingPipeline::Attachment(attachments[i]));
     }
+
+    parseCondition(prop);
 }
 
 FGRenderingPipeline::Attachment::Attachment(SGPropertyNode* prop)
@@ -242,6 +292,8 @@ FGRenderingPipeline::Attachment::Attachment(SGPropertyNode* prop)
         throw sg_exception("Attachment buffer is mandatory");
     }
     buffer = bufferProp->getStringValue();
+
+    parseCondition(prop);
 }
 
 FGRenderingPipeline::FGRenderingPipeline()
index 2fc705d412d7e72a6d6d9ec6b78f8c08ecd1fddb..e05037e38ef4b81c8397aaaf32c0e39f5f15aa7a 100644 (file)
@@ -6,6 +6,8 @@
 #include <osg/Camera>
 #include <string>
 
+#include <simgear/structure/SGExpression.hxx>
+
 namespace simgear
 {
 class SGReaderWriterOptions;
@@ -24,7 +26,19 @@ namespace flightgear {
 
 class FGRenderingPipeline : public osg::Referenced {
 public:
-    struct Buffer : public osg::Referenced {
+    class Conditionable : public osg::Referenced {
+    public:
+        Conditionable() : _alwaysValid(false) {}
+        void parseCondition(SGPropertyNode* prop);
+        bool getAlwaysValid() const { return _alwaysValid; }
+        void setAlwaysValid(bool val) { _alwaysValid = val; }
+        void setValidExpression(SGExpressionb* exp);
+        bool valid();
+    protected:
+        bool _alwaysValid;
+        SGSharedPtr<SGExpressionb> _validExpression;
+    };
+    struct Buffer : public Conditionable {
         Buffer(SGPropertyNode* prop);
 
         std::string name;
@@ -40,14 +54,14 @@ public:
                //osg::Vec4 borderColor;
     };
 
-    struct Pass : public osg::Referenced {
+    struct Pass : public Conditionable {
         Pass(SGPropertyNode* prop);
 
         std::string name;
         std::string type;
     };
 
-    struct Attachment : public osg::Referenced {
+    struct Attachment : public Conditionable {
         Attachment(SGPropertyNode* prop);
         Attachment(osg::Camera::BufferComponent c, const std::string& b ) : component(c), buffer(b) {}
 
@@ -56,7 +70,7 @@ public:
     };
     typedef std::vector<osg::ref_ptr<Attachment> > AttachmentList;
 
-    struct Stage : public osg::Referenced {
+    struct Stage : public Conditionable {
         Stage(SGPropertyNode* prop);
 
         std::string name;
@@ -78,4 +92,13 @@ public:
                    const simgear::SGReaderWriterOptions* options);
 };
 
+namespace flightgear {
+
+class PipelinePredParser : public simgear::expression::ExpressionParser
+{
+public:
+protected:
+};
+}
+
 #endif