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 =========================================================================*/
80 #ifndef vtkStreamingTessellator_h
81 #define vtkStreamingTessellator_h
82 
83 #include "vtkFiltersCoreModule.h" // For export macro
84 #include "vtkObject.h"
85 
86 #undef PARAVIEW_DEBUG_TESSELLATOR
87 
89 
91 {
92  public:
94  static vtkStreamingTessellator* New();
95  virtual void PrintSelf( ostream& os, vtkIndent indent );
96 
97  //BTX
98  typedef void (*VertexProcessorFunction)( const double*, vtkEdgeSubdivisionCriterion*, void*, const void* );
99  typedef void (*EdgeProcessorFunction)( const double*, const double*, vtkEdgeSubdivisionCriterion*, void*, const void* );
100  typedef void (*TriangleProcessorFunction)( const double*, const double*, const double*, vtkEdgeSubdivisionCriterion*, void*, const void* );
101  typedef void (*TetrahedronProcessorFunction)( const double*, const double*, const double*, const double*, vtkEdgeSubdivisionCriterion*, void*, const void* );
102 
103  enum {MaxFieldSize = 18};
104 
106 
107  virtual void SetTetrahedronCallback( TetrahedronProcessorFunction );
108  virtual TetrahedronProcessorFunction GetTetrahedronCallback() const;
110 
112 
113  virtual void SetTriangleCallback( TriangleProcessorFunction );
114  virtual TriangleProcessorFunction GetTriangleCallback() const;
116 
118 
119  virtual void SetEdgeCallback( EdgeProcessorFunction );
120  virtual EdgeProcessorFunction GetEdgeCallback() const;
122 
124 
125  virtual void SetVertexCallback( VertexProcessorFunction );
126  virtual VertexProcessorFunction GetVertexCallback() const;
127  //ETX
129 
131 
133  virtual void SetPrivateData( void* Private );
134  virtual void* GetPrivateData() const;
136 
137  // can't wrap const private data because python wrapper will try to cast it to void*, not const void*
138  //BTX
140 
142  virtual void SetConstPrivateData( const void* ConstPrivate );
143  virtual const void* GetConstPrivateData() const;
144  //ETX
146 
148 
153  virtual void SetSubdivisionAlgorithm( vtkEdgeSubdivisionCriterion* );
154  virtual vtkEdgeSubdivisionCriterion* GetSubdivisionAlgorithm() ;
155  //BTX
156  virtual const vtkEdgeSubdivisionCriterion* GetSubdivisionAlgorithm() const;
157  //ETX
159 
161 
171  virtual void SetEmbeddingDimension( int k, int d );
172  int GetEmbeddingDimension( int k ) const;
174 
176 
202  virtual void SetFieldSize( int k, int s );
203  int GetFieldSize( int k ) const;
205 
207 
208  virtual void SetMaximumNumberOfSubdivisions( int num_subdiv_in );
209  int GetMaximumNumberOfSubdivisions();
211 
213 
225  void AdaptivelySample3Facet( double* v1, double* v2, double* v3, double* v4 ) const ;
226  void AdaptivelySample2Facet( double* v1, double* v2, double* v3 ) const ;
227  void AdaptivelySample1Facet( double* v1, double* v2 ) const ;
228  void AdaptivelySample0Facet( double* v1 ) const ;
230 
232 
241  void ResetCounts()
242  {
243 #ifdef PARAVIEW_DEBUG_TESSELLATOR
244  for ( int i=0; i<11; ++i )
245  {
246  this->CaseCounts[i] = 0;
247  for ( int j=0; j<51; ++j )
248  {
249  this->SubcaseCounts[i][j] = 0;
250  }
251  }
252 #endif // PARAVIEW_DEBUG_TESSELLATOR
253  }
255  {
256 #ifdef PARAVIEW_DEBUG_TESSELLATOR
257  return this->CaseCounts[c];
258 #else
259  (void)c;
260  return 0;
261 #endif // PARAVIEW_DEBUG_TESSELLATOR
262  }
263  vtkIdType GetSubcaseCount( int casenum, int sub )
264  {
265 #ifdef PARAVIEW_DEBUG_TESSELLATOR
266  return this->SubcaseCounts[casenum][sub];
267 #else
268  (void)casenum;
269  (void)sub;
270  return 0;
271 #endif // PARAVIEW_DEBUG_TESSELLATOR
272  }
274 
275  protected:
276  //BTX
277  static int EdgeCodesToCaseCodesPlusPermutation[64][2];
278  static vtkIdType PermutationsFromIndex[24][14];
279  static vtkIdType TetrahedralDecompositions[];
280  //ETX
281 
282  void* PrivateData;
283  const void* ConstPrivateData;
284  vtkEdgeSubdivisionCriterion* Algorithm;
285  //BTX
286  VertexProcessorFunction Callback0;
287  EdgeProcessorFunction Callback1;
288  TriangleProcessorFunction Callback2;
289  TetrahedronProcessorFunction Callback3;
290 #ifdef PARAVIEW_DEBUG_TESSELLATOR
291  mutable vtkIdType CaseCounts[11];
292  mutable vtkIdType SubcaseCounts[11][51];
293 #endif // PARAVIEW_DEBUG_TESSELLATOR
294  //ETX
295 
302  int PointDimension[4];
303 
307  int EmbeddingDimension[4];
308 
311 
314 
315  void AdaptivelySample3Facet( double* v1, double* v2, double* v3, double* v4, int maxDepth ) const ;
316  void AdaptivelySample2Facet( double* v1, double* v2, double* v3, int maxDepth, int move=7 ) const ;
317  void AdaptivelySample1Facet( double* v1, double* v2, int maxDepth ) const ;
318 
319  int BestTets( int*, double**, int, int ) const;
320 
321  private:
322  vtkStreamingTessellator( const vtkStreamingTessellator& ); // Not implemented.
323  void operator = ( const vtkStreamingTessellator& ); // Not implemented.
324 };
325 
326 //BTX
327 
328 inline void vtkStreamingTessellator::AdaptivelySample3Facet( double* v1, double* v2, double* v3, double* v4 ) const
329 { this->AdaptivelySample3Facet( v1, v2, v3, v4, this->MaximumNumberOfSubdivisions ); }
330 inline void vtkStreamingTessellator::AdaptivelySample2Facet( double* v1, double* v2, double* v3 ) const
331 { this->AdaptivelySample2Facet( v1, v2, v3, this->MaximumNumberOfSubdivisions ); }
332 inline void vtkStreamingTessellator::AdaptivelySample1Facet( double* v1, double* v2 ) const
333 { this->AdaptivelySample1Facet( v1, v2, this->MaximumNumberOfSubdivisions ); }
334 
336 { if ( k <= 0 || k >= 4 ) return -1; return this->EmbeddingDimension[k]; }
337 
338 inline int vtkStreamingTessellator::GetFieldSize( int k ) const
339 { if ( k <= 0 || k >= 4 ) return -1; return this->PointDimension[k] - this->EmbeddingDimension[k] - 3; }
340 
342 
343 //ETX
344 
345 #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:275
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