More more occlusion culling.
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
};
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user