From 69920cb1e79ea43f087a4f019708c9debba43d99 Mon Sep 17 00:00:00 2001 From: epernod Date: Mon, 21 Jan 2019 13:43:32 +0100 Subject: [PATCH 01/11] [SofaMeshCollision] Replace serr/sout by msg_ macros in TriangleModel --- SofaKernel/modules/SofaMeshCollision/TriangleModel.inl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/SofaKernel/modules/SofaMeshCollision/TriangleModel.inl b/SofaKernel/modules/SofaMeshCollision/TriangleModel.inl index 92a978760fe..55d8a1eae45 100644 --- a/SofaKernel/modules/SofaMeshCollision/TriangleModel.inl +++ b/SofaKernel/modules/SofaMeshCollision/TriangleModel.inl @@ -81,13 +81,13 @@ void TTriangleModel::init() if (mstate==NULL) { - serr << "TriangleModel requires a Vec3 Mechanical Model" << sendl; + msg_error() << "No MechanicalObject found. TriangleModel requires a Vec3 Mechanical Model in the same Node."; return; } if (!_topology) { - serr << "TriangleModel requires a BaseMeshTopology" << sendl; + msg_error() << "No Topology found. TriangleModel requires a Triangular Topology in the same Node."; return; } @@ -155,7 +155,7 @@ void TTriangleModel::updateFromTopology() core::topology::BaseMeshTopology::Triangle idx = _topology->getTriangle(i); if (idx[0] >= npoints || idx[1] >= npoints || idx[2] >= npoints) { - serr << "ERROR: Out of range index in triangle "<= npoints) idx[0] = npoints-1; if (idx[1] >= npoints) idx[1] = npoints-1; if (idx[2] >= npoints) idx[2] = npoints-1; @@ -168,7 +168,7 @@ void TTriangleModel::updateFromTopology() core::topology::BaseMeshTopology::Quad idx = _topology->getQuad(i); if (idx[0] >= npoints || idx[1] >= npoints || idx[2] >= npoints || idx[3] >= npoints) { - serr << "ERROR: Out of range index in quad "<= npoints) idx[0] = npoints-1; if (idx[1] >= npoints) idx[1] = npoints-1; if (idx[2] >= npoints) idx[2] = npoints-1; From 99428b9a2694dcd90e8581674b8f3985268e2d92 Mon Sep 17 00:00:00 2001 From: epernod Date: Mon, 21 Jan 2019 13:44:41 +0100 Subject: [PATCH 02/11] [SofaMeshCollision] Add member parameters prefix in TriangleModel --- .../modules/SofaMeshCollision/TriangleModel.h | 52 +++--- .../SofaMeshCollision/TriangleModel.inl | 171 +++++++++--------- .../TriangleModelInRegularGrid.cpp | 12 +- .../TriangleOctreeModel.cpp | 10 +- 4 files changed, 119 insertions(+), 126 deletions(-) diff --git a/SofaKernel/modules/SofaMeshCollision/TriangleModel.h b/SofaKernel/modules/SofaMeshCollision/TriangleModel.h index 491d4042e35..c6f799f6e06 100644 --- a/SofaKernel/modules/SofaMeshCollision/TriangleModel.h +++ b/SofaKernel/modules/SofaMeshCollision/TriangleModel.h @@ -137,9 +137,9 @@ class SOFA_MESH_COLLISION_API TTriangleModel : public core::CollisionModel protected: VecDeriv normals; - const sofa::core::topology::BaseMeshTopology::SeqTriangles* triangles; + const sofa::core::topology::BaseMeshTopology::SeqTriangles* p_triangles; - sofa::core::topology::BaseMeshTopology::SeqTriangles mytriangles; + sofa::core::topology::BaseMeshTopology::SeqTriangles my_triangles; bool needsUpdate; virtual void updateFromTopology(); @@ -147,13 +147,13 @@ class SOFA_MESH_COLLISION_API TTriangleModel : public core::CollisionModel virtual void updateNormals(); int getTriangleFlags(sofa::core::topology::BaseMeshTopology::TriangleID i); - core::behavior::MechanicalState* mstate; + core::behavior::MechanicalState* m_mstate; Data computeNormals; ///< set to false to disable computation of triangles normal int meshRevision; - sofa::core::topology::BaseMeshTopology* _topology; + sofa::core::topology::BaseMeshTopology* m_topology; - PointModel* mpoints; + PointModel* m_pointModels; TriangleLocalMinDistanceFilter *m_lmdFilter; @@ -179,11 +179,11 @@ class SOFA_MESH_COLLISION_API TTriangleModel : public core::CollisionModel virtual void handleTopologyChange() override; - core::behavior::MechanicalState* getMechanicalState() { return mstate; } - const core::behavior::MechanicalState* getMechanicalState() const { return mstate; } + core::behavior::MechanicalState* getMechanicalState() { return m_mstate; } + const core::behavior::MechanicalState* getMechanicalState() const { return m_mstate; } const VecCoord& getX() const { return(getMechanicalState()->read(core::ConstVecCoordId::position())->getValue()); } - const sofa::core::topology::BaseMeshTopology::SeqTriangles& getTriangles() const { return *triangles; } + const sofa::core::topology::BaseMeshTopology::SeqTriangles& getTriangles() const { return *p_triangles; } const VecDeriv& getNormals() const { return normals; } TriangleLocalMinDistanceFilter *getFilter() const; @@ -232,42 +232,42 @@ inline TTriangle::TTriangle(ParentModel* model, int index, helper::Re {} template -inline const typename DataTypes::Coord& TTriangle::p1() const { return this->model->mstate->read(core::ConstVecCoordId::position())->getValue()[(*(this->model->triangles))[this->index][0]]; } +inline const typename DataTypes::Coord& TTriangle::p1() const { return this->model->m_mstate->read(core::ConstVecCoordId::position())->getValue()[(*(this->model->p_triangles))[this->index][0]]; } template -inline const typename DataTypes::Coord& TTriangle::p2() const { return this->model->mstate->read(core::ConstVecCoordId::position())->getValue()[(*(this->model->triangles))[this->index][1]]; } +inline const typename DataTypes::Coord& TTriangle::p2() const { return this->model->m_mstate->read(core::ConstVecCoordId::position())->getValue()[(*(this->model->p_triangles))[this->index][1]]; } template -inline const typename DataTypes::Coord& TTriangle::p3() const { return this->model->mstate->read(core::ConstVecCoordId::position())->getValue()[(*(this->model->triangles))[this->index][2]]; } +inline const typename DataTypes::Coord& TTriangle::p3() const { return this->model->m_mstate->read(core::ConstVecCoordId::position())->getValue()[(*(this->model->p_triangles))[this->index][2]]; } template inline const typename DataTypes::Coord& TTriangle::p(int i) const { - return this->model->mstate->read(core::ConstVecCoordId::position())->getValue()[(*(this->model->triangles))[this->index][i]]; + return this->model->m_mstate->read(core::ConstVecCoordId::position())->getValue()[(*(this->model->p_triangles))[this->index][i]]; } template inline const typename DataTypes::Coord& TTriangle::operator[](int i) const { - return this->model->mstate->read(core::ConstVecCoordId::position())->getValue()[(*(this->model->triangles))[this->index][i]]; + return this->model->m_mstate->read(core::ConstVecCoordId::position())->getValue()[(*(this->model->p_triangles))[this->index][i]]; } template -inline const typename DataTypes::Coord& TTriangle::p1Free() const { return (*this->model->mstate->read(sofa::core::ConstVecCoordId::freePosition())->getValue())[(*(this->model->triangles))[this->index][0]]; } +inline const typename DataTypes::Coord& TTriangle::p1Free() const { return (*this->model->m_mstate->read(sofa::core::ConstVecCoordId::freePosition())->getValue())[(*(this->model->p_triangles))[this->index][0]]; } template -inline const typename DataTypes::Coord& TTriangle::p2Free() const { return (*this->model->mstate->read(sofa::core::ConstVecCoordId::freePosition())->getValue())[(*(this->model->triangles))[this->index][1]]; } +inline const typename DataTypes::Coord& TTriangle::p2Free() const { return (*this->model->m_mstate->read(sofa::core::ConstVecCoordId::freePosition())->getValue())[(*(this->model->p_triangles))[this->index][1]]; } template -inline const typename DataTypes::Coord& TTriangle::p3Free() const { return (*this->model->mstate->read(sofa::core::ConstVecCoordId::freePosition())->getValue())[(*(this->model->triangles))[this->index][2]]; } +inline const typename DataTypes::Coord& TTriangle::p3Free() const { return (*this->model->m_mstate->read(sofa::core::ConstVecCoordId::freePosition())->getValue())[(*(this->model->p_triangles))[this->index][2]]; } template -inline int TTriangle::p1Index() const { return (*(this->model->triangles))[this->index][0]; } +inline int TTriangle::p1Index() const { return (*(this->model->p_triangles))[this->index][0]; } template -inline int TTriangle::p2Index() const { return (*(this->model->triangles))[this->index][1]; } +inline int TTriangle::p2Index() const { return (*(this->model->p_triangles))[this->index][1]; } template -inline int TTriangle::p3Index() const { return (*(this->model->triangles))[this->index][2]; } +inline int TTriangle::p3Index() const { return (*(this->model->p_triangles))[this->index][2]; } template -inline const typename DataTypes::Deriv& TTriangle::v1() const { return (this->model->mstate->read(core::ConstVecDerivId::velocity())->getValue())[(*(this->model->triangles))[this->index][0]]; } +inline const typename DataTypes::Deriv& TTriangle::v1() const { return (this->model->m_mstate->read(core::ConstVecDerivId::velocity())->getValue())[(*(this->model->p_triangles))[this->index][0]]; } template -inline const typename DataTypes::Deriv& TTriangle::v2() const { return this->model->mstate->read(core::ConstVecDerivId::velocity())->getValue()[(*(this->model->triangles))[this->index][1]]; } +inline const typename DataTypes::Deriv& TTriangle::v2() const { return this->model->m_mstate->read(core::ConstVecDerivId::velocity())->getValue()[(*(this->model->p_triangles))[this->index][1]]; } template -inline const typename DataTypes::Deriv& TTriangle::v3() const { return this->model->mstate->read(core::ConstVecDerivId::velocity())->getValue()[(*(this->model->triangles))[this->index][2]]; } +inline const typename DataTypes::Deriv& TTriangle::v3() const { return this->model->m_mstate->read(core::ConstVecDerivId::velocity())->getValue()[(*(this->model->p_triangles))[this->index][2]]; } template -inline const typename DataTypes::Deriv& TTriangle::v(int i) const { return this->model->mstate->read(core::ConstVecDerivId::velocity())->getValue()[(*(this->model->triangles))[this->index][i]]; } +inline const typename DataTypes::Deriv& TTriangle::v(int i) const { return this->model->m_mstate->read(core::ConstVecDerivId::velocity())->getValue()[(*(this->model->p_triangles))[this->index][i]]; } template inline const typename DataTypes::Deriv& TTriangle::n() const { return this->model->normals[this->index]; } @@ -278,11 +278,11 @@ template inline int TTriangle::flags() const { return this->model->getTriangleFlags(this->index); } template -inline bool TTriangle::hasFreePosition() const { return this->model->mstate->read(core::ConstVecCoordId::freePosition())->isSet(); } +inline bool TTriangle::hasFreePosition() const { return this->model->m_mstate->read(core::ConstVecCoordId::freePosition())->isSet(); } template -inline typename DataTypes::Deriv TTriangleModel::velocity(int index) const { return (mstate->read(core::ConstVecDerivId::velocity())->getValue()[(*(triangles))[index][0]] + mstate->read(core::ConstVecDerivId::velocity())->getValue()[(*(triangles))[index][1]] + - mstate->read(core::ConstVecDerivId::velocity())->getValue()[(*(triangles))[index][2]])/((Real)(3.0)); } +inline typename DataTypes::Deriv TTriangleModel::velocity(int index) const { return (m_mstate->read(core::ConstVecDerivId::velocity())->getValue()[(*(p_triangles))[index][0]] + m_mstate->read(core::ConstVecDerivId::velocity())->getValue()[(*(p_triangles))[index][1]] + + m_mstate->read(core::ConstVecDerivId::velocity())->getValue()[(*(p_triangles))[index][2]])/((Real)(3.0)); } typedef TTriangleModel TriangleModel; typedef TTriangle Triangle; diff --git a/SofaKernel/modules/SofaMeshCollision/TriangleModel.inl b/SofaKernel/modules/SofaMeshCollision/TriangleModel.inl index 55d8a1eae45..6938b10e568 100644 --- a/SofaKernel/modules/SofaMeshCollision/TriangleModel.inl +++ b/SofaKernel/modules/SofaMeshCollision/TriangleModel.inl @@ -50,12 +50,13 @@ namespace collision template TTriangleModel::TTriangleModel() : bothSide(initData(&bothSide, false, "bothSide", "activate collision on both side of the triangle model") ) - , mstate(NULL) + , m_mstate(NULL) + , m_topology(NULL) , computeNormals(initData(&computeNormals, true, "computeNormals", "set to false to disable computation of triangles normal")) , meshRevision(-1) , m_lmdFilter(NULL) { - triangles = &mytriangles; + p_triangles = &my_triangles; enum_type = TRIANGLE_TYPE; } @@ -72,20 +73,21 @@ void TTriangleModel::resize(int size) template void TTriangleModel::init() { - _topology = this->getContext()->getMeshTopology(); + m_topology = this->getContext()->getMeshTopology(); + // TODO epernod 2019-01-21: Check if this call super is needed. this->CollisionModel::init(); - mstate = dynamic_cast< core::behavior::MechanicalState* > (this->getContext()->getMechanicalState()); + m_mstate = dynamic_cast< core::behavior::MechanicalState* > (this->getContext()->getMechanicalState()); - this->getContext()->get(mpoints); + this->getContext()->get(m_pointModels); - if (mstate==NULL) + if (m_mstate == NULL) { msg_error() << "No MechanicalObject found. TriangleModel requires a Vec3 Mechanical Model in the same Node."; return; } - if (!_topology) + if (m_topology == NULL) { msg_error() << "No Topology found. TriangleModel requires a Triangular Topology in the same Node."; return; @@ -97,10 +99,9 @@ void TTriangleModel::init() m_lmdFilter = node->getNodeObject< TriangleLocalMinDistanceFilter >(); } - //sout << "INFO_print : Col - init TRIANGLE " << sendl; - sout << "TriangleModel: initially "<<_topology->getNbTriangles()<<" triangles." << sendl; - triangles = &_topology->getTriangles(); - resize(_topology->getNbTriangles()); + + p_triangles = &m_topology->getTriangles(); + resize(m_topology->getNbTriangles()); updateFromTopology(); updateNormals(); @@ -118,7 +119,6 @@ void TTriangleModel::updateNormals() t.n() = cross(pt2-pt1,pt3-pt1); t.n().normalize(); - //sout << i << " " << t.n() << sendl; } } @@ -126,12 +126,12 @@ template void TTriangleModel::updateFromTopology() { // needsUpdate = false; - const unsigned npoints = mstate->getSize(); - const unsigned ntris = _topology->getNbTriangles(); - const unsigned nquads = _topology->getNbQuads(); + const unsigned npoints = m_mstate->getSize(); + const unsigned ntris = m_topology->getNbTriangles(); + const unsigned nquads = m_topology->getNbQuads(); const unsigned newsize = ntris+2*nquads; - int revision = _topology->getRevision(); + int revision = m_topology->getRevision(); if (newsize==(unsigned)size && revision == meshRevision) return; meshRevision = revision; @@ -143,16 +143,16 @@ void TTriangleModel::updateFromTopology() if (newsize == ntris) { // no need to copy the triangle indices - triangles = & _topology->getTriangles(); + p_triangles = & m_topology->getTriangles(); } else { - triangles = &mytriangles; - mytriangles.resize(newsize); + p_triangles = &my_triangles; + my_triangles.resize(newsize); int index = 0; for (unsigned i=0; igetTriangle(i); + core::topology::BaseMeshTopology::Triangle idx = m_topology->getTriangle(i); if (idx[0] >= npoints || idx[1] >= npoints || idx[2] >= npoints) { msg_error() << "Vertex index out of range in triangle " << i << ": " << idx[0] << " " << idx[1] << " " << idx[2] <<" ( total points=" << npoints << ")"; @@ -160,12 +160,12 @@ void TTriangleModel::updateFromTopology() if (idx[1] >= npoints) idx[1] = npoints-1; if (idx[2] >= npoints) idx[2] = npoints-1; } - mytriangles[index] = idx; + my_triangles[index] = idx; ++index; } for (unsigned i=0; igetQuad(i); + core::topology::BaseMeshTopology::Quad idx = m_topology->getQuad(i); if (idx[0] >= npoints || idx[1] >= npoints || idx[2] >= npoints || idx[3] >= npoints) { msg_error() << "Vertex index out of range in quad " << i << ": " << idx[0] << " " << idx[1] << " " << idx[2] << " " << idx[3] << " ( total points=" << npoints << ")"; @@ -174,13 +174,13 @@ void TTriangleModel::updateFromTopology() if (idx[2] >= npoints) idx[2] = npoints-1; if (idx[3] >= npoints) idx[3] = npoints-1; } - mytriangles[index][0] = idx[1]; - mytriangles[index][1] = idx[2]; - mytriangles[index][2] = idx[0]; + my_triangles[index][0] = idx[1]; + my_triangles[index][1] = idx[2]; + my_triangles[index][2] = idx[0]; ++index; - mytriangles[index][0] = idx[3]; - mytriangles[index][1] = idx[0]; - mytriangles[index][2] = idx[2]; + my_triangles[index][0] = idx[3]; + my_triangles[index][1] = idx[0]; + my_triangles[index][2] = idx[2]; ++index; } } @@ -192,15 +192,15 @@ template void TTriangleModel::updateFlags(int /*ntri*/) { #if 0 - if (ntri < 0) ntri = triangles->size(); - //VecCoord& x =mstate->read(core::ConstVecCoordId::position())->getValue(); - //VecDeriv& v = mstate->read(core::ConstVecDerivId::velocity())->getValue(); - vector pflags(mstate->getSize()); + if (ntri < 0) ntri = p_triangles->size(); + //VecCoord& x =m_mstate->read(core::ConstVecCoordId::position())->getValue(); + //VecDeriv& v = m_mstate->read(core::ConstVecDerivId::velocity())->getValue(); + vector pflags(m_mstate->getSize()); std::set > eflags; - for (unsigned i=0; isize(); i++) + for (unsigned i=0; isize(); i++) { int f = 0; - topology::Triangle t = (*triangles)[i]; + topology::Triangle t = (*p_triangles)[i]; if (!pflags[t[0]]) { f |= FLAG_P1; @@ -238,8 +238,8 @@ void TTriangleModel::handleTopologyChange() { // We use the same triangle array as the topology -> only resize and recompute flags - std::list::const_iterator itBegin=_topology->beginChange(); - std::list::const_iterator itEnd=_topology->endChange(); + std::list::const_iterator itBegin=m_topology->beginChange(); + std::list::const_iterator itEnd=m_topology->endChange(); //elems.handleTopologyEvents(itBegin,itEnd); while( itBegin != itEnd ) @@ -254,8 +254,8 @@ void TTriangleModel::handleTopologyChange() { updateFromTopology(); - sout << "TriangleModel: now "<<_topology->getNbTriangles()<<" triangles." << sendl; - resize(_topology->getNbTriangles()); + msg_info() << "TriangleModel: now " << m_topology->getNbTriangles() << " triangles."; + resize(m_topology->getNbTriangles()); needsUpdate=true; updateFlags(); break; @@ -263,7 +263,6 @@ void TTriangleModel::handleTopologyChange() /* case core::topology::TRIANGLESADDED: { - //sout << "INFO_print : Vis - TRIANGLESADDED" << sendl; const sofa::component::topology::TrianglesAdded *ta=static_cast< const sofa::component::topology::TrianglesAdded * >( *itBegin ); for (unsigned int i=0;igetNbAddedTriangles();++i) { Triangle t(this, size - ta->getNbAddedTriangles() + i); @@ -287,8 +286,8 @@ void TTriangleModel::handleTopologyChange() if (topoMod) // dynamic topology { - std::list::const_iterator itBegin=_topology->beginChange(); - std::list::const_iterator itEnd=_topology->endChange(); + std::list::const_iterator itBegin=m_topology->beginChange(); + std::list::const_iterator itEnd=m_topology->endChange(); while( itBegin != itEnd ) @@ -301,7 +300,6 @@ void TTriangleModel::handleTopologyChange() case core::topology::ENDING_EVENT: { - //sout << "INFO_print : Col - ENDING_EVENT" << sendl; needsUpdate=true; break; } @@ -309,14 +307,13 @@ void TTriangleModel::handleTopologyChange() case core::topology::TRIANGLESADDED: { - //sout << "INFO_print : Col - TRIANGLESADDED" << sendl; TriangleInfo t; const sofa::component::topology::TrianglesAdded *ta=static_cast< const sofa::component::topology::TrianglesAdded * >( *itBegin ); for (unsigned int i=0; igetNbAddedTriangles(); ++i) { - mytriangles.push_back(ta->triangleArray[i]); + my_triangles.push_back(ta->triangleArray[i]); } - resize( mytriangles.size()); + resize( my_triangles.size()); needsUpdate=true; break; @@ -324,11 +321,10 @@ void TTriangleModel::handleTopologyChange() case core::topology::TRIANGLESREMOVED: { - //sout << "INFO_print : Col - TRIANGLESREMOVED" << sendl; unsigned int last; unsigned int ind_last; - last= _topology->getNbPoints() - 1; + last= m_topology->getNbPoints() - 1; const sofa::helper::vector &tab = ( static_cast< const sofa::component::topology::TrianglesRemoved *>( *itBegin ) )->getArray(); @@ -344,9 +340,9 @@ void TTriangleModel::handleTopologyChange() elems[ind_k] = elems[last]; elems[last] = tmp; - tmp2 = mytriangles[ind_k]; - mytriangles[ind_k] = mytriangles[last]; - mytriangles[last] = tmp2; + tmp2 = my_triangles[ind_k]; + my_triangles[ind_k] = my_triangles[last]; + my_triangles[last] = tmp2; ind_last = elems.size() - 1; @@ -357,12 +353,12 @@ void TTriangleModel::handleTopologyChange() elems[last] = elems[ind_last]; elems[ind_last] = tmp; - tmp2 = mytriangles[last]; - mytriangles[last] = mytriangles[ind_last]; - mytriangles[ind_last] = tmp2; + tmp2 = my_triangles[last]; + my_triangles[last] = my_triangles[ind_last]; + my_triangles[ind_last] = tmp2; } - mytriangles.resize( elems.size() - 1 ); + my_triangles.resize( elems.size() - 1 ); resize( elems.size() - 1 ); --last; @@ -376,11 +372,10 @@ void TTriangleModel::handleTopologyChange() case core::topology::POINTSREMOVED: { - //sout << "INFO_print : Col - POINTSREMOVED" << sendl; - if (_topology->getNbTriangles()>0) + if (m_topology->getNbTriangles()>0) { - unsigned int last = _topology->getNbPoints() -1; + unsigned int last = m_topology->getNbPoints() -1; unsigned int i,j; const sofa::helper::vector tab = ( static_cast< const sofa::component::topology::PointsRemoved * >( *itBegin ) )->getArray(); @@ -410,46 +405,46 @@ void TTriangleModel::handleTopologyChange() } - const sofa::helper::vector &shell=_topology->getTrianglesAroundVertex(lastIndexVec[i]); + const sofa::helper::vector &shell=m_topology->getTrianglesAroundVertex(lastIndexVec[i]); for (j=0; j::handleTopologyChange() if(!is_in_shell) { - sout << "INFO_print : Col - triangle is forgotten in SHELL !!! global index = " << ind_forgotten << sendl; + msg_info() << "INFO_print : Col - triangle is forgotten in SHELL !!! global index = " << ind_forgotten; } } @@ -491,20 +486,18 @@ void TTriangleModel::handleTopologyChange() case core::topology::POINTSRENUMBERING: { - //sout << "INFO_print : Vis - POINTSRENUMBERING" << sendl; - - if (_topology->getNbTriangles()>0) + if (m_topology->getNbTriangles()>0) { unsigned int i; const sofa::helper::vector tab = ( static_cast< const sofa::component::topology::PointsRenumbering * >( *itBegin ) )->getinv_IndexArray(); - for ( i = 0; i < mytriangles.size(); ++i) + for ( i = 0; i < my_triangles.size(); ++i) { - mytriangles[i][0] = tab[mytriangles[i][0]]; - mytriangles[i][1] = tab[mytriangles[i][1]]; - mytriangles[i][2] = tab[mytriangles[i][2]]; + my_triangles[i][0] = tab[my_triangles[i][0]]; + my_triangles[i][1] = tab[my_triangles[i][1]]; + my_triangles[i][2] = tab[my_triangles[i][2]]; } } @@ -520,7 +513,7 @@ void TTriangleModel::handleTopologyChange() break; }; // switch( changeType ) - mytriangles.resize( elems.size() ); // not necessary + my_triangles.resize( elems.size() ); // not necessary resize( elems.size() ); // not necessary ++itBegin; @@ -542,7 +535,6 @@ void TTriangleModel::draw(const core::visual::VisualParams* vparams , vparams->drawTool()->setLightingEnabled(true); vparams->drawTool()->drawTriangle( t.p1(), t.p2(), t.p3(), t.n() ); vparams->drawTool()->setLightingEnabled(false); - } @@ -551,7 +543,7 @@ void TTriangleModel::draw(const core::visual::VisualParams* vparams) { if (vparams->displayFlags().getShowCollisionModels()) { - //if( size != _topology->getNbTriangles()) + //if( size != m_topology->getNbTriangles()) // updateFromTopology(); if (bothSide.getValue() || vparams->displayFlags().getShowWireFrame()) @@ -609,7 +601,7 @@ bool TTriangleModel::canCollideWithElement(int index, CollisionModel* if (this->getContext() != model2->getContext()) return true; Element t(this,index); - if (model2 == mpoints) + if (model2 == m_pointModels) { // if point belong to the triangle, return false if ( index2==t.p1Index() || index2==t.p2Index() || index2==t.p3Index()) @@ -650,7 +642,7 @@ void TTriangleModel::computeBoundingTree(int maxDepth) needsUpdate=false; defaulttype::Vector3 minElem, maxElem; - const VecCoord& x = this->mstate->read(core::ConstVecCoordId::position())->getValue(); + const VecCoord& x = this->m_mstate->read(core::ConstVecCoordId::position())->getValue(); const bool calcNormals = computeNormals.getValue(); @@ -663,6 +655,7 @@ void TTriangleModel::computeBoundingTree(int maxDepth) for (int i=0; i int TTriangleModel::getTriangleFlags(Topology::TriangleID i) { int f = 0; - sofa::core::topology::BaseMeshTopology::Triangle t = (*triangles)[i]; + sofa::core::topology::BaseMeshTopology::Triangle t = (*p_triangles)[i]; - if (i < _topology->getNbTriangles()) + if (i < m_topology->getNbTriangles()) { for (unsigned int j=0; j<3; ++j) { - const sofa::core::topology::BaseMeshTopology::TrianglesAroundVertex& tav = _topology->getTrianglesAroundVertex(t[j]); + const sofa::core::topology::BaseMeshTopology::TrianglesAroundVertex& tav = m_topology->getTrianglesAroundVertex(t[j]); if (tav[0] == (sofa::core::topology::BaseMeshTopology::TriangleID)i) f |= (FLAG_P1 << j); } - const sofa::core::topology::BaseMeshTopology::EdgesInTriangle& e = _topology->getEdgesInTriangle(i); + const sofa::core::topology::BaseMeshTopology::EdgesInTriangle& e = m_topology->getEdgesInTriangle(i); for (unsigned int j=0; j<3; ++j) { - const sofa::core::topology::BaseMeshTopology::TrianglesAroundEdge& tae = _topology->getTrianglesAroundEdge(e[j]); + const sofa::core::topology::BaseMeshTopology::TrianglesAroundEdge& tae = m_topology->getTrianglesAroundEdge(e[j]); if (tae[0] == (sofa::core::topology::BaseMeshTopology::TriangleID)i) f |= (FLAG_E23 << j); if (tae.size() == 1) diff --git a/applications/plugins/SofaMiscCollision/TriangleModelInRegularGrid.cpp b/applications/plugins/SofaMiscCollision/TriangleModelInRegularGrid.cpp index 53fb68af25e..1e48d6608c9 100644 --- a/applications/plugins/SofaMiscCollision/TriangleModelInRegularGrid.cpp +++ b/applications/plugins/SofaMiscCollision/TriangleModelInRegularGrid.cpp @@ -71,17 +71,17 @@ void TriangleModelInRegularGrid::init() TriangleModel::init(); _topology = this->getContext()->getMeshTopology(); - mstate = dynamic_cast< core::behavior::MechanicalState* > (getContext()->getMechanicalState()); + m_mstate = dynamic_cast< core::behavior::MechanicalState* > (getContext()->getMechanicalState()); - if( !mstate) { serr << "TriangleModelInRegularGrid requires a Vec3 Mechanical Model" << sendl; return;} - if (!_topology) { serr << "TriangleModelInRegularGrid requires a BaseMeshTopology" << sendl; return;} + if( !m_mstate) { serr << "TriangleModelInRegularGrid requires a Vec3 Mechanical Model" << sendl; return;} + if (!m_topology) { serr << "TriangleModelInRegularGrid requires a BaseMeshTopology" << sendl; return;} // Test if _topology depend on an higher topology (to compute Bounding Tree faster) and get it TopologicalMapping* _topoMapping = NULL; vector topoVec; getContext()->get ( &topoVec, core::objectmodel::BaseContext::SearchRoot ); - _higher_topo = _topology; - _higher_mstate = mstate; + _higher_topo = m_topology; + _higher_mstate = m_mstate; bool found = true; while ( found ) { @@ -114,7 +114,7 @@ void TriangleModelInRegularGrid::computeBoundingTree ( int ) needsUpdate=false; Vector3 minElem, maxElem; const VecCoord& xHigh =_higher_mstate->read(core::ConstVecCoordId::position())->getValue(); - const VecCoord& x =mstate->read(core::ConstVecCoordId::position())->getValue(); + const VecCoord& x =m_mstate->read(core::ConstVecCoordId::position())->getValue(); // no hierarchy if ( empty() ) diff --git a/modules/SofaGeneralMeshCollision/TriangleOctreeModel.cpp b/modules/SofaGeneralMeshCollision/TriangleOctreeModel.cpp index b44bd889aae..ba0da7ff49d 100644 --- a/modules/SofaGeneralMeshCollision/TriangleOctreeModel.cpp +++ b/modules/SofaGeneralMeshCollision/TriangleOctreeModel.cpp @@ -84,7 +84,7 @@ void TriangleOctreeModel::draw (const core::visual::VisualParams* vparams) void TriangleOctreeModel::computeBoundingTree(int maxDepth) { - const helper::vector& tri = *triangles; + const helper::vector& tri = *p_triangles; if(octreeRoot) { delete octreeRoot; @@ -95,16 +95,16 @@ void TriangleOctreeModel::computeBoundingTree(int maxDepth) updateFromTopology(); if (!isMoving() && !cubeModel->empty()) return; // No need to recompute BBox if immobile - int size2=mstate->getSize(); + int size2=m_mstate->getSize(); pNorms.resize(size2); for(int i=0; iread(core::ConstVecCoordId::position())->getValue()[0][0]; - maxElem[1]=minElem[1]=mstate->read(core::ConstVecCoordId::position())->getValue()[0][1]; - maxElem[2]=minElem[2]=mstate->read(core::ConstVecCoordId::position())->getValue()[0][2]; + maxElem[0]=minElem[0]=m_mstate->read(core::ConstVecCoordId::position())->getValue()[0][0]; + maxElem[1]=minElem[1]=m_mstate->read(core::ConstVecCoordId::position())->getValue()[0][1]; + maxElem[2]=minElem[2]=m_mstate->read(core::ConstVecCoordId::position())->getValue()[0][2]; cubeModel->resize(1); // size = number of triangles for (int i=1; i Date: Tue, 22 Jan 2019 12:42:58 +0100 Subject: [PATCH 03/11] [SofaMeshCollision] Add some doxygen comments and reorder parameter declaration. --- .../modules/SofaMeshCollision/TriangleModel.h | 41 +++++++++++++------ .../SofaMeshCollision/TriangleModel.inl | 9 ++-- 2 files changed, 32 insertions(+), 18 deletions(-) diff --git a/SofaKernel/modules/SofaMeshCollision/TriangleModel.h b/SofaKernel/modules/SofaMeshCollision/TriangleModel.h index c6f799f6e06..b2f2f0d0142 100644 --- a/SofaKernel/modules/SofaMeshCollision/TriangleModel.h +++ b/SofaKernel/modules/SofaMeshCollision/TriangleModel.h @@ -100,6 +100,11 @@ class TTriangle : public core::TCollisionElementIterator< TTriangleModel class SOFA_MESH_COLLISION_API TTriangleModel : public core::CollisionModel { @@ -134,24 +139,25 @@ class SOFA_MESH_COLLISION_API TTriangleModel : public core::CollisionModel enum { NBARY = 2 }; Data bothSide; ///< to activate collision on both side of the triangle model -protected: - VecDeriv normals; + Data computeNormals; ///< set to false to disable computation of triangles normal - const sofa::core::topology::BaseMeshTopology::SeqTriangles* p_triangles; +protected: + core::behavior::MechanicalState* m_mstate; ///< Pointer to the corresponding MechanicalState + sofa::core::topology::BaseMeshTopology* m_topology; ///< Pointer to the corresponding Topology - sofa::core::topology::BaseMeshTopology::SeqTriangles my_triangles; + VecDeriv normals; ///< Vector of normal direction per triangle. - bool needsUpdate; - virtual void updateFromTopology(); - virtual void updateFlags(int ntri=-1); - virtual void updateNormals(); - int getTriangleFlags(sofa::core::topology::BaseMeshTopology::TriangleID i); + /** Pointer to the triangle array of this collision model. + * Will point directly to the topology triangle buffer if only triangles are present. If topology is using/mixing quads and triangles, + * This pointer will target \sa my_triangles + * @brief p_triangles + */ + const sofa::core::topology::BaseMeshTopology::SeqTriangles* p_triangles; - core::behavior::MechanicalState* m_mstate; - Data computeNormals; ///< set to false to disable computation of triangles normal - int meshRevision; + sofa::core::topology::BaseMeshTopology::SeqTriangles my_triangles; ///< Internal Buffer of triangles to combine quads splitted and other triangles. - sofa::core::topology::BaseMeshTopology* m_topology; + bool needsUpdate; ///< parameter storing the info boundingTree has to be recomputed. + int m_topologyRevision; ///< internal revision number to check if topology has changed. PointModel* m_pointModels; @@ -160,6 +166,11 @@ class SOFA_MESH_COLLISION_API TTriangleModel : public core::CollisionModel protected: TTriangleModel(); + + virtual void updateFromTopology(); + virtual void updateFlags(int ntri=-1); + virtual void updateNormals(); + public: virtual void init() override; @@ -185,6 +196,7 @@ class SOFA_MESH_COLLISION_API TTriangleModel : public core::CollisionModel const VecCoord& getX() const { return(getMechanicalState()->read(core::ConstVecCoordId::position())->getValue()); } const sofa::core::topology::BaseMeshTopology::SeqTriangles& getTriangles() const { return *p_triangles; } const VecDeriv& getNormals() const { return normals; } + int getTriangleFlags(sofa::core::topology::BaseMeshTopology::TriangleID i); TriangleLocalMinDistanceFilter *getFilter() const; @@ -216,6 +228,9 @@ class SOFA_MESH_COLLISION_API TTriangleModel : public core::CollisionModel virtual void computeBBox(const core::ExecParams* params, bool onlyVisible=false) override; }; + + + template inline TTriangle::TTriangle(ParentModel* model, int index) : core::TCollisionElementIterator(model, index) diff --git a/SofaKernel/modules/SofaMeshCollision/TriangleModel.inl b/SofaKernel/modules/SofaMeshCollision/TriangleModel.inl index 6938b10e568..f571b5c894c 100644 --- a/SofaKernel/modules/SofaMeshCollision/TriangleModel.inl +++ b/SofaKernel/modules/SofaMeshCollision/TriangleModel.inl @@ -50,10 +50,12 @@ namespace collision template TTriangleModel::TTriangleModel() : bothSide(initData(&bothSide, false, "bothSide", "activate collision on both side of the triangle model") ) + , computeNormals(initData(&computeNormals, true, "computeNormals", "set to false to disable computation of triangles normal")) , m_mstate(NULL) , m_topology(NULL) - , computeNormals(initData(&computeNormals, true, "computeNormals", "set to false to disable computation of triangles normal")) - , meshRevision(-1) + , needsUpdate(true) + , m_topologyRevision(-1) + , m_pointModels(NULL) , m_lmdFilter(NULL) { p_triangles = &my_triangles; @@ -64,9 +66,6 @@ template void TTriangleModel::resize(int size) { this->core::CollisionModel::resize(size); - //helper::vector& e = *(elems.beginEdit()); - //e.resize(size); - //elems.endEdit(); normals.resize(size); } From 2454e1812fda78f5e9e312d0c948ef38dbd191d3 Mon Sep 17 00:00:00 2001 From: epernod Date: Tue, 22 Jan 2019 12:45:19 +0100 Subject: [PATCH 04/11] [SofaMeshCollision] Rewritte init and updateFromTopology methods in TriangleModel. --- .../SofaMeshCollision/TriangleModel.inl | 60 +++++++++++++------ 1 file changed, 41 insertions(+), 19 deletions(-) diff --git a/SofaKernel/modules/SofaMeshCollision/TriangleModel.inl b/SofaKernel/modules/SofaMeshCollision/TriangleModel.inl index f571b5c894c..2c9d799a802 100644 --- a/SofaKernel/modules/SofaMeshCollision/TriangleModel.inl +++ b/SofaKernel/modules/SofaMeshCollision/TriangleModel.inl @@ -80,15 +80,23 @@ void TTriangleModel::init() this->getContext()->get(m_pointModels); + // Check object pointer access + bool modelsOk = true; if (m_mstate == NULL) { msg_error() << "No MechanicalObject found. TriangleModel requires a Vec3 Mechanical Model in the same Node."; - return; + modelsOk = false; } if (m_topology == NULL) { msg_error() << "No Topology found. TriangleModel requires a Triangular Topology in the same Node."; + modelsOk = false; + } + + if (!modelsOk) + { + this->m_componentstate = sofa::core::objectmodel::ComponentState::Invalid; return; } @@ -98,12 +106,19 @@ void TTriangleModel::init() m_lmdFilter = node->getNodeObject< TriangleLocalMinDistanceFilter >(); } - - p_triangles = &m_topology->getTriangles(); - resize(m_topology->getNbTriangles()); - - updateFromTopology(); - updateNormals(); + // check if topology is using triangles and quads at the same time. + if (m_topology->getNbQuads() != 0) + { + updateFromTopology(); // in this case, need to create a single buffer with both topology + // updateNormals will be call in updateFromTopology + } + else + { + // just redirect to the topology buffer. + p_triangles = &m_topology->getTriangles(); + resize(m_topology->getNbTriangles()); + updateNormals(); + } } template @@ -124,28 +139,32 @@ void TTriangleModel::updateNormals() template void TTriangleModel::updateFromTopology() { - // needsUpdate = false; - const unsigned npoints = m_mstate->getSize(); - const unsigned ntris = m_topology->getNbTriangles(); - const unsigned nquads = m_topology->getNbQuads(); - const unsigned newsize = ntris+2*nquads; - int revision = m_topology->getRevision(); - if (newsize==(unsigned)size && revision == meshRevision) + if (revision == m_topologyRevision) return; - meshRevision = revision; - needsUpdate=true; + m_topologyRevision = revision; - resize(newsize); + const unsigned nquads = m_topology->getNbQuads(); + const unsigned ntris = m_topology->getNbTriangles(); - if (newsize == ntris) + if (nquads == 0) // only triangles { - // no need to copy the triangle indices + if (ntris == (unsigned)size) // revision changed but no changes on the triangulation. + return; + + resize(ntris); p_triangles = & m_topology->getTriangles(); } else { + const unsigned newsize = ntris+2*nquads; + + if (newsize==(unsigned)size) // revision changed but no changes on the triangulation/quads. + return; + + const unsigned npoints = m_mstate->getSize(); + p_triangles = &my_triangles; my_triangles.resize(newsize); int index = 0; @@ -185,6 +204,9 @@ void TTriangleModel::updateFromTopology() } updateFlags(); updateNormals(); + + // topology has changed, force boudingTree recomputation + needsUpdate = true; } template From 5327f7ff9040643e12445d5837cff639c758f2d4 Mon Sep 17 00:00:00 2001 From: epernod Date: Tue, 22 Jan 2019 12:54:03 +0100 Subject: [PATCH 05/11] [SofaMeshCollision] Remove the handleTopologyChange method from TriangleModel. As this class use directly the topology buffers, no need neither for TopologyData. Just check the topology revision and update the component if topology has changed. --- .../modules/SofaMeshCollision/TriangleModel.h | 2 - .../SofaMeshCollision/TriangleModel.inl | 448 ++++-------------- 2 files changed, 83 insertions(+), 367 deletions(-) diff --git a/SofaKernel/modules/SofaMeshCollision/TriangleModel.h b/SofaKernel/modules/SofaMeshCollision/TriangleModel.h index b2f2f0d0142..c7ec9725d1f 100644 --- a/SofaKernel/modules/SofaMeshCollision/TriangleModel.h +++ b/SofaKernel/modules/SofaMeshCollision/TriangleModel.h @@ -188,8 +188,6 @@ class SOFA_MESH_COLLISION_API TTriangleModel : public core::CollisionModel virtual bool canCollideWithElement(int index, CollisionModel* model2, int index2) override; - virtual void handleTopologyChange() override; - core::behavior::MechanicalState* getMechanicalState() { return m_mstate; } const core::behavior::MechanicalState* getMechanicalState() const { return m_mstate; } diff --git a/SofaKernel/modules/SofaMeshCollision/TriangleModel.inl b/SofaKernel/modules/SofaMeshCollision/TriangleModel.inl index 2c9d799a802..4f1413902a4 100644 --- a/SofaKernel/modules/SofaMeshCollision/TriangleModel.inl +++ b/SofaKernel/modules/SofaMeshCollision/TriangleModel.inl @@ -254,366 +254,6 @@ void TTriangleModel::updateFlags(int /*ntri*/) #endif } -template -void TTriangleModel::handleTopologyChange() -{ - - // We use the same triangle array as the topology -> only resize and recompute flags - std::list::const_iterator itBegin=m_topology->beginChange(); - std::list::const_iterator itEnd=m_topology->endChange(); - //elems.handleTopologyEvents(itBegin,itEnd); - - while( itBegin != itEnd ) - { - core::topology::TopologyChangeType changeType = (*itBegin)->getChangeType(); - - switch( changeType ) - { - - - case core::topology::ENDING_EVENT: - { - updateFromTopology(); - - msg_info() << "TriangleModel: now " << m_topology->getNbTriangles() << " triangles."; - resize(m_topology->getNbTriangles()); - needsUpdate=true; - updateFlags(); - break; - } - /* - case core::topology::TRIANGLESADDED: - { - const sofa::component::topology::TrianglesAdded *ta=static_cast< const sofa::component::topology::TrianglesAdded * >( *itBegin ); - for (unsigned int i=0;igetNbAddedTriangles();++i) { - Triangle t(this, size - ta->getNbAddedTriangles() + i); - const defaulttype::Vector3& pt1 = t.p1(); - const defaulttype::Vector3& pt2 = t.p2(); - const defaulttype::Vector3& pt3 = t.p3(); - t.n() = cross(pt2-pt1,pt3-pt1); - t.n().normalize(); - } - break; - }*/ - default: break; - } - ++itBegin; - } - return; -#if 0 - sofa::core::topology::TopologyModifier* topoMod; - this->getContext()->get(topoMod); - - if (topoMod) // dynamic topology - { - - std::list::const_iterator itBegin=m_topology->beginChange(); - std::list::const_iterator itEnd=m_topology->endChange(); - - - while( itBegin != itEnd ) - { - core::topology::TopologyChangeType changeType = (*itBegin)->getChangeType(); - - switch( changeType ) - { - - - case core::topology::ENDING_EVENT: - { - needsUpdate=true; - break; - } - - - case core::topology::TRIANGLESADDED: - { - TriangleInfo t; - const sofa::component::topology::TrianglesAdded *ta=static_cast< const sofa::component::topology::TrianglesAdded * >( *itBegin ); - for (unsigned int i=0; igetNbAddedTriangles(); ++i) - { - my_triangles.push_back(ta->triangleArray[i]); - } - resize( my_triangles.size()); - needsUpdate=true; - - break; - } - - case core::topology::TRIANGLESREMOVED: - { - unsigned int last; - unsigned int ind_last; - - last= m_topology->getNbPoints() - 1; - - const sofa::helper::vector &tab = ( static_cast< const sofa::component::topology::TrianglesRemoved *>( *itBegin ) )->getArray(); - - TriangleInfo tmp; - topology::Triangle tmp2; - - for (unsigned int i = 0; i getNbTriangles()>0) - { - - unsigned int last = m_topology->getNbPoints() -1; - - unsigned int i,j; - const sofa::helper::vector tab = ( static_cast< const sofa::component::topology::PointsRemoved * >( *itBegin ) )->getArray(); - - sofa::helper::vector lastIndexVec; - for(unsigned int i_init = 0; i_init < tab.size(); ++i_init) - { - - lastIndexVec.push_back(last - i_init); - } - - for ( i = 0; i < tab.size(); ++i) - { - unsigned int i_next = i; - bool is_reached = false; - while( (!is_reached) && (i_next < lastIndexVec.size() - 1)) - { - - i_next += 1 ; - is_reached = is_reached || (lastIndexVec[i_next] == tab[i]); - } - - if(is_reached) - { - - lastIndexVec[i_next] = lastIndexVec[i]; - - } - - const sofa::helper::vector &shell=m_topology->getTrianglesAroundVertex(lastIndexVec[i]); - for (j=0; jgetNbTriangles()>0) - { - - unsigned int i; - - const sofa::helper::vector tab = ( static_cast< const sofa::component::topology::PointsRenumbering * >( *itBegin ) )->getinv_IndexArray(); - - for ( i = 0; i < my_triangles.size(); ++i) - { - my_triangles[i][0] = tab[my_triangles[i][0]]; - my_triangles[i][1] = tab[my_triangles[i][1]]; - my_triangles[i][2] = tab[my_triangles[i][2]]; - } - - } - - //} - - break; - - } - - default: - // Ignore events that are not Triangle related. - break; - }; // switch( changeType ) - - my_triangles.resize( elems.size() ); // not necessary - resize( elems.size() ); // not necessary - - ++itBegin; - } // while( changeIt != last; ) - } - if (needsUpdate) - { - updateFlags(); - } -#endif -} - -template -void TTriangleModel::draw(const core::visual::VisualParams* vparams ,int index) -{ - Element t(this,index); - - vparams->drawTool()->setPolygonMode(0,vparams->displayFlags().getShowWireFrame()); - vparams->drawTool()->setLightingEnabled(true); - vparams->drawTool()->drawTriangle( t.p1(), t.p2(), t.p3(), t.n() ); - vparams->drawTool()->setLightingEnabled(false); -} - - -template -void TTriangleModel::draw(const core::visual::VisualParams* vparams) -{ - if (vparams->displayFlags().getShowCollisionModels()) - { - //if( size != m_topology->getNbTriangles()) - // updateFromTopology(); - - if (bothSide.getValue() || vparams->displayFlags().getShowWireFrame()) - vparams->drawTool()->setPolygonMode(0,vparams->displayFlags().getShowWireFrame()); - else - { - vparams->drawTool()->setPolygonMode(2,true); - vparams->drawTool()->setPolygonMode(1,false); - } - - std::vector< defaulttype::Vector3 > points; - std::vector< defaulttype::Vec<3,int> > indices; - std::vector< defaulttype::Vector3 > normals; - int index=0; - for (int i=0; i(index,index+1,index+2)); - index+=3; - } - - vparams->drawTool()->setLightingEnabled(true); - vparams->drawTool()->drawTriangles(points, indices, normals, defaulttype::Vec<4,float>(getColor4f())); - vparams->drawTool()->setLightingEnabled(false); - vparams->drawTool()->setPolygonMode(0,false); - - - if (vparams->displayFlags().getShowNormals()) - { - std::vector< defaulttype::Vector3 > points; - for (int i=0; idrawTool()->drawLines(points, 1, defaulttype::Vec<4,float>(1,1,1,1)); - - } - } - if (getPrevious()!=NULL && vparams->displayFlags().getShowBoundingCollisionModels()) - getPrevious()->draw(vparams); -} - template bool TTriangleModel::canCollideWithElement(int index, CollisionModel* model2, int index2) @@ -657,18 +297,22 @@ void TTriangleModel::computeBoundingTree(int maxDepth) { CubeModel* cubeModel = createPrevious(); + // check first that topology didn't changed + if (m_topology->getRevision() != m_topologyRevision) + updateFromTopology(); + if (needsUpdate && !cubeModel->empty()) cubeModel->resize(0); - if (!isMoving() && !cubeModel->empty() && !needsUpdate) return; // No need to recompute BBox if immobile + if (!isMoving() && !cubeModel->empty() && !needsUpdate) return; // No need to recompute BBox if immobile nor if mesh didn't change. + // set to false to avoid excesive loop needsUpdate=false; + defaulttype::Vector3 minElem, maxElem; const VecCoord& x = this->m_mstate->read(core::ConstVecCoordId::position())->getValue(); const bool calcNormals = computeNormals.getValue(); - - cubeModel->resize(size); // size = number of triangles if (!empty()) { @@ -714,9 +358,13 @@ template void TTriangleModel::computeContinuousBoundingTree(double dt, int maxDepth) { CubeModel* cubeModel = createPrevious(); - //updateFromTopology(); + + // check first that topology didn't changed + if (m_topology->getRevision() != m_topologyRevision) + updateFromTopology(); + if (needsUpdate) cubeModel->resize(0); - if (!isMoving() && !cubeModel->empty() && !needsUpdate) return; // No need to recompute BBox if immobile + if (!isMoving() && !cubeModel->empty() && !needsUpdate) return; // No need to recompute BBox if immobile nor if mesh didn't change. needsUpdate=false; defaulttype::Vector3 minElem, maxElem; @@ -845,6 +493,76 @@ void TTriangleModel::computeBBox(const core::ExecParams* params, bool } +template +void TTriangleModel::draw(const core::visual::VisualParams* vparams ,int index) +{ + Element t(this,index); + + vparams->drawTool()->setPolygonMode(0,vparams->displayFlags().getShowWireFrame()); + vparams->drawTool()->setLightingEnabled(true); + vparams->drawTool()->drawTriangle( t.p1(), t.p2(), t.p3(), t.n() ); + vparams->drawTool()->setLightingEnabled(false); +} + + +template +void TTriangleModel::draw(const core::visual::VisualParams* vparams) +{ + if (vparams->displayFlags().getShowCollisionModels()) + { + // In case topology has changed but drawing is called before the updateFromTopology has been computed, just exit to avoid computation in drawing thread. + if (m_topology->getRevision() != m_topologyRevision) + return; + + if (bothSide.getValue() || vparams->displayFlags().getShowWireFrame()) + vparams->drawTool()->setPolygonMode(0,vparams->displayFlags().getShowWireFrame()); + else + { + vparams->drawTool()->setPolygonMode(2,true); + vparams->drawTool()->setPolygonMode(1,false); + } + + std::vector< defaulttype::Vector3 > points; + std::vector< defaulttype::Vec<3,int> > indices; + std::vector< defaulttype::Vector3 > normals; + int index=0; + for (int i=0; i(index,index+1,index+2)); + index+=3; + } + + vparams->drawTool()->setLightingEnabled(true); + vparams->drawTool()->drawTriangles(points, indices, normals, defaulttype::Vec<4,float>(getColor4f())); + vparams->drawTool()->setLightingEnabled(false); + vparams->drawTool()->setPolygonMode(0,false); + + + if (vparams->displayFlags().getShowNormals()) + { + std::vector< defaulttype::Vector3 > points; + for (int i=0; idrawTool()->drawLines(points, 1, defaulttype::Vec<4,float>(1,1,1,1)); + + } + } + if (getPrevious()!=NULL && vparams->displayFlags().getShowBoundingCollisionModels()) + getPrevious()->draw(vparams); +} + + + } // namespace collision } // namespace component From 80a0b60c0252adfdd99b3630844691488566792a Mon Sep 17 00:00:00 2001 From: epernod Date: Tue, 22 Jan 2019 12:58:47 +0100 Subject: [PATCH 06/11] [Examples] Add TriangleModel in Removing and Adding TrianglesProcess scene tests --- .../topology/TopologicalModifiers/AddingTrianglesProcess.scn | 1 + .../topology/TopologicalModifiers/RemovingTrianglesProcess.scn | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/Components/topology/TopologicalModifiers/AddingTrianglesProcess.scn b/examples/Components/topology/TopologicalModifiers/AddingTrianglesProcess.scn index ce3ea560ca1..91695fc773a 100644 --- a/examples/Components/topology/TopologicalModifiers/AddingTrianglesProcess.scn +++ b/examples/Components/topology/TopologicalModifiers/AddingTrianglesProcess.scn @@ -18,6 +18,7 @@ + diff --git a/examples/Components/topology/TopologicalModifiers/RemovingTrianglesProcess.scn b/examples/Components/topology/TopologicalModifiers/RemovingTrianglesProcess.scn index f5aaa5e9be0..71713b6004b 100644 --- a/examples/Components/topology/TopologicalModifiers/RemovingTrianglesProcess.scn +++ b/examples/Components/topology/TopologicalModifiers/RemovingTrianglesProcess.scn @@ -19,7 +19,7 @@ - + From c118f621526ee436e377e7f543398a7a84d193c2 Mon Sep 17 00:00:00 2001 From: erik pernod Date: Wed, 23 Jan 2019 11:07:53 +0100 Subject: [PATCH 07/11] [SofaMeshCollision]Update TriangleModel test on topology. Always update mesh component when revision has changed. --- SofaKernel/modules/SofaMeshCollision/TriangleModel.inl | 7 ------- 1 file changed, 7 deletions(-) diff --git a/SofaKernel/modules/SofaMeshCollision/TriangleModel.inl b/SofaKernel/modules/SofaMeshCollision/TriangleModel.inl index 4f1413902a4..2378f9c3a87 100644 --- a/SofaKernel/modules/SofaMeshCollision/TriangleModel.inl +++ b/SofaKernel/modules/SofaMeshCollision/TriangleModel.inl @@ -150,19 +150,12 @@ void TTriangleModel::updateFromTopology() if (nquads == 0) // only triangles { - if (ntris == (unsigned)size) // revision changed but no changes on the triangulation. - return; - resize(ntris); p_triangles = & m_topology->getTriangles(); } else { const unsigned newsize = ntris+2*nquads; - - if (newsize==(unsigned)size) // revision changed but no changes on the triangulation/quads. - return; - const unsigned npoints = m_mstate->getSize(); p_triangles = &my_triangles; From be087fa042de2601188999eff59c4d2389149e57 Mon Sep 17 00:00:00 2001 From: epernod Date: Wed, 30 Jan 2019 11:15:45 +0100 Subject: [PATCH 08/11] [SofaMeshCollision] Change name and prefix of TriangleModel internal triangle buffer and *buffer --- .../modules/SofaMeshCollision/TriangleModel.h | 44 +++++++++---------- .../SofaMeshCollision/TriangleModel.inl | 32 +++++++------- .../TriangleOctreeModel.cpp | 2 +- 3 files changed, 39 insertions(+), 39 deletions(-) diff --git a/SofaKernel/modules/SofaMeshCollision/TriangleModel.h b/SofaKernel/modules/SofaMeshCollision/TriangleModel.h index c7ec9725d1f..cc860ff4f4f 100644 --- a/SofaKernel/modules/SofaMeshCollision/TriangleModel.h +++ b/SofaKernel/modules/SofaMeshCollision/TriangleModel.h @@ -149,12 +149,12 @@ class SOFA_MESH_COLLISION_API TTriangleModel : public core::CollisionModel /** Pointer to the triangle array of this collision model. * Will point directly to the topology triangle buffer if only triangles are present. If topology is using/mixing quads and triangles, - * This pointer will target \sa my_triangles - * @brief p_triangles + * This pointer will target \sa m_internalTriangles + * @brief m_triangles */ - const sofa::core::topology::BaseMeshTopology::SeqTriangles* p_triangles; + const sofa::core::topology::BaseMeshTopology::SeqTriangles* m_triangles; - sofa::core::topology::BaseMeshTopology::SeqTriangles my_triangles; ///< Internal Buffer of triangles to combine quads splitted and other triangles. + sofa::core::topology::BaseMeshTopology::SeqTriangles m_internalTriangles; ///< Internal Buffer of triangles to combine quads splitted and other triangles. bool needsUpdate; ///< parameter storing the info boundingTree has to be recomputed. int m_topologyRevision; ///< internal revision number to check if topology has changed. @@ -192,7 +192,7 @@ class SOFA_MESH_COLLISION_API TTriangleModel : public core::CollisionModel const core::behavior::MechanicalState* getMechanicalState() const { return m_mstate; } const VecCoord& getX() const { return(getMechanicalState()->read(core::ConstVecCoordId::position())->getValue()); } - const sofa::core::topology::BaseMeshTopology::SeqTriangles& getTriangles() const { return *p_triangles; } + const sofa::core::topology::BaseMeshTopology::SeqTriangles& getTriangles() const { return *m_triangles; } const VecDeriv& getNormals() const { return normals; } int getTriangleFlags(sofa::core::topology::BaseMeshTopology::TriangleID i); @@ -245,42 +245,42 @@ inline TTriangle::TTriangle(ParentModel* model, int index, helper::Re {} template -inline const typename DataTypes::Coord& TTriangle::p1() const { return this->model->m_mstate->read(core::ConstVecCoordId::position())->getValue()[(*(this->model->p_triangles))[this->index][0]]; } +inline const typename DataTypes::Coord& TTriangle::p1() const { return this->model->m_mstate->read(core::ConstVecCoordId::position())->getValue()[(*(this->model->m_triangles))[this->index][0]]; } template -inline const typename DataTypes::Coord& TTriangle::p2() const { return this->model->m_mstate->read(core::ConstVecCoordId::position())->getValue()[(*(this->model->p_triangles))[this->index][1]]; } +inline const typename DataTypes::Coord& TTriangle::p2() const { return this->model->m_mstate->read(core::ConstVecCoordId::position())->getValue()[(*(this->model->m_triangles))[this->index][1]]; } template -inline const typename DataTypes::Coord& TTriangle::p3() const { return this->model->m_mstate->read(core::ConstVecCoordId::position())->getValue()[(*(this->model->p_triangles))[this->index][2]]; } +inline const typename DataTypes::Coord& TTriangle::p3() const { return this->model->m_mstate->read(core::ConstVecCoordId::position())->getValue()[(*(this->model->m_triangles))[this->index][2]]; } template inline const typename DataTypes::Coord& TTriangle::p(int i) const { - return this->model->m_mstate->read(core::ConstVecCoordId::position())->getValue()[(*(this->model->p_triangles))[this->index][i]]; + return this->model->m_mstate->read(core::ConstVecCoordId::position())->getValue()[(*(this->model->m_triangles))[this->index][i]]; } template inline const typename DataTypes::Coord& TTriangle::operator[](int i) const { - return this->model->m_mstate->read(core::ConstVecCoordId::position())->getValue()[(*(this->model->p_triangles))[this->index][i]]; + return this->model->m_mstate->read(core::ConstVecCoordId::position())->getValue()[(*(this->model->m_triangles))[this->index][i]]; } template -inline const typename DataTypes::Coord& TTriangle::p1Free() const { return (*this->model->m_mstate->read(sofa::core::ConstVecCoordId::freePosition())->getValue())[(*(this->model->p_triangles))[this->index][0]]; } +inline const typename DataTypes::Coord& TTriangle::p1Free() const { return (*this->model->m_mstate->read(sofa::core::ConstVecCoordId::freePosition())->getValue())[(*(this->model->m_triangles))[this->index][0]]; } template -inline const typename DataTypes::Coord& TTriangle::p2Free() const { return (*this->model->m_mstate->read(sofa::core::ConstVecCoordId::freePosition())->getValue())[(*(this->model->p_triangles))[this->index][1]]; } +inline const typename DataTypes::Coord& TTriangle::p2Free() const { return (*this->model->m_mstate->read(sofa::core::ConstVecCoordId::freePosition())->getValue())[(*(this->model->m_triangles))[this->index][1]]; } template -inline const typename DataTypes::Coord& TTriangle::p3Free() const { return (*this->model->m_mstate->read(sofa::core::ConstVecCoordId::freePosition())->getValue())[(*(this->model->p_triangles))[this->index][2]]; } +inline const typename DataTypes::Coord& TTriangle::p3Free() const { return (*this->model->m_mstate->read(sofa::core::ConstVecCoordId::freePosition())->getValue())[(*(this->model->m_triangles))[this->index][2]]; } template -inline int TTriangle::p1Index() const { return (*(this->model->p_triangles))[this->index][0]; } +inline int TTriangle::p1Index() const { return (*(this->model->m_triangles))[this->index][0]; } template -inline int TTriangle::p2Index() const { return (*(this->model->p_triangles))[this->index][1]; } +inline int TTriangle::p2Index() const { return (*(this->model->m_triangles))[this->index][1]; } template -inline int TTriangle::p3Index() const { return (*(this->model->p_triangles))[this->index][2]; } +inline int TTriangle::p3Index() const { return (*(this->model->m_triangles))[this->index][2]; } template -inline const typename DataTypes::Deriv& TTriangle::v1() const { return (this->model->m_mstate->read(core::ConstVecDerivId::velocity())->getValue())[(*(this->model->p_triangles))[this->index][0]]; } +inline const typename DataTypes::Deriv& TTriangle::v1() const { return (this->model->m_mstate->read(core::ConstVecDerivId::velocity())->getValue())[(*(this->model->m_triangles))[this->index][0]]; } template -inline const typename DataTypes::Deriv& TTriangle::v2() const { return this->model->m_mstate->read(core::ConstVecDerivId::velocity())->getValue()[(*(this->model->p_triangles))[this->index][1]]; } +inline const typename DataTypes::Deriv& TTriangle::v2() const { return this->model->m_mstate->read(core::ConstVecDerivId::velocity())->getValue()[(*(this->model->m_triangles))[this->index][1]]; } template -inline const typename DataTypes::Deriv& TTriangle::v3() const { return this->model->m_mstate->read(core::ConstVecDerivId::velocity())->getValue()[(*(this->model->p_triangles))[this->index][2]]; } +inline const typename DataTypes::Deriv& TTriangle::v3() const { return this->model->m_mstate->read(core::ConstVecDerivId::velocity())->getValue()[(*(this->model->m_triangles))[this->index][2]]; } template -inline const typename DataTypes::Deriv& TTriangle::v(int i) const { return this->model->m_mstate->read(core::ConstVecDerivId::velocity())->getValue()[(*(this->model->p_triangles))[this->index][i]]; } +inline const typename DataTypes::Deriv& TTriangle::v(int i) const { return this->model->m_mstate->read(core::ConstVecDerivId::velocity())->getValue()[(*(this->model->m_triangles))[this->index][i]]; } template inline const typename DataTypes::Deriv& TTriangle::n() const { return this->model->normals[this->index]; } @@ -294,8 +294,8 @@ template inline bool TTriangle::hasFreePosition() const { return this->model->m_mstate->read(core::ConstVecCoordId::freePosition())->isSet(); } template -inline typename DataTypes::Deriv TTriangleModel::velocity(int index) const { return (m_mstate->read(core::ConstVecDerivId::velocity())->getValue()[(*(p_triangles))[index][0]] + m_mstate->read(core::ConstVecDerivId::velocity())->getValue()[(*(p_triangles))[index][1]] + - m_mstate->read(core::ConstVecDerivId::velocity())->getValue()[(*(p_triangles))[index][2]])/((Real)(3.0)); } +inline typename DataTypes::Deriv TTriangleModel::velocity(int index) const { return (m_mstate->read(core::ConstVecDerivId::velocity())->getValue()[(*(m_triangles))[index][0]] + m_mstate->read(core::ConstVecDerivId::velocity())->getValue()[(*(m_triangles))[index][1]] + + m_mstate->read(core::ConstVecDerivId::velocity())->getValue()[(*(m_triangles))[index][2]])/((Real)(3.0)); } typedef TTriangleModel TriangleModel; typedef TTriangle Triangle; diff --git a/SofaKernel/modules/SofaMeshCollision/TriangleModel.inl b/SofaKernel/modules/SofaMeshCollision/TriangleModel.inl index 2378f9c3a87..e300b861582 100644 --- a/SofaKernel/modules/SofaMeshCollision/TriangleModel.inl +++ b/SofaKernel/modules/SofaMeshCollision/TriangleModel.inl @@ -58,7 +58,7 @@ TTriangleModel::TTriangleModel() , m_pointModels(NULL) , m_lmdFilter(NULL) { - p_triangles = &my_triangles; + m_triangles = &m_internalTriangles; enum_type = TRIANGLE_TYPE; } @@ -115,7 +115,7 @@ void TTriangleModel::init() else { // just redirect to the topology buffer. - p_triangles = &m_topology->getTriangles(); + m_triangles = &m_topology->getTriangles(); resize(m_topology->getNbTriangles()); updateNormals(); } @@ -151,15 +151,15 @@ void TTriangleModel::updateFromTopology() if (nquads == 0) // only triangles { resize(ntris); - p_triangles = & m_topology->getTriangles(); + m_triangles = & m_topology->getTriangles(); } else { const unsigned newsize = ntris+2*nquads; const unsigned npoints = m_mstate->getSize(); - p_triangles = &my_triangles; - my_triangles.resize(newsize); + m_triangles = &m_internalTriangles; + m_internalTriangles.resize(newsize); int index = 0; for (unsigned i=0; i::updateFromTopology() if (idx[1] >= npoints) idx[1] = npoints-1; if (idx[2] >= npoints) idx[2] = npoints-1; } - my_triangles[index] = idx; + m_internalTriangles[index] = idx; ++index; } for (unsigned i=0; i::updateFromTopology() if (idx[2] >= npoints) idx[2] = npoints-1; if (idx[3] >= npoints) idx[3] = npoints-1; } - my_triangles[index][0] = idx[1]; - my_triangles[index][1] = idx[2]; - my_triangles[index][2] = idx[0]; + m_internalTriangles[index][0] = idx[1]; + m_internalTriangles[index][1] = idx[2]; + m_internalTriangles[index][2] = idx[0]; ++index; - my_triangles[index][0] = idx[3]; - my_triangles[index][1] = idx[0]; - my_triangles[index][2] = idx[2]; + m_internalTriangles[index][0] = idx[3]; + m_internalTriangles[index][1] = idx[0]; + m_internalTriangles[index][2] = idx[2]; ++index; } } @@ -206,15 +206,15 @@ template void TTriangleModel::updateFlags(int /*ntri*/) { #if 0 - if (ntri < 0) ntri = p_triangles->size(); + if (ntri < 0) ntri = m_triangles->size(); //VecCoord& x =m_mstate->read(core::ConstVecCoordId::position())->getValue(); //VecDeriv& v = m_mstate->read(core::ConstVecDerivId::velocity())->getValue(); vector pflags(m_mstate->getSize()); std::set > eflags; - for (unsigned i=0; isize(); i++) + for (unsigned i=0; isize(); i++) { int f = 0; - topology::Triangle t = (*p_triangles)[i]; + topology::Triangle t = (*m_triangles)[i]; if (!pflags[t[0]]) { f |= FLAG_P1; @@ -423,7 +423,7 @@ template int TTriangleModel::getTriangleFlags(Topology::TriangleID i) { int f = 0; - sofa::core::topology::BaseMeshTopology::Triangle t = (*p_triangles)[i]; + sofa::core::topology::BaseMeshTopology::Triangle t = (*m_triangles)[i]; if (i < m_topology->getNbTriangles()) { diff --git a/modules/SofaGeneralMeshCollision/TriangleOctreeModel.cpp b/modules/SofaGeneralMeshCollision/TriangleOctreeModel.cpp index ba0da7ff49d..c74e91df937 100644 --- a/modules/SofaGeneralMeshCollision/TriangleOctreeModel.cpp +++ b/modules/SofaGeneralMeshCollision/TriangleOctreeModel.cpp @@ -84,7 +84,7 @@ void TriangleOctreeModel::draw (const core::visual::VisualParams* vparams) void TriangleOctreeModel::computeBoundingTree(int maxDepth) { - const helper::vector& tri = *p_triangles; + const helper::vector& tri = *m_triangles; if(octreeRoot) { delete octreeRoot; From ba562199c348ae0b3c465060e3017bcd6ec6c5d5 Mon Sep 17 00:00:00 2001 From: epernod Date: Wed, 30 Jan 2019 11:20:05 +0100 Subject: [PATCH 09/11] [SceneChecker_test] Fix checkusingAlias as triangleModel send now an error if no topology is provided. --- .../SofaGraphComponent_test/SceneChecker_test.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/SofaGraphComponent/SofaGraphComponent_test/SceneChecker_test.cpp b/modules/SofaGraphComponent/SofaGraphComponent_test/SceneChecker_test.cpp index 0de376f6869..e9e9e392d39 100644 --- a/modules/SofaGraphComponent/SofaGraphComponent_test/SceneChecker_test.cpp +++ b/modules/SofaGraphComponent/SofaGraphComponent_test/SceneChecker_test.cpp @@ -188,6 +188,7 @@ struct SceneChecker_test : public Sofa_test<> scene << " \n" << " \n" << " \n" + << " \n" << " <" << componentName << "/> \n" << " \n"; From 57598f27825d74de2ab3b3c53f5b83e1445682ee Mon Sep 17 00:00:00 2001 From: epernod Date: Wed, 30 Jan 2019 11:46:19 +0100 Subject: [PATCH 10/11] [SofaMeshCollision] Add prefix to some Data and members of TriangleModel class. --- .../modules/SofaMeshCollision/TriangleModel.h | 14 +++++----- .../SofaMeshCollision/TriangleModel.inl | 26 +++++++++---------- .../TriangleModelInRegularGrid.cpp | 6 ++--- modules/SofaConstraint/LocalMinDistance.cpp | 2 +- 4 files changed, 24 insertions(+), 24 deletions(-) diff --git a/SofaKernel/modules/SofaMeshCollision/TriangleModel.h b/SofaKernel/modules/SofaMeshCollision/TriangleModel.h index cc860ff4f4f..4871c60b868 100644 --- a/SofaKernel/modules/SofaMeshCollision/TriangleModel.h +++ b/SofaKernel/modules/SofaMeshCollision/TriangleModel.h @@ -138,14 +138,14 @@ class SOFA_MESH_COLLISION_API TTriangleModel : public core::CollisionModel enum { NBARY = 2 }; - Data bothSide; ///< to activate collision on both side of the triangle model - Data computeNormals; ///< set to false to disable computation of triangles normal + Data d_bothSide; ///< to activate collision on both side of the triangle model + Data d_computeNormals; ///< set to false to disable computation of triangles normal protected: core::behavior::MechanicalState* m_mstate; ///< Pointer to the corresponding MechanicalState sofa::core::topology::BaseMeshTopology* m_topology; ///< Pointer to the corresponding Topology - VecDeriv normals; ///< Vector of normal direction per triangle. + VecDeriv m_normals; ///< Vector of normal direction per triangle. /** Pointer to the triangle array of this collision model. * Will point directly to the topology triangle buffer if only triangles are present. If topology is using/mixing quads and triangles, @@ -156,7 +156,7 @@ class SOFA_MESH_COLLISION_API TTriangleModel : public core::CollisionModel sofa::core::topology::BaseMeshTopology::SeqTriangles m_internalTriangles; ///< Internal Buffer of triangles to combine quads splitted and other triangles. - bool needsUpdate; ///< parameter storing the info boundingTree has to be recomputed. + bool m_needsUpdate; ///< parameter storing the info boundingTree has to be recomputed. int m_topologyRevision; ///< internal revision number to check if topology has changed. PointModel* m_pointModels; @@ -193,7 +193,7 @@ class SOFA_MESH_COLLISION_API TTriangleModel : public core::CollisionModel const VecCoord& getX() const { return(getMechanicalState()->read(core::ConstVecCoordId::position())->getValue()); } const sofa::core::topology::BaseMeshTopology::SeqTriangles& getTriangles() const { return *m_triangles; } - const VecDeriv& getNormals() const { return normals; } + const VecDeriv& getNormals() const { return m_normals; } int getTriangleFlags(sofa::core::topology::BaseMeshTopology::TriangleID i); TriangleLocalMinDistanceFilter *getFilter() const; @@ -283,9 +283,9 @@ template inline const typename DataTypes::Deriv& TTriangle::v(int i) const { return this->model->m_mstate->read(core::ConstVecDerivId::velocity())->getValue()[(*(this->model->m_triangles))[this->index][i]]; } template -inline const typename DataTypes::Deriv& TTriangle::n() const { return this->model->normals[this->index]; } +inline const typename DataTypes::Deriv& TTriangle::n() const { return this->model->m_normals[this->index]; } template -inline typename DataTypes::Deriv& TTriangle::n() { return this->model->normals[this->index]; } +inline typename DataTypes::Deriv& TTriangle::n() { return this->model->m_normals[this->index]; } template inline int TTriangle::flags() const { return this->model->getTriangleFlags(this->index); } diff --git a/SofaKernel/modules/SofaMeshCollision/TriangleModel.inl b/SofaKernel/modules/SofaMeshCollision/TriangleModel.inl index e300b861582..62fa09ba22e 100644 --- a/SofaKernel/modules/SofaMeshCollision/TriangleModel.inl +++ b/SofaKernel/modules/SofaMeshCollision/TriangleModel.inl @@ -49,11 +49,11 @@ namespace collision template TTriangleModel::TTriangleModel() - : bothSide(initData(&bothSide, false, "bothSide", "activate collision on both side of the triangle model") ) - , computeNormals(initData(&computeNormals, true, "computeNormals", "set to false to disable computation of triangles normal")) + : d_bothSide(initData(&d_bothSide, false, "bothSide", "activate collision on both side of the triangle model") ) + , d_computeNormals(initData(&d_computeNormals, true, "computeNormals", "set to false to disable computation of triangles normal")) , m_mstate(NULL) , m_topology(NULL) - , needsUpdate(true) + , m_needsUpdate(true) , m_topologyRevision(-1) , m_pointModels(NULL) , m_lmdFilter(NULL) @@ -66,7 +66,7 @@ template void TTriangleModel::resize(int size) { this->core::CollisionModel::resize(size); - normals.resize(size); + m_normals.resize(size); } template @@ -199,7 +199,7 @@ void TTriangleModel::updateFromTopology() updateNormals(); // topology has changed, force boudingTree recomputation - needsUpdate = true; + m_needsUpdate = true; } template @@ -294,17 +294,17 @@ void TTriangleModel::computeBoundingTree(int maxDepth) if (m_topology->getRevision() != m_topologyRevision) updateFromTopology(); - if (needsUpdate && !cubeModel->empty()) cubeModel->resize(0); + if (m_needsUpdate && !cubeModel->empty()) cubeModel->resize(0); - if (!isMoving() && !cubeModel->empty() && !needsUpdate) return; // No need to recompute BBox if immobile nor if mesh didn't change. + if (!isMoving() && !cubeModel->empty() && !m_needsUpdate) return; // No need to recompute BBox if immobile nor if mesh didn't change. // set to false to avoid excesive loop - needsUpdate=false; + m_needsUpdate=false; defaulttype::Vector3 minElem, maxElem; const VecCoord& x = this->m_mstate->read(core::ConstVecCoordId::position())->getValue(); - const bool calcNormals = computeNormals.getValue(); + const bool calcNormals = d_computeNormals.getValue(); cubeModel->resize(size); // size = number of triangles if (!empty()) @@ -356,10 +356,10 @@ void TTriangleModel::computeContinuousBoundingTree(double dt, int max if (m_topology->getRevision() != m_topologyRevision) updateFromTopology(); - if (needsUpdate) cubeModel->resize(0); - if (!isMoving() && !cubeModel->empty() && !needsUpdate) return; // No need to recompute BBox if immobile nor if mesh didn't change. + if (m_needsUpdate) cubeModel->resize(0); + if (!isMoving() && !cubeModel->empty() && !m_needsUpdate) return; // No need to recompute BBox if immobile nor if mesh didn't change. - needsUpdate=false; + m_needsUpdate=false; defaulttype::Vector3 minElem, maxElem; cubeModel->resize(size); @@ -507,7 +507,7 @@ void TTriangleModel::draw(const core::visual::VisualParams* vparams) if (m_topology->getRevision() != m_topologyRevision) return; - if (bothSide.getValue() || vparams->displayFlags().getShowWireFrame()) + if (d_bothSide.getValue() || vparams->displayFlags().getShowWireFrame()) vparams->drawTool()->setPolygonMode(0,vparams->displayFlags().getShowWireFrame()); else { diff --git a/applications/plugins/SofaMiscCollision/TriangleModelInRegularGrid.cpp b/applications/plugins/SofaMiscCollision/TriangleModelInRegularGrid.cpp index 1e48d6608c9..636d1e2301d 100644 --- a/applications/plugins/SofaMiscCollision/TriangleModelInRegularGrid.cpp +++ b/applications/plugins/SofaMiscCollision/TriangleModelInRegularGrid.cpp @@ -108,10 +108,10 @@ void TriangleModelInRegularGrid::computeBoundingTree ( int ) { CubeModel* cubeModel = createPrevious(); updateFromTopology(); - if ( needsUpdate && !cubeModel->empty() ) cubeModel->resize ( 0 ); - if ( !isMoving() && !cubeModel->empty() && !needsUpdate ) return; // No need to recompute BBox if immobile + if ( m_needsUpdate && !cubeModel->empty() ) cubeModel->resize ( 0 ); + if ( !isMoving() && !cubeModel->empty() && !m_needsUpdate ) return; // No need to recompute BBox if immobile - needsUpdate=false; + m_needsUpdate=false; Vector3 minElem, maxElem; const VecCoord& xHigh =_higher_mstate->read(core::ConstVecCoordId::position())->getValue(); const VecCoord& x =m_mstate->read(core::ConstVecCoordId::position())->getValue(); diff --git a/modules/SofaConstraint/LocalMinDistance.cpp b/modules/SofaConstraint/LocalMinDistance.cpp index aeaa0414325..508b41f8059 100644 --- a/modules/SofaConstraint/LocalMinDistance.cpp +++ b/modules/SofaConstraint/LocalMinDistance.cpp @@ -1429,7 +1429,7 @@ bool LocalMinDistance::testValidity(Line &l, const Vector3 &PQ) bool LocalMinDistance::testValidity(Triangle &t, const Vector3 &PQ) { TriangleModel *tM = t.getCollisionModel(); - bool bothSide_computation = tM->bothSide.getValue(); + bool bothSide_computation = tM->d_bothSide.getValue(); if (!filterIntersection.getValue() || bothSide_computation) return true; From ddf6fd34e4abae758f740925ddba94bb2f05d65e Mon Sep 17 00:00:00 2001 From: erik pernod Date: Thu, 31 Jan 2019 15:52:45 +0100 Subject: [PATCH 11/11] [SofaMeshCollision] Fix triangleModel was not resized when topology is mixing quads and triangles. --- SofaKernel/modules/SofaMeshCollision/TriangleModel.inl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SofaKernel/modules/SofaMeshCollision/TriangleModel.inl b/SofaKernel/modules/SofaMeshCollision/TriangleModel.inl index 62fa09ba22e..dfe469b5a88 100644 --- a/SofaKernel/modules/SofaMeshCollision/TriangleModel.inl +++ b/SofaKernel/modules/SofaMeshCollision/TriangleModel.inl @@ -160,6 +160,8 @@ void TTriangleModel::updateFromTopology() m_triangles = &m_internalTriangles; m_internalTriangles.resize(newsize); + resize(newsize); + int index = 0; for (unsigned i=0; i