//C++ header - Open Scene Graph - Copyright (C) 1998-2001 Robert Osfield //Distributed under the terms of the GNU Library General Public License (LGPL) //as published by the Free Software Foundation. #ifndef OSG_COLLECTOCCLUDERSVISITOR #define OSG_COLLECTOCCLUDERSVISITOR 1 #include #include namespace osg { class SG_EXPORT CollectOccludersVisitor : public osg::NodeVisitor, public osg::CullStack { public: CollectOccludersVisitor(); virtual ~CollectOccludersVisitor(); virtual CollectOccludersVisitor* cloneType() const { return new CollectOccludersVisitor(); } virtual void reset(); virtual void apply(osg::Node&); virtual void apply(osg::Transform& node); virtual void apply(osg::Projection& node); virtual void apply(osg::Switch& node); virtual void apply(osg::LOD& node); virtual void apply(osg::OccluderNode& node); void setMinimumShadowOccluderVolume(float vol) { _minimumShadowOccluderVolume = vol; } float getMinimumShadowOccluderVolume() const { return _minimumShadowOccluderVolume; } void setCreateDrawablesOnOccludeNodes(bool flag) { _createDrawables=flag; } bool getCreateDrawablesOnOccludeNodes() const { return _createDrawables; } void setCollectedOcculderList(const ShadowVolumeOccluderList& svol) { _occluderList = svol; } ShadowVolumeOccluderList& getCollectedOccluderList() { return _occluderList; } const ShadowVolumeOccluderList& getCollectedOccluderList() const { return _occluderList; } protected: /** prevent unwanted copy construction.*/ CollectOccludersVisitor(const CollectOccludersVisitor&):osg::NodeVisitor(),osg::CullStack() {} /** prevent unwanted copy operator.*/ CollectOccludersVisitor& operator = (const CollectOccludersVisitor&) { return *this; } inline void handle_cull_callbacks_and_traverse(osg::Node& node) { /*osg::NodeCallback* callback = node.getCullCallback(); if (callback) (*callback)(&node,this); else*/ if (node.getNumChildrenWithOccluderNodes()>0) traverse(node); } inline void handle_cull_callbacks_and_accept(osg::Node& node,osg::Node* acceptNode) { /*osg::NodeCallback* callback = node.getCullCallback(); if (callback) (*callback)(&node,this); else*/ if (node.getNumChildrenWithOccluderNodes()>0) acceptNode->accept(*this); } float _minimumShadowOccluderVolume; bool _createDrawables; ShadowVolumeOccluderList _collectedOccluderList; }; } #endif