Cloned library of VTK-5.0.0 with extra build files for internal package management.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

235 lines
6.5 KiB

/*=========================================================================
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<vtkTimerLog> Timer;
vtkSmartPointer<vtkImageMandelbrotSource> Mandelbrot;
vtkSmartPointer<vtkImageGaussianSmooth> GaussianSmooth;
vtkSmartPointer<vtkCutter> Cutter;
vtkSmartPointer<vtkTriangleFilter> TriFilter;
vtkSmartPointer<vtkStripper> Stripper;
vtkSmartPointer<vtkPolyDataNormals> Normals;
int ImmediateMode;
int ScalarColoring;
int UseNormals;
// all times are in seconds
double DataBuildTime;
};
VTKBenchmark::VTKBenchmark()
{
this->Timer = vtkSmartPointer<vtkTimerLog>::New();
this->Mandelbrot = vtkSmartPointer<vtkImageMandelbrotSource>::New();
this->GaussianSmooth = vtkSmartPointer<vtkImageGaussianSmooth>::New();
this->Cutter = vtkSmartPointer<vtkCutter>::New();
this->TriFilter = vtkSmartPointer<vtkTriangleFilter>::New();
this->Stripper = vtkSmartPointer<vtkStripper>::New();
this->Normals = vtkSmartPointer<vtkPolyDataNormals>::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<vtkSphere> sphere =
vtkSmartPointer<vtkSphere>::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<vtkRenderer> ren1 = vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> renWindow =
vtkSmartPointer<vtkRenderWindow>::New();
renWindow->AddRenderer(ren1);
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::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();
}