From 54046ca29a4776d63321e36bfa07855f687ff028 Mon Sep 17 00:00:00 2001 From: Utkarsh Ayachit Date: Wed, 4 Nov 2015 14:08:11 -0500 Subject: [PATCH 1/2] API cleanups by using std::vector directly. --- .../Rendering/vtkKdTreeGenerator.cxx | 34 +++++++------------ .../Rendering/vtkKdTreeGenerator.h | 11 +++--- 2 files changed, 19 insertions(+), 26 deletions(-) diff --git a/ParaViewCore/VTKExtensions/Rendering/vtkKdTreeGenerator.cxx b/ParaViewCore/VTKExtensions/Rendering/vtkKdTreeGenerator.cxx index dec7a6f9f7..fdda7450f4 100644 --- a/ParaViewCore/VTKExtensions/Rendering/vtkKdTreeGenerator.cxx +++ b/ParaViewCore/VTKExtensions/Rendering/vtkKdTreeGenerator.cxx @@ -26,10 +26,6 @@ #include "vtkSmartPointer.h" #include "vtkStreamingDemandDrivenPipeline.h" -#include - -class vtkKdTreeGeneratorVector : public std::vector {}; - vtkStandardNewMacro(vtkKdTreeGenerator); vtkCxxSetObjectMacro(vtkKdTreeGenerator, ExtentTranslator, vtkExtentTranslator); vtkCxxSetObjectMacro(vtkKdTreeGenerator, KdTree, vtkPKdTree); @@ -42,7 +38,6 @@ vtkKdTreeGenerator::vtkKdTreeGenerator() this->Origin[0] = this->Origin[1] = this->Origin[2] = 0.0; this->Spacing[0] = this->Spacing[1] = this->Spacing[2] = 1.0; this->ExtentTranslator = 0; - this->Regions = 0; this->KdTree = 0; } @@ -51,8 +46,6 @@ vtkKdTreeGenerator::~vtkKdTreeGenerator() { this->SetKdTree(0); this->SetExtentTranslator(0); - delete []this->Regions; - this->Regions = 0; } //----------------------------------------------------------------------------- @@ -107,7 +100,7 @@ bool vtkKdTreeGenerator::BuildTree(vtkExtentTranslator* translator, root->SetDim(0); this->FormRegions(); - vtkKdTreeGeneratorVector regions_ids; + std::vector regions_ids; for (int cc=0; cc < this->NumberOfPieces; cc++) { regions_ids.push_back(cc); @@ -153,7 +146,7 @@ bool vtkKdTreeGenerator::BuildTree(vtkExtentTranslator* translator, //----------------------------------------------------------------------------- int vtkKdTreeGenerator::FormTree(vtkKdNode* parent, - vtkKdTreeGeneratorVector ®ions_ids) + std::vector ®ions_ids) { if (regions_ids.size() == 1) { @@ -162,7 +155,7 @@ int vtkKdTreeGenerator::FormTree(vtkKdNode* parent, // when it reorders the regions. parent->SetID(regions_ids[0]); parent->SetDim(3); - int *extent = &this->Regions[6*regions_ids[0]]; + const int *extent = this->Regions[regions_ids[0]].GetData(); parent->SetBounds(extent[0], extent[1], extent[2], extent[3], extent[4], extent[5]); return 1; @@ -183,15 +176,15 @@ int vtkKdTreeGenerator::FormTree(vtkKdNode* parent, return 0; } - vtkKdTreeGeneratorVector left; - vtkKdTreeGeneratorVector right; + std::vector left; + std::vector right; int division_point = 0; do { for (unsigned int cc=0; cc < regions_ids.size(); cc++) { int region_id = regions_ids[cc]; - int *region_extents = &this->Regions[6*region_id]; + int *region_extents = this->Regions[region_id].GetData(); division_point = region_extents[current_dim*2+1]; if (this->CanPartition(division_point, current_dim, @@ -241,8 +234,8 @@ int vtkKdTreeGenerator::FormTree(vtkKdNode* parent, //----------------------------------------------------------------------------- int vtkKdTreeGenerator::CanPartition(int division_point, int dimension, - vtkKdTreeGeneratorVector& ids, - vtkKdTreeGeneratorVector& left, vtkKdTreeGeneratorVector& right) + std::vector& ids, + std::vector& left, std::vector& right) { // Iterate over all regions in the ids list and see if the given // division point is inside any region. If so, return false, @@ -250,13 +243,13 @@ int vtkKdTreeGenerator::CanPartition(int division_point, int dimension, // On success we update left, right to reflect the regions to the left // and right of the division_point. - vtkKdTreeGeneratorVector work_left; - vtkKdTreeGeneratorVector work_right; + std::vector work_left; + std::vector work_right; for (unsigned int cc=0; cc < ids.size(); cc++) { int region_id = ids[cc]; - int *region_extents = &this->Regions[6*region_id]; + int *region_extents = this->Regions[region_id].GetData(); int min = region_extents[2*dimension]; int max = region_extents[2*dimension+1]; if (division_point > min && division_point < max) @@ -286,8 +279,7 @@ int vtkKdTreeGenerator::CanPartition(int division_point, int dimension, //----------------------------------------------------------------------------- void vtkKdTreeGenerator::FormRegions() { - delete [] this->Regions; - this->Regions = new int[this->NumberOfPieces*6]; + this->Regions.resize(this->NumberOfPieces); this->ExtentTranslator->SetWholeExtent(this->WholeExtent); this->ExtentTranslator->SetNumberOfPieces(this->NumberOfPieces); this->ExtentTranslator->SetGhostLevel(0); @@ -298,7 +290,7 @@ void vtkKdTreeGenerator::FormRegions() { this->ExtentTranslator->SetPiece(cc); this->ExtentTranslator->PieceToExtent(); - this->ExtentTranslator->GetExtent(&this->Regions[cc*6]); + this->ExtentTranslator->GetExtent(this->Regions[cc].GetData()); //int extent[6]; //this->ExtentTranslator->GetExtent(extent); //cout << cc << ": " diff --git a/ParaViewCore/VTKExtensions/Rendering/vtkKdTreeGenerator.h b/ParaViewCore/VTKExtensions/Rendering/vtkKdTreeGenerator.h index 2ed98fe3fd..c731c3b2a2 100644 --- a/ParaViewCore/VTKExtensions/Rendering/vtkKdTreeGenerator.h +++ b/ParaViewCore/VTKExtensions/Rendering/vtkKdTreeGenerator.h @@ -45,12 +45,13 @@ #include "vtkObject.h" #include "vtkPVVTKExtensionsRenderingModule.h" // needed for export macro +#include "vtkTuple.h" +#include class vtkDataObject; class vtkExtentTranslator; class vtkInformation; class vtkKdNode; -class vtkKdTreeGeneratorVector; class vtkPKdTree; class VTKPVVTKEXTENSIONSRENDERING_EXPORT vtkKdTreeGenerator : public vtkObject @@ -98,10 +99,10 @@ protected: // the input dataset among processes. void FormRegions(); - int FormTree(vtkKdNode* parent, vtkKdTreeGeneratorVector& regions_ids); + int FormTree(vtkKdNode* parent, std::vector& regions_ids); int CanPartition(int division_point, int dimension, - vtkKdTreeGeneratorVector& ids, - vtkKdTreeGeneratorVector& left, vtkKdTreeGeneratorVector& right); + std::vector& ids, + std::vector& left, std::vector& right); // Converts extents to bounds in the kdtree. bool ConvertToBounds(vtkKdNode* node); @@ -115,7 +116,7 @@ protected: int WholeExtent[6]; int NumberOfPieces; - int *Regions; + std::vector > Regions; private: vtkKdTreeGenerator(const vtkKdTreeGenerator&); // Not implemented. void operator=(const vtkKdTreeGenerator&); // Not implemented. -- GitLab From 364d6fe974f3dcbb4f0c636f6ed5febb07ed9bda Mon Sep 17 00:00:00 2001 From: Utkarsh Ayachit Date: Wed, 4 Nov 2015 14:27:52 -0500 Subject: [PATCH 2/2] BUG #0015816: Fix vtkKdTreeGenerator error with non-paritioned images. When an image dataset is not distributed among ranks, the KdTree generator ended up in code paths that it didn't expect. Fixed that. Now, if extent for any level cannot be further split even when there are more than 1 regions remaining, it properly tags the parent node. --- .../Rendering/vtkKdTreeGenerator.cxx | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/ParaViewCore/VTKExtensions/Rendering/vtkKdTreeGenerator.cxx b/ParaViewCore/VTKExtensions/Rendering/vtkKdTreeGenerator.cxx index fdda7450f4..d770f2ce2b 100644 --- a/ParaViewCore/VTKExtensions/Rendering/vtkKdTreeGenerator.cxx +++ b/ParaViewCore/VTKExtensions/Rendering/vtkKdTreeGenerator.cxx @@ -200,6 +200,29 @@ int vtkKdTreeGenerator::FormTree(vtkKdNode* parent, current_dim = (current_dim+1) % 3; } while (current_dim != start_dim); + if (left.size() == 0 && right.size() == 0) + { + // we can no longer partition. + // find region id that matches the extents of the parent. + vtkTuple parentBounds; + double bds[6]; parent->GetBounds(bds); + for (int cc=0; cc < 6; ++cc) + { + parentBounds[cc] = static_cast(bds[cc]); + } + for (size_t cc = 0, max = this->Regions.size(); cc < max; ++cc) + { + if (this->Regions[cc] == parentBounds) + { + parent->SetID(regions_ids[cc]); + parent->SetDim(3); + return 1; + } + } + vtkErrorMacro("Failed to identify region for a leaf."); + return 0; + } + parent->SetDim(current_dim); vtkKdNode* leftNode = vtkKdNode::New(); -- GitLab