/*========================================================================= Program: Visualization Toolkit Module: $RCSfile: VTKBenchMark.cxx,v $ Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen All rights reserved. See Copyright.txt or http://www.kitware.com/Copyright.htm for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkActor.h" #include "vtkCamera.h" #include "vtkCutter.h" #include "vtkImageData.h" #include "vtkImageGaussianSmooth.h" #include "vtkImageMandelbrotSource.h" #include "vtkPolyData.h" #include "vtkPolyDataMapper.h" #include "vtkPolyDataNormals.h" #include "vtkRenderWindow.h" #include "vtkRenderer.h" #include "vtkSmartPointer.h" #include "vtkSphere.h" #include "vtkStripper.h" #include "vtkTimerLog.h" #include "vtkTriangleFilter.h" class VTKBenchmark { public: // Description: // The main entry point for the benchmark int Run(); VTKBenchmark(); private: double BuildTheFractal(); double DrawTheFractal(); vtkSmartPointer Timer; vtkSmartPointer Mandelbrot; vtkSmartPointer GaussianSmooth; vtkSmartPointer Cutter; vtkSmartPointer TriFilter; vtkSmartPointer Stripper; vtkSmartPointer Normals; int ImmediateMode; int ScalarColoring; int UseNormals; // all times are in seconds double DataBuildTime; }; VTKBenchmark::VTKBenchmark() { this->Timer = vtkSmartPointer::New(); this->Mandelbrot = vtkSmartPointer::New(); this->GaussianSmooth = vtkSmartPointer::New(); this->Cutter = vtkSmartPointer::New(); this->TriFilter = vtkSmartPointer::New(); this->Stripper = vtkSmartPointer::New(); this->Normals = vtkSmartPointer::New(); this->ImmediateMode = 1; this->ScalarColoring = 0; this->UseNormals = 0; } double VTKBenchmark::BuildTheFractal() { cerr << "Building Fractal ... (this may take a minute or two)\n"; // time the data creation this->Timer->StartTimer(); // first we want to create some data, a 256 cubed Mandelbrot src this->Mandelbrot->SetWholeExtent(0,255,0,255,0,255); this->Mandelbrot->SetOriginCX(-1.75,-1.25,-1,0); this->Mandelbrot->Update(); cerr << "Smoothing...\n"; this->GaussianSmooth->SetInputConnection(this->Mandelbrot->GetOutputPort()); this->GaussianSmooth->Update(); // extract a sphere from the fractal volume vtkSmartPointer sphere = vtkSmartPointer::New(); // add two contours cerr << "Cutting...\n"; this->Cutter->SetInputConnection(this->GaussianSmooth->GetOutputPort()); this->Cutter->SetCutFunction(sphere); this->Cutter->Update(); // convert it to all triangles cerr << "Converting to Triangles...\n"; this->TriFilter->SetInputConnection(this->Cutter->GetOutputPort()); this->TriFilter->Update(); // generate Normals cerr << "Computing Normals...\n"; this->Normals->SetInputConnection(this->TriFilter->GetOutputPort()); this->Normals->Update(); // and then strip them cerr << "Creating Strips...\n"; this->Stripper->SetInputConnection(this->Normals->GetOutputPort()); this->Stripper->Update(); cerr << "Number Of Triangles: " << this->TriFilter->GetOutput()->GetNumberOfPolys() << "\n"; cerr << "Average Strip Length: " << this->TriFilter->GetOutput()->GetNumberOfPolys()/ (double)this->Stripper->GetOutput()->GetNumberOfStrips() << "\n"; this->Timer->StopTimer(); return this->Timer->GetElapsedTime(); } int VTKBenchmark::Run() { this->DataBuildTime = this->BuildTheFractal(); cerr << "Build Rate: " << 1.0/this->DataBuildTime << "\n"; for (this->ImmediateMode = 0; this->ImmediateMode < 2; this->ImmediateMode++) { for (this->ScalarColoring = 0; this->ScalarColoring < 2; this->ScalarColoring++) { for (this->UseNormals = 0; this->UseNormals < 2; this->UseNormals++) { cerr << "Render Rate: " << (this->ImmediateMode ? "IMED " : " ") << (this->ScalarColoring ? "SCAL " : " ") << (this->UseNormals ? "NORM " : " ") << this->DrawTheFractal() << " MegaTriangles/Second\n"; } } } return 0; } double VTKBenchmark::DrawTheFractal() { // create a rendering window and both renderers vtkSmartPointer ren1 = vtkSmartPointer::New(); vtkSmartPointer renWindow = vtkSmartPointer::New(); renWindow->AddRenderer(ren1); vtkSmartPointer mapper = vtkSmartPointer::New(); vtkSmartPointer actor = vtkSmartPointer::New(); if (this->UseNormals) { this->Stripper->SetInputConnection(this->Normals->GetOutputPort()); } else { this->Stripper->SetInputConnection(this->TriFilter->GetOutputPort()); } mapper->SetInputConnection(this->Stripper->GetOutputPort()); mapper->SetImmediateModeRendering(this->ImmediateMode); mapper->SetScalarVisibility(this->ScalarColoring); mapper->SetScalarRange(5,30); actor->SetMapper(mapper); ren1->AddActor(actor); // set the size of our window renWindow->SetSize(500,500); // set the viewports and background of the renderers ren1->SetBackground(0.2,0.3,0.5); // draw the resulting scene renWindow->Render(); this->Timer->StartTimer(); // do a azimuth of the cameras 50 degrees per iteration ren1->GetActiveCamera()->Azimuth(50); renWindow->Render(); ren1->GetActiveCamera()->Azimuth(50); renWindow->Render(); ren1->GetActiveCamera()->Azimuth(50); renWindow->Render(); ren1->GetActiveCamera()->Zoom(3.0); ren1->GetActiveCamera()->Azimuth(50); renWindow->Render(); ren1->GetActiveCamera()->Elevation(50); renWindow->Render(); ren1->GetActiveCamera()->Elevation(50); renWindow->Render(); this->Timer->StopTimer(); // compute the M triangles per second double numTris = (double)this->TriFilter->GetOutput()->GetNumberOfPolys(); return 6.0e-6*numTris/this->Timer->GetElapsedTime(); } int main( int argc, char *argv[] ) { VTKBenchmark a; if (argc > 1) { cerr << argv[0] << " takes no arguments\n"; } return a.Run(); }