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 "vtkRegressionTestImage.h"
27 #include "vtkRenderer.h"
28 #include "vtkRenderWindow.h"
29 #include "vtkRenderWindowInteractor.h"
30 #include "vtkQuadRotationalExtrusionFilter.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 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 inMesh->GetMetaData( static_cast<unsigned>( 1 ) )->Set( vtkCompositeDataSet::NAME(), "Block 1" );
57 inMesh->SetBlock( 1, reader1->GetOutput() );
58
59 // Create 3/4 of a cylinder by rotational extrusion
60 vtkNew<vtkQuadRotationalExtrusionFilter> sweeper;
61 sweeper->SetResolution( 18 );
62 sweeper->SetInputData( inMesh.GetPointer() );
63 sweeper->SetAxisToX();
64 sweeper->SetDefaultAngle( 270 );
65 sweeper->AddPerBlockAngle( 1, 90. );
66 sweeper->AddPerBlockAngle( 2, 45.) ;
67
68 // Turn composite output into single polydata
69 vtkNew<vtkCompositeDataGeometryFilter> outMesh;
70 outMesh->SetInputConnection( sweeper->GetOutputPort() );
71
72 // Create normals for smooth rendering
73 vtkNew<vtkPolyDataNormals> normals;
74 normals->SetInputConnection( outMesh->GetOutputPort() );
75
76 // Create mapper for surface representation of whole mesh
77 vtkNew<vtkPolyDataMapper> outMeshMapper;
78 outMeshMapper->SetInputConnection( normals->GetOutputPort() );
79 outMeshMapper->SetResolveCoincidentTopologyPolygonOffsetParameters( 0., 1 );
80 outMeshMapper->SetResolveCoincidentTopologyToPolygonOffset();
81
82 // Create actor for surface representation of whole mesh
83 vtkNew<vtkActor> outMeshActor;
84 outMeshActor->SetMapper( outMeshMapper.GetPointer() );
85 outMeshActor->GetProperty()->SetRepresentationToSurface();
86 outMeshActor->GetProperty()->SetInterpolationToGouraud();
87 outMeshActor->GetProperty()->SetColor( .9, .9, .9 );
88
89 // Retrieve polydata blocks output by sweeper
90 sweeper->Update();
91 vtkMultiBlockDataSet* outMeshMB = sweeper->GetOutput();
92 vtkPolyData* outMesh0 = vtkPolyData::SafeDownCast( outMeshMB->GetBlock( 0 ) );
93 vtkPolyData* outMesh1 = vtkPolyData::SafeDownCast( outMeshMB->GetBlock( 1 ) );
94
95 // Create mapper for wireframe representation of block 0
96 vtkNew<vtkPolyDataMapper> outBlockMapper0;
97 outBlockMapper0->SetInputData( outMesh0 );
98 outBlockMapper0->SetResolveCoincidentTopologyPolygonOffsetParameters( 1., 1 );
99 outBlockMapper0->SetResolveCoincidentTopologyToPolygonOffset();
100
101 // Create actor for wireframe representation of block 0
102 vtkNew<vtkActor> outBlockActor0;
103 outBlockActor0->SetMapper( outBlockMapper0.GetPointer() );
104 outBlockActor0->GetProperty()->SetRepresentationToWireframe();
105 outBlockActor0->GetProperty()->SetColor( .9, 0., 0.);
106 outBlockActor0->GetProperty()->SetAmbient( 1. );
107 outBlockActor0->GetProperty()->SetDiffuse( 0. );
108 outBlockActor0->GetProperty()->SetSpecular( 0. );
109
110 // Create mapper for wireframe representation of block 1
111 vtkNew<vtkPolyDataMapper> outBlockMapper1;
112 outBlockMapper1->SetInputData( outMesh1 );
113 outBlockMapper1->SetResolveCoincidentTopologyPolygonOffsetParameters( 1., 1 );
114 outBlockMapper1->SetResolveCoincidentTopologyToPolygonOffset();
115
116 // Create actor for wireframe representation of block 1
117 vtkNew<vtkActor> outBlockActor1;
118 outBlockActor1->SetMapper( outBlockMapper1.GetPointer() );
119 outBlockActor1->GetProperty()->SetRepresentationToWireframe();
120 outBlockActor1->GetProperty()->SetColor( 0., .9, 0.);
121 outBlockActor1->GetProperty()->SetAmbient( 1. );
122 outBlockActor1->GetProperty()->SetDiffuse( 0. );
123 outBlockActor1->GetProperty()->SetSpecular( 0. );
124
125 // Create a renderer, add actors to it
126 vtkNew<vtkRenderer> ren1;
127 ren1->AddActor( outMeshActor.GetPointer() );
128 ren1->AddActor( outBlockActor0.GetPointer() );
129 ren1->AddActor( outBlockActor1.GetPointer() );
130 ren1->SetBackground( 1., 1., 1. );
131
132 // Create a renderWindow
133 vtkNew<vtkRenderWindow> renWin;
134 renWin->AddRenderer( ren1.GetPointer() );
135 renWin->SetSize( 400, 400 );
136 renWin->SetMultiSamples( 0 );
137
138 // Create a good view angle
139 vtkNew<vtkCamera> camera;
140 //camera->SetClippingRange( 0.576398, 28.8199 );
141 camera->SetFocalPoint( 36.640094041788934, 0.3387609170199118, 1.2087523663629445 );
142 camera->SetPosition( 37.77735939083618, 0.42739828159854326, 2.988046512725565 );
143 camera->SetViewUp( -0.40432906992858864, 0.8891923825021084, 0.21413759621072337 );
144 camera->SetViewAngle( 30. );
145 ren1->SetActiveCamera( camera.GetPointer() );
146
147 // Create interactor
148 vtkNew<vtkRenderWindowInteractor> iren;
149 iren->SetRenderWindow( renWin.GetPointer() );
150
151 // Render and test
152 renWin->Render();
153
154 int retVal = vtkRegressionTestImage( renWin.GetPointer() );
155 if ( retVal == vtkRegressionTester::DO_INTERACTOR )
156 {
157 iren->Start();
158 }
159
160 return !retVal;
161 }
162