OpenSceneGraph 3.6.5
DatabasePager
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 OSGDB_DATABASEPAGER
15#define OSGDB_DATABASEPAGER 1
16
17#include <osg/NodeVisitor>
18#include <osg/Group>
19#include <osg/PagedLOD>
20#include <osg/Drawable>
21#include <osg/GraphicsThread>
22#include <osg/FrameStamp>
23#include <osg/ObserverNodePath>
24#include <osg/observer_ptr>
25
26#include <OpenThreads/Thread>
27#include <OpenThreads/Mutex>
28#include <OpenThreads/ScopedLock>
29#include <OpenThreads/Condition>
30
32
34#include <osgDB/ReaderWriter>
35#include <osgDB/Options>
36
37
38#include <map>
39#include <list>
40#include <algorithm>
41#include <functional>
42
43namespace osgDB {
44
45
46
50{
51 public :
52
53 typedef OpenThreads::Thread::ThreadPriority ThreadPriority;
54
56
58
59 virtual const char* className() const { return "DatabasePager"; }
60
62 virtual DatabasePager* clone() const { return new DatabasePager(*this); }
63
66
69
70
71
73 virtual void requestNodeFile(const std::string& fileName, osg::NodePath& nodePath,
74 float priority, const osg::FrameStamp* framestamp,
75 osg::ref_ptr<osg::Referenced>& databaseRequest,
76 const osg::Referenced* options);
77
79 int setSchedulePriority(OpenThreads::Thread::ThreadPriority priority);
80
82 virtual int cancel();
83
84 virtual bool isRunning() const;
85
87 virtual void clear();
88
89 class OSGDB_EXPORT DatabaseThread : public osg::Referenced, public OpenThreads::Thread
90 {
91 public:
92
99
100 DatabaseThread(DatabasePager* pager, Mode mode, const std::string& name);
101
103
104 void setName(const std::string& name) { _name = name; }
105 const std::string& getName() const { return _name; }
106
107 void setDone(bool done) { _done.exchange(done?1:0); }
108 bool getDone() const { return _done!=0; }
109
110 void setActive(bool active) { _active = active; }
111 bool getActive() const { return _active; }
112
113 virtual int cancel();
114
115 virtual void run();
116
117 protected:
118
120
121 OpenThreads::Atomic _done;
122 volatile bool _active;
125 std::string _name;
126
127 };
128
129 virtual void setProcessorAffinity(const OpenThreads::Affinity& affinity);
130 OpenThreads::Affinity& getProcessorAffinity() { return _affinity; }
131 const OpenThreads::Affinity& getProcessorAffinity() const { return _affinity; }
132
133 void setUpThreads(unsigned int totalNumThreads=2, unsigned int numHttpThreads=1);
134
135 virtual unsigned int addDatabaseThread(DatabaseThread::Mode mode, const std::string& name);
136
137 DatabaseThread* getDatabaseThread(unsigned int i) { return _databaseThreads[i].get(); }
138
139 const DatabaseThread* getDatabaseThread(unsigned int i) const { return _databaseThreads[i].get(); }
140
141 unsigned int getNumDatabaseThreads() const { return static_cast<unsigned int>(_databaseThreads.size()); }
142
145
148
150 void setAcceptNewDatabaseRequests(bool acceptNewRequests) { _acceptNewRequests = acceptNewRequests; }
151
154
156 int getNumFramesActive() const { return _numFramesActive; }
157
160 virtual void signalBeginFrame(const osg::FrameStamp* framestamp);
161
164 virtual void signalEndFrame();
165
166
170 virtual void registerPagedLODs(osg::Node* subgraph, unsigned int frameNumber = 0);
171
176
179
180
185 void setDoPreCompile(bool flag) { _doPreCompile = flag; }
186
189 bool getDoPreCompile() const { return _doPreCompile; }
190
191
192
197
200
201
204
207
215
218
221
222
224 void setApplyPBOToImages(bool assignPBOToImages) { _assignPBOToImages = assignPBOToImages; }
225
228
229
231 void setUnrefImageDataAfterApplyPolicy(bool changeAutoUnRef, bool valueAutoUnRef) { _changeAutoUnRef = changeAutoUnRef; _valueAutoUnRef = valueAutoUnRef; }
232
234 void getUnrefImageDataAfterApplyPolicy(bool& changeAutoUnRef, bool& valueAutoUnRef) const { changeAutoUnRef = _changeAutoUnRef; valueAutoUnRef = _valueAutoUnRef; }
235
236
238 void setMaxAnisotropyPolicy(bool changeAnisotropy, float valueAnisotropy) { _changeAnisotropy = changeAnisotropy; _valueAnisotropy = valueAnisotropy; }
239
241 void getMaxAnisotropyPolicy(bool& changeAnisotropy, float& valueAnisotropy) const { changeAnisotropy = _changeAnisotropy; valueAnisotropy = _valueAnisotropy; }
242
243
246
249 virtual void updateSceneGraph(const osg::FrameStamp& frameStamp);
250
252 bool requiresRedraw() const;
253
255 unsigned int getFileRequestListSize() const { return static_cast<unsigned int>(_fileRequestQueue->size() + _httpRequestQueue->size()); }
256
258 unsigned int getDataToCompileListSize() const { return static_cast<unsigned int>(_dataToCompileList->size()); }
259
261 unsigned int getDataToMergeListSize() const { return static_cast<unsigned int>(_dataToMergeList->size()); }
262
265
268
271
273 double getAverageTimeToMergeTiles() const { return (_numTilesMerges > 0) ? _totalTimeToMergeTiles/static_cast<double>(_numTilesMerges) : 0; }
274
277
278 typedef std::set< osg::ref_ptr<osg::StateSet> > StateSetList;
279 typedef std::vector< osg::ref_ptr<osg::Drawable> > DrawableList;
280
281 class ExpirePagedLODsVisitor;
282
283 typedef std::list< osg::ref_ptr<osg::Object> > ObjectList;
284
286 {
287 virtual PagedLODList* clone() = 0;
288 virtual void clear() = 0;
289 virtual unsigned int size() = 0;
290 virtual void removeExpiredChildren(int numberChildrenToRemove, double expiryTime, unsigned int expiryFrame, ObjectList& childrenRemoved, bool visitActive) = 0;
291 virtual void removeNodes(osg::NodeList& nodesToRemove) = 0;
293 virtual bool containsPagedLOD(const osg::observer_ptr<osg::PagedLOD>& plod) const = 0;
294 };
295
298 const osg::Object* getMarkerObject() const { return _markerObject.get(); }
299
300 protected:
301
302 virtual ~DatabasePager();
303
304 friend class DatabaseThread;
305 friend struct DatabaseRequest;
306
307 struct RequestQueue;
308
353
354
356 {
357 public:
358
360
361 void add(DatabaseRequest* databaseRequest);
362 void remove(DatabaseRequest* databaseRequest);
363
364 void addNoLock(DatabaseRequest* databaseRequest);
365
367
370
371 virtual void updateBlock() {}
372
374
375 bool empty();
376
377 unsigned int size();
378
379 void clear();
380
381
382 typedef std::list< osg::ref_ptr<DatabaseRequest> > RequestList;
383 void swap(RequestList& requestList);
384
387 OpenThreads::Mutex _requestMutex;
389
390 protected:
391 virtual ~RequestQueue();
392 };
393
394
395 typedef std::vector< osg::ref_ptr<DatabaseThread> > DatabaseThreadList;
396
398 {
399 ReadQueue(DatabasePager* pager, const std::string& name);
400
401 void block() { _block->block(); }
402
403 void release() { _block->release(); }
404
405 virtual void updateBlock();
406
407
409
410 std::string _name;
411
412 OpenThreads::Mutex _childrenToDeleteListMutex;
414 };
415
416 // forward declare inner helper classes
419
422
425
428
429
430 OpenThreads::Mutex _run_mutex;
431 OpenThreads::Mutex _dr_mutex;
433
434 void compileCompleted(DatabaseRequest* databaseRequest);
435
439 virtual void removeExpiredSubgraphs(const osg::FrameStamp &frameStamp);
440
443
444
445 OpenThreads::Affinity _affinity;
446
447 bool _done;
450
452
454 mutable OpenThreads::Mutex _numFramesActiveMutex;
455 OpenThreads::Atomic _frameNumber;
456
461
463
469
471
472
474
476
479
480
484 unsigned int _numTilesMerges;
485
487};
488
489}
490
491#endif
The core osg library provides the basic scene graph classes such as Nodes, State and Drawables,...
Definition AlphaFunc:19
std::vector< ref_ptr< Node > > NodeList
Definition Group:22
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
The osgDB library provides support for reading and writing scene graphs, providing a plugin framework...
Definition Archive:24
Class which encapsulates the frame number, reference time and calendar time of specific frame,...
Definition FrameStamp:35
Base class for all internal nodes in the scene graph.
Definition Node:72
Callback for managing database paging, such as generated by PagedLOD nodes.
Definition NodeVisitor:364
Base class/standard interface for objects which require IO support, cloning and reference counting.
Definition Object:61
Smart pointer for observed objects, that automatically set pointers to them to null when they are del...
Definition observer_ptr:39
Smart pointer for handling referenced counted objects.
Definition ref_ptr:32
Base class for providing reference counted objects.
Definition Referenced:44
double _maximumTimeToMergeTile
Definition DatabasePager:482
virtual void removeExpiredSubgraphs(const osg::FrameStamp &frameStamp)
Iterate through the active PagedLOD nodes children removing children which haven't been visited since...
double getMaximumTimeToMergeTile() const
Get the maximum time between the first request for a tile to be loaded and the time of its merge into...
Definition DatabasePager:270
bool _acceptNewRequests
Definition DatabasePager:448
OpenThreads::Mutex _dr_mutex
Definition DatabasePager:431
bool requiresUpdateSceneGraph() const
Return true if there are pending updates to the scene graph that require a call to updateSceneGraph(d...
bool getAcceptNewDatabaseRequests() const
Get whether new database request calls are accepted or ignored.
Definition DatabasePager:153
virtual void setProcessorAffinity(const OpenThreads::Affinity &affinity)
DatabaseThread * getDatabaseThread(unsigned int i)
Definition DatabasePager:137
void resetStats()
Reset the Stats variables.
osg::ref_ptr< RequestQueue > _dataToCompileList
Definition DatabasePager:459
bool requiresRedraw() const
Return true if there are GL objects that need to be compiled by a draw traversal.
const osg::Object * getMarkerObject() const
Definition DatabasePager:298
osg::Object * getMarkerObject()
Definition DatabasePager:297
std::vector< osg::ref_ptr< DatabaseThread > > DatabaseThreadList
Definition DatabasePager:395
friend struct SortFileRequestFunctor
Definition DatabasePager:427
void setDrawablePolicy(DrawablePolicy policy)
Set how loaded drawables should be handled w.r.t their display list/vertex buffer object/vertex array...
Definition DatabasePager:217
osg::ref_ptr< ReadQueue > _httpRequestQueue
Definition DatabasePager:458
double _minimumTimeToMergeTile
Definition DatabasePager:481
osg::ref_ptr< osgUtil::IncrementalCompileOperation > _incrementalCompileOperation
Definition DatabasePager:478
int _numFramesActive
Definition DatabasePager:453
int getNumFramesActive() const
Get the number of frames that are currently active.
Definition DatabasePager:156
int setSchedulePriority(OpenThreads::Thread::ThreadPriority priority)
Set the priority of the database pager thread(s).
virtual ~DatabasePager()
DrawablePolicy getDrawablePolicy() const
Get how loaded drawables should be handled w.r.t their display list/vertex buffer object/vertex array...
Definition DatabasePager:220
std::list< osg::ref_ptr< osg::Object > > ObjectList
Definition DatabasePager:283
unsigned int getTargetMaximumNumberOfPageLOD() const
Get the target maximum number of PagedLOD to maintain in memory.
Definition DatabasePager:199
void setDoPreCompile(bool flag)
Set whether the database pager should pre compile OpenGL objects before allowing them to be merged in...
Definition DatabasePager:185
OpenThreads::Affinity & getProcessorAffinity()
Definition DatabasePager:130
virtual void requestNodeFile(const std::string &fileName, osg::NodePath &nodePath, float priority, const osg::FrameStamp *framestamp, osg::ref_ptr< osg::Referenced > &databaseRequest, const osg::Referenced *options)
Add a request to load a node file to end the database request list.
unsigned int getDataToMergeListSize() const
Report how many items are in the _dataToMergeList queue.
Definition DatabasePager:261
unsigned int getFileRequestListSize() const
Report how many items are in the _fileRequestList queue.
Definition DatabasePager:255
osg::ref_ptr< PagedLODList > _activePagedLODList
Definition DatabasePager:473
virtual void clear()
Clear all internally cached structures.
unsigned int getNumDatabaseThreads() const
Definition DatabasePager:141
double getAverageTimeToMergeTiles() const
Get the average time between the first request for a tile to be loaded and the time of its merge into...
Definition DatabasePager:273
virtual void updateSceneGraph(const osg::FrameStamp &frameStamp)
Merge the changes to the scene graph by calling calling removeExpiredSubgraphs then addLoadedDataToSc...
void setTargetMaximumNumberOfPageLOD(unsigned int target)
Set the target maximum number of PagedLOD to maintain in memory.
Definition DatabasePager:196
void setDatabasePagerThreadPause(bool pause)
Set whether the database pager thread should be paused or not.
OpenThreads::Affinity _affinity
Definition DatabasePager:445
void getUnrefImageDataAfterApplyPolicy(bool &changeAutoUnRef, bool &valueAutoUnRef) const
Get whether newly loaded textures should have their UnrefImageDataAfterApply set to a specified value...
Definition DatabasePager:234
const OpenThreads::Affinity & getProcessorAffinity() const
Definition DatabasePager:131
static DatabasePager * create()
create a DatabasePager by cloning DatabasePager::prototype().
void compileCompleted(DatabaseRequest *databaseRequest)
void setUnrefImageDataAfterApplyPolicy(bool changeAutoUnRef, bool valueAutoUnRef)
Set whether newly loaded textures should have their UnrefImageDataAfterApply set to a specified value...
Definition DatabasePager:231
virtual int cancel()
Cancel the database pager thread(s).
std::vector< osg::ref_ptr< osg::Drawable > > DrawableList
Definition DatabasePager:279
DatabasePager(const DatabasePager &rhs)
bool _doPreCompile
Definition DatabasePager:477
OpenThreads::Thread::ThreadPriority ThreadPriority
Definition DatabasePager:53
friend class FindCompileableGLObjectsVisitor
Definition DatabasePager:418
osgUtil::IncrementalCompileOperation * getIncrementalCompileOperation()
Get the incremental compile operation.
Definition DatabasePager:178
bool _assignPBOToImages
Definition DatabasePager:464
osg::ref_ptr< ReadQueue > _fileRequestQueue
Definition DatabasePager:457
void setUpThreads(unsigned int totalNumThreads=2, unsigned int numHttpThreads=1)
friend class FindPagedLODsVisitor
Definition DatabasePager:424
friend struct DatabasePagerCompileCompletedCallback
Definition DatabasePager:421
bool getApplyPBOToImages() const
Get whether newly loaded textures should have a PixelBufferObject assigned to them.
Definition DatabasePager:227
void getMaxAnisotropyPolicy(bool &changeAnisotropy, float &valueAnisotropy) const
Set whether newly loaded textures should have their MaxAnisotopy set to a specified value.
Definition DatabasePager:241
virtual bool isRunning() const
bool _changeAnisotropy
Definition DatabasePager:467
std::set< osg::ref_ptr< osg::StateSet > > StateSetList
Definition DatabasePager:278
virtual const char * className() const
Definition DatabasePager:59
bool getDeleteRemovedSubgraphsInDatabaseThread() const
Get whether the removed subgraphs should be deleted in the database thread or not.
Definition DatabasePager:206
unsigned int _numTilesMerges
Definition DatabasePager:484
virtual void registerPagedLODs(osg::Node *subgraph, unsigned int frameNumber=0)
Find all PagedLOD nodes in a subgraph and register them with the DatabasePager so it can keep track o...
const DatabaseThread * getDatabaseThread(unsigned int i) const
Definition DatabasePager:139
bool _databasePagerThreadPaused
Definition DatabasePager:449
bool _changeAutoUnRef
Definition DatabasePager:465
double getMinimumTimeToMergeTile() const
Get the minimum time between the first request for a tile to be loaded and the time of its merge into...
Definition DatabasePager:267
void setDeleteRemovedSubgraphsInDatabaseThread(bool flag)
Set whether the removed subgraphs should be deleted in the database thread or not.
Definition DatabasePager:203
bool _startThreadCalled
Definition DatabasePager:432
unsigned int getDataToCompileListSize() const
Report how many items are in the _dataToCompileList queue.
Definition DatabasePager:258
bool _deleteRemovedSubgraphsInDatabaseThread
Definition DatabasePager:470
bool _done
Definition DatabasePager:447
DatabaseThreadList _databaseThreads
Definition DatabasePager:451
virtual unsigned int addDatabaseThread(DatabaseThread::Mode mode, const std::string &name)
void setApplyPBOToImages(bool assignPBOToImages)
Set whether newly loaded textures should have a PixelBufferObject assigned to them to aid download to...
Definition DatabasePager:224
virtual DatabasePager * clone() const
Create a shallow copy on the DatabasePager.
Definition DatabasePager:62
void setIncrementalCompileOperation(osgUtil::IncrementalCompileOperation *ico)
Set the incremental compile operation.
virtual void signalBeginFrame(const osg::FrameStamp *framestamp)
Signal the database thread that the update, cull and draw has begun for a new frame.
bool getRequestsInProgress() const
Report whether any requests are in the pager.
static osg::ref_ptr< DatabasePager > & prototype()
get the prototype singleton used by DatabasePager::create().
unsigned int _targetMaximumNumberOfPageLOD
Definition DatabasePager:475
osg::ref_ptr< RequestQueue > _dataToMergeList
Definition DatabasePager:460
OpenThreads::Atomic _frameNumber
Definition DatabasePager:455
osg::ref_ptr< osg::Object > _markerObject
Definition DatabasePager:486
void addLoadedDataToSceneGraph(const osg::FrameStamp &frameStamp)
Add the loaded data to the scene graph.
DrawablePolicy
Definition DatabasePager:209
@ USE_VERTEX_BUFFER_OBJECTS
Definition DatabasePager:212
@ USE_VERTEX_ARRAYS
Definition DatabasePager:213
@ DO_NOT_MODIFY_DRAWABLE_SETTINGS
Definition DatabasePager:210
@ USE_DISPLAY_LISTS
Definition DatabasePager:211
void setAcceptNewDatabaseRequests(bool acceptNewRequests)
Set whether new database request calls are accepted or ignored.
Definition DatabasePager:150
DrawablePolicy _drawablePolicy
Definition DatabasePager:462
double _totalTimeToMergeTiles
Definition DatabasePager:483
bool getDatabasePagerThreadPause() const
Get whether the database pager thread should is paused or not.
Definition DatabasePager:147
bool _valueAutoUnRef
Definition DatabasePager:466
float _valueAnisotropy
Definition DatabasePager:468
OpenThreads::Mutex _run_mutex
Definition DatabasePager:430
OpenThreads::Mutex _numFramesActiveMutex
Definition DatabasePager:454
void setMaxAnisotropyPolicy(bool changeAnisotropy, float valueAnisotropy)
Set whether newly loaded textures should have their MaxAnisotopy set to a specified value.
Definition DatabasePager:238
virtual void signalEndFrame()
Signal the database thread that the update, cull and draw dispatch has completed.
void setMarkerObject(osg::Object *mo)
Definition DatabasePager:296
bool getDoPreCompile() const
Get whether the database pager should pre compile OpenGL objects before allowing them to be merged in...
Definition DatabasePager:189
Definition DatabasePager:90
void setActive(bool active)
Definition DatabasePager:110
void setDone(bool done)
Definition DatabasePager:107
std::string _name
Definition DatabasePager:125
const std::string & getName() const
Definition DatabasePager:105
bool getActive() const
Definition DatabasePager:111
DatabasePager * _pager
Definition DatabasePager:123
OpenThreads::Atomic _done
Definition DatabasePager:121
void setName(const std::string &name)
Definition DatabasePager:104
Mode _mode
Definition DatabasePager:124
bool getDone() const
Definition DatabasePager:108
DatabaseThread(const DatabaseThread &dt, DatabasePager *pager)
volatile bool _active
Definition DatabasePager:122
DatabaseThread(DatabasePager *pager, Mode mode, const std::string &name)
Mode
Definition DatabasePager:94
@ HANDLE_NON_HTTP
Definition DatabasePager:96
@ HANDLE_ALL_REQUESTS
Definition DatabasePager:95
@ HANDLE_ONLY_HTTP
Definition DatabasePager:97
Definition DatabasePager:286
virtual unsigned int size()=0
virtual void removeExpiredChildren(int numberChildrenToRemove, double expiryTime, unsigned int expiryFrame, ObjectList &childrenRemoved, bool visitActive)=0
virtual void insertPagedLOD(const osg::observer_ptr< osg::PagedLOD > &plod)=0
virtual bool containsPagedLOD(const osg::observer_ptr< osg::PagedLOD > &plod) const =0
virtual PagedLODList * clone()=0
virtual void removeNodes(osg::NodeList &nodesToRemove)=0
Definition DatabasePager:310
float _priorityFirstRequest
Definition DatabasePager:337
unsigned int _frameNumberFirstRequest
Definition DatabasePager:335
bool isRequestCurrent(int frameNumber) const
Definition DatabasePager:328
unsigned int _numOfRequests
Definition DatabasePager:341
osg::ref_ptr< osg::Node > _loadedModel
Definition DatabasePager:346
osg::observer_ptr< osg::Group > _group
Definition DatabasePager:344
bool _valid
Definition DatabasePager:333
double _timestampFirstRequest
Definition DatabasePager:336
osg::ref_ptr< Options > _loadOptions
Definition DatabasePager:347
osg::observer_ptr< osgUtil::IncrementalCompileOperation::CompileSet > _compileSet
Definition DatabasePager:350
osg::ref_ptr< ObjectCache > _objectCache
Definition DatabasePager:348
double _timestampLastRequest
Definition DatabasePager:339
unsigned int _frameNumberLastRequest
Definition DatabasePager:338
bool valid() const
Definition DatabasePager:326
bool _groupExpired
Definition DatabasePager:351
float _priorityLastRequest
Definition DatabasePager:340
osg::observer_ptr< osg::Node > _terrain
Definition DatabasePager:343
DatabaseRequest()
Definition DatabasePager:311
std::string _fileName
Definition DatabasePager:334
Definition DatabasePager:356
bool pruneOldRequestsAndCheckIfEmpty()
prune all the old requests and then return true if requestList left empty
void add(DatabaseRequest *databaseRequest)
RequestQueue(DatabasePager *pager)
void invalidate(DatabaseRequest *dr)
void swap(RequestList &requestList)
void remove(DatabaseRequest *databaseRequest)
OpenThreads::Mutex _requestMutex
Definition DatabasePager:387
RequestList _requestList
Definition DatabasePager:386
void takeFirst(osg::ref_ptr< DatabaseRequest > &databaseRequest)
std::list< osg::ref_ptr< DatabaseRequest > > RequestList
Definition DatabasePager:382
DatabasePager * _pager
Definition DatabasePager:385
unsigned int _frameNumberLastPruned
Definition DatabasePager:388
virtual void updateBlock()
Definition DatabasePager:371
void addNoLock(DatabaseRequest *databaseRequest)
void block()
Definition DatabasePager:401
ReadQueue(DatabasePager *pager, const std::string &name)
std::string _name
Definition DatabasePager:410
ObjectList _childrenToDeleteList
Definition DatabasePager:413
void release()
Definition DatabasePager:403
OpenThreads::Mutex _childrenToDeleteListMutex
Definition DatabasePager:412
osg::ref_ptr< osg::RefBlock > _block
Definition DatabasePager:408
Definition IncrementalCompileOperation:56
#define OSGDB_EXPORT
Definition Export:39

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