OpenSceneGraph 3.6.5
CullingSet
Go to the documentation of this file.
1/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
2 *
3 * This library is open source and may be redistributed and/or modified under
4 * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
5 * (at your option) any later version. The full license is in LICENSE file
6 * included with this distribution, and on the openscenegraph.org website.
7 *
8 * This library is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * OpenSceneGraph Public License for more details.
12*/
13
14#ifndef OSG_CullingSet
15#define OSG_CullingSet 1
16
17#include <osg/Polytope>
19#include <osg/Viewport>
20
21#include <math.h>
22
23
24namespace osg {
25
26#define COMPILE_WITH_SHADOW_OCCLUSION_CULLING
27
30{
31
32 public:
33
34 typedef std::pair< osg::ref_ptr<osg::StateSet>, osg::Polytope > StateFrustumPair;
35 typedef std::vector< StateFrustumPair > StateFrustumList;
36
38
49
50 CullingSet(const CullingSet& cs,const Matrix& matrix, const Vec4& pixelSizeVector):
51 _mask(cs._mask),
55 _pixelSizeVector(pixelSizeVector),
57 {
58 _frustum.transformProvidingInverse(matrix);
59 for(OccluderList::iterator itr=_occluderList.begin();
60 itr!=_occluderList.end();
61 ++itr)
62 {
63 itr->transformProvidingInverse(matrix);
64 }
65 }
66
67 CullingSet& operator = (const CullingSet& cs)
68 {
69 if (this==&cs) return *this;
70
71 _mask = cs._mask;
72 _frustum = cs._frustum;
77
78 return *this;
79 }
80
81
91
92 inline void set(const CullingSet& cs,const Matrix& matrix, const Vec4& pixelSizeVector)
93 {
94 _mask = cs._mask;
97 _pixelSizeVector = pixelSizeVector;
99
100 //_frustum = cs._frustum;
101 //_frustum.transformProvidingInverse(matrix);
102
103 _frustum.setAndTransformProvidingInverse(cs._frustum,matrix);
104
105 for(StateFrustumList::iterator sitr=_stateFrustumList.begin();
106 sitr!=_stateFrustumList.end();
107 ++sitr)
108 {
109 sitr->second.transformProvidingInverse(matrix);
110 }
111
112 for(OccluderList::iterator oitr=_occluderList.begin();
113 oitr!=_occluderList.end();
114 ++oitr)
115 {
116 oitr->transformProvidingInverse(matrix);
117 }
118
119 }
120
121 typedef std::vector<ShadowVolumeOccluder> OccluderList;
122
123 typedef int Mask;
124
143
144 void setCullingMask(Mask mask) { _mask = mask; }
145 Mask getCullingMask() const { return _mask; }
146
147 void setFrustum(Polytope& cv) { _frustum = cv; }
148
150 const Polytope& getFrustum() const { return _frustum; }
151
152 void addStateFrustum(StateSet* stateset, Polytope& polytope) { _stateFrustumList.push_back(StateFrustumPair(stateset,polytope)); }
153
156
157 void addOccluder(ShadowVolumeOccluder& cv) { _occluderList.push_back(cv); }
158
160
162 const Vec4& getPixelSizeVector() const { return _pixelSizeVector; }
163
167
169
171
172
174 float pixelSize(const Vec3& v,float radius) const { return radius/(v*_pixelSizeVector); }
175
177 float pixelSize(const BoundingSphere& bs) const { return bs.radius()/(bs.center()*_pixelSizeVector); }
178
180 float clampedPixelSize(const Vec3& v,float radius) const { return fabs(pixelSize(v, radius)); }
181
183 float clampedPixelSize(const BoundingSphere& bs) const { return fabs(pixelSize(bs)); }
184
185
186 inline bool isCulled(const std::vector<Vec3>& vertices)
187 {
189 {
190 // is it outside the view frustum...
191 if (!_frustum.contains(vertices)) return true;
192 }
193
195 {
196 }
197
199 {
200 // is it in one of the shadow occluder volumes.
201 if (!_occluderList.empty())
202 {
203 for(OccluderList::iterator itr=_occluderList.begin();
204 itr!=_occluderList.end();
205 ++itr)
206 {
207 if (itr->contains(vertices)) return true;
208 }
209 }
210 }
211
212 return false;
213 }
214
215 inline bool isCulled(const BoundingBox& bb)
216 {
218 {
219 // is it outside the view frustum...
220 if (!_frustum.contains(bb)) return true;
221 }
222
224 {
225 }
226
228 {
229 // is it in one of the shadow occluder volumes.
230 if (!_occluderList.empty())
231 {
232 for(OccluderList::iterator itr=_occluderList.begin();
233 itr!=_occluderList.end();
234 ++itr)
235 {
236 if (itr->contains(bb)) return true;
237 }
238 }
239 }
240
241 return false;
242 }
243
244 inline bool isCulled(const BoundingSphere& bs)
245 {
247 {
248 // is it outside the view frustum...
249 if (!_frustum.contains(bs)) return true;
250 }
251
253 {
254 if (((bs.center()*_pixelSizeVector)*_smallFeatureCullingPixelSize)>bs.radius()) return true;
255 }
256#ifdef COMPILE_WITH_SHADOW_OCCLUSION_CULLING
258 {
259 // is it in one of the shadow occluder volumes.
260 if (!_occluderList.empty())
261 {
262 for(OccluderList::iterator itr=_occluderList.begin();
263 itr!=_occluderList.end();
264 ++itr)
265 {
266 if (itr->contains(bs)) return true;
267 }
268 }
269 }
270#endif
271 return false;
272 }
273
274 inline void pushCurrentMask()
275 {
276 _frustum.pushCurrentMask();
277
278 if (!_stateFrustumList.empty())
279 {
280 for(StateFrustumList::iterator itr=_stateFrustumList.begin();
281 itr!=_stateFrustumList.end();
282 ++itr)
283 {
284 itr->second.pushCurrentMask();
285 }
286 }
287
288
289#ifdef COMPILE_WITH_SHADOW_OCCLUSION_CULLING
290 if (!_occluderList.empty())
291 {
292 for(OccluderList::iterator itr=_occluderList.begin();
293 itr!=_occluderList.end();
294 ++itr)
295 {
296 itr->pushCurrentMask();
297 }
298 }
299#endif
300 }
301
302 inline void popCurrentMask()
303 {
304 _frustum.popCurrentMask();
305
306 if (!_stateFrustumList.empty())
307 {
308 for(StateFrustumList::iterator itr=_stateFrustumList.begin();
309 itr!=_stateFrustumList.end();
310 ++itr)
311 {
312 itr->second.popCurrentMask();
313 }
314 }
315
316#ifdef COMPILE_WITH_SHADOW_OCCLUSION_CULLING
317 if (!_occluderList.empty())
318 {
319 for(OccluderList::iterator itr=_occluderList.begin();
320 itr!=_occluderList.end();
321 ++itr)
322 {
323 itr->popCurrentMask();
324 }
325 }
326#endif
327 }
328
329 inline void resetCullingMask()
330 {
331 _frustum.setResultMask(_frustum.getCurrentMask());
332 }
333
335
337
338 static osg::Vec4 computePixelSizeVector(const Viewport& W, const Matrix& P, const Matrix& M);
339
340 virtual ~CullingSet();
341
342
343 protected:
344
345
352
353};
354
355} // end of namespace
356
357#endif
The core osg library provides the basic scene graph classes such as Nodes, State and Drawables,...
Definition AlphaFunc:19
Vec3f Vec3
Definition Vec3:21
BoundingBoxd BoundingBox
Definition BoundingBox:257
BoundingSphered BoundingSphere
Definition BoundingSphere:308
Matrixd Matrix
Definition Matrix:27
Vec4f Vec4
Definition Vec4:21
std::vector< Node * > NodePath
A vector of Nodes pointers which is used to describe the path from a root node to a descendant.
Definition Node:47
vec_type & center()
Returns the center of the bounding sphere.
Definition BoundingSphere:77
value_type & radius()
Returns the radius of the bounding sphere.
Definition BoundingSphere:83
void popOccludersCurrentMask(NodePath &nodePath)
MaskValues
Definition CullingSet:126
@ VIEW_FRUSTUM_SIDES_CULLING
Definition CullingSet:128
@ SMALL_FEATURE_CULLING
Definition CullingSet:134
@ ENABLE_ALL_CULLING
Definition CullingSet:139
@ DEFAULT_CULLING
Definition CullingSet:136
@ NEAR_PLANE_CULLING
Definition CullingSet:129
@ SHADOW_OCCLUSION_CULLING
Definition CullingSet:135
@ VIEW_FRUSTUM_CULLING
Definition CullingSet:131
@ FAR_PLANE_CULLING
Definition CullingSet:130
@ NO_CULLING
Definition CullingSet:127
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)
Threshold at which small features are culled.
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
Compute the pixel of an object at position v, with specified radius.
Definition CullingSet:180
CullingSet(const CullingSet &cs, const Matrix &matrix, const Vec4 &pixelSizeVector)
Definition CullingSet:50
float pixelSize(const Vec3 &v, float radius) const
Compute the pixel of an object at position v, with specified radius.
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
virtual ~CullingSet()
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
Compute the pixel of a bounding sphere.
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
Compute the pixel of a bounding sphere.
Definition CullingSet:183
Mask getCullingMask() const
Definition CullingSet:145
static osg::Vec4 computePixelSizeVector(const Viewport &W, const Matrix &P, const Matrix &M)
A Polytope class for representing convex clipping volumes made up of a set of planes.
Definition Polytope:26
ShadowVolumeOccluder is a helper class for implementing shadow occlusion culling.
Definition ShadowVolumeOccluder:27
Stores a set of modes and attributes which represent a set of OpenGL state.
Definition StateSet:46
Encapsulate OpenGL glViewport.
Definition Viewport:24
#define OSG_EXPORT
Definition Export:39

osg logo
Generated at Sun Jul 27 2025 00:00:00 for the OpenSceneGraph by doxygen 1.14.0.