// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen // SPDX-License-Identifier: BSD-3-Clause // .NAME Test of an RGBA texture on a vtkActor. // .SECTION Description // this program tests the CityGML Reader and setting of textures to // individual datasets of the multiblock tree while reader a stream #include "vtkActor.h" #include "vtkCamera.h" #include "vtkCityGMLReader.h" #include "vtkCompositeDataIterator.h" #include "vtkFieldData.h" #include "vtkFileResourceStream.h" #include "vtkJPEGReader.h" #include "vtkMultiBlockDataSet.h" #include "vtkPolyData.h" #include "vtkPolyDataMapper.h" #include "vtkRegressionTestImage.h" #include "vtkRenderWindow.h" #include "vtkRenderWindowInteractor.h" #include "vtkRenderer.h" #include "vtkStringArray.h" #include "vtkTestUtilities.h" #include "vtkTexture.h" #include "vtksys/SystemTools.hxx" #include namespace { void AddActors(vtkRenderer* renderer, vtkMultiBlockDataSet* mb, const char* fname) { vtkSmartPointer it; for (it.TakeReference(mb->NewIterator()); !it->IsDoneWithTraversal(); it->GoToNextItem()) { vtkPolyData* poly = vtkPolyData::SafeDownCast(it->GetCurrentDataObject()); if (poly) { vtkNew mapper; mapper->SetInputDataObject(poly); vtkNew actor; actor->SetMapper(mapper); renderer->AddActor(actor); vtkStringArray* textureField = vtkStringArray::SafeDownCast(poly->GetFieldData()->GetAbstractArray("texture_uri")); if (textureField) { std::string fnamePath = vtksys::SystemTools::GetFilenamePath(std::string(fname)); vtkStdString textureURI = textureField->GetValue(0); vtkNew JpegReader; JpegReader->SetFileName((fnamePath + "/" + textureURI).c_str()); JpegReader->Update(); vtkNew texture; texture->SetInputConnection(JpegReader->GetOutputPort()); texture->InterpolateOn(); actor->SetTexture(texture); } } } } } int TestCityGMLReaderStream(int argc, char* argv[]) { char* fname = vtkTestUtilities::ExpandDataFileName(argc, argv, "Data/CityGML/Part-4-Buildings-V4-one.gml"); vtkNew renderer; renderer->SetBackground(0.5, 0.7, 0.7); vtkNew renWin; renWin->AddRenderer(renderer); vtkNew interactor; interactor->SetRenderWindow(renWin); vtkNew fileStream; fileStream->Open(fname); vtkNew reader; reader->SetStream(fileStream); reader->Update(); vtkMultiBlockDataSet* mb = reader->GetOutput(); ::AddActors(renderer, mb, fname); renderer->ResetCamera(); renderer->GetActiveCamera()->Azimuth(90); renderer->GetActiveCamera()->Roll(-90); renderer->GetActiveCamera()->Zoom(1.5); renWin->SetSize(400, 400); renWin->Render(); interactor->Initialize(); renWin->Render(); int retVal = vtkRegressionTestImage(renWin); if (retVal == vtkRegressionTester::DO_INTERACTOR) { interactor->Start(); } delete[] fname; return !retVal; }