You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nmWTAI-Platform/3rd/VTK7.1/include/vtkArrayListTemplate.txx

185 lines
6.6 KiB
Plaintext

/*=========================================================================
Program: Visualization Toolkit
Module: vtkArrayListTemplate.txx
Copyright (c) Kitware, Inc.
All rights reserved.
See LICENSE file 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 "vtkArrayListTemplate.h"
#include "vtkFloatArray.h"
#include <cassert>
#ifndef vtkArrayListTemplate_txx
#define vtkArrayListTemplate_txx
//----------------------------------------------------------------------------
// Sort of a little object factory (in conjunction w/ vtkTemplateMacro())
template <typename T>
void CreateArrayPair(ArrayList *list, T *inData, T *outData,
vtkIdType numTuples, int numComp, vtkDataArray *outArray,
T nullValue)
{
ArrayPair<T> *pair = new ArrayPair<T>(inData,outData,numTuples,numComp,
outArray,nullValue);
list->Arrays.push_back(pair);
}
//----------------------------------------------------------------------------
// Sort of a little object factory (in conjunction w/ vtkTemplateMacro())
template <typename T>
void CreateRealArrayPair(ArrayList *list, T *inData, float *outData,
vtkIdType numTuples, int numComp, vtkDataArray *outArray,
float nullValue)
{
RealArrayPair<T,float> *pair =
new RealArrayPair<T,float>(inData,outData,numTuples,numComp,
outArray,nullValue);
list->Arrays.push_back(pair);
}
//----------------------------------------------------------------------------
// Indicate arrays not to process
inline void ArrayList::
ExcludeArray(vtkDataArray *da)
{
ExcludedArrays.push_back(da);
}
//----------------------------------------------------------------------------
// Has the specified array been excluded?
inline bool ArrayList::
IsExcluded(vtkDataArray *da)
{
return (std::find(ExcludedArrays.begin(), ExcludedArrays.end(), da) != ExcludedArrays.end());
}
//----------------------------------------------------------------------------
// Add an array pair (input,output) using the name provided for the output. The
// numTuples is the number of output tuples allocated.
inline vtkDataArray* ArrayList::
AddArrayPair(vtkIdType numTuples, vtkDataArray *inArray,
vtkStdString &outArrayName, double nullValue, bool promote)
{
if (this->IsExcluded(inArray))
{
return NULL;
}
int iType = inArray->GetDataType();
vtkDataArray *outArray;
if ( promote && iType != VTK_FLOAT && iType != VTK_DOUBLE )
{
outArray = vtkFloatArray::New();
outArray->SetNumberOfComponents(inArray->GetNumberOfComponents());
outArray->SetNumberOfTuples(numTuples);
outArray->SetName(outArrayName);
void *iD = inArray->GetVoidPointer(0);
void *oD = outArray->GetVoidPointer(0);
switch (iType)
{
vtkTemplateMacro(CreateRealArrayPair(this, static_cast<VTK_TT *>(iD),
static_cast<float*>(oD),numTuples,inArray->GetNumberOfComponents(),
outArray,static_cast<float>(nullValue)));
}//over all VTK types
}
else
{
outArray = inArray->NewInstance();
outArray->SetNumberOfComponents(inArray->GetNumberOfComponents());
outArray->SetNumberOfTuples(numTuples);
outArray->SetName(outArrayName);
void *iD = inArray->GetVoidPointer(0);
void *oD = outArray->GetVoidPointer(0);
switch (iType)
{
vtkTemplateMacro(CreateArrayPair(this, static_cast<VTK_TT *>(iD),
static_cast<VTK_TT *>(oD),numTuples,inArray->GetNumberOfComponents(),
outArray,static_cast<VTK_TT>(nullValue)));
}//over all VTK types
}//promote integral types
assert(outArray->GetReferenceCount() > 1);
outArray->FastDelete();
return outArray;
}
//----------------------------------------------------------------------------
// Add the arrays to interpolate here. This presumes that vtkDataSetAttributes::CopyData() or
// vtkDataSetAttributes::InterpolateData() has been called, and the input and output array
// names match.
inline void ArrayList::
AddArrays(vtkIdType numOutPts, vtkDataSetAttributes *inPD, vtkDataSetAttributes *outPD,
double nullValue, bool promote)
{
// Build the vector of interpolation pairs. Note that InterpolateAllocate should have
// been called at this point (output arrays created and allocated).
char *name;
vtkDataArray *iArray, *oArray;
int iType, oType;
void *iD, *oD;
int iNumComp, oNumComp;
int i, numArrays = outPD->GetNumberOfArrays();
for (i=0; i < numArrays; ++i)
{
oArray = outPD->GetArray(i);
if ( oArray && ! this->IsExcluded(oArray) )
{
name = oArray->GetName();
iArray = inPD->GetArray(name);
if ( iArray && ! this->IsExcluded(iArray) )
{
iType = iArray->GetDataType();
oType = oArray->GetDataType();
iNumComp = iArray->GetNumberOfComponents();
oNumComp = oArray->GetNumberOfComponents();
if ( promote && oType != VTK_FLOAT && oType != VTK_DOUBLE )
{
oType = VTK_FLOAT;
vtkFloatArray *fArray = vtkFloatArray::New();
fArray->SetName(oArray->GetName());
fArray->SetNumberOfComponents(oNumComp);
outPD->AddArray(fArray); //nasty side effect will replace current array in the same spot
oArray = fArray;
fArray->Delete();
}
oArray->SetNumberOfTuples(numOutPts);
assert( iNumComp == oNumComp );
if ( iType == oType )
{
iD = iArray->GetVoidPointer(0);
oD = oArray->GetVoidPointer(0);
switch (iType)
{
vtkTemplateMacro(CreateArrayPair(this, static_cast<VTK_TT *>(iD),
static_cast<VTK_TT *>(oD),numOutPts,oNumComp,
oArray,static_cast<VTK_TT>(nullValue)));
}//over all VTK types
}//if matching types
else //promoted type
{
iD = iArray->GetVoidPointer(0);
oD = oArray->GetVoidPointer(0);
switch (iType)
{
vtkTemplateMacro(CreateRealArrayPair(this, static_cast<VTK_TT *>(iD),
static_cast<float*>(oD),numOutPts,iNumComp,
oArray,static_cast<float>(nullValue)));
}//over all VTK types
}//if promoted pair
}//if matching input array
}//if output array
}//for each candidate array
}
#endif