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 RVE_RENDER_SERVER_POINTS_RENDERER_H
00031 #define RVE_RENDER_SERVER_POINTS_RENDERER_H
00032 
00033 #include <OGRE/OgreSimpleRenderable.h>
00034 #include <OGRE/OgreMaterial.h>
00035 
00036 #include "batch_renderer.h"
00037 #include "batch_renderable.h"
00038 #include "points_renderer_desc.h"
00039 
00040 #include <ros/message_forward.h>
00041 
00042 namespace Ogre
00043 {
00044 class SceneManager;
00045 class SceneNode;
00046 }
00047 
00048 namespace rve_msgs
00049 {
00050 ROS_DECLARE_MESSAGE(Points);
00051 }
00052 
00053 namespace rve_render_server
00054 {
00055 
00056 class PointsRenderer;
00057 class PointsRenderable : public BatchRenderable<PointsRenderable, PointsRendererDesc>
00058 {
00059   typedef BatchRenderable<PointsRenderable, PointsRendererDesc> Parent;
00060 
00061 public:
00062   PointsRenderable(const PointsRendererDesc& desc, bool alpha);
00063   ~PointsRenderable();
00064 
00065   void add(const rve_common::UUID& id, const rve_msgs::Points& points, uint32_t start, uint32_t& out_start, uint32_t& out_count);
00066   void remove(uint32_t start, uint32_t count);
00067 
00068   uint32_t getElementsPerVBO();
00069 
00070   virtual Picked translatePick(PickRenderValues id);
00071 
00072 private:
00073   uint32_t getVerticesPerPoint();
00074   float* getVertices();
00075   float* getNormals();
00076   uint32_t getPointStride();
00077 
00078   bool supports_geometry_programs_;
00079   bool needs_offsets_;
00080   bool needs_normals_;
00081 
00083   struct PointsInfo
00084   {
00085     rve_common::UUID id;
00086     int32_t offset;
00087     uint32_t begin;
00088     uint32_t end;
00089   };
00090   typedef std::vector<PointsInfo> V_PointsInfo;
00091   V_PointsInfo points_info_;
00092 };
00093 typedef boost::shared_ptr<PointsRenderable> PointsRenderablePtr;
00094 typedef std::vector<PointsRenderablePtr> V_PointsRenderable;
00095 
00096 class PointsRenderer : public BatchRenderer<PointsRenderer, rve_msgs::Points, PointsRenderable, PointsRendererDesc>
00097 {
00098   typedef BatchRenderer<PointsRenderer, rve_msgs::Points, PointsRenderable, PointsRendererDesc> Parent;
00099 
00100 public:
00101   PointsRenderer(Ogre::SceneManager* scene_manager, const PointsRendererDesc& desc);
00102 
00103   std::pair<Ogre::MaterialPtr, Ogre::MaterialPtr> createMaterials(const PointsRendererDesc& desc);
00104   size_t getInputCount(const rve_msgs::Points& points);
00105 };
00106 
00107 } 
00108 
00109 #endif // RVE_RENDER_SERVER_POINTS_RENDERER_H