Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 54 additions & 41 deletions SofaKernel/modules/SofaMeshCollision/TriangleModel.h
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,11 @@ class TTriangle : public core::TCollisionElementIterator< TTriangleModel<TDataTy
}
};

/**
* This class will create collision elements based on a triangle and/or quad mesh.
* It uses directly the information of the topology and the dof to compute the triangle normals, BB and BoundingTree.
* The class \sa TTriangle is used to access specific triangle of this collision Model.
*/
template<class TDataTypes>
class SOFA_MESH_COLLISION_API TTriangleModel : public core::CollisionModel
{
Expand Down Expand Up @@ -133,33 +138,39 @@ class SOFA_MESH_COLLISION_API TTriangleModel : public core::CollisionModel

enum { NBARY = 2 };

Data<bool> bothSide; ///< to activate collision on both side of the triangle model
protected:
VecDeriv normals;
Data<bool> d_bothSide; ///< to activate collision on both side of the triangle model
Data<bool> d_computeNormals; ///< set to false to disable computation of triangles normal

const sofa::core::topology::BaseMeshTopology::SeqTriangles* triangles;
protected:
core::behavior::MechanicalState<DataTypes>* m_mstate; ///< Pointer to the corresponding MechanicalState
sofa::core::topology::BaseMeshTopology* m_topology; ///< Pointer to the corresponding Topology

sofa::core::topology::BaseMeshTopology::SeqTriangles mytriangles;
VecDeriv m_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 m_internalTriangles
* @brief m_triangles
*/
const sofa::core::topology::BaseMeshTopology::SeqTriangles* m_triangles;

core::behavior::MechanicalState<DataTypes>* mstate;
Data<bool> computeNormals; ///< set to false to disable computation of triangles normal
int meshRevision;
sofa::core::topology::BaseMeshTopology::SeqTriangles m_internalTriangles; ///< Internal Buffer of triangles to combine quads splitted and other triangles.

sofa::core::topology::BaseMeshTopology* _topology;
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* mpoints;
PointModel* m_pointModels;

TriangleLocalMinDistanceFilter *m_lmdFilter;

protected:

TTriangleModel();

virtual void updateFromTopology();
virtual void updateFlags(int ntri=-1);
virtual void updateNormals();

public:
virtual void init() override;

Expand All @@ -177,14 +188,13 @@ 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<DataTypes>* getMechanicalState() { return mstate; }
const core::behavior::MechanicalState<DataTypes>* getMechanicalState() const { return mstate; }
core::behavior::MechanicalState<DataTypes>* getMechanicalState() { return m_mstate; }
const core::behavior::MechanicalState<DataTypes>* 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 VecDeriv& getNormals() const { return normals; }
const sofa::core::topology::BaseMeshTopology::SeqTriangles& getTriangles() const { return *m_triangles; }
const VecDeriv& getNormals() const { return m_normals; }
int getTriangleFlags(sofa::core::topology::BaseMeshTopology::TriangleID i);

TriangleLocalMinDistanceFilter *getFilter() const;

Expand Down Expand Up @@ -216,6 +226,9 @@ class SOFA_MESH_COLLISION_API TTriangleModel : public core::CollisionModel
virtual void computeBBox(const core::ExecParams* params, bool onlyVisible=false) override;
};




template<class DataTypes>
inline TTriangle<DataTypes>::TTriangle(ParentModel* model, int index)
: core::TCollisionElementIterator<ParentModel>(model, index)
Expand All @@ -232,57 +245,57 @@ inline TTriangle<DataTypes>::TTriangle(ParentModel* model, int index, helper::Re
{}

template<class DataTypes>
inline const typename DataTypes::Coord& TTriangle<DataTypes>::p1() const { return this->model->mstate->read(core::ConstVecCoordId::position())->getValue()[(*(this->model->triangles))[this->index][0]]; }
inline const typename DataTypes::Coord& TTriangle<DataTypes>::p1() const { return this->model->m_mstate->read(core::ConstVecCoordId::position())->getValue()[(*(this->model->m_triangles))[this->index][0]]; }
template<class DataTypes>
inline const typename DataTypes::Coord& TTriangle<DataTypes>::p2() const { return this->model->mstate->read(core::ConstVecCoordId::position())->getValue()[(*(this->model->triangles))[this->index][1]]; }
inline const typename DataTypes::Coord& TTriangle<DataTypes>::p2() const { return this->model->m_mstate->read(core::ConstVecCoordId::position())->getValue()[(*(this->model->m_triangles))[this->index][1]]; }
template<class DataTypes>
inline const typename DataTypes::Coord& TTriangle<DataTypes>::p3() const { return this->model->mstate->read(core::ConstVecCoordId::position())->getValue()[(*(this->model->triangles))[this->index][2]]; }
inline const typename DataTypes::Coord& TTriangle<DataTypes>::p3() const { return this->model->m_mstate->read(core::ConstVecCoordId::position())->getValue()[(*(this->model->m_triangles))[this->index][2]]; }
template<class DataTypes>
inline const typename DataTypes::Coord& TTriangle<DataTypes>::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->m_triangles))[this->index][i]];
}
template<class DataTypes>
inline const typename DataTypes::Coord& TTriangle<DataTypes>::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->m_triangles))[this->index][i]];
}

template<class DataTypes>
inline const typename DataTypes::Coord& TTriangle<DataTypes>::p1Free() const { return (*this->model->mstate->read(sofa::core::ConstVecCoordId::freePosition())->getValue())[(*(this->model->triangles))[this->index][0]]; }
inline const typename DataTypes::Coord& TTriangle<DataTypes>::p1Free() const { return (*this->model->m_mstate->read(sofa::core::ConstVecCoordId::freePosition())->getValue())[(*(this->model->m_triangles))[this->index][0]]; }
template<class DataTypes>
inline const typename DataTypes::Coord& TTriangle<DataTypes>::p2Free() const { return (*this->model->mstate->read(sofa::core::ConstVecCoordId::freePosition())->getValue())[(*(this->model->triangles))[this->index][1]]; }
inline const typename DataTypes::Coord& TTriangle<DataTypes>::p2Free() const { return (*this->model->m_mstate->read(sofa::core::ConstVecCoordId::freePosition())->getValue())[(*(this->model->m_triangles))[this->index][1]]; }
template<class DataTypes>
inline const typename DataTypes::Coord& TTriangle<DataTypes>::p3Free() const { return (*this->model->mstate->read(sofa::core::ConstVecCoordId::freePosition())->getValue())[(*(this->model->triangles))[this->index][2]]; }
inline const typename DataTypes::Coord& TTriangle<DataTypes>::p3Free() const { return (*this->model->m_mstate->read(sofa::core::ConstVecCoordId::freePosition())->getValue())[(*(this->model->m_triangles))[this->index][2]]; }

template<class DataTypes>
inline int TTriangle<DataTypes>::p1Index() const { return (*(this->model->triangles))[this->index][0]; }
inline int TTriangle<DataTypes>::p1Index() const { return (*(this->model->m_triangles))[this->index][0]; }
template<class DataTypes>
inline int TTriangle<DataTypes>::p2Index() const { return (*(this->model->triangles))[this->index][1]; }
inline int TTriangle<DataTypes>::p2Index() const { return (*(this->model->m_triangles))[this->index][1]; }
template<class DataTypes>
inline int TTriangle<DataTypes>::p3Index() const { return (*(this->model->triangles))[this->index][2]; }
inline int TTriangle<DataTypes>::p3Index() const { return (*(this->model->m_triangles))[this->index][2]; }

template<class DataTypes>
inline const typename DataTypes::Deriv& TTriangle<DataTypes>::v1() const { return (this->model->mstate->read(core::ConstVecDerivId::velocity())->getValue())[(*(this->model->triangles))[this->index][0]]; }
inline const typename DataTypes::Deriv& TTriangle<DataTypes>::v1() const { return (this->model->m_mstate->read(core::ConstVecDerivId::velocity())->getValue())[(*(this->model->m_triangles))[this->index][0]]; }
template<class DataTypes>
inline const typename DataTypes::Deriv& TTriangle<DataTypes>::v2() const { return this->model->mstate->read(core::ConstVecDerivId::velocity())->getValue()[(*(this->model->triangles))[this->index][1]]; }
inline const typename DataTypes::Deriv& TTriangle<DataTypes>::v2() const { return this->model->m_mstate->read(core::ConstVecDerivId::velocity())->getValue()[(*(this->model->m_triangles))[this->index][1]]; }
template<class DataTypes>
inline const typename DataTypes::Deriv& TTriangle<DataTypes>::v3() const { return this->model->mstate->read(core::ConstVecDerivId::velocity())->getValue()[(*(this->model->triangles))[this->index][2]]; }
inline const typename DataTypes::Deriv& TTriangle<DataTypes>::v3() const { return this->model->m_mstate->read(core::ConstVecDerivId::velocity())->getValue()[(*(this->model->m_triangles))[this->index][2]]; }
template<class DataTypes>
inline const typename DataTypes::Deriv& TTriangle<DataTypes>::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<DataTypes>::v(int i) const { return this->model->m_mstate->read(core::ConstVecDerivId::velocity())->getValue()[(*(this->model->m_triangles))[this->index][i]]; }

template<class DataTypes>
inline const typename DataTypes::Deriv& TTriangle<DataTypes>::n() const { return this->model->normals[this->index]; }
inline const typename DataTypes::Deriv& TTriangle<DataTypes>::n() const { return this->model->m_normals[this->index]; }
template<class DataTypes>
inline typename DataTypes::Deriv& TTriangle<DataTypes>::n() { return this->model->normals[this->index]; }
inline typename DataTypes::Deriv& TTriangle<DataTypes>::n() { return this->model->m_normals[this->index]; }

template<class DataTypes>
inline int TTriangle<DataTypes>::flags() const { return this->model->getTriangleFlags(this->index); }

template<class DataTypes>
inline bool TTriangle<DataTypes>::hasFreePosition() const { return this->model->mstate->read(core::ConstVecCoordId::freePosition())->isSet(); }
inline bool TTriangle<DataTypes>::hasFreePosition() const { return this->model->m_mstate->read(core::ConstVecCoordId::freePosition())->isSet(); }

template<class DataTypes>
inline typename DataTypes::Deriv TTriangleModel<DataTypes>::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<DataTypes>::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<sofa::defaulttype::Vec3Types> TriangleModel;
typedef TTriangle<sofa::defaulttype::Vec3Types> Triangle;

Expand Down
Loading