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