1 /*=========================================================================
2 
3   Program:   Visualization Toolkit
4 
5   Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
6   All rights reserved.
7   See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
8 
9      This software is distributed WITHOUT ANY WARRANTY; without even
10      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11      PURPOSE.  See the above copyright notice for more information.
12 
13 =========================================================================*/
14 // This test checks the effects of changing sample distance on the GPURayCast
15 // volume mapper
16 
17 #include "vtkCamera.h"
18 #include "vtkColorTransferFunction.h"
19 #include "vtkGPUVolumeRayCastMapper.h"
20 #include "vtkImageData.h"
21 #include "vtkNew.h"
22 #include "vtkPiecewiseFunction.h"
23 #include "vtkRTAnalyticSource.h"
24 #include "vtkRenderWindow.h"
25 #include "vtkRenderWindowInteractor.h"
26 #include "vtkRenderer.h"
27 #include "vtkVolume.h"
28 #include "vtkVolumeProperty.h"
29 #include "vtkXMLImageDataReader.h"
30 
31 #include "vtkRegressionTestImage.h"
32 #include "vtkTestUtilities.h"
33 #include "vtkOSPRayPass.h"
34 
35 
36 //----------------------------------------------------------------------------
TestGPURayCastMapperSampleDistance(int argc,char * argv[])37 int TestGPURayCastMapperSampleDistance(int argc, char* argv[])
38 {
39   bool useOSP = true;
40   for (int i = 0; i < argc; i++)
41   {
42     if (!strcmp(argv[i], "-GL"))
43     {
44       cerr << "GL" << endl;
45       useOSP = false;
46     }
47   }
48   vtkNew<vtkRTAnalyticSource> wavelet;
49   wavelet->SetWholeExtent(-127, 128,
50                           -127, 128,
51                           -127, 128);
52   wavelet->SetCenter(0.0, 0.0, 0.0);
53 
54   vtkNew<vtkGPUVolumeRayCastMapper> volumeMapper;
55   volumeMapper->SetInputConnection(wavelet->GetOutputPort());
56   volumeMapper->SetAutoAdjustSampleDistances(0);
57   volumeMapper->SetSampleDistance(20);
58 
59   vtkNew<vtkVolumeProperty> volumeProperty;
60   vtkNew<vtkColorTransferFunction> ctf;
61   ctf->AddRGBPoint(37.3531, 0.2, 0.29, 1);
62   ctf->AddRGBPoint(157.091, 0.87, 0.87, 0.87);
63   ctf->AddRGBPoint(276.829, 0.7, 0.015, 0.15);
64 
65   vtkNew<vtkPiecewiseFunction> pwf;
66   pwf->AddPoint(37.3531, 0.0);
67   pwf->AddPoint(276.829, 1.0);
68 
69   volumeProperty->SetColor(ctf);
70   volumeProperty->SetScalarOpacity(pwf);
71 
72   vtkNew<vtkVolume> volume;
73   volume->SetMapper(volumeMapper);
74   volume->SetProperty(volumeProperty);
75 
76   vtkNew<vtkRenderWindow> renderWindow;
77   renderWindow->SetSize(300, 300);
78   renderWindow->Render(); // make sure we have an OpenGL context.
79 
80   vtkNew<vtkRenderer> renderer;
81   renderer->AddVolume(volume);
82   renderer->ResetCamera();
83   renderWindow->AddRenderer(renderer);
84 
85 // Attach OSPRay render pass
86   vtkNew<vtkOSPRayPass> osprayPass;
87   if (useOSP)
88   {
89     renderer->SetPass(osprayPass);
90   }
91 
92   vtkNew<vtkRenderWindowInteractor> iren;
93   iren->SetRenderWindow(renderWindow);
94 
95   int valid = volumeMapper->IsRenderSupported(renderWindow,
96   volumeProperty);
97 
98   int retVal;
99   if (valid)
100   {
101     renderWindow->Render();
102     iren->Initialize();
103 
104     retVal = vtkRegressionTestImage( renderWindow );
105     if( retVal == vtkRegressionTester::DO_INTERACTOR)
106     {
107       iren->Start();
108     }
109   }
110   else
111   {
112     retVal = vtkTesting::PASSED;
113     cout << "Required extensions not supported." << endl;
114   }
115 
116   return !((retVal == vtkTesting::PASSED) ||
117            (retVal == vtkTesting::DO_INTERACTOR));
118 }
119