00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00080 #ifndef vtkStreamingTessellator_h
00081 #define vtkStreamingTessellator_h
00082
00083 #include "vtkObject.h"
00084
00085 #undef PARAVIEW_DEBUG_TESSELLATOR
00086
00087 class vtkEdgeSubdivisionCriterion;
00088
00089 class VTK_GRAPHICS_EXPORT vtkStreamingTessellator : public vtkObject
00090 {
00091 public:
00092 vtkTypeMacro(vtkStreamingTessellator,vtkObject);
00093 static vtkStreamingTessellator* New();
00094 virtual void PrintSelf( ostream& os, vtkIndent indent );
00095
00096
00097 typedef void (*VertexProcessorFunction)( const double*, vtkEdgeSubdivisionCriterion*, void*, const void* );
00098 typedef void (*EdgeProcessorFunction)( const double*, const double*, vtkEdgeSubdivisionCriterion*, void*, const void* );
00099 typedef void (*TriangleProcessorFunction)( const double*, const double*, const double*, vtkEdgeSubdivisionCriterion*, void*, const void* );
00100 typedef void (*TetrahedronProcessorFunction)( const double*, const double*, const double*, const double*, vtkEdgeSubdivisionCriterion*, void*, const void* );
00101
00102 enum {MaxFieldSize = 18};
00103
00105
00106 virtual void SetTetrahedronCallback( TetrahedronProcessorFunction );
00107 virtual TetrahedronProcessorFunction GetTetrahedronCallback() const;
00109
00111
00112 virtual void SetTriangleCallback( TriangleProcessorFunction );
00113 virtual TriangleProcessorFunction GetTriangleCallback() const;
00115
00117
00118 virtual void SetEdgeCallback( EdgeProcessorFunction );
00119 virtual EdgeProcessorFunction GetEdgeCallback() const;
00121
00123
00124 virtual void SetVertexCallback( VertexProcessorFunction );
00125 virtual VertexProcessorFunction GetVertexCallback() const;
00126
00128
00130
00132 virtual void SetPrivateData( void* Private );
00133 virtual void* GetPrivateData() const;
00135
00136
00137
00139
00141 virtual void SetConstPrivateData( const void* ConstPrivate );
00142 virtual const void* GetConstPrivateData() const;
00143
00145
00147
00152 virtual void SetSubdivisionAlgorithm( vtkEdgeSubdivisionCriterion* );
00153 virtual vtkEdgeSubdivisionCriterion* GetSubdivisionAlgorithm() ;
00154
00155 virtual const vtkEdgeSubdivisionCriterion* GetSubdivisionAlgorithm() const;
00156
00158
00160
00170 virtual void SetEmbeddingDimension( int k, int d );
00171 int GetEmbeddingDimension( int k ) const;
00173
00175
00201 virtual void SetFieldSize( int k, int s );
00202 int GetFieldSize( int k ) const;
00204
00206
00207 virtual void SetMaximumNumberOfSubdivisions( int num_subdiv_in );
00208 int GetMaximumNumberOfSubdivisions();
00210
00212
00224 void AdaptivelySample3Facet( double* v1, double* v2, double* v3, double* v4 ) const ;
00225 void AdaptivelySample2Facet( double* v1, double* v2, double* v3 ) const ;
00226 void AdaptivelySample1Facet( double* v1, double* v2 ) const ;
00227 void AdaptivelySample0Facet( double* v1 ) const ;
00229
00231
00240 void ResetCounts()
00241 {
00242 #ifdef PARAVIEW_DEBUG_TESSELLATOR
00243 for ( int i=0; i<11; ++i )
00244 {
00245 this->CaseCounts[i] = 0;
00246 for ( int j=0; j<51; ++j )
00247 {
00248 this->SubcaseCounts[i][j] = 0;
00249 }
00250 }
00251 #endif // PARAVIEW_DEBUG_TESSELLATOR
00252 }
00253 vtkIdType GetCaseCount( int c )
00254 {
00255 #ifdef PARAVIEW_DEBUG_TESSELLATOR
00256 return this->CaseCounts[c];
00258 #else
00259 (void)c;
00260 return 0;
00261 #endif // PARAVIEW_DEBUG_TESSELLATOR
00262 }
00263 vtkIdType GetSubcaseCount( int casenum, int sub )
00264 {
00265 #ifdef PARAVIEW_DEBUG_TESSELLATOR
00266 return this->SubcaseCounts[casenum][sub];
00267 #else
00268 (void)casenum;
00269 (void)sub;
00270 return 0;
00271 #endif // PARAVIEW_DEBUG_TESSELLATOR
00272 }
00273
00274 protected:
00275
00276 static int EdgeCodesToCaseCodesPlusPermutation[64][2];
00277 static vtkIdType PermutationsFromIndex[24][14];
00278 static vtkIdType TetrahedralDecompositions[];
00279
00280
00281 void* PrivateData;
00282 const void* ConstPrivateData;
00283 vtkEdgeSubdivisionCriterion* Algorithm;
00284
00285 VertexProcessorFunction Callback0;
00286 EdgeProcessorFunction Callback1;
00287 TriangleProcessorFunction Callback2;
00288 TetrahedronProcessorFunction Callback3;
00289 #ifdef PARAVIEW_DEBUG_TESSELLATOR
00290 mutable vtkIdType CaseCounts[11];
00291 mutable vtkIdType SubcaseCounts[11][51];
00292 #endif // PARAVIEW_DEBUG_TESSELLATOR
00293
00294
00301 int PointDimension[4];
00302
00306 int EmbeddingDimension[4];
00307
00309 int MaximumNumberOfSubdivisions;
00310
00311 vtkStreamingTessellator();
00312 ~vtkStreamingTessellator();
00313
00314 void AdaptivelySample3Facet( double* v1, double* v2, double* v3, double* v4, int maxDepth ) const ;
00315 void AdaptivelySample2Facet( double* v1, double* v2, double* v3, int maxDepth, int move=7 ) const ;
00316 void AdaptivelySample1Facet( double* v1, double* v2, int maxDepth ) const ;
00317
00318 int BestTets( int*, double**, int, int ) const;
00319
00320 private:
00321 vtkStreamingTessellator( const vtkStreamingTessellator& );
00322 void operator = ( const vtkStreamingTessellator& );
00323 };
00324
00325
00326
00327 inline void vtkStreamingTessellator::AdaptivelySample3Facet( double* v1, double* v2, double* v3, double* v4 ) const
00328 { this->AdaptivelySample3Facet( v1, v2, v3, v4, this->MaximumNumberOfSubdivisions ); }
00329 inline void vtkStreamingTessellator::AdaptivelySample2Facet( double* v1, double* v2, double* v3 ) const
00330 { this->AdaptivelySample2Facet( v1, v2, v3, this->MaximumNumberOfSubdivisions ); }
00331 inline void vtkStreamingTessellator::AdaptivelySample1Facet( double* v1, double* v2 ) const
00332 { this->AdaptivelySample1Facet( v1, v2, this->MaximumNumberOfSubdivisions ); }
00333
00334 inline int vtkStreamingTessellator::GetEmbeddingDimension( int k ) const
00335 { if ( k <= 0 || k >= 4 ) return -1; return this->EmbeddingDimension[k]; }
00336
00337 inline int vtkStreamingTessellator::GetFieldSize( int k ) const
00338 { if ( k <= 0 || k >= 4 ) return -1; return this->PointDimension[k] - this->EmbeddingDimension[k] - 3; }
00339
00340 inline int vtkStreamingTessellator::GetMaximumNumberOfSubdivisions() {return this->MaximumNumberOfSubdivisions;}
00341
00342
00343
00344 #endif // vtkStreamingTessellator_h