------------------------------------------------------------------------------
| 238 | |
| 239 | //------------------------------------------------------------------------------ |
| 240 | vtkSmartPointer<vtkCompositeDataSet> vtkHyperTreeGridMapper::UpdateWithDecimation( |
| 241 | vtkCompositeDataSet* cds, vtkRenderer* ren) |
| 242 | { |
| 243 | bool useAdapt = this->UseAdaptiveDecimation; |
| 244 | |
| 245 | vtkNew<vtkAdaptiveDataSetSurfaceFilter> adaptiveGeometryFilter; |
| 246 | vtkNew<vtkHyperTreeGridGeometry> geometryFilter; |
| 247 | vtkNew<vtkDataSetSurfaceFilter> surfaceFilter; |
| 248 | |
| 249 | adaptiveGeometryFilter->SetRenderer(ren); |
| 250 | |
| 251 | auto outputComposite = vtkSmartPointer<vtkCompositeDataSet>::Take(cds->NewInstance()); |
| 252 | outputComposite->CopyStructure(cds); |
| 253 | |
| 254 | auto iter = vtkSmartPointer<vtkCompositeDataIterator>::Take(cds->NewIterator()); |
| 255 | iter->SkipEmptyNodesOn(); |
| 256 | for (iter->InitTraversal(); !iter->IsDoneWithTraversal(); iter->GoToNextItem()) |
| 257 | { |
| 258 | vtkDataObject* leaf = iter->GetCurrentDataObject(); |
| 259 | if (auto* htg = vtkHyperTreeGrid::SafeDownCast(leaf)) |
| 260 | { |
| 261 | if (useAdapt) |
| 262 | { |
| 263 | // use adaptive decimation |
| 264 | adaptiveGeometryFilter->SetInputDataObject(htg); |
| 265 | adaptiveGeometryFilter->Update(); |
| 266 | vtkDataObject* outputDS = adaptiveGeometryFilter->GetOutputDataObject(0); |
| 267 | auto newBlock = vtkSmartPointer<vtkDataObject>::Take(outputDS->NewInstance()); |
| 268 | newBlock->ShallowCopy(outputDS); |
| 269 | outputComposite->SetDataSet(iter.Get(), newBlock); |
| 270 | } |
| 271 | else |
| 272 | { |
| 273 | // simply transform to polydata |
| 274 | geometryFilter->SetInputDataObject(htg); |
| 275 | geometryFilter->Update(); |
| 276 | vtkDataObject* outputDS = geometryFilter->GetOutputDataObject(0); |
| 277 | auto newBlock = vtkSmartPointer<vtkDataObject>::Take(outputDS->NewInstance()); |
| 278 | newBlock->ShallowCopy(outputDS); |
| 279 | outputComposite->SetDataSet(iter.Get(), newBlock); |
| 280 | } |
| 281 | } |
| 282 | else if (auto* ds = vtkDataSet::SafeDownCast(leaf)) |
| 283 | { |
| 284 | // other cases |
| 285 | surfaceFilter->SetInputDataObject(ds); |
| 286 | surfaceFilter->Update(); |
| 287 | vtkDataObject* outputDS = surfaceFilter->GetOutputDataObject(0); |
| 288 | auto newBlock = vtkSmartPointer<vtkDataObject>::Take(outputDS->NewInstance()); |
| 289 | newBlock->ShallowCopy(outputDS); |
| 290 | outputComposite->SetDataSet(iter.Get(), newBlock); |
| 291 | } |
| 292 | } |
| 293 | |
| 294 | return outputComposite; |
| 295 | } |
| 296 | |
| 297 | //------------------------------------------------------------------------------ |
no test coverage detected