Blender  V3.3
FEdgeXDetector.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
3 #pragma once
4 
10 #include <vector>
11 
12 #include "../geometry/Geom.h"
13 
14 #include "../system/FreestyleConfig.h"
15 #include "../system/ProgressBar.h"
16 #include "../system/RenderMonitor.h"
17 
18 #include "../winged_edge/Curvature.h"
19 #include "../winged_edge/WXEdge.h"
20 
21 #include "BLI_math.h"
22 
23 #ifdef WITH_CXX_GUARDEDALLOC
24 # include "MEM_guardedalloc.h"
25 #endif
26 
27 namespace Freestyle {
28 
29 using namespace Geometry;
30 
33  public:
35  {
36  _pProgressBar = NULL;
37  _pRenderMonitor = NULL;
38  _computeViewIndependent = true;
39 #if 0
40  _bbox_diagonal = 1.0;
41 #endif
42  _meanEdgeSize = 0;
43  _computeRidgesAndValleys = true;
44  _computeSuggestiveContours = true;
45  _computeMaterialBoundaries = true;
46  _sphereRadius = 1.0;
47  _orthographicProjection = false;
48  _faceSmoothness = false;
49  _changes = false;
50  _kr_derivative_epsilon = 0.0;
51  _creaseAngle = 0.7; // angle of 134.43 degrees
52  }
53 
54  virtual ~FEdgeXDetector()
55  {
56  }
57 
59  virtual void processShapes(WingedEdge &);
60 
61  // GENERAL STUFF
62  virtual void preProcessShape(WXShape *iWShape);
63  virtual void preProcessFace(WXFace *iFace);
64  virtual void computeCurvatures(WXVertex *iVertex);
65 
66  // SILHOUETTE
67  virtual void processSilhouetteShape(WXShape *iWShape);
68  virtual void ProcessSilhouetteFace(WXFace *iFace);
69  virtual void ProcessSilhouetteEdge(WXEdge *iEdge);
70 
71  // CREASE
72  virtual void processCreaseShape(WXShape *iWShape);
73  virtual void ProcessCreaseEdge(WXEdge *iEdge);
74 
81  // XXX angle should be in radian...
82  inline void setCreaseAngle(float angle)
83  {
84  if (angle < 0.0) {
85  angle = 0.0;
86  }
87  else if (angle > 180.0) {
88  angle = 180.0;
89  }
90  angle = cos(M_PI * (180.0 - angle) / 180.0);
91  if (angle != _creaseAngle) {
92  _creaseAngle = angle;
93  _changes = true;
94  }
95  }
96 
97  // BORDER
98  virtual void processBorderShape(WXShape *iWShape);
99  virtual void ProcessBorderEdge(WXEdge *iEdge);
100 
101  // RIDGES AND VALLEYS
102  virtual void processRidgesAndValleysShape(WXShape *iWShape);
103  virtual void ProcessRidgeFace(WXFace *iFace);
104 
105  // SUGGESTIVE CONTOURS
106  virtual void processSuggestiveContourShape(WXShape *iWShape);
107  virtual void ProcessSuggestiveContourFace(WXFace *iFace);
108  virtual void postProcessSuggestiveContourShape(WXShape *iShape);
109  virtual void postProcessSuggestiveContourFace(WXFace *iFace);
115  {
116  if (dkr != _kr_derivative_epsilon) {
117  _kr_derivative_epsilon = dkr;
118  _changes = true;
119  }
120  }
121 
122  // MATERIAL BOUNDARY
123  virtual void processMaterialBoundaryShape(WXShape *iWShape);
124  virtual void ProcessMaterialBoundaryEdge(WXEdge *iEdge);
125 
126  // EDGE MARKS
127  virtual void processEdgeMarksShape(WXShape *iShape);
128  virtual void ProcessEdgeMarks(WXEdge *iEdge);
129 
130  // EVERYBODY
131  virtual void buildSmoothEdges(WXShape *iShape);
132 
134  inline void setViewpoint(const Vec3f &ivp)
135  {
136  _Viewpoint = ivp;
137  }
138 
139  inline void enableOrthographicProjection(bool b)
140  {
141  _orthographicProjection = b;
142  }
143 
144  inline void enableRidgesAndValleysFlag(bool b)
145  {
146  _computeRidgesAndValleys = b;
147  }
148 
149  inline void enableSuggestiveContours(bool b)
150  {
151  _computeSuggestiveContours = b;
152  }
153 
154  inline void enableMaterialBoundaries(bool b)
155  {
156  _computeMaterialBoundaries = b;
157  }
158 
159  inline void enableFaceSmoothness(bool b)
160  {
161  if (b != _faceSmoothness) {
162  _faceSmoothness = b;
163  _changes = true;
164  }
165  }
166 
167  inline void enableFaceMarks(bool b)
168  {
169  if (b != _faceMarks) {
170  _faceMarks = b;
171  _changes = true;
172  }
173  }
174 
179  inline void setSphereRadius(float r)
180  {
181  if (r != _sphereRadius) {
182  _sphereRadius = r;
183  _changes = true;
184  }
185  }
186 
187  inline void setProgressBar(ProgressBar *iProgressBar)
188  {
189  _pProgressBar = iProgressBar;
190  }
191 
192  inline void setRenderMonitor(RenderMonitor *iRenderMonitor)
193  {
194  _pRenderMonitor = iRenderMonitor;
195  }
196 
197  protected:
199 #if 0
200  real _bbox_diagonal; // diagonal of the current processed shape bbox
201 #endif
202  // oldtmp values
210  unsigned _nPoints;
213 
219  float _sphereRadius; // expressed as a ratio of the mean edge size
220  float _creaseAngle; // [-1, 1] compared with the inner product of face normals
221  bool _changes;
222 
224 
227 
228 #ifdef WITH_CXX_GUARDEDALLOC
229  MEM_CXX_CLASS_ALLOC_FUNCS("Freestyle:FEdgeXDetector")
230 #endif
231 };
232 
233 } /* namespace Freestyle */
#define M_PI
Definition: BLI_math_base.h:20
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble w _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat w _GL_VOID_RET _GL_VOID GLint GLint GLint w _GL_VOID_RET _GL_VOID GLshort GLshort GLshort w _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble y2 _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat y2 _GL_VOID_RET _GL_VOID GLint GLint GLint y2 _GL_VOID_RET _GL_VOID GLshort GLshort GLshort y2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLuint *buffer _GL_VOID_RET _GL_VOID GLdouble t _GL_VOID_RET _GL_VOID GLfloat t _GL_VOID_RET _GL_VOID GLint t _GL_VOID_RET _GL_VOID GLshort t _GL_VOID_RET _GL_VOID GLdouble GLdouble r _GL_VOID_RET _GL_VOID GLfloat GLfloat r _GL_VOID_RET _GL_VOID GLint GLint r _GL_VOID_RET _GL_VOID GLshort GLshort r _GL_VOID_RET _GL_VOID GLdouble GLdouble r
Read Guarded memory(de)allocation.
SIMD_FORCE_INLINE btScalar angle(const btVector3 &v) const
Return the angle between this and another vector.
Definition: btVector3.h:356
void enableMaterialBoundaries(bool b)
void enableSuggestiveContours(bool b)
void setSuggestiveContourKrDerivativeEpsilon(float dkr)
void setCreaseAngle(float angle)
void setProgressBar(ProgressBar *iProgressBar)
RenderMonitor * _pRenderMonitor
void enableFaceSmoothness(bool b)
void enableOrthographicProjection(bool b)
void setViewpoint(const Vec3f &ivp)
void setRenderMonitor(RenderMonitor *iRenderMonitor)
void enableRidgesAndValleysFlag(bool b)
inherits from class Rep
Definition: AppCanvas.cpp:18
double real
Definition: Precision.h:12
INLINE Rall1d< T, V, S > cos(const Rall1d< T, V, S > &arg)
Definition: rall1d.h:319
static const pxr::TfToken b("b", pxr::TfToken::Immortal)