// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen // SPDX-License-Identifier: BSD-3-Clause #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include int TestOBJPolyDataWriter(int argc, char* argv[]) { vtkNew sphereSource; sphereSource->SetThetaResolution(16); sphereSource->SetPhiResolution(16); vtkNew textReader; char* fname = vtkTestUtilities::ExpandDataFileName(argc, argv, "Data/NE2_ps_bath_small.jpg"); textReader->SetFileName(fname); delete[] fname; char* tname = vtkTestUtilities::GetArgOrEnvOrDefault("-T", argc, argv, "VTK_TEMP_DIR", "Testing/Temporary"); std::string tmpDir(tname); delete[] tname; std::string filename = tmpDir + "/TestOBJPolyDataWriter_write.obj"; vtkNew writer; writer->SetFileName(filename.c_str()); writer->SetInputConnection(0, sphereSource->GetOutputPort()); writer->SetInputConnection(1, textReader->GetOutputPort()); writer->Write(); vtkPolyData* polyInput = sphereSource->GetOutput(); // read this file and compare with input vtkNew reader; reader->SetFileName(filename.c_str()); reader->Update(); vtkPolyData* polyOutput = reader->GetOutput(); if (polyInput->GetNumberOfPoints() != polyOutput->GetNumberOfPoints()) { std::cerr << "PolyData do not have the same number of points.\n"; return EXIT_FAILURE; } vtkDataArray* positionsInput = polyInput->GetPoints()->GetData(); vtkDataArray* positionsOutput = polyOutput->GetPoints()->GetData(); vtkDataArray* normalsInput = polyInput->GetPointData()->GetNormals(); vtkDataArray* normalsOutput = polyOutput->GetPointData()->GetNormals(); vtkDataArray* tcoordsInput = polyInput->GetPointData()->GetTCoords(); vtkDataArray* tcoordsOutput = polyOutput->GetPointData()->GetTCoords(); if (!positionsInput || !positionsOutput || !normalsInput || !normalsOutput || !tcoordsInput || !tcoordsOutput) { std::cerr << "One of the arrays is null.\n"; return EXIT_FAILURE; } // check values int numberOfDifferentPoints = 0; int numberOfDifferentNormals = 0; int numberOfDifferentTCoords = 0; for (vtkIdType i = 0; i < polyInput->GetNumberOfPoints(); i++) { double pi[3], po[3]; // check positions positionsInput->GetTuple(i, pi); positionsOutput->GetTuple(i, po); if (vtkMath::Distance2BetweenPoints(pi, po) > 0.0) { std::cerr << "Point is different.\n"; std::cerr << vtk::format(" Input: {} {} {}\n", pi[0], pi[1], pi[2]); std::cerr << vtk::format(" Output: {} {} {}\n", po[0], po[1], po[2]); numberOfDifferentPoints++; } // check normals normalsInput->GetTuple(i, pi); normalsOutput->GetTuple(i, po); if (vtkMath::AngleBetweenVectors(pi, po) > 0) { std::cerr << "Normal is different:\n"; std::cerr << vtk::format(" Input: {} {} {}\n", pi[0], pi[1], pi[2]); std::cerr << vtk::format(" Output: {} {} {}\n", po[0], po[1], po[2]); numberOfDifferentNormals++; } // check texture coords tcoordsInput->GetTuple(i, pi); tcoordsOutput->GetTuple(i, po); pi[2] = po[2] = 0.0; if (vtkMath::Distance2BetweenPoints(pi, po) > 0.0) { std::cerr << "Texture coord is different:\n"; std::cerr << vtk::format(" Input: {} {} {}\n", pi[0], pi[1], pi[2]); std::cerr << vtk::format(" Output: {} {} {}\n", po[0], po[1], po[2]); numberOfDifferentTCoords++; } } if (numberOfDifferentPoints != 0 || numberOfDifferentNormals != 0 || numberOfDifferentTCoords != 0) { return EXIT_FAILURE; } vtkNew mapper; mapper->SetInputConnection(reader->GetOutputPort()); // read png file and set up texture vtkNew pngReader; std::string pngFile = filename.replace(filename.length() - 3, 3, "png"); pngReader->SetFileName(pngFile.c_str()); vtkNew texture; texture->SetInputConnection(pngReader->GetOutputPort()); // add mapper and texture in an actor vtkNew actor; actor->SetMapper(mapper); actor->SetTexture(texture); // Standard rendering classes vtkNew renderer; vtkNew renWin; renWin->AddRenderer(renderer); vtkNew iren; iren->SetRenderWindow(renWin); // set up the view renderer->SetBackground(0.5, 0.5, 0.5); renWin->SetSize(300, 300); renderer->AddActor(actor); renderer->ResetCamera(); renWin->Render(); int retVal = vtkRegressionTestImage(renWin); if (retVal == vtkRegressionTester::DO_INTERACTOR) { iren->Start(); } return !retVal; }