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