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