From 73fc1414d2fce88fb40618946139eb52fb4d3f25 Mon Sep 17 00:00:00 2001 From: Denys Senkin Date: Mon, 9 Oct 2017 16:02:25 +0300 Subject: [PATCH] Add new constructors to PCLVisualizer (#2004) Add new constructors to PCLVisualizer New constructors allow to provide custom renderers and render windows. --- .../pcl/visualization/pcl_visualizer.h | 49 +++ visualization/src/pcl_visualizer.cpp | 278 +++++++++++------- 2 files changed, 220 insertions(+), 107 deletions(-) diff --git a/visualization/include/pcl/visualization/pcl_visualizer.h b/visualization/include/pcl/visualization/pcl_visualizer.h index 1162fdc6b4d..4a9c8b9b753 100644 --- a/visualization/include/pcl/visualization/pcl_visualizer.h +++ b/visualization/include/pcl/visualization/pcl_visualizer.h @@ -112,6 +112,26 @@ namespace pcl */ PCLVisualizer (int &argc, char **argv, const std::string &name = "", PCLVisualizerInteractorStyle* style = PCLVisualizerInteractorStyle::New (), const bool create_interactor = true); + + /** \brief PCL Visualizer constructor. + * \param[in] custom vtk renderer + * \param[in] custom vtk render window + * \param[in] create_interactor if true (default), create an interactor, false otherwise + */ + PCLVisualizer (vtkSmartPointer ren, vtkSmartPointer wind, const std::string &name = "", const bool create_interactor = true); + + /** \brief PCL Visualizer constructor. + * \param[in] argc + * \param[in] argv + * \param[in] custom vtk renderer + * \param[in] custom vtk render window + * \param[in] style interactor style (defaults to PCLVisualizerInteractorStyle) + * \param[in] create_interactor if true (default), create an interactor, false otherwise + */ + PCLVisualizer (int &argc, char **argv, vtkSmartPointer ren, vtkSmartPointer wind, const std::string &name = "", + PCLVisualizerInteractorStyle* style = PCLVisualizerInteractorStyle::New (), + const bool create_interactor = true); + /** \brief PCL Visualizer destructor. */ virtual ~PCLVisualizer (); @@ -1939,6 +1959,35 @@ namespace pcl vtkSmartPointer interactor_; #endif private: + /** \brief Internal function for renderer setup + * \param[in] vtk renderer + */ + void setupRenderer (vtkSmartPointer ren); + + /** \brief Internal function for setting up FPS callback + * \param[in] vtk renderer + */ + void setupFPSCallback (const vtkSmartPointer& ren); + + /** \brief Internal function for setting up render window + * \param[in] name the window name + */ + void setupRenderWindow (const std::string& name); + + /** \brief Internal function for setting up interactor style + */ + void setupStyle (); + + /** \brief Internal function for setting the default render window size and position on screen + */ + void setDefaultWindowSizeAndPos (); + + /** \brief Internal function for setting up camera parameters + * \param[in] argc + * \param[in] argv + */ + void setupCamera (int &argc, char **argv); + struct PCL_EXPORTS ExitMainLoopTimerCallback : public vtkCommand { static ExitMainLoopTimerCallback* New () diff --git a/visualization/src/pcl_visualizer.cpp b/visualization/src/pcl_visualizer.cpp index 47d11107766..d8c86252aed 100644 --- a/visualization/src/pcl_visualizer.cpp +++ b/visualization/src/pcl_visualizer.cpp @@ -128,7 +128,7 @@ pcl::visualization::PCLVisualizer::PCLVisualizer (const std::string &name, const , exit_main_loop_timer_callback_ () , exit_callback_ () , rens_ (vtkSmartPointer::New ()) - , win_ () + , win_ (vtkSmartPointer::New ()) , style_ (vtkSmartPointer::New ()) , cloud_actor_map_ (new CloudActorMap) , shape_actor_map_ (new ShapeActorMap) @@ -136,54 +136,15 @@ pcl::visualization::PCLVisualizer::PCLVisualizer (const std::string &name, const , camera_set_ () , camera_file_loaded_ (false) { - // Create a Renderer vtkSmartPointer ren = vtkSmartPointer::New (); - ren->AddObserver (vtkCommand::EndEvent, update_fps_); - // Add it to the list of renderers - rens_->AddItem (ren); - - // FPS callback - vtkSmartPointer txt = vtkSmartPointer::New (); - update_fps_->actor = txt; - update_fps_->pcl_visualizer = this; - update_fps_->decimated = false; - ren->AddActor (txt); - txt->SetInput("0 FPS"); - - // Create a RendererWindow - win_ = vtkSmartPointer::New (); - win_->SetWindowName (name.c_str ()); - - // Get screen size - int scr_size_x = win_->GetScreenSize ()[0]; - int scr_size_y = win_->GetScreenSize ()[1]; - // Set the window size as 1/2 of the screen size - win_->SetSize (scr_size_x / 2, scr_size_y / 2); - - // By default, don't use vertex buffer objects - use_vbos_ = false; - - // Add all renderers to the window - rens_->InitTraversal (); - vtkRenderer* renderer = NULL; - while ((renderer = rens_->GetNextItem ()) != NULL) - win_->AddRenderer (renderer); - - // Set renderer window in case no interactor is created - style_->setRenderWindow (win_); - - // Create the interactor style - style_->Initialize (); - style_->setRendererCollection (rens_); - style_->setCloudActorMap (cloud_actor_map_); - style_->setShapeActorMap (shape_actor_map_); - style_->UseTimersOn (); - style_->setUseVbos(use_vbos_); + setupRenderer (ren); + setupFPSCallback (ren); + setupRenderWindow (name); + setDefaultWindowSizeAndPos (); + setupStyle (); if (create_interactor) createInteractor (); - - win_->SetWindowName (name.c_str ()); } ///////////////////////////////////////////////////////////////////////////////////////////// @@ -197,7 +158,7 @@ pcl::visualization::PCLVisualizer::PCLVisualizer (int &argc, char **argv, const , exit_main_loop_timer_callback_ () , exit_callback_ () , rens_ (vtkSmartPointer::New ()) - , win_ () + , win_ (vtkSmartPointer::New ()) , style_ (style) , cloud_actor_map_ (new CloudActorMap) , shape_actor_map_ (new ShapeActorMap) @@ -205,78 +166,84 @@ pcl::visualization::PCLVisualizer::PCLVisualizer (int &argc, char **argv, const , camera_set_ () , camera_file_loaded_ (false) { - // Create a Renderer vtkSmartPointer ren = vtkSmartPointer::New (); - ren->AddObserver (vtkCommand::EndEvent, update_fps_); - // Add it to the list of renderers - rens_->AddItem (ren); + setupRenderer (ren); + setupFPSCallback (ren); + setupRenderWindow (name); + setupStyle (); + setupCamera (argc, argv); - // FPS callback - vtkSmartPointer txt = vtkSmartPointer::New (); - update_fps_->actor = txt; - update_fps_->pcl_visualizer = this; - update_fps_->decimated = false; - ren->AddActor (txt); - txt->SetInput("0 FPS"); + if(!camera_set_ && !camera_file_loaded_) + setDefaultWindowSizeAndPos (); - // Create a RendererWindow - win_ = vtkSmartPointer::New (); - win_->SetWindowName (name.c_str ()); - - // By default, don't use vertex buffer objects - use_vbos_ = false; - - // Add all renderers to the window - rens_->InitTraversal (); - vtkRenderer* renderer = NULL; - while ((renderer = rens_->GetNextItem ()) != NULL) - win_->AddRenderer (renderer); - - // Set renderer window in case no interactor is created - style_->setRenderWindow (win_); + if (create_interactor) + createInteractor (); - // Create the interactor style - style_->Initialize (); - style_->setRendererCollection (rens_); - style_->setCloudActorMap (cloud_actor_map_); - style_->setShapeActorMap (shape_actor_map_); - style_->UseTimersOn (); + //window name should be reset due to its reset somewhere in camera initialization + win_->SetWindowName (name.c_str ()); +} - // Get screen size - int scr_size_x = win_->GetScreenSize ()[0]; - int scr_size_y = win_->GetScreenSize ()[1]; +///////////////////////////////////////////////////////////////////////////////////////////// +pcl::visualization::PCLVisualizer::PCLVisualizer (vtkSmartPointer ren, vtkSmartPointer wind, + const std::string &name, const bool create_interactor) + : interactor_ () + , update_fps_ (vtkSmartPointer::New ()) +#if !((VTK_MAJOR_VERSION == 5) && (VTK_MINOR_VERSION <= 4)) + , stopped_ () + , timer_id_ () +#endif + , exit_main_loop_timer_callback_ () + , exit_callback_ () + , rens_ (vtkSmartPointer::New ()) + , win_ (wind) + , style_ (vtkSmartPointer::New ()) + , cloud_actor_map_ (new CloudActorMap) + , shape_actor_map_ (new ShapeActorMap) + , coordinate_actor_map_ (new CoordinateActorMap) + , camera_set_ () + , camera_file_loaded_ (false) +{ + setupRenderer (ren); + setupFPSCallback (ren); + setupRenderWindow (name); + setDefaultWindowSizeAndPos (); + setupStyle (); - // Set default camera parameters - initCameraParameters (); + if (create_interactor) + createInteractor (); +} - // Parse the camera settings and update the internal camera - camera_set_ = getCameraParameters (argc, argv); - // Calculate unique camera filename for camera parameter saving/restoring - if (!camera_set_) - { - std::string camera_file = getUniqueCameraFile (argc, argv); - if (!camera_file.empty ()) - { - if (boost::filesystem::exists (camera_file) && style_->loadCameraParameters (camera_file)) - { - camera_file_loaded_ = true; - } - else - { - style_->setCameraFile (camera_file); - } - } - } - // Set the window size as 1/2 of the screen size or the user given parameter +///////////////////////////////////////////////////////////////////////////////////////////// +pcl::visualization::PCLVisualizer::PCLVisualizer (int &argc, char **argv, vtkSmartPointer ren, vtkSmartPointer wind, + const std::string &name, PCLVisualizerInteractorStyle* style, const bool create_interactor) + : interactor_ () + , update_fps_ (vtkSmartPointer::New ()) +#if !((VTK_MAJOR_VERSION == 5) && (VTK_MINOR_VERSION <= 4)) + , stopped_ () + , timer_id_ () +#endif + , exit_main_loop_timer_callback_ () + , exit_callback_ () + , rens_ (vtkSmartPointer::New ()) + , win_ (wind) + , style_ (style) + , cloud_actor_map_ (new CloudActorMap) + , shape_actor_map_ (new ShapeActorMap) + , coordinate_actor_map_ (new CoordinateActorMap) + , camera_set_ () + , camera_file_loaded_ (false) +{ + setupRenderer (ren); + setupFPSCallback (ren); + setupRenderWindow (name); + setupStyle (); + setupCamera (argc, argv); if (!camera_set_ && !camera_file_loaded_) - { - win_->SetSize (scr_size_x/2, scr_size_y/2); - win_->SetPosition (0, 0); - } - + setDefaultWindowSizeAndPos (); if (create_interactor) createInteractor (); + //window name should be reset due to its reset somewhere in camera initialization win_->SetWindowName (name.c_str ()); } @@ -387,6 +354,103 @@ pcl::visualization::PCLVisualizer::setupInteractor ( // iren->SetPicker (pp); } +///////////////////////////////////////////////////////////////////////////////////////////// +void pcl::visualization::PCLVisualizer::setupRenderer (vtkSmartPointer ren) +{ + if (!ren) + PCL_ERROR ("Passed pointer to renderer is null"); + + ren->AddObserver (vtkCommand::EndEvent, update_fps_); + // Add it to the list of renderers + rens_->AddItem (ren); +} + +///////////////////////////////////////////////////////////////////////////////////////////// +void pcl::visualization::PCLVisualizer::setupFPSCallback (const vtkSmartPointer& ren) +{ + if (!ren) + PCL_ERROR ("Passed pointer to renderer is null"); + // FPS callback + vtkSmartPointer txt = vtkSmartPointer::New (); + update_fps_->actor = txt; + update_fps_->pcl_visualizer = this; + update_fps_->decimated = false; + ren->AddActor (txt); + txt->SetInput ("0 FPS"); +} + +///////////////////////////////////////////////////////////////////////////////////////////// +void pcl::visualization::PCLVisualizer::setupRenderWindow (const std::string& name) +{ + if (!win_) + PCL_ERROR ("Pointer to render window is null"); + + win_->SetWindowName (name.c_str ()); + + // By default, don't use vertex buffer objects + use_vbos_ = false; + + // Add all renderers to the window + rens_->InitTraversal (); + vtkRenderer* renderer = NULL; + while ((renderer = rens_->GetNextItem ()) != NULL) + win_->AddRenderer (renderer); +} + +///////////////////////////////////////////////////////////////////////////////////////////// +void pcl::visualization::PCLVisualizer::setupStyle () +{ + if (!style_) + PCL_ERROR ("Pointer to style is null"); + + // Set rend erer window in case no interactor is created + style_->setRenderWindow (win_); + + // Create the interactor style + style_->Initialize (); + style_->setRendererCollection (rens_); + style_->setCloudActorMap (cloud_actor_map_); + style_->setShapeActorMap (shape_actor_map_); + style_->UseTimersOn (); + style_->setUseVbos (use_vbos_); +} + +///////////////////////////////////////////////////////////////////////////////////////////// +void pcl::visualization::PCLVisualizer::setDefaultWindowSizeAndPos () +{ + if (!win_) + PCL_ERROR ("Pointer to render window is null"); + int scr_size_x = win_->GetScreenSize ()[0]; + int scr_size_y = win_->GetScreenSize ()[1]; + win_->SetSize (scr_size_x / 2, scr_size_y / 2); + win_->SetPosition (0, 0); +} + +///////////////////////////////////////////////////////////////////////////////////////////// +void pcl::visualization::PCLVisualizer::setupCamera (int &argc, char **argv) +{ + initCameraParameters (); + + // Parse the camera settings and update the internal camera + camera_set_ = getCameraParameters (argc, argv); + // Calculate unique camera filename for camera parameter saving/restoring + if (!camera_set_) + { + std::string camera_file = getUniqueCameraFile (argc, argv); + if (!camera_file.empty ()) + { + if (boost::filesystem::exists (camera_file) && style_->loadCameraParameters (camera_file)) + { + camera_file_loaded_ = true; + } + else + { + style_->setCameraFile (camera_file); + } + } + } +} + ///////////////////////////////////////////////////////////////////////////////////////////// pcl::visualization::PCLVisualizer::~PCLVisualizer () {