VTK
vtkStreamingTessellator.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: Visualization Toolkit
4  Module: vtkStreamingTessellator.h
5  Language: C++
6 
7  Copyright 2003 Sandia Corporation.
8  Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
9  license for use of this work by or on behalf of the
10  U.S. Government. Redistribution and use in source and binary forms, with
11  or without modification, are permitted provided that this Notice and any
12  statement of authorship are reproduced on all copies.
13 
14 =========================================================================*/
77 #ifndef vtkStreamingTessellator_h
78 #define vtkStreamingTessellator_h
79 
80 #include "vtkFiltersCoreModule.h" // For export macro
81 #include "vtkObject.h"
82 
83 #undef PARAVIEW_DEBUG_TESSELLATOR
84 
86 
88 {
89  public:
91  static vtkStreamingTessellator* New();
92  virtual void PrintSelf( ostream& os, vtkIndent indent );
93 
94  //BTX
95  typedef void (*VertexProcessorFunction)( const double*, vtkEdgeSubdivisionCriterion*, void*, const void* );
96  typedef void (*EdgeProcessorFunction)( const double*, const double*, vtkEdgeSubdivisionCriterion*, void*, const void* );
97  typedef void (*TriangleProcessorFunction)( const double*, const double*, const double*, vtkEdgeSubdivisionCriterion*, void*, const void* );
98  typedef void (*TetrahedronProcessorFunction)( const double*, const double*, const double*, const double*, vtkEdgeSubdivisionCriterion*, void*, const void* );
99 
100  enum {MaxFieldSize = 18};
101 
103 
104  virtual void SetTetrahedronCallback( TetrahedronProcessorFunction );
105  virtual TetrahedronProcessorFunction GetTetrahedronCallback() const;
107 
109 
110  virtual void SetTriangleCallback( TriangleProcessorFunction );
111  virtual TriangleProcessorFunction GetTriangleCallback() const;
113 
115 
116  virtual void SetEdgeCallback( EdgeProcessorFunction );
117  virtual EdgeProcessorFunction GetEdgeCallback() const;
119 
121 
122  virtual void SetVertexCallback( VertexProcessorFunction );
123  virtual VertexProcessorFunction GetVertexCallback() const;
124  //ETX
126 
128 
130  virtual void SetPrivateData( void* Private );
131  virtual void* GetPrivateData() const;
133 
134  // can't wrap const private data because python wrapper will try to cast it to void*, not const void*
135  //BTX
137 
139  virtual void SetConstPrivateData( const void* ConstPrivate );
140  virtual const void* GetConstPrivateData() const;
141  //ETX
143 
145 
150  virtual void SetSubdivisionAlgorithm( vtkEdgeSubdivisionCriterion* );
151  virtual vtkEdgeSubdivisionCriterion* GetSubdivisionAlgorithm() ;
152  //BTX
153  virtual const vtkEdgeSubdivisionCriterion* GetSubdivisionAlgorithm() const;
154  //ETX
156 
158 
168  virtual void SetEmbeddingDimension( int k, int d );
169  int GetEmbeddingDimension( int k ) const;
171 
173 
199  virtual void SetFieldSize( int k, int s );
200  int GetFieldSize( int k ) const;
202 
204 
205  virtual void SetMaximumNumberOfSubdivisions( int num_subdiv_in );
206  int GetMaximumNumberOfSubdivisions();
208 
210 
222  void AdaptivelySample3Facet( double* v1, double* v2, double* v3, double* v4 ) const ;
223  void AdaptivelySample2Facet( double* v1, double* v2, double* v3 ) const ;
224  void AdaptivelySample1Facet( double* v1, double* v2 ) const ;
225  void AdaptivelySample0Facet( double* v1 ) const ;
227 
229 
238  void ResetCounts()
239  {
240 #ifdef PARAVIEW_DEBUG_TESSELLATOR
241  for ( int i=0; i<11; ++i )
242  {
243  this->CaseCounts[i] = 0;
244  for ( int j=0; j<51; ++j )
245  {
246  this->SubcaseCounts[i][j] = 0;
247  }
248  }
249 #endif // PARAVIEW_DEBUG_TESSELLATOR
250  }
252  {
253 #ifdef PARAVIEW_DEBUG_TESSELLATOR
254  return this->CaseCounts[c];
255 #else
256  (void)c;
257  return 0;
258 #endif // PARAVIEW_DEBUG_TESSELLATOR
259  }
260  vtkIdType GetSubcaseCount( int casenum, int sub )
261  {
262 #ifdef PARAVIEW_DEBUG_TESSELLATOR
263  return this->SubcaseCounts[casenum][sub];
264 #else
265  (void)casenum;
266  (void)sub;
267  return 0;
268 #endif // PARAVIEW_DEBUG_TESSELLATOR
269  }
271 
272  protected:
273  //BTX
274  static int EdgeCodesToCaseCodesPlusPermutation[64][2];
275  static vtkIdType PermutationsFromIndex[24][14];
276  static vtkIdType TetrahedralDecompositions[];
277  //ETX
278 
279  void* PrivateData;
280  const void* ConstPrivateData;
281  vtkEdgeSubdivisionCriterion* Algorithm;
282  //BTX
283  VertexProcessorFunction Callback0;
284  EdgeProcessorFunction Callback1;
285  TriangleProcessorFunction Callback2;
286  TetrahedronProcessorFunction Callback3;
287 #ifdef PARAVIEW_DEBUG_TESSELLATOR
288  mutable vtkIdType CaseCounts[11];
289  mutable vtkIdType SubcaseCounts[11][51];
290 #endif // PARAVIEW_DEBUG_TESSELLATOR
291  //ETX
292 
299  int PointDimension[4];
300 
304  int EmbeddingDimension[4];
305 
308 
311 
312  void AdaptivelySample3Facet( double* v1, double* v2, double* v3, double* v4, int maxDepth ) const ;
313  void AdaptivelySample2Facet( double* v1, double* v2, double* v3, int maxDepth, int move=7 ) const ;
314  void AdaptivelySample1Facet( double* v1, double* v2, int maxDepth ) const ;
315 
316  int BestTets( int*, double**, int, int ) const;
317 
318  private:
319  vtkStreamingTessellator( const vtkStreamingTessellator& ); // Not implemented.
320  void operator = ( const vtkStreamingTessellator& ); // Not implemented.
321 };
322 
323 //BTX
324 
325 inline void vtkStreamingTessellator::AdaptivelySample3Facet( double* v1, double* v2, double* v3, double* v4 ) const
326 { this->AdaptivelySample3Facet( v1, v2, v3, v4, this->MaximumNumberOfSubdivisions ); }
327 inline void vtkStreamingTessellator::AdaptivelySample2Facet( double* v1, double* v2, double* v3 ) const
328 { this->AdaptivelySample2Facet( v1, v2, v3, this->MaximumNumberOfSubdivisions ); }
329 inline void vtkStreamingTessellator::AdaptivelySample1Facet( double* v1, double* v2 ) const
330 { this->AdaptivelySample1Facet( v1, v2, this->MaximumNumberOfSubdivisions ); }
331 
333 { if ( k <= 0 || k >= 4 ) return -1; return this->EmbeddingDimension[k]; }
334 
335 inline int vtkStreamingTessellator::GetFieldSize( int k ) const
336 { if ( k <= 0 || k >= 4 ) return -1; return this->PointDimension[k] - this->EmbeddingDimension[k] - 3; }
337 
339 
340 //ETX
341 
342 #endif // vtkStreamingTessellator_h
abstract base class for most VTK objects
Definition: vtkObject.h:61
An algorithm that refines an initial simplicial tessellation using edge subdivision.
#define VTKFILTERSCORE_EXPORT
vtkIdType GetSubcaseCount(int casenum, int sub)
int vtkIdType
Definition: vtkType.h:247
void AdaptivelySample1Facet(double *v1, double *v2) const
EdgeProcessorFunction Callback1
virtual void PrintSelf(ostream &os, vtkIndent indent)
a simple class to control print indentation
Definition: vtkIndent.h:38
TetrahedronProcessorFunction Callback3
how to decide whether a linear approximation to nonlinear geometry or field should be subdivided ...
vtkEdgeSubdivisionCriterion * Algorithm
TriangleProcessorFunction Callback2
int GetEmbeddingDimension(int k) const
void AdaptivelySample3Facet(double *v1, double *v2, double *v3, double *v4) const
static vtkObject * New()
void AdaptivelySample2Facet(double *v1, double *v2, double *v3) const
VertexProcessorFunction Callback0