$search
00001 /* 00002 * Copyright (c) 2008, Willow Garage, Inc. 00003 * All rights reserved. 00004 * 00005 * Redistribution and use in source and binary forms, with or without 00006 * modification, are permitted provided that the following conditions are met: 00007 * 00008 * * Redistributions of source code must retain the above copyright 00009 * notice, this list of conditions and the following disclaimer. 00010 * * Redistributions in binary form must reproduce the above copyright 00011 * notice, this list of conditions and the following disclaimer in the 00012 * documentation and/or other materials provided with the distribution. 00013 * * Neither the name of the Willow Garage, Inc. nor the names of its 00014 * contributors may be used to endorse or promote products derived from 00015 * this software without specific prior written permission. 00016 * 00017 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 00018 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00019 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00020 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 00021 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 00022 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 00023 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 00024 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 00025 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 00026 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00027 * POSSIBILITY OF SUCH DAMAGE. 00028 */ 00029 00030 #include <QKeyEvent> 00031 00032 #include <OGRE/OgreRay.h> 00033 #include <OGRE/OgreSceneManager.h> 00034 #include <OGRE/OgreCamera.h> 00035 #include <OGRE/OgreMovableObject.h> 00036 #include <OGRE/OgreRectangle2D.h> 00037 #include <OGRE/OgreSceneNode.h> 00038 #include <OGRE/OgreViewport.h> 00039 #include <OGRE/OgreMaterialManager.h> 00040 #include <OGRE/OgreTexture.h> 00041 #include <OGRE/OgreTextureManager.h> 00042 00043 #include <ros/time.h> 00044 00045 #include "ogre_tools/camera_base.h" 00046 #include "ogre_tools/qt_ogre_render_window.h" 00047 00048 #include "move_tool.h" 00049 #include "selection/selection_manager.h" 00050 #include "visualization_manager.h" 00051 #include "render_panel.h" 00052 #include "display.h" 00053 #include "viewport_mouse_event.h" 00054 00055 #include "selection_tool.h" 00056 00057 namespace rviz 00058 { 00059 00060 SelectionTool::SelectionTool( const std::string& name, char shortcut_key, VisualizationManager* manager ) 00061 : Tool( name, shortcut_key, manager ) 00062 , move_tool_(new MoveTool("SelectionTool Fake MoveTool", 0, manager)) 00063 , selecting_(false) 00064 , sel_start_x_(0) 00065 , sel_start_y_(0) 00066 , moving_(false) 00067 { 00068 00069 } 00070 00071 SelectionTool::~SelectionTool() 00072 { 00073 delete move_tool_; 00074 } 00075 00076 void SelectionTool::activate() 00077 { 00078 manager_->getSelectionManager()->setTextureSize(512); 00079 selecting_ = false; 00080 moving_ = false; 00081 } 00082 00083 void SelectionTool::deactivate() 00084 { 00085 manager_->getSelectionManager()->removeHighlight(); 00086 } 00087 00088 void SelectionTool::update(float wall_dt, float ros_dt) 00089 { 00090 SelectionManager* sel_manager = manager_->getSelectionManager(); 00091 00092 if (!selecting_) 00093 { 00094 sel_manager->removeHighlight(); 00095 } 00096 } 00097 00098 int SelectionTool::processMouseEvent( ViewportMouseEvent& event ) 00099 { 00100 SelectionManager* sel_manager = manager_->getSelectionManager(); 00101 00102 int flags = 0; 00103 00104 if( event.alt() ) 00105 { 00106 moving_ = true; 00107 selecting_ = false; 00108 } 00109 else 00110 { 00111 moving_ = false; 00112 00113 if( event.leftDown() ) 00114 { 00115 selecting_ = true; 00116 00117 sel_start_x_ = event.x; 00118 sel_start_y_ = event.y; 00119 } 00120 } 00121 00122 if( selecting_ ) 00123 { 00124 sel_manager->highlight( event.viewport, sel_start_x_, sel_start_y_, event.x, event.y ); 00125 00126 if( event.leftUp() ) 00127 { 00128 SelectionManager::SelectType type = SelectionManager::Replace; 00129 00130 M_Picked selection; 00131 00132 if( event.shift() ) 00133 { 00134 type = SelectionManager::Add; 00135 } 00136 else if( event.control() ) 00137 { 00138 type = SelectionManager::Remove; 00139 } 00140 00141 sel_manager->select( event.viewport, sel_start_x_, sel_start_y_, event.x, event.y, type ); 00142 00143 selecting_ = false; 00144 } 00145 00146 flags |= Render; 00147 } 00148 else if( moving_ ) 00149 { 00150 sel_manager->removeHighlight(); 00151 00152 flags = move_tool_->processMouseEvent( event ); 00153 00154 if( event.type == QEvent::MouseButtonRelease ) 00155 { 00156 moving_ = false; 00157 } 00158 } 00159 else 00160 { 00161 sel_manager->highlight( event.viewport, event.x, event.y, event.x, event.y ); 00162 } 00163 00164 return flags; 00165 } 00166 00167 int SelectionTool::processKeyEvent( QKeyEvent* event ) 00168 { 00169 SelectionManager* sel_manager = manager_->getSelectionManager(); 00170 00171 if( event->key() == Qt::Key_F ) 00172 { 00173 sel_manager->focusOnSelection(); 00174 } 00175 00176 return Render; 00177 } 00178 00179 } 00180