Go to the documentation of this file.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 #ifndef RVIZ_SELECTION_HANDLER_H
00031 #define RVIZ_SELECTION_HANDLER_H
00032
00033 #include "forwards.h"
00034 #include "selection_handler.h"
00035 #include "rviz/properties/forwards.h"
00036 #include "rviz/viewport_mouse_event.h"
00037
00038 #include <boost/shared_ptr.hpp>
00039 #include <boost/unordered_map.hpp>
00040
00041 #include <OGRE/OgreMovableObject.h>
00042
00043 #include <vector>
00044 #include <set>
00045
00046 namespace Ogre
00047 {
00048 class WireBoundingBox;
00049 class SceneNode;
00050 class MovableObject;
00051 }
00052
00053 namespace rviz
00054 {
00055
00056 class ViewportMouseEvent;
00057 class VisualizationManager;
00058 class PropertyManager;
00059
00060 typedef std::vector<Ogre::AxisAlignedBox> V_AABB;
00061
00062
00063
00064 class SelectionHandler
00065 {
00066 public:
00067 typedef std::vector<PropertyBaseWPtr> V_Property;
00068
00069 SelectionHandler();
00070 virtual ~SelectionHandler();
00071
00072 void initialize(VisualizationManager* manager);
00073 void addTrackedObject(Ogre::MovableObject* object);
00074 void removeTrackedObject(Ogre::MovableObject* object);
00075
00076 virtual void updateTrackedBoxes();
00077
00078 virtual void createProperties(const Picked& obj, PropertyManager* property_manager) {}
00079 virtual void destroyProperties(const Picked& obj, PropertyManager* property_manager);
00080 virtual void updateProperties();
00081
00082 virtual bool needsAdditionalRenderPass(uint32_t pass)
00083 {
00084 return false;
00085 }
00086
00087 virtual void preRenderPass(uint32_t pass);
00088 virtual void postRenderPass(uint32_t pass);
00089
00090 virtual void getAABBs(const Picked& obj, V_AABB& aabbs);
00091
00092 virtual void onSelect(const Picked& obj);
00093 virtual void onDeselect(const Picked& obj);
00094
00095
00096
00097
00098 virtual void enableInteraction(bool enable) {}
00099
00100
00101 virtual bool isInteractive() { return false; }
00102
00103
00104 virtual void handleMouseEvent(const Picked& obj, ViewportMouseEvent& event) {}
00105
00106 protected:
00107 void createBox(const std::pair<CollObjectHandle, uint64_t>& handles, const Ogre::AxisAlignedBox& aabb, const std::string& material_name);
00108 void destroyBox(const std::pair<CollObjectHandle, uint64_t>& handles);
00109
00110 V_Property properties_;
00111
00112 typedef std::map<std::pair<CollObjectHandle, uint64_t>, std::pair<Ogre::SceneNode*, Ogre::WireBoundingBox*> > M_HandleToBox;
00113 M_HandleToBox boxes_;
00114
00115 VisualizationManager* manager_;
00116
00117 typedef std::set<Ogre::MovableObject*> S_Movable;
00118 S_Movable tracked_objects_;
00119
00120 class Listener : public Ogre::MovableObject::Listener
00121 {
00122 public:
00123 Listener(SelectionHandler* handler)
00124 : handler_(handler)
00125 {}
00126 virtual void objectMoved(Ogre::MovableObject* object)
00127 {
00128 handler_->updateTrackedBoxes();
00129 }
00130
00131 virtual void objectDestroyed(Ogre::MovableObject* object)
00132 {
00133 handler_->removeTrackedObject(object);
00134 }
00135
00136 SelectionHandler* handler_;
00137 };
00138 typedef boost::shared_ptr<Listener> ListenerPtr;
00139 ListenerPtr listener_;
00140
00141 friend class SelectionManager;
00142 };
00143
00144 typedef boost::shared_ptr<SelectionHandler> SelectionHandlerPtr;
00145 typedef std::vector<SelectionHandlerPtr> V_SelectionHandler;
00146 typedef std::set<SelectionHandlerPtr> S_SelectionHandler;
00147
00148 }
00149
00150 #endif