Skip to content

Instantly share code, notes, and snippets.

@fran6co
Last active June 8, 2016 18:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fran6co/4b2cd200f5bec33f5ec1c84be0dd6a83 to your computer and use it in GitHub Desktop.
Save fran6co/4b2cd200f5bec33f5ec1c84be0dd6a83 to your computer and use it in GitHub Desktop.
PCL 1.7.2 vtk7 support
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