OSG  3.4.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
ViewerEventHandlers.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 OSGVIEWER_VIEWEREVENTHANDLERS
15 #define OSGVIEWER_VIEWEREVENTHANDLERS 1
16 
17 #include <osg/AnimationPath>
18 #include <osgText/Text>
19 #include <osgGA/GUIEventHandler>
20 #include <osgGA/AnimationPathManipulator>
21 
22 #include <osgViewer/GraphicsWindow>
23 #include <osgViewer/Viewer>
24 
25 #include <osgDB/fstream>
26 
27 namespace osgViewer {
28 
31 {
32  public:
33 
35 
36  void setApplicationUsage(osg::ApplicationUsage* au) { _applicationUsage = au; }
37  osg::ApplicationUsage* getApplicationUsage() { return _applicationUsage.get(); }
38  const osg::ApplicationUsage* getApplicationUsage() const { return _applicationUsage.get(); }
39 
40  void setKeyEventTogglesOnScreenHelp(int key) { _keyEventTogglesOnScreenHelp = key; }
41  int getKeyEventTogglesOnScreenHelp() const { return _keyEventTogglesOnScreenHelp; }
42 
43  void reset();
44 
45  osg::Camera* getCamera() { return _camera.get(); }
46  const osg::Camera* getCamera() const { return _camera.get(); }
47 
48  bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa);
49 
51  virtual void getUsage(osg::ApplicationUsage& usage) const;
52 
53  protected:
54 
55  void setUpHUDCamera(osgViewer::ViewerBase* viewer);
56 
57  void setUpScene(osgViewer::ViewerBase* viewer);
58 
60 
62 
64 
68 
69 };
70 
75 {
76  public:
77 
78  StatsHandler();
79 
80  enum StatsType
81  {
82  NO_STATS = 0,
83  FRAME_RATE = 1,
84  VIEWER_STATS = 2,
85  CAMERA_SCENE_STATS = 3,
86  VIEWER_SCENE_STATS = 4,
87  LAST = 5
88  };
89 
90  void setKeyEventTogglesOnScreenStats(int key) { _keyEventTogglesOnScreenStats = key; }
91  int getKeyEventTogglesOnScreenStats() const { return _keyEventTogglesOnScreenStats; }
92 
93  void setKeyEventPrintsOutStats(int key) { _keyEventPrintsOutStats = key; }
94  int getKeyEventPrintsOutStats() const { return _keyEventPrintsOutStats; }
95 
96  double getBlockMultiplier() const { return _blockMultiplier; }
97 
98  void reset();
99 
100  osg::Camera* getCamera() { return _camera.get(); }
101  const osg::Camera* getCamera() const { return _camera.get(); }
102 
103  virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa);
104 
106  virtual void getUsage(osg::ApplicationUsage& usage) const;
107 
140  void addUserStatsLine(const std::string& label, const osg::Vec4& textColor, const osg::Vec4& barColor,
141  const std::string& timeTakenName, float multiplier, bool average, bool averageInInverseSpace,
142  const std::string& beginTimeName, const std::string& endTimeName, float maxValue);
143 
144  void removeUserStatsLine(const std::string& label);
145 
146 protected:
147 
148  void setUpHUDCamera(osgViewer::ViewerBase* viewer);
149  void setWindowSize(int width, int height);
150 
151  osg::Geometry* createBackgroundRectangle(const osg::Vec3& pos, const float width, const float height, osg::Vec4& color);
152 
153  osg::Geometry* createGeometry(const osg::Vec3& pos, float height, const osg::Vec4& colour, unsigned int numBlocks);
154 
155  osg::Geometry* createFrameMarkers(const osg::Vec3& pos, float height, const osg::Vec4& colour, unsigned int numBlocks);
156 
157  osg::Geometry* createTick(const osg::Vec3& pos, float height, const osg::Vec4& colour, unsigned int numTicks);
158 
159  void createTimeStatsLine(const std::string& lineLabel, osg::Vec3 pos,
160  const osg::Vec4& textColor, const osg::Vec4& barColor, osg::Stats* viewerStats, osg::Stats* stats,
161  const std::string& timeTakenName, float multiplier, bool average, bool averageInInverseSpace,
162  const std::string& beginTimeName, const std::string& endTimeName);
163 
164  void createCameraTimeStats(osg::Vec3& pos, bool acquireGPUStats, osg::Stats* viewerStats, osg::Camera* camera);
165 
166  void setUpScene(osgViewer::ViewerBase* viewer);
167 
168  void updateThreadingModelText();
169 
172 
174 
177 
179 
181 
184 
185  unsigned int _frameRateChildNum;
186  unsigned int _viewerChildNum;
187  unsigned int _cameraSceneChildNum;
188  unsigned int _viewerSceneChildNum;
189  unsigned int _numBlocks;
191 
192  float _statsWidth;
194 
195  std::string _font;
197  float _leftPos;
199  float _lineHeight;
200 
202  {
203  std::string label;
206  std::string timeTakenName;
207  float multiplier;
208  bool average;
210  std::string beginTimeName;
211  std::string endTimeName;
212  float maxValue;
213 
214  UserStatsLine(const std::string& label_, const osg::Vec4& textColor_, const osg::Vec4& barColor_,
215  const std::string& timeTakenName_, float multiplier_, bool average_, bool averageInInverseSpace_,
216  const std::string& beginTimeName_, const std::string& endTimeName_, float maxValue_)
217  : label(label_), textColor(textColor_), barColor(barColor_),
218  timeTakenName(timeTakenName_), multiplier(multiplier_), average(average_), averageInInverseSpace(averageInInverseSpace_),
219  beginTimeName(beginTimeName_), endTimeName(endTimeName_), maxValue(maxValue_)
220  {
221  }
222  };
223 
224  typedef std::vector<UserStatsLine> UserStatsLines;
225  UserStatsLines _userStatsLines;
226 
227 };
228 
231 {
232 public:
233 
235 
237  virtual void getUsage(osg::ApplicationUsage &usage) const;
238 
239  void setKeyEventToggleFullscreen(int key) { _keyEventToggleFullscreen = key; }
240  int getKeyEventToggleFullscreen() const { return _keyEventToggleFullscreen; }
241 
242  void setToggleFullscreen(bool flag) { _toggleFullscreen = flag; }
243  bool getToggleFullscreen() const { return _toggleFullscreen; }
244 
245  void setKeyEventWindowedResolutionUp(int key) { _keyEventWindowedResolutionUp = key; }
246  int getKeyEventWindowedResolutionUp() const { return _keyEventWindowedResolutionUp; }
247  void setKeyEventWindowedResolutionDown(int key) { _keyEventWindowedResolutionDown = key; }
248  int getKeyEventWindowedResolutionDown() const { return _keyEventWindowedResolutionDown; }
249 
250  void setChangeWindowedResolution(bool flag) { _changeWindowedResolution = flag; }
251  bool getChangeWindowedResolution() const { return _changeWindowedResolution; }
252 
253  virtual bool handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &aa);
254 
255 protected:
256 
257  void toggleFullscreen(osgViewer::GraphicsWindow *window);
258  void changeWindowedResolution(osgViewer::GraphicsWindow *window, bool increase);
259 
260  unsigned int getNearestResolution(int screenWidth, int screenHeight, int width, int height) const;
261 
264 
268  std::vector<osg::Vec2> _resolutionList;
270 };
271 
274 {
275 public:
276 
278 
280  virtual void getUsage(osg::ApplicationUsage &usage) const;
281 
282  void setKeyEventChangeThreadingModel(int key) { _keyEventChangeThreadingModel = key; }
283  int getKeyEventChangeThreadingModel() const { return _keyEventChangeThreadingModel; }
284 
285  void setChangeThreadingModel(bool flag) { _changeThreadingModel = flag; }
286  bool getChangeThreadingModel() const { return _changeThreadingModel; }
287 
288  void setKeyEventChangeEndBarrierPosition(int key) { _keyEventChangeEndBarrierPosition = key; }
289  int getKeyEventChangeEndBarrierPosition() const { return _keyEventChangeEndBarrierPosition; }
290 
291  void setChangeEndBarrierPosition(bool flag) { _changeEndBarrierPosition = flag; }
292  bool getChangeEndBarrierPosition() const { return _changeEndBarrierPosition; }
293 
294  bool handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &aa);
295 
296 protected:
297 
300 
303 
305  bool _done;
306 };
307 
316 {
317 public:
318 
319  RecordCameraPathHandler(const std::string &filename = "saved_animation.path", float fps = 25.0f);
320 
321  void setKeyEventToggleRecord(int key) { _keyEventToggleRecord = key; }
322  int getKeyEventToggleRecord() const { return _keyEventToggleRecord; }
323 
324  void setKeyEventTogglePlayback(int key) { _keyEventTogglePlayback = key; }
325  int getKeyEventTogglePlayback() const { return _keyEventTogglePlayback; }
326 
327  void setAutoIncrementFilename( bool autoinc = true ) { _autoinc = autoinc?0:-1; }
328 
329  virtual void getUsage(osg::ApplicationUsage &usage) const;
330 
331  bool handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &aa);
332 
333 protected:
334 
335  std::string _filename;
336  int _autoinc;
338 
341 
342 
345  double _interval;
346  double _delta;
352 };
353 
356 {
357  public:
358 
359  LODScaleHandler();
360 
361  void setKeyEventIncreaseLODScale(int key) { _keyEventIncreaseLODScale = key; }
362  int getKeyEventIncreaseLODScale() const { return _keyEventIncreaseLODScale; }
363 
364  void setKeyEventDecreaseLODScale(int key) { _keyEventDecreaseLODScale = key; }
365  int getKeyEventDecreaseLODScale() const { return _keyEventDecreaseLODScale; }
366 
367  bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa);
368 
370  virtual void getUsage(osg::ApplicationUsage& usage) const;
371 
372  protected:
373 
374 
377 
378 
379 };
380 
383 {
384  public:
385 
387 
388  void setKeyEventToggleSyncToVBlankHandler(int key) { _keyEventToggleSyncToVBlank = key; }
389  int getKeyEventToggleSyncToVBlankHandler() const { return _keyEventToggleSyncToVBlank; }
390 
391  bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa);
392 
394  virtual void getUsage(osg::ApplicationUsage& usage) const;
395 
396  protected:
397 
398 
400 
401 
402 };
403 
404 
407 {
408  public:
409 
412  {
413  public:
414  virtual void operator()(const osg::Image& image, const unsigned int context_id) = 0;
415  };
416 
419  {
420  public:
422  {
424  SEQUENTIAL_NUMBER
425  // ... any others?
426  };
427 
428  WriteToFile(const std::string& filename, const std::string& extension, SavePolicy savePolicy = SEQUENTIAL_NUMBER);
429 
430  virtual void operator()(const osg::Image& image, const unsigned int context_id);
431 
432  void setSavePolicy(SavePolicy savePolicy) { _savePolicy = savePolicy; }
433  SavePolicy getSavePolicy() const { return _savePolicy; }
434 
435  protected:
436 
437  WriteToFile& operator = (const WriteToFile&) { return *this; }
438 
439  const std::string _filename;
440  const std::string _extension;
441 
443 
444  std::vector<unsigned int> _contextSaveCounter;
445  };
446 
448  ScreenCaptureHandler(CaptureOperation* defaultOperation = 0, int numFrames = 1);
449 
450  void setKeyEventTakeScreenShot(int key) { _keyEventTakeScreenShot = key; }
451  int getKeyEventTakeScreenShot() const { return _keyEventTakeScreenShot; }
452 
453  void setKeyEventToggleContinuousCapture(int key) { _keyEventToggleContinuousCapture = key; }
454  int getKeyEventToggleContinuousCapture() const { return _keyEventToggleContinuousCapture; }
455 
456  void setCaptureOperation(CaptureOperation* operation);
457  CaptureOperation* getCaptureOperation() const;
458 
459  // aa will point to an osgViewer::View, so we will take a screenshot
460  // of that view's graphics contexts.
461  virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa);
462 
464  virtual void captureNextFrame(osgViewer::ViewerBase& viewer);
465 
468  void setFramesToCapture(int numFrames);
469 
471  int getFramesToCapture() const;
472 
475  void startCapture();
476 
478  void stopCapture();
479 
481  virtual void getUsage(osg::ApplicationUsage& usage) const;
482 
483  protected:
486 
489  // there could be a key to start taking screenshots every new frame
490 
493 
494  void addCallbackToViewer(osgViewer::ViewerBase& viewer);
495  void removeCallbackFromViewer(osgViewer::ViewerBase& viewer);
496  osg::Camera* findAppropriateCameraForCallback(osgViewer::ViewerBase& viewer);
497 };
498 
503 {
504 public:
505 
510 
512 
513  // use the osgGA::GUIEventHandler implementation of run.
514  virtual bool run(osg::Object* object, osg::Object* data) { return osgGA::GUIEventHandler::run(object, data); }
515 
516  virtual bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa, osg::Object*, osg::NodeVisitor* nv);
517 
518  virtual bool cull(osg::NodeVisitor* nv, osg::Drawable* drawable, osg::RenderInfo* renderInfo) const;
519 
520 protected:
521 
523 
525 
527  osg::Object(), osg::Callback(), osgGA::GUIEventHandler(), osg::Drawable::CullCallback(), _fullscreen(false) {}
528 
529  bool mousePosition(osgViewer::View* view, osg::NodeVisitor* nv, const osgGA::GUIEventAdapter& ea, int& x, int &y) const;
530 
531  void resize(int width, int height);
532 
535 
538 
539 };
540 
541 }
542 
543 #endif
osg::ref_ptr< osg::Camera > _camera
osg::ref_ptr< osgGA::AnimationPathManipulator > _animPathManipulator
int getKeyEventTogglesOnScreenStats() const
void setKeyEventChangeEndBarrierPosition(int key)
#define OSGVIEWER_EXPORT
Definition: Export.h:40
void setKeyEventTogglesOnScreenHelp(int key)
const osg::Camera * getCamera() const
std::vector< osg::Vec2 > _resolutionList
void setAutoIncrementFilename(bool autoinc=true)
UserStatsLine(const std::string &label_, const osg::Vec4 &textColor_, const osg::Vec4 &barColor_, const std::string &timeTakenName_, float multiplier_, bool average_, bool averageInInverseSpace_, const std::string &beginTimeName_, const std::string &endTimeName_, float maxValue_)
void setApplicationUsage(osg::ApplicationUsage *au)
osg::ref_ptr< osg::Camera > _camera
osg::ref_ptr< osg::Geode > _statsGeode
std::vector< UserStatsLine > UserStatsLines
int getKeyEventChangeEndBarrierPosition() const
void setChangeWindowedResolution(bool flag)
unsigned long long Timer_t
Definition: Timer.h:24
virtual bool run(osg::Object *object, osg::Object *data)
#define META_Object(library, name)
Definition: Object.h:42
GLint GLenum GLsizei width
Definition: GLU.h:71
osg::observer_ptr< osg::Image > _image
osg::ref_ptr< osg::Switch > _switch
InteractiveImageHandler(const InteractiveImageHandler &, const osg::CopyOp &=osg::CopyOp::SHALLOW_COPY)
osg::ref_ptr< osg::ApplicationUsage > _applicationUsage
const osg::Camera * getCamera() const
ViewerBase::ThreadingModel _threadingModel
const osg::ApplicationUsage * getApplicationUsage() const
void setKeyEventWindowedResolutionDown(int key)
osg::observer_ptr< osg::Texture2D > _texture
osg::observer_ptr< osg::Camera > _camera
GLint GLenum GLsizei GLsizei height
Definition: GLU.h:71
void setChangeEndBarrierPosition(bool flag)
osg::ref_ptr< osgText::Text > _threadingModelText
osg::ref_ptr< osgGA::CameraManipulator > _oldManipulator
void setKeyEventPrintsOutStats(int key)
void setKeyEventTogglesOnScreenStats(int key)
Definition: AlphaFunc.h:19
osg::ref_ptr< osg::Camera::DrawCallback > _callback
osg::ref_ptr< osg::AnimationPath > _animPath
int getKeyEventTogglesOnScreenHelp() const
virtual bool run(osg::Object *object, osg::Object *data)
Definition: EventHandler.h:46
double getBlockMultiplier() const
int getKeyEventPrintsOutStats() const
void setKeyEventChangeThreadingModel(int key)
osg::ref_ptr< CaptureOperation > _operation
osg::ref_ptr< osg::Switch > _switch
osg::ApplicationUsage * getApplicationUsage()