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