/*========================================================================= Program: Visualization Toolkit Module: vtkCompositePolyDataMapper2.cxx Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen All rights reserved. See Copyright.txt or http://www.kitware.com/Copyright.htm for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkColorTransferFunction.h" #include "vtkCompositeDataDisplayAttributes.h" #include "vtkCompositePolyDataMapper2.h" #include "vtkCylinderSource.h" #include "vtkDoubleArray.h" #include "vtkFieldData.h" #include "vtkMultiBlockDataSet.h" #include "vtkNew.h" #include "vtkOSPRayPass.h" #include "vtkOSPRayRendererNode.h" #include "vtkProperty.h" #include "vtkRegressionTestImage.h" #include "vtkRenderWindow.h" #include "vtkRenderWindowInteractor.h" #include "vtkRenderer.h" #include "vtkSmartPointer.h" #include "vtkSphereSource.h" // Test for multiblock data sets with field data arrays defined on // only a subset of the blocks. The expected behavior is to have // coloring by scalars on the blocks with the data array and coloring // as though scalar mapping is turned off in the blocks without the // data array. int TestOSPRayMultiBlockPartialArrayFieldData(int argc, char* argv[]) { bool useGL = false; for (int i = 0; i < argc; i++) { if (!strcmp(argv[i], "-GL")) { useGL = true; } } vtkSmartPointer win = vtkSmartPointer::New(); vtkSmartPointer iren = vtkSmartPointer::New(); vtkSmartPointer ren = vtkSmartPointer::New(); win->AddRenderer(ren); win->SetInteractor(iren); // Components of the multiblock data set vtkNew sphereSource; sphereSource->SetRadius(2.0); vtkNew cylinderSource; cylinderSource->SetRadius(1.5); cylinderSource->SetHeight(2.0); cylinderSource->SetResolution(32); // Set up the multiblock data set consisting of a ring of blocks vtkSmartPointer data = vtkSmartPointer::New(); int numBlocks = 16; data->SetNumberOfBlocks(numBlocks); double radius = 10.0; double deltaTheta = 2.0 * 3.1415926 / numBlocks; for (int i = 0; i < numBlocks; ++i) { double theta = i * deltaTheta; double x = radius * cos(theta); double y = radius * sin(theta); vtkPolyData* pd = vtkPolyData::New(); // Every third block does not have the color array if (i % 3 == 0) { sphereSource->SetCenter(x, y, 0.0); sphereSource->Update(); pd->DeepCopy(sphereSource->GetOutput()); } else { cylinderSource->SetCenter(x, y, 0.0); cylinderSource->Update(); pd->DeepCopy(cylinderSource->GetOutput()); // Add a field data array vtkSmartPointer dataArray = vtkSmartPointer::New(); dataArray->SetName("mydata"); dataArray->SetNumberOfComponents(1); dataArray->SetNumberOfTuples(1); dataArray->InsertValue(0, static_cast(i)); pd->GetFieldData()->AddArray(dataArray); } data->SetBlock(i, pd); pd->Delete(); } vtkNew lookupTable; lookupTable->AddRGBPoint(0.0, 1.0, 1.0, 1.0); lookupTable->AddRGBPoint(static_cast(numBlocks - 1), 0.0, 1.0, 0.0); vtkSmartPointer mapper = vtkSmartPointer::New(); mapper->SetInputDataObject(data); // Tell mapper to use field data for rendering mapper->SetLookupTable(lookupTable); mapper->SetFieldDataTupleId(0); mapper->SelectColorArray("mydata"); mapper->SetScalarModeToUseFieldData(); mapper->UseLookupTableScalarRangeOn(); mapper->ScalarVisibilityOn(); vtkSmartPointer actor = vtkSmartPointer::New(); actor->SetMapper(mapper); actor->GetProperty()->SetColor(1.0, 0.67, 1.0); vtkSmartPointer ospray = vtkSmartPointer::New(); if (!useGL) { ren->SetPass(ospray); for (int i = 0; i < argc; ++i) { if (!strcmp(argv[i], "--OptiX")) { vtkOSPRayRendererNode::SetRendererType("optix pathtracer", ren); break; } } } ren->AddActor(actor); win->SetSize(400, 400); ren->ResetCamera(); win->Render(); int retVal = vtkRegressionTestImageThreshold(win, 15); if (retVal == vtkRegressionTester::DO_INTERACTOR) { iren->Start(); } return !retVal; }