28 #include "../winged_edge/WXEdge.h"
36 if (
nullptr == oVShape) {
41 _pCurrentSShape = oVShape->
sshape();
42 if (
nullptr == _pCurrentSShape) {
46 _pCurrentVShape = oVShape;
50 if (!_SVertexMap.empty()) {
55 void ViewEdgeXBuilder::BuildViewEdges(
WXShape *iWShape,
57 vector<ViewEdge *> &ioVEdges,
58 vector<ViewVertex *> &ioVVertices,
59 vector<FEdge *> &ioFEdges,
60 vector<SVertex *> &ioSVertices)
70 vector<WFace *>::iterator wf, wfend;
72 for (wf = wfaces.begin(), wfend = wfaces.end(); wf != wfend; wf++) {
73 wxf =
dynamic_cast<WXFace *
>(*wf);
74 if (
false == ((wxf))->hasSmoothEdges()) {
79 for (vector<WXFaceLayer *>::iterator sl = smoothLayers.begin(), slend = smoothLayers.end();
82 if (!(*sl)->hasSmoothEdge()) {
85 if (stopSmoothViewEdge((*sl))) {
103 for (vector<WEdge *>::iterator we = wedges.begin(), weend = wedges.end(); we != weend; we++) {
104 wxe =
dynamic_cast<WXEdge *
>(*we);
109 if (!stopSharpViewEdge(wxe)) {
111 if (wxe->
order() == -1) {
114 BuildSharpViewEdge(
OWXEdge(wxe, b));
124 vector<FEdge *> &newedges = _pCurrentSShape->getEdgeList();
125 vector<SVertex *> &newVertices = _pCurrentSShape->getVertexList();
126 vector<ViewVertex *> &newVVertices = _pCurrentVShape->vertices();
127 vector<ViewEdge *> &newVEdges = _pCurrentVShape->edges();
130 ioFEdges.insert(ioFEdges.end(), newedges.begin(), newedges.end());
131 ioSVertices.insert(ioSVertices.end(), newVertices.begin(), newVertices.end());
132 ioVVertices.insert(ioVVertices.end(), newVVertices.begin(), newVVertices.end());
133 ioVEdges.insert(ioVEdges.end(), newVEdges.begin(), newVEdges.end());
144 list<OWXFaceLayer> facesChain;
146 while (!stopSmoothViewEdge(currentFace.
fl)) {
147 facesChain.push_back(currentFace);
151 currentFace = FindNextFaceLayer(currentFace);
155 currentFace = FindPreviousFaceLayer(first);
156 while (!stopSmoothViewEdge(currentFace.
fl)) {
157 facesChain.push_front(currentFace);
161 currentFace = FindPreviousFaceLayer(currentFace);
163 first = facesChain.front();
173 newVEdge->
setId(_currentViewId);
176 _pCurrentVShape->AddEdge(newVEdge);
179 FEdge *feprevious =
nullptr;
180 FEdge *fefirst =
nullptr;
182 for (list<OWXFaceLayer>::iterator fl = facesChain.begin(), flend = facesChain.end(); fl != flend;
184 fe = BuildSmoothFEdge(feprevious, (*fl));
185 if (feprevious && fe == feprevious) {
195 _pCurrentSShape->AddChain(fefirst);
201 if ((first == end) && (
size != 1)) {
204 newVEdge->
setA(
nullptr);
205 newVEdge->
setB(
nullptr);
211 ((
NonTVertex *)vva)->AddOutgoingViewEdge(newVEdge);
212 ((
NonTVertex *)vvb)->AddIncomingViewEdge(newVEdge);
225 newVEdge->
setId(_currentViewId);
229 _pCurrentVShape->AddEdge(newVEdge);
234 OWXEdge currentWEdge = firstWEdge;
235 list<OWXEdge> edgesChain;
239 while (!stopSharpViewEdge(currentWEdge.
e)) {
240 edgesChain.push_back(currentWEdge);
244 currentWEdge = FindNextWEdge(currentWEdge);
246 OWXEdge endWEdge = edgesChain.back();
248 currentWEdge = FindPreviousWEdge(firstWEdge);
249 while (!stopSharpViewEdge(currentWEdge.
e)) {
250 edgesChain.push_front(currentWEdge);
254 currentWEdge = FindPreviousWEdge(currentWEdge);
257 edgesChain.push_back(currentWEdge);
260 OWXEdge endWEdge = edgesChain.back();
262 firstWEdge = edgesChain.front();
265 FEdge *feprevious =
nullptr;
266 FEdge *fefirst =
nullptr;
268 for (list<OWXEdge>::iterator we = edgesChain.begin(), weend = edgesChain.end(); we != weend;
270 fe = BuildSharpFEdge(feprevious, (*we));
278 _pCurrentSShape->AddChain(fefirst);
284 if ((firstWEdge == endWEdge) && (
size != 1)) {
287 newVEdge->
setA(
nullptr);
288 newVEdge->
setB(
nullptr);
294 ((
NonTVertex *)vva)->AddOutgoingViewEdge(newVEdge);
295 ((
NonTVertex *)vvb)->AddIncomingViewEdge(newVEdge);
306 WXFace *nextFace =
nullptr;
309 if (iFaceLayer.
order) {
318 if (
ELEM(tend, 0.0, 1.0)) {
332 while ((!found) && (f != fend)) {
333 nextFace =
dynamic_cast<WXFace *
>(*f);
334 if ((
nullptr != nextFace) && (nextFace != iFaceLayer.
fl->
getFace())) {
335 vector<WXFaceLayer *> sameNatureLayers;
338 if (sameNatureLayers.size() == 1) {
364 vector<WXFaceLayer *> sameNatureLayers;
367 if ((sameNatureLayers.empty()) || (sameNatureLayers.size() != 1)) {
387 WXFace *previousFace =
nullptr;
390 if (iFaceLayer.
order) {
400 if (
ELEM(tend, 0.0, 1.0)) {
414 for (; (!found) && (f != fend); ++f) {
415 previousFace =
dynamic_cast<WXFace *
>(*f);
416 if ((
nullptr != previousFace) && (previousFace != iFaceLayer.
fl->
getFace())) {
417 vector<WXFaceLayer *> sameNatureLayers;
420 if (sameNatureLayers.size() == 1) {
437 if (
nullptr == previousFace) {
445 vector<WXFaceLayer *> sameNatureLayers;
448 if ((sameNatureLayers.empty()) || (sameNatureLayers.size() != 1)) {
496 va = MakeSVertex(
A,
false);
500 Vec3r na((1 - ta) * NA1 + ta * NA2);
520 if (feprevious && (
B - va->
point3D()).norm() < 1.0e-6) {
524 vb = MakeSVertex(
B,
false);
528 Vec3r nb((1 - tb) * NB1 + tb * NB2);
543 fe->
setId(_currentFId);
547 if (feprevious ==
nullptr) {
555 _pCurrentSShape->AddEdge(fe);
564 bool ViewEdgeXBuilder::stopSmoothViewEdge(
WXFaceLayer *iFaceLayer)
566 if (
nullptr == iFaceLayer) {
569 if (iFaceLayer->
userdata ==
nullptr) {
575 int ViewEdgeXBuilder::retrieveFaceMarks(
WXEdge *iEdge)
580 if (aFace && aFace->
GetMark()) {
583 if (bFace && bFace->
GetMark()) {
596 if (
true == iEdge.
order) {
607 int faceMarks = retrieveFaceMarks(iEdge.
e);
608 vector<WEdge *> &vEdges = (
v)->GetEdges();
609 for (vector<WEdge *>::iterator ve = vEdges.begin(), veend = vEdges.end(); ve != veend; ve++) {
611 if (wxe == iEdge.
e) {
620 if (retrieveFaceMarks(wxe) != faceMarks) {
645 if (
true == iEdge.
order) {
656 int faceMarks = retrieveFaceMarks(iEdge.
e);
657 vector<WEdge *> &vEdges = (
v)->GetEdges();
658 for (vector<WEdge *>::iterator ve = vEdges.begin(), veend = vEdges.end(); ve != veend; ve++) {
660 if (wxe == iEdge.
e) {
669 if (retrieveFaceMarks(wxe) != faceMarks) {
697 va = MakeSVertex(vA,
true);
698 vb = MakeSVertex(vB,
true);
701 Vec3r normalA, normalB;
702 unsigned matA(0), matB(0);
703 bool faceMarkA =
false, faceMarkB =
false;
727 fe->
setId(_currentFId);
738 _pCurrentSShape->AddEdge(fe);
752 bool ViewEdgeXBuilder::stopSharpViewEdge(
WXEdge *iEdge)
754 if (
nullptr == iEdge) {
766 SilhouetteGeomEngine::ProjectSilhouette(va);
769 _pCurrentSShape->AddNewVertex(va);
777 va = MakeSVertex(iPoint);
781 SVertexMap::const_iterator found = _SVertexMap.find(iPoint);
782 if (shared && found != _SVertexMap.end()) {
783 va = (*found).second;
786 va = MakeSVertex(iPoint);
788 _SVertexMap[iPoint] = va;
802 _pCurrentVShape->AddVertex(vva);
Class to perform all geometric operations dedicated to silhouette. That, for example,...
Class to build view edges and the underlying chains of feature edges...
Classes to define a View Map (ViewVertex, ViewEdge, etc.)
ATTR_WARN_UNUSED_RESULT const BMVert * v
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
void setbFrsMaterialIndex(unsigned i)
void setaFaceMark(bool iFaceMark)
void setNormalB(const Vec3r &iNormal)
void setaFrsMaterialIndex(unsigned i)
void setbFaceMark(bool iFaceMark)
void setNormalA(const Vec3r &iNormal)
void setNormal(const Vec3r &iNormal)
void setFaceMark(bool iFaceMark)
void setFrsMaterialIndex(unsigned i)
void setFace(void *iFace)
void setViewEdge(ViewEdge *iViewEdge)
void setNextEdge(FEdge *iEdge)
void setNature(Nature::EdgeNature iNature)
void setPreviousEdge(FEdge *iEdge)
ViewVertex * viewvertex()
void setCurvatureInfo(CurvatureInfo *ci)
void AddNormal(const Vec3r &iNormal)
const Vec3r & point3D() const
void AddFEdge(FEdge *iFEdge)
Vec< T, N > & normalize()
void setFEdgeB(FEdge *iFEdge)
void setA(ViewVertex *iA)
void setFEdgeA(FEdge *iFEdge)
void setNature(Nature::EdgeNature iNature)
void setB(ViewVertex *iB)
unsigned frs_materialIndex() const
Vec3f & GetVertexNormal(int index)
WFace * GetBordingFace(int index)
vector< WEdge * > & getEdgeList()
vector< WFace * > & GetFaceList()
virtual face_iterator faces_end()
virtual face_iterator faces_begin()
WXSmoothEdge * getSmoothEdge()
vector< WXFaceLayer * > & getSmoothLayers()
void retrieveSmoothEdgesLayers(WXNature iNature, vector< WXFaceLayer * > &oSmoothEdgesLayers)
bool hasSmoothEdges() const
CurvatureInfo * curvatures()
IconTextureDrawCall normal
static const EdgeNature NO_FEATURE
static const EdgeNature BORDER
static const EdgeNature RIDGE
static double B1(double u)
static double B2(double u)