openscenegraph
NodeVisitor
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_NODEVISITOR
15#define OSG_NODEVISITOR 1
16
17#include <osg/Node>
18#include <osg/Matrix>
19#include <osg/FrameStamp>
20
21#include <osg/ValueMap>
22#include <osg/ValueStack>
23
24
25namespace osgUtil { class UpdateVisitor; class CullVisitor; class IntersectionVisitor; }
26namespace osgGA { class EventVisitor; }
27
28namespace osg {
29
30class Billboard;
31class ClearNode;
32class ClipNode;
33class CoordinateSystemNode;
34class Geode;
35class Group;
36class LightSource;
37class LOD;
38class MatrixTransform;
39class OccluderNode;
40class OcclusionQueryNode;
41class PagedLOD;
42class PositionAttitudeTransform;
43class AutoTransform;
44class MultiViewAutoTransform;
45class Projection;
46class ProxyNode;
47class Sequence;
48class Switch;
49class TexGenNode;
50class Transform;
51class Camera;
52class CameraView;
53class Drawable;
54class Geometry;
55class CullStack;
56
57
58
59
60
61const unsigned int UNINITIALIZED_FRAME_NUMBER=0xffffffff;
62
63#define META_NodeVisitor(library, name) \
64 virtual const char* libraryName() const { return #library; }\
65 virtual const char* className() const { return #name; }
66
81class OSG_EXPORT NodeVisitor : public virtual Object
82{
83 public:
84
92
94 {
95 NODE_VISITOR = 0,
100 INTERSECTION_VISITOR
101 };
102
103 NodeVisitor(TraversalMode tm=TRAVERSE_NONE);
104
105 NodeVisitor(VisitorType type,TraversalMode tm=TRAVERSE_NONE);
106
108
109 virtual ~NodeVisitor();
110
112
113
115 virtual NodeVisitor* asNodeVisitor() { return this; }
116
119 virtual const NodeVisitor* asNodeVisitor() const { return this; }
120
124
127 virtual const osgUtil::UpdateVisitor* asUpdateVisitor() const { return 0; }
128
131 virtual osgUtil::CullVisitor* asCullVisitor() { return 0; }
132
135 virtual const osgUtil::CullVisitor* asCullVisitor() const { return 0; }
136
139 virtual osgGA::EventVisitor* asEventVisitor() { return 0; }
140
143 virtual const osgGA::EventVisitor* asEventVisitor() const { return 0; }
144
148
151 virtual const osgUtil::IntersectionVisitor* asIntersectionVisitor() const { return 0; }
152
155 virtual osg::CullStack* asCullStack() { return 0; }
156
159 virtual const osg::CullStack* asCullStack() const { return 0; }
160
161
162
167 virtual void reset() {}
168
169
173 inline void setVisitorType(VisitorType type) { _visitorType = type; }
174
176 inline VisitorType getVisitorType() const { return _visitorType; }
177
179 inline void setTraversalNumber(unsigned int fn) { _traversalNumber = fn; }
180
182 inline unsigned int getTraversalNumber() const { return _traversalNumber; }
183
185 inline void setFrameStamp(FrameStamp* fs) { _frameStamp = fs; }
186
188 inline const FrameStamp* getFrameStamp() const { return _frameStamp.get(); }
189
190
200 inline void setTraversalMask(Node::NodeMask mask) { _traversalMask = mask; }
201
203 inline Node::NodeMask getTraversalMask() const { return _traversalMask; }
204
210 inline void setNodeMaskOverride(Node::NodeMask mask) { _nodeMaskOverride = mask; }
211
213 inline Node::NodeMask getNodeMaskOverride() const { return _nodeMaskOverride; }
214
221 inline bool validNodeMask(const osg::Node& node) const
222 {
223 return (getTraversalMask() & (getNodeMaskOverride() | node.getNodeMask()))!=0;
224 }
225
231 inline void setTraversalMode(TraversalMode mode) { _traversalMode = mode; }
232
234 inline TraversalMode getTraversalMode() const { return _traversalMode; }
235
236
238 inline void setValueMap(ValueMap* ps) { _valueMap = ps; }
239
241 inline ValueMap* getValueMap() { return _valueMap.get(); }
242
244 inline const ValueMap* getValueMap() const { return _valueMap.get(); }
245
248 {
249 if (!_valueMap) _valueMap = new ValueMap;
250 return _valueMap.get();
251 }
252
254 inline void setValueStack(ValueStack* ps) { _valueStack = ps; }
255
257 inline ValueStack* getValueStack() { return _valueStack.get(); }
258
260 inline const ValueStack* getValueStack() const { return _valueStack.get(); }
261
264 {
265 if (!_valueStack) _valueStack = new ValueStack;
266 return _valueStack.get();
267 }
268
269
274 inline void traverse(Node& node)
275 {
276 if (_traversalMode==TRAVERSE_PARENTS) node.ascend(*this);
277 else if (_traversalMode!=TRAVERSE_NONE) node.traverse(*this);
278 }
279
287 inline void pushOntoNodePath(Node* node) { if (_traversalMode!=TRAVERSE_PARENTS) _nodePath.push_back(node); else _nodePath.insert(_nodePath.begin(),node); }
288
293 inline void popFromNodePath() { if (_traversalMode!=TRAVERSE_PARENTS) _nodePath.pop_back(); else _nodePath.erase(_nodePath.begin()); }
294
297 NodePath& getNodePath() { return _nodePath; }
298
301 const NodePath& getNodePath() const { return _nodePath; }
302
305 virtual osg::Vec3 getEyePoint() const { return Vec3(0.0f,0.0f,0.0f); }
306
309 virtual osg::Vec3 getViewPoint() const { return getEyePoint(); }
310
314 virtual float getDistanceToEyePoint(const Vec3& /*pos*/, bool /*useLODScale*/) const { return 0.0f; }
315
319 virtual float getDistanceFromEyePoint(const Vec3& /*pos*/, bool /*useLODScale*/) const { return 0.0f; }
320
324 virtual float getDistanceToViewPoint(const Vec3& /*pos*/, bool /*useLODScale*/) const { return 0.0f; }
325
326 virtual void apply(Drawable& drawable);
327 virtual void apply(Geometry& geometry);
328
329 virtual void apply(Node& node);
330
331 virtual void apply(Geode& node);
332 virtual void apply(Billboard& node);
333
334 virtual void apply(Group& node);
335
336 virtual void apply(ProxyNode& node);
337
338 virtual void apply(Projection& node);
339
340 virtual void apply(CoordinateSystemNode& node);
341
342 virtual void apply(ClipNode& node);
343 virtual void apply(TexGenNode& node);
344 virtual void apply(LightSource& node);
345
346 virtual void apply(Transform& node);
347 virtual void apply(Camera& node);
348 virtual void apply(CameraView& node);
349 virtual void apply(MatrixTransform& node);
350 virtual void apply(PositionAttitudeTransform& node);
351 virtual void apply(AutoTransform& node);
352
353 virtual void apply(Switch& node);
354 virtual void apply(Sequence& node);
355 virtual void apply(LOD& node);
356 virtual void apply(PagedLOD& node);
357 virtual void apply(ClearNode& node);
358 virtual void apply(OccluderNode& node);
359 virtual void apply(OcclusionQueryNode& node);
360
361
364 {
365 public:
366
369
370 virtual void requestNodeFile(const std::string& fileName, osg::NodePath& nodePath, float priority, const FrameStamp* framestamp, osg::ref_ptr<osg::Referenced>& databaseRequest, const osg::Referenced* options=0) = 0;
371
372 protected:
374 };
375
377 void setDatabaseRequestHandler(DatabaseRequestHandler* handler) { _databaseRequestHandler = handler; }
378
380 DatabaseRequestHandler* getDatabaseRequestHandler() { return _databaseRequestHandler.get(); }
381
383 const DatabaseRequestHandler* getDatabaseRequestHandler() const { return _databaseRequestHandler.get(); }
384
385
388 {
389 public:
390
393
394 virtual double getPreLoadTime() const = 0;
395
396 virtual osg::ref_ptr<osg::Image> readRefImageFile(const std::string& fileName, const osg::Referenced* options=0) = 0;
397
398 virtual void requestImageFile(const std::string& fileName,osg::Object* attachmentPoint, int attachmentIndex, double timeToMergeBy, const FrameStamp* framestamp, osg::ref_ptr<osg::Referenced>& imageRequest, const osg::Referenced* options=0) = 0;
399
400 protected:
402 };
403
405 void setImageRequestHandler(ImageRequestHandler* handler) { _imageRequestHandler = handler; }
406
408 ImageRequestHandler* getImageRequestHandler() { return _imageRequestHandler.get(); }
409
411 const ImageRequestHandler* getImageRequestHandler() const { return _imageRequestHandler.get(); }
412
413
414
415 protected:
416
418 unsigned int _traversalNumber;
419
421
425
427
430
433};
434
435
438{
439 public:
440
442 NodeAcceptOp(const NodeAcceptOp& naop):_nv(naop._nv) {}
443
444 void operator () (Node* node) { node->accept(_nv); }
445 void operator () (ref_ptr<Node> node) { node->accept(_nv); }
446
447 protected:
448
449 NodeAcceptOp& operator = (const NodeAcceptOp&) { return *this; }
450
452};
453
454
456{
457public:
458
459
460 PushPopObject(NodeVisitor* nv, const Referenced* key, Object* value):
461 _valueStack(0),
462 _key(0)
463 {
464 if (key)
465 {
467 _key = key;
468 _valueStack->push(_key, value);
469 }
470 }
471
472 PushPopObject(ValueStack* valueStack, const Referenced* key, Object* value):
473 _valueStack(valueStack),
474 _key(0)
475 {
476 if (_valueStack && key)
477 {
478 _key = key;
479 _valueStack->push(_key, value);
480 }
481 }
482
484 {
486 }
487
488protected:
491};
492
494{
495public:
496
497
498 template<typename T>
499 PushPopValue(NodeVisitor* nv, const Referenced* key, const T& value):
500 _valueStack(0),
501 _key(0)
502 {
503 if (key)
504 {
506 _key = key;
507 _valueStack->push(_key, value);
508 }
509 }
510
511 template<typename T>
512 PushPopValue(ValueStack* valueStack, const Referenced* key, const T& value):
513 _valueStack(valueStack),
514 _key(0)
515 {
516 if (_valueStack && key)
517 {
518 _key = key;
519 _valueStack->push(_key, value);
520 }
521 }
522
524 {
526 }
527
528protected:
531};
532
533template<>
538
539template<>
544
545
546}
547
548#endif
Definition EventVisitor:42
Definition CullVisitor:49
Definition IntersectionVisitor:152
Definition UpdateVisitor:38
Definition AutoTransform:28
Definition Billboard:27
Definition CameraView:30
Definition Camera:45
Definition ClearNode:31
Definition ClipNode:24
Definition CoordinateSystemNode:96
Definition CopyOp:41
@ SHALLOW_COPY
Definition CopyOp:47
Definition CullStack:28
Definition Drawable:89
Definition FrameStamp:35
Definition Geode:29
Definition Geometry:31
Definition Group:29
Definition LOD:36
Definition LightSource:25
Definition MatrixTransform:26
Definition NodeVisitor:438
NodeAcceptOp(const NodeAcceptOp &naop)
Definition NodeVisitor:442
NodeAcceptOp & operator=(const NodeAcceptOp &)
Definition NodeVisitor:449
void operator()(Node *node)
Definition NodeVisitor:444
NodeVisitor & _nv
Definition NodeVisitor:451
NodeAcceptOp(NodeVisitor &nv)
Definition NodeVisitor:441
virtual void requestNodeFile(const std::string &fileName, osg::NodePath &nodePath, float priority, const FrameStamp *framestamp, osg::ref_ptr< osg::Referenced > &databaseRequest, const osg::Referenced *options=0)=0
virtual ~DatabaseRequestHandler()
Definition NodeVisitor:373
DatabaseRequestHandler()
Definition NodeVisitor:367
Definition NodeVisitor:388
virtual void requestImageFile(const std::string &fileName, osg::Object *attachmentPoint, int attachmentIndex, double timeToMergeBy, const FrameStamp *framestamp, osg::ref_ptr< osg::Referenced > &imageRequest, const osg::Referenced *options=0)=0
virtual ~ImageRequestHandler()
Definition NodeVisitor:401
ImageRequestHandler()
Definition NodeVisitor:391
virtual osg::ref_ptr< osg::Image > readRefImageFile(const std::string &fileName, const osg::Referenced *options=0)=0
virtual double getPreLoadTime() const =0
Definition NodeVisitor:82
virtual void apply(OcclusionQueryNode &node)
const FrameStamp * getFrameStamp() const
Definition NodeVisitor:188
const DatabaseRequestHandler * getDatabaseRequestHandler() const
Definition NodeVisitor:383
ValueStack * getOrCreateValueStack()
Definition NodeVisitor:263
virtual void apply(MatrixTransform &node)
virtual const osgUtil::IntersectionVisitor * asIntersectionVisitor() const
Definition NodeVisitor:151
void setDatabaseRequestHandler(DatabaseRequestHandler *handler)
Definition NodeVisitor:377
virtual void apply(LightSource &node)
virtual void apply(Drawable &drawable)
TraversalMode _traversalMode
Definition NodeVisitor:422
VisitorType getVisitorType() const
Definition NodeVisitor:176
virtual void apply(Billboard &node)
virtual void apply(Geometry &geometry)
virtual osgUtil::IntersectionVisitor * asIntersectionVisitor()
Definition NodeVisitor:147
VisitorType
Definition NodeVisitor:94
@ UPDATE_VISITOR
Definition NodeVisitor:96
@ EVENT_VISITOR
Definition NodeVisitor:97
@ COLLECT_OCCLUDER_VISITOR
Definition NodeVisitor:98
@ CULL_VISITOR
Definition NodeVisitor:99
ImageRequestHandler * getImageRequestHandler()
Definition NodeVisitor:408
virtual void apply(AutoTransform &node)
virtual const osgGA::EventVisitor * asEventVisitor() const
Definition NodeVisitor:143
ValueMap * getOrCreateValueMap()
Definition NodeVisitor:247
META_Object(osg, NodeVisitor) virtual NodeVisitor *asNodeVisitor()
Definition NodeVisitor:111
void setValueMap(ValueMap *ps)
Definition NodeVisitor:238
virtual const osgUtil::CullVisitor * asCullVisitor() const
Definition NodeVisitor:135
virtual const osgUtil::UpdateVisitor * asUpdateVisitor() const
Definition NodeVisitor:127
TraversalMode
Definition NodeVisitor:86
@ TRAVERSE_NONE
Definition NodeVisitor:87
@ TRAVERSE_PARENTS
Definition NodeVisitor:88
@ TRAVERSE_ALL_CHILDREN
Definition NodeVisitor:89
const ValueStack * getValueStack() const
Definition NodeVisitor:260
Node::NodeMask _traversalMask
Definition NodeVisitor:423
virtual osgUtil::UpdateVisitor * asUpdateVisitor()
Definition NodeVisitor:123
const ValueMap * getValueMap() const
Definition NodeVisitor:244
virtual void reset()
Definition NodeVisitor:167
void setTraversalMask(Node::NodeMask mask)
Definition NodeVisitor:200
void pushOntoNodePath(Node *node)
Definition NodeVisitor:287
const NodePath & getNodePath() const
Definition NodeVisitor:301
Node::NodeMask getTraversalMask() const
Definition NodeVisitor:203
void setFrameStamp(FrameStamp *fs)
Definition NodeVisitor:185
virtual osgGA::EventVisitor * asEventVisitor()
Definition NodeVisitor:139
virtual void apply(ClearNode &node)
ref_ptr< FrameStamp > _frameStamp
Definition NodeVisitor:420
virtual const osg::CullStack * asCullStack() const
Definition NodeVisitor:159
virtual void apply(Group &node)
virtual void apply(CameraView &node)
virtual void apply(Camera &node)
virtual float getDistanceToEyePoint(const Vec3 &, bool) const
Definition NodeVisitor:314
virtual void apply(PositionAttitudeTransform &node)
TraversalMode getTraversalMode() const
Definition NodeVisitor:234
void traverse(Node &node)
Definition NodeVisitor:274
NodeVisitor(TraversalMode tm=TRAVERSE_NONE)
Node::NodeMask _nodeMaskOverride
Definition NodeVisitor:424
virtual void apply(Projection &node)
virtual void apply(ProxyNode &node)
void setNodeMaskOverride(Node::NodeMask mask)
Definition NodeVisitor:210
VisitorType _visitorType
Definition NodeVisitor:417
void setValueStack(ValueStack *ps)
Definition NodeVisitor:254
void setTraversalMode(TraversalMode mode)
Definition NodeVisitor:231
NodePath _nodePath
Definition NodeVisitor:426
ref_ptr< ImageRequestHandler > _imageRequestHandler
Definition NodeVisitor:429
virtual void apply(TexGenNode &node)
virtual void apply(Switch &node)
ValueStack * getValueStack()
Definition NodeVisitor:257
virtual void apply(LOD &node)
NodeVisitor(const NodeVisitor &nv, const osg::CopyOp &copyop=osg::CopyOp::SHALLOW_COPY)
virtual void apply(OccluderNode &node)
virtual osg::Vec3 getViewPoint() const
Definition NodeVisitor:309
virtual float getDistanceToViewPoint(const Vec3 &, bool) const
Definition NodeVisitor:324
unsigned int getTraversalNumber() const
Definition NodeVisitor:182
virtual void apply(Node &node)
NodeVisitor(VisitorType type, TraversalMode tm=TRAVERSE_NONE)
virtual void apply(Sequence &node)
virtual ~NodeVisitor()
virtual void apply(Geode &node)
bool validNodeMask(const osg::Node &node) const
Definition NodeVisitor:221
virtual float getDistanceFromEyePoint(const Vec3 &, bool) const
Definition NodeVisitor:319
osg::ref_ptr< ValueStack > _valueStack
Definition NodeVisitor:432
void setVisitorType(VisitorType type)
Definition NodeVisitor:173
const ImageRequestHandler * getImageRequestHandler() const
Definition NodeVisitor:411
virtual osg::CullStack * asCullStack()
Definition NodeVisitor:155
ValueMap * getValueMap()
Definition NodeVisitor:241
ref_ptr< DatabaseRequestHandler > _databaseRequestHandler
Definition NodeVisitor:428
unsigned int _traversalNumber
Definition NodeVisitor:418
NodePath & getNodePath()
Definition NodeVisitor:297
DatabaseRequestHandler * getDatabaseRequestHandler()
Definition NodeVisitor:380
virtual void apply(CoordinateSystemNode &node)
Node::NodeMask getNodeMaskOverride() const
Definition NodeVisitor:213
void setImageRequestHandler(ImageRequestHandler *handler)
Definition NodeVisitor:405
osg::ref_ptr< ValueMap > _valueMap
Definition NodeVisitor:431
void setTraversalNumber(unsigned int fn)
Definition NodeVisitor:179
void popFromNodePath()
Definition NodeVisitor:293
virtual osg::Vec3 getEyePoint() const
Definition NodeVisitor:305
virtual void apply(PagedLOD &node)
virtual void apply(Transform &node)
virtual void apply(ClipNode &node)
virtual const NodeVisitor * asNodeVisitor() const
Definition NodeVisitor:119
virtual osgUtil::CullVisitor * asCullVisitor()
Definition NodeVisitor:131
Definition Node:72
virtual void traverse(NodeVisitor &)
Definition Node:167
NodeMask getNodeMask() const
Definition Node:367
unsigned int NodeMask
Definition Node:363
virtual void accept(NodeVisitor &nv)
virtual void ascend(NodeVisitor &nv)
Definition Object:61
Definition OccluderNode:27
Definition OcclusionQueryNode:110
Definition PagedLOD:24
Definition PositionAttitudeTransform:29
Definition Projection:25
Definition ProxyNode:24
Definition NodeVisitor:456
ValueStack * _valueStack
Definition NodeVisitor:489
const Referenced * _key
Definition NodeVisitor:490
~PushPopObject()
Definition NodeVisitor:483
PushPopObject(NodeVisitor *nv, const Referenced *key, Object *value)
Definition NodeVisitor:460
PushPopObject(ValueStack *valueStack, const Referenced *key, Object *value)
Definition NodeVisitor:472
Definition NodeVisitor:494
~PushPopValue()
Definition NodeVisitor:523
ValueStack * _valueStack
Definition NodeVisitor:529
const Referenced * _key
Definition NodeVisitor:530
PushPopValue(ValueStack *valueStack, const Referenced *key, const T &value)
Definition NodeVisitor:512
PushPopValue(NodeVisitor *nv, const Referenced *key, const T &value)
Definition NodeVisitor:499
Definition Referenced:44
Definition Sequence:26
Definition Switch:27
Definition TexGenNode:24
Definition Transform:75
Definition ValueMap:26
Definition ValueStack:24
void push(const Referenced *key, Object *value)
Definition ValueStack:42
void pop(const Referenced *key)
Definition ValueStack:54
Definition Vec3f:29
Definition ref_ptr:32
Definition Callback:21
Shader generator framework.
Definition NodeVisitor:25
author: Julien Valentin 2017 (mp3butcher@hotmail.com)
Definition AlphaFunc:19
const unsigned int UNINITIALIZED_FRAME_NUMBER
Definition NodeVisitor:61
ValueStack * getOrCreateUserObjectOfType< NodeVisitor, ValueStack >(NodeVisitor *nv)
Definition NodeVisitor:534
std::vector< Node * > NodePath
Definition Node:47
ValueMap * getOrCreateUserObjectOfType< NodeVisitor, ValueMap >(NodeVisitor *nv)
Definition NodeVisitor:540
#define OSG_EXPORT
Definition osg/Export:39