Skip to content

Commit 9887bad

Browse files
denix56taketwo
authored andcommitted
Add new constructors to PCLVisualizer (#2004)
Add new constructors to PCLVisualizer New constructors allow to provide custom renderers and render windows.
1 parent f6a4eaa commit 9887bad

File tree

2 files changed

+220
-107
lines changed

2 files changed

+220
-107
lines changed

visualization/include/pcl/visualization/pcl_visualizer.h

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,26 @@ namespace pcl
112112
*/
113113
PCLVisualizer (int &argc, char **argv, const std::string &name = "",
114114
PCLVisualizerInteractorStyle* style = PCLVisualizerInteractorStyle::New (), const bool create_interactor = true);
115+
116+
/** \brief PCL Visualizer constructor.
117+
* \param[in] custom vtk renderer
118+
* \param[in] custom vtk render window
119+
* \param[in] create_interactor if true (default), create an interactor, false otherwise
120+
*/
121+
PCLVisualizer (vtkSmartPointer<vtkRenderer> ren, vtkSmartPointer<vtkRenderWindow> wind, const std::string &name = "", const bool create_interactor = true);
122+
123+
/** \brief PCL Visualizer constructor.
124+
* \param[in] argc
125+
* \param[in] argv
126+
* \param[in] custom vtk renderer
127+
* \param[in] custom vtk render window
128+
* \param[in] style interactor style (defaults to PCLVisualizerInteractorStyle)
129+
* \param[in] create_interactor if true (default), create an interactor, false otherwise
130+
*/
131+
PCLVisualizer (int &argc, char **argv, vtkSmartPointer<vtkRenderer> ren, vtkSmartPointer<vtkRenderWindow> wind, const std::string &name = "",
132+
PCLVisualizerInteractorStyle* style = PCLVisualizerInteractorStyle::New (),
133+
const bool create_interactor = true);
134+
115135

116136
/** \brief PCL Visualizer destructor. */
117137
virtual ~PCLVisualizer ();
@@ -1939,6 +1959,35 @@ namespace pcl
19391959
vtkSmartPointer<vtkRenderWindowInteractor> interactor_;
19401960
#endif
19411961
private:
1962+
/** \brief Internal function for renderer setup
1963+
* \param[in] vtk renderer
1964+
*/
1965+
void setupRenderer (vtkSmartPointer<vtkRenderer> ren);
1966+
1967+
/** \brief Internal function for setting up FPS callback
1968+
* \param[in] vtk renderer
1969+
*/
1970+
void setupFPSCallback (const vtkSmartPointer<vtkRenderer>& ren);
1971+
1972+
/** \brief Internal function for setting up render window
1973+
* \param[in] name the window name
1974+
*/
1975+
void setupRenderWindow (const std::string& name);
1976+
1977+
/** \brief Internal function for setting up interactor style
1978+
*/
1979+
void setupStyle ();
1980+
1981+
/** \brief Internal function for setting the default render window size and position on screen
1982+
*/
1983+
void setDefaultWindowSizeAndPos ();
1984+
1985+
/** \brief Internal function for setting up camera parameters
1986+
* \param[in] argc
1987+
* \param[in] argv
1988+
*/
1989+
void setupCamera (int &argc, char **argv);
1990+
19421991
struct PCL_EXPORTS ExitMainLoopTimerCallback : public vtkCommand
19431992
{
19441993
static ExitMainLoopTimerCallback* New ()

visualization/src/pcl_visualizer.cpp

Lines changed: 171 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -128,62 +128,23 @@ pcl::visualization::PCLVisualizer::PCLVisualizer (const std::string &name, const
128128
, exit_main_loop_timer_callback_ ()
129129
, exit_callback_ ()
130130
, rens_ (vtkSmartPointer<vtkRendererCollection>::New ())
131-
, win_ ()
131+
, win_ (vtkSmartPointer<vtkRenderWindow>::New ())
132132
, style_ (vtkSmartPointer<pcl::visualization::PCLVisualizerInteractorStyle>::New ())
133133
, cloud_actor_map_ (new CloudActorMap)
134134
, shape_actor_map_ (new ShapeActorMap)
135135
, coordinate_actor_map_ (new CoordinateActorMap)
136136
, camera_set_ ()
137137
, camera_file_loaded_ (false)
138138
{
139-
// Create a Renderer
140139
vtkSmartPointer<vtkRenderer> ren = vtkSmartPointer<vtkRenderer>::New ();
141-
ren->AddObserver (vtkCommand::EndEvent, update_fps_);
142-
// Add it to the list of renderers
143-
rens_->AddItem (ren);
144-
145-
// FPS callback
146-
vtkSmartPointer<vtkTextActor> txt = vtkSmartPointer<vtkTextActor>::New ();
147-
update_fps_->actor = txt;
148-
update_fps_->pcl_visualizer = this;
149-
update_fps_->decimated = false;
150-
ren->AddActor (txt);
151-
txt->SetInput("0 FPS");
152-
153-
// Create a RendererWindow
154-
win_ = vtkSmartPointer<vtkRenderWindow>::New ();
155-
win_->SetWindowName (name.c_str ());
156-
157-
// Get screen size
158-
int scr_size_x = win_->GetScreenSize ()[0];
159-
int scr_size_y = win_->GetScreenSize ()[1];
160-
// Set the window size as 1/2 of the screen size
161-
win_->SetSize (scr_size_x / 2, scr_size_y / 2);
162-
163-
// By default, don't use vertex buffer objects
164-
use_vbos_ = false;
165-
166-
// Add all renderers to the window
167-
rens_->InitTraversal ();
168-
vtkRenderer* renderer = NULL;
169-
while ((renderer = rens_->GetNextItem ()) != NULL)
170-
win_->AddRenderer (renderer);
171-
172-
// Set renderer window in case no interactor is created
173-
style_->setRenderWindow (win_);
174-
175-
// Create the interactor style
176-
style_->Initialize ();
177-
style_->setRendererCollection (rens_);
178-
style_->setCloudActorMap (cloud_actor_map_);
179-
style_->setShapeActorMap (shape_actor_map_);
180-
style_->UseTimersOn ();
181-
style_->setUseVbos(use_vbos_);
140+
setupRenderer (ren);
141+
setupFPSCallback (ren);
142+
setupRenderWindow (name);
143+
setDefaultWindowSizeAndPos ();
144+
setupStyle ();
182145

183146
if (create_interactor)
184147
createInteractor ();
185-
186-
win_->SetWindowName (name.c_str ());
187148
}
188149

189150
/////////////////////////////////////////////////////////////////////////////////////////////
@@ -197,86 +158,92 @@ pcl::visualization::PCLVisualizer::PCLVisualizer (int &argc, char **argv, const
197158
, exit_main_loop_timer_callback_ ()
198159
, exit_callback_ ()
199160
, rens_ (vtkSmartPointer<vtkRendererCollection>::New ())
200-
, win_ ()
161+
, win_ (vtkSmartPointer<vtkRenderWindow>::New ())
201162
, style_ (style)
202163
, cloud_actor_map_ (new CloudActorMap)
203164
, shape_actor_map_ (new ShapeActorMap)
204165
, coordinate_actor_map_ (new CoordinateActorMap)
205166
, camera_set_ ()
206167
, camera_file_loaded_ (false)
207168
{
208-
// Create a Renderer
209169
vtkSmartPointer<vtkRenderer> ren = vtkSmartPointer<vtkRenderer>::New ();
210-
ren->AddObserver (vtkCommand::EndEvent, update_fps_);
211-
// Add it to the list of renderers
212-
rens_->AddItem (ren);
170+
setupRenderer (ren);
171+
setupFPSCallback (ren);
172+
setupRenderWindow (name);
173+
setupStyle ();
174+
setupCamera (argc, argv);
213175

214-
// FPS callback
215-
vtkSmartPointer<vtkTextActor> txt = vtkSmartPointer<vtkTextActor>::New ();
216-
update_fps_->actor = txt;
217-
update_fps_->pcl_visualizer = this;
218-
update_fps_->decimated = false;
219-
ren->AddActor (txt);
220-
txt->SetInput("0 FPS");
176+
if(!camera_set_ && !camera_file_loaded_)
177+
setDefaultWindowSizeAndPos ();
221178

222-
// Create a RendererWindow
223-
win_ = vtkSmartPointer<vtkRenderWindow>::New ();
224-
win_->SetWindowName (name.c_str ());
225-
226-
// By default, don't use vertex buffer objects
227-
use_vbos_ = false;
228-
229-
// Add all renderers to the window
230-
rens_->InitTraversal ();
231-
vtkRenderer* renderer = NULL;
232-
while ((renderer = rens_->GetNextItem ()) != NULL)
233-
win_->AddRenderer (renderer);
234-
235-
// Set renderer window in case no interactor is created
236-
style_->setRenderWindow (win_);
179+
if (create_interactor)
180+
createInteractor ();
237181

238-
// Create the interactor style
239-
style_->Initialize ();
240-
style_->setRendererCollection (rens_);
241-
style_->setCloudActorMap (cloud_actor_map_);
242-
style_->setShapeActorMap (shape_actor_map_);
243-
style_->UseTimersOn ();
182+
//window name should be reset due to its reset somewhere in camera initialization
183+
win_->SetWindowName (name.c_str ());
184+
}
244185

245-
// Get screen size
246-
int scr_size_x = win_->GetScreenSize ()[0];
247-
int scr_size_y = win_->GetScreenSize ()[1];
186+
/////////////////////////////////////////////////////////////////////////////////////////////
187+
pcl::visualization::PCLVisualizer::PCLVisualizer (vtkSmartPointer<vtkRenderer> ren, vtkSmartPointer<vtkRenderWindow> wind,
188+
const std::string &name, const bool create_interactor)
189+
: interactor_ ()
190+
, update_fps_ (vtkSmartPointer<FPSCallback>::New ())
191+
#if !((VTK_MAJOR_VERSION == 5) && (VTK_MINOR_VERSION <= 4))
192+
, stopped_ ()
193+
, timer_id_ ()
194+
#endif
195+
, exit_main_loop_timer_callback_ ()
196+
, exit_callback_ ()
197+
, rens_ (vtkSmartPointer<vtkRendererCollection>::New ())
198+
, win_ (wind)
199+
, style_ (vtkSmartPointer<pcl::visualization::PCLVisualizerInteractorStyle>::New ())
200+
, cloud_actor_map_ (new CloudActorMap)
201+
, shape_actor_map_ (new ShapeActorMap)
202+
, coordinate_actor_map_ (new CoordinateActorMap)
203+
, camera_set_ ()
204+
, camera_file_loaded_ (false)
205+
{
206+
setupRenderer (ren);
207+
setupFPSCallback (ren);
208+
setupRenderWindow (name);
209+
setDefaultWindowSizeAndPos ();
210+
setupStyle ();
248211

249-
// Set default camera parameters
250-
initCameraParameters ();
212+
if (create_interactor)
213+
createInteractor ();
214+
}
251215

252-
// Parse the camera settings and update the internal camera
253-
camera_set_ = getCameraParameters (argc, argv);
254-
// Calculate unique camera filename for camera parameter saving/restoring
255-
if (!camera_set_)
256-
{
257-
std::string camera_file = getUniqueCameraFile (argc, argv);
258-
if (!camera_file.empty ())
259-
{
260-
if (boost::filesystem::exists (camera_file) && style_->loadCameraParameters (camera_file))
261-
{
262-
camera_file_loaded_ = true;
263-
}
264-
else
265-
{
266-
style_->setCameraFile (camera_file);
267-
}
268-
}
269-
}
270-
// Set the window size as 1/2 of the screen size or the user given parameter
216+
/////////////////////////////////////////////////////////////////////////////////////////////
217+
pcl::visualization::PCLVisualizer::PCLVisualizer (int &argc, char **argv, vtkSmartPointer<vtkRenderer> ren, vtkSmartPointer<vtkRenderWindow> wind,
218+
const std::string &name, PCLVisualizerInteractorStyle* style, const bool create_interactor)
219+
: interactor_ ()
220+
, update_fps_ (vtkSmartPointer<FPSCallback>::New ())
221+
#if !((VTK_MAJOR_VERSION == 5) && (VTK_MINOR_VERSION <= 4))
222+
, stopped_ ()
223+
, timer_id_ ()
224+
#endif
225+
, exit_main_loop_timer_callback_ ()
226+
, exit_callback_ ()
227+
, rens_ (vtkSmartPointer<vtkRendererCollection>::New ())
228+
, win_ (wind)
229+
, style_ (style)
230+
, cloud_actor_map_ (new CloudActorMap)
231+
, shape_actor_map_ (new ShapeActorMap)
232+
, coordinate_actor_map_ (new CoordinateActorMap)
233+
, camera_set_ ()
234+
, camera_file_loaded_ (false)
235+
{
236+
setupRenderer (ren);
237+
setupFPSCallback (ren);
238+
setupRenderWindow (name);
239+
setupStyle ();
240+
setupCamera (argc, argv);
271241
if (!camera_set_ && !camera_file_loaded_)
272-
{
273-
win_->SetSize (scr_size_x/2, scr_size_y/2);
274-
win_->SetPosition (0, 0);
275-
}
276-
242+
setDefaultWindowSizeAndPos ();
277243
if (create_interactor)
278244
createInteractor ();
279245

246+
//window name should be reset due to its reset somewhere in camera initialization
280247
win_->SetWindowName (name.c_str ());
281248
}
282249

@@ -387,6 +354,103 @@ pcl::visualization::PCLVisualizer::setupInteractor (
387354
// iren->SetPicker (pp);
388355
}
389356

357+
/////////////////////////////////////////////////////////////////////////////////////////////
358+
void pcl::visualization::PCLVisualizer::setupRenderer (vtkSmartPointer<vtkRenderer> ren)
359+
{
360+
if (!ren)
361+
PCL_ERROR ("Passed pointer to renderer is null");
362+
363+
ren->AddObserver (vtkCommand::EndEvent, update_fps_);
364+
// Add it to the list of renderers
365+
rens_->AddItem (ren);
366+
}
367+
368+
/////////////////////////////////////////////////////////////////////////////////////////////
369+
void pcl::visualization::PCLVisualizer::setupFPSCallback (const vtkSmartPointer<vtkRenderer>& ren)
370+
{
371+
if (!ren)
372+
PCL_ERROR ("Passed pointer to renderer is null");
373+
// FPS callback
374+
vtkSmartPointer<vtkTextActor> txt = vtkSmartPointer<vtkTextActor>::New ();
375+
update_fps_->actor = txt;
376+
update_fps_->pcl_visualizer = this;
377+
update_fps_->decimated = false;
378+
ren->AddActor (txt);
379+
txt->SetInput ("0 FPS");
380+
}
381+
382+
/////////////////////////////////////////////////////////////////////////////////////////////
383+
void pcl::visualization::PCLVisualizer::setupRenderWindow (const std::string& name)
384+
{
385+
if (!win_)
386+
PCL_ERROR ("Pointer to render window is null");
387+
388+
win_->SetWindowName (name.c_str ());
389+
390+
// By default, don't use vertex buffer objects
391+
use_vbos_ = false;
392+
393+
// Add all renderers to the window
394+
rens_->InitTraversal ();
395+
vtkRenderer* renderer = NULL;
396+
while ((renderer = rens_->GetNextItem ()) != NULL)
397+
win_->AddRenderer (renderer);
398+
}
399+
400+
/////////////////////////////////////////////////////////////////////////////////////////////
401+
void pcl::visualization::PCLVisualizer::setupStyle ()
402+
{
403+
if (!style_)
404+
PCL_ERROR ("Pointer to style is null");
405+
406+
// Set rend erer window in case no interactor is created
407+
style_->setRenderWindow (win_);
408+
409+
// Create the interactor style
410+
style_->Initialize ();
411+
style_->setRendererCollection (rens_);
412+
style_->setCloudActorMap (cloud_actor_map_);
413+
style_->setShapeActorMap (shape_actor_map_);
414+
style_->UseTimersOn ();
415+
style_->setUseVbos (use_vbos_);
416+
}
417+
418+
/////////////////////////////////////////////////////////////////////////////////////////////
419+
void pcl::visualization::PCLVisualizer::setDefaultWindowSizeAndPos ()
420+
{
421+
if (!win_)
422+
PCL_ERROR ("Pointer to render window is null");
423+
int scr_size_x = win_->GetScreenSize ()[0];
424+
int scr_size_y = win_->GetScreenSize ()[1];
425+
win_->SetSize (scr_size_x / 2, scr_size_y / 2);
426+
win_->SetPosition (0, 0);
427+
}
428+
429+
/////////////////////////////////////////////////////////////////////////////////////////////
430+
void pcl::visualization::PCLVisualizer::setupCamera (int &argc, char **argv)
431+
{
432+
initCameraParameters ();
433+
434+
// Parse the camera settings and update the internal camera
435+
camera_set_ = getCameraParameters (argc, argv);
436+
// Calculate unique camera filename for camera parameter saving/restoring
437+
if (!camera_set_)
438+
{
439+
std::string camera_file = getUniqueCameraFile (argc, argv);
440+
if (!camera_file.empty ())
441+
{
442+
if (boost::filesystem::exists (camera_file) && style_->loadCameraParameters (camera_file))
443+
{
444+
camera_file_loaded_ = true;
445+
}
446+
else
447+
{
448+
style_->setCameraFile (camera_file);
449+
}
450+
}
451+
}
452+
}
453+
390454
/////////////////////////////////////////////////////////////////////////////////////////////
391455
pcl::visualization::PCLVisualizer::~PCLVisualizer ()
392456
{

0 commit comments

Comments
 (0)