1 /*=========================================================================
2 
3   Program:   Visualization Toolkit
4 
5   Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
6   All rights reserved.
7   See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
8 
9      This software is distributed WITHOUT ANY WARRANTY; without even
10      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11      PURPOSE.  See the above copyright notice for more information.
12 
13 =========================================================================*/
14 
15 #include "vtkRegressionTestImage.h"
16 #include "vtkTestUtilities.h"
17 
18 #include "vtkActor.h"
19 #include "vtkCamera.h"
20 #include "vtkExecutive.h"
21 #include "vtkInformation.h"
22 #include "vtkMolecule.h"
23 #include "vtkMoleculeMapper.h"
24 #include "vtkNew.h"
25 #include "vtkRenderWindow.h"
26 #include "vtkRenderWindowInteractor.h"
27 #include "vtkRenderer.h"
28 #include "vtkStreamingDemandDrivenPipeline.h"
29 #include "vtkVASPAnimationReader.h"
30 
TestVASPAnimationReader(int argc,char * argv[])31 int TestVASPAnimationReader(int argc, char* argv[])
32 {
33   if (argc < 2)
34   {
35     std::cerr << "Missing test file argument." << std::endl;
36     return EXIT_FAILURE;
37   }
38 
39   std::string fname(argv[1]);
40 
41   vtkNew<vtkVASPAnimationReader> reader;
42   reader->SetFileName(fname.c_str());
43 
44   reader->UpdateInformation();
45   vtkInformation* outInfo = reader->GetExecutive()->GetOutputInformation(0);
46   double* times = outInfo->Get(vtkStreamingDemandDrivenPipeline::TIME_STEPS());
47   int nTimes = outInfo->Length(vtkStreamingDemandDrivenPipeline::TIME_STEPS());
48   if (nTimes < 8)
49   {
50     std::cerr << "Need at least 8 timesteps, only " << nTimes << " found.\n";
51     return EXIT_FAILURE;
52   }
53 
54   // Show different time steps in each renderer:
55   vtkNew<vtkRenderer> rens[4];
56   rens[0]->SetViewport(0.0, 0.5, 0.5, 1.0);
57   rens[1]->SetViewport(0.5, 0.5, 1.0, 1.0);
58   rens[2]->SetViewport(0.0, 0.0, 0.5, 0.5);
59   rens[3]->SetViewport(0.5, 0.0, 1.0, 0.5);
60 
61   vtkNew<vtkMoleculeMapper> mappers[4];
62   vtkNew<vtkActor> actors[4];
63   vtkNew<vtkRenderWindow> win;
64   for (size_t i = 0; i < 4; ++i)
65   {
66     // Render different timestamps for each:
67     reader->UpdateTimeStep(times[2 * i]);
68     vtkNew<vtkMolecule> mol;
69     mol->ShallowCopy(reader->GetOutput());
70     mappers[i]->SetInputData(mol);
71 
72     // Rendering setup:
73     mappers[i]->UseBallAndStickSettings();
74     mappers[i]->SetAtomicRadiusTypeToCustomArrayRadius();
75     mappers[i]->RenderLatticeOn();
76     actors[i]->SetMapper(mappers[i]);
77     rens[i]->SetBackground(0.0, 0.0, 0.0);
78     rens[i]->AddActor(actors[i]);
79     win->AddRenderer(rens[i]);
80   }
81 
82   vtkNew<vtkRenderWindowInteractor> iren;
83   iren->SetRenderWindow(win);
84 
85   win->SetSize(450, 450);
86   win->Render();
87 
88   for (size_t i = 0; i < 4; ++i)
89   {
90     rens[i]->GetActiveCamera()->Dolly(1.5);
91     rens[i]->ResetCameraClippingRange();
92   }
93   win->Render();
94 
95   // Finally render the scene and compare the image to a reference image
96   win->SetMultiSamples(0);
97   win->GetInteractor()->Initialize();
98   win->GetInteractor()->Start();
99 
100   return EXIT_SUCCESS;
101 }
102