Blender V5.0
ViewMap.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 <map>
13
14#include "Interface0D.h"
15#include "Interface1D.h"
16#include "Silhouette.h" // defines the embedding
17
19
22
23#include "MEM_guardedalloc.h"
24
25namespace Freestyle {
26
27/**********************************/
28/* */
29/* */
30/* ViewMap */
31/* */
32/* */
33/**********************************/
34
35class ViewVertex;
36class ViewEdge;
37class ViewShape;
38class TVertex;
39
45class ViewMap {
46 public:
47 typedef vector<ViewEdge *> viewedges_container;
48 typedef vector<ViewVertex *> viewvertices_container;
49 typedef vector<ViewShape *> viewshapes_container;
50 typedef vector<SVertex *> svertices_container;
51 typedef vector<FEdge *> fedges_container;
52 typedef map<int, int> id_to_index_map;
53
54 private:
55 static ViewMap *_pInstance;
56 viewshapes_container _VShapes; // view shapes
57 viewedges_container _VEdges; // view edges
58 viewvertices_container _VVertices; // view vertices
59 fedges_container _FEdges; // feature edges (embedded edges)
60 svertices_container _SVertices; // embedded vertices
61 BBox<Vec3r> _scene3DBBox;
62 // Mapping between the WShape or VShape id to the VShape index in the _VShapes vector. Used in
63 // the method viewShape(int id) to access a shape from its id.
64 id_to_index_map _shapeIdToIndex;
65
66 public:
70 void *userdata;
71
74 {
75 _pInstance = this;
76 userdata = nullptr;
77 }
78
80 virtual ~ViewMap();
81
83 const ViewEdge *getClosestViewEdge(real x, real y) const;
84
86 const FEdge *getClosestFEdge(real x, real y) const;
87
88 /* accessors */
90 static inline ViewMap *getInstance()
91 {
92 return _pInstance;
93 }
94
95 /* Returns the list of ViewShapes of the scene. */
97 {
98 return _VShapes;
99 }
100
101 /* Returns the list of ViewEdges of the scene. */
103 {
104 return _VEdges;
105 }
106
107 /* Returns the list of ViewVertices of the scene. */
109 {
110 return _VVertices;
111 }
112
113 /* Returns the list of FEdges of the scene. */
115 {
116 return _FEdges;
117 }
118
119 /* Returns the list of SVertices of the scene. */
121 {
122 return _SVertices;
123 }
124
125 /* Returns an iterator pointing onto the first ViewEdge of the list. */
126 inline viewedges_container::iterator viewedges_begin()
127 {
128 return _VEdges.begin();
129 }
130
131 inline viewedges_container::iterator viewedges_end()
132 {
133 return _VEdges.end();
134 }
135
136 inline int viewedges_size()
137 {
138 return _VEdges.size();
139 }
140
142
144 {
145 return _shapeIdToIndex;
146 }
147
150 {
151 return _scene3DBBox;
152 }
153
154 /* modifiers */
155 void AddViewShape(ViewShape *iVShape);
156
157 inline void AddViewEdge(ViewEdge *iVEdge)
158 {
159 _VEdges.push_back(iVEdge);
160 }
161
162 inline void AddViewVertex(ViewVertex *iVVertex)
163 {
164 _VVertices.push_back(iVVertex);
165 }
166
167 inline void AddFEdge(FEdge *iFEdge)
168 {
169 _FEdges.push_back(iFEdge);
170 }
171
172 inline void AddSVertex(SVertex *iSVertex)
173 {
174 _SVertices.push_back(iSVertex);
175 }
176
178 inline void setScene3dBBox(const BBox<Vec3r> &bbox)
179 {
180 _scene3DBBox = bbox;
181 }
182
183 /* Creates a T vertex in the view map.
184 * A T vertex is the intersection between 2 FEdges (before these are split).
185 * The TVertex is a 2D intersection but it corresponds to a 3D point on each of the 2 FEdges.
186 * iA3D
187 * The 3D coordinates of the point corresponding to the intersection on the first edge.
188 * iA2D
189 * The x,y,z 2D coordinates of the projection of iA3D
190 * iFEdgeA
191 * The first FEdge
192 * iB3D
193 * The 3D coordinates of the point corresponding to the intersection on the second edge.
194 * iB2D
195 * The x,y,z 2D coordinates of the projection of iB3D
196 * iFEdgeB
197 * The second FEdge
198 * id
199 * The id that must be given to that TVertex
200 */
201 TVertex *CreateTVertex(const Vec3r &iA3D,
202 const Vec3r &iA2D,
203 FEdge *iFEdgeA,
204 const Vec3r &iB3D,
205 const Vec3r &iB2D,
206 FEdge *iFEdgeB,
207 const Id &id);
208
209 /* Updates the structures to take into account the fact that a SVertex must now be considered as
210 * a ViewVertex iVertex The SVertex on top of which the ViewVertex is built (it is necessarily a
211 * NonTVertex because it is a SVertex) newViewEdges The new ViewEdges that must be add to the
212 * ViewMap
213 */
214 ViewVertex *InsertViewVertex(SVertex *iVertex, vector<ViewEdge *> &newViewEdges);
215
216 /* connects a FEdge to the graph through a SVertex */
217 // FEdge *Connect(FEdge *ioEdge, SVertex *ioVertex);
218
219 /* Clean temporary FEdges created by chaining */
220 virtual void Clean();
221
222 MEM_CXX_CLASS_ALLOC_FUNCS("Freestyle:ViewMap")
223};
224
225/**********************************/
226/* */
227/* */
228/* ViewVertex */
229/* */
230/* */
231/**********************************/
232
233class ViewEdge;
234class SShape;
235
237
240template<class Traits> class edge_iterator_base;
242
243} // namespace ViewVertexInternal
244
253class ViewVertex : public Interface0D {
254 public: // Implementation of Interface0D
256 virtual string getExactTypeName() const
257 {
258 return "ViewVertex";
259 }
260
261 public:
262 friend class ViewShape;
263 typedef pair<ViewEdge *, bool> directedViewEdge; // if bool = true, the ViewEdge is incoming
264
265 typedef vector<directedViewEdge> edges_container;
266
271
272 private:
273 Nature::VertexNature _Nature;
274
275 public:
279 void *userdata;
280
282 inline ViewVertex()
283 {
284 userdata = nullptr;
285 _Nature = Nature::VIEW_VERTEX;
286 }
287
289 {
290 userdata = nullptr;
291 _Nature = Nature::VIEW_VERTEX | nature;
292 }
293
294 protected:
296 inline ViewVertex(ViewVertex &iBrother)
297 {
298 _Nature = iBrother._Nature;
299 iBrother.userdata = this;
300 userdata = nullptr;
301 }
302
304 virtual ViewVertex *duplicate() = 0;
305
306 public:
308 virtual ~ViewVertex() {}
309
310 /* accessors */
313 {
314 return _Nature;
315 }
316
317 /* modifiers */
319 inline void setNature(Nature::VertexNature iNature)
320 {
321 _Nature = iNature;
322 }
323
324 /* Replaces old edge by new edge */
325 virtual void Replace(ViewEdge *, ViewEdge *) {}
326
327 public:
328 /* iterators access */
329 // allows iteration on the edges that comes from/goes to this vertex in CCW order (order defined
330 // in 2D in the image plan)
332 virtual const_edge_iterator edges_begin() const = 0;
334 virtual const_edge_iterator edges_end() const = 0;
336 virtual const_edge_iterator edges_iterator(ViewEdge *iEdge) const = 0;
337
338 // Iterator access
344
349
352
353 MEM_CXX_CLASS_ALLOC_FUNCS("Freestyle:ViewVertex")
354};
355
356/**********************************/
357/* */
358/* */
359/* TVertex */
360/* */
361/* */
362/**********************************/
363
370class TVertex : public ViewVertex {
371 public:
372 typedef vector<directedViewEdge *> edge_pointers_container;
373
374 public: // Implementation of Interface0D
376 virtual string getExactTypeName() const
377 {
378 return "TVertex";
379 }
380
381 // Data access methods
382 /* Returns the 3D x coordinate of the vertex. Ambiguous in this case. */
383 virtual real getX() const
384 {
385 cerr << "Warning: getX() undefined for this point" << endl;
386 return _FrontSVertex->point3D().x();
387 }
388
389 virtual real getY() const
390 {
391 cerr << "Warning: getX() undefined for this point" << endl;
392 return _FrontSVertex->point3D().y();
393 }
394
395 virtual real getZ() const
396 {
397 cerr << "Warning: getX() undefined for this point" << endl;
398 return _FrontSVertex->point3D().z();
399 }
400
402 virtual Vec3r getPoint3D() const
403 {
404 cerr << "Warning: getPoint3D() undefined for this point" << endl;
405 return _FrontSVertex->getPoint3D();
406 }
407
409 virtual real getProjectedX() const
410 {
411 return _FrontSVertex->point2D().x();
412 }
413
415 virtual real getProjectedY() const
416 {
417 return _FrontSVertex->point2D().y();
418 }
419
420 virtual real getProjectedZ() const
421 {
422 return _FrontSVertex->point2D().z();
423 }
424
426 virtual Vec2r getPoint2D() const
427 {
428 return _FrontSVertex->getPoint2D();
429 }
430
432 virtual Id getId() const
433 {
434 return _Id;
435 }
436
438 // it can't
440 {
441 return this;
442 }
443
446 {
447 return this;
448 }
449
450 private:
451 SVertex *_FrontSVertex;
452 SVertex *_BackSVertex;
453 directedViewEdge _FrontEdgeA;
454 directedViewEdge _FrontEdgeB;
455 directedViewEdge _BackEdgeA;
456 directedViewEdge _BackEdgeB;
457
462 Id _Id;
464 edge_pointers_container _sortedEdges;
465
466 public:
468 inline TVertex() : ViewVertex(Nature::T_VERTEX)
469 {
470 _FrontSVertex = nullptr;
471 _BackSVertex = nullptr;
472 _FrontEdgeA.first = 0;
473 _FrontEdgeB.first = 0;
474 _BackEdgeA.first = 0;
475 _BackEdgeB.first = 0;
476 }
477
478 inline TVertex(SVertex *svFront, SVertex *svBack) : ViewVertex(Nature::T_VERTEX)
479 {
480 _FrontSVertex = svFront;
481 _BackSVertex = svBack;
482 _FrontEdgeA.first = 0;
483 _FrontEdgeB.first = 0;
484 _BackEdgeA.first = 0;
485 _BackEdgeB.first = 0;
486 svFront->setViewVertex(this);
487 svBack->setViewVertex(this);
488 }
489
490 protected:
492 inline TVertex(TVertex &iBrother) : ViewVertex(iBrother)
493 {
494 _FrontSVertex = iBrother._FrontSVertex;
495 _BackSVertex = iBrother._BackSVertex;
496 _FrontEdgeA = iBrother._FrontEdgeA;
497 _FrontEdgeB = iBrother._FrontEdgeB;
498 _BackEdgeA = iBrother._BackEdgeA;
499 _BackEdgeB = iBrother._BackEdgeB;
500 _sortedEdges = iBrother._sortedEdges;
501 }
502
505 {
506 TVertex *clone = new TVertex(*this);
507 return clone;
508 }
509
510 public:
511 /* accessors */
514 {
515 return _FrontSVertex;
516 }
517
520 {
521 return _BackSVertex;
522 }
523
525 {
526 return _FrontEdgeA;
527 }
528
530 {
531 return _FrontEdgeB;
532 }
533
535 {
536 return _BackEdgeA;
537 }
538
540 {
541 return _BackEdgeB;
542 }
543
544 /* modifiers */
546 inline void setFrontSVertex(SVertex *iFrontSVertex)
547 {
548 _FrontSVertex = iFrontSVertex;
549 _FrontSVertex->setViewVertex(this);
550 }
551
553 inline void setBackSVertex(SVertex *iBackSVertex)
554 {
555 _BackSVertex = iBackSVertex;
556 _BackSVertex->setViewVertex(this);
557 }
558
559 void setFrontEdgeA(ViewEdge *iFrontEdgeA, bool incoming = true);
560 void setFrontEdgeB(ViewEdge *iFrontEdgeB, bool incoming = true);
561 void setBackEdgeA(ViewEdge *iBackEdgeA, bool incoming = true);
562 void setBackEdgeB(ViewEdge *iBackEdgeB, bool incoming = true);
563
565 inline void setId(const Id &iId)
566 {
567 _Id = iId;
568 }
569
571 inline SVertex *getSVertex(FEdge *iFEdge)
572 {
573 const vector<FEdge *> &vfEdges = _FrontSVertex->fedges();
574 vector<FEdge *>::const_iterator fe, fend;
575 for (fe = vfEdges.begin(), fend = vfEdges.end(); fe != fend; fe++) {
576 if ((*fe) == iFEdge) {
577 return _FrontSVertex;
578 }
579 }
580
581 const vector<FEdge *> &vbEdges = _BackSVertex->fedges();
582 for (fe = vbEdges.begin(), fend = vbEdges.end(); fe != fend; fe++) {
583 if ((*fe) == iFEdge) {
584 return _BackSVertex;
585 }
586 }
587 return nullptr;
588 }
589
590 virtual void Replace(ViewEdge *iOld, ViewEdge *iNew);
591
596 virtual ViewEdge *mate(ViewEdge *iEdgeA)
597 {
598 if (iEdgeA == _FrontEdgeA.first) {
599 return _FrontEdgeB.first;
600 }
601 if (iEdgeA == _FrontEdgeB.first) {
602 return _FrontEdgeA.first;
603 }
604 if (iEdgeA == _BackEdgeA.first) {
605 return _BackEdgeB.first;
606 }
607 if (iEdgeA == _BackEdgeB.first) {
608 return _BackEdgeA.first;
609 }
610 return nullptr;
611 }
612
613 /* Iterators access. */
614
615 virtual edge_iterator edges_begin();
616 virtual const_edge_iterator edges_begin() const;
617 virtual edge_iterator edges_end();
618 virtual const_edge_iterator edges_end() const;
619 virtual edge_iterator edges_iterator(ViewEdge *iEdge);
620 virtual const_edge_iterator edges_iterator(ViewEdge *iEdge) const;
621
627
632
635
636 MEM_CXX_CLASS_ALLOC_FUNCS("Freestyle:TVertex")
637};
638
639/**********************************/
640/* */
641/* */
642/* NonTVertex */
643/* */
644/* */
645/**********************************/
646
647// (non T vertex)
652class NonTVertex : public ViewVertex {
653 public:
654 typedef vector<directedViewEdge> edges_container;
655
656 public: // Implementation of Interface0D
658 virtual string getExactTypeName() const
659 {
660 return "NonTVertex";
661 }
662
663 // Data access methods
665 virtual real getX() const
666 {
667 return _SVertex->point3D().x();
668 }
669
671 virtual real getY() const
672 {
673 return _SVertex->point3D().y();
674 }
675
677 virtual real getZ() const
678 {
679 return _SVertex->point3D().z();
680 }
681
683 virtual Vec3r getPoint3D() const
684 {
685 return _SVertex->getPoint3D();
686 }
687
689 virtual real getProjectedX() const
690 {
691 return _SVertex->point2D().x();
692 }
693
695 virtual real getProjectedY() const
696 {
697 return _SVertex->point2D().y();
698 }
699
701 virtual real getProjectedZ() const
702 {
703 return _SVertex->point2D().z();
704 }
705
707 virtual Vec2r getPoint2D() const
708 {
709 return _SVertex->getPoint2D();
710 }
711
713 virtual Id getId() const
714 {
715 return _SVertex->getId();
716 }
717
720 {
721 return _SVertex;
722 }
723
726 {
727 return this;
728 }
729
732 {
733 return this;
734 }
735
736 private:
737 SVertex *_SVertex;
738 edges_container _ViewEdges;
739
740 public:
742 inline NonTVertex() : ViewVertex(Nature::NON_T_VERTEX)
743 {
744 _SVertex = nullptr;
745 }
746
748 inline NonTVertex(SVertex *iSVertex) : ViewVertex(Nature::NON_T_VERTEX)
749 {
750 _SVertex = iSVertex;
751 _SVertex->setViewVertex(this);
752 }
753
754 protected:
756 inline NonTVertex(NonTVertex &iBrother) : ViewVertex(iBrother)
757 {
758 _SVertex = iBrother._SVertex;
759 _SVertex->setViewVertex(this);
760 _ViewEdges = iBrother._ViewEdges;
761 }
762
765 {
766 NonTVertex *clone = new NonTVertex(*this);
767 return clone;
768 }
769
770 public:
772 virtual ~NonTVertex() {}
773
774 /* accessors */
776 inline SVertex *svertex()
777 {
778 return _SVertex;
779 }
780
782 {
783 return _ViewEdges;
784 }
785
786 /* modifiers */
788 inline void setSVertex(SVertex *iSVertex)
789 {
790 _SVertex = iSVertex;
791 _SVertex->setViewVertex(this);
792 }
793
794 inline void setViewEdges(const vector<directedViewEdge> &iViewEdges)
795 {
796 _ViewEdges = iViewEdges;
797 }
798
799 void AddIncomingViewEdge(ViewEdge *iVEdge);
800 void AddOutgoingViewEdge(ViewEdge *iVEdge);
801
802 inline void AddViewEdge(ViewEdge *iVEdge, bool incoming = true)
803 {
804 if (incoming) {
805 AddIncomingViewEdge(iVEdge);
806 }
807 else {
808 AddOutgoingViewEdge(iVEdge);
809 }
810 }
811
812 /* Replaces old edge by new edge */
813 virtual void Replace(ViewEdge *iOld, ViewEdge *iNew)
814 {
815 edges_container::iterator insertedve;
816 for (edges_container::iterator ve = _ViewEdges.begin(), vend = _ViewEdges.end(); ve != vend;
817 ve++)
818 {
819 if ((ve)->first == iOld) {
820 insertedve = _ViewEdges.insert(
821 ve, directedViewEdge(iNew, ve->second)); // inserts e2 before ve.
822 // returns an iterator pointing toward e2. ve is invalidated.
823 // we want to remove e1, but we can't use ve anymore:
824 insertedve++; // insertedve points now to e1
825 _ViewEdges.erase(insertedve);
826 return;
827 }
828 }
829 }
830
831 /* Iterators access. */
832
833 virtual edge_iterator edges_begin();
834 virtual const_edge_iterator edges_begin() const;
835 virtual edge_iterator edges_end();
836 virtual const_edge_iterator edges_end() const;
837 virtual edge_iterator edges_iterator(ViewEdge *iEdge);
838 virtual const_edge_iterator edges_iterator(ViewEdge *iEdge) const;
839
845
850
853
854 MEM_CXX_CLASS_ALLOC_FUNCS("Freestyle:NonTVertex")
855};
856
857/**********************************/
858/* */
859/* */
860/* ViewEdge */
861/* */
862/* */
863/**********************************/
864
865/* Geometry(normals...)
866 * Nature of edges
867 * 2D spaces (1or2, material, z...)
868 * Parent Shape
869 * 3D Shading, material
870 * Importance
871 * Occluders
872 */
873class ViewShape;
874
876
877template<class Traits> class edge_iterator_base;
878template<class Traits> class fedge_iterator_base;
879template<class Traits> class vertex_iterator_base;
880
881} // end of namespace ViewEdgeInternal
882
886class ViewEdge : public Interface1D {
887 public: // Implementation of Interface0D
889 virtual string getExactTypeName() const
890 {
891 return "ViewEdge";
892 }
893
894 // Data access methods
896 virtual Id getId() const
897 {
898 return _Id;
899 }
900
903 {
904 return _Nature;
905 }
906
907 public:
909 friend class ViewShape;
910 // for ViewEdge iterator
913 // for fedge iterator
916 // for svertex iterator
919
920 private:
921 ViewVertex *__A; // edge starting vertex
922 ViewVertex *__B; // edge ending vertex
923 Nature::EdgeNature _Nature; // nature of view edge
924 ViewShape *_Shape; // shape to which the view edge belongs
925 FEdge *_FEdgeA; // first edge of the embedded fedges chain
926 FEdge *_FEdgeB; // last edge of the embedded fedges chain
927 Id _Id;
928 uint _ChainingTimeStamp;
929 // The silhouette view edge separates two 2D spaces. The one on the left is necessarily the Shape
930 // _Shape (the one to which this edge belongs to) and _aShape is the one on its right NOT HANDLED
931 // BY THE COPY CONSTRUCTOR
932 ViewShape *_aShape;
933 int _qi;
934 vector<ViewShape *> _Occluders;
935 bool _isInImage;
936
937 // tmp
938 Id *_splittingId;
939
940 public:
944 void *userdata;
945
947 inline ViewEdge()
948 {
949 __A = nullptr;
950 __B = nullptr;
951 _FEdgeA = nullptr;
952 _FEdgeB = nullptr;
953 _ChainingTimeStamp = 0;
954 _qi = 0;
955 _aShape = nullptr;
956 userdata = nullptr;
957 _splittingId = nullptr;
958 _isInImage = true;
959 }
960
962 {
963 __A = iA;
964 __B = iB;
965 _FEdgeA = nullptr;
966 _FEdgeB = nullptr;
967 _Shape = 0;
968 _ChainingTimeStamp = 0;
969 _qi = 0;
970 _aShape = nullptr;
971 userdata = nullptr;
972 _splittingId = nullptr;
973 _isInImage = true;
974 }
975
976 inline ViewEdge(ViewVertex *iA, ViewVertex *iB, FEdge *iFEdgeA)
977 {
978 __A = iA;
979 __B = iB;
980 _FEdgeA = iFEdgeA;
981 _FEdgeB = nullptr;
982 _Shape = nullptr;
983 _ChainingTimeStamp = 0;
984 _qi = 0;
985 _aShape = nullptr;
986 userdata = nullptr;
987 _splittingId = nullptr;
988 _isInImage = true;
989 }
990
991 inline ViewEdge(
992 ViewVertex *iA, ViewVertex *iB, FEdge *iFEdgeA, FEdge *iFEdgeB, ViewShape *iShape)
993 {
994 __A = iA;
995 __B = iB;
996 _FEdgeA = iFEdgeA;
997 _FEdgeB = iFEdgeB;
998 _Shape = iShape;
999 _ChainingTimeStamp = 0;
1000 _qi = 0;
1001 _aShape = nullptr;
1002 userdata = nullptr;
1003 _splittingId = nullptr;
1004 _isInImage = true;
1005 UpdateFEdges(); // tells every FEdge between iFEdgeA and iFEdgeB that this is theit ViewEdge
1006 }
1007
1008 // soc protected:
1010 inline ViewEdge(ViewEdge &iBrother)
1011 {
1012 __A = iBrother.__A;
1013 __B = iBrother.__B;
1014 _FEdgeA = iBrother._FEdgeA;
1015 _FEdgeB = iBrother._FEdgeB;
1016 _Nature = iBrother._Nature;
1017 _Shape = nullptr;
1018 _Id = iBrother._Id;
1019 _ChainingTimeStamp = iBrother._ChainingTimeStamp;
1020 _aShape = iBrother._aShape;
1021 _qi = iBrother._qi;
1022 _splittingId = nullptr;
1023 _isInImage = iBrother._isInImage;
1024 iBrother.userdata = this;
1025 userdata = nullptr;
1026 }
1027
1030 {
1031 ViewEdge *clone = new ViewEdge(*this);
1032 return clone;
1033 }
1034
1035 public:
1037 virtual ~ViewEdge()
1038 {
1039#if 0
1040 if (_aFace) {
1041 delete _aFace;
1042 _aFace = nullptr;
1043 }
1044#endif
1045 // only the last split deletes this id
1046 if (_splittingId) {
1047 if (*_splittingId == _Id) {
1048 delete _splittingId;
1049 }
1050 }
1051 }
1052
1053 /* accessors */
1055 inline ViewVertex *A()
1056 {
1057 return __A;
1058 }
1059
1061 inline ViewVertex *B()
1062 {
1063 return __B;
1064 }
1065
1067 inline FEdge *fedgeA()
1068 {
1069 return _FEdgeA;
1070 }
1071
1073 inline FEdge *fedgeB()
1074 {
1075 return _FEdgeB;
1076 }
1077
1080 {
1081 return _Shape;
1082 }
1083
1088 {
1089 return _aShape;
1090 }
1091
1093 inline bool isClosed()
1094 {
1095 if (!__B) {
1096 return true;
1097 }
1098 return false;
1099 }
1100
1103 {
1104 return _ChainingTimeStamp;
1105 }
1106
1107 inline const ViewShape *aShape() const
1108 {
1109 return _aShape;
1110 }
1111
1112 inline const ViewShape *bShape() const
1113 {
1114 return _Shape;
1115 }
1116
1117 inline vector<ViewShape *> &occluders()
1118 {
1119 return _Occluders;
1120 }
1121
1122 inline Id *splittingId()
1123 {
1124 return _splittingId;
1125 }
1126
1127 inline bool isInImage() const
1128 {
1129 return _isInImage;
1130 }
1131
1132 /* modifiers */
1134 inline void setA(ViewVertex *iA)
1135 {
1136 __A = iA;
1137 }
1138
1140 inline void setB(ViewVertex *iB)
1141 {
1142 __B = iB;
1143 }
1144
1146 inline void setNature(Nature::EdgeNature iNature)
1147 {
1148 _Nature = iNature;
1149 }
1150
1152 inline void setFEdgeA(FEdge *iFEdge)
1153 {
1154 _FEdgeA = iFEdge;
1155 }
1156
1158 inline void setFEdgeB(FEdge *iFEdge)
1159 {
1160 _FEdgeB = iFEdge;
1161 }
1162
1164 inline void setShape(ViewShape *iVShape)
1165 {
1166 _Shape = iVShape;
1167 }
1168
1170 inline void setId(const Id &id)
1171 {
1172 _Id = id;
1173 }
1174
1176 void UpdateFEdges();
1177
1179 inline void setaShape(ViewShape *iShape)
1180 {
1181 _aShape = iShape;
1182 }
1183
1185 inline void setQI(int qi)
1186 {
1187 _qi = qi;
1188 }
1189
1192 {
1193 _ChainingTimeStamp = ts;
1194 }
1195
1196 inline void AddOccluder(ViewShape *iShape)
1197 {
1198 _Occluders.push_back(iShape);
1199 }
1200
1201 inline void setSplittingId(Id *id)
1202 {
1203 _splittingId = id;
1204 }
1205
1206 inline void setIsInImage(bool iFlag)
1207 {
1208 _isInImage = iFlag;
1209 }
1210
1211 /* stroke interface definition */
1212 inline bool intersect_2d_area(const Vec2r &iMin, const Vec2r &iMax) const
1213 {
1214 // parse edges to check if one of them is intersection the region:
1215 FEdge *current = _FEdgeA;
1216 do {
1218 iMin,
1219 iMax,
1220 Vec2r(current->vertexA()->point2D()[0], current->vertexA()->point2D()[1]),
1221 Vec2r(current->vertexB()->point2D()[0], current->vertexB()->point2D()[1])))
1222 {
1223 return true;
1224 }
1225 current = current->nextEdge();
1226 } while ((current != 0) && (current != _FEdgeA));
1227
1228 return false;
1229 }
1230
1231 inline bool include_in_2d_area(const Vec2r &iMin, const Vec2r &iMax) const
1232 {
1233 // parse edges to check if all of them are intersection the region:
1234 FEdge *current = _FEdgeA;
1235
1236 do {
1238 iMin,
1239 iMax,
1240 Vec2r(current->vertexA()->point2D()[0], current->vertexA()->point2D()[1]),
1241 Vec2r(current->vertexB()->point2D()[0], current->vertexB()->point2D()[1])))
1242 {
1243 return false;
1244 }
1245 current = current->nextEdge();
1246 } while ((current != 0) && (current != _FEdgeA));
1247
1248 return true;
1249 }
1250
1251 /* Information access interface */
1252
1253#if 0
1254 inline Nature::EdgeNature viewedge_nature() const
1255 {
1256 return getNature();
1257 }
1258
1259 float viewedge_length() const;
1260#endif
1261
1263 real getLength2D() const;
1264
1265#if 0
1266 inline Material material() const
1267 {
1268 return _FEdgeA->vertexA()->shape()->material();
1269 }
1270#endif
1271
1272 inline int qi() const
1273 {
1274 return _qi;
1275 }
1276
1277 inline occluder_container::const_iterator occluders_begin() const
1278 {
1279 return _Occluders.begin();
1280 }
1281
1282 inline occluder_container::const_iterator occluders_end() const
1283 {
1284 return _Occluders.end();
1285 }
1286
1287 inline int occluders_size() const
1288 {
1289 return _Occluders.size();
1290 }
1291
1292 inline bool occluders_empty() const
1293 {
1294 return _Occluders.empty();
1295 }
1296
1297 inline const Polygon3r &occludee() const
1298 {
1299 return (_FEdgeA->aFace());
1300 }
1301
1302 inline const SShape *occluded_shape() const;
1303
1304 inline bool occludee_empty() const
1305 {
1306 if (_aShape == 0) {
1307 return true;
1308 }
1309 return false;
1310 }
1311
1312 // inline real z_discontinuity(int iCombination = 0) const;
1313
1314 inline Id shape_id() const
1315 {
1316 return _FEdgeA->vertexA()->shape()->getId();
1317 }
1318
1319 inline const SShape *shape() const
1320 {
1321 return _FEdgeA->vertexA()->shape();
1322 }
1323
1324 inline float shape_importance() const
1325 {
1326 return _FEdgeA->shape_importance();
1327 }
1328
1329 /* iterators access */
1330 // view edge iterator
1333 // feature edge iterator
1340 // embedding vertex iterator
1347
1348 // Iterator access (Interface1D)
1353
1358
1364 virtual Interface0DIterator pointsBegin(float t = 0.0f);
1365
1371 virtual Interface0DIterator pointsEnd(float t = 0.0f);
1372
1373 MEM_CXX_CLASS_ALLOC_FUNCS("Freestyle:ViewEdge")
1374};
1375
1376/**********************************/
1377/* */
1378/* */
1379/* ViewShape */
1380/* */
1381/* */
1382/**********************************/
1383
1387 private:
1388 vector<ViewVertex *> _Vertices;
1389 vector<ViewEdge *> _Edges;
1390 SShape *_SShape;
1391
1392 public:
1397
1399 inline ViewShape()
1400 {
1401 userdata = nullptr;
1402 _SShape = nullptr;
1403 }
1404
1406 inline ViewShape(SShape *iSShape)
1407 {
1408 userdata = nullptr;
1409 _SShape = iSShape;
1410 //_SShape->setViewShape(this);
1411 }
1412
1414 inline ViewShape(ViewShape &iBrother)
1415 {
1416 userdata = nullptr;
1417 vector<ViewVertex *>::iterator vv, vvend;
1418 vector<ViewEdge *>::iterator ve, veend;
1419
1420 _SShape = iBrother._SShape;
1421
1422 vector<ViewVertex *> &vvertices = iBrother.vertices();
1423 // duplicate vertices
1424 for (vv = vvertices.begin(), vvend = vvertices.end(); vv != vvend; vv++) {
1425 ViewVertex *newVertex = (*vv)->duplicate();
1426 AddVertex(newVertex);
1427 }
1428
1429 vector<ViewEdge *> &vvedges = iBrother.edges();
1430 // duplicate edges
1431 for (ve = vvedges.begin(), veend = vvedges.end(); ve != veend; ve++) {
1432 ViewEdge *newEdge = (*ve)->duplicate();
1433 AddEdge(newEdge); // here the shape is set as the edge's shape
1434 }
1435
1436 //-------------------------
1437 // remap edges in vertices:
1438 //-------------------------
1439 for (vv = _Vertices.begin(), vvend = _Vertices.end(); vv != vvend; vv++) {
1440 switch ((*vv)->getNature()) {
1441 case Nature::T_VERTEX: {
1442 TVertex *v = (TVertex *)(*vv);
1443 ViewEdge *veFrontA = (ViewEdge *)(v)->frontEdgeA().first->userdata;
1444 ViewEdge *veFrontB = (ViewEdge *)(v)->frontEdgeB().first->userdata;
1445 ViewEdge *veBackA = (ViewEdge *)(v)->backEdgeA().first->userdata;
1446 ViewEdge *veBackB = (ViewEdge *)(v)->backEdgeB().first->userdata;
1447
1448 v->setFrontEdgeA(veFrontA, v->frontEdgeA().second);
1449 v->setFrontEdgeB(veFrontB, v->frontEdgeB().second);
1450 v->setBackEdgeA(veBackA, v->backEdgeA().second);
1451 v->setBackEdgeB(veBackB, v->backEdgeB().second);
1452 break;
1453 }
1454 case Nature::NON_T_VERTEX: {
1455 NonTVertex *v = (NonTVertex *)(*vv);
1456 vector<ViewVertex::directedViewEdge> &vedges = (v)->viewedges();
1457 vector<ViewVertex::directedViewEdge> newEdges;
1458 for (vector<ViewVertex::directedViewEdge>::iterator ve = vedges.begin(),
1459 veend = vedges.end();
1460 ve != veend;
1461 ve++)
1462 {
1463 ViewEdge *current = (ViewEdge *)((ve)->first)->userdata;
1464 newEdges.push_back(ViewVertex::directedViewEdge(current, ve->second));
1465 }
1466 (v)->setViewEdges(newEdges);
1467 } break;
1468 default:
1469 break;
1470 }
1471 }
1472
1473 //-------------------------------------
1474 // remap vertices in edges:
1475 //-------------------------------------
1476 for (ve = _Edges.begin(), veend = _Edges.end(); ve != veend; ve++) {
1477 (*ve)->setA((ViewVertex *)((*ve)->A()->userdata));
1478 (*ve)->setB((ViewVertex *)((*ve)->B()->userdata));
1479 //---------------------------------------
1480 // Update all embedded FEdges
1481 //---------------------------------------
1482 (*ve)->UpdateFEdges();
1483 }
1484
1485 // reset all brothers userdata to nullptr:
1486 //-------------------------------------
1487 //---------
1488 // vertices
1489 //---------
1490 for (vv = vvertices.begin(), vvend = vvertices.end(); vv != vvend; vv++) {
1491 (*vv)->userdata = nullptr;
1492 }
1493
1494 //------
1495 // edges
1496 //------
1497 for (ve = vvedges.begin(), veend = vvedges.end(); ve != veend; ve++) {
1498 (*ve)->userdata = nullptr;
1499 }
1500 }
1501
1504 {
1505 ViewShape *clone = new ViewShape(*this);
1506 return clone;
1507 }
1508
1510 virtual ~ViewShape();
1511
1512 /* splits a view edge into several view edges.
1513 * fe
1514 * The FEdge that gets split
1515 * iViewVertices
1516 * The view vertices corresponding to the different intersections for the edge fe.
1517 * This list need to be sorted such as the first view vertex is the farther away from
1518 * fe->vertexA. ioNewEdges The feature edges that are newly created (the initial edges are not
1519 * included) are added to this list. ioNewViewEdges The view edges that are newly created (the
1520 * initial edges are not included) are added to this list.
1521 */
1522 inline void SplitEdge(FEdge *fe,
1523 const vector<TVertex *> &iViewVertices,
1524 vector<FEdge *> &ioNewEdges,
1525 vector<ViewEdge *> &ioNewViewEdges);
1526
1527 /* accessors */
1529 inline SShape *sshape()
1530 {
1531 return _SShape;
1532 }
1533
1535 inline const SShape *sshape() const
1536 {
1537 return _SShape;
1538 }
1539
1541 inline vector<ViewVertex *> &vertices()
1542 {
1543 return _Vertices;
1544 }
1545
1547 inline vector<ViewEdge *> &edges()
1548 {
1549 return _Edges;
1550 }
1551
1553 inline Id getId() const
1554 {
1555 return _SShape->getId();
1556 }
1557
1559 inline const string &getName() const
1560 {
1561 return _SShape->getName();
1562 }
1563
1565 inline const string &getLibraryPath() const
1566 {
1567 return _SShape->getLibraryPath();
1568 }
1569
1570 /* modifiers */
1572 inline void setSShape(SShape *iSShape)
1573 {
1574 _SShape = iSShape;
1575 }
1576
1578 inline void setVertices(const vector<ViewVertex *> &iVertices)
1579 {
1580 _Vertices = iVertices;
1581 }
1582
1584 inline void setEdges(const vector<ViewEdge *> &iEdges)
1585 {
1586 _Edges = iEdges;
1587 }
1588
1590 inline void AddVertex(ViewVertex *iVertex)
1591 {
1592 _Vertices.push_back(iVertex);
1593 //_SShape->AddNewVertex(iVertex->svertex());
1594 }
1595
1597 inline void AddEdge(ViewEdge *iEdge)
1598 {
1599 _Edges.push_back(iEdge);
1600 iEdge->setShape(this);
1601 //_SShape->AddNewEdge(iEdge->fedge());
1602 }
1603
1604 /* removes the view edge iViewEdge in the View Shape and the associated FEdge chain entry in the
1605 * underlying SShape
1606 */
1607 void RemoveEdge(ViewEdge *iViewEdge);
1608
1609 /* removes the view vertex iViewVertex in the View Shape. */
1610 void RemoveVertex(ViewVertex *iViewVertex);
1611
1612 MEM_CXX_CLASS_ALLOC_FUNCS("Freestyle:ViewShape")
1613};
1614
1615/*
1616 * #############################################
1617 * #############################################
1618 * #############################################
1619 * ###### ######
1620 * ###### I M P L E M E N T A T I O N ######
1621 * ###### ######
1622 * #############################################
1623 * #############################################
1624 * #############################################
1625 */
1626/* for inline functions */
1627
1629 const vector<TVertex *> &iViewVertices,
1630 vector<FEdge *> &ioNewEdges,
1631 vector<ViewEdge *> &ioNewViewEdges)
1632{
1633 ViewEdge *vEdge = fe->viewedge();
1634
1635 // We first need to sort the view vertices from farther to closer to fe->vertexA
1636 SVertex *sv, *sv2;
1637 ViewVertex *vva, *vvb;
1638 vector<TVertex *>::const_iterator vv, vvend;
1639 for (vv = iViewVertices.begin(), vvend = iViewVertices.end(); vv != vvend; vv++) {
1640 // Add the viewvertices to the ViewShape
1641 AddVertex((*vv));
1642
1643 // retrieve the correct SVertex from the view vertex
1644 //--------------------------------------------------
1645 sv = (*vv)->frontSVertex();
1646 sv2 = (*vv)->backSVertex();
1647
1648 if (sv->shape() != sv2->shape()) {
1649 if (sv->shape() != _SShape) {
1650 sv = sv2;
1651 }
1652 }
1653 else {
1654 // if the shape is the same we can safely differ the two vertices using their ids:
1655 if (sv->getId() != fe->vertexA()->getId()) {
1656 sv = sv2;
1657 }
1658 }
1659
1660 vva = vEdge->A();
1661 vvb = vEdge->B();
1662
1663 // We split Fedge AB into AA' and A'B. A' and A'B are created.
1664 // AB becomes (address speaking) AA'. B is updated.
1665 //--------------------------------------------------
1666 SShape *shape = fe->shape();
1667
1668 // a new edge, A'B is created.
1669 FEdge *newEdge = shape->SplitEdgeIn2(fe, sv);
1670 /* One of the two FEdges (fe and newEdge) may have a 2D length less than M_EPSILON.
1671 * (22 Feb 2011, T.K.)
1672 */
1673
1674 ioNewEdges.push_back(newEdge);
1675 ViewEdge *newVEdge;
1676
1677 if ((vva == 0) || (vvb == 0)) { // that means we're dealing with a closed viewedge (loop)
1678 // remove the chain that was starting by the fedge A of vEdge (which is different from fe
1679 // !!!!)
1680 shape->RemoveEdgeFromChain(vEdge->fedgeA());
1681 // we set
1682 vEdge->setA(*vv);
1683 vEdge->setB(*vv);
1684 vEdge->setFEdgeA(newEdge);
1685 // FEdge *previousEdge = newEdge->previousEdge();
1686 vEdge->setFEdgeB(fe);
1687 newVEdge = vEdge;
1688 vEdge->fedgeA()->setViewEdge(newVEdge);
1689 }
1690 else {
1691 // while we create the view edge, it updates the "ViewEdge" pointer of every underlying
1692 // FEdges to this.
1693 newVEdge = new ViewEdge((*vv), vvb); //, newEdge, vEdge->fedgeB());
1694 newVEdge->setNature((fe)->getNature());
1695 newVEdge->setFEdgeA(newEdge);
1696 // newVEdge->setFEdgeB(fe);
1697 // If our original viewedge is made of one FEdge, then
1698 if ((vEdge->fedgeA() == vEdge->fedgeB()) || (fe == vEdge->fedgeB())) {
1699 newVEdge->setFEdgeB(newEdge);
1700 }
1701 else {
1702 newVEdge->setFEdgeB(vEdge->fedgeB()); // MODIF
1703 }
1704
1705 Id *newId = vEdge->splittingId();
1706 if (newId == 0) {
1707 newId = new Id(vEdge->getId());
1708 vEdge->setSplittingId(newId);
1709 }
1710 newId->setSecond(newId->getSecond() + 1);
1711 newVEdge->setId(*newId);
1712 newVEdge->setSplittingId(newId);
1713#if 0
1714 Id id(vEdge->getId().getFirst(), vEdge->getId().getSecond() + 1);
1715 newVEdge->setId(vEdge->getId());
1716 vEdge->setId(id);
1717#endif
1718
1719 AddEdge(newVEdge); // here this shape is set as the edge's shape
1720
1721 // add new edge to the list of new edges passed as argument:
1722 ioNewViewEdges.push_back(newVEdge);
1723
1724 if (0 != vvb) {
1725 vvb->Replace((vEdge), newVEdge);
1726 }
1727
1728 // we split the view edge:
1729 vEdge->setB((*vv));
1730 vEdge->setFEdgeB(fe); // MODIF
1731
1732 // Update fedges so that they point to the new viewedge:
1733 newVEdge->UpdateFEdges();
1734 }
1735 // check whether this vertex is a front vertex or a back one
1736 if (sv == (*vv)->frontSVertex()) {
1737 // -- View Vertex A' --
1738 (*vv)->setFrontEdgeA(vEdge, true);
1739 (*vv)->setFrontEdgeB(newVEdge, false);
1740 }
1741 else {
1742 // -- View Vertex A' --
1743 (*vv)->setBackEdgeA(vEdge, true);
1744 (*vv)->setBackEdgeB(newVEdge, false);
1745 }
1746 }
1747}
1748
1749/**********************************/
1750/* */
1751/* */
1752/* ViewEdge */
1753/* */
1754/* */
1755/**********************************/
1756
1757#if 0
1758inline Vec3r ViewEdge::orientation2d(int iCombination) const
1759{
1760 return edge_orientation2d_function<ViewEdge>(*this, iCombination);
1761}
1762
1763inline Vec3r ViewEdge::orientation3d(int iCombination) const
1764{
1765 return edge_orientation3d_function<ViewEdge>(*this, iCombination);
1766}
1767
1768inline real ViewEdge::z_discontinuity(int iCombination) const
1769{
1770 return z_discontinuity_edge_function<ViewEdge>(*this, iCombination);
1771}
1772
1773inline float ViewEdge::local_average_depth(int iCombination) const
1774{
1775 return local_average_depth_edge_function<ViewEdge>(*this, iCombination);
1776}
1777
1778inline float ViewEdge::local_depth_variance(int iCombination) const
1779{
1780 return local_depth_variance_edge_function<ViewEdge>(*this, iCombination);
1781}
1782
1783inline real ViewEdge::local_average_density(float sigma, int iCombination) const
1784{
1785 return density_edge_function<ViewEdge>(*this, iCombination);
1786}
1787#endif
1788
1790{
1791 if (0 == _aShape) {
1792 return 0;
1793 }
1794 return _aShape->sshape();
1795}
1796
1797#if 0
1798inline Vec3r ViewEdge::curvature2d_as_vector(int iCombination) const
1799{
1800 return curvature2d_as_vector_edge_function<ViewEdge>(*this, iCombination);
1801}
1802
1803inline real ViewEdge::curvature2d_as_angle(int iCombination) const
1804{
1805 return curvature2d_as_angle_edge_function<ViewEdge>(*this, iCombination);
1806}
1807#endif
1808
1809} /* namespace Freestyle */
unsigned int uint
Classes defining the basic "Iterator" design pattern.
Configuration definitions.
Various tools for geometry.
Interface to 0D elements.
Interface 1D and related tools definitions.
Read Guarded memory(de)allocation.
Classes to define a silhouette structure.
ATTR_WARN_UNUSED_RESULT const BMVert * v
ViewEdge * viewedge() const
Definition Silhouette.h:654
SShape * shape()
Definition Silhouette.h:632
FEdge * nextEdge()
Definition Silhouette.h:619
SVertex * vertexA()
Definition Silhouette.h:593
void setViewEdge(ViewEdge *iViewEdge)
Definition Silhouette.h:762
SVertex * vertexB()
Definition Silhouette.h:599
id_type getFirst() const
Definition Id.h:62
id_type getSecond() const
Definition Id.h:68
void setSecond(id_type second)
Definition Id.h:80
virtual void Replace(ViewEdge *iOld, ViewEdge *iNew)
Definition ViewMap.h:813
void AddIncomingViewEdge(ViewEdge *iVEdge)
Definition ViewMap.cpp:572
virtual ViewVertex * duplicate()
Definition ViewMap.h:764
virtual Vec3r getPoint3D() const
Definition ViewMap.h:683
virtual real getProjectedX() const
Definition ViewMap.h:689
edges_container & viewedges()
Definition ViewMap.h:781
virtual string getExactTypeName() const
Definition ViewMap.h:658
vector< directedViewEdge > edges_container
Definition ViewMap.h:654
virtual ViewVertex * castToViewVertex()
Definition ViewMap.h:725
virtual ~NonTVertex()
Definition ViewMap.h:772
virtual ViewVertexInternal::orientedViewEdgeIterator edgesBegin()
Definition ViewMap.cpp:635
NonTVertex(NonTVertex &iBrother)
Definition ViewMap.h:756
virtual edge_iterator edges_iterator(ViewEdge *iEdge)
Definition ViewMap.cpp:610
virtual real getZ() const
Definition ViewMap.h:677
virtual NonTVertex * castToNonTVertex()
Definition ViewMap.h:731
virtual Id getId() const
Definition ViewMap.h:713
virtual edge_iterator edges_begin()
Definition ViewMap.cpp:590
virtual real getProjectedY() const
Definition ViewMap.h:695
void AddViewEdge(ViewEdge *iVEdge, bool incoming=true)
Definition ViewMap.h:802
void AddOutgoingViewEdge(ViewEdge *iVEdge)
Definition ViewMap.cpp:556
virtual real getProjectedZ() const
Definition ViewMap.h:701
virtual ViewVertexInternal::orientedViewEdgeIterator edgesEnd()
Definition ViewMap.cpp:641
void setViewEdges(const vector< directedViewEdge > &iViewEdges)
Definition ViewMap.h:794
SVertex * svertex()
Definition ViewMap.h:776
virtual Vec2r getPoint2D() const
Definition ViewMap.h:707
void setSVertex(SVertex *iSVertex)
Definition ViewMap.h:788
virtual real getY() const
Definition ViewMap.h:671
virtual real getX() const
Definition ViewMap.h:665
virtual ViewVertexInternal::orientedViewEdgeIterator edgesIterator(ViewEdge *iEdge)
Definition ViewMap.cpp:647
virtual edge_iterator edges_end()
Definition ViewMap.cpp:600
NonTVertex(SVertex *iSVertex)
Definition ViewMap.h:748
virtual SVertex * castToSVertex()
Definition ViewMap.h:719
void RemoveEdgeFromChain(FEdge *iEdge)
FEdge * SplitEdgeIn2(FEdge *ioEdge, SVertex *ioNewVertex)
void setViewVertex(ViewVertex *iViewVertex)
Definition Silhouette.h:353
virtual Id getId() const
Definition Silhouette.h:117
const Vec3r & point2D() const
Definition Silhouette.h:228
const vector< FEdge * > & fedges()
Definition Silhouette.h:248
virtual real getProjectedY() const
Definition ViewMap.h:415
void setId(const Id &iId)
Definition ViewMap.h:565
SVertex * backSVertex()
Definition ViewMap.h:519
void setBackEdgeA(ViewEdge *iBackEdgeA, bool incoming=true)
Definition ViewMap.cpp:372
virtual edge_iterator edges_iterator(ViewEdge *iEdge)
Definition ViewMap.cpp:460
virtual string getExactTypeName() const
Definition ViewMap.h:376
virtual Vec2r getPoint2D() const
Definition ViewMap.h:426
virtual ViewVertexInternal::orientedViewEdgeIterator edgesIterator(ViewEdge *iEdge)
Definition ViewMap.cpp:533
virtual edge_iterator edges_begin()
Definition ViewMap.cpp:434
virtual ViewVertex * castToViewVertex()
Definition ViewMap.h:439
SVertex * getSVertex(FEdge *iFEdge)
Definition ViewMap.h:571
virtual ViewVertex * duplicate()
Definition ViewMap.h:504
SVertex * frontSVertex()
Definition ViewMap.h:513
directedViewEdge & backEdgeB()
Definition ViewMap.h:539
void setBackEdgeB(ViewEdge *iBackEdgeB, bool incoming=true)
Definition ViewMap.cpp:391
virtual Vec3r getPoint3D() const
Definition ViewMap.h:402
virtual real getProjectedZ() const
Definition ViewMap.h:420
void setBackSVertex(SVertex *iBackSVertex)
Definition ViewMap.h:553
virtual real getX() const
Definition ViewMap.h:383
virtual edge_iterator edges_end()
Definition ViewMap.cpp:446
void setFrontEdgeB(ViewEdge *iFrontEdgeB, bool incoming=true)
Definition ViewMap.cpp:353
directedViewEdge & frontEdgeB()
Definition ViewMap.h:529
virtual TVertex * castToTVertex()
Definition ViewMap.h:445
virtual ViewEdge * mate(ViewEdge *iEdgeA)
Definition ViewMap.h:596
virtual real getProjectedX() const
Definition ViewMap.h:409
TVertex(TVertex &iBrother)
Definition ViewMap.h:492
directedViewEdge & frontEdgeA()
Definition ViewMap.h:524
directedViewEdge & backEdgeA()
Definition ViewMap.h:534
virtual void Replace(ViewEdge *iOld, ViewEdge *iNew)
Definition ViewMap.cpp:410
virtual real getZ() const
Definition ViewMap.h:395
void setFrontSVertex(SVertex *iFrontSVertex)
Definition ViewMap.h:546
void setFrontEdgeA(ViewEdge *iFrontEdgeA, bool incoming=true)
Definition ViewMap.cpp:334
TVertex(SVertex *svFront, SVertex *svBack)
Definition ViewMap.h:478
virtual Id getId() const
Definition ViewMap.h:432
virtual real getY() const
Definition ViewMap.h:389
virtual ViewVertexInternal::orientedViewEdgeIterator edgesBegin()
Definition ViewMap.cpp:521
virtual ViewVertexInternal::orientedViewEdgeIterator edgesEnd()
Definition ViewMap.cpp:527
vector< directedViewEdge * > edge_pointers_container
Definition ViewMap.h:372
const_vertex_iterator vertices_end() const
Definition ViewMap.cpp:746
int qi() const
Definition ViewMap.h:1272
ViewShape * aShape()
Definition ViewMap.h:1087
virtual string getExactTypeName() const
Definition ViewMap.h:889
bool isInImage() const
Definition ViewMap.h:1127
void setId(const Id &id)
Definition ViewMap.h:1170
uint getChainingTimeStamp()
Definition ViewMap.h:1102
void setaShape(ViewShape *iShape)
Definition ViewMap.h:1179
virtual Nature::EdgeNature getNature() const
Definition ViewMap.h:902
ViewEdge(ViewVertex *iA, ViewVertex *iB, FEdge *iFEdgeA, FEdge *iFEdgeB, ViewShape *iShape)
Definition ViewMap.h:991
ViewEdge(ViewVertex *iA, ViewVertex *iB)
Definition ViewMap.h:961
ViewEdge(ViewVertex *iA, ViewVertex *iB, FEdge *iFEdgeA)
Definition ViewMap.h:976
void setFEdgeB(FEdge *iFEdge)
Definition ViewMap.h:1158
Id shape_id() const
Definition ViewMap.h:1314
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
occluder_container::const_iterator occluders_begin() const
Definition ViewMap.h:1277
const ViewShape * bShape() const
Definition ViewMap.h:1112
virtual Id getId() const
Definition ViewMap.h:896
bool include_in_2d_area(const Vec2r &iMin, const Vec2r &iMax) const
Definition ViewMap.h:1231
edge_iterator ViewEdge_iterator()
view edge iterator
Definition ViewMap.cpp:684
float shape_importance() const
Definition ViewMap.h:1324
bool intersect_2d_area(const Vec2r &iMin, const Vec2r &iMax) const
Definition ViewMap.h:1212
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
void setShape(ViewShape *iVShape)
Definition ViewMap.h:1164
const SShape * shape() const
Definition ViewMap.h:1319
virtual Interface0DIterator pointsBegin(float t=0.0f)
Definition ViewMap.cpp:770
virtual ViewEdge * duplicate()
Definition ViewMap.h:1029
ViewEdgeInternal::vertex_iterator_base< Nonconst_traits< SVertex * > > vertex_iterator
Definition ViewMap.h:917
const Polygon3r & occludee() const
Definition ViewMap.h:1297
virtual Interface0DIterator pointsEnd(float t=0.0f)
Definition ViewMap.cpp:775
bool occluders_empty() const
Definition ViewMap.h:1292
int occluders_size() const
Definition ViewMap.h:1287
ViewVertex * B()
Definition ViewMap.h:1061
const ViewShape * aShape() const
Definition ViewMap.h:1107
SVertex vertex_type
Definition ViewMap.h:908
vector< ViewShape * > & occluders()
Definition ViewMap.h:1117
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
void setSplittingId(Id *id)
Definition ViewMap.h:1201
friend class ViewShape
Definition ViewMap.h:909
real getLength2D() const
Definition ViewMap.cpp:669
virtual Interface0DIterator verticesBegin()
Definition ViewMap.cpp:756
void AddOccluder(ViewShape *iShape)
Definition ViewMap.h:1196
void setChainingTimeStamp(uint ts)
Definition ViewMap.h:1191
ViewEdgeInternal::vertex_iterator_base< Const_traits< SVertex * > > const_vertex_iterator
Definition ViewMap.h:918
void setIsInImage(bool iFlag)
Definition ViewMap.h:1206
virtual Interface0DIterator verticesEnd()
Definition ViewMap.cpp:763
void setNature(Nature::EdgeNature iNature)
Definition ViewMap.h:1146
ViewVertex * A()
Definition ViewMap.h:1055
const SShape * occluded_shape() const
Definition ViewMap.h:1789
void setQI(int qi)
Definition ViewMap.h:1185
occluder_container::const_iterator occluders_end() const
Definition ViewMap.h:1282
ViewEdgeInternal::fedge_iterator_base< Nonconst_traits< FEdge * > > fedge_iterator
Definition ViewMap.h:914
ViewEdge(ViewEdge &iBrother)
Definition ViewMap.h:1010
void setB(ViewVertex *iB)
Definition ViewMap.h:1140
virtual ~ViewEdge()
Definition ViewMap.h:1037
bool occludee_empty() const
Definition ViewMap.h:1304
vector< FEdge * > fedges_container
Definition ViewMap.h:51
vector< SVertex * > svertices_container
Definition ViewMap.h:50
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
viewshapes_container & ViewShapes()
Definition ViewMap.h:96
vector< ViewVertex * > viewvertices_container
Definition ViewMap.h:48
viewedges_container::iterator viewedges_begin()
Definition ViewMap.h:126
vector< ViewShape * > viewshapes_container
Definition ViewMap.h:49
const ViewEdge * getClosestViewEdge(real x, real y) const
Definition ViewMap.cpp:116
void AddSVertex(SVertex *iSVertex)
Definition ViewMap.h:172
BBox< Vec3r > getScene3dBBox() const
Definition ViewMap.h:149
vector< ViewEdge * > viewedges_container
Definition ViewMap.h:47
id_to_index_map & shapeIdToIndexMap()
Definition ViewMap.h:143
virtual void Clean()
Definition ViewMap.cpp:55
static ViewMap * getInstance()
Definition ViewMap.h:90
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
viewedges_container::iterator viewedges_end()
Definition ViewMap.h:131
viewvertices_container & ViewVertices()
Definition ViewMap.h:108
void setScene3dBBox(const BBox< Vec3r > &bbox)
Definition ViewMap.h:178
svertices_container & SVertices()
Definition ViewMap.h:120
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 AddViewEdge(ViewEdge *iVEdge)
Definition ViewMap.h:157
map< int, int > id_to_index_map
Definition ViewMap.h:52
viewedges_container & ViewEdges()
Definition ViewMap.h:102
fedges_container & FEdges()
Definition ViewMap.h:114
const string & getName() const
Definition ViewMap.h:1559
void setVertices(const vector< ViewVertex * > &iVertices)
Definition ViewMap.h:1578
ViewShape(SShape *iSShape)
Definition ViewMap.h:1406
const SShape * sshape() const
Definition ViewMap.h:1535
void AddVertex(ViewVertex *iVertex)
Definition ViewMap.h:1590
void SplitEdge(FEdge *fe, const vector< TVertex * > &iViewVertices, vector< FEdge * > &ioNewEdges, vector< ViewEdge * > &ioNewViewEdges)
Definition ViewMap.h:1628
vector< ViewEdge * > & edges()
Definition ViewMap.h:1547
void setSShape(SShape *iSShape)
Definition ViewMap.h:1572
vector< ViewVertex * > & vertices()
Definition ViewMap.h:1541
virtual ViewShape * duplicate()
Definition ViewMap.h:1503
void RemoveVertex(ViewVertex *iViewVertex)
Definition ViewMap.cpp:817
void setEdges(const vector< ViewEdge * > &iEdges)
Definition ViewMap.h:1584
void RemoveEdge(ViewEdge *iViewEdge)
Definition ViewMap.cpp:805
void AddEdge(ViewEdge *iEdge)
Definition ViewMap.h:1597
ViewShape(ViewShape &iBrother)
Definition ViewMap.h:1414
SShape * sshape()
Definition ViewMap.h:1529
const string & getLibraryPath() const
Definition ViewMap.h:1565
ViewVertexInternal::edge_iterator_base< ViewVertexInternal::edge_const_traits > const_edge_iterator
Definition ViewMap.h:270
virtual ~ViewVertex()
Definition ViewMap.h:308
pair< ViewEdge *, bool > directedViewEdge
Definition ViewMap.h:263
virtual Nature::VertexNature getNature() const
Definition ViewMap.h:312
virtual ViewVertexInternal::orientedViewEdgeIterator edgesBegin()=0
virtual const_edge_iterator edges_begin() const =0
virtual const_edge_iterator edges_end() const =0
virtual const_edge_iterator edges_iterator(ViewEdge *iEdge) const =0
ViewVertex(ViewVertex &iBrother)
Definition ViewMap.h:296
virtual edge_iterator edges_end()=0
virtual ViewVertexInternal::orientedViewEdgeIterator edgesIterator(ViewEdge *iEdge)=0
friend class ViewShape
Definition ViewMap.h:262
virtual string getExactTypeName() const
Definition ViewMap.h:256
ViewVertex(Nature::VertexNature nature)
Definition ViewMap.h:288
virtual edge_iterator edges_begin()=0
virtual edge_iterator edges_iterator(ViewEdge *iEdge)=0
vector< directedViewEdge > edges_container
Definition ViewMap.h:265
virtual ViewVertex * duplicate()=0
virtual void Replace(ViewEdge *, ViewEdge *)
Definition ViewMap.h:325
virtual ViewVertexInternal::orientedViewEdgeIterator edgesEnd()=0
ViewVertexInternal::edge_iterator_base< ViewVertexInternal::edge_nonconst_traits > edge_iterator
Definition ViewMap.h:268
void setNature(Nature::VertexNature iNature)
Definition ViewMap.h:319
bool intersect2dSeg2dArea(const Vec2r &min, const Vec2r &max, const Vec2r &A, const Vec2r &B)
Definition GeomUtils.cpp:19
bool include2dSeg2dArea(const Vec2r &min, const Vec2r &max, const Vec2r &A, const Vec2r &B)
Definition GeomUtils.cpp:40
VecMat::Vec2< real > Vec2r
Definition Geom.h:24
VecMat::Vec3< real > Vec3r
Definition Geom.h:30
ushort VertexNature
Definition Nature.h:22
static const VertexNature VIEW_VERTEX
Definition Nature.h:28
static const VertexNature T_VERTEX
Definition Nature.h:32
static const VertexNature NON_T_VERTEX
Definition Nature.h:30
ushort EdgeNature
Definition Nature.h:36
inherits from class Rep
Definition AppCanvas.cpp:20
static uint x[3]
Definition RandGen.cpp:77
double real
Definition Precision.h:14