15#define OSG_CullingSet 1
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;
276 _frustum.pushCurrentMask();
278 if (!_stateFrustumList.empty())
280 for(StateFrustumList::iterator itr=_stateFrustumList.begin();
281 itr!=_stateFrustumList.end();
284 itr->second.pushCurrentMask();
289#ifdef COMPILE_WITH_SHADOW_OCCLUSION_CULLING
290 if (!_occluderList.empty())
292 for(OccluderList::iterator itr=_occluderList.begin();
293 itr!=_occluderList.end();
296 itr->pushCurrentMask();
304 _frustum.popCurrentMask();
306 if (!_stateFrustumList.empty())
308 for(StateFrustumList::iterator itr=_stateFrustumList.begin();
309 itr!=_stateFrustumList.end();
312 itr->second.popCurrentMask();
316#ifdef COMPILE_WITH_SHADOW_OCCLUSION_CULLING
317 if (!_occluderList.empty())
319 for(OccluderList::iterator itr=_occluderList.begin();
320 itr!=_occluderList.end();
323 itr->popCurrentMask();
331 _frustum.setResultMask(_frustum.getCurrentMask());
Definition BoundingBox:34
Definition BoundingSphere:35
vec_type & center()
Definition BoundingSphere:83
value_type & radius()
Definition BoundingSphere:89
void popOccludersCurrentMask(NodePath &nodePath)
MaskValues
Definition CullingSet:126
Polytope & getFrustum()
Definition CullingSet:149
bool isCulled(const std::vector< Vec3 > &vertices)
Definition CullingSet:186
Vec4 & getPixelSizeVector()
Definition CullingSet:161
void getStateFrustumList(StateFrustumList &sfl)
Definition CullingSet:154
Vec4 _pixelSizeVector
Definition CullingSet:350
std::vector< ShadowVolumeOccluder > OccluderList
Definition CullingSet:121
void popCurrentMask()
Definition CullingSet:302
const Polytope & getFrustum() const
Definition CullingSet:150
void resetCullingMask()
Definition CullingSet:329
OccluderList _occluderList
Definition CullingSet:349
StateFrustumList & getStateFrustumList()
Definition CullingSet:155
void setSmallFeatureCullingPixelSize(float value)
Definition CullingSet:166
int Mask
Definition CullingSet:123
void set(const CullingSet &cs)
Definition CullingSet:82
std::pair< osg::ref_ptr< osg::StateSet >, osg::Polytope > StateFrustumPair
Definition CullingSet:34
void addStateFrustum(StateSet *stateset, Polytope &polytope)
Definition CullingSet:152
float getSmallFeatureCullingPixelSize() const
Definition CullingSet:170
float clampedPixelSize(const Vec3 &v, float radius) const
Definition CullingSet:180
CullingSet(const CullingSet &cs, const Matrix &matrix, const Vec4 &pixelSizeVector)
Definition CullingSet:50
float pixelSize(const Vec3 &v, float radius) const
Definition CullingSet:174
Mask _mask
Definition CullingSet:346
void addOccluder(ShadowVolumeOccluder &cv)
Definition CullingSet:157
void setFrustum(Polytope &cv)
Definition CullingSet:147
const Vec4 & getPixelSizeVector() const
Definition CullingSet:162
std::vector< StateFrustumPair > StateFrustumList
Definition CullingSet:35
bool isCulled(const BoundingBox &bb)
Definition CullingSet:215
CullingSet(const CullingSet &cs)
Definition CullingSet:39
float & getSmallFeatureCullingPixelSize()
Definition CullingSet:168
void setCullingMask(Mask mask)
Definition CullingSet:144
float _smallFeatureCullingPixelSize
Definition CullingSet:351
bool isCulled(const BoundingSphere &bs)
Definition CullingSet:244
Polytope _frustum
Definition CullingSet:347
float pixelSize(const BoundingSphere &bs) const
Definition CullingSet:177
StateFrustumList _stateFrustumList
Definition CullingSet:348
void setPixelSizeVector(const Vec4 &v)
Definition CullingSet:159
void pushCurrentMask()
Definition CullingSet:274
void set(const CullingSet &cs, const Matrix &matrix, const Vec4 &pixelSizeVector)
Definition CullingSet:92
void disableAndPushOccludersCurrentMask(NodePath &nodePath)
float clampedPixelSize(const BoundingSphere &bs) const
Definition CullingSet:183
Mask getCullingMask() const
Definition CullingSet:145
static osg::Vec4 computePixelSizeVector(const Viewport &W, const Matrix &P, const Matrix &M)
Definition ShadowVolumeOccluder:27
author: Julien Valentin 2017 (mp3butcher@hotmail.com)
Definition AlphaFunc:19
std::vector< Node * > NodePath
Definition Node:47
#define OSG_EXPORT
Definition osg/Export:39