Commit 31e15f74 authored by Lionel Untereiner's avatar Lionel Untereiner
Browse files

Merge colibris.u-strasbg.fr:/home/untereiner/Developments/CGoGN

Conflicts:
	include/Algo/Multiresolution/Map3MR/map3MR_PrimalAdapt.hpp
parents 2ac4d52e 192f8eaf
...@@ -141,6 +141,10 @@ public: ...@@ -141,6 +141,10 @@ public:
* Topological operations on Hierarchical Implicit 3-maps * Topological operations on Hierarchical Implicit 3-maps
*************************************************************************/ *************************************************************************/
// void deleteVolume(Dart d);
bool isWellEmbedded();
//@{ //@{
//! //!
...@@ -162,6 +166,11 @@ public: ...@@ -162,6 +166,11 @@ public:
void deleteVertexSubdividedFace(Dart d); void deleteVertexSubdividedFace(Dart d);
//@} //@}
void setVertexVertexFunctor(FunctorType* f) { vertexVertexFunctor = f ; }
void setEdgeVertexFunctor(FunctorType* f) { edgeVertexFunctor = f ; }
void setFaceVertexFunctor(FunctorType* f) { faceVertexFunctor = f ; }
void setVolumeVertexFunctor(FunctorType* f) { volumeVertexFunctor = f ; }
void computeVertexVertexFunctor(Dart d) { (*vertexVertexFunctor)(d); } void computeVertexVertexFunctor(Dart d) { (*vertexVertexFunctor)(d); }
void computeEdgeVertexFunctor(Dart d) { (*edgeVertexFunctor)(d); } void computeEdgeVertexFunctor(Dart d) { (*edgeVertexFunctor)(d); }
void computeFaceVertexFunctor(Dart d) { (*faceVertexFunctor)(d); } void computeFaceVertexFunctor(Dart d) { (*faceVertexFunctor)(d); }
...@@ -373,7 +382,8 @@ public: ...@@ -373,7 +382,8 @@ public:
virtual bool foreach_dart_of_face2(Dart d, FunctorType& f, unsigned int thread = 0); virtual bool foreach_dart_of_face2(Dart d, FunctorType& f, unsigned int thread = 0);
//@} //@}
template <unsigned int ORBIT>
unsigned int getEmbedding(Dart d);
} ; } ;
template <typename T, unsigned int ORBIT> template <typename T, unsigned int ORBIT>
...@@ -398,9 +408,9 @@ public: ...@@ -398,9 +408,9 @@ public:
return AttributeHandler<T, ORBIT>::isValid() ; return AttributeHandler<T, ORBIT>::isValid() ;
} }
T& operator[](Dart d) ; virtual T& operator[](Dart d) ;
const T& operator[](Dart d) const ; virtual const T& operator[](Dart d) const ;
T& operator[](unsigned int a) T& operator[](unsigned int a)
{ {
...@@ -411,6 +421,7 @@ public: ...@@ -411,6 +421,7 @@ public:
{ {
return AttributeHandler<T, ORBIT>::operator[](a) ; return AttributeHandler<T, ORBIT>::operator[](a) ;
} }
} ; } ;
template <typename T> template <typename T>
......
...@@ -601,6 +601,59 @@ inline unsigned int ImplicitHierarchicalMap3::edgeLevel(Dart d) ...@@ -601,6 +601,59 @@ inline unsigned int ImplicitHierarchicalMap3::edgeLevel(Dart d)
return r; return r;
} }
template <unsigned int ORBIT>
inline unsigned int ImplicitHierarchicalMap3::getEmbedding(Dart d)
{
unsigned int nbSteps = m_curLevel - vertexInsertionLevel(d);
unsigned int index = EmbeddedMap3::getEmbedding<ORBIT>(d);
unsigned int step = 0;
while(step < nbSteps)
{
step++;
unsigned int next = m_nextLevelCell[ORBIT]->operator[](index);
//index = next;
if(next != EMBNULL) index = next;
else break;
}
return index;
}
inline bool ImplicitHierarchicalMap3::isWellEmbedded()
{
//std::cout << "yeahhh ? " << std::endl;
TraversorV<ImplicitHierarchicalMap3> tv(*this);
for(Dart dv = tv.begin() ; dv != tv.end() ; dv = tv.next())
{
unsigned int curem = this->getEmbedding<VERTEX>(dv);
//std::cout << "current emb = " << curem << std::endl;
unsigned int count = 0;
TraversorDartsOfOrbit<ImplicitHierarchicalMap3, VERTEX> to(*this, dv);
for(Dart dit = to.begin() ; dit != to.end() ; dit = to.next())
{
//std::cout << getDartLevel(dit) << std::endl;
if(curem != this->getEmbedding<VERTEX>(dit))
{
std::cout << "erreur dart #" << dit;
std::cout << " / curem = " << curem;
std::cout << " / em = " << this->getEmbedding<VERTEX>(dit);
std::cout << std::endl;
}
std::cout << EmbeddedMap3::getEmbedding<VERTEX>(dit) << "(" << this->getEmbedding<VERTEX>(dit) << ")" << " / ";
++count;
}
std::cout << " / vertex degree = " << count << std::endl;
}
return true;
}
/*************************************************** /***************************************************
* ATTRIBUTE HANDLER * * ATTRIBUTE HANDLER *
...@@ -613,14 +666,20 @@ T& AttributeHandler_IHM<T, ORBIT>::operator[](Dart d) ...@@ -613,14 +666,20 @@ T& AttributeHandler_IHM<T, ORBIT>::operator[](Dart d)
assert(m->m_dartLevel[d] <= m->m_curLevel || !"Access to a dart introduced after current level") ; assert(m->m_dartLevel[d] <= m->m_curLevel || !"Access to a dart introduced after current level") ;
assert(m->vertexInsertionLevel(d) <= m->m_curLevel || !"Access to the embedding of a vertex inserted after current level") ; assert(m->vertexInsertionLevel(d) <= m->m_curLevel || !"Access to the embedding of a vertex inserted after current level") ;
unsigned int orbit = this->getOrbit() ; // std::cout << std::endl << "vertexInsertionLevel[" << d <<"] = " << m->vertexInsertionLevel(d) << "\t";
unsigned int nbSteps = m->m_curLevel - m->vertexInsertionLevel(d) ; unsigned int nbSteps = m->m_curLevel - m->vertexInsertionLevel(d) ;
unsigned int index = m->getEmbedding<ORBIT>(d) ; unsigned int index = m->EmbeddedMap3::getEmbedding<ORBIT>(d) ;
// std::cout << " m->vertexInsertionLevel(d) = " << m->vertexInsertionLevel(d) << std::endl;
// std::cout << "m_curLevel = " << m->m_curLevel << std::endl;
// std::cout << " nbSteps = " << nbSteps << std::endl;
// std::cout << "index EmbMap3 = " << index << std::endl;
if(index == EMBNULL) if(index == EMBNULL)
{ {
index = m->setOrbitEmbeddingOnNewCell<ORBIT>(d) ; index = m->setOrbitEmbeddingOnNewCell<ORBIT>(d) ;
m->m_nextLevelCell[orbit]->operator[](index) = EMBNULL ; m->m_nextLevelCell[ORBIT]->operator[](index) = EMBNULL ;
} }
AttributeContainer& cont = m->getAttributeContainer<ORBIT>() ; AttributeContainer& cont = m->getAttributeContainer<ORBIT>() ;
...@@ -628,17 +687,24 @@ T& AttributeHandler_IHM<T, ORBIT>::operator[](Dart d) ...@@ -628,17 +687,24 @@ T& AttributeHandler_IHM<T, ORBIT>::operator[](Dart d)
while(step < nbSteps) while(step < nbSteps)
{ {
step++ ; step++ ;
unsigned int nextIdx = m->m_nextLevelCell[orbit]->operator[](index) ; unsigned int nextIdx = m->m_nextLevelCell[ORBIT]->operator[](index) ;
if (nextIdx == EMBNULL) if (nextIdx == EMBNULL)
{ {
nextIdx = m->newCell<ORBIT>() ; nextIdx = m->newCell<ORBIT>() ;
m->copyCell<ORBIT>(nextIdx, index) ; m->copyCell<ORBIT>(nextIdx, index) ;
m->m_nextLevelCell[orbit]->operator[](index) = nextIdx ; m->m_nextLevelCell[ORBIT]->operator[](index) = nextIdx ;
m->m_nextLevelCell[orbit]->operator[](nextIdx) = EMBNULL ; m->m_nextLevelCell[ORBIT]->operator[](nextIdx) = EMBNULL ;
cont.refLine(index) ; cont.refLine(index) ;
} }
index = nextIdx ; index = nextIdx ;
} }
// std::cout << "emb = " << index << std::endl;
// std::cout << "index IHM = " << index << std::endl;
// if(index != EMBNULL)
// std::cout << " emb = " << this->m_attrib->operator[](index) << std::endl << std::endl;
return this->m_attrib->operator[](index); return this->m_attrib->operator[](index);
} }
...@@ -649,21 +715,30 @@ const T& AttributeHandler_IHM<T, ORBIT>::operator[](Dart d) const ...@@ -649,21 +715,30 @@ const T& AttributeHandler_IHM<T, ORBIT>::operator[](Dart d) const
assert(m->m_dartLevel[d] <= m->m_curLevel || !"Access to a dart introduced after current level") ; assert(m->m_dartLevel[d] <= m->m_curLevel || !"Access to a dart introduced after current level") ;
assert(m->vertexInsertionLevel(d) <= m->m_curLevel || !"Access to the embedding of a vertex inserted after current level") ; assert(m->vertexInsertionLevel(d) <= m->m_curLevel || !"Access to the embedding of a vertex inserted after current level") ;
unsigned int orbit = this->getOrbit() ;
unsigned int nbSteps = m->m_curLevel - m->vertexInsertionLevel(d) ; unsigned int nbSteps = m->m_curLevel - m->vertexInsertionLevel(d) ;
unsigned int index = m->getEmbedding<ORBIT>(d) ; unsigned int index = m->EmbeddedMap3::getEmbedding<ORBIT>(d) ;
// std::cout << "(const) m->vertexInsertionLevel(d) = " << m->vertexInsertionLevel(d) << std::endl;
// std::cout << "(const) m_curLevel = " << m->m_curLevel << std::endl;
// std::cout << "(const) nbSteps = " << nbSteps << std::endl;
// std::cout << "(const) index EmbMap3 = " << index << std::endl;
unsigned int step = 0 ; unsigned int step = 0 ;
while(step < nbSteps) while(step < nbSteps)
{ {
step++ ; step++ ;
unsigned int next = m->m_nextLevelCell[orbit]->operator[](index) ; unsigned int nextIdx = m->m_nextLevelCell[ORBIT]->operator[](index) ;
if(next != EMBNULL) index = next ; if(nextIdx != EMBNULL) index = nextIdx ;
else break ; else break ;
} }
// if(index != EMBNULL)
// std::cout << "(const) emb = " << this->m_attrib->operator[](index) << std::endl << std::endl;
return this->m_attrib->operator[](index); return this->m_attrib->operator[](index);
} }
} //namespace IHM } //namespace IHM
} // Volume } // Volume
} //namespace Algo } //namespace Algo
......
...@@ -41,7 +41,7 @@ template <typename PFP> ...@@ -41,7 +41,7 @@ template <typename PFP>
void subdivideEdge(typename PFP::MAP& map, Dart d, VertexAttribute<typename PFP::VEC3>& position) ; void subdivideEdge(typename PFP::MAP& map, Dart d, VertexAttribute<typename PFP::VEC3>& position) ;
template <typename PFP> template <typename PFP>
void subdivideFace(typename PFP::MAP& map, Dart d, VertexAttribute<typename PFP::VEC3>& position) ; void subdivideFace(typename PFP::MAP& map, Dart d, VertexAttribute<typename PFP::VEC3>& position, bool forceTri = true);
template <typename PFP> template <typename PFP>
void coarsenEdge(typename PFP::MAP& map, Dart d, VertexAttribute<typename PFP::VEC3>& position) ; void coarsenEdge(typename PFP::MAP& map, Dart d, VertexAttribute<typename PFP::VEC3>& position) ;
......
...@@ -61,7 +61,7 @@ void subdivideEdge(typename PFP::MAP& map, Dart d, VertexAttribute<typename PFP: ...@@ -61,7 +61,7 @@ void subdivideEdge(typename PFP::MAP& map, Dart d, VertexAttribute<typename PFP:
} }
template <typename PFP> template <typename PFP>
void subdivideFace(typename PFP::MAP& map, Dart d, VertexAttribute<typename PFP::VEC3>& position) void subdivideFace(typename PFP::MAP& map, Dart d, VertexAttribute<typename PFP::VEC3>& position, bool forceTri)
{ {
assert(map.getDartLevel(d) <= map.getCurrentLevel() || !"Access to a dart introduced after current level") ; assert(map.getDartLevel(d) <= map.getCurrentLevel() || !"Access to a dart introduced after current level") ;
assert(!map.faceIsSubdivided(d) || !"Trying to subdivide an already subdivided face") ; assert(!map.faceIsSubdivided(d) || !"Trying to subdivide an already subdivided face") ;
...@@ -89,7 +89,7 @@ void subdivideFace(typename PFP::MAP& map, Dart d, VertexAttribute<typename PFP: ...@@ -89,7 +89,7 @@ void subdivideFace(typename PFP::MAP& map, Dart d, VertexAttribute<typename PFP:
map.setCurrentLevel(fLevel + 1) ; // go to the next level to perform face subdivision map.setCurrentLevel(fLevel + 1) ; // go to the next level to perform face subdivision
if(degree == 3) // if subdividing a triangle if(degree == 3 && forceTri) // if subdividing a triangle
{ {
Dart dd = map.phi1(old) ; Dart dd = map.phi1(old) ;
Dart e = map.phi1(map.phi1(dd)) ; Dart e = map.phi1(map.phi1(dd)) ;
...@@ -134,17 +134,16 @@ void subdivideFace(typename PFP::MAP& map, Dart d, VertexAttribute<typename PFP: ...@@ -134,17 +134,16 @@ void subdivideFace(typename PFP::MAP& map, Dart d, VertexAttribute<typename PFP:
} }
else if(t == 2) else if(t == 2)
{ {
if(dId == eId) if(dId == eId)
{ {
std::cout << "plop" << std::endl; map.setEdgeId(dit, 0);
map.setEdgeId(dit, 0); map.setEdgeId(map.phi2(dit), 0);
map.setEdgeId(map.phi2(dit), 0); }
} else
else {
{ map.setEdgeId(dit, 1);
map.setEdgeId(dit, 1); map.setEdgeId(map.phi2(dit), 1);
map.setEdgeId(map.phi2(dit), 1); }
}
} }
else if(t == 3) else if(t == 3)
{ {
......
...@@ -65,8 +65,8 @@ void subdivideEdge(typename PFP::MAP& map, Dart d, AttributeHandler<typename PFP ...@@ -65,8 +65,8 @@ void subdivideEdge(typename PFP::MAP& map, Dart d, AttributeHandler<typename PFP
map.setFaceId(EDGE, d) ; //mise a jour de l'id de face sur chaque brin de chaque moitie d'arete map.setFaceId(EDGE, d) ; //mise a jour de l'id de face sur chaque brin de chaque moitie d'arete
map.setFaceId(EDGE, dd) ; map.setFaceId(EDGE, dd) ;
position[map.phi1(d)] = (p1 + p2) * typename PFP::REAL(0.5) ; // position[map.phi1(d)] = (p1 + p2) * typename PFP::REAL(0.5) ;
//map.computeEdgeVertexFunctor(map.phi1(d)); map.computeEdgeVertexFunctor(map.phi1(d));
map.setCurrentLevel(cur) ; map.setCurrentLevel(cur) ;
} }
...@@ -144,6 +144,48 @@ void subdivideFace(typename PFP::MAP& map, Dart d, AttributeHandler<typename PFP ...@@ -144,6 +144,48 @@ void subdivideFace(typename PFP::MAP& map, Dart d, AttributeHandler<typename PFP
map.setFaceId(dd, idface, FACE) ; map.setFaceId(dd, idface, FACE) ;
map.setFaceId(e, idface, FACE) ; map.setFaceId(e, idface, FACE) ;
Dart stop = map.phi2(map.phi1(old));
Dart dit = stop;
do
{
unsigned int dId = map.getEdgeId(map.phi_1(map.phi2(dit)));
unsigned int eId = map.getEdgeId(map.phi1(map.phi2(dit)));
unsigned int t = dId + eId;
if(t == 0)
{
map.setEdgeId(dit, 1, EDGE) ;
map.setEdgeId(map.phi2(dit), 1, EDGE) ;
}
else if(t == 1)
{
map.setEdgeId(dit, 2, EDGE) ;
map.setEdgeId(map.phi2(dit), 2, EDGE) ;
}
else if(t == 2)
{
if(dId == eId)
{
map.setEdgeId(dit, 0, EDGE) ;
map.setEdgeId(map.phi2(dit), 0, EDGE) ;
}
else
{
map.setEdgeId(dit, 1, EDGE) ;
map.setEdgeId(map.phi2(dit), 1, EDGE) ;
}
}
else if(t == 3)
{
map.setEdgeId(dit, 0, EDGE) ;
map.setEdgeId(map.phi2(dit), 0, EDGE) ;
}
dit = map.phi1(dit);
}while(dit != stop);
} }
else else
{ {
...@@ -159,8 +201,7 @@ void subdivideFace(typename PFP::MAP& map, Dart d, AttributeHandler<typename PFP ...@@ -159,8 +201,7 @@ void subdivideFace(typename PFP::MAP& map, Dart d, AttributeHandler<typename PFP
id = map.getNewEdgeId() ; id = map.getNewEdgeId() ;
map.setEdgeId(ne2, id, EDGE) ; map.setEdgeId(ne2, id, EDGE) ;
position[map.phi1(ne)] = p ; //position[map.phi1(ne)] = p ;
//map.computeFaceVertexFunctor(map.phi1(ne));
dd = map.phi1(map.phi1(map.phi1(map.phi1(ne)))) ; dd = map.phi1(map.phi1(map.phi1(map.phi1(ne)))) ;
while(dd != ne) while(dd != ne)
...@@ -184,13 +225,17 @@ void subdivideFace(typename PFP::MAP& map, Dart d, AttributeHandler<typename PFP ...@@ -184,13 +225,17 @@ void subdivideFace(typename PFP::MAP& map, Dart d, AttributeHandler<typename PFP
dd = map.phi2(map.phi1(dd)); dd = map.phi2(map.phi1(dd));
} }
while(dd != ne); while(dd != ne);
map.computeFaceVertexFunctor(map.phi1(ne));
//position[map.phi1(ne)] = p ;
} }
map.setCurrentLevel(cur) ; map.setCurrentLevel(cur) ;
} }
template <typename PFP> template <typename PFP>
Dart subdivideVolumeClassic(typename PFP::MAP& map, Dart d, AttributeHandler<typename PFP::VEC3, VERTEX>& position) //Dart subdivideVolumeClassic(typename PFP::MAP& map, Dart d, AttributeHandler<typename PFP::VEC3, VERTEX>& position)
Dart subdivideVolumeClassic(typename PFP::MAP& map, Dart d, Algo::Volume::IHM::AttributeHandler_IHM<typename PFP::VEC3, VERTEX>& position)
{ {
assert(map.getDartLevel(d) <= map.getCurrentLevel() || !"Access to a dart introduced after current level") ; assert(map.getDartLevel(d) <= map.getCurrentLevel() || !"Access to a dart introduced after current level") ;
assert(!map.volumeIsSubdivided(d) || !"Trying to subdivide an already subdivided volume") ; assert(!map.volumeIsSubdivided(d) || !"Trying to subdivide an already subdivided volume") ;
...@@ -309,12 +354,13 @@ Dart subdivideVolumeClassic(typename PFP::MAP& map, Dart d, AttributeHandler<typ ...@@ -309,12 +354,13 @@ Dart subdivideVolumeClassic(typename PFP::MAP& map, Dart d, AttributeHandler<typ
for (std::vector<Dart>::iterator edge = oldEdges.begin(); edge != oldEdges.end(); ++edge) for (std::vector<Dart>::iterator edge = oldEdges.begin(); edge != oldEdges.end(); ++edge)
{ {
Dart e = *edge; Dart e = *edge;
std::vector<Dart> v ; std::vector<Dart> v ;
do do
{ {
v.push_back(map.phi1(map.phi1(e)));
v.push_back(map.phi1(e)); v.push_back(map.phi1(e));
v.push_back(map.phi1(map.phi1(e)));
e = map.phi2(map.phi_1(e)); e = map.phi2(map.phi_1(e));
} }
...@@ -357,11 +403,11 @@ Dart subdivideVolumeClassic(typename PFP::MAP& map, Dart d, AttributeHandler<typ ...@@ -357,11 +403,11 @@ Dart subdivideVolumeClassic(typename PFP::MAP& map, Dart d, AttributeHandler<typ
} }
while(dd != stop); while(dd != stop);
//map.computeVertexVertexFunctor(e);
} }
map.deleteVolume(map.phi3(map.phi2(map.phi1(oldEdges.front()))));
//map.computerVolumeVertexFunctor(oldEdges.front()); map.deleteVolume(map.phi3(map.phi2(map.phi1(oldEdges.front()))));
//Third step : 3-sew internal faces //Third step : 3-sew internal faces
for (std::vector<std::pair<Dart,Dart> >::iterator it = subdividedfaces.begin(); it != subdividedfaces.end(); ++it) for (std::vector<std::pair<Dart,Dart> >::iterator it = subdividedfaces.begin(); it != subdividedfaces.end(); ++it)
...@@ -399,6 +445,22 @@ Dart subdivideVolumeClassic(typename PFP::MAP& map, Dart d, AttributeHandler<typ ...@@ -399,6 +445,22 @@ Dart subdivideVolumeClassic(typename PFP::MAP& map, Dart d, AttributeHandler<typ
} }
} }
// std::cout << map.getCurrentLevel() << std::endl;
// //Second step : deconnect each corner, close each hole, subdivide each new face into 3
for (std::vector<Dart>::iterator edge = oldEdges.begin(); edge != oldEdges.end(); ++edge)
{
Dart e = *edge;
if(e == 309)
std::cout << "plop" << std::endl;
//std::cout << "emb ? " << map.template getEmbedding<VERTEX>(e) << std::endl;
//if(map.template getEmbedding<VERTEX>(e) == EMBNULL)
map.computeVertexVertexFunctor(e);
//std::cout << "emb = " << map.template getEmbedding<VERTEX>(e) << " / dartlevel = " << map.getDartLevel(e) << std::endl;
}
std::cout << std::endl;
//map.computerVolumeVertexFunctor(centralDart);
map.setCurrentLevel(cur) ; map.setCurrentLevel(cur) ;
return centralDart; //subdividedfaces.begin()->first; return centralDart; //subdividedfaces.begin()->first;
......
...@@ -41,7 +41,7 @@ namespace MovingObjects ...@@ -41,7 +41,7 @@ namespace MovingObjects
template <typename PFP> template <typename PFP>
class ParticleBase class ParticleBase
{ {
private: protected:
typename PFP::VEC3 m_position ; typename PFP::VEC3 m_position ;
unsigned int m_state ; unsigned int m_state ;
......
#ifndef PARTCELL_H #ifndef PARTCELL_H
#define PARTCELL_H #define PARTCELL_H
#include "particle_base.h" #include "Algo/MovingObjects/particle_base.h"
#include "Algo/Geometry/inclusion.h" #include "Algo/Geometry/inclusion.h"
#include "Geometry/intersection.h" #include "Geometry/intersection.h"
...@@ -31,12 +31,12 @@ enum { ...@@ -31,12 +31,12 @@ enum {
}; };
template <typename PFP> template <typename PFP>
class ParticleCell3D : public Algo::MovingObjects::ParticleBase class ParticleCell3D : public Algo::MovingObjects::ParticleBase<PFP>
{ {
public : public :
typedef typename PFP::MAP Map; typedef typename PFP::MAP Map;
typedef typename PFP::VEC3 VEC3; typedef typename PFP::VEC3 VEC3;
typedef VertexAttribute<typename PFP::VEC3> TAB_POS; typedef VertexAttribute<VEC3> TAB_POS;
Map& m; Map& m;
...@@ -55,7 +55,11 @@ public : ...@@ -55,7 +55,11 @@ public :
{} {}
ParticleCell3D(Map& map, Dart belonging_cell, VEC3 pos, const TAB_POS& tabPos) : ParticleCell3D(Map& map, Dart belonging_cell, VEC3 pos, const TAB_POS& tabPos) :
Algo::MovingObjects::ParticleBase(pos), m(map), position(tabPos), d(belonging_cell), state(3) Algo::MovingObjects::ParticleBase<PFP>(pos),
m(map),
position(tabPos),
d(belonging_cell),
state(3)
{ {
m_positionFace = pointInFace(d); m_positionFace = pointInFace(d);
} }
...@@ -107,7 +111,7 @@ public : ...@@ -107,7 +111,7 @@ public :
{ {