1 /*=========================================================================
2
3 Program: Visualization Toolkit
4 Module: TestGPURayCastCropping.cxx
5
6 Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7 All rights reserved.
8 See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9
10 This software is distributed WITHOUT ANY WARRANTY; without even
11 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12 PURPOSE. See the above copyright notice for more information.
13
14 =========================================================================*/
15
16 #include "vtkGPUVolumeRayCastMapper.h"
17
18 #include "vtkActor.h"
19 #include "vtkCamera.h"
20 #include "vtkColorTransferFunction.h"
21 #include "vtkContourFilter.h"
22 #include "vtkCuller.h"
23 #include "vtkCullerCollection.h"
24 #include "vtkFrustumCoverageCuller.h"
25 #include "vtkPiecewiseFunction.h"
26 #include "vtkPolyDataMapper.h"
27 #include "vtkRegressionTestImage.h"
28 #include "vtkRenderWindow.h"
29 #include "vtkRenderWindowInteractor.h"
30 #include "vtkRenderer.h"
31 #include "vtkSLCReader.h"
32 #include "vtkStructuredPoints.h"
33 #include "vtkStructuredPointsReader.h"
34 #include "vtkTestUtilities.h"
35 #include "vtkTransform.h"
36 #include "vtkVolume.h"
37 #include "vtkVolumeProperty.h"
38
TestGPURayCastCropping(int argc,char * argv[])39 int TestGPURayCastCropping(int argc, char* argv[])
40 {
41 // Create the standard renderer, render window, and interactor.
42 vtkRenderer* ren1 = vtkRenderer::New();
43 vtkRenderWindow* renWin = vtkRenderWindow::New();
44 renWin->AddRenderer(ren1);
45 ren1->Delete();
46 vtkRenderWindowInteractor* iren = vtkRenderWindowInteractor::New();
47 iren->SetRenderWindow(renWin);
48 renWin->Delete();
49 iren->SetDesiredUpdateRate(3);
50
51 // Create the reader for the data.
52 // This is the data that will be volume rendered.
53 vtkSLCReader* reader = vtkSLCReader::New();
54 char* cfname = vtkTestUtilities::ExpandDataFileName(argc, argv, "Data/sphere.slc");
55 reader->SetFileName(cfname);
56 delete[] cfname;
57
58 // Create transfer mapping scalar value to opacity.
59 vtkPiecewiseFunction* opacityTransferFunction = vtkPiecewiseFunction::New();
60 opacityTransferFunction->AddPoint(0.0, 0.0);
61 opacityTransferFunction->AddPoint(30.0, 0.0);
62 opacityTransferFunction->AddPoint(80.0, 0.5);
63 opacityTransferFunction->AddPoint(255.0, 0.5);
64
65 // Create transfer mapping scalar value to color.
66 vtkColorTransferFunction* colorTransferFunction = vtkColorTransferFunction::New();
67 colorTransferFunction->AddRGBPoint(0.0, 0.0, 0.0, 0.0);
68 colorTransferFunction->AddRGBPoint(64.0, 1.0, 0.0, 0.0);
69 colorTransferFunction->AddRGBPoint(128.0, 0.0, 0.0, 1.0);
70 colorTransferFunction->AddRGBPoint(192.0, 0.0, 1.0, 0.0);
71 colorTransferFunction->AddRGBPoint(255.0, 0.0, 0.2, 0.0);
72
73 // The property describes how the data will look.
74 vtkVolumeProperty* volumeProperty = vtkVolumeProperty::New();
75 volumeProperty->SetColor(colorTransferFunction);
76 colorTransferFunction->Delete();
77 volumeProperty->SetScalarOpacity(opacityTransferFunction);
78 opacityTransferFunction->Delete();
79 volumeProperty->ShadeOn(); //
80 volumeProperty->SetInterpolationTypeToLinear();
81
82 ren1->SetBackground(0.1, 0.2, 0.4);
83 renWin->SetSize(600, 300);
84 renWin->Render();
85 ren1->ResetCamera();
86 renWin->Render();
87
88 vtkGPUVolumeRayCastMapper* volumeMapper[2][4];
89 int i = 0;
90 while (i < 2)
91 {
92 int j = 0;
93 while (j < 4)
94 {
95 volumeMapper[i][j] = vtkGPUVolumeRayCastMapper::New();
96 volumeMapper[i][j]->SetInputConnection(reader->GetOutputPort());
97 volumeMapper[i][j]->SetSampleDistance(0.25);
98 volumeMapper[i][j]->CroppingOn();
99 volumeMapper[i][j]->SetAutoAdjustSampleDistances(0);
100 volumeMapper[i][j]->SetCroppingRegionPlanes(17, 33, 17, 33, 17, 33);
101
102 vtkVolume* volume = vtkVolume::New();
103 volume->SetMapper(volumeMapper[i][j]);
104 volumeMapper[i][j]->Delete();
105 volume->SetProperty(volumeProperty);
106
107 vtkTransform* userMatrix = vtkTransform::New();
108 userMatrix->PostMultiply();
109 userMatrix->Identity();
110 userMatrix->Translate(-25, -25, -25);
111
112 if (i == 0)
113 {
114 userMatrix->RotateX(j * 90 + 20);
115 userMatrix->RotateY(20);
116 }
117 else
118 {
119 userMatrix->RotateX(20);
120 userMatrix->RotateY(j * 90 + 20);
121 }
122
123 userMatrix->Translate(j * 55 + 25, i * 55 + 25, 0);
124 volume->SetUserTransform(userMatrix);
125 userMatrix->Delete();
126 // if(i==1 && j==0)
127 // {
128 ren1->AddViewProp(volume);
129 // }
130 volume->Delete();
131 ++j;
132 }
133 ++i;
134 }
135 reader->Delete();
136 volumeProperty->Delete();
137
138 int I = 1;
139 int J = 0;
140
141 volumeMapper[0][0]->SetCroppingRegionFlagsToSubVolume();
142 volumeMapper[0][1]->SetCroppingRegionFlagsToCross();
143 volumeMapper[0][2]->SetCroppingRegionFlagsToInvertedCross();
144 volumeMapper[0][3]->SetCroppingRegionFlags(24600);
145
146 //
147 volumeMapper[1][0]->SetCroppingRegionFlagsToFence();
148 volumeMapper[1][1]->SetCroppingRegionFlagsToInvertedFence();
149 volumeMapper[1][2]->SetCroppingRegionFlags(1);
150 volumeMapper[1][3]->SetCroppingRegionFlags(67117057);
151 ren1->GetCullers()->InitTraversal();
152 vtkCuller* culler = ren1->GetCullers()->GetNextItem();
153
154 vtkFrustumCoverageCuller* fc = vtkFrustumCoverageCuller::SafeDownCast(culler);
155 if (fc != nullptr)
156 {
157 fc->SetSortingStyleToBackToFront();
158 }
159 else
160 {
161 cout << "culler is not a vtkFrustumCoverageCuller" << endl;
162 }
163
164 // First test if mapper is supported
165
166 int valid = volumeMapper[I][J]->IsRenderSupported(renWin, volumeProperty);
167
168 int retVal;
169 if (valid)
170 {
171 ren1->ResetCamera();
172 ren1->GetActiveCamera()->Zoom(3.0);
173 // ren1->GetActiveCamera()->SetParallelProjection(1);
174 renWin->Render();
175
176 retVal = vtkTesting::Test(argc, argv, renWin, 75);
177 if (retVal == vtkRegressionTester::DO_INTERACTOR)
178 {
179 iren->Start();
180 }
181 }
182 else
183 {
184 retVal = vtkTesting::PASSED;
185 cout << "Required extensions not supported." << endl;
186 }
187
188 // Clean up.
189 iren->Delete();
190
191 if ((retVal == vtkTesting::PASSED) || (retVal == vtkTesting::DO_INTERACTOR))
192 {
193 return 0;
194 }
195 else
196 {
197 return 1;
198 }
199 }
200