Go to the documentation of this file.00001 #include "qt_ogre_render_window.h"
00002 #include "orthographic.h"
00003 #include "render_system.h"
00004
00005 #include <OGRE/OgreRoot.h>
00006 #include <OGRE/OgreViewport.h>
00007 #include <OGRE/OgreCamera.h>
00008 #include <OGRE/OgreRenderWindow.h>
00009 #include <OGRE/OgreStringConverter.h>
00010 #include <OGRE/OgreGpuProgramManager.h>
00011
00012 #include <ros/console.h>
00013 #include <ros/assert.h>
00014
00015 #if OGRE_PLATFORM == OGRE_PLATFORM_LINUX
00016 #include <stdlib.h>
00017 #endif
00018
00019 namespace ogre_tools
00020 {
00021
00022 QtOgreRenderWindow::QtOgreRenderWindow( RenderSystem* render_system, QWidget* parent )
00023 : RenderWidget( render_system, parent )
00024 , viewport_( 0 )
00025 , ogre_root_( render_system_->root() )
00026 , ortho_scale_( 1.0f )
00027 , auto_render_( true )
00028 , camera_( 0 )
00029 , overlays_enabled_( true )
00030 , background_color_( Ogre::ColourValue::Black )
00031 {
00032 }
00033
00034
00035 Ogre::Viewport* QtOgreRenderWindow::getViewport () const
00036 {
00037 assert( viewport_ );
00038 return viewport_;
00039 }
00040
00041 void QtOgreRenderWindow::setCamera( Ogre::Camera* camera )
00042 {
00043 camera_ = camera;
00044 if( viewport_ )
00045 {
00046 viewport_->setCamera( camera );
00047 }
00048
00049 setCameraAspectRatio();
00050
00051 update();
00052 }
00053
00054 void QtOgreRenderWindow::setOverlaysEnabled( bool overlays_enabled )
00055 {
00056 overlays_enabled_ = overlays_enabled;
00057 if( viewport_ )
00058 {
00059 viewport_->setOverlaysEnabled( overlays_enabled );
00060 }
00061 }
00062
00063 void QtOgreRenderWindow::setBackgroundColor( Ogre::ColourValue background_color )
00064 {
00065 background_color_ = background_color;
00066 if( viewport_ )
00067 {
00068 viewport_->setBackgroundColour( background_color );
00069 }
00070 }
00071
00072 void QtOgreRenderWindow::setCameraAspectRatio()
00073 {
00074 if ( camera_ )
00075 {
00076 camera_->setAspectRatio( Ogre::Real( width() ) / Ogre::Real( height() ) );
00077
00078 if ( camera_->getProjectionType() == Ogre::PT_ORTHOGRAPHIC )
00079 {
00080 Ogre::Matrix4 proj;
00081 buildScaledOrthoMatrix( proj,
00082 -width() / ortho_scale_ / 2, width() / ortho_scale_ / 2,
00083 -height() / ortho_scale_ / 2, height() / ortho_scale_ / 2,
00084 camera_->getNearClipDistance(), camera_->getFarClipDistance() );
00085 camera_->setCustomProjectionMatrix(true, proj);
00086 }
00087 }
00088 }
00089
00090 void QtOgreRenderWindow::setOrthoScale( float scale )
00091 {
00092 ortho_scale_ = scale;
00093
00094 setCameraAspectRatio();
00095 }
00096
00097 void QtOgreRenderWindow::setPreRenderCallback( boost::function<void ()> func )
00098 {
00099 pre_render_callback_ = func;
00100 }
00101
00102 void QtOgreRenderWindow::setPostRenderCallback( boost::function<void ()> func )
00103 {
00104 post_render_callback_ = func;
00105 }
00106
00107
00108 void QtOgreRenderWindow::paintEvent( QPaintEvent* e )
00109 {
00110 if( auto_render_ && render_window_ )
00111 {
00112 if( pre_render_callback_ )
00113 {
00114 pre_render_callback_();
00115 }
00116
00117 if( ogre_root_->_fireFrameStarted() )
00118 {
00119 #if (OGRE_VERSION_MAJOR >= 1 && OGRE_VERSION_MINOR >= 6)
00120 ogre_root_->_fireFrameRenderingQueued();
00121 #endif
00122
00123 render_window_->update();
00124
00125 ogre_root_->_fireFrameEnded();
00126 }
00127
00128 if ( post_render_callback_ )
00129 {
00130 post_render_callback_();
00131 }
00132 }
00133 }
00134
00135
00136 void QtOgreRenderWindow::resizeEvent( QResizeEvent* event )
00137 {
00138 RenderWidget::resizeEvent( event );
00139
00140 if( render_window_ )
00141 {
00142 setCameraAspectRatio();
00143
00144 if( auto_render_ )
00145 {
00146 update();
00147 }
00148 }
00149 }
00150
00151 void QtOgreRenderWindow::showEvent( QShowEvent *event )
00152 {
00153 RenderWidget::showEvent( event );
00154
00155 render_window_->setVisible(true);
00156 render_window_->setAutoUpdated(true);
00157
00158 viewport_ = render_window_->addViewport( camera_ );
00159 viewport_->setOverlaysEnabled( overlays_enabled_ );
00160 viewport_->setBackgroundColour( background_color_ );
00161
00162 setCameraAspectRatio();
00163 }
00164
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229 }