/*========================================================================= Program: Visualization Toolkit Module: TestProjectedTetrahedraOffscreen.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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // Description // Tests off-screen rendering of vtkProjectedTetrahedra. // Creates a cube volume vtkSmartPointer CubeVolume_TetrahedraOffscreen(double r, double g, double b) { // Create the coordinates vtkNew xArray; xArray->InsertNextValue(0.0); xArray->InsertNextValue(1.0); vtkNew yArray; yArray->InsertNextValue(0.0); yArray->InsertNextValue(1.0); vtkNew zArray; zArray->InsertNextValue(0.0); zArray->InsertNextValue(1.0); // Create the RectilinearGrid vtkNew grid; grid->SetDimensions(2, 2, 2); grid->SetXCoordinates(xArray); grid->SetYCoordinates(yArray); grid->SetZCoordinates(zArray); // Obtain an UnstructuredGrid made of tetrahedras vtkNew rectilinearGridToTetrahedra; rectilinearGridToTetrahedra->SetInputData(grid); rectilinearGridToTetrahedra->Update(); vtkSmartPointer ugrid = rectilinearGridToTetrahedra->GetOutput(); // Add scalars to the grid vtkNew scalars; for (int i = 0; i < 8; i++) { scalars->InsertNextValue(0); } ugrid->GetPointData()->SetScalars(scalars); // Volume Rendering Mapper vtkNew mapper; mapper->SetInputData(ugrid); mapper->Update(); // Create the volume vtkSmartPointer volume = vtkSmartPointer::New(); volume->SetMapper(mapper); // Apply a ColorTransferFunction to the volume vtkNew colorTransferFunction; colorTransferFunction->AddRGBPoint(0.0, r, g, b); volume->GetProperty()->SetColor(colorTransferFunction); return volume; } // Creates a cone actor vtkSmartPointer ConeActor_TetrahedraOffscreen(double r, double g, double b) { // Simple cone mapper vtkNew mapper; vtkNew coneSource; coneSource->SetCenter(0.0, 0.0, 0.0); mapper->SetInputConnection(coneSource->GetOutputPort()); // Create the actor vtkSmartPointer actor = vtkSmartPointer::New(); actor->GetProperty()->SetColor(r, g, b); actor->SetMapper(mapper); return actor; } int TestProjectedTetrahedraOffscreen(int argc, char* argv[]) { // Create the props // The red cube volume vtkSmartPointer volume1 = CubeVolume_TetrahedraOffscreen(1, 0, 0); // The blue cube volume vtkSmartPointer volume2 = CubeVolume_TetrahedraOffscreen(0, 0, 1); // The red cone actor vtkSmartPointer actor1 = ConeActor_TetrahedraOffscreen(1, 0, 0); // Translate the blue props by (2,2) vtkNew transform; transform->Translate(2, 2, 0); volume2->SetUserTransform(transform); // Create a renderer, render window, and interactor vtkNew renderer; vtkNew renderWindow; renderWindow->SetMultiSamples(0); renderWindow->AddRenderer(renderer); renderWindow->SetSize(300, 300); vtkNew renderWindowInteractor; renderWindowInteractor->SetRenderWindow(renderWindow); // Render dummy scene on-screen renderWindow->SetOffScreenRendering(false); renderer->SetBackground(1, 1, 1); renderer->AddVolume(volume1); renderer->AddVolume(volume2); renderWindow->Render(); renderer->RemoveVolume(volume1); renderer->RemoveVolume(volume2); // Render off-screen and grab the rendered image renderWindow->SetOffScreenRendering(true); renderer->SetBackground(0.4, 0.8, 0.4); renderer->AddVolume(volume2); renderer->AddActor(actor1); renderWindow->Render(); renderer->ResetCamera(); vtkNew win2image; win2image->SetInput(renderWindow); win2image->Update(); vtkImageData* offScreenImage = win2image->GetOutput(); renderer->RemoveVolume(volume2); renderer->RemoveActor(actor1); renderWindow->SetOffScreenRendering(false); renderWindow->Finalize(); renderWindow->Start(); // Render on-screen a texture map of the off-screen rendered image vtkNew ia; ia->GetMapper()->SetInputData(offScreenImage); renderer->AddActor(ia); renderer->SetBackground(0, 0, 0); renderer->GetActiveCamera()->SetPosition(0, 0, -1); renderer->GetActiveCamera()->SetFocalPoint(0, 0, 1); renderer->GetActiveCamera()->SetViewUp(0, 1, 0); renderer->ResetCamera(); renderWindow->Render(); int retVal = vtkTesting::Test(argc, argv, renderWindow, 20); if (retVal == vtkRegressionTester::DO_INTERACTOR) { renderWindowInteractor->Start(); } return !retVal; }