VTK-m  2.0
FlyingEdgesPass4XWithNormals.h
Go to the documentation of this file.
1 
2 //============================================================================
3 // Copyright (c) Kitware, Inc.
4 // All rights reserved.
5 // See LICENSE.txt for details.
6 //
7 // This software is distributed WITHOUT ANY WARRANTY; without even
8 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
9 // PURPOSE. See the above copyright notice for more information.
10 //============================================================================
11 
12 
13 #ifndef vtk_m_worklet_contour_flyingedges_pass4x_with_norms_h
14 #define vtk_m_worklet_contour_flyingedges_pass4x_with_norms_h
15 
16 
19 
21 
22 namespace vtkm
23 {
24 namespace worklet
25 {
26 namespace flying_edges
27 {
28 
29 template <typename T>
31 {
32 
36 
38 
41 
44  const vtkm::Id3& pdims,
45  const vtkm::Vec3f& origin,
46  const vtkm::Vec3f& spacing,
47  vtkm::Id multiContourCellOffset,
48  vtkm::Id multiContourPointOffset)
49  : PointDims(pdims)
50  , Origin(origin)
51  , Spacing(spacing)
52  , IsoValue(value)
53  , CellWriteOffset(multiContourCellOffset)
54  , PointWriteOffset(multiContourPointOffset)
55  {
56  }
57 
58  using ControlSignature = void(CellSetIn,
59  FieldInPoint axis_sums,
60  FieldInPoint axis_mins,
61  FieldInPoint axis_maxs,
62  WholeArrayIn cell_tri_count,
63  WholeArrayIn edgeData,
64  WholeArrayIn data,
65  WholeArrayOut connectivity,
66  WholeArrayOut edgeIds,
67  WholeArrayOut weights,
68  WholeArrayOut inputCellIds,
69  WholeArrayOut points,
70  WholeArrayOut normals);
71  using ExecutionSignature =
72  void(ThreadIndices, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, WorkIndex);
73 
74  template <typename ThreadIndices,
75  typename FieldInPointId3,
76  typename FieldInPointId,
77  typename WholeTriField,
78  typename WholeEdgeField,
79  typename WholeDataField,
80  typename WholeConnField,
81  typename WholeEdgeIdField,
82  typename WholeWeightField,
83  typename WholeCellIdField,
84  typename WholePointField,
85  typename WholeNormalsField>
86  VTKM_EXEC void operator()(const ThreadIndices& threadIndices,
87  const FieldInPointId3& axis_sums,
88  const FieldInPointId& axis_mins,
89  const FieldInPointId& axis_maxs,
90  const WholeTriField& cellTriCount,
91  const WholeEdgeField& edges,
92  const WholeDataField& field,
93  const WholeConnField& conn,
94  const WholeEdgeIdField& interpolatedEdgeIds,
95  const WholeWeightField& weights,
96  const WholeCellIdField& inputCellIds,
97  const WholePointField& points,
98  const WholeNormalsField& normals,
99  vtkm::Id oidx) const
100  {
101  using AxisToSum = SumXAxis;
102 
103  //This works as cellTriCount was computed with ScanExtended
104  //and therefore has one more entry than the number of cells
105  vtkm::Id cell_tri_offset = cellTriCount.Get(oidx);
106  vtkm::Id next_tri_offset = cellTriCount.Get(oidx + 1);
107  if (cell_tri_offset == next_tri_offset)
108  { //we produce nothing
109  return;
110  }
111  cell_tri_offset += this->CellWriteOffset;
112 
113  Pass4TrimState state(
114  AxisToSum{}, this->PointDims, threadIndices, axis_sums, axis_mins, axis_maxs, edges);
115  if (!state.hasWork)
116  {
117  return;
118  }
119 
120  const vtkm::Id3 pdims = this->PointDims;
121  const vtkm::Id3 increments = compute_incs3d(pdims);
122  vtkm::Id edgeIds[12];
123 
124  auto edgeCase = getEdgeCase(edges, state.startPos, (state.axis_inc * state.left));
125  init_voxelIds(AxisToSum{}, this->PointWriteOffset, edgeCase, axis_sums, edgeIds);
126  for (vtkm::Id i = state.left; i < state.right; ++i) // run along the trimmed voxels
127  {
128  edgeCase = getEdgeCase(edges, state.startPos, (state.axis_inc * i));
129  vtkm::UInt8 numTris = data::GetNumberOfPrimitives(edgeCase);
130  if (numTris > 0)
131  {
132  // Start by generating triangles for this case
134  state.cellId, edgeCase, numTris, edgeIds, cell_tri_offset, conn, inputCellIds);
135 
136  // Now generate edgeIds and weights along voxel axes if needed. Remember to take
137  // boundary into account.
138 
139  auto* edgeUses = data::GetEdgeUses(edgeCase);
140  if (!fully_interior(state.boundaryStatus) || case_includes_axes(edgeUses))
141  {
142  this->Generate(state.boundaryStatus,
143  state.ijk,
144  field,
145  interpolatedEdgeIds,
146  weights,
147  points,
148  normals,
149  state.startPos,
150  increments,
151  (state.axis_inc * i),
152  edgeUses,
153  edgeIds);
154  }
155  advance_voxelIds(edgeUses, edgeIds);
156  }
157  state.increment(AxisToSum{}, pdims);
158  }
159  }
160 
161  //----------------------------------------------------------------------------
162  template <typename WholeDataField,
163  typename WholeIEdgeField,
164  typename WholeWeightField,
165  typename WholePointField,
166  typename WholeNormalField>
167  VTKM_EXEC inline void Generate(const vtkm::Vec<vtkm::UInt8, 3>& boundaryStatus,
168  const vtkm::Id3& ijk,
169  const WholeDataField& field,
170  const WholeIEdgeField& interpolatedEdgeIds,
171  const WholeWeightField& weights,
172  const WholePointField& points,
173  const WholeNormalField& normals,
174  const vtkm::Id4& startPos,
175  const vtkm::Id3& incs,
176  vtkm::Id offset,
177  vtkm::UInt8 const* const edgeUses,
178  vtkm::Id* edgeIds) const
179  {
180  using AxisToSum = SumXAxis;
181  bool fullyInterior = fully_interior(boundaryStatus);
182 
183  vtkm::Id2 pos(startPos[0] + offset, 0);
184  {
185  auto s0 = field.Get(pos[0]);
186  auto g0 = this->ComputeGradient(fullyInterior, ijk, incs, pos[0], field);
187 
188  //EdgesUses 0,4,8 work for Y axis
189  if (edgeUses[0])
190  { // edgesUses[0] == i axes edge
191  auto writeIndex = edgeIds[0];
192  pos[1] = startPos[0] + offset + incs[AxisToSum::xindex];
193  auto s1 = field.Get(pos[1]);
194  T t = static_cast<T>((this->IsoValue - s0) / (s1 - s0));
195 
196  interpolatedEdgeIds.Set(writeIndex, pos);
197  weights.Set(writeIndex, static_cast<vtkm::FloatDefault>(t));
198 
199  auto ijk1 = ijk + vtkm::Id3{ 1, 0, 0 };
200  auto coord = this->InterpolateCoordinate(t, ijk, ijk1);
201  points.Set(writeIndex, coord);
202 
203  //gradient generation
204  auto g1 = this->ComputeGradient(fullyInterior, ijk1, incs, pos[1], field);
205  g1 = g0 + (t * (g1 - g0));
206  normals.Set(writeIndex, vtkm::Normal(g1));
207  }
208  if (edgeUses[4])
209  { // edgesUses[4] == j axes edge
210  auto writeIndex = edgeIds[4];
211  pos[1] = startPos[1] + offset;
212  auto s1 = field.Get(pos[1]);
213  T t = static_cast<T>((this->IsoValue - s0) / (s1 - s0));
214 
215  interpolatedEdgeIds.Set(writeIndex, pos);
216  weights.Set(writeIndex, static_cast<vtkm::FloatDefault>(t));
217 
218  auto ijk1 = ijk + vtkm::Id3{ 0, 1, 0 };
219  auto coord = this->InterpolateCoordinate(t, ijk, ijk1);
220  points.Set(writeIndex, coord);
221 
222  //gradient generation
223  auto g1 = this->ComputeGradient(fullyInterior, ijk1, incs, pos[1], field);
224  g1 = g0 + (t * (g1 - g0));
225  normals.Set(writeIndex, vtkm::Normal(g1));
226  }
227  if (edgeUses[8])
228  { // edgesUses[8] == k axes edge
229  auto writeIndex = edgeIds[8];
230  pos[1] = startPos[2] + offset;
231  auto s1 = field.Get(pos[1]);
232  T t = static_cast<T>((this->IsoValue - s0) / (s1 - s0));
233 
234  interpolatedEdgeIds.Set(writeIndex, pos);
235  weights.Set(writeIndex, static_cast<vtkm::FloatDefault>(t));
236 
237  auto ijk1 = ijk + vtkm::Id3{ 0, 0, 1 };
238  auto coord = this->InterpolateCoordinate(t, ijk, ijk1);
239  points.Set(writeIndex, coord);
240 
241  //gradient generation
242  auto g1 = this->ComputeGradient(fullyInterior, ijk1, incs, pos[1], field);
243  g1 = g0 + (t * (g1 - g0));
244  normals.Set(writeIndex, vtkm::Normal(g1));
245  }
246  }
247 
248  // On the boundary cells special work has to be done to cover the partial
249  // cell axes. These are boundary situations where the voxel axes is not
250  // fully formed. These situations occur on the +x,+y,+z volume
251  // boundaries. The other cases such as interior, or -x,-y,-z boundaries fall through
252  // which is expected
253  //
254  // clang-format off
255  const bool onX = boundaryStatus[AxisToSum::xindex] & FlyingEdges3D::MaxBoundary;
256  const bool onY = boundaryStatus[AxisToSum::yindex] & FlyingEdges3D::MaxBoundary;
257  const bool onZ = boundaryStatus[AxisToSum::zindex] & FlyingEdges3D::MaxBoundary;
258  if (onX) //+x boundary
259  {
260  this->InterpolateEdge(
261  fullyInterior, ijk, pos[0], incs, 5, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, points, normals);
262  this->InterpolateEdge(
263  fullyInterior, ijk, pos[0], incs, 9, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, points, normals);
264  if (onY) //+x +y
265  {
266  this->InterpolateEdge(
267  fullyInterior, ijk, pos[0], incs, 11, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, points, normals);
268  }
269  if (onZ) //+x +z
270  {
271  this->InterpolateEdge(
272  fullyInterior, ijk, pos[0], incs, 7, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, points, normals);
273  }
274  }
275  if (onY) //+y boundary
276  {
277  this->InterpolateEdge(
278  fullyInterior, ijk, pos[0], incs, 1, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, points, normals);
279  this->InterpolateEdge(
280  fullyInterior, ijk, pos[0], incs, 10, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, points, normals);
281  if (onZ) //+y +z boundary
282  {
283  this->InterpolateEdge(
284  fullyInterior, ijk, pos[0], incs, 3, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, points, normals);
285  }
286  }
287  if (onZ) //+z boundary
288  {
289  this->InterpolateEdge(
290  fullyInterior, ijk, pos[0], incs, 2, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, points, normals);
291  this->InterpolateEdge(
292  fullyInterior, ijk, pos[0], incs, 6, edgeUses, edgeIds, field, interpolatedEdgeIds, weights, points, normals);
293  }
294  // clang-format on
295  }
296 
297  // Indicate whether voxel axes need processing for this case.
298  //----------------------------------------------------------------------------
299  template <typename WholeField,
300  typename WholeIEdgeField,
301  typename WholeWeightField,
302  typename WholePointField,
303  typename WholeNormalField>
304  VTKM_EXEC inline void InterpolateEdge(bool fullyInterior,
305  const vtkm::Id3& ijk,
306  vtkm::Id currentIdx,
307  const vtkm::Id3& incs,
308  vtkm::Id edgeNum,
309  vtkm::UInt8 const* const edgeUses,
310  vtkm::Id* edgeIds,
311  const WholeField& field,
312  const WholeIEdgeField& interpolatedEdgeIds,
313  const WholeWeightField& weights,
314  const WholePointField& points,
315  const WholeNormalField& normals) const
316  {
317  using AxisToSum = SumXAxis;
318 
319  // if this edge is not used then get out
320  if (!edgeUses[edgeNum])
321  {
322  return;
323  }
324  const vtkm::Id writeIndex = edgeIds[edgeNum];
325 
326  // build the edge information
328 
329  vtkm::Id3 offsets1 = data::GetVertOffsets(AxisToSum{}, verts[0]);
330  vtkm::Id3 offsets2 = data::GetVertOffsets(AxisToSum{}, verts[1]);
331 
332  vtkm::Id2 iEdge(currentIdx + vtkm::Dot(offsets1, incs), currentIdx + vtkm::Dot(offsets2, incs));
333 
334  interpolatedEdgeIds.Set(writeIndex, iEdge);
335 
336  auto s0 = field.Get(iEdge[0]);
337  auto s1 = field.Get(iEdge[1]);
338  T t = static_cast<T>((this->IsoValue - s0) / (s1 - s0));
339  weights.Set(writeIndex, static_cast<vtkm::FloatDefault>(t));
340 
341  auto coord = this->InterpolateCoordinate(t, ijk + offsets1, ijk + offsets2);
342  points.Set(writeIndex, coord);
343 
344  auto g0 = this->ComputeGradient(fullyInterior, ijk + offsets1, incs, iEdge[0], field);
345  auto g1 = this->ComputeGradient(fullyInterior, ijk + offsets2, incs, iEdge[1], field);
346  g1 = g0 + (t * (g1 - g0));
347  normals.Set(writeIndex, vtkm::Normal(g1));
348  }
349 
350  //----------------------------------------------------------------------------
352  const vtkm::Id3& ijk0,
353  const vtkm::Id3& ijk1) const
354  {
355  return vtkm::Vec3f(
356  this->Origin[0] +
357  this->Spacing[0] *
358  (static_cast<vtkm::FloatDefault>(ijk0[0]) +
359  static_cast<vtkm::FloatDefault>(t) * static_cast<vtkm::FloatDefault>(ijk1[0] - ijk0[0])),
360  this->Origin[1] +
361  this->Spacing[1] *
362  (static_cast<vtkm::FloatDefault>(ijk0[1]) +
363  static_cast<vtkm::FloatDefault>(t) * static_cast<vtkm::FloatDefault>(ijk1[1] - ijk0[1])),
364  this->Origin[2] +
365  this->Spacing[2] *
366  (static_cast<vtkm::FloatDefault>(ijk0[2]) +
367  static_cast<vtkm::FloatDefault>(t) *
368  static_cast<vtkm::FloatDefault>(ijk1[2] - ijk0[2])));
369  }
370 
371  //----------------------------------------------------------------------------
372  template <typename WholeDataField>
374  const vtkm::Id3& ijk,
375  const vtkm::Id3& incs,
376  vtkm::Id pos,
377  const WholeDataField& field) const
378  {
379  if (fullyInterior)
380  {
381  vtkm::Vec3f g = {
382  static_cast<vtkm::FloatDefault>(field.Get(pos + incs[0]) - field.Get(pos - incs[0])) * 0.5f,
383  static_cast<vtkm::FloatDefault>(field.Get(pos + incs[1]) - field.Get(pos - incs[1])) * 0.5f,
384  static_cast<vtkm::FloatDefault>(field.Get(pos + incs[2]) - field.Get(pos - incs[2])) * 0.5f
385  };
386  return g;
387  }
388 
389  //We are on some boundary edge
390  auto s = field.Get(pos);
391  vtkm::Vec3f g;
392  for (int i = 0; i < 3; ++i)
393  {
394  if (ijk[i] == 0)
395  {
396  g[i] = static_cast<vtkm::FloatDefault>(field.Get(pos + incs[i]) - s);
397  }
398  else if (ijk[i] >= (this->PointDims[i] - 1))
399  {
400  g[i] = static_cast<vtkm::FloatDefault>(s - field.Get(pos - incs[i]));
401  }
402  else
403  {
404  g[i] =
405  static_cast<vtkm::FloatDefault>(field.Get(pos + incs[i]) - field.Get(pos - incs[i])) *
406  0.5f;
407  }
408  }
409 
410  return g;
411  }
412 };
413 }
414 }
415 }
416 #endif
vtkm::worklet::flying_edges::ComputePass4XWithNormals::Origin
vtkm::Vec3f Origin
Definition: FlyingEdgesPass4XWithNormals.h:34
vtkm::worklet::flying_edges::ComputePass4XWithNormals::operator()
VTKM_EXEC void operator()(const ThreadIndices &threadIndices, const FieldInPointId3 &axis_sums, const FieldInPointId &axis_mins, const FieldInPointId &axis_maxs, const WholeTriField &cellTriCount, const WholeEdgeField &edges, const WholeDataField &field, const WholeConnField &conn, const WholeEdgeIdField &interpolatedEdgeIds, const WholeWeightField &weights, const WholeCellIdField &inputCellIds, const WholePointField &points, const WholeNormalsField &normals, vtkm::Id oidx) const
Definition: FlyingEdgesPass4XWithNormals.h:86
vtkm::worklet::flying_edges::ComputePass4XWithNormals::PointWriteOffset
vtkm::Id PointWriteOffset
Definition: FlyingEdgesPass4XWithNormals.h:40
vtkm::worklet::flying_edges::generate_tris
VTKM_EXEC void generate_tris(vtkm::Id inputCellId, vtkm::UInt8 edgeCase, vtkm::UInt8 numTris, vtkm::Id *edgeIds, vtkm::Id &triId, const WholeConnField &conn, const WholeCellIdField &cellIds)
Definition: FlyingEdgesPass4Common.h:48
vtkm::worklet::flying_edges::case_includes_axes
VTKM_EXEC bool case_includes_axes(vtkm::UInt8 const *const edgeUses)
Definition: FlyingEdgesPass4Common.h:42
vtkm::worklet::flying_edges::ComputePass4XWithNormals::ComputeGradient
VTKM_EXEC vtkm::Vec3f ComputeGradient(bool fullyInterior, const vtkm::Id3 &ijk, const vtkm::Id3 &incs, vtkm::Id pos, const WholeDataField &field) const
Definition: FlyingEdgesPass4XWithNormals.h:373
VTKM_EXEC
#define VTKM_EXEC
Definition: ExportMacros.h:51
vtkm::worklet::flying_edges::data::GetEdgeUses
VTKM_EXEC vtkm::UInt8 const * GetEdgeUses(vtkm::UInt8 edgecase)
Definition: FlyingEdgesTables.h:42
vtkm
Groups connected points that have the same field value.
Definition: Atomic.h:19
vtkm::worklet::flying_edges::ComputePass4XWithNormals::ExecutionSignature
void(ThreadIndices, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, WorkIndex) ExecutionSignature
Definition: FlyingEdgesPass4XWithNormals.h:72
vtkm::worklet::flying_edges::ComputePass4XWithNormals::PointDims
vtkm::Id3 PointDims
Definition: FlyingEdgesPass4XWithNormals.h:33
vtkm::worklet::flying_edges::FlyingEdges3D::MaxBoundary
@ MaxBoundary
Definition: FlyingEdgesHelpers.h:47
vtkm::worklet::flying_edges::ComputePass4XWithNormals::ControlSignature
void(CellSetIn, FieldInPoint axis_sums, FieldInPoint axis_mins, FieldInPoint axis_maxs, WholeArrayIn cell_tri_count, WholeArrayIn edgeData, WholeArrayIn data, WholeArrayOut connectivity, WholeArrayOut edgeIds, WholeArrayOut weights, WholeArrayOut inputCellIds, WholeArrayOut points, WholeArrayOut normals) ControlSignature
Definition: FlyingEdgesPass4XWithNormals.h:70
vtkm::worklet::flying_edges::compute_incs3d
VTKM_EXEC vtkm::Id3 compute_incs3d(const vtkm::Id3 &dims)
Definition: FlyingEdgesPass4Common.h:26
vtkm::worklet::flying_edges::data::GetVertMap
VTKM_EXEC vtkm::Vec< vtkm::UInt8, 2 > GetVertMap(vtkm::Id index)
Definition: FlyingEdgesTables.h:381
FlyingEdgesHelpers.h
vtkm::worklet::flying_edges::ComputePass4XWithNormals::Generate
VTKM_EXEC void Generate(const vtkm::Vec< vtkm::UInt8, 3 > &boundaryStatus, const vtkm::Id3 &ijk, const WholeDataField &field, const WholeIEdgeField &interpolatedEdgeIds, const WholeWeightField &weights, const WholePointField &points, const WholeNormalField &normals, const vtkm::Id4 &startPos, const vtkm::Id3 &incs, vtkm::Id offset, vtkm::UInt8 const *const edgeUses, vtkm::Id *edgeIds) const
Definition: FlyingEdgesPass4XWithNormals.h:167
vtkm::worklet::flying_edges::ComputePass4XWithNormals
Definition: FlyingEdgesPass4XWithNormals.h:30
vtkm::worklet::flying_edges::Pass4TrimState
Definition: FlyingEdgesPass4Common.h:120
vtkm::worklet::flying_edges::ComputePass4XWithNormals::CellWriteOffset
vtkm::Id CellWriteOffset
Definition: FlyingEdgesPass4XWithNormals.h:39
vtkm::Id
vtkm::Int32 Id
Represents an ID (index into arrays).
Definition: Types.h:191
vtkm::worklet::flying_edges::SumXAxis
Definition: FlyingEdgesHelpers.h:51
vtkm::Normal
VTKM_EXEC_CONT T Normal(const T &x)
Returns a normalized version of the given vector.
Definition: VectorAnalysis.h:157
vtkm::worklet::flying_edges::data::GetNumberOfPrimitives
VTKM_EXEC vtkm::UInt8 GetNumberOfPrimitives(vtkm::UInt8 edgecase)
Definition: FlyingEdgesTables.h:26
vtkm::worklet::flying_edges::ComputePass4XWithNormals::ComputePass4XWithNormals
ComputePass4XWithNormals()
Definition: FlyingEdgesPass4XWithNormals.h:42
vtkm::worklet::flying_edges::fully_interior
VTKM_EXEC bool fully_interior(const vtkm::Vec< vtkm::UInt8, 3 > &boundaryStatus)
Definition: FlyingEdgesPass4Common.h:219
vtkm::worklet::flying_edges::ComputePass4XWithNormals::InterpolateCoordinate
VTKM_EXEC vtkm::Vec3f InterpolateCoordinate(T t, const vtkm::Id3 &ijk0, const vtkm::Id3 &ijk1) const
Definition: FlyingEdgesPass4XWithNormals.h:351
vtkm::worklet::flying_edges::data::GetVertOffsets
VTKM_EXEC vtkm::Id3 GetVertOffsets(SumXAxis, vtkm::UInt8 index)
Definition: FlyingEdgesTables.h:391
vtkm::worklet::WorkletVisitCellsWithPoints
Base class for worklets that map from Points to Cells.
Definition: WorkletMapTopology.h:255
vtkm::exec::arg::ThreadIndices
The ExecutionSignature tag to use to get the thread indices.
Definition: ThreadIndices.h:41
vtkm::worklet::flying_edges::getEdgeCase
VTKM_EXEC vtkm::UInt8 getEdgeCase(const WholeEdgeField &edges, const vtkm::Id4 &startPos, vtkm::Id inc)
Definition: FlyingEdgesHelpers.h:185
vtkm::worklet::WorkletVisitCellsWithPoints::FieldInPoint
FieldInIncident FieldInPoint
Definition: WorkletMapTopology.h:259
vtkm::UInt8
uint8_t UInt8
Definition: Types.h:157
vtkm::worklet::flying_edges::ComputePass4XWithNormals::Spacing
vtkm::Vec3f Spacing
Definition: FlyingEdgesPass4XWithNormals.h:35
vtkm::worklet::flying_edges::ComputePass4XWithNormals::IsoValue
T IsoValue
Definition: FlyingEdgesPass4XWithNormals.h:37
vtkm::Vec3f
vtkm::Vec< vtkm::FloatDefault, 3 > Vec3f
Vec3f corresponds to a 3-dimensional vector of floating point values.
Definition: Types.h:1014
vtkm::worklet::flying_edges::advance_voxelIds
VTKM_EXEC void advance_voxelIds(vtkm::UInt8 const *const edgeUses, vtkm::Id *edgeIds)
Definition: FlyingEdgesPass4Common.h:103
vtkm::Vec< vtkm::Id, 3 >
vtkm::FloatDefault
vtkm::Float32 FloatDefault
The floating point type to use when no other precision is specified.
Definition: Types.h:198
FlyingEdgesTables.h
vtkm::worklet::flying_edges::init_voxelIds
VTKM_EXEC void init_voxelIds(AxisToSum, vtkm::Id writeOffset, vtkm::UInt8 edgeCase, const FieldInPointId3 &axis_sums, vtkm::Id *edgeIds)
Definition: FlyingEdgesPass4Common.h:80
vtkm::worklet::flying_edges::ComputePass4XWithNormals::ComputePass4XWithNormals
ComputePass4XWithNormals(T value, const vtkm::Id3 &pdims, const vtkm::Vec3f &origin, const vtkm::Vec3f &spacing, vtkm::Id multiContourCellOffset, vtkm::Id multiContourPointOffset)
Definition: FlyingEdgesPass4XWithNormals.h:43
vtkm::worklet::flying_edges::ComputePass4XWithNormals::InterpolateEdge
VTKM_EXEC void InterpolateEdge(bool fullyInterior, const vtkm::Id3 &ijk, vtkm::Id currentIdx, const vtkm::Id3 &incs, vtkm::Id edgeNum, vtkm::UInt8 const *const edgeUses, vtkm::Id *edgeIds, const WholeField &field, const WholeIEdgeField &interpolatedEdgeIds, const WholeWeightField &weights, const WholePointField &points, const WholeNormalField &normals) const
Definition: FlyingEdgesPass4XWithNormals.h:304
FlyingEdgesPass4.h
vtkm::exec::arg::WorkIndex
The ExecutionSignature tag to use to get the work index.
Definition: WorkIndex.h:39