From d591bd875b659d6128d47e3b1cbd52e906d7d762 Mon Sep 17 00:00:00 2001 From: Anatoly Baksheev Date: Thu, 9 Jan 2014 19:34:55 +0400 Subject: [PATCH] fixed crash in enabling shading for polydata widgets --- modules/viz/src/clouds.cpp | 2 +- modules/viz/src/precomp.hpp | 16 ++++++++++++++++ modules/viz/src/vizcore.cpp | 16 ++-------------- modules/viz/src/widget.cpp | 16 ++++++++-------- 4 files changed, 27 insertions(+), 23 deletions(-) diff --git a/modules/viz/src/clouds.cpp b/modules/viz/src/clouds.cpp index 4b4010eefd..ceb4d9c0ba 100644 --- a/modules/viz/src/clouds.cpp +++ b/modules/viz/src/clouds.cpp @@ -313,7 +313,7 @@ cv::viz::WMesh::WMesh(const Mesh3d &mesh) cell_array->Squeeze(); polydata->SetStrips(cell_array); - vtkSmartPointer mapper = vtkSmartPointer::New(); + vtkSmartPointer mapper = vtkSmartPointer::New(); mapper->SetScalarModeToUsePointData(); mapper->ImmediateModeRenderingOff(); VtkUtils::SetInputData(mapper, polydata); diff --git a/modules/viz/src/precomp.hpp b/modules/viz/src/precomp.hpp index 3f4feaf046..425502d641 100644 --- a/modules/viz/src/precomp.hpp +++ b/modules/viz/src/precomp.hpp @@ -220,6 +220,22 @@ namespace cv scalars->SetArray(color_data->val, size * 3, 0); return scalars; } + + static vtkSmartPointer ComputeNormals(vtkSmartPointer polydata) + { + vtkSmartPointer normals_generator = vtkSmartPointer::New(); + normals_generator->ComputePointNormalsOn(); + normals_generator->ComputeCellNormalsOff(); + normals_generator->SetFeatureAngle(0.1); + normals_generator->SetSplitting(0); + normals_generator->SetConsistency(1); + normals_generator->SetAutoOrientNormals(0); + normals_generator->SetFlipNormals(0); + normals_generator->SetNonManifoldTraversal(1); + VtkUtils::SetInputData(normals_generator, polydata); + normals_generator->Update(); + return normals_generator->GetOutput(); + } }; inline vtkSmartPointer vtkmatrix(const cv::Matx44d &matrix) diff --git a/modules/viz/src/vizcore.cpp b/modules/viz/src/vizcore.cpp index bf01ff5a56..19e2b9394a 100644 --- a/modules/viz/src/vizcore.cpp +++ b/modules/viz/src/vizcore.cpp @@ -285,21 +285,9 @@ void cv::viz::writeTrajectory(InputArray _traj, const String& files_format, int void cv::viz::computeNormals(const Mesh3d& mesh, OutputArray _normals) { vtkSmartPointer polydata = getPolyData(WMesh(mesh)); + vtkSmartPointer with_normals = VtkUtils::ComputeNormals(polydata); - vtkSmartPointer normal_generator = vtkSmartPointer::New(); - normal_generator->SetInputConnection(polydata->GetProducerPort()); - normal_generator->ComputePointNormalsOn(); - normal_generator->ComputeCellNormalsOff(); - - normal_generator->SetFeatureAngle(0.1); - normal_generator->SetSplitting(0); - normal_generator->SetConsistency(1); - normal_generator->SetAutoOrientNormals(0); - normal_generator->SetFlipNormals(0); - normal_generator->SetNonManifoldTraversal(1); - normal_generator->Update(); - - vtkSmartPointer generic_normals = normal_generator->GetOutput()->GetPointData()->GetNormals(); + vtkSmartPointer generic_normals = with_normals->GetPointData()->GetNormals(); if(generic_normals) { Mat normals(1, generic_normals->GetNumberOfTuples(), CV_64FC3); diff --git a/modules/viz/src/widget.cpp b/modules/viz/src/widget.cpp index b0e84037fd..a633f24ba6 100644 --- a/modules/viz/src/widget.cpp +++ b/modules/viz/src/widget.cpp @@ -141,10 +141,10 @@ void cv::viz::Widget::setRenderingProperty(int property, double value) if (!actor->GetMapper()->GetInput()->GetPointData()->GetNormals()) { vtkSmartPointer mapper = vtkPolyDataMapper::SafeDownCast(actor->GetMapper()); - vtkSmartPointer normals = vtkSmartPointer::New(); - VtkUtils::SetInputData(normals, mapper->GetInput()); - normals->Update(); - VtkUtils::SetInputData(mapper, normals->GetOutput()); + CV_Assert("Can't set shading property for such type of widget" && mapper); + + vtkSmartPointer with_normals = VtkUtils::ComputeNormals(mapper->GetInput()); + VtkUtils::SetInputData(mapper, with_normals); } actor->GetProperty()->SetInterpolationToGouraud(); break; @@ -154,10 +154,10 @@ void cv::viz::Widget::setRenderingProperty(int property, double value) if (!actor->GetMapper()->GetInput()->GetPointData()->GetNormals()) { vtkSmartPointer mapper = vtkPolyDataMapper::SafeDownCast(actor->GetMapper()); - vtkSmartPointer normals = vtkSmartPointer::New(); - VtkUtils::SetInputData(normals, mapper->GetInput()); - normals->Update(); - VtkUtils::SetInputData(mapper, normals->GetOutput()); + CV_Assert("Can't set shading property for such type of widget" && mapper); + + vtkSmartPointer with_normals = VtkUtils::ComputeNormals(mapper->GetInput()); + VtkUtils::SetInputData(mapper, with_normals); } actor->GetProperty()->SetInterpolationToPhong(); break;