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.

205 lines
6.0 KiB

2 years ago
/*=========================================================================
Program: Visualization Toolkit
Module: $RCSfile: vtkCubeSource.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 "vtkCubeSource.h"
#include "vtkCellArray.h"
#include "vtkFloatArray.h"
#include "vtkInformation.h"
#include "vtkInformationVector.h"
#include "vtkObjectFactory.h"
#include "vtkStreamingDemandDrivenPipeline.h"
#include "vtkPointData.h"
#include "vtkPoints.h"
#include "vtkPolyData.h"
#include <math.h>
vtkCxxRevisionMacro(vtkCubeSource, "$Revision: 1.53 $");
vtkStandardNewMacro(vtkCubeSource);
vtkCubeSource::vtkCubeSource(double xL, double yL, double zL)
{
this->XLength = fabs(xL);
this->YLength = fabs(yL);
this->ZLength = fabs(zL);
this->Center[0] = 0.0;
this->Center[1] = 0.0;
this->Center[2] = 0.0;
this->SetNumberOfInputPorts(0);
}
int vtkCubeSource::RequestData(
vtkInformation *vtkNotUsed(request),
vtkInformationVector **vtkNotUsed(inputVector),
vtkInformationVector *outputVector)
{
// get the info object
vtkInformation *outInfo = outputVector->GetInformationObject(0);
// get the ouptut
vtkPolyData *output = vtkPolyData::SafeDownCast(
outInfo->Get(vtkDataObject::DATA_OBJECT()));
double x[3], n[3], tc[3];
int numPolys=6, numPts=24;
int i, j, k;
vtkIdType pts[4];
vtkPoints *newPoints;
vtkFloatArray *newNormals;
vtkFloatArray *newTCoords; // CCS 7/27/98 Added for Texture Mapping
vtkCellArray *newPolys;
//
// Set things up; allocate memory
//
newPoints = vtkPoints::New();
newPoints->Allocate(numPts);
newNormals = vtkFloatArray::New();
newNormals->SetNumberOfComponents(3);
newNormals->Allocate(numPts);
newNormals->SetName("Normals");
newTCoords = vtkFloatArray::New();
newTCoords->SetNumberOfComponents(2);
newTCoords->Allocate(numPts);
newTCoords->SetName("TCoords");
newPolys = vtkCellArray::New();
newPolys->Allocate(newPolys->EstimateSize(numPolys,4));
//
// Generate points and normals
//
for (x[0]=this->Center[0]-this->XLength/2.0, n[0]=(-1.0), n[1]=n[2]=0.0, i=0;
i<2; i++, x[0]+=this->XLength, n[0]+=2.0)
{
for (x[1]=this->Center[1]-this->YLength/2.0, j=0; j<2;
j++, x[1]+=this->YLength)
{
tc[1] = x[1] + 0.5;
for (x[2]=this->Center[2]-this->ZLength/2.0, k=0; k<2;
k++, x[2]+=this->ZLength)
{
tc[0] = (x[2] + 0.5) * ( 1 - 2*i );
newPoints->InsertNextPoint(x);
newTCoords->InsertNextTuple(tc);
newNormals->InsertNextTuple(n);
}
}
}
pts[0] = 0; pts[1] = 1; pts[2] = 3; pts[3] = 2;
newPolys->InsertNextCell(4,pts);
pts[0] = 4; pts[1] = 6; pts[2] = 7; pts[3] = 5;
newPolys->InsertNextCell(4,pts);
for (x[1]=this->Center[1]-this->YLength/2.0, n[1]=(-1.0), n[0]=n[2]=0.0, i=0;
i<2; i++, x[1]+=this->YLength, n[1]+=2.0)
{
for (x[0]=this->Center[0]-this->XLength/2.0, j=0; j<2;
j++, x[0]+=this->XLength)
{
tc[0] = ( x[0] + 0.5 ) * ( 2*i - 1 );
for (x[2]=this->Center[2]-this->ZLength/2.0, k=0; k<2;
k++, x[2]+=this->ZLength)
{
tc[1] = ( x[2] + 0.5 ) * -1;
newPoints->InsertNextPoint(x);
newTCoords->InsertNextTuple(tc);
newNormals->InsertNextTuple(n);
}
}
}
pts[0] = 8; pts[1] = 10; pts[2] = 11; pts[3] = 9;
newPolys->InsertNextCell(4,pts);
pts[0] = 12; pts[1] = 13; pts[2] = 15; pts[3] = 14;
newPolys->InsertNextCell(4,pts);
for (x[2]=this->Center[2]-this->ZLength/2.0, n[2]=(-1.0), n[0]=n[1]=0.0, i=0;
i<2; i++, x[2]+=this->ZLength, n[2]+=2.0)
{
for (x[1]=this->Center[1]-this->YLength/2.0, j=0; j<2;
j++, x[1]+=this->YLength)
{
tc[1] = x[1] + 0.5;
for (x[0]=this->Center[0]-this->XLength/2.0, k=0; k<2;
k++, x[0]+=this->XLength)
{
tc[0] = ( x[0] + 0.5 ) * ( 2*i - 1 );
newPoints->InsertNextPoint(x);
newTCoords->InsertNextTuple(tc);
newNormals->InsertNextTuple(n);
}
}
}
pts[0] = 16; pts[1] = 18; pts[2] = 19; pts[3] = 17;
newPolys->InsertNextCell(4,pts);
pts[0] = 20; pts[1] = 21; pts[2] = 23; pts[3] = 22;
newPolys->InsertNextCell(4,pts);
//
// Update ourselves and release memory
//
output->SetPoints(newPoints);
newPoints->Delete();
output->GetPointData()->SetNormals(newNormals);
newNormals->Delete();
output->GetPointData()->SetTCoords(newTCoords);
newTCoords->Delete();
newPolys->Squeeze(); // since we've estimated size; reclaim some space
output->SetPolys(newPolys);
newPolys->Delete();
return 1;
}
// Convenience method allows creation of cube by specifying bounding box.
void vtkCubeSource::SetBounds(double xMin, double xMax,
double yMin, double yMax,
double zMin, double zMax)
{
double bounds[6];
bounds[0] = xMin;
bounds[1] = xMax;
bounds[2] = yMin;
bounds[3] = yMax;
bounds[4] = zMin;
bounds[5] = zMax;
this->SetBounds (bounds);
}
void vtkCubeSource::SetBounds(double bounds[6])
{
this->SetXLength(bounds[1]-bounds[0]);
this->SetYLength(bounds[3]-bounds[2]);
this->SetZLength(bounds[5]-bounds[4]);
this->SetCenter((bounds[1]+bounds[0])/2.0, (bounds[3]+bounds[2])/2.0,
(bounds[5]+bounds[4])/2.0);
}
void vtkCubeSource::PrintSelf(ostream& os, vtkIndent indent)
{
this->Superclass::PrintSelf(os,indent);
os << indent << "X Length: " << this->XLength << "\n";
os << indent << "Y Length: " << this->YLength << "\n";
os << indent << "Z Length: " << this->ZLength << "\n";
os << indent << "Center: (" << this->Center[0] << ", "
<< this->Center[1] << ", " << this->Center[2] << ")\n";
}