summarylogtreecommitdiffstats
path: root/vtk7.patch
blob: 2193b566190734f1854b980f9709de6aa4b73ea9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
From 73e727825e80e99adbc64658443d58de70d5a787 Mon Sep 17 00:00:00 2001
From: Sergey Alexandrov <alexandrov88@gmail.com>
Date: Thu, 11 Feb 2016 22:19:01 +0100
Subject: Use vtkTextureUnitManager to query the number of available texture
 units

The new OpenGL2 backend does not have vktOpenGLHardwareSupport class
which was used before.

Add CMake variable and C++ macro VTK_RENDERING_BACKEND_OPENGL_VERSION

These can be used at configuration and compilation times to adjust for
the currently used backend.

Conditionally compile code that uses vtkVertexBufferObjectMapper

This mapper is a performance optimization that is only needed when
OpenGL backend is used. The modern OpenGL2 backend uses vertex buffer
objects transparently for us.

Update documentation for setUseVbos() function

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 36fc4c9..e5fd763 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -361,7 +361,12 @@ option(WITH_VTK "Build VTK-Visualizations" TRUE)
 if(WITH_VTK AND NOT ANDROID)
   find_package(VTK)
   if(VTK_FOUND)
-    message(STATUS "VTK_MAJOR_VERSION ${VTK_MAJOR_VERSION}")
+    if(NOT DEFINED VTK_RENDERING_BACKEND)
+      # On old VTK versions this variable does not exist. In this case it is
+      # safe to assume OpenGL backend
+      set(VTK_RENDERING_BACKEND "OpenGL")
+    endif()
+    message(STATUS "VTK_MAJOR_VERSION ${VTK_MAJOR_VERSION}, rendering backend: ${VTK_RENDERING_BACKEND}")
     if (PCL_SHARED_LIBS OR
         (NOT (PCL_SHARED_LIBS) AND NOT (VTK_BUILD_SHARED_LIBS)))
       set(VTK_FOUND TRUE)
@@ -377,6 +382,11 @@ if(WITH_VTK AND NOT ANDROID)
           option (VTK_USE_COCOA "Use Cocoa for VTK render windows" ON)
           MARK_AS_ADVANCED (VTK_USE_COCOA)
       endif (APPLE)
+      if(${VTK_RENDERING_BACKEND} STREQUAL "OpenGL")
+        set(VTK_RENDERING_BACKEND_OPENGL_VERSION "1")
+      elseif(${VTK_RENDERING_BACKEND} STREQUAL "OpenGL2")
+        set(VTK_RENDERING_BACKEND_OPENGL_VERSION "2")
+      endif()
       set(HAVE_VTK ON)
     else ()
       set(VTK_FOUND OFF)
diff --git a/outofcore/src/visualization/outofcore_cloud.cpp b/outofcore/src/visualization/outofcore_cloud.cpp
index eaf490c..b08d30e 100644
--- a/outofcore/src/visualization/outofcore_cloud.cpp
+++ b/outofcore/src/visualization/outofcore_cloud.cpp
@@ -21,7 +21,10 @@
 
 // PCL - visualziation
 #include <pcl/visualization/common/common.h>
+
+#if VTK_RENDERING_BACKEND_OPENGL_VERSION < 2
 #include <pcl/visualization/vtk/vtkVertexBufferObjectMapper.h>
+#endif
 
 // VTK
 #include <vtkVersion.h>
@@ -251,11 +254,18 @@ OutofcoreCloud::render (vtkRenderer* renderer)
         {
 
           vtkSmartPointer<vtkActor> cloud_actor = vtkSmartPointer<vtkActor>::New ();
-          vtkSmartPointer<vtkVertexBufferObjectMapper> mapper = vtkSmartPointer<vtkVertexBufferObjectMapper>::New ();
-
           CloudDataCacheItem *cloud_data_cache_item = &cloud_data_cache.get(pcd_file);
 
+#if VTK_RENDERING_BACKEND_OPENGL_VERSION < 2
+          vtkSmartPointer<vtkVertexBufferObjectMapper> mapper = vtkSmartPointer<vtkVertexBufferObjectMapper>::New ();
           mapper->SetInput (cloud_data_cache_item->item);
+#else
+          vtkSmartPointer<vtkDataSetMapper> mapper = vtkSmartPointer<vtkDataSetMapper>::New ();
+          // Usually we choose between SetInput and SetInputData based on VTK version. But OpenGL ≥ 2 automatically
+          // means VTK version is ≥ 6.3
+          mapper->SetInputData (cloud_data_cache_item->item);
+#endif
+
           cloud_actor->SetMapper (mapper);
           cloud_actor->GetProperty ()->SetColor (0.0, 0.0, 1.0);
           cloud_actor->GetProperty ()->SetPointSize (1);
diff --git a/pcl_config.h.in b/pcl_config.h.in
index e4b10b0..3c25a06 100644
--- a/pcl_config.h.in
+++ b/pcl_config.h.in
@@ -71,3 +71,7 @@
 /* Address the cases where on MacOS and OpenGL and GLUT are not frameworks */
 #cmakedefine OPENGL_IS_A_FRAMEWORK
 #cmakedefine GLUT_IS_A_FRAMEWORK
+
+/* Version of OpenGL used by VTK as rendering backend */
+#define VTK_RENDERING_BACKEND_OPENGL_VERSION ${VTK_RENDERING_BACKEND_OPENGL_VERSION}
+
diff --git a/visualization/CMakeLists.txt b/visualization/CMakeLists.txt
index 26bfd7c..940fc8e 100644
--- a/visualization/CMakeLists.txt
+++ b/visualization/CMakeLists.txt
@@ -50,8 +50,6 @@ if(build)
         src/common/float_image_utils.cpp
         src/vtk/pcl_image_canvas_source_2d.cpp
         src/vtk/pcl_context_item.cpp
-        src/vtk/vtkVertexBufferObject.cxx
-        src/vtk/vtkVertexBufferObjectMapper.cxx
         src/vtk/vtkRenderWindowInteractorFix.cpp
         )
     if("${VTK_MAJOR_VERSION}.${VTK_MINOR_VERSION}" VERSION_LESS "5.6")
@@ -67,6 +65,13 @@ if(build)
             )
     endif("${VTK_MAJOR_VERSION}.${VTK_MINOR_VERSION}" VERSION_GREATER "5.6")
 
+    if(VTK_RENDERING_BACKEND_OPENGL_VERSION VERSION_LESS 2)
+      list(APPEND srcs
+        "src/vtk/vtkVertexBufferObject.cxx"
+        "src/vtk/vtkVertexBufferObjectMapper.cxx"
+      )
+    endif()
+
     set(incs 
         "include/pcl/${SUBSYS_NAME}/eigen.h"
         "include/pcl/${SUBSYS_NAME}/boost.h"
@@ -127,11 +132,16 @@ if(build)
     set(vtk_incs 
         "include/pcl/${SUBSYS_NAME}/vtk/pcl_image_canvas_source_2d.h"
         "include/pcl/${SUBSYS_NAME}/vtk/pcl_context_item.h"
-        "include/pcl/${SUBSYS_NAME}/vtk/vtkVertexBufferObject.h"
         "include/pcl/${SUBSYS_NAME}/vtk/vtkRenderWindowInteractorFix.h"
-        "include/pcl/${SUBSYS_NAME}/vtk/vtkVertexBufferObjectMapper.h"
         )
 
+    if(VTK_RENDERING_BACKEND_OPENGL_VERSION VERSION_LESS 2)
+      list(APPEND vtk_incs
+        "include/pcl/${SUBSYS_NAME}/vtk/vtkVertexBufferObject.h"
+        "include/pcl/${SUBSYS_NAME}/vtk/vtkVertexBufferObjectMapper.h"
+      )
+    endif()
+
     # on apple, a workaround is used for the cocoa render window interactor
     if(APPLE)
       list(APPEND srcs
diff --git a/visualization/include/pcl/visualization/interactor_style.h b/visualization/include/pcl/visualization/interactor_style.h
index 7cc7210..6b64fc5 100644
--- a/visualization/include/pcl/visualization/interactor_style.h
+++ b/visualization/include/pcl/visualization/interactor_style.h
@@ -157,8 +157,10 @@ namespace pcl
         void 
         setRendererCollection (vtkSmartPointer<vtkRendererCollection> &rens) { rens_ = rens; }
 
-        /** \brief Pass a pointer to the actor map
-          * \param[in] use_vbos
+        /** \brief Use Vertex Buffer Objects renderers.
+          * This is an optimization for the obsolete OpenGL backend. Modern OpenGL2 backend (VTK ≥ 6.3) uses vertex
+          * buffer objects by default, transparently for the user.
+          * \param[in] use_vbos set to true to use VBOs
           */
         inline void
         setUseVbos (const bool use_vbos) { use_vbos_ = use_vbos; }
@@ -282,7 +284,7 @@ namespace pcl
         /** \brief The maximum resizeable window width/height. */
         int max_win_height_, max_win_width_;
 
-        /** \brief The maximum resizeable window width/height. */
+        /** \brief Boolean that holds whether or not to use the vtkVertexBufferObjectMapper*/
         bool use_vbos_;
 
         /** \brief Set to true if the grid actor is enabled. */
diff --git a/visualization/include/pcl/visualization/pcl_visualizer.h b/visualization/include/pcl/visualization/pcl_visualizer.h
index 418c3c2..f62dc98 100644
--- a/visualization/include/pcl/visualization/pcl_visualizer.h
+++ b/visualization/include/pcl/visualization/pcl_visualizer.h
@@ -1859,6 +1859,8 @@ namespace pcl
         setSize (int xw, int yw);
 
         /** \brief Use Vertex Buffer Objects renderers.
+          * This is an optimization for the obsolete OpenGL backend. Modern OpenGL2 backend (VTK ≥ 6.3) uses vertex
+          * buffer objects by default, transparently for the user.
           * \param[in] use_vbos set to true to use VBOs 
           */
         void
diff --git a/visualization/src/interactor_style.cpp b/visualization/src/interactor_style.cpp
index 9e9fdaf..f443b6b 100644
--- a/visualization/src/interactor_style.cpp
+++ b/visualization/src/interactor_style.cpp
@@ -64,7 +64,9 @@
 #include <vtkPointPicker.h>
 #include <vtkAreaPicker.h>
 
+#if VTK_RENDERING_BACKEND_OPENGL_VERSION < 2
 #include <pcl/visualization/vtk/vtkVertexBufferObjectMapper.h>
+#endif
 
 #define ORIENT_MODE 0
 #define SELECT_MODE 1
@@ -660,6 +662,7 @@ pcl::visualization::PCLVisualizerInteractorStyle::OnKeyDown ()
         data->SetPoints (points);
         data->SetVerts (vertices);
         // Modify the mapper
+#if VTK_RENDERING_BACKEND_OPENGL_VERSION < 2
         if (use_vbos_)
         {
           vtkVertexBufferObjectMapper* mapper = static_cast<vtkVertexBufferObjectMapper*>(act->actor->GetMapper ());
@@ -668,6 +671,7 @@ pcl::visualization::PCLVisualizerInteractorStyle::OnKeyDown ()
           act->actor->SetMapper (mapper);
         }
         else
+#endif
         {
           vtkPolyDataMapper* mapper = static_cast<vtkPolyDataMapper*>(act->actor->GetMapper ());
 #if VTK_MAJOR_VERSION < 6
@@ -704,6 +708,7 @@ pcl::visualization::PCLVisualizerInteractorStyle::OnKeyDown ()
         vtkPolyData *data = static_cast<vtkPolyData*>(act->actor->GetMapper ()->GetInput ());
         data->GetPointData ()->SetScalars (scalars);
         // Modify the mapper
+#if VTK_RENDERING_BACKEND_OPENGL_VERSION < 2
         if (use_vbos_)
         {
           vtkVertexBufferObjectMapper* mapper = static_cast<vtkVertexBufferObjectMapper*>(act->actor->GetMapper ());
@@ -714,6 +719,7 @@ pcl::visualization::PCLVisualizerInteractorStyle::OnKeyDown ()
           act->actor->SetMapper (mapper);
         }
         else
+#endif
         {
           vtkPolyDataMapper* mapper = static_cast<vtkPolyDataMapper*>(act->actor->GetMapper ());
           mapper->SetScalarRange (minmax);
diff --git a/visualization/src/pcl_visualizer.cpp b/visualization/src/pcl_visualizer.cpp
index dc91674..40e516c 100644
--- a/visualization/src/pcl_visualizer.cpp
+++ b/visualization/src/pcl_visualizer.cpp
@@ -63,9 +63,12 @@
 #include <vtkPointPicker.h>
 
 #include <pcl/visualization/boost.h>
-#include <pcl/visualization/vtk/vtkVertexBufferObjectMapper.h>
 #include <pcl/visualization/vtk/vtkRenderWindowInteractorFix.h>
 
+#if VTK_RENDERING_BACKEND_OPENGL_VERSION < 2
+#include <pcl/visualization/vtk/vtkVertexBufferObjectMapper.h>
+#endif
+
 #include <vtkPolyLine.h>
 #include <vtkPolyDataMapper.h>
 #include <vtkRenderWindow.h>
@@ -84,7 +87,6 @@
 #include <vtkRenderWindowInteractor.h>
 #include <vtkAreaPicker.h>
 #include <vtkXYPlotActor.h>
-#include <vtkOpenGLHardwareSupport.h>
 #include <vtkOpenGLRenderWindow.h>
 #include <vtkJPEGReader.h>
 #include <vtkBMPReader.h>
@@ -92,6 +94,7 @@
 #include <vtkPNGReader.h>
 #include <vtkTIFFReader.h>
 #include <vtkLookupTable.h>
+#include <vtkTextureUnitManager.h>
 
 #include <pcl/visualization/common/shapes.h>
 #include <pcl/visualization/pcl_visualizer.h>
@@ -1079,6 +1082,7 @@ pcl::visualization::PCLVisualizer::createActorFromVTKDataSet (const vtkSmartPoin
   if (!actor)
     actor = vtkSmartPointer<vtkLODActor>::New ();
 
+#if VTK_RENDERING_BACKEND_OPENGL_VERSION < 2
   if (use_vbos_)
   {
     vtkSmartPointer<vtkVertexBufferObjectMapper> mapper = vtkSmartPointer<vtkVertexBufferObjectMapper>::New ();
@@ -1111,6 +1115,7 @@ pcl::visualization::PCLVisualizer::createActorFromVTKDataSet (const vtkSmartPoin
     actor->SetMapper (mapper);
   }
   else
+#endif
   {
     vtkSmartPointer<vtkDataSetMapper> mapper = vtkSmartPointer<vtkDataSetMapper>::New ();
 #if VTK_MAJOR_VERSION < 6
@@ -1157,6 +1162,7 @@ pcl::visualization::PCLVisualizer::createActorFromVTKDataSet (const vtkSmartPoin
   if (!actor)
     actor = vtkSmartPointer<vtkActor>::New ();
 
+#if VTK_RENDERING_BACKEND_OPENGL_VERSION < 2
   if (use_vbos_)
   {
     vtkSmartPointer<vtkVertexBufferObjectMapper> mapper = vtkSmartPointer<vtkVertexBufferObjectMapper>::New ();
@@ -1189,6 +1195,7 @@ pcl::visualization::PCLVisualizer::createActorFromVTKDataSet (const vtkSmartPoin
     actor->SetMapper (mapper);
   }
   else
+#endif
   {
     vtkSmartPointer<vtkDataSetMapper> mapper = vtkSmartPointer<vtkDataSetMapper>::New ();
 #if VTK_MAJOR_VERSION < 6
@@ -2771,6 +2778,7 @@ pcl::visualization::PCLVisualizer::updateColorHandlerIndex (const std::string &i
   vtkPolyData *data = static_cast<vtkPolyData*>(am_it->second.actor->GetMapper ()->GetInput ());
   data->GetPointData ()->SetScalars (scalars);
   // Modify the mapper
+#if VTK_RENDERING_BACKEND_OPENGL_VERSION < 2
   if (use_vbos_)
   {
     vtkVertexBufferObjectMapper* mapper = static_cast<vtkVertexBufferObjectMapper*>(am_it->second.actor->GetMapper ());
@@ -2785,6 +2793,7 @@ pcl::visualization::PCLVisualizer::updateColorHandlerIndex (const std::string &i
     //style_->setCloudActorMap (cloud_actor_map_);
   }
   else
+#endif
   {
     vtkPolyDataMapper* mapper = static_cast<vtkPolyDataMapper*>(am_it->second.actor->GetMapper ());
     mapper->SetScalarRange (minmax);
@@ -3223,19 +3232,18 @@ pcl::visualization::PCLVisualizer::addTextureMesh (const pcl::TextureMesh &mesh,
 #endif
 
   vtkSmartPointer<vtkLODActor> actor = vtkSmartPointer<vtkLODActor>::New ();
-  vtkOpenGLHardwareSupport* hardware = vtkOpenGLRenderWindow::SafeDownCast (win_)->GetHardwareSupport ();
-  if (!hardware)
+  vtkTextureUnitManager* tex_manager = vtkOpenGLRenderWindow::SafeDownCast (win_)->GetTextureUnitManager ();
+  if (!tex_manager)
     return (false);
-  bool supported = hardware->GetSupportsMultiTexturing ();
   // Check if hardware support multi texture
-  std::size_t texture_units (hardware->GetNumberOfFixedTextureUnits ());
-  if ((mesh.tex_materials.size () > 1) && supported && (texture_units > 1))
+  int texture_units = tex_manager->GetNumberOfTextureUnits ();
+  if ((mesh.tex_materials.size () > 1) && (texture_units > 1))
   {
     if (texture_units < mesh.tex_materials.size ())
       PCL_WARN ("[PCLVisualizer::addTextureMesh] GPU texture units %d < mesh textures %d!\n",
                 texture_units, mesh.tex_materials.size ());
     // Load textures
-    std::size_t last_tex_id = std::min (mesh.tex_materials.size (), texture_units);
+    std::size_t last_tex_id = std::min (static_cast<int> (mesh.tex_materials.size ()), texture_units);
     int tu = vtkProperty::VTK_TEXTURE_UNIT_0;
     std::size_t tex_id = 0;
     while (tex_id < last_tex_id)
@@ -3279,7 +3287,7 @@ pcl::visualization::PCLVisualizer::addTextureMesh (const pcl::TextureMesh &mesh,
   } // end of multi texturing
   else
   {
-    if ((mesh.tex_materials.size () > 1) && (!supported || texture_units < 2))
+    if ((mesh.tex_materials.size () > 1) && (texture_units < 2))
       PCL_WARN ("[PCLVisualizer::addTextureMesh] Your GPU doesn't support multi texturing. "
                 "Will use first one only!\n");
 
@@ -4297,8 +4305,12 @@ pcl::visualization::PCLVisualizer::resetStoppedFlag ()
 void
 pcl::visualization::PCLVisualizer::setUseVbos (bool use_vbos)
 {
+#if VTK_RENDERING_BACKEND_OPENGL_VERSION < 2
   use_vbos_ = use_vbos;
   style_->setUseVbos (use_vbos_);
+#else
+  PCL_WARN ("[PCLVisualizer::setUseVbos] Has no effect when OpenGL version is ≥ 2\n");
+#endif
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////////