|
6 | 6 | #include <sofa/collisionAlgorithm/operations/CreateCenterProximity.h> |
7 | 7 | #include <sofa/collisionAlgorithm/operations/FindClosestProximity.h> |
8 | 8 | #include <sofa/collisionAlgorithm/operations/Project.h> |
| 9 | +#include <sofa/collisionAlgorithm/operations/ContainsPoint.h> |
9 | 10 | #include <sofa/collisionAlgorithm/proximity/EdgeProximity.h> |
10 | 11 | #include <sofa/collisionAlgorithm/proximity/TetrahedronProximity.h> |
11 | 12 | #include <sofa/component/constraint/lagrangian/solver/ConstraintSolverImpl.h> |
@@ -224,24 +225,17 @@ class InsertionAlgorithm : public BaseAlgorithm |
224 | 225 | auto projectOnVol = Operations::Project::Operation::get(l_volGeom); |
225 | 226 | const BaseProximity::SPtr volProx = |
226 | 227 | findClosestProxOnVol(tipProx, l_volGeom.get(), projectOnVol, getFilterFunc()); |
| 228 | + |
227 | 229 | // Proximity can be detected before the tip enters the tetra (e.g. near a boundary face) |
228 | 230 | // Only accept proximities if the tip is inside the tetra during insertion |
229 | 231 | if (volProx) |
230 | 232 | { |
231 | | - TetrahedronProximity::SPtr tetProx = |
232 | | - dynamic_pointer_cast<TetrahedronProximity>(volProx); |
233 | | - if (tetProx) |
| 233 | + auto containsPointInVol = Operations::ContainsPointInProximity::Operation::get( |
| 234 | + l_volGeom->getTypeInfo()); |
| 235 | + if(containsPointInVol(tipProx->getPosition(), volProx)) |
234 | 236 | { |
235 | | - double f0(tetProx->f0()), f1(tetProx->f1()), f2(tetProx->f2()), |
236 | | - f3(tetProx->f3()); |
237 | | - bool isInTetra = toolbox::TetrahedronToolBox::isInTetra( |
238 | | - tipProx->getPosition(), tetProx->element()->getTetrahedronInfo(), f0, |
239 | | - f1, f2, f3); |
240 | | - if (isInTetra) |
241 | | - { |
242 | | - volProx->normalize(); |
243 | | - m_couplingPts.push_back(volProx); |
244 | | - } |
| 237 | + volProx->normalize(); |
| 238 | + m_couplingPts.push_back(volProx); |
245 | 239 | } |
246 | 240 | } |
247 | 241 | } |
|
0 commit comments