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 
34 //----------------------------------------------------------------------------
TestGPURayCastMapperSampleDistance(int argc,char * argv[])35 int TestGPURayCastMapperSampleDistance(int argc, char* argv[])
36 {
37   vtkNew<vtkRTAnalyticSource> wavelet;
38   wavelet->SetWholeExtent(-127, 128,
39                           -127, 128,
40                           -127, 128);
41   wavelet->SetCenter(0.0, 0.0, 0.0);
42 
43   vtkNew<vtkGPUVolumeRayCastMapper> volumeMapper;
44   volumeMapper->SetInputConnection(wavelet->GetOutputPort());
45   volumeMapper->SetAutoAdjustSampleDistances(0);
46   volumeMapper->SetSampleDistance(20);
47 
48   vtkNew<vtkVolumeProperty> volumeProperty;
49   vtkNew<vtkColorTransferFunction> ctf;
50   ctf->AddRGBPoint(37.3531, 0.2, 0.29, 1);
51   ctf->AddRGBPoint(157.091, 0.87, 0.87, 0.87);
52   ctf->AddRGBPoint(276.829, 0.7, 0.015, 0.15);
53 
54   vtkNew<vtkPiecewiseFunction> pwf;
55   pwf->AddPoint(37.3531, 0.0);
56   pwf->AddPoint(276.829, 1.0);
57 
58   volumeProperty->SetColor(ctf.GetPointer());
59   volumeProperty->SetScalarOpacity(pwf.GetPointer());
60 
61   vtkNew<vtkVolume> volume;
62   volume->SetMapper(volumeMapper.GetPointer());
63   volume->SetProperty(volumeProperty.GetPointer());
64 
65   vtkNew<vtkRenderWindow> renderWindow;
66   renderWindow->SetSize(300, 300);
67   renderWindow->Render(); // make sure we have an OpenGL context.
68 
69   vtkNew<vtkRenderer> renderer;
70   renderer->AddVolume(volume.GetPointer());
71   renderer->ResetCamera();
72   renderWindow->AddRenderer(renderer.GetPointer());
73 
74   vtkNew<vtkRenderWindowInteractor> iren;
75   iren->SetRenderWindow(renderWindow.GetPointer());
76 
77   int valid = volumeMapper->IsRenderSupported(renderWindow.GetPointer(),
78                                               volumeProperty.GetPointer());
79   int retVal;
80   if (valid)
81     {
82     renderWindow->Render();
83     iren->Initialize();
84 
85     retVal = vtkRegressionTestImage( renderWindow.GetPointer() );
86     if( retVal == vtkRegressionTester::DO_INTERACTOR)
87       {
88       iren->Start();
89       }
90     }
91   else
92     {
93     retVal = vtkTesting::PASSED;
94     cout << "Required extensions not supported." << endl;
95     }
96 
97   return !((retVal == vtkTesting::PASSED) ||
98            (retVal == vtkTesting::DO_INTERACTOR));
99 }
100