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