You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
161 lines
5.5 KiB
161 lines
5.5 KiB
2 years ago
|
/*=========================================================================
|
||
|
|
||
|
Program: Visualization Toolkit
|
||
|
Module: $RCSfile: vtkPolyDataNormals.h,v $
|
||
|
|
||
|
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
|
||
|
All rights reserved.
|
||
|
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
|
||
|
|
||
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
||
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||
|
PURPOSE. See the above copyright notice for more information.
|
||
|
|
||
|
=========================================================================*/
|
||
|
// .NAME vtkPolyDataNormals - compute normals for polygonal mesh
|
||
|
// .SECTION Description
|
||
|
// vtkPolyDataNormals is a filter that computes point normals for a polygonal
|
||
|
// mesh. The filter can reorder polygons to insure consistent orientation
|
||
|
// across polygon neighbors. Sharp edges can be split and points duplicated
|
||
|
// with separate normals to give crisp (rendered) surface definition. It is
|
||
|
// also possible to globally flip the normal orientation.
|
||
|
//
|
||
|
// The algorithm works by determining normals for each polygon and then
|
||
|
// averaging them at shared points. When sharp edges are present, the edges
|
||
|
// are split and new points generated to prevent blurry edges (due to
|
||
|
// Gouraud shading).
|
||
|
|
||
|
// .SECTION Caveats
|
||
|
// Normals are computed only for polygons and triangle strips. Normals are
|
||
|
// not computed for lines or vertices.
|
||
|
//
|
||
|
// Triangle strips are broken up into triangle polygons. You may want to
|
||
|
// restrip the triangles.
|
||
|
|
||
|
#ifndef __vtkPolyDataNormals_h
|
||
|
#define __vtkPolyDataNormals_h
|
||
|
|
||
|
#include "vtkPolyDataAlgorithm.h"
|
||
|
|
||
|
class vtkFloatArray;
|
||
|
class vtkIdList;
|
||
|
class vtkPolyData;
|
||
|
|
||
|
class VTK_GRAPHICS_EXPORT vtkPolyDataNormals : public vtkPolyDataAlgorithm
|
||
|
{
|
||
|
public:
|
||
|
vtkTypeRevisionMacro(vtkPolyDataNormals,vtkPolyDataAlgorithm);
|
||
|
void PrintSelf(ostream& os, vtkIndent indent);
|
||
|
|
||
|
// Description:
|
||
|
// 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 vtkPolyDataNormals *New();
|
||
|
|
||
|
// Description:
|
||
|
// 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);
|
||
|
|
||
|
// Description:
|
||
|
// Turn on/off the splitting of sharp edges.
|
||
|
vtkSetMacro(Splitting,int);
|
||
|
vtkGetMacro(Splitting,int);
|
||
|
vtkBooleanMacro(Splitting,int);
|
||
|
|
||
|
// Description:
|
||
|
// Turn on/off the enforcement of consistent polygon ordering.
|
||
|
vtkSetMacro(Consistency,int);
|
||
|
vtkGetMacro(Consistency,int);
|
||
|
vtkBooleanMacro(Consistency,int);
|
||
|
|
||
|
// Description:
|
||
|
// 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, int);
|
||
|
vtkGetMacro(AutoOrientNormals, int);
|
||
|
vtkBooleanMacro(AutoOrientNormals, int);
|
||
|
|
||
|
// Description:
|
||
|
// Turn on/off the computation of point normals.
|
||
|
vtkSetMacro(ComputePointNormals,int);
|
||
|
vtkGetMacro(ComputePointNormals,int);
|
||
|
vtkBooleanMacro(ComputePointNormals,int);
|
||
|
|
||
|
// Description:
|
||
|
// Turn on/off the computation of cell normals.
|
||
|
vtkSetMacro(ComputeCellNormals,int);
|
||
|
vtkGetMacro(ComputeCellNormals,int);
|
||
|
vtkBooleanMacro(ComputeCellNormals,int);
|
||
|
|
||
|
// Description:
|
||
|
// 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,int);
|
||
|
vtkGetMacro(FlipNormals,int);
|
||
|
vtkBooleanMacro(FlipNormals,int);
|
||
|
|
||
|
// Description:
|
||
|
// 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,int);
|
||
|
vtkGetMacro(NonManifoldTraversal,int);
|
||
|
vtkBooleanMacro(NonManifoldTraversal,int);
|
||
|
|
||
|
protected:
|
||
|
vtkPolyDataNormals();
|
||
|
~vtkPolyDataNormals() {};
|
||
|
|
||
|
// Usual data generation method
|
||
|
int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *);
|
||
|
|
||
|
double FeatureAngle;
|
||
|
int Splitting;
|
||
|
int Consistency;
|
||
|
int FlipNormals;
|
||
|
int AutoOrientNormals;
|
||
|
int NonManifoldTraversal;
|
||
|
int ComputePointNormals;
|
||
|
int ComputeCellNormals;
|
||
|
int NumFlips;
|
||
|
|
||
|
private:
|
||
|
vtkIdList *Wave;
|
||
|
vtkIdList *Wave2;
|
||
|
vtkIdList *CellIds;
|
||
|
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:
|
||
|
vtkPolyDataNormals(const vtkPolyDataNormals&); // Not implemented.
|
||
|
void operator=(const vtkPolyDataNormals&); // Not implemented.
|
||
|
};
|
||
|
|
||
|
#endif
|