Frapper  1.0a
ViewportWidget.h
Go to the documentation of this file.
1 /*
2 -----------------------------------------------------------------------------
3 This source file is part of FRAPPER
4 research.animationsinstitut.de
5 sourceforge.net/projects/frapper
6 
7 Copyright (c) 2008-2009 Filmakademie Baden-Wuerttemberg, Institute of Animation
8 
9 This program is free software; you can redistribute it and/or modify it under
10 the terms of the GNU Lesser General Public License as published by the Free Software
11 Foundation; version 2.1 of the License.
12 
13 This program is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
16 
17 You should have received a copy of the GNU Lesser General Public License along with
18 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
19 Place - Suite 330, Boston, MA 02111-1307, USA, or go to
20 http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
21 -----------------------------------------------------------------------------
22 */
23 
33 
34 #ifndef VIEWPORTWIDGET_H
35 #define VIEWPORTWIDGET_H
36 
37 #include "FrapperPrerequisites.h"
38 #include "InstanceCounterMacros.h"
39 #include "SceneModel.h"
40 #include "ViewingParameters.h"
41 #include <QtGui/QWidget>
42 #include <QtGui/QMouseEvent>
43 #include <QtGui/QMessageBox>
44 #include <QtGui/QRgb>
45 #include <QtGui/QColor>
46 #include <QtCore/QString>
47 #include <Ogre.h>
48 #if (OGRE_PLATFORM == OGRE_PLATFORM_WIN32)
49 #include <windows.h>
50 #endif
51 #include <OgrePanelOverlayElement.h>
52 #include <OgreTextAreaOverlayElement.h>
53 
54 
59 #define VF_MAIN_VIEWPORT 0x1
60 
65 #define VF_ORIENTATION_VIEWPORT 0x2
66 
67 
68 namespace Frapper {
69 
87 class FRAPPER_GUI_EXPORT ViewportWidget : public QWidget
88 {
89 
90  Q_OBJECT
92 
93 private: // static data
94 
98  static unsigned int s_viewportIndex;
99 
103  static Ogre::HighLevelGpuProgramPtr s_defaultVertexShader;
104 
108  static Ogre::HighLevelGpuProgramPtr s_defaultFragmentShader;
109 
113  static Ogre::HighLevelGpuProgramPtr s_defaultUVVertexShader;
114 
118  static Ogre::HighLevelGpuProgramPtr s_defaultTU0FragmentShader;
119 
123  static Ogre::MaterialPtr s_redMaterial;
124 
128  static Ogre::MaterialPtr s_greenMaterial;
129 
133  static Ogre::MaterialPtr s_blueMaterial;
134 
138  static Ogre::MaterialPtr s_grayMaterial;
139 
143  static Ogre::MaterialPtr s_blackMaterial;
144 
148  static Ogre::MaterialPtr s_defaultMaterial;
149 
153  static Ogre::MaterialPtr s_nullMaterial;
154 
155 public: // constructors and destructors
156 
167  ViewportWidget ( QWidget *parent = 0, unsigned int stageIndex = 1, bool fullscreen = false, bool stereo = false, int width = 1024, int height = 768 );
168 
176  virtual ~ViewportWidget();
177 
178 public: // functions
179 
187  virtual QPaintEngine * paintEngine () const;
188 
194  unsigned int getStageIndex ();
195 
201  void setStageIndex ( unsigned int stageIndex );
202 
208  void setViewMode ( bool viewMode );
209 
213  void frameSelectedObjects ();
214 
221  void setFog ( bool enabled, float density );
222 
228  QColor getFogColor ();
229 
235  void setFogColor ( const QColor &color );
236 
242  QColor getBackgroundColor ();
243 
249  void setBackgroundColor ( const QColor &color );
250 
258  void setFullscreen ( bool fullscreen, int width, int height );
259 
272  void getStereoParameters( float &rttWidth, float &rttHeight,
273  float &eyeDist, float &fOffsetMultiplier,
274  float &nearClip, float &farClip, float &fov, float &focalLength );
275 
288  void setStereoParameters( const unsigned int rttWidth, const unsigned int rttHeight,
289  const float eyeDist, const float fOffsetMultiplier,
290  const float nearClip, const float farClip, const float fov, const float focalLength );
291 
297  void setStereo ( bool enable );
298 
304  void setOverlayOnly ( bool enable );
305 
312  float getFps ();
313 
319  int getTriangleCount ();
320 
326  ViewingParameters * getViewingParameters ();
327 
332  void updateView ();
333 
337  Ogre::RenderWindow* getRenderWindow();
338 
339 public slots: //
340 
347  void applyViewingParameters ( ViewingParameters *viewingParameters );
348 
355  void setImage ( unsigned int stageIndex, Ogre::TexturePtr image );
356 
360  void homeView ();
361 
367  void setWireframe ( bool wireframe );
368 
375  void setBackfaceCulling ( bool backfaceCulling );
376 
380  void toggleOrigin ();
381 
385  void toggleCenterPoint ();
386 
390  void toggleOrientationIndicator ();
391 
395  void toggleGrid ();
399  void screenCapture ();
400 
401 signals: //
402 
409  void objectSelected ( const QString &objectName, bool toggle );
410 
416  void viewChanged ( ViewingParameters *viewingParameters );
417 
427  void frameSelectedObjectsRequested ( ViewingParameters *viewingParameters );
428 
432  void renderingTriggered();
433 
434 protected: // events
435 
441  virtual void resizeEvent ( QResizeEvent *event );
442 
448  virtual void paintEvent ( QPaintEvent *event );
449 
455  virtual void mousePressEvent ( QMouseEvent *event );
456 
462  virtual void mouseMoveEvent ( QMouseEvent *event );
463 
469  virtual void mouseReleaseEvent ( QMouseEvent *event );
470 
476  virtual void wheelEvent ( QWheelEvent *event );
477 
478 private: // functions
479 
484  Ogre::String createUniqueName ( const QString &objectName );
485 
490  bool createdefaultShaders ();
491 
499  Ogre::HighLevelGpuProgramPtr compileShader ( const Ogre::String &code, Ogre::GpuProgramType type, const Ogre::String &nameSuffix );
500 
506  bool createRenderWindow ();
507 
511  void initializeResources ();
512 
517  void createViewportObjects ();
518 
523  void createOverlays ();
524 
528  void render ();
529 
540  Ogre::MaterialPtr createColorMaterial ( const Ogre::String &group, const Ogre::String &name, const Ogre::ColourValue &color, bool wireframe = false );
541 
551  void createAxes ( const QString &name, Ogre::SceneNode *parentNode, Ogre::uint32 visibilityFlags = VF_MAIN_VIEWPORT );
552 
558  void createGrid ( Ogre::SceneNode *parentNode );
559 
567  Ogre::SceneNode * getClickedSceneNode ( const QPointF &mousePosition );
568 
569 protected: // data
570 
574  unsigned int m_stageIndex;
575 
580 
585 
589  bool m_stereo;
590 
598  float m_stereoFov;
600  unsigned int m_stereoRttWidth;
601  unsigned int m_stereoRttHeight;
602 
606  int m_width;
607 
611  int m_height;
612 
613  // OGRE System Objects
614 
618  Ogre::RenderWindow *m_renderWindow;
619 
623  Ogre::SceneManager *m_sceneManager;
624 
629 
634  Ogre::MaterialPtr m_imageMaterial;
635 
639  Ogre::Camera *m_camera;
640  Ogre::Camera *m_camera0;
641  Ogre::Camera *m_camera1;
642  Ogre::Camera *m_camera2;
643  Ogre::Camera *m_camera3;
644  Ogre::Camera *m_camera4;
645 
649  QString m_cameraName;
650 
654  Ogre::Light *m_headLight;
655 
659  Ogre::CompositorInstance *m_stereoCompositor;
660 
664  Ogre::RenderTarget *m_stereoRenderTarget;
665 
669  Ogre::Viewport *m_viewport;
670  Ogre::Viewport *m_stereoViewport0;
671  Ogre::Viewport *m_stereoViewport1;
672  Ogre::Viewport *m_stereoViewport2;
673  Ogre::Viewport *m_stereoViewport3;
674  Ogre::Viewport *m_stereoViewport4;
675 
679  Ogre::ColourValue m_backgroundColor;
680 
684  Ogre::ColourValue m_fogColor;
685 
690 
695 
701 
702  // Overlays
703 
707  Ogre::Overlay *m_labelOverlay;
708 
712  Ogre::Overlay *m_imageOverlay;
713 
718  Ogre::PanelOverlayElement *m_leftTopHudPanel;
719 
724  Ogre::TextAreaOverlayElement *m_leftTopHudTextArea;
725 
729  Ogre::PanelOverlayElement *m_imagePanel;
730 
731  // Scene Nodes
732 
738 
743 
748 
753 
758 
759  // Viewing
760 
765 
770 
775 
776  // Display Flags
777 
782 
787 
792 
797 
803 
808 
813 
817  float m_dbgColor;
818 
819 };
820 
821 } // end namespace Frapper
822 
823 #endif