More more occlusion culling.

This commit is contained in:
Robert Osfield
2002-06-08 19:58:05 +00:00
parent bf6bf60e21
commit 0a8d0a255f
8 changed files with 324 additions and 28 deletions

View File

@@ -77,6 +77,23 @@ class SG_EXPORT CullingSet : public Referenced
/** Compute the pixel of an bounding sphere.*/
float pixelSize(const BoundingSphere& bs) const { return bs.radius()/(bs.center()*_pixelSizeVector); }
inline void disableOccluder(NodePath& nodePath)
{
for(OccluderList::iterator itr=_occluderList.begin();
itr!=_occluderList.end();
++itr)
{
if (itr->getNodePath()==nodePath)
{
// we have trapped for the case an occlude potentially occluding itself,
// to prevent this we disable the results mask so that no subsequnt
// when the next pushCurrentMask calls happens this occluder is switched off.
itr->disableResultMasks();
}
}
}
inline bool isCulled(const BoundingBox& bb)
{
if (_mask&VIEW_FRUSTUM_CULLING)

View File

@@ -25,7 +25,7 @@ class SG_EXPORT Polytope
inline Polytope(const Polytope& cv) :
_maskStack(cv._maskStack),
_resultsMask(cv._resultsMask),
_resultMask(cv._resultMask),
_planeList(cv._planeList) {}
inline Polytope(const PlaneList& pl) : _planeList(pl) {setupMask();}
@@ -38,7 +38,7 @@ class SG_EXPORT Polytope
{
if (&cv==this) return *this;
_maskStack = cv._maskStack;
_resultsMask = cv._resultsMask;
_resultMask = cv._resultMask;
_planeList = cv._planeList;
return *this;
}
@@ -76,26 +76,27 @@ class SG_EXPORT Polytope
inline void setupMask()
{
_resultsMask = 0;
_resultMask = 0;
for(unsigned int i=0;i<_planeList.size();++i)
{
_resultsMask = (_resultsMask<<1) | 1;
_resultMask = (_resultMask<<1) | 1;
}
_maskStack.back() = _resultsMask;
_maskStack.back() = _resultMask;
}
inline ClippingMask& getCurrentMask() { return _maskStack.back(); }
inline ClippingMask getCurrentMask() const { return _maskStack.back(); }
inline ClippingMask getResultsMask() const
{
return _resultsMask;
}
inline void setResultMask(ClippingMask mask) { _resultMask=mask; }
inline ClippingMask getResultMask() const { return _resultMask; }
inline void pushCurrentMask()
{
_maskStack.push_back(_resultsMask);
_maskStack.push_back(_resultMask);
}
inline void popCurrentMask()
@@ -128,18 +129,18 @@ class SG_EXPORT Polytope
{
if (!_maskStack.back()) return true;
_resultsMask = _maskStack.back();
_resultMask = _maskStack.back();
ClippingMask selector_mask = 0x1;
for(PlaneList::const_iterator itr=_planeList.begin();
itr!=_planeList.end();
++itr)
{
if (_resultsMask&selector_mask)
if (_resultMask&selector_mask)
{
int res=itr->intersect(bs);
if (res<0) return false; // outside clipping set.
else if (res>0) _resultsMask ^= selector_mask; // subsequent checks against this plane not required.
else if (res>0) _resultMask ^= selector_mask; // subsequent checks against this plane not required.
}
selector_mask <<= 1;
}
@@ -155,18 +156,18 @@ class SG_EXPORT Polytope
{
if (!_maskStack.back()) return true;
_resultsMask = _maskStack.back();
_resultMask = _maskStack.back();
ClippingMask selector_mask = 0x1;
for(PlaneList::const_iterator itr=_planeList.begin();
itr!=_planeList.end();
++itr)
{
if (_resultsMask&selector_mask)
if (_resultMask&selector_mask)
{
int res=itr->intersect(bb);
if (res<0) return false; // outside clipping set.
else if (res>0) _resultsMask ^= selector_mask; // subsequent checks against this plane not required.
else if (res>0) _resultMask ^= selector_mask; // subsequent checks against this plane not required.
}
selector_mask <<= 1;
}
@@ -178,18 +179,18 @@ class SG_EXPORT Polytope
{
if (!_maskStack.back()) return false;
_resultsMask = _maskStack.back();
_resultMask = _maskStack.back();
ClippingMask selector_mask = 0x1;
for(PlaneList::const_iterator itr=_planeList.begin();
itr!=_planeList.end();
++itr)
{
if (_resultsMask&selector_mask)
if (_resultMask&selector_mask)
{
int res=itr->intersect(bs);
if (res<1) return false; // intersects, or is below plane.
_resultsMask ^= selector_mask; // subsequent checks against this plane not required.
_resultMask ^= selector_mask; // subsequent checks against this plane not required.
}
selector_mask <<= 1;
}
@@ -201,18 +202,18 @@ class SG_EXPORT Polytope
{
if (!_maskStack.back()) return false;
_resultsMask = _maskStack.back();
_resultMask = _maskStack.back();
ClippingMask selector_mask = 0x1;
for(PlaneList::const_iterator itr=_planeList.begin();
itr!=_planeList.end();
++itr)
{
if (_resultsMask&selector_mask)
if (_resultMask&selector_mask)
{
int res=itr->intersect(bb);
if (res<1) return false; // intersects, or is below plane.
_resultsMask ^= selector_mask; // subsequent checks against this plane not required.
_resultMask ^= selector_mask; // subsequent checks against this plane not required.
}
selector_mask <<= 1;
}
@@ -239,13 +240,13 @@ class SG_EXPORT Polytope
{
if (!_maskStack.back()) return;
_resultsMask = _maskStack.back();
_resultMask = _maskStack.back();
ClippingMask selector_mask = 0x1;
for(PlaneList::iterator itr=_planeList.begin();
itr!=_planeList.end();
++itr)
{
if (_resultsMask&selector_mask)
if (_resultMask&selector_mask)
{
itr->transformProvidingInverse(matrix);
selector_mask <<= 1;
@@ -257,7 +258,7 @@ class SG_EXPORT Polytope
fast_back_stack<ClippingMask> _maskStack;
ClippingMask _resultsMask;
ClippingMask _resultMask;
PlaneList _planeList;
};

View File

@@ -8,6 +8,7 @@
#include <osg/ref_ptr>
#include <osg/Polytope>
#include <osg/ConvexPlanerOccluder>
#include <osg/Node>
namespace osg {
@@ -21,6 +22,7 @@ class SG_EXPORT ShadowOccluderVolume
typedef std::vector<Polytope> HoleList;
ShadowOccluderVolume(const ShadowOccluderVolume& soc):
_nodePath(soc._nodePath),
_occluderVolume(soc._occluderVolume),
_holeList(soc._holeList) {}
@@ -28,9 +30,18 @@ class SG_EXPORT ShadowOccluderVolume
ShadowOccluderVolume(const ConvexPlanerOccluder& occluder,Matrix& MVP);
inline void disableResultMasks();
inline void pushCurrentMask();
inline void popCurrentMask();
/** Set the NodePath which describes the which node in the scene graph
* that this occluder was attached to.*/
inline void setNodePath(NodePath& nodePath) { _nodePath = nodePath; }
inline NodePath& getNodePath() { return _nodePath; }
inline const NodePath& getNodePath() const { return _nodePath; }
/** Convert shadow occluder into local coords by multiplying the
* clip space occluder by the ModelViewProjectionMatrix.*/
void set(const ShadowOccluderVolume& soc,Matrix& MVP);
@@ -60,11 +71,23 @@ class SG_EXPORT ShadowOccluderVolume
protected:
NodePath _nodePath;
Polytope _occluderVolume;
HoleList _holeList;
};
inline void ShadowOccluderVolume::disableResultMasks()
{
_occluderVolume.setResultMask(0);
for(HoleList::iterator itr=_holeList.begin();
itr!=_holeList.end();
++itr)
{
itr->setResultMask(0);
}
}
inline void ShadowOccluderVolume::pushCurrentMask()
{
_occluderVolume.pushCurrentMask();