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 "vtkLight.h"
21 #include "vtkMolecule.h"
22 #include "vtkMoleculeMapper.h"
23 #include "vtkNew.h"
24 #include "vtkOSPRayPass.h"
25 #include "vtkOSPRayRendererNode.h"
26 #include "vtkPDBReader.h"
27 #include "vtkPlaneSource.h"
28 #include "vtkPolyDataMapper.h"
29 #include "vtkProperty.h"
30 #include "vtkRenderWindow.h"
31 #include "vtkRenderWindowInteractor.h"
32 #include "vtkRenderer.h"
33 
34 #include "vtkCamera.h"
35 #include "vtkTimerLog.h"
36 
37 // This is a clone of TestPDBBallAndStickShadows that validates RayTraced
38 // molecule rendering.
TestRayTracedMolecules(int argc,char * argv[])39 int TestRayTracedMolecules(int argc, char* argv[])
40 {
41   vtkNew<vtkRenderer> ren;
42 
43   bool useOSPRay = true;
44   vtkOSPRayRendererNode::SetSamplesPerPixel(7, ren);
45   vtkOSPRayRendererNode::SetRendererType("pathtracer", ren);
46   for (int i = 0; i < argc; ++i)
47   {
48     if (!strcmp(argv[i], "-GL"))
49     {
50       useOSPRay = false;
51     }
52     if (!strcmp(argv[i], "-scivis"))
53     {
54       vtkOSPRayRendererNode::SetRendererType("scivis", ren);
55     }
56   }
57 
58   char* fileName = vtkTestUtilities::ExpandDataFileName(argc, argv, "Data/2LYZ.pdb");
59 
60   // read protein from pdb
61   vtkNew<vtkPDBReader> reader;
62   reader->SetFileName(fileName);
63   reader->Update();
64 
65   delete[] fileName;
66 
67   vtkNew<vtkMoleculeMapper> molmapper;
68   molmapper->SetInputConnection(reader->GetOutputPort(1));
69 
70   cerr << "Class: " << molmapper->GetClassName() << endl;
71   cerr << "Atoms: " << molmapper->GetInput()->GetNumberOfAtoms() << endl;
72   cerr << "Bonds: " << molmapper->GetInput()->GetNumberOfBonds() << endl;
73 
74   molmapper->UseBallAndStickSettings();
75 
76   vtkNew<vtkActor> actor;
77   actor->SetMapper(molmapper);
78   actor->GetProperty()->SetAmbient(0.3);
79   actor->GetProperty()->SetDiffuse(0.7);
80   actor->GetProperty()->SetSpecular(0.4);
81   actor->GetProperty()->SetSpecularPower(40);
82 
83   vtkSmartPointer<vtkOSPRayPass> ospray = vtkSmartPointer<vtkOSPRayPass>::New();
84   if (useOSPRay)
85   {
86     ren->SetPass(ospray);
87   }
88 
89   vtkNew<vtkRenderWindow> win;
90   win->AddRenderer(ren);
91   vtkNew<vtkRenderWindowInteractor> iren;
92   iren->SetRenderWindow(win);
93 
94   ren->AddActor(actor);
95   ren->ResetCamera();
96   ren->GetActiveCamera()->Zoom(1.7);
97   ren->SetBackground(0.4, 0.5, 0.6);
98   ren->SetEnvironmentalBG(1.0, 0.0, 1.0);
99   vtkOSPRayRendererNode::SetBackgroundMode(
100     vtkOSPRayRendererNode::Backplate, ren); // test use BP instead of ENV
101   win->SetSize(450, 450);
102 
103   // add a plane
104   vtkNew<vtkPlaneSource> plane;
105   const double* bounds = molmapper->GetBounds();
106   plane->SetOrigin(bounds[0], bounds[2], bounds[4]);
107   plane->SetPoint1(bounds[1], bounds[2], bounds[4]);
108   plane->SetPoint2(bounds[0], bounds[2], bounds[5]);
109   vtkNew<vtkPolyDataMapper> planeMapper;
110   planeMapper->SetInputConnection(plane->GetOutputPort());
111   vtkNew<vtkActor> planeActor;
112   planeActor->SetMapper(planeMapper);
113   ren->AddActor(planeActor);
114 
115   vtkNew<vtkLight> light1;
116   light1->SetFocalPoint(0, 0, 0);
117   light1->SetPosition(0, 1, 0.2);
118   light1->SetColor(0.95, 0.97, 1.0);
119   light1->SetIntensity(0.6);
120   ren->AddLight(light1);
121 
122   vtkNew<vtkLight> light2;
123   light2->SetFocalPoint(0, 0, 0);
124   light2->SetPosition(1.0, 1.0, 1.0);
125   light2->SetColor(1.0, 0.8, 0.7);
126   light2->SetIntensity(0.07);
127   ren->AddLight(light2);
128 
129   ren->UseShadowsOn();
130 
131   vtkNew<vtkTimerLog> timer;
132   timer->StartTimer();
133   win->Render();
134   timer->StopTimer();
135   double firstRender = timer->GetElapsedTime();
136   cerr << "first render time: " << firstRender << endl;
137 
138   /*
139     int numRenders = 500;
140     timer->StartTimer();
141     for (int i = 0; i < numRenders; ++i)
142       {
143       ren->GetActiveCamera()->Azimuth(85.0/numRenders);
144       ren->GetActiveCamera()->Elevation(85.0/numRenders);
145       win->Render();
146       }
147     timer->StopTimer();
148     double elapsed = timer->GetElapsedTime();
149     cerr << "interactive render time: " << elapsed / numRenders << endl;
150   */
151 
152   ren->GetActiveCamera()->SetPosition(0, 0, 1);
153   ren->GetActiveCamera()->SetFocalPoint(0, 0, 0);
154   ren->GetActiveCamera()->SetViewUp(0, 1, 0);
155   ren->ResetCamera();
156   ren->GetActiveCamera()->Zoom(1.7);
157 
158   win->Render();
159 
160   // Finally render the scene and compare the image to a reference image
161   win->SetMultiSamples(0);
162   win->GetInteractor()->Initialize();
163   win->GetInteractor()->Start();
164 
165   return EXIT_SUCCESS;
166 }
167