/*========================================================================= Program: Visualization Toolkit Module: TestGaussianBlurPass.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. =========================================================================*/ // This test covers the gaussian blur post-processing render pass. // It renders an actor with a translucent LUT and depth // peeling using the multi renderpass classes. The mapper uses color // interpolation (poor quality). // // The command line arguments are: // -I => run in interactive mode; unless this is used, the program will // not allow interaction and exit #include "vtkTestUtilities.h" #include "vtkRegressionTestImage.h" #include "vtkSmartPointer.h" #include "vtkRenderWindowInteractor.h" #include "vtkRenderWindow.h" #include "vtkOpenGLRenderer.h" #include "vtkActor.h" #include "vtkImageSinusoidSource.h" #include "vtkImageData.h" #include "vtkImageDataGeometryFilter.h" #include "vtkDataSetSurfaceFilter.h" #include "vtkPolyDataMapper.h" #include "vtkLookupTable.h" #include "vtkCamera.h" #include "vtkCameraPass.h" #include "vtkLightsPass.h" #include "vtkSequencePass.h" #include "vtkOpaquePass.h" #include "vtkDepthPeelingPass.h" #include "vtkTranslucentPass.h" #include "vtkVolumetricPass.h" #include "vtkOverlayPass.h" #include "vtkRenderPassCollection.h" #include "vtkGaussianBlurPass.h" #include "vtkConeSource.h" // Make sure to have a valid OpenGL context current on the calling thread // before calling it. Defined in TestGenericVertexAttributesGLSLAlphaBlending. bool MesaHasVTKBug8135(vtkRenderWindow *); int TestGaussianBlurPass(int argc, char* argv[]) { vtkSmartPointer iren= vtkSmartPointer::New(); vtkSmartPointer renWin = vtkSmartPointer::New(); renWin->SetMultiSamples(0); renWin->SetAlphaBitPlanes(1); iren->SetRenderWindow(renWin); vtkSmartPointer renderer = vtkSmartPointer::New(); renWin->AddRenderer(renderer); vtkOpenGLRenderer *glrenderer = vtkOpenGLRenderer::SafeDownCast(renderer); vtkSmartPointer cameraP= vtkSmartPointer::New(); vtkSmartPointer seq= vtkSmartPointer::New(); vtkSmartPointer opaque= vtkSmartPointer::New(); vtkSmartPointer peeling= vtkSmartPointer::New(); peeling->SetMaximumNumberOfPeels(200); peeling->SetOcclusionRatio(0.1); vtkSmartPointer translucent= vtkSmartPointer::New(); peeling->SetTranslucentPass(translucent); vtkSmartPointer volume= vtkSmartPointer::New(); vtkSmartPointer overlay= vtkSmartPointer::New(); vtkSmartPointer lights= vtkSmartPointer::New(); vtkSmartPointer passes= vtkSmartPointer::New(); passes->AddItem(lights); passes->AddItem(opaque); passes->AddItem(peeling); // passes->AddItem(translucent); passes->AddItem(volume); passes->AddItem(overlay); seq->SetPasses(passes); cameraP->SetDelegatePass(seq); vtkSmartPointer blurP= vtkSmartPointer::New(); blurP->SetDelegatePass(cameraP); glrenderer->SetPass(blurP); // renderer->SetPass(cameraP); vtkSmartPointer imageSource= vtkSmartPointer::New(); imageSource->SetWholeExtent(0,9,0,9,0,9); imageSource->SetPeriod(5); imageSource->Update(); vtkImageData *image=imageSource->GetOutput(); double range[2]; image->GetScalarRange(range); vtkSmartPointer surface= vtkSmartPointer::New(); surface->SetInputConnection(imageSource->GetOutputPort()); vtkSmartPointer mapper= vtkSmartPointer::New(); mapper->SetInputConnection(surface->GetOutputPort()); vtkSmartPointer lut= vtkSmartPointer::New(); lut->SetTableRange(range); lut->SetAlphaRange(0.5,0.5); lut->SetHueRange(0.2,0.7); lut->SetNumberOfTableValues(256); lut->Build(); mapper->SetScalarVisibility(1); mapper->SetLookupTable(lut); vtkSmartPointer actor= vtkSmartPointer::New(); renderer->AddActor(actor); actor->SetMapper(mapper); actor->SetVisibility(1); vtkSmartPointer cone= vtkSmartPointer::New(); vtkSmartPointer coneMapper= vtkSmartPointer::New(); coneMapper->SetInputConnection(cone->GetOutputPort()); vtkSmartPointer coneActor= vtkSmartPointer::New(); coneActor->SetMapper(coneMapper); coneActor->SetVisibility(1); renderer->AddActor(coneActor); renderer->SetBackground(0.1,0.3,0.0); renWin->SetSize(400,400); // empty scene during OpenGL detection. actor->SetVisibility(0); coneActor->SetVisibility(0); renWin->Render(); int retVal; if(MesaHasVTKBug8135(renWin)) { // Mesa will crash if version<7.3 cout<<"This version of Mesa would crash. Skip the test."<SetVisibility(1); coneActor->SetVisibility(1); renderer->ResetCamera(); vtkCamera *camera=renderer->GetActiveCamera(); camera->Azimuth(-40.0); camera->Elevation(20.0); renWin->Render(); if(peeling->GetLastRenderingUsedDepthPeeling()) { cout<<"depth peeling was used"<Start(); } } return !retVal; }