Removed CullViewState from the distribution, moved CullViewState::CullingMode

into CullVisitor, and then removed all references to CullViewState from other
parts of the scene graph.
This commit is contained in:
Robert Osfield 2002-04-24 20:24:10 +00:00
parent 7880fd3354
commit f0e7e8e48b
8 changed files with 51 additions and 173 deletions

View File

@ -101,10 +101,6 @@ SOURCE=..\..\src\osgUtil\CameraManipulator.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\..\src\osgUtil\CullViewState.cpp
# End Source File
# Begin Source File
SOURCE=..\..\src\osgUtil\CullVisitor.cpp SOURCE=..\..\src\osgUtil\CullVisitor.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -217,10 +213,6 @@ SOURCE=..\..\Include\osgUtil\CameraManipulator
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\..\Include\osgUtil\CullViewState
# End Source File
# Begin Source File
SOURCE=..\..\Include\osgUtil\CullVisitor SOURCE=..\..\Include\osgUtil\CullVisitor
# End Source File # End Source File
# Begin Source File # Begin Source File

View File

@ -1,89 +0,0 @@
//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 OSGUTIL_CULLVIEWSTATE
#define OSGUTIL_CULLVIEWSTATE 1
#include <osg/BoundingSphere>
#include <osg/BoundingBox>
#include <osg/Matrix>
#include <osg/ClippingVolume>
#include <osgUtil/Export>
namespace osgUtil {
/** Container class for encapsulating the viewing state in local
coordinates, during the cull traversal.
*/
class OSGUTIL_EXPORT CullViewState : public osg::Referenced
{
public:
CullViewState();
osg::ref_ptr<osg::Matrix> _projection;
osg::ref_ptr<osg::Matrix> _matrix;
osg::ref_ptr<osg::Matrix> _inverse;
osg::Vec3 _eyePoint;
osg::Vec3 _centerPoint;
osg::Vec3 _lookVector;
osg::Vec3 _upVector;
unsigned int _bbCornerFar;
unsigned int _bbCornerNear;
float _ratio2;
osg::ClippingVolume _clippingVolume;
enum
{
NO_CULLING = 0x00,
FRUSTUM_LEFT_CULLING = 0x01,
FRUSTUM_RIGHT_CULLING = 0x02,
FRUSTUM_BOTTOM_CULLING = 0x04,
FRUSTUM_TOP_CULLING = 0x08,
FRUSTUM_NEAR_CULLING = 0x10,
FRUSTUM_FAR_CULLING = 0x20,
VIEW_FRUSTUM_CULLING = 0x3F,
SMALL_FEATURE_CULLING = 0x40,
ENABLE_ALL_CULLING = 0x7F
};
typedef unsigned int CullingMode;
inline bool isCulled(const osg::BoundingSphere& sp,CullingMode& mode) const
{
if (!sp.isValid()) return true;
if (!_clippingVolume.contains(sp,mode)) return true;
if (mode&SMALL_FEATURE_CULLING)
{
osg::Vec3 delta(sp._center-_eyePoint);
if (sp.radius2()<delta.length2()*_ratio2)
{
return true;
}
}
return false;
}
inline bool isCulled(const osg::BoundingBox& bb,CullingMode mode) const
{
if (!bb.isValid()) return true;
return !_clippingVolume.contains(bb,mode);
}
protected:
~CullViewState();
};
}
#endif

View File

@ -18,7 +18,6 @@
#include <osgUtil/RenderGraph> #include <osgUtil/RenderGraph>
#include <osgUtil/RenderStage> #include <osgUtil/RenderStage>
#include <osgUtil/CullViewState>
#include <map> #include <map>
#include <vector> #include <vector>
@ -39,6 +38,23 @@ class OSGUTIL_EXPORT CullVisitor : public osg::NodeVisitor
{ {
public: public:
enum
{
NO_CULLING = 0x00,
FRUSTUM_LEFT_CULLING = 0x01,
FRUSTUM_RIGHT_CULLING = 0x02,
FRUSTUM_BOTTOM_CULLING = 0x04,
FRUSTUM_TOP_CULLING = 0x08,
FRUSTUM_NEAR_CULLING = 0x10,
FRUSTUM_FAR_CULLING = 0x20,
VIEW_FRUSTUM_CULLING = 0x3F,
SMALL_FEATURE_CULLING = 0x40,
ENABLE_ALL_CULLING = 0x7F
};
typedef unsigned int CullingMode;
CullVisitor(); CullVisitor();
virtual ~CullVisitor(); virtual ~CullVisitor();
@ -105,10 +121,10 @@ class OSGUTIL_EXPORT CullVisitor : public osg::NodeVisitor
void setTransparencySortMode(TransparencySortMode tsm) { _tsm = tsm; } void setTransparencySortMode(TransparencySortMode tsm) { _tsm = tsm; }
/** Sets the current CullingMode.*/ /** Sets the current CullingMode.*/
void setCullingMode(CullViewState::CullingMode mode); void setCullingMode(CullingMode mode);
/** Returns the current CullingMode.*/ /** Returns the current CullingMode.*/
CullViewState::CullingMode getCullingMode() const; CullingMode getCullingMode() const;
void pushViewport(osg::Viewport* viewport); void pushViewport(osg::Viewport* viewport);
@ -216,13 +232,13 @@ class OSGUTIL_EXPORT CullVisitor : public osg::NodeVisitor
} }
inline bool isCulled(const osg::BoundingSphere& sp,CullViewState::CullingMode& mode) const inline bool isCulled(const osg::BoundingSphere& sp,CullingMode& mode) const
{ {
if (!sp.isValid()) return true; if (!sp.isValid()) return true;
if (!(_modelviewClippingVolumeStack.back().contains(sp,mode))) return true; if (!(_modelviewClippingVolumeStack.back().contains(sp,mode))) return true;
if (mode&CullViewState::SMALL_FEATURE_CULLING) if (mode&SMALL_FEATURE_CULLING)
{ {
const float _ratio2 = 0.002f*0.002f; const float _ratio2 = 0.002f*0.002f;
osg::Vec3 delta(sp._center-getEyeLocal()); osg::Vec3 delta(sp._center-getEyeLocal());
@ -234,7 +250,7 @@ class OSGUTIL_EXPORT CullVisitor : public osg::NodeVisitor
return false; return false;
} }
inline const bool isCulled(const osg::BoundingBox& bb,CullViewState::CullingMode mode) const inline const bool isCulled(const osg::BoundingBox& bb,CullingMode mode) const
{ {
if (!bb.isValid()) return true; if (!bb.isValid()) return true;
@ -370,7 +386,7 @@ class OSGUTIL_EXPORT CullVisitor : public osg::NodeVisitor
typedef std::vector<osg::Vec3> EyePointStack; typedef std::vector<osg::Vec3> EyePointStack;
EyePointStack _eyePointStack; EyePointStack _eyePointStack;
typedef std::vector<CullViewState::CullingMode> CullingModeStack; typedef std::vector<CullingMode> CullingModeStack;
CullingModeStack _cullingModeStack; CullingModeStack _cullingModeStack;
unsigned int _bbCornerNear; unsigned int _bbCornerNear;

View File

@ -463,7 +463,7 @@ public:
if(_hudSceneView.valid()) if(_hudSceneView.valid())
{ {
_hudSceneView->getRenderStage()->setClearMask(0); _hudSceneView->getRenderStage()->setClearMask(0);
_hudSceneView->getCullVisitor()->setCullingMode(osgUtil::CullViewState::NO_CULLING); _hudSceneView->getCullVisitor()->setCullingMode(osgUtil::CullVisitor::NO_CULLING);
_hudSceneView->setCalcNearFar(false); _hudSceneView->setCalcNearFar(false);
_hudCam = osgNew osg::Camera; _hudCam = osgNew osg::Camera;

View File

@ -1017,9 +1017,9 @@ void Viewer::keyboard(unsigned char key, int x, int y)
case 'c' : case 'c' :
_smallFeatureCullingActive = !_smallFeatureCullingActive; _smallFeatureCullingActive = !_smallFeatureCullingActive;
sceneView->getCullVisitor()->setCullingMode((osgUtil::CullViewState::CullingMode) sceneView->getCullVisitor()->setCullingMode((osgUtil::CullVisitor::CullingMode)
((_smallFeatureCullingActive ? osgUtil::CullViewState::SMALL_FEATURE_CULLING : osgUtil::CullViewState::NO_CULLING) | ((_smallFeatureCullingActive ? osgUtil::CullVisitor::SMALL_FEATURE_CULLING : osgUtil::CullVisitor::NO_CULLING) |
(_viewFrustumCullingActive ? osgUtil::CullViewState::VIEW_FRUSTUM_CULLING : osgUtil::CullViewState::NO_CULLING))); (_viewFrustumCullingActive ? osgUtil::CullVisitor::VIEW_FRUSTUM_CULLING : osgUtil::CullVisitor::NO_CULLING)));
if (_smallFeatureCullingActive) if (_smallFeatureCullingActive)
{ {
osg::notify(osg::NOTICE) << "Small feature culling switched on "<< std::endl; osg::notify(osg::NOTICE) << "Small feature culling switched on "<< std::endl;
@ -1040,9 +1040,9 @@ void Viewer::keyboard(unsigned char key, int x, int y)
{ {
osg::notify(osg::NOTICE) << "View frustum culling switched off "<< std::endl; osg::notify(osg::NOTICE) << "View frustum culling switched off "<< std::endl;
} }
sceneView->getCullVisitor()->setCullingMode((osgUtil::CullViewState::CullingMode) sceneView->getCullVisitor()->setCullingMode((osgUtil::CullVisitor::CullingMode)
((_smallFeatureCullingActive ? osgUtil::CullViewState::SMALL_FEATURE_CULLING : osgUtil::CullViewState::NO_CULLING) | ((_smallFeatureCullingActive ? osgUtil::CullVisitor::SMALL_FEATURE_CULLING : osgUtil::CullVisitor::NO_CULLING) |
(_viewFrustumCullingActive ? osgUtil::CullViewState::VIEW_FRUSTUM_CULLING : osgUtil::CullViewState::NO_CULLING))); (_viewFrustumCullingActive ? osgUtil::CullVisitor::VIEW_FRUSTUM_CULLING : osgUtil::CullVisitor::NO_CULLING)));
break; break;
case 'P' : case 'P' :
@ -1065,25 +1065,18 @@ void Viewer::keyboard(unsigned char key, int x, int y)
case 'O' : case 'O' :
{ {
osg::Viewport* viewport = sceneView->getViewport(); osg::ref_ptr<osg::Viewport> viewport = osgNew osg::Viewport;
if (viewport) viewport->setViewport(_wx,_wy,_ww,_wh);
{ std::string filename("screenshot.bmp");
std::string filename("screenshot.bmp"); glReadBuffer(GL_FRONT);
osg::ref_ptr<Image> image = osgNew osg::Image;
image->readPixels(viewport->x(),viewport->y(),viewport->width(),viewport->height(),
GL_RGB,GL_UNSIGNED_BYTE);
glReadBuffer(GL_FRONT); osgDB::writeImageFile(*image,filename);
osg::ref_ptr<Image> image = osgNew osg::Image;
image->readPixels(viewport->x(),viewport->y(),viewport->width(),viewport->height(),
GL_RGB,GL_UNSIGNED_BYTE);
osgDB::writeImageFile(*image,filename); osg::notify(osg::NOTICE) << "Saved screen image to `"<<filename<<"`"<< std::endl;
osg::notify(osg::NOTICE) << "Saved screen image to `"<<filename<<"`"<< std::endl;
}
else
{
osg::notify(osg::NOTICE) << "Cannot create snapshot of screen, no valid viewport attached"<< std::endl;
}
} }
break; break;
case 'i' : case 'i' :

View File

@ -1,33 +0,0 @@
#include <osg/Transform>
#include <osg/Geode>
#include <osg/LOD>
#include <osg/Billboard>
#include <osg/LightSource>
#include <osg/Impostor>
#include <osg/Notify>
#include <osgUtil/CullViewState>
#include <float.h>
using namespace osg;
using namespace osgUtil;
//#define USE_OLD_CULL
CullViewState::CullViewState()
{
_projection = NULL;
_matrix = NULL;
_inverse = NULL;
_ratio2 = 0.002f*0.002f;
_bbCornerNear = 8; // note this is an error value, valid range is 0..7
_bbCornerFar = 8; // these error values are used to show a unset corner.
}
CullViewState::~CullViewState()
{
}

View File

@ -86,7 +86,7 @@ CullVisitor::CullVisitor()
// is a least this one value on the stack, therefore they never // is a least this one value on the stack, therefore they never
// check whether the stack is empty. This shouldn't be a problem // check whether the stack is empty. This shouldn't be a problem
// unless there is bug somewhere... // unless there is bug somewhere...
_cullingModeStack.push_back(CullViewState::ENABLE_ALL_CULLING); _cullingModeStack.push_back(ENABLE_ALL_CULLING);
//_tsm = LOOK_VECTOR_DISTANCE; //_tsm = LOOK_VECTOR_DISTANCE;
@ -335,20 +335,20 @@ void CullVisitor::updateCalculatedNearFar(const osg::Vec3& pos)
if (d>_computed_zfar) _computed_zfar = d; if (d>_computed_zfar) _computed_zfar = d;
} }
void CullVisitor::setCullingMode(CullViewState::CullingMode mode) void CullVisitor::setCullingMode(CullingMode mode)
{ {
_cullingModeStack.back()=mode; _cullingModeStack.back()=mode;
} }
CullViewState::CullingMode CullVisitor::getCullingMode() const CullVisitor::CullingMode CullVisitor::getCullingMode() const
{ {
return _cullingModeStack.back(); return _cullingModeStack.back();
} }
void CullVisitor::apply(Node& node) void CullVisitor::apply(Node& node)
{ {
CullViewState::CullingMode mode = _cullingModeStack.back(); CullingMode mode = _cullingModeStack.back();
if (!node.getCullingActive()) mode = 0; if (!node.getCullingActive()) mode = 0;
else if (node.getNumChildrenWithCullingDisabled()==0 && else if (node.getNumChildrenWithCullingDisabled()==0 &&
@ -375,7 +375,7 @@ void CullVisitor::apply(Geode& node)
{ {
// return if object's bounding sphere is culled. // return if object's bounding sphere is culled.
CullViewState::CullingMode mode = _cullingModeStack.back(); CullingMode mode = _cullingModeStack.back();
if (!node.getCullingActive()) mode = 0; if (!node.getCullingActive()) mode = 0;
else if (node.getNumChildrenWithCullingDisabled()==0 && else if (node.getNumChildrenWithCullingDisabled()==0 &&
@ -444,7 +444,7 @@ void CullVisitor::apply(Geode& node)
void CullVisitor::apply(Billboard& node) void CullVisitor::apply(Billboard& node)
{ {
// return if object's bounding sphere is culled. // return if object's bounding sphere is culled.
CullViewState::CullingMode mode = _cullingModeStack.back(); CullingMode mode = _cullingModeStack.back();
if (!node.getCullingActive()) mode = 0; if (!node.getCullingActive()) mode = 0;
else if (node.getNumChildrenWithCullingDisabled()==0 && else if (node.getNumChildrenWithCullingDisabled()==0 &&
@ -535,7 +535,7 @@ void CullVisitor::apply(LightSource& node)
void CullVisitor::apply(Group& node) void CullVisitor::apply(Group& node)
{ {
// return if object's bounding sphere is culled. // return if object's bounding sphere is culled.
CullViewState::CullingMode mode = _cullingModeStack.back(); CullingMode mode = _cullingModeStack.back();
if (!node.getCullingActive()) mode = 0; if (!node.getCullingActive()) mode = 0;
else if (node.getNumChildrenWithCullingDisabled()==0 && else if (node.getNumChildrenWithCullingDisabled()==0 &&
@ -560,7 +560,7 @@ void CullVisitor::apply(Group& node)
void CullVisitor::apply(Transform& node) void CullVisitor::apply(Transform& node)
{ {
// return if object's bounding sphere is culled. // return if object's bounding sphere is culled.
CullViewState::CullingMode mode = _cullingModeStack.back(); CullingMode mode = _cullingModeStack.back();
if (!node.getCullingActive()) mode = 0; if (!node.getCullingActive()) mode = 0;
else if (node.getNumChildrenWithCullingDisabled()==0 && else if (node.getNumChildrenWithCullingDisabled()==0 &&
@ -591,7 +591,7 @@ void CullVisitor::apply(Transform& node)
void CullVisitor::apply(Projection& node) void CullVisitor::apply(Projection& node)
{ {
// return if object's bounding sphere is culled. // return if object's bounding sphere is culled.
CullViewState::CullingMode mode = _cullingModeStack.back(); CullingMode mode = _cullingModeStack.back();
if (!node.getCullingActive()) mode = 0; if (!node.getCullingActive()) mode = 0;
else if (node.getNumChildrenWithCullingDisabled()==0 && else if (node.getNumChildrenWithCullingDisabled()==0 &&
@ -639,7 +639,7 @@ void CullVisitor::apply(Switch& node)
void CullVisitor::apply(LOD& node) void CullVisitor::apply(LOD& node)
{ {
// return if object's bounding sphere is culled. // return if object's bounding sphere is culled.
CullViewState::CullingMode mode = _cullingModeStack.back(); CullingMode mode = _cullingModeStack.back();
if (!node.getCullingActive()) mode = 0; if (!node.getCullingActive()) mode = 0;
else if (node.getNumChildrenWithCullingDisabled()==0 && else if (node.getNumChildrenWithCullingDisabled()==0 &&
@ -687,7 +687,7 @@ void CullVisitor::apply(Impostor& node)
const BoundingSphere& bs = node.getBound(); const BoundingSphere& bs = node.getBound();
// return if object's bounding sphere is culled. // return if object's bounding sphere is culled.
CullViewState::CullingMode mode = _cullingModeStack.back(); CullingMode mode = _cullingModeStack.back();
if (!node.getCullingActive()) mode = 0; if (!node.getCullingActive()) mode = 0;
else if (node.getNumChildrenWithCullingDisabled()==0 && else if (node.getNumChildrenWithCullingDisabled()==0 &&
@ -952,7 +952,7 @@ ImpostorSprite* CullVisitor::createImpostorSprite(Impostor& node)
// switch off the view frustum culling, since we will have // switch off the view frustum culling, since we will have
// the whole subgraph in view. // the whole subgraph in view.
_cullingModeStack.push_back((_cullingModeStack.back() & ~CullViewState::VIEW_FRUSTUM_CULLING)); _cullingModeStack.push_back((_cullingModeStack.back() & ~VIEW_FRUSTUM_CULLING));
{ {

View File

@ -5,7 +5,6 @@ include $(TOPDIR)/Make/makedefs
CXXFILES = \ CXXFILES = \
AppVisitor.cpp\ AppVisitor.cpp\
CameraManipulator.cpp\ CameraManipulator.cpp\
CullViewState.cpp\
CullVisitor.cpp\ CullVisitor.cpp\
DepthSortedBin.cpp\ DepthSortedBin.cpp\
DisplayListVisitor.cpp\ DisplayListVisitor.cpp\