VTK
/Users/kitware/Dashboards/MyTests/VTK_BLD_Release_docs/Utilities/Doxygen/dox/Filters/Core/vtkStreamingTessellator.h
Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Visualization Toolkit
00004   Module:    vtkStreamingTessellator.h
00005   Language:  C++
00006 
00007   Copyright 2003 Sandia Corporation.
00008   Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
00009   license for use of this work by or on behalf of the
00010   U.S. Government. Redistribution and use in source and binary forms, with
00011   or without modification, are permitted provided that this Notice and any
00012   statement of authorship are reproduced on all copies.
00013 
00014 =========================================================================*/
00080 #ifndef vtkStreamingTessellator_h
00081 #define vtkStreamingTessellator_h
00082 
00083 #include "vtkFiltersCoreModule.h" // For export macro
00084 #include "vtkObject.h"
00085 
00086 #undef PARAVIEW_DEBUG_TESSELLATOR
00087 
00088 class vtkEdgeSubdivisionCriterion;
00089 
00090 class VTKFILTERSCORE_EXPORT vtkStreamingTessellator : public vtkObject
00091 {
00092   public:
00093     vtkTypeMacro(vtkStreamingTessellator,vtkObject);
00094     static vtkStreamingTessellator* New();
00095     virtual void PrintSelf( ostream& os, vtkIndent indent );
00096 
00097     //BTX
00098     typedef void (*VertexProcessorFunction)( const double*, vtkEdgeSubdivisionCriterion*, void*, const void* );
00099     typedef void (*EdgeProcessorFunction)( const double*, const double*, vtkEdgeSubdivisionCriterion*, void*, const void* );
00100     typedef void (*TriangleProcessorFunction)( const double*, const double*, const double*, vtkEdgeSubdivisionCriterion*, void*, const void* );
00101     typedef void (*TetrahedronProcessorFunction)( const double*, const double*, const double*, const double*, vtkEdgeSubdivisionCriterion*, void*, const void* );
00102 
00103     enum {MaxFieldSize = 18};
00104 
00106 
00107     virtual void SetTetrahedronCallback( TetrahedronProcessorFunction );
00108     virtual TetrahedronProcessorFunction GetTetrahedronCallback() const;
00110 
00112 
00113     virtual void SetTriangleCallback( TriangleProcessorFunction );
00114     virtual TriangleProcessorFunction GetTriangleCallback() const;
00116 
00118 
00119     virtual void SetEdgeCallback( EdgeProcessorFunction );
00120     virtual EdgeProcessorFunction GetEdgeCallback() const;
00122 
00124 
00125     virtual void SetVertexCallback( VertexProcessorFunction );
00126     virtual VertexProcessorFunction GetVertexCallback() const;
00127     //ETX
00129 
00131 
00133     virtual void SetPrivateData( void* Private );
00134     virtual void* GetPrivateData() const;
00136 
00137     // can't wrap const private data because python wrapper will try to cast it to void*, not const void*
00138     //BTX
00140 
00142     virtual void SetConstPrivateData( const void* ConstPrivate );
00143     virtual const void* GetConstPrivateData() const;
00144     //ETX
00146 
00148 
00153     virtual void SetSubdivisionAlgorithm( vtkEdgeSubdivisionCriterion* );
00154     virtual vtkEdgeSubdivisionCriterion* GetSubdivisionAlgorithm() ;
00155     //BTX
00156     virtual const vtkEdgeSubdivisionCriterion* GetSubdivisionAlgorithm() const;
00157     //ETX
00159 
00161 
00171     virtual void SetEmbeddingDimension( int k, int d );
00172     int GetEmbeddingDimension( int k ) const;
00174 
00176 
00202     virtual void SetFieldSize( int k, int s );
00203     int GetFieldSize( int k ) const;
00205 
00207 
00208     virtual void SetMaximumNumberOfSubdivisions( int num_subdiv_in );
00209     int GetMaximumNumberOfSubdivisions();
00211 
00213 
00225     void AdaptivelySample3Facet( double* v1, double* v2, double* v3, double* v4 ) const ;
00226     void AdaptivelySample2Facet( double* v1, double* v2, double* v3 ) const ;
00227     void AdaptivelySample1Facet( double* v1, double* v2 ) const ;
00228     void AdaptivelySample0Facet( double* v1 ) const ;
00230 
00232 
00241     void ResetCounts()
00242     {
00243 #ifdef PARAVIEW_DEBUG_TESSELLATOR
00244       for ( int i=0; i<11; ++i )
00245         {
00246         this->CaseCounts[i] = 0;
00247         for ( int j=0; j<51; ++j )
00248           {
00249           this->SubcaseCounts[i][j] = 0;
00250           }
00251         }
00252 #endif // PARAVIEW_DEBUG_TESSELLATOR
00253     }
00254     vtkIdType GetCaseCount( int c )
00255       {
00256 #ifdef PARAVIEW_DEBUG_TESSELLATOR
00257       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       }
00274 
00275   protected:
00276     //BTX
00277     static int EdgeCodesToCaseCodesPlusPermutation[64][2];
00278     static vtkIdType PermutationsFromIndex[24][14];
00279     static vtkIdType TetrahedralDecompositions[];
00280     //ETX
00281 
00282     void* PrivateData;
00283     const void* ConstPrivateData;
00284     vtkEdgeSubdivisionCriterion* Algorithm;
00285     //BTX
00286     VertexProcessorFunction Callback0;
00287     EdgeProcessorFunction Callback1;
00288     TriangleProcessorFunction Callback2;
00289     TetrahedronProcessorFunction Callback3;
00290 #ifdef PARAVIEW_DEBUG_TESSELLATOR
00291     mutable vtkIdType CaseCounts[11];
00292     mutable vtkIdType SubcaseCounts[11][51];
00293 #endif // PARAVIEW_DEBUG_TESSELLATOR
00294     //ETX
00295 
00302     int PointDimension[4];
00303 
00307     int EmbeddingDimension[4];
00308 
00310     int MaximumNumberOfSubdivisions;
00311 
00312     vtkStreamingTessellator();
00313     ~vtkStreamingTessellator();
00314 
00315     void AdaptivelySample3Facet( double* v1, double* v2, double* v3, double* v4, int maxDepth ) const ;
00316     void AdaptivelySample2Facet( double* v1, double* v2, double* v3, int maxDepth, int move=7 ) const ;
00317     void AdaptivelySample1Facet( double* v1, double* v2, int maxDepth ) const ;
00318 
00319     int BestTets( int*, double**, int, int ) const;
00320 
00321   private:
00322     vtkStreamingTessellator( const vtkStreamingTessellator& ); // Not implemented.
00323     void operator = ( const vtkStreamingTessellator& ); // Not implemented.
00324 };
00325 
00326 //BTX
00327 
00328 inline void vtkStreamingTessellator::AdaptivelySample3Facet( double* v1, double* v2, double* v3, double* v4 ) const
00329 { this->AdaptivelySample3Facet( v1, v2, v3, v4, this->MaximumNumberOfSubdivisions ); }
00330 inline void vtkStreamingTessellator::AdaptivelySample2Facet( double* v1, double* v2, double* v3 ) const
00331 { this->AdaptivelySample2Facet( v1, v2, v3, this->MaximumNumberOfSubdivisions ); }
00332 inline void vtkStreamingTessellator::AdaptivelySample1Facet( double* v1, double* v2 ) const
00333 { this->AdaptivelySample1Facet( v1, v2, this->MaximumNumberOfSubdivisions ); }
00334 
00335 inline int vtkStreamingTessellator::GetEmbeddingDimension( int k ) const
00336 { if ( k <= 0 || k >= 4 ) return -1; return this->EmbeddingDimension[k]; }
00337 
00338 inline int vtkStreamingTessellator::GetFieldSize( int k ) const
00339 { if ( k <= 0 || k >= 4 ) return -1; return this->PointDimension[k] - this->EmbeddingDimension[k] - 3; }
00340 
00341 inline int vtkStreamingTessellator::GetMaximumNumberOfSubdivisions() {return this->MaximumNumberOfSubdivisions;}
00342 
00343 //ETX
00344 
00345 #endif // vtkStreamingTessellator_h