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.

206 lines
7.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 vtkTypeBool 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, vtkTypeBool promote)
{
if (this->IsExcluded(inArray))
{
return nullptr;
}
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, vtkTypeBool 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
}
//----------------------------------------------------------------------------
// Add the arrays to interpolate here. This presumes that vtkDataSetAttributes::CopyData() or
// vtkDataSetAttributes::InterpolateData() has been called. This special version creates an
// array pair that interpolates from itself.
inline void ArrayList::AddSelfInterpolatingArrays(
vtkIdType numOutPts, vtkDataSetAttributes* attr, double nullValue)
{
// Build the vector of interpolation pairs. Note that CopyAllocate/InterpolateAllocate should have
// been called at this point (output arrays created and allocated).
vtkDataArray* iArray;
int iType, iNumComp;
void* iD;
int i, numArrays = attr->GetNumberOfArrays();
for (i = 0; i < numArrays; ++i)
{
iArray = attr->GetArray(i);
if (iArray && !this->IsExcluded(iArray))
{
iType = iArray->GetDataType();
iNumComp = iArray->GetNumberOfComponents();
iArray->WriteVoidPointer(0, numOutPts * iNumComp); // allocates memory, preserves data
iD = iArray->GetVoidPointer(0);
switch (iType)
{
vtkTemplateMacro(CreateArrayPair(this, static_cast<VTK_TT*>(iD), static_cast<VTK_TT*>(iD),
numOutPts, iNumComp, iArray, static_cast<VTK_TT>(nullValue)));
} // over all VTK types
} // if not excluded
} // for each candidate array
}
#endif