Blender  V3.3
Functions0D.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
8 #include "Functions0D.h"
9 #include "ViewMap.h"
10 
11 #include "BKE_global.h"
12 
13 using namespace std;
14 
15 namespace Freestyle::Functions0D {
16 
17 // Internal function
19 {
20  return it1.getFEdge(it2);
21 }
22 
23 void getFEdges(Interface0DIterator &it, FEdge *&fe1, FEdge *&fe2)
24 {
25  // count number of vertices
26  Interface0DIterator prev = it, next = it;
27  ++next;
28  int count = 1;
29  if (!it.isBegin() && !next.isEnd()) {
30  count = 3;
31  }
32  if (count < 3) {
33  // if we only have 2 vertices
34  FEdge *fe = nullptr;
35  Interface0DIterator tmp = it;
36  if (it.isBegin()) {
37  ++tmp;
38  fe = it->getFEdge(*tmp);
39  }
40  else {
41  --tmp;
42  fe = it->getFEdge(*tmp);
43  }
44  fe1 = fe;
45  fe2 = nullptr;
46  }
47  else {
48  // we have more than 2 vertices
49  bool begin = false, last = false;
50  Interface0DIterator previous = it;
51  if (!previous.isBegin()) {
52  --previous;
53  }
54  else {
55  begin = true;
56  }
58  ++next;
59  if (next.isEnd()) {
60  last = true;
61  }
62  if (begin) {
63  fe1 = it->getFEdge(*next);
64  fe2 = nullptr;
65  }
66  else if (last) {
67  fe1 = previous->getFEdge(*it);
68  fe2 = nullptr;
69  }
70  else {
71  fe1 = previous->getFEdge(*it);
72  fe2 = it->getFEdge(*next);
73  }
74  }
75 }
76 
78 {
79  FEdge *fe1, *fe2;
80  getFEdges(it, fe1, fe2);
81  ve1 = fe1->viewedge();
82  if (fe2 != nullptr) {
83  ve2 = fe2->viewedge();
84  if (ve2 == ve1) {
85  ve2 = nullptr;
86  }
87  }
88  else {
89  ve2 = nullptr;
90  }
91 }
92 
94 {
95  ViewEdge *ve1, *ve2;
96  getViewEdges(it, ve1, ve2);
97  return ve1->viewShape();
98 }
99 
100 void getOccludersF0D(Interface0DIterator &it, set<ViewShape *> &oOccluders)
101 {
102  ViewEdge *ve1, *ve2;
103  getViewEdges(it, ve1, ve2);
104  occluder_container::const_iterator oit = ve1->occluders_begin();
105  occluder_container::const_iterator oitend = ve1->occluders_end();
106 
107  for (; oit != oitend; ++oit) {
108  oOccluders.insert((*oit));
109  }
110 
111  if (ve2 != nullptr) {
112  oit = ve2->occluders_begin();
113  oitend = ve2->occluders_end();
114  for (; oit != oitend; ++oit) {
115  oOccluders.insert((*oit));
116  }
117  }
118 }
119 
121 {
122  ViewEdge *ve1, *ve2;
123  getViewEdges(it, ve1, ve2);
124  ViewShape *aShape = ve1->aShape();
125  return aShape;
126 }
127 
128 //
130 {
131  Vec2f A, C;
132  Vec2f B(iter->getProjectedX(), iter->getProjectedY());
133  if (iter.isBegin()) {
134  A = Vec2f(iter->getProjectedX(), iter->getProjectedY());
135  }
136  else {
137  Interface0DIterator previous = iter;
138  --previous;
139  A = Vec2f(previous->getProjectedX(), previous->getProjectedY());
140  }
141  Interface0DIterator next = iter;
142  ++next;
143  if (next.isEnd()) {
144  C = Vec2f(iter->getProjectedX(), iter->getProjectedY());
145  }
146  else {
147  C = Vec2f(next->getProjectedX(), next->getProjectedY());
148  }
149 
150  Vec2f AB(B - A);
151  if (AB.norm() != 0) {
152  AB.normalize();
153  }
154  Vec2f BC(C - B);
155  if (BC.norm() != 0) {
156  BC.normalize();
157  }
158  result = AB + BC;
159  if (result.norm() != 0) {
160  result.normalize();
161  }
162  return 0;
163 }
164 
166 {
167  Vec3r A, C;
168  Vec3r B(iter->getX(), iter->getY(), iter->getZ());
169  if (iter.isBegin()) {
170  A = Vec3r(iter->getX(), iter->getY(), iter->getZ());
171  }
172  else {
173  Interface0DIterator previous = iter;
174  --previous;
175  A = Vec3r(previous->getX(), previous->getY(), previous->getZ());
176  }
177  Interface0DIterator next = iter;
178  ++next;
179  if (next.isEnd()) {
180  C = Vec3r(iter->getX(), iter->getY(), iter->getZ());
181  }
182  else {
183  C = Vec3r(next->getX(), next->getY(), next->getZ());
184  }
185 
186  Vec3r AB(B - A);
187  if (AB.norm() != 0) {
188  AB.normalize();
189  }
190  Vec3r BC(C - B);
191  if (BC.norm() != 0) {
192  BC.normalize();
193  }
194  result = AB + BC;
195  if (result.norm() != 0) {
196  result.normalize();
197  }
198  return 0;
199 }
200 
202 {
203  Interface0DIterator tmp1 = iter, tmp2 = iter;
204  ++tmp2;
205  unsigned count = 1;
206  while ((!tmp1.isBegin()) && (count < 3)) {
207  --tmp1;
208  ++count;
209  }
210  while ((!tmp2.isEnd()) && (count < 3)) {
211  ++tmp2;
212  ++count;
213  }
214  if (count < 3) {
215  // if we only have 2 vertices
216  result = 0;
217  return 0;
218  }
219 
220  Interface0DIterator v = iter;
221  if (iter.isBegin()) {
222  ++v;
223  }
225  ++next;
226  if (next.isEnd()) {
227  next = v;
228  --v;
229  }
231  --prev;
232 
233  Vec2r A(prev->getProjectedX(), prev->getProjectedY());
234  Vec2r B(v->getProjectedX(), v->getProjectedY());
235  Vec2r C(next->getProjectedX(), next->getProjectedY());
236  Vec2r AB(B - A);
237  Vec2r BC(C - B);
238  Vec2r N1(-AB[1], AB[0]);
239  if (N1.norm() != 0) {
240  N1.normalize();
241  }
242  Vec2r N2(-BC[1], BC[0]);
243  if (N2.norm() != 0) {
244  N2.normalize();
245  }
246  if ((N1.norm() == 0) && (N2.norm() == 0)) {
247  Exception::raiseException();
248  result = 0;
249  return -1;
250  }
251  double cosin = N1 * N2;
252  if (cosin > 1) {
253  cosin = 1;
254  }
255  if (cosin < -1) {
256  cosin = -1;
257  }
258  result = acos(cosin);
259  return 0;
260 }
261 
263 {
264  FEdge *fe1, *fe2;
265  getFEdges(iter, fe1, fe2);
266  result = fe1->z_discontinuity();
267  if (fe2 != nullptr) {
268  result += fe2->z_discontinuity();
269  result /= 2.0f;
270  }
271  return 0;
272 }
273 
275 {
276  FEdge *fe1, *fe2;
277  getFEdges(iter, fe1, fe2);
278  Vec3f e1(fe1->orientation2d());
279  Vec2f n1(e1[1], -e1[0]);
280  Vec2f n(n1);
281  if (fe2 != nullptr) {
282  Vec3f e2(fe2->orientation2d());
283  Vec2f n2(e2[1], -e2[0]);
284  n += n2;
285  }
286  n.normalize();
287  result = n;
288  return 0;
289 }
290 
292 {
293  FEdge *fe1, *fe2;
294  getFEdges(iter, fe1, fe2);
295  if (fe1 == nullptr) {
296  return -1;
297  }
298  if (fe1->isSmooth()) {
299  result = ((FEdgeSmooth *)fe1)->frs_material();
300  }
301  else {
302  result = ((FEdgeSharp *)fe1)->bFrsMaterial();
303  }
304 #if 0
305  const SShape *sshape = getShapeF0D(iter);
306  return sshape->material();
307 #endif
308  return 0;
309 }
310 
312 {
313  ViewShape *vshape = getShapeF0D(iter);
314  result = vshape->getId();
315  return 0;
316 }
317 
319 {
320  ViewEdge *ve1, *ve2;
321  getViewEdges(iter, ve1, ve2);
322  unsigned int qi1, qi2;
323  qi1 = ve1->qi();
324  if (ve2 != nullptr) {
325  qi2 = ve2->qi();
326  if (qi2 != qi1) {
327  if (G.debug & G_DEBUG_FREESTYLE) {
328  cout << "QuantitativeInvisibilityF0D: ambiguous evaluation for point " << iter->getId()
329  << endl;
330  }
331  }
332  }
333  result = qi1;
334  return 0;
335 }
336 
338 {
339  Nature::EdgeNature nat = 0;
340  ViewEdge *ve1, *ve2;
341  getViewEdges(iter, ve1, ve2);
342  nat |= ve1->getNature();
343  if (ve2 != nullptr) {
344  nat |= ve2->getNature();
345  }
346  result = nat;
347  return 0;
348 }
349 
351 {
352  set<ViewShape *> occluders;
353  getOccludersF0D(iter, occluders);
354  result.clear();
355  // vsOccluders.insert(vsOccluders.begin(), occluders.begin(), occluders.end());
356  for (set<ViewShape *>::iterator it = occluders.begin(), itend = occluders.end(); it != itend;
357  ++it) {
358  result.push_back((*it));
359  }
360  return 0;
361 }
362 
364 {
365  result = getShapeF0D(iter);
366  return 0;
367 }
368 
370 {
371  result = getOccludeeF0D(iter);
372  return 0;
373 }
374 
375 } // namespace Freestyle::Functions0D
@ G_DEBUG_FREESTYLE
Definition: BKE_global.h:181
Functions taking 0D input.
#define C
Definition: RandGen.cpp:25
Classes to define a View Map (ViewVertex, ViewEdge, etc.)
ATTR_WARN_UNUSED_RESULT const BMVert * v
#define A
SIMD_FORCE_INLINE btVector3 operator()(const btVector3 &x) const
Return the transform of the vector.
Definition: btTransform.h:90
ViewEdge * viewedge() const
Definition: Silhouette.h:658
Vec3r orientation2d() const
Definition: Silhouette.h:912
bool isSmooth() const
Definition: Silhouette.h:706
real z_discontinuity() const
Definition: Silhouette.cpp:279
virtual bool isBegin() const
Definition: Interface0D.h:275
virtual real getProjectedX() const
Definition: Interface0D.cpp:41
virtual real getZ() const
Definition: Interface0D.cpp:29
virtual FEdge * getFEdge(Interface0D &)
Definition: Interface0D.cpp:65
virtual real getY() const
Definition: Interface0D.cpp:23
virtual Id getId() const
Definition: Interface0D.cpp:71
virtual real getX() const
Definition: Interface0D.cpp:17
virtual real getProjectedY() const
Definition: Interface0D.cpp:47
value_type norm() const
Definition: VecMat.h:95
Vec< T, N > & normalize()
Definition: VecMat.h:105
int qi() const
Definition: ViewMap.h:1282
ViewShape * viewShape()
Definition: ViewMap.h:1091
virtual Nature::EdgeNature getNature() const
Definition: ViewMap.h:914
occluder_container::const_iterator occluders_begin() const
Definition: ViewMap.h:1287
ViewShape * aShape()
Definition: ViewMap.h:1099
occluder_container::const_iterator occluders_end() const
Definition: ViewMap.h:1292
Id getId() const
Definition: ViewMap.h:1563
int count
static ulong * next
#define B
#define G(x, y, z)
ViewShape * getShapeF0D(Interface0DIterator &it)
Definition: Functions0D.cpp:93
ViewShape * getOccludeeF0D(Interface0DIterator &it)
void getFEdges(Interface0DIterator &it, FEdge *&fe1, FEdge *&fe2)
Definition: Functions0D.cpp:23
FEdge * getFEdge(Interface0D &it1, Interface0D &it2)
Definition: Functions0D.cpp:18
void getOccludersF0D(Interface0DIterator &it, set< ViewShape * > &oOccluders)
void getViewEdges(Interface0DIterator &it, ViewEdge *&ve1, ViewEdge *&ve2)
Definition: Functions0D.cpp:77
VecMat::Vec2< float > Vec2f
Definition: Geom.h:20
VecMat::Vec3< real > Vec3r
Definition: Geom.h:28
unsigned short EdgeNature
Definition: Nature.h:32
INLINE Rall1d< T, V, S > acos(const Rall1d< T, V, S > &x)
Definition: rall1d.h:399
SymEdge< T > * prev(const SymEdge< T > *se)
Definition: delaunay_2d.cc:105