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.
192 lines
6.1 KiB
192 lines
6.1 KiB
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: $RCSfile: TestProjectedTetrahedra.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.
|
|
|
|
=========================================================================*/
|
|
|
|
/*
|
|
* Copyright 2004 Sandia Corporation.
|
|
* Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
|
|
* license for use of this work by or on behalf of the
|
|
* U.S. Government. Redistribution and use in source and binary forms, with
|
|
* or without modification, are permitted provided that this Notice and any
|
|
* statement of authorship are reproduced on all copies.
|
|
*/
|
|
|
|
#include "vtkProjectedTetrahedraMapper.h"
|
|
|
|
#include "vtkRenderer.h"
|
|
#include "vtkRenderWindow.h"
|
|
#include "vtkRenderWindowInteractor.h"
|
|
#include "vtkStructuredPointsReader.h"
|
|
#include "vtkSLCReader.h"
|
|
#include "vtkStructuredPoints.h"
|
|
#include "vtkUnstructuredGrid.h"
|
|
#include "vtkThreshold.h"
|
|
#include "vtkDataSetTriangleFilter.h"
|
|
#include "vtkPiecewiseFunction.h"
|
|
#include "vtkColorTransferFunction.h"
|
|
#include "vtkVolumeProperty.h"
|
|
#include "vtkVolume.h"
|
|
#include "vtkContourFilter.h"
|
|
#include "vtkPolyDataMapper.h"
|
|
#include "vtkActor.h"
|
|
#include "vtkCamera.h"
|
|
#include "vtkRegressionTestImage.h"
|
|
#include "vtkStdString.h"
|
|
|
|
int TestProjectedTetrahedra(int argc, char *argv[])
|
|
{
|
|
int i;
|
|
// Need to get the data root.
|
|
const char *data_root = NULL;
|
|
for (i = 0; i < argc-1; i++)
|
|
{
|
|
if (strcmp("-D", argv[i]) == 0)
|
|
{
|
|
data_root = argv[i+1];
|
|
break;
|
|
}
|
|
}
|
|
if (!data_root)
|
|
{
|
|
cout << "Need to specify the directory to VTK_DATA_ROOT with -D <dir>." << endl;
|
|
return 1;
|
|
}
|
|
|
|
// Create the standard renderer, render window, and interactor.
|
|
vtkRenderer *ren1 = vtkRenderer::New();
|
|
vtkRenderWindow *renWin = vtkRenderWindow::New();
|
|
renWin->AddRenderer(ren1);
|
|
vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
|
|
iren->SetRenderWindow(renWin);
|
|
iren->SetDesiredUpdateRate(3);
|
|
|
|
// Create the reader for the data.
|
|
// This is the data that will be volume rendered.
|
|
vtkStdString filename;
|
|
filename = data_root;
|
|
filename += "/Data/ironProt.vtk";
|
|
cout << "Loading " << filename.c_str() << endl;
|
|
vtkStructuredPointsReader *reader = vtkStructuredPointsReader::New();
|
|
reader->SetFileName(filename.c_str());
|
|
|
|
// Create a reader for the other data that will be contoured and
|
|
// displayed as a polygonal mesh.
|
|
filename = data_root;
|
|
filename += "/Data/neghip.slc";
|
|
cout << "Loading " << filename.c_str() << endl;
|
|
vtkSLCReader *reader2 = vtkSLCReader::New();
|
|
reader2->SetFileName(filename.c_str());
|
|
|
|
// Convert from vtkImageData to vtkUnstructuredGrid.
|
|
// Remove any cells where all values are below 80.
|
|
vtkThreshold *thresh = vtkThreshold::New();
|
|
thresh->ThresholdByUpper(80);
|
|
thresh->AllScalarsOff();
|
|
thresh->SetInputConnection(reader->GetOutputPort());
|
|
|
|
// Make sure we have only tetrahedra.
|
|
vtkDataSetTriangleFilter *trifilter = vtkDataSetTriangleFilter::New();
|
|
trifilter->SetInputConnection(thresh->GetOutputPort());
|
|
|
|
// Create transfer mapping scalar value to opacity.
|
|
vtkPiecewiseFunction *opacityTransferFunction = vtkPiecewiseFunction::New();
|
|
opacityTransferFunction->AddPoint(80.0, 0.0);
|
|
opacityTransferFunction->AddPoint(120.0, 0.2);
|
|
opacityTransferFunction->AddPoint(255.0, 0.2);
|
|
|
|
// Create transfer mapping scalar value to color.
|
|
vtkColorTransferFunction *colorTransferFunction
|
|
= vtkColorTransferFunction::New();
|
|
colorTransferFunction->AddRGBPoint(80.0, 0.0, 0.0, 0.0);
|
|
colorTransferFunction->AddRGBPoint(120.0, 0.0, 0.0, 1.0);
|
|
colorTransferFunction->AddRGBPoint(160.0, 1.0, 0.0, 0.0);
|
|
colorTransferFunction->AddRGBPoint(200.0, 0.0, 1.0, 0.0);
|
|
colorTransferFunction->AddRGBPoint(255.0, 0.0, 1.0, 1.0);
|
|
|
|
// The property describes how the data will look.
|
|
vtkVolumeProperty *volumeProperty = vtkVolumeProperty::New();
|
|
volumeProperty->SetColor(colorTransferFunction);
|
|
volumeProperty->SetScalarOpacity(opacityTransferFunction);
|
|
volumeProperty->ShadeOff();
|
|
volumeProperty->SetInterpolationTypeToLinear();
|
|
|
|
// The mapper that renders the volume data.
|
|
vtkProjectedTetrahedraMapper *volumeMapper
|
|
= vtkProjectedTetrahedraMapper::New();
|
|
volumeMapper->SetInputConnection(trifilter->GetOutputPort());
|
|
|
|
// The volume holds the mapper and the property and can be used to
|
|
// position/orient the volume.
|
|
vtkVolume *volume = vtkVolume::New();
|
|
volume->SetMapper(volumeMapper);
|
|
volume->SetProperty(volumeProperty);
|
|
|
|
// Contour the second dataset.
|
|
vtkContourFilter *contour = vtkContourFilter::New();
|
|
contour->SetValue(0, 80);
|
|
contour->SetInputConnection(reader2->GetOutputPort());
|
|
|
|
// Create a mapper for the polygonal data.
|
|
vtkPolyDataMapper *mapper = vtkPolyDataMapper::New();
|
|
mapper->SetInputConnection(contour->GetOutputPort());
|
|
mapper->ScalarVisibilityOff();
|
|
|
|
// Create an actor for the polygonal data.
|
|
vtkActor *actor = vtkActor::New();
|
|
actor->SetMapper(mapper);
|
|
|
|
ren1->AddViewProp(actor);
|
|
ren1->AddVolume(volume);
|
|
|
|
renWin->SetSize(300, 300);
|
|
|
|
ren1->ResetCamera();
|
|
ren1->GetActiveCamera()->Azimuth(20.0);
|
|
ren1->GetActiveCamera()->Elevation(10.0);
|
|
ren1->GetActiveCamera()->Zoom(1.5);
|
|
|
|
renWin->Render();
|
|
|
|
int retVal = vtkTesting::Test(argc, argv, renWin, 75);
|
|
if (retVal == vtkRegressionTester::DO_INTERACTOR)
|
|
{
|
|
iren->Start();
|
|
}
|
|
|
|
// Clean up.
|
|
ren1->Delete();
|
|
renWin->Delete();
|
|
iren->Delete();
|
|
reader->Delete();
|
|
reader2->Delete();
|
|
thresh->Delete();
|
|
trifilter->Delete();
|
|
opacityTransferFunction->Delete();
|
|
colorTransferFunction->Delete();
|
|
volumeProperty->Delete();
|
|
volumeMapper->Delete();
|
|
volume->Delete();
|
|
contour->Delete();
|
|
mapper->Delete();
|
|
actor->Delete();
|
|
|
|
if ((retVal == vtkTesting::PASSED) || (retVal == vtkTesting::DO_INTERACTOR))
|
|
{
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
return 1;
|
|
}
|
|
}
|
|
|