Blender V5.0
ViewMapIterators.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#pragma once
6
11
12#include "ViewMap.h"
13
14#include "../system/Iterator.h" //soc
15
16namespace Freestyle {
17
18/**********************************/
19/* */
20/* */
21/* ViewMap */
22/* */
23/* */
24/**********************************/
25
26/**********************************/
27/* */
28/* */
29/* ViewVertex */
30/* */
31/* */
32/**********************************/
33
34namespace ViewVertexInternal {
35
41 public:
42 friend class ViewVertex;
43 friend class TVertex;
44 friend class NonTVertex;
45 friend class ViewEdge;
46
47 // FIXME
50
51 protected:
52 Nature::VertexNature _Nature; // the nature of the underlying vertex
53 // T vertex attributes
54 edge_pointers_container::iterator _tbegin;
55 edge_pointers_container::iterator _tend;
56 edge_pointers_container::iterator _tvertex_iter;
57
58 // Non TVertex attributes
59 edges_container::iterator _begin;
60 edges_container::iterator _end;
61 edges_container::iterator _nontvertex_iter;
62
63 public:
66
68 {
69 _Nature = iNature;
70 }
71
74 {
75 _Nature = iBrother._Nature;
77 _tbegin = iBrother._tbegin;
78 _tend = iBrother._tend;
80 }
81 else {
82 _begin = iBrother._begin;
83 _end = iBrother._end;
85 }
86 }
87
89
90 public:
91 inline orientedViewEdgeIterator(edge_pointers_container::iterator begin,
92 edge_pointers_container::iterator end,
93 edge_pointers_container::iterator iter)
94 {
96 _tbegin = begin;
97 _tend = end;
98 _tvertex_iter = iter;
99 }
100
101 inline orientedViewEdgeIterator(edges_container::iterator begin,
102 edges_container::iterator end,
103 edges_container::iterator iter)
104 {
106 _begin = begin;
107 _end = end;
108 _nontvertex_iter = iter;
109 }
110
111 public:
114 virtual bool isBegin() const
115 {
117 return (_tvertex_iter == _tbegin);
118 }
119 else {
120 return (_nontvertex_iter == _begin);
121 }
122 }
123
126 virtual bool isEnd() const
127 {
129 return (_tvertex_iter == _tend);
130 }
131 else {
132 return (_nontvertex_iter == _end);
133 }
134 }
135
136 // operators
138 // operator corresponding to ++i
140 {
141 increment();
142 return *this;
143 }
144
145 // operator corresponding to i++, i.e. which returns the value *and then* increments.
146 // That's why we store the value in a temp.
148 {
149 orientedViewEdgeIterator tmp = *this;
150 increment();
151 return tmp;
152 }
153
154 // comparability
156 virtual bool operator!=(const orientedViewEdgeIterator &b) const
157 {
159 return (_tvertex_iter != b._tvertex_iter);
160 }
161 else {
162 return (_nontvertex_iter != b._nontvertex_iter);
163 }
164 }
165
167 virtual bool operator==(const orientedViewEdgeIterator &b) const
168 {
169 return !(*this != b);
170 }
171
172 // dereferencing
177 {
179 // return _tvertex_iter;
180 return **_tvertex_iter;
181 }
182 else {
183 return (*_nontvertex_iter);
184 }
185 }
186
190 {
191 return &(operator*());
192 }
193
194 public:
196 virtual inline int increment()
197 {
199 ViewVertex::directedViewEdge tmp = (**_tvertex_iter);
201 if (_tvertex_iter != _tend) {
202 // FIXME : pquoi deja ?
203 ViewVertex::directedViewEdge tmp2 = (**_tvertex_iter);
204 if (tmp2.first == tmp.first) {
206 }
207 }
208 }
209 else {
211 }
212 return 0;
213 }
214
215 MEM_CXX_CLASS_ALLOC_FUNCS("Freestyle:orientedViewEdgeIterator")
216};
217
218} // namespace ViewVertexInternal
219
220/**********************************/
221/* */
222/* */
223/* ViewEdge */
224/* */
225/* */
226/**********************************/
227
228namespace ViewEdgeInternal {
229
230//
231// SVertexIterator
232//
234
236 public:
238 {
239 _vertex = nullptr;
240 _begin = nullptr;
241 _previous_edge = nullptr;
242 _next_edge = nullptr;
243 _t = 0;
244 }
245
247 {
248 _vertex = vi._vertex;
249 _begin = vi._begin;
250 _previous_edge = vi._previous_edge;
251 _next_edge = vi._next_edge;
252 _t = vi._t;
253 }
254
256 {
257 _vertex = v;
258 _begin = begin;
259 _previous_edge = prev;
260 _next_edge = next;
261 _t = t;
262 }
263
265 {
266 _vertex = vi._vertex;
267 _begin = vi._begin;
268 _previous_edge = vi._previous_edge;
269 _next_edge = vi._next_edge;
270 _t = vi._t;
271 return *this;
272 }
273
274 virtual ~SVertexIterator() {}
275
276 virtual string getExactTypeName() const
277 {
278 return "SVertexIterator";
279 }
280
282 {
283 return *_vertex;
284 }
285
287 {
288 return &(operator*());
289 }
290
292 {
293 increment();
294 return *this;
295 }
296
298 {
299 SVertexIterator ret(*this);
300 increment();
301 return ret;
302 }
303
305 {
306 decrement();
307 return *this;
308 }
309
311 {
312 SVertexIterator ret(*this);
313 decrement();
314 return ret;
315 }
316
317 virtual int increment()
318 {
319 if (!_next_edge) {
320 _vertex = nullptr;
321 return 0;
322 }
323 _t += (float)_next_edge->getLength2D();
324 _vertex = _next_edge->vertexB();
325 _previous_edge = _next_edge;
326 _next_edge = _next_edge->nextEdge();
327 return 0;
328 }
329
330 virtual int decrement()
331 {
332 if (!_previous_edge) {
333 _vertex = nullptr;
334 return 0;
335 }
336 if ((!_next_edge) && (!_vertex)) {
337 _vertex = _previous_edge->vertexB();
338 return 0;
339 }
340 _t -= (float)_previous_edge->getLength2D();
341 _vertex = _previous_edge->vertexA();
342 _next_edge = _previous_edge;
343 _previous_edge = _previous_edge->previousEdge();
344 return 0;
345 }
346
347 virtual bool isBegin() const
348 {
349 return _vertex == _begin;
350 }
351
352 virtual bool isEnd() const
353 {
354 return (!_vertex) || (_vertex == _begin && _previous_edge);
355 }
356
357 virtual float t() const
358 {
359 return _t;
360 }
361
362 virtual float u() const
363 {
364 return _t / (float)_next_edge->viewedge()->getLength2D();
365 }
366
367 virtual bool operator==(const Interface0DIteratorNested &it) const
368 {
369 const SVertexIterator *it_exact = dynamic_cast<const SVertexIterator *>(&it);
370 if (!it_exact) {
371 return false;
372 }
373 return (_vertex == it_exact->_vertex);
374 }
375
376 virtual SVertexIterator *copy() const
377 {
378 return new SVertexIterator(*this);
379 }
380
381 private:
382 SVertex *_vertex;
383 SVertex *_begin;
384 FEdge *_previous_edge;
385 FEdge *_next_edge;
386 float _t; // curvilinear abscissa
387
388 MEM_CXX_CLASS_ALLOC_FUNCS("Freestyle:SVertexIterator")
389};
390
391//
392// ViewEdgeIterator (base class)
393//
395
402 public:
411 ViewEdgeIterator(ViewEdge *begin = nullptr, bool orientation = true)
412 {
413 _orientation = orientation;
414 _edge = begin;
415 _begin = begin;
416 }
417
420 {
422 _edge = it._edge;
423 _begin = it._begin;
424 }
425
426 virtual ~ViewEdgeIterator() {}
427
429 virtual string getExactTypeName() const
430 {
431 return "ViewEdgeIterator";
432 }
433
436 {
437 return _edge;
438 }
439
442 {
443 _edge = edge;
444 }
445
448 {
449 return _begin;
450 }
451
454 {
455 _begin = begin;
456 }
457
459 bool getOrientation() const
460 {
461 return _orientation;
462 }
463
465 void setOrientation(bool orientation)
466 {
467 _orientation = orientation;
468 }
469
472 {
474 }
475
478 {
479 return _edge;
480 }
481
483 {
484 return operator*();
485 }
486
489 {
490 increment();
491 return *this;
492 }
493
496 {
497 ViewEdgeIterator tmp(*this);
498 increment();
499 return tmp;
500 }
501
503 virtual int increment()
504 {
505 cerr << "Warning: method increment() not implemented" << endl;
506 return 0;
507 }
508
511 {
512 decrement();
513 return *this;
514 }
515
518 {
519 ViewEdgeIterator tmp(*this);
520 decrement();
521 return tmp;
522 }
523
525 virtual int decrement()
526 {
527 cerr << "Warning: method decrement() not implemented" << endl;
528 return 0;
529 }
530
532 virtual bool isBegin() const
533 {
534 return _edge == _begin;
535 }
536
538 virtual bool isEnd() const
539 {
540 return !_edge;
541 }
542
544 virtual bool operator==(ViewEdgeIterator &it) const
545 {
546 return _edge == it._edge;
547 }
548
550 virtual bool operator!=(ViewEdgeIterator &it) const
551 {
552 return !(*this == it);
553 }
554
555 protected:
559
560 MEM_CXX_CLASS_ALLOC_FUNCS("Freestyle:ViewEdgeIterator")
561};
562
563} // end of namespace ViewEdgeInternal
564
565} /* namespace Freestyle */
Classes to define a View Map (ViewVertex, ViewEdge, etc.).
iter begin(iter)
ATTR_WARN_UNUSED_RESULT const BMVert * v
vector< directedViewEdge > edges_container
Definition ViewMap.h:654
vector< directedViewEdge * > edge_pointers_container
Definition ViewMap.h:372
SVertexIterator & operator=(const SVertexIterator &vi)
virtual SVertexIterator * copy() const
virtual bool operator==(const Interface0DIteratorNested &it) const
SVertexIterator(SVertex *v, SVertex *begin, FEdge *prev, FEdge *next, float t)
ViewEdgeIterator(ViewEdge *begin=nullptr, bool orientation=true)
virtual bool operator!=(ViewEdgeIterator &it) const
virtual bool operator==(ViewEdgeIterator &it) const
virtual bool operator!=(const orientedViewEdgeIterator &b) const
virtual ViewVertex::directedViewEdge & operator*() const
virtual ViewVertex::directedViewEdge * operator->() const
orientedViewEdgeIterator(edges_container::iterator begin, edges_container::iterator end, edges_container::iterator iter)
orientedViewEdgeIterator(const orientedViewEdgeIterator &iBrother)
orientedViewEdgeIterator(edge_pointers_container::iterator begin, edge_pointers_container::iterator end, edge_pointers_container::iterator iter)
virtual bool operator==(const orientedViewEdgeIterator &b) const
pair< ViewEdge *, bool > directedViewEdge
Definition ViewMap.h:263
nullptr float
static ulong * next
ushort VertexNature
Definition Nature.h:22
static const VertexNature T_VERTEX
Definition Nature.h:32
static const VertexNature NON_T_VERTEX
Definition Nature.h:30
inherits from class Rep
Definition AppCanvas.cpp:20
return ret