From 042e2f1367a5e975a466e2bc1bad12c450bc119c Mon Sep 17 00:00:00 2001 From: Alex Bilger Date: Wed, 15 Jul 2026 11:47:02 +0200 Subject: [PATCH 1/3] avoid many calls to getValue in drawIndices --- .../sofa/component/statecontainer/MechanicalObject.inl | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Sofa/Component/StateContainer/src/sofa/component/statecontainer/MechanicalObject.inl b/Sofa/Component/StateContainer/src/sofa/component/statecontainer/MechanicalObject.inl index 278f489da96..01abc2f66c7 100644 --- a/Sofa/Component/StateContainer/src/sofa/component/statecontainer/MechanicalObject.inl +++ b/Sofa/Component/StateContainer/src/sofa/component/statecontainer/MechanicalObject.inl @@ -2632,8 +2632,12 @@ inline void MechanicalObject::drawIndices(const core::visual::VisualP { std::vector positions; positions.reserve(d_size.getValue()); - for (int i = 0; i readPositions(); + std::transform(positionData.begin(), positionData.end(), std::back_inserter(positions), [](const auto& p) + { + return sofa::type::toVec3(DataTypes::getCPos(p)); + }); vparams->drawTool()->draw3DText_Indices(positions, showIndicesScale.getValue(), d_color.getValue()); } From 93bd30323d9b0856d005513f1844bd1b4260e5b3 Mon Sep 17 00:00:00 2001 From: Alex Bilger Date: Wed, 15 Jul 2026 11:53:24 +0200 Subject: [PATCH 2/3] avoid many calls to getValue in drawVectors --- .../statecontainer/MechanicalObject.inl | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/Sofa/Component/StateContainer/src/sofa/component/statecontainer/MechanicalObject.inl b/Sofa/Component/StateContainer/src/sofa/component/statecontainer/MechanicalObject.inl index 01abc2f66c7..19081798c1d 100644 --- a/Sofa/Component/StateContainer/src/sofa/component/statecontainer/MechanicalObject.inl +++ b/Sofa/Component/StateContainer/src/sofa/component/statecontainer/MechanicalObject.inl @@ -2646,18 +2646,25 @@ template inline void MechanicalObject::drawVectors(const core::visual::VisualParams* vparams) { float scale = showVectorsScale.getValue(); - sofa::helper::ReadAccessor< Data > v_rA = *this->read(core::vec_id::read_access::velocity); + + const auto v_rA = sofa::helper::getReadAccessor(*this->read(core::vec_id::read_access::velocity)); + const auto x_rA = sofa::helper::getReadAccessor(*this->read(core::vec_id::read_access::position)); + type::vector points; points.resize(2); - for(Size i=0; i Date: Wed, 15 Jul 2026 11:54:42 +0200 Subject: [PATCH 3/3] avoid many calls to getValue in draw --- .../component/statecontainer/MechanicalObject.inl | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Sofa/Component/StateContainer/src/sofa/component/statecontainer/MechanicalObject.inl b/Sofa/Component/StateContainer/src/sofa/component/statecontainer/MechanicalObject.inl index 19081798c1d..9499b8a7d1a 100644 --- a/Sofa/Component/StateContainer/src/sofa/component/statecontainer/MechanicalObject.inl +++ b/Sofa/Component/StateContainer/src/sofa/component/statecontainer/MechanicalObject.inl @@ -2703,9 +2703,15 @@ inline void MechanicalObject::draw(const core::visual::VisualParams* if (showObject.getValue()) { const float& scale = showObjectScale.getValue(); - type::vector positions(d_size.getValue()); - for (sofa::Index i = 0; i < Size(d_size.getValue()); ++i) - positions[i] = type::Vec3(getPX(i), getPY(i), getPZ(i)); + + std::vector positions; + positions.reserve(d_size.getValue()); + + const auto positionData = this->readPositions(); + std::transform(positionData.begin(), positionData.end(), std::back_inserter(positions), [](const auto& p) + { + return sofa::type::toVec3(DataTypes::getCPos(p)); + }); switch (drawMode.getValue()) {