OSG  3.4.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
ImagePager.h
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_IMAGEPAGER
15 #define OSGDB_IMAGEPAGER 1
16 
17 #include <osg/Image>
18 #include <osg/NodeVisitor>
19 #include <osg/observer_ptr>
20 #include <osg/OperationThread>
21 #include <osg/FrameStamp>
22 
23 #include <OpenThreads/Mutex>
24 #include <OpenThreads/Atomic>
25 
26 #include <osgDB/ReaderWriter>
27 #include <osgDB/Options>
28 
29 namespace osgDB
30 {
31 
33 {
34  public:
35 
36  ImagePager();
37 
39  {
40  public:
41 
42  enum Mode
43  {
46  HANDLE_ONLY_HTTP
47  };
48 
49  ImageThread(ImagePager* pager, Mode mode, const std::string& name);
50 
51  ImageThread(const ImageThread& dt, ImagePager* pager);
52 
53  void setDone(bool done) { _done = done; }
54  bool getDone() const { return _done; }
55 
56  virtual int cancel();
57 
58  virtual void run();
59 
60  protected:
61 
62  virtual ~ImageThread();
63 
64  bool _done;
67  std::string _name;
68  };
69 
70 
71  ImageThread* getImageThread(unsigned int i) { return _imageThreads[i].get(); }
72 
73  const ImageThread* getImageThread(unsigned int i) const { return _imageThreads[i].get(); }
74 
75  unsigned int getNumImageThreads() const { return static_cast<unsigned int>(_imageThreads.size()); }
76 
77 
78  void setPreLoadTime(double preLoadTime) { _preLoadTime=preLoadTime; }
79  virtual double getPreLoadTime() const { return _preLoadTime; }
80 
81  virtual osg::Image* readImageFile(const std::string& fileName, const osg::Referenced* options=0);
82 
83  virtual void requestImageFile(const std::string& fileName, osg::Object* attachmentPoint, int attachmentIndex, double timeToMergeBy, const osg::FrameStamp* framestamp, osg::ref_ptr<osg::Referenced>& imageRequest, const osg::Referenced* options);
84 
86  virtual bool requiresUpdateSceneGraph() const;
87 
89  virtual void updateSceneGraph(const osg::FrameStamp &frameStamp);
90 
93  virtual void signalBeginFrame(const osg::FrameStamp* framestamp);
94 
97  virtual void signalEndFrame();
98 
99  int cancel();
100 
101  protected:
102 
103  virtual ~ImagePager();
104  // forward declare
105  struct RequestQueue;
106 
107  struct SortFileRequestFunctor;
108  friend struct SortFileRequestFunctor;
109 
111  {
113  osg::Referenced(true),
114  _timeToMergeBy(0.0),
115  _attachmentIndex(-1) {}
116 
117  unsigned int _frameNumber;
119  std::string _fileName;
126 
127  };
128 
130  {
131  typedef std::vector< osg::ref_ptr<ImageRequest> > RequestList;
132 
133  void sort();
134 
135  unsigned int size() const;
136 
137  RequestList _requestList;
139  };
140 
141 
142  struct ReadQueue : public RequestQueue
143  {
144  ReadQueue(ImagePager* pager, const std::string& name);
145 
146  void block() { _block->block(); }
147 
148  void release() { _block->release(); }
149 
150  void updateBlock()
151  {
152  _block->set((!_requestList.empty() || !_pager->_databasePagerThreadPaused));
153  }
154 
155  void clear();
156 
157  void add(ImageRequest* imageRequest);
158 
159  void takeFirst(osg::ref_ptr<ImageRequest>& databaseRequest);
160 
162 
164  std::string _name;
165  };
166 
169 
170  bool _done;
172 
174 
177 
178  typedef std::vector< osg::ref_ptr<ImageThread> > ImageThreads;
179  ImageThreads _imageThreads;
180 
182 
183  double _preLoadTime;
184 };
185 
186 
187 }
188 
189 #endif
190 
std::vector< osg::ref_ptr< ImageThread > > ImageThreads
Definition: ImagePager.h:178
This class provides an object-oriented thread mutex interface.
Definition: Mutex.h:31
bool _databasePagerThreadPaused
Definition: ImagePager.h:171
ImageThreads _imageThreads
Definition: ImagePager.h:179
void setPreLoadTime(double preLoadTime)
Definition: ImagePager.h:78
osg::ref_ptr< osgDB::Options > _readOptions
Definition: ImagePager.h:125
osg::ref_ptr< osg::RefBlock > _block
Definition: ImagePager.h:161
OpenThreads::Atomic _frameNumber
Definition: ImagePager.h:173
osg::ref_ptr< RequestQueue > _completedQueue
Definition: ImagePager.h:181
OpenThreads::Mutex _run_mutex
Definition: ImagePager.h:167
osg::ref_ptr< osg::Image > _loadedImage
Definition: ImagePager.h:123
This class provides an atomic increment and decrement operation.
Definition: Atomic.h:48
osg::observer_ptr< osg::Object > _attachmentPoint
Definition: ImagePager.h:121
This class provides an object-oriented thread interface.
Definition: Thread.h:49
osg::ref_ptr< ReadQueue > _readQueue
Definition: ImagePager.h:176
Definition: Archive.h:24
OpenThreads::Mutex _ir_mutex
Definition: ImagePager.h:175
OpenThreads::Mutex _requestMutex
Definition: ImagePager.h:138
#define OSGDB_EXPORT
Definition: Export.h:39
const ImageThread * getImageThread(unsigned int i) const
Definition: ImagePager.h:73
std::vector< osg::ref_ptr< ImageRequest > > RequestList
Definition: ImagePager.h:131
unsigned int getNumImageThreads() const
Definition: ImagePager.h:75
Definition: AlphaFunc.h:19
virtual double getPreLoadTime() const
Definition: ImagePager.h:79
ImageThread * getImageThread(unsigned int i)
Definition: ImagePager.h:71
osg::ref_ptr< Options > _loadOptions
Definition: ImagePager.h:120
OSGDB_EXPORT osg::Image * readImageFile(const std::string &filename, const Options *options)