]> git.mxchange.org Git - simgear.git/commitdiff
Disable LOD when rendering to the shadow map.
authorFrederic Bouvier <fredfgfs01@free.fr>
Sun, 1 Apr 2012 21:06:32 +0000 (23:06 +0200)
committerFrederic Bouvier <fredfgfs01@free.fr>
Sun, 1 Apr 2012 21:06:32 +0000 (23:06 +0200)
Produce few NaNs at start

simgear/scene/material/EffectCullVisitor.cxx
simgear/scene/material/EffectCullVisitor.hxx

index c44d8d695c1cf086ba42793030a2d829c71f2db1..8f7637c94bb35b5c40624eea0c618d0fea46cc0f 100644 (file)
@@ -20,6 +20,7 @@
 
 #include <osg/StateSet>
 #include <osg/Texture2D>
+#include <osg/LOD>
 
 #include "EffectCullVisitor.hxx"
 
@@ -34,14 +35,23 @@ namespace simgear
 
 using osgUtil::CullVisitor;
 
-EffectCullVisitor::EffectCullVisitor(bool collectLights) :
+EffectCullVisitor::EffectCullVisitor() :
+    _ignoreLOD(false),
+    _collectLights(false)
+{
+}
+
+EffectCullVisitor::EffectCullVisitor(bool ignoreLOD, bool collectLights) :
+    _ignoreLOD(ignoreLOD),
     _collectLights(collectLights)
 {
 }
 
 EffectCullVisitor::EffectCullVisitor(const EffectCullVisitor& rhs) :
     osg::Referenced(rhs),
-    CullVisitor(rhs)
+    CullVisitor(rhs),
+    _ignoreLOD(rhs._ignoreLOD),
+    _collectLights(rhs._collectLights)
 {
 }
 
@@ -50,6 +60,30 @@ CullVisitor* EffectCullVisitor::clone() const
     return new EffectCullVisitor(*this);
 }
 
+void EffectCullVisitor::apply(osg::LOD& node)
+{
+    if (_ignoreLOD) {
+        if (isCulled(node)) return;
+
+        // push the culling mode.
+        pushCurrentMask();
+
+        // push the node's state.
+        osg::StateSet* node_state = node.getStateSet();
+        if (node_state) pushStateSet(node_state);
+
+        if (_traversalMode==TRAVERSE_PARENTS) node.osg::Group::ascend(*this);
+        else if (_traversalMode!=TRAVERSE_NONE) node.osg::Group::traverse(*this);
+        // pop the node's state off the render graph stack.
+        if (node_state) popStateSet();
+
+        // pop the culling mode.
+        popCurrentMask();
+    }
+    else
+        CullVisitor::apply(node);
+}
+
 void EffectCullVisitor::apply(osg::Geode& node)
 {
     if (isCulled(node))
index c4d3c6300ad3181d80028afbffe2265d1a5662af..341dfb025d7b5a16c8aeaa510b4fe2c27d68d489 100644 (file)
@@ -33,10 +33,12 @@ class EffectGeode;
 class EffectCullVisitor : public osgUtil::CullVisitor
 {
 public:
-    EffectCullVisitor(bool collectLights = false);
+    EffectCullVisitor();
+    EffectCullVisitor(bool ignoreLOD, bool collectLights = false);
     EffectCullVisitor(const EffectCullVisitor&);
     virtual osgUtil::CullVisitor* clone() const;
     using osgUtil::CullVisitor::apply;
+    virtual void apply(osg::LOD& node);
     virtual void apply(osg::Geode& node);
     virtual void reset();
 
@@ -47,6 +49,7 @@ public:
 private:
     std::map<int,osg::ref_ptr<osg::Texture2D> > _bufferList;
     std::vector<osg::ref_ptr<EffectGeode> > _lightList;
+    bool _ignoreLOD;
     bool _collectLights;
 };
 }