IsosurfaceUniformGrid can now handle non square volumes.

This commit is contained in:
Robert Maynard 2015-08-28 16:48:19 -04:00
parent ae7f8441e1
commit 69f5a39931
2 changed files with 17 additions and 19 deletions

@ -109,7 +109,7 @@ public:
template<typename U, typename W, typename X> template<typename U, typename W, typename X>
VTKM_CONT_EXPORT VTKM_CONT_EXPORT
IsoSurfaceGenerate(const float ivalue, const vtkm::Id dims[3], IdPortalType triTablePortal, IsoSurfaceGenerate(const float ivalue, const vtkm::Id3 dims, IdPortalType triTablePortal,
const U & field, const U & source, const W & vertices, const X & scalars) : const U & field, const U & source, const W & vertices, const X & scalars) :
Isovalue(ivalue), xdim(dims[0]), ydim(dims[1]), zdim(dims[2]), Isovalue(ivalue), xdim(dims[0]), ydim(dims[1]), zdim(dims[2]),
xmin(-1), ymin(-1), zmin(-1), xmax(1), ymax(1), zmax(1), xmin(-1), ymin(-1), zmin(-1), xmax(1), ymax(1), zmax(1),
@ -199,14 +199,14 @@ public:
}; };
IsosurfaceFilterUniformGrid(const vtkm::Id &dim, IsosurfaceFilterUniformGrid(const vtkm::Id3 &vdims,
const vtkm::cont::DataSet &dataSet) : const vtkm::cont::DataSet &dataSet) :
Dim(dim), VDims(vdims),
DataSet(dataSet) DataSet(dataSet)
{ {
} }
vtkm::Id Dim; vtkm::Id3 VDims;
vtkm::cont::DataSet DataSet; vtkm::cont::DataSet DataSet;
template<typename IsoField, typename CoordinateType> template<typename IsoField, typename CoordinateType>
@ -217,8 +217,6 @@ public:
{ {
typedef typename vtkm::cont::DeviceAdapterAlgorithm<DeviceAdapter> DeviceAlgorithms; typedef typename vtkm::cont::DeviceAdapterAlgorithm<DeviceAdapter> DeviceAlgorithms;
const vtkm::Id vdims[3] = { this->Dim + 1, this->Dim + 1, this->Dim + 1 };
// Set up the Marching Cubes case tables // Set up the Marching Cubes case tables
vtkm::cont::ArrayHandle<vtkm::Id> vertexTableArray = vtkm::cont::ArrayHandle<vtkm::Id> vertexTableArray =
vtkm::cont::make_ArrayHandle(vtkm::worklet::internal::numVerticesTable, vtkm::cont::make_ArrayHandle(vtkm::worklet::internal::numVerticesTable,
@ -270,7 +268,7 @@ public:
IsoSurfaceGenerate isosurface(isovalue, IsoSurfaceGenerate isosurface(isovalue,
vdims, this->VDims,
triangleTableArray.PrepareForInput(DeviceAdapter()), triangleTableArray.PrepareForInput(DeviceAdapter()),
field, field,
field, field,

@ -37,11 +37,11 @@ public:
typedef void ExecutionSignature(_1, _2); typedef void ExecutionSignature(_1, _2);
typedef _1 InputDomain; typedef _1 InputDomain;
const int xdim, ydim, zdim, cellsPerLayer; const vtkm::Id xdim, ydim, zdim, cellsPerLayer;
const float xmin, ymin, zmin, xmax, ymax, zmax; const float xmin, ymin, zmin, xmax, ymax, zmax;
VTKM_CONT_EXPORT VTKM_CONT_EXPORT
TangleField(const int dims[3], const float mins[3], const float maxs[3]) : xdim(dims[0]), ydim(dims[1]), zdim(dims[2]), TangleField(const vtkm::Id3 dims, const float mins[3], const float maxs[3]) : xdim(dims[0]), ydim(dims[1]), zdim(dims[2]),
xmin(mins[0]), ymin(mins[1]), zmin(mins[2]), xmax(maxs[0]), ymax(maxs[1]), zmax(maxs[2]), cellsPerLayer((xdim) * (ydim)) { }; xmin(mins[0]), ymin(mins[1]), zmin(mins[2]), xmax(maxs[0]), ymax(maxs[1]), zmax(maxs[2]), cellsPerLayer((xdim) * (ydim)) { };
VTKM_EXEC_EXPORT VTKM_EXEC_EXPORT
@ -60,22 +60,22 @@ public:
}; };
vtkm::cont::DataSet MakeIsosurfaceTestDataSet(int dim) vtkm::cont::DataSet MakeIsosurfaceTestDataSet(vtkm::Id3 dims)
{ {
vtkm::cont::DataSet dataSet; vtkm::cont::DataSet dataSet;
const int vdim = dim + 1; const int dim3 = dim*dim*dim; const vtkm::Id3 vdims(dims[0] + 1, dims[1] + 1, dims[2] + 1);
int vdims[3] = { vdim, vdim, vdim }; const vtkm::Id dim3 = dims[0]*dims[1]*dims[2];
float mins[3] = {-1.0f, -1.0f, -1.0f}; float mins[3] = {-1.0f, -1.0f, -1.0f};
float maxs[3] = {1.0f, 1.0f, 1.0f}; float maxs[3] = {1.0f, 1.0f, 1.0f};
vtkm::cont::ArrayHandle<vtkm::Float32> fieldArray; vtkm::cont::ArrayHandle<vtkm::Float32> fieldArray;
vtkm::cont::ArrayHandleCounting<vtkm::Id> vertexCountImplicitArray(0, vdim*vdim*vdim); vtkm::cont::ArrayHandleCounting<vtkm::Id> vertexCountImplicitArray(0, vdims[0]*vdims[1]*vdims[2]);
vtkm::worklet::DispatcherMapField<TangleField> tangleFieldDispatcher(TangleField(vdims, mins, maxs)); vtkm::worklet::DispatcherMapField<TangleField> tangleFieldDispatcher(TangleField(vdims, mins, maxs));
tangleFieldDispatcher.Invoke(vertexCountImplicitArray, fieldArray); tangleFieldDispatcher.Invoke(vertexCountImplicitArray, fieldArray);
vtkm::cont::ArrayHandleUniformPointCoordinates vtkm::cont::ArrayHandleUniformPointCoordinates coordinates(vdims);
coordinates(vtkm::Id3(vdims[0], vdims[1], vdims[2]));
dataSet.AddCoordinateSystem( dataSet.AddCoordinateSystem(
vtkm::cont::CoordinateSystem("coordinates", 1, coordinates)); vtkm::cont::CoordinateSystem("coordinates", 1, coordinates));
@ -95,7 +95,7 @@ vtkm::cont::DataSet MakeIsosurfaceTestDataSet(int dim)
static const vtkm::IdComponent ndim = 3; static const vtkm::IdComponent ndim = 3;
vtkm::cont::CellSetStructured<ndim> cellSet("cells"); vtkm::cont::CellSetStructured<ndim> cellSet("cells");
cellSet.SetPointDimensions( vtkm::make_Vec(vdims[0], vdims[1], vdims[2]) ); cellSet.SetPointDimensions(vdims);
dataSet.AddCellSet(cellSet); dataSet.AddCellSet(cellSet);
return dataSet; return dataSet;
@ -108,13 +108,13 @@ void TestIsosurfaceUniformGrid()
{ {
std::cout << "Testing IsosurfaceUniformGrid Filter" << std::endl; std::cout << "Testing IsosurfaceUniformGrid Filter" << std::endl;
int dim = 4; vtkm::Id3 dims(4,4,4);
vtkm::cont::DataSet dataSet = MakeIsosurfaceTestDataSet(dim); vtkm::cont::DataSet dataSet = MakeIsosurfaceTestDataSet(dims);
typedef VTKM_DEFAULT_DEVICE_ADAPTER_TAG DeviceAdapter; typedef VTKM_DEFAULT_DEVICE_ADAPTER_TAG DeviceAdapter;
vtkm::worklet::IsosurfaceFilterUniformGrid<vtkm::Float32, vtkm::worklet::IsosurfaceFilterUniformGrid<vtkm::Float32,
DeviceAdapter> isosurfaceFilter(dim, dataSet); DeviceAdapter> isosurfaceFilter(dims, dataSet);
vtkm::cont::ArrayHandle<vtkm::Vec<vtkm::Float32,3> > verticesArray; vtkm::cont::ArrayHandle<vtkm::Vec<vtkm::Float32,3> > verticesArray;
vtkm::cont::ArrayHandle<vtkm::Float32> scalarsArray; vtkm::cont::ArrayHandle<vtkm::Float32> scalarsArray;