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     vtkTypeRevisionMacro(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