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