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