Blender V4.3
WEdge.cpp
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2008-2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
10#include <iostream>
11
12#include "WEdge.h"
13
14#include "BLI_sys_types.h"
15
16namespace Freestyle {
17
20 public:
22};
23
24class oedgedata {
25 public:
27};
28
29class edgedata {
30 public:
32};
33
34class facedata {
35 public:
37};
38
39/**********************************
40 * *
41 * *
42 * WVertex *
43 * *
44 * *
45 **********************************/
46
48{
49 _Id = iBrother._Id;
50 _Vertex = iBrother._Vertex;
51 _EdgeList = iBrother._EdgeList;
52
53 _Shape = iBrother._Shape;
54 _Smooth = iBrother._Smooth;
55 _Border = iBrother._Border;
56 userdata = nullptr;
57 iBrother.userdata = new vertexdata;
58 ((vertexdata *)(iBrother.userdata))->_copy = this;
59}
60
62{
63 WVertex *clone = new WVertex(*this);
64 return clone;
65}
66
71
73{
74 WOEdge *twin = _current->twin();
75 if (!twin) {
76 // we reached a hole
77 _current = nullptr;
78 return;
79 }
80 WOEdge *next = twin->getPrevOnFace();
81 if (next == _begin) {
82 next = nullptr;
83 }
84 _current = next;
85}
86
88{
89 WOEdge *woedge = *_edge_it;
90 if (!woedge) {
91 return nullptr;
92 }
93 return (woedge)->GetbFace();
94}
95
96#if 0
97bool WVertex::isBoundary() const
98{
99 return _Border;
100}
101#endif
103{
104 if (_Border == 1) {
105 return true;
106 }
107 if (_Border == 0) {
108 return false;
109 }
110
111 vector<WEdge *>::const_iterator it;
112 for (it = _EdgeList.begin(); it != _EdgeList.end(); it++) {
113 if ((*it)->GetNumberOfOEdges() == 1) {
114 _Border = 1;
115 return true;
116 }
117 }
118#if 0
119 if (!(*it)->GetaOEdge()->GetaFace()) {
120 return true;
121 }
122#endif
123 _Border = 0;
124 return false;
125}
126
128{
129 _EdgeList.push_back(iEdge);
130}
131
133{
134 WOEdge *begin;
135 WEdge *wedge = _EdgeList.front();
136 WOEdge *aOEdge = wedge->GetaOEdge();
137 if (aOEdge->GetbVertex() == this) {
138 begin = aOEdge;
139 }
140 else {
141 begin = _EdgeList.front()->GetbOEdge();
142 }
143 return incoming_edge_iterator(this, begin, begin);
144}
145
147{
148 WOEdge *begin;
149 WOEdge *aOEdge = _EdgeList.front()->GetaOEdge();
150 if (aOEdge->GetbVertex() == this) {
151 begin = aOEdge;
152 }
153 else {
154 begin = _EdgeList.front()->GetbOEdge();
155 }
156 return incoming_edge_iterator(this, begin, nullptr);
157}
158#if 0
159WOEdge **WVertex::incoming_edge_iterator::operator->()
160{
161 WOEdge **ppaOEdge = (*_iter)->GetaOEdge();
162 if (aOEdge->GetbVertex() == _vertex) {
163 return ppaOEdge;
164 }
165 else {
166 WOEdge *bOEdge = (*_iter)->GetbOEdge();
167 return &bOEdge;
168 }
169}
170#endif
171
172/**********************************
173 * *
174 * *
175 * WOEdge *
176 * *
177 * *
178 **********************************/
179
181{
182 _paVertex = iBrother.GetaVertex();
183 _pbVertex = iBrother.GetbVertex();
184 _paFace = iBrother.GetaFace();
185 _pbFace = iBrother.GetbFace();
186 _pOwner = iBrother.GetOwner();
187 userdata = nullptr;
188 iBrother.userdata = new oedgedata;
189 ((oedgedata *)(iBrother.userdata))->_copy = this;
190
191 _vec = iBrother._vec;
192 _angle = iBrother._angle;
193}
194
196{
197 WOEdge *clone = new WOEdge(*this);
198 return clone;
199}
200
202{
203 return GetOwner()->GetOtherOEdge(this);
204}
205
207{
208 return _pbFace->GetPrevOEdge(this);
209}
210
211/**********************************
212 * *
213 * *
214 * WEdge *
215 * *
216 * *
217 **********************************/
218
220{
221 _paOEdge = nullptr;
222 _pbOEdge = nullptr;
223 WOEdge *aoedge = iBrother.GetaOEdge();
224 WOEdge *boedge = iBrother.GetbOEdge();
225 userdata = nullptr;
226
227 if (aoedge) {
228 //_paOEdge = new WOEdge(*aoedge);
229 _paOEdge = aoedge->duplicate();
230 }
231 if (boedge) {
232 //_pbOEdge = new WOEdge(*boedge);
233 _pbOEdge = boedge->duplicate();
234 }
235
236 _nOEdges = iBrother.GetNumberOfOEdges();
237 _Id = iBrother.GetId();
238 iBrother.userdata = new edgedata;
239 ((edgedata *)(iBrother.userdata))->_copy = this;
240}
241
243{
244 WEdge *clone = new WEdge(*this);
245 return clone;
246}
247
248/**********************************
249 * *
250 * *
251 * WFace *
252 * *
253 * *
254 **********************************/
255
257{
258 _OEdgeList = iBrother.getEdgeList();
259 _Normal = iBrother.GetNormal();
260 _VerticesNormals = iBrother._VerticesNormals;
261 _VerticesTexCoords = iBrother._VerticesTexCoords;
262 _Id = iBrother.GetId();
263 _FrsMaterialIndex = iBrother._FrsMaterialIndex;
264 _Mark = iBrother._Mark;
265 userdata = nullptr;
266 iBrother.userdata = new facedata;
267 ((facedata *)(iBrother.userdata))->_copy = this;
268}
269
271{
272 WFace *clone = new WFace(*this);
273 return clone;
274}
275
277{
278 return getShape()->frs_material(_FrsMaterialIndex);
279}
280
282{
283 // First check whether the same oriented edge already exists or not:
284 vector<WEdge *> &v1Edges = v1->GetEdges();
285 for (vector<WEdge *>::iterator it1 = v1Edges.begin(), end = v1Edges.end(); it1 != end; it1++) {
286 WEdge *we = (*it1);
287 WOEdge *woea = we->GetaOEdge();
288
289 if ((woea->GetaVertex() == v1) && (woea->GetbVertex() == v2)) {
290 // The oriented edge already exists
291 cerr << "Warning: edge " << v1->GetId() << " - " << v2->GetId()
292 << " appears twice, correcting" << endl;
293 // Adds the edge to the face
294 AddEdge(woea);
295 (*it1)->setNumberOfOEdges((*it1)->GetNumberOfOEdges() + 1);
296 // sets these vertices as border:
297 v1->setBorder(true);
298 v2->setBorder(true);
299 return woea;
300 }
301
302 WOEdge *woeb = we->GetbOEdge();
303 if (woeb && (woeb->GetaVertex() == v1) && (woeb->GetbVertex() == v2)) {
304 // The oriented edge already exists
305 cerr << "Warning: edge " << v1->GetId() << " - " << v2->GetId()
306 << " appears twice, correcting" << endl;
307 // Adds the edge to the face
308 AddEdge(woeb);
309 (*it1)->setNumberOfOEdges((*it1)->GetNumberOfOEdges() + 1);
310 // sets these vertices as border:
311 v1->setBorder(true);
312 v2->setBorder(true);
313 return woeb;
314 }
315 }
316
317 // the oriented edge we're about to build
318 WOEdge *pOEdge = new WOEdge;
319 // The edge containing the oriented edge.
320 WEdge *edge;
321
322 // checks whether this edge already exists or not
323 // If it exists, it points outward v2
324 bool exist = false;
325 WOEdge *pInvertEdge = nullptr; // The inverted edge if it exists
326 vector<WEdge *> &v2Edges = v2->GetEdges();
327 vector<WEdge *>::iterator it;
328 for (it = v2Edges.begin(); it != v2Edges.end(); it++) {
329 if ((*it)->GetbVertex() == v1) {
330 // The invert edge already exists
331 exist = true;
332 pInvertEdge = (*it)->GetaOEdge();
333 break;
334 }
335 }
336
337 // DEBUG:
338 if (true == exist) { // The invert edge already exists
339 // Retrieves the corresponding edge
340 edge = pInvertEdge->GetOwner();
341
342 // Sets the a Face (retrieved from pInvertEdge
343 pOEdge->setaFace(pInvertEdge->GetbFace());
344
345 // Updates the invert edge:
346 pInvertEdge->setaFace(this);
347 }
348 else { // The invert edge does not exist yet
349 // we must create a new edge
350 // edge = new WEdge;
351 edge = instanciateEdge();
352
353 // updates the a,b vertex edges list:
354 v1->AddEdge(edge);
355 v2->AddEdge(edge);
356 }
357
358 pOEdge->setOwner(edge);
359 // Add the vertices:
360 pOEdge->setaVertex(v1);
361 pOEdge->setbVertex(v2);
362
363 // Debug:
364 if (v1->GetId() == v2->GetId()) {
365 cerr << "Warning: edge " << this << " null with vertex " << v1->GetId() << endl;
366 }
367
368 edge->AddOEdge(pOEdge);
369 // edge->setNumberOfOEdges(edge->GetNumberOfOEdges() + 1);
370
371 // Add this face (the b face)
372 pOEdge->setbFace(this);
373
374 // Adds the edge to the face
375 AddEdge(pOEdge);
376
377 return pOEdge;
378}
379
381{
382 if (_OEdgeList.size() != 3) {
383 return false;
384 }
385
386 vector<WOEdge *>::iterator it;
387 e = nullptr;
388 for (it = _OEdgeList.begin(); it != _OEdgeList.end(); it++) {
389 if ((*it)->GetaVertex() == v) {
390 e = *it;
391 }
392 }
393 if (!e) {
394 return false;
395 }
396 e = nullptr;
397 for (it = _OEdgeList.begin(); it != _OEdgeList.end(); it++) {
398 if (((*it)->GetaVertex() != v) && ((*it)->GetbVertex() != v)) {
399 e = *it;
400 }
401 }
402 if (!e) {
403 return false;
404 }
405
406 return true;
407}
408
410{
411 vector<WOEdge *>::iterator it;
412 Vec3f origin = (*(_OEdgeList.begin()))->GetaVertex()->GetVertex();
413 it = _OEdgeList.begin();
414 float a = 0;
415 for (it = it++; it != _OEdgeList.end(); it++) {
416 Vec3f v1 = Vec3f((*it)->GetaVertex()->GetVertex() - origin);
417 Vec3f v2 = Vec3f((*it)->GetbVertex()->GetVertex() - origin);
418 a += (v1 ^ v2).norm() / 2.0f;
419 }
420 return a;
421}
422
424{
425 vector<WOEdge *>::iterator woe, woend, woefirst;
426 woefirst = _OEdgeList.begin();
427 woend = _OEdgeList.end();
428 WOEdge *prev = *woefirst;
429 woe = woefirst;
430 ++woe;
431 for (; woe != woend; woe++) {
432 if ((*woe) == iOEdge) {
433 return prev;
434 }
435 prev = *woe;
436 }
437 // We left the loop. That means that the first OEdge was the good one:
438 if ((*woefirst) == iOEdge) {
439 return prev;
440 }
441
442 return nullptr;
443}
444
446{
447 return GetVertex(0)->shape();
448}
449
450/**********************************
451 * *
452 * *
453 * WShape *
454 * *
455 * *
456 **********************************/
457
459
461{
462 WShape *clone = new WShape(*this);
463 return clone;
464}
465
467{
468 _Id = iBrother.GetId();
469 _Name = iBrother._Name;
470 _LibraryPath = iBrother._LibraryPath;
471 _FrsMaterials = iBrother._FrsMaterials;
472#if 0
473 _meanEdgeSize = iBrother._meanEdgeSize;
474 iBrother.bbox(_min, _max);
475#endif
476 vector<WVertex *> &vertexList = iBrother.getVertexList();
477 vector<WVertex *>::iterator v = vertexList.begin(), vend = vertexList.end();
478 for (; v != vend; ++v) {
479 // WVertex *newVertex = new WVertex(*(*v));
480 WVertex *newVertex = (*v)->duplicate();
481
482 newVertex->setShape(this);
483 AddVertex(newVertex);
484 }
485
486 vector<WEdge *> &edgeList = iBrother.getEdgeList();
487 vector<WEdge *>::iterator e = edgeList.begin(), eend = edgeList.end();
488 for (; e != eend; ++e) {
489 // WEdge *newEdge = new WEdge(*(*e));
490 WEdge *newEdge = (*e)->duplicate();
491 AddEdge(newEdge);
492 }
493
494 vector<WFace *> &faceList = iBrother.GetFaceList();
495 vector<WFace *>::iterator f = faceList.begin(), fend = faceList.end();
496 for (; f != fend; ++f) {
497 // WFace *newFace = new WFace(*(*f));
498 WFace *newFace = (*f)->duplicate();
499 AddFace(newFace);
500 }
501
502 // update all pointed addresses thanks to the newly created objects:
503 vend = _VertexList.end();
504 for (v = _VertexList.begin(); v != vend; ++v) {
505 const vector<WEdge *> &vedgeList = (*v)->GetEdges();
506 vector<WEdge *> newvedgelist;
507 uint i;
508 for (i = 0; i < vedgeList.size(); i++) {
509 WEdge *current = vedgeList[i];
510 edgedata *currentvedata = (edgedata *)current->userdata;
511 newvedgelist.push_back(currentvedata->_copy);
512 }
513 (*v)->setEdges(newvedgelist);
514 }
515
516 eend = _EdgeList.end();
517 for (e = _EdgeList.begin(); e != eend; ++e) {
518 // update aOedge:
519 WOEdge *aoEdge = (*e)->GetaOEdge();
520 aoEdge->setaVertex(((vertexdata *)(aoEdge->GetaVertex()->userdata))->_copy);
521 aoEdge->setbVertex(((vertexdata *)(aoEdge->GetbVertex()->userdata))->_copy);
522 if (aoEdge->GetaFace()) {
523 aoEdge->setaFace(((facedata *)(aoEdge->GetaFace()->userdata))->_copy);
524 }
525 aoEdge->setbFace(((facedata *)(aoEdge->GetbFace()->userdata))->_copy);
526 aoEdge->setOwner(((edgedata *)(aoEdge->GetOwner()->userdata))->_copy);
527
528 // update bOedge:
529 WOEdge *boEdge = (*e)->GetbOEdge();
530 if (boEdge) {
531 boEdge->setaVertex(((vertexdata *)(boEdge->GetaVertex()->userdata))->_copy);
532 boEdge->setbVertex(((vertexdata *)(boEdge->GetbVertex()->userdata))->_copy);
533 if (boEdge->GetaFace()) {
534 boEdge->setaFace(((facedata *)(boEdge->GetaFace()->userdata))->_copy);
535 }
536 boEdge->setbFace(((facedata *)(boEdge->GetbFace()->userdata))->_copy);
537 boEdge->setOwner(((edgedata *)(boEdge->GetOwner()->userdata))->_copy);
538 }
539 }
540
541 fend = _FaceList.end();
542 for (f = _FaceList.begin(); f != fend; ++f) {
543 uint i;
544 const vector<WOEdge *> &oedgeList = (*f)->getEdgeList();
545 vector<WOEdge *> newoedgelist;
546
547 uint n = oedgeList.size();
548 for (i = 0; i < n; i++) {
549 WOEdge *current = oedgeList[i];
550 oedgedata *currentoedata = (oedgedata *)current->userdata;
551 newoedgelist.push_back(currentoedata->_copy);
552 // oedgeList[i] = currentoedata->_copy;
553 // oedgeList[i] = ((oedgedata *)(oedgeList[i]->userdata))->_copy;
554 }
555 (*f)->setEdgeList(newoedgelist);
556 }
557
558 // Free all memory (arghh!)
559 // Vertex
560 vend = iBrother.getVertexList().end();
561 for (v = iBrother.getVertexList().begin(); v != vend; ++v) {
562 delete (vertexdata *)((*v)->userdata);
563 (*v)->userdata = nullptr;
564 }
565
566 // Edges and OEdges:
567 eend = iBrother.getEdgeList().end();
568 for (e = iBrother.getEdgeList().begin(); e != eend; ++e) {
569 delete (edgedata *)((*e)->userdata);
570 (*e)->userdata = nullptr;
571 // OEdge a:
572 delete (oedgedata *)((*e)->GetaOEdge()->userdata);
573 (*e)->GetaOEdge()->userdata = nullptr;
574 // OEdge b:
575 WOEdge *oedgeb = (*e)->GetbOEdge();
576 if (oedgeb) {
577 delete (oedgedata *)(oedgeb->userdata);
578 oedgeb->userdata = nullptr;
579 }
580 }
581
582 // Faces
583 fend = iBrother.GetFaceList().end();
584 for (f = iBrother.GetFaceList().begin(); f != fend; ++f) {
585 delete (facedata *)((*f)->userdata);
586 (*f)->userdata = nullptr;
587 }
588}
589
590WFace *WShape::MakeFace(vector<WVertex *> &iVertexList,
591 vector<bool> &iFaceEdgeMarksList,
592 uint iMaterial)
593{
594 // allocate the new face
595 WFace *face = instanciateFace();
596
597 WFace *result = MakeFace(iVertexList, iFaceEdgeMarksList, iMaterial, face);
598 if (!result) {
599 delete face;
600 }
601 return result;
602}
603
604WFace *WShape::MakeFace(vector<WVertex *> &iVertexList,
605 vector<Vec3f> &iNormalsList,
606 vector<Vec2f> &iTexCoordsList,
607 vector<bool> &iFaceEdgeMarksList,
608 uint iMaterial)
609{
610 // allocate the new face
611 WFace *face = MakeFace(iVertexList, iFaceEdgeMarksList, iMaterial);
612
613 if (!face) {
614 return nullptr;
615 }
616
617 // set the list of per-vertex normals
618 face->setNormalList(iNormalsList);
619 // set the list of per-vertex tex coords
620 face->setTexCoordsList(iTexCoordsList);
621
622 return face;
623}
624
625WFace *WShape::MakeFace(vector<WVertex *> &iVertexList,
626 vector<bool> &iFaceEdgeMarksList,
627 uint iMaterial,
628 WFace *face)
629{
630 int id = _FaceList.size();
631
632 face->setFrsMaterialIndex(iMaterial);
633
634 // Check whether we have a degenerated face:
635
636 // LET'S HACK IT FOR THE TRIANGLE CASE:
637
638 if (3 == iVertexList.size()) {
639 if ((iVertexList[0] == iVertexList[1]) || (iVertexList[0] == iVertexList[2]) ||
640 (iVertexList[2] == iVertexList[1]))
641 {
642 cerr << "Warning: degenerated triangle detected, correcting" << endl;
643 return nullptr;
644 }
645 }
646
647 vector<WVertex *>::iterator it;
648
649 // compute the face normal (v1v2 ^ v1v3)
650 // Double precision numbers are used here to avoid truncation errors [#47705]
651 Vec3r v1, v2, v3;
652 it = iVertexList.begin();
653 v1 = (*it)->GetVertex();
654 it++;
655 v2 = (*it)->GetVertex();
656 it++;
657 v3 = (*it)->GetVertex();
658
659 Vec3r vector1(v2 - v1);
660 Vec3r vector2(v3 - v1);
661
662 Vec3r normal(vector1 ^ vector2);
663 normal.normalize();
664 face->setNormal(normal);
665
666 vector<bool>::iterator mit = iFaceEdgeMarksList.begin();
667 face->setMark(*mit);
668 mit++;
669
670 // vertex pointers used to build each edge
671 vector<WVertex *>::iterator va, vb;
672
673 va = iVertexList.begin();
674 vb = va;
675 for (; va != iVertexList.end(); va = vb) {
676 ++vb;
677 // Adds va to the vertex list:
678 // face->AddVertex(*va);
679
680 WOEdge *oedge;
681 if (*va == iVertexList.back()) {
682 oedge = face->MakeEdge(*va, iVertexList.front()); // for the last (closing) edge
683 }
684 else {
685 oedge = face->MakeEdge(*va, *vb);
686 }
687
688 if (!oedge) {
689 return nullptr;
690 }
691
692 WEdge *edge = oedge->GetOwner();
693 if (1 == edge->GetNumberOfOEdges()) {
694 // means that we just created a new edge and that we must add it to the shape's edges list
695 edge->setId(_EdgeList.size());
696 AddEdge(edge);
697#if 0
698 // compute the mean edge value:
699 _meanEdgeSize += edge->GetaOEdge()->GetVec().norm();
700#endif
701 }
702
703 edge->setMark(*mit);
704 ++mit;
705 }
706
707 // Add the face to the shape's faces list:
708 face->setId(id);
709 AddFace(face);
710
711 return face;
712}
713
715{
716 real meanEdgeSize = 0.0;
717 for (vector<WEdge *>::const_iterator it = _EdgeList.begin(), itend = _EdgeList.end();
718 it != itend;
719 it++)
720 {
721 meanEdgeSize += (*it)->GetaOEdge()->GetVec().norm();
722 }
723 return meanEdgeSize / (real)_EdgeList.size();
724}
725
726} /* namespace Freestyle */
unsigned int uint
Classes to define a Winged Edge data structure.
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
ATTR_WARN_UNUSED_RESULT const BMVert * v
SIMD_FORCE_INLINE btScalar norm() const
Return the norm (length) of the vector.
Definition btVector3.h:263
short GetNumberOfOEdges()
Definition WEdge.h:586
void setId(int id)
Definition WEdge.h:666
WOEdge * GetbOEdge()
Definition WEdge.h:581
void * userdata
Definition WEdge.h:509
virtual WEdge * duplicate()
Definition WEdge.cpp:242
WOEdge * GetaOEdge()
Definition WEdge.h:576
void * userdata
Definition WEdge.h:703
float getArea()
Definition WEdge.cpp:409
const vector< WOEdge * > & getEdgeList()
Definition WEdge.h:716
vector< Vec2f > _VerticesTexCoords
Definition WEdge.h:696
const FrsMaterial & frs_material()
Definition WEdge.cpp:276
Vec3f & GetNormal()
Definition WEdge.h:726
WOEdge * GetPrevOEdge(WOEdge *iOEdge)
Definition WEdge.cpp:423
virtual WOEdge * MakeEdge(WVertex *v1, WVertex *v2)
Definition WEdge.cpp:281
virtual WFace * duplicate()
Definition WEdge.cpp:270
bool getOppositeEdge(const WVertex *v, WOEdge *&e)
Definition WEdge.cpp:380
WShape * getShape()
Definition WEdge.cpp:445
void setFrsMaterialIndex(uint iMaterialIndex)
Definition WEdge.h:931
vector< Vec3f > _VerticesNormals
Definition WEdge.h:695
uint _FrsMaterialIndex
Definition WEdge.h:699
void setbVertex(WVertex *pv)
Definition WEdge.h:453
void setbFace(WFace *pf)
Definition WEdge.h:465
void setaFace(WFace *pf)
Definition WEdge.h:459
WFace * GetaFace()
Definition WEdge.h:397
void setOwner(WEdge *pe)
Definition WEdge.h:471
virtual WOEdge * duplicate()
Definition WEdge.cpp:195
WOEdge * twin()
Definition WEdge.cpp:201
void setaVertex(WVertex *pv)
Definition WEdge.h:447
WVertex * GetaVertex()
Definition WEdge.h:387
WFace * GetbFace()
Definition WEdge.h:402
WVertex * GetbVertex()
Definition WEdge.h:392
void * userdata
Definition WEdge.h:340
WOEdge * getPrevOnFace()
Definition WEdge.cpp:206
WEdge * GetOwner()
Definition WEdge.h:407
vector< WVertex * > & getVertexList()
Definition WEdge.h:1053
real ComputeMeanEdgeSize() const
Definition WEdge.cpp:714
vector< FrsMaterial > _FrsMaterials
Definition WEdge.h:1001
vector< WEdge * > & getEdgeList()
Definition WEdge.h:1048
string _LibraryPath
Definition WEdge.h:995
virtual WShape * duplicate()
Definition WEdge.cpp:460
virtual WFace * MakeFace(vector< WVertex * > &iVertexList, vector< bool > &iFaceEdgeMarksList, uint iMaterialIndex)
Definition WEdge.cpp:590
vector< WFace * > & GetFaceList()
Definition WEdge.h:1058
static uint _SceneCurrentId
Definition WEdge.h:996
virtual WFace * operator*()
Definition WEdge.cpp:87
WShape * _Shape
Definition WEdge.h:51
vector< WEdge * > & GetEdges()
Definition WEdge.h:78
Vec3f & GetVertex()
Definition WEdge.h:73
virtual incoming_edge_iterator incoming_edges_begin()
Definition WEdge.cpp:132
void * userdata
Definition WEdge.h:56
WVertex(const Vec3f &v)
Definition WEdge.h:57
vector< WEdge * > _EdgeList
Definition WEdge.h:50
virtual incoming_edge_iterator incoming_edges_end()
Definition WEdge.cpp:146
void setShape(WShape *iShape)
Definition WEdge.h:116
void AddEdge(WEdge *iEdge)
Definition WEdge.cpp:127
void setBorder(bool b)
Definition WEdge.h:126
virtual WVertex * duplicate()
Definition WEdge.cpp:61
static ulong * next
VecMat::Vec3< float > Vec3f
Definition Geom.h:28
inherits from class Rep
Definition AppCanvas.cpp:20
static uint a[3]
Definition RandGen.cpp:82
double real
Definition Precision.h:14