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 "vtkRenderer.h"
19 #include "vtkRenderWindow.h"
20 #include "vtkRenderWindowInteractor.h"
21 #include "vtkStructuredPointsReader.h"
22 #include "vtkSLCReader.h"
23 #include "vtkStructuredPoints.h"
24 #include "vtkPiecewiseFunction.h"
25 #include "vtkColorTransferFunction.h"
26 #include "vtkVolumeProperty.h"
27 #include "vtkVolume.h"
28 #include "vtkContourFilter.h"
29 #include "vtkPolyDataMapper.h"
30 #include "vtkActor.h"
31 #include "vtkCamera.h"
32 #include "vtkRegressionTestImage.h"
33 #include "vtkTestUtilities.h"
34 #include "vtkTransform.h"
35 #include "vtkCullerCollection.h"
36 #include "vtkCuller.h"
37 #include "vtkFrustumCoverageCuller.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
67 = vtkColorTransferFunction::New();
68 colorTransferFunction->AddRGBPoint( 0.0,0.0,0.0,0.0);
69 colorTransferFunction->AddRGBPoint( 64.0,1.0,0.0,0.0);
70 colorTransferFunction->AddRGBPoint(128.0,0.0,0.0,1.0);
71 colorTransferFunction->AddRGBPoint(192.0,0.0,1.0,0.0);
72 colorTransferFunction->AddRGBPoint(255.0,0.0,0.2,0.0);
73
74 // The property describes how the data will look.
75 vtkVolumeProperty *volumeProperty = vtkVolumeProperty::New();
76 volumeProperty->SetColor(colorTransferFunction);
77 colorTransferFunction->Delete();
78 volumeProperty->SetScalarOpacity(opacityTransferFunction);
79 opacityTransferFunction->Delete();
80 volumeProperty->ShadeOn(); //
81 volumeProperty->SetInterpolationTypeToLinear();
82
83
84 ren1->SetBackground(0.1,0.2,0.4);
85 renWin->SetSize(600, 300);
86 renWin->Render();
87 ren1->ResetCamera();
88 renWin->Render();
89
90 vtkGPUVolumeRayCastMapper *volumeMapper[2][4];
91 int i=0;
92 while(i<2)
93 {
94 int j=0;
95 while(j<4)
96 {
97 volumeMapper[i][j]= vtkGPUVolumeRayCastMapper::New();
98 volumeMapper[i][j]->SetInputConnection(reader->GetOutputPort());
99 volumeMapper[i][j]->SetSampleDistance(0.25);
100 volumeMapper[i][j]->CroppingOn();
101 volumeMapper[i][j]->SetAutoAdjustSampleDistances(0);
102 volumeMapper[i][j]->SetCroppingRegionPlanes(17,33,17,33,17,33);
103
104 vtkVolume *volume=vtkVolume::New();
105 volume->SetMapper(volumeMapper[i][j]);
106 volumeMapper[i][j]->Delete();
107 volume->SetProperty(volumeProperty);
108
109 vtkTransform *userMatrix=vtkTransform::New();
110 userMatrix->PostMultiply();
111 userMatrix->Identity();
112 userMatrix->Translate(-25,-25,-25);
113
114 if(i==0)
115 {
116 userMatrix->RotateX(j*90+20);
117 userMatrix->RotateY(20);
118 }
119 else
120 {
121 userMatrix->RotateX(20);
122 userMatrix->RotateY(j*90+20);
123 }
124
125 userMatrix->Translate(j*55+25,i*55+25,0);
126 volume->SetUserTransform(userMatrix);
127 userMatrix->Delete();
128 // if(i==1 && j==0)
129 // {
130 ren1->AddViewProp(volume);
131 // }
132 volume->Delete();
133 ++j;
134 }
135 ++i;
136 }
137 reader->Delete();
138 volumeProperty->Delete();
139
140 int I=1;
141 int J=0;
142
143 volumeMapper[0][0]->SetCroppingRegionFlagsToSubVolume();
144 volumeMapper[0][1]->SetCroppingRegionFlagsToCross();
145 volumeMapper[0][2]->SetCroppingRegionFlagsToInvertedCross();
146 volumeMapper[0][3]->SetCroppingRegionFlags(24600);
147
148 //
149 volumeMapper[1][0]->SetCroppingRegionFlagsToFence();
150 volumeMapper[1][1]->SetCroppingRegionFlagsToInvertedFence();
151 volumeMapper[1][2]->SetCroppingRegionFlags(1);
152 volumeMapper[1][3]->SetCroppingRegionFlags(67117057);
153 ren1->GetCullers()->InitTraversal();
154 vtkCuller *culler=ren1->GetCullers()->GetNextItem();
155
156 vtkFrustumCoverageCuller *fc=vtkFrustumCoverageCuller::SafeDownCast(culler);
157 if(fc!=0)
158 {
159 fc->SetSortingStyleToBackToFront();
160 }
161 else
162 {
163 cout<<"culler is not a vtkFrustumCoverageCuller"<<endl;
164 }
165
166 // First test if mapper is supported
167
168 int valid=volumeMapper[I][J]->IsRenderSupported(renWin,volumeProperty);
169
170 int retVal;
171 if(valid)
172 {
173 ren1->ResetCamera();
174 ren1->GetActiveCamera()->Zoom(3.0);
175 // ren1->GetActiveCamera()->SetParallelProjection(1);
176 renWin->Render();
177
178 retVal = vtkTesting::Test(argc, argv, renWin, 75);
179 if (retVal == vtkRegressionTester::DO_INTERACTOR)
180 {
181 iren->Start();
182 }
183 }
184 else
185 {
186 retVal=vtkTesting::PASSED;
187 cout << "Required extensions not supported." << endl;
188 }
189
190 // Clean up.
191 iren->Delete();
192
193 if ((retVal == vtkTesting::PASSED) || (retVal == vtkTesting::DO_INTERACTOR))
194 {
195 return 0;
196 }
197 else
198 {
199 return 1;
200 }
201 }
202