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 is intended to benchmark render times for the vtkGPURayCastMapper
15 
16 #include "vtkCamera.h"
17 #include "vtkColorTransferFunction.h"
18 #include "vtkGPUVolumeRayCastMapper.h"
19 #include "vtkImageData.h"
20 #include "vtkNew.h"
21 #include "vtkPiecewiseFunction.h"
22 #include "vtkRTAnalyticSource.h"
23 #include "vtkRenderWindow.h"
24 #include "vtkRenderWindowInteractor.h"
25 #include "vtkRenderer.h"
26 #include "vtkTimerLog.h"
27 #include "vtkVolume.h"
28 #include "vtkVolumeProperty.h"
29 #include "vtkXMLImageDataReader.h"
30 
31 #include "vtkRegressionTestImage.h"
32 #include "vtkTestUtilities.h"
33 
34 //----------------------------------------------------------------------------
TestGPURayCastMapperBenchmark(int argc,char * argv[])35 int TestGPURayCastMapperBenchmark(int argc, char* argv[])
36 {
37   cout << "CTEST_FULL_OUTPUT (Avoid ctest truncation of output)" << endl;
38 
39   vtkNew<vtkRTAnalyticSource> wavelet;
40   wavelet->SetWholeExtent(-127, 128,
41                           -127, 128,
42                           -127, 128);
43   wavelet->SetCenter(0.0, 0.0, 0.0);
44 
45   vtkNew<vtkGPUVolumeRayCastMapper> volumeMapper;
46   volumeMapper->SetInputConnection(wavelet->GetOutputPort());
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(900, 900);
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 
83     vtkNew<vtkTimerLog> timer;
84     timer->StartTimer();
85     renderWindow->Render();
86     timer->StopTimer();
87     double firstRender = timer->GetElapsedTime();
88     cerr << "First Render Time: " << firstRender << endl;
89 
90     int numRenders = 20;
91     for (int i = 0; i < numRenders; ++i)
92       {
93       renderer->GetActiveCamera()->Azimuth(1);
94       renderer->GetActiveCamera()->Elevation(1);
95       renderWindow->Render();
96       }
97 
98     timer->StartTimer();
99     numRenders = 100;
100     for (int i = 0; i < numRenders; ++i)
101       {
102       renderer->GetActiveCamera()->Azimuth(1);
103       renderer->GetActiveCamera()->Elevation(1);
104       renderer->GetActiveCamera()->OrthogonalizeViewUp();
105       renderWindow->Render();
106       }
107     timer->StopTimer();
108     double elapsed = timer->GetElapsedTime();
109     cerr << "Interactive Render Time: " << elapsed / numRenders << endl;
110 
111     renderer->GetActiveCamera()->SetPosition(0,0,1);
112     renderer->GetActiveCamera()->SetFocalPoint(0,0,0);
113     renderer->GetActiveCamera()->SetViewUp(0,1,0);
114     renderer->ResetCamera();
115 
116     renderWindow->SetSize(300, 300);
117     renderWindow->Render();
118 
119     iren->Initialize();
120 
121     retVal = vtkRegressionTestImage( renderWindow.GetPointer() );
122     if( retVal == vtkRegressionTester::DO_INTERACTOR)
123       {
124       iren->Start();
125       }
126     }
127   else
128     {
129     retVal = vtkTesting::PASSED;
130     cout << "Required extensions not supported." << endl;
131     }
132 
133   return !((retVal == vtkTesting::PASSED) ||
134            (retVal == vtkTesting::DO_INTERACTOR));
135 }
136