Skip to content

Commit 072a5b0

Browse files
hugtalbotfredroy
andauthored
[Response] Clean init of CollisionResponse (#5604)
* [Response] Clean init of CollisionResponse * Apply suggestions from code review * Apply suggestions from code review Co-authored-by: Frederick Roy <fredroy@users.noreply.github.com> * add a function in OptionsGroup to list all possibly items * only set the response when given response data is valid and not empty in create() function * clean the init of CollisionResponse to properly warn the user * Update all examples which where not specifying the collision response * Update CollisionPipeline_test which was not specifying the collision response * Fix two last failing scene tests * Fix last .. CUDA scene --------- Co-authored-by: Frederick Roy <fredroy@users.noreply.github.com>
1 parent 0c2c134 commit 072a5b0

29 files changed

Lines changed: 61 additions & 42 deletions

Sofa/Component/Collision/Detection/Algorithm/tests/CollisionPipeline_test.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ void TestCollisionPipeline::checkCollisionPipelineWithNoAttributes()
102102
" <CollisionPipeline name='pipeline'/> \n"
103103
" <BruteForceBroadPhase/> \n"
104104
" <BVHNarrowPhase/> \n"
105-
" <CollisionResponse/> \n"
105+
" <CollisionResponse response='PenalityContactForceField'/> \n"
106106
" <DiscreteIntersection name='interaction'/> \n"
107107
"</Node> \n" ;
108108

@@ -126,7 +126,7 @@ void TestCollisionPipeline::checkCollisionPipelineWithMissingIntersection()
126126
" <CollisionPipeline name='pipeline'/> \n"
127127
" <BruteForceBroadPhase/> \n"
128128
" <BVHNarrowPhase/> \n"
129-
" <CollisionResponse/> \n"
129+
" <CollisionResponse response='PenalityContactForceField'/> \n"
130130
"</Node> \n" ;
131131

132132
root = SceneLoaderXML::loadFromMemory ("testscene", scene.str().c_str());
@@ -147,7 +147,7 @@ void TestCollisionPipeline::checkCollisionPipelineWithMissingBroadPhase()
147147
"<Node name='Root' gravity='0 -9.81 0' time='0' animate='0' > \n"
148148
" <CollisionPipeline name='pipeline'/> \n"
149149
" <BVHNarrowPhase/> \n"
150-
" <CollisionResponse/> \n"
150+
" <CollisionResponse response='PenalityContactForceField'/> \n"
151151
" <DiscreteIntersection name='interaction'/> \n"
152152
"</Node> \n" ;
153153

@@ -168,7 +168,7 @@ void TestCollisionPipeline::checkCollisionPipelineWithMissingNarrowPhase()
168168
"<Node name='Root' gravity='0 -9.81 0' time='0' animate='0' > \n"
169169
" <CollisionPipeline name='pipeline'/> \n"
170170
" <BruteForceBroadPhase/> \n"
171-
" <CollisionResponse/> \n"
171+
" <CollisionResponse response='PenalityContactForceField'/> \n"
172172
" <DiscreteIntersection name='interaction'/> \n"
173173
"</Node> \n" ;
174174

@@ -210,7 +210,7 @@ int TestCollisionPipeline::checkCollisionPipelineWithMonkeyValueForDepth(int dva
210210
" <CollisionPipeline name='pipeline' depth='"<< dvalue <<"'/> \n"
211211
" <BruteForceBroadPhase/> \n"
212212
" <BVHNarrowPhase/> \n"
213-
" <CollisionResponse/> \n"
213+
" <CollisionResponse response='PenalityContactForceField'/> \n"
214214
" <DiscreteIntersection name='interaction'/> \n"
215215
"</Node> \n" ;
216216

Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/CollisionResponse.cpp

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,18 +62,28 @@ sofa::helper::OptionsGroup CollisionResponse::initializeResponseOptions(sofa::co
6262
}
6363

6464
sofa::helper::OptionsGroup responseOptions(listResponse);
65-
if (listResponse.contains("PenalityContactForceField"))
66-
responseOptions.setSelectedItem("PenalityContactForceField");
67-
6865
return responseOptions;
6966
}
7067

7168
void CollisionResponse::init()
7269
{
7370
Inherit1::init();
71+
72+
if(!d_response.isSet())
73+
{
74+
msg_error() << "No response method has been set";
75+
return;
76+
}
77+
7478
if (d_response.getValue().size() == 0)
7579
{
76-
d_response.setValue(initializeResponseOptions(getContext()));
80+
sofa::helper::OptionsGroup responseOptions = initializeResponseOptions(getContext());
81+
msg_error() << "Response method is wrongly set. Option list is: " << responseOptions.getItemNames();
82+
d_response.setValue(responseOptions);
83+
}
84+
else
85+
{
86+
msg_info() << "Valid response method: " << d_response.getValue().getSelectedItem();
7787
}
7888
}
7989

@@ -111,7 +121,6 @@ void CollisionResponse::setDefaultResponseType(const std::string &responseT)
111121
}
112122
}
113123

114-
115124
void CollisionResponse::changeInstance(Instance inst)
116125
{
117126
core::collision::ContactManager::changeInstance(inst);

Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/CollisionResponse.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,13 @@ public :
5252
{
5353
context->addObject(obj);
5454
sofa::helper::OptionsGroup options = initializeResponseOptions(context);
55-
obj->d_response.setValue(options);
55+
const std::string responseName = arg->getAttribute("response","");
56+
// Check if the response is valid and not empty, only then set the response
57+
if(options.isInOptionsList(responseName) >= 0 && responseName != "")
58+
{
59+
options.setSelectedItem(responseName);
60+
obj->d_response.setValue(options);
61+
}
5662
}
5763

5864
if (arg)
@@ -112,7 +118,6 @@ public :
112118
/// The number of contacts corresponds to the number of collision models
113119
/// currently in contact with a collision model.
114120
void setNumberOfContacts() const;
115-
116121
};
117122

118123

Sofa/framework/Helper/src/sofa/helper/OptionsGroup.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ void OptionsGroup::setNbItems(const size_type nbofRadioButton )
4545
selectedItem = 0;
4646
}
4747
///////////////////////////////////////
48+
type::vector<std::string> OptionsGroup::getItemNames()
49+
{
50+
return textItems;
51+
}
52+
///////////////////////////////////////
4853
void OptionsGroup::setItemName(const unsigned int id_item, const std::string& name )
4954
{
5055
if(id_item < textItems.size())

Sofa/framework/Helper/src/sofa/helper/OptionsGroup.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,9 @@ public :
7171
///Set the name of the id-th item
7272
void setItemName( unsigned int id_item, const std::string& name );
7373

74+
///Get the vector of names available
75+
type::vector<std::string> getItemNames();
76+
7477
template <class T>
7578
void setNames(const std::initializer_list<T>& list);
7679

applications/plugins/ArticulatedSystemPlugin/examples/ArticulatedSystemMapping.scn

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@
1515
<RequiredPlugin name="Sofa.Component.StateContainer"/> <!-- Needed to use components [MechanicalObject] -->
1616
<RequiredPlugin name="Sofa.Component.Topology.Container.Constant"/> <!-- Needed to use components [MeshTopology] -->
1717
<RequiredPlugin name="Sofa.GL.Component.Rendering3D"/> <!-- Needed to use components [OglModel] -->
18+
<DefaultAnimationLoop />
19+
<DefaultVisualManagerLoop />
20+
<CollisionPipeline />
1821
<BruteForceBroadPhase/>
1922
<BVHNarrowPhase/>
20-
<CollisionResponse />
21-
<CollisionPipeline />
23+
<CollisionResponse response="PenalityContactForceField"/>
2224
<MinProximityIntersection alarmDistance="1" contactDistance="0.5"/>
23-
<DefaultAnimationLoop />
24-
<DefaultVisualManagerLoop />
2525
<Node>
2626
<EulerImplicitSolver name="cg odesolver" printLog="false" rayleighStiffness="0.1" rayleighMass="0.1" />
2727
<CGLinearSolver iterations="100" name="linear solver" threshold="1e-20" tolerance="1e-20" />

applications/plugins/SofaCUDA/examples/quadSpringSphere.scn

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
<CollisionPipeline verbose="0" />
1919
<BruteForceBroadPhase/>
2020
<BVHNarrowPhase/>
21-
<CollisionResponse name="Response" />
21+
<CollisionResponse name="Response" response="PenalityContactForceField"/>
2222
<NewProximityIntersection alarmDistance="0.002" contactDistance="0.001" />
2323
<Node name="Floor">
2424
<RegularGridTopology

examples/Component/Mapping/Linear/CenterOfMassMapping.scn

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
<VisualStyle displayFlags="showVisual showForceFields showCollisionModels showMechanicalMappings showWireframe" />
1717
<BruteForceBroadPhase/>
1818
<BVHNarrowPhase/>
19-
<CollisionResponse name="default1" />
19+
<CollisionResponse name="default1" response="PenalityContactForceField"/>
2020
<CollisionPipeline name="default2" />
2121
<MinProximityIntersection name="default3" alarmDistance="1" contactDistance="0.5"/>
2222
<DefaultAnimationLoop/>

examples/Component/Mapping/Linear/SkinningMapping.scn

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
<VisualStyle displayFlags="showBehaviorModels showCollisionModels" />
1818
<BruteForceBroadPhase/>
1919
<BVHNarrowPhase/>
20-
<CollisionResponse name="default1" />
20+
<CollisionResponse name="default1" response="PenalityContactForceField"/>
2121
<CollisionPipeline name="default2" />
2222
<MinProximityIntersection name="default3" alarmDistance="1" contactDistance="0.5"/>
2323
<DefaultAnimationLoop/>

examples/Component/Mapping/Linear/SubsetMapping.scn

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
<BruteForceBroadPhase/>
2525
<BVHNarrowPhase/>
2626
<LocalMinDistance name="Proximity" alarmDistance="0.006" contactDistance="0.001" coneFactor="0.3" angleCone="0.01" filterIntersection="true"/>
27-
<CollisionResponse name="Response" response="NeedleContact"/>
27+
<CollisionResponse name="Response" response="PenalityContactForceField"/>
2828
<DefaultAnimationLoop/>
2929

3030
<Node name="sutureSoftCubes">

0 commit comments

Comments
 (0)