1 /*=========================================================================
2 
3   Program:   Visualization Toolkit
4   Module:    TestQuadRotationalExtrusionMultiBlock.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 // .SECTION Thanks
16 // This test was written by Philippe Pebay, Kitware SAS 2011
17 
18 #include "vtkCamera.h"
19 #include "vtkCompositeDataGeometryFilter.h"
20 #include "vtkInformation.h"
21 #include "vtkMultiBlockDataSet.h"
22 #include "vtkNew.h"
23 #include "vtkPolyDataMapper.h"
24 #include "vtkPolyDataNormals.h"
25 #include "vtkProperty.h"
26 #include "vtkQuadRotationalExtrusionFilter.h"
27 #include "vtkRegressionTestImage.h"
28 #include "vtkRenderWindow.h"
29 #include "vtkRenderWindowInteractor.h"
30 #include "vtkRenderer.h"
31 #include "vtkTestUtilities.h"
32 #include "vtkXMLPolyDataReader.h"
33 
34 //------------------------------------------------------------------------------
TestQuadRotationalExtrusionMultiBlock(int argc,char * argv[])35 int TestQuadRotationalExtrusionMultiBlock(int argc, char* argv[])
36 {
37   // Read block 0 of 2D polygonal input mesh
38   char* fName0 = vtkTestUtilities::ExpandDataFileName(argc, argv, "Data/SemiDisk/SemiDisk-0.vtp");
39   vtkNew<vtkXMLPolyDataReader> reader0;
40   reader0->SetFileName(fName0);
41   reader0->Update();
42   delete[] fName0;
43 
44   // Read block 1 of 2D polygonal input mesh
45   char* fName1 = vtkTestUtilities::ExpandDataFileName(argc, argv, "Data/SemiDisk/SemiDisk-1.vtp");
46   vtkNew<vtkXMLPolyDataReader> reader1;
47   reader1->SetFileName(fName1);
48   reader1->Update();
49   delete[] fName1;
50 
51   // Create multi-block data set tree for quad-based sweep
52   vtkNew<vtkMultiBlockDataSet> inMesh;
53   inMesh->SetNumberOfBlocks(2);
54   inMesh->GetMetaData(static_cast<unsigned>(0))->Set(vtkCompositeDataSet::NAME(), "Block 0");
55   inMesh->SetBlock(0, reader0->GetOutput());
56   vtkNew<vtkMultiBlockDataSet> inMesh2;
57   inMesh->SetBlock(1, inMesh2);
58   inMesh2->SetNumberOfBlocks(1);
59   inMesh2->GetMetaData(static_cast<unsigned>(0))->Set(vtkCompositeDataSet::NAME(), "Block 1");
60   inMesh2->SetBlock(0, reader1->GetOutput());
61 
62   // Create 3/4 of a cylinder by rotational extrusion
63   vtkNew<vtkQuadRotationalExtrusionFilter> sweeper;
64   sweeper->SetResolution(18);
65   sweeper->SetInputData(inMesh);
66   sweeper->SetAxisToX();
67   sweeper->SetDefaultAngle(270);
68   sweeper->AddPerBlockAngle(1, 90.);
69   sweeper->AddPerBlockAngle(3, 45.);
70 
71   // Turn composite output into single polydata
72   vtkNew<vtkCompositeDataGeometryFilter> outMesh;
73   outMesh->SetInputConnection(sweeper->GetOutputPort());
74 
75   // Create normals for smooth rendering
76   vtkNew<vtkPolyDataNormals> normals;
77   normals->SetInputConnection(outMesh->GetOutputPort());
78 
79   // Create mapper for surface representation of whole mesh
80   vtkNew<vtkPolyDataMapper> outMeshMapper;
81   outMeshMapper->SetInputConnection(normals->GetOutputPort());
82   outMeshMapper->SetResolveCoincidentTopologyToPolygonOffset();
83 
84   // Create actor for surface representation of whole mesh
85   vtkNew<vtkActor> outMeshActor;
86   outMeshActor->SetMapper(outMeshMapper);
87   outMeshActor->GetProperty()->SetRepresentationToSurface();
88   outMeshActor->GetProperty()->SetInterpolationToGouraud();
89   outMeshActor->GetProperty()->SetColor(.9, .9, .9);
90 
91   // Retrieve polydata blocks output by sweeper
92   sweeper->Update();
93   vtkMultiBlockDataSet* outMeshMB = sweeper->GetOutput();
94   vtkPolyData* outMesh0 = vtkPolyData::SafeDownCast(outMeshMB->GetBlock(0));
95   vtkMultiBlockDataSet* outMeshMB2 = vtkMultiBlockDataSet::SafeDownCast(outMeshMB->GetBlock(1));
96   vtkPolyData* outMesh1 = vtkPolyData::SafeDownCast(outMeshMB2->GetBlock(0));
97 
98   // Create mapper for wireframe representation of block 0
99   vtkNew<vtkPolyDataMapper> outBlockMapper0;
100   outBlockMapper0->SetInputData(outMesh0);
101   outBlockMapper0->SetResolveCoincidentTopologyToPolygonOffset();
102 
103   // Create actor for wireframe representation of block 0
104   vtkNew<vtkActor> outBlockActor0;
105   outBlockActor0->SetMapper(outBlockMapper0);
106   outBlockActor0->GetProperty()->SetRepresentationToWireframe();
107   outBlockActor0->GetProperty()->SetColor(.9, 0., 0.);
108   outBlockActor0->GetProperty()->SetAmbient(1.);
109   outBlockActor0->GetProperty()->SetDiffuse(0.);
110   outBlockActor0->GetProperty()->SetSpecular(0.);
111 
112   // Create mapper for wireframe representation of block 1
113   vtkNew<vtkPolyDataMapper> outBlockMapper1;
114   outBlockMapper1->SetInputData(outMesh1);
115   outBlockMapper1->SetResolveCoincidentTopologyToPolygonOffset();
116 
117   // Create actor for wireframe representation of block 1
118   vtkNew<vtkActor> outBlockActor1;
119   outBlockActor1->SetMapper(outBlockMapper1);
120   outBlockActor1->GetProperty()->SetRepresentationToWireframe();
121   outBlockActor1->GetProperty()->SetColor(0., .9, 0.);
122   outBlockActor1->GetProperty()->SetAmbient(1.);
123   outBlockActor1->GetProperty()->SetDiffuse(0.);
124   outBlockActor1->GetProperty()->SetSpecular(0.);
125 
126   // Create a renderer, add actors to it
127   vtkNew<vtkRenderer> ren1;
128   ren1->AddActor(outMeshActor);
129   ren1->AddActor(outBlockActor0);
130   ren1->AddActor(outBlockActor1);
131   ren1->SetBackground(1., 1., 1.);
132 
133   // Create a renderWindow
134   vtkNew<vtkRenderWindow> renWin;
135   renWin->AddRenderer(ren1);
136   renWin->SetSize(400, 400);
137   renWin->SetMultiSamples(0);
138 
139   // Create a good view angle
140   vtkNew<vtkCamera> camera;
141   // camera->SetClippingRange( 0.576398, 28.8199 );
142   camera->SetFocalPoint(36.640094041788934, 0.3387609170199118, 1.2087523663629445);
143   camera->SetPosition(37.77735939083618, 0.42739828159854326, 2.988046512725565);
144   camera->SetViewUp(-0.40432906992858864, 0.8891923825021084, 0.21413759621072337);
145   camera->SetViewAngle(30.);
146   ren1->SetActiveCamera(camera);
147   ren1->ResetCameraClippingRange();
148 
149   // Create interactor
150   vtkNew<vtkRenderWindowInteractor> iren;
151   iren->SetRenderWindow(renWin);
152 
153   // Render and test
154   renWin->Render();
155 
156   int retVal = vtkRegressionTestImage(renWin);
157   if (retVal == vtkRegressionTester::DO_INTERACTOR)
158   {
159     iren->Start();
160   }
161 
162   return !retVal;
163 }
164