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 #include "selection_tool.h"
00031 #include "move_tool.h"
00032 #include "selection/selection_manager.h"
00033 #include "visualization_manager.h"
00034 #include "render_panel.h"
00035 #include "display.h"
00036 #include "viewport_mouse_event.h"
00037
00038 #include "ogre_tools/camera_base.h"
00039 #include "ogre_tools/wx_ogre_render_window.h"
00040
00041 #include <wx/event.h>
00042
00043 #include <OGRE/OgreRay.h>
00044 #include <OGRE/OgreSceneManager.h>
00045 #include <OGRE/OgreCamera.h>
00046 #include <OGRE/OgreMovableObject.h>
00047 #include <OGRE/OgreRectangle2D.h>
00048 #include <OGRE/OgreSceneNode.h>
00049 #include <OGRE/OgreViewport.h>
00050 #include <OGRE/OgreMaterialManager.h>
00051 #include <OGRE/OgreTexture.h>
00052 #include <OGRE/OgreTextureManager.h>
00053
00054 #include <btBulletCollisionCommon.h>
00055
00056 #include <ros/time.h>
00057
00058 namespace rviz
00059 {
00060
00061 SelectionTool::SelectionTool( const std::string& name, char shortcut_key, VisualizationManager* manager )
00062 : Tool( name, shortcut_key, manager )
00063 , move_tool_(new MoveTool("SelectionTool Fake MoveTool", 0, manager))
00064 , selecting_(false)
00065 , sel_start_x_(0)
00066 , sel_start_y_(0)
00067 , moving_(false)
00068 {
00069
00070 }
00071
00072 SelectionTool::~SelectionTool()
00073 {
00074 delete move_tool_;
00075 }
00076
00077 void SelectionTool::activate()
00078 {
00079 manager_->getSelectionManager()->setTextureSize(512);
00080 selecting_ = false;
00081 moving_ = false;
00082 }
00083
00084 void SelectionTool::deactivate()
00085 {
00086 manager_->getSelectionManager()->removeHighlight();
00087 }
00088
00089 void SelectionTool::update(float wall_dt, float ros_dt)
00090 {
00091 SelectionManager* sel_manager = manager_->getSelectionManager();
00092
00093 if (!selecting_)
00094 {
00095 sel_manager->removeHighlight();
00096 }
00097 }
00098
00099 int SelectionTool::processMouseEvent( ViewportMouseEvent& event )
00100 {
00101 SelectionManager* sel_manager = manager_->getSelectionManager();
00102
00103 int flags = 0;
00104
00105 if (event.event.AltDown())
00106 {
00107 moving_ = true;
00108 selecting_ = false;
00109 }
00110 else
00111 {
00112 moving_ = false;
00113
00114 if (event.event.LeftDown())
00115 {
00116 selecting_ = true;
00117
00118 sel_start_x_ = event.event.GetX();
00119 sel_start_y_ = event.event.GetY();
00120 }
00121 }
00122
00123 if (selecting_)
00124 {
00125 sel_manager->highlight(event.viewport, sel_start_x_, sel_start_y_, event.event.GetX(), event.event.GetY());
00126
00127 if (event.event.LeftUp())
00128 {
00129 SelectionManager::SelectType type = SelectionManager::Replace;
00130
00131 M_Picked selection;
00132
00133 if (event.event.ShiftDown())
00134 {
00135 type = SelectionManager::Add;
00136 }
00137 else if (event.event.ControlDown())
00138 {
00139 type = SelectionManager::Remove;
00140 }
00141
00142 sel_manager->select(event.viewport, sel_start_x_, sel_start_y_, event.event.GetX(), event.event.GetY(), type);
00143
00144 selecting_ = false;
00145 }
00146
00147 flags |= Render;
00148 }
00149 else if (moving_)
00150 {
00151 sel_manager->removeHighlight();
00152
00153 flags = move_tool_->processMouseEvent(event);
00154
00155 if (event.event.LeftUp() || event.event.RightUp() || event.event.MiddleUp())
00156 {
00157 moving_ = false;
00158 }
00159 }
00160 else
00161 {
00162 sel_manager->highlight(event.viewport, event.event.GetX(), event.event.GetY(), event.event.GetX(), event.event.GetY());
00163 }
00164
00165 return flags;
00166 }
00167
00168 int SelectionTool::processKeyEvent( wxKeyEvent& event )
00169 {
00170 SelectionManager* sel_manager = manager_->getSelectionManager();
00171 char key = event.GetKeyCode();
00172
00173 switch (key)
00174 {
00175 case 'f':
00176 case 'F':
00177 sel_manager->focusOnSelection();
00178 break;
00179 }
00180
00181 return Render;
00182 }
00183
00184 }
00185