Go to the documentation of this file.00001 
00002 #include <iostream>
00003 #include <string>
00004 
00005 
00006 #include <pcl/outofcore/visualization/camera.h>
00007 #include <pcl/outofcore/visualization/geometry.h>
00008 #include <pcl/outofcore/visualization/scene.h>
00009 #include <pcl/outofcore/visualization/object.h>
00010 #include <pcl/outofcore/visualization/viewport.h>
00011 
00012 
00013 #include <vtkActor.h>
00014 #include <vtkCallbackCommand.h>
00015 #include <vtkObject.h>
00016 #include <vtkTextActor.h>
00017 #include <vtkTextProperty.h>
00018 #include <vtkRenderer.h>
00019 #include <vtkRenderWindow.h>
00020 #include <vtkRenderWindowInteractor.h>
00021 #include <vtkSmartPointer.h>
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 Viewport::Viewport (vtkSmartPointer<vtkRenderWindow> window, double xmin, double ymin,
00037                     double xmax, double ymax)
00038 {
00039   renderer_ = vtkSmartPointer<vtkRenderer>::New ();
00040   renderer_->SetViewport (xmin, ymin, xmax, ymax);
00041   renderer_->GradientBackgroundOn ();
00042   renderer_->SetBackground (.1, .1, .1);
00043   renderer_->SetBackground2 (.5, .6, .7);
00044 
00045   int *size = window->GetSize ();
00046   double viewport_xmin = size[0] * xmin;
00047   double viewport_xmax = size[0] * xmax;
00048 
00049   double viewport_ymax = size[1] * ymax;
00050 
00051   
00052   camera_hud_actor_ = vtkSmartPointer<vtkTextActor>::New ();
00053   camera_hud_actor_->GetTextProperty ()->SetFontSize (12);
00054   camera_hud_actor_->GetTextProperty ()->SetColor (0.8, 0.8, 0.8);
00055   camera_hud_actor_->GetTextProperty ()->SetJustificationToCentered ();
00056   camera_hud_actor_->SetPosition ((viewport_xmax - viewport_xmin) / 2, 10);
00057   renderer_->AddActor2D (camera_hud_actor_);
00058 
00059   
00060   fps_hud_actor_ = vtkSmartPointer<vtkTextActor>::New ();
00061   fps_hud_actor_->GetTextProperty ()->SetFontSize (12);
00062   fps_hud_actor_->GetTextProperty ()->SetColor (0.8, 0.8, 0.8);
00063   fps_hud_actor_->GetTextProperty ()->SetJustificationToRight ();
00064   fps_hud_actor_->SetInput ("fps");
00065   fps_hud_actor_->SetPosition ((viewport_xmax - viewport_xmin) - 10, 10);
00066   renderer_->AddActor2D (fps_hud_actor_);
00067 
00068   
00069   points_hud_actor_ = vtkSmartPointer<vtkTextActor>::New ();
00070   points_hud_actor_->GetTextProperty ()->SetFontSize (12);
00071   points_hud_actor_->GetTextProperty ()->SetColor (0.8, 0.8, 0.8);
00072   points_hud_actor_->GetTextProperty ()->SetJustificationToRight ();
00073   points_hud_actor_->SetInput ("points/mb");
00074   points_hud_actor_->SetPosition ((viewport_xmax - viewport_xmin) - 10, viewport_ymax - 20);
00075   renderer_->AddActor2D (points_hud_actor_);
00076 
00077   
00078   viewport_modified_callback_ = vtkSmartPointer<vtkCallbackCommand>::New ();
00079   viewport_modified_callback_->SetCallback (Viewport::viewportModifiedCallback);
00080   viewport_modified_callback_->SetClientData (this);
00081 
00082   renderer_->AddObserver (vtkCommand::ModifiedEvent, viewport_modified_callback_);
00083 
00084   
00085   viewport_actor_update_callback_ = vtkSmartPointer<vtkCallbackCommand>::New ();
00086   viewport_actor_update_callback_->SetCallback (Viewport::viewportActorUpdateCallback);
00087   viewport_actor_update_callback_->SetClientData (this);
00088 
00089   renderer_->AddObserver (vtkCommand::StartEvent, viewport_actor_update_callback_);
00090 
00091   
00092   viewport_hud_callback_ = vtkSmartPointer<vtkCallbackCommand>::New ();
00093   viewport_hud_callback_->SetCallback (Viewport::viewportHudUpdateCallback);
00094   viewport_hud_callback_->SetClientData (this);
00095 
00096   renderer_->AddObserver (vtkCommand::EndEvent, viewport_hud_callback_);
00097 
00098   window->AddRenderer (renderer_);
00099 
00100   Scene *scene = Scene::instance ();
00101   scene->addViewport (this);
00102 }
00103 
00104 
00105 
00106 
00107 
00108 void
00109 Viewport::viewportModifiedCallback (vtkObject* vtkNotUsed (caller), unsigned long int vtkNotUsed (eventId),
00110                                     void* clientData, void* vtkNotUsed (callData))
00111 {
00112   Viewport *viewport = reinterpret_cast<Viewport*> (clientData);
00113   viewport->viewportModified ();
00114 }
00115 
00116 void
00117 Viewport::viewportModified ()
00118 {
00119   vtkRenderWindow *window = renderer_->GetRenderWindow ();
00120 
00121   int *size = window->GetSize ();
00122   double *viewport_size = renderer_->GetViewport ();
00123 
00124   double viewport_xmin = size[0] * viewport_size[0];
00125   double viewport_xmax = size[0] * viewport_size[2];
00126 
00127   camera_hud_actor_->SetPosition ((viewport_xmax - viewport_xmin) / 2, 10);
00128   fps_hud_actor_->SetPosition ((viewport_xmax - viewport_xmin) - 10, 10);
00129 }
00130 
00131 
00132 void
00133 Viewport::viewportActorUpdateCallback (vtkObject* , unsigned long int vtkNotUsed (eventId), void* clientData,
00134                                        void* vtkNotUsed (callData))
00135 {
00136   Viewport *viewport = reinterpret_cast<Viewport*> (clientData);
00137   viewport->viewportActorUpdate ();
00138 }
00139 
00140 void
00141 Viewport::viewportActorUpdate ()
00142 {
00143   Scene *scene = Scene::instance ();
00144 
00145   std::vector<Camera*> cameras = scene->getCameras ();
00146 
00147   for (int i = 0; i < cameras.size (); i++)
00148   {
00149     cameras[i]->render (renderer_);
00150 
00151 
00152 
00153 
00154 
00155 
00156 
00157 
00158   }
00159 
00160   std::vector<Object*> objects = scene->getObjects ();
00161   for (int i = 0; i < objects.size (); i++)
00162   {
00163     
00164     objects[i]->render (renderer_);
00165   }
00166 }
00167 
00168 
00169 void
00170 Viewport::viewportHudUpdateCallback (vtkObject* vtkNotUsed (caller), unsigned long int vtkNotUsed (eventId),
00171                                      void* clientData, void* vtkNotUsed (callData))
00172 {
00173   Viewport *viewport = reinterpret_cast<Viewport*> (clientData);
00174   viewport->viewportHudUpdate ();
00175 }
00176 
00177 void
00178 Viewport::viewportHudUpdate ()
00179 {
00180   
00181   double timeInSeconds = renderer_->GetLastRenderTimeInSeconds ();
00182   char fps_str[50];
00183   sprintf (fps_str, "%.2f fps", 1.0 / timeInSeconds);
00184   fps_hud_actor_->SetInput (fps_str);
00185 
00186   
00187   Scene *scene = Scene::instance ();
00188   std::vector<Object*> objects = scene->getObjects ();
00189 
00190   uint64_t points_loaded = 0;
00191   uint64_t data_loaded = 0;
00192   for (int i = 0; i < objects.size (); i++)
00193   {
00194     
00195     OutofcoreCloud* cloud = dynamic_cast<OutofcoreCloud*> (objects[i]);
00196     if (cloud != NULL)
00197     {
00198       points_loaded += cloud->getPointsLoaded ();
00199       data_loaded += cloud->getDataLoaded ();
00200     }
00201   }
00202 
00203   char points_loaded_str[50];
00204   sprintf (points_loaded_str, "%llu points/%llu mb", points_loaded, data_loaded/1024);
00205   points_hud_actor_->SetInput (points_loaded_str);
00206 }
00207