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.
240 lines
5.6 KiB
240 lines
5.6 KiB
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: $RCSfile: TimeRenderer.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 "vtkCellArray.h"
|
|
#include "vtkConeSource.h"
|
|
#include "vtkCubeSource.h"
|
|
#include "vtkCullerCollection.h"
|
|
#include "vtkGarbageCollector.h"
|
|
#include "vtkGlyph3D.h"
|
|
#include "vtkPoints.h"
|
|
#include "vtkPolyData.h"
|
|
#include "vtkPolyDataMapper.h"
|
|
#include "vtkProperty.h"
|
|
#include "vtkRenderWindow.h"
|
|
#include "vtkRenderer.h"
|
|
#include "vtkStripper.h"
|
|
#include "vtkTimerLog.h"
|
|
#include "vtkTriangleFilter.h"
|
|
|
|
int main( int argc, char *argv[] )
|
|
{
|
|
// For timings
|
|
int i;
|
|
int l, w, nActors, N, n;
|
|
vtkIdType aPnts;
|
|
|
|
if (argc != 5)
|
|
{
|
|
l = 10;
|
|
w = 10;
|
|
aPnts = 15;
|
|
nActors = 100;
|
|
}
|
|
else
|
|
{
|
|
l = atoi(argv[1]);
|
|
w = atoi(argv[2]);
|
|
aPnts = atoi(argv[3]);
|
|
nActors = atoi(argv[4]);
|
|
}
|
|
|
|
// n is the number of points per level
|
|
n = l * w;
|
|
// N is the total number of points
|
|
N = aPnts * nActors;
|
|
|
|
float x, y, z;
|
|
vtkIdType *cdata = new vtkIdType [aPnts];
|
|
for (int j = 0; j < aPnts; j++)
|
|
{
|
|
cdata[j] = j;
|
|
}
|
|
|
|
vtkProperty *prop = vtkProperty::New();
|
|
|
|
//vtkGarbageCollector::DeferredCollectionPush();
|
|
|
|
// create a rendering window and both renderers
|
|
vtkRenderer *ren1 = vtkRenderer::New();
|
|
ren1->GetCullers()->InitTraversal();
|
|
vtkRenderWindow *renWindow = vtkRenderWindow::New();
|
|
renWindow->AddRenderer(ren1);
|
|
|
|
// Create a cube polydata
|
|
vtkPoints *cpnts = vtkPoints::New();
|
|
cpnts->SetNumberOfPoints(14);
|
|
|
|
vtkCellArray *ccells = vtkCellArray::New();
|
|
|
|
cpnts->SetPoint(0, .1, -.1, -.1);
|
|
cpnts->SetPoint(1, -.1, -.1, -.1);
|
|
cpnts->SetPoint(2, .1, .1, -.1);
|
|
cpnts->SetPoint(3, -.1, .1, -.1);
|
|
cpnts->SetPoint(4, -.1, .1, .1);
|
|
cpnts->SetPoint(5, -.1, -.1, -.1);
|
|
cpnts->SetPoint(6, -.1, -.1, .1);
|
|
cpnts->SetPoint(7, .1, -.1, -.1);
|
|
cpnts->SetPoint(8, .1, -.1, .1);
|
|
cpnts->SetPoint(9, .1, .1, -.1);
|
|
cpnts->SetPoint(10, .1, .1, .1);
|
|
cpnts->SetPoint(11, -.1, .1, .1);
|
|
cpnts->SetPoint(12, .1, -.1, .1);
|
|
cpnts->SetPoint(13, -.1, -.1, .1);
|
|
|
|
vtkIdType a[14];
|
|
for (i = 0; i < 14; i++)
|
|
{
|
|
a[i] = i;
|
|
}
|
|
|
|
ccells->InsertNextCell(14L, a);
|
|
ccells->Squeeze();
|
|
|
|
vtkPolyData *cube = vtkPolyData::New();
|
|
cube->SetPoints(cpnts);
|
|
cube->SetStrips(ccells);
|
|
cpnts->Delete();
|
|
ccells->Delete();
|
|
|
|
vtkPolyDataMapper *mapper;
|
|
vtkCellArray *cells;
|
|
vtkActor *actor;
|
|
vtkGlyph3D *filter;
|
|
vtkPolyData *data;
|
|
vtkPoints *pnts = 0;
|
|
vtkTriangleFilter *tfilter;
|
|
vtkStripper *stripper;
|
|
|
|
x = 0.0;
|
|
y = 0.0;
|
|
z = 0.0;
|
|
for (i = 0; i < N; i ++)
|
|
{
|
|
// See if we need to start a new actor
|
|
if ((i % aPnts) == 0)
|
|
{
|
|
if (pnts)
|
|
{
|
|
pnts->Delete();
|
|
}
|
|
|
|
pnts = vtkPoints::New();
|
|
cells = vtkCellArray::New();
|
|
data = vtkPolyData::New();
|
|
filter = vtkGlyph3D::New();
|
|
mapper = vtkPolyDataMapper::New();
|
|
actor = vtkActor::New();
|
|
tfilter = vtkTriangleFilter::New();
|
|
stripper = vtkStripper::New();
|
|
|
|
prop->SetInterpolationToFlat();
|
|
actor->SetProperty(prop);
|
|
|
|
pnts->SetNumberOfPoints(aPnts);
|
|
cells->Allocate(aPnts);
|
|
cells->InsertNextCell(aPnts, cdata);
|
|
data->SetVerts(cells);
|
|
data->SetPoints(pnts);
|
|
tfilter->SetInput(cube);
|
|
stripper->SetInputConnection(tfilter->GetOutputPort());
|
|
filter->SetSource(stripper->GetOutput());
|
|
filter->SetInput(data);
|
|
mapper->SetInputConnection(filter->GetOutputPort());
|
|
actor->SetMapper(mapper);
|
|
ren1->AddActor(actor);
|
|
|
|
// all these are held by way of the renderer, so do a fast unref
|
|
cells->Delete();
|
|
data->Delete();
|
|
filter->Delete();
|
|
mapper->Delete();
|
|
actor->Delete();
|
|
tfilter->Delete();
|
|
stripper->Delete();
|
|
}
|
|
|
|
// See if we are on a new level)
|
|
if ((i % n) == 0)
|
|
{
|
|
z += 1.0;
|
|
x = 0.0;
|
|
y = 0.0;
|
|
}
|
|
else
|
|
{
|
|
if ((i % l) == 0)
|
|
{
|
|
x += 1.0;
|
|
y = 0.0;
|
|
}
|
|
else
|
|
{
|
|
y += 1.0;
|
|
}
|
|
}
|
|
|
|
pnts->SetPoint(i % aPnts, x, y, z);
|
|
pnts->Modified();
|
|
}
|
|
|
|
if (pnts)
|
|
{
|
|
pnts->Delete();
|
|
}
|
|
|
|
// set the size of our window
|
|
renWindow->SetSize(500,500);
|
|
|
|
// set the viewports and background of the renderers
|
|
// ren1->SetViewport(0,0,0.5,1);
|
|
ren1->SetBackground(0.2,0.3,0.5);
|
|
|
|
// draw the resulting scene
|
|
renWindow->Render();
|
|
ren1->GetActiveCamera()->Azimuth(3);
|
|
renWindow->Render();
|
|
|
|
// Set up times
|
|
vtkTimerLog *tl = vtkTimerLog::New();
|
|
|
|
tl->StartTimer();
|
|
|
|
// do a azimuth of the cameras 3 degrees per iteration
|
|
// for (i = 0; i < 360; i += 3)
|
|
#if 1
|
|
for (i = 0; i < 360; i += 9)
|
|
{
|
|
ren1->GetActiveCamera()->Azimuth(3);
|
|
renWindow->Render();
|
|
}
|
|
#endif
|
|
tl->StopTimer();
|
|
|
|
cerr << "Wall Time = " << tl->GetElapsedTime() << "\n";
|
|
cerr << "FrameRate = " << 120.0 / tl->GetElapsedTime() << "\n";
|
|
|
|
// Clean up
|
|
cube->Delete();
|
|
vtkGarbageCollector::SetGlobalDebugFlag(1);
|
|
vtkGarbageCollector::SetGlobalDebugFlag(0);
|
|
prop->Delete();
|
|
ren1->Delete();
|
|
renWindow->Delete();
|
|
tl->Delete();
|
|
//vtkGarbageCollector::DeferredCollectionPop();
|
|
return 1;
|
|
}
|
|
|