Blender V5.0
ViewMap.cpp
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2008-2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9
10#include <cfloat>
11
12#include "ViewMap.h"
14#include "ViewMapIterators.h"
15
17
18#include "BLI_sys_types.h"
19
20namespace Freestyle {
21
22/**********************************/
23/* */
24/* */
25/* ViewMap */
26/* */
27/* */
28/**********************************/
29
30ViewMap *ViewMap::_pInstance = nullptr;
31
33{
34 // The view vertices must be deleted here as some of them are shared between two shapes:
35 for (vector<ViewVertex *>::iterator vv = _VVertices.begin(), vvend = _VVertices.end();
36 vv != vvend;
37 vv++)
38 {
39 delete (*vv);
40 }
41 _VVertices.clear();
42
43 for (vector<ViewShape *>::iterator vs = _VShapes.begin(), vsend = _VShapes.end(); vs != vsend;
44 vs++)
45 {
46 delete (*vs);
47 }
48 _VShapes.clear();
49
50 _FEdges.clear();
51 _SVertices.clear();
52 _VEdges.clear();
53}
54
56{
57 vector<FEdge *> tmpEdges;
58
59 for (vector<ViewShape *>::iterator vs = _VShapes.begin(), vsend = _VShapes.end(); vs != vsend;
60 vs++)
61 {
62 vector<FEdge *> &edges = (*vs)->sshape()->getEdgeList();
63 for (vector<FEdge *>::iterator it = edges.begin(), itend = edges.end(); it != itend; it++) {
64 if ((*it)->isTemporary()) {
65 (*it)->setTemporary(false); // avoid being counted multiple times
66 tmpEdges.push_back(*it);
67 }
68 }
69 }
70
71 for (vector<FEdge *>::iterator it = tmpEdges.begin(), itend = tmpEdges.end(); it != itend; it++)
72 {
73 for (vector<ViewShape *>::iterator vs = _VShapes.begin(), vsend = _VShapes.end(); vs != vsend;
74 vs++)
75 {
76 (*vs)->sshape()->RemoveEdge(*it);
77 }
78 (*it)->vertexA()->RemoveFEdge(*it);
79 (*it)->vertexB()->RemoveFEdge(*it);
80 delete (*it);
81 }
82}
83
85{
86 int index = _shapeIdToIndex[id];
87 return _VShapes[index];
88}
89
91{
92 _shapeIdToIndex[iVShape->getId().getFirst()] = _VShapes.size();
93 _VShapes.push_back(iVShape);
94}
95
97{
98 // find the closest of this candidates:
99 real minDist = DBL_MAX;
100 FEdge *winner = nullptr;
101 for (fedges_container::const_iterator fe = _FEdges.begin(), feend = _FEdges.end(); fe != feend;
102 fe++)
103 {
104 Vec2d A((*fe)->vertexA()->point2D()[0], (*fe)->vertexA()->point2D()[1]);
105 Vec2d B((*fe)->vertexB()->point2D()[0], (*fe)->vertexB()->point2D()[1]);
107 if (dist < minDist) {
108 minDist = dist;
109 winner = (*fe);
110 }
111 }
112
113 return winner;
114}
115
117{
118 // find the closest of this candidates:
119 real minDist = DBL_MAX;
120 FEdge *winner = nullptr;
121 for (fedges_container::const_iterator fe = _FEdges.begin(), feend = _FEdges.end(); fe != feend;
122 fe++)
123 {
124 Vec2d A((*fe)->vertexA()->point2D()[0], (*fe)->vertexA()->point2D()[1]);
125 Vec2d B((*fe)->vertexB()->point2D()[0], (*fe)->vertexB()->point2D()[1]);
127 if (dist < minDist) {
128 minDist = dist;
129 winner = (*fe);
130 }
131 }
132 if (!winner) {
133 return nullptr;
134 }
135
136 return winner->viewedge();
137}
138
140 const Vec3r &iA2D,
141 FEdge *iFEdgeA,
142 const Vec3r &iB3D,
143 const Vec3r &iB2D,
144 FEdge *iFEdgeB,
145 const Id &id)
146{
147 ViewShape *vshapeA = iFEdgeA->viewedge()->viewShape();
148 SShape *shapeA = iFEdgeA->shape();
149 ViewShape *vshapeB = iFEdgeB->viewedge()->viewShape();
150 SShape *shapeB = iFEdgeB->shape();
151
152 SVertex *Ia = shapeA->CreateSVertex(iA3D, iA2D, iFEdgeA->vertexA()->getId());
153 SVertex *Ib = shapeB->CreateSVertex(iB3D, iB2D, iFEdgeB->vertexA()->getId());
154
155 // depending on which of these 2 svertices is the nearest from the viewpoint, we're going to
156 // build the TVertex by giving them in an order or another (the first one must be the nearest)
157 real dista = Ia->point2D()[2];
158 real distb = Ib->point2D()[2];
159
160 TVertex *tvertex;
161 if (dista < distb) {
162 tvertex = new TVertex(Ia, Ib);
163 }
164 else {
165 tvertex = new TVertex(Ib, Ia);
166 }
167
168 tvertex->setId(id);
169
170 // add these vertices to the view map
171 AddViewVertex(tvertex);
172 AddSVertex(Ia);
173 AddSVertex(Ib);
174
175 // and this T Vertex to the view shapes:
176 vshapeA->AddVertex(tvertex);
177 vshapeB->AddVertex(tvertex);
178
179 return tvertex;
180}
181
182ViewVertex *ViewMap::InsertViewVertex(SVertex *iVertex, vector<ViewEdge *> &newViewEdges)
183{
184 NonTVertex *vva = dynamic_cast<NonTVertex *>(iVertex->viewvertex());
185 if (vva) {
186 return vva;
187 }
188 // because it is not already a ViewVertex, this SVertex must have only 2 FEdges. The incoming one
189 // still belongs to ioEdge, the outgoing one now belongs to newVEdge
190 const vector<FEdge *> &fedges = iVertex->fedges();
191 if (fedges.size() != 2) {
192 cerr << "ViewMap warning: Can't split the ViewEdge" << endl;
193 return nullptr;
194 }
195 FEdge *fend(nullptr), *fbegin(nullptr);
196 for (vector<FEdge *>::const_iterator fe = fedges.begin(), feend = fedges.end(); fe != feend;
197 ++fe)
198 {
199 if ((*fe)->vertexB() == iVertex) {
200 fend = (*fe);
201 }
202 if ((*fe)->vertexA() == iVertex) {
203 fbegin = (*fe);
204 }
205 if ((fbegin != nullptr) && (fend != nullptr)) {
206 break;
207 }
208 }
209 ViewEdge *ioEdge = fbegin->viewedge();
210 ViewShape *vshape = ioEdge->viewShape();
211 vva = new NonTVertex(iVertex);
212 // if the ViewEdge is a closed loop, we don't create a new VEdge
213 if (ioEdge->A() == nullptr) {
214 // closed loop
215 ioEdge->setA(vva);
216 ioEdge->setB(vva);
217 // update sshape
218 vshape->sshape()->RemoveEdgeFromChain(ioEdge->fedgeA());
219 vshape->sshape()->RemoveEdgeFromChain(ioEdge->fedgeB());
220
221 ioEdge->setFEdgeA(fbegin);
222 ioEdge->setFEdgeB(fend);
223
224 // Update FEdges
225 fend->setNextEdge(nullptr);
226 fbegin->setPreviousEdge(nullptr);
227
228 // update new View Vertex:
229 vva->AddOutgoingViewEdge(ioEdge);
230 vva->AddIncomingViewEdge(ioEdge);
231
232 vshape->sshape()->AddChain(ioEdge->fedgeA());
233 vshape->sshape()->AddChain(ioEdge->fedgeB());
234 }
235 else {
236 // Create new ViewEdge
237 ViewEdge *newVEdge = new ViewEdge(vva, ioEdge->B(), fbegin, ioEdge->fedgeB(), vshape);
238 newVEdge->setId(Id(ioEdge->getId().getFirst(), ioEdge->getId().getSecond() + 1));
239 newVEdge->setNature(ioEdge->getNature());
240 // newVEdge->UpdateFEdges(); // done in the ViewEdge constructor
241 // Update old ViewEdge
242 ioEdge->setB(vva);
243 ioEdge->setFEdgeB(fend);
244
245 // Update FEdges
246 fend->setNextEdge(nullptr);
247 fbegin->setPreviousEdge(nullptr);
248
249 // update new View Vertex:
250 vva->AddOutgoingViewEdge(newVEdge);
251 vva->AddIncomingViewEdge(ioEdge);
252
253 NonTVertex *vvb = dynamic_cast<NonTVertex *>(newVEdge->B());
254 if (vvb) {
255 vvb->Replace(ioEdge, newVEdge);
256 }
257
258 // update ViewShape
259 // vshape->AddEdge(newVEdge);
260 // update SShape
261 vshape->sshape()->AddChain(fbegin);
262 // update ViewMap
263 //_VEdges.push_back(newVEdge);
264 newViewEdges.push_back(newVEdge);
265 }
266
267 // update ViewShape
268 vshape->AddVertex(vva);
269
270 // update ViewMap
271 _VVertices.push_back(vva);
272
273 return vva;
274}
275
276#if 0
277FEdge *ViewMap::Connect(FEdge *ioEdge, SVertex *ioVertex, vector<ViewEdge *> &oNewVEdges)
278{
279 SShape *sshape = ioEdge->shape();
280 FEdge *newFEdge = sshape->SplitEdgeIn2(ioEdge, ioVertex);
281 AddFEdge(newFEdge);
282 InsertViewVertex(ioVertex, oNewVEdges);
283 return newFEdge;
284}
285#endif
286
287/**********************************/
288/* */
289/* */
290/* TVertex */
291/* */
292/* */
293/**********************************/
294
295// is dve1 before dve2 ? (does it have a smaller angle ?)
297{
298 FEdge *fe1;
299 if (dve1.second) {
300 fe1 = dve1.first->fedgeB();
301 }
302 else {
303 fe1 = dve1.first->fedgeA();
304 }
305 FEdge *fe2;
306 if (dve2.second) {
307 fe2 = dve2.first->fedgeB();
308 }
309 else {
310 fe2 = dve2.first->fedgeA();
311 }
312
313 Vec3r V1 = fe1->orientation2d();
314 Vec2r v1(V1.x(), V1.y());
315 v1.normalize();
316 Vec3r V2 = fe2->orientation2d();
317 Vec2r v2(V2.x(), V2.y());
318 v2.normalize();
319 if (v1.y() > 0) {
320 if (v2.y() < 0) {
321 return true;
322 }
323
324 return (v1.x() > v2.x());
325 }
326
327 if (v2.y() > 0) {
328 return false;
329 }
330
331 return (v1.x() < v2.x());
332}
333
334void TVertex::setFrontEdgeA(ViewEdge *iFrontEdgeA, bool incoming)
335{
336 if (!iFrontEdgeA) {
337 cerr << "Warning: null pointer passed as argument of TVertex::setFrontEdgeA()" << endl;
338 return;
339 }
340 _FrontEdgeA = directedViewEdge(iFrontEdgeA, incoming);
341 if (!_sortedEdges.empty()) {
342 edge_pointers_container::iterator dve = _sortedEdges.begin(), dveend = _sortedEdges.end();
343 for (; (dve != dveend) && ViewEdgeComp(**dve, _FrontEdgeA); ++dve) {
344 /* pass */
345 }
346 _sortedEdges.insert(dve, &_FrontEdgeA);
347 }
348 else {
349 _sortedEdges.push_back(&_FrontEdgeA);
350 }
351}
352
353void TVertex::setFrontEdgeB(ViewEdge *iFrontEdgeB, bool incoming)
354{
355 if (!iFrontEdgeB) {
356 cerr << "Warning: null pointer passed as argument of TVertex::setFrontEdgeB()" << endl;
357 return;
358 }
359 _FrontEdgeB = directedViewEdge(iFrontEdgeB, incoming);
360 if (!_sortedEdges.empty()) {
361 edge_pointers_container::iterator dve = _sortedEdges.begin(), dveend = _sortedEdges.end();
362 for (; (dve != dveend) && ViewEdgeComp(**dve, _FrontEdgeB); ++dve) {
363 /* pass */
364 }
365 _sortedEdges.insert(dve, &_FrontEdgeB);
366 }
367 else {
368 _sortedEdges.push_back(&_FrontEdgeB);
369 }
370}
371
372void TVertex::setBackEdgeA(ViewEdge *iBackEdgeA, bool incoming)
373{
374 if (!iBackEdgeA) {
375 cerr << "Warning: null pointer passed as argument of TVertex::setBackEdgeA()" << endl;
376 return;
377 }
378 _BackEdgeA = directedViewEdge(iBackEdgeA, incoming);
379 if (!_sortedEdges.empty()) {
380 edge_pointers_container::iterator dve = _sortedEdges.begin(), dveend = _sortedEdges.end();
381 for (; (dve != dveend) && ViewEdgeComp(**dve, _BackEdgeA); ++dve) {
382 /* pass */
383 }
384 _sortedEdges.insert(dve, &_BackEdgeA);
385 }
386 else {
387 _sortedEdges.push_back(&_BackEdgeA);
388 }
389}
390
391void TVertex::setBackEdgeB(ViewEdge *iBackEdgeB, bool incoming)
392{
393 if (!iBackEdgeB) {
394 cerr << "Warning: null pointer passed as argument of TVertex::setBackEdgeB()" << endl;
395 return;
396 }
397 _BackEdgeB = directedViewEdge(iBackEdgeB, incoming);
398 if (!_sortedEdges.empty()) {
399 edge_pointers_container::iterator dve = _sortedEdges.begin(), dveend = _sortedEdges.end();
400 for (; (dve != dveend) && ViewEdgeComp(**dve, _BackEdgeB); ++dve) {
401 /* pass */
402 }
403 _sortedEdges.insert(dve, &_BackEdgeB);
404 }
405 else {
406 _sortedEdges.push_back(&_BackEdgeB);
407 }
408}
409
411{
412 // theoretically, we only replace edges for which this
413 // view vertex is the B vertex
414 if ((iOld == _FrontEdgeA.first) && (_FrontEdgeA.first->B() == this)) {
415 _FrontEdgeA.first = iNew;
416 return;
417 }
418 if ((iOld == _FrontEdgeB.first) && (_FrontEdgeB.first->B() == this)) {
419 _FrontEdgeB.first = iNew;
420 return;
421 }
422 if ((iOld == _BackEdgeA.first) && (_BackEdgeA.first->B() == this)) {
423 _BackEdgeA.first = iNew;
424 return;
425 }
426 if ((iOld == _BackEdgeB.first) && (_BackEdgeB.first->B() == this)) {
427 _BackEdgeB.first = iNew;
428 return;
429 }
430}
431
432/* Iterators access. */
433
435{
436 // return edge_iterator(_FrontEdgeA, _FrontEdgeB, _BackEdgeA, _BackEdgeB, _FrontEdgeA);
437 return edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.begin());
438}
439
441{
442 // return const_edge_iterator(_FrontEdgeA, _FrontEdgeB, _BackEdgeA, _BackEdgeB, _FrontEdgeA);
443 return const_edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.begin());
444}
445
447{
448 // return edge_iterator(_FrontEdgeA, _FrontEdgeB, _BackEdgeA, _BackEdgeB,
449 // directedViewEdge(0,true));
450 return edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.end());
451}
452
454{
455 // return const_edge_iterator(_FrontEdgeA, _FrontEdgeB, _BackEdgeA, _BackEdgeB,
456 // directedViewEdge(0, true));
457 return const_edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.end());
458}
459
461{
462 for (edge_pointers_container::iterator it = _sortedEdges.begin(), itend = _sortedEdges.end();
463 it != itend;
464 it++)
465 {
466 if ((*it)->first == iEdge) {
467 return edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), it);
468 }
469 }
470 return edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.begin());
471
472#if 0
473 directedViewEdge dEdge;
474 if (_FrontEdgeA.first == iEdge) {
475 dEdge = _FrontEdgeA;
476 }
477 else if (_FrontEdgeB.first == iEdge) {
478 dEdge = _FrontEdgeB;
479 }
480 else if (_BackEdgeA.first == iEdge) {
481 dEdge = _BackEdgeA;
482 }
483 else if (_BackEdgeB.first == iEdge) {
484 dEdge = _BackEdgeB;
485 }
486 return edge_iterator(_FrontEdgeA, _FrontEdgeB, _BackEdgeA, _BackEdgeB, dEdge);
487#endif
488}
489
491{
492 for (edge_pointers_container::const_iterator it = _sortedEdges.begin(),
493 itend = _sortedEdges.end();
494 it != itend;
495 it++)
496 {
497 if ((*it)->first == iEdge) {
498 return const_edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), it);
499 }
500 }
501 return const_edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.begin());
502
503#if 0
504 directedViewEdge dEdge;
505 if (_FrontEdgeA.first == iEdge) {
506 dEdge = _FrontEdgeA;
507 }
508 else if (_FrontEdgeB.first == iEdge) {
509 dEdge = _FrontEdgeB;
510 }
511 else if (_BackEdgeA.first == iEdge) {
512 dEdge = _BackEdgeA;
513 }
514 else if (_BackEdgeB.first == iEdge) {
515 dEdge = _BackEdgeB;
516 }
517 return const_edge_iterator(_FrontEdgeA, _FrontEdgeB, _BackEdgeA, _BackEdgeB, dEdge);
518#endif
519}
520
522{
524 _sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.begin());
525}
526
528{
530 _sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.end());
531}
532
534{
535 for (edge_pointers_container::iterator it = _sortedEdges.begin(), itend = _sortedEdges.end();
536 it != itend;
537 it++)
538 {
539 if ((*it)->first == iEdge) {
541 _sortedEdges.begin(), _sortedEdges.end(), it);
542 }
543 }
545 _sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.begin());
546}
547
548/**********************************/
549/* */
550/* */
551/* NonTVertex */
552/* */
553/* */
554/**********************************/
555
557{
558 // let's keep the viewedges ordered in CCW order in the 2D image plan
559 directedViewEdge idve(iVEdge, false);
560 if (!_ViewEdges.empty()) {
561 edges_container::iterator dve = _ViewEdges.begin(), dveend = _ViewEdges.end();
562 for (; (dve != dveend) && ViewEdgeComp(*dve, idve); ++dve) {
563 /* pass */
564 }
565 _ViewEdges.insert(dve, idve);
566 }
567 else {
568 _ViewEdges.push_back(idve);
569 }
570}
571
573{
574 // let's keep the viewedges ordered in CCW order in the 2D image plan
575 directedViewEdge idve(iVEdge, true);
576 if (!_ViewEdges.empty()) {
577 edges_container::iterator dve = _ViewEdges.begin(), dveend = _ViewEdges.end();
578 for (; (dve != dveend) && ViewEdgeComp(*dve, idve); ++dve) {
579 /* pass */
580 }
581 _ViewEdges.insert(dve, idve);
582 }
583 else {
584 _ViewEdges.push_back(idve);
585 }
586}
587
588/* Iterators access. */
589
591{
592 return edge_iterator(_ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.begin());
593}
594
596{
597 return const_edge_iterator(_ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.begin());
598}
599
601{
602 return edge_iterator(_ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.end());
603}
604
606{
607 return const_edge_iterator(_ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.end());
608}
609
611{
612 for (edges_container::iterator it = _ViewEdges.begin(), itend = _ViewEdges.end(); it != itend;
613 it++)
614 {
615 if ((it)->first == iEdge) {
616 return edge_iterator(_ViewEdges.begin(), _ViewEdges.end(), it);
617 }
618 }
619 return edge_iterator(_ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.begin());
620}
621
623{
624 for (edges_container::const_iterator it = _ViewEdges.begin(), itend = _ViewEdges.end();
625 it != itend;
626 it++)
627 {
628 if ((it)->first == iEdge) {
629 return const_edge_iterator(_ViewEdges.begin(), _ViewEdges.end(), it);
630 }
631 }
632 return const_edge_iterator(_ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.begin());
633}
634
636{
638 _ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.begin());
639}
640
642{
644 _ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.end());
645}
646
648{
649 for (edges_container::iterator it = _ViewEdges.begin(), itend = _ViewEdges.end(); it != itend;
650 it++)
651 {
652 if ((it)->first == iEdge) {
654 _ViewEdges.begin(), _ViewEdges.end(), it);
655 }
656 }
658 _ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.begin());
659}
660
661/**********************************/
662/* */
663/* */
664/* ViewEdge */
665/* */
666/* */
667/**********************************/
668
670{
671 float length = 0.0f;
674 Vec2r seg;
675 do {
676 seg = Vec2r((*it)->orientation2d()[0], (*it)->orientation2d()[1]);
677 length += seg.norm();
678 ++it;
679 } while ((it != itend) && (it != itlast));
680 return length;
681}
682
688
693
696{
697 return fedge_iterator(this->_FEdgeA, this->_FEdgeB);
698}
699
701{
702 return const_fedge_iterator(this->_FEdgeA, this->_FEdgeB);
703}
704
706{
707 return fedge_iterator(this->_FEdgeB, this->_FEdgeB);
708}
709
711{
712 return const_fedge_iterator(this->_FEdgeB, this->_FEdgeB);
713}
714
716{
717 return fedge_iterator(nullptr, this->_FEdgeB);
718}
719
721{
722 return const_fedge_iterator(nullptr, this->_FEdgeB);
723}
724
727{
728 return const_vertex_iterator(this->_FEdgeA->vertexA(), nullptr, _FEdgeA);
729}
730
732{
733 return vertex_iterator(this->_FEdgeA->vertexA(), nullptr, _FEdgeA);
734}
735
737{
738 return const_vertex_iterator(this->_FEdgeB->vertexB(), _FEdgeB, nullptr);
739}
740
742{
743 return vertex_iterator(this->_FEdgeB->vertexB(), _FEdgeB, nullptr);
744}
745
747{
748 return const_vertex_iterator(nullptr, _FEdgeB, nullptr);
749}
750
752{
753 return vertex_iterator(nullptr, _FEdgeB, nullptr);
754}
755
757{
759 this->_FEdgeA->vertexA(), this->_FEdgeA->vertexA(), nullptr, _FEdgeA, 0.0f));
760 return ret;
761}
762
764{
766 nullptr, this->_FEdgeA->vertexA(), _FEdgeB, nullptr, getLength2D()));
767 return ret;
768}
769
771{
772 return verticesBegin();
773}
774
776{
777 return verticesEnd();
778}
779
780/**********************************/
781/* */
782/* */
783/* ViewShape */
784/* */
785/* */
786/**********************************/
787
789{
790 _Vertices.clear();
791
792 if (!_Edges.empty()) {
793 for (vector<ViewEdge *>::iterator e = _Edges.begin(), eend = _Edges.end(); e != eend; e++) {
794 delete (*e);
795 }
796 _Edges.clear();
797 }
798
799 if (_SShape) {
800 delete _SShape;
801 _SShape = nullptr;
802 }
803}
804
806{
807 FEdge *fedge = iViewEdge->fedgeA();
808 for (vector<ViewEdge *>::iterator ve = _Edges.begin(), veend = _Edges.end(); ve != veend; ve++) {
809 if (iViewEdge == (*ve)) {
810 _Edges.erase(ve);
811 _SShape->RemoveEdge(fedge);
812 break;
813 }
814 }
815}
816
818{
819 for (vector<ViewVertex *>::iterator vv = _Vertices.begin(), vvend = _Vertices.end(); vv != vvend;
820 vv++)
821 {
822 if (iViewVertex == (*vv)) {
823 _Vertices.erase(vv);
824 break;
825 }
826 }
827}
828
829/**********************************/
830/* */
831/* */
832/* ViewEdge */
833/* */
834/* */
835/**********************************/
836
838{
839 FEdge *currentEdge = _FEdgeA;
840 do {
841 currentEdge->setViewEdge(this);
842 currentEdge = currentEdge->nextEdge();
843 } while (!ELEM(currentEdge, nullptr, _FEdgeB));
844 // last one
845 _FEdgeB->setViewEdge(this);
846}
847
848} /* namespace Freestyle */
unsigned int uint
#define ELEM(...)
Various tools for geometry.
Iterators used to iterate over the various elements of the ViewMap. These iterators can't be exported...
Iterators used to iterate over the various elements of the ViewMap.
Classes to define a View Map (ViewVertex, ViewEdge, etc.).
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
#define A
ViewEdge * viewedge() const
Definition Silhouette.h:654
SShape * shape()
Definition Silhouette.h:632
FEdge * nextEdge()
Definition Silhouette.h:619
Vec3r orientation2d() const
Definition Silhouette.h:906
SVertex * vertexA()
Definition Silhouette.h:593
void setViewEdge(ViewEdge *iViewEdge)
Definition Silhouette.h:762
void setPreviousEdge(FEdge *iEdge)
Definition Silhouette.h:743
id_type getFirst() const
Definition Id.h:62
id_type getSecond() const
Definition Id.h:68
virtual void Replace(ViewEdge *iOld, ViewEdge *iNew)
Definition ViewMap.h:813
void AddIncomingViewEdge(ViewEdge *iVEdge)
Definition ViewMap.cpp:572
virtual ViewVertexInternal::orientedViewEdgeIterator edgesBegin()
Definition ViewMap.cpp:635
virtual edge_iterator edges_iterator(ViewEdge *iEdge)
Definition ViewMap.cpp:610
virtual edge_iterator edges_begin()
Definition ViewMap.cpp:590
void AddOutgoingViewEdge(ViewEdge *iVEdge)
Definition ViewMap.cpp:556
virtual ViewVertexInternal::orientedViewEdgeIterator edgesEnd()
Definition ViewMap.cpp:641
virtual ViewVertexInternal::orientedViewEdgeIterator edgesIterator(ViewEdge *iEdge)
Definition ViewMap.cpp:647
virtual edge_iterator edges_end()
Definition ViewMap.cpp:600
void RemoveEdgeFromChain(FEdge *iEdge)
FEdge * SplitEdgeIn2(FEdge *ioEdge, SVertex *ioNewVertex)
void AddChain(FEdge *iEdge)
SVertex * CreateSVertex(const Vec3r &P3D, const Vec3r &P2D, const Id &id)
ViewVertex * viewvertex()
Definition Silhouette.h:276
virtual Id getId() const
Definition Silhouette.h:117
const Vec3r & point2D() const
Definition Silhouette.h:228
const vector< FEdge * > & fedges()
Definition Silhouette.h:248
void setId(const Id &iId)
Definition ViewMap.h:565
void setBackEdgeA(ViewEdge *iBackEdgeA, bool incoming=true)
Definition ViewMap.cpp:372
virtual edge_iterator edges_iterator(ViewEdge *iEdge)
Definition ViewMap.cpp:460
virtual ViewVertexInternal::orientedViewEdgeIterator edgesIterator(ViewEdge *iEdge)
Definition ViewMap.cpp:533
virtual edge_iterator edges_begin()
Definition ViewMap.cpp:434
void setBackEdgeB(ViewEdge *iBackEdgeB, bool incoming=true)
Definition ViewMap.cpp:391
virtual edge_iterator edges_end()
Definition ViewMap.cpp:446
void setFrontEdgeB(ViewEdge *iFrontEdgeB, bool incoming=true)
Definition ViewMap.cpp:353
virtual void Replace(ViewEdge *iOld, ViewEdge *iNew)
Definition ViewMap.cpp:410
void setFrontEdgeA(ViewEdge *iFrontEdgeA, bool incoming=true)
Definition ViewMap.cpp:334
virtual ViewVertexInternal::orientedViewEdgeIterator edgesBegin()
Definition ViewMap.cpp:521
virtual ViewVertexInternal::orientedViewEdgeIterator edgesEnd()
Definition ViewMap.cpp:527
value_type x() const
Definition VecMat.h:292
value_type y() const
Definition VecMat.h:302
Vec< T, N > & normalize()
Definition VecMat.h:102
value_type norm() const
Definition VecMat.h:92
const_vertex_iterator vertices_end() const
Definition ViewMap.cpp:746
void setId(const Id &id)
Definition ViewMap.h:1170
virtual Nature::EdgeNature getNature() const
Definition ViewMap.h:902
void setFEdgeB(FEdge *iFEdge)
Definition ViewMap.h:1158
fedge_iterator fedge_iterator_last()
Definition ViewMap.cpp:705
fedge_iterator fedge_iterator_end()
Definition ViewMap.cpp:715
ViewEdgeInternal::edge_iterator_base< Const_traits< ViewEdge * > > const_edge_iterator
Definition ViewMap.h:912
void setA(ViewVertex *iA)
Definition ViewMap.h:1134
virtual Id getId() const
Definition ViewMap.h:896
edge_iterator ViewEdge_iterator()
view edge iterator
Definition ViewMap.cpp:684
ViewEdgeInternal::fedge_iterator_base< Const_traits< FEdge * > > const_fedge_iterator
Definition ViewMap.h:915
ViewShape * viewShape()
Definition ViewMap.h:1079
void setFEdgeA(FEdge *iFEdge)
Definition ViewMap.h:1152
const_vertex_iterator vertices_last() const
Definition ViewMap.cpp:736
virtual Interface0DIterator pointsBegin(float t=0.0f)
Definition ViewMap.cpp:770
ViewEdgeInternal::vertex_iterator_base< Nonconst_traits< SVertex * > > vertex_iterator
Definition ViewMap.h:917
virtual Interface0DIterator pointsEnd(float t=0.0f)
Definition ViewMap.cpp:775
ViewVertex * B()
Definition ViewMap.h:1061
ViewEdgeInternal::edge_iterator_base< Nonconst_traits< ViewEdge * > > edge_iterator
Definition ViewMap.h:911
const_vertex_iterator vertices_begin() const
embedding vertex iterator
Definition ViewMap.cpp:726
fedge_iterator fedge_iterator_begin()
feature edge iterator
Definition ViewMap.cpp:695
real getLength2D() const
Definition ViewMap.cpp:669
virtual Interface0DIterator verticesBegin()
Definition ViewMap.cpp:756
ViewEdgeInternal::vertex_iterator_base< Const_traits< SVertex * > > const_vertex_iterator
Definition ViewMap.h:918
virtual Interface0DIterator verticesEnd()
Definition ViewMap.cpp:763
void setNature(Nature::EdgeNature iNature)
Definition ViewMap.h:1146
ViewVertex * A()
Definition ViewMap.h:1055
ViewEdgeInternal::fedge_iterator_base< Nonconst_traits< FEdge * > > fedge_iterator
Definition ViewMap.h:914
void setB(ViewVertex *iB)
Definition ViewMap.h:1140
const FEdge * getClosestFEdge(real x, real y) const
Definition ViewMap.cpp:96
ViewShape * viewShape(uint id)
Definition ViewMap.cpp:84
void AddViewShape(ViewShape *iVShape)
Definition ViewMap.cpp:90
const ViewEdge * getClosestViewEdge(real x, real y) const
Definition ViewMap.cpp:116
void AddSVertex(SVertex *iSVertex)
Definition ViewMap.h:172
virtual void Clean()
Definition ViewMap.cpp:55
TVertex * CreateTVertex(const Vec3r &iA3D, const Vec3r &iA2D, FEdge *iFEdgeA, const Vec3r &iB3D, const Vec3r &iB2D, FEdge *iFEdgeB, const Id &id)
Definition ViewMap.cpp:139
void AddFEdge(FEdge *iFEdge)
Definition ViewMap.h:167
virtual ~ViewMap()
Definition ViewMap.cpp:32
ViewVertex * InsertViewVertex(SVertex *iVertex, vector< ViewEdge * > &newViewEdges)
Definition ViewMap.cpp:182
void AddViewVertex(ViewVertex *iVVertex)
Definition ViewMap.h:162
void AddVertex(ViewVertex *iVertex)
Definition ViewMap.h:1590
void RemoveVertex(ViewVertex *iViewVertex)
Definition ViewMap.cpp:817
void RemoveEdge(ViewEdge *iViewEdge)
Definition ViewMap.cpp:805
SShape * sshape()
Definition ViewMap.h:1529
ViewVertexInternal::edge_iterator_base< ViewVertexInternal::edge_const_traits > const_edge_iterator
Definition ViewMap.h:270
pair< ViewEdge *, bool > directedViewEdge
Definition ViewMap.h:263
ViewVertexInternal::edge_iterator_base< ViewVertexInternal::edge_nonconst_traits > edge_iterator
Definition ViewMap.h:268
float length(VecOp< float, D >) RET
#define B
real distPointSegment(const T &P, const T &A, const T &B)
Definition GeomUtils.h:32
VecMat::Vec2< double > Vec2d
Definition Geom.h:23
VecMat::Vec2< real > Vec2r
Definition Geom.h:24
VecMat::Vec3< real > Vec3r
Definition Geom.h:30
inherits from class Rep
Definition AppCanvas.cpp:20
static bool ViewEdgeComp(ViewVertex::directedViewEdge &dve1, ViewVertex::directedViewEdge &dve2)
Definition ViewMap.cpp:296
static uint x[3]
Definition RandGen.cpp:77
double real
Definition Precision.h:14
return ret