/*****************************************************************//** * @file FITKPolyDataNormals.h * @brief The filter for getting polydata's normals. * * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-04-30 *********************************************************************/ #ifndef FITKPOLYDATANORMALS_H #define FITKPOLYDATANORMALS_H #include "vtkPolyDataAlgorithm.h" #include "FITKVTKAlgorithmAPI.h" class vtkFloatArray; class vtkIdList; class vtkPolyData; class FITKVTKALGORITHMAPI FITKPolyDataNormals : public vtkPolyDataAlgorithm { public: vtkTypeMacro(FITKPolyDataNormals, vtkPolyDataAlgorithm); void PrintSelf(ostream& os, vtkIndent indent) override; /** * Construct with feature angle=30, splitting and consistency turned on, * flipNormals turned off, and non-manifold traversal turned on. * ComputePointNormals is on and ComputeCellNormals is off. */ static FITKPolyDataNormals* New(); //@{ /** * Specify the angle that defines a sharp edge. If the difference in * angle across neighboring polygons is greater than this value, the * shared edge is considered "sharp". */ vtkSetClampMacro(FeatureAngle, double, 0.0, 180.0); vtkGetMacro(FeatureAngle, double); //@} //@{ /** * Turn on/off the splitting of sharp edges. */ vtkSetMacro(Splitting, vtkTypeBool); vtkGetMacro(Splitting, vtkTypeBool); vtkBooleanMacro(Splitting, vtkTypeBool); //@} //@{ /** * Turn on/off the enforcement of consistent polygon ordering. */ vtkSetMacro(Consistency, vtkTypeBool); vtkGetMacro(Consistency, vtkTypeBool); vtkBooleanMacro(Consistency, vtkTypeBool); //@} //@{ /** * Turn on/off the automatic determination of correct normal * orientation. NOTE: This assumes a completely closed surface * (i.e. no boundary edges) and no non-manifold edges. If these * constraints do not hold, all bets are off. This option adds some * computational complexity, and is useful if you don't want to have * to inspect the rendered image to determine whether to turn on the * FlipNormals flag. However, this flag can work with the FlipNormals * flag, and if both are set, all the normals in the output will * point "inward". */ vtkSetMacro(AutoOrientNormals, vtkTypeBool); vtkGetMacro(AutoOrientNormals, vtkTypeBool); vtkBooleanMacro(AutoOrientNormals, vtkTypeBool); //@} //@{ /** * Turn on/off the computation of point normals. */ vtkSetMacro(ComputePointNormals, vtkTypeBool); vtkGetMacro(ComputePointNormals, vtkTypeBool); vtkBooleanMacro(ComputePointNormals, vtkTypeBool); //@} //@{ /** * Turn on/off the computation of cell normals. */ vtkSetMacro(ComputeCellNormals, vtkTypeBool); vtkGetMacro(ComputeCellNormals, vtkTypeBool); vtkBooleanMacro(ComputeCellNormals, vtkTypeBool); //@} //@{ /** * Turn on/off the global flipping of normal orientation. Flipping * reverves the meaning of front and back for Frontface and Backface * culling in vtkProperty. Flipping modifies both the normal * direction and the order of a cell's points. */ vtkSetMacro(FlipNormals, vtkTypeBool); vtkGetMacro(FlipNormals, vtkTypeBool); vtkBooleanMacro(FlipNormals, vtkTypeBool); //@} //@{ /** * Turn on/off traversal across non-manifold edges. This will prevent * problems where the consistency of polygonal ordering is corrupted due * to topological loops. */ vtkSetMacro(NonManifoldTraversal, vtkTypeBool); vtkGetMacro(NonManifoldTraversal, vtkTypeBool); vtkBooleanMacro(NonManifoldTraversal, vtkTypeBool); //@} //@{ /** * Set/get the desired precision for the output types. See the documentation * for the vtkAlgorithm::DesiredOutputPrecision enum for an explanation of * the available precision settings. */ vtkSetClampMacro(OutputPointsPrecision, int, SINGLE_PRECISION, DEFAULT_PRECISION); vtkGetMacro(OutputPointsPrecision, int); //@} protected: FITKPolyDataNormals(); ~FITKPolyDataNormals() override {} // Usual data generation method int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override; double FeatureAngle; vtkTypeBool Splitting; vtkTypeBool Consistency; vtkTypeBool FlipNormals; vtkTypeBool AutoOrientNormals; vtkTypeBool NonManifoldTraversal; vtkTypeBool ComputePointNormals; vtkTypeBool ComputeCellNormals; int NumFlips; int OutputPointsPrecision; private: vtkIdList* Wave; vtkIdList* Wave2; vtkIdList* CellIds; vtkIdList* CellPoints; vtkIdList* NeighborPoints; vtkIdList* Map; vtkPolyData* OldMesh; vtkPolyData* NewMesh; int* Visited; vtkFloatArray* PolyNormals; double CosAngle; // Uses the list of cell ids (this->Wave) to propagate a wave of // checked and properly ordered polygons. void TraverseAndOrder(void); // Check the point id give to see whether it lies on a feature // edge. If so, split the point (i.e., duplicate it) to topologically // separate the mesh. void MarkAndSplit(vtkIdType ptId); private: FITKPolyDataNormals(const FITKPolyDataNormals&) = delete; void operator=(const FITKPolyDataNormals&) = delete; }; #endif // FITKPOLYDATANORMALS_H