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