Skip to content

Commit

Permalink
Merge pull request #1534 from taketwo/vtk-7
Browse files Browse the repository at this point in the history
Support VTK7 with OpenGL2 backend
  • Loading branch information
VictorLamoine committed Feb 15, 2016
2 parents abd234e + 641fe1b commit 9ca3b6b
Show file tree
Hide file tree
Showing 8 changed files with 75 additions and 19 deletions.
12 changes: 11 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)
Expand Down
14 changes: 12 additions & 2 deletions outofcore/src/visualization/outofcore_cloud.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down Expand Up @@ -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);
Expand Down
4 changes: 4 additions & 0 deletions pcl_config.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -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}

18 changes: 14 additions & 4 deletions visualization/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand All @@ -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"
Expand Down Expand Up @@ -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
Expand Down
8 changes: 5 additions & 3 deletions visualization/include/pcl/visualization/interactor_style.h
Original file line number Diff line number Diff line change
Expand Up @@ -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; }
Expand Down Expand Up @@ -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. */
Expand Down
2 changes: 2 additions & 0 deletions visualization/include/pcl/visualization/pcl_visualizer.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 6 additions & 0 deletions visualization/src/interactor_style.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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 ());
Expand All @@ -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
Expand Down Expand Up @@ -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 ());
Expand All @@ -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);
Expand Down
30 changes: 21 additions & 9 deletions visualization/src/pcl_visualizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand All @@ -84,14 +87,14 @@
#include <vtkRenderWindowInteractor.h>
#include <vtkAreaPicker.h>
#include <vtkXYPlotActor.h>
#include <vtkOpenGLHardwareSupport.h>
#include <vtkOpenGLRenderWindow.h>
#include <vtkJPEGReader.h>
#include <vtkBMPReader.h>
#include <vtkPNMReader.h>
#include <vtkPNGReader.h>
#include <vtkTIFFReader.h>
#include <vtkLookupTable.h>
#include <vtkTextureUnitManager.h>

#include <pcl/visualization/common/shapes.h>
#include <pcl/visualization/pcl_visualizer.h>
Expand Down Expand Up @@ -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 ();
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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 ();
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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 ());
Expand All @@ -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);
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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");

Expand Down Expand Up @@ -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
}

//////////////////////////////////////////////////////////////////////////////////////////////
Expand Down

0 comments on commit 9ca3b6b

Please sign in to comment.