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 "vtkActor.h"
16 #include "vtkCamera.h"
17 #include "vtkCellArray.h"
18 #include "vtkLightKit.h"
19 #include "vtkNew.h"
20 #include "vtkOpenGLRenderWindow.h"
21 #include "vtkPLYReader.h"
22 #include "vtkPointData.h"
23 #include "vtkPolyDataMapper.h"
24 #include "vtkPolyDataNormals.h"
25 #include "vtkProperty.h"
26 #include "vtkRenderer.h"
27 #include "vtkTimerLog.h"
28 
29 #include "vtkRegressionTestImage.h"
30 #include "vtkTestUtilities.h"
31 
32 #include "vtkRenderWindowInteractor.h"
33 
34 #include "vtkOpenGLRenderWindow.h"
35 
36 //------------------------------------------------------------------------------
TestVBOPLYMapper(int argc,char * argv[])37 int TestVBOPLYMapper(int argc, char* argv[])
38 {
39   bool timeit = false;
40   if (argc > 1 && argv[1] && !strcmp(argv[1], "-timeit"))
41   {
42     timeit = true;
43   }
44 
45   vtkNew<vtkActor> actor;
46   vtkNew<vtkRenderer> renderer;
47   vtkNew<vtkPolyDataMapper> mapper;
48   renderer->SetBackground(0.0, 0.0, 0.0);
49   vtkNew<vtkRenderWindow> renderWindow;
50   renderWindow->SetSize(timeit ? 800 : 300, timeit ? 800 : 300);
51   renderWindow->AddRenderer(renderer);
52   renderer->AddActor(actor);
53   vtkNew<vtkRenderWindowInteractor> iren;
54   iren->SetRenderWindow(renderWindow);
55   vtkNew<vtkLightKit> lightKit;
56   lightKit->AddLightsToRenderer(renderer);
57 
58   if (!renderWindow->SupportsOpenGL())
59   {
60     cerr << "The platform does not support OpenGL as required\n";
61     cerr << vtkOpenGLRenderWindow::SafeDownCast(renderWindow)->GetOpenGLSupportMessage();
62     cerr << renderWindow->ReportCapabilities();
63     return 1;
64   }
65 
66   const char* fileName = vtkTestUtilities::ExpandDataFileName(argc, argv, "Data/dragon.ply");
67   vtkNew<vtkPLYReader> reader;
68   reader->SetFileName(fileName);
69   reader->Update();
70 
71   delete[] fileName;
72 
73   // vtkNew<vtkPolyDataNormals> norms;
74   // norms->SetInputConnection(reader->GetOutputPort());
75   // norms->Update();
76 
77   mapper->SetInputConnection(reader->GetOutputPort());
78   // mapper->SetInputConnection(norms->GetOutputPort());
79   actor->SetMapper(mapper);
80   actor->GetProperty()->SetAmbientColor(0.2, 0.2, 1.0);
81   actor->GetProperty()->SetDiffuseColor(1.0, 0.65, 0.7);
82   actor->GetProperty()->SetSpecularColor(1.0, 1.0, 1.0);
83   actor->GetProperty()->SetSpecular(0.5);
84   actor->GetProperty()->SetDiffuse(0.7);
85   actor->GetProperty()->SetAmbient(0.5);
86   actor->GetProperty()->SetSpecularPower(20.0);
87   actor->GetProperty()->SetOpacity(1.0);
88   // actor->GetProperty()->SetRepresentationToWireframe();
89 
90   renderWindow->SetMultiSamples(0);
91 
92   vtkNew<vtkTimerLog> timer;
93   timer->StartTimer();
94   renderWindow->Render();
95   timer->StopTimer();
96   double firstRender = timer->GetElapsedTime();
97   cerr << "first render time: " << firstRender << endl;
98   int major, minor;
99   vtkOpenGLRenderWindow::SafeDownCast(renderWindow)->GetOpenGLVersion(major, minor);
100   cerr << "opengl version " << major << "." << minor << "\n";
101 
102   timer->StartTimer();
103   int numRenders = timeit ? 600 : 8;
104   for (int i = 0; i < numRenders; ++i)
105   {
106     renderer->GetActiveCamera()->Azimuth(80.0 / numRenders);
107     renderer->GetActiveCamera()->Elevation(80.0 / numRenders);
108     renderWindow->Render();
109   }
110   timer->StopTimer();
111   double elapsed = timer->GetElapsedTime();
112   cerr << "interactive render time: " << elapsed / numRenders << endl;
113   unsigned int numTris = reader->GetOutput()->GetPolys()->GetNumberOfCells();
114   cerr << "number of triangles: " << numTris << endl;
115   cerr << "triangles per second: " << numTris * (numRenders / elapsed) << endl;
116 
117   renderer->GetActiveCamera()->SetPosition(0, 0, 1);
118   renderer->GetActiveCamera()->SetFocalPoint(0, 0, 0);
119   renderer->GetActiveCamera()->SetViewUp(0, 1, 0);
120   renderer->ResetCamera();
121   renderWindow->Render();
122   renderWindow->Render();
123 
124   int retVal = vtkRegressionTestImage(renderWindow);
125   if (retVal == vtkRegressionTester::DO_INTERACTOR)
126   {
127     iren->Start();
128   }
129 
130   return !retVal;
131 }
132