Last active
June 8, 2016 18:52
-
-
Save fran6co/4b2cd200f5bec33f5ec1c84be0dd6a83 to your computer and use it in GitHub Desktop.
PCL 1.7.2 vtk7 support
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From 9cfb00970f7d46f1732149d4c50ba3646f038b6c Mon Sep 17 00:00:00 2001 | |
From: Sergey Alexandrov <alexandrov88@gmail.com> | |
Date: Thu, 11 Feb 2016 22:19:01 +0100 | |
Subject: [PATCH 1/4] Use vtkTextureUnitManager to query the number of | |
available texture units | |
The new OpenGL2 backend does not have vktOpenGLHardwareSupport class | |
which was used before. | |
--- | |
visualization/src/pcl_visualizer.cpp | 15 +++++++-------- | |
1 file changed, 7 insertions(+), 8 deletions(-) | |
diff --git a/visualization/src/pcl_visualizer.cpp b/visualization/src/pcl_visualizer.cpp | |
index dc91674..007c251 100644 | |
--- a/visualization/src/pcl_visualizer.cpp | |
+++ b/visualization/src/pcl_visualizer.cpp | |
@@ -84,7 +84,6 @@ | |
#include <vtkRenderWindowInteractor.h> | |
#include <vtkAreaPicker.h> | |
#include <vtkXYPlotActor.h> | |
-#include <vtkOpenGLHardwareSupport.h> | |
#include <vtkOpenGLRenderWindow.h> | |
#include <vtkJPEGReader.h> | |
#include <vtkBMPReader.h> | |
@@ -91,6 +94,7 @@ | |
#include <vtkPNMReader.h> | |
#include <vtkPNGReader.h> | |
#include <vtkTIFFReader.h> | |
+#include <vtkTextureUnitManager.h> | |
#include <pcl/visualization/common/shapes.h> | |
#include <pcl/visualization/pcl_visualizer.h> | |
@@ -3221,17 +3231,19 @@ pcl::visualization::PCLVisualizer::addTextureMesh (const pcl::TextureMesh &mesh, | |
#endif | |
vtkSmartPointer<vtkLODActor> actor = vtkSmartPointer<vtkLODActor>::New (); | |
- vtkOpenGLHardwareSupport* hardware = vtkOpenGLRenderWindow::SafeDownCast (win_)->GetHardwareSupport (); | |
- bool supported = hardware->GetSupportsMultiTexturing (); | |
+ vtkTextureUnitManager* tex_manager = vtkOpenGLRenderWindow::SafeDownCast (win_)->GetTextureUnitManager (); | |
+ if (!tex_manager) | |
+ return (false); | |
+ | |
// 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) | |
@@ -3275,7 +3287,7 @@ | |
} // end of multi texturing | |
else | |
{ | |
- if (!supported || texture_units < 2) | |
+ if (texture_units < 2) | |
PCL_WARN ("[PCLVisualizer::addTextureMesh] Your GPU doesn't support multi texturing. " | |
"Will use first one only!\n"); | |
From d0efc67fa0d5f3fb3fb99990a6b2a1967a93c229 Mon Sep 17 00:00:00 2001 | |
From: Sergey Alexandrov <alexandrov88@gmail.com> | |
Date: Sat, 13 Feb 2016 13:31:54 +0100 | |
Subject: [PATCH 2/4] 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. | |
--- | |
CMakeLists.txt | 12 +++++++++++- | |
pcl_config.h.in | 4 ++++ | |
2 files changed, 15 insertions(+), 1 deletion(-) | |
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/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} | |
+ | |
From c50c65b042828cfa18765eef7876f896a40a6d1b Mon Sep 17 00:00:00 2001 | |
From: Sergey Alexandrov <alexandrov88@gmail.com> | |
Date: Sat, 13 Feb 2016 13:59:47 +0100 | |
Subject: [PATCH 3/4] 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. | |
--- | |
outofcore/src/visualization/outofcore_cloud.cpp | 14 ++++++++++++-- | |
visualization/CMakeLists.txt | 18 ++++++++++++++---- | |
visualization/src/interactor_style.cpp | 6 ++++++ | |
visualization/src/pcl_visualizer.cpp | 15 ++++++++++++++- | |
4 files changed, 46 insertions(+), 7 deletions(-) | |
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/visualization/CMakeLists.txt b/visualization/CMakeLists.txt | |
index 26bfd7c..940fc8e 100644 | |
--- a/visualization/CMakeLists.txt | |
+++ b/visualization/CMakeLists.txt | |
@@ -50,8 +50,6 @@ | |
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 @@ | |
) | |
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 @@ | |
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/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 007c251..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> | |
@@ -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); | |
@@ -4296,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 | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment