VTK
dox/Graphics/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 "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     //BTX
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     //ETX
00128 
00130 
00132     virtual void SetPrivateData( void* Private );
00133     virtual void* GetPrivateData() const;
00135 
00136     // can't wrap const private data because python wrapper will try to cast it to void*, not const void*
00137     //BTX
00139 
00141     virtual void SetConstPrivateData( const void* ConstPrivate );
00142     virtual const void* GetConstPrivateData() const;
00143     //ETX
00145 
00147 
00152     virtual void SetSubdivisionAlgorithm( vtkEdgeSubdivisionCriterion* );
00153     virtual vtkEdgeSubdivisionCriterion* GetSubdivisionAlgorithm() ;
00154     //BTX
00155     virtual const vtkEdgeSubdivisionCriterion* GetSubdivisionAlgorithm() const;
00156     //ETX
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];
00257 #else
00258       (void)c;
00259       return 0;
00260 #endif // PARAVIEW_DEBUG_TESSELLATOR
00261       }
00262     vtkIdType GetSubcaseCount( int casenum, int sub )
00263       {
00264 #ifdef PARAVIEW_DEBUG_TESSELLATOR
00265       return this->SubcaseCounts[casenum][sub];
00266 #else
00267       (void)casenum;
00268       (void)sub;
00269       return 0;
00270 #endif // PARAVIEW_DEBUG_TESSELLATOR
00271       }
00273 
00274   protected:
00275     //BTX
00276     static int EdgeCodesToCaseCodesPlusPermutation[64][2];
00277     static vtkIdType PermutationsFromIndex[24][14];
00278     static vtkIdType TetrahedralDecompositions[];
00279     //ETX
00280 
00281     void* PrivateData;
00282     const void* ConstPrivateData;
00283     vtkEdgeSubdivisionCriterion* Algorithm;
00284     //BTX
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     //ETX
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& ); // Not implemented.
00322     void operator = ( const vtkStreamingTessellator& ); // Not implemented.
00323 };
00324 
00325 //BTX
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 //ETX
00343 
00344 #endif // vtkStreamingTessellator_h