Blender  V3.3
Silhouette.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
8 #include "Silhouette.h"
9 #include "ViewMap.h"
10 
11 namespace Freestyle {
12 
13 /**********************************/
14 /* */
15 /* */
16 /* SVertex */
17 /* */
18 /* */
19 /**********************************/
20 
22 {
24  if (_pViewVertex) {
25  nature |= _pViewVertex->getNature();
26  }
27  return nature;
28 }
29 
31 {
32  return this;
33 }
34 
36 {
37  return _pViewVertex;
38 }
39 
41 {
42  return dynamic_cast<NonTVertex *>(_pViewVertex);
43 }
44 
46 {
47  return dynamic_cast<TVertex *>(_pViewVertex);
48 }
49 
51 {
52  return shape()->importance();
53 }
54 
55 #if 0
57 {
58  return _Shape->material();
59 }
60 #endif
61 
63 {
64  return _Shape->getId();
65 }
66 
67 const SShape *SVertex::shape() const
68 {
69  return _Shape;
70 }
71 
72 int SVertex::qi() const
73 {
74  if (getNature() & Nature::T_VERTEX) {
76  }
77  return (_FEdges[0])->qi();
78 }
79 
80 occluder_container::const_iterator SVertex::occluders_begin() const
81 {
82  if (getNature() & Nature::T_VERTEX) {
84  }
85  return (_FEdges[0])->occluders_begin();
86 }
87 
88 occluder_container::const_iterator SVertex::occluders_end() const
89 {
90  if (getNature() & Nature::T_VERTEX) {
92  }
93  return (_FEdges[0])->occluders_end();
94 }
95 
97 {
98  if (getNature() & Nature::T_VERTEX) {
100  }
101  return (_FEdges[0])->occluders_empty();
102 }
103 
105 {
106  if (getNature() & Nature::T_VERTEX) {
108  }
109  return (_FEdges[0])->occluders_size();
110 }
111 
113 {
114  if (getNature() & Nature::T_VERTEX) {
116  }
117  return (_FEdges[0])->occludee();
118 }
119 
121 {
122  if (getNature() & Nature::T_VERTEX) {
124  }
125  return (_FEdges[0])->occluded_shape();
126 }
127 
129 {
130  if (getNature() & Nature::T_VERTEX) {
132  }
133  return (_FEdges[0])->occludee_empty();
134 }
135 
137 {
138  if (getNature() & Nature::T_VERTEX) {
140  }
141  return (_FEdges[0])->z_discontinuity();
142 }
143 
145 {
146  if (getNature() & Nature::T_VERTEX) {
147  return nullptr;
148  }
149  return _FEdges[0];
150 }
151 
153 {
154  FEdge *result = nullptr;
155  SVertex *iVertexB = dynamic_cast<SVertex *>(&inter);
156  if (!iVertexB) {
157  return result;
158  }
159  vector<FEdge *>::const_iterator fe = _FEdges.begin(), feend = _FEdges.end();
160  for (; fe != feend; ++fe) {
161  if ((((*fe)->vertexA() == this) && ((*fe)->vertexB() == iVertexB)) ||
162  (((*fe)->vertexB() == this) && ((*fe)->vertexA() == iVertexB))) {
163  result = (*fe);
164  }
165  }
166  if ((result == nullptr) && (getNature() & Nature::T_VERTEX)) {
167  SVertex *brother;
168  ViewVertex *vvertex = viewvertex();
169  TVertex *tvertex = dynamic_cast<TVertex *>(vvertex);
170  if (tvertex) {
171  brother = tvertex->frontSVertex();
172  if (this == brother) {
173  brother = tvertex->backSVertex();
174  }
175  const vector<FEdge *> &fedges = brother->fedges();
176  for (fe = fedges.begin(), feend = fedges.end(); fe != feend; ++fe) {
177  if ((((*fe)->vertexA() == brother) && ((*fe)->vertexB() == iVertexB)) ||
178  (((*fe)->vertexB() == brother) && ((*fe)->vertexA() == iVertexB))) {
179  result = (*fe);
180  }
181  }
182  }
183  }
184  if ((result == nullptr) && (iVertexB->getNature() & Nature::T_VERTEX)) {
185  SVertex *brother;
186  ViewVertex *vvertex = iVertexB->viewvertex();
187  TVertex *tvertex = dynamic_cast<TVertex *>(vvertex);
188  if (tvertex) {
189  brother = tvertex->frontSVertex();
190  if (iVertexB == brother) {
191  brother = tvertex->backSVertex();
192  }
193  for (fe = _FEdges.begin(), feend = _FEdges.end(); fe != feend; ++fe) {
194  if ((((*fe)->vertexA() == this) && ((*fe)->vertexB() == brother)) ||
195  (((*fe)->vertexB() == this) && ((*fe)->vertexA() == brother))) {
196  result = (*fe);
197  }
198  }
199  }
200  }
201 
202  return result;
203 }
204 
205 /**********************************/
206 /* */
207 /* */
208 /* FEdge */
209 /* */
210 /* */
211 /**********************************/
212 
214 {
215  return _ViewEdge->getNature();
216 }
217 
218 #if 0
219 float FEdge::viewedge_length() const
220 {
221  return _ViewEdge->viewedge_length();
222 }
223 #endif
224 
226 {
227  ViewShape *aShape = _ViewEdge->aShape();
228  if (aShape == nullptr) {
229  return nullptr;
230  }
231  return aShape->sshape();
232 }
233 
235 {
236  return _VertexA->shape()->importance();
237 }
238 
240 {
241  return _ViewEdge->qi();
242 }
243 
244 occluder_container::const_iterator FEdge::occluders_begin() const
245 {
246  return _ViewEdge->occluders_begin();
247 }
248 
249 occluder_container::const_iterator FEdge::occluders_end() const
250 {
251  return _ViewEdge->occluders_end();
252 }
253 
255 {
256  return _ViewEdge->occluders_empty();
257 }
258 
260 {
261  return _ViewEdge->occluders_size();
262 }
263 
265 {
266  return _ViewEdge->occludee_empty();
267 }
268 
270 {
271  return _VertexA->shape()->getId();
272 }
273 
274 const SShape *FEdge::shape() const
275 {
276  return _VertexA->shape();
277 }
278 
280 {
281  if (!(getNature() & Nature::SILHOUETTE) && !(getNature() & Nature::BORDER)) {
282  return 0;
283  }
284 
286 
287  Vec3r bbox_size_vec(box.getMax() - box.getMin());
288  real bboxsize = bbox_size_vec.norm();
289  if (occludee_empty()) {
290  // return FLT_MAX;
291  return 1.0;
292  // return bboxsize;
293  }
294 
295 #if 0
296  real result;
297  z_discontinuity_functor<SVertex> _functor;
298  Evaluate<SVertex, z_discontinuity_functor<SVertex>>(&_functor, iCombination, result);
299 #endif
300  Vec3r middle((_VertexB->point3d() - _VertexA->point3d()));
301  middle /= 2;
302  Vec3r disc_vec(middle - _occludeeIntersection);
303  real res = disc_vec.norm() / bboxsize;
304 
305  return res;
306  // return fabs((middle.z() - _occludeeIntersection.z()));
307 }
308 
309 #if 0
310 float FEdge::local_average_depth(int iCombination) const
311 {
312  float result;
313  local_average_depth_functor<SVertex> functor;
314  Evaluate(&functor, iCombination, result);
315 
316  return result;
317 }
318 
319 float FEdge::local_depth_variance(int iCombination) const
320 {
321  float result;
322 
323  local_depth_variance_functor<SVertex> functor;
324 
325  Evaluate(&functor, iCombination, result);
326 
327  return result;
328 }
329 
330 real FEdge::local_average_density(float sigma, int iCombination) const
331 {
332  float result;
333 
334  density_functor<SVertex> functor(sigma);
335 
336  Evaluate(&functor, iCombination, result);
337 
338  return result;
339 }
340 
341 Vec3r FEdge::normal(int &oException /* = Exception::NO_EXCEPTION */)
342 {
343  Vec3r Na = _VertexA->normal(oException);
344  if (oException != Exception::NO_EXCEPTION) {
345  return Na;
346  }
347  Vec3r Nb = _VertexB->normal(oException);
348  if (oException != Exception::NO_EXCEPTION) {
349  return Nb;
350  }
351  return (Na + Nb) / 2.0;
352 }
353 
354 Vec3r FEdge::curvature2d_as_vector(int iCombination) const
355 {
356  Vec3r result;
357  curvature2d_as_vector_functor<SVertex> _functor;
358  Evaluate<Vec3r, curvature2d_as_vector_functor<SVertex>>(&_functor, iCombination, result);
359  return result;
360 }
361 
362 real FEdge::curvature2d_as_angle(int iCombination) const
363 {
364  real result;
365  curvature2d_as_angle_functor<SVertex> _functor;
366  Evaluate<real, curvature2d_as_angle_functor<SVertex>>(&_functor, iCombination, result);
367  return result;
368 }
369 #endif
370 
371 /**********************************/
372 /* */
373 /* */
374 /* FEdgeSharp */
375 /* */
376 /* */
377 /**********************************/
378 
379 #if 0
381 {
382  return _VertexA->shape()->material();
383 }
384 #endif
385 
387 {
389 }
390 
392 {
394 }
395 
396 /**********************************/
397 /* */
398 /* */
399 /* FEdgeSmooth */
400 /* */
401 /* */
402 /**********************************/
403 
405 {
407 }
408 
409 } /* namespace Freestyle */
Classes to define a silhouette structure.
Classes to define a View Map (ViewVertex, ViewEdge, etc.)
const Point & getMax() const
Definition: BBox.h:72
const Point & getMin() const
Definition: BBox.h:67
static int raiseException(exception_type exception=UNDEFINED)
Definition: Exception.h:30
const FrsMaterial & aFrsMaterial() const
Definition: Silhouette.cpp:386
unsigned _aFrsMaterialIndex
Definition: Silhouette.h:1136
const FrsMaterial & bFrsMaterial() const
Definition: Silhouette.cpp:391
unsigned _bFrsMaterialIndex
Definition: Silhouette.h:1137
const FrsMaterial & frs_material() const
Definition: Silhouette.cpp:404
bool occluders_empty() const
Definition: Silhouette.cpp:254
int occluders_size() const
Definition: Silhouette.cpp:259
occluder_container::const_iterator occluders_end() const
Definition: Silhouette.cpp:249
SVertex * _VertexB
Definition: Silhouette.h:500
ViewEdge * _ViewEdge
Definition: Silhouette.h:507
occluder_container::const_iterator occluders_begin() const
Definition: Silhouette.cpp:244
SVertex * _VertexA
Definition: Silhouette.h:499
Id shape_id() const
Definition: Silhouette.cpp:269
const SShape * occluded_shape() const
Definition: Silhouette.cpp:225
int viewedge_nature() const
Definition: Silhouette.cpp:213
SShape * shape()
Definition: Silhouette.h:636
Vec3r _occludeeIntersection
Definition: Silhouette.h:512
int invisibility() const
Definition: Silhouette.cpp:239
float shape_importance() const
Definition: Silhouette.cpp:234
Nature::EdgeNature getNature() const
Definition: Silhouette.h:615
real z_discontinuity() const
Definition: Silhouette.cpp:279
bool occludee_empty() const
Definition: Silhouette.cpp:264
float importance() const
Definition: Silhouette.h:1882
const FrsMaterial & frs_material(unsigned i) const
Definition: Silhouette.h:1866
Id getId() const
Definition: Silhouette.h:1888
const vector< FEdge * > & fedges()
Definition: Silhouette.h:248
ViewVertex * viewvertex()
Definition: Silhouette.h:276
SShape * shape()
Definition: Silhouette.h:263
const SShape * occluded_shape() const
Definition: Silhouette.cpp:120
virtual FEdge * getFEdge(Interface0D &)
Definition: Silhouette.cpp:152
int qi() const
Definition: Silhouette.cpp:72
Vec3r normal() const
Definition: Silhouette.h:405
virtual ViewVertex * castToViewVertex()
Definition: Silhouette.cpp:35
real z_discontinuity() const
Definition: Silhouette.cpp:136
occluder_container::const_iterator occluders_begin() const
Definition: Silhouette.cpp:80
bool occluders_empty() const
Definition: Silhouette.cpp:96
Id shape_id() const
Definition: Silhouette.cpp:62
virtual NonTVertex * castToNonTVertex()
Definition: Silhouette.cpp:40
virtual SVertex * castToSVertex()
Definition: Silhouette.cpp:30
occluder_container::const_iterator occluders_end() const
Definition: Silhouette.cpp:88
virtual TVertex * castToTVertex()
Definition: Silhouette.cpp:45
virtual Nature::VertexNature getNature() const
Definition: Silhouette.cpp:21
int occluders_size() const
Definition: Silhouette.cpp:104
const Polygon3r & occludee() const
Definition: Silhouette.cpp:112
const Vec3r & point3d() const
Definition: Silhouette.h:400
bool occludee_empty() const
Definition: Silhouette.cpp:128
float shape_importance() const
Definition: Silhouette.cpp:50
SVertex * frontSVertex()
Definition: ViewMap.h:522
SVertex * backSVertex()
Definition: ViewMap.h:528
value_type norm() const
Definition: VecMat.h:95
int qi() const
Definition: ViewMap.h:1282
virtual Nature::EdgeNature getNature() const
Definition: ViewMap.h:914
occluder_container::const_iterator occluders_begin() const
Definition: ViewMap.h:1287
const bool occludee_empty() const
Definition: ViewMap.h:1314
bool occluders_empty() const
Definition: ViewMap.h:1302
int occluders_size() const
Definition: ViewMap.h:1297
ViewShape * aShape()
Definition: ViewMap.h:1099
occluder_container::const_iterator occluders_end() const
Definition: ViewMap.h:1292
BBox< Vec3r > getScene3dBBox() const
Definition: ViewMap.h:150
static ViewMap * getInstance()
Definition: ViewMap.h:91
SShape * sshape()
Definition: ViewMap.h:1539
virtual Nature::VertexNature getNature() const
Definition: ViewMap.h:317
Material material
IconTextureDrawCall normal
VecMat::Vec3< real > Vec3r
Definition: Geom.h:28
static const EdgeNature BORDER
Definition: Nature.h:38
static const VertexNature S_VERTEX
Definition: Nature.h:22
unsigned short VertexNature
Definition: Nature.h:18
static const VertexNature T_VERTEX
Definition: Nature.h:28
static const EdgeNature SILHOUETTE
Definition: Nature.h:36
inherits from class Rep
Definition: AppCanvas.cpp:18
double real
Definition: Precision.h:12