VTK
|
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