23#ifdef WITH_CXX_GUARDEDALLOC
130 return _VEdges.begin();
135 return _VEdges.end();
140 return _VEdges.size();
147 return _shapeIdToIndex;
161 _VEdges.push_back(iVEdge);
166 _VVertices.push_back(iVVertex);
171 _FEdges.push_back(iFEdge);
176 _SVertices.push_back(iSVertex);
222 virtual void Clean();
224#ifdef WITH_CXX_GUARDEDALLOC
225 MEM_CXX_CLASS_ALLOC_FUNCS(
"Freestyle:ViewMap")
240namespace ViewVertexInternal {
302 _Nature = iBrother._Nature;
357#ifdef WITH_CXX_GUARDEDALLOC
358 MEM_CXX_CLASS_ALLOC_FUNCS(
"Freestyle:ViewVertex")
391 cerr <<
"Warning: getX() undefined for this point" << endl;
392 return _FrontSVertex->
point3D().
x();
397 cerr <<
"Warning: getX() undefined for this point" << endl;
398 return _FrontSVertex->
point3D().
y();
403 cerr <<
"Warning: getX() undefined for this point" << endl;
404 return _FrontSVertex->
point3D().
z();
410 cerr <<
"Warning: getPoint3D() undefined for this point" << endl;
417 return _FrontSVertex->
point2D().
x();
423 return _FrontSVertex->
point2D().
y();
428 return _FrontSVertex->
point2D().
z();
476 _FrontSVertex =
nullptr;
477 _BackSVertex =
nullptr;
478 _FrontEdgeA.first = 0;
479 _FrontEdgeB.first = 0;
480 _BackEdgeA.first = 0;
481 _BackEdgeB.first = 0;
486 _FrontSVertex = svFront;
487 _BackSVertex = svBack;
488 _FrontEdgeA.first = 0;
489 _FrontEdgeB.first = 0;
490 _BackEdgeA.first = 0;
491 _BackEdgeB.first = 0;
500 _FrontSVertex = iBrother._FrontSVertex;
501 _BackSVertex = iBrother._BackSVertex;
502 _FrontEdgeA = iBrother._FrontEdgeA;
503 _FrontEdgeB = iBrother._FrontEdgeB;
504 _BackEdgeA = iBrother._BackEdgeA;
505 _BackEdgeB = iBrother._BackEdgeB;
506 _sortedEdges = iBrother._sortedEdges;
521 return _FrontSVertex;
554 _FrontSVertex = iFrontSVertex;
561 _BackSVertex = iBackSVertex;
579 const vector<FEdge *> &vfEdges = _FrontSVertex->
fedges();
580 vector<FEdge *>::const_iterator fe, fend;
581 for (fe = vfEdges.begin(), fend = vfEdges.end(); fe != fend; fe++) {
582 if ((*fe) == iFEdge) {
583 return _FrontSVertex;
587 const vector<FEdge *> &vbEdges = _BackSVertex->
fedges();
588 for (fe = vbEdges.begin(), fend = vbEdges.end(); fe != fend; fe++) {
589 if ((*fe) == iFEdge) {
604 if (iEdgeA == _FrontEdgeA.first) {
605 return _FrontEdgeB.first;
607 if (iEdgeA == _FrontEdgeB.first) {
608 return _FrontEdgeA.first;
610 if (iEdgeA == _BackEdgeA.first) {
611 return _BackEdgeB.first;
613 if (iEdgeA == _BackEdgeB.first) {
614 return _BackEdgeA.first;
641#ifdef WITH_CXX_GUARDEDALLOC
642 MEM_CXX_CLASS_ALLOC_FUNCS(
"Freestyle:TVertex")
722 return _SVertex->
getId();
765 _SVertex = iBrother._SVertex;
767 _ViewEdges = iBrother._ViewEdges;
803 _ViewEdges = iViewEdges;
822 edges_container::iterator insertedve;
823 for (edges_container::iterator ve = _ViewEdges.begin(), vend = _ViewEdges.end(); ve != vend;
826 if ((ve)->first == iOld) {
827 insertedve = _ViewEdges.insert(
832 _ViewEdges.erase(insertedve);
860#ifdef WITH_CXX_GUARDEDALLOC
861 MEM_CXX_CLASS_ALLOC_FUNCS(
"Freestyle:NonTVertex")
883namespace ViewEdgeInternal {
936 uint _ChainingTimeStamp;
942 vector<ViewShape *> _Occluders;
961 _ChainingTimeStamp = 0;
965 _splittingId =
nullptr;
976 _ChainingTimeStamp = 0;
980 _splittingId =
nullptr;
991 _ChainingTimeStamp = 0;
995 _splittingId =
nullptr;
1007 _ChainingTimeStamp = 0;
1011 _splittingId =
nullptr;
1022 _FEdgeA = iBrother._FEdgeA;
1023 _FEdgeB = iBrother._FEdgeB;
1024 _Nature = iBrother._Nature;
1027 _ChainingTimeStamp = iBrother._ChainingTimeStamp;
1028 _aShape = iBrother._aShape;
1030 _splittingId =
nullptr;
1031 _isInImage = iBrother._isInImage;
1055 if (*_splittingId == _Id) {
1056 delete _splittingId;
1112 return _ChainingTimeStamp;
1132 return _splittingId;
1201 _ChainingTimeStamp = ts;
1206 _Occluders.push_back(iShape);
1223 FEdge *current = _FEdgeA;
1228 Vec2r(current->vertexA()->point2D()[0], current->vertexA()->point2D()[1]),
1229 Vec2r(current->vertexB()->point2D()[0], current->vertexB()->point2D()[1])))
1234 }
while ((current != 0) && (current != _FEdgeA));
1242 FEdge *current = _FEdgeA;
1248 Vec2r(current->vertexA()->point2D()[0], current->vertexA()->point2D()[1]),
1249 Vec2r(current->vertexB()->point2D()[0], current->vertexB()->point2D()[1])))
1254 }
while ((current != 0) && (current != _FEdgeA));
1267 float viewedge_length()
const;
1287 return _Occluders.begin();
1292 return _Occluders.end();
1297 return _Occluders.size();
1302 return _Occluders.empty();
1307 return (_FEdgeA->
aFace());
1381#ifdef WITH_CXX_GUARDEDALLOC
1382 MEM_CXX_CLASS_ALLOC_FUNCS(
"Freestyle:ViewEdge")
1398 vector<ViewVertex *> _Vertices;
1399 vector<ViewEdge *> _Edges;
1427 vector<ViewVertex *>::iterator vv, vvend;
1428 vector<ViewEdge *>::iterator ve, veend;
1430 _SShape = iBrother._SShape;
1432 vector<ViewVertex *> &vvertices = iBrother.
vertices();
1434 for (vv = vvertices.begin(), vvend = vvertices.end(); vv != vvend; vv++) {
1439 vector<ViewEdge *> &vvedges = iBrother.
edges();
1441 for (ve = vvedges.begin(), veend = vvedges.end(); ve != veend; ve++) {
1449 for (vv = _Vertices.begin(), vvend = _Vertices.end(); vv != vvend; vv++) {
1450 switch ((*vv)->getNature()) {
1458 v->setFrontEdgeA(veFrontA,
v->frontEdgeA().second);
1459 v->setFrontEdgeB(veFrontB,
v->frontEdgeB().second);
1460 v->setBackEdgeA(veBackA,
v->backEdgeA().second);
1461 v->setBackEdgeB(veBackB,
v->backEdgeB().second);
1466 vector<ViewVertex::directedViewEdge> &vedges = (
v)->viewedges();
1467 vector<ViewVertex::directedViewEdge> newEdges;
1468 for (vector<ViewVertex::directedViewEdge>::iterator ve = vedges.begin(),
1469 veend = vedges.end();
1476 (
v)->setViewEdges(newEdges);
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));
1492 (*ve)->UpdateFEdges();
1500 for (vv = vvertices.begin(), vvend = vvertices.end(); vv != vvend; vv++) {
1501 (*vv)->userdata =
nullptr;
1507 for (ve = vvedges.begin(), veend = vvedges.end(); ve != veend; ve++) {
1508 (*ve)->userdata =
nullptr;
1533 const vector<TVertex *> &iViewVertices,
1534 vector<FEdge *> &ioNewEdges,
1535 vector<ViewEdge *> &ioNewViewEdges);
1565 return _SShape->
getId();
1590 _Vertices = iVertices;
1602 _Vertices.push_back(iVertex);
1609 _Edges.push_back(iEdge);
1622#ifdef WITH_CXX_GUARDEDALLOC
1623 MEM_CXX_CLASS_ALLOC_FUNCS(
"Freestyle:ViewShape")
1641 const vector<TVertex *> &iViewVertices,
1642 vector<FEdge *> &ioNewEdges,
1643 vector<ViewEdge *> &ioNewViewEdges)
1650 vector<TVertex *>::const_iterator vv, vvend;
1651 for (vv = iViewVertices.begin(), vvend = iViewVertices.end(); vv != vvend; vv++) {
1657 sv = (*vv)->frontSVertex();
1658 sv2 = (*vv)->backSVertex();
1661 if (sv->
shape() != _SShape) {
1681 FEdge *newEdge = shape->SplitEdgeIn2(fe, sv);
1686 ioNewEdges.push_back(newEdge);
1689 if ((vva == 0) || (vvb == 0)) {
1692 shape->RemoveEdgeFromChain(vEdge->
fedgeA());
1705 newVEdge =
new ViewEdge((*vv), vvb);
1719 newId =
new Id(vEdge->
getId());
1723 newVEdge->
setId(*newId);
1734 ioNewViewEdges.push_back(newVEdge);
1737 vvb->
Replace((vEdge), newVEdge);
1748 if (sv == (*vv)->frontSVertex()) {
1750 (*vv)->setFrontEdgeA(vEdge,
true);
1751 (*vv)->setFrontEdgeB(newVEdge,
false);
1755 (*vv)->setBackEdgeA(vEdge,
true);
1756 (*vv)->setBackEdgeB(newVEdge,
false);
1770inline Vec3r ViewEdge::orientation2d(
int iCombination)
const
1772 return edge_orientation2d_function<ViewEdge>(*
this, iCombination);
1775inline Vec3r ViewEdge::orientation3d(
int iCombination)
const
1777 return edge_orientation3d_function<ViewEdge>(*
this, iCombination);
1780inline real ViewEdge::z_discontinuity(
int iCombination)
const
1782 return z_discontinuity_edge_function<ViewEdge>(*
this, iCombination);
1785inline float ViewEdge::local_average_depth(
int iCombination)
const
1787 return local_average_depth_edge_function<ViewEdge>(*
this, iCombination);
1790inline float ViewEdge::local_depth_variance(
int iCombination)
const
1792 return local_depth_variance_edge_function<ViewEdge>(*
this, iCombination);
1795inline real ViewEdge::local_average_density(
float sigma,
int iCombination)
const
1797 return density_edge_function<ViewEdge>(*
this, iCombination);
1806 return _aShape->
sshape();
1810inline Vec3r ViewEdge::curvature2d_as_vector(
int iCombination)
const
1812 return curvature2d_as_vector_edge_function<ViewEdge>(*
this, iCombination);
1815inline real ViewEdge::curvature2d_as_angle(
int iCombination)
const
1817 return curvature2d_as_angle_edge_function<ViewEdge>(*
this, iCombination);
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
void setViewEdge(ViewEdge *iViewEdge)
const Polygon3r & aFace() const
float shape_importance() const
id_type getSecond() const
void setSecond(id_type second)
virtual void Replace(ViewEdge *iOld, ViewEdge *iNew)
void AddIncomingViewEdge(ViewEdge *iVEdge)
virtual ViewVertex * duplicate()
virtual Vec3r getPoint3D() const
virtual real getProjectedX() const
edges_container & viewedges()
virtual string getExactTypeName() const
vector< directedViewEdge > edges_container
virtual ViewVertex * castToViewVertex()
virtual ViewVertexInternal::orientedViewEdgeIterator edgesBegin()
NonTVertex(NonTVertex &iBrother)
virtual edge_iterator edges_iterator(ViewEdge *iEdge)
virtual real getZ() const
virtual NonTVertex * castToNonTVertex()
virtual edge_iterator edges_begin()
virtual real getProjectedY() const
void AddViewEdge(ViewEdge *iVEdge, bool incoming=true)
void AddOutgoingViewEdge(ViewEdge *iVEdge)
virtual real getProjectedZ() const
virtual ViewVertexInternal::orientedViewEdgeIterator edgesEnd()
void setViewEdges(const vector< directedViewEdge > &iViewEdges)
virtual Vec2r getPoint2D() const
void setSVertex(SVertex *iSVertex)
virtual real getY() const
virtual real getX() const
virtual ViewVertexInternal::orientedViewEdgeIterator edgesIterator(ViewEdge *iEdge)
virtual edge_iterator edges_end()
NonTVertex(SVertex *iSVertex)
virtual SVertex * castToSVertex()
const string & getLibraryPath() const
const string & getName() const
void setViewVertex(ViewVertex *iViewVertex)
virtual Vec3r getPoint3D() const
virtual Vec2r getPoint2D() const
const Vec3r & point2D() const
const vector< FEdge * > & fedges()
const Vec3r & point3D() const
virtual real getProjectedY() const
void setId(const Id &iId)
void setBackEdgeA(ViewEdge *iBackEdgeA, bool incoming=true)
virtual edge_iterator edges_iterator(ViewEdge *iEdge)
virtual string getExactTypeName() const
virtual Vec2r getPoint2D() const
virtual ViewVertexInternal::orientedViewEdgeIterator edgesIterator(ViewEdge *iEdge)
virtual edge_iterator edges_begin()
virtual ViewVertex * castToViewVertex()
SVertex * getSVertex(FEdge *iFEdge)
virtual ViewVertex * duplicate()
directedViewEdge & backEdgeB()
void setBackEdgeB(ViewEdge *iBackEdgeB, bool incoming=true)
virtual Vec3r getPoint3D() const
virtual real getProjectedZ() const
void setBackSVertex(SVertex *iBackSVertex)
virtual real getX() const
virtual edge_iterator edges_end()
void setFrontEdgeB(ViewEdge *iFrontEdgeB, bool incoming=true)
directedViewEdge & frontEdgeB()
virtual TVertex * castToTVertex()
virtual ViewEdge * mate(ViewEdge *iEdgeA)
virtual real getProjectedX() const
TVertex(TVertex &iBrother)
directedViewEdge & frontEdgeA()
directedViewEdge & backEdgeA()
virtual void Replace(ViewEdge *iOld, ViewEdge *iNew)
virtual real getZ() const
void setFrontSVertex(SVertex *iFrontSVertex)
void setFrontEdgeA(ViewEdge *iFrontEdgeA, bool incoming=true)
TVertex(SVertex *svFront, SVertex *svBack)
virtual real getY() const
virtual ViewVertexInternal::orientedViewEdgeIterator edgesBegin()
virtual ViewVertexInternal::orientedViewEdgeIterator edgesEnd()
vector< directedViewEdge * > edge_pointers_container
const_vertex_iterator vertices_end() const
virtual string getExactTypeName() const
uint getChainingTimeStamp()
void setaShape(ViewShape *iShape)
virtual Nature::EdgeNature getNature() const
ViewEdge(ViewVertex *iA, ViewVertex *iB, FEdge *iFEdgeA, FEdge *iFEdgeB, ViewShape *iShape)
ViewEdge(ViewVertex *iA, ViewVertex *iB)
ViewEdge(ViewVertex *iA, ViewVertex *iB, FEdge *iFEdgeA)
void setFEdgeB(FEdge *iFEdge)
fedge_iterator fedge_iterator_last()
fedge_iterator fedge_iterator_end()
ViewEdgeInternal::edge_iterator_base< Const_traits< ViewEdge * > > const_edge_iterator
void setA(ViewVertex *iA)
occluder_container::const_iterator occluders_begin() const
const ViewShape * bShape() const
bool include_in_2d_area(const Vec2r &iMin, const Vec2r &iMax) const
edge_iterator ViewEdge_iterator()
view edge iterator
float shape_importance() const
bool intersect_2d_area(const Vec2r &iMin, const Vec2r &iMax) const
ViewEdgeInternal::fedge_iterator_base< Const_traits< FEdge * > > const_fedge_iterator
void setFEdgeA(FEdge *iFEdge)
const_vertex_iterator vertices_last() const
void setShape(ViewShape *iVShape)
const SShape * shape() const
virtual Interface0DIterator pointsBegin(float t=0.0f)
const bool occludee_empty() const
virtual ViewEdge * duplicate()
ViewEdgeInternal::vertex_iterator_base< Nonconst_traits< SVertex * > > vertex_iterator
const Polygon3r & occludee() const
virtual Interface0DIterator pointsEnd(float t=0.0f)
bool occluders_empty() const
int occluders_size() const
const ViewShape * aShape() const
vector< ViewShape * > & occluders()
ViewEdgeInternal::edge_iterator_base< Nonconst_traits< ViewEdge * > > edge_iterator
const_vertex_iterator vertices_begin() const
embedding vertex iterator
fedge_iterator fedge_iterator_begin()
feature edge iterator
void setSplittingId(Id *id)
virtual Interface0DIterator verticesBegin()
void AddOccluder(ViewShape *iShape)
void setChainingTimeStamp(uint ts)
ViewEdgeInternal::vertex_iterator_base< Const_traits< SVertex * > > const_vertex_iterator
void setIsInImage(bool iFlag)
virtual Interface0DIterator verticesEnd()
void setNature(Nature::EdgeNature iNature)
const SShape * occluded_shape() const
occluder_container::const_iterator occluders_end() const
ViewEdgeInternal::fedge_iterator_base< Nonconst_traits< FEdge * > > fedge_iterator
ViewEdge(ViewEdge &iBrother)
void setB(ViewVertex *iB)
vector< FEdge * > fedges_container
vector< SVertex * > svertices_container
const FEdge * getClosestFEdge(real x, real y) const
ViewShape * viewShape(uint id)
void AddViewShape(ViewShape *iVShape)
viewshapes_container & ViewShapes()
vector< ViewVertex * > viewvertices_container
viewedges_container::iterator viewedges_begin()
vector< ViewShape * > viewshapes_container
const ViewEdge * getClosestViewEdge(real x, real y) const
void AddSVertex(SVertex *iSVertex)
BBox< Vec3r > getScene3dBBox() const
vector< ViewEdge * > viewedges_container
id_to_index_map & shapeIdToIndexMap()
static ViewMap * getInstance()
TVertex * CreateTVertex(const Vec3r &iA3D, const Vec3r &iA2D, FEdge *iFEdgeA, const Vec3r &iB3D, const Vec3r &iB2D, FEdge *iFEdgeB, const Id &id)
viewedges_container::iterator viewedges_end()
viewvertices_container & ViewVertices()
void setScene3dBBox(const BBox< Vec3r > &bbox)
svertices_container & SVertices()
void AddFEdge(FEdge *iFEdge)
ViewVertex * InsertViewVertex(SVertex *iVertex, vector< ViewEdge * > &newViewEdges)
void AddViewVertex(ViewVertex *iVVertex)
void AddViewEdge(ViewEdge *iVEdge)
map< int, int > id_to_index_map
viewedges_container & ViewEdges()
fedges_container & FEdges()
const string & getName() const
void setVertices(const vector< ViewVertex * > &iVertices)
ViewShape(SShape *iSShape)
const SShape * sshape() const
void AddVertex(ViewVertex *iVertex)
void SplitEdge(FEdge *fe, const vector< TVertex * > &iViewVertices, vector< FEdge * > &ioNewEdges, vector< ViewEdge * > &ioNewViewEdges)
vector< ViewEdge * > & edges()
void setSShape(SShape *iSShape)
vector< ViewVertex * > & vertices()
virtual ViewShape * duplicate()
void RemoveVertex(ViewVertex *iViewVertex)
void setEdges(const vector< ViewEdge * > &iEdges)
void RemoveEdge(ViewEdge *iViewEdge)
void AddEdge(ViewEdge *iEdge)
ViewShape(ViewShape &iBrother)
const string & getLibraryPath() const
ViewVertexInternal::edge_iterator_base< ViewVertexInternal::edge_const_traits > const_edge_iterator
pair< ViewEdge *, bool > directedViewEdge
virtual Nature::VertexNature getNature() const
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)
virtual edge_iterator edges_end()=0
virtual ViewVertexInternal::orientedViewEdgeIterator edgesIterator(ViewEdge *iEdge)=0
virtual string getExactTypeName() const
ViewVertex(Nature::VertexNature nature)
virtual edge_iterator edges_begin()=0
virtual edge_iterator edges_iterator(ViewEdge *iEdge)=0
vector< directedViewEdge > edges_container
virtual ViewVertex * duplicate()=0
virtual void Replace(ViewEdge *, ViewEdge *)
virtual ViewVertexInternal::orientedViewEdgeIterator edgesEnd()=0
ViewVertexInternal::edge_iterator_base< ViewVertexInternal::edge_nonconst_traits > edge_iterator
void setNature(Nature::VertexNature iNature)
bool intersect2dSeg2dArea(const Vec2r &min, const Vec2r &max, const Vec2r &A, const Vec2r &B)
bool include2dSeg2dArea(const Vec2r &min, const Vec2r &max, const Vec2r &A, const Vec2r &B)
VecMat::Vec2< real > Vec2r
VecMat::Vec3< real > Vec3r
static const VertexNature VIEW_VERTEX
static const VertexNature T_VERTEX
static const VertexNature NON_T_VERTEX