| 354 | } |
| 355 | |
| 356 | bool bindTexturedPolydataToRenderWindow(vtkRenderWindow* renderWindow, vtkRenderer* renderer, |
| 357 | vtkOBJPolyDataProcessor* reader, vtkActorCollection* actorCollection) |
| 358 | { |
| 359 | if (nullptr == (renderWindow)) |
| 360 | { |
| 361 | vtkErrorWithObjectMacro(reader, "RenderWindow is null, failure!"); |
| 362 | return false; |
| 363 | } |
| 364 | if (nullptr == (renderer)) |
| 365 | { |
| 366 | vtkErrorWithObjectMacro(reader, "Renderer is null, failure!"); |
| 367 | return false; |
| 368 | } |
| 369 | if (nullptr == (reader)) |
| 370 | { |
| 371 | vtkErrorWithObjectMacro(reader, "vtkOBJPolyDataProcessor is null, failure!"); |
| 372 | return false; |
| 373 | } |
| 374 | |
| 375 | reader->actor_list.clear(); |
| 376 | reader->actor_list.reserve(reader->GetNumberOfOutputPorts()); |
| 377 | actorCollection->RemoveAllItems(); |
| 378 | |
| 379 | // keep track of textures used and if multiple parts use the same |
| 380 | // texture, then have the actors use the same texture. This saves memory |
| 381 | // etc and makes exporting more efficient. |
| 382 | std::map<std::string, vtkSmartPointer<vtkTexture>> knownTextures; |
| 383 | |
| 384 | for (int port_idx = 0; port_idx < reader->GetNumberOfOutputPorts(); port_idx++) |
| 385 | { |
| 386 | vtkPolyData* objPoly = reader->GetOutput(port_idx); |
| 387 | |
| 388 | vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); |
| 389 | mapper->SetInputData(objPoly); |
| 390 | mapper->SetColorModeToDirectScalars(); |
| 391 | |
| 392 | vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New(); |
| 393 | actor->SetMapper(mapper); |
| 394 | |
| 395 | vtkDebugWithObjectMacro(reader, |
| 396 | "Grabbed objPoly " << objPoly << ", port index " << port_idx << "\n" |
| 397 | << "numPolys = " << objPoly->GetNumberOfPolys() |
| 398 | << " numPoints = " << objPoly->GetNumberOfPoints()); |
| 399 | |
| 400 | // For each named material, load and bind the texture, add it to the renderer |
| 401 | |
| 402 | std::string textureFilename = reader->GetTextureFilename(port_idx); |
| 403 | if (!textureFilename.empty()) |
| 404 | { |
| 405 | auto kti = knownTextures.find(textureFilename); |
| 406 | if (kti == knownTextures.end()) |
| 407 | { |
| 408 | vtkSmartPointer<vtkImageReader2> imgReader; |
| 409 | if (vtksys::SystemTools::FileIsFullPath(textureFilename)) |
| 410 | { |
| 411 | imgReader.TakeReference( |
| 412 | vtkImageReader2Factory::CreateImageReader2(textureFilename.c_str())); |
| 413 | } |
no test coverage detected