14 #include "../winged_edge/WXEdge.h"
22 if (
nullptr == oVShape) {
27 _pCurrentSShape = oVShape->
sshape();
28 if (
nullptr == _pCurrentSShape) {
32 _pCurrentVShape = oVShape;
36 if (!_SVertexMap.empty()) {
41 void ViewEdgeXBuilder::BuildViewEdges(
WXShape *iWShape,
43 vector<ViewEdge *> &ioVEdges,
44 vector<ViewVertex *> &ioVVertices,
45 vector<FEdge *> &ioFEdges,
46 vector<SVertex *> &ioSVertices)
56 vector<WFace *>::iterator wf, wfend;
58 for (wf = wfaces.begin(), wfend = wfaces.end(); wf != wfend; wf++) {
59 wxf =
dynamic_cast<WXFace *
>(*wf);
60 if (
false == ((wxf))->hasSmoothEdges()) {
65 for (vector<WXFaceLayer *>::iterator sl = smoothLayers.begin(), slend = smoothLayers.end();
68 if (!(*sl)->hasSmoothEdge()) {
71 if (stopSmoothViewEdge((*sl))) {
89 for (vector<WEdge *>::iterator we = wedges.begin(), weend = wedges.end(); we != weend; we++) {
90 wxe =
dynamic_cast<WXEdge *
>(*we);
95 if (!stopSharpViewEdge(wxe)) {
97 if (wxe->
order() == -1) {
100 BuildSharpViewEdge(
OWXEdge(wxe,
b));
110 vector<FEdge *> &newedges = _pCurrentSShape->getEdgeList();
111 vector<SVertex *> &newVertices = _pCurrentSShape->getVertexList();
112 vector<ViewVertex *> &newVVertices = _pCurrentVShape->vertices();
113 vector<ViewEdge *> &newVEdges = _pCurrentVShape->edges();
116 ioFEdges.insert(ioFEdges.end(), newedges.begin(), newedges.end());
117 ioSVertices.insert(ioSVertices.end(), newVertices.begin(), newVertices.end());
118 ioVVertices.insert(ioVVertices.end(), newVVertices.begin(), newVVertices.end());
119 ioVEdges.insert(ioVEdges.end(), newVEdges.begin(), newVEdges.end());
130 list<OWXFaceLayer> facesChain;
132 while (!stopSmoothViewEdge(currentFace.
fl)) {
133 facesChain.push_back(currentFace);
137 currentFace = FindNextFaceLayer(currentFace);
141 currentFace = FindPreviousFaceLayer(first);
142 while (!stopSmoothViewEdge(currentFace.
fl)) {
143 facesChain.push_front(currentFace);
147 currentFace = FindPreviousFaceLayer(currentFace);
149 first = facesChain.front();
159 newVEdge->
setId(_currentViewId);
162 _pCurrentVShape->AddEdge(newVEdge);
165 FEdge *feprevious =
nullptr;
166 FEdge *fefirst =
nullptr;
168 for (list<OWXFaceLayer>::iterator fl = facesChain.begin(), flend = facesChain.end(); fl != flend;
170 fe = BuildSmoothFEdge(feprevious, (*fl));
171 if (feprevious && fe == feprevious) {
181 _pCurrentSShape->AddChain(fefirst);
187 if ((first == end) && (
size != 1)) {
190 newVEdge->
setA(
nullptr);
191 newVEdge->
setB(
nullptr);
197 ((
NonTVertex *)vva)->AddOutgoingViewEdge(newVEdge);
198 ((
NonTVertex *)vvb)->AddIncomingViewEdge(newVEdge);
211 newVEdge->
setId(_currentViewId);
215 _pCurrentVShape->AddEdge(newVEdge);
220 OWXEdge currentWEdge = firstWEdge;
221 list<OWXEdge> edgesChain;
225 while (!stopSharpViewEdge(currentWEdge.
e)) {
226 edgesChain.push_back(currentWEdge);
230 currentWEdge = FindNextWEdge(currentWEdge);
232 OWXEdge endWEdge = edgesChain.back();
234 currentWEdge = FindPreviousWEdge(firstWEdge);
235 while (!stopSharpViewEdge(currentWEdge.
e)) {
236 edgesChain.push_front(currentWEdge);
240 currentWEdge = FindPreviousWEdge(currentWEdge);
243 edgesChain.push_back(currentWEdge);
246 OWXEdge endWEdge = edgesChain.back();
248 firstWEdge = edgesChain.front();
251 FEdge *feprevious =
nullptr;
252 FEdge *fefirst =
nullptr;
254 for (list<OWXEdge>::iterator we = edgesChain.begin(), weend = edgesChain.end(); we != weend;
256 fe = BuildSharpFEdge(feprevious, (*we));
264 _pCurrentSShape->AddChain(fefirst);
270 if ((firstWEdge == endWEdge) && (
size != 1)) {
273 newVEdge->
setA(
nullptr);
274 newVEdge->
setB(
nullptr);
280 ((
NonTVertex *)vva)->AddOutgoingViewEdge(newVEdge);
281 ((
NonTVertex *)vvb)->AddIncomingViewEdge(newVEdge);
292 WXFace *nextFace =
nullptr;
295 if (iFaceLayer.
order) {
304 if (
ELEM(tend, 0.0, 1.0)) {
318 while ((!found) && (f != fend)) {
319 nextFace =
dynamic_cast<WXFace *
>(*f);
320 if ((
nullptr != nextFace) && (nextFace != iFaceLayer.
fl->
getFace())) {
321 vector<WXFaceLayer *> sameNatureLayers;
324 if (sameNatureLayers.size() == 1) {
350 vector<WXFaceLayer *> sameNatureLayers;
353 if ((sameNatureLayers.empty()) || (sameNatureLayers.size() != 1)) {
373 WXFace *previousFace =
nullptr;
376 if (iFaceLayer.
order) {
386 if (
ELEM(tend, 0.0, 1.0)) {
400 for (; (!found) && (f != fend); ++f) {
401 previousFace =
dynamic_cast<WXFace *
>(*f);
402 if ((
nullptr != previousFace) && (previousFace != iFaceLayer.
fl->
getFace())) {
403 vector<WXFaceLayer *> sameNatureLayers;
406 if (sameNatureLayers.size() == 1) {
423 if (
nullptr == previousFace) {
431 vector<WXFaceLayer *> sameNatureLayers;
434 if ((sameNatureLayers.empty()) || (sameNatureLayers.size() != 1)) {
482 va = MakeSVertex(
A,
false);
486 Vec3r na((1 - ta) * NA1 + ta * NA2);
506 if (feprevious && (
B - va->
point3D()).norm() < 1.0e-6) {
510 vb = MakeSVertex(
B,
false);
514 Vec3r nb((1 - tb) * NB1 + tb * NB2);
529 fe->
setId(_currentFId);
533 if (feprevious ==
nullptr) {
541 _pCurrentSShape->AddEdge(fe);
550 bool ViewEdgeXBuilder::stopSmoothViewEdge(
WXFaceLayer *iFaceLayer)
552 if (
nullptr == iFaceLayer) {
555 if (iFaceLayer->
userdata ==
nullptr) {
561 int ViewEdgeXBuilder::retrieveFaceMarks(
WXEdge *iEdge)
566 if (aFace && aFace->
GetMark()) {
569 if (bFace && bFace->
GetMark()) {
582 if (
true == iEdge.
order) {
593 int faceMarks = retrieveFaceMarks(iEdge.
e);
594 vector<WEdge *> &vEdges = (
v)->GetEdges();
595 for (vector<WEdge *>::iterator ve = vEdges.begin(), veend = vEdges.end(); ve != veend; ve++) {
597 if (wxe == iEdge.
e) {
606 if (retrieveFaceMarks(wxe) != faceMarks) {
631 if (
true == iEdge.
order) {
642 int faceMarks = retrieveFaceMarks(iEdge.
e);
643 vector<WEdge *> &vEdges = (
v)->GetEdges();
644 for (vector<WEdge *>::iterator ve = vEdges.begin(), veend = vEdges.end(); ve != veend; ve++) {
646 if (wxe == iEdge.
e) {
655 if (retrieveFaceMarks(wxe) != faceMarks) {
683 va = MakeSVertex(vA,
true);
684 vb = MakeSVertex(vB,
true);
687 Vec3r normalA, normalB;
688 unsigned matA(0), matB(0);
689 bool faceMarkA =
false, faceMarkB =
false;
713 fe->
setId(_currentFId);
724 _pCurrentSShape->AddEdge(fe);
738 bool ViewEdgeXBuilder::stopSharpViewEdge(
WXEdge *iEdge)
740 if (
nullptr == iEdge) {
752 SilhouetteGeomEngine::ProjectSilhouette(va);
755 _pCurrentSShape->AddNewVertex(va);
763 va = MakeSVertex(iPoint);
767 SVertexMap::const_iterator found = _SVertexMap.find(iPoint);
768 if (shared && found != _SVertexMap.end()) {
769 va = (*found).second;
772 va = MakeSVertex(iPoint);
774 _SVertexMap[iPoint] = va;
788 _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)
static const pxr::TfToken b("b", pxr::TfToken::Immortal)