VTK  9.3.1
vtkStreamingTessellator.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
2 // SPDX-FileCopyrightText: Copyright 2003 Sandia Corporation
3 // SPDX-License-Identifier: LicenseRef-BSD-3-Clause-Sandia-USGov
67 #ifndef vtkStreamingTessellator_h
68 #define vtkStreamingTessellator_h
69 
70 #include "vtkFiltersCoreModule.h" // For export macro
71 #include "vtkObject.h"
72 
73 #undef PARAVIEW_DEBUG_TESSELLATOR
74 
75 VTK_ABI_NAMESPACE_BEGIN
77 
78 class VTKFILTERSCORE_EXPORT vtkStreamingTessellator : public vtkObject
79 {
80 public:
82  static vtkStreamingTessellator* New();
83  void PrintSelf(ostream& os, vtkIndent indent) override;
84 
85  typedef void (*VertexProcessorFunction)(
86  const double*, vtkEdgeSubdivisionCriterion*, void*, const void*);
87  typedef void (*EdgeProcessorFunction)(
88  const double*, const double*, vtkEdgeSubdivisionCriterion*, void*, const void*);
89  typedef void (*TriangleProcessorFunction)(
90  const double*, const double*, const double*, vtkEdgeSubdivisionCriterion*, void*, const void*);
91  typedef void (*TetrahedronProcessorFunction)(const double*, const double*, const double*,
92  const double*, vtkEdgeSubdivisionCriterion*, void*, const void*);
93 
94  enum
95  {
96  MaxFieldSize = 18
97  };
98 
100 
103  virtual void SetTetrahedronCallback(TetrahedronProcessorFunction);
104  virtual TetrahedronProcessorFunction GetTetrahedronCallback() const;
106 
108 
111  virtual void SetTriangleCallback(TriangleProcessorFunction);
112  virtual TriangleProcessorFunction GetTriangleCallback() const;
114 
116 
119  virtual void SetEdgeCallback(EdgeProcessorFunction);
120  virtual EdgeProcessorFunction GetEdgeCallback() const;
122 
124 
127  virtual void SetVertexCallback(VertexProcessorFunction);
128  virtual VertexProcessorFunction GetVertexCallback() const;
130 
132 
135  virtual void SetPrivateData(void* Private);
136  virtual void* GetPrivateData() const;
138 
139  // can't wrap const private data because python wrapper will try to cast it to void*, not const
140  // void*
141 
143 
146  virtual void SetConstPrivateData(const void* ConstPrivate);
147  virtual const void* GetConstPrivateData() const;
149 
151 
158  virtual void SetSubdivisionAlgorithm(vtkEdgeSubdivisionCriterion*);
159  virtual vtkEdgeSubdivisionCriterion* GetSubdivisionAlgorithm();
161 
162  virtual const vtkEdgeSubdivisionCriterion* GetSubdivisionAlgorithm() const;
163 
165 
177  virtual void SetEmbeddingDimension(int k, int d);
178  int GetEmbeddingDimension(int k) const;
180 
182 
211  virtual void SetFieldSize(int k, int s);
212  int GetFieldSize(int k) const;
214 
216 
219  virtual void SetMaximumNumberOfSubdivisions(int num_subdiv_in);
220  int GetMaximumNumberOfSubdivisions();
222 
224 
243  void AdaptivelySample3FacetLinear(double* v0, double* v1, double* v2, double* v3) const;
244  void AdaptivelySample2FacetLinear(double* v0, double* v1, double* v2) const;
245  void AdaptivelySample1FacetLinear(double* v0, double* v1) const;
246 
247  void AdaptivelySample3Facet(double* v0, double* v1, double* v2, double* v3) const;
248  void AdaptivelySample2Facet(double* v0, double* v1, double* v2) const;
249  void AdaptivelySample1Facet(double* v0, double* v1) const;
250  void AdaptivelySample0Facet(double* v0) const;
252 
254 
266  void ResetCounts()
267  {
268 #ifdef PARAVIEW_DEBUG_TESSELLATOR
269  for (int i = 0; i < 11; ++i)
270  {
271  this->CaseCounts[i] = 0;
272  for (int j = 0; j < 51; ++j)
273  {
274  this->SubcaseCounts[i][j] = 0;
275  }
276  }
277 #endif // PARAVIEW_DEBUG_TESSELLATOR
278  }
280  {
281 #ifdef PARAVIEW_DEBUG_TESSELLATOR
282  return this->CaseCounts[c];
283 #else
284  (void)c;
285  return 0;
286 #endif // PARAVIEW_DEBUG_TESSELLATOR
287  }
288  vtkIdType GetSubcaseCount(int casenum, int sub)
289  {
290 #ifdef PARAVIEW_DEBUG_TESSELLATOR
291  return this->SubcaseCounts[casenum][sub];
292 #else
293  (void)casenum;
294  (void)sub;
295  return 0;
296 #endif // PARAVIEW_DEBUG_TESSELLATOR
297  }
299 
300 protected:
301  static int EdgeCodesToCaseCodesPlusPermutation[64][2];
302  static vtkIdType PermutationsFromIndex[24][14];
303  static vtkIdType TetrahedralDecompositions[];
304 
305  void* PrivateData;
306  const void* ConstPrivateData;
307  vtkEdgeSubdivisionCriterion* Algorithm;
308 
309  VertexProcessorFunction Callback0;
310  EdgeProcessorFunction Callback1;
311  TriangleProcessorFunction Callback2;
312  TetrahedronProcessorFunction Callback3;
313 #ifdef PARAVIEW_DEBUG_TESSELLATOR
314  mutable vtkIdType CaseCounts[11];
315  mutable vtkIdType SubcaseCounts[11][51];
316 #endif // PARAVIEW_DEBUG_TESSELLATOR
317 
326  int PointDimension[4];
327 
333  int EmbeddingDimension[4];
334 
339 
341  ~vtkStreamingTessellator() override;
342 
343  void AdaptivelySample3Facet(double* v0, double* v1, double* v2, double* v3, int maxDepth) const;
344  void AdaptivelySample2Facet(double* v0, double* v1, double* v2, int maxDepth, int move = 7) const;
345  void AdaptivelySample1Facet(double* v0, double* v1, int maxDepth) const;
346 
347  int BestTets(int*, double**, int, int) const;
348 
349 private:
351  void operator=(const vtkStreamingTessellator&) = delete;
352 };
353 
355  double* v0, double* v1, double* v2, double* v3) const
356 {
357  this->AdaptivelySample3Facet(v0, v1, v2, v3, this->MaximumNumberOfSubdivisions);
358 }
360  double* v0, double* v1, double* v2) const
361 {
362  this->AdaptivelySample2Facet(v0, v1, v2, this->MaximumNumberOfSubdivisions);
363 }
364 inline void vtkStreamingTessellator::AdaptivelySample1Facet(double* v0, double* v1) const
365 {
367 }
368 
370 {
371  if (k <= 0 || k >= 4)
372  return -1;
373  return this->EmbeddingDimension[k];
374 }
375 
377 {
378  if (k <= 0 || k >= 4)
379  return -1;
380  return this->PointDimension[k] - this->EmbeddingDimension[k] - 3;
381 }
382 
384 {
385  return this->MaximumNumberOfSubdivisions;
386 }
387 
388 VTK_ABI_NAMESPACE_END
389 #endif // vtkStreamingTessellator_h
vtkIdType GetCaseCount(int c)
Reset/access the histogram of subdivision cases encountered.
abstract base class for most VTK objects
Definition: vtkObject.h:51
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
An algorithm that refines an initial simplicial tessellation using edge subdivision.
int GetFieldSize(int k) const
Get/Set the number of field value coordinates associated with each input and output point...
int PointDimension[4]
PointDimension is the length of each double* array associated with each point passed to a subdivision...
void AdaptivelySample3Facet(double *v0, double *v1, double *v2, double *v3) const
This will adaptively subdivide the tetrahedron (3-facet), triangle (2-facet), or edge (1-facet) until...
vtkIdType GetSubcaseCount(int casenum, int sub)
Reset/access the histogram of subdivision cases encountered.
int vtkIdType
Definition: vtkType.h:315
int EmbeddingDimension[4]
The parametric dimension of each point passed to the subdivision algorithm.
EdgeProcessorFunction Callback1
a simple class to control print indentation
Definition: vtkIndent.h:28
void AdaptivelySample2Facet(double *v0, double *v1, double *v2) const
This will adaptively subdivide the tetrahedron (3-facet), triangle (2-facet), or edge (1-facet) until...
TetrahedronProcessorFunction Callback3
how to decide whether a linear approximation to nonlinear geometry or field should be subdivided ...
vtkEdgeSubdivisionCriterion * Algorithm
TriangleProcessorFunction Callback2
void AdaptivelySample1Facet(double *v0, double *v1) const
This will adaptively subdivide the tetrahedron (3-facet), triangle (2-facet), or edge (1-facet) until...
int GetEmbeddingDimension(int k) const
Get/Set the number of parameter-space coordinates associated with each input and output point...
void ResetCounts()
Reset/access the histogram of subdivision cases encountered.
int GetMaximumNumberOfSubdivisions()
Get/Set the maximum number of subdivisions that may occur.
int MaximumNumberOfSubdivisions
The number of subdivisions allowed.
static vtkObject * New()
Create an object with Debug turned off, modified time initialized to zero, and reference counting on...
VertexProcessorFunction Callback0