26 if (
nullptr == oVShape) {
47 vector<ViewEdge *> &ioVEdges,
48 vector<ViewVertex *> &ioVVertices,
49 vector<FEdge *> &ioFEdges,
50 vector<SVertex *> &ioSVertices)
61 vector<WFace *>::iterator wf, wfend;
63 for (wf = wfaces.begin(), wfend = wfaces.end(); wf != wfend; wf++) {
64 wxf =
dynamic_cast<WXFace *
>(*wf);
65 if (
false == (wxf)->hasSmoothEdges()) {
70 for (vector<WXFaceLayer *>::iterator sl = smoothLayers.begin(), slend = smoothLayers.end();
74 if (!(*sl)->hasSmoothEdge()) {
95 for (vector<WEdge *>::iterator we = wedges.begin(), weend = wedges.end(); we != weend; we++) {
96 wxe =
dynamic_cast<WXEdge *
>(*we);
103 if (wxe->
order() == -1) {
122 ioFEdges.insert(ioFEdges.end(), newedges.begin(), newedges.end());
123 ioSVertices.insert(ioSVertices.end(), newVertices.begin(), newVertices.end());
124 ioVVertices.insert(ioVVertices.end(), newVVertices.begin(), newVVertices.end());
125 ioVEdges.insert(ioVEdges.end(), newVEdges.begin(), newVEdges.end());
136 list<OWXFaceLayer> facesChain;
139 facesChain.push_back(currentFace);
149 facesChain.push_front(currentFace);
155 first = facesChain.front();
171 FEdge *feprevious =
nullptr;
172 FEdge *fefirst =
nullptr;
174 for (list<OWXFaceLayer>::iterator fl = facesChain.begin(), flend = facesChain.end(); fl != flend;
178 if (feprevious && fe == feprevious) {
194 if ((first == end) && (size != 1)) {
197 newVEdge->
setA(
nullptr);
198 newVEdge->
setB(
nullptr);
204 ((
NonTVertex *)vva)->AddOutgoingViewEdge(newVEdge);
205 ((
NonTVertex *)vvb)->AddIncomingViewEdge(newVEdge);
227 OWXEdge currentWEdge = firstWEdge;
228 list<OWXEdge> edgesChain;
233 edgesChain.push_back(currentWEdge);
239 OWXEdge endWEdge = edgesChain.back();
243 edgesChain.push_front(currentWEdge);
250 edgesChain.push_back(currentWEdge);
253 OWXEdge endWEdge = edgesChain.back();
255 firstWEdge = edgesChain.front();
258 FEdge *feprevious =
nullptr;
259 FEdge *fefirst =
nullptr;
261 for (list<OWXEdge>::iterator we = edgesChain.begin(), weend = edgesChain.end(); we != weend;
278 if ((firstWEdge == endWEdge) && (size != 1)) {
281 newVEdge->
setA(
nullptr);
282 newVEdge->
setB(
nullptr);
288 ((
NonTVertex *)vva)->AddOutgoingViewEdge(newVEdge);
289 ((
NonTVertex *)vvb)->AddIncomingViewEdge(newVEdge);
300 WXFace *nextFace =
nullptr;
303 if (iFaceLayer.
order) {
312 if (
ELEM(tend, 0.0, 1.0)) {
326 while ((!found) && (f != fend)) {
327 nextFace =
dynamic_cast<WXFace *
>(*f);
328 if ((
nullptr != nextFace) && (nextFace != iFaceLayer.
fl->
getFace())) {
329 vector<WXFaceLayer *> sameNatureLayers;
332 if (sameNatureLayers.size() == 1) {
358 vector<WXFaceLayer *> sameNatureLayers;
361 if (sameNatureLayers.empty() || (sameNatureLayers.size() != 1)) {
381 WXFace *previousFace =
nullptr;
384 if (iFaceLayer.
order) {
394 if (
ELEM(tend, 0.0, 1.0)) {
408 for (; (!found) && (f != fend); ++f) {
409 previousFace =
dynamic_cast<WXFace *
>(*f);
410 if ((
nullptr != previousFace) && (previousFace != iFaceLayer.
fl->
getFace())) {
411 vector<WXFaceLayer *> sameNatureLayers;
414 if (sameNatureLayers.size() == 1) {
431 if (
nullptr == previousFace) {
439 vector<WXFaceLayer *> sameNatureLayers;
442 if (sameNatureLayers.empty() || (sameNatureLayers.size() != 1)) {
486 if (feprevious ==
nullptr) {
495 Vec3r na((1 - ta) * NA1 + ta * NA2);
515 if (feprevious && (
B - va->
point3D()).norm() < 1.0e-6) {
523 Vec3r nb((1 - tb) * NB1 + tb * NB2);
542 if (feprevious ==
nullptr) {
561 if (
nullptr == iFaceLayer) {
564 if (iFaceLayer->
userdata ==
nullptr) {
575 if (aFace && aFace->
GetMark()) {
578 if (bFace && bFace->
GetMark()) {
591 if (
true == iEdge.
order) {
603 vector<WEdge *> &vEdges = (
v)->GetEdges();
604 for (vector<WEdge *>::iterator ve = vEdges.begin(), veend = vEdges.end(); ve != veend; ve++) {
606 if (wxe == iEdge.
e) {
640 if (
true == iEdge.
order) {
652 vector<WEdge *> &vEdges = (
v)->GetEdges();
653 for (vector<WEdge *>::iterator ve = vEdges.begin(), veend = vEdges.end(); ve != veend; ve++) {
655 if (wxe == iEdge.
e) {
696 Vec3r normalA, normalB;
697 uint matA(0), matB(0);
698 bool faceMarkA =
false, faceMarkB =
false;
749 if (
nullptr == iEdge) {
776 SVertexMap::const_iterator found =
_SVertexMap.find(iPoint);
778 va = (*found).second;
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.)
Classes to define an Extended Winged Edge data structure.
ATTR_WARN_UNUSED_RESULT const BMVert * v
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
void setaFaceMark(bool iFaceMark)
void setaFrsMaterialIndex(uint i)
void setNormalB(const Vec3r &iNormal)
void setbFrsMaterialIndex(uint i)
void setbFaceMark(bool iFaceMark)
void setNormalA(const Vec3r &iNormal)
void setNormal(const Vec3r &iNormal)
void setFrsMaterialIndex(uint i)
void setFaceMark(bool iFaceMark)
void setFace(void *iFace)
void setViewEdge(ViewEdge *iViewEdge)
void setNextEdge(FEdge *iEdge)
void setNature(Nature::EdgeNature iNature)
void setPreviousEdge(FEdge *iEdge)
vector< SVertex * > & getVertexList()
void AddChain(FEdge *iEdge)
void AddNewVertex(SVertex *iv)
vector< FEdge * > & getEdgeList()
void AddEdge(FEdge *iEdge)
ViewVertex * viewvertex()
void setCurvatureInfo(CurvatureInfo *ci)
void AddNormal(const Vec3r &iNormal)
void AddFEdge(FEdge *iFEdge)
const Vec3r & point3D() const
static void ProjectSilhouette(std::vector< SVertex * > &ioVertices)
Vec< T, N > & normalize()
virtual void BuildViewEdges(WXShape *iWShape, ViewShape *oVShape, std::vector< ViewEdge * > &ioVEdges, std::vector< ViewVertex * > &ioVVertices, std::vector< FEdge * > &ioFEdges, std::vector< SVertex * > &ioSVertices)
int retrieveFaceMarks(WXEdge *iEdge)
SVertex * MakeSVertex(Vec3r &iPoint)
OWXEdge FindNextWEdge(const OWXEdge &iEdge)
bool stopSharpViewEdge(WXEdge *iEdge)
ViewEdge * BuildSharpViewEdge(const OWXEdge &iWEdge)
OWXEdge FindPreviousWEdge(const OWXEdge &iEdge)
FEdge * BuildSharpFEdge(FEdge *feprevious, const OWXEdge &iwe)
ViewEdge * BuildSmoothViewEdge(const OWXFaceLayer &iFaceLayer)
FEdge * BuildSmoothFEdge(FEdge *feprevious, const OWXFaceLayer &ifl)
ViewShape * _pCurrentVShape
OWXFaceLayer FindNextFaceLayer(const OWXFaceLayer &iFaceLayer)
ViewVertex * MakeViewVertex(SVertex *iSVertex)
OWXFaceLayer FindPreviousFaceLayer(const OWXFaceLayer &iFaceLayer)
virtual void Init(ViewShape *oVShape)
bool stopSmoothViewEdge(WXFaceLayer *iFaceLayer)
void setFEdgeB(FEdge *iFEdge)
void setA(ViewVertex *iA)
void setFEdgeA(FEdge *iFEdge)
void setNature(Nature::EdgeNature iNature)
void setB(ViewVertex *iB)
void AddVertex(ViewVertex *iVertex)
vector< ViewEdge * > & edges()
vector< ViewVertex * > & vertices()
void AddEdge(ViewEdge *iEdge)
WFace * GetBordingFace(int index)
Vec3f & GetVertexNormal(int index)
uint frs_materialIndex() const
vector< WEdge * > & getEdgeList()
vector< WFace * > & GetFaceList()
virtual face_iterator faces_end()
virtual face_iterator faces_begin()
WXSmoothEdge * getSmoothEdge()
void retrieveSmoothEdgesLayers(WXNature iNature, vector< WXFaceLayer * > &oSmoothEdgesLayers)
bool hasSmoothEdges() const
vector< WXFaceLayer * > & getSmoothLayers()
CurvatureInfo * curvatures()
local_group_size(16, 16) .push_constant(Type b
static const EdgeNature NO_FEATURE
static const EdgeNature BORDER
static const EdgeNature RIDGE
static double B1(double u)
static double B2(double u)