Blender  V2.93
ViewMap.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 <cfloat>
23 
24 #include "ViewMap.h"
26 #include "ViewMapIterators.h"
27 
28 #include "../geometry/GeomUtils.h"
29 
30 namespace Freestyle {
31 
32 /**********************************/
33 /* */
34 /* */
35 /* ViewMap */
36 /* */
37 /* */
38 /**********************************/
39 
40 ViewMap *ViewMap::_pInstance = nullptr;
41 
43 {
44  // The view vertices must be deleted here as some of them are shared between two shapes:
45  for (vector<ViewVertex *>::iterator vv = _VVertices.begin(), vvend = _VVertices.end();
46  vv != vvend;
47  vv++) {
48  delete (*vv);
49  }
50  _VVertices.clear();
51 
52  for (vector<ViewShape *>::iterator vs = _VShapes.begin(), vsend = _VShapes.end(); vs != vsend;
53  vs++) {
54  delete (*vs);
55  }
56  _VShapes.clear();
57 
58  _FEdges.clear();
59  _SVertices.clear();
60  _VEdges.clear();
61 }
62 
64 {
65  vector<FEdge *> tmpEdges;
66 
67  for (vector<ViewShape *>::iterator vs = _VShapes.begin(), vsend = _VShapes.end(); vs != vsend;
68  vs++) {
69  vector<FEdge *> &edges = (*vs)->sshape()->getEdgeList();
70  for (vector<FEdge *>::iterator it = edges.begin(), itend = edges.end(); it != itend; it++) {
71  if ((*it)->isTemporary()) {
72  (*it)->setTemporary(false); // avoid being counted multiple times
73  tmpEdges.push_back(*it);
74  }
75  }
76  }
77 
78  for (vector<FEdge *>::iterator it = tmpEdges.begin(), itend = tmpEdges.end(); it != itend;
79  it++) {
80  for (vector<ViewShape *>::iterator vs = _VShapes.begin(), vsend = _VShapes.end(); vs != vsend;
81  vs++) {
82  (*vs)->sshape()->RemoveEdge(*it);
83  }
84  (*it)->vertexA()->RemoveFEdge(*it);
85  (*it)->vertexB()->RemoveFEdge(*it);
86  delete (*it);
87  }
88 }
89 
91 {
92  int index = _shapeIdToIndex[id];
93  return _VShapes[index];
94 }
95 
97 {
98  _shapeIdToIndex[iVShape->getId().getFirst()] = _VShapes.size();
99  _VShapes.push_back(iVShape);
100 }
101 
103 {
104  // find the closest of this candidates:
105  real minDist = DBL_MAX;
106  FEdge *winner = nullptr;
107  for (fedges_container::const_iterator fe = _FEdges.begin(), feend = _FEdges.end(); fe != feend;
108  fe++) {
109  Vec2d A((*fe)->vertexA()->point2D()[0], (*fe)->vertexA()->point2D()[1]);
110  Vec2d B((*fe)->vertexB()->point2D()[0], (*fe)->vertexB()->point2D()[1]);
111  real dist = GeomUtils::distPointSegment<Vec2r>(Vec2r(x, y), A, B);
112  if (dist < minDist) {
113  minDist = dist;
114  winner = (*fe);
115  }
116  }
117 
118  return winner;
119 }
120 
122 {
123  // find the closest of this candidates:
124  real minDist = DBL_MAX;
125  FEdge *winner = nullptr;
126  for (fedges_container::const_iterator fe = _FEdges.begin(), feend = _FEdges.end(); fe != feend;
127  fe++) {
128  Vec2d A((*fe)->vertexA()->point2D()[0], (*fe)->vertexA()->point2D()[1]);
129  Vec2d B((*fe)->vertexB()->point2D()[0], (*fe)->vertexB()->point2D()[1]);
130  real dist = GeomUtils::distPointSegment<Vec2r>(Vec2r(x, y), A, B);
131  if (dist < minDist) {
132  minDist = dist;
133  winner = (*fe);
134  }
135  }
136  if (!winner) {
137  return nullptr;
138  }
139 
140  return winner->viewedge();
141 }
142 
144  const Vec3r &iA2D,
145  FEdge *iFEdgeA,
146  const Vec3r &iB3D,
147  const Vec3r &iB2D,
148  FEdge *iFEdgeB,
149  const Id &id)
150 {
151  ViewShape *vshapeA = iFEdgeA->viewedge()->viewShape();
152  SShape *shapeA = iFEdgeA->shape();
153  ViewShape *vshapeB = iFEdgeB->viewedge()->viewShape();
154  SShape *shapeB = iFEdgeB->shape();
155 
156  SVertex *Ia = shapeA->CreateSVertex(iA3D, iA2D, iFEdgeA->vertexA()->getId());
157  SVertex *Ib = shapeB->CreateSVertex(iB3D, iB2D, iFEdgeB->vertexA()->getId());
158 
159  // depending on which of these 2 svertices is the nearest from the viewpoint, we're going to
160  // build the TVertex by giving them in an order or another (the first one must be the nearest)
161  real dista = Ia->point2D()[2];
162  real distb = Ib->point2D()[2];
163 
164  TVertex *tvertex;
165  if (dista < distb) {
166  tvertex = new TVertex(Ia, Ib);
167  }
168  else {
169  tvertex = new TVertex(Ib, Ia);
170  }
171 
172  tvertex->setId(id);
173 
174  // add these vertices to the view map
175  AddViewVertex(tvertex);
176  AddSVertex(Ia);
177  AddSVertex(Ib);
178 
179  // and this T Vertex to the view shapes:
180  vshapeA->AddVertex(tvertex);
181  vshapeB->AddVertex(tvertex);
182 
183  return tvertex;
184 }
185 
186 ViewVertex *ViewMap::InsertViewVertex(SVertex *iVertex, vector<ViewEdge *> &newViewEdges)
187 {
188  NonTVertex *vva = dynamic_cast<NonTVertex *>(iVertex->viewvertex());
189  if (vva) {
190  return vva;
191  }
192  // because it is not already a ViewVertex, this SVertex must have only 2 FEdges. The incoming one
193  // still belongs to ioEdge, the outgoing one now belongs to newVEdge
194  const vector<FEdge *> &fedges = iVertex->fedges();
195  if (fedges.size() != 2) {
196  cerr << "ViewMap warning: Can't split the ViewEdge" << endl;
197  return nullptr;
198  }
199  FEdge *fend(nullptr), *fbegin(nullptr);
200  for (vector<FEdge *>::const_iterator fe = fedges.begin(), feend = fedges.end(); fe != feend;
201  ++fe) {
202  if ((*fe)->vertexB() == iVertex) {
203  fend = (*fe);
204  }
205  if ((*fe)->vertexA() == iVertex) {
206  fbegin = (*fe);
207  }
208  if ((fbegin != nullptr) && (fend != nullptr)) {
209  break;
210  }
211  }
212  ViewEdge *ioEdge = fbegin->viewedge();
213  ViewShape *vshape = ioEdge->viewShape();
214  vva = new NonTVertex(iVertex);
215  // if the ViewEdge is a closed loop, we don't create a new VEdge
216  if (ioEdge->A() == nullptr) {
217  // closed loop
218  ioEdge->setA(vva);
219  ioEdge->setB(vva);
220  // update sshape
221  vshape->sshape()->RemoveEdgeFromChain(ioEdge->fedgeA());
222  vshape->sshape()->RemoveEdgeFromChain(ioEdge->fedgeB());
223 
224  ioEdge->setFEdgeA(fbegin);
225  ioEdge->setFEdgeB(fend);
226 
227  // Update FEdges
228  fend->setNextEdge(nullptr);
229  fbegin->setPreviousEdge(nullptr);
230 
231  // update new View Vertex:
232  vva->AddOutgoingViewEdge(ioEdge);
233  vva->AddIncomingViewEdge(ioEdge);
234 
235  vshape->sshape()->AddChain(ioEdge->fedgeA());
236  vshape->sshape()->AddChain(ioEdge->fedgeB());
237  }
238  else {
239  // Create new ViewEdge
240  ViewEdge *newVEdge = new ViewEdge(vva, ioEdge->B(), fbegin, ioEdge->fedgeB(), vshape);
241  newVEdge->setId(Id(ioEdge->getId().getFirst(), ioEdge->getId().getSecond() + 1));
242  newVEdge->setNature(ioEdge->getNature());
243  // newVEdge->UpdateFEdges(); // done in the ViewEdge constructor
244  // Update old ViewEdge
245  ioEdge->setB(vva);
246  ioEdge->setFEdgeB(fend);
247 
248  // Update FEdges
249  fend->setNextEdge(nullptr);
250  fbegin->setPreviousEdge(nullptr);
251 
252  // update new View Vertex:
253  vva->AddOutgoingViewEdge(newVEdge);
254  vva->AddIncomingViewEdge(ioEdge);
255 
256  NonTVertex *vvb = dynamic_cast<NonTVertex *>(newVEdge->B());
257  if (vvb) {
258  vvb->Replace(ioEdge, newVEdge);
259  }
260 
261  // update ViewShape
262  // vshape->AddEdge(newVEdge);
263  // update SShape
264  vshape->sshape()->AddChain(fbegin);
265  // update ViewMap
266  //_VEdges.push_back(newVEdge);
267  newViewEdges.push_back(newVEdge);
268  }
269 
270  // update ViewShape
271  vshape->AddVertex(vva);
272 
273  // update ViewMap
274  _VVertices.push_back(vva);
275 
276  return vva;
277 }
278 
279 #if 0
280 FEdge *ViewMap::Connect(FEdge *ioEdge, SVertex *ioVertex, vector<ViewEdge *> &oNewVEdges)
281 {
282  SShape *sshape = ioEdge->shape();
283  FEdge *newFEdge = sshape->SplitEdgeIn2(ioEdge, ioVertex);
284  AddFEdge(newFEdge);
285  InsertViewVertex(ioVertex, oNewVEdges);
286  return newFEdge;
287 }
288 #endif
289 
290 /**********************************/
291 /* */
292 /* */
293 /* TVertex */
294 /* */
295 /* */
296 /**********************************/
297 
298 // is dve1 before dve2 ? (does it have a smaller angle ?)
300 {
301  FEdge *fe1;
302  if (dve1.second) {
303  fe1 = dve1.first->fedgeB();
304  }
305  else {
306  fe1 = dve1.first->fedgeA();
307  }
308  FEdge *fe2;
309  if (dve2.second) {
310  fe2 = dve2.first->fedgeB();
311  }
312  else {
313  fe2 = dve2.first->fedgeA();
314  }
315 
316  Vec3r V1 = fe1->orientation2d();
317  Vec2r v1(V1.x(), V1.y());
318  v1.normalize();
319  Vec3r V2 = fe2->orientation2d();
320  Vec2r v2(V2.x(), V2.y());
321  v2.normalize();
322  if (v1.y() > 0) {
323  if (v2.y() < 0) {
324  return true;
325  }
326 
327  return (v1.x() > v2.x());
328  }
329 
330  if (v2.y() > 0) {
331  return false;
332  }
333 
334  return (v1.x() < v2.x());
335 }
336 
337 void TVertex::setFrontEdgeA(ViewEdge *iFrontEdgeA, bool incoming)
338 {
339  if (!iFrontEdgeA) {
340  cerr << "Warning: null pointer passed as argument of TVertex::setFrontEdgeA()" << endl;
341  return;
342  }
343  _FrontEdgeA = directedViewEdge(iFrontEdgeA, incoming);
344  if (!_sortedEdges.empty()) {
345  edge_pointers_container::iterator dve = _sortedEdges.begin(), dveend = _sortedEdges.end();
346  for (; (dve != dveend) && ViewEdgeComp(**dve, _FrontEdgeA); ++dve) {
347  /* pass */
348  }
349  _sortedEdges.insert(dve, &_FrontEdgeA);
350  }
351  else {
352  _sortedEdges.push_back(&_FrontEdgeA);
353  }
354 }
355 
356 void TVertex::setFrontEdgeB(ViewEdge *iFrontEdgeB, bool incoming)
357 {
358  if (!iFrontEdgeB) {
359  cerr << "Warning: null pointer passed as argument of TVertex::setFrontEdgeB()" << endl;
360  return;
361  }
362  _FrontEdgeB = directedViewEdge(iFrontEdgeB, incoming);
363  if (!_sortedEdges.empty()) {
364  edge_pointers_container::iterator dve = _sortedEdges.begin(), dveend = _sortedEdges.end();
365  for (; (dve != dveend) && ViewEdgeComp(**dve, _FrontEdgeB); ++dve) {
366  /* pass */
367  }
368  _sortedEdges.insert(dve, &_FrontEdgeB);
369  }
370  else {
371  _sortedEdges.push_back(&_FrontEdgeB);
372  }
373 }
374 
375 void TVertex::setBackEdgeA(ViewEdge *iBackEdgeA, bool incoming)
376 {
377  if (!iBackEdgeA) {
378  cerr << "Warning: null pointer passed as argument of TVertex::setBackEdgeA()" << endl;
379  return;
380  }
381  _BackEdgeA = directedViewEdge(iBackEdgeA, incoming);
382  if (!_sortedEdges.empty()) {
383  edge_pointers_container::iterator dve = _sortedEdges.begin(), dveend = _sortedEdges.end();
384  for (; (dve != dveend) && ViewEdgeComp(**dve, _BackEdgeA); ++dve) {
385  /* pass */
386  }
387  _sortedEdges.insert(dve, &_BackEdgeA);
388  }
389  else {
390  _sortedEdges.push_back(&_BackEdgeA);
391  }
392 }
393 
394 void TVertex::setBackEdgeB(ViewEdge *iBackEdgeB, bool incoming)
395 {
396  if (!iBackEdgeB) {
397  cerr << "Warning: null pointer passed as argument of TVertex::setBackEdgeB()" << endl;
398  return;
399  }
400  _BackEdgeB = directedViewEdge(iBackEdgeB, incoming);
401  if (!_sortedEdges.empty()) {
402  edge_pointers_container::iterator dve = _sortedEdges.begin(), dveend = _sortedEdges.end();
403  for (; (dve != dveend) && ViewEdgeComp(**dve, _BackEdgeB); ++dve) {
404  /* pass */
405  }
406  _sortedEdges.insert(dve, &_BackEdgeB);
407  }
408  else {
409  _sortedEdges.push_back(&_BackEdgeB);
410  }
411 }
412 
414 {
415  // theoritically, we only replace edges for which this
416  // view vertex is the B vertex
417  if ((iOld == _FrontEdgeA.first) && (_FrontEdgeA.first->B() == this)) {
418  _FrontEdgeA.first = iNew;
419  return;
420  }
421  if ((iOld == _FrontEdgeB.first) && (_FrontEdgeB.first->B() == this)) {
422  _FrontEdgeB.first = iNew;
423  return;
424  }
425  if ((iOld == _BackEdgeA.first) && (_BackEdgeA.first->B() == this)) {
426  _BackEdgeA.first = iNew;
427  return;
428  }
429  if ((iOld == _BackEdgeB.first) && (_BackEdgeB.first->B() == this)) {
430  _BackEdgeB.first = iNew;
431  return;
432  }
433 }
434 
437 {
438  // return edge_iterator(_FrontEdgeA, _FrontEdgeB, _BackEdgeA, _BackEdgeB, _FrontEdgeA);
439  return edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.begin());
440 }
441 
443 {
444  // return const_edge_iterator(_FrontEdgeA, _FrontEdgeB, _BackEdgeA, _BackEdgeB, _FrontEdgeA);
445  return const_edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.begin());
446 }
447 
449 {
450  // return edge_iterator(_FrontEdgeA, _FrontEdgeB, _BackEdgeA, _BackEdgeB,
451  // directedViewEdge(0,true));
452  return edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.end());
453 }
454 
456 {
457  // return const_edge_iterator(_FrontEdgeA, _FrontEdgeB, _BackEdgeA, _BackEdgeB,
458  // directedViewEdge(0, true));
459  return const_edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.end());
460 }
461 
463 {
464  for (edge_pointers_container::iterator it = _sortedEdges.begin(), itend = _sortedEdges.end();
465  it != itend;
466  it++) {
467  if ((*it)->first == iEdge) {
468  return edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), it);
469  }
470  }
471  return edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.begin());
472 
473 #if 0
474  directedViewEdge dEdge;
475  if (_FrontEdgeA.first == iEdge) {
476  dEdge = _FrontEdgeA;
477  }
478  else if (_FrontEdgeB.first == iEdge) {
479  dEdge = _FrontEdgeB;
480  }
481  else if (_BackEdgeA.first == iEdge) {
482  dEdge = _BackEdgeA;
483  }
484  else if (_BackEdgeB.first == iEdge) {
485  dEdge = _BackEdgeB;
486  }
487  return edge_iterator(_FrontEdgeA, _FrontEdgeB, _BackEdgeA, _BackEdgeB, dEdge);
488 #endif
489 }
490 
492 {
493  for (edge_pointers_container::const_iterator it = _sortedEdges.begin(),
494  itend = _sortedEdges.end();
495  it != itend;
496  it++) {
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  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  if ((it)->first == iEdge) {
613  return edge_iterator(_ViewEdges.begin(), _ViewEdges.end(), it);
614  }
615  }
616  return edge_iterator(_ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.begin());
617 }
618 
620 {
621  for (edges_container::const_iterator it = _ViewEdges.begin(), itend = _ViewEdges.end();
622  it != itend;
623  it++) {
624  if ((it)->first == iEdge) {
625  return const_edge_iterator(_ViewEdges.begin(), _ViewEdges.end(), it);
626  }
627  }
628  return const_edge_iterator(_ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.begin());
629 }
630 
632 {
634  _ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.begin());
635 }
636 
638 {
640  _ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.end());
641 }
642 
644 {
645  for (edges_container::iterator it = _ViewEdges.begin(), itend = _ViewEdges.end(); it != itend;
646  it++) {
647  if ((it)->first == iEdge) {
649  _ViewEdges.begin(), _ViewEdges.end(), it);
650  }
651  }
653  _ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.begin());
654 }
655 
656 /**********************************/
657 /* */
658 /* */
659 /* ViewEdge */
660 /* */
661 /* */
662 /**********************************/
663 
665 {
666  float length = 0.0f;
669  Vec2r seg;
670  do {
671  seg = Vec2r((*it)->orientation2d()[0], (*it)->orientation2d()[1]);
672  length += seg.norm();
673  ++it;
674  } while ((it != itend) && (it != itlast));
675  return length;
676 }
677 
680 {
681  return edge_iterator(this);
682 }
683 
685 {
686  return const_edge_iterator((ViewEdge *)this);
687 }
688 
691 {
692  return fedge_iterator(this->_FEdgeA, this->_FEdgeB);
693 }
694 
696 {
697  return const_fedge_iterator(this->_FEdgeA, this->_FEdgeB);
698 }
699 
701 {
702  return fedge_iterator(this->_FEdgeB, this->_FEdgeB);
703 }
704 
706 {
707  return const_fedge_iterator(this->_FEdgeB, this->_FEdgeB);
708 }
709 
711 {
712  return fedge_iterator(nullptr, this->_FEdgeB);
713 }
714 
716 {
717  return const_fedge_iterator(nullptr, this->_FEdgeB);
718 }
719 
722 {
723  return const_vertex_iterator(this->_FEdgeA->vertexA(), nullptr, _FEdgeA);
724 }
725 
727 {
728  return vertex_iterator(this->_FEdgeA->vertexA(), nullptr, _FEdgeA);
729 }
730 
732 {
733  return const_vertex_iterator(this->_FEdgeB->vertexB(), _FEdgeB, nullptr);
734 }
735 
737 {
738  return vertex_iterator(this->_FEdgeB->vertexB(), _FEdgeB, nullptr);
739 }
740 
742 {
743  return const_vertex_iterator(nullptr, _FEdgeB, nullptr);
744 }
745 
747 {
748  return vertex_iterator(nullptr, _FEdgeB, nullptr);
749 }
750 
752 {
754  this->_FEdgeA->vertexA(), this->_FEdgeA->vertexA(), nullptr, _FEdgeA, 0.0f));
755  return ret;
756 }
757 
759 {
761  nullptr, this->_FEdgeA->vertexA(), _FEdgeB, nullptr, getLength2D()));
762  return ret;
763 }
764 
766 {
767  return verticesBegin();
768 }
769 
771 {
772  return verticesEnd();
773 }
774 
775 /**********************************/
776 /* */
777 /* */
778 /* ViewShape */
779 /* */
780 /* */
781 /**********************************/
782 
784 {
785  _Vertices.clear();
786 
787  if (!(_Edges.empty())) {
788  for (vector<ViewEdge *>::iterator e = _Edges.begin(), eend = _Edges.end(); e != eend; e++) {
789  delete (*e);
790  }
791  _Edges.clear();
792  }
793 
794  if (_SShape) {
795  delete _SShape;
796  _SShape = nullptr;
797  }
798 }
799 
801 {
802  FEdge *fedge = iViewEdge->fedgeA();
803  for (vector<ViewEdge *>::iterator ve = _Edges.begin(), veend = _Edges.end(); ve != veend; ve++) {
804  if (iViewEdge == (*ve)) {
805  _Edges.erase(ve);
806  _SShape->RemoveEdge(fedge);
807  break;
808  }
809  }
810 }
811 
813 {
814  for (vector<ViewVertex *>::iterator vv = _Vertices.begin(), vvend = _Vertices.end(); vv != vvend;
815  vv++) {
816  if (iViewVertex == (*vv)) {
817  _Vertices.erase(vv);
818  break;
819  }
820  }
821 }
822 
823 /**********************************/
824 /* */
825 /* */
826 /* ViewEdge */
827 /* */
828 /* */
829 /**********************************/
830 
832 {
833  FEdge *currentEdge = _FEdgeA;
834  do {
835  currentEdge->setViewEdge(this);
836  currentEdge = currentEdge->nextEdge();
837  } while (!ELEM(currentEdge, NULL, _FEdgeB));
838  // last one
839  _FEdgeB->setViewEdge(this);
840 }
841 
842 } /* namespace Freestyle */
#define ELEM(...)
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint y
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble v1
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 btQuaternion &q)
Return the length of a quaternion.
Definition: btQuaternion.h:895
SVertex * vertexA()
Definition: Silhouette.h:611
ViewEdge * viewedge() const
Definition: Silhouette.h:672
Vec3r orientation2d() const
Definition: Silhouette.h:926
void setViewEdge(ViewEdge *iViewEdge)
Definition: Silhouette.h:780
SVertex * vertexB()
Definition: Silhouette.h:617
SShape * shape()
Definition: Silhouette.h:650
void setPreviousEdge(FEdge *iEdge)
Definition: Silhouette.h:761
FEdge * nextEdge()
Definition: Silhouette.h:637
id_type getFirst() const
Definition: Id.h:76
id_type getSecond() const
Definition: Id.h:82
virtual void Replace(ViewEdge *iOld, ViewEdge *iNew)
Definition: ViewMap.h:835
void AddIncomingViewEdge(ViewEdge *iVEdge)
Definition: ViewMap.cpp:571
virtual ViewVertexInternal::orientedViewEdgeIterator edgesBegin()
Definition: ViewMap.cpp:631
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:637
virtual ViewVertexInternal::orientedViewEdgeIterator edgesIterator(ViewEdge *iEdge)
Definition: ViewMap.cpp:643
virtual edge_iterator edges_end()
Definition: ViewMap.cpp:598
void RemoveEdgeFromChain(FEdge *iEdge)
Definition: Silhouette.h:1833
SVertex * CreateSVertex(const Vec3r &P3D, const Vec3r &P2D, const Id &id)
Definition: Silhouette.h:1584
void AddChain(FEdge *iEdge)
Definition: Silhouette.h:1579
FEdge * SplitEdgeIn2(FEdge *ioEdge, SVertex *ioNewVertex)
Definition: Silhouette.h:1709
void RemoveEdge(FEdge *iEdge)
Definition: Silhouette.h:1844
const vector< FEdge * > & fedges()
Definition: Silhouette.h:262
ViewVertex * viewvertex()
Definition: Silhouette.h:290
virtual Id getId() const
Definition: Silhouette.h:131
const Vec3r & point2D() const
Definition: Silhouette.h:242
void setId(const Id &iId)
Definition: ViewMap.h:584
void setBackEdgeA(ViewEdge *iBackEdgeA, bool incoming=true)
Definition: ViewMap.cpp:375
virtual edge_iterator edges_iterator(ViewEdge *iEdge)
Definition: ViewMap.cpp:462
virtual ViewVertexInternal::orientedViewEdgeIterator edgesIterator(ViewEdge *iEdge)
Definition: ViewMap.cpp:533
virtual edge_iterator edges_begin()
Definition: ViewMap.cpp:436
void setBackEdgeB(ViewEdge *iBackEdgeB, bool incoming=true)
Definition: ViewMap.cpp:394
virtual edge_iterator edges_end()
Definition: ViewMap.cpp:448
void setFrontEdgeB(ViewEdge *iFrontEdgeB, bool incoming=true)
Definition: ViewMap.cpp:356
virtual void Replace(ViewEdge *iOld, ViewEdge *iNew)
Definition: ViewMap.cpp:413
void setFrontEdgeA(ViewEdge *iFrontEdgeA, bool incoming=true)
Definition: ViewMap.cpp:337
virtual ViewVertexInternal::orientedViewEdgeIterator edgesBegin()
Definition: ViewMap.cpp:521
virtual ViewVertexInternal::orientedViewEdgeIterator edgesEnd()
Definition: ViewMap.cpp:527
value_type x() const
Definition: VecMat.h:532
value_type y() const
Definition: VecMat.h:542
value_type norm() const
Definition: VecMat.h:109
const_vertex_iterator vertices_end() const
Definition: ViewMap.cpp:741
ViewShape * viewShape()
Definition: ViewMap.h:1101
FEdge * fedgeB()
Definition: ViewMap.h:1095
void setId(const Id &id)
Definition: ViewMap.h:1192
virtual Nature::EdgeNature getNature() const
Definition: ViewMap.h:924
FEdge * fedgeA()
Definition: ViewMap.h:1089
ViewVertex * B()
Definition: ViewMap.h:1083
void setFEdgeB(FEdge *iFEdge)
Definition: ViewMap.h:1180
fedge_iterator fedge_iterator_last()
Definition: ViewMap.cpp:700
fedge_iterator fedge_iterator_end()
Definition: ViewMap.cpp:710
ViewEdgeInternal::edge_iterator_base< Const_traits< ViewEdge * > > const_edge_iterator
Definition: ViewMap.h:934
void setA(ViewVertex *iA)
Definition: ViewMap.h:1156
virtual Id getId() const
Definition: ViewMap.h:918
edge_iterator ViewEdge_iterator()
view edge iterator
Definition: ViewMap.cpp:679
ViewEdgeInternal::fedge_iterator_base< Const_traits< FEdge * > > const_fedge_iterator
Definition: ViewMap.h:937
void setFEdgeA(FEdge *iFEdge)
Definition: ViewMap.h:1174
const_vertex_iterator vertices_last() const
Definition: ViewMap.cpp:731
virtual Interface0DIterator pointsBegin(float t=0.0f)
Definition: ViewMap.cpp:765
ViewVertex * A()
Definition: ViewMap.h:1077
ViewEdgeInternal::vertex_iterator_base< Nonconst_traits< SVertex * > > vertex_iterator
Definition: ViewMap.h:939
virtual Interface0DIterator pointsEnd(float t=0.0f)
Definition: ViewMap.cpp:770
ViewEdgeInternal::edge_iterator_base< Nonconst_traits< ViewEdge * > > edge_iterator
Definition: ViewMap.h:933
const_vertex_iterator vertices_begin() const
embedding vertex iterator
Definition: ViewMap.cpp:721
fedge_iterator fedge_iterator_begin()
feature edge iterator
Definition: ViewMap.cpp:690
real getLength2D() const
Definition: ViewMap.cpp:664
virtual Interface0DIterator verticesBegin()
Definition: ViewMap.cpp:751
ViewEdgeInternal::vertex_iterator_base< Const_traits< SVertex * > > const_vertex_iterator
Definition: ViewMap.h:940
virtual Interface0DIterator verticesEnd()
Definition: ViewMap.cpp:758
void setNature(Nature::EdgeNature iNature)
Definition: ViewMap.h:1168
ViewEdgeInternal::fedge_iterator_base< Nonconst_traits< FEdge * > > fedge_iterator
Definition: ViewMap.h:936
void setB(ViewVertex *iB)
Definition: ViewMap.h:1162
ViewShape * viewShape(unsigned id)
Definition: ViewMap.cpp:90
const FEdge * getClosestFEdge(real x, real y) const
Definition: ViewMap.cpp:102
void AddViewShape(ViewShape *iVShape)
Definition: ViewMap.cpp:96
const ViewEdge * getClosestViewEdge(real x, real y) const
Definition: ViewMap.cpp:121
void AddSVertex(SVertex *iSVertex)
Definition: ViewMap.h:187
virtual void Clean()
Definition: ViewMap.cpp:63
TVertex * CreateTVertex(const Vec3r &iA3D, const Vec3r &iA2D, FEdge *iFEdgeA, const Vec3r &iB3D, const Vec3r &iB2D, FEdge *iFEdgeB, const Id &id)
Definition: ViewMap.cpp:143
void AddFEdge(FEdge *iFEdge)
Definition: ViewMap.h:182
virtual ~ViewMap()
Definition: ViewMap.cpp:42
ViewVertex * InsertViewVertex(SVertex *iVertex, vector< ViewEdge * > &newViewEdges)
Definition: ViewMap.cpp:186
void AddViewVertex(ViewVertex *iVVertex)
Definition: ViewMap.h:177
SShape * sshape()
Definition: ViewMap.h:1549
void AddVertex(ViewVertex *iVertex)
Definition: ViewMap.h:1610
void RemoveVertex(ViewVertex *iViewVertex)
Definition: ViewMap.cpp:812
void RemoveEdge(ViewEdge *iViewEdge)
Definition: ViewMap.cpp:800
Id getId() const
Definition: ViewMap.h:1573
virtual ~ViewShape()
Definition: ViewMap.cpp:783
ViewVertexInternal::edge_iterator_base< ViewVertexInternal::edge_const_traits > const_edge_iterator
Definition: ViewMap.h:287
pair< ViewEdge *, bool > directedViewEdge
Definition: ViewMap.h:280
ViewVertexInternal::edge_iterator_base< ViewVertexInternal::edge_nonconst_traits > edge_iterator
Definition: ViewMap.h:285
#define B
VecMat::Vec2< real > Vec2r
Definition: Geom.h:36
inherits from class Rep
Definition: AppCanvas.cpp:32
static bool ViewEdgeComp(ViewVertex::directedViewEdge &dve1, ViewVertex::directedViewEdge &dve2)
Definition: ViewMap.cpp:299
static unsigned x[3]
Definition: RandGen.cpp:87
double real
Definition: Precision.h:26
return ret