// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen // SPDX-License-Identifier: BSD-3-Clause #include "vtkActor.h" #include "vtkCamera.h" #include "vtkCompositeDataSet.h" #include "vtkHardwareSelector.h" #include "vtkIdTypeArray.h" #include "vtkInformation.h" #include "vtkMultiBlockDataSet.h" #include "vtkNew.h" #include "vtkPointGaussianMapper.h" #include "vtkProperty.h" #include "vtkRenderWindow.h" #include "vtkRenderWindowInteractor.h" #include "vtkRenderer.h" #include "vtkSelection.h" #include "vtkSelectionNode.h" #include "vtkSmartPointer.h" #include "vtkTrivialProducer.h" #include #include #include "vtkCylinderSource.h" #include int TestCompositeDataPointGaussianSelection(int argc, char* argv[]) { vtkNew win; vtkNew iren; vtkNew ren; win->AddRenderer(ren); win->SetInteractor(iren); vtkNew mapper; mapper->SetScaleFactor(0.01); int resolution = 18; vtkNew cyl; cyl->CappingOn(); cyl->SetRadius(0.2); cyl->SetResolution(resolution); // build a composite dataset vtkNew data; int blocksPerLevel[3] = { 1, 16, 32 }; std::vector> blocks; blocks.emplace_back(data.GetPointer()); unsigned levelStart = 0; unsigned levelEnd = 1; int numLevels = sizeof(blocksPerLevel) / sizeof(blocksPerLevel[0]); int numNodes = 0; mapper->SetInputDataObject(data.GetPointer()); for (int level = 1; level < numLevels; ++level) { int nblocks = blocksPerLevel[level]; for (unsigned parent = levelStart; parent < levelEnd; ++parent) { blocks[parent]->SetNumberOfBlocks(nblocks); for (int block = 0; block < nblocks; ++block, ++numNodes) { if (level == numLevels - 1) { vtkNew child; cyl->SetCenter(block * 0.25, 0.0, parent * 0.5); cyl->Update(); child->DeepCopy(cyl->GetOutput(0)); blocks[parent]->SetBlock(block, (block % 2) ? nullptr : child.GetPointer()); } else { vtkNew child; blocks[parent]->SetBlock(block, child.GetPointer()); blocks.emplace_back(child.GetPointer()); } } } levelStart = levelEnd; levelEnd = static_cast(blocks.size()); } vtkSmartPointer actor = vtkSmartPointer::New(); actor->SetMapper(mapper); ren->AddActor(actor); win->SetSize(400, 400); ren->ResetCamera(); ren->GetActiveCamera()->Elevation(40.0); ren->GetActiveCamera()->Zoom(3.2); ren->GetActiveCamera()->Roll(20.0); win->Render(); vtkNew selector; selector->SetFieldAssociation(vtkDataObject::FIELD_ASSOCIATION_POINTS); selector->SetRenderer(ren); selector->SetArea(10, 10, 50, 50); vtkSelection* result = selector->Select(); bool goodPick = false; std::cerr << "numnodes: " << result->GetNumberOfNodes() << "\n"; if (result->GetNumberOfNodes() == 5) { for (unsigned int nodenum = 0; nodenum < result->GetNumberOfNodes(); ++nodenum) { vtkSelectionNode* node = result->GetNode(nodenum); std::cerr << "Node: " << nodenum << " comp: " << node->GetProperties()->Get(vtkSelectionNode::COMPOSITE_INDEX()) << "\n"; vtkIdTypeArray* selIds = vtkArrayDownCast(node->GetSelectionList()); if (selIds) { vtkIdType numIds = selIds->GetNumberOfTuples(); for (vtkIdType i = 0; i < numIds; ++i) { vtkIdType curId = selIds->GetValue(i); std::cerr << curId << "\n"; } } } vtkIdTypeArray* selIds = vtkArrayDownCast(result->GetNode(0)->GetSelectionList()); if (result->GetNode(0)->GetProperties()->Has(vtkSelectionNode::PROP_ID()) && result->GetNode(0)->GetProperties()->Get(vtkSelectionNode::PROP()) == actor.Get() && result->GetNode(0)->GetProperties()->Get(vtkSelectionNode::COMPOSITE_INDEX()) == 305 && result->GetNode(2)->GetProperties()->Get(vtkSelectionNode::COMPOSITE_INDEX()) == 340 && selIds && selIds->GetNumberOfTuples() == 4 && selIds->GetValue(2) == 70) { goodPick = true; } } result->Delete(); if (!goodPick) { std::cerr << "Incorrect splats picked!\n"; return EXIT_FAILURE; } int retVal = vtkRegressionTestImageThreshold(win.GetPointer(), 0.05); if (retVal == vtkRegressionTester::DO_INTERACTOR) { iren->Start(); } return !retVal; }