Blender  V2.93
Silhouette.cpp
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  */
16 
22 #include "Silhouette.h"
23 #include "ViewMap.h"
24 
25 namespace Freestyle {
26 
27 /**********************************/
28 /* */
29 /* */
30 /* SVertex */
31 /* */
32 /* */
33 /**********************************/
34 
36 {
38  if (_pViewVertex) {
39  nature |= _pViewVertex->getNature();
40  }
41  return nature;
42 }
43 
45 {
46  return this;
47 }
48 
50 {
51  return _pViewVertex;
52 }
53 
55 {
56  return dynamic_cast<NonTVertex *>(_pViewVertex);
57 }
58 
60 {
61  return dynamic_cast<TVertex *>(_pViewVertex);
62 }
63 
65 {
66  return shape()->importance();
67 }
68 
69 #if 0
71 {
72  return _Shape->material();
73 }
74 #endif
75 
77 {
78  return _Shape->getId();
79 }
80 
81 const SShape *SVertex::shape() const
82 {
83  return _Shape;
84 }
85 
86 int SVertex::qi() const
87 {
88  if (getNature() & Nature::T_VERTEX) {
90  }
91  return (_FEdges[0])->qi();
92 }
93 
94 occluder_container::const_iterator SVertex::occluders_begin() const
95 {
96  if (getNature() & Nature::T_VERTEX) {
98  }
99  return (_FEdges[0])->occluders_begin();
100 }
101 
102 occluder_container::const_iterator SVertex::occluders_end() const
103 {
104  if (getNature() & Nature::T_VERTEX) {
106  }
107  return (_FEdges[0])->occluders_end();
108 }
109 
111 {
112  if (getNature() & Nature::T_VERTEX) {
114  }
115  return (_FEdges[0])->occluders_empty();
116 }
117 
119 {
120  if (getNature() & Nature::T_VERTEX) {
122  }
123  return (_FEdges[0])->occluders_size();
124 }
125 
127 {
128  if (getNature() & Nature::T_VERTEX) {
130  }
131  return (_FEdges[0])->occludee();
132 }
133 
135 {
136  if (getNature() & Nature::T_VERTEX) {
138  }
139  return (_FEdges[0])->occluded_shape();
140 }
141 
143 {
144  if (getNature() & Nature::T_VERTEX) {
146  }
147  return (_FEdges[0])->occludee_empty();
148 }
149 
151 {
152  if (getNature() & Nature::T_VERTEX) {
154  }
155  return (_FEdges[0])->z_discontinuity();
156 }
157 
159 {
160  if (getNature() & Nature::T_VERTEX) {
161  return nullptr;
162  }
163  return _FEdges[0];
164 }
165 
167 {
168  FEdge *result = nullptr;
169  SVertex *iVertexB = dynamic_cast<SVertex *>(&inter);
170  if (!iVertexB) {
171  return result;
172  }
173  vector<FEdge *>::const_iterator fe = _FEdges.begin(), feend = _FEdges.end();
174  for (; fe != feend; ++fe) {
175  if ((((*fe)->vertexA() == this) && ((*fe)->vertexB() == iVertexB)) ||
176  (((*fe)->vertexB() == this) && ((*fe)->vertexA() == iVertexB))) {
177  result = (*fe);
178  }
179  }
180  if ((result == nullptr) && (getNature() & Nature::T_VERTEX)) {
181  SVertex *brother;
182  ViewVertex *vvertex = viewvertex();
183  TVertex *tvertex = dynamic_cast<TVertex *>(vvertex);
184  if (tvertex) {
185  brother = tvertex->frontSVertex();
186  if (this == brother) {
187  brother = tvertex->backSVertex();
188  }
189  const vector<FEdge *> &fedges = brother->fedges();
190  for (fe = fedges.begin(), feend = fedges.end(); fe != feend; ++fe) {
191  if ((((*fe)->vertexA() == brother) && ((*fe)->vertexB() == iVertexB)) ||
192  (((*fe)->vertexB() == brother) && ((*fe)->vertexA() == iVertexB))) {
193  result = (*fe);
194  }
195  }
196  }
197  }
198  if ((result == nullptr) && (iVertexB->getNature() & Nature::T_VERTEX)) {
199  SVertex *brother;
200  ViewVertex *vvertex = iVertexB->viewvertex();
201  TVertex *tvertex = dynamic_cast<TVertex *>(vvertex);
202  if (tvertex) {
203  brother = tvertex->frontSVertex();
204  if (iVertexB == brother) {
205  brother = tvertex->backSVertex();
206  }
207  for (fe = _FEdges.begin(), feend = _FEdges.end(); fe != feend; ++fe) {
208  if ((((*fe)->vertexA() == this) && ((*fe)->vertexB() == brother)) ||
209  (((*fe)->vertexB() == this) && ((*fe)->vertexA() == brother))) {
210  result = (*fe);
211  }
212  }
213  }
214  }
215 
216  return result;
217 }
218 
219 /**********************************/
220 /* */
221 /* */
222 /* FEdge */
223 /* */
224 /* */
225 /**********************************/
226 
228 {
229  return _ViewEdge->getNature();
230 }
231 
232 #if 0
233 float FEdge::viewedge_length() const
234 {
235  return _ViewEdge->viewedge_length();
236 }
237 #endif
238 
240 {
241  ViewShape *aShape = _ViewEdge->aShape();
242  if (aShape == nullptr) {
243  return nullptr;
244  }
245  return aShape->sshape();
246 }
247 
249 {
250  return _VertexA->shape()->importance();
251 }
252 
254 {
255  return _ViewEdge->qi();
256 }
257 
258 occluder_container::const_iterator FEdge::occluders_begin() const
259 {
260  return _ViewEdge->occluders_begin();
261 }
262 
263 occluder_container::const_iterator FEdge::occluders_end() const
264 {
265  return _ViewEdge->occluders_end();
266 }
267 
269 {
270  return _ViewEdge->occluders_empty();
271 }
272 
274 {
275  return _ViewEdge->occluders_size();
276 }
277 
279 {
280  return _ViewEdge->occludee_empty();
281 }
282 
284 {
285  return _VertexA->shape()->getId();
286 }
287 
288 const SShape *FEdge::shape() const
289 {
290  return _VertexA->shape();
291 }
292 
294 {
295  if (!(getNature() & Nature::SILHOUETTE) && !(getNature() & Nature::BORDER)) {
296  return 0;
297  }
298 
300 
301  Vec3r bbox_size_vec(box.getMax() - box.getMin());
302  real bboxsize = bbox_size_vec.norm();
303  if (occludee_empty()) {
304  // return FLT_MAX;
305  return 1.0;
306  // return bboxsize;
307  }
308 
309 #if 0
310  real result;
311  z_discontinuity_functor<SVertex> _functor;
312  Evaluate<SVertex, z_discontinuity_functor<SVertex>>(&_functor, iCombination, result);
313 #endif
314  Vec3r middle((_VertexB->point3d() - _VertexA->point3d()));
315  middle /= 2;
316  Vec3r disc_vec(middle - _occludeeIntersection);
317  real res = disc_vec.norm() / bboxsize;
318 
319  return res;
320  // return fabs((middle.z() - _occludeeIntersection.z()));
321 }
322 
323 #if 0
324 float FEdge::local_average_depth(int iCombination) const
325 {
326  float result;
327  local_average_depth_functor<SVertex> functor;
328  Evaluate(&functor, iCombination, result);
329 
330  return result;
331 }
332 
333 float FEdge::local_depth_variance(int iCombination) const
334 {
335  float result;
336 
337  local_depth_variance_functor<SVertex> functor;
338 
339  Evaluate(&functor, iCombination, result);
340 
341  return result;
342 }
343 
344 real FEdge::local_average_density(float sigma, int iCombination) const
345 {
346  float result;
347 
348  density_functor<SVertex> functor(sigma);
349 
350  Evaluate(&functor, iCombination, result);
351 
352  return result;
353 }
354 
355 Vec3r FEdge::normal(int &oException /* = Exception::NO_EXCEPTION */)
356 {
357  Vec3r Na = _VertexA->normal(oException);
358  if (oException != Exception::NO_EXCEPTION) {
359  return Na;
360  }
361  Vec3r Nb = _VertexB->normal(oException);
362  if (oException != Exception::NO_EXCEPTION) {
363  return Nb;
364  }
365  return (Na + Nb) / 2.0;
366 }
367 
368 Vec3r FEdge::curvature2d_as_vector(int iCombination) const
369 {
370  Vec3r result;
371  curvature2d_as_vector_functor<SVertex> _functor;
372  Evaluate<Vec3r, curvature2d_as_vector_functor<SVertex>>(&_functor, iCombination, result);
373  return result;
374 }
375 
376 real FEdge::curvature2d_as_angle(int iCombination) const
377 {
378  real result;
379  curvature2d_as_angle_functor<SVertex> _functor;
380  Evaluate<real, curvature2d_as_angle_functor<SVertex>>(&_functor, iCombination, result);
381  return result;
382 }
383 #endif
384 
385 /**********************************/
386 /* */
387 /* */
388 /* FEdgeSharp */
389 /* */
390 /* */
391 /**********************************/
392 
393 #if 0
395 {
396  return _VertexA->shape()->material();
397 }
398 #endif
399 
401 {
403 }
404 
406 {
408 }
409 
410 /**********************************/
411 /* */
412 /* */
413 /* FEdgeSmooth */
414 /* */
415 /* */
416 /**********************************/
417 
419 {
421 }
422 
423 } /* namespace Freestyle */
Classes to define a silhouette structure.
Classes to define a View Map (ViewVertex, ViewEdge, etc.)
const Point & getMax() const
Definition: BBox.h:86
const Point & getMin() const
Definition: BBox.h:81
static int raiseException(exception_type exception=UNDEFINED)
Definition: Exception.h:44
const FrsMaterial & aFrsMaterial() const
Definition: Silhouette.cpp:400
unsigned _aFrsMaterialIndex
Definition: Silhouette.h:1150
const FrsMaterial & bFrsMaterial() const
Definition: Silhouette.cpp:405
unsigned _bFrsMaterialIndex
Definition: Silhouette.h:1151
const FrsMaterial & frs_material() const
Definition: Silhouette.cpp:418
bool occluders_empty() const
Definition: Silhouette.cpp:268
int occluders_size() const
Definition: Silhouette.cpp:273
occluder_container::const_iterator occluders_end() const
Definition: Silhouette.cpp:263
SVertex * _VertexB
Definition: Silhouette.h:514
ViewEdge * _ViewEdge
Definition: Silhouette.h:521
occluder_container::const_iterator occluders_begin() const
Definition: Silhouette.cpp:258
SVertex * _VertexA
Definition: Silhouette.h:513
Id shape_id() const
Definition: Silhouette.cpp:283
const SShape * occluded_shape() const
Definition: Silhouette.cpp:239
int viewedge_nature() const
Definition: Silhouette.cpp:227
SShape * shape()
Definition: Silhouette.h:650
Vec3r _occludeeIntersection
Definition: Silhouette.h:526
int invisibility() const
Definition: Silhouette.cpp:253
float shape_importance() const
Definition: Silhouette.cpp:248
Nature::EdgeNature getNature() const
Definition: Silhouette.h:629
real z_discontinuity() const
Definition: Silhouette.cpp:293
bool occludee_empty() const
Definition: Silhouette.cpp:278
float importance() const
Definition: Silhouette.h:1896
const FrsMaterial & frs_material(unsigned i) const
Definition: Silhouette.h:1880
Id getId() const
Definition: Silhouette.h:1902
const vector< FEdge * > & fedges()
Definition: Silhouette.h:262
ViewVertex * viewvertex()
Definition: Silhouette.h:290
SShape * shape()
Definition: Silhouette.h:277
const SShape * occluded_shape() const
Definition: Silhouette.cpp:134
virtual FEdge * getFEdge(Interface0D &)
Definition: Silhouette.cpp:166
int qi() const
Definition: Silhouette.cpp:86
Vec3r normal() const
Definition: Silhouette.h:419
virtual ViewVertex * castToViewVertex()
Definition: Silhouette.cpp:49
real z_discontinuity() const
Definition: Silhouette.cpp:150
occluder_container::const_iterator occluders_begin() const
Definition: Silhouette.cpp:94
bool occluders_empty() const
Definition: Silhouette.cpp:110
Id shape_id() const
Definition: Silhouette.cpp:76
virtual NonTVertex * castToNonTVertex()
Definition: Silhouette.cpp:54
virtual SVertex * castToSVertex()
Definition: Silhouette.cpp:44
occluder_container::const_iterator occluders_end() const
Definition: Silhouette.cpp:102
virtual TVertex * castToTVertex()
Definition: Silhouette.cpp:59
virtual Nature::VertexNature getNature() const
Definition: Silhouette.cpp:35
int occluders_size() const
Definition: Silhouette.cpp:118
const Polygon3r & occludee() const
Definition: Silhouette.cpp:126
const Vec3r & point3d() const
Definition: Silhouette.h:414
bool occludee_empty() const
Definition: Silhouette.cpp:142
float shape_importance() const
Definition: Silhouette.cpp:64
SVertex * frontSVertex()
Definition: ViewMap.h:532
SVertex * backSVertex()
Definition: ViewMap.h:538
value_type norm() const
Definition: VecMat.h:109
int qi() const
Definition: ViewMap.h:1292
virtual Nature::EdgeNature getNature() const
Definition: ViewMap.h:924
occluder_container::const_iterator occluders_begin() const
Definition: ViewMap.h:1297
const bool occludee_empty() const
Definition: ViewMap.h:1324
bool occluders_empty() const
Definition: ViewMap.h:1312
int occluders_size() const
Definition: ViewMap.h:1307
ViewShape * aShape()
Definition: ViewMap.h:1109
occluder_container::const_iterator occluders_end() const
Definition: ViewMap.h:1302
BBox< Vec3r > getScene3dBBox() const
Definition: ViewMap.h:164
static ViewMap * getInstance()
Definition: ViewMap.h:105
SShape * sshape()
Definition: ViewMap.h:1549
virtual Nature::VertexNature getNature() const
Definition: ViewMap.h:331
Material material
IconTextureDrawCall normal
VecMat::Vec3< real > Vec3r
Definition: Geom.h:42
static const EdgeNature BORDER
Definition: Nature.h:52
static const VertexNature S_VERTEX
Definition: Nature.h:36
unsigned short VertexNature
Definition: Nature.h:32
static const VertexNature T_VERTEX
Definition: Nature.h:42
static const EdgeNature SILHOUETTE
Definition: Nature.h:50
inherits from class Rep
Definition: AppCanvas.cpp:32
double real
Definition: Precision.h:26