mirror of
https://gitlab.kitware.com/vtk/vtk-m
synced 2024-10-05 01:49:02 +00:00
Compare commits
9 Commits
5a72c9e33c
...
f7f464bc0b
Author | SHA1 | Date | |
---|---|---|---|
|
f7f464bc0b | ||
|
726bd0b551 | ||
|
743a7c3ac4 | ||
|
b6a0e4d79b | ||
|
638d183567 | ||
|
1078d7dfb4 | ||
|
dde6888b1c | ||
|
0723ab473e | ||
|
5677811468 |
30
docs/changelog/vec-constexpr.md
Normal file
30
docs/changelog/vec-constexpr.md
Normal file
@ -0,0 +1,30 @@
|
||||
# Improve constexpr behavior of `Vec` classes
|
||||
|
||||
The implementation of `Vec` made it difficult to use within a `constexpr`
|
||||
function. For example, the following would not compile.
|
||||
|
||||
``` cpp
|
||||
constexpr vtkm::UInt8 OctFlip(vtkm::UInt8 value)
|
||||
{
|
||||
vtkm::Vec<vtkm::UInt8, 8> flips = { 0, 6, 2, 6, 1, 5, 3, 7 };
|
||||
return flips[value];
|
||||
}
|
||||
```
|
||||
|
||||
The problem was that `flips` could not be initialized in a `constexpr`
|
||||
function because the constructer was not `constexpr`.
|
||||
|
||||
This change fixes this problem by _removing_ the constructor that takes a
|
||||
`std::initializer_list`. The problem with `std::initializer_list` is that
|
||||
it cannot be used to directly initialize an array and the loop to do the
|
||||
initialization cannot be used in a `constexpr`.
|
||||
|
||||
With the removal of this constructor, construction with a braced list
|
||||
should go to the constructor that takes a variadic number of parameters.
|
||||
|
||||
Note that it is possible that some initialization of `vtkm::Vec` could
|
||||
break. You can no longer construct an `std::initializer_list` and pass it
|
||||
to a `vtkm::Vec` constructor. This seems like a less likely case and can be
|
||||
gotten around by just copying the data yourself. It is also possible that
|
||||
putting a braced list in parentheses will stop working. This can be fixed
|
||||
by just deleting the parentheses.
|
79
vtkm/Types.h
79
vtkm/Types.h
@ -587,7 +587,6 @@ public:
|
||||
const ComponentType* GetPointer() const { return &this->Component(0); }
|
||||
};
|
||||
|
||||
|
||||
/// Base implementation of all Vec classes.
|
||||
///
|
||||
template <typename T, vtkm::IdComponent Size, typename DerivedClass>
|
||||
@ -601,7 +600,6 @@ public:
|
||||
|
||||
// The enable_if predicate will disable this constructor for Size=1 so that
|
||||
// the variadic constructor constexpr VecBase(T, Ts&&...) is called instead.
|
||||
VTKM_SUPPRESS_EXEC_WARNINGS
|
||||
template <vtkm::IdComponent Size2 = Size, typename std::enable_if<Size2 != 1, int>::type = 0>
|
||||
VTKM_EXEC_CONT explicit VecBase(const ComponentType& value)
|
||||
{
|
||||
@ -611,38 +609,75 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
VTKM_SUPPRESS_EXEC_WARNINGS
|
||||
private:
|
||||
VTKM_EXEC_CONT constexpr ComponentType&& ConvertOrForward(ComponentType&& x)
|
||||
{
|
||||
return std::move(x);
|
||||
}
|
||||
VTKM_EXEC_CONT constexpr const ComponentType& ConvertOrForward(const ComponentType& x)
|
||||
{
|
||||
return x;
|
||||
}
|
||||
template <typename OtherT>
|
||||
VTKM_EXEC_CONT constexpr auto ConvertOrForward(const OtherT& x)
|
||||
{
|
||||
return static_cast<ComponentType>(x);
|
||||
}
|
||||
|
||||
public:
|
||||
// Note that this constructor assumes that all the arguments are of type `ComponentType`.
|
||||
// If they are not, this might suppress a type-conversion warning.
|
||||
// It could also raise an error if the type is incompatible with `ComponentType`.
|
||||
template <typename... Ts>
|
||||
VTKM_EXEC_CONT constexpr VecBase(ComponentType value0, Ts&&... values)
|
||||
: Components{ value0, values... }
|
||||
: Components{ value0, this->ConvertOrForward(std::forward<Ts>(values))... }
|
||||
{
|
||||
VTKM_STATIC_ASSERT(sizeof...(Ts) + 1 == Size);
|
||||
}
|
||||
|
||||
VTKM_SUPPRESS_EXEC_WARNINGS
|
||||
VTKM_EXEC_CONT
|
||||
VecBase(std::initializer_list<ComponentType> values)
|
||||
{
|
||||
ComponentType* dest = this->Components;
|
||||
auto src = values.begin();
|
||||
if (values.size() == 1)
|
||||
{
|
||||
for (vtkm::IdComponent i = 0; i < Size; ++i)
|
||||
{
|
||||
this->Components[i] = *src;
|
||||
++dest;
|
||||
}
|
||||
}
|
||||
else
|
||||
// Ideally, we want to initialize `Vec`s with brace initialization (e.g.,
|
||||
// `Vec<...> v = { x, y, z, ... };`) with the constructor above. This allows
|
||||
// the constructor to be `constexpr` without any iterators for setting the values.
|
||||
// However, the above constructor fails for nested `Vec` types (e.g.,
|
||||
// `Vec<Vec<...>, N> v = { { x, y }, { z, w }, ... };`) because the type for
|
||||
// the internal brace initialization cannot be determined. In this case, we fall
|
||||
// back to using `std::initializer_list`, which cannot be made constexpr.
|
||||
//
|
||||
// Note that we don't create a constructor with a basic
|
||||
// 'std::initializer_list<ComponentType>` because that would take precidence over
|
||||
// the constructor that we usually want.
|
||||
template <typename SubT>
|
||||
VTKM_EXEC_CONT VecBase(const std::initializer_list<std::initializer_list<SubT>>& values)
|
||||
{
|
||||
VTKM_ASSERT((values.size() == NUM_COMPONENTS) &&
|
||||
"Vec object initialized wrong number of components.");
|
||||
for (; src != values.end(); ++src)
|
||||
ComponentType* dest = this->Components;
|
||||
for (auto&& src : values)
|
||||
{
|
||||
*dest = *src;
|
||||
VTKM_ASSERT((src.size() == ComponentType::NUM_COMPONENTS) &&
|
||||
"Vec component objects initialized wrong number of components.");
|
||||
vtkm::IdComponent cIndex = 0;
|
||||
for (auto&& srcComponent : src)
|
||||
{
|
||||
(*dest)[cIndex] = static_cast<typename ComponentType::ComponentType>(srcComponent);
|
||||
++cIndex;
|
||||
}
|
||||
++dest;
|
||||
}
|
||||
}
|
||||
// Make sure triply nested or more also works.
|
||||
template <typename SubT>
|
||||
VTKM_EXEC_CONT VecBase(
|
||||
const std::initializer_list<std::initializer_list<std::initializer_list<SubT>>>& values)
|
||||
{
|
||||
VTKM_ASSERT((values.size() == NUM_COMPONENTS) &&
|
||||
"Vec object initialized wrong number of components.");
|
||||
ComponentType* dest = this->Components;
|
||||
for (auto&& src : values)
|
||||
{
|
||||
*dest = ComponentType{ src };
|
||||
++dest;
|
||||
}
|
||||
}
|
||||
|
||||
#if (!(defined(VTKM_CUDA) && (__CUDACC_VER_MAJOR__ < 8)))
|
||||
@ -682,7 +717,7 @@ public:
|
||||
return this->Components[idx];
|
||||
}
|
||||
|
||||
inline VTKM_EXEC_CONT ComponentType& operator[](vtkm::IdComponent idx)
|
||||
inline VTKM_EXEC_CONT constexpr ComponentType& operator[](vtkm::IdComponent idx)
|
||||
{
|
||||
VTKM_ASSERT(idx >= 0);
|
||||
VTKM_ASSERT(idx < NUM_COMPONENTS);
|
||||
|
@ -28,6 +28,7 @@ set(contour_sources_device
|
||||
MIRFilter.cxx
|
||||
Slice.cxx
|
||||
SliceMultiple.cxx
|
||||
worklet/contour/FlyingEdgesTables.cxx
|
||||
)
|
||||
|
||||
set(contour_sources
|
||||
|
@ -127,7 +127,8 @@ vtkm::cont::CellSetSingleType<> execute(
|
||||
metaDataMin,
|
||||
metaDataMax,
|
||||
metaDataNumTris,
|
||||
edgeCases);
|
||||
edgeCases,
|
||||
data::FlyingEdgesTablesExecObject{});
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
|
@ -16,6 +16,8 @@
|
||||
#include <vtkm/filter/contour/worklet/contour/FlyingEdgesHelpers.h>
|
||||
#include <vtkm/filter/contour/worklet/contour/FlyingEdgesTables.h>
|
||||
|
||||
#include <vtkm/worklet/WorkletMapTopology.h>
|
||||
|
||||
namespace vtkm
|
||||
{
|
||||
namespace worklet
|
||||
@ -38,8 +40,9 @@ struct ComputePass2 : public vtkm::worklet::WorkletVisitCellsWithPoints
|
||||
FieldInPoint axis_mins,
|
||||
FieldInPoint axis_maxs,
|
||||
FieldOutCell cell_tri_count,
|
||||
WholeArrayIn edgeData);
|
||||
using ExecutionSignature = void(ThreadIndices, _2, _3, _4, _5, _6, Device);
|
||||
WholeArrayIn edgeData,
|
||||
ExecObject tables);
|
||||
using ExecutionSignature = void(ThreadIndices, _2, _3, _4, _5, _6, _7, Device);
|
||||
using InputDomain = _1;
|
||||
|
||||
template <typename ThreadIndices,
|
||||
@ -53,6 +56,7 @@ struct ComputePass2 : public vtkm::worklet::WorkletVisitCellsWithPoints
|
||||
const FieldInPointId& axis_maxs,
|
||||
vtkm::Int32& cell_tri_count,
|
||||
const WholeEdgeField& edges,
|
||||
const data::FlyingEdgesTables& tables,
|
||||
Device) const
|
||||
{
|
||||
using AxisToSum = typename select_AxisToSum<Device>::type;
|
||||
@ -95,7 +99,7 @@ struct ComputePass2 : public vtkm::worklet::WorkletVisitCellsWithPoints
|
||||
for (vtkm::Id i = left; i < right; ++i) // run along the trimmed voxels
|
||||
{
|
||||
vtkm::UInt8 edgeCase = getEdgeCase(edges, startPos, (axis_inc * i));
|
||||
vtkm::UInt8 numTris = data::GetNumberOfPrimitives(edgeCase);
|
||||
vtkm::UInt8 numTris = tables.GetNumberOfPrimitives(edgeCase);
|
||||
if (numTris > 0)
|
||||
{
|
||||
cell_tri_count += numTris;
|
||||
@ -103,7 +107,7 @@ struct ComputePass2 : public vtkm::worklet::WorkletVisitCellsWithPoints
|
||||
// Count the number of y- and z-points to be generated. Pass# 1 counted
|
||||
// the number of x-intersections along the x-edges. Now we count all
|
||||
// intersections on the y- and z-voxel axes.
|
||||
auto* edgeUses = data::GetEdgeUses(edgeCase);
|
||||
const vtkm::Vec<vtkm::UInt8, 12>& edgeUses = tables.GetEdgeUses(edgeCase);
|
||||
|
||||
onBoundary[AxisToSum::xindex] = (i >= (pdims[AxisToSum::xindex] - 2));
|
||||
|
||||
@ -140,7 +144,7 @@ struct ComputePass2 : public vtkm::worklet::WorkletVisitCellsWithPoints
|
||||
template <typename AxisToSum>
|
||||
VTKM_EXEC inline void CountBoundaryEdgeUses(AxisToSum,
|
||||
vtkm::Vec<bool, 3> onBoundary,
|
||||
vtkm::UInt8 const* const edgeUses,
|
||||
const vtkm::Vec<vtkm::UInt8, 12>& edgeUses,
|
||||
vtkm::Id3& sums,
|
||||
vtkm::Id3& adj_row_sum,
|
||||
vtkm::Id3& adj_col_sum) const
|
||||
|
@ -13,6 +13,7 @@
|
||||
#ifndef vtk_m_worklet_contour_flyingedges_pass4_h
|
||||
#define vtk_m_worklet_contour_flyingedges_pass4_h
|
||||
|
||||
#include <vtkm/filter/contour/worklet/contour/CommonState.h>
|
||||
#include <vtkm/filter/contour/worklet/contour/FlyingEdgesPass4Common.h>
|
||||
#include <vtkm/filter/contour/worklet/contour/FlyingEdgesPass4X.h>
|
||||
#include <vtkm/filter/contour/worklet/contour/FlyingEdgesPass4XWithNormals.h>
|
||||
@ -79,6 +80,7 @@ struct launchComputePass4
|
||||
edgeCases,
|
||||
coordinateSystem,
|
||||
inputField,
|
||||
data::FlyingEdgesTablesExecObject{},
|
||||
triangle_topology,
|
||||
sharedState.InterpolationEdgeIds,
|
||||
sharedState.InterpolationWeights,
|
||||
@ -99,6 +101,7 @@ struct launchComputePass4
|
||||
edgeCases,
|
||||
coordinateSystem,
|
||||
inputField,
|
||||
data::FlyingEdgesTablesExecObject{},
|
||||
triangle_topology,
|
||||
sharedState.InterpolationEdgeIds,
|
||||
sharedState.InterpolationWeights,
|
||||
@ -145,6 +148,7 @@ struct launchComputePass4
|
||||
metaDataNumTris,
|
||||
edgeCases,
|
||||
inputField,
|
||||
data::FlyingEdgesTablesExecObject{},
|
||||
triangle_topology,
|
||||
sharedState.InterpolationEdgeIds,
|
||||
sharedState.InterpolationWeights,
|
||||
|
@ -43,7 +43,7 @@ VTKM_EXEC inline constexpr vtkm::Id increment_cellId(SumYAxis,
|
||||
return cellId + ((y_point_axis_inc - 1) * numToIncrement);
|
||||
}
|
||||
|
||||
VTKM_EXEC inline bool case_includes_axes(vtkm::UInt8 const* const edgeUses)
|
||||
VTKM_EXEC inline bool case_includes_axes(const vtkm::Vec<vtkm::UInt8, 12>& edgeUses)
|
||||
{
|
||||
return (edgeUses[0] != 0 || edgeUses[4] != 0 || edgeUses[8] != 0);
|
||||
}
|
||||
@ -54,11 +54,12 @@ VTKM_EXEC inline void generate_tris(vtkm::Id inputCellId,
|
||||
vtkm::UInt8 numTris,
|
||||
vtkm::Id* edgeIds,
|
||||
vtkm::Id& triId,
|
||||
const data::FlyingEdgesTables& tables,
|
||||
const WholeConnField& conn,
|
||||
const WholeCellIdField& cellIds)
|
||||
{
|
||||
auto* edges = data::GetTriEdgeCases(edgeCase);
|
||||
vtkm::Id edgeIndex = 1;
|
||||
const vtkm::Vec<vtkm::UInt8, 16>& edges = tables.GetTriEdgeCases(edgeCase);
|
||||
vtkm::IdComponent edgeIndex = 1;
|
||||
vtkm::Id index = static_cast<vtkm::Id>(triId) * 3;
|
||||
for (vtkm::UInt8 i = 0; i < numTris; ++i)
|
||||
{
|
||||
@ -85,9 +86,10 @@ VTKM_EXEC inline void init_voxelIds(AxisToSum,
|
||||
vtkm::Id writeOffset,
|
||||
vtkm::UInt8 edgeCase,
|
||||
const FieldInPointId3& axis_sums,
|
||||
const data::FlyingEdgesTables& tables,
|
||||
vtkm::Id* edgeIds)
|
||||
{
|
||||
auto* edgeUses = data::GetEdgeUses(edgeCase);
|
||||
const vtkm::Vec<vtkm::UInt8, 12>& edgeUses = tables.GetEdgeUses(edgeCase);
|
||||
edgeIds[0] = writeOffset + axis_sums[0][AxisToSum::xindex]; // x-edges
|
||||
edgeIds[1] = writeOffset + axis_sums[1][AxisToSum::xindex];
|
||||
edgeIds[2] = writeOffset + axis_sums[3][AxisToSum::xindex];
|
||||
@ -104,7 +106,8 @@ VTKM_EXEC inline void init_voxelIds(AxisToSum,
|
||||
|
||||
// Helper function to advance the point ids along voxel rows.
|
||||
//----------------------------------------------------------------------------
|
||||
VTKM_EXEC inline void advance_voxelIds(vtkm::UInt8 const* const edgeUses, vtkm::Id* edgeIds)
|
||||
VTKM_EXEC inline void advance_voxelIds(const vtkm::Vec<vtkm::UInt8, 12>& edgeUses,
|
||||
vtkm::Id* edgeIds)
|
||||
{
|
||||
edgeIds[0] += edgeUses[0]; // x-edges
|
||||
edgeIds[1] += edgeUses[1];
|
||||
|
@ -57,13 +57,14 @@ struct ComputePass4X : public vtkm::worklet::WorkletVisitCellsWithPoints
|
||||
WholeArrayIn edgeData,
|
||||
WholeArrayIn coords,
|
||||
WholeArrayIn data,
|
||||
ExecObject tables,
|
||||
WholeArrayOut connectivity,
|
||||
WholeArrayOut edgeIds,
|
||||
WholeArrayOut weights,
|
||||
WholeArrayOut inputCellIds,
|
||||
WholeArrayOut points);
|
||||
using ExecutionSignature =
|
||||
void(ThreadIndices, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, WorkIndex);
|
||||
void(ThreadIndices, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, WorkIndex);
|
||||
|
||||
template <typename ThreadIndices,
|
||||
typename FieldInPointId3,
|
||||
@ -85,6 +86,7 @@ struct ComputePass4X : public vtkm::worklet::WorkletVisitCellsWithPoints
|
||||
const WholeEdgeField& edges,
|
||||
const WholeCoordsField& coords,
|
||||
const WholeDataField& field,
|
||||
const data::FlyingEdgesTables& tables,
|
||||
const WholeConnField& conn,
|
||||
const WholeEdgeIdField& interpolatedEdgeIds,
|
||||
const WholeWeightField& weights,
|
||||
@ -116,20 +118,20 @@ struct ComputePass4X : public vtkm::worklet::WorkletVisitCellsWithPoints
|
||||
vtkm::Id edgeIds[12];
|
||||
|
||||
auto edgeCase = getEdgeCase(edges, state.startPos, (state.axis_inc * state.left));
|
||||
init_voxelIds(AxisToSum{}, this->PointWriteOffset, edgeCase, axis_sums, edgeIds);
|
||||
init_voxelIds(AxisToSum{}, this->PointWriteOffset, edgeCase, axis_sums, tables, edgeIds);
|
||||
for (vtkm::Id i = state.left; i < state.right; ++i) // run along the trimmed voxels
|
||||
{
|
||||
edgeCase = getEdgeCase(edges, state.startPos, (state.axis_inc * i));
|
||||
vtkm::UInt8 numTris = data::GetNumberOfPrimitives(edgeCase);
|
||||
vtkm::UInt8 numTris = tables.GetNumberOfPrimitives(edgeCase);
|
||||
if (numTris > 0)
|
||||
{
|
||||
// Start by generating triangles for this case
|
||||
generate_tris(
|
||||
state.cellId, edgeCase, numTris, edgeIds, cell_tri_offset, conn, inputCellIds);
|
||||
state.cellId, edgeCase, numTris, edgeIds, cell_tri_offset, tables, conn, inputCellIds);
|
||||
|
||||
// Now generate edgeIds and weights along voxel axes if needed. Remember to take
|
||||
// boundary into account.
|
||||
auto* edgeUses = data::GetEdgeUses(edgeCase);
|
||||
const vtkm::Vec<vtkm::UInt8, 12>& edgeUses = tables.GetEdgeUses(edgeCase);
|
||||
if (!fully_interior(state.boundaryStatus) || case_includes_axes(edgeUses))
|
||||
{
|
||||
this->Generate(state.boundaryStatus,
|
||||
@ -143,6 +145,7 @@ struct ComputePass4X : public vtkm::worklet::WorkletVisitCellsWithPoints
|
||||
increments,
|
||||
(state.axis_inc * i),
|
||||
edgeUses,
|
||||
tables,
|
||||
edgeIds);
|
||||
}
|
||||
advance_voxelIds(edgeUses, edgeIds);
|
||||
@ -167,7 +170,8 @@ struct ComputePass4X : public vtkm::worklet::WorkletVisitCellsWithPoints
|
||||
const vtkm::Id4& startPos,
|
||||
const vtkm::Id3& incs,
|
||||
vtkm::Id offset,
|
||||
vtkm::UInt8 const* const edgeUses,
|
||||
const vtkm::Vec<vtkm::UInt8, 12>& edgeUses,
|
||||
const data::FlyingEdgesTables& tables,
|
||||
vtkm::Id* edgeIds) const
|
||||
{
|
||||
using AxisToSum = SumXAxis;
|
||||
@ -230,30 +234,30 @@ struct ComputePass4X : public vtkm::worklet::WorkletVisitCellsWithPoints
|
||||
const bool onZ = boundaryStatus[AxisToSum::zindex] & FlyingEdges3D::MaxBoundary;
|
||||
if (onX) //+x boundary
|
||||
{
|
||||
this->InterpolateEdge(ijk, pos[0], incs, 5, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, coords, points);
|
||||
this->InterpolateEdge(ijk, pos[0], incs, 9, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, coords, points);
|
||||
this->InterpolateEdge(ijk, pos[0], incs, 5, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, coords, points, tables);
|
||||
this->InterpolateEdge(ijk, pos[0], incs, 9, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, coords, points, tables);
|
||||
if (onY) //+x +y
|
||||
{
|
||||
this->InterpolateEdge(ijk, pos[0], incs, 11, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, coords, points);
|
||||
this->InterpolateEdge(ijk, pos[0], incs, 11, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, coords, points, tables);
|
||||
}
|
||||
if (onZ) //+x +z
|
||||
{
|
||||
this->InterpolateEdge(ijk, pos[0], incs, 7, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, coords, points);
|
||||
this->InterpolateEdge(ijk, pos[0], incs, 7, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, coords, points, tables);
|
||||
}
|
||||
}
|
||||
if (onY) //+y boundary
|
||||
{
|
||||
this->InterpolateEdge(ijk, pos[0], incs, 1, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, coords, points);
|
||||
this->InterpolateEdge(ijk, pos[0], incs, 10, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, coords, points);
|
||||
this->InterpolateEdge(ijk, pos[0], incs, 1, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, coords, points, tables);
|
||||
this->InterpolateEdge(ijk, pos[0], incs, 10, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, coords, points, tables);
|
||||
if (onZ) //+y +z boundary
|
||||
{
|
||||
this->InterpolateEdge(ijk, pos[0], incs, 3, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, coords, points);
|
||||
this->InterpolateEdge(ijk, pos[0], incs, 3, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, coords, points, tables);
|
||||
}
|
||||
}
|
||||
if (onZ) //+z boundary
|
||||
{
|
||||
this->InterpolateEdge(ijk, pos[0], incs, 2, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, coords, points);
|
||||
this->InterpolateEdge(ijk, pos[0], incs, 6, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, coords, points);
|
||||
this->InterpolateEdge(ijk, pos[0], incs, 2, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, coords, points, tables);
|
||||
this->InterpolateEdge(ijk, pos[0], incs, 6, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, coords, points, tables);
|
||||
}
|
||||
// clang-format on
|
||||
}
|
||||
@ -268,14 +272,15 @@ struct ComputePass4X : public vtkm::worklet::WorkletVisitCellsWithPoints
|
||||
VTKM_EXEC inline void InterpolateEdge(const vtkm::Id3& ijk,
|
||||
vtkm::Id currentIdx,
|
||||
const vtkm::Id3& incs,
|
||||
vtkm::Id edgeNum,
|
||||
vtkm::UInt8 const* const edgeUses,
|
||||
vtkm::IdComponent edgeNum,
|
||||
const vtkm::Vec<vtkm::UInt8, 12>& edgeUses,
|
||||
vtkm::Id* edgeIds,
|
||||
const WholeField& field,
|
||||
const WholeIEdgeField& interpolatedEdgeIds,
|
||||
const WholeWeightField& weights,
|
||||
const WholeCoordsField& coords,
|
||||
const WholePointField& points) const
|
||||
const WholePointField& points,
|
||||
const data::FlyingEdgesTables& tables) const
|
||||
{
|
||||
using AxisToSum = SumXAxis;
|
||||
|
||||
@ -287,10 +292,10 @@ struct ComputePass4X : public vtkm::worklet::WorkletVisitCellsWithPoints
|
||||
const vtkm::Id writeIndex = edgeIds[edgeNum];
|
||||
|
||||
// build the edge information
|
||||
vtkm::Vec<vtkm::UInt8, 2> verts = data::GetVertMap(edgeNum);
|
||||
vtkm::Vec2ui_8 verts = tables.GetVertMap(edgeNum);
|
||||
|
||||
vtkm::Id3 offsets1 = data::GetVertOffsets(AxisToSum{}, verts[0]);
|
||||
vtkm::Id3 offsets2 = data::GetVertOffsets(AxisToSum{}, verts[1]);
|
||||
vtkm::Id3 offsets1 = tables.GetVertOffsets(AxisToSum{}, verts[0]);
|
||||
vtkm::Id3 offsets2 = tables.GetVertOffsets(AxisToSum{}, verts[1]);
|
||||
|
||||
vtkm::Id2 iEdge(currentIdx + vtkm::Dot(offsets1, incs), currentIdx + vtkm::Dot(offsets2, incs));
|
||||
|
||||
|
@ -56,6 +56,7 @@ struct ComputePass4XWithNormals : public vtkm::worklet::WorkletVisitCellsWithPoi
|
||||
WholeArrayIn edgeData,
|
||||
WholeArrayIn coords,
|
||||
WholeArrayIn data,
|
||||
ExecObject tables,
|
||||
WholeArrayOut connectivity,
|
||||
WholeArrayOut edgeIds,
|
||||
WholeArrayOut weights,
|
||||
@ -63,7 +64,7 @@ struct ComputePass4XWithNormals : public vtkm::worklet::WorkletVisitCellsWithPoi
|
||||
WholeArrayOut points,
|
||||
WholeArrayOut normals);
|
||||
using ExecutionSignature =
|
||||
void(ThreadIndices, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, WorkIndex);
|
||||
void(ThreadIndices, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, WorkIndex);
|
||||
|
||||
template <typename ThreadIndices,
|
||||
typename FieldInPointId3,
|
||||
@ -86,6 +87,7 @@ struct ComputePass4XWithNormals : public vtkm::worklet::WorkletVisitCellsWithPoi
|
||||
const WholeEdgeField& edges,
|
||||
const WholeCoordsField& coords,
|
||||
const WholeDataField& field,
|
||||
const data::FlyingEdgesTables& tables,
|
||||
const WholeConnField& conn,
|
||||
const WholeEdgeIdField& interpolatedEdgeIds,
|
||||
const WholeWeightField& weights,
|
||||
@ -118,21 +120,21 @@ struct ComputePass4XWithNormals : public vtkm::worklet::WorkletVisitCellsWithPoi
|
||||
vtkm::Id edgeIds[12];
|
||||
|
||||
auto edgeCase = getEdgeCase(edges, state.startPos, (state.axis_inc * state.left));
|
||||
init_voxelIds(AxisToSum{}, this->PointWriteOffset, edgeCase, axis_sums, edgeIds);
|
||||
init_voxelIds(AxisToSum{}, this->PointWriteOffset, edgeCase, axis_sums, tables, edgeIds);
|
||||
for (vtkm::Id i = state.left; i < state.right; ++i) // run along the trimmed voxels
|
||||
{
|
||||
edgeCase = getEdgeCase(edges, state.startPos, (state.axis_inc * i));
|
||||
vtkm::UInt8 numTris = data::GetNumberOfPrimitives(edgeCase);
|
||||
vtkm::UInt8 numTris = tables.GetNumberOfPrimitives(edgeCase);
|
||||
if (numTris > 0)
|
||||
{
|
||||
// Start by generating triangles for this case
|
||||
generate_tris(
|
||||
state.cellId, edgeCase, numTris, edgeIds, cell_tri_offset, conn, inputCellIds);
|
||||
state.cellId, edgeCase, numTris, edgeIds, cell_tri_offset, tables, conn, inputCellIds);
|
||||
|
||||
// Now generate edgeIds and weights along voxel axes if needed. Remember to take
|
||||
// boundary into account.
|
||||
|
||||
auto* edgeUses = data::GetEdgeUses(edgeCase);
|
||||
const vtkm::Vec<vtkm::UInt8, 12>& edgeUses = tables.GetEdgeUses(edgeCase);
|
||||
if (!fully_interior(state.boundaryStatus) || case_includes_axes(edgeUses))
|
||||
{
|
||||
this->Generate(state.boundaryStatus,
|
||||
@ -147,6 +149,7 @@ struct ComputePass4XWithNormals : public vtkm::worklet::WorkletVisitCellsWithPoi
|
||||
increments,
|
||||
(state.axis_inc * i),
|
||||
edgeUses,
|
||||
tables,
|
||||
edgeIds);
|
||||
}
|
||||
advance_voxelIds(edgeUses, edgeIds);
|
||||
@ -173,7 +176,8 @@ struct ComputePass4XWithNormals : public vtkm::worklet::WorkletVisitCellsWithPoi
|
||||
const vtkm::Id4& startPos,
|
||||
const vtkm::Id3& incs,
|
||||
vtkm::Id offset,
|
||||
vtkm::UInt8 const* const edgeUses,
|
||||
const vtkm::Vec<vtkm::UInt8, 12>& edgeUses,
|
||||
const data::FlyingEdgesTables& tables,
|
||||
vtkm::Id* edgeIds) const
|
||||
{
|
||||
using AxisToSum = SumXAxis;
|
||||
@ -257,38 +261,38 @@ struct ComputePass4XWithNormals : public vtkm::worklet::WorkletVisitCellsWithPoi
|
||||
if (onX) //+x boundary
|
||||
{
|
||||
this->InterpolateEdge(
|
||||
fullyInterior, ijk, pos[0], incs, 5, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, coords, points, normals);
|
||||
fullyInterior, ijk, pos[0], incs, 5, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, coords, points, normals, tables);
|
||||
this->InterpolateEdge(
|
||||
fullyInterior, ijk, pos[0], incs, 9, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, coords, points, normals);
|
||||
fullyInterior, ijk, pos[0], incs, 9, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, coords, points, normals, tables);
|
||||
if (onY) //+x +y
|
||||
{
|
||||
this->InterpolateEdge(
|
||||
fullyInterior, ijk, pos[0], incs, 11, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, coords, points, normals);
|
||||
fullyInterior, ijk, pos[0], incs, 11, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, coords, points, normals, tables);
|
||||
}
|
||||
if (onZ) //+x +z
|
||||
{
|
||||
this->InterpolateEdge(
|
||||
fullyInterior, ijk, pos[0], incs, 7, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, coords, points, normals);
|
||||
fullyInterior, ijk, pos[0], incs, 7, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, coords, points, normals, tables);
|
||||
}
|
||||
}
|
||||
if (onY) //+y boundary
|
||||
{
|
||||
this->InterpolateEdge(
|
||||
fullyInterior, ijk, pos[0], incs, 1, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, coords, points, normals);
|
||||
fullyInterior, ijk, pos[0], incs, 1, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, coords, points, normals, tables);
|
||||
this->InterpolateEdge(
|
||||
fullyInterior, ijk, pos[0], incs, 10, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, coords, points, normals);
|
||||
fullyInterior, ijk, pos[0], incs, 10, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, coords, points, normals, tables);
|
||||
if (onZ) //+y +z boundary
|
||||
{
|
||||
this->InterpolateEdge(
|
||||
fullyInterior, ijk, pos[0], incs, 3, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, coords, points, normals);
|
||||
fullyInterior, ijk, pos[0], incs, 3, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, coords, points, normals, tables);
|
||||
}
|
||||
}
|
||||
if (onZ) //+z boundary
|
||||
{
|
||||
this->InterpolateEdge(
|
||||
fullyInterior, ijk, pos[0], incs, 2, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, coords, points, normals);
|
||||
fullyInterior, ijk, pos[0], incs, 2, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, coords, points, normals, tables);
|
||||
this->InterpolateEdge(
|
||||
fullyInterior, ijk, pos[0], incs, 6, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, coords, points, normals);
|
||||
fullyInterior, ijk, pos[0], incs, 6, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, coords, points, normals, tables);
|
||||
}
|
||||
// clang-format on
|
||||
}
|
||||
@ -305,15 +309,16 @@ struct ComputePass4XWithNormals : public vtkm::worklet::WorkletVisitCellsWithPoi
|
||||
const vtkm::Id3& ijk,
|
||||
vtkm::Id currentIdx,
|
||||
const vtkm::Id3& incs,
|
||||
vtkm::Id edgeNum,
|
||||
vtkm::UInt8 const* const edgeUses,
|
||||
vtkm::IdComponent edgeNum,
|
||||
const vtkm::Vec<vtkm::UInt8, 12>& edgeUses,
|
||||
vtkm::Id* edgeIds,
|
||||
const WholeField& field,
|
||||
const WholeIEdgeField& interpolatedEdgeIds,
|
||||
const WholeWeightField& weights,
|
||||
const WholeCoordsField& coords,
|
||||
const WholePointField& points,
|
||||
const WholeNormalField& normals) const
|
||||
const WholeNormalField& normals,
|
||||
const data::FlyingEdgesTables& tables) const
|
||||
{
|
||||
using AxisToSum = SumXAxis;
|
||||
|
||||
@ -325,10 +330,10 @@ struct ComputePass4XWithNormals : public vtkm::worklet::WorkletVisitCellsWithPoi
|
||||
const vtkm::Id writeIndex = edgeIds[edgeNum];
|
||||
|
||||
// build the edge information
|
||||
vtkm::Vec<vtkm::UInt8, 2> verts = data::GetVertMap(edgeNum);
|
||||
vtkm::Vec2ui_8 verts = tables.GetVertMap(edgeNum);
|
||||
|
||||
vtkm::Id3 offsets1 = data::GetVertOffsets(AxisToSum{}, verts[0]);
|
||||
vtkm::Id3 offsets2 = data::GetVertOffsets(AxisToSum{}, verts[1]);
|
||||
vtkm::Id3 offsets1 = tables.GetVertOffsets(AxisToSum{}, verts[0]);
|
||||
vtkm::Id3 offsets2 = tables.GetVertOffsets(AxisToSum{}, verts[1]);
|
||||
|
||||
vtkm::Id2 iEdge(currentIdx + vtkm::Dot(offsets1, incs), currentIdx + vtkm::Dot(offsets2, incs));
|
||||
|
||||
|
@ -15,10 +15,12 @@
|
||||
|
||||
|
||||
#include <vtkm/filter/contour/worklet/contour/FlyingEdgesHelpers.h>
|
||||
#include <vtkm/filter/contour/worklet/contour/FlyingEdgesPass4Common.h>
|
||||
#include <vtkm/filter/contour/worklet/contour/FlyingEdgesTables.h>
|
||||
|
||||
#include <vtkm/VectorAnalysis.h>
|
||||
#include <vtkm/filter/vector_analysis/worklet/gradient/StructuredPointGradient.h>
|
||||
#include <vtkm/worklet/WorkletMapTopology.h>
|
||||
|
||||
namespace vtkm
|
||||
{
|
||||
@ -58,12 +60,13 @@ struct ComputePass4Y : public vtkm::worklet::WorkletVisitCellsWithPoints
|
||||
WholeArrayIn cell_tri_count,
|
||||
WholeArrayIn edgeData,
|
||||
WholeArrayIn data,
|
||||
ExecObject tables,
|
||||
WholeArrayOut connectivity,
|
||||
WholeArrayOut edgeIds,
|
||||
WholeArrayOut weights,
|
||||
WholeArrayOut inputCellIds);
|
||||
using ExecutionSignature =
|
||||
void(ThreadIndices, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, WorkIndex);
|
||||
void(ThreadIndices, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, WorkIndex);
|
||||
|
||||
template <typename ThreadIndices,
|
||||
typename FieldInPointId3,
|
||||
@ -82,6 +85,7 @@ struct ComputePass4Y : public vtkm::worklet::WorkletVisitCellsWithPoints
|
||||
const WholeTriField& cellTriCount,
|
||||
const WholeEdgeField& edges,
|
||||
const WholeDataField& field,
|
||||
const data::FlyingEdgesTables& tables,
|
||||
const WholeConnField& conn,
|
||||
const WholeEdgeIdField& interpolatedEdgeIds,
|
||||
const WholeWeightField& weights,
|
||||
@ -112,20 +116,20 @@ struct ComputePass4Y : public vtkm::worklet::WorkletVisitCellsWithPoints
|
||||
vtkm::Id edgeIds[12];
|
||||
|
||||
auto edgeCase = getEdgeCase(edges, state.startPos, (state.axis_inc * state.left));
|
||||
init_voxelIds(AxisToSum{}, this->PointWriteOffset, edgeCase, axis_sums, edgeIds);
|
||||
init_voxelIds(AxisToSum{}, this->PointWriteOffset, edgeCase, axis_sums, tables, edgeIds);
|
||||
for (vtkm::Id i = state.left; i < state.right; ++i) // run along the trimmed voxels
|
||||
{
|
||||
edgeCase = getEdgeCase(edges, state.startPos, (state.axis_inc * i));
|
||||
vtkm::UInt8 numTris = data::GetNumberOfPrimitives(edgeCase);
|
||||
vtkm::UInt8 numTris = tables.GetNumberOfPrimitives(edgeCase);
|
||||
if (numTris > 0)
|
||||
{
|
||||
// Start by generating triangles for this case
|
||||
generate_tris(
|
||||
state.cellId, edgeCase, numTris, edgeIds, cell_tri_offset, conn, inputCellIds);
|
||||
state.cellId, edgeCase, numTris, edgeIds, cell_tri_offset, tables, conn, inputCellIds);
|
||||
|
||||
// Now generate edgeIds and weights along voxel axes if needed. Remember to take
|
||||
// boundary into account.
|
||||
auto* edgeUses = data::GetEdgeUses(edgeCase);
|
||||
const vtkm::Vec<vtkm::UInt8, 12>& edgeUses = tables.GetEdgeUses(edgeCase);
|
||||
if (!fully_interior(state.boundaryStatus) || case_includes_axes(edgeUses))
|
||||
{
|
||||
this->Generate(state.boundaryStatus,
|
||||
@ -136,6 +140,7 @@ struct ComputePass4Y : public vtkm::worklet::WorkletVisitCellsWithPoints
|
||||
increments,
|
||||
(state.axis_inc * i),
|
||||
edgeUses,
|
||||
tables,
|
||||
edgeIds);
|
||||
}
|
||||
advance_voxelIds(edgeUses, edgeIds);
|
||||
@ -153,7 +158,8 @@ struct ComputePass4Y : public vtkm::worklet::WorkletVisitCellsWithPoints
|
||||
const vtkm::Id4& startPos,
|
||||
const vtkm::Id3& incs,
|
||||
vtkm::Id offset,
|
||||
vtkm::UInt8 const* const edgeUses,
|
||||
const vtkm::Vec<vtkm::UInt8, 12>& edgeUses,
|
||||
const data::FlyingEdgesTables& tables,
|
||||
vtkm::Id* edgeIds) const
|
||||
{
|
||||
using AxisToSum = SumYAxis;
|
||||
@ -207,30 +213,30 @@ struct ComputePass4Y : public vtkm::worklet::WorkletVisitCellsWithPoints
|
||||
const bool onZ = boundaryStatus[AxisToSum::zindex] & FlyingEdges3D::MaxBoundary;
|
||||
if (onX) //+x boundary
|
||||
{
|
||||
this->InterpolateEdge(pos[0], incs, 5, edgeUses, edgeIds, field, interpolatedEdgeIds, weights);
|
||||
this->InterpolateEdge(pos[0], incs, 9, edgeUses, edgeIds, field, interpolatedEdgeIds, weights);
|
||||
this->InterpolateEdge(pos[0], incs, 5, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, tables);
|
||||
this->InterpolateEdge(pos[0], incs, 9, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, tables);
|
||||
if (onY) //+x +y
|
||||
{
|
||||
this->InterpolateEdge(pos[0], incs, 11, edgeUses, edgeIds, field, interpolatedEdgeIds, weights);
|
||||
this->InterpolateEdge(pos[0], incs, 11, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, tables);
|
||||
}
|
||||
if (onZ) //+x +z
|
||||
{
|
||||
this->InterpolateEdge(pos[0], incs, 7, edgeUses, edgeIds, field, interpolatedEdgeIds, weights);
|
||||
this->InterpolateEdge(pos[0], incs, 7, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, tables);
|
||||
}
|
||||
}
|
||||
if (onY) //+y boundary
|
||||
{
|
||||
this->InterpolateEdge(pos[0], incs, 1, edgeUses, edgeIds, field, interpolatedEdgeIds, weights);
|
||||
this->InterpolateEdge(pos[0], incs, 10, edgeUses, edgeIds, field, interpolatedEdgeIds, weights);
|
||||
this->InterpolateEdge(pos[0], incs, 1, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, tables);
|
||||
this->InterpolateEdge(pos[0], incs, 10, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, tables);
|
||||
if (onZ) //+y +z boundary
|
||||
{
|
||||
this->InterpolateEdge(pos[0], incs, 3, edgeUses, edgeIds, field, interpolatedEdgeIds, weights);
|
||||
this->InterpolateEdge(pos[0], incs, 3, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, tables);
|
||||
}
|
||||
}
|
||||
if (onZ) //+z boundary
|
||||
{
|
||||
this->InterpolateEdge(pos[0], incs, 2, edgeUses, edgeIds, field, interpolatedEdgeIds, weights);
|
||||
this->InterpolateEdge(pos[0], incs, 6, edgeUses, edgeIds, field, interpolatedEdgeIds, weights);
|
||||
this->InterpolateEdge(pos[0], incs, 2, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, tables);
|
||||
this->InterpolateEdge(pos[0], incs, 6, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, tables);
|
||||
}
|
||||
// clang-format on
|
||||
}
|
||||
@ -240,12 +246,13 @@ struct ComputePass4Y : public vtkm::worklet::WorkletVisitCellsWithPoints
|
||||
template <typename WholeField, typename WholeIEdgeField, typename WholeWeightField>
|
||||
VTKM_EXEC inline void InterpolateEdge(vtkm::Id currentIdx,
|
||||
const vtkm::Id3& incs,
|
||||
vtkm::Id edgeNum,
|
||||
vtkm::UInt8 const* const edgeUses,
|
||||
vtkm::IdComponent edgeNum,
|
||||
const vtkm::Vec<vtkm::UInt8, 12>& edgeUses,
|
||||
vtkm::Id* edgeIds,
|
||||
const WholeField& field,
|
||||
const WholeIEdgeField& interpolatedEdgeIds,
|
||||
const WholeWeightField& weights) const
|
||||
const WholeWeightField& weights,
|
||||
const data::FlyingEdgesTables& tables) const
|
||||
{
|
||||
using AxisToSum = SumYAxis;
|
||||
|
||||
@ -257,10 +264,10 @@ struct ComputePass4Y : public vtkm::worklet::WorkletVisitCellsWithPoints
|
||||
const vtkm::Id writeIndex = edgeIds[edgeNum];
|
||||
|
||||
// build the edge information
|
||||
vtkm::Vec<vtkm::UInt8, 2> verts = data::GetVertMap(edgeNum);
|
||||
vtkm::Vec2ui_8 verts = tables.GetVertMap(edgeNum);
|
||||
|
||||
vtkm::Id3 offsets1 = data::GetVertOffsets(AxisToSum{}, verts[0]);
|
||||
vtkm::Id3 offsets2 = data::GetVertOffsets(AxisToSum{}, verts[1]);
|
||||
vtkm::Id3 offsets1 = tables.GetVertOffsets(AxisToSum{}, verts[0]);
|
||||
vtkm::Id3 offsets2 = tables.GetVertOffsets(AxisToSum{}, verts[1]);
|
||||
|
||||
vtkm::Id2 iEdge(currentIdx + vtkm::Dot(offsets1, incs), currentIdx + vtkm::Dot(offsets2, incs));
|
||||
|
||||
|
416
vtkm/filter/contour/worklet/contour/FlyingEdgesTables.cxx
Normal file
416
vtkm/filter/contour/worklet/contour/FlyingEdgesTables.cxx
Normal file
@ -0,0 +1,416 @@
|
||||
//============================================================================
|
||||
// Copyright (c) Kitware, Inc.
|
||||
// All rights reserved.
|
||||
// See LICENSE.txt 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 <vtkm/filter/contour/worklet/contour/FlyingEdgesTables.h>
|
||||
|
||||
namespace vtkm
|
||||
{
|
||||
namespace worklet
|
||||
{
|
||||
namespace flying_edges
|
||||
{
|
||||
namespace data
|
||||
{
|
||||
|
||||
VTKM_CONT vtkm::cont::ArrayHandleBasic<vtkm::UInt8> GetNumberOfPrimitivesTable()
|
||||
{
|
||||
static vtkm::UInt8 numTris[256] = {
|
||||
0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 2, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 3,
|
||||
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 3, 2, 3, 3, 2, 3, 4, 4, 3, 3, 4, 4, 3, 4, 5, 5, 2,
|
||||
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 3, 2, 3, 3, 4, 3, 2, 4, 3, 3, 4, 4, 5, 4, 3, 5, 2,
|
||||
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 4, 3, 4, 4, 3, 4, 3, 5, 2, 4, 5, 5, 4, 5, 4, 2, 1,
|
||||
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 3, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 4,
|
||||
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 2, 3, 4, 5, 3, 2, 3, 4, 4, 3, 4, 5, 5, 4, 4, 5, 3, 2, 5, 2, 4, 1,
|
||||
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 2, 3, 3, 2, 3, 4, 4, 5, 4, 3, 5, 4, 4, 5, 5, 2, 3, 2, 4, 1,
|
||||
3, 4, 4, 5, 4, 5, 5, 2, 4, 5, 3, 4, 3, 4, 2, 1, 2, 3, 3, 2, 3, 2, 4, 1, 3, 4, 2, 1, 2, 1, 1, 0
|
||||
};
|
||||
return vtkm::cont::make_ArrayHandle(numTris, 256, vtkm::CopyFlag::Off);
|
||||
}
|
||||
|
||||
VTKM_CONT vtkm::cont::ArrayHandleBasic<vtkm::Vec<vtkm::UInt8, 12>> GetEdgeUsesTable()
|
||||
{
|
||||
static vtkm::Vec<vtkm::UInt8, 12> edgeUses[128] = {
|
||||
// This is [128][12] as idx 0 == idx 254, idx 1 == 253...
|
||||
//
|
||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 },
|
||||
{ 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 }, { 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0 },
|
||||
{ 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0 }, { 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0 },
|
||||
{ 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0 }, { 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0 },
|
||||
{ 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1 }, { 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1 },
|
||||
{ 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1 }, { 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1 },
|
||||
{ 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1 }, { 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1 },
|
||||
{ 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1 }, { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1 },
|
||||
{ 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0 }, { 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0 },
|
||||
{ 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0 }, { 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0 },
|
||||
{ 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 }, { 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0 },
|
||||
{ 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0 }, { 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0 },
|
||||
{ 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1 }, { 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1 },
|
||||
{ 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1 }, { 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1 },
|
||||
{ 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1 }, { 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1 },
|
||||
{ 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1 }, { 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1 },
|
||||
{ 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0 }, { 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0 },
|
||||
{ 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0 }, { 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0 },
|
||||
{ 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0 }, { 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0 },
|
||||
{ 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0 }, { 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0 },
|
||||
{ 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1 }, { 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1 },
|
||||
{ 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1 }, { 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1 },
|
||||
{ 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1 }, { 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1 },
|
||||
{ 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1 }, { 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1 },
|
||||
{ 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0 }, { 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0 },
|
||||
{ 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0 }, { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0 },
|
||||
{ 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0 }, { 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0 },
|
||||
{ 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0 }, { 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0 },
|
||||
{ 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1 }, { 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1 },
|
||||
{ 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1 }, { 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1 },
|
||||
{ 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1 },
|
||||
{ 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1 }, { 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1 },
|
||||
{ 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0 }, { 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0 },
|
||||
{ 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0 }, { 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0 },
|
||||
{ 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0 }, { 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0 },
|
||||
{ 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0 }, { 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0 },
|
||||
{ 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1 }, { 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1 },
|
||||
{ 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1 }, { 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1 },
|
||||
{ 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1 }, { 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1 },
|
||||
{ 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1 }, { 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1 },
|
||||
{ 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0 }, { 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0 },
|
||||
{ 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0 }, { 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0 },
|
||||
{ 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0 }, { 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0 }, { 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0 },
|
||||
{ 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1 }, { 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1 },
|
||||
{ 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1 }, { 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1 },
|
||||
{ 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1 }, { 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1 },
|
||||
{ 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1 }, { 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1 },
|
||||
{ 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0 }, { 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0 },
|
||||
{ 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0 }, { 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0 },
|
||||
{ 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0 }, { 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0 },
|
||||
{ 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 }, { 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0 },
|
||||
{ 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
|
||||
{ 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1 }, { 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1 },
|
||||
{ 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1 }, { 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1 },
|
||||
{ 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1 }, { 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1 },
|
||||
{ 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0 }, { 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0 },
|
||||
{ 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0 }, { 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0 },
|
||||
{ 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0 }, { 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0 },
|
||||
{ 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0 }, { 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0 },
|
||||
{ 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1 }, { 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1 },
|
||||
{ 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1 }, { 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1 },
|
||||
{ 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1 }, { 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 },
|
||||
{ 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1 }, { 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1 },
|
||||
};
|
||||
return vtkm::cont::make_ArrayHandle(edgeUses, 128, vtkm::CopyFlag::Off);
|
||||
}
|
||||
|
||||
VTKM_CONT vtkm::cont::ArrayHandleBasic<vtkm::Vec<vtkm::UInt8, 16>> GetTriEdgeCasesTable()
|
||||
{
|
||||
static vtkm::Vec<vtkm::UInt8, 16> edgeCases[256] = {
|
||||
// I expect we have some form on symmetry in this table
|
||||
// that we can exploit to make it smaller
|
||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 1, 0, 4, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 1, 0, 9, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 5, 4, 8, 9, 5, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 1, 4, 1, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 0, 1, 10, 8, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 5, 0, 9, 1, 10, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 5, 1, 10, 5, 10, 9, 9, 10, 8, 0, 0, 0, 0, 0, 0 },
|
||||
{ 1, 5, 11, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 0, 4, 8, 5, 11, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 9, 11, 1, 0, 9, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 1, 4, 8, 1, 8, 11, 11, 8, 9, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 4, 5, 11, 10, 4, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 0, 5, 11, 0, 11, 8, 8, 11, 10, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 4, 0, 9, 4, 9, 10, 10, 9, 11, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 9, 11, 8, 11, 10, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 1, 2, 8, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 2, 0, 4, 6, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 0, 9, 5, 8, 6, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 2, 9, 5, 2, 5, 6, 6, 5, 4, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 8, 6, 2, 4, 1, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 10, 6, 2, 10, 2, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 9, 5, 0, 8, 6, 2, 1, 10, 4, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 2, 10, 6, 9, 10, 2, 9, 1, 10, 9, 5, 1, 0, 0, 0 },
|
||||
{ 2, 5, 11, 1, 8, 6, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 4, 6, 2, 4, 2, 0, 5, 11, 1, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 9, 11, 1, 9, 1, 0, 8, 6, 2, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 1, 9, 11, 1, 6, 9, 1, 4, 6, 6, 2, 9, 0, 0, 0 },
|
||||
{ 3, 4, 5, 11, 4, 11, 10, 6, 2, 8, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 5, 11, 10, 5, 10, 2, 5, 2, 0, 6, 2, 10, 0, 0, 0 },
|
||||
{ 4, 2, 8, 6, 9, 10, 0, 9, 11, 10, 10, 4, 0, 0, 0, 0 },
|
||||
{ 3, 2, 10, 6, 2, 9, 10, 9, 11, 10, 0, 0, 0, 0, 0, 0 },
|
||||
{ 1, 9, 2, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 9, 2, 7, 0, 4, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 0, 2, 7, 5, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 8, 2, 7, 8, 7, 4, 4, 7, 5, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 9, 2, 7, 1, 10, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 0, 1, 10, 0, 10, 8, 2, 7, 9, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 0, 2, 7, 0, 7, 5, 1, 10, 4, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 1, 7, 5, 1, 8, 7, 1, 10, 8, 2, 7, 8, 0, 0, 0 },
|
||||
{ 2, 5, 11, 1, 9, 2, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 4, 8, 0, 5, 11, 1, 2, 7, 9, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 7, 11, 1, 7, 1, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 1, 7, 11, 4, 7, 1, 4, 2, 7, 4, 8, 2, 0, 0, 0 },
|
||||
{ 3, 11, 10, 4, 11, 4, 5, 9, 2, 7, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 2, 7, 9, 0, 5, 8, 8, 5, 11, 8, 11, 10, 0, 0, 0 },
|
||||
{ 4, 7, 0, 2, 7, 10, 0, 7, 11, 10, 10, 4, 0, 0, 0, 0 },
|
||||
{ 3, 7, 8, 2, 7, 11, 8, 11, 10, 8, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 9, 8, 6, 7, 9, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 9, 0, 4, 9, 4, 7, 7, 4, 6, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 0, 8, 6, 0, 6, 5, 5, 6, 7, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 5, 4, 7, 4, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 6, 7, 9, 6, 9, 8, 4, 1, 10, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 9, 6, 7, 9, 1, 6, 9, 0, 1, 1, 10, 6, 0, 0, 0 },
|
||||
{ 4, 1, 10, 4, 0, 8, 5, 5, 8, 6, 5, 6, 7, 0, 0, 0 },
|
||||
{ 3, 10, 5, 1, 10, 6, 5, 6, 7, 5, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 9, 8, 6, 9, 6, 7, 11, 1, 5, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 11, 1, 5, 9, 0, 7, 7, 0, 4, 7, 4, 6, 0, 0, 0 },
|
||||
{ 4, 8, 1, 0, 8, 7, 1, 8, 6, 7, 11, 1, 7, 0, 0, 0 },
|
||||
{ 3, 1, 7, 11, 1, 4, 7, 4, 6, 7, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 9, 8, 7, 8, 6, 7, 11, 4, 5, 11, 10, 4, 0, 0, 0 },
|
||||
{ 5, 7, 0, 6, 7, 9, 0, 6, 0, 10, 5, 11, 0, 10, 0, 11 },
|
||||
{ 5, 10, 0, 11, 10, 4, 0, 11, 0, 7, 8, 6, 0, 7, 0, 6 },
|
||||
{ 2, 10, 7, 11, 6, 7, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 1, 6, 10, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 4, 8, 0, 10, 3, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 0, 9, 5, 10, 3, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 8, 9, 5, 8, 5, 4, 10, 3, 6, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 6, 4, 1, 3, 6, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 6, 8, 0, 6, 0, 3, 3, 0, 1, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 1, 3, 6, 1, 6, 4, 0, 9, 5, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 5, 1, 3, 5, 3, 8, 5, 8, 9, 8, 3, 6, 0, 0, 0 },
|
||||
{ 2, 11, 1, 5, 3, 6, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 5, 11, 1, 4, 8, 0, 3, 6, 10, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 1, 0, 9, 1, 9, 11, 3, 6, 10, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 3, 6, 10, 1, 4, 11, 11, 4, 8, 11, 8, 9, 0, 0, 0 },
|
||||
{ 3, 11, 3, 6, 11, 6, 5, 5, 6, 4, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 11, 3, 6, 5, 11, 6, 5, 6, 8, 5, 8, 0, 0, 0, 0 },
|
||||
{ 4, 0, 6, 4, 0, 11, 6, 0, 9, 11, 3, 6, 11, 0, 0, 0 },
|
||||
{ 3, 6, 11, 3, 6, 8, 11, 8, 9, 11, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 3, 2, 8, 10, 3, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 4, 10, 3, 4, 3, 0, 0, 3, 2, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 8, 10, 3, 8, 3, 2, 9, 5, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 9, 3, 2, 9, 4, 3, 9, 5, 4, 10, 3, 4, 0, 0, 0 },
|
||||
{ 3, 8, 4, 1, 8, 1, 2, 2, 1, 3, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 0, 1, 2, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 5, 0, 9, 1, 2, 4, 1, 3, 2, 2, 8, 4, 0, 0, 0 },
|
||||
{ 3, 5, 2, 9, 5, 1, 2, 1, 3, 2, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 3, 2, 8, 3, 8, 10, 1, 5, 11, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 5, 11, 1, 4, 10, 0, 0, 10, 3, 0, 3, 2, 0, 0, 0 },
|
||||
{ 4, 2, 8, 10, 2, 10, 3, 0, 9, 1, 1, 9, 11, 0, 0, 0 },
|
||||
{ 5, 11, 4, 9, 11, 1, 4, 9, 4, 2, 10, 3, 4, 2, 4, 3 },
|
||||
{ 4, 8, 4, 5, 8, 5, 3, 8, 3, 2, 3, 5, 11, 0, 0, 0 },
|
||||
{ 3, 11, 0, 5, 11, 3, 0, 3, 2, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 5, 2, 4, 3, 2, 8, 4, 3, 4, 11, 0, 9, 4, 11, 4, 9 },
|
||||
{ 2, 11, 2, 9, 3, 2, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 2, 7, 9, 6, 10, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 0, 4, 8, 2, 7, 9, 10, 3, 6, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 7, 5, 0, 7, 0, 2, 6, 10, 3, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 10, 3, 6, 8, 2, 4, 4, 2, 7, 4, 7, 5, 0, 0, 0 },
|
||||
{ 3, 6, 4, 1, 6, 1, 3, 7, 9, 2, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 9, 2, 7, 0, 3, 8, 0, 1, 3, 3, 6, 8, 0, 0, 0 },
|
||||
{ 4, 4, 1, 3, 4, 3, 6, 5, 0, 7, 7, 0, 2, 0, 0, 0 },
|
||||
{ 5, 3, 8, 1, 3, 6, 8, 1, 8, 5, 2, 7, 8, 5, 8, 7 },
|
||||
{ 3, 9, 2, 7, 11, 1, 5, 6, 10, 3, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 3, 6, 10, 5, 11, 1, 0, 4, 8, 2, 7, 9, 0, 0, 0 },
|
||||
{ 4, 6, 10, 3, 7, 11, 2, 2, 11, 1, 2, 1, 0, 0, 0, 0 },
|
||||
{ 5, 4, 8, 2, 4, 2, 7, 4, 7, 1, 11, 1, 7, 10, 3, 6 },
|
||||
{ 4, 9, 2, 7, 11, 3, 5, 5, 3, 6, 5, 6, 4, 0, 0, 0 },
|
||||
{ 5, 5, 11, 3, 5, 3, 6, 5, 6, 0, 8, 0, 6, 9, 2, 7 },
|
||||
{ 5, 2, 11, 0, 2, 7, 11, 0, 11, 4, 3, 6, 11, 4, 11, 6 },
|
||||
{ 4, 6, 11, 3, 6, 8, 11, 7, 11, 2, 2, 11, 8, 0, 0, 0 },
|
||||
{ 3, 3, 7, 9, 3, 9, 10, 10, 9, 8, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 4, 10, 3, 0, 4, 3, 0, 3, 7, 0, 7, 9, 0, 0, 0 },
|
||||
{ 4, 0, 8, 10, 0, 10, 7, 0, 7, 5, 7, 10, 3, 0, 0, 0 },
|
||||
{ 3, 3, 4, 10, 3, 7, 4, 7, 5, 4, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 7, 9, 8, 7, 8, 1, 7, 1, 3, 4, 1, 8, 0, 0, 0 },
|
||||
{ 3, 9, 3, 7, 9, 0, 3, 0, 1, 3, 0, 0, 0, 0, 0, 0 },
|
||||
{ 5, 5, 8, 7, 5, 0, 8, 7, 8, 3, 4, 1, 8, 3, 8, 1 },
|
||||
{ 2, 5, 3, 7, 1, 3, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 5, 11, 1, 9, 10, 7, 9, 8, 10, 10, 3, 7, 0, 0, 0 },
|
||||
{ 5, 0, 4, 10, 0, 10, 3, 0, 3, 9, 7, 9, 3, 5, 11, 1 },
|
||||
{ 5, 10, 7, 8, 10, 3, 7, 8, 7, 0, 11, 1, 7, 0, 7, 1 },
|
||||
{ 4, 3, 4, 10, 3, 7, 4, 1, 4, 11, 11, 4, 7, 0, 0, 0 },
|
||||
{ 5, 5, 3, 4, 5, 11, 3, 4, 3, 8, 7, 9, 3, 8, 3, 9 },
|
||||
{ 4, 11, 0, 5, 11, 3, 0, 9, 0, 7, 7, 0, 3, 0, 0, 0 },
|
||||
{ 2, 0, 8, 4, 7, 11, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 1, 11, 3, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 1, 11, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 0, 4, 8, 7, 3, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 9, 5, 0, 7, 3, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 5, 4, 8, 5, 8, 9, 7, 3, 11, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 1, 10, 4, 11, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 10, 8, 0, 10, 0, 1, 11, 7, 3, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 0, 9, 5, 1, 10, 4, 7, 3, 11, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 7, 3, 11, 5, 1, 9, 9, 1, 10, 9, 10, 8, 0, 0, 0 },
|
||||
{ 2, 5, 7, 3, 1, 5, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 5, 7, 3, 5, 3, 1, 4, 8, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 9, 7, 3, 9, 3, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 7, 8, 9, 7, 1, 8, 7, 3, 1, 4, 8, 1, 0, 0, 0 },
|
||||
{ 3, 3, 10, 4, 3, 4, 7, 7, 4, 5, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 0, 10, 8, 0, 7, 10, 0, 5, 7, 7, 3, 10, 0, 0, 0 },
|
||||
{ 4, 4, 3, 10, 0, 3, 4, 0, 7, 3, 0, 9, 7, 0, 0, 0 },
|
||||
{ 3, 3, 9, 7, 3, 10, 9, 10, 8, 9, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 7, 3, 11, 2, 8, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 2, 0, 4, 2, 4, 6, 3, 11, 7, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 5, 0, 9, 7, 3, 11, 8, 6, 2, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 11, 7, 3, 5, 6, 9, 5, 4, 6, 6, 2, 9, 0, 0, 0 },
|
||||
{ 3, 4, 1, 10, 6, 2, 8, 11, 7, 3, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 7, 3, 11, 2, 1, 6, 2, 0, 1, 1, 10, 6, 0, 0, 0 },
|
||||
{ 4, 0, 9, 5, 2, 8, 6, 1, 10, 4, 7, 3, 11, 0, 0, 0 },
|
||||
{ 5, 9, 5, 1, 9, 1, 10, 9, 10, 2, 6, 2, 10, 7, 3, 11 },
|
||||
{ 3, 3, 1, 5, 3, 5, 7, 2, 8, 6, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 5, 7, 1, 7, 3, 1, 4, 2, 0, 4, 6, 2, 0, 0, 0 },
|
||||
{ 4, 8, 6, 2, 9, 7, 0, 0, 7, 3, 0, 3, 1, 0, 0, 0 },
|
||||
{ 5, 6, 9, 4, 6, 2, 9, 4, 9, 1, 7, 3, 9, 1, 9, 3 },
|
||||
{ 4, 8, 6, 2, 4, 7, 10, 4, 5, 7, 7, 3, 10, 0, 0, 0 },
|
||||
{ 5, 7, 10, 5, 7, 3, 10, 5, 10, 0, 6, 2, 10, 0, 10, 2 },
|
||||
{ 5, 0, 9, 7, 0, 7, 3, 0, 3, 4, 10, 4, 3, 8, 6, 2 },
|
||||
{ 4, 3, 9, 7, 3, 10, 9, 2, 9, 6, 6, 9, 10, 0, 0, 0 },
|
||||
{ 2, 11, 9, 2, 3, 11, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 2, 3, 11, 2, 11, 9, 0, 4, 8, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 11, 5, 0, 11, 0, 3, 3, 0, 2, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 8, 5, 4, 8, 3, 5, 8, 2, 3, 3, 11, 5, 0, 0, 0 },
|
||||
{ 3, 11, 9, 2, 11, 2, 3, 10, 4, 1, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 0, 1, 8, 1, 10, 8, 2, 11, 9, 2, 3, 11, 0, 0, 0 },
|
||||
{ 4, 4, 1, 10, 0, 3, 5, 0, 2, 3, 3, 11, 5, 0, 0, 0 },
|
||||
{ 5, 3, 5, 2, 3, 11, 5, 2, 5, 8, 1, 10, 5, 8, 5, 10 },
|
||||
{ 3, 5, 9, 2, 5, 2, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 4, 8, 0, 5, 9, 1, 1, 9, 2, 1, 2, 3, 0, 0, 0 },
|
||||
{ 2, 0, 2, 1, 2, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 8, 1, 4, 8, 2, 1, 2, 3, 1, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 9, 2, 3, 9, 3, 4, 9, 4, 5, 10, 4, 3, 0, 0, 0 },
|
||||
{ 5, 8, 5, 10, 8, 0, 5, 10, 5, 3, 9, 2, 5, 3, 5, 2 },
|
||||
{ 3, 4, 3, 10, 4, 0, 3, 0, 2, 3, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 3, 8, 2, 10, 8, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 6, 3, 11, 6, 11, 8, 8, 11, 9, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 0, 4, 6, 0, 6, 11, 0, 11, 9, 3, 11, 6, 0, 0, 0 },
|
||||
{ 4, 11, 6, 3, 5, 6, 11, 5, 8, 6, 5, 0, 8, 0, 0, 0 },
|
||||
{ 3, 11, 6, 3, 11, 5, 6, 5, 4, 6, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 1, 10, 4, 11, 8, 3, 11, 9, 8, 8, 6, 3, 0, 0, 0 },
|
||||
{ 5, 1, 6, 0, 1, 10, 6, 0, 6, 9, 3, 11, 6, 9, 6, 11 },
|
||||
{ 5, 5, 0, 8, 5, 8, 6, 5, 6, 11, 3, 11, 6, 1, 10, 4 },
|
||||
{ 4, 10, 5, 1, 10, 6, 5, 11, 5, 3, 3, 5, 6, 0, 0, 0 },
|
||||
{ 4, 5, 3, 1, 5, 8, 3, 5, 9, 8, 8, 6, 3, 0, 0, 0 },
|
||||
{ 5, 1, 9, 3, 1, 5, 9, 3, 9, 6, 0, 4, 9, 6, 9, 4 },
|
||||
{ 3, 6, 0, 8, 6, 3, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 6, 1, 4, 3, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 5, 8, 3, 9, 8, 6, 3, 9, 3, 5, 10, 4, 3, 5, 3, 4 },
|
||||
{ 2, 0, 5, 9, 10, 6, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 6, 0, 8, 6, 3, 0, 4, 0, 10, 10, 0, 3, 0, 0, 0 },
|
||||
{ 1, 6, 3, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 10, 11, 7, 6, 10, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 10, 11, 7, 10, 7, 6, 8, 0, 4, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 7, 6, 10, 7, 10, 11, 5, 0, 9, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 11, 7, 6, 11, 6, 10, 9, 5, 8, 8, 5, 4, 0, 0, 0 },
|
||||
{ 3, 1, 11, 7, 1, 7, 4, 4, 7, 6, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 8, 0, 1, 8, 1, 7, 8, 7, 6, 11, 7, 1, 0, 0, 0 },
|
||||
{ 4, 9, 5, 0, 7, 4, 11, 7, 6, 4, 4, 1, 11, 0, 0, 0 },
|
||||
{ 5, 9, 1, 8, 9, 5, 1, 8, 1, 6, 11, 7, 1, 6, 1, 7 },
|
||||
{ 3, 10, 1, 5, 10, 5, 6, 6, 5, 7, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 0, 4, 8, 5, 6, 1, 5, 7, 6, 6, 10, 1, 0, 0, 0 },
|
||||
{ 4, 9, 7, 6, 9, 6, 1, 9, 1, 0, 1, 6, 10, 0, 0, 0 },
|
||||
{ 5, 6, 1, 7, 6, 10, 1, 7, 1, 9, 4, 8, 1, 9, 1, 8 },
|
||||
{ 2, 5, 7, 4, 4, 7, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 0, 6, 8, 0, 5, 6, 5, 7, 6, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 9, 4, 0, 9, 7, 4, 7, 6, 4, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 9, 6, 8, 7, 6, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 7, 2, 8, 7, 8, 11, 11, 8, 10, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 7, 2, 0, 7, 0, 10, 7, 10, 11, 10, 0, 4, 0, 0, 0 },
|
||||
{ 4, 0, 9, 5, 8, 11, 2, 8, 10, 11, 11, 7, 2, 0, 0, 0 },
|
||||
{ 5, 11, 2, 10, 11, 7, 2, 10, 2, 4, 9, 5, 2, 4, 2, 5 },
|
||||
{ 4, 1, 11, 7, 4, 1, 7, 4, 7, 2, 4, 2, 8, 0, 0, 0 },
|
||||
{ 3, 7, 1, 11, 7, 2, 1, 2, 0, 1, 0, 0, 0, 0, 0, 0 },
|
||||
{ 5, 4, 1, 11, 4, 11, 7, 4, 7, 8, 2, 8, 7, 0, 9, 5 },
|
||||
{ 4, 7, 1, 11, 7, 2, 1, 5, 1, 9, 9, 1, 2, 0, 0, 0 },
|
||||
{ 4, 1, 5, 7, 1, 7, 8, 1, 8, 10, 2, 8, 7, 0, 0, 0 },
|
||||
{ 5, 0, 10, 2, 0, 4, 10, 2, 10, 7, 1, 5, 10, 7, 10, 5 },
|
||||
{ 5, 0, 7, 1, 0, 9, 7, 1, 7, 10, 2, 8, 7, 10, 7, 8 },
|
||||
{ 2, 9, 7, 2, 1, 4, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 8, 7, 2, 8, 4, 7, 4, 5, 7, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 0, 7, 2, 5, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 8, 7, 2, 8, 4, 7, 9, 7, 0, 0, 7, 4, 0, 0, 0 },
|
||||
{ 1, 9, 7, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 2, 6, 10, 2, 10, 9, 9, 10, 11, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 0, 4, 8, 2, 6, 9, 9, 6, 10, 9, 10, 11, 0, 0, 0 },
|
||||
{ 4, 5, 10, 11, 5, 2, 10, 5, 0, 2, 6, 10, 2, 0, 0, 0 },
|
||||
{ 5, 4, 2, 5, 4, 8, 2, 5, 2, 11, 6, 10, 2, 11, 2, 10 },
|
||||
{ 4, 1, 11, 9, 1, 9, 6, 1, 6, 4, 6, 9, 2, 0, 0, 0 },
|
||||
{ 5, 9, 6, 11, 9, 2, 6, 11, 6, 1, 8, 0, 6, 1, 6, 0 },
|
||||
{ 5, 4, 11, 6, 4, 1, 11, 6, 11, 2, 5, 0, 11, 2, 11, 0 },
|
||||
{ 2, 5, 1, 11, 8, 2, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 2, 6, 10, 9, 2, 10, 9, 10, 1, 9, 1, 5, 0, 0, 0 },
|
||||
{ 5, 9, 2, 6, 9, 6, 10, 9, 10, 5, 1, 5, 10, 0, 4, 8 },
|
||||
{ 3, 10, 2, 6, 10, 1, 2, 1, 0, 2, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 10, 2, 6, 10, 1, 2, 8, 2, 4, 4, 2, 1, 0, 0, 0 },
|
||||
{ 3, 2, 5, 9, 2, 6, 5, 6, 4, 5, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 2, 5, 9, 2, 6, 5, 0, 5, 8, 8, 5, 6, 0, 0, 0 },
|
||||
{ 2, 2, 4, 0, 6, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 1, 2, 6, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 9, 8, 11, 11, 8, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 4, 9, 0, 4, 10, 9, 10, 11, 9, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 0, 11, 5, 0, 8, 11, 8, 10, 11, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 4, 11, 5, 10, 11, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 1, 8, 4, 1, 11, 8, 11, 9, 8, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 9, 1, 11, 0, 1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 1, 8, 4, 1, 11, 8, 0, 8, 5, 5, 8, 11, 0, 0, 0 },
|
||||
{ 1, 5, 1, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 5, 10, 1, 5, 9, 10, 9, 8, 10, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 4, 9, 0, 4, 10, 9, 5, 9, 1, 1, 9, 10, 0, 0, 0 },
|
||||
{ 2, 0, 10, 1, 8, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 1, 4, 10, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 5, 8, 4, 9, 8, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 1, 0, 5, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 1, 0, 8, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
};
|
||||
return vtkm::cont::make_ArrayHandle(edgeCases, 256, vtkm::CopyFlag::Off);
|
||||
}
|
||||
|
||||
VTKM_CONT vtkm::cont::ArrayHandleBasic<vtkm::Vec2ui_8> GetVertMapTable()
|
||||
{
|
||||
static vtkm::Vec2ui_8 vertMap[12] = {
|
||||
{ 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 }, { 0, 2 }, { 1, 3 },
|
||||
{ 4, 6 }, { 5, 7 }, { 0, 4 }, { 1, 5 }, { 2, 6 }, { 3, 7 },
|
||||
};
|
||||
return vtkm::cont::make_ArrayHandle(vertMap, 12, vtkm::CopyFlag::Off);
|
||||
}
|
||||
|
||||
VTKM_CONT vtkm::cont::ArrayHandleBasic<vtkm::Id3> GetVertOffsetsXAxisTable()
|
||||
{
|
||||
static vtkm::Id3 offsetMap[8] = {
|
||||
{ 0, 0, 0 }, { 1, 0, 0 }, { 0, 1, 0 }, { 1, 1, 0 },
|
||||
{ 0, 0, 1 }, { 1, 0, 1 }, { 0, 1, 1 }, { 1, 1, 1 },
|
||||
};
|
||||
return vtkm::cont::make_ArrayHandle(offsetMap, 8, vtkm::CopyFlag::Off);
|
||||
}
|
||||
|
||||
VTKM_CONT vtkm::cont::ArrayHandleBasic<vtkm::Id3> GetVertOffsetsYAxisTable()
|
||||
{
|
||||
vtkm::Id3 offsetMap[8] = {
|
||||
{ 0, 0, 0 }, { 0, 1, 0 }, { 1, 0, 0 }, { 1, 1, 0 },
|
||||
{ 0, 0, 1 }, { 0, 1, 1 }, { 1, 0, 1 }, { 1, 1, 1 },
|
||||
};
|
||||
return vtkm::cont::make_ArrayHandle(offsetMap, 8, vtkm::CopyFlag::Off);
|
||||
}
|
||||
|
||||
VTKM_CONT FlyingEdgesTables::FlyingEdgesTables(vtkm::cont::DeviceAdapterId device,
|
||||
vtkm::cont::Token& token)
|
||||
: NumberOfPrimitivesTable(GetNumberOfPrimitivesTable().PrepareForInput(device, token))
|
||||
, EdgeUsesTable(GetEdgeUsesTable().PrepareForInput(device, token))
|
||||
, TriEdgesCaseTable(GetTriEdgeCasesTable().PrepareForInput(device, token))
|
||||
, VertMapTable(GetVertMapTable().PrepareForInput(device, token))
|
||||
, VertOffsetsXAxisTable(GetVertOffsetsXAxisTable().PrepareForInput(device, token))
|
||||
, VertOffsetsYAxisTable(GetVertOffsetsYAxisTable().PrepareForInput(device, token))
|
||||
{
|
||||
}
|
||||
|
||||
} // namespace data
|
||||
} // namespace flying_edges
|
||||
} // namespace worklet
|
||||
} // namespace vtkm
|
@ -1,4 +1,3 @@
|
||||
|
||||
//============================================================================
|
||||
// Copyright (c) Kitware, Inc.
|
||||
// All rights reserved.
|
||||
@ -14,6 +13,9 @@
|
||||
|
||||
#include <vtkm/filter/contour/worklet/contour/FlyingEdgesHelpers.h>
|
||||
|
||||
#include <vtkm/cont/ArrayHandleBasic.h>
|
||||
#include <vtkm/cont/ExecutionObjectBase.h>
|
||||
|
||||
namespace vtkm
|
||||
{
|
||||
namespace worklet
|
||||
@ -23,388 +25,68 @@ namespace flying_edges
|
||||
namespace data
|
||||
{
|
||||
|
||||
VTKM_EXEC inline vtkm::UInt8 GetNumberOfPrimitives(vtkm::UInt8 edgecase)
|
||||
VTKM_CONT vtkm::cont::ArrayHandleBasic<vtkm::UInt8> GetNumberOfPrimitivesTable();
|
||||
|
||||
VTKM_CONT vtkm::cont::ArrayHandleBasic<vtkm::Vec<vtkm::UInt8, 12>> GetEdgeUsesTable();
|
||||
|
||||
VTKM_CONT vtkm::cont::ArrayHandleBasic<vtkm::Vec<vtkm::UInt8, 16>> GetTriEdgeCasesTable();
|
||||
|
||||
VTKM_CONT vtkm::cont::ArrayHandleBasic<vtkm::Vec2ui_8> GetVertMapTable();
|
||||
|
||||
VTKM_CONT vtkm::cont::ArrayHandleBasic<vtkm::Id3> GetVertOffsetsXAxisTable();
|
||||
VTKM_CONT vtkm::cont::ArrayHandleBasic<vtkm::Id3> GetVertOffsetsYAxisTable();
|
||||
|
||||
class FlyingEdgesTables
|
||||
{
|
||||
VTKM_STATIC_CONSTEXPR_ARRAY vtkm::UInt8 numTris[256] = {
|
||||
0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 2, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 3,
|
||||
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 3, 2, 3, 3, 2, 3, 4, 4, 3, 3, 4, 4, 3, 4, 5, 5, 2,
|
||||
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 3, 2, 3, 3, 4, 3, 2, 4, 3, 3, 4, 4, 5, 4, 3, 5, 2,
|
||||
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 4, 3, 4, 4, 3, 4, 3, 5, 2, 4, 5, 5, 4, 5, 4, 2, 1,
|
||||
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 3, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 4,
|
||||
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 2, 3, 4, 5, 3, 2, 3, 4, 4, 3, 4, 5, 5, 4, 4, 5, 3, 2, 5, 2, 4, 1,
|
||||
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 2, 3, 3, 2, 3, 4, 4, 5, 4, 3, 5, 4, 4, 5, 5, 2, 3, 2, 4, 1,
|
||||
3, 4, 4, 5, 4, 5, 5, 2, 4, 5, 3, 4, 3, 4, 2, 1, 2, 3, 3, 2, 3, 2, 4, 1, 3, 4, 2, 1, 2, 1, 1, 0
|
||||
template <typename ComponentType>
|
||||
using PortalType = typename vtkm::cont::ArrayHandle<ComponentType>::ReadPortalType;
|
||||
PortalType<vtkm::UInt8> NumberOfPrimitivesTable;
|
||||
PortalType<vtkm::Vec<vtkm::UInt8, 12>> EdgeUsesTable;
|
||||
PortalType<vtkm::Vec<vtkm::UInt8, 16>> TriEdgesCaseTable;
|
||||
PortalType<vtkm::Vec2ui_8> VertMapTable;
|
||||
PortalType<vtkm::Id3> VertOffsetsXAxisTable;
|
||||
PortalType<vtkm::Id3> VertOffsetsYAxisTable;
|
||||
|
||||
public:
|
||||
VTKM_CONT FlyingEdgesTables(vtkm::cont::DeviceAdapterId device, vtkm::cont::Token& token);
|
||||
|
||||
VTKM_EXEC vtkm::UInt8 GetNumberOfPrimitives(vtkm::UInt8 edgecase) const
|
||||
{
|
||||
return this->NumberOfPrimitivesTable.Get(edgecase);
|
||||
}
|
||||
VTKM_EXEC const vtkm::Vec<vtkm::UInt8, 12>& GetEdgeUses(vtkm::UInt8 edgecase) const
|
||||
{
|
||||
// Get the pointer to return a reference to make sure we are not copying all values.
|
||||
const vtkm::UInt8 index = (edgecase < 128) ? edgecase : (255 - edgecase);
|
||||
return *(this->EdgeUsesTable.GetIteratorBegin() + index);
|
||||
}
|
||||
VTKM_EXEC const vtkm::Vec<vtkm::UInt8, 16>& GetTriEdgeCases(vtkm::UInt8 edgecase) const
|
||||
{
|
||||
// Get the pointer to return a reference to make sure we are not copying all values.
|
||||
return *(this->TriEdgesCaseTable.GetIteratorBegin() + edgecase);
|
||||
}
|
||||
VTKM_EXEC vtkm::Vec2ui_8 GetVertMap(vtkm::Id index) const
|
||||
{
|
||||
return this->VertMapTable.Get(index);
|
||||
}
|
||||
VTKM_EXEC vtkm::Id3 GetVertOffsets(SumXAxis, vtkm::UInt8 index) const
|
||||
{
|
||||
return this->VertOffsetsXAxisTable.Get(index);
|
||||
}
|
||||
VTKM_EXEC vtkm::Id3 GetVertOffsets(SumYAxis, vtkm::UInt8 index) const
|
||||
{
|
||||
return this->VertOffsetsXAxisTable.Get(index);
|
||||
}
|
||||
};
|
||||
|
||||
return numTris[edgecase];
|
||||
}
|
||||
|
||||
VTKM_EXEC inline vtkm::UInt8 const* GetEdgeUses(vtkm::UInt8 edgecase)
|
||||
struct FlyingEdgesTablesExecObject : vtkm::cont::ExecutionObjectBase
|
||||
{
|
||||
VTKM_STATIC_CONSTEXPR_ARRAY vtkm::UInt8 edgeUses[128][12] = {
|
||||
// This is [128][12] as idx 0 == idx 254, idx 1 == 253...
|
||||
//
|
||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 },
|
||||
{ 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 }, { 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0 },
|
||||
{ 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0 }, { 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0 },
|
||||
{ 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0 }, { 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0 },
|
||||
{ 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1 }, { 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1 },
|
||||
{ 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1 }, { 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1 },
|
||||
{ 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1 }, { 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1 },
|
||||
{ 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1 }, { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1 },
|
||||
{ 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0 }, { 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0 },
|
||||
{ 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0 }, { 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0 },
|
||||
{ 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 }, { 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0 },
|
||||
{ 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0 }, { 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0 },
|
||||
{ 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1 }, { 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1 },
|
||||
{ 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1 }, { 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1 },
|
||||
{ 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1 }, { 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1 },
|
||||
{ 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1 }, { 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1 },
|
||||
{ 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0 }, { 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0 },
|
||||
{ 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0 }, { 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0 },
|
||||
{ 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0 }, { 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0 },
|
||||
{ 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0 }, { 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0 },
|
||||
{ 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1 }, { 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1 },
|
||||
{ 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1 }, { 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1 },
|
||||
{ 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1 }, { 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1 },
|
||||
{ 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1 }, { 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1 },
|
||||
{ 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0 }, { 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0 },
|
||||
{ 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0 }, { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0 },
|
||||
{ 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0 }, { 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0 },
|
||||
{ 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0 }, { 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0 },
|
||||
{ 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1 }, { 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1 },
|
||||
{ 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1 }, { 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1 },
|
||||
{ 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1 },
|
||||
{ 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1 }, { 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1 },
|
||||
{ 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0 }, { 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0 },
|
||||
{ 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0 }, { 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0 },
|
||||
{ 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0 }, { 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0 },
|
||||
{ 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0 }, { 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0 },
|
||||
{ 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1 }, { 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1 },
|
||||
{ 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1 }, { 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1 },
|
||||
{ 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1 }, { 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1 },
|
||||
{ 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1 }, { 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1 },
|
||||
{ 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0 }, { 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0 },
|
||||
{ 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0 }, { 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0 },
|
||||
{ 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0 }, { 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0 }, { 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0 },
|
||||
{ 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1 }, { 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1 },
|
||||
{ 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1 }, { 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1 },
|
||||
{ 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1 }, { 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1 },
|
||||
{ 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1 }, { 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1 },
|
||||
{ 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0 }, { 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0 },
|
||||
{ 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0 }, { 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0 },
|
||||
{ 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0 }, { 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0 },
|
||||
{ 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 }, { 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0 },
|
||||
{ 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
|
||||
{ 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1 }, { 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1 },
|
||||
{ 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1 }, { 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1 },
|
||||
{ 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1 }, { 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1 },
|
||||
{ 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0 }, { 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0 },
|
||||
{ 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0 }, { 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0 },
|
||||
{ 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0 }, { 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0 },
|
||||
{ 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0 }, { 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0 },
|
||||
{ 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1 }, { 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1 },
|
||||
{ 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1 }, { 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1 },
|
||||
{ 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1 }, { 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 },
|
||||
{ 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1 }, { 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1 },
|
||||
};
|
||||
|
||||
return edgecase < 128 ? edgeUses[edgecase] : edgeUses[127 - (edgecase - 128)];
|
||||
}
|
||||
|
||||
VTKM_EXEC inline vtkm::UInt8 const* GetTriEdgeCases(vtkm::UInt8 edgecase)
|
||||
VTKM_CONT FlyingEdgesTables PrepareForExecution(vtkm::cont::DeviceAdapterId device,
|
||||
vtkm::cont::Token& token) const
|
||||
{
|
||||
VTKM_STATIC_CONSTEXPR_ARRAY vtkm::UInt8 edgeCases[256][16] = {
|
||||
// I expect we have some form on symmetry in this table
|
||||
// that we can exploit to make it smaller
|
||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 1, 0, 4, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 1, 0, 9, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 5, 4, 8, 9, 5, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 1, 4, 1, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 0, 1, 10, 8, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 5, 0, 9, 1, 10, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 5, 1, 10, 5, 10, 9, 9, 10, 8, 0, 0, 0, 0, 0, 0 },
|
||||
{ 1, 5, 11, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 0, 4, 8, 5, 11, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 9, 11, 1, 0, 9, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 1, 4, 8, 1, 8, 11, 11, 8, 9, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 4, 5, 11, 10, 4, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 0, 5, 11, 0, 11, 8, 8, 11, 10, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 4, 0, 9, 4, 9, 10, 10, 9, 11, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 9, 11, 8, 11, 10, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 1, 2, 8, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 2, 0, 4, 6, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 0, 9, 5, 8, 6, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 2, 9, 5, 2, 5, 6, 6, 5, 4, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 8, 6, 2, 4, 1, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 10, 6, 2, 10, 2, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 9, 5, 0, 8, 6, 2, 1, 10, 4, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 2, 10, 6, 9, 10, 2, 9, 1, 10, 9, 5, 1, 0, 0, 0 },
|
||||
{ 2, 5, 11, 1, 8, 6, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 4, 6, 2, 4, 2, 0, 5, 11, 1, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 9, 11, 1, 9, 1, 0, 8, 6, 2, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 1, 9, 11, 1, 6, 9, 1, 4, 6, 6, 2, 9, 0, 0, 0 },
|
||||
{ 3, 4, 5, 11, 4, 11, 10, 6, 2, 8, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 5, 11, 10, 5, 10, 2, 5, 2, 0, 6, 2, 10, 0, 0, 0 },
|
||||
{ 4, 2, 8, 6, 9, 10, 0, 9, 11, 10, 10, 4, 0, 0, 0, 0 },
|
||||
{ 3, 2, 10, 6, 2, 9, 10, 9, 11, 10, 0, 0, 0, 0, 0, 0 },
|
||||
{ 1, 9, 2, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 9, 2, 7, 0, 4, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 0, 2, 7, 5, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 8, 2, 7, 8, 7, 4, 4, 7, 5, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 9, 2, 7, 1, 10, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 0, 1, 10, 0, 10, 8, 2, 7, 9, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 0, 2, 7, 0, 7, 5, 1, 10, 4, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 1, 7, 5, 1, 8, 7, 1, 10, 8, 2, 7, 8, 0, 0, 0 },
|
||||
{ 2, 5, 11, 1, 9, 2, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 4, 8, 0, 5, 11, 1, 2, 7, 9, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 7, 11, 1, 7, 1, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 1, 7, 11, 4, 7, 1, 4, 2, 7, 4, 8, 2, 0, 0, 0 },
|
||||
{ 3, 11, 10, 4, 11, 4, 5, 9, 2, 7, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 2, 7, 9, 0, 5, 8, 8, 5, 11, 8, 11, 10, 0, 0, 0 },
|
||||
{ 4, 7, 0, 2, 7, 10, 0, 7, 11, 10, 10, 4, 0, 0, 0, 0 },
|
||||
{ 3, 7, 8, 2, 7, 11, 8, 11, 10, 8, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 9, 8, 6, 7, 9, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 9, 0, 4, 9, 4, 7, 7, 4, 6, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 0, 8, 6, 0, 6, 5, 5, 6, 7, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 5, 4, 7, 4, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 6, 7, 9, 6, 9, 8, 4, 1, 10, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 9, 6, 7, 9, 1, 6, 9, 0, 1, 1, 10, 6, 0, 0, 0 },
|
||||
{ 4, 1, 10, 4, 0, 8, 5, 5, 8, 6, 5, 6, 7, 0, 0, 0 },
|
||||
{ 3, 10, 5, 1, 10, 6, 5, 6, 7, 5, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 9, 8, 6, 9, 6, 7, 11, 1, 5, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 11, 1, 5, 9, 0, 7, 7, 0, 4, 7, 4, 6, 0, 0, 0 },
|
||||
{ 4, 8, 1, 0, 8, 7, 1, 8, 6, 7, 11, 1, 7, 0, 0, 0 },
|
||||
{ 3, 1, 7, 11, 1, 4, 7, 4, 6, 7, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 9, 8, 7, 8, 6, 7, 11, 4, 5, 11, 10, 4, 0, 0, 0 },
|
||||
{ 5, 7, 0, 6, 7, 9, 0, 6, 0, 10, 5, 11, 0, 10, 0, 11 },
|
||||
{ 5, 10, 0, 11, 10, 4, 0, 11, 0, 7, 8, 6, 0, 7, 0, 6 },
|
||||
{ 2, 10, 7, 11, 6, 7, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 1, 6, 10, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 4, 8, 0, 10, 3, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 0, 9, 5, 10, 3, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 8, 9, 5, 8, 5, 4, 10, 3, 6, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 6, 4, 1, 3, 6, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 6, 8, 0, 6, 0, 3, 3, 0, 1, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 1, 3, 6, 1, 6, 4, 0, 9, 5, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 5, 1, 3, 5, 3, 8, 5, 8, 9, 8, 3, 6, 0, 0, 0 },
|
||||
{ 2, 11, 1, 5, 3, 6, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 5, 11, 1, 4, 8, 0, 3, 6, 10, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 1, 0, 9, 1, 9, 11, 3, 6, 10, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 3, 6, 10, 1, 4, 11, 11, 4, 8, 11, 8, 9, 0, 0, 0 },
|
||||
{ 3, 11, 3, 6, 11, 6, 5, 5, 6, 4, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 11, 3, 6, 5, 11, 6, 5, 6, 8, 5, 8, 0, 0, 0, 0 },
|
||||
{ 4, 0, 6, 4, 0, 11, 6, 0, 9, 11, 3, 6, 11, 0, 0, 0 },
|
||||
{ 3, 6, 11, 3, 6, 8, 11, 8, 9, 11, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 3, 2, 8, 10, 3, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 4, 10, 3, 4, 3, 0, 0, 3, 2, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 8, 10, 3, 8, 3, 2, 9, 5, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 9, 3, 2, 9, 4, 3, 9, 5, 4, 10, 3, 4, 0, 0, 0 },
|
||||
{ 3, 8, 4, 1, 8, 1, 2, 2, 1, 3, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 0, 1, 2, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 5, 0, 9, 1, 2, 4, 1, 3, 2, 2, 8, 4, 0, 0, 0 },
|
||||
{ 3, 5, 2, 9, 5, 1, 2, 1, 3, 2, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 3, 2, 8, 3, 8, 10, 1, 5, 11, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 5, 11, 1, 4, 10, 0, 0, 10, 3, 0, 3, 2, 0, 0, 0 },
|
||||
{ 4, 2, 8, 10, 2, 10, 3, 0, 9, 1, 1, 9, 11, 0, 0, 0 },
|
||||
{ 5, 11, 4, 9, 11, 1, 4, 9, 4, 2, 10, 3, 4, 2, 4, 3 },
|
||||
{ 4, 8, 4, 5, 8, 5, 3, 8, 3, 2, 3, 5, 11, 0, 0, 0 },
|
||||
{ 3, 11, 0, 5, 11, 3, 0, 3, 2, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 5, 2, 4, 3, 2, 8, 4, 3, 4, 11, 0, 9, 4, 11, 4, 9 },
|
||||
{ 2, 11, 2, 9, 3, 2, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 2, 7, 9, 6, 10, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 0, 4, 8, 2, 7, 9, 10, 3, 6, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 7, 5, 0, 7, 0, 2, 6, 10, 3, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 10, 3, 6, 8, 2, 4, 4, 2, 7, 4, 7, 5, 0, 0, 0 },
|
||||
{ 3, 6, 4, 1, 6, 1, 3, 7, 9, 2, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 9, 2, 7, 0, 3, 8, 0, 1, 3, 3, 6, 8, 0, 0, 0 },
|
||||
{ 4, 4, 1, 3, 4, 3, 6, 5, 0, 7, 7, 0, 2, 0, 0, 0 },
|
||||
{ 5, 3, 8, 1, 3, 6, 8, 1, 8, 5, 2, 7, 8, 5, 8, 7 },
|
||||
{ 3, 9, 2, 7, 11, 1, 5, 6, 10, 3, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 3, 6, 10, 5, 11, 1, 0, 4, 8, 2, 7, 9, 0, 0, 0 },
|
||||
{ 4, 6, 10, 3, 7, 11, 2, 2, 11, 1, 2, 1, 0, 0, 0, 0 },
|
||||
{ 5, 4, 8, 2, 4, 2, 7, 4, 7, 1, 11, 1, 7, 10, 3, 6 },
|
||||
{ 4, 9, 2, 7, 11, 3, 5, 5, 3, 6, 5, 6, 4, 0, 0, 0 },
|
||||
{ 5, 5, 11, 3, 5, 3, 6, 5, 6, 0, 8, 0, 6, 9, 2, 7 },
|
||||
{ 5, 2, 11, 0, 2, 7, 11, 0, 11, 4, 3, 6, 11, 4, 11, 6 },
|
||||
{ 4, 6, 11, 3, 6, 8, 11, 7, 11, 2, 2, 11, 8, 0, 0, 0 },
|
||||
{ 3, 3, 7, 9, 3, 9, 10, 10, 9, 8, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 4, 10, 3, 0, 4, 3, 0, 3, 7, 0, 7, 9, 0, 0, 0 },
|
||||
{ 4, 0, 8, 10, 0, 10, 7, 0, 7, 5, 7, 10, 3, 0, 0, 0 },
|
||||
{ 3, 3, 4, 10, 3, 7, 4, 7, 5, 4, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 7, 9, 8, 7, 8, 1, 7, 1, 3, 4, 1, 8, 0, 0, 0 },
|
||||
{ 3, 9, 3, 7, 9, 0, 3, 0, 1, 3, 0, 0, 0, 0, 0, 0 },
|
||||
{ 5, 5, 8, 7, 5, 0, 8, 7, 8, 3, 4, 1, 8, 3, 8, 1 },
|
||||
{ 2, 5, 3, 7, 1, 3, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 5, 11, 1, 9, 10, 7, 9, 8, 10, 10, 3, 7, 0, 0, 0 },
|
||||
{ 5, 0, 4, 10, 0, 10, 3, 0, 3, 9, 7, 9, 3, 5, 11, 1 },
|
||||
{ 5, 10, 7, 8, 10, 3, 7, 8, 7, 0, 11, 1, 7, 0, 7, 1 },
|
||||
{ 4, 3, 4, 10, 3, 7, 4, 1, 4, 11, 11, 4, 7, 0, 0, 0 },
|
||||
{ 5, 5, 3, 4, 5, 11, 3, 4, 3, 8, 7, 9, 3, 8, 3, 9 },
|
||||
{ 4, 11, 0, 5, 11, 3, 0, 9, 0, 7, 7, 0, 3, 0, 0, 0 },
|
||||
{ 2, 0, 8, 4, 7, 11, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 1, 11, 3, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 1, 11, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 0, 4, 8, 7, 3, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 9, 5, 0, 7, 3, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 5, 4, 8, 5, 8, 9, 7, 3, 11, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 1, 10, 4, 11, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 10, 8, 0, 10, 0, 1, 11, 7, 3, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 0, 9, 5, 1, 10, 4, 7, 3, 11, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 7, 3, 11, 5, 1, 9, 9, 1, 10, 9, 10, 8, 0, 0, 0 },
|
||||
{ 2, 5, 7, 3, 1, 5, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 5, 7, 3, 5, 3, 1, 4, 8, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 9, 7, 3, 9, 3, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 7, 8, 9, 7, 1, 8, 7, 3, 1, 4, 8, 1, 0, 0, 0 },
|
||||
{ 3, 3, 10, 4, 3, 4, 7, 7, 4, 5, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 0, 10, 8, 0, 7, 10, 0, 5, 7, 7, 3, 10, 0, 0, 0 },
|
||||
{ 4, 4, 3, 10, 0, 3, 4, 0, 7, 3, 0, 9, 7, 0, 0, 0 },
|
||||
{ 3, 3, 9, 7, 3, 10, 9, 10, 8, 9, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 7, 3, 11, 2, 8, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 2, 0, 4, 2, 4, 6, 3, 11, 7, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 5, 0, 9, 7, 3, 11, 8, 6, 2, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 11, 7, 3, 5, 6, 9, 5, 4, 6, 6, 2, 9, 0, 0, 0 },
|
||||
{ 3, 4, 1, 10, 6, 2, 8, 11, 7, 3, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 7, 3, 11, 2, 1, 6, 2, 0, 1, 1, 10, 6, 0, 0, 0 },
|
||||
{ 4, 0, 9, 5, 2, 8, 6, 1, 10, 4, 7, 3, 11, 0, 0, 0 },
|
||||
{ 5, 9, 5, 1, 9, 1, 10, 9, 10, 2, 6, 2, 10, 7, 3, 11 },
|
||||
{ 3, 3, 1, 5, 3, 5, 7, 2, 8, 6, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 5, 7, 1, 7, 3, 1, 4, 2, 0, 4, 6, 2, 0, 0, 0 },
|
||||
{ 4, 8, 6, 2, 9, 7, 0, 0, 7, 3, 0, 3, 1, 0, 0, 0 },
|
||||
{ 5, 6, 9, 4, 6, 2, 9, 4, 9, 1, 7, 3, 9, 1, 9, 3 },
|
||||
{ 4, 8, 6, 2, 4, 7, 10, 4, 5, 7, 7, 3, 10, 0, 0, 0 },
|
||||
{ 5, 7, 10, 5, 7, 3, 10, 5, 10, 0, 6, 2, 10, 0, 10, 2 },
|
||||
{ 5, 0, 9, 7, 0, 7, 3, 0, 3, 4, 10, 4, 3, 8, 6, 2 },
|
||||
{ 4, 3, 9, 7, 3, 10, 9, 2, 9, 6, 6, 9, 10, 0, 0, 0 },
|
||||
{ 2, 11, 9, 2, 3, 11, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 2, 3, 11, 2, 11, 9, 0, 4, 8, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 11, 5, 0, 11, 0, 3, 3, 0, 2, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 8, 5, 4, 8, 3, 5, 8, 2, 3, 3, 11, 5, 0, 0, 0 },
|
||||
{ 3, 11, 9, 2, 11, 2, 3, 10, 4, 1, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 0, 1, 8, 1, 10, 8, 2, 11, 9, 2, 3, 11, 0, 0, 0 },
|
||||
{ 4, 4, 1, 10, 0, 3, 5, 0, 2, 3, 3, 11, 5, 0, 0, 0 },
|
||||
{ 5, 3, 5, 2, 3, 11, 5, 2, 5, 8, 1, 10, 5, 8, 5, 10 },
|
||||
{ 3, 5, 9, 2, 5, 2, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 4, 8, 0, 5, 9, 1, 1, 9, 2, 1, 2, 3, 0, 0, 0 },
|
||||
{ 2, 0, 2, 1, 2, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 8, 1, 4, 8, 2, 1, 2, 3, 1, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 9, 2, 3, 9, 3, 4, 9, 4, 5, 10, 4, 3, 0, 0, 0 },
|
||||
{ 5, 8, 5, 10, 8, 0, 5, 10, 5, 3, 9, 2, 5, 3, 5, 2 },
|
||||
{ 3, 4, 3, 10, 4, 0, 3, 0, 2, 3, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 3, 8, 2, 10, 8, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 6, 3, 11, 6, 11, 8, 8, 11, 9, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 0, 4, 6, 0, 6, 11, 0, 11, 9, 3, 11, 6, 0, 0, 0 },
|
||||
{ 4, 11, 6, 3, 5, 6, 11, 5, 8, 6, 5, 0, 8, 0, 0, 0 },
|
||||
{ 3, 11, 6, 3, 11, 5, 6, 5, 4, 6, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 1, 10, 4, 11, 8, 3, 11, 9, 8, 8, 6, 3, 0, 0, 0 },
|
||||
{ 5, 1, 6, 0, 1, 10, 6, 0, 6, 9, 3, 11, 6, 9, 6, 11 },
|
||||
{ 5, 5, 0, 8, 5, 8, 6, 5, 6, 11, 3, 11, 6, 1, 10, 4 },
|
||||
{ 4, 10, 5, 1, 10, 6, 5, 11, 5, 3, 3, 5, 6, 0, 0, 0 },
|
||||
{ 4, 5, 3, 1, 5, 8, 3, 5, 9, 8, 8, 6, 3, 0, 0, 0 },
|
||||
{ 5, 1, 9, 3, 1, 5, 9, 3, 9, 6, 0, 4, 9, 6, 9, 4 },
|
||||
{ 3, 6, 0, 8, 6, 3, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 6, 1, 4, 3, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 5, 8, 3, 9, 8, 6, 3, 9, 3, 5, 10, 4, 3, 5, 3, 4 },
|
||||
{ 2, 0, 5, 9, 10, 6, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 6, 0, 8, 6, 3, 0, 4, 0, 10, 10, 0, 3, 0, 0, 0 },
|
||||
{ 1, 6, 3, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 10, 11, 7, 6, 10, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 10, 11, 7, 10, 7, 6, 8, 0, 4, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 7, 6, 10, 7, 10, 11, 5, 0, 9, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 11, 7, 6, 11, 6, 10, 9, 5, 8, 8, 5, 4, 0, 0, 0 },
|
||||
{ 3, 1, 11, 7, 1, 7, 4, 4, 7, 6, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 8, 0, 1, 8, 1, 7, 8, 7, 6, 11, 7, 1, 0, 0, 0 },
|
||||
{ 4, 9, 5, 0, 7, 4, 11, 7, 6, 4, 4, 1, 11, 0, 0, 0 },
|
||||
{ 5, 9, 1, 8, 9, 5, 1, 8, 1, 6, 11, 7, 1, 6, 1, 7 },
|
||||
{ 3, 10, 1, 5, 10, 5, 6, 6, 5, 7, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 0, 4, 8, 5, 6, 1, 5, 7, 6, 6, 10, 1, 0, 0, 0 },
|
||||
{ 4, 9, 7, 6, 9, 6, 1, 9, 1, 0, 1, 6, 10, 0, 0, 0 },
|
||||
{ 5, 6, 1, 7, 6, 10, 1, 7, 1, 9, 4, 8, 1, 9, 1, 8 },
|
||||
{ 2, 5, 7, 4, 4, 7, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 0, 6, 8, 0, 5, 6, 5, 7, 6, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 9, 4, 0, 9, 7, 4, 7, 6, 4, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 9, 6, 8, 7, 6, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 7, 2, 8, 7, 8, 11, 11, 8, 10, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 7, 2, 0, 7, 0, 10, 7, 10, 11, 10, 0, 4, 0, 0, 0 },
|
||||
{ 4, 0, 9, 5, 8, 11, 2, 8, 10, 11, 11, 7, 2, 0, 0, 0 },
|
||||
{ 5, 11, 2, 10, 11, 7, 2, 10, 2, 4, 9, 5, 2, 4, 2, 5 },
|
||||
{ 4, 1, 11, 7, 4, 1, 7, 4, 7, 2, 4, 2, 8, 0, 0, 0 },
|
||||
{ 3, 7, 1, 11, 7, 2, 1, 2, 0, 1, 0, 0, 0, 0, 0, 0 },
|
||||
{ 5, 4, 1, 11, 4, 11, 7, 4, 7, 8, 2, 8, 7, 0, 9, 5 },
|
||||
{ 4, 7, 1, 11, 7, 2, 1, 5, 1, 9, 9, 1, 2, 0, 0, 0 },
|
||||
{ 4, 1, 5, 7, 1, 7, 8, 1, 8, 10, 2, 8, 7, 0, 0, 0 },
|
||||
{ 5, 0, 10, 2, 0, 4, 10, 2, 10, 7, 1, 5, 10, 7, 10, 5 },
|
||||
{ 5, 0, 7, 1, 0, 9, 7, 1, 7, 10, 2, 8, 7, 10, 7, 8 },
|
||||
{ 2, 9, 7, 2, 1, 4, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 8, 7, 2, 8, 4, 7, 4, 5, 7, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 0, 7, 2, 5, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 8, 7, 2, 8, 4, 7, 9, 7, 0, 0, 7, 4, 0, 0, 0 },
|
||||
{ 1, 9, 7, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 2, 6, 10, 2, 10, 9, 9, 10, 11, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 0, 4, 8, 2, 6, 9, 9, 6, 10, 9, 10, 11, 0, 0, 0 },
|
||||
{ 4, 5, 10, 11, 5, 2, 10, 5, 0, 2, 6, 10, 2, 0, 0, 0 },
|
||||
{ 5, 4, 2, 5, 4, 8, 2, 5, 2, 11, 6, 10, 2, 11, 2, 10 },
|
||||
{ 4, 1, 11, 9, 1, 9, 6, 1, 6, 4, 6, 9, 2, 0, 0, 0 },
|
||||
{ 5, 9, 6, 11, 9, 2, 6, 11, 6, 1, 8, 0, 6, 1, 6, 0 },
|
||||
{ 5, 4, 11, 6, 4, 1, 11, 6, 11, 2, 5, 0, 11, 2, 11, 0 },
|
||||
{ 2, 5, 1, 11, 8, 2, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 2, 6, 10, 9, 2, 10, 9, 10, 1, 9, 1, 5, 0, 0, 0 },
|
||||
{ 5, 9, 2, 6, 9, 6, 10, 9, 10, 5, 1, 5, 10, 0, 4, 8 },
|
||||
{ 3, 10, 2, 6, 10, 1, 2, 1, 0, 2, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 10, 2, 6, 10, 1, 2, 8, 2, 4, 4, 2, 1, 0, 0, 0 },
|
||||
{ 3, 2, 5, 9, 2, 6, 5, 6, 4, 5, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 2, 5, 9, 2, 6, 5, 0, 5, 8, 8, 5, 6, 0, 0, 0 },
|
||||
{ 2, 2, 4, 0, 6, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 1, 2, 6, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 9, 8, 11, 11, 8, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 4, 9, 0, 4, 10, 9, 10, 11, 9, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 0, 11, 5, 0, 8, 11, 8, 10, 11, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 4, 11, 5, 10, 11, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 1, 8, 4, 1, 11, 8, 11, 9, 8, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 9, 1, 11, 0, 1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 1, 8, 4, 1, 11, 8, 0, 8, 5, 5, 8, 11, 0, 0, 0 },
|
||||
{ 1, 5, 1, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 5, 10, 1, 5, 9, 10, 9, 8, 10, 0, 0, 0, 0, 0, 0 },
|
||||
{ 4, 4, 9, 0, 4, 10, 9, 5, 9, 1, 1, 9, 10, 0, 0, 0 },
|
||||
{ 2, 0, 10, 1, 8, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 1, 4, 10, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 2, 5, 8, 4, 9, 8, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 1, 0, 5, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 1, 0, 8, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
};
|
||||
return edgeCases[edgecase];
|
||||
return FlyingEdgesTables{ device, token };
|
||||
}
|
||||
|
||||
VTKM_EXEC inline vtkm::Vec<vtkm::UInt8, 2> GetVertMap(vtkm::Id index)
|
||||
{
|
||||
VTKM_STATIC_CONSTEXPR_ARRAY vtkm::Vec<vtkm::UInt8, 2> vertMap[12] = {
|
||||
{ 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 }, { 0, 2 }, { 1, 3 },
|
||||
{ 4, 6 }, { 5, 7 }, { 0, 4 }, { 1, 5 }, { 2, 6 }, { 3, 7 },
|
||||
};
|
||||
return vertMap[index];
|
||||
}
|
||||
|
||||
//x-axis
|
||||
VTKM_EXEC inline vtkm::Id3 GetVertOffsets(SumXAxis, vtkm::UInt8 index)
|
||||
{
|
||||
VTKM_STATIC_CONSTEXPR_ARRAY vtkm::Id3 offsetMap[8] = {
|
||||
{ 0, 0, 0 }, { 1, 0, 0 }, { 0, 1, 0 }, { 1, 1, 0 },
|
||||
{ 0, 0, 1 }, { 1, 0, 1 }, { 0, 1, 1 }, { 1, 1, 1 },
|
||||
};
|
||||
return offsetMap[index];
|
||||
}
|
||||
//y-axis
|
||||
VTKM_EXEC inline vtkm::Id3 GetVertOffsets(SumYAxis, vtkm::UInt8 index)
|
||||
{
|
||||
VTKM_STATIC_CONSTEXPR_ARRAY vtkm::Id3 offsetMap[8] = {
|
||||
{ 0, 0, 0 }, { 0, 1, 0 }, { 1, 0, 0 }, { 1, 1, 0 },
|
||||
{ 0, 0, 1 }, { 0, 1, 1 }, { 1, 0, 1 }, { 1, 1, 1 },
|
||||
};
|
||||
return offsetMap[index];
|
||||
}
|
||||
|
||||
} // namespace data
|
||||
}
|
||||
|
@ -700,7 +700,7 @@ void TypeTest(const vtkm::Vec<Scalar, 6>&)
|
||||
VTKM_TEST_ASSERT(test_equal(braceVec, madeVec), "constexpr Vec6 failed equality test.");
|
||||
|
||||
// Check fill constructor.
|
||||
Vector fillVec1 = { Scalar(8) };
|
||||
Vector fillVec1{ Scalar(8) };
|
||||
Vector fillVec2 = Vector(Scalar(8), Scalar(8), Scalar(8), Scalar(8), Scalar(8), Scalar(8));
|
||||
VTKM_TEST_ASSERT(test_equal(fillVec1, fillVec2), "fill ctor Vec6 failed equality test.");
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user