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