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