Skip to content

Commit c974145

Browse files
committed
Squashed commit of the following:
commit 68251eb Author: Paul Baksic <paul.baksic@outlook.fr> Date: Wed Apr 8 16:51:03 2026 +0200 Apply reviews commit a5e0a9e Author: Paul Baksic <paul.baksic@outlook.fr> Date: Wed Apr 8 15:29:18 2026 +0200 Fig distance grid commit bb0c921 Author: Paul Baksic <paul.baksic@outlook.fr> Date: Wed Apr 8 11:35:50 2026 +0200 Fix compilationa fter merge commit 070718d Author: Paul Baksic <paul.baksic@outlook.fr> Date: Tue Jan 6 10:50:31 2026 +0100 Apply modified patch from #5481 to take refactoring into account Co-authored-by: lbinria <77280433+lbinria@users.noreply.github.com>
1 parent 25a096d commit c974145

42 files changed

Lines changed: 352 additions & 261 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Sofa/Component/Collision/Geometry/src/sofa/component/collision/geometry/CubeCollisionModel.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ CubeCollisionModel::CubeCollisionModel()
4343
enum_type = AABB_TYPE;
4444
}
4545

46-
void CubeCollisionModel::resize(sofa::Size size)
46+
void CubeCollisionModel::doResize(sofa::Size size)
4747
{
4848
const auto size0 = this->size;
4949
if (size == size0) return;
@@ -54,7 +54,7 @@ void CubeCollisionModel::resize(sofa::Size size)
5454
parent->resize(0);
5555
parent = parent->getPrevious();
5656
}
57-
this->core::CollisionModel::resize(size);
57+
this->core::CollisionModel::doResize(size);
5858
this->elems.resize(size);
5959
this->parentOf.resize(size);
6060
// set additional indices
@@ -104,7 +104,7 @@ Index CubeCollisionModel::addCube(Cube subcellsBegin, Cube subcellsEnd)
104104
{
105105
const sofa::Index index = size;
106106

107-
this->core::CollisionModel::resize(index + 1);
107+
this->core::CollisionModel::doResize(index + 1);
108108
elems.resize(index + 1);
109109

110110
elems[index].subcells.first = subcellsBegin;
@@ -226,7 +226,7 @@ bool CubeCollisionModel::isLeaf(sofa::Index index ) const
226226
return elems[index].children.first.valid();
227227
}
228228

229-
void CubeCollisionModel::computeBoundingTree(int maxDepth)
229+
void CubeCollisionModel::doComputeBoundingTree(int maxDepth)
230230
{
231231

232232
dmsg_info() << ">CubeCollisionModel::computeBoundingTree(" << maxDepth << ")";

Sofa/Component/Collision/Geometry/src/sofa/component/collision/geometry/CubeCollisionModel.h

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,22 @@ class SOFA_COMPONENT_COLLISION_GEOMETRY_API CubeCollisionModel : public core::Co
9090
CubeCollisionModel();
9191

9292
void drawCollisionModel(const core::visual::VisualParams* vparams) override;
93+
void doResize(sofa::Size size) override;
94+
95+
// -- CollisionModel interface
96+
97+
/**
98+
*Here we make up the hierarchy (a tree) of bounding boxes which contain final CollisionElements like Spheres or Triangles.
99+
*The leafs of the tree contain final CollisionElements. This hierarchy is made up from the top to the bottom, i.e., we begin
100+
*to compute a bounding box containing all CollisionElements, then we divide this big bounding box into two boxes.
101+
*These new two boxes inherit from the root box and have depth 1. Then we can do the same operation for the new boxes.
102+
*The division is done only if the box contains more than 4 final CollisionElements and if the depth doesn't exceed
103+
*the max depth. The division is made along an axis. This axis corresponds to the biggest dimension of the current bounding box.
104+
*Note : a bounding box is a Cube here.
105+
*/
106+
void doComputeBoundingTree(int maxDepth=0) override;
107+
93108
public:
94-
void resize(sofa::Size size) override;
95109

96110
void setParentOf(sofa::Index childIndex, const sofa::type::Vec3& min, const sofa::type::Vec3& max);
97111
void setParentOf(sofa::Index childIndex, const sofa::type::Vec3& min, const sofa::type::Vec3& max, const sofa::type::Vec3& normal, const SReal angle=0);
@@ -121,19 +135,6 @@ class SOFA_COMPONENT_COLLISION_GEOMETRY_API CubeCollisionModel : public core::Co
121135

122136
const CubeData & getCubeData(sofa::Index index)const{return elems[index];}
123137

124-
// -- CollisionModel interface
125-
126-
/**
127-
*Here we make up the hierarchy (a tree) of bounding boxes which contain final CollisionElements like Spheres or Triangles.
128-
*The leafs of the tree contain final CollisionElements. This hierarchy is made up from the top to the bottom, i.e., we begin
129-
*to compute a bounding box containing all CollisionElements, then we divide this big bounding box into two boxes.
130-
*These new two boxes inherit from the root box and have depth 1. Then we can do the same operation for the new boxes.
131-
*The division is done only if the box contains more than 4 final CollisionElements and if the depth doesn't exceed
132-
*the max depth. The division is made along an axis. This axis corresponds to the biggest dimension of the current bounding box.
133-
*Note : a bounding box is a Cube here.
134-
*/
135-
void computeBoundingTree(int maxDepth=0) override;
136-
137138
std::pair<core::CollisionElementIterator,core::CollisionElementIterator> getInternalChildren(sofa::Index index) const override;
138139

139140
std::pair<core::CollisionElementIterator,core::CollisionElementIterator> getExternalChildren(sofa::Index index) const override;

Sofa/Component/Collision/Geometry/src/sofa/component/collision/geometry/CylinderCollisionModel.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -101,13 +101,13 @@ class CylinderCollisionModel : public core::CollisionModel
101101
CylinderCollisionModel();
102102
CylinderCollisionModel(core::behavior::MechanicalState<DataTypes>* mstate );
103103

104-
public:
105-
void init() override;
106-
107104
// -- CollisionModel interface
108-
void resize(sofa::Size size) override;
105+
void doResize(sofa::Size size) override;
109106

110-
void computeBoundingTree(int maxDepth=0) override;
107+
void doComputeBoundingTree(int maxDepth=0) override;
108+
109+
public:
110+
void init() override;
111111

112112
void draw(const core::visual::VisualParams* vparams,sofa::Index index) override;
113113

Sofa/Component/Collision/Geometry/src/sofa/component/collision/geometry/CylinderCollisionModel.inl

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,9 @@ CylinderCollisionModel<DataTypes>::CylinderCollisionModel(core::behavior::Mechan
5555
}
5656

5757
template<class DataTypes>
58-
void CylinderCollisionModel<DataTypes>::resize(sofa::Size size)
58+
void CylinderCollisionModel<DataTypes>::doResize(sofa::Size size)
5959
{
60-
this->core::CollisionModel::resize(size);
60+
this->core::CollisionModel::doResize(size);
6161

6262
VecReal & Cylinder_radii = *d_cylinder_radii.beginEdit();
6363
VecReal & Cylinder_heights = *d_cylinder_heights.beginEdit();
@@ -115,7 +115,7 @@ void CylinderCollisionModel<DataTypes>::init()
115115

116116

117117
template<class DataTypes>
118-
void CylinderCollisionModel<DataTypes>::computeBoundingTree(int maxDepth)
118+
void CylinderCollisionModel<DataTypes>::doComputeBoundingTree(int maxDepth)
119119
{
120120
using namespace sofa::type;
121121
using namespace sofa::defaulttype;
@@ -125,6 +125,7 @@ void CylinderCollisionModel<DataTypes>::computeBoundingTree(int maxDepth)
125125
bool updated = false;
126126
if (ncyl != size)
127127
{
128+
// TODO (SPRINT SED 2025 SUGGESTION): maybe we should use doResize (because of double state check)
128129
resize(ncyl);
129130
updated = true;
130131
cubeModel->resize(0);

Sofa/Component/Collision/Geometry/src/sofa/component/collision/geometry/LineCollisionModel.h

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,21 @@ public :
104104

105105
void drawCollisionModel(const core::visual::VisualParams* vparams) override;
106106

107+
// -- CollisionModel interface
108+
109+
void doResize(sofa::Size size) override;
110+
111+
void doComputeBoundingTree(int maxDepth=0) override;
112+
113+
void doComputeContinuousBoundingTree(SReal dt, ContinuousIntersectionTypeFlag continuousIntersectionFlag, int maxDepth=0) override;
114+
115+
bool doCanCollideWithElement(sofa::Index index, CollisionModel* model2, sofa::Index index2) override;
116+
117+
sofa::core::topology::BaseMeshTopology* doGetCollisionTopology() override
118+
{
119+
return l_topology.get();
120+
}
121+
107122
public:
108123
typedef TDataTypes DataTypes;
109124
typedef DataTypes InDataTypes;
@@ -118,18 +133,8 @@ public :
118133

119134
void init() override;
120135

121-
// -- CollisionModel interface
122-
123-
void resize(sofa::Size size) override;
124-
125-
void computeBoundingTree(int maxDepth=0) override;
126-
127-
void computeContinuousBoundingTree(SReal dt, ContinuousIntersectionTypeFlag continuousIntersectionFlag = ContinuousIntersectionTypeFlag::Inertia, int maxDepth=0) override;
128-
129136
void handleTopologyChange() override;
130137

131-
bool canCollideWithElement(sofa::Index index, CollisionModel* model2, sofa::Index index2) override;
132-
133138
core::behavior::MechanicalState<DataTypes>* getMechanicalState() { return mstate; }
134139

135140
Deriv velocity(sofa::Index index)const;
@@ -154,11 +159,6 @@ public :
154159
return sofa::core::objectmodel::BaseComponent::canCreate(obj, context, arg);
155160
}
156161

157-
sofa::core::topology::BaseMeshTopology* getCollisionTopology() override
158-
{
159-
return l_topology.get();
160-
}
161-
162162
void computeBBox(const core::ExecParams* params, bool onlyVisible) override;
163163

164164
Data<bool> d_displayFreePosition; ///< Display Collision Model Points free position(in green)

Sofa/Component/Collision/Geometry/src/sofa/component/collision/geometry/LineCollisionModel.inl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,9 @@ LineCollisionModel<DataTypes>::LineCollisionModel()
4747

4848

4949
template<class DataTypes>
50-
void LineCollisionModel<DataTypes>::resize(sofa::Size size)
50+
void LineCollisionModel<DataTypes>::doResize(sofa::Size size)
5151
{
52-
this->core::CollisionModel::resize(size);
52+
this->core::CollisionModel::doResize(size);
5353
elems.resize(size);
5454
}
5555

@@ -354,7 +354,7 @@ void LineCollisionModel<DataTypes>::drawCollisionModel(const core::visual::Visua
354354
}
355355

356356
template<class DataTypes>
357-
bool LineCollisionModel<DataTypes>::canCollideWithElement(sofa::Index index, CollisionModel* model2, sofa::Index index2)
357+
bool LineCollisionModel<DataTypes>::doCanCollideWithElement(sofa::Index index, CollisionModel* model2, sofa::Index index2)
358358
{
359359
if (!this->bSelfCollision.getValue()) return true;
360360
if (this->getContext() != model2->getContext()) return true;
@@ -458,7 +458,7 @@ bool LineCollisionModel<DataTypes>::canCollideWithElement(sofa::Index index, Col
458458
}
459459

460460
template<class DataTypes>
461-
void LineCollisionModel<DataTypes>::computeBoundingTree(int maxDepth)
461+
void LineCollisionModel<DataTypes>::doComputeBoundingTree(int maxDepth)
462462
{
463463
CubeCollisionModel* cubeModel = createPrevious<CubeCollisionModel>();
464464
updateFromTopology();
@@ -495,7 +495,7 @@ void LineCollisionModel<DataTypes>::computeBoundingTree(int maxDepth)
495495
}
496496

497497
template<class DataTypes>
498-
void LineCollisionModel<DataTypes>::computeContinuousBoundingTree(SReal dt, ContinuousIntersectionTypeFlag continuousIntersectionFlag, int maxDepth)
498+
void LineCollisionModel<DataTypes>::doComputeContinuousBoundingTree(SReal dt, ContinuousIntersectionTypeFlag continuousIntersectionFlag, int maxDepth)
499499
{
500500
CubeCollisionModel* cubeModel = createPrevious<CubeCollisionModel>();
501501
updateFromTopology();

Sofa/Component/Collision/Geometry/src/sofa/component/collision/geometry/PointCollisionModel.h

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -84,19 +84,9 @@ class PointCollisionModel : public core::CollisionModel
8484

8585
public:
8686
void init() override;
87-
88-
// -- CollisionModel interface
89-
90-
void resize(sofa::Size size) override;
91-
92-
void computeBoundingTree(int maxDepth=0) override;
93-
94-
void computeContinuousBoundingTree(SReal dt, ContinuousIntersectionTypeFlag continuousIntersectionFlag = ContinuousIntersectionTypeFlag::Inertia, int maxDepth=0) override;
95-
87+
9688
void draw(const core::visual::VisualParams*, sofa::Index index) override;
9789

98-
bool canCollideWithElement(sofa::Index index, CollisionModel* model2, sofa::Index index2) override;
99-
10090
core::behavior::MechanicalState<DataTypes>* getMechanicalState() { return mstate; }
10191

10292
Deriv getNormal(sofa::Index index){ return (normals.size()) ? normals[index] : Deriv();}
@@ -122,11 +112,6 @@ class PointCollisionModel : public core::CollisionModel
122112
void computeBBox(const core::ExecParams* params, bool onlyVisible) override;
123113
void updateNormals();
124114

125-
sofa::core::topology::BaseMeshTopology* getCollisionTopology() override
126-
{
127-
return l_topology.get();
128-
}
129-
130115
protected:
131116

132117
core::behavior::MechanicalState<DataTypes>* mstate;
@@ -139,6 +124,18 @@ class PointCollisionModel : public core::CollisionModel
139124
/// Link to be set to the topology container in the component graph.
140125
SingleLink<PointCollisionModel<DataTypes>, sofa::core::topology::BaseMeshTopology, BaseLink::FLAG_STOREPATH | BaseLink::FLAG_STRONGLINK> l_topology;
141126

127+
// -- CollisionModel interface
128+
129+
void doComputeBoundingTree(int maxDepth=0) override;
130+
131+
void doComputeContinuousBoundingTree(SReal dt, ContinuousIntersectionTypeFlag continuousIntersectionFlag = ContinuousIntersectionTypeFlag::Inertia, int maxDepth=0) override;
132+
133+
bool doCanCollideWithElement(sofa::Index index, CollisionModel* model2, sofa::Index index2) override;
134+
135+
sofa::core::topology::BaseMeshTopology* doGetCollisionTopology() override
136+
{
137+
return l_topology.get();
138+
}
142139
};
143140

144141

Sofa/Component/Collision/Geometry/src/sofa/component/collision/geometry/PointCollisionModel.inl

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,6 @@ PointCollisionModel<DataTypes>::PointCollisionModel()
4343
enum_type = POINT_TYPE;
4444
}
4545

46-
template<class DataTypes>
47-
void PointCollisionModel<DataTypes>::resize(sofa::Size size)
48-
{
49-
this->core::CollisionModel::resize(size);
50-
}
51-
5246
template<class DataTypes>
5347
void PointCollisionModel<DataTypes>::init()
5448
{
@@ -74,7 +68,7 @@ void PointCollisionModel<DataTypes>::init()
7468

7569

7670
template<class DataTypes>
77-
bool PointCollisionModel<DataTypes>::canCollideWithElement(sofa::Index index, CollisionModel* model2, sofa::Index index2)
71+
bool PointCollisionModel<DataTypes>::doCanCollideWithElement(sofa::Index index, CollisionModel* model2, sofa::Index index2)
7872
{
7973

8074
if (!this->bSelfCollision.getValue()) return true; // we need to perform this verification process only for the selfcollision case.
@@ -112,13 +106,14 @@ bool PointCollisionModel<DataTypes>::canCollideWithElement(sofa::Index index, Co
112106
}
113107

114108
template<class DataTypes>
115-
void PointCollisionModel<DataTypes>::computeBoundingTree(int maxDepth)
109+
void PointCollisionModel<DataTypes>::doComputeBoundingTree(int maxDepth)
116110
{
117111
CubeCollisionModel* cubeModel = createPrevious<CubeCollisionModel>();
118112
const auto npoints = mstate->getSize();
119113
bool updated = false;
120114
if (npoints != size)
121115
{
116+
// TODO (SPRINT SED 2025 SUGGESTION): maybe we should use doResize (because of double state check)
122117
resize(npoints);
123118
updated = true;
124119
}
@@ -143,13 +138,14 @@ void PointCollisionModel<DataTypes>::computeBoundingTree(int maxDepth)
143138
}
144139

145140
template<class DataTypes>
146-
void PointCollisionModel<DataTypes>::computeContinuousBoundingTree(SReal dt, ContinuousIntersectionTypeFlag continuousIntersectionFlag , int maxDepth)
141+
void PointCollisionModel<DataTypes>::doComputeContinuousBoundingTree(SReal dt, ContinuousIntersectionTypeFlag continuousIntersectionFlag, int maxDepth)
147142
{
148143
CubeCollisionModel* cubeModel = createPrevious<CubeCollisionModel>();
149144
const auto npoints = mstate->getSize();
150145
bool updated = false;
151146
if (npoints != size)
152147
{
148+
// TODO (SPRINT SED 2025 SUGGESTION): maybe we should use doResize (because of double state check)
153149
resize(npoints);
154150
updated = true;
155151
}

Sofa/Component/Collision/Geometry/src/sofa/component/collision/geometry/RayCollisionModel.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,9 @@ RayCollisionModel::RayCollisionModel(SReal length)
4444
this->contactResponse.setValue("RayContact"); // use RayContact response class
4545
}
4646

47-
void RayCollisionModel::resize(sofa::Size size)
47+
void RayCollisionModel::doResize(sofa::Size size)
4848
{
49-
this->core::CollisionModel::resize(size);
49+
this->core::CollisionModel::doResize(size);
5050

5151
if (length.size() < size)
5252
{
@@ -110,7 +110,7 @@ void RayCollisionModel::draw(const core::visual::VisualParams* vparams, sofa::In
110110

111111
}
112112

113-
void RayCollisionModel::computeBoundingTree(int maxDepth)
113+
void RayCollisionModel::doComputeBoundingTree(int maxDepth)
114114
{
115115
CubeCollisionModel* cubeModel = createPrevious<CubeCollisionModel>();
116116

Sofa/Component/Collision/Geometry/src/sofa/component/collision/geometry/RayCollisionModel.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,14 @@ class SOFA_COMPONENT_COLLISION_GEOMETRY_API RayCollisionModel : public core::Col
6363
friend class Ray;
6464
protected:
6565
RayCollisionModel(SReal defaultLength=1);
66-
public:
67-
void init() override;
6866

6967
// -- CollisionModel interface
70-
void resize(sofa::Size size) override;
68+
void doResize(sofa::Size size) override;
69+
70+
void doComputeBoundingTree(int maxDepth) override;
7171

72-
void computeBoundingTree(int maxDepth) override;
72+
public:
73+
void init() override;
7374

7475
void draw(const core::visual::VisualParams*, sofa::Index index) override;
7576

0 commit comments

Comments
 (0)