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_FORWARDS_H
00031 #define RVIZ_SELECTION_FORWARDS_H
00032
00033 #include <vector>
00034 #include <set>
00035 #include <map>
00036 #include <boost/unordered_map.hpp>
00037 #include <OGRE/OgrePixelFormat.h>
00038
00039 #include <ros/console.h>
00040
00041
00042 namespace rviz
00043 {
00044
00045 typedef uint32_t CollObjectHandle;
00046 typedef std::vector<CollObjectHandle> V_CollObject;
00047 typedef std::vector<V_CollObject> VV_CollObject;
00048 typedef std::set<CollObjectHandle> S_CollObject;
00049
00050 struct Pixel
00051 {
00052 Pixel()
00053 {
00054
00055 }
00056
00057 Pixel(int _x, int _y, uint32_t _handle)
00058 : x(_x)
00059 , y(_y)
00060 , handle(_handle)
00061 {}
00062
00063 bool operator<(const Pixel& rhs)
00064 {
00065 if (x != rhs.x)
00066 {
00067 return x < rhs.x;
00068 }
00069
00070 if (y != rhs.y)
00071 {
00072 return y < rhs.y;
00073 }
00074
00075 return handle < rhs.handle;
00076 }
00077
00078 int x;
00079 int y;
00080
00081 uint32_t handle;
00082 };
00083 typedef std::vector<Pixel> V_Pixel;
00084 typedef std::map<std::pair<int, int>, V_Pixel> MV_Pixel;
00085
00086 typedef std::set<uint64_t> S_uint64;
00087 typedef std::vector<uint64_t> V_uint64;
00088
00089 struct Picked
00090 {
00091 Picked(CollObjectHandle _handle = 0 )
00092 : handle(_handle), pixel_count(1)
00093 {
00094 }
00095
00096 CollObjectHandle handle;
00097 int pixel_count;
00098 S_uint64 extra_handles;
00099 };
00100 typedef boost::unordered_map<CollObjectHandle, Picked> M_Picked;
00101
00102
00103 inline uint32_t colorToHandle(Ogre::PixelFormat fmt, uint32_t col)
00104 {
00105 uint32_t handle = 0;
00106 if (fmt == Ogre::PF_A8R8G8B8 || fmt == Ogre::PF_X8R8G8B8)
00107 {
00108 handle = col & 0x00ffffff;
00109 }
00110 else if (fmt == Ogre::PF_R8G8B8A8)
00111 {
00112 handle = col >> 8;
00113 }
00114 else
00115 {
00116 ROS_DEBUG("Incompatible pixel format [%d]", fmt);
00117 }
00118
00119 return handle;
00120 }
00121
00122
00123 }
00124
00125 #endif