diff --git a/ParaViewCore/VTKExtensions/Rendering/vtkKdTreeGenerator.cxx b/ParaViewCore/VTKExtensions/Rendering/vtkKdTreeGenerator.cxx index dec7a6f9f729fc3a767836cd3ab969fe80468d42..d770f2ce2bb8d498d3fe6c509c044096ad99608c 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, @@ -207,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(); @@ -241,8 +257,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 +266,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 +302,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 +313,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 2ed98fe3fd97ec3d8c273035caeb30990d64d3be..c731c3b2a2f9245a1bd748b07154b7b731c39ad2 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.