From Paul Martz, Introduced osg::OcclusionQueryNode with support for OpenGL occlusion query extension

This commit is contained in:
Robert Osfield
2007-12-21 14:45:16 +00:00
parent 5f7a2968ac
commit 4889342c4a
10 changed files with 1693 additions and 0 deletions

View File

@@ -30,6 +30,7 @@ class LightSource;
class LOD;
class MatrixTransform;
class OccluderNode;
class OcclusionQueryNode;
class PagedLOD;
class PositionAttitudeTransform;
class Projection;
@@ -256,6 +257,7 @@ class OSG_EXPORT NodeVisitor : public virtual Referenced
virtual void apply(PagedLOD& node) { apply((LOD&)node); }
virtual void apply(ClearNode& node) { apply((Group&)node); }
virtual void apply(OccluderNode& node) { apply((Group&)node); }
virtual void apply(OcclusionQueryNode& node) { apply((Group&)node); }
/** Callback for managing database paging, such as generated by PagedLOD nodes.*/

View File

@@ -0,0 +1,113 @@
//
// Copyright (C) 2007 Skew Matrix Software LLC (http://www.skew-matrix.com)
//
// This library is open source and may be redistributed and/or modified under
// the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
// (at your option) any later version. The full license is in LICENSE file
// included with this distribution, and on the openscenegraph.org website.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// OpenSceneGraph Public License for more details.
//
#ifndef OSG_OCCLUSION_QUERY_NODE
#define OSG_OCCLUSION_QUERY_NODE 1
#include <osg/Export>
#include <osg/CopyOp>
#include <osg/Group>
namespace osg {
// This Node performs occlusion query testing on its children.
// You can use it directly to occlusion query test a portion
// of your scene graph, or you can use it implicitly with an
// OcclusionQueryRoot, which places OcclusionQueryNodes where
// needed and acts as a master control.
class OSG_EXPORT OcclusionQueryNode : public osg::Group
{
public:
OcclusionQueryNode();
// Copy constructor using CopyOp to manage deep vs shallow copy.
OcclusionQueryNode( const OcclusionQueryNode& oqn, const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY );
META_Node( osg, OcclusionQueryNode );
virtual osg::BoundingSphere computeBound() const;
// When disabled, OQN doesn't perform occlusion queries, and simply
// renders its children.
void setQueriesEnabled( bool enable=true );
bool getQueriesEnabled() const { return _enabled; }
// Sets/gets the visibility threshold. If the test indicates that
// the number of visible pixels is less than the specified
// threshold, don't draw the actual geometry.
void setVisibilityThreshold( unsigned int pixels ) { _visThreshold = pixels; }
unsigned int getVisibilityThreshold() const { return _visThreshold; }
// Specifies how many frames to wait before issuing another query.
void setQueryFrameCount( int frames ) { _queryFrameCount = frames; }
int getQueryFrameCount() const { return _queryFrameCount; }
// Indicate whether or not the bounding box used in the occlusion query test
// should be rendered. Handy for debugging and development.
// Should only be called outside of cull/draw. No thread issues.
void setDebugDisplay( bool enable );
bool getDebugDisplay() const;
// Set the StateSets used by the OQN when rendering OQ geometry
// or debug bounding geometry.
void setQueryStateSets( osg::StateSet* ss, osg::StateSet* ssDebug );
// For statistics gathering, e.g., by a NodeVisitor.
bool getPassed() const;
// These methods are public so that osgUtil::CullVisitor can access them.
// Not intended for application use.
bool getPassed( const osg::Camera* camera, float distanceToEyePoint );
void traverseQuery( const osg::Camera* camera, osg::NodeVisitor& nv );
void traverseDebug( osg::NodeVisitor& nv );
protected:
virtual ~OcclusionQueryNode();
void createSupportNodes();
osg::ref_ptr< osg::Geode > _queryGeode;
osg::ref_ptr< osg::Geode > _debugGeode;
bool _enabled;
// Tracks the last frame number that we performed a query.
// User can set how many times (See setQueryFrameCount).
typedef std::map< const osg::Camera*, int > FrameCountMap;
FrameCountMap _frameCountMap;
mutable OpenThreads::Mutex _frameCountMutex;
// For statistics gathering
bool _passed;
// User-settable variables
unsigned int _visThreshold;
int _queryFrameCount;
bool _debugBB;
// Required to ensure that computeBound() is thread-safe.
mutable OpenThreads::Mutex _computeBoundMutex;
};
}
#endif

View File

@@ -91,6 +91,7 @@ class OSGUTIL_EXPORT CullVisitor : public osg::NodeVisitor, public osg::CullStac
virtual void apply(osg::ClearNode& node);
virtual void apply(osg::Camera& node);
virtual void apply(osg::OccluderNode& node);
virtual void apply(osg::OcclusionQueryNode& node);
/** Push state set on the current state group.
* If the state exists in a child state group of the current