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