110 return Vec2r(_Point2D.x(), _Point2D.y());
145 vector<FEdge *> _FEdges;
149 real _curvatureFredo;
150 Vec2r _directionFredo;
187 _Normals = iBrother._Normals;
188 _FEdges = iBrother.
fedges();
189 _Shape = iBrother.
shape();
190 _pViewVertex = iBrother._pViewVertex;
191 if (!(iBrother._curvature_info)) {
195 _curvature_info =
new CurvatureInfo(*(iBrother._curvature_info));
204 if (_curvature_info) {
205 delete _curvature_info;
219 return ((_Point2D == iBrother._Point2D) && (_Point3D == iBrother._Point3D));
245 return _Normals.size();
255 return _FEdges.begin();
260 return _FEdges.end();
298 _Normals.insert(iNormal);
303 if (_curvature_info) {
304 delete _curvature_info;
306 _curvature_info = ci;
311 return _curvature_info;
316 void setCurvatureFredo(
real c)
321 void setDirectionFredo(
Vec2r d)
326 real curvatureFredo()
328 return _curvatureFredo;
331 const Vec2r directionFredo()
333 return _directionFredo;
355 _pViewVertex = iViewVertex;
361 _FEdges.push_back(iFEdge);
367 for (vector<FEdge *>::iterator fe = _FEdges.begin(), fend = _FEdges.end(); fe != fend; fe++) {
368 if (iFEdge == (*fe)) {
378 vector<FEdge *>::iterator insertedfe;
379 for (vector<FEdge *>::iterator fe = _FEdges.begin(), fend = _FEdges.end(); fe != fend; fe++) {
381 insertedfe = _FEdges.insert(fe, e2);
385 _FEdges.erase(insertedfe);
407 if (_Normals.size() == 1) {
408 return (*(_Normals.begin()));
411 return *(_Normals.begin());
429 inline float local_average_depth()
const;
430 inline float local_depth_variance()
const;
431 inline real local_average_density(
float sigma = 2.3f)
const;
432 inline Vec3r shaded_color()
const;
433 inline Vec3r orientation2d()
const;
434 inline Vec3r orientation3d()
const;
435 inline Vec3r curvature2d_as_vector()
const;
437 inline real curvature2d_as_angle()
const;
440 MEM_CXX_CLASS_ALLOC_FUNCS(
"Freestyle:SVertex")
640 return _Occluders.size();
670 inline bool hasVisibilityPoint()
const
672 return _hasVisibilityPoint;
675 inline Vec3r visibilityPointA()
const
677 return _VisibilityPointA;
680 inline Vec3r visibilityPointB()
const
682 return _VisibilityPointB;
755 inline void AddOccluder(
Polygon3r &iPolygon)
757 _Occluders.push_back(iPolygon);
768 inline void setHasVisibilityPoint(
bool iBool)
770 _hasVisibilityPoint = iBool;
773 inline void setVisibilityPointA(
const Vec3r &iPoint)
775 _VisibilityPointA = iPoint;
778 inline void setVisibilityPointB(
const Vec3r &iPoint)
780 _VisibilityPointB = iPoint;
822 if ((
nullptr == iEdge1) || (
nullptr == iEdge2)) {
831 if ((sv1 == sv3) || (sv1 == sv4)) {
834 else if ((sv2 == sv3) || (sv2 == sv4)) {
868 inline int qi()
const
896 inline float local_average_depth(
int iCombination = 0)
const;
897 inline float local_depth_variance(
int iCombination = 0)
const;
898 inline real local_average_density(
float sigma = 2.3f,
int iCombination = 0)
const;
899 inline Vec3r shaded_color(
int iCombination = 0)
const {}
917 inline real curvature2d()
const
922 inline Vec3r curvature2d_as_vector(
int iCombination = 0)
const;
925 inline real curvature2d_as_angle(
int iCombination = 0)
const;
941 virtual inline Interface0DIterator
pointsBegin(
float t = 0.0f);
949 virtual inline Interface0DIterator
pointsEnd(
float t = 0.0f);
951 MEM_CXX_CLASS_ALLOC_FUNCS(
"Freestyle:FEdge")
971 _vertex = vi._vertex;
983 _vertex = vi._vertex;
990 return "SVertexIterator";
1031 if (_vertex == _edge->vertexB()) {
1035 _vertex = _edge->vertexB();
1041 if (_vertex == _edge->vertexA()) {
1045 _vertex = _edge->vertexA();
1051 return _vertex == _edge->vertexA();
1056 return _vertex == _edge->vertexB();
1065 return ((_vertex == it_exact->_vertex) && (_edge == it_exact->_edge));
1068 virtual float t()
const
1070 if (_vertex == _edge->vertexA()) {
1073 return ((
float)_edge->getLength2D());
1075 virtual float u()
const
1077 if (_vertex == _edge->vertexA()) {
1137 return "FEdgeSharp";
1262 MEM_CXX_CLASS_ALLOC_FUNCS(
"Freestyle:FEdgeSharp")
1273 bool _hasVisibilityPoint;
1274 Vec3r _VisibilityPointA;
1275 Vec3r _VisibilityPointB;
1285 return "FEdgeSmooth";
1375 MEM_CXX_CLASS_ALLOC_FUNCS(
"Freestyle:FEdgeSmooth")
1390 vector<FEdge *> _chains;
1391 vector<SVertex *> _verticesList;
1392 vector<FEdge *> _edgesList;
1395 string _LibraryPath;
1397 vector<FrsMaterial> _FrsMaterials;
1414 _ViewShape =
nullptr;
1422 _Name = iBrother._Name;
1423 _LibraryPath = iBrother._LibraryPath;
1424 _BBox = iBrother.
bbox();
1425 _FrsMaterials = iBrother._FrsMaterials;
1426 _importance = iBrother._importance;
1427 _ViewShape = iBrother._ViewShape;
1432 vector<SVertex *>::iterator sv, svend;
1434 for (sv = verticesList.begin(), svend = verticesList.end(); sv != svend; sv++) {
1437 _verticesList.push_back(newv);
1443 vector<FEdge *>::iterator
e, eend;
1444 vector<FEdge *> &edgesList = iBrother.
getEdgeList();
1445 for (
e = edgesList.begin(), eend = edgesList.end();
e != eend;
e++) {
1447 _edgesList.push_back(newe);
1453 vector<FEdge *>::iterator fe, fend;
1454 vector<FEdge *> &fedges = iBrother.
getChains();
1455 for (fe = fedges.begin(), fend = fedges.end(); fe != fend; fe++) {
1456 _chains.push_back((
FEdge *)((*fe)->userdata));
1462 for (sv = _verticesList.begin(), svend = _verticesList.end(); sv != svend; sv++) {
1463 const vector<FEdge *> &fedgeList = (*sv)->fedges();
1464 vector<FEdge *> newfedgelist;
1465 for (vector<FEdge *>::const_iterator fed = fedgeList.begin(), fedend = fedgeList.end();
1469 FEdge *current = *fed;
1472 (*sv)->setFEdges(newfedgelist);
1478 for (
e = _edgesList.begin(), eend = _edgesList.end();
e != eend;
e++) {
1479 (*e)->setVertexA((
SVertex *)((*e)->vertexA()->userdata));
1480 (*e)->setVertexB((
SVertex *)((*e)->vertexB()->userdata));
1481 (*e)->setNextEdge((
FEdge *)((*e)->nextEdge()->userdata));
1482 (*e)->setPreviousEdge((
FEdge *)((*e)->previousEdge()->userdata));
1490 for (sv = _verticesList.begin(), svend = _verticesList.end(); sv != svend; sv++) {
1491 (*sv)->userdata =
nullptr;
1497 for (
e = _edgesList.begin(), eend = _edgesList.end();
e != eend;
e++) {
1498 (*e)->userdata =
nullptr;
1512 vector<SVertex *>::iterator sv, svend;
1513 vector<FEdge *>::iterator
e, eend;
1514 if (0 != _verticesList.size()) {
1515 for (sv = _verticesList.begin(), svend = _verticesList.end(); sv != svend; sv++) {
1518 _verticesList.clear();
1521 if (0 != _edgesList.size()) {
1522 for (
e = _edgesList.begin(), eend = _edgesList.end();
e != eend;
e++) {
1530 if (0 != _chains.size()) {
1538 _edgesList.push_back(iEdge);
1547 _verticesList.push_back(iv);
1552 _chains.push_back(iEdge);
1581 inline void SplitEdge(
FEdge *fe,
const vector<Vec2r> &iParameters, vector<FEdge *> &ioNewEdges)
1590 Vec3r newpoint3d, newpoint2d;
1591 vector<SVertex *> intersections;
1593 for (vector<Vec2r>::const_iterator p = iParameters.begin(), pend = iParameters.end();
1600 if ((t < 0) || (t > 1)) {
1601 cerr <<
"Warning: Intersection out of range for edge " << ioA->
getId() <<
" - "
1602 << ioB->
getId() << endl;
1606 newpoint3d =
Vec3r(
A + T * (
B -
A));
1607 newpoint2d =
Vec3r(
a + t * (
b -
a));
1615 intersections.push_back(newVertex);
1621 for (vector<SVertex *>::iterator sv = intersections.begin(), svend = intersections.end();
1632 (fe)->setVertexB((*sv));
1656 ioNewEdges.push_back(newEdge);
1667 (fe)->setNextEdge(
nullptr);
1673 (*sv)->AddFEdge((fe));
1674 (*sv)->AddFEdge(newEdge);
1730 B->Replace(ioEdge, newEdge);
1758 if (0 == _verticesList.size()) {
1762 Vec3r firstVertex = _verticesList[0]->point3D();
1763 real XMax = firstVertex[0];
1764 real YMax = firstVertex[1];
1765 real ZMax = firstVertex[2];
1767 real XMin = firstVertex[0];
1768 real YMin = firstVertex[1];
1769 real ZMin = firstVertex[2];
1771 vector<SVertex *>::iterator
v, vend;
1773 for (
v = _verticesList.begin(), vend = _verticesList.end();
v != vend;
v++) {
1774 Vec3r vertex = (*v)->point3D();
1780 else if (
x < XMin) {
1789 else if (
y < YMin) {
1798 else if (
z < ZMin) {
1808 for (vector<FEdge *>::iterator fe = _chains.begin(), feend = _chains.end(); fe != feend; fe++)
1810 if (iEdge == (*fe)) {
1819 for (vector<FEdge *>::iterator fe = _edgesList.begin(), feend = _edgesList.end(); fe != feend;
1822 if (iEdge == (*fe)) {
1823 _edgesList.erase(fe);
1833 return _verticesList;
1856 return _FrsMaterials[
i];
1862 return _FrsMaterials;
1890 return _LibraryPath;
1909 _LibraryPath = path;
1915 _FrsMaterials = iMaterials;
1920 _ViewShape = iShape;
1928 MEM_CXX_CLASS_ALLOC_FUNCS(
"Freestyle:SShape")
A class to hold a bounding box.
GTS - Library for the manipulation of triangulated surfaces.
Singleton to manage exceptions.
Configuration definitions.
Class used to handle materials.
Vectors and Matrices (useful type definitions).
Interface to 0D elements.
Interface 1D and related tools definitions.
Read Guarded memory(de)allocation.
Class to define a polygon.
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
ATTR_WARN_UNUSED_RESULT const BMVert * v
SIMD_FORCE_INLINE const btScalar & z() const
Return the z value.
static int raiseException(exception_type exception=UNDEFINED)
virtual bool isEnd() const
virtual SVertex & operator*()
SVertexIterator & operator=(const SVertexIterator &vi)
virtual SVertexIterator & operator--()
virtual bool operator==(const Interface0DIteratorNested &it) const
virtual string getExactTypeName() const
virtual bool isBegin() const
SVertexIterator(const SVertexIterator &vi)
virtual SVertexIterator operator--(int)
virtual SVertex * operator->()
SVertexIterator(SVertex *v, FEdge *edge)
virtual SVertexIterator * copy() const
virtual SVertexIterator & operator++()
virtual SVertexIterator operator++(int)
const FrsMaterial & aFrsMaterial() const
void setaFaceMark(bool iFaceMark)
void setaFrsMaterialIndex(uint i)
virtual string getExactTypeName() const
uint aFrsMaterialIndex() const
FEdgeSharp(FEdgeSharp &iBrother)
void setNormalB(const Vec3r &iNormal)
const FrsMaterial & bFrsMaterial() const
void setbFrsMaterialIndex(uint i)
FEdgeSharp(SVertex *vA, SVertex *vB)
void setbFaceMark(bool iFaceMark)
virtual FEdge * duplicate()
void setNormalA(const Vec3r &iNormal)
uint bFrsMaterialIndex() const
virtual string getExactTypeName() const
void setNormal(const Vec3r &iNormal)
void setFrsMaterialIndex(uint i)
virtual FEdge * duplicate()
FEdgeSmooth(FEdgeSmooth &iBrother)
const FrsMaterial & frs_material() const
FEdgeSmooth(SVertex *vA, SVertex *vB)
void setFaceMark(bool iFaceMark)
void setFace(void *iFace)
uint frs_materialIndex() const
virtual Interface0DIterator verticesBegin()
void setOccludeeEmpty(bool iempty)
ViewEdge * viewedge() const
void setTemporary(bool iFlag)
bool occluders_empty() const
int occluders_size() const
void setVertexB(SVertex *vB)
occluder_container::const_iterator occluders_end() const
const SVertex * max2d() const
occluder_container::const_iterator occluders_begin() const
static SVertex * CommonVertex(FEdge *iEdge1, FEdge *iEdge2)
virtual FEdge * duplicate()
virtual Interface0DIterator pointsBegin(float t=0.0f)
const SVertex * min2d() const
Vec3r orientation2d() const
void setViewEdge(ViewEdge *iViewEdge)
const Polygon3r & aFace() const
const SShape * occluded_shape() const
int viewedge_nature() const
void setNextEdge(FEdge *iEdge)
SVertex * operator[](const ushort &i) const
FEdge(SVertex *vA, SVertex *vB)
virtual real getLength2D() const
void setNature(Nature::EdgeNature iNature)
Vec3r _occludeeIntersection
virtual Interface0DIterator pointsEnd(float t=0.0f)
void setSmooth(bool iFlag)
void setPreviousEdge(FEdge *iEdge)
void setIsInImage(bool iFlag)
virtual string getExactTypeName() const
float shape_importance() const
void setaFace(Polygon3r &iFace)
virtual Interface0DIterator verticesEnd()
Vec3r orientation3d() const
void setVertexA(SVertex *vA)
Nature::EdgeNature getNature() const
void setOccludeeIntersection(const Vec3r &iPoint)
real z_discontinuity() const
Nature::EdgeNature _Nature
const Vec3r & getOccludeeIntersection()
const Polygon3r & occludee() const
bool occludee_empty() const
id_type getSecond() const
void RemoveEdgeFromChain(FEdge *iEdge)
vector< SVertex * > & getVertexList()
FEdge * SplitEdgeIn2(FEdge *ioEdge, SVertex *ioNewVertex)
void AddChain(FEdge *iEdge)
void setFrsMaterials(const vector< FrsMaterial > &iMaterials)
void setImportance(float importance)
void setViewShape(ViewShape *iShape)
const BBox< Vec3r > & bbox()
const vector< FrsMaterial > & frs_materials() const
virtual SShape * duplicate()
SVertex * CreateSVertex(const Vec3r &P3D, const Vec3r &P2D, const Id &id)
void setLibraryPath(const string &path)
vector< FEdge * > & getChains()
void SplitEdge(FEdge *fe, const vector< Vec2r > &iParameters, vector< FEdge * > &ioNewEdges)
void RemoveEdge(FEdge *iEdge)
void setBBox(const BBox< Vec3r > &iBBox)
void AddNewVertex(SVertex *iv)
const FrsMaterial & frs_material(uint i) const
void setName(const string &name)
vector< FEdge * > & getEdgeList()
const string & getLibraryPath() const
const string & getName() const
void AddEdge(FEdge *iEdge)
virtual bool operator==(const SVertex &iBrother)
ViewVertex * viewvertex()
const SShape * occluded_shape() const
virtual FEdge * getFEdge(Interface0D &)
virtual real getY() const
void setPoint2D(const Vec3r &iPoint2D)
void setViewVertex(ViewVertex *iViewVertex)
void setShape(SShape *iShape)
fedges_container::iterator fedges_begin()
virtual Vec3r getPoint3D() const
void setCurvatureInfo(CurvatureInfo *ci)
virtual ViewVertex * castToViewVertex()
real z_discontinuity() const
occluder_container::const_iterator occluders_begin() const
virtual real getX() const
fedges_container::iterator fedges_end()
bool occluders_empty() const
void AddNormal(const Vec3r &iNormal)
const Vec3r & point3d() const
virtual Vec2r getPoint2D() const
virtual string getExactTypeName() const
virtual NonTVertex * castToNonTVertex()
void setPoint3D(const Vec3r &iPoint3D)
virtual SVertex * castToSVertex()
void AddFEdge(FEdge *iFEdge)
occluder_container::const_iterator occluders_end() const
virtual real getProjectedZ() const
virtual TVertex * castToTVertex()
const Vec3r & point2d() const
virtual Nature::VertexNature getNature() const
int occluders_size() const
virtual real getZ() const
const Polygon3r & occludee() const
const Vec3r & point2D() const
void RemoveFEdge(FEdge *iFEdge)
const vector< FEdge * > & fedges()
virtual real getProjectedY() const
vector< FEdge * > fedges_container
SVertex(const Vec3r &iPoint3D, const Id &id)
virtual SVertex * duplicate()
void setFEdges(const vector< FEdge * > &iFEdges)
bool occludee_empty() const
virtual real getProjectedX() const
SVertex(SVertex &iBrother)
const Vec3r & point3D() const
float shape_importance() const
void Replace(FEdge *e1, FEdge *e2)
const CurvatureInfo * getCurvatureInfo() const
VecMat::Vec2< real > Vec2r
VecMat::Vec3< real > Vec3r
static const EdgeNature NO_FEATURE
vector< ViewShape * > occluder_container