00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include <QtGlobal>
00032 #include <QTimer>
00033
00034 #include "rviz/ogre_helpers/qt_ogre_render_window.h"
00035 #include "rviz/ogre_helpers/initialization.h"
00036 #include "rviz/image/ros_image_texture.h"
00037
00038 #include "ros/ros.h"
00039 #include <ros/package.h>
00040
00041 #include <OGRE/OgreRoot.h>
00042 #include <OGRE/OgreRenderWindow.h>
00043 #include <OGRE/OgreSceneManager.h>
00044 #include <OGRE/OgreViewport.h>
00045 #include <OGRE/OgreRectangle2D.h>
00046 #include <OGRE/OgreMaterial.h>
00047 #include <OGRE/OgreMaterialManager.h>
00048 #include <OGRE/OgreTextureUnitState.h>
00049
00050 #include "image_view.h"
00051
00052 using namespace rviz;
00053
00054 ImageView::ImageView( QWidget* parent )
00055 : QtOgreRenderWindow( parent )
00056 {
00057 setAutoRender(false);
00058 scene_manager_ = ogre_root_->createSceneManager( Ogre::ST_GENERIC, "TestSceneManager" );
00059 }
00060
00061 ImageView::~ImageView()
00062 {
00063 delete texture_;
00064 }
00065
00066 void ImageView::showEvent( QShowEvent* event )
00067 {
00068 QtOgreRenderWindow::showEvent( event );
00069
00070 V_string paths;
00071 paths.push_back(ros::package::getPath(ROS_PACKAGE_NAME) + "/ogre_media/textures");
00072 initializeResources(paths);
00073
00074 setCamera( scene_manager_->createCamera( "Camera" ));
00075
00076 std::string resolved_image = nh_.resolveName("image");
00077 if( resolved_image == "/image" )
00078 {
00079 ROS_WARN("image topic has not been remapped");
00080 }
00081
00082 std::stringstream title;
00083 title << "rviz Image Viewer [" << resolved_image << "]";
00084 setWindowTitle( QString::fromStdString( title.str() ));
00085
00086 texture_ = new ROSImageTexture(nh_);
00087 texture_->setTopic("image");
00088
00089 Ogre::MaterialPtr material =
00090 Ogre::MaterialManager::getSingleton().create( "Material",
00091 Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME );
00092 material->setCullingMode(Ogre::CULL_NONE);
00093 material->getTechnique(0)->getPass(0)->setDepthWriteEnabled(true);
00094 material->getTechnique(0)->setLightingEnabled(false);
00095 Ogre::TextureUnitState* tu = material->getTechnique(0)->getPass(0)->createTextureUnitState();
00096 tu->setTextureName(texture_->getTexture()->getName());
00097 tu->setTextureFiltering( Ogre::TFO_NONE );
00098
00099 Ogre::Rectangle2D* rect = new Ogre::Rectangle2D(true);
00100 rect->setCorners(-1.0f, 1.0f, 1.0f, -1.0f);
00101 rect->setMaterial(material->getName());
00102 rect->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY - 1);
00103 Ogre::AxisAlignedBox aabb;
00104 aabb.setInfinite();
00105 rect->setBoundingBox(aabb);
00106
00107 Ogre::SceneNode* node = scene_manager_->getRootSceneNode()->createChildSceneNode();
00108 node->attachObject(rect);
00109 node->setVisible(true);
00110
00111 QTimer* timer = new QTimer( this );
00112 connect( timer, SIGNAL( timeout() ), this, SLOT( onTimer() ));
00113 timer->start( 33 );
00114 }
00115
00116 void ImageView::onTimer()
00117 {
00118 ros::spinOnce();
00119
00120 static bool first = true;
00121 try
00122 {
00123 if( texture_->update() )
00124 {
00125 if( first )
00126 {
00127 first = false;
00128
00129 resize( texture_->getWidth(), texture_->getHeight() );
00130 }
00131 }
00132
00133 ogre_root_->renderOneFrame();
00134 }
00135 catch( UnsupportedImageEncoding& e )
00136 {
00137 ROS_ERROR("%s", e.what());
00138 }
00139
00140 if( !nh_.ok() )
00141 {
00142 close();
00143 }
00144 }