14 #ifndef OSG_CullingSet
15 #define OSG_CullingSet 1
17 #include <osg/Polytope>
18 #include <osg/ShadowVolumeOccluder>
19 #include <osg/Viewport>
26 #define COMPILE_WITH_SHADOW_OCCLUSION_CULLING
42 _frustum(cs._frustum),
43 _stateFrustumList(cs._stateFrustumList),
44 _occluderList(cs._occluderList),
45 _pixelSizeVector(cs._pixelSizeVector),
46 _smallFeatureCullingPixelSize(cs._smallFeatureCullingPixelSize)
52 _frustum(cs._frustum),
53 _stateFrustumList(cs._stateFrustumList),
54 _occluderList(cs._occluderList),
55 _pixelSizeVector(pixelSizeVector),
56 _smallFeatureCullingPixelSize(cs._smallFeatureCullingPixelSize)
58 _frustum.transformProvidingInverse(matrix);
59 for(OccluderList::iterator itr=_occluderList.begin();
60 itr!=_occluderList.end();
63 itr->transformProvidingInverse(matrix);
69 if (
this==&cs)
return *
this;
97 _pixelSizeVector = pixelSizeVector;
103 _frustum.setAndTransformProvidingInverse(cs.
_frustum,matrix);
105 for(StateFrustumList::iterator sitr=_stateFrustumList.begin();
106 sitr!=_stateFrustumList.end();
109 sitr->second.transformProvidingInverse(matrix);
112 for(OccluderList::iterator oitr=_occluderList.begin();
113 oitr!=_occluderList.end();
116 oitr->transformProvidingInverse(matrix);
128 VIEW_FRUSTUM_SIDES_CULLING = 0x1,
129 NEAR_PLANE_CULLING = 0x2,
130 FAR_PLANE_CULLING = 0x4,
131 VIEW_FRUSTUM_CULLING = VIEW_FRUSTUM_SIDES_CULLING|
134 SMALL_FEATURE_CULLING = 0x8,
135 SHADOW_OCCLUSION_CULLING = 0x10,
136 DEFAULT_CULLING = VIEW_FRUSTUM_SIDES_CULLING|
137 SMALL_FEATURE_CULLING|
138 SHADOW_OCCLUSION_CULLING,
139 ENABLE_ALL_CULLING = VIEW_FRUSTUM_CULLING|
140 SMALL_FEATURE_CULLING|
141 SHADOW_OCCLUSION_CULLING
174 float pixelSize(
const Vec3& v,
float radius)
const {
return radius/(v*_pixelSizeVector); }
186 inline bool isCulled(
const std::vector<Vec3>& vertices)
188 if (_mask&VIEW_FRUSTUM_CULLING)
191 if (!_frustum.contains(vertices))
return true;
194 if (_mask&SMALL_FEATURE_CULLING)
198 if (_mask&SHADOW_OCCLUSION_CULLING)
201 if (!_occluderList.empty())
203 for(OccluderList::iterator itr=_occluderList.begin();
204 itr!=_occluderList.end();
207 if (itr->contains(vertices))
return true;
217 if (_mask&VIEW_FRUSTUM_CULLING)
220 if (!_frustum.contains(bb))
return true;
223 if (_mask&SMALL_FEATURE_CULLING)
227 if (_mask&SHADOW_OCCLUSION_CULLING)
230 if (!_occluderList.empty())
232 for(OccluderList::iterator itr=_occluderList.begin();
233 itr!=_occluderList.end();
236 if (itr->contains(bb))
return true;
246 if (_mask&VIEW_FRUSTUM_CULLING)
249 if (!_frustum.contains(bs))
return true;
252 if (_mask&SMALL_FEATURE_CULLING)
254 if (((bs.
center()*_pixelSizeVector)*_smallFeatureCullingPixelSize)>bs.
radius())
return true;
256 #ifdef COMPILE_WITH_SHADOW_OCCLUSION_CULLING
257 if (_mask&SHADOW_OCCLUSION_CULLING)
260 if (!_occluderList.empty())
262 for(OccluderList::iterator itr=_occluderList.begin();
263 itr!=_occluderList.end();
266 if (itr->contains(bs))
return true;
275 inline bool isCulled(
const Bound& bound)
277 if (bound.bb)
return isCulled(*bound.bb);
278 else return isCulled(*bound.bs);
283 _frustum.pushCurrentMask();
285 if (!_stateFrustumList.empty())
287 for(StateFrustumList::iterator itr=_stateFrustumList.begin();
288 itr!=_stateFrustumList.end();
291 itr->second.pushCurrentMask();
296 #ifdef COMPILE_WITH_SHADOW_OCCLUSION_CULLING
297 if (!_occluderList.empty())
299 for(OccluderList::iterator itr=_occluderList.begin();
300 itr!=_occluderList.end();
303 itr->pushCurrentMask();
311 _frustum.popCurrentMask();
313 if (!_stateFrustumList.empty())
315 for(StateFrustumList::iterator itr=_stateFrustumList.begin();
316 itr!=_stateFrustumList.end();
319 itr->second.popCurrentMask();
323 #ifdef COMPILE_WITH_SHADOW_OCCLUSION_CULLING
324 if (!_occluderList.empty())
326 for(OccluderList::iterator itr=_occluderList.begin();
327 itr!=_occluderList.end();
330 itr->popCurrentMask();
338 _frustum.setResultMask(_frustum.getCurrentMask());
341 void disableAndPushOccludersCurrentMask(
NodePath& nodePath);
343 void popOccludersCurrentMask(
NodePath& nodePath);
void setSmallFeatureCullingPixelSize(float value)
bool isCulled(const std::vector< Vec3 > &vertices)
void getStateFrustumList(StateFrustumList &sfl)
const Vec4 & getPixelSizeVector() const
std::vector< StateFrustumPair > StateFrustumList
Mask getCullingMask() const
StateFrustumList _stateFrustumList
bool isCulled(const BoundingSphere &bs)
float _smallFeatureCullingPixelSize
float & getSmallFeatureCullingPixelSize()
Vec4 & getPixelSizeVector()
void setCullingMask(Mask mask)
float pixelSize(const BoundingSphere &bs) const
float pixelSize(const Vec3 &v, float radius) const
CullingSet(const CullingSet &cs, const Matrix &matrix, const Vec4 &pixelSizeVector)
void set(const CullingSet &cs, const Matrix &matrix, const Vec4 &pixelSizeVector)
void addStateFrustum(StateSet *stateset, Polytope &polytope)
void addOccluder(ShadowVolumeOccluder &cv)
float clampedPixelSize(const BoundingSphere &bs) const
StateFrustumList & getStateFrustumList()
CullingSet(const CullingSet &cs)
bool isCulled(const BoundingBox &bb)
std::vector< ShadowVolumeOccluder > OccluderList
float getSmallFeatureCullingPixelSize() const
void set(const CullingSet &cs)
float clampedPixelSize(const Vec3 &v, float radius) const
const Polytope & getFrustum() const
OccluderList _occluderList
void setPixelSizeVector(const Vec4 &v)
std::pair< osg::ref_ptr< osg::StateSet >, osg::Polytope > StateFrustumPair
std::vector< Node * > NodePath
void setFrustum(Polytope &cv)