Blender V4.3
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
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
434{
435 // return edge_iterator(_FrontEdgeA, _FrontEdgeB, _BackEdgeA, _BackEdgeB, _FrontEdgeA);
436 return edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.begin());
437}
438
440{
441 // return const_edge_iterator(_FrontEdgeA, _FrontEdgeB, _BackEdgeA, _BackEdgeB, _FrontEdgeA);
442 return const_edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.begin());
443}
444
446{
447 // return edge_iterator(_FrontEdgeA, _FrontEdgeB, _BackEdgeA, _BackEdgeB,
448 // directedViewEdge(0,true));
449 return edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.end());
450}
451
453{
454 // return const_edge_iterator(_FrontEdgeA, _FrontEdgeB, _BackEdgeA, _BackEdgeB,
455 // directedViewEdge(0, true));
456 return const_edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.end());
457}
458
460{
461 for (edge_pointers_container::iterator it = _sortedEdges.begin(), itend = _sortedEdges.end();
462 it != itend;
463 it++)
464 {
465 if ((*it)->first == iEdge) {
466 return edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), it);
467 }
468 }
469 return edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.begin());
470
471#if 0
472 directedViewEdge dEdge;
473 if (_FrontEdgeA.first == iEdge) {
474 dEdge = _FrontEdgeA;
475 }
476 else if (_FrontEdgeB.first == iEdge) {
477 dEdge = _FrontEdgeB;
478 }
479 else if (_BackEdgeA.first == iEdge) {
480 dEdge = _BackEdgeA;
481 }
482 else if (_BackEdgeB.first == iEdge) {
483 dEdge = _BackEdgeB;
484 }
485 return edge_iterator(_FrontEdgeA, _FrontEdgeB, _BackEdgeA, _BackEdgeB, dEdge);
486#endif
487}
488
490{
491 for (edge_pointers_container::const_iterator it = _sortedEdges.begin(),
492 itend = _sortedEdges.end();
493 it != itend;
494 it++)
495 {
496 if ((*it)->first == iEdge) {
497 return const_edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), it);
498 }
499 }
500 return const_edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.begin());
501
502#if 0
503 directedViewEdge dEdge;
504 if (_FrontEdgeA.first == iEdge) {
505 dEdge = _FrontEdgeA;
506 }
507 else if (_FrontEdgeB.first == iEdge) {
508 dEdge = _FrontEdgeB;
509 }
510 else if (_BackEdgeA.first == iEdge) {
511 dEdge = _BackEdgeA;
512 }
513 else if (_BackEdgeB.first == iEdge) {
514 dEdge = _BackEdgeB;
515 }
516 return const_edge_iterator(_FrontEdgeA, _FrontEdgeB, _BackEdgeA, _BackEdgeB, dEdge);
517#endif
518}
519
521{
523 _sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.begin());
524}
525
527{
529 _sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.end());
530}
531
533{
534 for (edge_pointers_container::iterator it = _sortedEdges.begin(), itend = _sortedEdges.end();
535 it != itend;
536 it++)
537 {
538 if ((*it)->first == iEdge) {
540 _sortedEdges.begin(), _sortedEdges.end(), it);
541 }
542 }
544 _sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.begin());
545}
546
547/**********************************/
548/* */
549/* */
550/* NonTVertex */
551/* */
552/* */
553/**********************************/
554
556{
557 // let's keep the viewedges ordered in CCW order in the 2D image plan
558 directedViewEdge idve(iVEdge, false);
559 if (!_ViewEdges.empty()) {
560 edges_container::iterator dve = _ViewEdges.begin(), dveend = _ViewEdges.end();
561 for (; (dve != dveend) && ViewEdgeComp(*dve, idve); ++dve) {
562 /* pass */
563 }
564 _ViewEdges.insert(dve, idve);
565 }
566 else {
567 _ViewEdges.push_back(idve);
568 }
569}
570
572{
573 // let's keep the viewedges ordered in CCW order in the 2D image plan
574 directedViewEdge idve(iVEdge, true);
575 if (!_ViewEdges.empty()) {
576 edges_container::iterator dve = _ViewEdges.begin(), dveend = _ViewEdges.end();
577 for (; (dve != dveend) && ViewEdgeComp(*dve, idve); ++dve) {
578 /* pass */
579 }
580 _ViewEdges.insert(dve, idve);
581 }
582 else {
583 _ViewEdges.push_back(idve);
584 }
585}
586
589{
590 return edge_iterator(_ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.begin());
591}
592
594{
595 return const_edge_iterator(_ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.begin());
596}
597
599{
600 return edge_iterator(_ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.end());
601}
602
604{
605 return const_edge_iterator(_ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.end());
606}
607
609{
610 for (edges_container::iterator it = _ViewEdges.begin(), itend = _ViewEdges.end(); it != itend;
611 it++)
612 {
613 if ((it)->first == iEdge) {
614 return edge_iterator(_ViewEdges.begin(), _ViewEdges.end(), it);
615 }
616 }
617 return edge_iterator(_ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.begin());
618}
619
621{
622 for (edges_container::const_iterator it = _ViewEdges.begin(), itend = _ViewEdges.end();
623 it != itend;
624 it++)
625 {
626 if ((it)->first == iEdge) {
627 return const_edge_iterator(_ViewEdges.begin(), _ViewEdges.end(), it);
628 }
629 }
630 return const_edge_iterator(_ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.begin());
631}
632
634{
636 _ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.begin());
637}
638
640{
642 _ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.end());
643}
644
646{
647 for (edges_container::iterator it = _ViewEdges.begin(), itend = _ViewEdges.end(); it != itend;
648 it++)
649 {
650 if ((it)->first == iEdge) {
652 _ViewEdges.begin(), _ViewEdges.end(), it);
653 }
654 }
656 _ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.begin());
657}
658
659/**********************************/
660/* */
661/* */
662/* ViewEdge */
663/* */
664/* */
665/**********************************/
666
668{
669 float length = 0.0f;
672 Vec2r seg;
673 do {
674 seg = Vec2r((*it)->orientation2d()[0], (*it)->orientation2d()[1]);
675 length += seg.norm();
676 ++it;
677 } while ((it != itend) && (it != itlast));
678 return length;
679}
680
686
691
694{
695 return fedge_iterator(this->_FEdgeA, this->_FEdgeB);
696}
697
699{
700 return const_fedge_iterator(this->_FEdgeA, this->_FEdgeB);
701}
702
704{
705 return fedge_iterator(this->_FEdgeB, this->_FEdgeB);
706}
707
709{
710 return const_fedge_iterator(this->_FEdgeB, this->_FEdgeB);
711}
712
714{
715 return fedge_iterator(nullptr, this->_FEdgeB);
716}
717
719{
720 return const_fedge_iterator(nullptr, this->_FEdgeB);
721}
722
725{
726 return const_vertex_iterator(this->_FEdgeA->vertexA(), nullptr, _FEdgeA);
727}
728
730{
731 return vertex_iterator(this->_FEdgeA->vertexA(), nullptr, _FEdgeA);
732}
733
735{
736 return const_vertex_iterator(this->_FEdgeB->vertexB(), _FEdgeB, nullptr);
737}
738
740{
741 return vertex_iterator(this->_FEdgeB->vertexB(), _FEdgeB, nullptr);
742}
743
745{
746 return const_vertex_iterator(nullptr, _FEdgeB, nullptr);
747}
748
750{
751 return vertex_iterator(nullptr, _FEdgeB, nullptr);
752}
753
755{
757 this->_FEdgeA->vertexA(), this->_FEdgeA->vertexA(), nullptr, _FEdgeA, 0.0f));
758 return ret;
759}
760
762{
764 nullptr, this->_FEdgeA->vertexA(), _FEdgeB, nullptr, getLength2D()));
765 return ret;
766}
767
769{
770 return verticesBegin();
771}
772
774{
775 return verticesEnd();
776}
777
778/**********************************/
779/* */
780/* */
781/* ViewShape */
782/* */
783/* */
784/**********************************/
785
787{
788 _Vertices.clear();
789
790 if (!_Edges.empty()) {
791 for (vector<ViewEdge *>::iterator e = _Edges.begin(), eend = _Edges.end(); e != eend; e++) {
792 delete (*e);
793 }
794 _Edges.clear();
795 }
796
797 if (_SShape) {
798 delete _SShape;
799 _SShape = nullptr;
800 }
801}
802
804{
805 FEdge *fedge = iViewEdge->fedgeA();
806 for (vector<ViewEdge *>::iterator ve = _Edges.begin(), veend = _Edges.end(); ve != veend; ve++) {
807 if (iViewEdge == (*ve)) {
808 _Edges.erase(ve);
809 _SShape->RemoveEdge(fedge);
810 break;
811 }
812 }
813}
814
816{
817 for (vector<ViewVertex *>::iterator vv = _Vertices.begin(), vvend = _Vertices.end(); vv != vvend;
818 vv++)
819 {
820 if (iViewVertex == (*vv)) {
821 _Vertices.erase(vv);
822 break;
823 }
824 }
825}
826
827/**********************************/
828/* */
829/* */
830/* ViewEdge */
831/* */
832/* */
833/**********************************/
834
836{
837 FEdge *currentEdge = _FEdgeA;
838 do {
839 currentEdge->setViewEdge(this);
840 currentEdge = currentEdge->nextEdge();
841 } while (!ELEM(currentEdge, nullptr, _FEdgeB));
842 // last one
843 _FEdgeB->setViewEdge(this);
844}
845
846} /* 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
SIMD_FORCE_INLINE btScalar length() const
Return the length of the vector.
Definition btVector3.h:257
ViewEdge * viewedge() const
Definition Silhouette.h:658
SShape * shape()
Definition Silhouette.h:636
FEdge * nextEdge()
Definition Silhouette.h:623
Vec3r orientation2d() const
Definition Silhouette.h:910
SVertex * vertexA()
Definition Silhouette.h:597
void setViewEdge(ViewEdge *iViewEdge)
Definition Silhouette.h:766
SVertex * vertexB()
Definition Silhouette.h:603
void setPreviousEdge(FEdge *iEdge)
Definition Silhouette.h:747
id_type getFirst() const
Definition Id.h:64
id_type getSecond() const
Definition Id.h:70
virtual void Replace(ViewEdge *iOld, ViewEdge *iNew)
Definition ViewMap.h:820
void AddIncomingViewEdge(ViewEdge *iVEdge)
Definition ViewMap.cpp:571
virtual ViewVertexInternal::orientedViewEdgeIterator edgesBegin()
Definition ViewMap.cpp:633
virtual edge_iterator edges_iterator(ViewEdge *iEdge)
Definition ViewMap.cpp:608
virtual edge_iterator edges_begin()
Definition ViewMap.cpp:588
void AddOutgoingViewEdge(ViewEdge *iVEdge)
Definition ViewMap.cpp:555
virtual ViewVertexInternal::orientedViewEdgeIterator edgesEnd()
Definition ViewMap.cpp:639
virtual ViewVertexInternal::orientedViewEdgeIterator edgesIterator(ViewEdge *iEdge)
Definition ViewMap.cpp:645
virtual edge_iterator edges_end()
Definition ViewMap.cpp:598
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)
void RemoveEdge(FEdge *iEdge)
ViewVertex * viewvertex()
Definition Silhouette.h:278
virtual Id getId() const
Definition Silhouette.h:119
const Vec3r & point2D() const
Definition Silhouette.h:230
const vector< FEdge * > & fedges()
Definition Silhouette.h:250
void setId(const Id &iId)
Definition ViewMap.h:571
void setBackEdgeA(ViewEdge *iBackEdgeA, bool incoming=true)
Definition ViewMap.cpp:372
virtual edge_iterator edges_iterator(ViewEdge *iEdge)
Definition ViewMap.cpp:459
virtual ViewVertexInternal::orientedViewEdgeIterator edgesIterator(ViewEdge *iEdge)
Definition ViewMap.cpp:532
virtual edge_iterator edges_begin()
Definition ViewMap.cpp:433
void setBackEdgeB(ViewEdge *iBackEdgeB, bool incoming=true)
Definition ViewMap.cpp:391
virtual edge_iterator edges_end()
Definition ViewMap.cpp:445
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:520
virtual ViewVertexInternal::orientedViewEdgeIterator edgesEnd()
Definition ViewMap.cpp:526
value_type x() const
Definition VecMat.h:296
value_type y() const
Definition VecMat.h:306
Vec< T, N > & normalize()
Definition VecMat.h:104
value_type norm() const
Definition VecMat.h:94
const_vertex_iterator vertices_end() const
Definition ViewMap.cpp:744
void setId(const Id &id)
Definition ViewMap.h:1178
virtual Nature::EdgeNature getNature() const
Definition ViewMap.h:910
void setFEdgeB(FEdge *iFEdge)
Definition ViewMap.h:1166
fedge_iterator fedge_iterator_last()
Definition ViewMap.cpp:703
fedge_iterator fedge_iterator_end()
Definition ViewMap.cpp:713
ViewEdgeInternal::edge_iterator_base< Const_traits< ViewEdge * > > const_edge_iterator
Definition ViewMap.h:920
void setA(ViewVertex *iA)
Definition ViewMap.h:1142
virtual Id getId() const
Definition ViewMap.h:904
edge_iterator ViewEdge_iterator()
view edge iterator
Definition ViewMap.cpp:682
ViewEdgeInternal::fedge_iterator_base< Const_traits< FEdge * > > const_fedge_iterator
Definition ViewMap.h:923
ViewShape * viewShape()
Definition ViewMap.h:1087
void setFEdgeA(FEdge *iFEdge)
Definition ViewMap.h:1160
const_vertex_iterator vertices_last() const
Definition ViewMap.cpp:734
virtual Interface0DIterator pointsBegin(float t=0.0f)
Definition ViewMap.cpp:768
ViewEdgeInternal::vertex_iterator_base< Nonconst_traits< SVertex * > > vertex_iterator
Definition ViewMap.h:925
virtual Interface0DIterator pointsEnd(float t=0.0f)
Definition ViewMap.cpp:773
ViewVertex * B()
Definition ViewMap.h:1069
ViewEdgeInternal::edge_iterator_base< Nonconst_traits< ViewEdge * > > edge_iterator
Definition ViewMap.h:919
const_vertex_iterator vertices_begin() const
embedding vertex iterator
Definition ViewMap.cpp:724
fedge_iterator fedge_iterator_begin()
feature edge iterator
Definition ViewMap.cpp:693
real getLength2D() const
Definition ViewMap.cpp:667
virtual Interface0DIterator verticesBegin()
Definition ViewMap.cpp:754
ViewEdgeInternal::vertex_iterator_base< Const_traits< SVertex * > > const_vertex_iterator
Definition ViewMap.h:926
virtual Interface0DIterator verticesEnd()
Definition ViewMap.cpp:761
void setNature(Nature::EdgeNature iNature)
Definition ViewMap.h:1154
ViewVertex * A()
Definition ViewMap.h:1063
ViewEdgeInternal::fedge_iterator_base< Nonconst_traits< FEdge * > > fedge_iterator
Definition ViewMap.h:922
void setB(ViewVertex *iB)
Definition ViewMap.h:1148
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:174
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:169
virtual ~ViewMap()
Definition ViewMap.cpp:32
ViewVertex * InsertViewVertex(SVertex *iVertex, vector< ViewEdge * > &newViewEdges)
Definition ViewMap.cpp:182
void AddViewVertex(ViewVertex *iVVertex)
Definition ViewMap.h:164
void AddVertex(ViewVertex *iVertex)
Definition ViewMap.h:1600
void RemoveVertex(ViewVertex *iViewVertex)
Definition ViewMap.cpp:815
void RemoveEdge(ViewEdge *iViewEdge)
Definition ViewMap.cpp:803
SShape * sshape()
Definition ViewMap.h:1539
ViewVertexInternal::edge_iterator_base< ViewVertexInternal::edge_const_traits > const_edge_iterator
Definition ViewMap.h:274
pair< ViewEdge *, bool > directedViewEdge
Definition ViewMap.h:267
ViewVertexInternal::edge_iterator_base< ViewVertexInternal::edge_nonconst_traits > edge_iterator
Definition ViewMap.h:272
#define B
real distPointSegment(const T &P, const T &A, const T &B)
Definition GeomUtils.h:32
VecMat::Vec2< real > Vec2r
Definition Geom.h:24
inherits from class Rep
Definition AppCanvas.cpp:20
static bool ViewEdgeComp(ViewVertex::directedViewEdge &dve1, ViewVertex::directedViewEdge &dve2)
Definition ViewMap.cpp:296
double real
Definition Precision.h:14
return ret