27 #include "../geometry/Geom.h"
29 #include "../scene_graph/FrsMaterial.h"
31 #include "../system/FreestyleConfig.h"
35 #ifdef WITH_CXX_GUARDEDALLOC
120 inline void setEdges(
const vector<WEdge *> &iEdgeList)
122 _EdgeList = iEdgeList;
151 void AddEdge(
WEdge *iEdge);
160 #if defined(__GNUC__) && (__GNUC__ < 3)
161 class incoming_edge_iterator :
public input_iterator<WOEdge *, ptrdiff_t>
173 #if defined(__GNUC__) && (__GNUC__ < 3)
187 #if defined(__GNUC__) && (__GNUC__ < 3)
188 : input_iterator<WOEdge *, ptrdiff_t>()
190 : iterator<input_iterator_tag, WOEdge *, ptrdiff_t>()
200 #if defined(__GNUC__) && (__GNUC__ < 3)
201 : input_iterator<WOEdge *, ptrdiff_t>(iBrother)
203 : iterator<input_iterator_tag, WOEdge *, ptrdiff_t>(iBrother)
206 _vertex = iBrother._vertex;
207 _begin = iBrother._begin;
208 _current = iBrother._current;
231 return ((_current) != (b._current));
236 return ((_current) == (b._current));
243 virtual void increment();
245 #ifdef WITH_CXX_GUARDEDALLOC
246 MEM_CXX_CLASS_ALLOC_FUNCS(
"Freestyle:WVertex:incoming_edge_iterator")
251 #if defined(__GNUC__) && (__GNUC__ < 3)
252 class face_iterator :
public input_iterator<WFace *, ptrdiff_t>
254 class
face_iterator :
public iterator<input_iterator_tag, WFace *, ptrdiff_t>
261 #if defined(__GNUC__) && (__GNUC__ < 3)
262 inline face_iterator() : input_iterator<WFace *, ptrdiff_t>()
275 #if defined(__GNUC__) && (__GNUC__ < 3)
276 : input_iterator<WFace *, ptrdiff_t>()
278 : iterator<input_iterator_tag, WFace *, ptrdiff_t>()
286 #if defined(__GNUC__) && (__GNUC__ < 3)
287 : input_iterator<WFace *, ptrdiff_t>(iBrother)
289 : iterator<input_iterator_tag, WFace *, ptrdiff_t>(iBrother)
292 _edge_it = iBrother._edge_it;
315 return ((_edge_it) != (b._edge_it));
320 return ((_edge_it) == (b._edge_it));
333 #ifdef WITH_CXX_GUARDEDALLOC
334 MEM_CXX_CLASS_ALLOC_FUNCS(
"Freestyle:WVertex:face_iterator")
340 virtual incoming_edge_iterator incoming_edges_begin();
341 virtual incoming_edge_iterator incoming_edges_end();
353 #ifdef WITH_CXX_GUARDEDALLOC
354 MEM_CXX_CLASS_ALLOC_FUNCS(
"Freestyle:WVertex")
409 virtual WOEdge *duplicate();
413 inline WOEdge *GetaCWEdge()
418 inline WOEdge *GetbCWEdge()
423 inline WOEdge *GetaCCWEdge()
428 inline WOEdge *GetbCCWEdge()
471 inline void SetaCWEdge(
WOEdge *pe)
476 inline void SetbCWEdge(WOEdge *pe)
481 inline void SetaCCWEdge(WOEdge *pe)
486 inline void SetbCCCWEdge(WOEdge *pe)
492 inline void setVecAndAngle();
524 inline void RetrieveCWOrderedEdges(vector<WEdge *> &oEdges);
534 #ifdef WITH_CXX_GUARDEDALLOC
535 MEM_CXX_CLASS_ALLOC_FUNCS(
"Freestyle:WOEdge")
584 virtual WEdge *duplicate();
604 if (!iEdge1 || !iEdge2) {
613 if ((wv1 == wv3) || (wv1 == wv4)) {
616 else if ((wv2 == wv3) || (wv2 == wv4)) {
670 if (iOEdge == _paOEdge) {
723 #ifdef WITH_CXX_GUARDEDALLOC
724 MEM_CXX_CLASS_ALLOC_FUNCS(
"Freestyle:WEdge")
754 _FrsMaterialIndex = 0;
759 virtual WFace *duplicate();
772 return _OEdgeList[i];
787 return _FrsMaterialIndex;
801 if (index >= _OEdgeList.size()) {
805 return _OEdgeList[index]->GetaVertex();
814 for (vector<WOEdge *>::iterator woe = _OEdgeList.begin(), woend = _OEdgeList.end();
817 if ((*woe)->GetaVertex() == iVertex) {
827 for (vector<WOEdge *>::iterator woe = _OEdgeList.begin(), woend = _OEdgeList.end();
830 oVertices.push_back((*woe)->GetaVertex());
836 for (vector<WOEdge *>::iterator woe = _OEdgeList.begin(), woend = _OEdgeList.end();
840 if ((af = (*woe)->GetaFace())) {
841 oWFaces.push_back(af);
849 if (index >= _OEdgeList.size()) {
853 return _OEdgeList[index]->GetaFace();
863 return _VerticesNormals;
868 return _VerticesTexCoords;
874 return _VerticesNormals[index];
880 return _VerticesTexCoords[index];
888 for (vector<WOEdge *>::const_iterator woe = _OEdgeList.begin(), woend = _OEdgeList.end();
891 if ((*woe)->GetaVertex() == iVertex) {
898 return _VerticesNormals[index];
904 vector<WOEdge *>::iterator woe, woend, woefirst;
905 woefirst = _OEdgeList.begin();
906 for (woe = woefirst, woend = _OEdgeList.end(); woe != woend; ++woe) {
911 if ((*woe) == iOEdge) {
928 return _OEdgeList.size();
933 return _OEdgeList.size();
939 for (vector<WOEdge *>::const_iterator woe = _OEdgeList.begin(), woeend = _OEdgeList.end();
942 if ((*woe)->GetOwner()->GetbOEdge() == 0) {
952 _OEdgeList = iEdgeList;
962 _VerticesNormals = iNormalsList;
967 _VerticesTexCoords = iTexCoordsList;
977 _FrsMaterialIndex = iMaterialIndex;
1002 _OEdgeList.push_back(iEdge);
1019 #ifdef WITH_CXX_GUARDEDALLOC
1020 MEM_CXX_CLASS_ALLOC_FUNCS(
"Freestyle:WFace")
1047 float _meanEdgeSize;
1056 _Id = _SceneCurrentId;
1062 virtual WShape *duplicate();
1066 if (_EdgeList.size() != 0) {
1067 vector<WEdge *>::iterator
e;
1068 for (
e = _EdgeList.begin();
e != _EdgeList.end(); ++
e) {
1074 if (_VertexList.size() != 0) {
1075 vector<WVertex *>::iterator
v;
1076 for (
v = _VertexList.begin();
v != _VertexList.end(); ++
v) {
1079 _VertexList.clear();
1082 if (_FaceList.size() != 0) {
1083 vector<WFace *>::iterator f;
1084 for (f = _FaceList.begin(); f != _FaceList.end(); ++f) {
1122 return _FrsMaterials[i];
1127 return _FrsMaterials;
1131 inline const float getMeanEdgeSize()
const
1133 return _meanEdgeSize;
1144 return _LibraryPath;
1150 _SceneCurrentId =
id;
1155 _EdgeList = iEdgeList;
1160 _VertexList = iVertexList;
1165 _FaceList = iFaceList;
1183 _FrsMaterials[i] = frs_material;
1188 _FrsMaterials = iMaterials;
1198 _LibraryPath = path;
1216 virtual WFace *MakeFace(vector<WVertex *> &iVertexList,
1218 unsigned iMaterialIndex);
1231 virtual WFace *MakeFace(vector<WVertex *> &iVertexList,
1232 vector<Vec3f> &iNormalsList,
1233 vector<Vec2f> &iTexCoordsList,
1235 unsigned iMaterialIndex);
1239 _EdgeList.push_back(iEdge);
1244 _FaceList.push_back(iFace);
1250 _VertexList.push_back(iVertex);
1255 for (vector<WVertex *>::iterator
v = _VertexList.begin(), vend = _VertexList.end();
v != vend;
1257 (*v)->ResetUserData();
1260 for (vector<WEdge *>::iterator
e = _EdgeList.begin(), eend = _EdgeList.end();
e != eend;
e++) {
1261 (*e)->ResetUserData();
1263 WOEdge *oe = (*e)->GetaOEdge();
1267 oe = (*e)->GetbOEdge();
1273 for (vector<WFace *>::iterator f = _FaceList.begin(), fend = _FaceList.end(); f != fend; f++) {
1274 (*f)->ResetUserData();
1279 inline void ComputeBBox()
1281 _min = _VertexList[0]->GetVertex();
1282 _max = _VertexList[0]->GetVertex();
1285 for (vector<WVertex *>::iterator wv = _VertexList.begin(), wvend = _VertexList.end();
1288 for (
unsigned int i = 0; i < 3; i++) {
1289 v = (*wv)->GetVertex();
1290 if (
v[i] < _min[i]) {
1293 if (
v[i] > _max[i]) {
1302 inline float ComputeMeanEdgeSize()
1304 _meanEdgeSize = _meanEdgeSize / _EdgeList.size();
1305 return _meanEdgeSize;
1308 real ComputeMeanEdgeSize()
const;
1324 virtual WFace *MakeFace(vector<WVertex *> &iVertexList,
1326 unsigned iMaterialIndex,
1329 #ifdef WITH_CXX_GUARDEDALLOC
1330 MEM_CXX_CLASS_ALLOC_FUNCS(
"Freestyle:WShape")
1356 for (vector<WShape *>::iterator it = _wshapes.begin(); it != _wshapes.end(); it++) {
1365 _wshapes.push_back(wshape);
1380 vector<WShape *> _wshapes;
1383 #ifdef WITH_CXX_GUARDEDALLOC
1384 MEM_CXX_CLASS_ALLOC_FUNCS(
"Freestyle:WingedEdge")
1400 void WOEdge::RetrieveCWOrderedEdges(vector<WEdge *> &oEdges)
1402 WOEdge *currentOEdge =
this;
1405 oEdges.push_back(nextOEdge->
GetOwner());
1407 }
while (currentOEdge && (currentOEdge->
GetOwner() != GetOwner()));
1410 inline void WOEdge::setVecAndAngle()
1412 if (_paVertex && _pbVertex) {
1414 if (_paFace && _pbFace) {
1417 _angle =
M_PI / 2.0;
1421 _angle = -
M_PI / 2.0;
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble v1
Read Guarded memory(de)allocation.
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
ATTR_WARN_UNUSED_RESULT const BMVert * v
short GetNumberOfOEdges()
static WVertex * CommonVertex(WEdge *iEdge1, WEdge *iEdge2)
WEdge(WOEdge *iaOEdge, WOEdge *ibOEdge)
WOEdge * GetOtherOEdge(WOEdge *iOEdge)
virtual void ResetUserData()
void setaOEdge(WOEdge *iEdge)
void setbOEdge(WOEdge *iEdge)
void setNumberOfOEdges(short n)
void AddOEdge(WOEdge *iEdge)
unsigned frs_materialIndex() const
Vec3f & GetVertexNormal(WVertex *iVertex)
vector< Vec3f > & GetPerVertexNormals()
Vec3f & GetVertexNormal(int index)
vector< Vec2f > _VerticesTexCoords
Vec2f & GetVertexTexCoords(int index)
void RetrieveBorderFaces(vector< const WFace * > &oWFaces)
void setNormal(const Vec3f &iNormal)
void setFrsMaterialIndex(unsigned iMaterialIndex)
virtual WEdge * instanciateEdge() const
void AddEdge(WOEdge *iEdge)
int numberOfEdges() const
vector< WOEdge * > _OEdgeList
unsigned _FrsMaterialIndex
int numberOfVertices() const
void setEdgeList(const vector< WOEdge * > &iEdgeList)
virtual void ResetUserData()
WOEdge * GetNextOEdge(WOEdge *iOEdge)
WVertex * GetVertex(unsigned int index)
void setNormalList(const vector< Vec3f > &iNormalsList)
void setTexCoordsList(const vector< Vec2f > &iTexCoordsList)
vector< Vec2f > & GetPerVertexTexCoords()
WFace * GetBordingFace(WOEdge *iOEdge)
const vector< WOEdge * > & getEdgeList()
WFace * GetBordingFace(int index)
void RetrieveVertexList(vector< WVertex * > &oVertices)
vector< Vec3f > _VerticesNormals
int GetIndex(WVertex *iVertex)
void setbVertex(WVertex *pv)
void setaVertex(WVertex *pv)
virtual void ResetUserData()
vector< WEdge * > & getEdgeList()
void setFrsMaterials(const vector< FrsMaterial > &iMaterials)
void setVertexList(const vector< WVertex * > &iVertexList)
vector< FrsMaterial > _FrsMaterials
void setEdgeList(const vector< WEdge * > &iEdgeList)
virtual WFace * instanciateFace() const
static void setCurrentId(const unsigned id)
void setName(const string &name)
const string & getLibraryPath() const
static unsigned _SceneCurrentId
void setLibraryPath(const string &path)
const string & getName() const
void setFaceList(const vector< WFace * > &iFaceList)
void AddVertex(WVertex *iVertex)
vector< WFace * > _FaceList
vector< WVertex * > _VertexList
const vector< FrsMaterial > & frs_materials() const
void AddEdge(WEdge *iEdge)
void AddFace(WFace *iFace)
vector< WVertex * > & getVertexList()
void setFrsMaterial(const FrsMaterial &frs_material, unsigned i)
vector< WFace * > & GetFaceList()
vector< WEdge * > _EdgeList
const FrsMaterial & frs_material(unsigned i) const
face_iterator(incoming_edge_iterator it)
face_iterator(const face_iterator &iBrother)
virtual bool operator!=(const face_iterator &b) const
virtual face_iterator operator++(int)
virtual bool operator==(const face_iterator &b) const
virtual face_iterator & operator++()
virtual ~incoming_edge_iterator()
virtual bool operator!=(const incoming_edge_iterator &b) const
virtual bool operator==(const incoming_edge_iterator &b) const
virtual incoming_edge_iterator operator++(int)
incoming_edge_iterator(WVertex *iVertex, WOEdge *iBegin, WOEdge *iCurrent)
incoming_edge_iterator(const incoming_edge_iterator &iBrother)
virtual incoming_edge_iterator & operator++()
void setVertex(const Vec3f &v)
vector< WEdge * > & GetEdges()
virtual face_iterator faces_end()
virtual void ResetUserData()
vector< WEdge * > _EdgeList
void setEdges(const vector< WEdge * > &iEdgeList)
virtual face_iterator faces_begin()
void setShape(WShape *iShape)
vector< WShape * > & getWShapes()
void addWShape(WShape *wshape)
#define pf(_x, _i)
Prefetch 64.
static void clear(Message *msg)
Vec< T, N > operator*(const typename Vec< T, N >::value_type r, const Vec< T, N > &v)
INLINE Rall1d< T, V, S > asin(const Rall1d< T, V, S > &x)