From 7ec50b2dd98414ce87e030e7b481df34d2f59017 Mon Sep 17 00:00:00 2001 From: bakpaul Date: Tue, 21 May 2024 17:30:19 +0200 Subject: [PATCH 01/14] Add fixed weak constraint and examples --- .../SolidMechanics/Spring/CMakeLists.txt | 3 + .../spring/FixedWeakConstraint.cpp | 53 +++ .../spring/FixedWeakConstraint.h | 116 +++++++ .../spring/FixedWeakConstraint.inl | 324 ++++++++++++++++++ .../Spring/FixedWeakConstaint_Rigid3.scn | 55 +++ .../Spring/FixedWeakConstaint_Vec3.scn | 70 ++++ 6 files changed, 621 insertions(+) create mode 100644 Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.cpp create mode 100644 Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.h create mode 100644 Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.inl create mode 100644 examples/Component/SolidMechanics/Spring/FixedWeakConstaint_Rigid3.scn create mode 100644 examples/Component/SolidMechanics/Spring/FixedWeakConstaint_Vec3.scn diff --git a/Sofa/Component/SolidMechanics/Spring/CMakeLists.txt b/Sofa/Component/SolidMechanics/Spring/CMakeLists.txt index 12dbde4f034..4cb8698c1fe 100644 --- a/Sofa/Component/SolidMechanics/Spring/CMakeLists.txt +++ b/Sofa/Component/SolidMechanics/Spring/CMakeLists.txt @@ -12,6 +12,8 @@ set(HEADER_FILES # ${SOFACOMPONENTSOLIDMECHANICSSPRING_SOURCE_DIR}/BoxStiffSpringForceField.inl ${SOFACOMPONENTSOLIDMECHANICSSPRING_SOURCE_DIR}/FastTriangularBendingSprings.h ${SOFACOMPONENTSOLIDMECHANICSSPRING_SOURCE_DIR}/FastTriangularBendingSprings.inl + ${SOFACOMPONENTSOLIDMECHANICSSPRING_SOURCE_DIR}/FixedWeakConstraint.h + ${SOFACOMPONENTSOLIDMECHANICSSPRING_SOURCE_DIR}/FixedWeakConstraint.inl ${SOFACOMPONENTSOLIDMECHANICSSPRING_SOURCE_DIR}/FrameSpringForceField.h ${SOFACOMPONENTSOLIDMECHANICSSPRING_SOURCE_DIR}/FrameSpringForceField.inl ${SOFACOMPONENTSOLIDMECHANICSSPRING_SOURCE_DIR}/GearSpringForceField.h @@ -58,6 +60,7 @@ set(SOURCE_FILES ${SOFACOMPONENTSOLIDMECHANICSSPRING_SOURCE_DIR}/AngularSpringForceField.cpp # ${SOFACOMPONENTSOLIDMECHANICSSPRING_SOURCE_DIR}/BoxStiffSpringForceField.cpp ${SOFACOMPONENTSOLIDMECHANICSSPRING_SOURCE_DIR}/FastTriangularBendingSprings.cpp + ${SOFACOMPONENTSOLIDMECHANICSSPRING_SOURCE_DIR}/FixedWeakConstraint.cpp ${SOFACOMPONENTSOLIDMECHANICSSPRING_SOURCE_DIR}/FrameSpringForceField.cpp ${SOFACOMPONENTSOLIDMECHANICSSPRING_SOURCE_DIR}/GearSpringForceField.cpp ${SOFACOMPONENTSOLIDMECHANICSSPRING_SOURCE_DIR}/JointSpring.cpp diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.cpp b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.cpp new file mode 100644 index 00000000000..b67469aecd8 --- /dev/null +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.cpp @@ -0,0 +1,53 @@ +/****************************************************************************** +* SOFA, Simulation Open-Framework Architecture * +* (c) 2006 INRIA, USTL, UJF, CNRS, MGH * +* * +* This program is free software; you can redistribute it and/or modify it * +* under the terms of the GNU Lesser General Public License as published by * +* the Free Software Foundation; either version 2.1 of the License, or (at * +* your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, but WITHOUT * +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * +* for more details. * +* * +* You should have received a copy of the GNU Lesser General Public License * +* along with this program. If not, see . * +******************************************************************************* +* Authors: The SOFA Team and external contributors (see Authors.txt) * +* * +* Contact information: contact@sofa-framework.org * +******************************************************************************/ +#define SOFA_COMPONENT_FORCEFIELD_RESTSHAPESPRINGSFORCEFIELD_CPP + +#include + +#include +#include +#include + + +namespace sofa::component::solidmechanics::spring +{ + +using namespace sofa::type; +using namespace sofa::defaulttype; + +int FixedWeakConstraintClass = core::RegisterObject("Elastic springs generating forces on degrees of freedom between their current and rest shape position") + .add< FixedWeakConstraint >() + .add< FixedWeakConstraint >() + .add< FixedWeakConstraint >() + .add< FixedWeakConstraint >() + .add< FixedWeakConstraint >() + + ; + +template class SOFA_COMPONENT_SOLIDMECHANICS_SPRING_API FixedWeakConstraint; +template class SOFA_COMPONENT_SOLIDMECHANICS_SPRING_API FixedWeakConstraint; +template class SOFA_COMPONENT_SOLIDMECHANICS_SPRING_API FixedWeakConstraint; +template class SOFA_COMPONENT_SOLIDMECHANICS_SPRING_API FixedWeakConstraint; +template class SOFA_COMPONENT_SOLIDMECHANICS_SPRING_API FixedWeakConstraint; + + +} // namespace sofa::component::solidmechanics::spring diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.h b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.h new file mode 100644 index 00000000000..16aac5b5578 --- /dev/null +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.h @@ -0,0 +1,116 @@ +/****************************************************************************** +* SOFA, Simulation Open-Framework Architecture * +* (c) 2006 INRIA, USTL, UJF, CNRS, MGH * +* * +* This program is free software; you can redistribute it and/or modify it * +* under the terms of the GNU Lesser General Public License as published by * +* the Free Software Foundation; either version 2.1 of the License, or (at * +* your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, but WITHOUT * +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * +* for more details. * +* * +* You should have received a copy of the GNU Lesser General Public License * +* along with this program. If not, see . * +******************************************************************************* +* Authors: The SOFA Team and external contributors (see Authors.txt) * +* * +* Contact information: contact@sofa-framework.org * +******************************************************************************/ +#pragma once +#include + +#include + +#include +#include +#include +#include +#include + + +namespace sofa::core::behavior +{ + +template< class T > class MechanicalState; + +} // namespace sofa::core::behavior + +namespace sofa::component::solidmechanics::spring +{ + +/** +* @brief This class describes a simple elastic springs ForceField between DOFs positions and rest positions. +* +* Springs are applied to given degrees of freedom between their current positions and their rest shape positions. +* An external MechanicalState reference can also be passed to the ForceField as rest shape position. +*/ +template +class FixedWeakConstraint : public core::behavior::ForceField +{ +public: + SOFA_CLASS(SOFA_TEMPLATE(FixedWeakConstraint, DataTypes), SOFA_TEMPLATE(core::behavior::ForceField, DataTypes)); + + typedef core::behavior::ForceField Inherit; + typedef typename DataTypes::VecCoord VecCoord; + typedef typename DataTypes::VecDeriv VecDeriv; + typedef typename DataTypes::Coord Coord; + typedef typename DataTypes::CPos CPos; + typedef typename DataTypes::Deriv Deriv; + typedef typename DataTypes::Real Real; + typedef type::vector< sofa::Index > VecIndex; + typedef sofa::core::topology::TopologySubsetIndices DataSubsetIndex; + typedef type::vector< Real > VecReal; + + static constexpr sofa::Size spatial_dimensions = Coord::spatial_dimensions; + static constexpr sofa::Size coord_total_size = Coord::total_size; + + typedef core::objectmodel::Data DataVecCoord; + typedef core::objectmodel::Data DataVecDeriv; + + typedef sofa::core::topology::TopologySubsetIndices SetIndex; + + SetIndex d_indices; + Data d_fixAll; + Data< Real > d_stiffness; ///< stiffness values between the actual position and the rest shape position + Data< Real > d_angularStiffness; ///< angularStiffness assigned when controlling the rotation of the points + Data< bool > d_drawSpring; ///< draw Spring + Data< sofa::type::RGBAColor > d_springColor; ///< spring color. (default=[0.0,1.0,0.0,1.0]) + + linearalgebra::EigenBaseSparseMatrix matS; + /// Link to be set to the topology container in the component graph. + SingleLink, sofa::core::topology::BaseMeshTopology, BaseLink::FLAG_STOREPATH | BaseLink::FLAG_STRONGLINK> l_topology; + +protected: + FixedWeakConstraint(); + bool checkOutOfBoundsIndices(); + +public: + virtual void init() override; + + /// Add the forces. + void addForce(const core::MechanicalParams* mparams, DataVecDeriv& f, const DataVecCoord& x, const DataVecDeriv& v) override; + void addDForce(const core::MechanicalParams* mparams, DataVecDeriv& df, const DataVecDeriv& dx) override; + SReal getPotentialEnergy(const core::MechanicalParams* mparams, const DataVecCoord& x) const override; + + /// Brings ForceField contribution to the global system stiffness matrix. + void addKToMatrix(const core::MechanicalParams* mparams, const sofa::core::behavior::MultiMatrixAccessor* matrix ) override; + void buildStiffnessMatrix(core::behavior::StiffnessMatrix* matrix) override; + void buildDampingMatrix(core::behavior::DampingMatrix* matrix) override; + + void draw(const core::visual::VisualParams* vparams) override; + + +}; + +#if !defined(SOFA_COMPONENT_FORCEFIELD_RESTSHAPESPRINGSFORCEFIELD_CPP) +extern template class SOFA_COMPONENT_SOLIDMECHANICS_SPRING_API FixedWeakConstraint; +extern template class SOFA_COMPONENT_SOLIDMECHANICS_SPRING_API FixedWeakConstraint; +extern template class SOFA_COMPONENT_SOLIDMECHANICS_SPRING_API FixedWeakConstraint; +extern template class SOFA_COMPONENT_SOLIDMECHANICS_SPRING_API FixedWeakConstraint; +extern template class SOFA_COMPONENT_SOLIDMECHANICS_SPRING_API FixedWeakConstraint; +#endif + +} // namespace sofa::component::solidmechanics::spring diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.inl b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.inl new file mode 100644 index 00000000000..5e5d3e4407b --- /dev/null +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.inl @@ -0,0 +1,324 @@ +/****************************************************************************** +* SOFA, Simulation Open-Framework Architecture * +* (c) 2006 INRIA, USTL, UJF, CNRS, MGH * +* * +* This program is free software; you can redistribute it and/or modify it * +* under the terms of the GNU Lesser General Public License as published by * +* the Free Software Foundation; either version 2.1 of the License, or (at * +* your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, but WITHOUT * +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * +* for more details. * +* * +* You should have received a copy of the GNU Lesser General Public License * +* along with this program. If not, see . * +******************************************************************************* +* Authors: The SOFA Team and external contributors (see Authors.txt) * +* * +* Contact information: contact@sofa-framework.org * +******************************************************************************/ +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace sofa::component::solidmechanics::spring +{ + +using helper::WriteAccessor; +using helper::ReadAccessor; +using core::behavior::BaseMechanicalState; +using core::behavior::MultiMatrixAccessor; +using core::behavior::ForceField; +using linearalgebra::BaseMatrix; +using core::VecCoordId; +using core::MechanicalParams; +using type::Vec3; +using type::Vec4f; +using type::vector; +using core::visual::VisualParams; + +template +FixedWeakConstraint::FixedWeakConstraint() + : d_indices(initData(&d_indices, "indices", "points controlled by the rest shape springs")) + , d_stiffness(initData(&d_stiffness, 1.0,"stiffness", "stiffness value between the actual position and the rest shape position")) + , d_angularStiffness(initData(&d_angularStiffness,1.0, "angularStiffness", "angularStiffness assigned when controlling the rotation of the points")) + , d_drawSpring(initData(&d_drawSpring,false,"drawSpring","draw Spring")) + , d_springColor(initData(&d_springColor, sofa::type::RGBAColor::green(), "springColor","spring color. (default=[0.0,1.0,0.0,1.0])")) + , l_topology(initLink("topology", "Link to be set to the topology container in the component graph")) +{ + this->addUpdateCallback("updateInputs", {&d_indices}, [this](const core::DataTracker& t) + { + SOFA_UNUSED(t); + if(checkOutOfBoundsIndices()) + { + msg_error() << "Input indices out of bound"; + return sofa::core::objectmodel::ComponentState::Invalid; + } + + return sofa::core::objectmodel::ComponentState::Valid; + }, {}); +} + +template +void FixedWeakConstraint::init() +{ + Inherit::init(); + if (l_topology.empty()) + { + msg_info() << "link to Topology container should be set to ensure right behavior. First Topology found in current context will be used."; + l_topology.set(this->getContext()->getMeshTopologyLink()); + if(! l_topology.get()) + this->d_componentState.setValue(sofa::core::objectmodel::ComponentState::Invalid); + } + + if (sofa::core::topology::BaseMeshTopology* _topology = l_topology.get()) + { + msg_info() << "Topology path used: '" << l_topology.getLinkedPath() << "'"; + + // Initialize topological changes support + d_indices.createTopologyHandler(_topology); + } + + this->d_componentState.setValue(sofa::core::objectmodel::ComponentState::Valid); +} + +template +bool FixedWeakConstraint::checkOutOfBoundsIndices() +{ + for(auto idx : d_indices.getValue()) + { + if(idx >= this->mstate->getSize()) + return true; + } + return false; +} + +template +SReal FixedWeakConstraint::getPotentialEnergy(const core::MechanicalParams* mparams, const DataVecCoord& x) const +{ + SOFA_UNUSED(mparams); + SOFA_UNUSED(x); + + msg_warning() << "Method getPotentialEnergy not implemented yet."; + return 0.0; +} + +template +void FixedWeakConstraint::addForce(const MechanicalParams* mparams , DataVecDeriv& f, const DataVecCoord& x, const DataVecDeriv& v ) +{ + SOFA_UNUSED(mparams); + SOFA_UNUSED(v); + + WriteAccessor< DataVecDeriv > f1 = f; + ReadAccessor< DataVecCoord > p1 = x; + + const DataVecCoord * restPosition = this->mstate->read(sofa::core::VecId::resetPosition()); + if (!restPosition) + { + this->d_componentState.setValue(sofa::core::objectmodel::ComponentState::Invalid); + return; + } + + ReadAccessor< DataVecCoord > p0 = *restPosition; + + const Real& stiffness = d_stiffness.getValue(); + const Real& angularStiffness = d_angularStiffness.getValue(); + + f1.resize(p1.size()); + + + for (sofa::Index i = 0; i < d_indices.getValue().size(); i++) + { + const sofa::Index index = d_indices.getValue()[i]; + + // rigid case + if constexpr (sofa::type::isRigidType()) + { + // translation + CPos dx = p1[index].getCenter() - p0[index].getCenter(); + getVCenter(f1[index]) -= dx * stiffness; + + // rotation + type::Quat dq = p1[index].getOrientation() * p0[index].getOrientation().inverse(); + dq.normalize(); + + type::Vec<3, Real> dir{type::NOINIT}; + Real angle = 0.; + + if (dq[3] < 0.) + { + dq = dq * -1.0; + } + + if (dq[3] < 1.0) + dq.quatToAxis(dir, angle); + + getVOrientation(f1[index]) -= dir * angle * angularStiffness; + } + else // non-rigid implementation + { + Deriv dx = p1[index] - p0[index]; + f1[index] -= dx * stiffness; + } + } +} + +template +void FixedWeakConstraint::addDForce(const MechanicalParams* mparams, DataVecDeriv& df, const DataVecDeriv& dx) +{ + WriteAccessor< DataVecDeriv > df1 = df; + ReadAccessor< DataVecDeriv > dx1 = dx; + Real kFactor = (Real)sofa::core::mechanicalparams::kFactorIncludingRayleighDamping(mparams, this->rayleighStiffness.getValue()); + const Real& stiffness = d_stiffness.getValue(); + const Real& angularStiffness = d_angularStiffness.getValue(); + + for (unsigned int i = 0; i < d_indices.getValue().size(); i++) + { + const sofa::Index curIndex = d_indices.getValue()[i]; + + if constexpr (sofa::type::isRigidType()) + { + getVCenter(df1[curIndex]) -= getVCenter(dx1[curIndex]) * stiffness * kFactor; + getVOrientation(df1[curIndex]) -= getVOrientation(dx1[curIndex]) * angularStiffness * kFactor; + } + else + { + df1[d_indices.getValue()[i]] -= dx1[d_indices.getValue()[i]] * stiffness * kFactor; + } + } + + +} + +template +void FixedWeakConstraint::draw(const VisualParams *vparams) +{ + if (!vparams->displayFlags().getShowForceFields() || !d_drawSpring.getValue()) + return; + + const auto stateLifeCycle = vparams->drawTool()->makeStateLifeCycle(); + vparams->drawTool()->setLightingEnabled(false); + + const DataVecCoord * restPosition = this->mstate->read(sofa::core::VecId::resetPosition()); + if (!restPosition) + { + this->d_componentState.setValue(sofa::core::objectmodel::ComponentState::Invalid); + return; + } + + + ReadAccessor< DataVecCoord > p0 = *restPosition; + ReadAccessor< DataVecCoord > p = this->mstate->read(VecCoordId::position()); + + const VecIndex& indices = d_indices.getValue(); + + std::vector vertices; + + for (sofa::Index i=0; i(3)) ; j++) + { + v0[j] = (DataTypes::getCPos(p[index]))[j]; + v1[j] = (DataTypes::getCPos(p0[index]))[j]; + } + + vertices.push_back(v0); + vertices.push_back(v1); + } + + vparams->drawTool()->drawLines(vertices,5, d_springColor.getValue()); +} + +template +void FixedWeakConstraint::addKToMatrix(const MechanicalParams* mparams, const MultiMatrixAccessor* matrix ) +{ + const MultiMatrixAccessor::MatrixRef mref = matrix->getMatrix(this->mstate); + BaseMatrix* mat = mref.matrix; + const unsigned int offset = mref.offset; + Real kFact = (Real)sofa::core::mechanicalparams::kFactorIncludingRayleighDamping(mparams, this->rayleighStiffness.getValue()); + + const Real& k = d_stiffness.getValue(); + const Real& k_a = d_angularStiffness.getValue(); + + constexpr sofa::Size space_size = Deriv::spatial_dimensions; // == total_size if DataTypes = VecTypes + constexpr sofa::Size total_size = Deriv::total_size; + + sofa::Index curIndex = 0; + + for (sofa::Index index = 0; index < d_indices.getValue().size(); index++) + { + curIndex = d_indices.getValue()[index]; + + // translation + const auto vt = -kFact * k; + for (sofa::Size i = 0; i < space_size; i++) + { + mat->add(offset + total_size * curIndex + i, offset + total_size * curIndex + i, vt); + } + + // rotation (if applicable) + if constexpr (sofa::type::isRigidType()) + { + const auto vr = -kFact * k_a; + for (sofa::Size i = space_size; i < total_size; i++) + { + mat->add(offset + total_size * curIndex + i, offset + total_size * curIndex + i, vr); + } + } + } +} + +template +void FixedWeakConstraint::buildStiffnessMatrix(core::behavior::StiffnessMatrix* matrix) +{ + const Real& vt = -d_stiffness.getValue(); + const Real& vr = -d_angularStiffness.getValue(); + + constexpr sofa::Size space_size = Deriv::spatial_dimensions; // == total_size if DataTypes = VecTypes + constexpr sofa::Size total_size = Deriv::total_size; + + auto dfdx = matrix->getForceDerivativeIn(this->mstate) + .withRespectToPositionsIn(this->mstate); + + for (const auto index : d_indices.getValue()) + { + // translation + for(sofa::Index i = 0; i < space_size; i++) + { + dfdx(total_size * index + i, total_size * index + i) += vt; + } + + // rotation (if applicable) + if constexpr (sofa::type::isRigidType()) + { + for (sofa::Size i = space_size; i < total_size; ++i) + { + dfdx(total_size * index + i, total_size * index + i) += vr; + } + } + } +} + +template +void FixedWeakConstraint::buildDampingMatrix( + core::behavior::DampingMatrix* matrix) +{ + SOFA_UNUSED(matrix); +} +} // namespace sofa::component::solidmechanics::spring diff --git a/examples/Component/SolidMechanics/Spring/FixedWeakConstaint_Rigid3.scn b/examples/Component/SolidMechanics/Spring/FixedWeakConstaint_Rigid3.scn new file mode 100644 index 00000000000..af8009855fd --- /dev/null +++ b/examples/Component/SolidMechanics/Spring/FixedWeakConstaint_Rigid3.scn @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/Component/SolidMechanics/Spring/FixedWeakConstaint_Vec3.scn b/examples/Component/SolidMechanics/Spring/FixedWeakConstaint_Vec3.scn new file mode 100644 index 00000000000..6787469b811 --- /dev/null +++ b/examples/Component/SolidMechanics/Spring/FixedWeakConstaint_Vec3.scn @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 01f9faf60e1afef459a59542095892c36f7fb912 Mon Sep 17 00:00:00 2001 From: bakpaul Date: Tue, 21 May 2024 17:47:29 +0200 Subject: [PATCH 02/14] Remove nasty using --- .../spring/FixedWeakConstraint.h | 7 --- .../spring/FixedWeakConstraint.inl | 45 +++++++------------ 2 files changed, 16 insertions(+), 36 deletions(-) diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.h b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.h index 16aac5b5578..c8bf8ef0f84 100644 --- a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.h +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.h @@ -31,13 +31,6 @@ #include -namespace sofa::core::behavior -{ - -template< class T > class MechanicalState; - -} // namespace sofa::core::behavior - namespace sofa::component::solidmechanics::spring { diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.inl b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.inl index 5e5d3e4407b..07748e53308 100644 --- a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.inl +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.inl @@ -36,19 +36,6 @@ namespace sofa::component::solidmechanics::spring { -using helper::WriteAccessor; -using helper::ReadAccessor; -using core::behavior::BaseMechanicalState; -using core::behavior::MultiMatrixAccessor; -using core::behavior::ForceField; -using linearalgebra::BaseMatrix; -using core::VecCoordId; -using core::MechanicalParams; -using type::Vec3; -using type::Vec4f; -using type::vector; -using core::visual::VisualParams; - template FixedWeakConstraint::FixedWeakConstraint() : d_indices(initData(&d_indices, "indices", "points controlled by the rest shape springs")) @@ -116,13 +103,13 @@ SReal FixedWeakConstraint::getPotentialEnergy(const core::MechanicalP } template -void FixedWeakConstraint::addForce(const MechanicalParams* mparams , DataVecDeriv& f, const DataVecCoord& x, const DataVecDeriv& v ) +void FixedWeakConstraint::addForce(const core::MechanicalParams* mparams , DataVecDeriv& f, const DataVecCoord& x, const DataVecDeriv& v ) { SOFA_UNUSED(mparams); SOFA_UNUSED(v); - WriteAccessor< DataVecDeriv > f1 = f; - ReadAccessor< DataVecCoord > p1 = x; + helper::WriteAccessor< DataVecDeriv > f1 = f; + helper::ReadAccessor< DataVecCoord > p1 = x; const DataVecCoord * restPosition = this->mstate->read(sofa::core::VecId::resetPosition()); if (!restPosition) @@ -131,7 +118,7 @@ void FixedWeakConstraint::addForce(const MechanicalParams* mparams , return; } - ReadAccessor< DataVecCoord > p0 = *restPosition; + helper::ReadAccessor< DataVecCoord > p0 = *restPosition; const Real& stiffness = d_stiffness.getValue(); const Real& angularStiffness = d_angularStiffness.getValue(); @@ -176,10 +163,10 @@ void FixedWeakConstraint::addForce(const MechanicalParams* mparams , } template -void FixedWeakConstraint::addDForce(const MechanicalParams* mparams, DataVecDeriv& df, const DataVecDeriv& dx) +void FixedWeakConstraint::addDForce(const core::MechanicalParams* mparams, DataVecDeriv& df, const DataVecDeriv& dx) { - WriteAccessor< DataVecDeriv > df1 = df; - ReadAccessor< DataVecDeriv > dx1 = dx; + helper::WriteAccessor< DataVecDeriv > df1 = df; + helper::ReadAccessor< DataVecDeriv > dx1 = dx; Real kFactor = (Real)sofa::core::mechanicalparams::kFactorIncludingRayleighDamping(mparams, this->rayleighStiffness.getValue()); const Real& stiffness = d_stiffness.getValue(); const Real& angularStiffness = d_angularStiffness.getValue(); @@ -203,7 +190,7 @@ void FixedWeakConstraint::addDForce(const MechanicalParams* mparams, } template -void FixedWeakConstraint::draw(const VisualParams *vparams) +void FixedWeakConstraint::draw(const core::visual::VisualParams *vparams) { if (!vparams->displayFlags().getShowForceFields() || !d_drawSpring.getValue()) return; @@ -219,19 +206,19 @@ void FixedWeakConstraint::draw(const VisualParams *vparams) } - ReadAccessor< DataVecCoord > p0 = *restPosition; - ReadAccessor< DataVecCoord > p = this->mstate->read(VecCoordId::position()); + helper::ReadAccessor< DataVecCoord > p0 = *restPosition; + helper::ReadAccessor< DataVecCoord > p = this->mstate->read(core::VecCoordId::position()); const VecIndex& indices = d_indices.getValue(); - std::vector vertices; + std::vector vertices; for (sofa::Index i=0; i(3)) ; j++) { v0[j] = (DataTypes::getCPos(p[index]))[j]; @@ -246,10 +233,10 @@ void FixedWeakConstraint::draw(const VisualParams *vparams) } template -void FixedWeakConstraint::addKToMatrix(const MechanicalParams* mparams, const MultiMatrixAccessor* matrix ) +void FixedWeakConstraint::addKToMatrix(const core::MechanicalParams* mparams, const core::behavior::MultiMatrixAccessor* matrix ) { - const MultiMatrixAccessor::MatrixRef mref = matrix->getMatrix(this->mstate); - BaseMatrix* mat = mref.matrix; + const core::behavior::MultiMatrixAccessor::MatrixRef mref = matrix->getMatrix(this->mstate); + linearalgebra::BaseMatrix* mat = mref.matrix; const unsigned int offset = mref.offset; Real kFact = (Real)sofa::core::mechanicalparams::kFactorIncludingRayleighDamping(mparams, this->rayleighStiffness.getValue()); From bc1916b8c58790dbebeeba125165226393940163 Mon Sep 17 00:00:00 2001 From: Paul Baksic Date: Wed, 5 Jun 2024 11:50:28 +0200 Subject: [PATCH 03/14] WIP --- .../spring/FixedWeakConstraint.inl | 1 + .../Spring/tests/CMakeLists.txt | 1 + .../Spring/tests/FixedWeakConstraint_test.cpp | 131 ++++++++++++++++++ 3 files changed, 133 insertions(+) create mode 100644 Sofa/Component/SolidMechanics/Spring/tests/FixedWeakConstraint_test.cpp diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.inl b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.inl index 07748e53308..ad17c811ca3 100644 --- a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.inl +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.inl @@ -39,6 +39,7 @@ namespace sofa::component::solidmechanics::spring template FixedWeakConstraint::FixedWeakConstraint() : d_indices(initData(&d_indices, "indices", "points controlled by the rest shape springs")) + , d_fixAll(initData(&d_fixAll, false,"fixAll", "stiffness value between the actual position and the rest shape position")) , d_stiffness(initData(&d_stiffness, 1.0,"stiffness", "stiffness value between the actual position and the rest shape position")) , d_angularStiffness(initData(&d_angularStiffness,1.0, "angularStiffness", "angularStiffness assigned when controlling the rotation of the points")) , d_drawSpring(initData(&d_drawSpring,false,"drawSpring","draw Spring")) diff --git a/Sofa/Component/SolidMechanics/Spring/tests/CMakeLists.txt b/Sofa/Component/SolidMechanics/Spring/tests/CMakeLists.txt index e474d48f5fa..d03f0f9ca5f 100644 --- a/Sofa/Component/SolidMechanics/Spring/tests/CMakeLists.txt +++ b/Sofa/Component/SolidMechanics/Spring/tests/CMakeLists.txt @@ -7,6 +7,7 @@ set(SOURCE_FILES RestShapeSpringsForceField_test.cpp StiffSpringForceField_test.cpp TriangularBendingSprings_test.cpp + FixedWeakConstraint_test.cpp ) add_executable(${PROJECT_NAME} ${SOURCE_FILES}) diff --git a/Sofa/Component/SolidMechanics/Spring/tests/FixedWeakConstraint_test.cpp b/Sofa/Component/SolidMechanics/Spring/tests/FixedWeakConstraint_test.cpp new file mode 100644 index 00000000000..af99a3e063a --- /dev/null +++ b/Sofa/Component/SolidMechanics/Spring/tests/FixedWeakConstraint_test.cpp @@ -0,0 +1,131 @@ +/****************************************************************************** +* SOFA, Simulation Open-Framework Architecture * +* (c) 2006 INRIA, USTL, UJF, CNRS, MGH * +* * +* This program is free software; you can redistribute it and/or modify it * +* under the terms of the GNU Lesser General Public License as published by * +* the Free Software Foundation; either version 2.1 of the License, or (at * +* your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, but WITHOUT * +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * +* for more details. * +* * +* You should have received a copy of the GNU Lesser General Public License * +* along with this program. If not, see . * +******************************************************************************* +* Authors: The SOFA Team and external contributors (see Authors.txt) * +* * +* Contact information: contact@sofa-framework.org * +******************************************************************************/ +#include +using sofa::testing::BaseTest; + +#include +using namespace sofa::simpleapi; + +#include +#include + +#include +using sofa::component::statecontainer::MechanicalObject; + +using sofa::defaulttype::Vec3Types; +using sofa::defaulttype::Rigid3dTypes; +using sofa::helper::ReadAccessor; +using sofa::Data; + +/// Test suite for RestShapeSpringsForceField +class RestStiffSpringsForceField_test : public BaseTest +{ +public: + ~RestStiffSpringsForceField_test() override; + sofa::simulation::Node::SPtr createScene(const std::string& type); + + template + void testDefaultBehavior(sofa::simulation::Node::SPtr root); + + template + void checkDifference(MechanicalObject& mo); +}; + +RestStiffSpringsForceField_test::~RestStiffSpringsForceField_test() +{ +} + +sofa::simulation::Node::SPtr RestStiffSpringsForceField_test::createScene(const std::string& type) +{ + const auto theSimulation = createSimulation(); + auto theRoot = createRootNode(theSimulation, "root"); + sofa::simpleapi::importPlugin("Sofa.Component.ODESolver.Backward"); + sofa::simpleapi::importPlugin("Sofa.Component.LinearSolver.Iterative"); + sofa::simpleapi::importPlugin("Sofa.Component.StateContainer"); + sofa::simpleapi::importPlugin("Sofa.Component.Mass"); + + createObject(theRoot, "DefaultAnimationLoop"); + createObject(theRoot, "EulerImplicitSolver"); + createObject(theRoot, "CGLinearSolver", {{ "iterations", "25" }, { "tolerance", "1e-5" }, {"threshold", "1e-5"}}); + + /// Create an object with a mass and use a rest shape spring ff so it stays + /// at the initial position + const auto fixedObject = createChild(theRoot, "fixedObject"); + auto fixedObject_dofs = createObject(fixedObject, "MechanicalObject", {{"name","dofs"}, + {"size","10"}, + {"template",type}}); + createObject(fixedObject, "UniformMass", {{"totalMass", "1"}}); + + createObject(fixedObject, "FixedWeakConstraint", {{"stiffness","1000"},{"fixAll","true"}}); + + const auto movingObject = createChild(theRoot, "movingObject"); + auto movingObject_dofs = createObject(movingObject, "MechanicalObject", {{"name","dofs"}, + {"size","10"}, + {"template",type}}); + createObject(movingObject, "UniformMass", {{"totalMass", "1"}}); + + sofa::simulation::node::initRoot(theRoot.get()); + for(unsigned int i=0;i<20;i++) + { + sofa::simulation::node::animate(theRoot.get(), 0.01_sreal); + } + return theRoot; +} + +template +void RestStiffSpringsForceField_test::checkDifference(MechanicalObject& mo) +{ + ReadAccessor< Data > positions = mo.x; + ReadAccessor< Data > rest_positions = mo.x0; + for(size_t i=0;i +void RestStiffSpringsForceField_test::testDefaultBehavior(sofa::simulation::Node::SPtr root) +{ + auto fixedDofs = dynamic_cast*>(root->getChild("fixedObject")->getObject("dofs")); + ASSERT_TRUE( fixedDofs != nullptr ); + + auto movingDofs = dynamic_cast*>(root->getChild("movingObject")->getObject("dofs")); + ASSERT_TRUE( movingDofs != nullptr ); + + checkDifference(*fixedDofs); +} + + +TEST_F(RestStiffSpringsForceField_test, defaultBehaviorVec3) +{ + this->testDefaultBehavior(this->createScene("Vec3")); +} + +TEST_F(RestStiffSpringsForceField_test, defaultBehaviorRigid3) +{ + this->testDefaultBehavior(this->createScene("Rigid3")); +} From 01dab0f544eb0efd6f225abb6b1b80219a04fd95 Mon Sep 17 00:00:00 2001 From: Paul Baksic Date: Fri, 26 Jul 2024 16:59:35 +0200 Subject: [PATCH 04/14] Fix compilation --- .../Spring/tests/FixedWeakConstraint_test.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Sofa/Component/SolidMechanics/Spring/tests/FixedWeakConstraint_test.cpp b/Sofa/Component/SolidMechanics/Spring/tests/FixedWeakConstraint_test.cpp index af99a3e063a..6362a67d214 100644 --- a/Sofa/Component/SolidMechanics/Spring/tests/FixedWeakConstraint_test.cpp +++ b/Sofa/Component/SolidMechanics/Spring/tests/FixedWeakConstraint_test.cpp @@ -37,10 +37,10 @@ using sofa::helper::ReadAccessor; using sofa::Data; /// Test suite for RestShapeSpringsForceField -class RestStiffSpringsForceField_test : public BaseTest +class FixedWeakConstraint_test : public BaseTest { public: - ~RestStiffSpringsForceField_test() override; + ~FixedWeakConstraint_test() override; sofa::simulation::Node::SPtr createScene(const std::string& type); template @@ -50,11 +50,11 @@ class RestStiffSpringsForceField_test : public BaseTest void checkDifference(MechanicalObject& mo); }; -RestStiffSpringsForceField_test::~RestStiffSpringsForceField_test() +FixedWeakConstraint_test::~FixedWeakConstraint_test() { } -sofa::simulation::Node::SPtr RestStiffSpringsForceField_test::createScene(const std::string& type) +sofa::simulation::Node::SPtr FixedWeakConstraint_test::createScene(const std::string& type) { const auto theSimulation = createSimulation(); auto theRoot = createRootNode(theSimulation, "root"); @@ -92,7 +92,7 @@ sofa::simulation::Node::SPtr RestStiffSpringsForceField_test::createScene(const } template -void RestStiffSpringsForceField_test::checkDifference(MechanicalObject& mo) +void FixedWeakConstraint_test::checkDifference(MechanicalObject& mo) { ReadAccessor< Data > positions = mo.x; ReadAccessor< Data > rest_positions = mo.x0; @@ -108,7 +108,7 @@ void RestStiffSpringsForceField_test::checkDifference(MechanicalObject& mo } template -void RestStiffSpringsForceField_test::testDefaultBehavior(sofa::simulation::Node::SPtr root) +void FixedWeakConstraint_test::testDefaultBehavior(sofa::simulation::Node::SPtr root) { auto fixedDofs = dynamic_cast*>(root->getChild("fixedObject")->getObject("dofs")); ASSERT_TRUE( fixedDofs != nullptr ); @@ -120,12 +120,12 @@ void RestStiffSpringsForceField_test::testDefaultBehavior(sofa::simulation::Node } -TEST_F(RestStiffSpringsForceField_test, defaultBehaviorVec3) +TEST_F(FixedWeakConstraint_test, defaultBehaviorVec3) { this->testDefaultBehavior(this->createScene("Vec3")); } -TEST_F(RestStiffSpringsForceField_test, defaultBehaviorRigid3) +TEST_F(FixedWeakConstraint_test, defaultBehaviorRigid3) { this->testDefaultBehavior(this->createScene("Rigid3")); } From f6bb00b02afafaedda59ee8c0103ecafce1b360d Mon Sep 17 00:00:00 2001 From: Paul Baksic Date: Fri, 26 Jul 2024 18:26:37 +0200 Subject: [PATCH 05/14] Added base virtualization for restShape spring forcefield. Still need to add inline method to regroup addForce implementations and apply it to RestShapeSpringsFF --- .../SolidMechanics/Spring/CMakeLists.txt | 2 + .../spring/BaseRestShapeSpringsForceField.h | 75 ++++++++++++++ .../spring/BaseRestShapeSpringsForceField.inl | 81 ++++++++++++++++ .../spring/FixedWeakConstraint.cpp | 3 +- .../spring/FixedWeakConstraint.h | 16 +-- .../spring/FixedWeakConstraint.inl | 97 ++++++++----------- .../spring/RestShapeSpringsForceField.h | 3 +- .../spring/RestShapeSpringsForceField.inl | 2 - 8 files changed, 207 insertions(+), 72 deletions(-) create mode 100644 Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/BaseRestShapeSpringsForceField.h create mode 100644 Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/BaseRestShapeSpringsForceField.inl diff --git a/Sofa/Component/SolidMechanics/Spring/CMakeLists.txt b/Sofa/Component/SolidMechanics/Spring/CMakeLists.txt index 4cb8698c1fe..2e947d48f65 100644 --- a/Sofa/Component/SolidMechanics/Spring/CMakeLists.txt +++ b/Sofa/Component/SolidMechanics/Spring/CMakeLists.txt @@ -10,6 +10,8 @@ set(HEADER_FILES ${SOFACOMPONENTSOLIDMECHANICSSPRING_SOURCE_DIR}/AngularSpringForceField.inl # ${SOFACOMPONENTSOLIDMECHANICSSPRING_SOURCE_DIR}/BoxStiffSpringForceField.h # ${SOFACOMPONENTSOLIDMECHANICSSPRING_SOURCE_DIR}/BoxStiffSpringForceField.inl + ${SOFACOMPONENTSOLIDMECHANICSSPRING_SOURCE_DIR}/BaseRestShapeSpringsForceField.h + ${SOFACOMPONENTSOLIDMECHANICSSPRING_SOURCE_DIR}/BaseRestShapeSpringsForceField.inl ${SOFACOMPONENTSOLIDMECHANICSSPRING_SOURCE_DIR}/FastTriangularBendingSprings.h ${SOFACOMPONENTSOLIDMECHANICSSPRING_SOURCE_DIR}/FastTriangularBendingSprings.inl ${SOFACOMPONENTSOLIDMECHANICSSPRING_SOURCE_DIR}/FixedWeakConstraint.h diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/BaseRestShapeSpringsForceField.h b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/BaseRestShapeSpringsForceField.h new file mode 100644 index 00000000000..293c182d324 --- /dev/null +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/BaseRestShapeSpringsForceField.h @@ -0,0 +1,75 @@ +/****************************************************************************** +* SOFA, Simulation Open-Framework Architecture * +* (c) 2006 INRIA, USTL, UJF, CNRS, MGH * +* * +* This program is free software; you can redistribute it and/or modify it * +* under the terms of the GNU Lesser General Public License as published by * +* the Free Software Foundation; either version 2.1 of the License, or (at * +* your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, but WITHOUT * +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * +* for more details. * +* * +* You should have received a copy of the GNU Lesser General Public License * +* along with this program. If not, see . * +******************************************************************************* +* Authors: The SOFA Team and external contributors (see Authors.txt) * +* * +* Contact information: contact@sofa-framework.org * +******************************************************************************/ +#pragma once + +#include + +#include + +#include +#include +#include +#include +#include + +namespace sofa::component::solidmechanics::spring { + +template +class BaseRestShapeSpringsForceField : public core::behavior::ForceField +{ + typedef core::behavior::ForceField Inherit; + typedef typename DataTypes::VecCoord VecCoord; + typedef typename DataTypes::VecDeriv VecDeriv; + typedef typename DataTypes::Coord Coord; + typedef typename DataTypes::CPos CPos; + typedef typename DataTypes::Deriv Deriv; + typedef typename DataTypes::Real Real; + typedef type::vector< sofa::Index > VecIndex; + typedef sofa::core::topology::TopologySubsetIndices DataSubsetIndex; + typedef type::vector< Real > VecReal; +public: + + SOFA_CLASS(SOFA_TEMPLATE(BaseRestShapeSpringsForceField, DataTypes), SOFA_TEMPLATE(core::behavior::ForceField, DataTypes)); + typedef sofa::core::topology::TopologySubsetIndices SetIndex; + + + SetIndex d_indices; + Data< VecReal > d_stiffness; ///< stiffness values between the actual position and the rest shape position + Data< VecReal > d_angularStiffness; ///< angularStiffness assigned when controlling the rotation of the points + Data< bool > d_drawSpring; ///< draw Spring + Data< sofa::type::RGBAColor > d_springColor; ///< spring color. (default=[0.0,1.0,0.0,1.0]) + + /// Link to be set to the topology container in the component graph. + SingleLink, sofa::core::topology::BaseMeshTopology, BaseLink::FLAG_STOREPATH | BaseLink::FLAG_STRONGLINK> l_topology; + + BaseRestShapeSpringsForceField(); + + virtual void init() override; + + virtual bool checkOutOfBoundsIndices() = 0; + + + +}; + +} + diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/BaseRestShapeSpringsForceField.inl b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/BaseRestShapeSpringsForceField.inl new file mode 100644 index 00000000000..fd60b042965 --- /dev/null +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/BaseRestShapeSpringsForceField.inl @@ -0,0 +1,81 @@ +/****************************************************************************** +* SOFA, Simulation Open-Framework Architecture * +* (c) 2006 INRIA, USTL, UJF, CNRS, MGH * +* * +* This program is free software; you can redistribute it and/or modify it * +* under the terms of the GNU Lesser General Public License as published by * +* the Free Software Foundation; either version 2.1 of the License, or (at * +* your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, but WITHOUT * +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * +* for more details. * +* * +* You should have received a copy of the GNU Lesser General Public License * +* along with this program. If not, see . * +******************************************************************************* +* Authors: The SOFA Team and external contributors (see Authors.txt) * +* * +* Contact information: contact@sofa-framework.org * +******************************************************************************/ +#pragma once + +#include +#include + +namespace sofa::component::solidmechanics::spring { + +template +BaseRestShapeSpringsForceField::BaseRestShapeSpringsForceField() + : d_indices(initData(&d_indices, "indices", "points controlled by the rest shape springs")) + , d_stiffness(initData(&d_stiffness, {1.0},"stiffness", "stiffness value between the actual position and the rest shape position")) + , d_angularStiffness(initData(&d_angularStiffness,{1.0}, "angularStiffness", "angularStiffness assigned when controlling the rotation of the points")) + , d_drawSpring(initData(&d_drawSpring,false,"drawSpring","draw Spring")) + , d_springColor(initData(&d_springColor, sofa::type::RGBAColor::green(), "springColor","spring color. (default=[0.0,1.0,0.0,1.0])")) + , l_topology(initLink("topology", "Link to be set to the topology container in the component graph")) +{ + this->addUpdateCallback("updateInputs", {&d_indices}, [this](const core::DataTracker& t) + { + SOFA_UNUSED(t); + if(this->checkOutOfBoundsIndices()) + { + msg_error() << "Input indices out of bound"; + return sofa::core::objectmodel::ComponentState::Invalid; + } + + return sofa::core::objectmodel::ComponentState::Valid; + }, {}); +} + +template +void BaseRestShapeSpringsForceField::init() +{ + if(d_stiffness.getValue().size() != d_indices.getValue().size()) + { + msg_warning() << "Input stiffness isn't the same size as indices. Either shrinking it or copying the first value to match indices size."; + helper::WriteAccessor< Data > stiffness = d_stiffness; + const unsigned oldSize = stiffness.size(); + stiffness.resize(d_indices.getValue().size()); + for(unsigned i=oldSize; i< stiffness.size(); ++i) + { + stiffness[i] = stiffness[0]; + } + } + if constexpr (sofa::type::isRigidType()) + { + if (d_angularStiffness.getValue().size() != d_indices.getValue().size()) + { + msg_warning() << "Input angular stiffness isn't the same size as indices. Either shrinking it or copying the first value to match indices size."; + helper::WriteAccessor > stiffness = d_angularStiffness; + const unsigned oldSize = stiffness.size(); + stiffness.resize(d_indices.getValue().size()); + for(unsigned i=oldSize; i< stiffness.size(); ++i) + { + stiffness[i] = stiffness[0]; + } + } + } +} + +} \ No newline at end of file diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.cpp b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.cpp index b67469aecd8..304992ce4b2 100644 --- a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.cpp +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.cpp @@ -26,6 +26,7 @@ #include #include #include +#include namespace sofa::component::solidmechanics::spring @@ -34,7 +35,7 @@ namespace sofa::component::solidmechanics::spring using namespace sofa::type; using namespace sofa::defaulttype; -int FixedWeakConstraintClass = core::RegisterObject("Elastic springs generating forces on degrees of freedom between their current and rest shape position") +int FixedWeakConstraintClass = core::RegisterObject("Weak constraints fixing dofs at their rest shape using springs") .add< FixedWeakConstraint >() .add< FixedWeakConstraint >() .add< FixedWeakConstraint >() diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.h b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.h index c8bf8ef0f84..3b44cdb67fc 100644 --- a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.h +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.h @@ -29,6 +29,7 @@ #include #include #include +#include namespace sofa::component::solidmechanics::spring @@ -41,10 +42,10 @@ namespace sofa::component::solidmechanics::spring * An external MechanicalState reference can also be passed to the ForceField as rest shape position. */ template -class FixedWeakConstraint : public core::behavior::ForceField +class FixedWeakConstraint : public BaseRestShapeSpringsForceField { public: - SOFA_CLASS(SOFA_TEMPLATE(FixedWeakConstraint, DataTypes), SOFA_TEMPLATE(core::behavior::ForceField, DataTypes)); + SOFA_CLASS(SOFA_TEMPLATE(FixedWeakConstraint, DataTypes), SOFA_TEMPLATE(BaseRestShapeSpringsForceField, DataTypes)); typedef core::behavior::ForceField Inherit; typedef typename DataTypes::VecCoord VecCoord; @@ -65,20 +66,11 @@ class FixedWeakConstraint : public core::behavior::ForceField typedef sofa::core::topology::TopologySubsetIndices SetIndex; - SetIndex d_indices; Data d_fixAll; - Data< Real > d_stiffness; ///< stiffness values between the actual position and the rest shape position - Data< Real > d_angularStiffness; ///< angularStiffness assigned when controlling the rotation of the points - Data< bool > d_drawSpring; ///< draw Spring - Data< sofa::type::RGBAColor > d_springColor; ///< spring color. (default=[0.0,1.0,0.0,1.0]) - - linearalgebra::EigenBaseSparseMatrix matS; - /// Link to be set to the topology container in the component graph. - SingleLink, sofa::core::topology::BaseMeshTopology, BaseLink::FLAG_STOREPATH | BaseLink::FLAG_STRONGLINK> l_topology; protected: FixedWeakConstraint(); - bool checkOutOfBoundsIndices(); + virtual bool checkOutOfBoundsIndices() override; public: virtual void init() override; diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.inl b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.inl index ad17c811ca3..053a9e0d6fd 100644 --- a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.inl +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.inl @@ -38,54 +38,37 @@ namespace sofa::component::solidmechanics::spring template FixedWeakConstraint::FixedWeakConstraint() - : d_indices(initData(&d_indices, "indices", "points controlled by the rest shape springs")) - , d_fixAll(initData(&d_fixAll, false,"fixAll", "stiffness value between the actual position and the rest shape position")) - , d_stiffness(initData(&d_stiffness, 1.0,"stiffness", "stiffness value between the actual position and the rest shape position")) - , d_angularStiffness(initData(&d_angularStiffness,1.0, "angularStiffness", "angularStiffness assigned when controlling the rotation of the points")) - , d_drawSpring(initData(&d_drawSpring,false,"drawSpring","draw Spring")) - , d_springColor(initData(&d_springColor, sofa::type::RGBAColor::green(), "springColor","spring color. (default=[0.0,1.0,0.0,1.0])")) - , l_topology(initLink("topology", "Link to be set to the topology container in the component graph")) -{ - this->addUpdateCallback("updateInputs", {&d_indices}, [this](const core::DataTracker& t) - { - SOFA_UNUSED(t); - if(checkOutOfBoundsIndices()) - { - msg_error() << "Input indices out of bound"; - return sofa::core::objectmodel::ComponentState::Invalid; - } - - return sofa::core::objectmodel::ComponentState::Valid; - }, {}); -} + : d_fixAll(initData(&d_fixAll, false,"fixAll", "stiffness value between the actual position and the rest shape position")) +{} template void FixedWeakConstraint::init() { Inherit::init(); - if (l_topology.empty()) + if (this->l_topology.empty()) { msg_info() << "link to Topology container should be set to ensure right behavior. First Topology found in current context will be used."; - l_topology.set(this->getContext()->getMeshTopologyLink()); - if(! l_topology.get()) + this->l_topology.set(this->getContext()->getMeshTopologyLink()); + if(! this->l_topology.get()) this->d_componentState.setValue(sofa::core::objectmodel::ComponentState::Invalid); } - if (sofa::core::topology::BaseMeshTopology* _topology = l_topology.get()) + if (sofa::core::topology::BaseMeshTopology* _topology = this->l_topology.get()) { - msg_info() << "Topology path used: '" << l_topology.getLinkedPath() << "'"; + msg_info() << "Topology path used: '" << this->l_topology.getLinkedPath() << "'"; // Initialize topological changes support - d_indices.createTopologyHandler(_topology); + this->d_indices.createTopologyHandler(_topology); } + this->d_componentState.setValue(sofa::core::objectmodel::ComponentState::Valid); } template bool FixedWeakConstraint::checkOutOfBoundsIndices() { - for(auto idx : d_indices.getValue()) + for(auto idx : this->d_indices.getValue()) { if(idx >= this->mstate->getSize()) return true; @@ -121,22 +104,22 @@ void FixedWeakConstraint::addForce(const core::MechanicalParams* mpa helper::ReadAccessor< DataVecCoord > p0 = *restPosition; - const Real& stiffness = d_stiffness.getValue(); - const Real& angularStiffness = d_angularStiffness.getValue(); + const auto& stiffness = this->d_stiffness.getValue(); + const auto& angularStiffness = this->d_angularStiffness.getValue(); f1.resize(p1.size()); - for (sofa::Index i = 0; i < d_indices.getValue().size(); i++) + for (sofa::Index i = 0; i < this->d_indices.getValue().size(); i++) { - const sofa::Index index = d_indices.getValue()[i]; + const sofa::Index index = this->d_indices.getValue()[i]; // rigid case if constexpr (sofa::type::isRigidType()) { // translation CPos dx = p1[index].getCenter() - p0[index].getCenter(); - getVCenter(f1[index]) -= dx * stiffness; + getVCenter(f1[index]) -= dx * stiffness[i]; // rotation type::Quat dq = p1[index].getOrientation() * p0[index].getOrientation().inverse(); @@ -153,12 +136,12 @@ void FixedWeakConstraint::addForce(const core::MechanicalParams* mpa if (dq[3] < 1.0) dq.quatToAxis(dir, angle); - getVOrientation(f1[index]) -= dir * angle * angularStiffness; + getVOrientation(f1[index]) -= dir * angle * angularStiffness[i]; } else // non-rigid implementation { Deriv dx = p1[index] - p0[index]; - f1[index] -= dx * stiffness; + f1[index] -= dx * stiffness[i]; } } } @@ -169,21 +152,21 @@ void FixedWeakConstraint::addDForce(const core::MechanicalParams* mpa helper::WriteAccessor< DataVecDeriv > df1 = df; helper::ReadAccessor< DataVecDeriv > dx1 = dx; Real kFactor = (Real)sofa::core::mechanicalparams::kFactorIncludingRayleighDamping(mparams, this->rayleighStiffness.getValue()); - const Real& stiffness = d_stiffness.getValue(); - const Real& angularStiffness = d_angularStiffness.getValue(); + const auto& stiffness = this->d_stiffness.getValue(); + const auto& angularStiffness = this->d_angularStiffness.getValue(); - for (unsigned int i = 0; i < d_indices.getValue().size(); i++) + for (unsigned int i = 0; i < this->d_indices.getValue().size(); i++) { - const sofa::Index curIndex = d_indices.getValue()[i]; + const sofa::Index curIndex = this->d_indices.getValue()[i]; if constexpr (sofa::type::isRigidType()) { - getVCenter(df1[curIndex]) -= getVCenter(dx1[curIndex]) * stiffness * kFactor; - getVOrientation(df1[curIndex]) -= getVOrientation(dx1[curIndex]) * angularStiffness * kFactor; + getVCenter(df1[curIndex]) -= getVCenter(dx1[curIndex]) * stiffness[i] * kFactor; + getVOrientation(df1[curIndex]) -= getVOrientation(dx1[curIndex]) * angularStiffness[i] * kFactor; } else { - df1[d_indices.getValue()[i]] -= dx1[d_indices.getValue()[i]] * stiffness * kFactor; + df1[this->d_indices.getValue()[i]] -= dx1[this->d_indices.getValue()[i]] * stiffness[i] * kFactor; } } @@ -193,7 +176,7 @@ void FixedWeakConstraint::addDForce(const core::MechanicalParams* mpa template void FixedWeakConstraint::draw(const core::visual::VisualParams *vparams) { - if (!vparams->displayFlags().getShowForceFields() || !d_drawSpring.getValue()) + if (!vparams->displayFlags().getShowForceFields() || !this->d_drawSpring.getValue()) return; const auto stateLifeCycle = vparams->drawTool()->makeStateLifeCycle(); @@ -210,7 +193,7 @@ void FixedWeakConstraint::draw(const core::visual::VisualParams *vpa helper::ReadAccessor< DataVecCoord > p0 = *restPosition; helper::ReadAccessor< DataVecCoord > p = this->mstate->read(core::VecCoordId::position()); - const VecIndex& indices = d_indices.getValue(); + const VecIndex& indices = this->d_indices.getValue(); std::vector vertices; @@ -230,7 +213,7 @@ void FixedWeakConstraint::draw(const core::visual::VisualParams *vpa vertices.push_back(v1); } - vparams->drawTool()->drawLines(vertices,5, d_springColor.getValue()); + vparams->drawTool()->drawLines(vertices,5, this->d_springColor.getValue()); } template @@ -241,20 +224,20 @@ void FixedWeakConstraint::addKToMatrix(const core::MechanicalParams* const unsigned int offset = mref.offset; Real kFact = (Real)sofa::core::mechanicalparams::kFactorIncludingRayleighDamping(mparams, this->rayleighStiffness.getValue()); - const Real& k = d_stiffness.getValue(); - const Real& k_a = d_angularStiffness.getValue(); + const auto& k = this->d_stiffness.getValue(); + const auto& k_a = this->d_angularStiffness.getValue(); constexpr sofa::Size space_size = Deriv::spatial_dimensions; // == total_size if DataTypes = VecTypes constexpr sofa::Size total_size = Deriv::total_size; sofa::Index curIndex = 0; - for (sofa::Index index = 0; index < d_indices.getValue().size(); index++) + for (sofa::Index index = 0; index < this->d_indices.getValue().size(); index++) { - curIndex = d_indices.getValue()[index]; + curIndex = this->d_indices.getValue()[index]; // translation - const auto vt = -kFact * k; + const auto vt = -kFact * k[index]; for (sofa::Size i = 0; i < space_size; i++) { mat->add(offset + total_size * curIndex + i, offset + total_size * curIndex + i, vt); @@ -263,7 +246,7 @@ void FixedWeakConstraint::addKToMatrix(const core::MechanicalParams* // rotation (if applicable) if constexpr (sofa::type::isRigidType()) { - const auto vr = -kFact * k_a; + const auto vr = -kFact * k_a[index]; for (sofa::Size i = space_size; i < total_size; i++) { mat->add(offset + total_size * curIndex + i, offset + total_size * curIndex + i, vr); @@ -275,8 +258,8 @@ void FixedWeakConstraint::addKToMatrix(const core::MechanicalParams* template void FixedWeakConstraint::buildStiffnessMatrix(core::behavior::StiffnessMatrix* matrix) { - const Real& vt = -d_stiffness.getValue(); - const Real& vr = -d_angularStiffness.getValue(); + const auto& vt = this->d_stiffness.getValue(); + const auto& vr = this->d_angularStiffness.getValue(); constexpr sofa::Size space_size = Deriv::spatial_dimensions; // == total_size if DataTypes = VecTypes constexpr sofa::Size total_size = Deriv::total_size; @@ -284,12 +267,16 @@ void FixedWeakConstraint::buildStiffnessMatrix(core::behavior::Stiffn auto dfdx = matrix->getForceDerivativeIn(this->mstate) .withRespectToPositionsIn(this->mstate); - for (const auto index : d_indices.getValue()) + + const VecIndex& indices = this->d_indices.getValue(); + for (sofa::Index i=0; i::buildStiffnessMatrix(core::behavior::Stiffn { for (sofa::Size i = space_size; i < total_size; ++i) { - dfdx(total_size * index + i, total_size * index + i) += vr; + dfdx(total_size * index + i, total_size * index + i) += -vr[i]; } } } diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/RestShapeSpringsForceField.h b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/RestShapeSpringsForceField.h index c08facb46d4..30236ea8f2e 100644 --- a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/RestShapeSpringsForceField.h +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/RestShapeSpringsForceField.h @@ -128,12 +128,11 @@ protected : bool checkOutOfBoundsIndices(); bool checkOutOfBoundsIndices(const VecIndex &indices, const sofa::Size dimension); + VecIndex m_indices; VecIndex m_ext_indices; type::vector m_pivots; - SReal lastUpdatedStep{}; - private : bool useRestMState{}; /// An external MechanicalState is used as rest reference. diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/RestShapeSpringsForceField.inl b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/RestShapeSpringsForceField.inl index 2c677371551..0491a081417 100644 --- a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/RestShapeSpringsForceField.inl +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/RestShapeSpringsForceField.inl @@ -167,8 +167,6 @@ void RestShapeSpringsForceField::bwdInit() } } - lastUpdatedStep = -1.0; - this->d_componentState.setValue(sofa::core::objectmodel::ComponentState::Valid); } From 06090ff6297dd434a2a67a2b5fcb7a2d86a055b2 Mon Sep 17 00:00:00 2001 From: Paul Baksic Date: Mon, 9 Dec 2024 12:08:23 +0100 Subject: [PATCH 06/14] WIP: SQtill need to unify inint, reinit, bwdinint, enables fixAll and apply it to RestShape --- .../SolidMechanics/Spring/CMakeLists.txt | 2 - .../spring/BaseRestShapeSpringsForceField.h | 75 --- .../spring/BaseRestShapeSpringsForceField.inl | 81 --- .../spring/FixedWeakConstraint.cpp | 22 +- .../spring/FixedWeakConstraint.h | 64 ++- .../spring/FixedWeakConstraint.inl | 467 ++++++++++++++---- 6 files changed, 441 insertions(+), 270 deletions(-) delete mode 100644 Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/BaseRestShapeSpringsForceField.h delete mode 100644 Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/BaseRestShapeSpringsForceField.inl diff --git a/Sofa/Component/SolidMechanics/Spring/CMakeLists.txt b/Sofa/Component/SolidMechanics/Spring/CMakeLists.txt index 586b615587c..42954ca0934 100644 --- a/Sofa/Component/SolidMechanics/Spring/CMakeLists.txt +++ b/Sofa/Component/SolidMechanics/Spring/CMakeLists.txt @@ -10,8 +10,6 @@ set(HEADER_FILES ${SOFACOMPONENTSOLIDMECHANICSSPRING_SOURCE_DIR}/AngularSpringForceField.inl # ${SOFACOMPONENTSOLIDMECHANICSSPRING_SOURCE_DIR}/BoxStiffSpringForceField.h # ${SOFACOMPONENTSOLIDMECHANICSSPRING_SOURCE_DIR}/BoxStiffSpringForceField.inl - ${SOFACOMPONENTSOLIDMECHANICSSPRING_SOURCE_DIR}/BaseRestShapeSpringsForceField.h - ${SOFACOMPONENTSOLIDMECHANICSSPRING_SOURCE_DIR}/BaseRestShapeSpringsForceField.inl ${SOFACOMPONENTSOLIDMECHANICSSPRING_SOURCE_DIR}/FastTriangularBendingSprings.h ${SOFACOMPONENTSOLIDMECHANICSSPRING_SOURCE_DIR}/FastTriangularBendingSprings.inl ${SOFACOMPONENTSOLIDMECHANICSSPRING_SOURCE_DIR}/FixedWeakConstraint.h diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/BaseRestShapeSpringsForceField.h b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/BaseRestShapeSpringsForceField.h deleted file mode 100644 index 293c182d324..00000000000 --- a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/BaseRestShapeSpringsForceField.h +++ /dev/null @@ -1,75 +0,0 @@ -/****************************************************************************** -* SOFA, Simulation Open-Framework Architecture * -* (c) 2006 INRIA, USTL, UJF, CNRS, MGH * -* * -* This program is free software; you can redistribute it and/or modify it * -* under the terms of the GNU Lesser General Public License as published by * -* the Free Software Foundation; either version 2.1 of the License, or (at * -* your option) any later version. * -* * -* This program is distributed in the hope that it will be useful, but WITHOUT * -* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * -* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * -* for more details. * -* * -* You should have received a copy of the GNU Lesser General Public License * -* along with this program. If not, see . * -******************************************************************************* -* Authors: The SOFA Team and external contributors (see Authors.txt) * -* * -* Contact information: contact@sofa-framework.org * -******************************************************************************/ -#pragma once - -#include - -#include - -#include -#include -#include -#include -#include - -namespace sofa::component::solidmechanics::spring { - -template -class BaseRestShapeSpringsForceField : public core::behavior::ForceField -{ - typedef core::behavior::ForceField Inherit; - typedef typename DataTypes::VecCoord VecCoord; - typedef typename DataTypes::VecDeriv VecDeriv; - typedef typename DataTypes::Coord Coord; - typedef typename DataTypes::CPos CPos; - typedef typename DataTypes::Deriv Deriv; - typedef typename DataTypes::Real Real; - typedef type::vector< sofa::Index > VecIndex; - typedef sofa::core::topology::TopologySubsetIndices DataSubsetIndex; - typedef type::vector< Real > VecReal; -public: - - SOFA_CLASS(SOFA_TEMPLATE(BaseRestShapeSpringsForceField, DataTypes), SOFA_TEMPLATE(core::behavior::ForceField, DataTypes)); - typedef sofa::core::topology::TopologySubsetIndices SetIndex; - - - SetIndex d_indices; - Data< VecReal > d_stiffness; ///< stiffness values between the actual position and the rest shape position - Data< VecReal > d_angularStiffness; ///< angularStiffness assigned when controlling the rotation of the points - Data< bool > d_drawSpring; ///< draw Spring - Data< sofa::type::RGBAColor > d_springColor; ///< spring color. (default=[0.0,1.0,0.0,1.0]) - - /// Link to be set to the topology container in the component graph. - SingleLink, sofa::core::topology::BaseMeshTopology, BaseLink::FLAG_STOREPATH | BaseLink::FLAG_STRONGLINK> l_topology; - - BaseRestShapeSpringsForceField(); - - virtual void init() override; - - virtual bool checkOutOfBoundsIndices() = 0; - - - -}; - -} - diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/BaseRestShapeSpringsForceField.inl b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/BaseRestShapeSpringsForceField.inl deleted file mode 100644 index fd60b042965..00000000000 --- a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/BaseRestShapeSpringsForceField.inl +++ /dev/null @@ -1,81 +0,0 @@ -/****************************************************************************** -* SOFA, Simulation Open-Framework Architecture * -* (c) 2006 INRIA, USTL, UJF, CNRS, MGH * -* * -* This program is free software; you can redistribute it and/or modify it * -* under the terms of the GNU Lesser General Public License as published by * -* the Free Software Foundation; either version 2.1 of the License, or (at * -* your option) any later version. * -* * -* This program is distributed in the hope that it will be useful, but WITHOUT * -* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * -* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * -* for more details. * -* * -* You should have received a copy of the GNU Lesser General Public License * -* along with this program. If not, see . * -******************************************************************************* -* Authors: The SOFA Team and external contributors (see Authors.txt) * -* * -* Contact information: contact@sofa-framework.org * -******************************************************************************/ -#pragma once - -#include -#include - -namespace sofa::component::solidmechanics::spring { - -template -BaseRestShapeSpringsForceField::BaseRestShapeSpringsForceField() - : d_indices(initData(&d_indices, "indices", "points controlled by the rest shape springs")) - , d_stiffness(initData(&d_stiffness, {1.0},"stiffness", "stiffness value between the actual position and the rest shape position")) - , d_angularStiffness(initData(&d_angularStiffness,{1.0}, "angularStiffness", "angularStiffness assigned when controlling the rotation of the points")) - , d_drawSpring(initData(&d_drawSpring,false,"drawSpring","draw Spring")) - , d_springColor(initData(&d_springColor, sofa::type::RGBAColor::green(), "springColor","spring color. (default=[0.0,1.0,0.0,1.0])")) - , l_topology(initLink("topology", "Link to be set to the topology container in the component graph")) -{ - this->addUpdateCallback("updateInputs", {&d_indices}, [this](const core::DataTracker& t) - { - SOFA_UNUSED(t); - if(this->checkOutOfBoundsIndices()) - { - msg_error() << "Input indices out of bound"; - return sofa::core::objectmodel::ComponentState::Invalid; - } - - return sofa::core::objectmodel::ComponentState::Valid; - }, {}); -} - -template -void BaseRestShapeSpringsForceField::init() -{ - if(d_stiffness.getValue().size() != d_indices.getValue().size()) - { - msg_warning() << "Input stiffness isn't the same size as indices. Either shrinking it or copying the first value to match indices size."; - helper::WriteAccessor< Data > stiffness = d_stiffness; - const unsigned oldSize = stiffness.size(); - stiffness.resize(d_indices.getValue().size()); - for(unsigned i=oldSize; i< stiffness.size(); ++i) - { - stiffness[i] = stiffness[0]; - } - } - if constexpr (sofa::type::isRigidType()) - { - if (d_angularStiffness.getValue().size() != d_indices.getValue().size()) - { - msg_warning() << "Input angular stiffness isn't the same size as indices. Either shrinking it or copying the first value to match indices size."; - helper::WriteAccessor > stiffness = d_angularStiffness; - const unsigned oldSize = stiffness.size(); - stiffness.resize(d_indices.getValue().size()); - for(unsigned i=oldSize; i< stiffness.size(); ++i) - { - stiffness[i] = stiffness[0]; - } - } - } -} - -} \ No newline at end of file diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.cpp b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.cpp index 304992ce4b2..7a2c57d84ba 100644 --- a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.cpp +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.cpp @@ -19,36 +19,30 @@ * * * Contact information: contact@sofa-framework.org * ******************************************************************************/ -#define SOFA_COMPONENT_FORCEFIELD_RESTSHAPESPRINGSFORCEFIELD_CPP +#define SOFA_COMPONENT_FORCEFIELD_FixedWeakConstraint_CPP #include #include #include #include -#include namespace sofa::component::solidmechanics::spring { -using namespace sofa::type; using namespace sofa::defaulttype; -int FixedWeakConstraintClass = core::RegisterObject("Weak constraints fixing dofs at their rest shape using springs") - .add< FixedWeakConstraint >() - .add< FixedWeakConstraint >() - .add< FixedWeakConstraint >() - .add< FixedWeakConstraint >() - .add< FixedWeakConstraint >() - - ; +void registerFixedWeakConstraint(sofa::core::ObjectFactory* factory) +{ + factory->registerObjects(core::ObjectRegistrationData("Elastic springs generating forces on degrees of freedom between their current and rest shape position.") + .add< FixedWeakConstraint >() + .add< FixedWeakConstraint >() + .add< FixedWeakConstraint >()); +} -template class SOFA_COMPONENT_SOLIDMECHANICS_SPRING_API FixedWeakConstraint; template class SOFA_COMPONENT_SOLIDMECHANICS_SPRING_API FixedWeakConstraint; -template class SOFA_COMPONENT_SOLIDMECHANICS_SPRING_API FixedWeakConstraint; template class SOFA_COMPONENT_SOLIDMECHANICS_SPRING_API FixedWeakConstraint; template class SOFA_COMPONENT_SOLIDMECHANICS_SPRING_API FixedWeakConstraint; - } // namespace sofa::component::solidmechanics::spring diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.h b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.h index 3b44cdb67fc..c94944d1894 100644 --- a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.h +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.h @@ -29,9 +29,15 @@ #include #include #include -#include +namespace sofa::core::behavior +{ + +template< class T > class MechanicalState; + +} // namespace sofa::core::behavior + namespace sofa::component::solidmechanics::spring { @@ -40,12 +46,12 @@ namespace sofa::component::solidmechanics::spring * * Springs are applied to given degrees of freedom between their current positions and their rest shape positions. * An external MechanicalState reference can also be passed to the ForceField as rest shape position. -*/ + */ template -class FixedWeakConstraint : public BaseRestShapeSpringsForceField +class FixedWeakConstraint : public core::behavior::ForceField { -public: - SOFA_CLASS(SOFA_TEMPLATE(FixedWeakConstraint, DataTypes), SOFA_TEMPLATE(BaseRestShapeSpringsForceField, DataTypes)); + public: + SOFA_CLASS(SOFA_TEMPLATE(FixedWeakConstraint, DataTypes), SOFA_TEMPLATE(core::behavior::ForceField, DataTypes)); typedef core::behavior::ForceField Inherit; typedef typename DataTypes::VecCoord VecCoord; @@ -64,21 +70,39 @@ class FixedWeakConstraint : public BaseRestShapeSpringsForceField typedef core::objectmodel::Data DataVecCoord; typedef core::objectmodel::Data DataVecDeriv; - typedef sofa::core::topology::TopologySubsetIndices SetIndex; + DataSubsetIndex d_points; ///< points controlled by the rest shape springs + Data d_fixAll; ///< points controlled by the rest shape springs + Data< VecReal > d_stiffness; ///< stiffness values between the actual position and the rest shape position + Data< VecReal > d_angularStiffness; ///< angularStiffness assigned when controlling the rotation of the points + Data< bool > d_drawSpring; ///< draw Spring + Data< sofa::type::RGBAColor > d_springColor; ///< spring color. (default=[0.0,1.0,0.0,1.0]) - Data d_fixAll; -protected: + protected: FixedWeakConstraint(); - virtual bool checkOutOfBoundsIndices() override; -public: - virtual void init() override; + static constexpr type::fixed_array s_defaultActiveDirections = sofa::type::makeHomogeneousArray(true); + + public: + /// BaseObject initialization method. + void bwdInit() override ; + void reinit() override ; /// Add the forces. void addForce(const core::MechanicalParams* mparams, DataVecDeriv& f, const DataVecCoord& x, const DataVecDeriv& v) override; + /// Link to be set to the topology container in the component graph. + SingleLink, sofa::core::topology::BaseMeshTopology, BaseLink::FLAG_STOREPATH | BaseLink::FLAG_STRONGLINK> l_topology; + void addDForce(const core::MechanicalParams* mparams, DataVecDeriv& df, const DataVecDeriv& dx) override; - SReal getPotentialEnergy(const core::MechanicalParams* mparams, const DataVecCoord& x) const override; + + SReal getPotentialEnergy(const core::MechanicalParams* mparams, const DataVecCoord& x) const override + { + SOFA_UNUSED(mparams); + SOFA_UNUSED(x); + + msg_warning() << "Method getPotentialEnergy not implemented yet."; + return 0.0; + } /// Brings ForceField contribution to the global system stiffness matrix. void addKToMatrix(const core::MechanicalParams* mparams, const sofa::core::behavior::MultiMatrixAccessor* matrix ) override; @@ -88,12 +112,22 @@ class FixedWeakConstraint : public BaseRestShapeSpringsForceField void draw(const core::visual::VisualParams* vparams) override; + virtual const DataVecCoord* getExtPosition() const; + virtual const VecIndex& getIndices() const; + virtual const VecIndex& getExtIndices() const; + virtual const type::fixed_array& getActiveDirections() const; + + protected : + + void recomputeIndices(); + virtual bool checkOutOfBoundsIndices(); + bool checkOutOfBoundsIndices(const VecIndex &indices, const sofa::Size dimension); + + }; -#if !defined(SOFA_COMPONENT_FORCEFIELD_RESTSHAPESPRINGSFORCEFIELD_CPP) -extern template class SOFA_COMPONENT_SOLIDMECHANICS_SPRING_API FixedWeakConstraint; +#if !defined(SOFA_COMPONENT_FORCEFIELD_FixedWeakConstraint_CPP) extern template class SOFA_COMPONENT_SOLIDMECHANICS_SPRING_API FixedWeakConstraint; -extern template class SOFA_COMPONENT_SOLIDMECHANICS_SPRING_API FixedWeakConstraint; extern template class SOFA_COMPONENT_SOLIDMECHANICS_SPRING_API FixedWeakConstraint; extern template class SOFA_COMPONENT_SOLIDMECHANICS_SPRING_API FixedWeakConstraint; #endif diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.inl b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.inl index 053a9e0d6fd..9453ba7222c 100644 --- a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.inl +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.inl @@ -36,93 +36,325 @@ namespace sofa::component::solidmechanics::spring { +using helper::WriteAccessor; +using helper::ReadAccessor; +using core::behavior::BaseMechanicalState; +using core::behavior::MultiMatrixAccessor; +using core::behavior::ForceField; +using linearalgebra::BaseMatrix; +using core::VecCoordId; +using core::MechanicalParams; +using type::Vec3; +using type::Vec4f; +using type::vector; +using core::visual::VisualParams; + template FixedWeakConstraint::FixedWeakConstraint() - : d_fixAll(initData(&d_fixAll, false,"fixAll", "stiffness value between the actual position and the rest shape position")) -{} + : d_points(initData(&d_points, "points", "points controlled by the rest shape springs")) + , d_fixAll(initData(&d_fixAll, false, "fixAll", "Force to fix all points")) + , d_stiffness(initData(&d_stiffness, "stiffness", "stiffness values between the actual position and the rest shape position")) + , d_angularStiffness(initData(&d_angularStiffness, "angularStiffness", "angularStiffness assigned when controlling the rotation of the points")) + , d_drawSpring(initData(&d_drawSpring,false,"drawSpring","draw Spring")) + , d_springColor(initData(&d_springColor, sofa::type::RGBAColor::green(), "springColor","spring color. (default=[0.0,1.0,0.0,1.0])")) + , l_topology(initLink("topology", "Link to be set to the topology container in the component graph")) +{ + this->addUpdateCallback("updateIndices", {&d_points}, [this](const core::DataTracker& t) + { + SOFA_UNUSED(t); + this->recomputeIndices(); + return sofa::core::objectmodel::ComponentState::Valid; + }, {}); +} template -void FixedWeakConstraint::init() +void FixedWeakConstraint::bwdInit() { - Inherit::init(); - if (this->l_topology.empty()) + ForceField::init(); + + if (d_stiffness.getValue().empty()) + { + msg_info() << "No stiffness is defined, assuming equal stiffness on each node, k = 100.0 "; + d_stiffness.setValue({static_cast(100)}); + } + + if (l_restMState.get() == nullptr) + { + useRestMState = false; + msg_info() << "no external rest shape used"; + + if(!l_restMState.empty()) + { + msg_warning() << "external_rest_shape in node " << this->getContext()->getName() << " not found"; + } + } + else + { + msg_info() << "external rest shape used"; + useRestMState = true; + } + + if (l_topology.empty()) { msg_info() << "link to Topology container should be set to ensure right behavior. First Topology found in current context will be used."; - this->l_topology.set(this->getContext()->getMeshTopologyLink()); - if(! this->l_topology.get()) - this->d_componentState.setValue(sofa::core::objectmodel::ComponentState::Invalid); + l_topology.set(this->getContext()->getMeshTopologyLink()); } - if (sofa::core::topology::BaseMeshTopology* _topology = this->l_topology.get()) + if (sofa::core::topology::BaseMeshTopology* _topology = l_topology.get()) { - msg_info() << "Topology path used: '" << this->l_topology.getLinkedPath() << "'"; + msg_info() << "Topology path used: '" << l_topology.getLinkedPath() << "'"; // Initialize topological changes support - this->d_indices.createTopologyHandler(_topology); + d_points.createTopologyHandler(_topology); + } + else + { + msg_info() << "Cannot find the topology: topological changes will not be supported"; } + recomputeIndices(); + if (this->d_componentState.getValue() == sofa::core::objectmodel::ComponentState::Invalid) + return; + + const BaseMechanicalState* state = this->getContext()->getMechanicalState(); + if(!state) + { + msg_warning() << "MechanicalState of the current context returns null pointer"; + } + else + { + assert(state); + matS.resize(state->getMatrixSize(),state->getMatrixSize()); + } + + /// Compile time condition to check if we are working with a Rigid3Types or a type that does not + /// need the Angular Stiffness parameters. + //if constexpr (isRigid()) + if constexpr (sofa::type::isRigidType()) + { + sofa::helper::ReadAccessor> s = d_stiffness; + sofa::helper::WriteOnlyAccessor> as = d_angularStiffness; + + if (as.size() < s.size()) + { + msg_info() << "'stiffness' is larger than 'angularStiffness', add the default value (100.0) to the missing entries."; + + for(size_t i = as.size();i s.size()) + { + msg_info() << "'stiffness' is smaller than 'angularStiffness', clamp the extra values in angularStiffness."; + as.resize(s.size()); + } + } this->d_componentState.setValue(sofa::core::objectmodel::ComponentState::Valid); } + +template +void FixedWeakConstraint::reinit() +{ + if (!checkOutOfBoundsIndices()) + { + m_indices.clear(); + } + else + { + msg_info() << "Indices successfully checked"; + } + + if (d_stiffness.getValue().empty()) + { + msg_info() << "No stiffness is defined, assuming equal stiffness on each node, k = 100.0 " ; + + VecReal stiffs; + stiffs.push_back(100.0); + d_stiffness.setValue(stiffs); + } + else + { + const VecReal &k = d_stiffness.getValue(); + if ( k.size() != m_indices.size() ) + { + msg_warning() << "Size of stiffness vector is not correct (" << k.size() << "), should be either 1 or " << m_indices.size() << msgendl + << "First value of stiffness will be used"; + } + } + +} + +template +void FixedWeakConstraint::recomputeIndices() +{ + m_indices.clear(); + m_ext_indices.clear(); + + for (const sofa::Index i : d_points.getValue()) + { + m_indices.push_back(i); + } + + for (const sofa::Index i : d_external_points.getValue()) + { + m_ext_indices.push_back(i); + } + + if (m_indices.empty()) + { + // no point are defined, default case: points = all points + msg_info() << "No point are defined. Change to default case: points = all points"; + for (sofa::Index i = 0; i < this->mstate->getSize(); i++) + { + m_indices.push_back(i); + } + } + + if (m_ext_indices.empty()) + { + if (useRestMState) + { + if (const DataVecCoord* extPosition = getExtPosition()) + { + const auto& extPositionValue = extPosition->getValue(); + for (sofa::Index i = 0; i < extPositionValue.size(); i++) + { + m_ext_indices.push_back(i); + } + } + else + { + this->d_componentState.setValue(sofa::core::objectmodel::ComponentState::Invalid); + } + } + else + { + for (const sofa::Index i : m_indices) + { + m_ext_indices.push_back(i); + } + } + } + + if (!checkOutOfBoundsIndices()) + { + msg_error() << "The dimension of the source and the targeted points are different "; + m_indices.clear(); + } + else + { + msg_info() << "Indices successfully checked"; + } +} + template bool FixedWeakConstraint::checkOutOfBoundsIndices() { - for(auto idx : this->d_indices.getValue()) + if (!checkOutOfBoundsIndices(getIndices(), this->mstate->getSize())) { - if(idx >= this->mstate->getSize()) - return true; + msg_error() << "Out of Bounds d_indices detected. ForceField is not activated."; + return false; } - return false; + return true; } template -SReal FixedWeakConstraint::getPotentialEnergy(const core::MechanicalParams* mparams, const DataVecCoord& x) const +bool FixedWeakConstraint::checkOutOfBoundsIndices(const VecIndex &indices, const sofa::Size dimension) { - SOFA_UNUSED(mparams); - SOFA_UNUSED(x); + for (sofa::Index i = 0; i < indices.size(); i++) + { + if (indices[i] >= dimension) + { + return false; + } + } + return true; +} - msg_warning() << "Method getPotentialEnergy not implemented yet."; - return 0.0; +template +const typename FixedWeakConstraint::DataVecCoord* FixedWeakConstraint::getExtPosition() const +{ + if (this->mstate) + { + return this->mstate->read(core::vec_id::write_access::restPosition); + } + return nullptr; +} + +template +const FixedWeakConstraint::VecIndex& FixedWeakConstraint::getIndices() const +{ + + return d_points.getValue(); +} + +template +const FixedWeakConstraint::VecIndex& FixedWeakConstraint::getExtIndices() const +{ + return d_points.getValue(); } template -void FixedWeakConstraint::addForce(const core::MechanicalParams* mparams , DataVecDeriv& f, const DataVecCoord& x, const DataVecDeriv& v ) +const type::fixed_array::coord_total_size>& FixedWeakConstraint::getActiveDirections() const +{ + return s_defaultActiveDirections; +} + +template +void FixedWeakConstraint::addForce(const MechanicalParams* mparams , DataVecDeriv& f, const DataVecCoord& x, const DataVecDeriv& v ) { SOFA_UNUSED(mparams); SOFA_UNUSED(v); - helper::WriteAccessor< DataVecDeriv > f1 = f; - helper::ReadAccessor< DataVecCoord > p1 = x; + WriteAccessor< DataVecDeriv > f1 = f; + ReadAccessor< DataVecCoord > p1 = x; - const DataVecCoord * restPosition = this->mstate->read(sofa::core::VecId::resetPosition()); - if (!restPosition) + const DataVecCoord* extPosition = getExtPosition(); + const auto & indices = getIndices(); + const auto & extIndices = getExtIndices(); + if (!extPosition) { this->d_componentState.setValue(sofa::core::objectmodel::ComponentState::Invalid); return; } - helper::ReadAccessor< DataVecCoord > p0 = *restPosition; + ReadAccessor< DataVecCoord > p0 = *extPosition; - const auto& stiffness = this->d_stiffness.getValue(); - const auto& angularStiffness = this->d_angularStiffness.getValue(); + const VecReal& k = d_stiffness.getValue(); + const VecReal& k_a = d_angularStiffness.getValue(); - f1.resize(p1.size()); + f1.resize(p1.size()); - for (sofa::Index i = 0; i < this->d_indices.getValue().size(); i++) + for (sofa::Index i = 0; i < indices.size(); i++) { - const sofa::Index index = this->d_indices.getValue()[i]; + const sofa::Index index = indices[i]; + sofa::Index ext_index = extIndices[i]; + + const auto stiffness = k[static_cast(i < k.size()) * i]; + + const auto & activeDirections = getActiveDirections(); // rigid case if constexpr (sofa::type::isRigidType()) { - // translation - CPos dx = p1[index].getCenter() - p0[index].getCenter(); - getVCenter(f1[index]) -= dx * stiffness[i]; + + CPos dx = p1[index].getCenter() - p0[ext_index].getCenter(); + // We filter the difference dx by setting to 0 the entries corresponding + // to 0 values in d_activeDirections + for (sofa::Size entryId = 0; entryId < spatial_dimensions; ++entryId) + { + if (!activeDirections[entryId]) + dx[entryId] = 0; + } + getVCenter(f1[index]) -= dx * stiffness; + + // rotation - type::Quat dq = p1[index].getOrientation() * p0[index].getOrientation().inverse(); + type::Quat dq = p1[index].getOrientation() * p0[ext_index].getOrientation().inverse(); dq.normalize(); type::Vec<3, Real> dir{type::NOINIT}; @@ -136,37 +368,90 @@ void FixedWeakConstraint::addForce(const core::MechanicalParams* mpa if (dq[3] < 1.0) dq.quatToAxis(dir, angle); - getVOrientation(f1[index]) -= dir * angle * angularStiffness[i]; + // We change the direction of the axis of rotation based on + // the 0 values in d_activeDirections. This is equivalent + // to senting to 0 the rotation axis components along x, y + // and/or z, depending on the rotations we want to take into + // account. + for (sofa::Size entryId = spatial_dimensions; entryId < coord_total_size; ++entryId) + { + if (!activeDirections[entryId]) + dir[entryId-spatial_dimensions] = 0; + } + + const auto angularStiffness = k_a[static_cast(i < k_a.size()) * i]; + getVOrientation(f1[index]) -= dir * angle * angularStiffness; } else // non-rigid implementation { - Deriv dx = p1[index] - p0[index]; - f1[index] -= dx * stiffness[i]; + Deriv dx = p1[index] - p0[ext_index]; + // We filter the difference dx by setting to 0 the entries corresponding + // to 0 values in d_activeDirections + for (sofa::Size entryId = 0; entryId < spatial_dimensions; ++entryId) + { + if (!activeDirections[entryId]) + dx[entryId] = 0; + } + f1[index] -= dx * stiffness; } } } template -void FixedWeakConstraint::addDForce(const core::MechanicalParams* mparams, DataVecDeriv& df, const DataVecDeriv& dx) +void FixedWeakConstraint::addDForce(const MechanicalParams* mparams, DataVecDeriv& df, const DataVecDeriv& dx) { - helper::WriteAccessor< DataVecDeriv > df1 = df; - helper::ReadAccessor< DataVecDeriv > dx1 = dx; + WriteAccessor< DataVecDeriv > df1 = df; + ReadAccessor< DataVecDeriv > dx1 = dx; Real kFactor = (Real)sofa::core::mechanicalparams::kFactorIncludingRayleighDamping(mparams, this->rayleighStiffness.getValue()); - const auto& stiffness = this->d_stiffness.getValue(); - const auto& angularStiffness = this->d_angularStiffness.getValue(); + const VecReal& k = d_stiffness.getValue(); + const VecReal& k_a = d_angularStiffness.getValue(); + const auto & activeDirections = getActiveDirections(); + + const auto & indices = getIndices(); - for (unsigned int i = 0; i < this->d_indices.getValue().size(); i++) + for (unsigned int i = 0; i < indices.size(); i++) { - const sofa::Index curIndex = this->d_indices.getValue()[i]; + const sofa::Index curIndex = indices[i]; + const auto stiffness = k[static_cast(i < k.size()) * i]; if constexpr (sofa::type::isRigidType()) { - getVCenter(df1[curIndex]) -= getVCenter(dx1[curIndex]) * stiffness[i] * kFactor; - getVOrientation(df1[curIndex]) -= getVOrientation(dx1[curIndex]) * angularStiffness[i] * kFactor; + const auto angularStiffness = k_a[static_cast(i < k_a.size()) * i]; + + // We filter the difference in translation by setting to 0 the entries corresponding + // to 0 values in d_activeDirections + auto currentSpringDx = getVCenter(dx1[curIndex]); + for (sofa::Size entryId = 0; entryId < spatial_dimensions; ++entryId) + { + if (!activeDirections[entryId]) + currentSpringDx[entryId] = 0; + } + getVCenter(df1[curIndex]) -= currentSpringDx * stiffness * kFactor; + + auto currentSpringRotationalDx = getVOrientation(dx1[curIndex]); + // We change the direction of the axis of rotation based on + // the 0 values in d_activeDirections. This is equivalent + // to senting to 0 the rotation axis components along x, y + // and/or z, depending on the rotations we want to take into + // account. + for (sofa::Size entryId = spatial_dimensions; entryId < coord_total_size; ++entryId) + { + if (!activeDirections[entryId]) + currentSpringRotationalDx[entryId-spatial_dimensions] = 0; + } + getVOrientation(df1[curIndex]) -= currentSpringRotationalDx * angularStiffness * kFactor; } else { - df1[this->d_indices.getValue()[i]] -= dx1[this->d_indices.getValue()[i]] * stiffness[i] * kFactor; + // We filter the difference in translation by setting to 0 the entries corresponding + // to 0 values in d_activeDirections + auto currentSpringDx = dx1[indices[i]]; + for (sofa::Size entryId = 0; entryId < spatial_dimensions; ++entryId) + { + if (!activeDirections[entryId]) + currentSpringDx[entryId] = 0; + } + df1[indices[i]] -= currentSpringDx * stiffness * kFactor; } } @@ -174,82 +459,93 @@ void FixedWeakConstraint::addDForce(const core::MechanicalParams* mpa } template -void FixedWeakConstraint::draw(const core::visual::VisualParams *vparams) +void FixedWeakConstraint::draw(const VisualParams *vparams) { - if (!vparams->displayFlags().getShowForceFields() || !this->d_drawSpring.getValue()) - return; + if (!vparams->displayFlags().getShowForceFields() || !d_drawSpring.getValue()) + return; /// \todo put this in the parent class const auto stateLifeCycle = vparams->drawTool()->makeStateLifeCycle(); vparams->drawTool()->setLightingEnabled(false); - const DataVecCoord * restPosition = this->mstate->read(sofa::core::VecId::resetPosition()); - if (!restPosition) + const DataVecCoord* extPosition = getExtPosition(); + if (!extPosition) { this->d_componentState.setValue(sofa::core::objectmodel::ComponentState::Invalid); return; } + ReadAccessor< DataVecCoord > p0 = *extPosition; + ReadAccessor< DataVecCoord > p = this->mstate->read(sofa::core::vec_id::write_access::position); - helper::ReadAccessor< DataVecCoord > p0 = *restPosition; - helper::ReadAccessor< DataVecCoord > p = this->mstate->read(core::VecCoordId::position()); + const auto & indices = getIndices(); + const auto & extIndices = getExtIndices(); - const VecIndex& indices = this->d_indices.getValue(); - - std::vector vertices; + std::vector vertices; for (sofa::Index i=0; i(3)) ; j++) { v0[j] = (DataTypes::getCPos(p[index]))[j]; - v1[j] = (DataTypes::getCPos(p0[index]))[j]; + v1[j] = (DataTypes::getCPos(p0[ext_index]))[j]; } vertices.push_back(v0); vertices.push_back(v1); } - vparams->drawTool()->drawLines(vertices,5, this->d_springColor.getValue()); + //todo(dmarchal) because of https://github.com/sofa-framework/sofa/issues/64 + vparams->drawTool()->drawLines(vertices,5, d_springColor.getValue()); + } template -void FixedWeakConstraint::addKToMatrix(const core::MechanicalParams* mparams, const core::behavior::MultiMatrixAccessor* matrix ) +void FixedWeakConstraint::addKToMatrix(const MechanicalParams* mparams, const MultiMatrixAccessor* matrix ) { - const core::behavior::MultiMatrixAccessor::MatrixRef mref = matrix->getMatrix(this->mstate); - linearalgebra::BaseMatrix* mat = mref.matrix; + const MultiMatrixAccessor::MatrixRef mref = matrix->getMatrix(this->mstate); + BaseMatrix* mat = mref.matrix; const unsigned int offset = mref.offset; Real kFact = (Real)sofa::core::mechanicalparams::kFactorIncludingRayleighDamping(mparams, this->rayleighStiffness.getValue()); - const auto& k = this->d_stiffness.getValue(); - const auto& k_a = this->d_angularStiffness.getValue(); + const VecReal& k = d_stiffness.getValue(); + const VecReal& k_a = d_angularStiffness.getValue(); + const auto & activeDirections = getActiveDirections(); + const auto & indices = getIndices(); constexpr sofa::Size space_size = Deriv::spatial_dimensions; // == total_size if DataTypes = VecTypes constexpr sofa::Size total_size = Deriv::total_size; sofa::Index curIndex = 0; - for (sofa::Index index = 0; index < this->d_indices.getValue().size(); index++) + for (sofa::Index index = 0; index < indices.size(); index++) { - curIndex = this->d_indices.getValue()[index]; + curIndex = indices[index]; // translation - const auto vt = -kFact * k[index]; + const auto vt = -kFact * k[(index < k.size()) * index]; for (sofa::Size i = 0; i < space_size; i++) { - mat->add(offset + total_size * curIndex + i, offset + total_size * curIndex + i, vt); + // Contribution to the stiffness matrix are only taken into + // account for 1 values in d_activeDirections + if (activeDirections[i]) + mat->add(offset + total_size * curIndex + i, offset + total_size * curIndex + i, vt); } // rotation (if applicable) if constexpr (sofa::type::isRigidType()) { - const auto vr = -kFact * k_a[index]; + const auto vr = -kFact * k_a[(index < k_a.size()) * index]; for (sofa::Size i = space_size; i < total_size; i++) { - mat->add(offset + total_size * curIndex + i, offset + total_size * curIndex + i, vr); + // Contribution to the stiffness matrix are only taken into + // account for 1 values in d_activeDirections + if (activeDirections[i]) + mat->add(offset + total_size * curIndex + i, offset + total_size * curIndex + i, vr); } } } @@ -258,33 +554,38 @@ void FixedWeakConstraint::addKToMatrix(const core::MechanicalParams* template void FixedWeakConstraint::buildStiffnessMatrix(core::behavior::StiffnessMatrix* matrix) { - const auto& vt = this->d_stiffness.getValue(); - const auto& vr = this->d_angularStiffness.getValue(); + const VecReal& k = d_stiffness.getValue(); + const VecReal& k_a = d_angularStiffness.getValue(); + const auto & activeDirections = getActiveDirections(); + const auto & indices = getIndices(); constexpr sofa::Size space_size = Deriv::spatial_dimensions; // == total_size if DataTypes = VecTypes constexpr sofa::Size total_size = Deriv::total_size; auto dfdx = matrix->getForceDerivativeIn(this->mstate) - .withRespectToPositionsIn(this->mstate); + .withRespectToPositionsIn(this->mstate); - - const VecIndex& indices = this->d_indices.getValue(); - for (sofa::Index i=0; i()) { + const auto vr = -k_a[(index < k_a.size()) * index]; for (sofa::Size i = space_size; i < total_size; ++i) { - dfdx(total_size * index + i, total_size * index + i) += -vr[i]; + // Contribution to the stiffness matrix are only taken into + // account for 1 values in d_activeDirections + if (activeDirections[i]) + { + dfdx(total_size * index + i, total_size * index + i) += vr; + } } } } From 909c760e1163551331beb1e4003b607a8753ab76 Mon Sep 17 00:00:00 2001 From: Paul Baksic Date: Tue, 10 Dec 2024 12:11:07 +0100 Subject: [PATCH 07/14] Factorise every method in the FixedWeakConstraint object. Need to specialize it inside the RestShapeSpringForcefield --- .../spring/FixedWeakConstraint.h | 13 +- .../spring/FixedWeakConstraint.inl | 311 ++++++++---------- .../component/solidmechanics/spring/init.cpp | 2 + 3 files changed, 146 insertions(+), 180 deletions(-) diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.h b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.h index c94944d1894..28913e39618 100644 --- a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.h +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.h @@ -70,7 +70,7 @@ class FixedWeakConstraint : public core::behavior::ForceField typedef core::objectmodel::Data DataVecCoord; typedef core::objectmodel::Data DataVecDeriv; - DataSubsetIndex d_points; ///< points controlled by the rest shape springs + DataSubsetIndex d_indices; ///< points controlled by the rest shape springs Data d_fixAll; ///< points controlled by the rest shape springs Data< VecReal > d_stiffness; ///< stiffness values between the actual position and the rest shape position Data< VecReal > d_angularStiffness; ///< angularStiffness assigned when controlling the rotation of the points @@ -80,9 +80,9 @@ class FixedWeakConstraint : public core::behavior::ForceField protected: FixedWeakConstraint(); - static constexpr type::fixed_array s_defaultActiveDirections = sofa::type::makeHomogeneousArray(true); + public: /// BaseObject initialization method. void bwdInit() override ; @@ -112,17 +112,16 @@ class FixedWeakConstraint : public core::behavior::ForceField void draw(const core::visual::VisualParams* vparams) override; + protected : + virtual const DataVecCoord* getExtPosition() const; virtual const VecIndex& getIndices() const; virtual const VecIndex& getExtIndices() const; virtual const type::fixed_array& getActiveDirections() const; + virtual const bool checkState(); - protected : - - void recomputeIndices(); - virtual bool checkOutOfBoundsIndices(); bool checkOutOfBoundsIndices(const VecIndex &indices, const sofa::Size dimension); - + virtual bool checkOutOfBoundsIndices(); }; diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.inl b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.inl index 9453ba7222c..bcfd747d507 100644 --- a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.inl +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.inl @@ -49,9 +49,10 @@ using type::Vec4f; using type::vector; using core::visual::VisualParams; + template FixedWeakConstraint::FixedWeakConstraint() - : d_points(initData(&d_points, "points", "points controlled by the rest shape springs")) + : d_indices(initData(&d_indices, "indices", "points controlled by the rest shape springs")) , d_fixAll(initData(&d_fixAll, false, "fixAll", "Force to fix all points")) , d_stiffness(initData(&d_stiffness, "stiffness", "stiffness values between the actual position and the rest shape position")) , d_angularStiffness(initData(&d_angularStiffness, "angularStiffness", "angularStiffness assigned when controlling the rotation of the points")) @@ -59,41 +60,31 @@ FixedWeakConstraint::FixedWeakConstraint() , d_springColor(initData(&d_springColor, sofa::type::RGBAColor::green(), "springColor","spring color. (default=[0.0,1.0,0.0,1.0])")) , l_topology(initLink("topology", "Link to be set to the topology container in the component graph")) { - this->addUpdateCallback("updateIndices", {&d_points}, [this](const core::DataTracker& t) + this->addUpdateCallback("updateIndices", {&d_indices}, [this](const core::DataTracker& t) { SOFA_UNUSED(t); - this->recomputeIndices(); - return sofa::core::objectmodel::ComponentState::Valid; + if (!checkOutOfBoundsIndices()) + { + msg_error(this) << "Some input indices are out of bound"; + return sofa::core::objectmodel::ComponentState::Invalid; + } + else + { + return sofa::core::objectmodel::ComponentState::Valid; + } }, {}); } + template -void FixedWeakConstraint::bwdInit() +const bool FixedWeakConstraint::checkState() { - ForceField::init(); - if (d_stiffness.getValue().empty()) { msg_info() << "No stiffness is defined, assuming equal stiffness on each node, k = 100.0 "; d_stiffness.setValue({static_cast(100)}); } - if (l_restMState.get() == nullptr) - { - useRestMState = false; - msg_info() << "no external rest shape used"; - - if(!l_restMState.empty()) - { - msg_warning() << "external_rest_shape in node " << this->getContext()->getName() << " not found"; - } - } - else - { - msg_info() << "external rest shape used"; - useRestMState = true; - } - if (l_topology.empty()) { msg_info() << "link to Topology container should be set to ensure right behavior. First Topology found in current context will be used."; @@ -105,27 +96,14 @@ void FixedWeakConstraint::bwdInit() msg_info() << "Topology path used: '" << l_topology.getLinkedPath() << "'"; // Initialize topological changes support - d_points.createTopologyHandler(_topology); + d_indices.createTopologyHandler(_topology); } else { msg_info() << "Cannot find the topology: topological changes will not be supported"; } - recomputeIndices(); - if (this->d_componentState.getValue() == sofa::core::objectmodel::ComponentState::Invalid) - return; - const BaseMechanicalState* state = this->getContext()->getMechanicalState(); - if(!state) - { - msg_warning() << "MechanicalState of the current context returns null pointer"; - } - else - { - assert(state); - matS.resize(state->getMatrixSize(),state->getMatrixSize()); - } /// Compile time condition to check if we are working with a Rigid3Types or a type that does not /// need the Angular Stiffness parameters. @@ -150,111 +128,57 @@ void FixedWeakConstraint::bwdInit() } } - this->d_componentState.setValue(sofa::core::objectmodel::ComponentState::Valid); -} - - -template -void FixedWeakConstraint::reinit() -{ if (!checkOutOfBoundsIndices()) { - m_indices.clear(); - } - else - { - msg_info() << "Indices successfully checked"; - } - - if (d_stiffness.getValue().empty()) - { - msg_info() << "No stiffness is defined, assuming equal stiffness on each node, k = 100.0 " ; - - VecReal stiffs; - stiffs.push_back(100.0); - d_stiffness.setValue(stiffs); + return false; } else { - const VecReal &k = d_stiffness.getValue(); - if ( k.size() != m_indices.size() ) - { - msg_warning() << "Size of stiffness vector is not correct (" << k.size() << "), should be either 1 or " << m_indices.size() << msgendl - << "First value of stiffness will be used"; - } + return true; } - } template -void FixedWeakConstraint::recomputeIndices() +void FixedWeakConstraint::bwdInit() { - m_indices.clear(); - m_ext_indices.clear(); + ForceField::init(); - for (const sofa::Index i : d_points.getValue()) + if (checkState()) { - m_indices.push_back(i); + this->d_componentState.setValue(core::objectmodel::ComponentState::Valid); } - - for (const sofa::Index i : d_external_points.getValue()) + else { - m_ext_indices.push_back(i); - } + this->d_componentState.setValue(core::objectmodel::ComponentState::Invalid); - if (m_indices.empty()) - { - // no point are defined, default case: points = all points - msg_info() << "No point are defined. Change to default case: points = all points"; - for (sofa::Index i = 0; i < this->mstate->getSize(); i++) - { - m_indices.push_back(i); - } } +} - if (m_ext_indices.empty()) - { - if (useRestMState) - { - if (const DataVecCoord* extPosition = getExtPosition()) - { - const auto& extPositionValue = extPosition->getValue(); - for (sofa::Index i = 0; i < extPositionValue.size(); i++) - { - m_ext_indices.push_back(i); - } - } - else - { - this->d_componentState.setValue(sofa::core::objectmodel::ComponentState::Invalid); - } - } - else - { - for (const sofa::Index i : m_indices) - { - m_ext_indices.push_back(i); - } - } - } - if (!checkOutOfBoundsIndices()) +template +void FixedWeakConstraint::reinit() +{ + ForceField::reinit(); + + if (checkState()) { - msg_error() << "The dimension of the source and the targeted points are different "; - m_indices.clear(); + this->d_componentState.setValue(core::objectmodel::ComponentState::Valid); } else { - msg_info() << "Indices successfully checked"; + this->d_componentState.setValue(core::objectmodel::ComponentState::Invalid); + } + } + + template bool FixedWeakConstraint::checkOutOfBoundsIndices() { if (!checkOutOfBoundsIndices(getIndices(), this->mstate->getSize())) { - msg_error() << "Out of Bounds d_indices detected. ForceField is not activated."; return false; } return true; @@ -284,22 +208,22 @@ const typename FixedWeakConstraint::DataVecCoord* FixedWeakConstraint } template -const FixedWeakConstraint::VecIndex& FixedWeakConstraint::getIndices() const +const typename FixedWeakConstraint::VecIndex& FixedWeakConstraint::getIndices() const { - return d_points.getValue(); + return d_indices.getValue(); } template -const FixedWeakConstraint::VecIndex& FixedWeakConstraint::getExtIndices() const +const typename FixedWeakConstraint::VecIndex& FixedWeakConstraint::getExtIndices() const { - return d_points.getValue(); + return d_indices.getValue(); } template const type::fixed_array::coord_total_size>& FixedWeakConstraint::getActiveDirections() const { - return s_defaultActiveDirections; + return FixedWeakConstraint::s_defaultActiveDirections; } template @@ -328,10 +252,19 @@ void FixedWeakConstraint::addForce(const MechanicalParams* mparams , f1.resize(p1.size()); - for (sofa::Index i = 0; i < indices.size(); i++) + const bool fixedAll = d_fixAll.getValue(); + const unsigned maxIt = fixedAll ? this->mstate->getSize() : indices.size(); + + for (sofa::Index i = 0; i < maxIt; i++) { - const sofa::Index index = indices[i]; - sofa::Index ext_index = extIndices[i]; + sofa::Index ext_index = i; + sofa::Index index = i; + + if (!fixedAll) + { + index = indices[i]; + ext_index = extIndices[i]; + } const auto stiffness = k[static_cast(i < k.size()) * i]; @@ -409,9 +342,18 @@ void FixedWeakConstraint::addDForce(const MechanicalParams* mparams, const auto & indices = getIndices(); - for (unsigned int i = 0; i < indices.size(); i++) + const bool fixedAll = d_fixAll.getValue(); + const unsigned maxIt = fixedAll ? this->mstate->getSize() : indices.size(); + + for (sofa::Index i = 0; i < maxIt; i++) { - const sofa::Index curIndex = indices[i]; + sofa::Index curIndex = i; + + if (!fixedAll) + { + curIndex = indices[i]; + } + const auto stiffness = k[static_cast(i < k.size()) * i]; if constexpr (sofa::type::isRigidType()) @@ -445,64 +387,19 @@ void FixedWeakConstraint::addDForce(const MechanicalParams* mparams, { // We filter the difference in translation by setting to 0 the entries corresponding // to 0 values in d_activeDirections - auto currentSpringDx = dx1[indices[i]]; + auto currentSpringDx = dx1[curIndex]; for (sofa::Size entryId = 0; entryId < spatial_dimensions; ++entryId) { if (!activeDirections[entryId]) currentSpringDx[entryId] = 0; } - df1[indices[i]] -= currentSpringDx * stiffness * kFactor; + df1[curIndex] -= currentSpringDx * stiffness * kFactor; } } } -template -void FixedWeakConstraint::draw(const VisualParams *vparams) -{ - if (!vparams->displayFlags().getShowForceFields() || !d_drawSpring.getValue()) - return; /// \todo put this in the parent class - - const auto stateLifeCycle = vparams->drawTool()->makeStateLifeCycle(); - vparams->drawTool()->setLightingEnabled(false); - - const DataVecCoord* extPosition = getExtPosition(); - if (!extPosition) - { - this->d_componentState.setValue(sofa::core::objectmodel::ComponentState::Invalid); - return; - } - - ReadAccessor< DataVecCoord > p0 = *extPosition; - ReadAccessor< DataVecCoord > p = this->mstate->read(sofa::core::vec_id::write_access::position); - - const auto & indices = getIndices(); - const auto & extIndices = getExtIndices(); - - std::vector vertices; - - for (sofa::Index i=0; i(3)) ; j++) - { - v0[j] = (DataTypes::getCPos(p[index]))[j]; - v1[j] = (DataTypes::getCPos(p0[ext_index]))[j]; - } - - vertices.push_back(v0); - vertices.push_back(v1); - } - - //todo(dmarchal) because of https://github.com/sofa-framework/sofa/issues/64 - vparams->drawTool()->drawLines(vertices,5, d_springColor.getValue()); - -} template void FixedWeakConstraint::addKToMatrix(const MechanicalParams* mparams, const MultiMatrixAccessor* matrix ) @@ -520,11 +417,17 @@ void FixedWeakConstraint::addKToMatrix(const MechanicalParams* mparam constexpr sofa::Size space_size = Deriv::spatial_dimensions; // == total_size if DataTypes = VecTypes constexpr sofa::Size total_size = Deriv::total_size; - sofa::Index curIndex = 0; + const bool fixedAll = d_fixAll.getValue(); + const unsigned maxIt = fixedAll ? this->mstate->getSize() : indices.size(); - for (sofa::Index index = 0; index < indices.size(); index++) + for (sofa::Index index = 0; index < maxIt; index++) { - curIndex = indices[index]; + sofa::Index curIndex = index; + + if (!fixedAll) + { + curIndex = indices[index]; + } // translation const auto vt = -kFact * k[(index < k.size()) * index]; @@ -564,9 +467,17 @@ void FixedWeakConstraint::buildStiffnessMatrix(core::behavior::Stiffn auto dfdx = matrix->getForceDerivativeIn(this->mstate) .withRespectToPositionsIn(this->mstate); + const bool fixedAll = d_fixAll.getValue(); + const unsigned maxIt = fixedAll ? this->mstate->getSize() : indices.size(); - for (const auto index : indices) + for (sofa::Index i = 0; i < maxIt; i++) { + sofa::Index index = i; + + if (!fixedAll) + { + index = indices[i]; + } // translation const auto vt = -k[(index < k.size()) * index]; for(sofa::Index i = 0; i < space_size; i++) @@ -597,4 +508,58 @@ void FixedWeakConstraint::buildDampingMatrix( { SOFA_UNUSED(matrix); } + +template +void FixedWeakConstraint::draw(const VisualParams *vparams) +{ + if (!vparams->displayFlags().getShowForceFields() || !d_drawSpring.getValue()) + return; /// \todo put this in the parent class + + const auto stateLifeCycle = vparams->drawTool()->makeStateLifeCycle(); + vparams->drawTool()->setLightingEnabled(false); + + const DataVecCoord* extPosition = getExtPosition(); + if (!extPosition) + { + this->d_componentState.setValue(sofa::core::objectmodel::ComponentState::Invalid); + return; + } + + ReadAccessor< DataVecCoord > p0 = *extPosition; + ReadAccessor< DataVecCoord > p = this->mstate->read(sofa::core::vec_id::write_access::position); + std::vector vertices; + + + const auto & indices = getIndices(); + const auto & extIndices = getExtIndices(); + const bool fixedAll = d_fixAll.getValue(); + const unsigned maxIt = fixedAll ? this->mstate->getSize() : indices.size(); + + for (sofa::Index i = 0; i < maxIt; i++) + { + sofa::Index ext_index = i; + sofa::Index index = i; + + if (!fixedAll) + { + index = indices[i]; + ext_index = extIndices[i]; + } + + Vec3 v0(0.0, 0.0, 0.0); + Vec3 v1(0.0, 0.0, 0.0); + for(sofa::Index j=0 ; j< std::min(DataTypes::spatial_dimensions, static_cast(3)) ; j++) + { + v0[j] = (DataTypes::getCPos(p[index]))[j]; + v1[j] = (DataTypes::getCPos(p0[ext_index]))[j]; + } + + vertices.push_back(v0); + vertices.push_back(v1); + } + + //todo(dmarchal) because of https://github.com/sofa-framework/sofa/issues/64 + vparams->drawTool()->drawLines(vertices,5, d_springColor.getValue()); + +} } // namespace sofa::component::solidmechanics::spring diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/init.cpp b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/init.cpp index 329e648e6b7..3d415081f78 100644 --- a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/init.cpp +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/init.cpp @@ -28,6 +28,7 @@ namespace sofa::component::solidmechanics::spring extern void registerAngularSpringForceField(sofa::core::ObjectFactory* factory); extern void registerFastTriangularBendingSprings(sofa::core::ObjectFactory* factory); +extern void registerFixedWeakConstraint(sofa::core::ObjectFactory* factory); extern void registerFrameSpringForceField(sofa::core::ObjectFactory* factory); extern void registerGearSpringForceField(sofa::core::ObjectFactory* factory); extern void registerNonUniformHexahedronFEMForceFieldAndMass(sofa::core::ObjectFactory* factory); @@ -72,6 +73,7 @@ void registerObjects(sofa::core::ObjectFactory* factory) { registerAngularSpringForceField(factory); registerFastTriangularBendingSprings(factory); + registerFixedWeakConstraint(factory); registerFrameSpringForceField(factory); registerGearSpringForceField(factory); registerNonUniformHexahedronFEMForceFieldAndMass(factory); From 937acc8ad9f547c63e05e079bd41f2aaba0dcbff Mon Sep 17 00:00:00 2001 From: Paul Baksic Date: Tue, 10 Dec 2024 14:51:19 +0100 Subject: [PATCH 08/14] Apply changes to RestShapeSpringForceField --- .../spring/FixedWeakConstraint.h | 26 +- .../spring/FixedWeakConstraint.inl | 36 +- .../spring/RestShapeSpringsForceField.h | 69 +-- .../spring/RestShapeSpringsForceField.inl | 534 ++---------------- 4 files changed, 90 insertions(+), 575 deletions(-) diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.h b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.h index 28913e39618..d5ed13fe513 100644 --- a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.h +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.h @@ -29,6 +29,7 @@ #include #include #include +#include namespace sofa::core::behavior @@ -71,38 +72,27 @@ class FixedWeakConstraint : public core::behavior::ForceField typedef core::objectmodel::Data DataVecDeriv; DataSubsetIndex d_indices; ///< points controlled by the rest shape springs + core::objectmodel::lifecycle::RemovedData d_points{this,"v24.12","v25.06","points","This data has been replaced by \'indices\'. Please update your scene."}; + Data d_fixAll; ///< points controlled by the rest shape springs Data< VecReal > d_stiffness; ///< stiffness values between the actual position and the rest shape position Data< VecReal > d_angularStiffness; ///< angularStiffness assigned when controlling the rotation of the points Data< bool > d_drawSpring; ///< draw Spring Data< sofa::type::RGBAColor > d_springColor; ///< spring color. (default=[0.0,1.0,0.0,1.0]) - - protected: - FixedWeakConstraint(); - static constexpr type::fixed_array s_defaultActiveDirections = sofa::type::makeHomogeneousArray(true); + /// Link to be set to the topology container in the component graph. + SingleLink, sofa::core::topology::BaseMeshTopology, BaseLink::FLAG_STOREPATH | BaseLink::FLAG_STRONGLINK> l_topology; - public: /// BaseObject initialization method. void bwdInit() override ; void reinit() override ; /// Add the forces. void addForce(const core::MechanicalParams* mparams, DataVecDeriv& f, const DataVecCoord& x, const DataVecDeriv& v) override; - /// Link to be set to the topology container in the component graph. - SingleLink, sofa::core::topology::BaseMeshTopology, BaseLink::FLAG_STOREPATH | BaseLink::FLAG_STRONGLINK> l_topology; void addDForce(const core::MechanicalParams* mparams, DataVecDeriv& df, const DataVecDeriv& dx) override; - - SReal getPotentialEnergy(const core::MechanicalParams* mparams, const DataVecCoord& x) const override - { - SOFA_UNUSED(mparams); - SOFA_UNUSED(x); - - msg_warning() << "Method getPotentialEnergy not implemented yet."; - return 0.0; - } + SReal getPotentialEnergy(const core::MechanicalParams* mparams, const DataVecCoord& x) const override; /// Brings ForceField contribution to the global system stiffness matrix. void addKToMatrix(const core::MechanicalParams* mparams, const sofa::core::behavior::MultiMatrixAccessor* matrix ) override; @@ -113,6 +103,8 @@ class FixedWeakConstraint : public core::behavior::ForceField protected : + FixedWeakConstraint(); + static constexpr type::fixed_array s_defaultActiveDirections = sofa::type::makeHomogeneousArray(true); virtual const DataVecCoord* getExtPosition() const; virtual const VecIndex& getIndices() const; @@ -120,9 +112,9 @@ class FixedWeakConstraint : public core::behavior::ForceField virtual const type::fixed_array& getActiveDirections() const; virtual const bool checkState(); - bool checkOutOfBoundsIndices(const VecIndex &indices, const sofa::Size dimension); virtual bool checkOutOfBoundsIndices(); + bool checkOutOfBoundsIndices(const VecIndex &indices, const sofa::Size dimension); }; #if !defined(SOFA_COMPONENT_FORCEFIELD_FixedWeakConstraint_CPP) diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.inl b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.inl index bcfd747d507..5ab787e4025 100644 --- a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.inl +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.inl @@ -81,26 +81,26 @@ const bool FixedWeakConstraint::checkState() { if (d_stiffness.getValue().empty()) { - msg_info() << "No stiffness is defined, assuming equal stiffness on each node, k = 100.0 "; + msg_info(this) << "No stiffness is defined, assuming equal stiffness on each node, k = 100.0 "; d_stiffness.setValue({static_cast(100)}); } if (l_topology.empty()) { - msg_info() << "link to Topology container should be set to ensure right behavior. First Topology found in current context will be used."; + msg_info(this) << "link to Topology container should be set to ensure right behavior. First Topology found in current context will be used."; l_topology.set(this->getContext()->getMeshTopologyLink()); } if (sofa::core::topology::BaseMeshTopology* _topology = l_topology.get()) { - msg_info() << "Topology path used: '" << l_topology.getLinkedPath() << "'"; + msg_info(this) << "Topology path used: '" << l_topology.getLinkedPath() << "'"; // Initialize topological changes support d_indices.createTopologyHandler(_topology); } else { - msg_info() << "Cannot find the topology: topological changes will not be supported"; + msg_info(this) << "Cannot find the topology: topological changes will not be supported"; } @@ -115,7 +115,7 @@ const bool FixedWeakConstraint::checkState() if (as.size() < s.size()) { - msg_info() << "'stiffness' is larger than 'angularStiffness', add the default value (100.0) to the missing entries."; + msg_info(this) << "'stiffness' is larger than 'angularStiffness', add the default value (100.0) to the missing entries."; for(size_t i = as.size();i::checkState() } }else if (as.size() > s.size()) { - msg_info() << "'stiffness' is smaller than 'angularStiffness', clamp the extra values in angularStiffness."; + msg_info(this) << "'stiffness' is smaller than 'angularStiffness', clamp the extra values in angularStiffness."; as.resize(s.size()); } } @@ -229,6 +229,9 @@ const type::fixed_array::coord_total_size>& template void FixedWeakConstraint::addForce(const MechanicalParams* mparams , DataVecDeriv& f, const DataVecCoord& x, const DataVecDeriv& v ) { + if (this->d_componentState.getValue() != core::objectmodel::ComponentState::Valid) + return; + SOFA_UNUSED(mparams); SOFA_UNUSED(v); @@ -333,6 +336,9 @@ void FixedWeakConstraint::addForce(const MechanicalParams* mparams , template void FixedWeakConstraint::addDForce(const MechanicalParams* mparams, DataVecDeriv& df, const DataVecDeriv& dx) { + if (this->d_componentState.getValue() != core::objectmodel::ComponentState::Valid) + return; + WriteAccessor< DataVecDeriv > df1 = df; ReadAccessor< DataVecDeriv > dx1 = dx; Real kFactor = (Real)sofa::core::mechanicalparams::kFactorIncludingRayleighDamping(mparams, this->rayleighStiffness.getValue()); @@ -400,10 +406,22 @@ void FixedWeakConstraint::addDForce(const MechanicalParams* mparams, } +template +SReal FixedWeakConstraint::getPotentialEnergy(const core::MechanicalParams* mparams, const DataVecCoord& x) const +{ + SOFA_UNUSED(mparams); + SOFA_UNUSED(x); + + msg_warning() << "Method getPotentialEnergy not implemented yet."; + return 0.0; +} template void FixedWeakConstraint::addKToMatrix(const MechanicalParams* mparams, const MultiMatrixAccessor* matrix ) { + if (this->d_componentState.getValue() != core::objectmodel::ComponentState::Valid) + return; + const MultiMatrixAccessor::MatrixRef mref = matrix->getMatrix(this->mstate); BaseMatrix* mat = mref.matrix; const unsigned int offset = mref.offset; @@ -457,6 +475,9 @@ void FixedWeakConstraint::addKToMatrix(const MechanicalParams* mparam template void FixedWeakConstraint::buildStiffnessMatrix(core::behavior::StiffnessMatrix* matrix) { + if (this->d_componentState.getValue() != core::objectmodel::ComponentState::Valid) + return; + const VecReal& k = d_stiffness.getValue(); const VecReal& k_a = d_angularStiffness.getValue(); const auto & activeDirections = getActiveDirections(); @@ -512,6 +533,9 @@ void FixedWeakConstraint::buildDampingMatrix( template void FixedWeakConstraint::draw(const VisualParams *vparams) { + if (this->d_componentState.getValue() != core::objectmodel::ComponentState::Valid) + return; + if (!vparams->displayFlags().getShowForceFields() || !d_drawSpring.getValue()) return; /// \todo put this in the parent class diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/RestShapeSpringsForceField.h b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/RestShapeSpringsForceField.h index ea0972703e3..9860d236f94 100644 --- a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/RestShapeSpringsForceField.h +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/RestShapeSpringsForceField.h @@ -29,6 +29,8 @@ #include #include #include +#include +#include namespace sofa::core::behavior @@ -48,12 +50,12 @@ namespace sofa::component::solidmechanics::spring * An external MechanicalState reference can also be passed to the ForceField as rest shape position. */ template -class RestShapeSpringsForceField : public core::behavior::ForceField +class RestShapeSpringsForceField : public FixedWeakConstraint { public: - SOFA_CLASS(SOFA_TEMPLATE(RestShapeSpringsForceField, DataTypes), SOFA_TEMPLATE(core::behavior::ForceField, DataTypes)); + SOFA_CLASS(SOFA_TEMPLATE(RestShapeSpringsForceField, DataTypes), SOFA_TEMPLATE(FixedWeakConstraint, DataTypes)); - typedef core::behavior::ForceField Inherit; + typedef FixedWeakConstraint Inherit; typedef typename DataTypes::VecCoord VecCoord; typedef typename DataTypes::VecDeriv VecDeriv; typedef typename DataTypes::Coord Coord; @@ -70,72 +72,31 @@ class RestShapeSpringsForceField : public core::behavior::ForceField typedef core::objectmodel::Data DataVecCoord; typedef core::objectmodel::Data DataVecDeriv; - DataSubsetIndex d_points; ///< points controlled by the rest shape springs - Data< VecReal > d_stiffness; ///< stiffness values between the actual position and the rest shape position - Data< VecReal > d_angularStiffness; ///< angularStiffness assigned when controlling the rotation of the points - Data< type::vector< CPos > > d_pivotPoints; ///< global pivot points used when translations instead of the rigid mass centers - Data< VecIndex > d_external_points; ///< points from the external Mechanical State that define the rest shape springs - Data< bool > d_recompute_indices; ///< Recompute indices (should be false for BBOX) - Data< bool > d_drawSpring; ///< draw Spring - Data< sofa::type::RGBAColor > d_springColor; ///< spring color. (default=[0.0,1.0,0.0,1.0]) Data< type::fixed_array > d_activeDirections; ///< directions (translation, and rotation in case of Rigids) in which the spring is active + Data< VecIndex > d_externalIndices; ///< points from the external Mechanical State that define the rest shape springs + core::objectmodel::lifecycle::RemovedData d_external_points{this,"v24.12","v25.06","external_points","This data has been replaced by \'externalIndices\'. Please update your scene."}; + core::objectmodel::DataCallback c_fixAllCallback; SingleLink, sofa::core::behavior::MechanicalState< DataTypes >, BaseLink::FLAG_STOREPATH|BaseLink::FLAG_STRONGLINK> l_restMState; - linearalgebra::EigenBaseSparseMatrix matS; - -protected: - RestShapeSpringsForceField(); - - static constexpr type::fixed_array s_defaultActiveDirections = sofa::type::makeHomogeneousArray(true); + SingleLink, sofa::core::topology::BaseMeshTopology, BaseLink::FLAG_STOREPATH | BaseLink::FLAG_STRONGLINK> l_topology; -public: /// BaseObject initialization method. void bwdInit() override ; - void parse(core::objectmodel::BaseObjectDescription *arg) override ; - void reinit() override ; - - /// Add the forces. - void addForce(const core::MechanicalParams* mparams, DataVecDeriv& f, const DataVecCoord& x, const DataVecDeriv& v) override; - /// Link to be set to the topology container in the component graph. - SingleLink, sofa::core::topology::BaseMeshTopology, BaseLink::FLAG_STOREPATH | BaseLink::FLAG_STRONGLINK> l_topology; - void addDForce(const core::MechanicalParams* mparams, DataVecDeriv& df, const DataVecDeriv& dx) override; - SReal getPotentialEnergy(const core::MechanicalParams* mparams, const DataVecCoord& x) const override - { - SOFA_UNUSED(mparams); - SOFA_UNUSED(x); - - msg_warning() << "Method getPotentialEnergy not implemented yet."; - return 0.0; - } - - /// Brings ForceField contribution to the global system stiffness matrix. - void addKToMatrix(const core::MechanicalParams* mparams, const sofa::core::behavior::MultiMatrixAccessor* matrix ) override; - void buildStiffnessMatrix(core::behavior::StiffnessMatrix* matrix) override; - void buildDampingMatrix(core::behavior::DampingMatrix* matrix) override; - - void draw(const core::visual::VisualParams* vparams) override; - - - const DataVecCoord* getExtPosition() const; - const VecIndex& getIndices() const { return m_indices; } - const VecIndex& getExtIndices() const { return (useRestMState ? m_ext_indices : m_indices); } protected : + RestShapeSpringsForceField(); - void recomputeIndices(); - bool checkOutOfBoundsIndices(); - bool checkOutOfBoundsIndices(const VecIndex &indices, const sofa::Size dimension); - + virtual const DataVecCoord* getExtPosition() const override; + virtual const VecIndex& getExtIndices() const override; + virtual const type::fixed_array& getActiveDirections() const override; - VecIndex m_indices; - VecIndex m_ext_indices; - type::vector m_pivots; + virtual bool checkOutOfBoundsIndices(); private : - bool useRestMState{}; /// An external MechanicalState is used as rest reference. + bool m_useRestMState; /// An external MechanicalState is used as rest reference. }; #if !defined(SOFA_COMPONENT_FORCEFIELD_RESTSHAPESPRINGSFORCEFIELD_CPP) diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/RestShapeSpringsForceField.inl b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/RestShapeSpringsForceField.inl index 83cca22cf0a..eded05ba9ce 100644 --- a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/RestShapeSpringsForceField.inl +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/RestShapeSpringsForceField.inl @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -51,54 +52,37 @@ using core::visual::VisualParams; template RestShapeSpringsForceField::RestShapeSpringsForceField() - : d_points(initData(&d_points, "points", "points controlled by the rest shape springs")) - , d_stiffness(initData(&d_stiffness, "stiffness", "stiffness values between the actual position and the rest shape position")) - , d_angularStiffness(initData(&d_angularStiffness, "angularStiffness", "angularStiffness assigned when controlling the rotation of the points")) - , d_pivotPoints(initData(&d_pivotPoints, "pivot_points", "global pivot points used when translations instead of the rigid mass centers")) - , d_external_points(initData(&d_external_points, "external_points", "points from the external Mechanical State that define the rest shape springs")) - , d_recompute_indices(initData(&d_recompute_indices, true, "recompute_indices", "Recompute indices (should be false for BBOX)")) - , d_drawSpring(initData(&d_drawSpring,false,"drawSpring","draw Spring")) - , d_springColor(initData(&d_springColor, sofa::type::RGBAColor::green(), "springColor","spring color. (default=[0.0,1.0,0.0,1.0])")) - , d_activeDirections(initData(&d_activeDirections, s_defaultActiveDirections, - "activeDirections", std::string("Directions in which the spring is active (default=[" + sofa::helper::join(s_defaultActiveDirections, ',') + "])").c_str())) + : d_activeDirections(initData(&d_activeDirections, FixedWeakConstraint::s_defaultActiveDirections, + "activeDirections", std::string("Directions in which the spring is active (default=[" + sofa::helper::join(FixedWeakConstraint::s_defaultActiveDirections, ',') + "])").c_str())) + , d_externalIndices(initData(&d_externalIndices, "externalIndices","Indices from the external Mechanical State that define the rest shape springs")) , l_restMState(initLink("external_rest_shape", "rest_shape can be defined by the position of an external Mechanical State")) , l_topology(initLink("topology", "Link to be set to the topology container in the component graph")) { - this->addUpdateCallback("updateIndices", {&d_points}, [this](const core::DataTracker& t) + c_fixAllCallback.addInput(&this->d_fixAll); + c_fixAllCallback.addCallback([this]() { - SOFA_UNUSED(t); - this->recomputeIndices(); - return sofa::core::objectmodel::ComponentState::Valid; - }, {}); -} - -template -void RestShapeSpringsForceField::parse(core::objectmodel::BaseObjectDescription *arg) -{ - const char* attr = arg->getAttribute("external_rest_shape") ; - if( attr != nullptr && attr[0] != '@') - { - msg_error() << "RestShapeSpringsForceField have changed since 17.06. The parameter 'external_rest_shape' is now a Link. To fix your scene you need to add and '@' in front of the provided path. See PR#315" ; - } - Inherit::parse(arg) ; + if (this->getMState()->getSize() != l_restMState->getSize()) + { + msg_error(this) <<"the fixAll option only works with either one mstate or when the two mstate have the same size."; + this->d_componentState.setValue(core::objectmodel::ComponentState::Invalid); + } + else + { + this->d_componentState.setValue(core::objectmodel::ComponentState::Valid); + } + }); } template void RestShapeSpringsForceField::bwdInit() { - ForceField::init(); - - if (d_stiffness.getValue().empty()) - { - msg_info() << "No stiffness is defined, assuming equal stiffness on each node, k = 100.0 "; - d_stiffness.setValue({static_cast(100)}); - } + FixedWeakConstraint::bwdInit(); if (l_restMState.get() == nullptr) { - useRestMState = false; - msg_info() << "no external rest shape used"; + m_useRestMState = false; + msg_info(this) << "no external rest shape used"; if(!l_restMState.empty()) { @@ -107,176 +91,23 @@ void RestShapeSpringsForceField::bwdInit() } else { - msg_info() << "external rest shape used"; - useRestMState = true; - } - - if (l_topology.empty()) - { - msg_info() << "link to Topology container should be set to ensure right behavior. First Topology found in current context will be used."; - l_topology.set(this->getContext()->getMeshTopologyLink()); - } - - if (sofa::core::topology::BaseMeshTopology* _topology = l_topology.get()) - { - msg_info() << "Topology path used: '" << l_topology.getLinkedPath() << "'"; - - // Initialize topological changes support - d_points.createTopologyHandler(_topology); - } - else - { - msg_info() << "Cannot find the topology: topological changes will not be supported"; + msg_info(this) << "external rest shape used"; + m_useRestMState = true; } - - recomputeIndices(); - if (this->d_componentState.getValue() == sofa::core::objectmodel::ComponentState::Invalid) - return; - - const BaseMechanicalState* state = this->getContext()->getMechanicalState(); - if(!state) - { - msg_warning() << "MechanicalState of the current context returns null pointer"; - } - else - { - assert(state); - matS.resize(state->getMatrixSize(),state->getMatrixSize()); - } - - /// Compile time condition to check if we are working with a Rigid3Types or a type that does not - /// need the Angular Stiffness parameters. - //if constexpr (isRigid()) - if constexpr (sofa::type::isRigidType()) - { - sofa::helper::ReadAccessor> s = d_stiffness; - sofa::helper::WriteOnlyAccessor> as = d_angularStiffness; - - if (as.size() < s.size()) - { - msg_info() << "'stiffness' is larger than 'angularStiffness', add the default value (100.0) to the missing entries."; - - for(size_t i = as.size();i s.size()) - { - msg_info() << "'stiffness' is smaller than 'angularStiffness', clamp the extra values in angularStiffness."; - as.resize(s.size()); - } - } - - this->d_componentState.setValue(sofa::core::objectmodel::ComponentState::Valid); } -template -void RestShapeSpringsForceField::reinit() -{ - if (!checkOutOfBoundsIndices()) - { - m_indices.clear(); - } - else - { - msg_info() << "Indices successfully checked"; - } - - if (d_stiffness.getValue().empty()) - { - msg_info() << "No stiffness is defined, assuming equal stiffness on each node, k = 100.0 " ; - - VecReal stiffs; - stiffs.push_back(100.0); - d_stiffness.setValue(stiffs); - } - else - { - const VecReal &k = d_stiffness.getValue(); - if ( k.size() != m_indices.size() ) - { - msg_warning() << "Size of stiffness vector is not correct (" << k.size() << "), should be either 1 or " << m_indices.size() << msgendl - << "First value of stiffness will be used"; - } - } - -} - -template -void RestShapeSpringsForceField::recomputeIndices() -{ - m_indices.clear(); - m_ext_indices.clear(); - - for (const sofa::Index i : d_points.getValue()) - { - m_indices.push_back(i); - } - - for (const sofa::Index i : d_external_points.getValue()) - { - m_ext_indices.push_back(i); - } - - if (m_indices.empty()) - { - // no point are defined, default case: points = all points - msg_info() << "No point are defined. Change to default case: points = all points"; - for (sofa::Index i = 0; i < this->mstate->getSize(); i++) - { - m_indices.push_back(i); - } - } - - if (m_ext_indices.empty()) - { - if (useRestMState) - { - if (const DataVecCoord* extPosition = getExtPosition()) - { - const auto& extPositionValue = extPosition->getValue(); - for (sofa::Index i = 0; i < extPositionValue.size(); i++) - { - m_ext_indices.push_back(i); - } - } - else - { - this->d_componentState.setValue(sofa::core::objectmodel::ComponentState::Invalid); - } - } - else - { - for (const sofa::Index i : m_indices) - { - m_ext_indices.push_back(i); - } - } - } - - if (!checkOutOfBoundsIndices()) - { - msg_error() << "The dimension of the source and the targeted points are different "; - m_indices.clear(); - } - else - { - msg_info() << "Indices successfully checked"; - } -} - template bool RestShapeSpringsForceField::checkOutOfBoundsIndices() { - if (!checkOutOfBoundsIndices(m_indices, this->mstate->getSize())) + if (!FixedWeakConstraint::checkOutOfBoundsIndices(this->getIndices(), this->mstate->getSize())) { msg_error() << "Out of Bounds d_indices detected. ForceField is not activated."; return false; } if (const DataVecCoord* extPosition = getExtPosition()) { - if (!checkOutOfBoundsIndices(m_ext_indices, sofa::Size(extPosition->getValue().size()))) + if (!FixedWeakConstraint::checkOutOfBoundsIndices(getExtIndices(), sofa::Size(extPosition->getValue().size()))) { msg_error() << "Out of Bounds m_ext_indices detected. ForceField is not activated."; return false; @@ -286,7 +117,7 @@ bool RestShapeSpringsForceField::checkOutOfBoundsIndices() { this->d_componentState.setValue(sofa::core::objectmodel::ComponentState::Invalid); } - if (m_indices.size() != m_ext_indices.size()) + if (this->getIndices().size() != getExtIndices().size()) { msg_error() << "Dimensions of the source and the targeted points are different. ForceField is not activated."; return false; @@ -294,28 +125,19 @@ bool RestShapeSpringsForceField::checkOutOfBoundsIndices() return true; } -template -bool RestShapeSpringsForceField::checkOutOfBoundsIndices(const VecIndex &indices, const sofa::Size dimension) -{ - for (sofa::Index i = 0; i < indices.size(); i++) - { - if (indices[i] >= dimension) - { - return false; - } - } - return true; -} - template const typename RestShapeSpringsForceField::DataVecCoord* RestShapeSpringsForceField::getExtPosition() const { - if(useRestMState) + if(m_useRestMState) { if (l_restMState) { return l_restMState->read(core::vec_id::write_access::position); } + else + { + msg_error(this)<<"The external rest shape is not set correctly."; + } } else { @@ -327,308 +149,24 @@ const typename RestShapeSpringsForceField::DataVecCoord* RestShapeSpr return nullptr; } -template -void RestShapeSpringsForceField::addForce(const MechanicalParams* mparams , DataVecDeriv& f, const DataVecCoord& x, const DataVecDeriv& v ) -{ - SOFA_UNUSED(mparams); - SOFA_UNUSED(v); - - WriteAccessor< DataVecDeriv > f1 = f; - ReadAccessor< DataVecCoord > p1 = x; - - const DataVecCoord* extPosition = getExtPosition(); - if (!extPosition) - { - this->d_componentState.setValue(sofa::core::objectmodel::ComponentState::Invalid); - return; - } - - ReadAccessor< DataVecCoord > p0 = *extPosition; - - const VecReal& k = d_stiffness.getValue(); - const VecReal& k_a = d_angularStiffness.getValue(); - - f1.resize(p1.size()); - - if (d_recompute_indices.getValue()) - { - recomputeIndices(); - } - - for (sofa::Index i = 0; i < m_indices.size(); i++) - { - const sofa::Index index = m_indices[i]; - sofa::Index ext_index = m_indices[i]; - if (useRestMState) - ext_index = m_ext_indices[i]; - - const auto stiffness = k[static_cast(i < k.size()) * i]; - - const auto activeDirections = d_activeDirections.getValue(); - - // rigid case - if constexpr (sofa::type::isRigidType()) - { - // translation - if (i >= m_pivots.size()) - { - CPos dx = p1[index].getCenter() - p0[ext_index].getCenter(); - // We filter the difference dx by setting to 0 the entries corresponding - // to 0 values in d_activeDirections - for (sofa::Size entryId = 0; entryId < spatial_dimensions; ++entryId) - { - if (!activeDirections[entryId]) - dx[entryId] = 0; - } - getVCenter(f1[index]) -= dx * stiffness; - } - else - { - CPos localPivot = p0[ext_index].getOrientation().inverseRotate(m_pivots[i] - p0[ext_index].getCenter()); - CPos rotatedPivot = p1[index].getOrientation().rotate(localPivot); - CPos pivot2 = p1[index].getCenter() + rotatedPivot; - CPos dx = pivot2 - m_pivots[i]; - getVCenter(f1[index]) -= dx * stiffness; - } - - // rotation - type::Quat dq = p1[index].getOrientation() * p0[ext_index].getOrientation().inverse(); - dq.normalize(); - - type::Vec<3, Real> dir{type::NOINIT}; - Real angle = 0.; - - if (dq[3] < 0.) - { - dq = dq * -1.0; - } - - if (dq[3] < 1.0) - dq.quatToAxis(dir, angle); - - // We change the direction of the axis of rotation based on - // the 0 values in d_activeDirections. This is equivalent - // to senting to 0 the rotation axis components along x, y - // and/or z, depending on the rotations we want to take into - // account. - for (sofa::Size entryId = spatial_dimensions; entryId < coord_total_size; ++entryId) - { - if (!activeDirections[entryId]) - dir[entryId-spatial_dimensions] = 0; - } - - const auto angularStiffness = k_a[static_cast(i < k_a.size()) * i]; - getVOrientation(f1[index]) -= dir * angle * angularStiffness; - } - else // non-rigid implementation - { - Deriv dx = p1[index] - p0[ext_index]; - // We filter the difference dx by setting to 0 the entries corresponding - // to 0 values in d_activeDirections - for (sofa::Size entryId = 0; entryId < spatial_dimensions; ++entryId) - { - if (!activeDirections[entryId]) - dx[entryId] = 0; - } - f1[index] -= dx * stiffness; - } - } -} template -void RestShapeSpringsForceField::addDForce(const MechanicalParams* mparams, DataVecDeriv& df, const DataVecDeriv& dx) +const typename RestShapeSpringsForceField::VecIndex& RestShapeSpringsForceField::getExtIndices() const { - WriteAccessor< DataVecDeriv > df1 = df; - ReadAccessor< DataVecDeriv > dx1 = dx; - Real kFactor = (Real)sofa::core::mechanicalparams::kFactorIncludingRayleighDamping(mparams, this->rayleighStiffness.getValue()); - const VecReal& k = d_stiffness.getValue(); - const VecReal& k_a = d_angularStiffness.getValue(); - const auto activeDirections = d_activeDirections.getValue(); - - for (unsigned int i = 0; i < m_indices.size(); i++) + if (m_useRestMState ) { - const sofa::Index curIndex = m_indices[i]; - const auto stiffness = k[static_cast(i < k.size()) * i]; - - if constexpr (sofa::type::isRigidType()) - { - const auto angularStiffness = k_a[static_cast(i < k_a.size()) * i]; - - // We filter the difference in translation by setting to 0 the entries corresponding - // to 0 values in d_activeDirections - auto currentSpringDx = getVCenter(dx1[curIndex]); - for (sofa::Size entryId = 0; entryId < spatial_dimensions; ++entryId) - { - if (!activeDirections[entryId]) - currentSpringDx[entryId] = 0; - } - getVCenter(df1[curIndex]) -= currentSpringDx * stiffness * kFactor; - - auto currentSpringRotationalDx = getVOrientation(dx1[curIndex]); - // We change the direction of the axis of rotation based on - // the 0 values in d_activeDirections. This is equivalent - // to senting to 0 the rotation axis components along x, y - // and/or z, depending on the rotations we want to take into - // account. - for (sofa::Size entryId = spatial_dimensions; entryId < coord_total_size; ++entryId) - { - if (!activeDirections[entryId]) - currentSpringRotationalDx[entryId-spatial_dimensions] = 0; - } - getVOrientation(df1[curIndex]) -= currentSpringRotationalDx * angularStiffness * kFactor; - } - else - { - // We filter the difference in translation by setting to 0 the entries corresponding - // to 0 values in d_activeDirections - auto currentSpringDx = dx1[m_indices[i]]; - for (sofa::Size entryId = 0; entryId < spatial_dimensions; ++entryId) - { - if (!activeDirections[entryId]) - currentSpringDx[entryId] = 0; - } - df1[m_indices[i]] -= currentSpringDx * stiffness * kFactor; - } + return d_externalIndices.getValue(); } - - -} - -template -void RestShapeSpringsForceField::draw(const VisualParams *vparams) -{ - if (!vparams->displayFlags().getShowForceFields() || !d_drawSpring.getValue()) - return; /// \todo put this in the parent class - - const auto stateLifeCycle = vparams->drawTool()->makeStateLifeCycle(); - vparams->drawTool()->setLightingEnabled(false); - - const DataVecCoord* extPosition = getExtPosition(); - if (!extPosition) - { - this->d_componentState.setValue(sofa::core::objectmodel::ComponentState::Invalid); - return; - } - - ReadAccessor< DataVecCoord > p0 = *extPosition; - ReadAccessor< DataVecCoord > p = this->mstate->read(sofa::core::vec_id::write_access::position); - - const VecIndex& indices = m_indices; - const VecIndex& ext_indices = (useRestMState ? m_ext_indices : m_indices); - - std::vector vertices; - - for (sofa::Index i=0; i(3)) ; j++) - { - v0[j] = (DataTypes::getCPos(p[index]))[j]; - v1[j] = (DataTypes::getCPos(p0[ext_index]))[j]; - } - - vertices.push_back(v0); - vertices.push_back(v1); - } - - //todo(dmarchal) because of https://github.com/sofa-framework/sofa/issues/64 - vparams->drawTool()->drawLines(vertices,5, d_springColor.getValue()); - -} - -template -void RestShapeSpringsForceField::addKToMatrix(const MechanicalParams* mparams, const MultiMatrixAccessor* matrix ) -{ - const MultiMatrixAccessor::MatrixRef mref = matrix->getMatrix(this->mstate); - BaseMatrix* mat = mref.matrix; - const unsigned int offset = mref.offset; - Real kFact = (Real)sofa::core::mechanicalparams::kFactorIncludingRayleighDamping(mparams, this->rayleighStiffness.getValue()); - - const VecReal& k = d_stiffness.getValue(); - const VecReal& k_a = d_angularStiffness.getValue(); - const auto activeDirections = d_activeDirections.getValue(); - - constexpr sofa::Size space_size = Deriv::spatial_dimensions; // == total_size if DataTypes = VecTypes - constexpr sofa::Size total_size = Deriv::total_size; - - sofa::Index curIndex = 0; - - for (sofa::Index index = 0; index < m_indices.size(); index++) + else { - curIndex = m_indices[index]; - - // translation - const auto vt = -kFact * k[(index < k.size()) * index]; - for (sofa::Size i = 0; i < space_size; i++) - { - // Contribution to the stiffness matrix are only taken into - // account for 1 values in d_activeDirections - if (activeDirections[i]) - mat->add(offset + total_size * curIndex + i, offset + total_size * curIndex + i, vt); - } - - // rotation (if applicable) - if constexpr (sofa::type::isRigidType()) - { - const auto vr = -kFact * k_a[(index < k_a.size()) * index]; - for (sofa::Size i = space_size; i < total_size; i++) - { - // Contribution to the stiffness matrix are only taken into - // account for 1 values in d_activeDirections - if (activeDirections[i]) - mat->add(offset + total_size * curIndex + i, offset + total_size * curIndex + i, vr); - } - } + return this->d_indices.getValue(); } } template -void RestShapeSpringsForceField::buildStiffnessMatrix(core::behavior::StiffnessMatrix* matrix) +const type::fixed_array::coord_total_size>& RestShapeSpringsForceField::getActiveDirections() const { - const VecReal& k = d_stiffness.getValue(); - const VecReal& k_a = d_angularStiffness.getValue(); - const auto activeDirections = d_activeDirections.getValue(); - - constexpr sofa::Size space_size = Deriv::spatial_dimensions; // == total_size if DataTypes = VecTypes - constexpr sofa::Size total_size = Deriv::total_size; - - auto dfdx = matrix->getForceDerivativeIn(this->mstate) - .withRespectToPositionsIn(this->mstate); - - for (const auto index : m_indices) - { - // translation - const auto vt = -k[(index < k.size()) * index]; - for(sofa::Index i = 0; i < space_size; i++) - { - dfdx(total_size * index + i, total_size * index + i) += vt; - } - - // rotation (if applicable) - if constexpr (sofa::type::isRigidType()) - { - const auto vr = -k_a[(index < k_a.size()) * index]; - for (sofa::Size i = space_size; i < total_size; ++i) - { - // Contribution to the stiffness matrix are only taken into - // account for 1 values in d_activeDirections - if (activeDirections[i]) - { - dfdx(total_size * index + i, total_size * index + i) += vr; - } - } - } - } + return d_activeDirections.getValue(); } -template -void RestShapeSpringsForceField::buildDampingMatrix( - core::behavior::DampingMatrix* matrix) -{ - SOFA_UNUSED(matrix); -} } // namespace sofa::component::solidmechanics::spring From 0754eb8aaf58d1e4b42e1de44111051f004bcde2 Mon Sep 17 00:00:00 2001 From: Paul Baksic Date: Tue, 10 Dec 2024 15:20:42 +0100 Subject: [PATCH 09/14] apply changes to scenes --- .../examples/ArticulatedArm/robot.py | 2 +- .../Geomagic/scenes/Geomagic-DeformableCubes.scn | 2 +- .../Geomagic/scenes/Geomagic-DeformableSphere.scn | 2 +- .../plugins/Geomagic/scenes/Geomagic-RigidCubes.scn | 2 +- ...Geomagic-RigidSkull-restShapeSpringForceField.scn | 2 +- .../plugins/Geomagic/scenes/Geomagic-RigidSphere.scn | 2 +- .../Geomagic/scenes/GeomagicEmulator-RigidCubes.scn | 2 +- .../PersistentContact/examples/instrument.xml | 4 ++-- .../PersistentContact/examples/instrument2.xml | 4 ++-- .../plugins/Sensable/examples/Old Examples/omni1.scn | 2 +- .../plugins/Sensable/examples/Old Examples/omni2.scn | 2 +- applications/plugins/Xitact/examples/1xitact.scn | 2 +- applications/plugins/Xitact/examples/2xitact2.scn | 2 +- .../plugins/Xitact/examples/XitactGrasping.scn | 4 ++-- .../examples/XitactGraspingWithForceFeedBack.scn | 4 ++-- .../Xitact/examples/XitactGrasping_coupledModel.scn | 8 ++++---- .../examples/XitactGrasping_coupledModel_withITP.scn | 12 ++++++------ applications/plugins/Xitact/examples/xitactTest.scn | 4 ++-- .../Lagrangian/FixedLagrangianConstaint_Vec3.scn | 2 +- .../FEM/RestShapeSpringsForceField3.scn | 2 +- .../Spring/RestShapeSpringsForceField2.scn | 2 +- .../Spring/angularSpringForceField.scn | 2 +- 22 files changed, 35 insertions(+), 35 deletions(-) diff --git a/applications/plugins/ArticulatedSystemPlugin/examples/ArticulatedArm/robot.py b/applications/plugins/ArticulatedSystemPlugin/examples/ArticulatedArm/robot.py index a8e7179a80f..8b72a19be18 100644 --- a/applications/plugins/ArticulatedSystemPlugin/examples/ArticulatedArm/robot.py +++ b/applications/plugins/ArticulatedSystemPlugin/examples/ArticulatedArm/robot.py @@ -88,7 +88,7 @@ def addRobot(self, name='Robot', translation=[0,0,0]): articulations.addObject('MechanicalObject', name='dofs', template='Vec1', rest_position=robot.getData('angles').getLinkPath(), position=initAngles) articulations.addObject('ArticulatedHierarchyContainer') articulations.addObject('UniformMass', totalMass=1) - articulations.addObject('RestShapeSpringsForceField', stiffness=1e10, points=list(range(6))) + articulations.addObject('RestShapeSpringsForceField', stiffness=1e10, indices=list(range(6))) # Rigid rigid = articulations.addChild('Rigid') diff --git a/applications/plugins/Geomagic/scenes/Geomagic-DeformableCubes.scn b/applications/plugins/Geomagic/scenes/Geomagic-DeformableCubes.scn index 8447dc4d862..3295ff9ddcd 100644 --- a/applications/plugins/Geomagic/scenes/Geomagic-DeformableCubes.scn +++ b/applications/plugins/Geomagic/scenes/Geomagic-DeformableCubes.scn @@ -126,7 +126,7 @@ - + diff --git a/applications/plugins/Geomagic/scenes/Geomagic-DeformableSphere.scn b/applications/plugins/Geomagic/scenes/Geomagic-DeformableSphere.scn index d3f88c411bb..a969ae31d7c 100644 --- a/applications/plugins/Geomagic/scenes/Geomagic-DeformableSphere.scn +++ b/applications/plugins/Geomagic/scenes/Geomagic-DeformableSphere.scn @@ -105,7 +105,7 @@ - + diff --git a/applications/plugins/Geomagic/scenes/Geomagic-RigidCubes.scn b/applications/plugins/Geomagic/scenes/Geomagic-RigidCubes.scn index b49b7dd575d..c667058822b 100644 --- a/applications/plugins/Geomagic/scenes/Geomagic-RigidCubes.scn +++ b/applications/plugins/Geomagic/scenes/Geomagic-RigidCubes.scn @@ -88,7 +88,7 @@ - + diff --git a/applications/plugins/Geomagic/scenes/Geomagic-RigidSkull-restShapeSpringForceField.scn b/applications/plugins/Geomagic/scenes/Geomagic-RigidSkull-restShapeSpringForceField.scn index 37ccac55ceb..7c956d6f764 100644 --- a/applications/plugins/Geomagic/scenes/Geomagic-RigidSkull-restShapeSpringForceField.scn +++ b/applications/plugins/Geomagic/scenes/Geomagic-RigidSkull-restShapeSpringForceField.scn @@ -59,7 +59,7 @@ - + diff --git a/applications/plugins/Geomagic/scenes/Geomagic-RigidSphere.scn b/applications/plugins/Geomagic/scenes/Geomagic-RigidSphere.scn index 880396565d4..fb730dd5bbc 100644 --- a/applications/plugins/Geomagic/scenes/Geomagic-RigidSphere.scn +++ b/applications/plugins/Geomagic/scenes/Geomagic-RigidSphere.scn @@ -76,7 +76,7 @@ - + diff --git a/applications/plugins/Geomagic/scenes/GeomagicEmulator-RigidCubes.scn b/applications/plugins/Geomagic/scenes/GeomagicEmulator-RigidCubes.scn index f950b7b60e1..f4d7be61acc 100644 --- a/applications/plugins/Geomagic/scenes/GeomagicEmulator-RigidCubes.scn +++ b/applications/plugins/Geomagic/scenes/GeomagicEmulator-RigidCubes.scn @@ -88,7 +88,7 @@ - + diff --git a/applications/plugins/PersistentContact/examples/instrument.xml b/applications/plugins/PersistentContact/examples/instrument.xml index fd67eb58411..551bf782cde 100644 --- a/applications/plugins/PersistentContact/examples/instrument.xml +++ b/applications/plugins/PersistentContact/examples/instrument.xml @@ -5,12 +5,12 @@ - + - + diff --git a/applications/plugins/PersistentContact/examples/instrument2.xml b/applications/plugins/PersistentContact/examples/instrument2.xml index f338f657865..f6a6e04273c 100644 --- a/applications/plugins/PersistentContact/examples/instrument2.xml +++ b/applications/plugins/PersistentContact/examples/instrument2.xml @@ -5,12 +5,12 @@ - + - + diff --git a/applications/plugins/Sensable/examples/Old Examples/omni1.scn b/applications/plugins/Sensable/examples/Old Examples/omni1.scn index b3978a75c3e..b635978b532 100644 --- a/applications/plugins/Sensable/examples/Old Examples/omni1.scn +++ b/applications/plugins/Sensable/examples/Old Examples/omni1.scn @@ -20,7 +20,7 @@ - + diff --git a/applications/plugins/Sensable/examples/Old Examples/omni2.scn b/applications/plugins/Sensable/examples/Old Examples/omni2.scn index 9d38b20cd1e..4e19ad2b2a7 100644 --- a/applications/plugins/Sensable/examples/Old Examples/omni2.scn +++ b/applications/plugins/Sensable/examples/Old Examples/omni2.scn @@ -15,7 +15,7 @@ - + diff --git a/applications/plugins/Xitact/examples/1xitact.scn b/applications/plugins/Xitact/examples/1xitact.scn index 66de05934b7..338be5d68d8 100644 --- a/applications/plugins/Xitact/examples/1xitact.scn +++ b/applications/plugins/Xitact/examples/1xitact.scn @@ -14,7 +14,7 @@ - + diff --git a/applications/plugins/Xitact/examples/2xitact2.scn b/applications/plugins/Xitact/examples/2xitact2.scn index e717de5cb74..4f62edbbb67 100644 --- a/applications/plugins/Xitact/examples/2xitact2.scn +++ b/applications/plugins/Xitact/examples/2xitact2.scn @@ -15,7 +15,7 @@ - + diff --git a/applications/plugins/Xitact/examples/XitactGrasping.scn b/applications/plugins/Xitact/examples/XitactGrasping.scn index a2b37a124ca..228bf45a0c6 100644 --- a/applications/plugins/Xitact/examples/XitactGrasping.scn +++ b/applications/plugins/Xitact/examples/XitactGrasping.scn @@ -85,7 +85,7 @@ - + @@ -104,7 +104,7 @@ - + diff --git a/applications/plugins/Xitact/examples/XitactGraspingWithForceFeedBack.scn b/applications/plugins/Xitact/examples/XitactGraspingWithForceFeedBack.scn index 3725346d2fe..7a15d6ce5ff 100644 --- a/applications/plugins/Xitact/examples/XitactGraspingWithForceFeedBack.scn +++ b/applications/plugins/Xitact/examples/XitactGraspingWithForceFeedBack.scn @@ -85,7 +85,7 @@ - + @@ -104,7 +104,7 @@ - + diff --git a/applications/plugins/Xitact/examples/XitactGrasping_coupledModel.scn b/applications/plugins/Xitact/examples/XitactGrasping_coupledModel.scn index 6431ef2d7d9..a08c6f561d8 100644 --- a/applications/plugins/Xitact/examples/XitactGrasping_coupledModel.scn +++ b/applications/plugins/Xitact/examples/XitactGrasping_coupledModel.scn @@ -85,7 +85,7 @@ - + @@ -104,7 +104,7 @@ - + @@ -202,7 +202,7 @@ - + @@ -221,7 +221,7 @@ - + diff --git a/applications/plugins/Xitact/examples/XitactGrasping_coupledModel_withITP.scn b/applications/plugins/Xitact/examples/XitactGrasping_coupledModel_withITP.scn index c9c2a905e1f..bf57c1fb18c 100644 --- a/applications/plugins/Xitact/examples/XitactGrasping_coupledModel_withITP.scn +++ b/applications/plugins/Xitact/examples/XitactGrasping_coupledModel_withITP.scn @@ -85,7 +85,7 @@ - + @@ -104,7 +104,7 @@ - + @@ -202,7 +202,7 @@ - + @@ -221,7 +221,7 @@ - + @@ -319,7 +319,7 @@ - + @@ -338,7 +338,7 @@ - + diff --git a/applications/plugins/Xitact/examples/xitactTest.scn b/applications/plugins/Xitact/examples/xitactTest.scn index 8b9ce1ecf9a..88bad4d4613 100644 --- a/applications/plugins/Xitact/examples/xitactTest.scn +++ b/applications/plugins/Xitact/examples/xitactTest.scn @@ -17,7 +17,7 @@ - + @@ -34,7 +34,7 @@ - + diff --git a/examples/Component/Constraint/Lagrangian/FixedLagrangianConstaint_Vec3.scn b/examples/Component/Constraint/Lagrangian/FixedLagrangianConstaint_Vec3.scn index 8e4fe5d1f71..2b1705c4c29 100644 --- a/examples/Component/Constraint/Lagrangian/FixedLagrangianConstaint_Vec3.scn +++ b/examples/Component/Constraint/Lagrangian/FixedLagrangianConstaint_Vec3.scn @@ -46,7 +46,7 @@ - + diff --git a/examples/Component/SolidMechanics/FEM/RestShapeSpringsForceField3.scn b/examples/Component/SolidMechanics/FEM/RestShapeSpringsForceField3.scn index 07a305404bd..00ecee50be0 100644 --- a/examples/Component/SolidMechanics/FEM/RestShapeSpringsForceField3.scn +++ b/examples/Component/SolidMechanics/FEM/RestShapeSpringsForceField3.scn @@ -21,7 +21,7 @@ diff --git a/examples/Component/SolidMechanics/Spring/RestShapeSpringsForceField2.scn b/examples/Component/SolidMechanics/Spring/RestShapeSpringsForceField2.scn index 1bc4f821d8c..07d1c58f388 100644 --- a/examples/Component/SolidMechanics/Spring/RestShapeSpringsForceField2.scn +++ b/examples/Component/SolidMechanics/Spring/RestShapeSpringsForceField2.scn @@ -26,7 +26,7 @@ - + diff --git a/examples/Component/SolidMechanics/Spring/angularSpringForceField.scn b/examples/Component/SolidMechanics/Spring/angularSpringForceField.scn index 6befcf8641f..8567ed4afb9 100644 --- a/examples/Component/SolidMechanics/Spring/angularSpringForceField.scn +++ b/examples/Component/SolidMechanics/Spring/angularSpringForceField.scn @@ -49,7 +49,7 @@ - + From a13b3ca8e5facfbb7dca114a165027d1e7040483 Mon Sep 17 00:00:00 2001 From: Paul Baksic Date: Wed, 11 Dec 2024 11:52:11 +0100 Subject: [PATCH 10/14] Remove duplication of the topology link in RestShapeSpringForceField --- .../component/solidmechanics/spring/RestShapeSpringsForceField.h | 1 - .../solidmechanics/spring/RestShapeSpringsForceField.inl | 1 - 2 files changed, 2 deletions(-) diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/RestShapeSpringsForceField.h b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/RestShapeSpringsForceField.h index 9860d236f94..a073c3f1671 100644 --- a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/RestShapeSpringsForceField.h +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/RestShapeSpringsForceField.h @@ -78,7 +78,6 @@ class RestShapeSpringsForceField : public FixedWeakConstraint core::objectmodel::DataCallback c_fixAllCallback; SingleLink, sofa::core::behavior::MechanicalState< DataTypes >, BaseLink::FLAG_STOREPATH|BaseLink::FLAG_STRONGLINK> l_restMState; - SingleLink, sofa::core::topology::BaseMeshTopology, BaseLink::FLAG_STOREPATH | BaseLink::FLAG_STRONGLINK> l_topology; /// BaseObject initialization method. void bwdInit() override ; diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/RestShapeSpringsForceField.inl b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/RestShapeSpringsForceField.inl index eded05ba9ce..c3fc5d30191 100644 --- a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/RestShapeSpringsForceField.inl +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/RestShapeSpringsForceField.inl @@ -56,7 +56,6 @@ RestShapeSpringsForceField::RestShapeSpringsForceField() "activeDirections", std::string("Directions in which the spring is active (default=[" + sofa::helper::join(FixedWeakConstraint::s_defaultActiveDirections, ',') + "])").c_str())) , d_externalIndices(initData(&d_externalIndices, "externalIndices","Indices from the external Mechanical State that define the rest shape springs")) , l_restMState(initLink("external_rest_shape", "rest_shape can be defined by the position of an external Mechanical State")) - , l_topology(initLink("topology", "Link to be set to the topology container in the component graph")) { c_fixAllCallback.addInput(&this->d_fixAll); c_fixAllCallback.addCallback([this]() From 885e98060dce9243d577fe1020e1984dfa4f6ec9 Mon Sep 17 00:00:00 2001 From: Paul Baksic Date: Thu, 23 Jan 2025 11:28:56 +0100 Subject: [PATCH 11/14] Squashed commit of the following: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit f8ed001c4a939d63bf85445c479df63274838a3b Author: Alex Bilger Date: Wed Jan 22 14:24:35 2025 +0100 [tests] Template method design pattern from BaseTest in derived classes (#5162) * [tests] Template method design pattern from BaseTest in derived classes * rename * use the deprecated function * Make SetUp and TearDown final * fix SofaCarving test * missing override commit 41bac37fe9554189ac6a751ad2159832905021f0 Author: Frederick Roy Date: Tue Jan 21 16:21:12 2025 +0100 [Helper] XCode: run in Debug (and load debug plugins) (#5168) remove deprecated cmake statement Co-authored-by: Hugo commit 723420cf40b5e5c3a3a0c25f600be30b7be04ab5 Author: Hugo Date: Tue Jan 21 16:18:00 2025 +0100 [Project] Start dev phase v25.06 (#5218) * Add ChangeLog for v24.12 * Bump dev version to v25.06.99 commit b445f5768b0aa9b8fc740e5ad33437d67b962831 Author: Frederick Roy Date: Tue Jan 21 16:16:25 2025 +0100 [Helper] WriteAccessorVector: add resize method with default filler value (#5228) add resize with default filler value commit 4ba3bbee02a2af960ced06ad906896baa5843af1 Author: Hugo Date: Tue Jan 21 15:58:00 2025 +0100 [Core] Move all LifeCycle classes in a dedicated namespace (#5225) Co-authored-by: Paul Baksic <30337881+bakpaul@users.noreply.github.com> commit eb9fe59f4219a5757b780261f540ee1fd0c4ae56 Author: Alex Bilger Date: Mon Jan 20 05:45:39 2025 +0100 [Type] Support structured binding for tuple-like types (#5208) * [Type] Support structured binding for tuple-like types * fix redefinition * fix test commit aedc7ffea53e1a1b406b5e1c32b344cf53d9dbd1 Author: Alex Bilger Date: Mon Jan 20 00:10:57 2025 +0100 [Type] Simplification of the Rebind trait using concepts (#5200) * [Type] Simplification of the Rebind trait using concepts * fix * fix and test * parentheses commit 1f11bee4fd3d2611374a0766048f9ec18fbdf3dd Author: Alex Bilger Date: Fri Jan 17 12:39:13 2025 +0100 [Type] Deprecate is_container trait (#5210) commit 3635db7b3daa2d774719075032d45774474e1b04 Author: Alex Bilger Date: Fri Jan 17 08:19:18 2025 +0100 [Type] Convert enable_if to concepts in fixed_array (#5205) commit 107221785bcf8889e6ba48255de743824f94824e Author: Alex Bilger Date: Fri Jan 17 05:42:59 2025 +0100 [Type] Convert is_fixed_array trait to concept (#5209) Co-authored-by: Frederick Roy commit d83d7eda04ec21daf816280034a3631d076c0b9f Author: Alex Bilger Date: Fri Jan 17 01:46:10 2025 +0100 [Type] Convert is_vector trait to concept (#5201) * [Type] Concert is_vector trait to concept * fix * use the concept commit 84e79d16059e78b533486715646f781143c1ac2d Author: Alex Bilger Date: Thu Jan 16 02:48:10 2025 +0100 [Type] A concept for isRigidType (#5199) * [Type] A concept for isRigidType * fix commit f28c570df80c8c479126a6f84150eec2d33177f6 Author: Hugo Date: Wed Jan 15 14:29:40 2025 +0100 [Helper] Fix warning in SelectableItem (#5163) * [Helper] Fix warning in SelectableItem * simpler code * simplify trait using concept * remove unused include --------- Co-authored-by: Alex Bilger commit bf730d23c958a72d06b486164604ec2baafca9ad Author: Hugo Date: Wed Jan 15 05:48:20 2025 +0100 [SolidMechanics] Make Data innerRadius of BeamFEMFF not required (#5203) commit 964136a2c24ba73ac9c77d11da2f8bb8967a3f4f Author: Hugo Date: Thu Jan 9 16:37:53 2025 +0100 [Mapping] Fix draw in RigidMapping (#5204) * [Mapping] Fix draw in RigidMapping * Apply suggestions from code review Co-authored-by: Frederick Roy --------- Co-authored-by: Frederick Roy commit 61d4924ad8c4a35efd88b6d9d9375f2995abd15d Author: Hugo Date: Thu Jan 9 14:35:29 2025 +0100 [Engine] Fix drawLines from ValuesFromPositions (#5206) commit 88320b856fea453ee6311d922f888446acda8018 Author: Alex Bilger Date: Thu Jan 9 07:39:53 2025 +0100 [Config] Introduce SOFA modules data structure (#5148) * Introduce SOFA modules data structure * apply everywhere * don't shadow with unique name * try to fix * generate unit tests automatically * remove dependency to string and make modules constexpr * restore conversion to string * constexpr * remove ambiguity * include modules.h only when necessary commit 1cbfa0351a8518236cc4244a13caed30c71b5d79 Author: Alex Bilger Date: Thu Jan 9 06:09:39 2025 +0100 [DefaultType] Aliases defined twice (#5198) commit 589ea722a36426112f63de90f94ac0a55c8ef27d Author: Alex Bilger Date: Thu Jan 9 01:34:09 2025 +0100 [Core] Isolate the intrusive reference counting (#5149) * [Core] Isolate the intrusive reference counting * add unit tests commit 7b3729f1e1d0e073e64d916f003ef0a64dbcb7bc Author: erik pernod Date: Wed Jan 8 23:33:30 2025 +0100 [Topology] Add function in BaseMeshTopology to compute all topology containers (#3368) * [Topology] rename method initTpology into initContainers and provide access to it from BaseMeshTopology * [MultiThreading] Replace call to getter to init topology by call to initContainers * Fix MeshTopology initContainer * REname initContainers into computeCrossElementBuffers * restore comment * Fix compilation * Update MeshTopology.cpp * Update MeshTopology.cpp * Update applications/plugins/MultiThreading/src/MultiThreading/component/collision/detection/algorithm/ParallelBVHNarrowPhase.cpp Co-authored-by: Hugo * Update MeshTopology, Keep method ComputeCorssElementBuffer to be call only if needed. Not called at init * Update MeshTopology.h * Update MeshTopology.cpp * Update MeshTopology.h --------- Co-authored-by: Hugo commit 292f5bce9482ecf9632d0a6abe139447e5af3986 Author: Paul Baksic <30337881+bakpaul@users.noreply.github.com> Date: Wed Jan 8 23:32:44 2025 +0100 [tools] Update post-install fixup to fix rpath (#5197) Update post-install fixup to fix rpath commit 0bc3fb947d9e7b880d2dd863af0aff42e4ca94ee Author: Damien Marchal Date: Mon Jan 6 15:30:09 2025 +0100 [GUI.Qt] Fix invalid color of the warning sign on object (#5190) Fix invalid color of the warning sign on object. commit b5c1f179778b06d8017aa7d2ab394c30fe0a34c9 Author: Hugo Date: Mon Dec 30 12:28:46 2024 +0100 [all] Fix additional warnings (#5180) * [all] Fix additional warnings * Update Sofa/Component/Collision/Response/Mapper/src/sofa/component/collision/response/mapper/init.cpp Co-authored-by: erik pernod * Update Sofa/Component/Collision/Response/Mapper/src/sofa/component/collision/response/mapper/init.cpp --------- Co-authored-by: erik pernod commit 82c4ea2a35689fd14b893a330fd5f3920f69c95d Author: Frederick Roy Date: Sun Dec 29 04:08:56 2024 +0900 [Multithreading] Apply new factory registration mechanism (#5178) * apply new register mechanism to multithreading * fix test * Apply suggestions from code review (update descriptions) Co-authored-by: Hugo --------- Co-authored-by: Hugo commit bcc5a16dd65819649a137e13cba949310c23b65f Author: Frederick Roy Date: Sat Dec 28 00:26:20 2024 +0900 [Helper] PluginManager: support loading from Non-MSVC Multi-Configuration Build (#5133) * remove collections from searchable paths * cmake: pass config info and use it for search paths * remove typo in template parameters * add support for minsizerel * test existence of directory before browsing * just use the string commit 07ce419939a110e39573e3593f68c6d982fc7d05 Author: erik pernod Date: Fri Dec 27 10:57:04 2024 +0100 [Sofa.GL] Fix OglModel crash when texture file is not found (#5182) [OglModel] Backup fix on texture not found crash commit 3711b9e806b63fde2361ceba0298c8c0c3493028 Author: erik pernod Date: Fri Dec 27 10:56:45 2024 +0100 [Core] Fix VisualState.h compilation on windows (#5181) [Visual] Fix VisualState.h compilation commit 238851c9e97237c8a9d30a62277ca8b63be56600 Author: Alex Bilger Date: Thu Dec 26 22:01:07 2024 +0100 [SofaCUDA] Explicit the CUDA C++ standard version to 17 (#5165) commit 30844d0078e1d509b9555491bfe7a1e7aba0610a Author: Paul Baksic <30337881+bakpaul@users.noreply.github.com> Date: Thu Dec 26 18:36:11 2024 +0100 [Plugins] Remove unsupported plugins: InvertibleFVM, SofaSimpleGUI and SensableEmulation (#5175) Remove unsupported plugins commit e2b94280b27e59533f1080d736fa93d66137a541 Author: Alex Bilger Date: Mon Dec 23 05:52:16 2024 +0100 [Testing] Mitigate plugin import leakage between tests (#5161) * [Testing] ScopedPlugin * add version with lists * unload plugins at tear down * use ScopedPlugin in a test as an example * support multiple calls to loadPlugins commit ca6655444308f62edc0573ba4a093a93271eae2b Author: Alex Bilger Date: Fri Dec 20 13:31:30 2024 +0100 [Config] Upgrade to C++20 (#5111) commit 642cdc6e3971d1d15e77c547f658e1339c0cd173 Author: Hugo Date: Fri Dec 20 04:54:50 2024 +0100 [Lagrangian] Remove unused data numericalTolerance in BLC (#5164) commit 3e508d34dabf30754009cbdb891f32136327ea07 Author: Alex Bilger Date: Fri Dec 20 04:53:09 2024 +0100 [Type] Test and clean BoundingBox (#5138) [Type] Test for BoundingBox commit 3ecd69c9374c47ef411e55072e5dc604bafe5134 Author: Alex Bilger Date: Wed Dec 18 17:24:59 2024 +0100 [SofaCUDA] Remove NO_CUDA condition (#5171) commit 4aca2680b8ace1c0504a0977343c89cbe1137fac Author: Frederick Roy Date: Wed Dec 18 21:28:35 2024 +0900 [Core, Simulation.Core] Registration: (re)enable deprecation warnings (#5155) * enable deprecation warnings for RegisterObject * enable runtime deprecation warnings * re enable disabled tests * fix typo * fix units tests * expect a warning when loading pluginA * load plugins once (avoiding registering several times) * add more info when warning the user of a deprecated registration * set warnings only if dev mode is enabled (SOFA_WITH_DEVTOOLS enabled) * apply new mechanism registration to AugmentedLagrangianConstraint commit 99df0a21e3764151270fe9f698387b599cb5618a Author: Alex Bilger Date: Tue Dec 17 15:26:53 2024 +0100 [Visual] Move, rename and clean OglCylinderModel (#5124) * move files * depreciation * rename * fix color management * remove string to color conversion and use the one from RGBAColor * remove unused private methods * cleaning * component change * remove Index alias * change the description * cache drawTool * remove calls to removed functions commit 02b33665a966ba1bee142e438fca937d21f62096 Author: Paul Baksic <30337881+bakpaul@users.noreply.github.com> Date: Tue Dec 17 02:06:24 2024 +0100 [All] Fix visualisation (#5152) * Fix visualisation * Remove inheritance from visual model; Remove the use of visitor for VisualStyle and instead call the fwdDraw directly in the two visualVisitor * Change methods name * Update Sofa/framework/Core/src/sofa/core/visual/BaseVisualStyle.h Co-authored-by: Alex Bilger --------- Co-authored-by: Alex Bilger commit 4eda9c72c7b16b665a02f0e8ff36d88d28e17f1f Author: Paul Baksic <30337881+bakpaul@users.noreply.github.com> Date: Fri Dec 13 15:52:24 2024 +0100 [Constraint.Lagrangian] Add augmented lagrangians (#5003) * Add AugmentedLagrangianConstraint response * accelerate GS convergence * Added virtualization layer for constraints, but linker issue arise. Need to fix it then add virutalization in Contact response * FIX linking * Add virtualization layer for contact response * Fix OBBCapsule * Fix Distance grid and simplify fix for OBB * Fix default friction used by tests * Try fix macos compilation * Add tag for augmented lagrangian * add details to the description of epsilon data * remove multiple registration in factory * MAke parameters struct final * USe data accessor instead * fix compilation * Try fix scene tests * Apply suggestions from code review Co-authored-by: Hugo * Add reference --------- Co-authored-by: Hugo commit 8ba12f01996dcfe4c9d8a9a3230cf833a50a57ef Author: Hugo Date: Fri Dec 13 03:22:11 2024 +0100 [examples] Make symplectic option explicit (#5159) [Explicit] Make symplectic option explicit commit 6ae972f797baed60ee64337d6bee42813c04f640 Author: Paul Baksic <30337881+bakpaul@users.noreply.github.com> Date: Wed Dec 11 13:56:40 2024 +0100 [Constraint.Projective] Make LinearVelocityProjectiveConstraint work with FreeMotionAL (#5025) * Implement missing methods to work in FreeMotionAnimationLoop and add feature to keep the constraint applied after all the key event have passed * Apply suggestions from code review Co-authored-by: Hugo * Use constexpr when possible * Add example scene * Simplify the example and added the complete scene in the demo folder * Refactor finished mechanism and fix behavior when finished * Update scenes and regression tests * Put the boolean test on wether the constraint is still active or not inside a method --------- Co-authored-by: Hugo commit 6141aac9c1e59608cf1cde4f760f32a3af6bb67c Author: Frederick Roy Date: Wed Dec 11 18:29:09 2024 +0900 [All] Remove spam warnings (#5156) * fix duplicated macro * fix unused variables * use new vecids --- CHANGELOG.md | 229 + CMakeLists.txt | 4 +- .../animationloop/FreeMotionAnimationLoop.h | 4 +- .../animationloop/MultiStepAnimationLoop.h | 6 +- Sofa/Component/CMakeLists.txt | 7 + .../algorithm/BruteForceBroadPhase.h | 4 +- .../collision/detection/algorithm/IncrSAP.h | 4 +- .../tests/CollisionPipeline_test.cpp | 8 +- .../intersection/BaseProximityIntersection.h | 6 +- .../detection/intersection/LocalMinDistance.h | 10 +- .../intersection/MinProximityIntersection.h | 12 +- .../intersection/NewProximityIntersection.h | 4 +- .../tests/LocalMinDistance_test.cpp | 8 +- .../component/collision/detection/init.cpp | 5 +- .../component/collision/geometry/LineModel.h | 6 +- .../component/collision/geometry/PointModel.h | 8 +- .../component/collision/geometry/RayModel.h | 4 +- .../collision/geometry/SphereModel.h | 6 +- .../Collision/Geometry/tests/Sphere_test.cpp | 8 +- .../Geometry/tests/Triangle_test.cpp | 4 +- .../Collision/Response/Contact/CMakeLists.txt | 6 + .../contact/AugmentedLagrangianResponse.cpp | 85 + .../contact/AugmentedLagrangianResponse.h | 67 + .../contact/AugmentedLagrangianResponse.inl | 65 + .../contact/BarycentricStickContact.h | 4 +- .../contact/BaseUnilateralContactResponse.h | 101 + .../contact/BaseUnilateralContactResponse.inl | 271 + .../response/contact/CollisionResponse.h | 6 +- .../response/contact/FrictionContact.cpp | 22 + .../response/contact/FrictionContact.h | 65 +- .../response/contact/FrictionContact.inl | 223 +- .../contact/RuleBasedContactManager.h | 4 +- .../response/contact/StickContactConstraint.h | 4 +- .../TetrahedronAugmentedLagrangianContact.cpp | 60 + .../contact/TetrahedronFrictionContact.cpp | 7 + .../Response/Contact/tests/CMakeLists.txt | 3 +- .../collision/response/mapper/init.cpp | 1 + .../component/collision/response/init.cpp | 5 +- .../src/sofa/component/collision/init.cpp | 7 +- .../PrecomputedConstraintCorrection.h | 14 +- .../UncoupledConstraintCorrection.h | 8 +- .../UncoupledConstraintCorrection.inl | 2 +- .../Lagrangian/Model/CMakeLists.txt | 6 + .../model/AugmentedLagrangianConstraint.cpp | 109 + .../model/AugmentedLagrangianConstraint.h | 87 + .../model/AugmentedLagrangianConstraint.inl | 70 + .../model/AugmentedLagrangianResolution.h | 74 + .../model/BaseContactLagrangianConstraint.h | 160 + .../model/BaseContactLagrangianConstraint.inl | 386 + .../model/BilateralLagrangianConstraint.cpp | 6 +- .../model/BilateralLagrangianConstraint.h | 13 +- .../model/BilateralLagrangianConstraint.inl | 2 - .../model/StopperLagrangianConstraint.h | 8 +- .../model/UnilateralLagrangianConstraint.cpp | 7 + .../model/UnilateralLagrangianConstraint.h | 122 +- .../model/UnilateralLagrangianConstraint.inl | 373 +- .../constraint/lagrangian/model/config.h.in | 10 + .../constraint/lagrangian/model/init.cpp | 2 + .../solver/GenericConstraintSolver.h | 32 +- .../lagrangian/solver/LCPConstraintSolver.h | 40 +- .../component/constraint/lagrangian/init.cpp | 7 +- .../AffineMovementProjectiveConstraint.h | 18 +- .../DirectionProjectiveConstraint.h | 8 +- .../FixedRotationProjectiveConstraint.h | 8 +- .../FixedTranslationProjectiveConstraint.h | 10 +- .../HermiteSplineProjectiveConstraint.h | 20 +- .../projective/LineProjectiveConstraint.h | 10 +- .../LinearMovementProjectiveConstraint.h | 10 +- .../LinearVelocityProjectiveConstraint.h | 27 +- .../LinearVelocityProjectiveConstraint.inl | 226 +- .../OscillatorProjectiveConstraint.h | 4 +- .../ParabolicProjectiveConstraint.h | 14 +- ...artialLinearMovementProjectiveConstraint.h | 28 +- .../projective/PlaneProjectiveConstraint.h | 10 +- .../projective/PointProjectiveConstraint.h | 10 +- ...ositionBasedDynamicsProjectiveConstraint.h | 10 +- .../SkeletalMotionProjectiveConstraint.h | 10 +- ...ffineMovementProjectiveConstraint_test.cpp | 2 +- .../DirectionProjectiveConstraint_test.cpp | 4 +- .../tests/FixedProjectiveConstraint_test.cpp | 6 +- .../tests/LineProjectiveConstraint_test.cpp | 4 +- .../tests/PlaneProjectiveConstraint_test.cpp | 4 +- .../tests/PointProjectiveConstraint_test.cpp | 4 +- .../src/sofa/component/constraint/init.cpp | 5 +- .../sofa/component/controller/Controller.h | 4 +- .../controller/MechanicalStateController.h | 10 +- .../sofa/component/engine/analyze/Distances.h | 32 +- .../engine/analyze/HausdorffDistance.h | 14 +- .../component/engine/analyze/ShapeMatching.h | 18 +- .../Analyze/tests/AverageCoord_test.cpp | 2 +- .../Analyze/tests/ClusteringEngine_test.cpp | 2 +- .../engine/generate/MeshTetraStuffing.h | 26 +- .../ExtrudeEdgesAndGenerateQuads_test.cpp | 2 +- .../Generate/tests/MergePoints_test.cpp | 2 +- .../sofa/component/engine/select/BaseROI.h | 4 +- .../sofa/component/engine/select/MeshROI.h | 8 +- .../sofa/component/engine/select/MeshROI.inl | 4 +- .../engine/select/MeshSubsetEngine.h | 20 +- .../sofa/component/engine/select/SphereROI.h | 14 +- .../engine/select/ValuesFromPositions.inl | 3 +- .../Engine/Select/tests/BoxROI_test.cpp | 11 +- .../Select/tests/ComplementaryROI_test.cpp | 2 +- .../Engine/Select/tests/MeshROI_test.cpp | 10 +- .../Select/tests/MeshSubsetEngine_test.cpp | 6 +- .../Engine/Select/tests/PlaneROI_test.cpp | 2 +- .../Engine/Select/tests/SphereROI_test.cpp | 2 +- .../Transform/tests/DifferenceEngine_test.cpp | 2 +- .../Transform/tests/DilateEngine_test.cpp | 2 +- .../Transform/tests/SmoothMeshEngine_test.cpp | 2 +- .../Engine/src/sofa/component/engine/init.cpp | 9 +- .../sofa/component/haptics/LCPForceFeedback.h | 6 +- .../sofa/component/io/mesh/BlenderExporter.h | 12 +- .../sofa/component/io/mesh/GridMeshCreator.h | 6 +- .../sofa/component/io/mesh/MeshSTLLoader.h | 6 +- .../sofa/component/io/mesh/MeshTrianLoader.h | 10 +- .../component/io/mesh/OffSequenceLoader.h | 6 +- .../component/io/mesh/StringMeshCreator.h | 4 +- .../src/sofa/component/io/mesh/VTKExporter.h | 28 +- .../sofa/component/io/mesh/VoxelGridLoader.h | 20 +- .../IO/Mesh/tests/MeshExporter_test.cpp | 8 +- .../IO/Mesh/tests/MeshGmshLoader_test.cpp | 2 +- .../IO/Mesh/tests/MeshXspLoader_test.cpp | 2 +- .../IO/Mesh/tests/STLExporter_test.cpp | 10 +- .../tests/VisualModelOBJExporter_test.cpp | 4 +- .../IO/src/sofa/component/io/init.cpp | 3 +- .../direct/PrecomputedLinearSolver.h | 6 +- .../linearsolver/direct/SVDLinearSolver.h | 8 +- .../Direct/tests/SparseLDLSolver_test.cpp | 22 +- .../linearsolver/iterative/PCGLinearSolver.h | 14 +- .../PrecomputedWarpPreconditioner.h | 12 +- .../preconditioner/SSORPreconditioner.h | 4 +- .../src/sofa/component/linearsolver/init.cpp | 9 +- .../LinearSystem/tests/MappingGraph_test.cpp | 2 +- .../mapping/linear/BarycentricMappingRigid.h | 6 +- .../linear/DeformableOnRigidFrameMapping.h | 14 +- .../mapping/linear/SkinningMapping.h | 14 +- .../component/mapping/linear/SubsetMapping.h | 16 +- .../mapping/linear/SubsetMultiMapping.h | 4 +- .../component/mapping/linear/TubularMapping.h | 8 +- .../Linear/tests/BarycentricMapping_test.cpp | 2 +- .../nonlinear/DistanceFromTargetMapping.h | 8 +- .../mapping/nonlinear/DistanceMapping.h | 6 +- .../mapping/nonlinear/DistanceMultiMapping.h | 6 +- .../mapping/nonlinear/RigidMapping.inl | 5 +- .../NonLinear/tests/RigidMapping_test.cpp | 2 +- .../tests/SquareDistanceMapping_test.cpp | 4 +- .../src/sofa/component/mapping/init.cpp | 5 +- .../Mass/tests/DiagonalMass_test.cpp | 12 +- .../Mass/tests/MeshMatrixMass_test.cpp | 12 +- .../Component/Mass/tests/UniformMass_test.cpp | 8 +- .../mechanicalload/EdgePressureForceField.h | 24 +- .../OscillatingTorsionPressureForceField.h | 22 +- .../mechanicalload/QuadPressureForceField.h | 16 +- .../mechanicalload/SphereForceField.h | 18 +- .../SurfacePressureForceField.h | 28 +- .../TaitSurfacePressureForceField.h | 38 +- .../mechanicalload/TorsionForceField.h | 10 +- .../TrianglePressureForceField.h | 12 +- .../UniformVelocityDampingForceField.h | 4 +- .../tests/ConstantForceField_test.cpp | 14 +- .../tests/PlaneForceField_test.cpp | 8 +- .../tests/SkeletalMotionConstraint_test.cpp | 4 +- .../odesolver/backward/EulerImplicitSolver.h | 12 +- .../backward/VariationalSymplecticSolver.h | 22 +- .../tests/EulerImplicitSolverStatic_test.cpp | 24 +- .../EulerImplicitSolver_withDamping_test.cpp | 10 +- .../tests/SpringSolverDynamic_test.cpp | 2 +- .../Backward/tests/StaticSolver_test.cpp | 6 +- .../forward/CentralDifferenceSolver.h | 4 +- .../odesolver/forward/DampVelocitySolver.h | 6 +- .../odesolver/testing/ODESolverSpringTest.h | 13 +- .../src/sofa/component/odesolver/init.cpp | 5 +- .../component/playback/InputEventReader.h | 12 +- .../sofa/component/playback/ReadTopology.h | 8 +- .../sofa/component/playback/WriteTopology.h | 12 +- .../Playback/tests/ReadState_test.cpp | 8 +- .../Playback/tests/WriteState_test.cpp | 8 +- .../tests/AddResourceRepository_test.cpp | 4 +- .../tests/MakeAliasComponent_test.cpp | 2 +- .../tests/MakeDataAliasComponent_test.cpp | 4 +- .../tests/MessageHandlerComponent_test.cpp | 2 +- .../component/setting/BackgroundSetting.h | 4 +- .../component/setting/MouseButtonSetting.h | 4 +- .../setting/SofaDefaultPathSetting.h | 4 +- .../src/sofa/component/setting/StatsSetting.h | 8 +- .../sofa/component/setting/ViewerSetting.h | 10 +- .../fem/elastic/BeamFEMForceField.h | 4 +- .../fem/elastic/BeamFEMForceField.inl | 3 - .../FastTetrahedralCorotationalForceField.h | 22 +- .../fem/elastic/HexahedralFEMForceField.h | 8 +- .../elastic/HexahedralFEMForceFieldAndMass.h | 14 +- .../fem/elastic/HexahedronFEMForceField.h | 20 +- .../fem/elastic/QuadBendingFEMForceField.h | 16 +- .../TetrahedralCorotationalFEMForceField.h | 24 +- .../fem/elastic/TetrahedronFEMForceField.h | 46 +- .../fem/elastic/TriangleFEMForceField.h | 14 +- .../TriangularAnisotropicFEMForceField.h | 12 +- .../fem/elastic/TriangularFEMForceField.h | 28 +- .../tests/BaseTetrahedronFEMForceField_test.h | 44 +- .../Elastic/tests/BeamFEMForceField_test.cpp | 6 +- .../tests/TriangleFEMForceField_test.cpp | 42 +- ...perelasticityFEMForceField_params_test.cpp | 2 +- ...yperelasticityFEMForceField_scene_test.cpp | 2 +- .../component/solidmechanics/fem/init.cpp | 7 +- .../spring/AngularSpringForceField.h | 12 +- .../spring/FrameSpringForceField.h | 8 +- .../spring/GearSpringForceField.h | 10 +- .../spring/JointSpringForceField.h | 6 +- .../spring/QuadBendingSprings.h | 4 +- .../spring/RestShapeSpringsForceField.inl | 1 + .../spring/TriangularBendingSprings.h | 4 +- .../TriangularBiquadraticSpringsForceField.h | 20 +- .../TriangularQuadraticSpringsForceField.h | 16 +- .../spring/VectorSpringForceField.h | 10 +- ...ynomialRestShapeSpringsForceField_test.cpp | 6 +- .../tests/RestShapeSpringsForceField_test.cpp | 8 +- .../tests/TriangularBendingSprings_test.cpp | 8 +- .../TetrahedralTensorMassForceField.h | 8 +- .../TriangularTensorMassForceField.h | 8 +- .../simutests/AffinePatch_test.cpp | 2 +- .../simutests/LinearElasticity_test.cpp | 4 +- .../sofa/component/solidmechanics/init.cpp | 7 +- .../component/statecontainer/MappedObject.h | 6 +- .../container/constant/CubeTopology.h | 16 +- .../container/constant/MeshTopology.cpp | 75 +- .../container/constant/MeshTopology.h | 30 +- .../container/constant/SphereQuadTopology.h | 6 +- .../DynamicSparseGridTopologyContainer.h | 14 +- .../dynamic/EdgeSetTopologyContainer.cpp | 4 +- .../dynamic/EdgeSetTopologyContainer.h | 6 +- .../HexahedronSetTopologyContainer.cpp | 6 +- .../dynamic/HexahedronSetTopologyContainer.h | 4 +- .../dynamic/PointSetTopologyContainer.h | 4 +- .../dynamic/QuadSetTopologyContainer.cpp | 6 +- .../dynamic/QuadSetTopologyContainer.h | 4 +- .../TetrahedronSetTopologyContainer.cpp | 6 +- .../dynamic/TetrahedronSetTopologyContainer.h | 4 +- .../dynamic/TriangleSetTopologyContainer.cpp | 6 +- .../dynamic/TriangleSetTopologyContainer.h | 4 +- .../TetrahedronNumericalIntegration_test.cpp | 4 +- .../TriangleNumericalIntegration_test.cpp | 4 +- .../grid/SparseGridMultipleTopology.h | 12 +- .../grid/SparseGridRamificationTopology.h | 4 +- .../container/grid/SparseGridTopology.h | 28 +- .../Grid/tests/SparseGridTopology_test.cpp | 2 +- .../component/topology/container/init.cpp | 7 +- .../mapping/Hexa2QuadTopologicalMapping.h | 4 +- .../mapping/Hexa2TetraTopologicalMapping.h | 4 +- .../mapping/SubsetTopologicalMapping.h | 38 +- .../Tetra2TriangleTopologicalMapping.h | 8 +- .../topology/testing/fake_TopologyScene.h | 13 +- .../utility/TopologicalChangeProcessor.h | 34 +- .../tests/TopologicalChangeProcessor_test.cpp | 4 +- .../Utility/tests/TopologyChecker_test.cpp | 4 +- .../src/sofa/component/topology/init.cpp | 7 +- Sofa/Component/Visual/CMakeLists.txt | 2 + .../src/sofa/component/visual/BaseCamera.h | 36 +- .../component/visual/CylinderVisualModel.cpp | 94 + .../component/visual/CylinderVisualModel.h | 61 + .../sofa/component/visual/InteractiveCamera.h | 8 +- .../sofa/component/visual/RecordedCamera.h | 38 +- .../sofa/component/visual/VisualModelImpl.h | 56 +- .../src/sofa/component/visual/VisualStyle.cpp | 17 +- .../src/sofa/component/visual/VisualStyle.h | 17 +- .../sofa/component/visual/VisualTransform.h | 6 +- .../Visual/src/sofa/component/visual/init.cpp | 2 + Sofa/Component/src/sofa/component/init.cpp | 43 +- Sofa/Component/test/CMakeLists.txt | 37 + Sofa/Component/test/Modules_test.cpp | 25 + .../Component/test/Modules_test.h.in | 13 +- .../Rendering2D/tests/OglLabel_test.cpp | 4 +- Sofa/GL/Component/Rendering3D/CMakeLists.txt | 1 - .../rendering3d/OglCylinderModel.cpp | 163 - .../component/rendering3d/OglCylinderModel.h | 68 +- .../gl/component/rendering3d/OglModel.cpp | 39 +- .../sofa/gl/component/rendering3d/OglModel.h | 4 +- .../sofa/gl/component/rendering3d/init.cpp | 2 - .../Rendering3D/tests/ClipPlane_test.cpp | 6 +- .../Shader/tests/LightManager_test.cpp | 8 +- Sofa/GL/Component/Shader/tests/Light_test.cpp | 6 +- .../ConstraintAttachBodyPerformer.inl | 2 +- .../sofa/gui/qt/GraphListenerQListView.cpp | 7 +- .../Qt/src/sofa/gui/qt/SimpleDataWidget.cpp | 4 +- Sofa/framework/Config/CMakeLists.txt | 5 +- .../Config/cmake/SofaMacrosUtils.cmake | 8 +- Sofa/framework/Config/src/sofa/Modules.h | 179 + Sofa/framework/Core/CMakeLists.txt | 11 +- .../Core/src/sofa/core/IntrusiveObject.cpp | 26 +- .../Core/src/sofa/core/IntrusiveObject.h | 68 +- .../Core/src/sofa/core/ObjectFactory.cpp | 7 +- .../Core/src/sofa/core/ObjectFactory.h | 4 +- .../sofa/core/behavior/BaseConstraintSet.h | 4 +- .../sofa/core/behavior/BaseMechanicalState.h | 4 +- Sofa/framework/Core/src/sofa/core/config.h.in | 2 +- .../Core/src/sofa/core/objectmodel/Base.cpp | 15 +- .../Core/src/sofa/core/objectmodel/Base.h | 20 +- .../src/sofa/core/objectmodel/BaseContext.h | 2 +- .../Core/src/sofa/core/objectmodel/BaseNode.h | 2 + .../{ => lifecycle}/DeprecatedData.cpp | 2 +- .../{ => lifecycle}/DeprecatedData.h | 0 .../objectmodel/{ => lifecycle}/RemovedData.h | 2 +- .../objectmodel/{ => lifecycle}/RenamedData.h | 2 +- .../sofa/core/topology/BaseMeshTopology.cpp | 1 - .../src/sofa/core/topology/BaseMeshTopology.h | 3 + .../src/sofa/core/visual/BaseVisualStyle.h | 69 +- .../Core/src/sofa/core/visual/VisualState.h | 2 +- Sofa/framework/Core/test/DataEngine_test.cpp | 2 +- Sofa/framework/Core/test/Engine_test.cpp | 2 +- .../Core/test/IntrusiveObject_test.cpp | 73 + .../Core/test/ObjectFactoryJson_test.cpp | 3 +- Sofa/framework/Core/test/TrackedData_test.cpp | 2 +- Sofa/framework/Core/test/VecId_test.cpp | 4 + .../BaseObjectDescription_test.cpp | 4 +- .../test/objectmodel/DataFileName_test.cpp | 2 +- .../Core/test/objectmodel/DataLink_test.cpp | 4 +- .../test/objectmodel/RemovedData_test.cpp | 2 +- .../Core/test/objectmodel/SingleLink_test.cpp | 2 +- .../src/sofa/defaulttype/RigidTypes.h | 7 + .../src/sofa/defaulttype/VecTypes.h | 13 + .../DefaultType/src/sofa/defaulttype/fwd.h | 9 - Sofa/framework/Helper/CMakeLists.txt | 22 +- .../Helper/simutest/AdvancedTimer_test.cpp | 2 +- .../src/sofa/helper/ComponentChange.cpp | 864 +- .../Helper/src/sofa/helper/OptionsGroup.h | 9 +- .../Helper/src/sofa/helper/SelectableItem.h | 35 +- .../src/sofa/helper/accessor/ReadAccessor.h | 9 +- .../helper/accessor/ReadAccessorFixedArray.h | 2 +- .../sofa/helper/accessor/ReadAccessorVector.h | 2 +- .../src/sofa/helper/accessor/WriteAccessor.h | 9 +- .../helper/accessor/WriteAccessorFixedArray.h | 2 +- .../helper/accessor/WriteAccessorVector.h | 3 +- .../sofa/helper/accessor/WriteOnlyAccessor.h | 5 +- .../src/sofa/helper/system/FileRepository.cpp | 4 +- .../src/sofa/helper/system/PluginManager.cpp | 96 +- .../framework/Helper/test/io/MeshOBJ_test.cpp | 4 +- .../Helper/test/io/STBImage_test.cpp | 4 +- .../Helper/test/io/XspLoader_test.cpp | 4 +- .../Helper/test/system/PluginManager_test.cpp | 22 +- .../BaseMatrix_test.h | 4 +- ...essedRowSparseMatrixConstraintEigenUtils.h | 2 +- .../CompressedRowSparseMatrixMechanical.h | 2 +- .../SimpleApi/test/SimpleApi_test.cpp | 4 +- .../Core/simutest/NodeContext_test.cpp | 4 +- .../sofa/simulation/MechanicalOperations.h | 2 +- .../Core/src/sofa/simulation/Node.cpp | 7 + .../Core/src/sofa/simulation/Node.h | 3 + .../src/sofa/simulation/RequiredPlugin.cpp | 11 +- .../Core/src/sofa/simulation/Simulation.cpp | 3 +- .../src/sofa/simulation/VisualVisitor.cpp | 46 +- .../Core/src/sofa/simulation/VisualVisitor.h | 12 +- .../Core/src/sofa/simulation/config.h.in | 4 +- ...lPropagateOnlyPositionAndVelocityVisitor.h | 2 +- .../MechanicalPropagateOnlyVelocityVisitor.h | 2 +- .../Core/test/RequiredPlugin_test.cpp | 8 +- .../Graph/test/MutationListener_test.cpp | 4 +- .../simutest/parallel_scenes_test.cpp | 71 +- Sofa/framework/Testing/CMakeLists.txt | 2 + .../Testing/src/sofa/testing/BaseTest.cpp | 11 +- .../Testing/src/sofa/testing/BaseTest.h | 17 +- .../Testing/src/sofa/testing/ScopedPlugin.cpp | 60 + .../Testing/src/sofa/testing/ScopedPlugin.h | 68 + .../Testing/src/sofa/testing/config.h.in | 17 + Sofa/framework/Testing/test/CMakeLists.txt | 3 +- .../Testing/test/ScopedPlugin_test.cpp | 59 + .../Type/src/sofa/type/BoundingBox.cpp | 50 +- .../Type/src/sofa/type/BoundingBox.h | 79 +- Sofa/framework/Type/src/sofa/type/MatSym.h | 2 +- Sofa/framework/Type/src/sofa/type/Quat.h | 42 +- Sofa/framework/Type/src/sofa/type/RGBAColor.h | 45 +- Sofa/framework/Type/src/sofa/type/Vec.h | 33 + Sofa/framework/Type/src/sofa/type/config.h.in | 18 + .../Type/src/sofa/type/fixed_array.h | 10 +- .../Type/src/sofa/type/isRigidType.h | 60 +- .../Type/src/sofa/type/trait/Rebind.h | 36 +- .../Type/src/sofa/type/trait/is_container.h | 5 + .../Type/src/sofa/type/trait/is_fixed_array.h | 36 +- .../Type/src/sofa/type/trait/is_vector.h | 36 +- Sofa/framework/Type/test/BoundingBox_test.cpp | 123 + Sofa/framework/Type/test/CMakeLists.txt | 2 + Sofa/framework/Type/test/MatSym_test.cpp | 2 +- Sofa/framework/Type/test/Quater_test.cpp | 10 +- Sofa/framework/Type/test/RGBAColor_test.cpp | 15 + Sofa/framework/Type/test/Rebind_test.cpp | 59 + Sofa/framework/Type/test/StrongType_test.cpp | 1 + Sofa/framework/Type/test/VecTypes_test.cpp | 9 +- Sofa/framework/Type/test/vector_test.cpp | 18 +- .../CImgPlugin_test/ImageCImg_test.cpp | 4 +- applications/plugins/CMakeLists.txt | 5 +- .../response/contact/CapsuleContact.cpp | 13 + .../response/contact/OBBContact.cpp | 7 + .../ExternalProjectConfig.cmake.in | 14 - .../src/MultiThreading/DataExchange.cpp | 34 +- .../src/MultiThreading/MeanComputation.cpp | 16 +- .../AnimationLoopParallelScheduler.cpp | 8 +- .../algorithm/ParallelBVHNarrowPhase.cpp | 27 +- .../ParallelBruteForceBroadPhase.cpp | 10 +- .../iterative/ParallelCGLinearSolver.cpp | 11 +- .../mapping/linear/BeamLinearMapping_mt.cpp | 10 +- .../ParallelHexahedronFEMForceField.cpp | 12 +- .../ParallelTetrahedronFEMForceField.cpp | 10 +- .../ParallelTetrahedronFEMForceField.h | 2 +- .../ParallelTetrahedronFEMForceField.inl | 2 +- .../spring/ParallelMeshSpringForceField.cpp | 11 +- .../spring/ParallelSpringForceField.cpp | 15 +- .../src/MultiThreading/config.h.in | 9 +- .../src/MultiThreading/initMultiThreading.cpp | 70 +- .../ParallelImplementationsRegistry_test.cpp | 12 +- .../SceneCreator_test/SceneCreator_test.cpp | 6 +- .../src/SceneCreator/SceneCreator.cpp | 11 +- .../plugins/SensableEmulation/CMakeLists.txt | 43 - .../SensableEmulation/NewOmniDriverEmu.cpp | 547 - .../SensableEmulation/NewOmniDriverEmu.h | 162 - .../SensableEmulation/OmniDriverEmu.cpp | 589 - .../plugins/SensableEmulation/OmniDriverEmu.h | 173 - .../PluginSensableEmulation.txt | 10 - .../examples/SimpleBox-Method2.scn | 75 - .../examples/SimpleBox-Method2.scn.view | 19 - .../examples/data/mesh/box.obj | 20 - .../examples/data/mesh/dental_instrument.obj | 1194 - .../examples/testOmniDriverEmu.scn | 30 - .../SensableEmulation/pthread/pthread.h | 1368 - .../SensableEmulation/pthread/pthreadVC2.dll | Bin 55808 -> 0 bytes .../SensableEmulation/pthread/pthreadVC2.lib | Bin 30334 -> 0 bytes .../plugins/SensableEmulation/pthread/sched.h | 183 - .../SensableEmulation/pthread/semaphore.h | 169 - applications/plugins/SofaCUDA/CMakeLists.txt | 2 +- .../plugins/SofaCUDA/sofa/gpu/cuda/mycuda.cu | 138 - .../SofaCarving_test/SofaCarving_test.cpp | 5 +- .../RegisterModelToCollisionFactory.cpp | 1 + .../plugins/SofaSimpleGUI/CMakeLists.txt | 44 - applications/plugins/SofaSimpleGUI/Camera.cpp | 196 - applications/plugins/SofaSimpleGUI/Camera.h | 86 - .../plugins/SofaSimpleGUI/Interactor.cpp | 35 - .../plugins/SofaSimpleGUI/Interactor.h | 58 - .../plugins/SofaSimpleGUI/PickedPoint.h | 64 - applications/plugins/SofaSimpleGUI/README.txt | 8 - .../plugins/SofaSimpleGUI/SimpleGUI.dox | 45 - applications/plugins/SofaSimpleGUI/SofaGL.cpp | 322 - applications/plugins/SofaSimpleGUI/SofaGL.h | 153 - .../plugins/SofaSimpleGUI/SofaGlutAnt.zip | Bin 5452 -> 0 bytes .../plugins/SofaSimpleGUI/SofaScene.cpp | 154 - .../plugins/SofaSimpleGUI/SofaScene.h | 120 - .../SofaSimpleGUIConfig.cmake.in | 15 - .../SofaSimpleGUI/SpringInteractor.cpp | 68 - .../plugins/SofaSimpleGUI/SpringInteractor.h | 54 - .../SofaSimpleGUI/VisualPickVisitor.cpp | 138 - .../plugins/SofaSimpleGUI/VisualPickVisitor.h | 43 - .../plugins/SofaSimpleGUI/doc/Doxyfile | 1918 -- .../SofaSimpleGUI/doc/DoxygenLayout.xml | 185 - .../plugins/SofaSimpleGUI/doc/SimpleGUI.png | Bin 18862 -> 0 bytes .../plugins/SofaSimpleGUI/doc/index.html | 154 - .../plugins/SofaSimpleGUI/examples/liver.scn | 42 - .../plugins/SofaSimpleGUI/examples/oneTet.scn | 32 - .../image/image_test/DataImage_test.cpp | 2 +- .../image/image_test/ImageEngine_test.cpp | 2 +- .../SceneChecking/tests/SceneChecker_test.cpp | 9 +- .../SofaPhysicsAPI/SofaPhysicsSimulation.cpp | 15 +- .../runSofa/runSofa_test/runSofa_test.cpp | 4 +- .../LinearVelocityProjectiveConstraint.scn | 70 + .../Forward/EulerSymplecticSolver.scn | 2 +- .../EulerSymplecticSolver_diagonal.scn | 2 +- .../Component/Visual/CylinderVisualModel.scn | 8 + .../Component/Visual/OglCylinderModel.scn | 9 - examples/Demos/SofaWasher.scn | 115 + ...allingBeamAugmentedLagrangianCollision.scn | 92 + .../RegressionStateScenes.regression-tests | 1 + share/mesh/SOFA_collision_center.obj | 331 + share/mesh/SOFA_collision_no_face.obj | 663 + share/mesh/SOFA_surface.obj | 2409 ++ share/mesh/SOFA_volume.vtk | 27110 ++++++++++++++++ .../macos-postinstall-fixup.sh | 8 +- 471 files changed, 36486 insertions(+), 12018 deletions(-) create mode 100644 Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/AugmentedLagrangianResponse.cpp create mode 100644 Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/AugmentedLagrangianResponse.h create mode 100644 Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/AugmentedLagrangianResponse.inl create mode 100644 Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/BaseUnilateralContactResponse.h create mode 100644 Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/BaseUnilateralContactResponse.inl create mode 100644 Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/TetrahedronAugmentedLagrangianContact.cpp create mode 100644 Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/AugmentedLagrangianConstraint.cpp create mode 100644 Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/AugmentedLagrangianConstraint.h create mode 100644 Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/AugmentedLagrangianConstraint.inl create mode 100644 Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/AugmentedLagrangianResolution.h create mode 100644 Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/BaseContactLagrangianConstraint.h create mode 100644 Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/BaseContactLagrangianConstraint.inl create mode 100644 Sofa/Component/Visual/src/sofa/component/visual/CylinderVisualModel.cpp create mode 100644 Sofa/Component/Visual/src/sofa/component/visual/CylinderVisualModel.h create mode 100644 Sofa/Component/test/CMakeLists.txt create mode 100644 Sofa/Component/test/Modules_test.cpp rename applications/plugins/SofaSimpleGUI/config.h.in => Sofa/Component/test/Modules_test.h.in (86%) delete mode 100644 Sofa/GL/Component/Rendering3D/src/sofa/gl/component/rendering3d/OglCylinderModel.cpp create mode 100644 Sofa/framework/Config/src/sofa/Modules.h rename applications/plugins/SensableEmulation/config.h => Sofa/framework/Core/src/sofa/core/IntrusiveObject.cpp (83%) rename applications/plugins/SensableEmulation/initSensableEmulation.cpp => Sofa/framework/Core/src/sofa/core/IntrusiveObject.h (61%) rename Sofa/framework/Core/src/sofa/core/objectmodel/{ => lifecycle}/DeprecatedData.cpp (97%) rename Sofa/framework/Core/src/sofa/core/objectmodel/{ => lifecycle}/DeprecatedData.h (100%) rename Sofa/framework/Core/src/sofa/core/objectmodel/{ => lifecycle}/RemovedData.h (97%) rename Sofa/framework/Core/src/sofa/core/objectmodel/{ => lifecycle}/RenamedData.h (99%) rename applications/plugins/SofaSimpleGUI/initSimpleGUI.cpp => Sofa/framework/Core/src/sofa/core/visual/BaseVisualStyle.h (58%) create mode 100644 Sofa/framework/Core/test/IntrusiveObject_test.cpp create mode 100644 Sofa/framework/Testing/src/sofa/testing/ScopedPlugin.cpp create mode 100644 Sofa/framework/Testing/src/sofa/testing/ScopedPlugin.h create mode 100644 Sofa/framework/Testing/test/ScopedPlugin_test.cpp create mode 100644 Sofa/framework/Type/test/BoundingBox_test.cpp create mode 100644 Sofa/framework/Type/test/Rebind_test.cpp delete mode 100644 applications/plugins/InvertibleFVM/ExternalProjectConfig.cmake.in delete mode 100644 applications/plugins/SensableEmulation/CMakeLists.txt delete mode 100644 applications/plugins/SensableEmulation/NewOmniDriverEmu.cpp delete mode 100644 applications/plugins/SensableEmulation/NewOmniDriverEmu.h delete mode 100644 applications/plugins/SensableEmulation/OmniDriverEmu.cpp delete mode 100644 applications/plugins/SensableEmulation/OmniDriverEmu.h delete mode 100644 applications/plugins/SensableEmulation/PluginSensableEmulation.txt delete mode 100644 applications/plugins/SensableEmulation/examples/SimpleBox-Method2.scn delete mode 100644 applications/plugins/SensableEmulation/examples/SimpleBox-Method2.scn.view delete mode 100644 applications/plugins/SensableEmulation/examples/data/mesh/box.obj delete mode 100644 applications/plugins/SensableEmulation/examples/data/mesh/dental_instrument.obj delete mode 100644 applications/plugins/SensableEmulation/examples/testOmniDriverEmu.scn delete mode 100644 applications/plugins/SensableEmulation/pthread/pthread.h delete mode 100644 applications/plugins/SensableEmulation/pthread/pthreadVC2.dll delete mode 100644 applications/plugins/SensableEmulation/pthread/pthreadVC2.lib delete mode 100644 applications/plugins/SensableEmulation/pthread/sched.h delete mode 100644 applications/plugins/SensableEmulation/pthread/semaphore.h delete mode 100644 applications/plugins/SofaSimpleGUI/CMakeLists.txt delete mode 100644 applications/plugins/SofaSimpleGUI/Camera.cpp delete mode 100644 applications/plugins/SofaSimpleGUI/Camera.h delete mode 100644 applications/plugins/SofaSimpleGUI/Interactor.cpp delete mode 100644 applications/plugins/SofaSimpleGUI/Interactor.h delete mode 100644 applications/plugins/SofaSimpleGUI/PickedPoint.h delete mode 100644 applications/plugins/SofaSimpleGUI/README.txt delete mode 100644 applications/plugins/SofaSimpleGUI/SimpleGUI.dox delete mode 100644 applications/plugins/SofaSimpleGUI/SofaGL.cpp delete mode 100644 applications/plugins/SofaSimpleGUI/SofaGL.h delete mode 100644 applications/plugins/SofaSimpleGUI/SofaGlutAnt.zip delete mode 100644 applications/plugins/SofaSimpleGUI/SofaScene.cpp delete mode 100644 applications/plugins/SofaSimpleGUI/SofaScene.h delete mode 100644 applications/plugins/SofaSimpleGUI/SofaSimpleGUIConfig.cmake.in delete mode 100644 applications/plugins/SofaSimpleGUI/SpringInteractor.cpp delete mode 100644 applications/plugins/SofaSimpleGUI/SpringInteractor.h delete mode 100644 applications/plugins/SofaSimpleGUI/VisualPickVisitor.cpp delete mode 100644 applications/plugins/SofaSimpleGUI/VisualPickVisitor.h delete mode 100644 applications/plugins/SofaSimpleGUI/doc/Doxyfile delete mode 100644 applications/plugins/SofaSimpleGUI/doc/DoxygenLayout.xml delete mode 100644 applications/plugins/SofaSimpleGUI/doc/SimpleGUI.png delete mode 100644 applications/plugins/SofaSimpleGUI/doc/index.html delete mode 100644 applications/plugins/SofaSimpleGUI/examples/liver.scn delete mode 100644 applications/plugins/SofaSimpleGUI/examples/oneTet.scn create mode 100644 examples/Component/Constraint/Projective/LinearVelocityProjectiveConstraint.scn create mode 100644 examples/Component/Visual/CylinderVisualModel.scn delete mode 100644 examples/Component/Visual/OglCylinderModel.scn create mode 100644 examples/Demos/SofaWasher.scn create mode 100644 examples/Demos/fallingBeamAugmentedLagrangianCollision.scn create mode 100644 share/mesh/SOFA_collision_center.obj create mode 100644 share/mesh/SOFA_collision_no_face.obj create mode 100644 share/mesh/SOFA_surface.obj create mode 100644 share/mesh/SOFA_volume.vtk diff --git a/CHANGELOG.md b/CHANGELOG.md index d9da7f731b5..f6dd626aab4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,235 @@ # SOFA Changelog + +## [v24.12.00]( https://github.com/sofa-framework/sofa/tree/v24.12.00 ) + +[Full log]( https://github.com/sofa-framework/sofa/compare/v24.06..v24.12 ) + +### Highlighted contributions + +- [All] ObjectFactory: Explicit components registration [#4429](https://github.com/sofa-framework/sofa/pull/4429) +- [Mapping.NonLinear] Introduce AreaMapping [#4898](https://github.com/sofa-framework/sofa/pull/4898) +- [Mapping.NonLinear] Introduce VolumeMapping [#4906](https://github.com/sofa-framework/sofa/pull/4906) +- [Constraint.Lagrangian] Add augmented lagrangians [#5003](https://github.com/sofa-framework/sofa/pull/5003) +- [all] Various changes relative to the constraint matrix [#5017](https://github.com/sofa-framework/sofa/pull/5017) +- [workflow][Nix] initial packaging & flake [#5059](https://github.com/sofa-framework/sofa/pull/5059) + + +### Breaking + +- [Spring] Merging StiffSpringForceField and its parent [#4649](https://github.com/sofa-framework/sofa/pull/4649) +- [Core] Deprecate Compliant API in force fields [#4776](https://github.com/sofa-framework/sofa/pull/4776) +- [FEM.Elastic] Start unification of tetra FF and division of tests [#4778](https://github.com/sofa-framework/sofa/pull/4778) +- [Core] Factorize two variables with the same meaning (constraint id) [#4786](https://github.com/sofa-framework/sofa/pull/4786) +- [Core] Proposition to reduce the number of alias declarations [#4788](https://github.com/sofa-framework/sofa/pull/4788) +- [Sofa.GL] OglModel: Deprecate/Remove isEnabled Data [#4822](https://github.com/sofa-framework/sofa/pull/4822) +- [All] VisualModel: implement NVI for init/updateVisual() [#4827](https://github.com/sofa-framework/sofa/pull/4827) +- [FEM.Elastic] Hexa FEM inherits from BaseLinearElasticityFEMForceField [#4832](https://github.com/sofa-framework/sofa/pull/4832) +- [All] Reduce use of raw pointers [#4838](https://github.com/sofa-framework/sofa/pull/4838) +- [Component.Engine.Select] Refactoring of ROI classes [#4839](https://github.com/sofa-framework/sofa/pull/4839) +- [GUI.Qt] Add find or fetch for qgl viewer [#4840](https://github.com/sofa-framework/sofa/pull/4840) +- [All] Add way to disable windeppack [#4842](https://github.com/sofa-framework/sofa/pull/4842) +- [FEM.Elastic] Some FEM inherits from BaseLinearElasticityFEMForceField [#4852](https://github.com/sofa-framework/sofa/pull/4852) +- [Collision.Detection.Intersection] Delete compat layer for intersection [#4916](https://github.com/sofa-framework/sofa/pull/4916) +- [FEM] Components override the template API instead of the generic one [#4982](https://github.com/sofa-framework/sofa/pull/4982) +- [Mapping.Linear] Use links instead of raw pointers [#4996](https://github.com/sofa-framework/sofa/pull/4996) +- [Mapping.NonLinear] A base class for (almost) all non linear mappings [#5006](https://github.com/sofa-framework/sofa/pull/5006) +- [Core] Constexprification of VecId [#5082](https://github.com/sofa-framework/sofa/pull/5082) +- [Helper] Add Accessors for Array types [#5114](https://github.com/sofa-framework/sofa/pull/5114) + + +### Improvements + +- [Core] Dump ObjectFactory in json [#4775](https://github.com/sofa-framework/sofa/pull/4775) +- [Core] Introduce category for LinearSystem [#4784](https://github.com/sofa-framework/sofa/pull/4784) +- [GUI.Component] ConstraintAttachBodyPerformer: Add RigidType support [#4801](https://github.com/sofa-framework/sofa/pull/4801) +- [Config] Add CMake option for memory sanitizer [#4847](https://github.com/sofa-framework/sofa/pull/4847) +- [AnimationLoop] Apply new factory registration mechanism [#4858](https://github.com/sofa-framework/sofa/pull/4858) +- [Plugin] Add Cosserat as a fetchable plugin [#4859](https://github.com/sofa-framework/sofa/pull/4859) +- [SofaCUDA] Add constructor based on initializer_list [#4868](https://github.com/sofa-framework/sofa/pull/4868) +- [Helper] Retrieve the current user local configuration directory [#4875](https://github.com/sofa-framework/sofa/pull/4875) +- [GitHub] Update sofa-dev action to check timezone [#4877](https://github.com/sofa-framework/sofa/pull/4877) +- [GUI] Improve Error Handling in createPerformer [#4880](https://github.com/sofa-framework/sofa/pull/4880) +- [Core] Add filtering for unloaded plugins in ObjectFactory::getAllEntries [#4885](https://github.com/sofa-framework/sofa/pull/4885) +- [examples] Change rendering option in the TetrahedronFEMForceField.scn [#4922](https://github.com/sofa-framework/sofa/pull/4922) +- [Visual] Apply new factory registration mechanism [#4930](https://github.com/sofa-framework/sofa/pull/4930) +- [Setting] Apply new factory registration mechanism [#4931](https://github.com/sofa-framework/sofa/pull/4931) +- [SceneUtility] Apply new factory registration mechanism [#4932](https://github.com/sofa-framework/sofa/pull/4932) +- [Playback] Apply new factory registration mechanism [#4933](https://github.com/sofa-framework/sofa/pull/4933) +- [Engine] Add draw method in NearestPointROI [#4944](https://github.com/sofa-framework/sofa/pull/4944) +- [FEM] Add method computeVonMisesStress in TetrahedralCorotationalForceField and option to draw them [#4945](https://github.com/sofa-framework/sofa/pull/4945) +- [Engine.Select] Clean, extend and test MeshSubsetEngine [#4958](https://github.com/sofa-framework/sofa/pull/4958) +- [ODESolver] Apply new factory registration mechanism [#4975](https://github.com/sofa-framework/sofa/pull/4975) +- [IO] Apply new factory registration mechanism [#4976](https://github.com/sofa-framework/sofa/pull/4976) +- [Controller, Haptics, Diffusion] Apply new factory registration mechanism [#4977](https://github.com/sofa-framework/sofa/pull/4977) +- [LinearSystem] Apply new factory registration mechanism [#4981](https://github.com/sofa-framework/sofa/pull/4981) +- [MechanicalLoad] Apply new factory registration mechanism [#4983](https://github.com/sofa-framework/sofa/pull/4983) +- [Engine] Apply new factory registration mechanism [#5010](https://github.com/sofa-framework/sofa/pull/5010) +- [LinearSolver] Apply new factory registration mechanism [#5011](https://github.com/sofa-framework/sofa/pull/5011) +- [Topology] Apply new factory registration mechanism [#5012](https://github.com/sofa-framework/sofa/pull/5012) +- [SolidMechanics] Apply new factory registration mechanism [#5027](https://github.com/sofa-framework/sofa/pull/5027) +- [Collision] Apply new factory registration mechanism [#5033](https://github.com/sofa-framework/sofa/pull/5033) +- [examples] Update example scene of RungeKutta to make it stable [#5036](https://github.com/sofa-framework/sofa/pull/5036) +- [Constraint] Apply new factory registration mechanism [#5052](https://github.com/sofa-framework/sofa/pull/5052) +- [Mapping] Apply new factory registration mechanism [#5053](https://github.com/sofa-framework/sofa/pull/5053) +- [Mass] Apply new factory registration mechanism [#5055](https://github.com/sofa-framework/sofa/pull/5055) +- [all] Compatibility with C++20 [#5056](https://github.com/sofa-framework/sofa/pull/5056) +- [Helper] A static alternative to OptionsGroup: SelectableItem [#5062](https://github.com/sofa-framework/sofa/pull/5062) +- [Core] Support component included in multiple component change maps [#5074](https://github.com/sofa-framework/sofa/pull/5074) +- [runSofa] App name instead of empty string [#5076](https://github.com/sofa-framework/sofa/pull/5076) +- [GL, GUI] Apply new factory registration mechanism [#5097](https://github.com/sofa-framework/sofa/pull/5097) +- [Simulation.Core] Apply new factory registration mechanism [#5098](https://github.com/sofa-framework/sofa/pull/5098) +- [Core] Introduction of strong types [#5104](https://github.com/sofa-framework/sofa/pull/5104) +- [Type] Consistent string to color conversion [#5121](https://github.com/sofa-framework/sofa/pull/5121) +- [example] Update scene to display colors representing triangle areas [#5122](https://github.com/sofa-framework/sofa/pull/5122) + + +### Bug Fixes + +- [Core] Add topology subset indices test [#4738](https://github.com/sofa-framework/sofa/pull/4738) +- [MechanicalLoad] Update TrianglePressureForceField to remove plan selection and add callback on Data pressure and triangleList [#4743](https://github.com/sofa-framework/sofa/pull/4743) +- [FEM.Elastic] Fix small deformation in TriangleFEMForceField [#4780](https://github.com/sofa-framework/sofa/pull/4780) +- [Simulation.Core] Fix assert due to #4776 [#4792](https://github.com/sofa-framework/sofa/pull/4792) +- [GUI] initialize pointer to nullptr to avoid crash [#4793](https://github.com/sofa-framework/sofa/pull/4793) +- [SolidMechanics] Fix type declaration in deprecated data [#4807](https://github.com/sofa-framework/sofa/pull/4807) +- [Core] Add RenamedData component for data symbol renaming [#4814](https://github.com/sofa-framework/sofa/pull/4814) +- [Core] Explicit type instead of calling function with side effect [#4816](https://github.com/sofa-framework/sofa/pull/4816) +- [Collision] Secure pointers dereferences [#4819](https://github.com/sofa-framework/sofa/pull/4819) +- [FEM.Elastic] Fix dynamic symbols [#4831](https://github.com/sofa-framework/sofa/pull/4831) +- [CMake] Add QGLViewer2 name in FindQGLViewer.cmake [#4841](https://github.com/sofa-framework/sofa/pull/4841) +- [Topology.Dynamic] Fix wrong deprecation [#4843](https://github.com/sofa-framework/sofa/pull/4843) +- [CMake] Allow the out-of-tree for Sofa.GL Gui.Qt and runSofa [#4844](https://github.com/sofa-framework/sofa/pull/4844) +- [ODESOlver] Fix RHS computation of the backward Euler implicit solver [#4848](https://github.com/sofa-framework/sofa/pull/4848) +- [Core] Fix string comparison in factory [#4854](https://github.com/sofa-framework/sofa/pull/4854) +- [Helper] Fix deprecation warning for BackgroundSetting component [#4860](https://github.com/sofa-framework/sofa/pull/4860) +- [Constraint.Projective] Fix internal data allocation [#4865](https://github.com/sofa-framework/sofa/pull/4865) +- [SofaCUDA] Apply rename of some Data [#4866](https://github.com/sofa-framework/sofa/pull/4866) +- [all] Fix type of renamed Data [#4869](https://github.com/sofa-framework/sofa/pull/4869) +- [Qt] Register objects when loading from Qt [#4872](https://github.com/sofa-framework/sofa/pull/4872) +- [VolumetricRendering.CUDA] Fix compilation after SOFA changes [#4879](https://github.com/sofa-framework/sofa/pull/4879) +- [Mapping] Fix draw in DistanceMultiMapping [#4881](https://github.com/sofa-framework/sofa/pull/4881) +- [FEM.Elastic] remove static variable [#4883](https://github.com/sofa-framework/sofa/pull/4883) +- [Visual] BaseCamera: Fix return value when saving a view file [#4884](https://github.com/sofa-framework/sofa/pull/4884) +- [Topology.Dynamic] GeometryAlgoritims: disable lighting when drawing topologies [#4887](https://github.com/sofa-framework/sofa/pull/4887) +- [Visual] Camera: do not export/import lookat info [#4888](https://github.com/sofa-framework/sofa/pull/4888) +- [Core] Fix compilation warnings with addClambda [#4889](https://github.com/sofa-framework/sofa/pull/4889) +- [FEM] Remove duplicated Link to topology [#4890](https://github.com/sofa-framework/sofa/pull/4890) +- [Mapping.NonLinear] Fix rigid types in SquareDistanceMapping [#4891](https://github.com/sofa-framework/sofa/pull/4891) +- [VolumetricRendering] Fix target name in OglTetrahedralModel [#4893](https://github.com/sofa-framework/sofa/pull/4893) +- [Core] Secure json dump [#4894](https://github.com/sofa-framework/sofa/pull/4894) +- [SolidMechanics.FEM.Elastic] Fix compilation on clang{12, 13} [#4899](https://github.com/sofa-framework/sofa/pull/4899) +- [Core] Replace non-utf8 chars by special char with error message [#4900](https://github.com/sofa-framework/sofa/pull/4900) +- [image] convert unsigned char to int when streaming [#4901](https://github.com/sofa-framework/sofa/pull/4901) +- [Core] Revert thread local changes on exec params [#4902](https://github.com/sofa-framework/sofa/pull/4902) +- [Type] Fix wrong use of std::empty [#4903](https://github.com/sofa-framework/sofa/pull/4903) +- [Core] pointer checking [#4904](https://github.com/sofa-framework/sofa/pull/4904) +- [Core] Fix check and use of componentState in SingleStateAccessor [#4917](https://github.com/sofa-framework/sofa/pull/4917) +- [Playback] Fix WriteStateCreator to pass period only if it has a value. Because WriteState use isSet value... [#4919](https://github.com/sofa-framework/sofa/pull/4919) +- [Spring] Enable spring by default if Data enabled is not set [#4946](https://github.com/sofa-framework/sofa/pull/4946) +- [GUI.Common] ArgumentParser: catch exceptions when same options are added [#4947](https://github.com/sofa-framework/sofa/pull/4947) +- [Config] Use cmake-generator-expression to set cxx and c flags [#4990](https://github.com/sofa-framework/sofa/pull/4990) +- [LinearSolver.Direct] Fix packaging [#4999](https://github.com/sofa-framework/sofa/pull/4999) +- [FrameSpringForceField] Fix invalid data field's name [#5002](https://github.com/sofa-framework/sofa/pull/5002) +- [DefaultType] Fix RigidDeriv name [#5015](https://github.com/sofa-framework/sofa/pull/5015) +- [Constraint.Projective] Make LinearVelocityProjectiveConstraint work with FreeMotionAL [#5025](https://github.com/sofa-framework/sofa/pull/5025) +- [LinearAlgebra] Add CompressedRowSparseMatrixConstraint tests [#5037](https://github.com/sofa-framework/sofa/pull/5037) +- [tools] Deactivate all plugin containing CUDA in its name [#5044](https://github.com/sofa-framework/sofa/pull/5044) +- [Engine.Select] Fix MeshSubsetEngine compilation [#5046](https://github.com/sofa-framework/sofa/pull/5046) +- [Core.Collision] NarrowPhaseDetection: disable lighting when displaying detection outputs [#5048](https://github.com/sofa-framework/sofa/pull/5048) +- [Core] ForceField: print only once about missing kfactor usage [#5050](https://github.com/sofa-framework/sofa/pull/5050) +- [GitHub] Fix python dependencies in Actions [#5061](https://github.com/sofa-framework/sofa/pull/5061) +- [GitHub] Use python venv in Actions [#5066](https://github.com/sofa-framework/sofa/pull/5066) +- [Core] Test for nullptr in force field creation [#5075](https://github.com/sofa-framework/sofa/pull/5075) +- [Core] Fix isSet flag when setting a link to a not-yet created data [#5081](https://github.com/sofa-framework/sofa/pull/5081) +- [LinearAlgebra] CompressedRowSparseMatrixConstraint: make consistent the serialization/deserialization process [#5087](https://github.com/sofa-framework/sofa/pull/5087) +- [Gl.Component] Swap data description in OglColorMap [#5118](https://github.com/sofa-framework/sofa/pull/5118) +- [GL.Component] Fix min max computation in DataDisplay [#5120](https://github.com/sofa-framework/sofa/pull/5120) +- [Mapping] Fix debug compilation [#5134](https://github.com/sofa-framework/sofa/pull/5134) +- [Helper] Fix warning unexpected tokens following preprocessor directive [#5137](https://github.com/sofa-framework/sofa/pull/5137) +- [Backward] Fix typo [#5146](https://github.com/sofa-framework/sofa/pull/5146) +- [CollisionOBBCapsule] Fix Capsule destructor [#5147](https://github.com/sofa-framework/sofa/pull/5147) +- [All] Fix visualisation [#5152](https://github.com/sofa-framework/sofa/pull/5152) + + +### Cleaning + +- [Mass] Replace doUpdateInternal by callback: UniformMass [#3927](https://github.com/sofa-framework/sofa/pull/3927) +- [Core,Helper] Prevent to create objects from unloaded plugins [#4722](https://github.com/sofa-framework/sofa/pull/4722) +- [Topology.Container] Various clean in TriangleSetGeometryAlgorithms [#4746](https://github.com/sofa-framework/sofa/pull/4746) +- [all] Update data comments [#4751](https://github.com/sofa-framework/sofa/pull/4751) +- [Lagrangian.Model] Use base class Data instead of protected class member for constraint id [#4763](https://github.com/sofa-framework/sofa/pull/4763) +- [Mapping.NonLinear] Cleaning of DistanceMapping [#4777](https://github.com/sofa-framework/sofa/pull/4777) +- [FEM.Elastic] Remove addKToMatrix override as it is duplicated from base class [#4779](https://github.com/sofa-framework/sofa/pull/4779) +- [SofaAssump] Fix shadow variable in SceneColladaLoader [#4785](https://github.com/sofa-framework/sofa/pull/4785) +- [Project] Start dev phase v24.12 [#4787](https://github.com/sofa-framework/sofa/pull/4787) +- [All] Plugins: Deprecate entrypoint getModuleComponentList() [#4795](https://github.com/sofa-framework/sofa/pull/4795) +- [GUI] Fix typo in comments [#4797](https://github.com/sofa-framework/sofa/pull/4797) +- [All] Remove compat layer for Intersection methods [#4802](https://github.com/sofa-framework/sofa/pull/4802) +- [all] Clean some warnings [#4805](https://github.com/sofa-framework/sofa/pull/4805) +- [GUI] Clean warning from GUI at start [#4811](https://github.com/sofa-framework/sofa/pull/4811) +- [All] CMake: Remove deprecated settings [#4812](https://github.com/sofa-framework/sofa/pull/4812) +- [All] Remove SOFA_ENABLE_LEGACY_HEADERS usage [#4813](https://github.com/sofa-framework/sofa/pull/4813) +- [Core] Deprecate typeName with parameter [#4817](https://github.com/sofa-framework/sofa/pull/4817) +- [All] Reduce includes to helper/set.h [#4820](https://github.com/sofa-framework/sofa/pull/4820) +- [Projective] FixedProjectiveConstraint: Remove draw specializations and compute bbox [#4823](https://github.com/sofa-framework/sofa/pull/4823) +- [FEM.Elastic] Remove unused methods [#4824](https://github.com/sofa-framework/sofa/pull/4824) +- [Helper] Added cleanup callback [#4828](https://github.com/sofa-framework/sofa/pull/4828) +- [FEM.Elastic] Example of using structured binding [#4835](https://github.com/sofa-framework/sofa/pull/4835) +- [Helper] Move string utils from Utils to StringUtils [#4837](https://github.com/sofa-framework/sofa/pull/4837) +- [Core] Remove m_cId deprecation warning spam [#4846](https://github.com/sofa-framework/sofa/pull/4846) +- [CMake] Change CMake version in preset [#4849](https://github.com/sofa-framework/sofa/pull/4849) +- [Helper, AnimationLoop] ComponentChange: add Dealiased state [#4863](https://github.com/sofa-framework/sofa/pull/4863) +- [all] Rename lifecycle names for HEADER [#4882](https://github.com/sofa-framework/sofa/pull/4882) +- [CMake] Update all cmake_minimum_required in plugins [#4886](https://github.com/sofa-framework/sofa/pull/4886) +- [Core] ObjectFactory: fix typo when an object is not found [#4908](https://github.com/sofa-framework/sofa/pull/4908) +- [all] Fix various summer warnings [#4909](https://github.com/sofa-framework/sofa/pull/4909) +- [runSofa] Removed obsolete options [#4925](https://github.com/sofa-framework/sofa/pull/4925) +- [Sofa.GUI, Plugins] Pluginize HeadlessRecorder [#4928](https://github.com/sofa-framework/sofa/pull/4928) +- [All] Add scoped timers for tracy profiler [#4957](https://github.com/sofa-framework/sofa/pull/4957) +- [GUI] Minor cleaning in GUIManager [#4967](https://github.com/sofa-framework/sofa/pull/4967) +- [all] Cleanings on debug symbols [#4971](https://github.com/sofa-framework/sofa/pull/4971) +- [OpenCL] Update OpenCLProgram.cpp remove unused variable [#4973](https://github.com/sofa-framework/sofa/pull/4973) +- [FEM.Elastic] missing override keyword [#4980](https://github.com/sofa-framework/sofa/pull/4980) +- [Core] Move DevBaseMonitor in SofaValidation [#4985](https://github.com/sofa-framework/sofa/pull/4985) +- [all] Use isComponentStateValid [#4995](https://github.com/sofa-framework/sofa/pull/4995) +- [LinearAlgebra] Rename class MatrixSubstraction to MatrixSubtraction [#5016](https://github.com/sofa-framework/sofa/pull/5016) +- [ODESolver] Rename files to match class name [#5034](https://github.com/sofa-framework/sofa/pull/5034) +- [examples] Remove old tutorials [#5035](https://github.com/sofa-framework/sofa/pull/5035) +- [VolumetricRendering] Initialize SOFACuda [#5039](https://github.com/sofa-framework/sofa/pull/5039) +- [All] Clean collision detection in FreeMotionAnimationLoop [#5042](https://github.com/sofa-framework/sofa/pull/5042) +- [DefaultAnimationLoop] Add timer for collision begin and collision end [#5043](https://github.com/sofa-framework/sofa/pull/5043) +- [GenericConstraintSolver] FIX Generic constraint solver timer [#5045](https://github.com/sofa-framework/sofa/pull/5045) +- [all] Fix warnings [#5054](https://github.com/sofa-framework/sofa/pull/5054) +- [all] Run codespell on the code base + config file [#5064](https://github.com/sofa-framework/sofa/pull/5064) +- [Mapping] Deprecate module Sofa.Component.Mapping.MappedMatrix [#5070](https://github.com/sofa-framework/sofa/pull/5070) +- [examples] Run PluginFinder [#5072](https://github.com/sofa-framework/sofa/pull/5072) +- [Helper] Ensure exactly one directory separator [#5073](https://github.com/sofa-framework/sofa/pull/5073) +- [CUDA] Update CudaHexahedronTLEDForceField.cpp [#5085](https://github.com/sofa-framework/sofa/pull/5085) +- [Config] Minor cleaning of config.h [#5103](https://github.com/sofa-framework/sofa/pull/5103) +- [Constraint] Clean BilateralLagrangianConstraint [#5109](https://github.com/sofa-framework/sofa/pull/5109) +- [Mapping.Linear] Cleaning of SubsetMultiMapping [#5115](https://github.com/sofa-framework/sofa/pull/5115) +- [Visual] Move, rename and clean OglCylinderModel [#5124](https://github.com/sofa-framework/sofa/pull/5124) +- [all] Minor esthetic changes [#5129](https://github.com/sofa-framework/sofa/pull/5129) +- [Spring] Add warning when user tries to override MeshSpringForcefield indices [#5136](https://github.com/sofa-framework/sofa/pull/5136) +- [LinearSolver] Renamed ShewchuckPCGLinearSolver by removing the Shewchuck [#5139](https://github.com/sofa-framework/sofa/pull/5139) +- [Core, Simulation.Core] Registration: (re)enable deprecation warnings [#5155](https://github.com/sofa-framework/sofa/pull/5155) +- [All] Remove spam warnings [#5156](https://github.com/sofa-framework/sofa/pull/5156) + + +### Refactoring + +- [Component] Rename Data [#4771](https://github.com/sofa-framework/sofa/pull/4771) +- [SofaTest] Rename deprecated data [#4804](https://github.com/sofa-framework/sofa/pull/4804) +- [SofaCUDA] Simplify definition of CudaVector type [#4864](https://github.com/sofa-framework/sofa/pull/4864) +- [SofaCUDA,SofaDistanceGrid] Move DistanceGrid CUDA files in a SofaDistanceGrid extension [#4878](https://github.com/sofa-framework/sofa/pull/4878) +- [All] Apply renamed data on codebase [#4927](https://github.com/sofa-framework/sofa/pull/4927) +- [Test] Refactor Mapping_test [#5079](https://github.com/sofa-framework/sofa/pull/5079) +- [GitHub] Remove dev meeting action [#5107](https://github.com/sofa-framework/sofa/pull/5107) + + + + ## [v24.06.00]( https://github.com/sofa-framework/sofa/tree/v24.06.00 ) [Full log]( https://github.com/sofa-framework/sofa/compare/v23.12..v24.06 ) diff --git a/CMakeLists.txt b/CMakeLists.txt index 85160f7960f..3cf20738699 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,8 +6,8 @@ project(Sofa include(CMakeDependentOption) # Manually define VERSION -set(Sofa_VERSION_MAJOR 24) -set(Sofa_VERSION_MINOR 12) +set(Sofa_VERSION_MAJOR 25) +set(Sofa_VERSION_MINOR 06) set(Sofa_VERSION_PATCH 99) set(Sofa_VERSION ${Sofa_VERSION_MAJOR}.${Sofa_VERSION_MINOR}.${Sofa_VERSION_PATCH}) diff --git a/Sofa/Component/AnimationLoop/src/sofa/component/animationloop/FreeMotionAnimationLoop.h b/Sofa/Component/AnimationLoop/src/sofa/component/animationloop/FreeMotionAnimationLoop.h index c377ece2a55..10347815e02 100644 --- a/Sofa/Component/AnimationLoop/src/sofa/component/animationloop/FreeMotionAnimationLoop.h +++ b/Sofa/Component/AnimationLoop/src/sofa/component/animationloop/FreeMotionAnimationLoop.h @@ -24,7 +24,7 @@ #include #include -#include +#include namespace sofa::core::behavior { @@ -45,7 +45,7 @@ class SOFA_COMPONENT_ANIMATIONLOOP_API FreeMotionAnimationLoop : public sofa::si SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ANIMATIONLOOP() - sofa::core::objectmodel::RenamedData m_solveVelocityConstraintFirst; + sofa::core::objectmodel::lifecycle::RenamedData m_solveVelocityConstraintFirst; Data d_solveVelocityConstraintFirst; ///< solve separately velocity constraint violations before position constraint violations Data d_threadSafeVisitor; ///< If true, do not use realloc and free visitors in fwdInteractionForceField. diff --git a/Sofa/Component/AnimationLoop/src/sofa/component/animationloop/MultiStepAnimationLoop.h b/Sofa/Component/AnimationLoop/src/sofa/component/animationloop/MultiStepAnimationLoop.h index 84545c3eeb1..62c2a5e6ad8 100644 --- a/Sofa/Component/AnimationLoop/src/sofa/component/animationloop/MultiStepAnimationLoop.h +++ b/Sofa/Component/AnimationLoop/src/sofa/component/animationloop/MultiStepAnimationLoop.h @@ -25,7 +25,7 @@ #include #include -#include +#include namespace sofa::component::animationloop { @@ -43,10 +43,10 @@ class SOFA_COMPONENT_ANIMATIONLOOP_API MultiStepAnimationLoop : public sofa::sim void step (const sofa::core::ExecParams* params, SReal dt) override; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ANIMATIONLOOP() - sofa::core::objectmodel::RenamedData collisionSteps; + sofa::core::objectmodel::lifecycle::RenamedData collisionSteps; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ANIMATIONLOOP() - sofa::core::objectmodel::RenamedData integrationSteps; + sofa::core::objectmodel::lifecycle::RenamedData integrationSteps; Data d_collisionSteps; ///< number of collision steps between each frame rendering Data d_integrationSteps; ///< number of integration steps between each collision detection diff --git a/Sofa/Component/CMakeLists.txt b/Sofa/Component/CMakeLists.txt index 264fbcc8e2d..dbd5d4a4fb3 100644 --- a/Sofa/Component/CMakeLists.txt +++ b/Sofa/Component/CMakeLists.txt @@ -49,3 +49,10 @@ sofa_create_package_with_targets( INCLUDE_SOURCE_DIR "src" INCLUDE_INSTALL_DIR "${PROJECT_NAME}" ) + +# Tests +# If SOFA_BUILD_TESTS exists and is OFF, then these tests will be auto-disabled +cmake_dependent_option(SOFA_COMPONENT_BUILD_TESTS "Compile the automatic tests" ON "SOFA_BUILD_TESTS OR NOT DEFINED SOFA_BUILD_TESTS" OFF) +if(SOFA_COMPONENT_BUILD_TESTS) + add_subdirectory(test) +endif() diff --git a/Sofa/Component/Collision/Detection/Algorithm/src/sofa/component/collision/detection/algorithm/BruteForceBroadPhase.h b/Sofa/Component/Collision/Detection/Algorithm/src/sofa/component/collision/detection/algorithm/BruteForceBroadPhase.h index 9c1460d219f..ba8fe667fed 100644 --- a/Sofa/Component/Collision/Detection/Algorithm/src/sofa/component/collision/detection/algorithm/BruteForceBroadPhase.h +++ b/Sofa/Component/Collision/Detection/Algorithm/src/sofa/component/collision/detection/algorithm/BruteForceBroadPhase.h @@ -24,7 +24,7 @@ #include #include #include -#include +#include namespace sofa::component::collision::detection::algorithm { @@ -51,7 +51,7 @@ class SOFA_COMPONENT_COLLISION_DETECTION_ALGORITHM_API BruteForceBroadPhase : pu private: ///< if not empty, objects that do not intersect this bounding-box will be ignored SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_COLLISION_DETECTION_ALGORITHM() - sofa::core::objectmodel::RenamedData > box; + sofa::core::objectmodel::lifecycle::RenamedData > box; Data > d_box; ///< if not empty, objects that do not intersect this bounding-box will be ignored diff --git a/Sofa/Component/Collision/Detection/Algorithm/src/sofa/component/collision/detection/algorithm/IncrSAP.h b/Sofa/Component/Collision/Detection/Algorithm/src/sofa/component/collision/detection/algorithm/IncrSAP.h index 3a787ff9059..aff6b8b8b6d 100644 --- a/Sofa/Component/Collision/Detection/Algorithm/src/sofa/component/collision/detection/algorithm/IncrSAP.h +++ b/Sofa/Component/Collision/Detection/Algorithm/src/sofa/component/collision/detection/algorithm/IncrSAP.h @@ -42,7 +42,7 @@ #include #include -#include +#include namespace sofa::component::collision::detection::algorithm @@ -215,7 +215,7 @@ class SOFA_COMPONENT_COLLISION_DETECTION_ALGORITHM_API IncrSAP : core::objectmodel::lifecycle::DeprecatedData bDraw {this, "v24.06", "v24.12", "draw", "This Data was not used"}; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_COLLISION_DETECTION_ALGORITHM() - sofa::core::objectmodel::RenamedData< type::fixed_array > box; ///< if not empty, objects that do not intersect this bounding-box will be ignored + sofa::core::objectmodel::lifecycle::RenamedData< type::fixed_array > box; ///< if not empty, objects that do not intersect this bounding-box will be ignored Data< type::fixed_array > d_box; ///< if not empty, objects that do not intersect this bounding-box will be ignored diff --git a/Sofa/Component/Collision/Detection/Algorithm/tests/CollisionPipeline_test.cpp b/Sofa/Component/Collision/Detection/Algorithm/tests/CollisionPipeline_test.cpp index 0adc21e696f..e4f11276c8d 100644 --- a/Sofa/Component/Collision/Detection/Algorithm/tests/CollisionPipeline_test.cpp +++ b/Sofa/Component/Collision/Detection/Algorithm/tests/CollisionPipeline_test.cpp @@ -74,13 +74,13 @@ class TestCollisionPipeline : public BaseSimulationTest { void checkCollisionPipelineWithMissingContactManager(); int checkCollisionPipelineWithMonkeyValueForDepth(int value); - void SetUp() override + void doSetUp() override { - sofa::simpleapi::importPlugin("Sofa.Component.StateContainer"); - sofa::simpleapi::importPlugin("Sofa.Component.Collision"); + sofa::simpleapi::importPlugin(Sofa.Component.StateContainer); + sofa::simpleapi::importPlugin(Sofa.Component.Collision); } - void TearDown() override + void doTearDown() override { if (root) sofa::simulation::node::unload(root); diff --git a/Sofa/Component/Collision/Detection/Intersection/src/sofa/component/collision/detection/intersection/BaseProximityIntersection.h b/Sofa/Component/Collision/Detection/Intersection/src/sofa/component/collision/detection/intersection/BaseProximityIntersection.h index 8dbe24ea612..c7a336c1499 100644 --- a/Sofa/Component/Collision/Detection/Intersection/src/sofa/component/collision/detection/intersection/BaseProximityIntersection.h +++ b/Sofa/Component/Collision/Detection/Intersection/src/sofa/component/collision/detection/intersection/BaseProximityIntersection.h @@ -25,7 +25,7 @@ #include #include -#include +#include namespace sofa::component::collision::detection::intersection @@ -41,10 +41,10 @@ class SOFA_COMPONENT_COLLISION_DETECTION_INTERSECTION_API BaseProximityIntersect public: SOFA_ABSTRACT_CLASS(BaseProximityIntersection,DiscreteIntersection); SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_COLLISION_DETECTION_INTERSECTION() - sofa::core::objectmodel::RenamedData alarmDistance; + sofa::core::objectmodel::lifecycle::RenamedData alarmDistance; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_COLLISION_DETECTION_INTERSECTION() - sofa::core::objectmodel::RenamedData contactDistance; + sofa::core::objectmodel::lifecycle::RenamedData contactDistance; Data d_alarmDistance; ///< Distance above which the intersection computations ignores the proximity pair. This distance can also be used in some broad phase algorithms to reduce the search area diff --git a/Sofa/Component/Collision/Detection/Intersection/src/sofa/component/collision/detection/intersection/LocalMinDistance.h b/Sofa/Component/Collision/Detection/Intersection/src/sofa/component/collision/detection/intersection/LocalMinDistance.h index eb3bc43afac..38f5709cbac 100644 --- a/Sofa/Component/Collision/Detection/Intersection/src/sofa/component/collision/detection/intersection/LocalMinDistance.h +++ b/Sofa/Component/Collision/Detection/Intersection/src/sofa/component/collision/detection/intersection/LocalMinDistance.h @@ -31,7 +31,7 @@ #include #include -#include +#include namespace sofa::component::collision::detection::intersection { @@ -64,16 +64,16 @@ class SOFA_COMPONENT_COLLISION_DETECTION_INTERSECTION_API LocalMinDistance : pub typedef core::collision::IntersectorFactory IntersectorFactory; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_COLLISION_DETECTION_INTERSECTION() - sofa::core::objectmodel::RenamedData filterIntersection; + sofa::core::objectmodel::lifecycle::RenamedData filterIntersection; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_COLLISION_DETECTION_INTERSECTION() - sofa::core::objectmodel::RenamedData angleCone; + sofa::core::objectmodel::lifecycle::RenamedData angleCone; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_COLLISION_DETECTION_INTERSECTION() - sofa::core::objectmodel::RenamedData coneFactor; + sofa::core::objectmodel::lifecycle::RenamedData coneFactor; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_COLLISION_DETECTION_INTERSECTION() - sofa::core::objectmodel::RenamedData useLMDFilters; + sofa::core::objectmodel::lifecycle::RenamedData useLMDFilters; Data d_filterIntersection; ///< Activate LMD filter diff --git a/Sofa/Component/Collision/Detection/Intersection/src/sofa/component/collision/detection/intersection/MinProximityIntersection.h b/Sofa/Component/Collision/Detection/Intersection/src/sofa/component/collision/detection/intersection/MinProximityIntersection.h index 2aa9bfc3295..144587cde24 100644 --- a/Sofa/Component/Collision/Detection/Intersection/src/sofa/component/collision/detection/intersection/MinProximityIntersection.h +++ b/Sofa/Component/Collision/Detection/Intersection/src/sofa/component/collision/detection/intersection/MinProximityIntersection.h @@ -24,7 +24,7 @@ #include -#include +#include namespace sofa::component::collision::detection::intersection { @@ -57,19 +57,19 @@ class SOFA_COMPONENT_COLLISION_DETECTION_INTERSECTION_API MinProximityIntersecti public: SOFA_CLASS(MinProximityIntersection,BaseProximityIntersection); SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_COLLISION_DETECTION_INTERSECTION() - sofa::core::objectmodel::RenamedData useSphereTriangle; + sofa::core::objectmodel::lifecycle::RenamedData useSphereTriangle; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_COLLISION_DETECTION_INTERSECTION() - sofa::core::objectmodel::RenamedData usePointPoint; + sofa::core::objectmodel::lifecycle::RenamedData usePointPoint; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_COLLISION_DETECTION_INTERSECTION() - sofa::core::objectmodel::RenamedData useSurfaceNormals; + sofa::core::objectmodel::lifecycle::RenamedData useSurfaceNormals; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_COLLISION_DETECTION_INTERSECTION() - sofa::core::objectmodel::RenamedData useLinePoint; + sofa::core::objectmodel::lifecycle::RenamedData useLinePoint; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_COLLISION_DETECTION_INTERSECTION() - sofa::core::objectmodel::RenamedData useLineLine; + sofa::core::objectmodel::lifecycle::RenamedData useLineLine; diff --git a/Sofa/Component/Collision/Detection/Intersection/src/sofa/component/collision/detection/intersection/NewProximityIntersection.h b/Sofa/Component/Collision/Detection/Intersection/src/sofa/component/collision/detection/intersection/NewProximityIntersection.h index 84e1f701fbe..3464e87c33b 100644 --- a/Sofa/Component/Collision/Detection/Intersection/src/sofa/component/collision/detection/intersection/NewProximityIntersection.h +++ b/Sofa/Component/Collision/Detection/Intersection/src/sofa/component/collision/detection/intersection/NewProximityIntersection.h @@ -26,7 +26,7 @@ #include -#include +#include namespace sofa::component::collision::detection::intersection { @@ -58,7 +58,7 @@ class SOFA_COMPONENT_COLLISION_DETECTION_INTERSECTION_API NewProximityIntersecti public: SOFA_CLASS(NewProximityIntersection,BaseProximityIntersection); SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_COLLISION_DETECTION_INTERSECTION() - sofa::core::objectmodel::RenamedData useLineLine; + sofa::core::objectmodel::lifecycle::RenamedData useLineLine; Data d_useLineLine; ///< Line-line collision detection enabled diff --git a/Sofa/Component/Collision/Detection/Intersection/tests/LocalMinDistance_test.cpp b/Sofa/Component/Collision/Detection/Intersection/tests/LocalMinDistance_test.cpp index c432f420552..80fd33fa464 100644 --- a/Sofa/Component/Collision/Detection/Intersection/tests/LocalMinDistance_test.cpp +++ b/Sofa/Component/Collision/Detection/Intersection/tests/LocalMinDistance_test.cpp @@ -54,12 +54,12 @@ namespace { struct TestLocalMinDistance : public BaseSimulationTest { - void SetUp() override + void doSetUp() override { - sofa::simpleapi::importPlugin("Sofa.Component.StateContainer"); - sofa::simpleapi::importPlugin("Sofa.Component.Collision.Detection.Intersection"); + sofa::simpleapi::importPlugin(Sofa.Component.StateContainer); + sofa::simpleapi::importPlugin(Sofa.Component.Collision.Detection.Intersection); } - void TearDown() override + void doTearDown() override { } diff --git a/Sofa/Component/Collision/Detection/src/sofa/component/collision/detection/init.cpp b/Sofa/Component/Collision/Detection/src/sofa/component/collision/detection/init.cpp index 387d165aa7f..e7e10ae60ce 100644 --- a/Sofa/Component/Collision/Detection/src/sofa/component/collision/detection/init.cpp +++ b/Sofa/Component/Collision/Detection/src/sofa/component/collision/detection/init.cpp @@ -26,6 +26,7 @@ #include #include +#include namespace sofa::component::collision::detection { @@ -54,8 +55,8 @@ const char* getModuleVersion() void registerObjects(sofa::core::ObjectFactory* factory) { - factory->registerObjectsFromPlugin("Sofa.Component.Collision.Detection.Algorithm"); - factory->registerObjectsFromPlugin("Sofa.Component.Collision.Detection.Intersection"); + factory->registerObjectsFromPlugin(Sofa.Component.Collision.Detection.Algorithm); + factory->registerObjectsFromPlugin(Sofa.Component.Collision.Detection.Intersection); } void init() diff --git a/Sofa/Component/Collision/Geometry/src/sofa/component/collision/geometry/LineModel.h b/Sofa/Component/Collision/Geometry/src/sofa/component/collision/geometry/LineModel.h index 8b72e6d71ce..8b40670354a 100644 --- a/Sofa/Component/Collision/Geometry/src/sofa/component/collision/geometry/LineModel.h +++ b/Sofa/Component/Collision/Geometry/src/sofa/component/collision/geometry/LineModel.h @@ -27,7 +27,7 @@ #include #include -#include +#include namespace sofa::component::collision::geometry @@ -145,7 +145,7 @@ public : int getLineFlags(sofa::Index i); SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_COLLISION_GEOMETRY() - sofa::core::objectmodel::RenamedData bothSide; + sofa::core::objectmodel::lifecycle::RenamedData bothSide; Data d_bothSide; ///< activate collision on both side of the line model (when surface normals are defined on these lines) @@ -172,7 +172,7 @@ public : void computeBBox(const core::ExecParams* params, bool onlyVisible) override; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_COLLISION_GEOMETRY() - sofa::core::objectmodel::RenamedData m_displayFreePosition; + sofa::core::objectmodel::lifecycle::RenamedData m_displayFreePosition; Data d_displayFreePosition; ///< Display Collision Model Points free position(in green) diff --git a/Sofa/Component/Collision/Geometry/src/sofa/component/collision/geometry/PointModel.h b/Sofa/Component/Collision/Geometry/src/sofa/component/collision/geometry/PointModel.h index 84cbf118004..bd22bf85fb4 100644 --- a/Sofa/Component/Collision/Geometry/src/sofa/component/collision/geometry/PointModel.h +++ b/Sofa/Component/Collision/Geometry/src/sofa/component/collision/geometry/PointModel.h @@ -27,7 +27,7 @@ #include #include -#include +#include namespace sofa::component::collision::geometry { @@ -104,7 +104,7 @@ class PointCollisionModel : public core::CollisionModel const Deriv& velocity(sofa::Index index) const; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_COLLISION_GEOMETRY() - sofa::core::objectmodel::RenamedData bothSide; + sofa::core::objectmodel::lifecycle::RenamedData bothSide; Data d_bothSide; ///< activate collision on both side of the point model (when surface normals are defined on these points) @@ -136,10 +136,10 @@ class PointCollisionModel : public core::CollisionModel core::behavior::MechanicalState* mstate; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_COLLISION_GEOMETRY() - sofa::core::objectmodel::RenamedData computeNormals; + sofa::core::objectmodel::lifecycle::RenamedData computeNormals; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_COLLISION_GEOMETRY() - sofa::core::objectmodel::RenamedData m_displayFreePosition; + sofa::core::objectmodel::lifecycle::RenamedData m_displayFreePosition; Data d_computeNormals; ///< activate computation of normal vectors (required for some collision detection algorithms) diff --git a/Sofa/Component/Collision/Geometry/src/sofa/component/collision/geometry/RayModel.h b/Sofa/Component/Collision/Geometry/src/sofa/component/collision/geometry/RayModel.h index a6a42b69339..75387b7df3c 100644 --- a/Sofa/Component/Collision/Geometry/src/sofa/component/collision/geometry/RayModel.h +++ b/Sofa/Component/Collision/Geometry/src/sofa/component/collision/geometry/RayModel.h @@ -26,7 +26,7 @@ #include #include -#include +#include namespace sofa::component::collision::response::contact { @@ -96,7 +96,7 @@ class SOFA_COMPONENT_COLLISION_GEOMETRY_API RayCollisionModel : public core::Col sofa::type::vector direction; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_COLLISION_GEOMETRY() - sofa::core::objectmodel::RenamedData defaultLength; + sofa::core::objectmodel::lifecycle::RenamedData defaultLength; diff --git a/Sofa/Component/Collision/Geometry/src/sofa/component/collision/geometry/SphereModel.h b/Sofa/Component/Collision/Geometry/src/sofa/component/collision/geometry/SphereModel.h index ef5b8031204..a5f54206f4b 100644 --- a/Sofa/Component/Collision/Geometry/src/sofa/component/collision/geometry/SphereModel.h +++ b/Sofa/Component/Collision/Geometry/src/sofa/component/collision/geometry/SphereModel.h @@ -27,7 +27,7 @@ #include #include -#include +#include namespace sofa::component::collision::geometry { @@ -165,10 +165,10 @@ class SphereCollisionModel : public core::CollisionModel } SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_COLLISION_GEOMETRY() - sofa::core::objectmodel::RenamedData< VecReal > radius; + sofa::core::objectmodel::lifecycle::RenamedData< VecReal > radius; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_COLLISION_GEOMETRY() - sofa::core::objectmodel::RenamedData defaultRadius; + sofa::core::objectmodel::lifecycle::RenamedData defaultRadius; Data< VecReal > d_radius; ///< Radius of each sphere Data< SReal > d_defaultRadius; ///< Default radius diff --git a/Sofa/Component/Collision/Geometry/tests/Sphere_test.cpp b/Sofa/Component/Collision/Geometry/tests/Sphere_test.cpp index 35f2199ebe8..03caeae5d99 100644 --- a/Sofa/Component/Collision/Geometry/tests/Sphere_test.cpp +++ b/Sofa/Component/Collision/Geometry/tests/Sphere_test.cpp @@ -70,16 +70,16 @@ namespace sofa { struct TestSphere : public BaseSimulationTest { - void SetUp() override + void doSetUp() override { - sofa::simpleapi::importPlugin("Sofa.Component.StateContainer"); - sofa::simpleapi::importPlugin("Sofa.Component.Collision.Geometry"); + sofa::simpleapi::importPlugin(Sofa.Component.StateContainer); + sofa::simpleapi::importPlugin(Sofa.Component.Collision.Geometry); m_proxIntersection = sofa::core::objectmodel::New(); m_proxIntersection->setAlarmDistance(1.0); m_proxIntersection->setContactDistance(1.0); } - void TearDown() override + void doTearDown() override { } diff --git a/Sofa/Component/Collision/Geometry/tests/Triangle_test.cpp b/Sofa/Component/Collision/Geometry/tests/Triangle_test.cpp index 7355c123372..e6f8567a262 100644 --- a/Sofa/Component/Collision/Geometry/tests/Triangle_test.cpp +++ b/Sofa/Component/Collision/Geometry/tests/Triangle_test.cpp @@ -56,10 +56,10 @@ namespace sofa { struct TestTriangle : public BaseTest { - void SetUp() override + void doSetUp() override { } - void TearDown() override + void doTearDown() override { } diff --git a/Sofa/Component/Collision/Response/Contact/CMakeLists.txt b/Sofa/Component/Collision/Response/Contact/CMakeLists.txt index 3b6e2a38162..9ea5c096b4d 100644 --- a/Sofa/Component/Collision/Response/Contact/CMakeLists.txt +++ b/Sofa/Component/Collision/Response/Contact/CMakeLists.txt @@ -6,6 +6,10 @@ set(SOFACOMPONENTCOLLISIONRESPONSECONTACT_SOURCE_DIR "src/sofa/component/collisi set(HEADER_FILES ${SOFACOMPONENTCOLLISIONRESPONSECONTACT_SOURCE_DIR}/config.h.in ${SOFACOMPONENTCOLLISIONRESPONSECONTACT_SOURCE_DIR}/init.h + ${SOFACOMPONENTCOLLISIONRESPONSECONTACT_SOURCE_DIR}/AugmentedLagrangianResponse.h + ${SOFACOMPONENTCOLLISIONRESPONSECONTACT_SOURCE_DIR}/AugmentedLagrangianResponse.inl + ${SOFACOMPONENTCOLLISIONRESPONSECONTACT_SOURCE_DIR}/BaseUnilateralContactResponse.h + ${SOFACOMPONENTCOLLISIONRESPONSECONTACT_SOURCE_DIR}/BaseUnilateralContactResponse.inl ${SOFACOMPONENTCOLLISIONRESPONSECONTACT_SOURCE_DIR}/BarycentricPenalityContact.h ${SOFACOMPONENTCOLLISIONRESPONSECONTACT_SOURCE_DIR}/BarycentricPenalityContact.inl ${SOFACOMPONENTCOLLISIONRESPONSECONTACT_SOURCE_DIR}/BarycentricStickContact.h @@ -26,6 +30,7 @@ set(HEADER_FILES set(SOURCE_FILES ${SOFACOMPONENTCOLLISIONRESPONSECONTACT_SOURCE_DIR}/init.cpp + ${SOFACOMPONENTCOLLISIONRESPONSECONTACT_SOURCE_DIR}/AugmentedLagrangianResponse.cpp ${SOFACOMPONENTCOLLISIONRESPONSECONTACT_SOURCE_DIR}/BarycentricPenalityContact.cpp ${SOFACOMPONENTCOLLISIONRESPONSECONTACT_SOURCE_DIR}/BarycentricStickContact.cpp ${SOFACOMPONENTCOLLISIONRESPONSECONTACT_SOURCE_DIR}/CollisionResponse.cpp @@ -36,6 +41,7 @@ set(SOURCE_FILES ${SOFACOMPONENTCOLLISIONRESPONSECONTACT_SOURCE_DIR}/RayContact.cpp ${SOFACOMPONENTCOLLISIONRESPONSECONTACT_SOURCE_DIR}/RuleBasedContactManager.cpp ${SOFACOMPONENTCOLLISIONRESPONSECONTACT_SOURCE_DIR}/StickContactConstraint.cpp + ${SOFACOMPONENTCOLLISIONRESPONSECONTACT_SOURCE_DIR}/TetrahedronAugmentedLagrangianContact.cpp ${SOFACOMPONENTCOLLISIONRESPONSECONTACT_SOURCE_DIR}/TetrahedronBarycentricPenalityContact.cpp ${SOFACOMPONENTCOLLISIONRESPONSECONTACT_SOURCE_DIR}/TetrahedronFrictionContact.cpp ${SOFACOMPONENTCOLLISIONRESPONSECONTACT_SOURCE_DIR}/TetrahedronRayContact.cpp diff --git a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/AugmentedLagrangianResponse.cpp b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/AugmentedLagrangianResponse.cpp new file mode 100644 index 00000000000..18a25ba3871 --- /dev/null +++ b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/AugmentedLagrangianResponse.cpp @@ -0,0 +1,85 @@ +/****************************************************************************** +* SOFA, Simulation Open-Framework Architecture * +* (c) 2006 INRIA, USTL, UJF, CNRS, MGH * +* * +* This program is free software; you can redistribute it and/or modify it * +* under the terms of the GNU Lesser General Public License as published by * +* the Free Software Foundation; either version 2.1 of the License, or (at * +* your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, but WITHOUT * +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * +* for more details. * +* * +* You should have received a copy of the GNU Lesser General Public License * +* along with this program. If not, see . * +******************************************************************************* +* Authors: The SOFA Team and external contributors (see Authors.txt) * +* * +* Contact information: contact@sofa-framework.org * +******************************************************************************/ +#include +#include +#include + +#include +#include + +namespace sofa::component::collision::response::contact +{ + +using namespace defaulttype; +using namespace sofa::helper; +using namespace sofa::component::collision::geometry; +using simulation::Node; + +Creator, PointCollisionModel> > PointPointAugmentedLagrangianResponseClass("AugmentedLagrangianResponseConstraint",true); +Creator, SphereCollisionModel> > LineSphereAugmentedLagrangianResponseClass("AugmentedLagrangianResponseConstraint",true); +Creator, PointCollisionModel> > LinePointAugmentedLagrangianResponseClass("AugmentedLagrangianResponseConstraint",true); +Creator, LineCollisionModel> > LineLineAugmentedLagrangianResponseClass("AugmentedLagrangianResponseConstraint",true); +Creator, SphereCollisionModel> > TriangleSphereAugmentedLagrangianResponseClass("AugmentedLagrangianResponseConstraint",true); +Creator, PointCollisionModel> > TrianglePointAugmentedLagrangianResponseClass("AugmentedLagrangianResponseConstraint",true); +Creator, LineCollisionModel> > TriangleLineAugmentedLagrangianResponseClass("AugmentedLagrangianResponseConstraint",true); +Creator, TriangleCollisionModel> > TriangleTriangleAugmentedLagrangianResponseClass("AugmentedLagrangianResponseConstraint",true); +Creator, SphereCollisionModel> > SphereSphereAugmentedLagrangianResponseClass("AugmentedLagrangianResponseConstraint",true); +Creator, PointCollisionModel> > SpherePointAugmentedLagrangianResponseClass("AugmentedLagrangianResponseConstraint",true); +Creator > RigidSphereRigidSphereAugmentedLagrangianResponseClass("AugmentedLagrangianResponseConstraint",true); +Creator, RigidSphereModel> > SphereRigidSphereAugmentedLagrangianResponseClass("AugmentedLagrangianResponseConstraint",true); +Creator, RigidSphereModel> > LineRigidSphereAugmentedLagrangianResponseClass("AugmentedLagrangianResponseConstraint",true); +Creator, RigidSphereModel> > TriangleRigidSphereAugmentedLagrangianResponseClass("AugmentedLagrangianResponseConstraint",true); +Creator> > RigidSpherePointAugmentedLagrangianResponseClass("AugmentedLagrangianResponseConstraint",true); + +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API BaseUnilateralContactResponse, PointCollisionModel,constraint::lagrangian::model::AugmentedLagrangianContactParameters>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API BaseUnilateralContactResponse, SphereCollisionModel,constraint::lagrangian::model::AugmentedLagrangianContactParameters>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API BaseUnilateralContactResponse, PointCollisionModel,constraint::lagrangian::model::AugmentedLagrangianContactParameters>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API BaseUnilateralContactResponse, LineCollisionModel,constraint::lagrangian::model::AugmentedLagrangianContactParameters>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API BaseUnilateralContactResponse, SphereCollisionModel,constraint::lagrangian::model::AugmentedLagrangianContactParameters>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API BaseUnilateralContactResponse, PointCollisionModel,constraint::lagrangian::model::AugmentedLagrangianContactParameters>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API BaseUnilateralContactResponse, LineCollisionModel,constraint::lagrangian::model::AugmentedLagrangianContactParameters>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API BaseUnilateralContactResponse, TriangleCollisionModel,constraint::lagrangian::model::AugmentedLagrangianContactParameters>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API BaseUnilateralContactResponse, SphereCollisionModel,constraint::lagrangian::model::AugmentedLagrangianContactParameters>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API BaseUnilateralContactResponse, PointCollisionModel,constraint::lagrangian::model::AugmentedLagrangianContactParameters>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API BaseUnilateralContactResponse; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API BaseUnilateralContactResponse, RigidSphereModel,constraint::lagrangian::model::AugmentedLagrangianContactParameters>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API BaseUnilateralContactResponse, RigidSphereModel,constraint::lagrangian::model::AugmentedLagrangianContactParameters>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API BaseUnilateralContactResponse, RigidSphereModel,constraint::lagrangian::model::AugmentedLagrangianContactParameters>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API BaseUnilateralContactResponse,constraint::lagrangian::model::AugmentedLagrangianContactParameters>; + +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API AugmentedLagrangianResponse, PointCollisionModel>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API AugmentedLagrangianResponse, SphereCollisionModel>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API AugmentedLagrangianResponse, PointCollisionModel>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API AugmentedLagrangianResponse, LineCollisionModel>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API AugmentedLagrangianResponse, SphereCollisionModel>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API AugmentedLagrangianResponse, PointCollisionModel>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API AugmentedLagrangianResponse, LineCollisionModel>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API AugmentedLagrangianResponse, TriangleCollisionModel>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API AugmentedLagrangianResponse, SphereCollisionModel>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API AugmentedLagrangianResponse, PointCollisionModel>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API AugmentedLagrangianResponse; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API AugmentedLagrangianResponse, RigidSphereModel>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API AugmentedLagrangianResponse, RigidSphereModel>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API AugmentedLagrangianResponse, RigidSphereModel>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API AugmentedLagrangianResponse>; + +} //namespace sofa::component::collision::response::contact diff --git a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/AugmentedLagrangianResponse.h b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/AugmentedLagrangianResponse.h new file mode 100644 index 00000000000..0d5d96101d9 --- /dev/null +++ b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/AugmentedLagrangianResponse.h @@ -0,0 +1,67 @@ +/****************************************************************************** +* SOFA, Simulation Open-Framework Architecture * +* (c) 2006 INRIA, USTL, UJF, CNRS, MGH * +* * +* This program is free software; you can redistribute it and/or modify it * +* under the terms of the GNU Lesser General Public License as published by * +* the Free Software Foundation; either version 2.1 of the License, or (at * +* your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, but WITHOUT * +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * +* for more details. * +* * +* You should have received a copy of the GNU Lesser General Public License * +* along with this program. If not, see . * +******************************************************************************* +* Authors: The SOFA Team and external contributors (see Authors.txt) * +* * +* Contact information: contact@sofa-framework.org * +******************************************************************************/ +#pragma once +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace sofa::component::collision::response::contact +{ +//Work inspired by: Zimmerman BK, Ateshian GA. "A Surface-to-Surface Finite Element Algorithm for Large Deformation Frictional Contact in febio." +// J Biomech Eng. 2018 Aug 1;140(8):0810131–08101315. doi: 10.1115/1.4040497. PMID: 30003262; PMCID: PMC6056201. +template +class AugmentedLagrangianResponse : public BaseUnilateralContactResponse +{ +public: + SOFA_CLASS(SOFA_TEMPLATE3(AugmentedLagrangianResponse, TCollisionModel1, TCollisionModel2, ResponseDataTypes), SOFA_TEMPLATE4(BaseUnilateralContactResponse, TCollisionModel1, TCollisionModel2,constraint::lagrangian::model::AugmentedLagrangianContactParameters, ResponseDataTypes)); + + typedef typename Inherit1::DataTypes1 DataTypes1; + typedef typename Inherit1::DataTypes2 DataTypes2; + typedef typename Inherit1::CollisionModel1 CollisionModel1; + typedef typename Inherit1::CollisionModel2 CollisionModel2; + typedef typename Inherit1::Intersection Intersection; + + typedef core::behavior::MechanicalState MechanicalState1; + typedef core::behavior::MechanicalState MechanicalState2; + + Data d_mu; ///< friction parameter + Data d_epsilon; ///< Penalty parameter + + AugmentedLagrangianResponse(); + AugmentedLagrangianResponse(CollisionModel1* model1, CollisionModel2* model2, Intersection* intersectionMethod); + + virtual ~AugmentedLagrangianResponse() = default; + + virtual constraint::lagrangian::model::AugmentedLagrangianContactParameters getParameterFromDatas() const override; + virtual void setupConstraint(MechanicalState1 *,MechanicalState2 *) override; + +}; + +} // namespace sofa::component::collision::response::contact diff --git a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/AugmentedLagrangianResponse.inl b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/AugmentedLagrangianResponse.inl new file mode 100644 index 00000000000..f49fedf5602 --- /dev/null +++ b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/AugmentedLagrangianResponse.inl @@ -0,0 +1,65 @@ +/****************************************************************************** +* SOFA, Simulation Open-Framework Architecture * +* (c) 2006 INRIA, USTL, UJF, CNRS, MGH * +* * +* This program is free software; you can redistribute it and/or modify it * +* under the terms of the GNU Lesser General Public License as published by * +* the Free Software Foundation; either version 2.1 of the License, or (at * +* your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, but WITHOUT * +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * +* for more details. * +* * +* You should have received a copy of the GNU Lesser General Public License * +* along with this program. If not, see . * +******************************************************************************* +* Authors: The SOFA Team and external contributors (see Authors.txt) * +* * +* Contact information: contact@sofa-framework.org * +******************************************************************************/ +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sofa::component::collision::response::contact +{ + +template < class TCollisionModel1, class TCollisionModel2, class ResponseDataTypes > +AugmentedLagrangianResponse::AugmentedLagrangianResponse() + : AugmentedLagrangianResponse(nullptr, nullptr, nullptr) +{ +} + + +template < class TCollisionModel1, class TCollisionModel2, class ResponseDataTypes > +AugmentedLagrangianResponse::AugmentedLagrangianResponse(CollisionModel1* model1, CollisionModel2* model2, Intersection* intersectionMethod) + : BaseUnilateralContactResponse(model1,model2,intersectionMethod) + , d_mu (initData(&d_mu, 0.0, "mu", "Friction coefficient (0 for frictionless contacts)")) + , d_epsilon (initData(&d_epsilon, 0.0, "epsilon", "Penalty parameter. It can be think of as a proportional controller, the Lagrange multiplier is augmented by the violation multiplied by this factor at each solving iteration.")) +{ + +} + +template < class TCollisionModel1, class TCollisionModel2, class ResponseDataTypes > +constraint::lagrangian::model::AugmentedLagrangianContactParameters AugmentedLagrangianResponse::getParameterFromDatas() const +{ + return {d_mu.getValue(),d_epsilon.getValue()}; +} + + +template < class TCollisionModel1, class TCollisionModel2, class ResponseDataTypes > +void AugmentedLagrangianResponse::setupConstraint(MechanicalState1 * mmodel1,MechanicalState2 * mmodel2) +{ + this->m_constraint = sofa::core::objectmodel::New >(mmodel1, mmodel2); +} + + +} //namespace sofa::component::collision::response::contact diff --git a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/BarycentricStickContact.h b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/BarycentricStickContact.h index 3b101a9c160..cb1347fc327 100644 --- a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/BarycentricStickContact.h +++ b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/BarycentricStickContact.h @@ -27,7 +27,7 @@ #include #include -#include +#include namespace sofa::component::collision::response::contact { @@ -74,7 +74,7 @@ class BarycentricStickContact : public core::collision::Contact public: SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_COLLISION_RESPONSE_CONTACT() - sofa::core::objectmodel::RenamedData f_keepAlive; + sofa::core::objectmodel::lifecycle::RenamedData f_keepAlive; Data d_keepAlive; ///< set to true to keep this contact alive even after collisions are no longer detected diff --git a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/BaseUnilateralContactResponse.h b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/BaseUnilateralContactResponse.h new file mode 100644 index 00000000000..cc1fcefa01f --- /dev/null +++ b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/BaseUnilateralContactResponse.h @@ -0,0 +1,101 @@ +/****************************************************************************** +* SOFA, Simulation Open-Framework Architecture * +* (c) 2006 INRIA, USTL, UJF, CNRS, MGH * +* * +* This program is free software; you can redistribute it and/or modify it * +* under the terms of the GNU Lesser General Public License as published by * +* the Free Software Foundation; either version 2.1 of the License, or (at * +* your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, but WITHOUT * +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * +* for more details. * +* * +* You should have received a copy of the GNU Lesser General Public License * +* along with this program. If not, see . * +******************************************************************************* +* Authors: The SOFA Team and external contributors (see Authors.txt) * +* * +* Contact information: contact@sofa-framework.org * +******************************************************************************/ +#pragma once +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace sofa::component::collision::response::contact +{ +template +class BaseUnilateralContactResponse : public core::collision::Contact, public ContactIdentifier +{ +public: + SOFA_CLASS(SOFA_TEMPLATE4(BaseUnilateralContactResponse, TCollisionModel1, TCollisionModel2,ConstraintParameters, ResponseDataTypes), core::collision::Contact); + typedef TCollisionModel1 CollisionModel1; + typedef TCollisionModel2 CollisionModel2; + typedef core::collision::Intersection Intersection; + typedef typename TCollisionModel1::DataTypes::CPos TVec1; + typedef typename TCollisionModel1::DataTypes::CPos TVec2; + typedef sofa::defaulttype::StdVectorTypes DataTypes1; + typedef sofa::defaulttype::StdVectorTypes DataTypes2; + + typedef core::behavior::MechanicalState MechanicalState1; + typedef core::behavior::MechanicalState MechanicalState2; + typedef typename CollisionModel1::Element CollisionElement1; + typedef typename CollisionModel2::Element CollisionElement2; + typedef core::collision::DetectionOutputVector OutputVector; + typedef core::collision::TDetectionOutputVector TOutputVector; + +protected: + CollisionModel1* model1; + CollisionModel2* model2; + Intersection* intersectionMethod; + bool selfCollision; ///< true if model1==model2 (in this case, only mapper1 is used) + mapper::ContactMapper mapper1; + mapper::ContactMapper mapper2; + + typename constraint::lagrangian::model::BaseContactLagrangianConstraint::SPtr m_constraint; + core::objectmodel::BaseContext* parent; + + SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_COLLISION_RESPONSE_CONTACT() + sofa::core::objectmodel::lifecycle::RenamedData mu; + + SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_COLLISION_RESPONSE_CONTACT() + sofa::core::objectmodel::lifecycle::RenamedData tol; + + Data d_tol; ///< tolerance for the constraints resolution (0 for default tolerance) + std::vector< sofa::core::collision::DetectionOutput* > contacts; + std::vector< std::pair< std::pair, double > > mappedContacts; + + virtual void activateMappers(); + + void setInteractionTags(MechanicalState1* mstate1, MechanicalState2* mstate2); + + BaseUnilateralContactResponse(); + BaseUnilateralContactResponse(CollisionModel1* model1, CollisionModel2* model2, Intersection* intersectionMethod); + + ~BaseUnilateralContactResponse() override; +public: + void cleanup() override; + + std::pair getCollisionModels() override { return std::make_pair(model1,model2); } + + void setDetectionOutputs(OutputVector* outputs) override; + + void createResponse(core::objectmodel::BaseContext* group) override; + + void removeResponse() override; + + virtual ConstraintParameters getParameterFromDatas() const = 0; + virtual void setupConstraint(MechanicalState1 *,MechanicalState2 *) = 0; +}; + +} // namespace sofa::component::collision::response::contact diff --git a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/BaseUnilateralContactResponse.inl b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/BaseUnilateralContactResponse.inl new file mode 100644 index 00000000000..31b2199f8c0 --- /dev/null +++ b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/BaseUnilateralContactResponse.inl @@ -0,0 +1,271 @@ +/****************************************************************************** +* SOFA, Simulation Open-Framework Architecture * +* (c) 2006 INRIA, USTL, UJF, CNRS, MGH * +* * +* This program is free software; you can redistribute it and/or modify it * +* under the terms of the GNU Lesser General Public License as published by * +* the Free Software Foundation; either version 2.1 of the License, or (at * +* your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, but WITHOUT * +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * +* for more details. * +* * +* You should have received a copy of the GNU Lesser General Public License * +* along with this program. If not, see . * +******************************************************************************* +* Authors: The SOFA Team and external contributors (see Authors.txt) * +* * +* Contact information: contact@sofa-framework.org * +******************************************************************************/ +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sofa::component::collision::response::contact +{ + +template +BaseUnilateralContactResponse::BaseUnilateralContactResponse() + : BaseUnilateralContactResponse(nullptr, nullptr, nullptr) +{ +} + + +template +BaseUnilateralContactResponse::BaseUnilateralContactResponse(CollisionModel1* model1, CollisionModel2* model2, Intersection* intersectionMethod) + : model1(model1) + , model2(model2) + , intersectionMethod(intersectionMethod) + , m_constraint(nullptr) + , parent(nullptr) + , d_tol (initData(&d_tol, 0.0, "tol", "tolerance for the constraints resolution (0 for default tolerance)")) +{ + selfCollision = ((core::CollisionModel*)model1 == (core::CollisionModel*)model2); + mapper1.setCollisionModel(model1); + if (!selfCollision) mapper2.setCollisionModel(model2); + contacts.clear(); + mappedContacts.clear(); + + tol.setOriginalData(&d_tol); + +} + +template +BaseUnilateralContactResponse::~BaseUnilateralContactResponse() +{ +} + +template +void BaseUnilateralContactResponse::cleanup() +{ + if (m_constraint) + { + m_constraint->cleanup(); + + if (parent != nullptr) + parent->removeObject(m_constraint); + + parent = nullptr; + m_constraint.reset(); + + mapper1.cleanup(); + + if (!selfCollision) + mapper2.cleanup(); + } + + contacts.clear(); + mappedContacts.clear(); +} + + +template +void BaseUnilateralContactResponse::setDetectionOutputs(OutputVector* o) +{ + TOutputVector& outputs = *static_cast(o); + // We need to remove duplicate contacts + constexpr double minDist2 = 0.00000001f; + + contacts.clear(); + + if (model1->getContactStiffness(0) == 0 || model2->getContactStiffness(0) == 0) + { + msg_error() << "Disabled BaseUnilateralContactResponse with " << (outputs.size()) << " collision points."; + return; + } + + contacts.reserve(outputs.size()); + + const int SIZE = outputs.size(); + + // the following procedure cancels the duplicated detection outputs + for (int cpt=0; cptpoint[0]-p->point[0]).norm2()+(detectionOutput->point[1]-p->point[1]).norm2() < minDist2) + found = true; + } + + if (!found) + contacts.push_back(detectionOutput); + } + + // DUPLICATED CONTACTS FOUND + msg_info_when(contacts.size() +void BaseUnilateralContactResponse::activateMappers() +{ + if (!m_constraint) + { + // Get the mechanical model from mapper1 to fill the constraint vector + MechanicalState1* mmodel1 = mapper1.createMapping(getName().c_str()); + // Get the mechanical model from mapper2 to fill the constraints vector + MechanicalState2* mmodel2; + if (selfCollision) + { + mmodel2 = mmodel1; + } + else + { + mmodel2 = mapper2.createMapping(getName().c_str()); + } + setupConstraint(mmodel1,mmodel2); + m_constraint->setName( getName() ); + setInteractionTags(mmodel1, mmodel2); + m_constraint->setCustomTolerance(d_tol.getValue() ); + } + + int size = contacts.size(); + m_constraint->clear(size); + if (selfCollision) + mapper1.resize(2*size); + else + { + mapper1.resize(size); + mapper2.resize(size); + } + int i = 0; + const double d0 = intersectionMethod->getContactDistance() + model1->getProximity() + model2->getProximity(); // - 0.001; + + mappedContacts.resize(contacts.size()); + for (std::vector::const_iterator it = contacts.begin(); it!=contacts.end(); it++, i++) + { + sofa::core::collision::DetectionOutput* o = *it; + CollisionElement1 elem1(o->elem.first); + CollisionElement2 elem2(o->elem.second); + int index1 = elem1.getIndex(); + int index2 = elem2.getIndex(); + + typename DataTypes1::Real r1 = 0.; + typename DataTypes2::Real r2 = 0.; + + // Create mapping for first point + index1 = mapper1.addPointB(o->point[0], index1, r1); + // Create mapping for second point + if (selfCollision) + { + index2 = mapper1.addPointB(o->point[1], index2, r2); + } + else + { + index2 = mapper2.addPointB(o->point[1], index2, r2); + } + const double distance = d0 + r1 + r2; + + mappedContacts[i].first.first = index1; + mappedContacts[i].first.second = index2; + mappedContacts[i].second = distance; + } + + // Update mappings + mapper1.update(); + mapper1.updateXfree(); + if (!selfCollision) mapper2.update(); + if (!selfCollision) mapper2.updateXfree(); +} + +template +void BaseUnilateralContactResponse::createResponse(core::objectmodel::BaseContext* group) +{ + + activateMappers(); + + if (m_constraint) + { + int i=0; + for (std::vector::const_iterator it = contacts.begin(); it!=contacts.end(); it++, i++) + { + const sofa::core::collision::DetectionOutput* o = *it; + const int index1 = mappedContacts[i].first.first; + const int index2 = mappedContacts[i].first.second; + const double distance = mappedContacts[i].second; + + // Polynome de Cantor de NxN sur N bijectif f(x,y)=((x+y)^2+3x+y)/2 + const long index = cantorPolynomia(o->id /*cantorPolynomia(index1, index2)*/,id); + + const ConstraintParameters params = getParameterFromDatas(); + + // Add contact in unilateral constraint + m_constraint->addContact(params, o->normal, distance, index1, index2, index, o->id); + } + + if (parent!=nullptr) + { + parent->removeObject(this); + parent->removeObject(m_constraint); + } + + parent = group; + if (parent!=nullptr) + { + parent->addObject(this); + parent->addObject(m_constraint); + } + } +} + +template +void BaseUnilateralContactResponse::removeResponse() +{ + if (m_constraint) + { + mapper1.resize(0); + mapper2.resize(0); + if (parent!=nullptr) + { + parent->removeObject(this); + parent->removeObject(m_constraint); + } + parent = nullptr; + } +} + +template +void BaseUnilateralContactResponse::setInteractionTags(MechanicalState1* mstate1, MechanicalState2* mstate2) +{ + sofa::core::objectmodel::TagSet tagsm1 = mstate1->getTags(); + sofa::core::objectmodel::TagSet tagsm2 = mstate2->getTags(); + sofa::core::objectmodel::TagSet::iterator it; + for(it=tagsm1.begin(); it != tagsm1.end(); it++) + m_constraint->addTag(*it); + for(it=tagsm2.begin(); it!=tagsm2.end(); it++) + m_constraint->addTag(*it); +} + +} //namespace sofa::component::collision::response::contact diff --git a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/CollisionResponse.h b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/CollisionResponse.h index 15780754ae8..3d86715d815 100644 --- a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/CollisionResponse.h +++ b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/CollisionResponse.h @@ -27,7 +27,7 @@ #include #include -#include +#include namespace sofa::component::collision::response::contact { @@ -38,10 +38,10 @@ public : SOFA_CLASS(CollisionResponse,sofa::core::collision::ContactManager); SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_COLLISION_RESPONSE_CONTACT() - sofa::core::objectmodel::RenamedData response; + sofa::core::objectmodel::lifecycle::RenamedData response; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_COLLISION_RESPONSE_CONTACT() - sofa::core::objectmodel::RenamedData responseParams; + sofa::core::objectmodel::lifecycle::RenamedData responseParams; Data d_response; ///< contact response class diff --git a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/FrictionContact.cpp b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/FrictionContact.cpp index e405e4ff362..a3734fd4d83 100644 --- a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/FrictionContact.cpp +++ b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/FrictionContact.cpp @@ -19,8 +19,12 @@ * * * Contact information: contact@sofa-framework.org * ******************************************************************************/ +#include +#include +#include #include + #include #include @@ -32,6 +36,7 @@ using namespace sofa::helper; using namespace sofa::component::collision::geometry; using simulation::Node; + Creator, PointCollisionModel> > PointPointFrictionContactClass("FrictionContactConstraint",true); Creator, SphereCollisionModel> > LineSphereFrictionContactClass("FrictionContactConstraint",true); Creator, PointCollisionModel> > LinePointFrictionContactClass("FrictionContactConstraint",true); @@ -48,6 +53,23 @@ Creator, RigidSphereModel> > TriangleRigidSphereFrictionContactClass("FrictionContactConstraint",true); Creator> > RigidSpherePointFrictionContactClass("FrictionContactConstraint",true); + +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API BaseUnilateralContactResponse, PointCollisionModel,constraint::lagrangian::model::UnilateralLagrangianContactParameters>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API BaseUnilateralContactResponse, SphereCollisionModel,constraint::lagrangian::model::UnilateralLagrangianContactParameters>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API BaseUnilateralContactResponse, PointCollisionModel,constraint::lagrangian::model::UnilateralLagrangianContactParameters>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API BaseUnilateralContactResponse, LineCollisionModel,constraint::lagrangian::model::UnilateralLagrangianContactParameters>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API BaseUnilateralContactResponse, SphereCollisionModel,constraint::lagrangian::model::UnilateralLagrangianContactParameters>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API BaseUnilateralContactResponse, PointCollisionModel,constraint::lagrangian::model::UnilateralLagrangianContactParameters>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API BaseUnilateralContactResponse, LineCollisionModel,constraint::lagrangian::model::UnilateralLagrangianContactParameters>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API BaseUnilateralContactResponse, TriangleCollisionModel,constraint::lagrangian::model::UnilateralLagrangianContactParameters>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API BaseUnilateralContactResponse, SphereCollisionModel,constraint::lagrangian::model::UnilateralLagrangianContactParameters>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API BaseUnilateralContactResponse, PointCollisionModel,constraint::lagrangian::model::UnilateralLagrangianContactParameters>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API BaseUnilateralContactResponse; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API BaseUnilateralContactResponse, RigidSphereModel,constraint::lagrangian::model::UnilateralLagrangianContactParameters>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API BaseUnilateralContactResponse, RigidSphereModel,constraint::lagrangian::model::UnilateralLagrangianContactParameters>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API BaseUnilateralContactResponse, RigidSphereModel,constraint::lagrangian::model::UnilateralLagrangianContactParameters>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API BaseUnilateralContactResponse,constraint::lagrangian::model::UnilateralLagrangianContactParameters>; + template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API FrictionContact, PointCollisionModel>; template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API FrictionContact, SphereCollisionModel>; template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API FrictionContact, PointCollisionModel>; diff --git a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/FrictionContact.h b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/FrictionContact.h index cebd6506a02..9c9869e53d5 100644 --- a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/FrictionContact.h +++ b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/FrictionContact.h @@ -27,73 +27,38 @@ #include #include #include -#include +#include #include -#include +#include namespace sofa::component::collision::response::contact { template -class FrictionContact : public core::collision::Contact, public ContactIdentifier +class FrictionContact : public BaseUnilateralContactResponse { -public: - SOFA_CLASS(SOFA_TEMPLATE3(FrictionContact, TCollisionModel1, TCollisionModel2, ResponseDataTypes), core::collision::Contact); - typedef TCollisionModel1 CollisionModel1; - typedef TCollisionModel2 CollisionModel2; - typedef core::collision::Intersection Intersection; - typedef typename TCollisionModel1::DataTypes::CPos TVec1; - typedef typename TCollisionModel1::DataTypes::CPos TVec2; - typedef sofa::defaulttype::StdVectorTypes DataTypes1; - typedef sofa::defaulttype::StdVectorTypes DataTypes2; + public: + SOFA_CLASS(SOFA_TEMPLATE3(FrictionContact, TCollisionModel1, TCollisionModel2, ResponseDataTypes), SOFA_TEMPLATE4(BaseUnilateralContactResponse, TCollisionModel1, TCollisionModel2,constraint::lagrangian::model::UnilateralLagrangianContactParameters, ResponseDataTypes)); + + typedef typename Inherit1::DataTypes1 DataTypes1; + typedef typename Inherit1::DataTypes2 DataTypes2; + typedef typename Inherit1::CollisionModel1 CollisionModel1; + typedef typename Inherit1::CollisionModel2 CollisionModel2; + typedef typename Inherit1::Intersection Intersection; typedef core::behavior::MechanicalState MechanicalState1; typedef core::behavior::MechanicalState MechanicalState2; - typedef typename CollisionModel1::Element CollisionElement1; - typedef typename CollisionModel2::Element CollisionElement2; - typedef core::collision::DetectionOutputVector OutputVector; - typedef core::collision::TDetectionOutputVector TOutputVector; - -protected: - CollisionModel1* model1; - CollisionModel2* model2; - Intersection* intersectionMethod; - bool selfCollision; ///< true if model1==model2 (in this case, only mapper1 is used) - mapper::ContactMapper mapper1; - mapper::ContactMapper mapper2; - - constraint::lagrangian::model::UnilateralLagrangianConstraint::SPtr m_constraint; - core::objectmodel::BaseContext* parent; - - SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_COLLISION_RESPONSE_CONTACT() - sofa::core::objectmodel::RenamedData mu; - - SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_COLLISION_RESPONSE_CONTACT() - sofa::core::objectmodel::RenamedData tol; - Data d_mu; ///< friction coefficient (0 for frictionless contacts) - Data d_tol; ///< tolerance for the constraints resolution (0 for default tolerance) - std::vector< sofa::core::collision::DetectionOutput* > contacts; - std::vector< std::pair< std::pair, double > > mappedContacts; - - virtual void activateMappers(); - - void setInteractionTags(MechanicalState1* mstate1, MechanicalState2* mstate2); + Data d_mu; ///< friction parameter FrictionContact(); FrictionContact(CollisionModel1* model1, CollisionModel2* model2, Intersection* intersectionMethod); - ~FrictionContact() override; -public: - void cleanup() override; - - std::pair getCollisionModels() override { return std::make_pair(model1,model2); } - - void setDetectionOutputs(OutputVector* outputs) override; + virtual ~FrictionContact() = default; - void createResponse(core::objectmodel::BaseContext* group) override; + virtual constraint::lagrangian::model::UnilateralLagrangianContactParameters getParameterFromDatas() const override; + virtual void setupConstraint(MechanicalState1 *,MechanicalState2 *) override; - void removeResponse() override; }; } // namespace sofa::component::collision::response::contact diff --git a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/FrictionContact.inl b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/FrictionContact.inl index a7fdd1fcce1..0d2d1b43cb0 100644 --- a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/FrictionContact.inl +++ b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/FrictionContact.inl @@ -41,235 +41,24 @@ FrictionContact::FrictionCo template < class TCollisionModel1, class TCollisionModel2, class ResponseDataTypes > FrictionContact::FrictionContact(CollisionModel1* model1, CollisionModel2* model2, Intersection* intersectionMethod) - : model1(model1) - , model2(model2) - , intersectionMethod(intersectionMethod) - , m_constraint(nullptr) - , parent(nullptr) - , d_mu (initData(&d_mu, 0.8, "mu", "friction coefficient (0 for frictionless contacts)")) - , d_tol (initData(&d_tol, 0.0, "tol", "tolerance for the constraints resolution (0 for default tolerance)")) + : BaseUnilateralContactResponse(model1,model2,intersectionMethod) + , d_mu (initData(&d_mu, 0.8, "mu", "Friction coefficient (0 for frictionless contacts)")) { - selfCollision = ((core::CollisionModel*)model1 == (core::CollisionModel*)model2); - mapper1.setCollisionModel(model1); - if (!selfCollision) mapper2.setCollisionModel(model2); - contacts.clear(); - mappedContacts.clear(); - mu.setOriginalData(&d_mu); - tol.setOriginalData(&d_tol); - -} - -template < class TCollisionModel1, class TCollisionModel2, class ResponseDataTypes > -FrictionContact::~FrictionContact() -{ -} - -template < class TCollisionModel1, class TCollisionModel2, class ResponseDataTypes > -void FrictionContact::cleanup() -{ - if (m_constraint) - { - m_constraint->cleanup(); - - if (parent != nullptr) - parent->removeObject(m_constraint); - - parent = nullptr; - m_constraint.reset(); - - mapper1.cleanup(); - - if (!selfCollision) - mapper2.cleanup(); - } - - contacts.clear(); - mappedContacts.clear(); -} - - -template < class TCollisionModel1, class TCollisionModel2, class ResponseDataTypes > -void FrictionContact::setDetectionOutputs(OutputVector* o) -{ - TOutputVector& outputs = *static_cast(o); - // We need to remove duplicate contacts - constexpr double minDist2 = 0.00000001f; - - contacts.clear(); - - if (model1->getContactStiffness(0) == 0 || model2->getContactStiffness(0) == 0) - { - msg_error() << "Disabled FrictionContact with " << (outputs.size()) << " collision points."; - return; - } - - contacts.reserve(outputs.size()); - - const int SIZE = outputs.size(); - - // the following procedure cancels the duplicated detection outputs - for (int cpt=0; cptpoint[0]-p->point[0]).norm2()+(detectionOutput->point[1]-p->point[1]).norm2() < minDist2) - found = true; - } - - if (!found) - contacts.push_back(detectionOutput); - } - - // DUPLICATED CONTACTS FOUND - msg_info_when(contacts.size() -void FrictionContact::activateMappers() +constraint::lagrangian::model::UnilateralLagrangianContactParameters FrictionContact::getParameterFromDatas() const { - if (!m_constraint) - { - // Get the mechanical model from mapper1 to fill the constraint vector - MechanicalState1* mmodel1 = mapper1.createMapping(getName().c_str()); - // Get the mechanical model from mapper2 to fill the constraints vector - MechanicalState2* mmodel2; - if (selfCollision) - { - mmodel2 = mmodel1; - } - else - { - mmodel2 = mapper2.createMapping(getName().c_str()); - } - m_constraint = sofa::core::objectmodel::New >(mmodel1, mmodel2); - m_constraint->setName( getName() ); - setInteractionTags(mmodel1, mmodel2); - m_constraint->setCustomTolerance(d_tol.getValue() ); - } - - int size = contacts.size(); - m_constraint->clear(size); - if (selfCollision) - mapper1.resize(2*size); - else - { - mapper1.resize(size); - mapper2.resize(size); - } - int i = 0; - const double d0 = intersectionMethod->getContactDistance() + model1->getProximity() + model2->getProximity(); // - 0.001; - - mappedContacts.resize(contacts.size()); - for (std::vector::const_iterator it = contacts.begin(); it!=contacts.end(); it++, i++) - { - sofa::core::collision::DetectionOutput* o = *it; - CollisionElement1 elem1(o->elem.first); - CollisionElement2 elem2(o->elem.second); - int index1 = elem1.getIndex(); - int index2 = elem2.getIndex(); - - typename DataTypes1::Real r1 = 0.; - typename DataTypes2::Real r2 = 0.; - - // Create mapping for first point - index1 = mapper1.addPointB(o->point[0], index1, r1); - // Create mapping for second point - if (selfCollision) - { - index2 = mapper1.addPointB(o->point[1], index2, r2); - } - else - { - index2 = mapper2.addPointB(o->point[1], index2, r2); - } - const double distance = d0 + r1 + r2; - - mappedContacts[i].first.first = index1; - mappedContacts[i].first.second = index2; - mappedContacts[i].second = distance; - } - - // Update mappings - mapper1.update(); - mapper1.updateXfree(); - if (!selfCollision) mapper2.update(); - if (!selfCollision) mapper2.updateXfree(); + return {d_mu.getValue()}; } -template < class TCollisionModel1, class TCollisionModel2, class ResponseDataTypes > -void FrictionContact::createResponse(core::objectmodel::BaseContext* group) -{ - - activateMappers(); - const double mu_ = this->d_mu.getValue(); - // Checks if friction is considered - if ( mu_ < 0.0 ) - msg_error() << "mu has to take positive values"; - - if (m_constraint) - { - int i=0; - for (std::vector::const_iterator it = contacts.begin(); it!=contacts.end(); it++, i++) - { - const sofa::core::collision::DetectionOutput* o = *it; - const int index1 = mappedContacts[i].first.first; - const int index2 = mappedContacts[i].first.second; - const double distance = mappedContacts[i].second; - - // Polynome de Cantor de NxN sur N bijectif f(x,y)=((x+y)^2+3x+y)/2 - const long index = cantorPolynomia(o->id /*cantorPolynomia(index1, index2)*/,id); - - // Add contact in unilateral constraint - m_constraint->addContact(mu_, o->normal, distance, index1, index2, index, o->id); - } - - if (parent!=nullptr) - { - parent->removeObject(this); - parent->removeObject(m_constraint); - } - - parent = group; - if (parent!=nullptr) - { - parent->addObject(this); - parent->addObject(m_constraint); - } - } -} template < class TCollisionModel1, class TCollisionModel2, class ResponseDataTypes > -void FrictionContact::removeResponse() +void FrictionContact::setupConstraint(MechanicalState1 * mmodel1,MechanicalState2 * mmodel2) { - if (m_constraint) - { - mapper1.resize(0); - mapper2.resize(0); - if (parent!=nullptr) - { - parent->removeObject(this); - parent->removeObject(m_constraint); - } - parent = nullptr; - } + this->m_constraint = sofa::core::objectmodel::New >(mmodel1, mmodel2); } -template < class TCollisionModel1, class TCollisionModel2, class ResponseDataTypes > -void FrictionContact::setInteractionTags(MechanicalState1* mstate1, MechanicalState2* mstate2) -{ - sofa::core::objectmodel::TagSet tagsm1 = mstate1->getTags(); - sofa::core::objectmodel::TagSet tagsm2 = mstate2->getTags(); - sofa::core::objectmodel::TagSet::iterator it; - for(it=tagsm1.begin(); it != tagsm1.end(); it++) - m_constraint->addTag(*it); - for(it=tagsm2.begin(); it!=tagsm2.end(); it++) - m_constraint->addTag(*it); -} } //namespace sofa::component::collision::response::contact diff --git a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/RuleBasedContactManager.h b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/RuleBasedContactManager.h index 76afa084d0d..c88b084da9b 100644 --- a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/RuleBasedContactManager.h +++ b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/RuleBasedContactManager.h @@ -23,7 +23,7 @@ #include #include -#include +#include namespace sofa::component::collision::response::contact { @@ -104,7 +104,7 @@ class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API RuleBasedContactManager : pu }; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_COLLISION_RESPONSE_CONTACT() - sofa::core::objectmodel::RenamedData< type::vector > rules; + sofa::core::objectmodel::lifecycle::RenamedData< type::vector > rules; diff --git a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/StickContactConstraint.h b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/StickContactConstraint.h index d23b57efc94..cea3442ec71 100644 --- a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/StickContactConstraint.h +++ b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/StickContactConstraint.h @@ -31,7 +31,7 @@ #include #include -#include +#include namespace sofa::component::collision::response::contact { @@ -73,7 +73,7 @@ class StickContactConstraint : public core::collision::Contact, public ContactId ~StickContactConstraint() override; public: SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_COLLISION_RESPONSE_CONTACT() - sofa::core::objectmodel::RenamedData f_keepAlive; + sofa::core::objectmodel::lifecycle::RenamedData f_keepAlive; Data d_keepAlive; ///< set to true to keep this contact alive even after collisions are no longer detected diff --git a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/TetrahedronAugmentedLagrangianContact.cpp b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/TetrahedronAugmentedLagrangianContact.cpp new file mode 100644 index 00000000000..d5fe12ce865 --- /dev/null +++ b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/TetrahedronAugmentedLagrangianContact.cpp @@ -0,0 +1,60 @@ +/****************************************************************************** +* SOFA, Simulation Open-Framework Architecture * +* (c) 2006 INRIA, USTL, UJF, CNRS, MGH * +* * +* This program is free software; you can redistribute it and/or modify it * +* under the terms of the GNU Lesser General Public License as published by * +* the Free Software Foundation; either version 2.1 of the License, or (at * +* your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, but WITHOUT * +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * +* for more details. * +* * +* You should have received a copy of the GNU Lesser General Public License * +* along with this program. If not, see . * +******************************************************************************* +* Authors: The SOFA Team and external contributors (see Authors.txt) * +* * +* Contact information: contact@sofa-framework.org * +******************************************************************************/ +#include +#include +#include +#include +#include +#include + +using namespace sofa::core::collision; + +namespace sofa::component::collision::response::contact +{ + +using namespace sofa::component::collision::geometry; + +Creator> > TetrahedronSphereAugmentedLagrangianResponseClass("AugmentedLagrangianResponseConstraint",true); +Creator> > TetrahedronPointAugmentedLagrangianResponseClass("AugmentedLagrangianResponseConstraint",true); +Creator> > TetrahedronLineAugmentedLagrangianResponseClass("AugmentedLagrangianResponseConstraint",true); +Creator> > TetrahedronTriangleAugmentedLagrangianResponseClass("AugmentedLagrangianResponseConstraint",true); +Creator > TetrahedronTetrahedronAugmentedLagrangianResponseClass("AugmentedLagrangianResponseConstraint",true); + +Creator> > TetrahedronSpherePenalityAugmentedLagrangianResponseClass("AugmentedLagrangianResponseConstraint",true); +Creator> > TetrahedronPointPenalityAugmentedLagrangianResponseClass("AugmentedLagrangianResponseConstraint",true); +Creator> > TetrahedronLinePenalityAugmentedLagrangianResponseClass("AugmentedLagrangianResponseConstraint",true); +Creator> > TetrahedronTrianglePenalityAugmentedLagrangianResponseClass("AugmentedLagrangianResponseConstraint",true); +Creator > TetrahedronTetrahedronPenalityAugmentedLagrangianResponseClass("AugmentedLagrangianResponseConstraint",true); + +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API response::contact::BaseUnilateralContactResponse,constraint::lagrangian::model::AugmentedLagrangianContactParameters>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API response::contact::BaseUnilateralContactResponse,constraint::lagrangian::model::AugmentedLagrangianContactParameters>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API response::contact::BaseUnilateralContactResponse,constraint::lagrangian::model::AugmentedLagrangianContactParameters>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API response::contact::BaseUnilateralContactResponse,constraint::lagrangian::model::AugmentedLagrangianContactParameters>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API response::contact::BaseUnilateralContactResponse; + +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API response::contact::AugmentedLagrangianResponse>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API response::contact::AugmentedLagrangianResponse>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API response::contact::AugmentedLagrangianResponse>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API response::contact::AugmentedLagrangianResponse>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API response::contact::AugmentedLagrangianResponse; + +} // namespace sofa::component::collision::response::contact diff --git a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/TetrahedronFrictionContact.cpp b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/TetrahedronFrictionContact.cpp index 3f20f87b676..53d5265d7bc 100644 --- a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/TetrahedronFrictionContact.cpp +++ b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/TetrahedronFrictionContact.cpp @@ -24,6 +24,7 @@ #include #include #include +#include using namespace sofa::core::collision; @@ -44,6 +45,12 @@ Creator> > TetrahedronTrianglePenalityFrictionContactClass("FrictionContactConstraint",true); Creator > TetrahedronTetrahedronPenalityFrictionContactClass("FrictionContactConstraint",true); +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API response::contact::BaseUnilateralContactResponse,constraint::lagrangian::model::UnilateralLagrangianContactParameters>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API response::contact::BaseUnilateralContactResponse,constraint::lagrangian::model::UnilateralLagrangianContactParameters>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API response::contact::BaseUnilateralContactResponse,constraint::lagrangian::model::UnilateralLagrangianContactParameters>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API response::contact::BaseUnilateralContactResponse,constraint::lagrangian::model::UnilateralLagrangianContactParameters>; +template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API response::contact::BaseUnilateralContactResponse; + template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API response::contact::FrictionContact>; template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API response::contact::FrictionContact>; template class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API response::contact::FrictionContact>; diff --git a/Sofa/Component/Collision/Response/Contact/tests/CMakeLists.txt b/Sofa/Component/Collision/Response/Contact/tests/CMakeLists.txt index 73c983810c6..8da60705f95 100644 --- a/Sofa/Component/Collision/Response/Contact/tests/CMakeLists.txt +++ b/Sofa/Component/Collision/Response/Contact/tests/CMakeLists.txt @@ -6,7 +6,8 @@ set(SOURCE_FILES PenalityContactForceField_test.cpp ) + add_executable(${PROJECT_NAME} ${SOURCE_FILES}) target_link_libraries(${PROJECT_NAME} Sofa.Testing Sofa.Component.Collision.Testing Sofa.Component.SolidMechanics.Testing) -target_link_libraries(${PROJECT_NAME} Sofa.Component.Collision.Response.Contact) +target_link_libraries(${PROJECT_NAME} Sofa.Component.Collision.Response.Contact Sofa.Component.Constraint.Lagrangian) add_test(NAME ${PROJECT_NAME} COMMAND ${PROJECT_NAME}) diff --git a/Sofa/Component/Collision/Response/Mapper/src/sofa/component/collision/response/mapper/init.cpp b/Sofa/Component/Collision/Response/Mapper/src/sofa/component/collision/response/mapper/init.cpp index 562f561e99c..ae377f44842 100644 --- a/Sofa/Component/Collision/Response/Mapper/src/sofa/component/collision/response/mapper/init.cpp +++ b/Sofa/Component/Collision/Response/Mapper/src/sofa/component/collision/response/mapper/init.cpp @@ -51,6 +51,7 @@ const char* getModuleVersion() void registerObjects(sofa::core::ObjectFactory* factory) { // this library does not register any component in the Factory + SOFA_UNUSED(factory); } void init() diff --git a/Sofa/Component/Collision/Response/src/sofa/component/collision/response/init.cpp b/Sofa/Component/Collision/Response/src/sofa/component/collision/response/init.cpp index 1f530ac7e92..79fd36c7bd4 100644 --- a/Sofa/Component/Collision/Response/src/sofa/component/collision/response/init.cpp +++ b/Sofa/Component/Collision/Response/src/sofa/component/collision/response/init.cpp @@ -26,6 +26,7 @@ #include #include +#include namespace sofa::component::collision::response { @@ -54,8 +55,8 @@ const char* getModuleVersion() void registerObjects(sofa::core::ObjectFactory* factory) { - factory->registerObjectsFromPlugin("Sofa.Component.Collision.Response.Mapper"); - factory->registerObjectsFromPlugin("Sofa.Component.Collision.Response.Contact"); + factory->registerObjectsFromPlugin(Sofa.Component.Collision.Response.Mapper); + factory->registerObjectsFromPlugin(Sofa.Component.Collision.Response.Contact); } void init() diff --git a/Sofa/Component/Collision/src/sofa/component/collision/init.cpp b/Sofa/Component/Collision/src/sofa/component/collision/init.cpp index 7fa133efb29..1423e912ea0 100644 --- a/Sofa/Component/Collision/src/sofa/component/collision/init.cpp +++ b/Sofa/Component/Collision/src/sofa/component/collision/init.cpp @@ -27,6 +27,7 @@ #include #include +#include namespace sofa::component::collision { @@ -55,9 +56,9 @@ const char* getModuleVersion() void registerObjects(sofa::core::ObjectFactory* factory) { - factory->registerObjectsFromPlugin("Sofa.Component.Collision.Geometry"); - factory->registerObjectsFromPlugin("Sofa.Component.Collision.Detection"); - factory->registerObjectsFromPlugin("Sofa.Component.Collision.Response"); + factory->registerObjectsFromPlugin(Sofa.Component.Collision.Geometry); + factory->registerObjectsFromPlugin(Sofa.Component.Collision.Detection); + factory->registerObjectsFromPlugin(Sofa.Component.Collision.Response); } void init() diff --git a/Sofa/Component/Constraint/Lagrangian/Correction/src/sofa/component/constraint/lagrangian/correction/PrecomputedConstraintCorrection.h b/Sofa/Component/Constraint/Lagrangian/Correction/src/sofa/component/constraint/lagrangian/correction/PrecomputedConstraintCorrection.h index 2a296bc9b8c..f075378651d 100644 --- a/Sofa/Component/Constraint/Lagrangian/Correction/src/sofa/component/constraint/lagrangian/correction/PrecomputedConstraintCorrection.h +++ b/Sofa/Component/Constraint/Lagrangian/Correction/src/sofa/component/constraint/lagrangian/correction/PrecomputedConstraintCorrection.h @@ -30,7 +30,7 @@ #include #include -#include +#include namespace sofa::component::constraint::lagrangian::correction { @@ -61,22 +61,22 @@ class PrecomputedConstraintCorrection : public sofa::core::behavior::ConstraintC typedef sofa::type::MatNoInit<3, 3, Real> Transformation; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_CORRECTION() - sofa::core::objectmodel::RenamedData m_rotations; + sofa::core::objectmodel::lifecycle::RenamedData m_rotations; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_CORRECTION() - sofa::core::objectmodel::RenamedData m_restRotations; + sofa::core::objectmodel::lifecycle::RenamedData m_restRotations; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_CORRECTION() - sofa::core::objectmodel::RenamedData recompute; + sofa::core::objectmodel::lifecycle::RenamedData recompute; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_CORRECTION() - sofa::core::objectmodel::RenamedData debugViewFrameScale; + sofa::core::objectmodel::lifecycle::RenamedData debugViewFrameScale; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_CORRECTION() - sofa::core::objectmodel::RenamedData f_fileCompliance; + sofa::core::objectmodel::lifecycle::RenamedData f_fileCompliance; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_CORRECTION() - sofa::core::objectmodel::RenamedData fileDir; + sofa::core::objectmodel::lifecycle::RenamedData fileDir; Data d_rotations; Data d_restRotations; diff --git a/Sofa/Component/Constraint/Lagrangian/Correction/src/sofa/component/constraint/lagrangian/correction/UncoupledConstraintCorrection.h b/Sofa/Component/Constraint/Lagrangian/Correction/src/sofa/component/constraint/lagrangian/correction/UncoupledConstraintCorrection.h index 0954dbefcec..4ee8641eb7d 100644 --- a/Sofa/Component/Constraint/Lagrangian/Correction/src/sofa/component/constraint/lagrangian/correction/UncoupledConstraintCorrection.h +++ b/Sofa/Component/Constraint/Lagrangian/Correction/src/sofa/component/constraint/lagrangian/correction/UncoupledConstraintCorrection.h @@ -26,7 +26,7 @@ #include #include -#include +#include namespace sofa::component::constraint::lagrangian::correction { @@ -113,13 +113,13 @@ class UncoupledConstraintCorrection : public sofa::core::behavior::ConstraintCor SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_CORRECTION() - sofa::core::objectmodel::RenamedData< VecReal > compliance; + sofa::core::objectmodel::lifecycle::RenamedData< VecReal > compliance; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_CORRECTION() - sofa::core::objectmodel::RenamedData defaultCompliance; + sofa::core::objectmodel::lifecycle::RenamedData defaultCompliance; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_CORRECTION() - sofa::core::objectmodel::RenamedData f_verbose; + sofa::core::objectmodel::lifecycle::RenamedData f_verbose; core::topology::PointData< VecReal > d_compliance; ///< Compliance value on each dof. If Rigid compliance (7 values): 1st value for translations, 6 others for upper-triangular part of symmetric 3x3 rotation compliance matrix diff --git a/Sofa/Component/Constraint/Lagrangian/Correction/src/sofa/component/constraint/lagrangian/correction/UncoupledConstraintCorrection.inl b/Sofa/Component/Constraint/Lagrangian/Correction/src/sofa/component/constraint/lagrangian/correction/UncoupledConstraintCorrection.inl index bffe28596b2..ebe49bd83c2 100644 --- a/Sofa/Component/Constraint/Lagrangian/Correction/src/sofa/component/constraint/lagrangian/correction/UncoupledConstraintCorrection.inl +++ b/Sofa/Component/Constraint/Lagrangian/Correction/src/sofa/component/constraint/lagrangian/correction/UncoupledConstraintCorrection.inl @@ -128,7 +128,7 @@ UncoupledConstraintCorrection::UncoupledConstraintCorrection(sofa::co else { // Case: soft body - if constexpr (!sofa::type::isRigidType()) + if constexpr (!sofa::type::isRigidType) { const VecReal &comp = d_compliance.getValue(); if (std::any_of(comp.begin(), comp.end(), [](const Real c) { return c == 0; })) diff --git a/Sofa/Component/Constraint/Lagrangian/Model/CMakeLists.txt b/Sofa/Component/Constraint/Lagrangian/Model/CMakeLists.txt index 05559157449..07cfdad10db 100644 --- a/Sofa/Component/Constraint/Lagrangian/Model/CMakeLists.txt +++ b/Sofa/Component/Constraint/Lagrangian/Model/CMakeLists.txt @@ -19,6 +19,11 @@ set(HEADER_FILES ${SOFACOMPONENTCONSTRAINTLAGRANGIANMODEL_SOURCE_DIR}/UnilateralInteractionConstraint.h ${SOFACOMPONENTCONSTRAINTLAGRANGIANMODEL_SOURCE_DIR}/UnilateralInteractionConstraint.inl + ${SOFACOMPONENTCONSTRAINTLAGRANGIANMODEL_SOURCE_DIR}/AugmentedLagrangianResolution.h + ${SOFACOMPONENTCONSTRAINTLAGRANGIANMODEL_SOURCE_DIR}/AugmentedLagrangianConstraint.h + ${SOFACOMPONENTCONSTRAINTLAGRANGIANMODEL_SOURCE_DIR}/AugmentedLagrangianConstraint.inl + ${SOFACOMPONENTCONSTRAINTLAGRANGIANMODEL_SOURCE_DIR}/BaseContactLagrangianConstraint.h + ${SOFACOMPONENTCONSTRAINTLAGRANGIANMODEL_SOURCE_DIR}/BaseContactLagrangianConstraint.inl ${SOFACOMPONENTCONSTRAINTLAGRANGIANMODEL_SOURCE_DIR}/BilateralLagrangianConstraint.h ${SOFACOMPONENTCONSTRAINTLAGRANGIANMODEL_SOURCE_DIR}/BilateralLagrangianConstraint.inl ${SOFACOMPONENTCONSTRAINTLAGRANGIANMODEL_SOURCE_DIR}/FixedLagrangianConstraint.h @@ -35,6 +40,7 @@ set(HEADER_FILES set(SOURCE_FILES ${SOFACOMPONENTCONSTRAINTLAGRANGIANMODEL_SOURCE_DIR}/init.cpp + ${SOFACOMPONENTCONSTRAINTLAGRANGIANMODEL_SOURCE_DIR}/AugmentedLagrangianConstraint.cpp ${SOFACOMPONENTCONSTRAINTLAGRANGIANMODEL_SOURCE_DIR}/BilateralLagrangianConstraint.cpp ${SOFACOMPONENTCONSTRAINTLAGRANGIANMODEL_SOURCE_DIR}/FixedLagrangianConstraint.cpp ${SOFACOMPONENTCONSTRAINTLAGRANGIANMODEL_SOURCE_DIR}/SlidingLagrangianConstraint.cpp diff --git a/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/AugmentedLagrangianConstraint.cpp b/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/AugmentedLagrangianConstraint.cpp new file mode 100644 index 00000000000..e3970402ce7 --- /dev/null +++ b/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/AugmentedLagrangianConstraint.cpp @@ -0,0 +1,109 @@ +/****************************************************************************** +* SOFA, Simulation Open-Framework Architecture * +* (c) 2006 INRIA, USTL, UJF, CNRS, MGH * +* * +* This program is free software; you can redistribute it and/or modify it * +* under the terms of the GNU Lesser General Public License as published by * +* the Free Software Foundation; either version 2.1 of the License, or (at * +* your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, but WITHOUT * +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * +* for more details. * +* * +* You should have received a copy of the GNU Lesser General Public License * +* along with this program. If not, see . * +******************************************************************************* +* Authors: The SOFA Team and external contributors (see Authors.txt) * +* * +* Contact information: contact@sofa-framework.org * +******************************************************************************/ +#define SOFA_COMPONENT_CONSTRAINTSET_AugmentedLagrangianConstraint_CPP +#include +#include +#include +#include + +namespace sofa::component::constraint::lagrangian::model +{ + +using namespace sofa::defaulttype; +using namespace sofa::helper; + +void registerAugmentedLagrangianConstraint(sofa::core::ObjectFactory* factory) +{ + factory->registerObjects(core::ObjectRegistrationData("AugmentedLagrangianConstraint") + .add< AugmentedLagrangianConstraint >()); +} + +template class SOFA_COMPONENT_CONSTRAINT_LAGRANGIAN_MODEL_API BaseContactLagrangianConstraint; +template class SOFA_COMPONENT_CONSTRAINT_LAGRANGIAN_MODEL_API AugmentedLagrangianConstraint; + + + +void AugmentedLagrangianResolutionWithFriction::init(int line, SReal** w, SReal* force) +{ + _W[0]=w[line ][line ]; + _W[1]=w[line ][line+1]; + _W[2]=w[line ][line+2]; + _W[3]=w[line+1][line+1]; + _W[4]=w[line+1][line+2]; + _W[5]=w[line+2][line+2]; + + ////////////////// christian : the following does not work ! ///////// + if(_prev) + { + force[line] = _prev->popForce(); + force[line+1] = _prev->popForce(); + force[line+2] = _prev->popForce(); + } + +} + +void AugmentedLagrangianResolutionWithFriction::resolution(int line, SReal** /*w*/, SReal* d, SReal* force, SReal * /*dfree*/) +{ + force[line] -= d[line] * _epsilon; + + if(force[line] < 0) + { + force[line]=0; force[line+1]=0; force[line+2]=0; + return; + } + + const SReal f_t_0 = force[line + 1] - d[line+ 1] * _epsilon; + const SReal f_t_1 = force[line + 2] - d[line+ 2] * _epsilon; + + const SReal criteria = sqrt(pow(f_t_0,2.0) + pow(f_t_1,2.0)) - _mu * fabs(force[line]); + + if(criteria<0) + { + force[line+1] = f_t_0 ; + force[line+2] = f_t_1 ; + } + else + { + const SReal norm_s = sqrt(pow(d[line+ 1],2.0) + pow(d[line+ 2],2.0)); + force[line+1] -= _mu * d[line] * _epsilon * d[line+ 1]/norm_s; + force[line+2] -= _mu * d[line] * _epsilon * d[line+ 2]/norm_s; + } +} + +void AugmentedLagrangianResolutionWithFriction::store(int line, SReal* force, bool /*convergence*/) +{ + if(_prev) + { + _prev->pushForce(force[line]); + _prev->pushForce(force[line+1]); + _prev->pushForce(force[line+2]); + } + + if(_active) + { + *_active = (force[line] != 0); + _active = nullptr; // Won't be used in the haptic thread + } +} + + +} //namespace sofa::component::constraint::lagrangian::model diff --git a/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/AugmentedLagrangianConstraint.h b/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/AugmentedLagrangianConstraint.h new file mode 100644 index 00000000000..46dab0e3a63 --- /dev/null +++ b/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/AugmentedLagrangianConstraint.h @@ -0,0 +1,87 @@ +/****************************************************************************** +* SOFA, Simulation Open-Framework Architecture * +* (c) 2006 INRIA, USTL, UJF, CNRS, MGH * +* * +* This program is free software; you can redistribute it and/or modify it * +* under the terms of the GNU Lesser General Public License as published by * +* the Free Software Foundation; either version 2.1 of the License, or (at * +* your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, but WITHOUT * +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * +* for more details. * +* * +* You should have received a copy of the GNU Lesser General Public License * +* along with this program. If not, see . * +******************************************************************************* +* Authors: The SOFA Team and external contributors (see Authors.txt) * +* * +* Contact information: contact@sofa-framework.org * +******************************************************************************/ +#pragma once +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sofa::component::constraint::lagrangian::model +{ + +struct AugmentedLagrangianContactParameters final : public BaseContactParams +{ + AugmentedLagrangianContactParameters() : mu(0.0), epsilon(0.0) {}; + AugmentedLagrangianContactParameters(SReal _mu, SReal _epsilon) : mu(_mu), epsilon(_epsilon) {}; + + virtual bool hasTangentialComponent() const override + { + return mu>0.0; + } + + SReal mu; + SReal epsilon; +}; + +template +class AugmentedLagrangianConstraint : public BaseContactLagrangianConstraint +{ +public: + SOFA_CLASS(SOFA_TEMPLATE(AugmentedLagrangianConstraint,DataTypes), SOFA_TEMPLATE2(BaseContactLagrangianConstraint,DataTypes,AugmentedLagrangianContactParameters)); + typedef BaseContactLagrangianConstraint Inherit; + typedef typename Inherit::MechanicalState MechanicalState; + typedef typename Inherit::Contact Contact; + +protected: + AugmentedLagrangianConstraint(MechanicalState* object1=nullptr, MechanicalState* object2=nullptr); + virtual ~AugmentedLagrangianConstraint() = default; + +public: + virtual void getConstraintResolution(const core::ConstraintParams *,std::vector& resTab, unsigned int& offset) override; + + virtual type::vector getUnilateralInteractionIdentifiers() override final + { + type::vector ids = getAugmentedLagrangianIdentifiers(); + ids.push_back("Augmented"); + return ids; + } + + virtual type::vector getAugmentedLagrangianIdentifiers() {return {};} + + +}; + + +#if !defined(SOFA_COMPONENT_CONSTRAINTSET_AugmentedLagrangianConstraint_CPP) + extern template class SOFA_COMPONENT_CONSTRAINT_LAGRANGIAN_MODEL_API BaseContactLagrangianConstraint; + extern template class SOFA_COMPONENT_CONSTRAINT_LAGRANGIAN_MODEL_API AugmentedLagrangianConstraint; +#endif + + +} //namespace sofa::component::constraint::lagrangian::model diff --git a/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/AugmentedLagrangianConstraint.inl b/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/AugmentedLagrangianConstraint.inl new file mode 100644 index 00000000000..914c64f6a3a --- /dev/null +++ b/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/AugmentedLagrangianConstraint.inl @@ -0,0 +1,70 @@ +/****************************************************************************** +* SOFA, Simulation Open-Framework Architecture * +* (c) 2006 INRIA, USTL, UJF, CNRS, MGH * +* * +* This program is free software; you can redistribute it and/or modify it * +* under the terms of the GNU Lesser General Public License as published by * +* the Free Software Foundation; either version 2.1 of the License, or (at * +* your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, but WITHOUT * +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * +* for more details. * +* * +* You should have received a copy of the GNU Lesser General Public License * +* along with this program. If not, see . * +******************************************************************************* +* Authors: The SOFA Team and external contributors (see Authors.txt) * +* * +* Contact information: contact@sofa-framework.org * +******************************************************************************/ +#pragma once +#include +#include +#include +#include +#include + +namespace sofa::component::constraint::lagrangian::model +{ + +template +AugmentedLagrangianConstraint::AugmentedLagrangianConstraint(MechanicalState* object1, MechanicalState* object2) + : Inherit(object1, object2) +{ +} + +template +void AugmentedLagrangianConstraint::getConstraintResolution(const core::ConstraintParams *, std::vector& resTab, unsigned int& offset) +{ + if(this->contactsStatus) + { + delete[] this->contactsStatus; + this->contactsStatus = nullptr; + } + + if (this->contacts.size() > 0) + { + this->contactsStatus = new bool[this->contacts.size()]; + memset(this->contactsStatus, 0, sizeof(bool)*this->contacts.size()); + } + + for(unsigned int i=0; icontacts.size(); i++) + { + Contact& c = this->contacts[i]; + if(c.parameters.hasTangentialComponent()) + { + AugmentedLagrangianResolutionWithFriction* ucrwf = new AugmentedLagrangianResolutionWithFriction(c.parameters.mu,c.parameters.epsilon, nullptr, &(this->contactsStatus[i])); + ucrwf->setTolerance(this->customTolerance); + resTab[offset] = ucrwf; + + // NOTE: this method of storing forces may not work well with 2 threads when using haptics + offset += 3; + } + else + resTab[offset++] = new AugmentedLagrangianResolution(c.parameters.epsilon); + } +} + +} //namespace sofa::component::constraint::lagrangian::model diff --git a/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/AugmentedLagrangianResolution.h b/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/AugmentedLagrangianResolution.h new file mode 100644 index 00000000000..78ff8d7bb73 --- /dev/null +++ b/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/AugmentedLagrangianResolution.h @@ -0,0 +1,74 @@ +/****************************************************************************** +* SOFA, Simulation Open-Framework Architecture * +* (c) 2006 INRIA, USTL, UJF, CNRS, MGH * +* * +* This program is free software; you can redistribute it and/or modify it * +* under the terms of the GNU Lesser General Public License as published by * +* the Free Software Foundation; either version 2.1 of the License, or (at * +* your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, but WITHOUT * +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * +* for more details. * +* * +* You should have received a copy of the GNU Lesser General Public License * +* along with this program. If not, see . * +******************************************************************************* +* Authors: The SOFA Team and external contributors (see Authors.txt) * +* * +* Contact information: contact@sofa-framework.org * +******************************************************************************/ +#pragma once +#include + +#include +#include +#include +#include +#include +#include + + +namespace sofa::component::constraint::lagrangian::model +{ + +class AugmentedLagrangianResolution : public core::behavior::ConstraintResolution +{ + public: + AugmentedLagrangianResolution(SReal epsilon) : core::behavior::ConstraintResolution(1), m_epsilon(epsilon) {} + + void resolution(int line, SReal** w, SReal* d, SReal* force, SReal* dfree) override + { + SOFA_UNUSED(dfree); + force[line] -= d[line] / w[line][line]; + if (force[line] < 0) force[line] = 0.0; + } +private: + SReal m_epsilon; +}; + + +class SOFA_COMPONENT_CONSTRAINT_LAGRANGIAN_MODEL_API AugmentedLagrangianResolutionWithFriction + : public core::behavior::ConstraintResolution +{ + public: + AugmentedLagrangianResolutionWithFriction(SReal mu, SReal epsilon, PreviousForcesContainer* prev = nullptr, + bool* active = nullptr) + : core::behavior::ConstraintResolution(3), _mu(mu), _epsilon(epsilon), _prev(prev), _active(active) + { + } + + void init(int line, SReal** w, SReal* force) override; + void resolution(int line, SReal** w, SReal* d, SReal* force, SReal* dFree) override; + void store(int line, SReal* force, bool /*convergence*/) override; + + protected: + SReal _mu; + SReal _epsilon; + SReal _W[6]; + PreviousForcesContainer* _prev; + bool* _active; // Will set this after the resolution +}; + +} \ No newline at end of file diff --git a/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/BaseContactLagrangianConstraint.h b/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/BaseContactLagrangianConstraint.h new file mode 100644 index 00000000000..512a06ebd5b --- /dev/null +++ b/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/BaseContactLagrangianConstraint.h @@ -0,0 +1,160 @@ +/****************************************************************************** +* SOFA, Simulation Open-Framework Architecture * +* (c) 2006 INRIA, USTL, UJF, CNRS, MGH * +* * +* This program is free software; you can redistribute it and/or modify it * +* under the terms of the GNU Lesser General Public License as published by * +* the Free Software Foundation; either version 2.1 of the License, or (at * +* your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, but WITHOUT * +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * +* for more details. * +* * +* You should have received a copy of the GNU Lesser General Public License * +* along with this program. If not, see . * +******************************************************************************* +* Authors: The SOFA Team and external contributors (see Authors.txt) * +* * +* Contact information: contact@sofa-framework.org * +******************************************************************************/ +#pragma once +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sofa::component::constraint::lagrangian::model +{ + + +//TODO(Paul) C++20: add concept for ContactParams +// Every ContactParams should implement hasTangentialComponent +struct BaseContactParams +{ + virtual bool hasTangentialComponent() const = 0; +}; + +template +class BaseContactLagrangianConstraint : public core::behavior::PairInteractionConstraint +{ +public: + SOFA_CLASS(SOFA_TEMPLATE2(BaseContactLagrangianConstraint,DataTypes,ContactParams), SOFA_TEMPLATE(core::behavior::PairInteractionConstraint,DataTypes)); + + typedef typename DataTypes::VecCoord VecCoord; + typedef typename DataTypes::VecDeriv VecDeriv; + typedef typename DataTypes::MatrixDeriv MatrixDeriv; + typedef typename DataTypes::MatrixDeriv::RowConstIterator MatrixDerivRowConstIterator; + typedef typename DataTypes::MatrixDeriv::ColConstIterator MatrixDerivColConstIterator; + typedef typename DataTypes::MatrixDeriv::RowIterator MatrixDerivRowIterator; + typedef typename DataTypes::MatrixDeriv::ColIterator MatrixDerivColIterator; + typedef typename DataTypes::Coord Coord; + typedef typename DataTypes::Deriv Deriv; + typedef typename Coord::value_type Real; + typedef typename core::behavior::MechanicalState MechanicalState; + + typedef core::behavior::BaseConstraint::ConstraintBlockInfo ConstraintBlockInfo; + typedef core::behavior::BaseConstraint::PersistentID PersistentID; + typedef core::behavior::BaseConstraint::ConstCoord ConstCoord; + + typedef core::behavior::BaseConstraint::VecConstraintBlockInfo VecConstraintBlockInfo; + typedef core::behavior::BaseConstraint::VecPersistentID VecPersistentID; + typedef core::behavior::BaseConstraint::VecConstCoord VecConstCoord; + typedef core::behavior::BaseConstraint::VecConstDeriv VecConstDeriv; + typedef core::behavior::BaseConstraint::VecConstArea VecConstArea; + + typedef core::objectmodel::Data DataVecCoord; + typedef core::objectmodel::Data DataVecDeriv; + typedef core::objectmodel::Data DataMatrixDeriv; + + typedef typename core::behavior::PairInteractionConstraint Inherit; + +protected: + + struct Contact + { + int m1, m2; ///< the two extremities of the spring: masses m1 and m2 + Deriv norm; ///< contact normal, from m1 to m2 + Deriv t; ///< added for friction + Deriv s; ///< added for friction + Real contactDistance; + + unsigned int id; + long contactId; + PersistentID localId; + ContactParams parameters; + + Coord P, Q; + + mutable Real dfree; + }; + + sofa::type::vector contacts; + bool yetIntegrated; + SReal customTolerance; + + bool* contactsStatus; + + /// Computes constraint violation in position and stores it into resolution global vector + /// + /// @param v Global resolution vector + virtual void getPositionViolation(linearalgebra::BaseVector *v); + + ///Computes constraint violation in velocity and stores it into resolution global vector + /// + /// @param v Global resolution vector + virtual void getVelocityViolation(linearalgebra::BaseVector *v); + +public: + + unsigned int constraintId; +protected: + + virtual type::vector getUnilateralInteractionIdentifiers() {return {};} + + virtual type::vector getPairInteractionIdentifiers() override final + { + type::vector ids = getUnilateralInteractionIdentifiers(); + ids.push_back("Unilateral"); + return ids; + } + + + BaseContactLagrangianConstraint(MechanicalState* object1=nullptr, MechanicalState* object2=nullptr); + virtual ~BaseContactLagrangianConstraint(); + +public: + void setCustomTolerance(SReal tol) { customTolerance = tol; } + + void clear(int reserve=0); + + + void addContact(const ContactParams& parameters, Deriv norm, Coord P, Coord Q, Real contactDistance, int m1, int m2, Coord Pfree, Coord Qfree, long id=0, PersistentID localid=0); + void addContact(const ContactParams& parameters, Deriv norm, Coord P, Coord Q, Real contactDistance, int m1, int m2, long id=0, PersistentID localid=0); + void addContact(const ContactParams& parameters, Deriv norm, Real contactDistance, int m1, int m2, long id=0, PersistentID localid=0); + + void buildConstraintMatrix(const core::ConstraintParams* cParams, DataMatrixDeriv &c1, DataMatrixDeriv &c2, unsigned int &cIndex + , const DataVecCoord &x1, const DataVecCoord &x2) override; + + void getConstraintViolation(const core::ConstraintParams* cParams, linearalgebra::BaseVector *v, const DataVecCoord &x1, const DataVecCoord &x2 + , const DataVecDeriv &v1, const DataVecDeriv &v2) override; + + + void getConstraintInfo(const core::ConstraintParams* cParams, VecConstraintBlockInfo& blocks, VecPersistentID& ids, VecConstCoord& positions, VecConstDeriv& directions, VecConstArea& areas) override; + + virtual void getConstraintResolution(const core::ConstraintParams *,std::vector& resTab, unsigned int& offset) =0; + bool isActive() const override; + + void draw(const core::visual::VisualParams* vparams) override; +}; + + +} //namespace sofa::component::constraint::lagrangian::model diff --git a/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/BaseContactLagrangianConstraint.inl b/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/BaseContactLagrangianConstraint.inl new file mode 100644 index 00000000000..27263e58dc1 --- /dev/null +++ b/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/BaseContactLagrangianConstraint.inl @@ -0,0 +1,386 @@ +/****************************************************************************** +* SOFA, Simulation Open-Framework Architecture * +* (c) 2006 INRIA, USTL, UJF, CNRS, MGH * +* * +* This program is free software; you can redistribute it and/or modify it * +* under the terms of the GNU Lesser General Public License as published by * +* the Free Software Foundation; either version 2.1 of the License, or (at * +* your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, but WITHOUT * +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * +* for more details. * +* * +* You should have received a copy of the GNU Lesser General Public License * +* along with this program. If not, see . * +******************************************************************************* +* Authors: The SOFA Team and external contributors (see Authors.txt) * +* * +* Contact information: contact@sofa-framework.org * +******************************************************************************/ +#pragma once +#include +#include +#include +#include +#include + +namespace sofa::component::constraint::lagrangian::model +{ + +template +BaseContactLagrangianConstraint::BaseContactLagrangianConstraint(MechanicalState* object1, MechanicalState* object2) + : Inherit(object1, object2) + , yetIntegrated(false) + , customTolerance(0.0) + , contactsStatus(nullptr) +{ +} + +template +BaseContactLagrangianConstraint::~BaseContactLagrangianConstraint() +{ + if(contactsStatus) + delete[] contactsStatus; +} + +template +void BaseContactLagrangianConstraint::clear(int reserve) +{ + contacts.clear(); + if (reserve) + contacts.reserve(reserve); +} + +template +void BaseContactLagrangianConstraint::addContact(const ContactParams& parameters, Deriv norm, Coord P, Coord Q, Real contactDistance, int m1, int m2, long id, PersistentID localid) +{ + addContact(parameters, norm, P, Q, contactDistance, m1, m2, + this->getMState2()->read(core::vec_id::read_access::freePosition)->getValue()[m2], + this->getMState1()->read(core::vec_id::read_access::freePosition)->getValue()[m1], + id, localid); +} + +template +void BaseContactLagrangianConstraint::addContact(const ContactParams& parameters, Deriv norm, Real contactDistance, int m1, int m2, long id, PersistentID localid) +{ + addContact(parameters, norm, + this->getMState2()->read(core::vec_id::read_access::position)->getValue()[m2], + this->getMState1()->read(core::vec_id::read_access::position)->getValue()[m1], + contactDistance, m1, m2, + this->getMState2()->read(core::vec_id::read_access::freePosition)->getValue()[m2], + this->getMState1()->read(core::vec_id::read_access::freePosition)->getValue()[m1], + id, localid); +} + +template +void BaseContactLagrangianConstraint::addContact(const ContactParams& parameters, Deriv norm, Coord P, Coord Q, Real contactDistance, int m1, int m2, Coord /*Pfree*/, Coord /*Qfree*/, long id, PersistentID localid) +{ + contacts.resize(contacts.size() + 1); + Contact &c = contacts.back(); + + c.P = P; + c.Q = Q; + c.m1 = m1; + c.m2 = m2; + c.norm = norm; + c.t = Deriv(norm.z(), norm.x(), norm.y()); + c.s = cross(norm, c.t); + c.s = c.s / c.s.norm(); + c.t = cross((-norm), c.s); + c.parameters= parameters; + c.contactId = id; + c.localId = localid; + c.contactDistance = contactDistance; +} + + +template +void BaseContactLagrangianConstraint::buildConstraintMatrix(const core::ConstraintParams *, DataMatrixDeriv &c1_d, DataMatrixDeriv &c2_d, unsigned int &contactId + , const DataVecCoord &, const DataVecCoord &) +{ + assert(this->mstate1); + assert(this->mstate2); + + if (this->mstate1 == this->mstate2) + { + helper::WriteAccessor c1 = c1_d; + + + for (unsigned int i = 0; i < contacts.size(); i++) + { + Contact& c = contacts[i]; + + c.id = contactId++; + + MatrixDerivRowIterator c1_it = c1->writeLine(c.id); + + c1_it.addCol(c.m1, -c.norm); + c1_it.addCol(c.m2, c.norm); + + if (c.parameters.hasTangentialComponent()) + { + c1_it = c1->writeLine(c.id + 1); + c1_it.setCol(c.m1, -c.t); + c1_it.setCol(c.m2, c.t); + + c1_it = c1->writeLine(c.id + 2); + c1_it.setCol(c.m1, -c.s); + c1_it.setCol(c.m2, c.s); + + contactId += 2; + } + } + + } + else + { + helper::WriteAccessor c1 = c1_d; + helper::WriteAccessor c2 = c2_d; + + for (unsigned int i = 0; i < contacts.size(); i++) + { + Contact& c = contacts[i]; + + c.id = contactId++; + + MatrixDerivRowIterator c1_it = c1->writeLine(c.id); + c1_it.addCol(c.m1, -c.norm); + + MatrixDerivRowIterator c2_it = c2->writeLine(c.id); + c2_it.addCol(c.m2, c.norm); + + if (c.parameters.hasTangentialComponent()) + { + c1_it = c1->writeLine(c.id + 1); + c1_it.setCol(c.m1, -c.t); + + c1_it = c1->writeLine(c.id + 2); + c1_it.setCol(c.m1, -c.s); + + c2_it = c2->writeLine(c.id + 1); + c2_it.setCol(c.m2, c.t); + + c2_it = c2->writeLine(c.id + 2); + c2_it.setCol(c.m2, c.s); + + contactId += 2; + } + } + + } +} + + +template +void BaseContactLagrangianConstraint::getPositionViolation(linearalgebra::BaseVector *v) +{ + const VecCoord &PfreeVec = this->getMState2()->read(core::vec_id::read_access::freePosition)->getValue(); + const VecCoord &QfreeVec = this->getMState1()->read(core::vec_id::read_access::freePosition)->getValue(); + + Real dfree = (Real)0.0; + Real dfree_t = (Real)0.0; + Real dfree_s = (Real)0.0; + + const unsigned int cSize = contacts.size(); + + for (unsigned int i = 0; i < cSize; i++) + { + const Contact& c = contacts[i]; + + // Compute dfree, dfree_t and d_free_s + + const Coord &Pfree = PfreeVec[c.m2]; + const Coord &Qfree = QfreeVec[c.m1]; + + const Coord PPfree = Pfree - c.P; + const Coord QQfree = Qfree - c.Q; + + const Real ref_dist = PPfree.norm() + QQfree.norm(); + + dfree = dot(Pfree - Qfree, c.norm) - c.contactDistance; + const Real delta = dot(c.P - c.Q, c.norm) - c.contactDistance; + + if ((helper::rabs(delta) < 0.00001 * ref_dist) && (helper::rabs(dfree) < 0.00001 * ref_dist)) + { + dfree_t = dot(PPfree, c.t) - dot(QQfree, c.t); + dfree_s = dot(PPfree, c.s) - dot(QQfree, c.s); + } + else if (helper::rabs(delta - dfree) > 0.001 * delta) + { + const Real dt = delta / (delta - dfree); + + if (dt > 0.0 && dt < 1.0) + { + const Coord Pt = c.P * (1 - dt) + Pfree * dt; + const Coord Qt = c.Q * (1 - dt) + Qfree * dt; + const Coord PtPfree = Pfree - Pt; + const Coord QtQfree = Qfree - Qt; + + dfree_t = dot(PtPfree, c.t) - dot(QtQfree, c.t); + dfree_s = dot(PtPfree, c.s) - dot(QtQfree, c.s); + } + else if (dfree < 0.0) + { + dfree_t = dot(PPfree, c.t) - dot(QQfree, c.t); + dfree_s = dot(PPfree, c.s) - dot(QQfree, c.s); + } + else + { + dfree_t = 0; + dfree_s = 0; + } + } + else + { + dfree_t = dot(PPfree, c.t) - dot(QQfree, c.t); + dfree_s = dot(PPfree, c.s) - dot(QQfree, c.s); + } + + // Sets dfree in global violation vector + + v->set(c.id, dfree); + + c.dfree = dfree; // PJ : For isActive() method. Don't know if it's still usefull. + + if (c.parameters.hasTangentialComponent()) + { + v->set(c.id + 1, dfree_t); + v->set(c.id + 2, dfree_s); + } + } +} + + +template +void BaseContactLagrangianConstraint::getVelocityViolation(linearalgebra::BaseVector *v) +{ + auto P = this->getMState2()->readPositions(); + auto Q = this->getMState1()->readPositions(); + + const SReal dt = this->getContext()->getDt(); + const SReal invDt = SReal(1.0) / dt; + + const VecDeriv &PvfreeVec = this->getMState2()->read(core::vec_id::read_access::freeVelocity)->getValue(); + const VecDeriv &QvfreeVec = this->getMState1()->read(core::vec_id::read_access::freeVelocity)->getValue(); + + const unsigned int cSize = contacts.size(); + + for (unsigned int i = 0; i < cSize; i++) + { + const Contact& c = contacts[i]; + + const Deriv QP_invDt = (P[c.m2] - Q[c.m1])*invDt; + const Deriv QP_vfree = PvfreeVec[c.m2] - QvfreeVec[c.m1]; + const Deriv dFreeVec = QP_vfree + QP_invDt; + + v->set(c.id, dot(dFreeVec, c.norm) - c.contactDistance*invDt ); // dvfree = 1/dt * [ dot ( P - Q, n) - contactDist ] + dot(v_P - v_Q , n ) ] + + if (c.parameters.hasTangentialComponent()) + { + v->set(c.id + 1, dot(QP_vfree, c.t)); // dfree_t + v->set(c.id + 2, dot(QP_vfree, c.s)); // dfree_s + } + } +} + + +template +void BaseContactLagrangianConstraint::getConstraintViolation(const core::ConstraintParams *cparams, linearalgebra::BaseVector *v, const DataVecCoord &, const DataVecCoord & + , const DataVecDeriv &, const DataVecDeriv &) +{ + switch (cparams->constOrder()) + { + case core::ConstraintOrder::POS_AND_VEL : + case core::ConstraintOrder::POS : + getPositionViolation(v); + break; + + case core::ConstraintOrder::ACC : + case core::ConstraintOrder::VEL : + getVelocityViolation(v); + break; + + default : + msg_error() << "BaseContactLagrangianConstraint doesn't implement " << cparams->getName() << " constraint violation\n"; + break; + } +} + + +template +void BaseContactLagrangianConstraint::getConstraintInfo(const core::ConstraintParams*, VecConstraintBlockInfo& blocks, VecPersistentID& ids, VecConstCoord& /*positions*/, VecConstDeriv& directions, VecConstArea& /*areas*/) +{ + if (contacts.empty()) return; + const bool friction = (contacts[0].parameters.mu > 0.0); /// @todo: can there be both friction-less and friction contacts in the same BaseContactLagrangianConstraint ??? + ConstraintBlockInfo info; + info.parent = this; + info.const0 = contacts[0].id; + info.nbLines = friction ? 3 : 1; + info.hasId = true; + info.offsetId = ids.size(); + info.hasDirection = true; + info.offsetDirection = directions.size(); + info.nbGroups = contacts.size(); + + for (unsigned int i=0; i +bool BaseContactLagrangianConstraint::isActive() const +{ + for(unsigned int i = 0; i < contacts.size(); i++) + if(contacts[i].dfree < 0) + return true; + + return false; +} + +template +void BaseContactLagrangianConstraint::draw(const core::visual::VisualParams* vparams) +{ + if (!vparams->displayFlags().getShowInteractionForceFields()) return; + + const auto stateLifeCycle = vparams->drawTool()->makeStateLifeCycle(); + vparams->drawTool()->disableLighting(); + + std::vector redVertices; + std::vector otherVertices; + std::vector otherColors; + + for (unsigned int i=0; idrawTool()->drawLines(otherVertices, 3, otherColors); + + + + +} + +} //namespace sofa::component::constraint::lagrangian::model diff --git a/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/BilateralLagrangianConstraint.cpp b/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/BilateralLagrangianConstraint.cpp index a1f07d3db8c..5ba36d4df61 100644 --- a/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/BilateralLagrangianConstraint.cpp +++ b/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/BilateralLagrangianConstraint.cpp @@ -90,7 +90,7 @@ class BilateralLagrangianConstraintSpecialization static void getConstraintResolution(BilateralLagrangianConstraint& self, const ConstraintParams* cParams, std::vector& resTab, - unsigned int& offset, SReal tolerance) + unsigned int& offset) { SOFA_UNUSED(cParams); const unsigned minp = std::min(self.d_m1.getValue().size(), @@ -100,7 +100,6 @@ class BilateralLagrangianConstraintSpecialization resTab[offset] = new BilateralConstraintResolution3Dof(); offset += 3; BilateralConstraintResolution3Dof* temp = new BilateralConstraintResolution3Dof(); - temp->setTolerance(tolerance); // specific (smaller) tolerance for the rotation resTab[offset] = temp; offset += 3; } @@ -276,8 +275,7 @@ void BilateralLagrangianConstraint::getConstraintResolution( unsigned int& offset) { RigidBilateralLagrangianConstraint::getConstraintResolution(*this, - cParams, resTab, offset, - d_numericalTolerance.getValue()); + cParams, resTab, offset); } template <> SOFA_COMPONENT_CONSTRAINT_LAGRANGIAN_MODEL_API diff --git a/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/BilateralLagrangianConstraint.h b/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/BilateralLagrangianConstraint.h index abc001ded95..9b693e076e3 100644 --- a/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/BilateralLagrangianConstraint.h +++ b/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/BilateralLagrangianConstraint.h @@ -35,7 +35,7 @@ #include -#include +#include namespace sofa::component::constraint::lagrangian::model { @@ -98,23 +98,24 @@ class BilateralLagrangianConstraint : public PairInteractionConstraint cid; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_MODEL() - sofa::core::objectmodel::RenamedData > m1; + sofa::core::objectmodel::lifecycle::RenamedData > m1; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_MODEL() - sofa::core::objectmodel::RenamedData > m2; + sofa::core::objectmodel::lifecycle::RenamedData > m2; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_MODEL() - sofa::core::objectmodel::RenamedData restVector; + sofa::core::objectmodel::lifecycle::RenamedData restVector; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_MODEL() - sofa::core::objectmodel::RenamedData keepOrientDiff; + sofa::core::objectmodel::lifecycle::RenamedData keepOrientDiff; DataSubsetIndices d_m1; ///< index of the constraint on the first model DataSubsetIndices d_m2; ///< index of the constraint on the second model Data d_restVector; ///< Relative position to maintain between attached points (optional) VecCoord initialDifference; - Data d_numericalTolerance; ///< a real value specifying the tolerance during the constraint solving. (default=0.0001 + SOFA_ATTRIBUTE_DEPRECATED__BILATERALREMOVEUNUSEDTOLERANCE() DeprecatedAndRemoved d_numericalTolerance; ///< a real value specifying the tolerance during the constraint solving. (default=0.0001 + Data d_activate; ///< control constraint activation (true by default) Data d_keepOrientDiff; ///< keep the initial difference in orientation (only for rigids) diff --git a/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/BilateralLagrangianConstraint.inl b/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/BilateralLagrangianConstraint.inl index 28e5ddd9d19..18a56f733cd 100644 --- a/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/BilateralLagrangianConstraint.inl +++ b/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/BilateralLagrangianConstraint.inl @@ -44,8 +44,6 @@ BilateralLagrangianConstraint::BilateralLagrangianConstraint(Mechanic , d_m1(initData(&d_m1, "first_point","index of the constraint on the first model (object1)")) , d_m2(initData(&d_m2, "second_point","index of the constraint on the second model (object2)")) , d_restVector(initData(&d_restVector, "rest_vector","Relative position to maintain between attached points (optional)")) - , d_numericalTolerance(initData(&d_numericalTolerance, 1e-4_sreal, "numericalTolerance", - "a real value specifying the tolerance during the constraint solving.") ) , d_activate( initData(&d_activate, true, "activate", "control constraint activation (true by default)")) , d_keepOrientDiff(initData(&d_keepOrientDiff, false, "keepOrientationDifference", "keep the initial difference in orientation (only for rigids)")) , l_topology1(initLink("topology1", "link to the first topology container")) diff --git a/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/StopperLagrangianConstraint.h b/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/StopperLagrangianConstraint.h index aeebd35cf94..2b7b3413745 100644 --- a/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/StopperLagrangianConstraint.h +++ b/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/StopperLagrangianConstraint.h @@ -27,7 +27,7 @@ #include #include -#include +#include namespace sofa::component::constraint::lagrangian::model { @@ -89,13 +89,13 @@ class StopperLagrangianConstraint : public core::behavior::Constraint protected: SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_MODEL() - sofa::core::objectmodel::RenamedData index; + sofa::core::objectmodel::lifecycle::RenamedData index; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_MODEL() - sofa::core::objectmodel::RenamedData min; + sofa::core::objectmodel::lifecycle::RenamedData min; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_MODEL() - sofa::core::objectmodel::RenamedData max; + sofa::core::objectmodel::lifecycle::RenamedData max; Data d_index; ///< index of the stop constraint diff --git a/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/UnilateralLagrangianConstraint.cpp b/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/UnilateralLagrangianConstraint.cpp index ab1fa1724c8..5e477574304 100644 --- a/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/UnilateralLagrangianConstraint.cpp +++ b/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/UnilateralLagrangianConstraint.cpp @@ -20,6 +20,9 @@ * Contact information: contact@sofa-framework.org * ******************************************************************************/ #define SOFA_COMPONENT_CONSTRAINTSET_UNILATERALLAGRANGIANCONSTRAINT_CPP +#include +#include +#include #include #include #include @@ -28,6 +31,8 @@ namespace sofa::component::constraint::lagrangian::model { using namespace sofa::defaulttype; +using namespace sofa::helper; + void registerUnilateralLagrangianConstraint(sofa::core::ObjectFactory* factory) { @@ -35,6 +40,8 @@ void registerUnilateralLagrangianConstraint(sofa::core::ObjectFactory* factory) .add< UnilateralLagrangianConstraint >()); } + +template class SOFA_COMPONENT_CONSTRAINT_LAGRANGIAN_MODEL_API BaseContactLagrangianConstraint; template class SOFA_COMPONENT_CONSTRAINT_LAGRANGIAN_MODEL_API UnilateralLagrangianConstraint; diff --git a/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/UnilateralLagrangianConstraint.h b/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/UnilateralLagrangianConstraint.h index f58a0ac1b72..1c888ee0bdd 100644 --- a/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/UnilateralLagrangianConstraint.h +++ b/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/UnilateralLagrangianConstraint.h @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -34,124 +35,41 @@ namespace sofa::component::constraint::lagrangian::model { -template -class UnilateralLagrangianConstraint : public core::behavior::PairInteractionConstraint +struct UnilateralLagrangianContactParameters final : public BaseContactParams { -public: - SOFA_CLASS(SOFA_TEMPLATE(UnilateralLagrangianConstraint,DataTypes), SOFA_TEMPLATE(core::behavior::PairInteractionConstraint,DataTypes)); - - typedef typename DataTypes::VecCoord VecCoord; - typedef typename DataTypes::VecDeriv VecDeriv; - typedef typename DataTypes::MatrixDeriv MatrixDeriv; - typedef typename DataTypes::MatrixDeriv::RowConstIterator MatrixDerivRowConstIterator; - typedef typename DataTypes::MatrixDeriv::ColConstIterator MatrixDerivColConstIterator; - typedef typename DataTypes::MatrixDeriv::RowIterator MatrixDerivRowIterator; - typedef typename DataTypes::MatrixDeriv::ColIterator MatrixDerivColIterator; - typedef typename DataTypes::Coord Coord; - typedef typename DataTypes::Deriv Deriv; - typedef typename Coord::value_type Real; - typedef typename core::behavior::MechanicalState MechanicalState; - - typedef core::behavior::BaseConstraint::ConstraintBlockInfo ConstraintBlockInfo; - typedef core::behavior::BaseConstraint::PersistentID PersistentID; - typedef core::behavior::BaseConstraint::ConstCoord ConstCoord; + UnilateralLagrangianContactParameters() : mu(0.0) {}; + UnilateralLagrangianContactParameters(SReal _mu) : mu(_mu) {}; - typedef core::behavior::BaseConstraint::VecConstraintBlockInfo VecConstraintBlockInfo; - typedef core::behavior::BaseConstraint::VecPersistentID VecPersistentID; - typedef core::behavior::BaseConstraint::VecConstCoord VecConstCoord; - typedef core::behavior::BaseConstraint::VecConstDeriv VecConstDeriv; - typedef core::behavior::BaseConstraint::VecConstArea VecConstArea; - - typedef core::objectmodel::Data DataVecCoord; - typedef core::objectmodel::Data DataVecDeriv; - typedef core::objectmodel::Data DataMatrixDeriv; - - typedef typename core::behavior::PairInteractionConstraint Inherit; - -protected: - - struct Contact + virtual bool hasTangentialComponent() const override { - int m1, m2; ///< the two extremities of the spring: masses m1 and m2 - Deriv norm; ///< contact normal, from m1 to m2 - Deriv t; ///< added for friction - Deriv s; ///< added for friction - Real contactDistance; - - unsigned int id; - long contactId; - PersistentID localId; - SReal mu; ///< angle for friction - - Coord P, Q; - - mutable Real dfree; - }; - - sofa::type::vector contacts; - Real epsilon; - bool yetIntegrated; - SReal customTolerance; - - PreviousForcesContainer prevForces; - bool* contactsStatus; - - /// Computes constraint violation in position and stores it into resolution global vector - /// - /// @param v Global resolution vector - virtual void getPositionViolation(linearalgebra::BaseVector *v); + return mu>0.0; + } - ///Computes constraint violation in velocity and stores it into resolution global vector - /// - /// @param v Global resolution vector - virtual void getVelocityViolation(linearalgebra::BaseVector *v); + SReal mu; +}; +template +class UnilateralLagrangianConstraint : public BaseContactLagrangianConstraint +{ public: + SOFA_CLASS(SOFA_TEMPLATE(UnilateralLagrangianConstraint,DataTypes), SOFA_TEMPLATE2(BaseContactLagrangianConstraint,DataTypes,UnilateralLagrangianContactParameters)); + typedef BaseContactLagrangianConstraint Inherit; + typedef typename Inherit::MechanicalState MechanicalState; + typedef typename Inherit::Contact Contact; - unsigned int constraintId; protected: - - virtual type::vector getUnilateralInteractionIdentifiers() {return {};} - - virtual type::vector getPairInteractionIdentifiers() override final - { - type::vector ids = getUnilateralInteractionIdentifiers(); - ids.push_back("Unilateral"); - return ids; - } - - UnilateralLagrangianConstraint(MechanicalState* object1=nullptr, MechanicalState* object2=nullptr); - virtual ~UnilateralLagrangianConstraint(); + virtual ~UnilateralLagrangianConstraint() = default; public: - void setCustomTolerance(SReal tol) { customTolerance = tol; } - - void clear(int reserve = 0); - - virtual void addContact(SReal mu, Deriv norm, Coord P, Coord Q, Real contactDistance, int m1, int m2, Coord Pfree, Coord Qfree, long id=0, PersistentID localid=0); - - void addContact(SReal mu, Deriv norm, Coord P, Coord Q, Real contactDistance, int m1, int m2, long id=0, PersistentID localid=0); - void addContact(SReal mu, Deriv norm, Real contactDistance, int m1, int m2, long id=0, PersistentID localid=0); - - void buildConstraintMatrix(const core::ConstraintParams* cParams, DataMatrixDeriv &c1, DataMatrixDeriv &c2, unsigned int &cIndex - , const DataVecCoord &x1, const DataVecCoord &x2) override; - - void getConstraintViolation(const core::ConstraintParams* cParams, linearalgebra::BaseVector *v, const DataVecCoord &x1, const DataVecCoord &x2 - , const DataVecDeriv &v1, const DataVecDeriv &v2) override; - - - void getConstraintInfo(const core::ConstraintParams* cParams, VecConstraintBlockInfo& blocks, VecPersistentID& ids, VecConstCoord& positions, VecConstDeriv& directions, VecConstArea& areas) override; - - void getConstraintResolution(const core::ConstraintParams *,std::vector& resTab, unsigned int& offset) override; - bool isActive() const override; + virtual void getConstraintResolution(const core::ConstraintParams *,std::vector& resTab, unsigned int& offset) override; - void draw(const core::visual::VisualParams* vparams) override; }; #if !defined(SOFA_COMPONENT_CONSTRAINTSET_UNILATERALLAGRANGIANCONSTRAINT_CPP) -extern template class SOFA_COMPONENT_CONSTRAINT_LAGRANGIAN_MODEL_API UnilateralLagrangianConstraint; + extern template class SOFA_COMPONENT_CONSTRAINT_LAGRANGIAN_MODEL_API BaseContactLagrangianConstraint; + extern template class SOFA_COMPONENT_CONSTRAINT_LAGRANGIAN_MODEL_API UnilateralLagrangianConstraint; #endif diff --git a/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/UnilateralLagrangianConstraint.inl b/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/UnilateralLagrangianConstraint.inl index a24d49ce910..f4b4d92ac6e 100644 --- a/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/UnilateralLagrangianConstraint.inl +++ b/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/UnilateralLagrangianConstraint.inl @@ -32,340 +32,31 @@ namespace sofa::component::constraint::lagrangian::model template UnilateralLagrangianConstraint::UnilateralLagrangianConstraint(MechanicalState* object1, MechanicalState* object2) : Inherit(object1, object2) - , epsilon(Real(0.001)) - , yetIntegrated(false) - , customTolerance(0.0) - , contactsStatus(nullptr) { } -template -UnilateralLagrangianConstraint::~UnilateralLagrangianConstraint() -{ - if(contactsStatus) - delete[] contactsStatus; -} - -template -void UnilateralLagrangianConstraint::clear(int reserve) -{ - contacts.clear(); - if (reserve) - contacts.reserve(reserve); -} - -template -void UnilateralLagrangianConstraint::addContact(SReal mu, Deriv norm, Coord P, Coord Q, Real contactDistance, int m1, int m2, long id, PersistentID localid) -{ - addContact(mu, norm, P, Q, contactDistance, m1, m2, - this->getMState2()->read(core::vec_id::read_access::freePosition)->getValue()[m2], - this->getMState1()->read(core::vec_id::read_access::freePosition)->getValue()[m1], - id, localid); -} - -template -void UnilateralLagrangianConstraint::addContact(SReal mu, Deriv norm, Real contactDistance, int m1, int m2, long id, PersistentID localid) -{ - addContact(mu, norm, - this->getMState2()->read(core::vec_id::read_access::position)->getValue()[m2], - this->getMState1()->read(core::vec_id::read_access::position)->getValue()[m1], - contactDistance, m1, m2, - this->getMState2()->read(core::vec_id::read_access::freePosition)->getValue()[m2], - this->getMState1()->read(core::vec_id::read_access::freePosition)->getValue()[m1], - id, localid); -} - -template -void UnilateralLagrangianConstraint::addContact(SReal mu, Deriv norm, Coord P, Coord Q, Real contactDistance, int m1, int m2, Coord /*Pfree*/, Coord /*Qfree*/, long id, PersistentID localid) -{ - contacts.resize(contacts.size() + 1); - Contact &c = contacts.back(); - - c.P = P; - c.Q = Q; - c.m1 = m1; - c.m2 = m2; - c.norm = norm; - c.t = Deriv(norm.z(), norm.x(), norm.y()); - c.s = cross(norm, c.t); - c.s = c.s / c.s.norm(); - c.t = cross((-norm), c.s); - c.mu = mu; - c.contactId = id; - c.localId = localid; - c.contactDistance = contactDistance; -} - - -template -void UnilateralLagrangianConstraint::buildConstraintMatrix(const core::ConstraintParams *, DataMatrixDeriv &c1_d, DataMatrixDeriv &c2_d, unsigned int &contactId - , const DataVecCoord &, const DataVecCoord &) -{ - assert(this->mstate1); - assert(this->mstate2); - - if (this->mstate1 == this->mstate2) - { - MatrixDeriv& c1 = *c1_d.beginEdit(); - - for (unsigned int i = 0; i < contacts.size(); i++) - { - Contact& c = contacts[i]; - - c.id = contactId++; - - MatrixDerivRowIterator c1_it = c1.writeLine(c.id); - - c1_it.addCol(c.m1, -c.norm); - c1_it.addCol(c.m2, c.norm); - - if (c.mu > 0.0) - { - c1_it = c1.writeLine(c.id + 1); - c1_it.setCol(c.m1, -c.t); - c1_it.setCol(c.m2, c.t); - - c1_it = c1.writeLine(c.id + 2); - c1_it.setCol(c.m1, -c.s); - c1_it.setCol(c.m2, c.s); - - contactId += 2; - } - } - - c1_d.endEdit(); - } - else - { - MatrixDeriv& c1 = *c1_d.beginEdit(); - MatrixDeriv& c2 = *c2_d.beginEdit(); - - for (unsigned int i = 0; i < contacts.size(); i++) - { - Contact& c = contacts[i]; - - c.id = contactId++; - - MatrixDerivRowIterator c1_it = c1.writeLine(c.id); - c1_it.addCol(c.m1, -c.norm); - - MatrixDerivRowIterator c2_it = c2.writeLine(c.id); - c2_it.addCol(c.m2, c.norm); - - if (c.mu > 0.0) - { - c1_it = c1.writeLine(c.id + 1); - c1_it.setCol(c.m1, -c.t); - - c1_it = c1.writeLine(c.id + 2); - c1_it.setCol(c.m1, -c.s); - - c2_it = c2.writeLine(c.id + 1); - c2_it.setCol(c.m2, c.t); - - c2_it = c2.writeLine(c.id + 2); - c2_it.setCol(c.m2, c.s); - - contactId += 2; - } - } - - c1_d.endEdit(); - c2_d.endEdit(); - } -} - - -template -void UnilateralLagrangianConstraint::getPositionViolation(linearalgebra::BaseVector *v) -{ - const VecCoord &PfreeVec = this->getMState2()->read(core::vec_id::read_access::freePosition)->getValue(); - const VecCoord &QfreeVec = this->getMState1()->read(core::vec_id::read_access::freePosition)->getValue(); - - Real dfree = (Real)0.0; - Real dfree_t = (Real)0.0; - Real dfree_s = (Real)0.0; - - const unsigned int cSize = contacts.size(); - - for (unsigned int i = 0; i < cSize; i++) - { - const Contact& c = contacts[i]; - - // Compute dfree, dfree_t and d_free_s - - const Coord &Pfree = PfreeVec[c.m2]; - const Coord &Qfree = QfreeVec[c.m1]; - - const Coord PPfree = Pfree - c.P; - const Coord QQfree = Qfree - c.Q; - - const Real ref_dist = PPfree.norm() + QQfree.norm(); - - dfree = dot(Pfree - Qfree, c.norm) - c.contactDistance; - const Real delta = dot(c.P - c.Q, c.norm) - c.contactDistance; - - if ((helper::rabs(delta) < 0.00001 * ref_dist) && (helper::rabs(dfree) < 0.00001 * ref_dist)) - { - dfree_t = dot(PPfree, c.t) - dot(QQfree, c.t); - dfree_s = dot(PPfree, c.s) - dot(QQfree, c.s); - } - else if (helper::rabs(delta - dfree) > 0.001 * delta) - { - const Real dt = delta / (delta - dfree); - - if (dt > 0.0 && dt < 1.0) - { - const Coord Pt = c.P * (1 - dt) + Pfree * dt; - const Coord Qt = c.Q * (1 - dt) + Qfree * dt; - const Coord PtPfree = Pfree - Pt; - const Coord QtQfree = Qfree - Qt; - - dfree_t = dot(PtPfree, c.t) - dot(QtQfree, c.t); - dfree_s = dot(PtPfree, c.s) - dot(QtQfree, c.s); - } - else if (dfree < 0.0) - { - dfree_t = dot(PPfree, c.t) - dot(QQfree, c.t); - dfree_s = dot(PPfree, c.s) - dot(QQfree, c.s); - } - else - { - dfree_t = 0; - dfree_s = 0; - } - } - else - { - dfree_t = dot(PPfree, c.t) - dot(QQfree, c.t); - dfree_s = dot(PPfree, c.s) - dot(QQfree, c.s); - } - - // Sets dfree in global violation vector - - v->set(c.id, dfree); - - c.dfree = dfree; // PJ : For isActive() method. Don't know if it's still useful. - - if (c.mu > 0.0) - { - v->set(c.id + 1, dfree_t); - v->set(c.id + 2, dfree_s); - } - } -} - - -template -void UnilateralLagrangianConstraint::getVelocityViolation(linearalgebra::BaseVector *v) -{ - auto P = this->getMState2()->readPositions(); - auto Q = this->getMState1()->readPositions(); - - const SReal dt = this->getContext()->getDt(); - const SReal invDt = SReal(1.0) / dt; - - const VecDeriv &PvfreeVec = this->getMState2()->read(core::vec_id::read_access::freeVelocity)->getValue(); - const VecDeriv &QvfreeVec = this->getMState1()->read(core::vec_id::read_access::freeVelocity)->getValue(); - - const unsigned int cSize = contacts.size(); - - for (unsigned int i = 0; i < cSize; i++) - { - const Contact& c = contacts[i]; - - const Deriv QP_invDt = (P[c.m2] - Q[c.m1])*invDt; - const Deriv QP_vfree = PvfreeVec[c.m2] - QvfreeVec[c.m1]; - const Deriv dFreeVec = QP_vfree + QP_invDt; - - v->set(c.id, dot(dFreeVec, c.norm) - c.contactDistance*invDt ); // dvfree = 1/dt * [ dot ( P - Q, n) - contactDist ] + dot(v_P - v_Q , n ) ] - - if (c.mu > 0.0) - { - v->set(c.id + 1, dot(QP_vfree, c.t)); // dfree_t - v->set(c.id + 2, dot(QP_vfree, c.s)); // dfree_s - } - } -} - - -template -void UnilateralLagrangianConstraint::getConstraintViolation(const core::ConstraintParams *cparams, linearalgebra::BaseVector *v, const DataVecCoord &, const DataVecCoord & - , const DataVecDeriv &, const DataVecDeriv &) -{ - switch (cparams->constOrder()) - { - case core::ConstraintOrder::POS_AND_VEL : - case core::ConstraintOrder::POS : - getPositionViolation(v); - break; - - case core::ConstraintOrder::ACC : - case core::ConstraintOrder::VEL : - getVelocityViolation(v); - break; - - default : - msg_error() << "UnilateralLagrangianConstraint doesn't implement " << cparams->getName() << " constraint violation\n"; - break; - } -} - - -template -void UnilateralLagrangianConstraint::getConstraintInfo(const core::ConstraintParams*, VecConstraintBlockInfo& blocks, VecPersistentID& ids, VecConstCoord& /*positions*/, VecConstDeriv& directions, VecConstArea& /*areas*/) -{ - if (contacts.empty()) return; - const bool friction = (contacts[0].mu > 0.0); /// @todo: can there be both friction-less and friction contacts in the same UnilateralLagrangianConstraint ??? - ConstraintBlockInfo info; - info.parent = this; - info.const0 = contacts[0].id; - info.nbLines = friction ? 3 : 1; - info.hasId = true; - info.offsetId = ids.size(); - info.hasDirection = true; - info.offsetDirection = directions.size(); - info.nbGroups = contacts.size(); - - for (unsigned int i=0; i void UnilateralLagrangianConstraint::getConstraintResolution(const core::ConstraintParams *, std::vector& resTab, unsigned int& offset) { - if(contactsStatus) + if(this->contactsStatus) { - delete[] contactsStatus; - contactsStatus = nullptr; + delete[] this->contactsStatus; + this->contactsStatus = nullptr; } - if (contacts.size() > 0) + if (this->contacts.size() > 0) { - contactsStatus = new bool[contacts.size()]; - memset(contactsStatus, 0, sizeof(bool)*contacts.size()); + this->contactsStatus = new bool[this->contacts.size()]; + memset(this->contactsStatus, 0, sizeof(bool)*this->contacts.size()); } - for(unsigned int i=0; icontacts.size(); i++) { - Contact& c = contacts[i]; - if(c.mu > 0.0) + Contact& c = this->contacts[i]; + if(c.parameters.hasTangentialComponent()) { - UnilateralConstraintResolutionWithFriction* ucrwf = new UnilateralConstraintResolutionWithFriction(c.mu, nullptr, &contactsStatus[i]); - ucrwf->setTolerance(customTolerance); + UnilateralConstraintResolutionWithFriction* ucrwf = new UnilateralConstraintResolutionWithFriction(c.parameters.mu, nullptr, &this->contactsStatus[i]); + ucrwf->setTolerance(this->customTolerance); resTab[offset] = ucrwf; // TODO : cette méthode de stockage des forces peu mal fonctionner avec 2 threads quand on utilise l'haptique @@ -374,48 +65,6 @@ void UnilateralLagrangianConstraint::getConstraintResolution(const co else resTab[offset++] = new UnilateralConstraintResolution(); } -} - -template -bool UnilateralLagrangianConstraint::isActive() const -{ - for(unsigned int i = 0; i < contacts.size(); i++) - if(contacts[i].dfree < 0) - return true; - - return false; -} - -template -void UnilateralLagrangianConstraint::draw(const core::visual::VisualParams* vparams) -{ - if (!vparams->displayFlags().getShowInteractionForceFields()) return; - - const auto stateLifeCycle = vparams->drawTool()->makeStateLifeCycle(); - vparams->drawTool()->disableLighting(); - - std::vector redVertices; - std::vector otherVertices; - std::vector otherColors; - - for (unsigned int i=0; idrawTool()->drawLines(otherVertices, 3, otherColors); - - - - } } //namespace sofa::component::constraint::lagrangian::model diff --git a/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/config.h.in b/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/config.h.in index 06c71b9df5f..8d0b5acc531 100644 --- a/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/config.h.in +++ b/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/config.h.in @@ -44,4 +44,14 @@ namespace sofa::component::constraint::lagrangian::model SOFA_ATTRIBUTE_DEPRECATED( \ "v24.06", "v24.12", \ "Data renamed according to the guidelines") +#endif + + +#ifdef SOFA_BUILD_SOFA_COMPONENT_CONSTRAINT_LAGRANGIAN_MODEL +#define SOFA_ATTRIBUTE_DEPRECATED__BILATERALREMOVEUNUSEDTOLERANCE() +#else +#define SOFA_ATTRIBUTE_DEPRECATED__BILATERALREMOVEUNUSEDTOLERANCE() \ + SOFA_ATTRIBUTE_DEPRECATED( \ + "v25.06", "v25.12", \ + "Data \'d_numericalTolerance\' has been removed since it was actually not taken into account") #endif \ No newline at end of file diff --git a/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/init.cpp b/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/init.cpp index de09f9f65d9..ba40a5df106 100644 --- a/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/init.cpp +++ b/Sofa/Component/Constraint/Lagrangian/Model/src/sofa/component/constraint/lagrangian/model/init.cpp @@ -26,6 +26,7 @@ namespace sofa::component::constraint::lagrangian::model { +extern void registerAugmentedLagrangianConstraint(sofa::core::ObjectFactory* factory); extern void registerBilateralLagrangianConstraint(sofa::core::ObjectFactory* factory); extern void registerFixedLagrangianConstraint(sofa::core::ObjectFactory* factory); extern void registerSlidingLagrangianConstraint(sofa::core::ObjectFactory* factory); @@ -57,6 +58,7 @@ const char* getModuleVersion() void registerObjects(sofa::core::ObjectFactory* factory) { + registerAugmentedLagrangianConstraint(factory); registerBilateralLagrangianConstraint(factory); registerFixedLagrangianConstraint(factory); registerSlidingLagrangianConstraint(factory); diff --git a/Sofa/Component/Constraint/Lagrangian/Solver/src/sofa/component/constraint/lagrangian/solver/GenericConstraintSolver.h b/Sofa/Component/Constraint/Lagrangian/Solver/src/sofa/component/constraint/lagrangian/solver/GenericConstraintSolver.h index cd3c770fd97..f7d35b82e92 100644 --- a/Sofa/Component/Constraint/Lagrangian/Solver/src/sofa/component/constraint/lagrangian/solver/GenericConstraintSolver.h +++ b/Sofa/Component/Constraint/Lagrangian/Solver/src/sofa/component/constraint/lagrangian/solver/GenericConstraintSolver.h @@ -32,7 +32,7 @@ #include #include -#include +#include #include @@ -71,49 +71,49 @@ class SOFA_COMPONENT_CONSTRAINT_LAGRANGIAN_SOLVER_API GenericConstraintSolver : Data< ResolutionMethod > d_resolutionMethod; ///< Method used to solve the constraint problem, among: "ProjectedGaussSeidel", "UnbuiltGaussSeidel" or "for NonsmoothNonlinearConjugateGradient" SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_SOLVER() - sofa::core::objectmodel::RenamedData maxIt; + sofa::core::objectmodel::lifecycle::RenamedData maxIt; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_SOLVER() - sofa::core::objectmodel::RenamedData tolerance; + sofa::core::objectmodel::lifecycle::RenamedData tolerance; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_SOLVER() - sofa::core::objectmodel::RenamedData sor; + sofa::core::objectmodel::lifecycle::RenamedData sor; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_SOLVER() - sofa::core::objectmodel::RenamedData scaleTolerance; + sofa::core::objectmodel::lifecycle::RenamedData scaleTolerance; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_SOLVER() - sofa::core::objectmodel::RenamedData allVerified; + sofa::core::objectmodel::lifecycle::RenamedData allVerified; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_SOLVER() - sofa::core::objectmodel::RenamedData computeGraphs; + sofa::core::objectmodel::lifecycle::RenamedData computeGraphs; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_SOLVER() - sofa::core::objectmodel::RenamedData > > graphErrors; + sofa::core::objectmodel::lifecycle::RenamedData > > graphErrors; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_SOLVER() - sofa::core::objectmodel::RenamedData > > graphConstraints; + sofa::core::objectmodel::lifecycle::RenamedData > > graphConstraints; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_SOLVER() - sofa::core::objectmodel::RenamedData > > graphForces; + sofa::core::objectmodel::lifecycle::RenamedData > > graphForces; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_SOLVER() - sofa::core::objectmodel::RenamedData > > graphViolations; + sofa::core::objectmodel::lifecycle::RenamedData > > graphViolations; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_SOLVER() - sofa::core::objectmodel::RenamedData currentNumConstraints; + sofa::core::objectmodel::lifecycle::RenamedData currentNumConstraints; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_SOLVER() - sofa::core::objectmodel::RenamedData currentNumConstraintGroups; + sofa::core::objectmodel::lifecycle::RenamedData currentNumConstraintGroups; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_SOLVER() - sofa::core::objectmodel::RenamedData currentIterations; + sofa::core::objectmodel::lifecycle::RenamedData currentIterations; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_SOLVER() - sofa::core::objectmodel::RenamedData currentError; + sofa::core::objectmodel::lifecycle::RenamedData currentError; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_SOLVER() - sofa::core::objectmodel::RenamedData reverseAccumulateOrder; + sofa::core::objectmodel::lifecycle::RenamedData reverseAccumulateOrder; Data d_maxIt; ///< maximal number of iterations of the Gauss-Seidel algorithm Data d_tolerance; ///< residual error threshold for termination of the Gauss-Seidel algorithm diff --git a/Sofa/Component/Constraint/Lagrangian/Solver/src/sofa/component/constraint/lagrangian/solver/LCPConstraintSolver.h b/Sofa/Component/Constraint/Lagrangian/Solver/src/sofa/component/constraint/lagrangian/solver/LCPConstraintSolver.h index d4ba0ee2681..80603d91185 100644 --- a/Sofa/Component/Constraint/Lagrangian/Solver/src/sofa/component/constraint/lagrangian/solver/LCPConstraintSolver.h +++ b/Sofa/Component/Constraint/Lagrangian/Solver/src/sofa/component/constraint/lagrangian/solver/LCPConstraintSolver.h @@ -35,7 +35,7 @@ #include #include -#include +#include namespace sofa::component::constraint::lagrangian::solver { @@ -75,61 +75,61 @@ class SOFA_COMPONENT_CONSTRAINT_LAGRANGIAN_SOLVER_API LCPConstraintSolver : publ void draw(const core::visual::VisualParams* vparams) override; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_SOLVER() - sofa::core::objectmodel::RenamedData displayDebug; + sofa::core::objectmodel::lifecycle::RenamedData displayDebug; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_SOLVER() - sofa::core::objectmodel::RenamedData initial_guess; + sofa::core::objectmodel::lifecycle::RenamedData initial_guess; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_SOLVER() - sofa::core::objectmodel::RenamedData build_lcp; + sofa::core::objectmodel::lifecycle::RenamedData build_lcp; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_SOLVER() - sofa::core::objectmodel::RenamedData tol; + sofa::core::objectmodel::lifecycle::RenamedData tol; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_SOLVER() - sofa::core::objectmodel::RenamedData< int> maxIt; + sofa::core::objectmodel::lifecycle::RenamedData< int> maxIt; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_SOLVER() - sofa::core::objectmodel::RenamedData mu; + sofa::core::objectmodel::lifecycle::RenamedData mu; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_SOLVER() - sofa::core::objectmodel::RenamedData minW; + sofa::core::objectmodel::lifecycle::RenamedData minW; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_SOLVER() - sofa::core::objectmodel::RenamedData maxF; + sofa::core::objectmodel::lifecycle::RenamedData maxF; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_SOLVER() - sofa::core::objectmodel::RenamedData multi_grid; + sofa::core::objectmodel::lifecycle::RenamedData multi_grid; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_SOLVER() - sofa::core::objectmodel::RenamedData< int> multi_grid_levels; + sofa::core::objectmodel::lifecycle::RenamedData< int> multi_grid_levels; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_SOLVER() - sofa::core::objectmodel::RenamedData< int> merge_method; + sofa::core::objectmodel::lifecycle::RenamedData< int> merge_method; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_SOLVER() - sofa::core::objectmodel::RenamedData< int> merge_spatial_step; + sofa::core::objectmodel::lifecycle::RenamedData< int> merge_spatial_step; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_SOLVER() - sofa::core::objectmodel::RenamedData< int> merge_local_levels; + sofa::core::objectmodel::lifecycle::RenamedData< int> merge_local_levels; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_SOLVER() - sofa::core::objectmodel::RenamedData < std::set > constraintGroups; + sofa::core::objectmodel::lifecycle::RenamedData < std::set > constraintGroups; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_SOLVER() - sofa::core::objectmodel::RenamedData > > f_graph; + sofa::core::objectmodel::lifecycle::RenamedData > > f_graph; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_SOLVER() - sofa::core::objectmodel::RenamedData< int> showLevels; + sofa::core::objectmodel::lifecycle::RenamedData< int> showLevels; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_SOLVER() - sofa::core::objectmodel::RenamedData showCellWidth; + sofa::core::objectmodel::lifecycle::RenamedData showCellWidth; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_SOLVER() - sofa::core::objectmodel::RenamedData showTranslation; + sofa::core::objectmodel::lifecycle::RenamedData showTranslation; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_LAGRANGIAN_SOLVER() - sofa::core::objectmodel::RenamedData showLevelTranslation; + sofa::core::objectmodel::lifecycle::RenamedData showLevelTranslation; Data d_displayDebug; ///< Display debug information. diff --git a/Sofa/Component/Constraint/Lagrangian/src/sofa/component/constraint/lagrangian/init.cpp b/Sofa/Component/Constraint/Lagrangian/src/sofa/component/constraint/lagrangian/init.cpp index b0f8cbd6009..e7adc9e8fe9 100644 --- a/Sofa/Component/Constraint/Lagrangian/src/sofa/component/constraint/lagrangian/init.cpp +++ b/Sofa/Component/Constraint/Lagrangian/src/sofa/component/constraint/lagrangian/init.cpp @@ -27,6 +27,7 @@ #include #include +#include namespace sofa::component::constraint::lagrangian { @@ -55,9 +56,9 @@ const char* getModuleVersion() void registerObjects(sofa::core::ObjectFactory* factory) { - factory->registerObjectsFromPlugin("Sofa.Component.Constraint.Lagrangian.Correction"); - factory->registerObjectsFromPlugin("Sofa.Component.Constraint.Lagrangian.Model"); - factory->registerObjectsFromPlugin("Sofa.Component.Constraint.Lagrangian.Solver"); + factory->registerObjectsFromPlugin(Sofa.Component.Constraint.Lagrangian.Correction); + factory->registerObjectsFromPlugin(Sofa.Component.Constraint.Lagrangian.Model); + factory->registerObjectsFromPlugin(Sofa.Component.Constraint.Lagrangian.Solver); } void init() diff --git a/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/AffineMovementProjectiveConstraint.h b/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/AffineMovementProjectiveConstraint.h index a35f21fd8f9..6b8ee71a66e 100644 --- a/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/AffineMovementProjectiveConstraint.h +++ b/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/AffineMovementProjectiveConstraint.h @@ -34,7 +34,7 @@ #include #include -#include +#include namespace sofa::component::constraint::projective { @@ -82,28 +82,28 @@ class AffineMovementProjectiveConstraint : public core::behavior::ProjectiveCons public : SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData > m_meshIndices; + sofa::core::objectmodel::lifecycle::RenamedData > m_meshIndices; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData > m_indices; + sofa::core::objectmodel::lifecycle::RenamedData > m_indices; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData m_beginConstraintTime; + sofa::core::objectmodel::lifecycle::RenamedData m_beginConstraintTime; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData m_endConstraintTime; + sofa::core::objectmodel::lifecycle::RenamedData m_endConstraintTime; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData m_rotation; + sofa::core::objectmodel::lifecycle::RenamedData m_rotation; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData m_quaternion; + sofa::core::objectmodel::lifecycle::RenamedData m_quaternion; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData m_translation; + sofa::core::objectmodel::lifecycle::RenamedData m_translation; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData m_drawConstrainedPoints; + sofa::core::objectmodel::lifecycle::RenamedData m_drawConstrainedPoints; /// indices of the DOFs of the mesh diff --git a/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/DirectionProjectiveConstraint.h b/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/DirectionProjectiveConstraint.h index 872ae61a5af..a4d357e85ae 100644 --- a/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/DirectionProjectiveConstraint.h +++ b/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/DirectionProjectiveConstraint.h @@ -36,7 +36,7 @@ #include #include -#include +#include namespace sofa::component::constraint::projective { @@ -85,13 +85,13 @@ class DirectionProjectiveConstraint : public core::behavior::ProjectiveConstrain public: SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData > f_indices; + sofa::core::objectmodel::lifecycle::RenamedData > f_indices; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData f_drawSize; + sofa::core::objectmodel::lifecycle::RenamedData f_drawSize; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedDataf_direction; + sofa::core::objectmodel::lifecycle::RenamedDataf_direction; IndexSubsetData d_indices; ///< Indices the particles to project Data d_drawSize; ///< Size of the rendered particles (0 -> point based rendering, >0 -> radius of spheres) diff --git a/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/FixedRotationProjectiveConstraint.h b/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/FixedRotationProjectiveConstraint.h index 827c65ac1fd..16f09ef7e35 100644 --- a/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/FixedRotationProjectiveConstraint.h +++ b/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/FixedRotationProjectiveConstraint.h @@ -25,7 +25,7 @@ #include #include -#include +#include namespace sofa::component::constraint::projective { @@ -68,13 +68,13 @@ class FixedRotationProjectiveConstraint : public core::behavior::ProjectiveConst protected : SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData< bool > FixedXRotation; + sofa::core::objectmodel::lifecycle::RenamedData< bool > FixedXRotation; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData< bool > FixedYRotation; + sofa::core::objectmodel::lifecycle::RenamedData< bool > FixedYRotation; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData< bool > FixedZRotation; + sofa::core::objectmodel::lifecycle::RenamedData< bool > FixedZRotation; Data< bool > d_fixedXRotation; ///< Prevent Rotation around X axis Data< bool > d_fixedYRotation; ///< Prevent Rotation around Y axis diff --git a/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/FixedTranslationProjectiveConstraint.h b/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/FixedTranslationProjectiveConstraint.h index 2176f0d9d9c..ff9eae16e54 100644 --- a/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/FixedTranslationProjectiveConstraint.h +++ b/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/FixedTranslationProjectiveConstraint.h @@ -26,7 +26,7 @@ #include #include -#include +#include namespace sofa::component::constraint::projective { @@ -65,16 +65,16 @@ class FixedTranslationProjectiveConstraint : public core::behavior::ProjectiveCo public: SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData< sofa::type::vector > f_indices; + sofa::core::objectmodel::lifecycle::RenamedData< sofa::type::vector > f_indices; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData f_fixAll; + sofa::core::objectmodel::lifecycle::RenamedData f_fixAll; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData _drawSize; + sofa::core::objectmodel::lifecycle::RenamedData _drawSize; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData< sofa::type::vector > f_coordinates; + sofa::core::objectmodel::lifecycle::RenamedData< sofa::type::vector > f_coordinates; SetIndex d_indices; ///< Indices of the fixed points Data d_fixAll; ///< filter all the DOF to implement a fixed object diff --git a/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/HermiteSplineProjectiveConstraint.h b/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/HermiteSplineProjectiveConstraint.h index 6a3f327bc29..3e5e08fcefd 100644 --- a/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/HermiteSplineProjectiveConstraint.h +++ b/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/HermiteSplineProjectiveConstraint.h @@ -27,7 +27,7 @@ #include #include -#include +#include namespace sofa::component::constraint::projective { @@ -65,31 +65,31 @@ class HermiteSplineProjectiveConstraint : public core::behavior::ProjectiveConst public: SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData< sofa::type::vector > m_indices; + sofa::core::objectmodel::lifecycle::RenamedData< sofa::type::vector > m_indices; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData m_tBegin; + sofa::core::objectmodel::lifecycle::RenamedData m_tBegin; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData m_tEnd; + sofa::core::objectmodel::lifecycle::RenamedData m_tEnd; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData m_x0; + sofa::core::objectmodel::lifecycle::RenamedData m_x0; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData m_dx0; + sofa::core::objectmodel::lifecycle::RenamedData m_dx0; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData m_x1; + sofa::core::objectmodel::lifecycle::RenamedData m_x1; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData m_dx1; + sofa::core::objectmodel::lifecycle::RenamedData m_dx1; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData m_sx0; + sofa::core::objectmodel::lifecycle::RenamedData m_sx0; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData m_sx1; + sofa::core::objectmodel::lifecycle::RenamedData m_sx1; ///indices of the DOFs constraints SetIndex d_indices; diff --git a/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/LineProjectiveConstraint.h b/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/LineProjectiveConstraint.h index 0475832b1bb..3cdcedd43f0 100644 --- a/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/LineProjectiveConstraint.h +++ b/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/LineProjectiveConstraint.h @@ -35,7 +35,7 @@ #include #include -#include +#include namespace sofa::component::constraint::projective { @@ -86,16 +86,16 @@ class LineProjectiveConstraint : public core::behavior::ProjectiveConstraintSet< public: SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData< sofa::type::vector< sofa::Index > > f_indices; + sofa::core::objectmodel::lifecycle::RenamedData< sofa::type::vector< sofa::Index > > f_indices; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData f_drawSize; + sofa::core::objectmodel::lifecycle::RenamedData f_drawSize; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData f_origin; + sofa::core::objectmodel::lifecycle::RenamedData f_origin; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData f_direction; + sofa::core::objectmodel::lifecycle::RenamedData f_direction; IndexSubsetData d_indices; ///< the particles to project Data d_drawSize; ///< Size of the rendered particles (0 -> point based rendering, >0 -> radius of spheres) diff --git a/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/LinearMovementProjectiveConstraint.h b/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/LinearMovementProjectiveConstraint.h index c6434edab57..7a86baae012 100644 --- a/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/LinearMovementProjectiveConstraint.h +++ b/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/LinearMovementProjectiveConstraint.h @@ -35,7 +35,7 @@ #include #include -#include +#include namespace sofa::component::constraint::projective { @@ -78,16 +78,16 @@ class LinearMovementProjectiveConstraint : public core::behavior::ProjectiveCons public : SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData< sofa::type::vector< sofa::Index> > m_indices; + sofa::core::objectmodel::lifecycle::RenamedData< sofa::type::vector< sofa::Index> > m_indices; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData > m_keyTimes; + sofa::core::objectmodel::lifecycle::RenamedData > m_keyTimes; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData m_keyMovements; + sofa::core::objectmodel::lifecycle::RenamedData m_keyMovements; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData showMovement; + sofa::core::objectmodel::lifecycle::RenamedData showMovement; /// indices of the DOFs the constraint is applied to SetIndex d_indices; diff --git a/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/LinearVelocityProjectiveConstraint.h b/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/LinearVelocityProjectiveConstraint.h index 6e3a71e9329..c75c97db7f1 100644 --- a/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/LinearVelocityProjectiveConstraint.h +++ b/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/LinearVelocityProjectiveConstraint.h @@ -71,14 +71,17 @@ public : /// the coordinates on which to apply velocities SetIndex d_coordinates; + /// If set to true then the last velocity will still be applied after all the key events + Data d_continueAfterEnd; + /// the key times surrounding the current simulation time (for interpolation) - Real prevT, nextT; + Real m_prevT, m_nextT; ///the velocities corresponding to the surrounding key times - Deriv prevV, nextV; + Deriv m_prevV, m_nextV; ///position at the initial step for constrained DOFs position - VecCoord x0; + VecCoord m_x0; ///position at the previous step for constrained DOFs position - VecCoord xP; + VecCoord m_xP; /// Link to be set to the topology container in the component graph. SingleLink, sofa::core::topology::BaseMeshTopology, BaseLink::FLAG_STOREPATH | BaseLink::FLAG_STRONGLINK> l_topology; @@ -109,18 +112,24 @@ public : void projectPosition(const core::MechanicalParams* mparams, DataVecCoord& xData) override; void projectJacobianMatrix(const core::MechanicalParams* mparams, DataMatrixDeriv& cData) override; + void applyConstraint(const core::MechanicalParams* mparams, linearalgebra::BaseVector* vector, const sofa::core::behavior::MultiMatrixAccessor* matrix) override; + void applyConstraint(const core::MechanicalParams* mparams, const sofa::core::behavior::MultiMatrixAccessor* matrix) override; + + void projectMatrix( sofa::linearalgebra::BaseMatrix* /*M*/, unsigned /*offset*/ ) override; + + void applyConstraint(sofa::core::behavior::ZeroDirichletCondition* matrix) override; + void draw(const core::visual::VisualParams* vparams) override; private: - - /// to keep the time corresponding to the key times - Real currentTime; + /// Check if the constraint is still active regarding the current time and the continueAfterEnd data + bool isConstraintActive() const; /// to know if we found the key times - bool finished; + bool m_finished; /// find previous and next time keys - void findKeyTimes(); + bool findKeyTimes(); }; #if !defined(SOFA_COMPONENT_PROJECTIVECONSTRAINTSET_LINEARVELOCITYPROJECTIVECONSTRAINT_CPP) diff --git a/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/LinearVelocityProjectiveConstraint.inl b/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/LinearVelocityProjectiveConstraint.inl index 80ff4e51937..c1cdacc363a 100644 --- a/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/LinearVelocityProjectiveConstraint.inl +++ b/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/LinearVelocityProjectiveConstraint.inl @@ -23,6 +23,8 @@ #include #include +#include + #include #include #include @@ -40,8 +42,9 @@ LinearVelocityProjectiveConstraint::LinearVelocityProjectiveConstrai , d_keyTimes( initData(&d_keyTimes,"keyTimes","key times for the movements") ) , d_keyVelocities( initData(&d_keyVelocities,"velocities","velocities corresponding to the key times") ) , d_coordinates( initData(&d_coordinates, "coordinates", "coordinates on which to apply velocities") ) + , d_continueAfterEnd( initData(&d_continueAfterEnd, false, "continueAfterEnd", "If set to true then the last velocity will still be applied after all the key events") ) , l_topology(initLink("topology", "link to the topology container")) - , finished(false) + , m_finished(false) { d_indices.beginEdit()->push_back(0); d_indices.endEdit(); @@ -125,39 +128,36 @@ void LinearVelocityProjectiveConstraint::init() msg_info() << "No topology component found at path: " << l_topology.getLinkedPath() << ", nor in current context: " << this->getContext()->name; } - x0.resize(0); - xP.resize(0); - nextV = prevV = Deriv(); + m_x0.resize(0); + m_xP.resize(0); + m_nextV = m_prevV = Deriv(); - currentTime = -1.0; - finished = false; + m_finished = false; } template void LinearVelocityProjectiveConstraint::reset() { - nextT = prevT = 0.0; - nextV = prevV = Deriv(); + m_nextT = m_prevT = 0.0; + m_nextV = m_prevV = Deriv(); - currentTime = -1.0; - finished = false; + m_finished = false; } template void LinearVelocityProjectiveConstraint::projectResponse(const core::MechanicalParams* /*mparams*/, DataVecDeriv& resData) { - helper::WriteAccessor res = resData; - VecDeriv& dx = res.wref(); - - Real cT = (Real) this->getContext()->getTime(); - if ((cT != currentTime) || !finished) + if(!m_finished) { - findKeyTimes(); + m_finished = findKeyTimes(); } - if (finished && nextT != prevT) + if (isConstraintActive()) { + helper::WriteAccessor res = resData; + VecDeriv& dx = res.wref(); + const SetIndexArray & indices = d_indices.getValue(); //set the motion to the Dofs @@ -172,18 +172,24 @@ void LinearVelocityProjectiveConstraint::projectResponse(const core: template void LinearVelocityProjectiveConstraint::projectVelocity(const core::MechanicalParams* /*mparams*/, DataVecDeriv& vData) { - helper::WriteAccessor dx = vData; - Real cT = (Real) this->getContext()->getTime(); - - if ((cT != currentTime) || !finished) + if(!m_finished) { - findKeyTimes(); + m_finished = findKeyTimes(); } - if (finished && nextT != prevT) + if (isConstraintActive()) { + helper::WriteAccessor dx = vData; + Real cT = (Real) this->getContext()->getTime(); + //if we found 2 keyTimes, we have to interpolate a velocity (linear interpolation) - Deriv v = ((nextV - prevV)*((cT - prevT)/(nextT - prevT))) + prevV; + Deriv v = ((m_nextV - m_prevV)*((cT - m_prevT)/(m_nextT - m_prevT))) + m_prevV; + + //If we finished the key times but continue after end is on + if(m_finished) + { + v = m_prevV; + } const SetIndexArray & indices = d_indices.getValue(); const SetIndexArray & coordinates = d_coordinates.getValue(); @@ -213,36 +219,40 @@ void LinearVelocityProjectiveConstraint::projectVelocity(const core: template void LinearVelocityProjectiveConstraint::projectPosition(const core::MechanicalParams* /*mparams*/, DataVecCoord& xData) { + helper::WriteAccessor x = xData; //initialize initial Dofs positions, if it's not done - if (x0.size() == 0) + if (m_x0.size() == 0) { const SetIndexArray & indices = d_indices.getValue(); - x0.resize( x.size() ); - xP.resize( x.size() ); + m_x0.resize( x.size() ); + m_xP.resize( x.size() ); for (SetIndexArray::const_iterator it = indices.begin(); it != indices.end(); ++it) { - x0[*it] = x[*it]; - xP[*it] = x0[*it]; + m_x0[*it] = x[*it]; + m_xP[*it] = m_x0[*it]; } } - Real cT = (Real) this->getContext()->getTime(); - if ((cT != currentTime) || !finished) + if(!m_finished) { - findKeyTimes(); + m_finished = findKeyTimes(); } - - Real dTsimu = (Real) this->getContext()->getDt(); - - - if(finished) + if(isConstraintActive()) { - Real dt = (cT - prevT) / (nextT - prevT); - Deriv m = (nextV-prevV)*dt + prevV; + const Real cT = (Real) this->getContext()->getTime(); + const Real dTsimu = (Real) this->getContext()->getDt(); + const Real dt = (cT - m_prevT) / (m_nextT - m_prevT); + Deriv m = (m_nextV-m_prevV)*dt + m_prevV; + + //If we finished the key times but continue after end is on + if(m_finished) + { + m = m_prevV; + } const SetIndexArray & indices = d_indices.getValue(); const SetIndexArray & coordinates = d_coordinates.getValue(); @@ -252,8 +262,8 @@ void LinearVelocityProjectiveConstraint::projectPosition(const core: //set the motion to the Dofs for (SetIndexArray::const_iterator it = indices.begin(); it != indices.end(); ++it) { - x[*it] = xP[*it] + m*dTsimu; - xP[*it] = x[*it]; + x[*it] = m_xP[*it] + m*dTsimu; + m_xP[*it] = x[*it]; } } else @@ -262,8 +272,8 @@ void LinearVelocityProjectiveConstraint::projectPosition(const core: { for(SetIndexArray::const_iterator itInd = coordinates.begin(); itInd != coordinates.end(); ++itInd) { - x[*it][*itInd] = xP[*it][*itInd] + m[*itInd]*dTsimu; - xP[*it] = x[*it]; + x[*it][*itInd] = m_xP[*it][*itInd] + m[*itInd]*dTsimu; + m_xP[*it] = x[*it]; } } } @@ -271,38 +281,51 @@ void LinearVelocityProjectiveConstraint::projectPosition(const core: } template -void LinearVelocityProjectiveConstraint::findKeyTimes() +bool LinearVelocityProjectiveConstraint::isConstraintActive() const +{ + return (!m_finished || d_continueAfterEnd.getValue()) && (m_nextT != m_prevT); +} + +template +bool LinearVelocityProjectiveConstraint::findKeyTimes() { - Real cT = (Real) this->getContext()->getTime(); - finished = false; + const Real cT = (Real) this->getContext()->getTime(); + + if(cT > *d_keyTimes.getValue().rbegin()) + { + m_prevV = m_nextV; + m_nextT = INFINITY; + return true; + } if(d_keyTimes.getValue().size() != 0 && cT >= *d_keyTimes.getValue().begin() && cT <= *d_keyTimes.getValue().rbegin()) { - nextT = *d_keyTimes.getValue().begin(); - prevT = nextT; + m_nextT = *d_keyTimes.getValue().begin(); + m_prevT = m_nextT; typename type::vector::const_iterator it_t = d_keyTimes.getValue().begin(); typename VecDeriv::const_iterator it_v = d_keyVelocities.getValue().begin(); //WARNING : we consider that the key-events are in chronological order //here we search between which keyTimes we are, to know which are the motion to interpolate - while( it_t != d_keyTimes.getValue().end() && !finished) + while( it_t != d_keyTimes.getValue().end()) { if( *it_t <= cT) { - prevT = *it_t; - prevV = *it_v; + m_prevT = *it_t; + m_prevV = *it_v; } else { - nextT = *it_t; - nextV = *it_v; - finished = true; + m_nextT = *it_t; + m_nextV = *it_v; + return false; } ++it_t; ++it_v; } } + return false; }// LinearVelocityProjectiveConstraint::findKeyTimes template @@ -311,6 +334,97 @@ void LinearVelocityProjectiveConstraint::projectJacobianMatrix(const } +template +void LinearVelocityProjectiveConstraint::applyConstraint(const core::MechanicalParams* mparams, linearalgebra::BaseVector* vector, const sofa::core::behavior::MultiMatrixAccessor* matrix) +{ + SOFA_UNUSED(mparams); + + if(isConstraintActive()) + { + const int o = matrix->getGlobalOffset(this->mstate.get()); + if (o >= 0) + { + unsigned int offset = (unsigned int)o; + constexpr unsigned int N = Deriv::size(); + + const SetIndexArray& indices = this->d_indices.getValue(); + for (const unsigned int index : indices) + { + for (unsigned int c = 0; c < N; ++c) + { + vector->clear(offset + N * index + c); + } + } + } + } +} + +template +void LinearVelocityProjectiveConstraint::applyConstraint(const core::MechanicalParams* mparams, const sofa::core::behavior::MultiMatrixAccessor* matrix) +{ + SOFA_UNUSED(mparams); + if(isConstraintActive()) + { + if (const core::behavior::MultiMatrixAccessor::MatrixRef r = + matrix->getMatrix(this->mstate.get())) + { + constexpr unsigned int N = Deriv::size(); + const SetIndexArray& indices = this->d_indices.getValue(); + + for (SetIndexArray::const_iterator it = indices.begin(); it != indices.end(); ++it) + { + // Reset Fixed Row and Col + for (unsigned int c = 0; c < N; ++c) + { + r.matrix->clearRowCol(r.offset + N * (*it) + c); + } + // Set Fixed Vertex + for (unsigned int c = 0; c < N; ++c) + { + r.matrix->set(r.offset + N * (*it) + c, r.offset + N * (*it) + c, 1.0); + } + } + } + } +} + +template +void LinearVelocityProjectiveConstraint::projectMatrix( sofa::linearalgebra::BaseMatrix* M, unsigned offset ) +{ + static const unsigned blockSize = DataTypes::deriv_total_size; + + if(isConstraintActive()) + { + const SetIndexArray & indices = this->d_indices.getValue(); + for (SetIndexArray::const_iterator it = indices.begin(); it != indices.end(); ++it) + { + for (unsigned int c = 0; c < blockSize; ++c) + { + M->clearRowCol( offset + (*it) * blockSize + c); + } + } + } +} + +template +void LinearVelocityProjectiveConstraint::applyConstraint( + sofa::core::behavior::ZeroDirichletCondition* matrix) +{ + static constexpr unsigned int N = Deriv::size(); + if(isConstraintActive()) + { + const SetIndexArray& indices = this->d_indices.getValue(); + + for (const auto index : indices) + { + for (unsigned int c = 0; c < N; ++c) + { + matrix->discardRowCol(N * index + c, N * index + c); + } + } + } +} + //display the path the constrained dofs will go through template void LinearVelocityProjectiveConstraint::draw(const core::visual::VisualParams* vparams) @@ -328,8 +442,8 @@ void LinearVelocityProjectiveConstraint::draw(const core::visual::Vi { for(const auto index : indices) { - const auto p0 = x0[index]+keyVelocities[i]; - const auto p1 = x0[index]+keyVelocities[i+1]; + const auto p0 = m_x0[index]+keyVelocities[i]; + const auto p1 = m_x0[index]+keyVelocities[i+1]; const typename DataTypes::CPos& cpos0 = DataTypes::getCPos(p0); const typename DataTypes::CPos& cpos1 = DataTypes::getCPos(p1); diff --git a/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/OscillatorProjectiveConstraint.h b/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/OscillatorProjectiveConstraint.h index 5114ce41668..124e97dbcec 100644 --- a/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/OscillatorProjectiveConstraint.h +++ b/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/OscillatorProjectiveConstraint.h @@ -26,7 +26,7 @@ #include #include -#include +#include namespace sofa::component::constraint::projective { @@ -83,7 +83,7 @@ class OscillatorProjectiveConstraint : public core::behavior::ProjectiveConstrai }; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData< type::vector< Oscillator > > constraints; + sofa::core::objectmodel::lifecycle::RenamedData< type::vector< Oscillator > > constraints; Data< type::vector< Oscillator > > d_constraints; ///< Define a sequence of oscillating particules: [index, Mean(x,y,z), amplitude(x,y,z), pulsation, phase] diff --git a/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/ParabolicProjectiveConstraint.h b/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/ParabolicProjectiveConstraint.h index 8c079c99960..6ed3727da2e 100644 --- a/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/ParabolicProjectiveConstraint.h +++ b/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/ParabolicProjectiveConstraint.h @@ -27,7 +27,7 @@ #include #include -#include +#include namespace sofa::component::constraint::projective { @@ -60,22 +60,22 @@ class ParabolicProjectiveConstraint : public core::behavior::ProjectiveConstrain protected: SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData< sofa::type::vector > m_indices; + sofa::core::objectmodel::lifecycle::RenamedData< sofa::type::vector > m_indices; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData m_P1; + sofa::core::objectmodel::lifecycle::RenamedData m_P1; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData m_P2; + sofa::core::objectmodel::lifecycle::RenamedData m_P2; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData m_P3; + sofa::core::objectmodel::lifecycle::RenamedData m_P3; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData m_tBegin; + sofa::core::objectmodel::lifecycle::RenamedData m_tBegin; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData m_tEnd; + sofa::core::objectmodel::lifecycle::RenamedData m_tEnd; ///indices of the DOFs constraints SetIndex d_indices; diff --git a/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/PartialLinearMovementProjectiveConstraint.h b/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/PartialLinearMovementProjectiveConstraint.h index a2eb576ae4e..cb765b14317 100644 --- a/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/PartialLinearMovementProjectiveConstraint.h +++ b/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/PartialLinearMovementProjectiveConstraint.h @@ -35,7 +35,7 @@ #include #include -#include +#include namespace sofa::component::constraint::projective { @@ -77,40 +77,40 @@ class PartialLinearMovementProjectiveConstraint : public core::behavior::Project public : SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData > m_indices; + sofa::core::objectmodel::lifecycle::RenamedData > m_indices; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData >m_keyTimes; + sofa::core::objectmodel::lifecycle::RenamedData >m_keyTimes; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData m_keyMovements; + sofa::core::objectmodel::lifecycle::RenamedData m_keyMovements; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData< bool > showMovement; + sofa::core::objectmodel::lifecycle::RenamedData< bool > showMovement; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData linearMovementBetweenNodesInIndices; + sofa::core::objectmodel::lifecycle::RenamedData linearMovementBetweenNodesInIndices; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData mainIndice; + sofa::core::objectmodel::lifecycle::RenamedData mainIndice; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData minDepIndice; + sofa::core::objectmodel::lifecycle::RenamedData minDepIndice; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData maxDepIndice; + sofa::core::objectmodel::lifecycle::RenamedData maxDepIndice; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData > m_imposedDisplacmentOnMacroNodes; + sofa::core::objectmodel::lifecycle::RenamedData > m_imposedDisplacmentOnMacroNodes; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData X0; + sofa::core::objectmodel::lifecycle::RenamedData X0; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData Y0; + sofa::core::objectmodel::lifecycle::RenamedData Y0; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData Z0; + sofa::core::objectmodel::lifecycle::RenamedData Z0; /// indices of the DOFs the constraint is applied to @@ -146,7 +146,7 @@ public : typedef sofa::type::fixed_array VecBool; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData movedDirections; + sofa::core::objectmodel::lifecycle::RenamedData movedDirections; core::objectmodel::Data d_movedDirections; ///< Defines the directions in which the particles are moved: true (or 1) for fixed, false (or 0) for free diff --git a/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/PlaneProjectiveConstraint.h b/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/PlaneProjectiveConstraint.h index e7311abd86a..740ef0e65c5 100644 --- a/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/PlaneProjectiveConstraint.h +++ b/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/PlaneProjectiveConstraint.h @@ -35,7 +35,7 @@ #include #include -#include +#include namespace sofa::component::constraint::projective { @@ -85,16 +85,16 @@ class PlaneProjectiveConstraint : public core::behavior::ProjectiveConstraintSet public: SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData< sofa::type::vector< sofa::Index > > f_indices; + sofa::core::objectmodel::lifecycle::RenamedData< sofa::type::vector< sofa::Index > > f_indices; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData f_origin; + sofa::core::objectmodel::lifecycle::RenamedData f_origin; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData f_normal; + sofa::core::objectmodel::lifecycle::RenamedData f_normal; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData f_drawSize; + sofa::core::objectmodel::lifecycle::RenamedData f_drawSize; IndexSubsetData d_indices; ///< the particles to project Data d_origin; ///< A point in the plane diff --git a/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/PointProjectiveConstraint.h b/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/PointProjectiveConstraint.h index a843bc0f1fa..3289f2a4762 100644 --- a/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/PointProjectiveConstraint.h +++ b/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/PointProjectiveConstraint.h @@ -33,7 +33,7 @@ #include #include -#include +#include namespace sofa::component::constraint::projective { @@ -79,16 +79,16 @@ class PointProjectiveConstraint : public core::behavior::ProjectiveConstraintSet public: SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData> f_indices; + sofa::core::objectmodel::lifecycle::RenamedData> f_indices; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData f_point; + sofa::core::objectmodel::lifecycle::RenamedData f_point; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData f_fixAll; + sofa::core::objectmodel::lifecycle::RenamedData f_fixAll; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData f_drawSize; + sofa::core::objectmodel::lifecycle::RenamedData f_drawSize; SetIndex d_indices; ///< the indices of the points to project to the target diff --git a/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/PositionBasedDynamicsProjectiveConstraint.h b/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/PositionBasedDynamicsProjectiveConstraint.h index 7f350a7c256..302f762a888 100644 --- a/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/PositionBasedDynamicsProjectiveConstraint.h +++ b/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/PositionBasedDynamicsProjectiveConstraint.h @@ -33,7 +33,7 @@ #include #include -#include +#include namespace sofa::component::constraint::projective { @@ -75,16 +75,16 @@ class PositionBasedDynamicsProjectiveConstraint : public core::behavior::Project public: SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData stiffness; + sofa::core::objectmodel::lifecycle::RenamedData stiffness; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData< VecCoord > position; + sofa::core::objectmodel::lifecycle::RenamedData< VecCoord > position; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData< VecDeriv > velocity; + sofa::core::objectmodel::lifecycle::RenamedData< VecDeriv > velocity; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData< VecCoord > old_position; + sofa::core::objectmodel::lifecycle::RenamedData< VecCoord > old_position; Data< Real > d_stiffness; ///< Blending between current pos and target pos. Data< VecCoord > d_position; ///< Target positions. diff --git a/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/SkeletalMotionProjectiveConstraint.h b/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/SkeletalMotionProjectiveConstraint.h index 61ed359d467..f214bcbf850 100644 --- a/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/SkeletalMotionProjectiveConstraint.h +++ b/Sofa/Component/Constraint/Projective/src/sofa/component/constraint/projective/SkeletalMotionProjectiveConstraint.h @@ -27,7 +27,7 @@ #include #include -#include +#include namespace sofa::component::constraint::projective { @@ -106,16 +106,16 @@ class SkeletalMotionProjectiveConstraint : public core::behavior::ProjectiveCons protected: SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData > > skeletonJoints; + sofa::core::objectmodel::lifecycle::RenamedData > > skeletonJoints; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData > skeletonBones; + sofa::core::objectmodel::lifecycle::RenamedData > skeletonBones; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData animationSpeed; + sofa::core::objectmodel::lifecycle::RenamedData animationSpeed; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONSTRAINT_PROJECTIVE() - sofa::core::objectmodel::RenamedData active; + sofa::core::objectmodel::lifecycle::RenamedData active; // every nodes needed in the animation chain diff --git a/Sofa/Component/Constraint/Projective/tests/AffineMovementProjectiveConstraint_test.cpp b/Sofa/Component/Constraint/Projective/tests/AffineMovementProjectiveConstraint_test.cpp index d32ea2d552f..4b4f258cb12 100644 --- a/Sofa/Component/Constraint/Projective/tests/AffineMovementProjectiveConstraint_test.cpp +++ b/Sofa/Component/Constraint/Projective/tests/AffineMovementProjectiveConstraint_test.cpp @@ -70,7 +70,7 @@ struct AffineMovementProjectiveConstraint_test : public BaseSimulationTest, Nume sofa::helper::RandomGenerator randomGenerator; // Create the context for the scene - void SetUp() override + void doSetUp() override { // Init simulation simulation = sofa::simulation::getSimulation(); diff --git a/Sofa/Component/Constraint/Projective/tests/DirectionProjectiveConstraint_test.cpp b/Sofa/Component/Constraint/Projective/tests/DirectionProjectiveConstraint_test.cpp index 39e6f6b3ee3..d599139cb25 100644 --- a/Sofa/Component/Constraint/Projective/tests/DirectionProjectiveConstraint_test.cpp +++ b/Sofa/Component/Constraint/Projective/tests/DirectionProjectiveConstraint_test.cpp @@ -69,7 +69,7 @@ struct DirectionProjectiveConstraint_test : public BaseSimulationTest, NumericTe typename MechanicalObject::SPtr dofs; /// Create the context for the tests. - void SetUp() override + void doSetUp() override { //Init simulation = sofa::simulation::getSimulation(); @@ -219,7 +219,7 @@ struct DirectionProjectiveConstraint_test : public BaseSimulationTest, NumericTe return succeed; } - void TearDown() override + void doTearDown() override { if (root!=nullptr) sofa::simulation::node::unload(root); diff --git a/Sofa/Component/Constraint/Projective/tests/FixedProjectiveConstraint_test.cpp b/Sofa/Component/Constraint/Projective/tests/FixedProjectiveConstraint_test.cpp index adee116e4ec..638b23878cc 100644 --- a/Sofa/Component/Constraint/Projective/tests/FixedProjectiveConstraint_test.cpp +++ b/Sofa/Component/Constraint/Projective/tests/FixedProjectiveConstraint_test.cpp @@ -81,9 +81,9 @@ struct FixedProjectiveConstraint_test : public BaseTest const simulation::Node::SPtr root = simulation->createNewGraph("root"); root->setGravity( type::Vec3(0,0,0) ); - simpleapi::createObject(root , "RequiredPlugin", {{"name", "Sofa.Component.LinearSolver.Direct"}}) ; - simpleapi::createObject(root , "RequiredPlugin", {{"name", "Sofa.Component.ODESolver.Forward"}}) ; - simpleapi::createObject(root , "RequiredPlugin", {{"name", "Sofa.Component.ODESolver.Backward"}}) ; + simpleapi::createObject(root , "RequiredPlugin", {{"name", Sofa.Component.LinearSolver.Direct}}) ; + simpleapi::createObject(root , "RequiredPlugin", {{"name", Sofa.Component.ODESolver.Forward}}) ; + simpleapi::createObject(root , "RequiredPlugin", {{"name", Sofa.Component.ODESolver.Backward}}) ; simulation::Node::SPtr node = createEulerSolverNode(root,"test", integrationScheme); diff --git a/Sofa/Component/Constraint/Projective/tests/LineProjectiveConstraint_test.cpp b/Sofa/Component/Constraint/Projective/tests/LineProjectiveConstraint_test.cpp index 37f7d55f030..07e2dc61dc7 100644 --- a/Sofa/Component/Constraint/Projective/tests/LineProjectiveConstraint_test.cpp +++ b/Sofa/Component/Constraint/Projective/tests/LineProjectiveConstraint_test.cpp @@ -68,7 +68,7 @@ struct LineProjectiveConstraint_test : public BaseSimulationTest, NumericTest #include +#include namespace sofa::component::constraint { @@ -54,8 +55,8 @@ const char* getModuleVersion() void registerObjects(sofa::core::ObjectFactory* factory) { - factory->registerObjectsFromPlugin("Sofa.Component.Constraint.Lagrangian"); - factory->registerObjectsFromPlugin("Sofa.Component.Constraint.Projective"); + factory->registerObjectsFromPlugin(Sofa.Component.Constraint.Lagrangian); + factory->registerObjectsFromPlugin(Sofa.Component.Constraint.Projective); } void init() diff --git a/Sofa/Component/Controller/src/sofa/component/controller/Controller.h b/Sofa/Component/Controller/src/sofa/component/controller/Controller.h index cd4b786665b..65e42a030e6 100644 --- a/Sofa/Component/Controller/src/sofa/component/controller/Controller.h +++ b/Sofa/Component/Controller/src/sofa/component/controller/Controller.h @@ -24,7 +24,7 @@ #include -#include +#include namespace sofa::core::objectmodel { @@ -111,7 +111,7 @@ class SOFA_COMPONENT_CONTROLLER_API Controller : public core::behavior::BaseCont protected: SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONTROLLER() - sofa::core::objectmodel::RenamedData < bool > handleEventTriggersUpdate; + sofa::core::objectmodel::lifecycle::RenamedData < bool > handleEventTriggersUpdate; Data< bool > d_handleEventTriggersUpdate; ///< Event handling frequency controls the controller update frequency diff --git a/Sofa/Component/Controller/src/sofa/component/controller/MechanicalStateController.h b/Sofa/Component/Controller/src/sofa/component/controller/MechanicalStateController.h index 9913eaeb098..aae4eff9d21 100644 --- a/Sofa/Component/Controller/src/sofa/component/controller/MechanicalStateController.h +++ b/Sofa/Component/Controller/src/sofa/component/controller/MechanicalStateController.h @@ -27,7 +27,7 @@ #include #include -#include +#include namespace sofa::component::controller { @@ -131,16 +131,16 @@ class MechanicalStateController : public Controller void applyController(void); protected: SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONTROLLER() - sofa::core::objectmodel::RenamedData< unsigned int > index; + sofa::core::objectmodel::lifecycle::RenamedData< unsigned int > index; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONTROLLER() - sofa::core::objectmodel::RenamedData< bool > onlyTranslation; + sofa::core::objectmodel::lifecycle::RenamedData< bool > onlyTranslation; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONTROLLER() - sofa::core::objectmodel::RenamedData< bool > buttonDeviceState; + sofa::core::objectmodel::lifecycle::RenamedData< bool > buttonDeviceState; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_CONTROLLER() - sofa::core::objectmodel::RenamedData< sofa::type::Vec<3,Real> > mainDirection; + sofa::core::objectmodel::lifecycle::RenamedData< sofa::type::Vec<3,Real> > mainDirection; Data< unsigned int > d_index; ///< Index of the controlled DOF Data< bool > d_onlyTranslation; ///< Controlling the DOF only in translation diff --git a/Sofa/Component/Engine/Analyze/src/sofa/component/engine/analyze/Distances.h b/Sofa/Component/Engine/Analyze/src/sofa/component/engine/analyze/Distances.h index d0159ca3e35..2b542f34e16 100644 --- a/Sofa/Component/Engine/Analyze/src/sofa/component/engine/analyze/Distances.h +++ b/Sofa/Component/Engine/Analyze/src/sofa/component/engine/analyze/Distances.h @@ -40,7 +40,7 @@ #define TYPE_VORONOI 3 #define TYPE_HARMONIC_STIFFNESS 4 -#include +#include namespace sofa::component::engine::analyze { @@ -79,40 +79,40 @@ class Distances : public core::DataEngine public: SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_ANALYZE() - sofa::core::objectmodel::RenamedData showMapIndex; + sofa::core::objectmodel::lifecycle::RenamedData showMapIndex; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_ANALYZE() - sofa::core::objectmodel::RenamedData showDistanceMap; + sofa::core::objectmodel::lifecycle::RenamedData showDistanceMap; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_ANALYZE() - sofa::core::objectmodel::RenamedData showGoalDistanceMap; + sofa::core::objectmodel::lifecycle::RenamedData showGoalDistanceMap; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_ANALYZE() - sofa::core::objectmodel::RenamedData showTextScaleFactor; + sofa::core::objectmodel::lifecycle::RenamedData showTextScaleFactor; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_ANALYZE() - sofa::core::objectmodel::RenamedData showGradientMap; + sofa::core::objectmodel::lifecycle::RenamedData showGradientMap; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_ANALYZE() - sofa::core::objectmodel::RenamedData showGradientsScaleFactor; + sofa::core::objectmodel::lifecycle::RenamedData showGradientsScaleFactor; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_ANALYZE() - sofa::core::objectmodel::RenamedData offset; + sofa::core::objectmodel::lifecycle::RenamedData offset; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_ANALYZE() - sofa::core::objectmodel::RenamedData distanceType; + sofa::core::objectmodel::lifecycle::RenamedData distanceType; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_ANALYZE() - sofa::core::objectmodel::RenamedData initTarget; + sofa::core::objectmodel::lifecycle::RenamedData initTarget; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_ANALYZE() - sofa::core::objectmodel::RenamedData initTargetStep; + sofa::core::objectmodel::lifecycle::RenamedData initTargetStep; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_ANALYZE() - sofa::core::objectmodel::RenamedData > zonesFramePair; + sofa::core::objectmodel::lifecycle::RenamedData > zonesFramePair; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_ANALYZE() - sofa::core::objectmodel::RenamedData harmonicMaxValue; + sofa::core::objectmodel::lifecycle::RenamedData harmonicMaxValue; Data d_showMapIndex; ///< Frame DOF index on which display values. @@ -227,13 +227,13 @@ class Distances : public core::DataEngine private: SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_ANALYZE() - sofa::core::objectmodel::RenamedData fileDistance; + sofa::core::objectmodel::lifecycle::RenamedData fileDistance; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_ANALYZE() - sofa::core::objectmodel::RenamedData targetPath; + sofa::core::objectmodel::lifecycle::RenamedData targetPath; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_ANALYZE() - sofa::core::objectmodel::RenamedData hexaContainerPath; + sofa::core::objectmodel::lifecycle::RenamedData hexaContainerPath; Data d_fileDistance; ///< file containing the result of the computation of the distances diff --git a/Sofa/Component/Engine/Analyze/src/sofa/component/engine/analyze/HausdorffDistance.h b/Sofa/Component/Engine/Analyze/src/sofa/component/engine/analyze/HausdorffDistance.h index 9631705ffcb..6f7187b4829 100644 --- a/Sofa/Component/Engine/Analyze/src/sofa/component/engine/analyze/HausdorffDistance.h +++ b/Sofa/Component/Engine/Analyze/src/sofa/component/engine/analyze/HausdorffDistance.h @@ -27,7 +27,7 @@ #include #include -#include +#include namespace sofa::component::engine::analyze { @@ -62,22 +62,22 @@ class HausdorffDistance : public core::DataEngine void doUpdate() override; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_ANALYZE() - sofa::core::objectmodel::RenamedData f_points_1; + sofa::core::objectmodel::lifecycle::RenamedData f_points_1; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_ANALYZE() - sofa::core::objectmodel::RenamedData f_points_2; + sofa::core::objectmodel::lifecycle::RenamedData f_points_2; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_ANALYZE() - sofa::core::objectmodel::RenamedData d12; + sofa::core::objectmodel::lifecycle::RenamedData d12; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_ANALYZE() - sofa::core::objectmodel::RenamedData d21; + sofa::core::objectmodel::lifecycle::RenamedData d21; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_ANALYZE() - sofa::core::objectmodel::RenamedData max; + sofa::core::objectmodel::lifecycle::RenamedData max; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_ANALYZE() - sofa::core::objectmodel::RenamedData f_update; + sofa::core::objectmodel::lifecycle::RenamedData f_update; //Input Data d_points_1; ///< Points belonging to the first point cloud diff --git a/Sofa/Component/Engine/Analyze/src/sofa/component/engine/analyze/ShapeMatching.h b/Sofa/Component/Engine/Analyze/src/sofa/component/engine/analyze/ShapeMatching.h index 6261365b93c..f11328a5b4f 100644 --- a/Sofa/Component/Engine/Analyze/src/sofa/component/engine/analyze/ShapeMatching.h +++ b/Sofa/Component/Engine/Analyze/src/sofa/component/engine/analyze/ShapeMatching.h @@ -34,7 +34,7 @@ #include #include -#include +#include namespace sofa::component::engine::analyze { @@ -72,28 +72,28 @@ class ShapeMatching : public core::DataEngine, public core::behavior::SingleStat void draw(const core::visual::VisualParams* vparams) override; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_ANALYZE() - sofa::core::objectmodel::RenamedData iterations; + sofa::core::objectmodel::lifecycle::RenamedData iterations; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_ANALYZE() - sofa::core::objectmodel::RenamedData affineRatio; + sofa::core::objectmodel::lifecycle::RenamedData affineRatio; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_ANALYZE() - sofa::core::objectmodel::RenamedData fixedweight; + sofa::core::objectmodel::lifecycle::RenamedData fixedweight; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_ANALYZE() - sofa::core::objectmodel::RenamedData fixedPosition0; + sofa::core::objectmodel::lifecycle::RenamedData fixedPosition0; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_ANALYZE() - sofa::core::objectmodel::RenamedData fixedPosition; + sofa::core::objectmodel::lifecycle::RenamedData fixedPosition; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_ANALYZE() - sofa::core::objectmodel::RenamedData position; + sofa::core::objectmodel::lifecycle::RenamedData position; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_ANALYZE() - sofa::core::objectmodel::RenamedData< VVI > cluster; + sofa::core::objectmodel::lifecycle::RenamedData< VVI > cluster; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_ANALYZE() - sofa::core::objectmodel::RenamedData targetPosition; + sofa::core::objectmodel::lifecycle::RenamedData targetPosition; Data d_iterations; ///< Number of iterations. diff --git a/Sofa/Component/Engine/Analyze/tests/AverageCoord_test.cpp b/Sofa/Component/Engine/Analyze/tests/AverageCoord_test.cpp index 64d6951acd8..96d9416c4f6 100644 --- a/Sofa/Component/Engine/Analyze/tests/AverageCoord_test.cpp +++ b/Sofa/Component/Engine/Analyze/tests/AverageCoord_test.cpp @@ -57,7 +57,7 @@ struct AverageCoord_test : public BaseSimulationTest, typename MechanicalObject::SPtr m_mecaobject; - void SetUp() override + void doSetUp() override { m_simu = sofa::simulation::getSimulation(); ASSERT_NE(m_simu, nullptr); diff --git a/Sofa/Component/Engine/Analyze/tests/ClusteringEngine_test.cpp b/Sofa/Component/Engine/Analyze/tests/ClusteringEngine_test.cpp index 6e109a7ae48..b57ca438e54 100644 --- a/Sofa/Component/Engine/Analyze/tests/ClusteringEngine_test.cpp +++ b/Sofa/Component/Engine/Analyze/tests/ClusteringEngine_test.cpp @@ -57,7 +57,7 @@ struct ClusteringEngine_test : public BaseSimulationTest, typename MechanicalObject::SPtr m_mecaobject; - void SetUp() override + void doSetUp() override { m_simu = sofa::simulation::getSimulation(); ASSERT_NE(m_simu, nullptr); diff --git a/Sofa/Component/Engine/Generate/src/sofa/component/engine/generate/MeshTetraStuffing.h b/Sofa/Component/Engine/Generate/src/sofa/component/engine/generate/MeshTetraStuffing.h index f67ba6166d3..0b1b8805424 100644 --- a/Sofa/Component/Engine/Generate/src/sofa/component/engine/generate/MeshTetraStuffing.h +++ b/Sofa/Component/Engine/Generate/src/sofa/component/engine/generate/MeshTetraStuffing.h @@ -32,7 +32,7 @@ #include -#include +#include namespace sofa::component::engine::generate { @@ -72,40 +72,40 @@ class SOFA_COMPONENT_ENGINE_GENERATE_API MeshTetraStuffing : public core::DataEn SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_GENERATE() - sofa::core::objectmodel::RenamedData< type::fixed_array > vbbox; + sofa::core::objectmodel::lifecycle::RenamedData< type::fixed_array > vbbox; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_GENERATE() - sofa::core::objectmodel::RenamedData inputPoints; + sofa::core::objectmodel::lifecycle::RenamedData inputPoints; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_GENERATE() - sofa::core::objectmodel::RenamedData inputTriangles; + sofa::core::objectmodel::lifecycle::RenamedData inputTriangles; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_GENERATE() - sofa::core::objectmodel::RenamedData inputQuads; + sofa::core::objectmodel::lifecycle::RenamedData inputQuads; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_GENERATE() - sofa::core::objectmodel::RenamedData outputPoints; + sofa::core::objectmodel::lifecycle::RenamedData outputPoints; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_GENERATE() - sofa::core::objectmodel::RenamedData outputTetrahedra; + sofa::core::objectmodel::lifecycle::RenamedData outputTetrahedra; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_GENERATE() - sofa::core::objectmodel::RenamedData< Real > alphaLong; + sofa::core::objectmodel::lifecycle::RenamedData< Real > alphaLong; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_GENERATE() - sofa::core::objectmodel::RenamedData alphaShort; + sofa::core::objectmodel::lifecycle::RenamedData alphaShort; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_GENERATE() - sofa::core::objectmodel::RenamedData bSnapPoints; + sofa::core::objectmodel::lifecycle::RenamedData bSnapPoints; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_GENERATE() - sofa::core::objectmodel::RenamedData< bool > bSplitTetrahedra; + sofa::core::objectmodel::lifecycle::RenamedData< bool > bSplitTetrahedra; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_GENERATE() - sofa::core::objectmodel::RenamedData< bool > bDraw; + sofa::core::objectmodel::lifecycle::RenamedData< bool > bDraw; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_GENERATE() - sofa::core::objectmodel::RenamedData< Real > size; + sofa::core::objectmodel::lifecycle::RenamedData< Real > size; diff --git a/Sofa/Component/Engine/Generate/tests/ExtrudeEdgesAndGenerateQuads_test.cpp b/Sofa/Component/Engine/Generate/tests/ExtrudeEdgesAndGenerateQuads_test.cpp index be297368933..c7a2fdd853c 100644 --- a/Sofa/Component/Engine/Generate/tests/ExtrudeEdgesAndGenerateQuads_test.cpp +++ b/Sofa/Component/Engine/Generate/tests/ExtrudeEdgesAndGenerateQuads_test.cpp @@ -55,7 +55,7 @@ struct ExtrudeEdgesAndGenerateQuads_test : public BaseSimulationTest, Node::SPtr m_node; typename ThisClass::SPtr m_thisObject; - void SetUp() override + void doSetUp() override { m_simu = sofa::simulation::getSimulation(); ASSERT_NE(m_simu, nullptr); diff --git a/Sofa/Component/Engine/Generate/tests/MergePoints_test.cpp b/Sofa/Component/Engine/Generate/tests/MergePoints_test.cpp index 0e101c6440f..5f50d949e1f 100644 --- a/Sofa/Component/Engine/Generate/tests/MergePoints_test.cpp +++ b/Sofa/Component/Engine/Generate/tests/MergePoints_test.cpp @@ -49,7 +49,7 @@ struct MergePoints_test : public BaseSimulationTest, Simulation* m_simu; typename ThisClass::SPtr m_thisObject; - void SetUp() override + void doSetUp() override { m_simu = sofa::simulation::getSimulation(); ASSERT_NE(m_simu, nullptr); diff --git a/Sofa/Component/Engine/Select/src/sofa/component/engine/select/BaseROI.h b/Sofa/Component/Engine/Select/src/sofa/component/engine/select/BaseROI.h index c9c84070c0f..ba9ad625162 100644 --- a/Sofa/Component/Engine/Select/src/sofa/component/engine/select/BaseROI.h +++ b/Sofa/Component/Engine/Select/src/sofa/component/engine/select/BaseROI.h @@ -29,7 +29,7 @@ #include #include -#include +#include namespace sofa::component::engine::select { @@ -128,7 +128,7 @@ class BaseROI : public core::DataEngine Data d_doUpdate; ///< If true, updates the selection at the beginning of simulation steps. (default = true) SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_SELECT() - sofa::core::objectmodel::RenamedData d_X0; + sofa::core::objectmodel::lifecycle::RenamedData d_X0; protected: BaseROI(); ~BaseROI() override = default; diff --git a/Sofa/Component/Engine/Select/src/sofa/component/engine/select/MeshROI.h b/Sofa/Component/Engine/Select/src/sofa/component/engine/select/MeshROI.h index 491a0cabd9a..2544903fc1a 100644 --- a/Sofa/Component/Engine/Select/src/sofa/component/engine/select/MeshROI.h +++ b/Sofa/Component/Engine/Select/src/sofa/component/engine/select/MeshROI.h @@ -34,7 +34,7 @@ #include -#include +#include namespace sofa::component::engine::select { @@ -109,11 +109,11 @@ class MeshROI : public BaseROI static bool isPointInIndices(const unsigned int i, const SetIndex& indices); SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_SELECT() - sofa::core::objectmodel::RenamedData d_X0_i; + sofa::core::objectmodel::lifecycle::RenamedData d_X0_i; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_SELECT() - sofa::core::objectmodel::RenamedData > d_edges_i;; + sofa::core::objectmodel::lifecycle::RenamedData > d_edges_i;; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_SELECT() - sofa::core::objectmodel::RenamedData > d_triangles_i; + sofa::core::objectmodel::lifecycle::RenamedData > d_triangles_i; }; #if !defined(SOFA_COMPONENT_ENGINE_MESHROI_CPP) diff --git a/Sofa/Component/Engine/Select/src/sofa/component/engine/select/MeshROI.inl b/Sofa/Component/Engine/Select/src/sofa/component/engine/select/MeshROI.inl index 1121b696f00..679a9259e20 100644 --- a/Sofa/Component/Engine/Select/src/sofa/component/engine/select/MeshROI.inl +++ b/Sofa/Component/Engine/Select/src/sofa/component/engine/select/MeshROI.inl @@ -501,7 +501,9 @@ void MeshROI::roiComputeBBox(const core::ExecParams* params, type::Bo for (const auto& p : roiPositions) { - bbox.include(DataTypes::getCPos(p)); + Real x, y, z; + DataTypes::get(x, y, z, p); + bbox.include({x, y, z}); } } diff --git a/Sofa/Component/Engine/Select/src/sofa/component/engine/select/MeshSubsetEngine.h b/Sofa/Component/Engine/Select/src/sofa/component/engine/select/MeshSubsetEngine.h index 1ebefc40368..94786a04422 100644 --- a/Sofa/Component/Engine/Select/src/sofa/component/engine/select/MeshSubsetEngine.h +++ b/Sofa/Component/Engine/Select/src/sofa/component/engine/select/MeshSubsetEngine.h @@ -24,7 +24,7 @@ #include #include -#include +#include #include #include #include @@ -72,23 +72,23 @@ class MeshSubsetEngine : public core::DataEngine Data< SeqHexahedra > d_hexahedra; ///< Hexahedra of mesh subset SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_SELECT() - core::objectmodel::RenamedData inputPosition; + core::objectmodel::lifecycle::RenamedData inputPosition; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_SELECT() - core::objectmodel::RenamedData inputEdges; + core::objectmodel::lifecycle::RenamedData inputEdges; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_SELECT() - core::objectmodel::RenamedData inputTriangles; + core::objectmodel::lifecycle::RenamedData inputTriangles; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_SELECT() - core::objectmodel::RenamedData inputQuads; + core::objectmodel::lifecycle::RenamedData inputQuads; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_SELECT() - core::objectmodel::RenamedData indices; + core::objectmodel::lifecycle::RenamedData indices; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_SELECT() - core::objectmodel::RenamedData position; + core::objectmodel::lifecycle::RenamedData position; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_SELECT() - core::objectmodel::RenamedData edges; + core::objectmodel::lifecycle::RenamedData edges; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_SELECT() - core::objectmodel::RenamedData triangles; + core::objectmodel::lifecycle::RenamedData triangles; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_SELECT() - core::objectmodel::RenamedData quads; + core::objectmodel::lifecycle::RenamedData quads; protected: MeshSubsetEngine(); diff --git a/Sofa/Component/Engine/Select/src/sofa/component/engine/select/SphereROI.h b/Sofa/Component/Engine/Select/src/sofa/component/engine/select/SphereROI.h index 488aaebcc54..68804f9e49c 100644 --- a/Sofa/Component/Engine/Select/src/sofa/component/engine/select/SphereROI.h +++ b/Sofa/Component/Engine/Select/src/sofa/component/engine/select/SphereROI.h @@ -29,7 +29,7 @@ #include #include -#include +#include namespace sofa::component::engine::select { @@ -81,17 +81,17 @@ class SphereROI : public BaseROI Data< Real > d_triAngle; ///< Max angle between the normal of the selected triangle and the specified normal direction SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_SELECT() - sofa::core::objectmodel::RenamedData< type::vector > centers; + sofa::core::objectmodel::lifecycle::RenamedData< type::vector > centers; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_SELECT() - sofa::core::objectmodel::RenamedData< type::vector > radii; + sofa::core::objectmodel::lifecycle::RenamedData< type::vector > radii; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_SELECT() - sofa::core::objectmodel::RenamedData< type::Vec3 > direction; + sofa::core::objectmodel::lifecycle::RenamedData< type::Vec3 > direction; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_SELECT() - sofa::core::objectmodel::RenamedData< type::Vec3 > normal; + sofa::core::objectmodel::lifecycle::RenamedData< type::Vec3 > normal; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_SELECT() - sofa::core::objectmodel::RenamedData< Real > edgeAngle; + sofa::core::objectmodel::lifecycle::RenamedData< Real > edgeAngle; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ENGINE_SELECT() - sofa::core::objectmodel::RenamedData< Real > triAngle; + sofa::core::objectmodel::lifecycle::RenamedData< Real > triAngle; }; #if !defined(SOFA_COMPONENT_ENGINE_SPHEREROI_CPP) diff --git a/Sofa/Component/Engine/Select/src/sofa/component/engine/select/ValuesFromPositions.inl b/Sofa/Component/Engine/Select/src/sofa/component/engine/select/ValuesFromPositions.inl index be9c929108a..d88b40ed666 100644 --- a/Sofa/Component/Engine/Select/src/sofa/component/engine/select/ValuesFromPositions.inl +++ b/Sofa/Component/Engine/Select/src/sofa/component/engine/select/ValuesFromPositions.inl @@ -430,8 +430,7 @@ void ValuesFromPositions::draw(const core::visual::VisualParams* vpar color[j] = (float)fabs (tetrahedronVectors[i][j]); colors.push_back(color); - colors.push_back(color); - + vertices.push_back(point1); vertices.push_back(point2); } diff --git a/Sofa/Component/Engine/Select/tests/BoxROI_test.cpp b/Sofa/Component/Engine/Select/tests/BoxROI_test.cpp index 6b0d14609ae..08425f2c4cb 100644 --- a/Sofa/Component/Engine/Select/tests/BoxROI_test.cpp +++ b/Sofa/Component/Engine/Select/tests/BoxROI_test.cpp @@ -70,11 +70,12 @@ struct BoxROITest : public sofa::testing::BaseTest Node::SPtr m_node; typename TheBoxROI::SPtr m_boxroi; - void SetUp() override + void doSetUp() override { - sofa::simpleapi::importPlugin("Sofa.Component.StateContainer"); - sofa::simpleapi::importPlugin("Sofa.Component.Topology.Container.Dynamic"); - sofa::simpleapi::importPlugin("Sofa.Component.Engine.Select"); + this->loadPlugins({ + Sofa.Component.StateContainer, + Sofa.Component.Topology.Container.Dynamic, + Sofa.Component.Engine.Select}); m_simu = sofa::simulation::getSimulation(); ASSERT_NE(m_simu, nullptr); @@ -86,7 +87,7 @@ struct BoxROITest : public sofa::testing::BaseTest m_node->addObject(m_boxroi); } - void TearDown() override + void doTearDown() override { if (m_root != nullptr){ sofa::simulation::node::unload(m_root); diff --git a/Sofa/Component/Engine/Select/tests/ComplementaryROI_test.cpp b/Sofa/Component/Engine/Select/tests/ComplementaryROI_test.cpp index 38b1dcc0057..ec055b0321a 100644 --- a/Sofa/Component/Engine/Select/tests/ComplementaryROI_test.cpp +++ b/Sofa/Component/Engine/Select/tests/ComplementaryROI_test.cpp @@ -55,7 +55,7 @@ struct ComplementaryROI_test : public BaseSimulationTest, typename ThisClass::SPtr m_thisObject; - void SetUp() override + void doSetUp() override { m_simu = sofa::simulation::getSimulation(); ASSERT_NE(m_simu, nullptr); diff --git a/Sofa/Component/Engine/Select/tests/MeshROI_test.cpp b/Sofa/Component/Engine/Select/tests/MeshROI_test.cpp index aa3e96d8ab6..1ebd9f92505 100644 --- a/Sofa/Component/Engine/Select/tests/MeshROI_test.cpp +++ b/Sofa/Component/Engine/Select/tests/MeshROI_test.cpp @@ -61,11 +61,11 @@ struct MeshROI_test : public BaseSimulationTest, Node::SPtr m_root; ThisClass* m_thisObject; - void SetUp() override + void doSetUp() override { - simpleapi::importPlugin("Sofa.Component.Engine.Select"); - simpleapi::importPlugin("Sofa.Component.Topology.Container.Constant"); - simpleapi::importPlugin("Sofa.Component.IO.Mesh"); + simpleapi::importPlugin(Sofa.Component.Engine.Select); + simpleapi::importPlugin(Sofa.Component.Topology.Container.Constant); + simpleapi::importPlugin(Sofa.Component.IO.Mesh); // SetUp3 const string scene2 = @@ -86,7 +86,7 @@ struct MeshROI_test : public BaseSimulationTest, ASSERT_NE(m_thisObject, nullptr) ; } - void TearDown() override + void doTearDown() override { sofa::simulation::node::unload(m_root) ; } diff --git a/Sofa/Component/Engine/Select/tests/MeshSubsetEngine_test.cpp b/Sofa/Component/Engine/Select/tests/MeshSubsetEngine_test.cpp index 17ed3e5d1ca..4ce112798ff 100644 --- a/Sofa/Component/Engine/Select/tests/MeshSubsetEngine_test.cpp +++ b/Sofa/Component/Engine/Select/tests/MeshSubsetEngine_test.cpp @@ -31,9 +31,9 @@ struct MeshSubsetEngine_test : public testing::BaseSimulationTest sofa::simulation::Node::SPtr m_root; typename component::engine::select::MeshSubsetEngine<_DataTypes>::SPtr m_engine; - void SetUp() override + void doSetUp() override { - simpleapi::importPlugin("Sofa.Component.Engine.Select"); + simpleapi::importPlugin(Sofa.Component.Engine.Select); m_root = simulation::getSimulation()->createNewNode("root"); ASSERT_NE(nullptr, m_root); @@ -44,7 +44,7 @@ struct MeshSubsetEngine_test : public testing::BaseSimulationTest m_root->addObject(m_engine); } - void TearDown() override + void doTearDown() override { sofa::simulation::node::unload(m_root) ; } diff --git a/Sofa/Component/Engine/Select/tests/PlaneROI_test.cpp b/Sofa/Component/Engine/Select/tests/PlaneROI_test.cpp index 8ed1acd210f..628d8b97771 100644 --- a/Sofa/Component/Engine/Select/tests/PlaneROI_test.cpp +++ b/Sofa/Component/Engine/Select/tests/PlaneROI_test.cpp @@ -61,7 +61,7 @@ struct PlaneROI_test : public BaseSimulationTest, Node::SPtr m_node1, m_node2; typename ThisClass::SPtr m_thisObject; - void SetUp() override + void doSetUp() override { // SetUp1 m_simu = sofa::simulation::getSimulation(); diff --git a/Sofa/Component/Engine/Select/tests/SphereROI_test.cpp b/Sofa/Component/Engine/Select/tests/SphereROI_test.cpp index 3033378429f..0bfb8a12387 100644 --- a/Sofa/Component/Engine/Select/tests/SphereROI_test.cpp +++ b/Sofa/Component/Engine/Select/tests/SphereROI_test.cpp @@ -61,7 +61,7 @@ struct SphereROI_test : public BaseSimulationTest, Node::SPtr m_node; typename ThisClass::SPtr m_thisObject; - void SetUp() override + void doSetUp() override { m_simu = sofa::simulation::getSimulation(); ASSERT_NE(m_simu, nullptr); diff --git a/Sofa/Component/Engine/Transform/tests/DifferenceEngine_test.cpp b/Sofa/Component/Engine/Transform/tests/DifferenceEngine_test.cpp index caf5d3c7bdd..d2f7ecddbbd 100644 --- a/Sofa/Component/Engine/Transform/tests/DifferenceEngine_test.cpp +++ b/Sofa/Component/Engine/Transform/tests/DifferenceEngine_test.cpp @@ -54,7 +54,7 @@ struct DifferenceEngine_test : public BaseSimulationTest, Node::SPtr m_node; typename ThisClass::SPtr m_thisObject; - void SetUp() override + void doSetUp() override { m_simu = sofa::simulation::getSimulation(); ASSERT_NE(m_simu, nullptr); diff --git a/Sofa/Component/Engine/Transform/tests/DilateEngine_test.cpp b/Sofa/Component/Engine/Transform/tests/DilateEngine_test.cpp index f24b09c827c..bbed29b8fa5 100644 --- a/Sofa/Component/Engine/Transform/tests/DilateEngine_test.cpp +++ b/Sofa/Component/Engine/Transform/tests/DilateEngine_test.cpp @@ -52,7 +52,7 @@ struct DilateEngine_test : public BaseSimulationTest, Node::SPtr m_node; typename ThisClass::SPtr m_thisObject; - void SetUp() override + void doSetUp() override { m_simu = sofa::simulation::getSimulation(); ASSERT_NE(m_simu, nullptr); diff --git a/Sofa/Component/Engine/Transform/tests/SmoothMeshEngine_test.cpp b/Sofa/Component/Engine/Transform/tests/SmoothMeshEngine_test.cpp index 4d05f03fba7..d28d41321e9 100644 --- a/Sofa/Component/Engine/Transform/tests/SmoothMeshEngine_test.cpp +++ b/Sofa/Component/Engine/Transform/tests/SmoothMeshEngine_test.cpp @@ -53,7 +53,7 @@ struct SmoothMeshEngine_test : public BaseSimulationTest, Node::SPtr m_node; typename ThisClass::SPtr m_thisObject; - void SetUp() override + void doSetUp() override { m_simu = sofa::simulation::getSimulation(); ASSERT_NE(m_simu, nullptr); diff --git a/Sofa/Component/Engine/src/sofa/component/engine/init.cpp b/Sofa/Component/Engine/src/sofa/component/engine/init.cpp index 05eeff6cc2b..4ffe472034e 100644 --- a/Sofa/Component/Engine/src/sofa/component/engine/init.cpp +++ b/Sofa/Component/Engine/src/sofa/component/engine/init.cpp @@ -28,6 +28,7 @@ #include #include +#include namespace sofa::component::engine { @@ -56,10 +57,10 @@ const char* getModuleVersion() void registerObjects(sofa::core::ObjectFactory* factory) { - factory->registerObjectsFromPlugin("Sofa.Component.Engine.Analyze"); - factory->registerObjectsFromPlugin("Sofa.Component.Engine.Generate"); - factory->registerObjectsFromPlugin("Sofa.Component.Engine.Select"); - factory->registerObjectsFromPlugin("Sofa.Component.Engine.Transform"); + factory->registerObjectsFromPlugin(Sofa.Component.Engine.Analyze); + factory->registerObjectsFromPlugin(Sofa.Component.Engine.Generate); + factory->registerObjectsFromPlugin(Sofa.Component.Engine.Select); + factory->registerObjectsFromPlugin(Sofa.Component.Engine.Transform); } void init() diff --git a/Sofa/Component/Haptics/src/sofa/component/haptics/LCPForceFeedback.h b/Sofa/Component/Haptics/src/sofa/component/haptics/LCPForceFeedback.h index 3b8494339b8..f6559fef3f7 100644 --- a/Sofa/Component/Haptics/src/sofa/component/haptics/LCPForceFeedback.h +++ b/Sofa/Component/Haptics/src/sofa/component/haptics/LCPForceFeedback.h @@ -29,7 +29,7 @@ #include -#include +#include namespace sofa::component::haptics { @@ -63,10 +63,10 @@ class LCPForceFeedback : public MechanicalStateForceFeedback } SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_HAPTICS() - sofa::core::objectmodel::RenamedData forceCoef; + sofa::core::objectmodel::lifecycle::RenamedData forceCoef; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_HAPTICS() - sofa::core::objectmodel::RenamedData solverTimeout; + sofa::core::objectmodel::lifecycle::RenamedData solverTimeout; Data< double > d_forceCoef; ///< multiply haptic force by this coef. diff --git a/Sofa/Component/IO/Mesh/src/sofa/component/io/mesh/BlenderExporter.h b/Sofa/Component/IO/Mesh/src/sofa/component/io/mesh/BlenderExporter.h index d6d9e614a59..d69c27e7806 100644 --- a/Sofa/Component/IO/Mesh/src/sofa/component/io/mesh/BlenderExporter.h +++ b/Sofa/Component/IO/Mesh/src/sofa/component/io/mesh/BlenderExporter.h @@ -38,7 +38,7 @@ #include -#include +#include namespace sofa::component { @@ -73,19 +73,19 @@ class SOFA_COMPONENT_IO_MESH_API BlenderExporter: public core::objectmodel::Base SOFA_CLASS(SOFA_TEMPLATE(BlenderExporter,T),core::objectmodel::BaseObject); SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_IO_MESH() - sofa::core::objectmodel::RenamedData path; + sofa::core::objectmodel::lifecycle::RenamedData path; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_IO_MESH() - sofa::core::objectmodel::RenamedData baseName; + sofa::core::objectmodel::lifecycle::RenamedData baseName; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_IO_MESH() - sofa::core::objectmodel::RenamedData simulationType; + sofa::core::objectmodel::lifecycle::RenamedData simulationType; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_IO_MESH() - sofa::core::objectmodel::RenamedData simulationStep; + sofa::core::objectmodel::lifecycle::RenamedData simulationStep; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_IO_MESH() - sofa::core::objectmodel::RenamedData nbPtsByHair; + sofa::core::objectmodel::lifecycle::RenamedData nbPtsByHair; Data < std::string > d_path; ///< output path diff --git a/Sofa/Component/IO/Mesh/src/sofa/component/io/mesh/GridMeshCreator.h b/Sofa/Component/IO/Mesh/src/sofa/component/io/mesh/GridMeshCreator.h index 91a6a0370b4..f0018ed751a 100644 --- a/Sofa/Component/IO/Mesh/src/sofa/component/io/mesh/GridMeshCreator.h +++ b/Sofa/Component/IO/Mesh/src/sofa/component/io/mesh/GridMeshCreator.h @@ -24,7 +24,7 @@ #include -#include +#include namespace sofa::component::io::mesh { @@ -44,10 +44,10 @@ class SOFA_COMPONENT_IO_MESH_API GridMeshCreator : public sofa::core::loader::Me bool canLoad() override { return true; } bool doLoad() override; ///< create the grid SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_IO_MESH() - sofa::core::objectmodel::RenamedData< type::Vec2i > resolution; + sofa::core::objectmodel::lifecycle::RenamedData< type::Vec2i > resolution; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_IO_MESH() - sofa::core::objectmodel::RenamedData< int > trianglePattern; + sofa::core::objectmodel::lifecycle::RenamedData< int > trianglePattern; diff --git a/Sofa/Component/IO/Mesh/src/sofa/component/io/mesh/MeshSTLLoader.h b/Sofa/Component/IO/Mesh/src/sofa/component/io/mesh/MeshSTLLoader.h index 066b26113f1..f896ba79700 100644 --- a/Sofa/Component/IO/Mesh/src/sofa/component/io/mesh/MeshSTLLoader.h +++ b/Sofa/Component/IO/Mesh/src/sofa/component/io/mesh/MeshSTLLoader.h @@ -23,7 +23,7 @@ #include #include -#include +#include namespace sofa::component::io::mesh { @@ -51,10 +51,10 @@ class SOFA_COMPONENT_IO_MESH_API MeshSTLLoader : public sofa::core::loader::Mesh public: //Add Data here SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_IO_MESH() - sofa::core::objectmodel::RenamedData _forceBinary; + sofa::core::objectmodel::lifecycle::RenamedData _forceBinary; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_IO_MESH() - sofa::core::objectmodel::RenamedData _headerSize; + sofa::core::objectmodel::lifecycle::RenamedData _headerSize; diff --git a/Sofa/Component/IO/Mesh/src/sofa/component/io/mesh/MeshTrianLoader.h b/Sofa/Component/IO/Mesh/src/sofa/component/io/mesh/MeshTrianLoader.h index 92bd4e6124c..7a9aae5e63f 100644 --- a/Sofa/Component/IO/Mesh/src/sofa/component/io/mesh/MeshTrianLoader.h +++ b/Sofa/Component/IO/Mesh/src/sofa/component/io/mesh/MeshTrianLoader.h @@ -24,7 +24,7 @@ #include -#include +#include namespace sofa::component::io::mesh { @@ -56,16 +56,16 @@ class SOFA_COMPONENT_IO_MESH_API MeshTrianLoader : public sofa::core::loader::Me public: //Add specific Data here: SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_IO_MESH() - sofa::core::objectmodel::RenamedData p_trian2; + sofa::core::objectmodel::lifecycle::RenamedData p_trian2; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_IO_MESH() - sofa::core::objectmodel::RenamedData > > neighborTable; + sofa::core::objectmodel::lifecycle::RenamedData > > neighborTable; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_IO_MESH() - sofa::core::objectmodel::RenamedData > > edgesOnBorder; + sofa::core::objectmodel::lifecycle::RenamedData > > edgesOnBorder; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_IO_MESH() - sofa::core::objectmodel::RenamedData > trianglesOnBorderList; + sofa::core::objectmodel::lifecycle::RenamedData > trianglesOnBorderList; Data d_trian2; ///< Set to true if the mesh is a trian2 format. Data > > d_neighborTable; ///< Table of neighborhood triangle indices for each triangle. diff --git a/Sofa/Component/IO/Mesh/src/sofa/component/io/mesh/OffSequenceLoader.h b/Sofa/Component/IO/Mesh/src/sofa/component/io/mesh/OffSequenceLoader.h index aa8e4d25172..84bda24944a 100644 --- a/Sofa/Component/IO/Mesh/src/sofa/component/io/mesh/OffSequenceLoader.h +++ b/Sofa/Component/IO/Mesh/src/sofa/component/io/mesh/OffSequenceLoader.h @@ -24,7 +24,7 @@ #include -#include +#include namespace sofa::component::io::mesh { @@ -51,9 +51,9 @@ class SOFA_COMPONENT_IO_MESH_API OffSequenceLoader : public MeshOffLoader private: SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_IO_MESH() - sofa::core::objectmodel::RenamedData nbFiles; + sofa::core::objectmodel::lifecycle::RenamedData nbFiles; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_IO_MESH() - sofa::core::objectmodel::RenamedData stepDuration; + sofa::core::objectmodel::lifecycle::RenamedData stepDuration; /// the number of files in the sequences diff --git a/Sofa/Component/IO/Mesh/src/sofa/component/io/mesh/StringMeshCreator.h b/Sofa/Component/IO/Mesh/src/sofa/component/io/mesh/StringMeshCreator.h index 8077b3587e2..166bf418493 100644 --- a/Sofa/Component/IO/Mesh/src/sofa/component/io/mesh/StringMeshCreator.h +++ b/Sofa/Component/IO/Mesh/src/sofa/component/io/mesh/StringMeshCreator.h @@ -24,7 +24,7 @@ #include -#include +#include namespace sofa::component::io::mesh { @@ -39,7 +39,7 @@ class SOFA_COMPONENT_IO_MESH_API StringMeshCreator : public sofa::core::loader:: { public: SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_IO_MESH() - sofa::core::objectmodel::RenamedData< unsigned > resolution; + sofa::core::objectmodel::lifecycle::RenamedData< unsigned > resolution; SOFA_CLASS(StringMeshCreator,sofa::core::loader::MeshLoader); virtual std::string type() { return "This object is procedurally created"; } diff --git a/Sofa/Component/IO/Mesh/src/sofa/component/io/mesh/VTKExporter.h b/Sofa/Component/IO/Mesh/src/sofa/component/io/mesh/VTKExporter.h index 2d2c872068d..cc333ca90b5 100644 --- a/Sofa/Component/IO/Mesh/src/sofa/component/io/mesh/VTKExporter.h +++ b/Sofa/Component/IO/Mesh/src/sofa/component/io/mesh/VTKExporter.h @@ -30,7 +30,7 @@ #include -#include +#include namespace sofa::component::_vtkexporter_ { @@ -60,43 +60,43 @@ class SOFA_COMPONENT_IO_MESH_API VTKExporter : public core::objectmodel::BaseObj sofa::core::objectmodel::DataFileName vtkFilename; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_IO_MESH() - sofa::core::objectmodel::RenamedData< bool > fileFormat; + sofa::core::objectmodel::lifecycle::RenamedData< bool > fileFormat; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_IO_MESH() - sofa::core::objectmodel::RenamedData position; + sofa::core::objectmodel::lifecycle::RenamedData position; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_IO_MESH() - sofa::core::objectmodel::RenamedData< bool > writeEdges; + sofa::core::objectmodel::lifecycle::RenamedData< bool > writeEdges; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_IO_MESH() - sofa::core::objectmodel::RenamedData< bool > writeTriangles; + sofa::core::objectmodel::lifecycle::RenamedData< bool > writeTriangles; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_IO_MESH() - sofa::core::objectmodel::RenamedData< bool > writeQuads; + sofa::core::objectmodel::lifecycle::RenamedData< bool > writeQuads; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_IO_MESH() - sofa::core::objectmodel::RenamedData< bool > writeTetras; + sofa::core::objectmodel::lifecycle::RenamedData< bool > writeTetras; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_IO_MESH() - sofa::core::objectmodel::RenamedData< bool > writeHexas; + sofa::core::objectmodel::lifecycle::RenamedData< bool > writeHexas; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_IO_MESH() - sofa::core::objectmodel::RenamedData > dPointsDataFields; + sofa::core::objectmodel::lifecycle::RenamedData > dPointsDataFields; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_IO_MESH() - sofa::core::objectmodel::RenamedData > dCellsDataFields; + sofa::core::objectmodel::lifecycle::RenamedData > dCellsDataFields; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_IO_MESH() - sofa::core::objectmodel::RenamedData< unsigned int > exportEveryNbSteps; + sofa::core::objectmodel::lifecycle::RenamedData< unsigned int > exportEveryNbSteps; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_IO_MESH() - sofa::core::objectmodel::RenamedData< bool > exportAtBegin; + sofa::core::objectmodel::lifecycle::RenamedData< bool > exportAtBegin; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_IO_MESH() - sofa::core::objectmodel::RenamedData< bool > exportAtEnd; + sofa::core::objectmodel::lifecycle::RenamedData< bool > exportAtEnd; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_IO_MESH() - sofa::core::objectmodel::RenamedData< bool > overwrite; + sofa::core::objectmodel::lifecycle::RenamedData< bool > overwrite; diff --git a/Sofa/Component/IO/Mesh/src/sofa/component/io/mesh/VoxelGridLoader.h b/Sofa/Component/IO/Mesh/src/sofa/component/io/mesh/VoxelGridLoader.h index 0b3e9255038..0921f06daf6 100644 --- a/Sofa/Component/IO/Mesh/src/sofa/component/io/mesh/VoxelGridLoader.h +++ b/Sofa/Component/IO/Mesh/src/sofa/component/io/mesh/VoxelGridLoader.h @@ -24,7 +24,7 @@ #include -#include +#include namespace sofa::component::io::mesh { @@ -74,31 +74,31 @@ class SOFA_COMPONENT_IO_MESH_API VoxelGridLoader : public sofa::core::loader::Vo // fill the texture by 'image' only where there is the 'segmentation' of 'd_activeValue' and give the 3D texture sizes void createSegmentation3DTexture( unsigned char **textureData, int& width, int& height, int& depth) override; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_IO_MESH() - sofa::core::objectmodel::RenamedData< type::Vec3 > voxelSize; + sofa::core::objectmodel::lifecycle::RenamedData< type::Vec3 > voxelSize; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_IO_MESH() - sofa::core::objectmodel::RenamedData< Vec3i > dataResolution; + sofa::core::objectmodel::lifecycle::RenamedData< Vec3i > dataResolution; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_IO_MESH() - sofa::core::objectmodel::RenamedData< Vec6i > roi; + sofa::core::objectmodel::lifecycle::RenamedData< Vec6i > roi; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_IO_MESH() - sofa::core::objectmodel::RenamedData< int > headerSize; + sofa::core::objectmodel::lifecycle::RenamedData< int > headerSize; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_IO_MESH() - sofa::core::objectmodel::RenamedData< int > segmentationHeaderSize; + sofa::core::objectmodel::lifecycle::RenamedData< int > segmentationHeaderSize; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_IO_MESH() - sofa::core::objectmodel::RenamedData< type::vector > idxInRegularGrid; + sofa::core::objectmodel::lifecycle::RenamedData< type::vector > idxInRegularGrid; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_IO_MESH() - sofa::core::objectmodel::RenamedData< type::vector > backgroundValue; + sofa::core::objectmodel::lifecycle::RenamedData< type::vector > backgroundValue; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_IO_MESH() - sofa::core::objectmodel::RenamedData< type::vector > activeValue; + sofa::core::objectmodel::lifecycle::RenamedData< type::vector > activeValue; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_IO_MESH() - sofa::core::objectmodel::RenamedData generateHexa; + sofa::core::objectmodel::lifecycle::RenamedData generateHexa; diff --git a/Sofa/Component/IO/Mesh/tests/MeshExporter_test.cpp b/Sofa/Component/IO/Mesh/tests/MeshExporter_test.cpp index 9c5996dee24..eb0282269cd 100644 --- a/Sofa/Component/IO/Mesh/tests/MeshExporter_test.cpp +++ b/Sofa/Component/IO/Mesh/tests/MeshExporter_test.cpp @@ -75,13 +75,13 @@ class MeshExporter_test /// remove the file created... std::vector dataPath; - void SetUp() override + void doSetUp() override { - sofa::simpleapi::importPlugin("Sofa.Component.StateContainer"); - sofa::simpleapi::importPlugin("Sofa.Component.Topology.Container.Grid"); + sofa::simpleapi::importPlugin(Sofa.Component.StateContainer); + sofa::simpleapi::importPlugin(Sofa.Component.Topology.Container.Grid); } - void TearDown() override + void doTearDown() override { for (const auto& pathToRemove : dataPath) { diff --git a/Sofa/Component/IO/Mesh/tests/MeshGmshLoader_test.cpp b/Sofa/Component/IO/Mesh/tests/MeshGmshLoader_test.cpp index 93a26d24592..38534751514 100644 --- a/Sofa/Component/IO/Mesh/tests/MeshGmshLoader_test.cpp +++ b/Sofa/Component/IO/Mesh/tests/MeshGmshLoader_test.cpp @@ -51,7 +51,7 @@ namespace meshgmshloader_test /** * Constructor call for each test */ - void SetUp() override {} + void doSetUp() override {} /** * Helper function to check mesh loading. diff --git a/Sofa/Component/IO/Mesh/tests/MeshXspLoader_test.cpp b/Sofa/Component/IO/Mesh/tests/MeshXspLoader_test.cpp index df20ce772a6..3a167422840 100644 --- a/Sofa/Component/IO/Mesh/tests/MeshXspLoader_test.cpp +++ b/Sofa/Component/IO/Mesh/tests/MeshXspLoader_test.cpp @@ -35,7 +35,7 @@ class MeshXspLoader_test : public BaseSimulationTest const Node::SPtr root = sofa::simpleapi::createRootNode(simulation, "root"); sofa::simpleapi::createObject(root, "DefaultAnimationLoop"); - sofa::simpleapi::createObject(root, "RequiredPlugin", { { "name","Sofa.Component.IO.Mesh" } }); + sofa::simpleapi::createObject(root, "RequiredPlugin", { { "name",Sofa.Component.IO.Mesh } }); auto loader = sofa::simpleapi::createObject(root, "MeshXspLoader", {{"filename", std::string(SOFA_COMPONENT_IO_MESH_TEST_FILES_DIR)+"test.xs3"}}); sofa::simulation::node::initRoot(root.get()); diff --git a/Sofa/Component/IO/Mesh/tests/STLExporter_test.cpp b/Sofa/Component/IO/Mesh/tests/STLExporter_test.cpp index 55b6be2b8b8..1f8429d1224 100644 --- a/Sofa/Component/IO/Mesh/tests/STLExporter_test.cpp +++ b/Sofa/Component/IO/Mesh/tests/STLExporter_test.cpp @@ -65,13 +65,14 @@ class STLExporter_test : public BaseSimulationTest { /// remove the file created... std::vector dataPath ; - void SetUp() override + void doSetUp() override { - sofa::simpleapi::importPlugin("Sofa.Component.StateContainer"); - sofa::simpleapi::importPlugin("Sofa.Component.Visual"); + sofa::simpleapi::importPlugin(Sofa.Component.StateContainer); + sofa::simpleapi::importPlugin(Sofa.Component.Visual); + sofa::simpleapi::importPlugin(Sofa.Component.IO.Mesh); } - void TearDown() override + void doTearDown() override { for (const auto& pathToRemove : dataPath) { @@ -98,7 +99,6 @@ class STLExporter_test : public BaseSimulationTest { " \n" " \n" " \n" - " \n" " \n" " \n" " \n" diff --git a/Sofa/Component/IO/Mesh/tests/VisualModelOBJExporter_test.cpp b/Sofa/Component/IO/Mesh/tests/VisualModelOBJExporter_test.cpp index 1010d487118..eeb1810bcd0 100644 --- a/Sofa/Component/IO/Mesh/tests/VisualModelOBJExporter_test.cpp +++ b/Sofa/Component/IO/Mesh/tests/VisualModelOBJExporter_test.cpp @@ -62,11 +62,11 @@ class VisualModelOBJExporter_test : public BaseSimulationTest { /// remove the file created... std::vector dataPath ; - void SetUp() override + void doSetUp() override { } - void TearDown() override + void doTearDown() override { for (const auto& pathToRemove : dataPath) { diff --git a/Sofa/Component/IO/src/sofa/component/io/init.cpp b/Sofa/Component/IO/src/sofa/component/io/init.cpp index 45cfe4d1971..cf13bfd0001 100644 --- a/Sofa/Component/IO/src/sofa/component/io/init.cpp +++ b/Sofa/Component/IO/src/sofa/component/io/init.cpp @@ -25,6 +25,7 @@ #include #include +#include namespace sofa::component::io { @@ -53,7 +54,7 @@ const char* getModuleVersion() void registerObjects(sofa::core::ObjectFactory* factory) { - factory->registerObjectsFromPlugin("Sofa.Component.IO.Mesh"); + factory->registerObjectsFromPlugin(Sofa.Component.IO.Mesh); } void init() diff --git a/Sofa/Component/LinearSolver/Direct/src/sofa/component/linearsolver/direct/PrecomputedLinearSolver.h b/Sofa/Component/LinearSolver/Direct/src/sofa/component/linearsolver/direct/PrecomputedLinearSolver.h index 7c8573a083f..118f170edc3 100644 --- a/Sofa/Component/LinearSolver/Direct/src/sofa/component/linearsolver/direct/PrecomputedLinearSolver.h +++ b/Sofa/Component/LinearSolver/Direct/src/sofa/component/linearsolver/direct/PrecomputedLinearSolver.h @@ -32,7 +32,7 @@ #include #include -#include +#include namespace sofa::component::linearsolver::direct { @@ -83,10 +83,10 @@ class PrecomputedLinearSolver : public sofa::component::linearsolver::MatrixLine typedef typename PrecomputedLinearSolverInternalData::TBaseMatrix TBaseMatrix; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_LINEARSOLVER_DIRECT() - sofa::core::objectmodel::RenamedData jmjt_twostep; + sofa::core::objectmodel::lifecycle::RenamedData jmjt_twostep; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_LINEARSOLVER_DIRECT() - sofa::core::objectmodel::RenamedData use_file; + sofa::core::objectmodel::lifecycle::RenamedData use_file; Data d_jmjt_twostep; ///< Use two step algorithm to compute JMinvJt diff --git a/Sofa/Component/LinearSolver/Direct/src/sofa/component/linearsolver/direct/SVDLinearSolver.h b/Sofa/Component/LinearSolver/Direct/src/sofa/component/linearsolver/direct/SVDLinearSolver.h index 36a91409e55..f0d619e5467 100644 --- a/Sofa/Component/LinearSolver/Direct/src/sofa/component/linearsolver/direct/SVDLinearSolver.h +++ b/Sofa/Component/LinearSolver/Direct/src/sofa/component/linearsolver/direct/SVDLinearSolver.h @@ -25,7 +25,7 @@ #include #include -#include +#include namespace sofa::component::linearsolver::direct { @@ -51,13 +51,13 @@ class SVDLinearSolver : public sofa::component::linearsolver::MatrixLinearSolver typedef sofa::component::linearsolver::MatrixLinearSolver Inherit; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_LINEARSOLVER_DIRECT() - sofa::core::objectmodel::RenamedData f_verbose; + sofa::core::objectmodel::lifecycle::RenamedData f_verbose; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_LINEARSOLVER_DIRECT() - sofa::core::objectmodel::RenamedData f_minSingularValue; + sofa::core::objectmodel::lifecycle::RenamedData f_minSingularValue; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_LINEARSOLVER_DIRECT() - sofa::core::objectmodel::RenamedData f_conditionNumber; + sofa::core::objectmodel::lifecycle::RenamedData f_conditionNumber; Data d_verbose; ///< Dump system state at each iteration diff --git a/Sofa/Component/LinearSolver/Direct/tests/SparseLDLSolver_test.cpp b/Sofa/Component/LinearSolver/Direct/tests/SparseLDLSolver_test.cpp index 6dd556f57b6..3d72df3da06 100644 --- a/Sofa/Component/LinearSolver/Direct/tests/SparseLDLSolver_test.cpp +++ b/Sofa/Component/LinearSolver/Direct/tests/SparseLDLSolver_test.cpp @@ -57,9 +57,10 @@ TEST(SparseLDLSolver, EmptyMState) const sofa::simulation::Node::SPtr root = sofa::simulation::getSimulation()->createNewGraph("root"); - sofa::simpleapi::importPlugin("Sofa.Component.LinearSolver.Direct"); - sofa::simpleapi::importPlugin("Sofa.Component.ODESolver.Backward"); - sofa::simpleapi::importPlugin("Sofa.Component.StateContainer"); + const auto plugins = sofa::testing::makeScopedPlugin({ + Sofa.Component.LinearSolver.Direct, + Sofa.Component.ODESolver.Backward, + Sofa.Component.StateContainer}); sofa::simpleapi::createObject(root, "DefaultAnimationLoop"); sofa::simpleapi::createObject(root, "EulerImplicitSolver"); @@ -83,14 +84,15 @@ TEST(SparseLDLSolver, TopologyChangeEmptyMState) // required to be able to use EXPECT_MSG_NOEMIT and EXPECT_MSG_EMIT sofa::helper::logging::MessageDispatcher::addHandler(sofa::testing::MainGtestMessageHandler::getInstance() ) ; - const sofa::simulation::Node::SPtr root = sofa::simulation::getSimulation()->createNewGraph("root"); + const sofa::simulation::Node::SPtr root = sofa::simulation::getSimulation()->createNewGraph("root"); - sofa::simpleapi::importPlugin("Sofa.Component.LinearSolver.Direct"); - sofa::simpleapi::importPlugin("Sofa.Component.Mass"); - sofa::simpleapi::importPlugin("Sofa.Component.ODESolver.Backward"); - sofa::simpleapi::importPlugin("Sofa.Component.StateContainer"); - sofa::simpleapi::importPlugin("Sofa.Component.Topology.Container.Dynamic"); - sofa::simpleapi::importPlugin("Sofa.Component.Topology.Utility"); + const auto plugins = sofa::testing::makeScopedPlugin({ + Sofa.Component.LinearSolver.Direct, + Sofa.Component.Mass, + Sofa.Component.ODESolver.Backward, + Sofa.Component.StateContainer, + Sofa.Component.Topology.Container.Dynamic, + Sofa.Component.Topology.Utility}); sofa::simpleapi::createObject(root, "DefaultAnimationLoop"); sofa::simpleapi::createObject(root, "EulerImplicitSolver"); diff --git a/Sofa/Component/LinearSolver/Iterative/src/sofa/component/linearsolver/iterative/PCGLinearSolver.h b/Sofa/Component/LinearSolver/Iterative/src/sofa/component/linearsolver/iterative/PCGLinearSolver.h index 1506256becd..50dd8f112fc 100644 --- a/Sofa/Component/LinearSolver/Iterative/src/sofa/component/linearsolver/iterative/PCGLinearSolver.h +++ b/Sofa/Component/LinearSolver/Iterative/src/sofa/component/linearsolver/iterative/PCGLinearSolver.h @@ -28,7 +28,7 @@ #include -#include +#include namespace sofa::component::linearsolver::iterative { @@ -45,22 +45,22 @@ class PCGLinearSolver : public sofa::component::linearsolver::MatrixLinearSolver typedef sofa::component::linearsolver::MatrixLinearSolver Inherit; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_LINEARSOLVER_ITERATIVE() - sofa::core::objectmodel::RenamedData f_maxIter; + sofa::core::objectmodel::lifecycle::RenamedData f_maxIter; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_LINEARSOLVER_ITERATIVE() - sofa::core::objectmodel::RenamedData f_tolerance; + sofa::core::objectmodel::lifecycle::RenamedData f_tolerance; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_LINEARSOLVER_ITERATIVE() - sofa::core::objectmodel::RenamedData f_use_precond; + sofa::core::objectmodel::lifecycle::RenamedData f_use_precond; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_LINEARSOLVER_ITERATIVE() - sofa::core::objectmodel::RenamedData f_update_step; + sofa::core::objectmodel::lifecycle::RenamedData f_update_step; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_LINEARSOLVER_ITERATIVE() - sofa::core::objectmodel::RenamedData f_build_precond; + sofa::core::objectmodel::lifecycle::RenamedData f_build_precond; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_LINEARSOLVER_ITERATIVE() - sofa::core::objectmodel::RenamedData > > f_graph; + sofa::core::objectmodel::lifecycle::RenamedData > > f_graph; Data d_maxIter; ///< Maximum number of iterations after which the iterative descent of the Conjugate Gradient must stop diff --git a/Sofa/Component/LinearSolver/Preconditioner/src/sofa/component/linearsolver/preconditioner/PrecomputedWarpPreconditioner.h b/Sofa/Component/LinearSolver/Preconditioner/src/sofa/component/linearsolver/preconditioner/PrecomputedWarpPreconditioner.h index 0c92b8e28ad..f3b2bfa187b 100644 --- a/Sofa/Component/LinearSolver/Preconditioner/src/sofa/component/linearsolver/preconditioner/PrecomputedWarpPreconditioner.h +++ b/Sofa/Component/LinearSolver/Preconditioner/src/sofa/component/linearsolver/preconditioner/PrecomputedWarpPreconditioner.h @@ -32,7 +32,7 @@ #include #include -#include +#include namespace sofa::component::linearsolver::preconditioner { @@ -113,19 +113,19 @@ class PrecomputedWarpPreconditioner : public sofa::component::linearsolver::Matr sofa::core::objectmodel::lifecycle::RemovedData f_verbose{this, "v23.12", "v24.06", "verbose", "This Data is no longer used"}; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_LINEARSOLVER_PRECONDITIONER() - sofa::core::objectmodel::RenamedData jmjt_twostep; + sofa::core::objectmodel::lifecycle::RenamedData jmjt_twostep; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_LINEARSOLVER_PRECONDITIONER() - sofa::core::objectmodel::RenamedData use_file; + sofa::core::objectmodel::lifecycle::RenamedData use_file; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_LINEARSOLVER_PRECONDITIONER() - sofa::core::objectmodel::RenamedData share_matrix; + sofa::core::objectmodel::lifecycle::RenamedData share_matrix; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_LINEARSOLVER_PRECONDITIONER() - sofa::core::objectmodel::RenamedData use_rotations; + sofa::core::objectmodel::lifecycle::RenamedData use_rotations; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_LINEARSOLVER_PRECONDITIONER() - sofa::core::objectmodel::RenamedData draw_rotations_scale; + sofa::core::objectmodel::lifecycle::RenamedData draw_rotations_scale; Data d_use_file; ///< Dump system matrix in a file diff --git a/Sofa/Component/LinearSolver/Preconditioner/src/sofa/component/linearsolver/preconditioner/SSORPreconditioner.h b/Sofa/Component/LinearSolver/Preconditioner/src/sofa/component/linearsolver/preconditioner/SSORPreconditioner.h index 2e83259bd01..2dfceedf0e0 100644 --- a/Sofa/Component/LinearSolver/Preconditioner/src/sofa/component/linearsolver/preconditioner/SSORPreconditioner.h +++ b/Sofa/Component/LinearSolver/Preconditioner/src/sofa/component/linearsolver/preconditioner/SSORPreconditioner.h @@ -30,7 +30,7 @@ #include -#include +#include namespace sofa::component::linearsolver::preconditioner { @@ -57,7 +57,7 @@ class SSORPreconditioner : public sofa::component::linearsolver::MatrixLinearSol sofa::core::objectmodel::lifecycle::RemovedData f_verbose{this, "v23.12", "v24.06", "verbose", "This Data is no longer used"}; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_LINEARSOLVER_PRECONDITIONER() - sofa::core::objectmodel::RenamedData f_omega; + sofa::core::objectmodel::lifecycle::RenamedData f_omega; Data d_omega; ///< Omega coefficient protected: diff --git a/Sofa/Component/LinearSolver/src/sofa/component/linearsolver/init.cpp b/Sofa/Component/LinearSolver/src/sofa/component/linearsolver/init.cpp index 3e4a9c37cee..e4f74f3fe12 100644 --- a/Sofa/Component/LinearSolver/src/sofa/component/linearsolver/init.cpp +++ b/Sofa/Component/LinearSolver/src/sofa/component/linearsolver/init.cpp @@ -28,6 +28,7 @@ #include #include +#include namespace sofa::component::linearsolver { @@ -56,10 +57,10 @@ const char* getModuleVersion() void registerObjects(sofa::core::ObjectFactory* factory) { - factory->registerObjectsFromPlugin("Sofa.Component.LinearSolver.Direct"); - factory->registerObjectsFromPlugin("Sofa.Component.LinearSolver.Iterative"); - factory->registerObjectsFromPlugin("Sofa.Component.LinearSolver.Ordering"); - factory->registerObjectsFromPlugin("Sofa.Component.LinearSolver.Preconditioner"); + factory->registerObjectsFromPlugin(Sofa.Component.LinearSolver.Direct); + factory->registerObjectsFromPlugin(Sofa.Component.LinearSolver.Iterative); + factory->registerObjectsFromPlugin(Sofa.Component.LinearSolver.Ordering); + factory->registerObjectsFromPlugin(Sofa.Component.LinearSolver.Preconditioner); } void init() diff --git a/Sofa/Component/LinearSystem/tests/MappingGraph_test.cpp b/Sofa/Component/LinearSystem/tests/MappingGraph_test.cpp index a8af9b59030..6595defef3a 100644 --- a/Sofa/Component/LinearSystem/tests/MappingGraph_test.cpp +++ b/Sofa/Component/LinearSystem/tests/MappingGraph_test.cpp @@ -176,7 +176,7 @@ TEST(MappingGraph, diamondMapping) sofa::simulation::Node::SPtr root = simulation->createNewGraph("root"); EXPECT_EQ(root->getName(), "root"); - sofa::simpleapi::importPlugin("Sofa.Component.Mapping.Linear"); + sofa::simpleapi::importPlugin(Sofa.Component.Mapping.Linear); const auto top = sofa::core::objectmodel::New >(); root->addObject(top); diff --git a/Sofa/Component/Mapping/Linear/src/sofa/component/mapping/linear/BarycentricMappingRigid.h b/Sofa/Component/Mapping/Linear/src/sofa/component/mapping/linear/BarycentricMappingRigid.h index 857303b7686..3db305f50d9 100644 --- a/Sofa/Component/Mapping/Linear/src/sofa/component/mapping/linear/BarycentricMappingRigid.h +++ b/Sofa/Component/Mapping/Linear/src/sofa/component/mapping/linear/BarycentricMappingRigid.h @@ -37,7 +37,7 @@ #include #include -#include +#include namespace sofa::component::mapping::linear { @@ -70,10 +70,10 @@ class BarycentricMapperTetrahedronSetTopologyRigid : public TopologyBarycentricM protected: SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MAPPING_LINEAR() - sofa::core::objectmodel::RenamedData> map; + sofa::core::objectmodel::lifecycle::RenamedData> map; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MAPPING_LINEAR() - sofa::core::objectmodel::RenamedData> mapOrient; + sofa::core::objectmodel::lifecycle::RenamedData> mapOrient; core::topology::PointData< sofa::type::vector > d_map; ///< mapper data core::topology::PointData< sofa::type::vector > d_mapOrient; ///< mapper data for mapped frames diff --git a/Sofa/Component/Mapping/Linear/src/sofa/component/mapping/linear/DeformableOnRigidFrameMapping.h b/Sofa/Component/Mapping/Linear/src/sofa/component/mapping/linear/DeformableOnRigidFrameMapping.h index aa4fb521355..ba1b963ae58 100644 --- a/Sofa/Component/Mapping/Linear/src/sofa/component/mapping/linear/DeformableOnRigidFrameMapping.h +++ b/Sofa/Component/Mapping/Linear/src/sofa/component/mapping/linear/DeformableOnRigidFrameMapping.h @@ -26,7 +26,7 @@ #include -#include +#include namespace sofa::component::mapping::linear { @@ -96,22 +96,22 @@ class DeformableOnRigidFrameMapping : public LinearMulti2Mapping data; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MAPPING_LINEAR() - sofa::core::objectmodel::RenamedData index; + sofa::core::objectmodel::lifecycle::RenamedData index; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MAPPING_LINEAR() - sofa::core::objectmodel::RenamedData indexFromEnd; + sofa::core::objectmodel::lifecycle::RenamedData indexFromEnd; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MAPPING_LINEAR() - sofa::core::objectmodel::RenamedData > repartition; + sofa::core::objectmodel::lifecycle::RenamedData > repartition; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MAPPING_LINEAR() - sofa::core::objectmodel::RenamedData globalToLocalCoords; + sofa::core::objectmodel::lifecycle::RenamedData globalToLocalCoords; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MAPPING_LINEAR() - sofa::core::objectmodel::RenamedData m_rootAngularForceScaleFactor; + sofa::core::objectmodel::lifecycle::RenamedData m_rootAngularForceScaleFactor; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MAPPING_LINEAR() - sofa::core::objectmodel::RenamedData m_rootLinearForceScaleFactor; + sofa::core::objectmodel::lifecycle::RenamedData m_rootLinearForceScaleFactor; Data d_index; ///< input DOF index diff --git a/Sofa/Component/Mapping/Linear/src/sofa/component/mapping/linear/SkinningMapping.h b/Sofa/Component/Mapping/Linear/src/sofa/component/mapping/linear/SkinningMapping.h index 99090b31c8c..156ffe4f6b3 100644 --- a/Sofa/Component/Mapping/Linear/src/sofa/component/mapping/linear/SkinningMapping.h +++ b/Sofa/Component/Mapping/Linear/src/sofa/component/mapping/linear/SkinningMapping.h @@ -32,7 +32,7 @@ #include #include -#include +#include namespace sofa::component::mapping::linear { @@ -78,22 +78,22 @@ class SkinningMapping : public LinearMapping protected: SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MAPPING_LINEAR() - sofa::core::objectmodel::RenamedData f_initPos; + sofa::core::objectmodel::lifecycle::RenamedData f_initPos; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MAPPING_LINEAR() - sofa::core::objectmodel::RenamedData< type::vector > nbRef; + sofa::core::objectmodel::lifecycle::RenamedData< type::vector > nbRef; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MAPPING_LINEAR() - sofa::core::objectmodel::RenamedData > > f_index; + sofa::core::objectmodel::lifecycle::RenamedData > > f_index; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MAPPING_LINEAR() - sofa::core::objectmodel::RenamedData > > weight; + sofa::core::objectmodel::lifecycle::RenamedData > > weight; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MAPPING_LINEAR() - sofa::core::objectmodel::RenamedData showFromIndex; + sofa::core::objectmodel::lifecycle::RenamedData showFromIndex; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MAPPING_LINEAR() - sofa::core::objectmodel::RenamedData showWeights; + sofa::core::objectmodel::lifecycle::RenamedData showWeights; Data d_initPos; ///< initial child coordinates in the world reference frame. diff --git a/Sofa/Component/Mapping/Linear/src/sofa/component/mapping/linear/SubsetMapping.h b/Sofa/Component/Mapping/Linear/src/sofa/component/mapping/linear/SubsetMapping.h index 21d97b01071..3a7d32b9a8e 100644 --- a/Sofa/Component/Mapping/Linear/src/sofa/component/mapping/linear/SubsetMapping.h +++ b/Sofa/Component/Mapping/Linear/src/sofa/component/mapping/linear/SubsetMapping.h @@ -32,7 +32,7 @@ #include #include -#include +#include namespace sofa::component::mapping::linear { @@ -87,25 +87,25 @@ class SubsetMapping : public LinearMapping typedef sofa::core::topology::PointSubsetData< IndexArray > SetIndex; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MAPPING_LINEAR() - sofa::core::objectmodel::RenamedData f_indices; + sofa::core::objectmodel::lifecycle::RenamedData f_indices; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MAPPING_LINEAR() - sofa::core::objectmodel::RenamedData f_first; + sofa::core::objectmodel::lifecycle::RenamedData f_first; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MAPPING_LINEAR() - sofa::core::objectmodel::RenamedData f_last; + sofa::core::objectmodel::lifecycle::RenamedData f_last; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MAPPING_LINEAR() - sofa::core::objectmodel::RenamedData f_radius; + sofa::core::objectmodel::lifecycle::RenamedData f_radius; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MAPPING_LINEAR() - sofa::core::objectmodel::RenamedData f_handleTopologyChange; + sofa::core::objectmodel::lifecycle::RenamedData f_handleTopologyChange; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MAPPING_LINEAR() - sofa::core::objectmodel::RenamedData f_ignoreNotFound; + sofa::core::objectmodel::lifecycle::RenamedData f_ignoreNotFound; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MAPPING_LINEAR() - sofa::core::objectmodel::RenamedData f_resizeToModel; + sofa::core::objectmodel::lifecycle::RenamedData f_resizeToModel; SetIndex d_indices; diff --git a/Sofa/Component/Mapping/Linear/src/sofa/component/mapping/linear/SubsetMultiMapping.h b/Sofa/Component/Mapping/Linear/src/sofa/component/mapping/linear/SubsetMultiMapping.h index 75fe2fe440c..d80e95eb0ab 100644 --- a/Sofa/Component/Mapping/Linear/src/sofa/component/mapping/linear/SubsetMultiMapping.h +++ b/Sofa/Component/Mapping/Linear/src/sofa/component/mapping/linear/SubsetMultiMapping.h @@ -29,7 +29,7 @@ #include #include -#include +#include namespace sofa::component::mapping::linear { @@ -66,7 +66,7 @@ class SubsetMultiMapping : public LinearMultiMapping virtual const type::vector* getJs() override; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MAPPING_LINEAR() - sofa::core::objectmodel::RenamedData< type::vector > indexPairs; + sofa::core::objectmodel::lifecycle::RenamedData< type::vector > indexPairs; Data< type::vector > d_indexPairs; ///< list of couples (parent index + index in the parent) diff --git a/Sofa/Component/Mapping/Linear/src/sofa/component/mapping/linear/TubularMapping.h b/Sofa/Component/Mapping/Linear/src/sofa/component/mapping/linear/TubularMapping.h index 3802eb53063..a834febedfc 100644 --- a/Sofa/Component/Mapping/Linear/src/sofa/component/mapping/linear/TubularMapping.h +++ b/Sofa/Component/Mapping/Linear/src/sofa/component/mapping/linear/TubularMapping.h @@ -29,7 +29,7 @@ #include #include -#include +#include namespace sofa::component::mapping::linear { @@ -89,13 +89,13 @@ class TubularMapping : public LinearMapping void applyJT ( const core::ConstraintParams* /*cparams*/, InDataMatrixDeriv& dOut, const OutDataMatrixDeriv& dIn ) override; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MAPPING_LINEAR() - sofa::core::objectmodel::RenamedData m_nbPointsOnEachCircle; + sofa::core::objectmodel::lifecycle::RenamedData m_nbPointsOnEachCircle; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MAPPING_LINEAR() - sofa::core::objectmodel::RenamedData m_radius; + sofa::core::objectmodel::lifecycle::RenamedData m_radius; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MAPPING_LINEAR() - sofa::core::objectmodel::RenamedData m_peak; + sofa::core::objectmodel::lifecycle::RenamedData m_peak; Data d_nbPointsOnEachCircle; ///< Discretization of created circles Data d_radius; ///< Radius of created circles diff --git a/Sofa/Component/Mapping/Linear/tests/BarycentricMapping_test.cpp b/Sofa/Component/Mapping/Linear/tests/BarycentricMapping_test.cpp index 668d3719f58..2f923ea9221 100644 --- a/Sofa/Component/Mapping/Linear/tests/BarycentricMapping_test.cpp +++ b/Sofa/Component/Mapping/Linear/tests/BarycentricMapping_test.cpp @@ -74,7 +74,7 @@ struct BarycentricMapperTriangleSetTopologyTest : public BaseTest, public Baryc typename Out::VecCoord m_out; TriangleSetTopologyContainer::SPtr m_topology; - void SetUp() override + void doSetUp() override { m_in.push_back(Vec3(0.5, 1.5, 0.0)); m_in.push_back(Vec3(1.5, 0.0, 2.5)); diff --git a/Sofa/Component/Mapping/NonLinear/src/sofa/component/mapping/nonlinear/DistanceFromTargetMapping.h b/Sofa/Component/Mapping/NonLinear/src/sofa/component/mapping/nonlinear/DistanceFromTargetMapping.h index 3731851cd3a..615537ab7c4 100644 --- a/Sofa/Component/Mapping/NonLinear/src/sofa/component/mapping/nonlinear/DistanceFromTargetMapping.h +++ b/Sofa/Component/Mapping/NonLinear/src/sofa/component/mapping/nonlinear/DistanceFromTargetMapping.h @@ -30,7 +30,7 @@ #include #include -#include +#include namespace sofa::component::mapping::nonlinear { @@ -77,13 +77,13 @@ class DistanceFromTargetMapping : public BaseNonLinearMapping, typedef type::Vec Direction; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MAPPING_NONLINEAR() - sofa::core::objectmodel::RenamedData> f_indices; + sofa::core::objectmodel::lifecycle::RenamedData> f_indices; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MAPPING_NONLINEAR() - sofa::core::objectmodel::RenamedData f_targetPositions; + sofa::core::objectmodel::lifecycle::RenamedData f_targetPositions; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MAPPING_NONLINEAR() - sofa::core::objectmodel::RenamedData> f_restDistances; + sofa::core::objectmodel::lifecycle::RenamedData> f_restDistances; // d_showObjectScale and d_color are already up-to-date with the new naming convention, so they do not require deprecation notices. diff --git a/Sofa/Component/Mapping/NonLinear/src/sofa/component/mapping/nonlinear/DistanceMapping.h b/Sofa/Component/Mapping/NonLinear/src/sofa/component/mapping/nonlinear/DistanceMapping.h index df197ab65d9..7f2296efb23 100644 --- a/Sofa/Component/Mapping/NonLinear/src/sofa/component/mapping/nonlinear/DistanceMapping.h +++ b/Sofa/Component/Mapping/NonLinear/src/sofa/component/mapping/nonlinear/DistanceMapping.h @@ -29,7 +29,7 @@ #include #include -#include +#include namespace sofa::component::mapping::nonlinear { @@ -62,10 +62,10 @@ class DistanceMapping : public BaseNonLinearMapping typedef type::Vec Direction; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MAPPING_NONLINEAR() - sofa::core::objectmodel::RenamedData f_computeDistance; + sofa::core::objectmodel::lifecycle::RenamedData f_computeDistance; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MAPPING_NONLINEAR() - sofa::core::objectmodel::RenamedData> f_restLengths; + sofa::core::objectmodel::lifecycle::RenamedData> f_restLengths; Data d_computeDistance; ///< if 'computeDistance = true', then rest length of each element equal 0, otherwise rest length is the initial length of each of them diff --git a/Sofa/Component/Mapping/NonLinear/src/sofa/component/mapping/nonlinear/DistanceMultiMapping.h b/Sofa/Component/Mapping/NonLinear/src/sofa/component/mapping/nonlinear/DistanceMultiMapping.h index fed60bcd234..1f78b1868e2 100644 --- a/Sofa/Component/Mapping/NonLinear/src/sofa/component/mapping/nonlinear/DistanceMultiMapping.h +++ b/Sofa/Component/Mapping/NonLinear/src/sofa/component/mapping/nonlinear/DistanceMultiMapping.h @@ -27,7 +27,7 @@ #include #include -#include +#include namespace sofa::component::mapping::nonlinear { @@ -77,10 +77,10 @@ class DistanceMultiMapping : public core::MultiMapping, public Stabil typedef type::Vec Direction; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MAPPING_NONLINEAR() - sofa::core::objectmodel::RenamedData f_computeDistance; + sofa::core::objectmodel::lifecycle::RenamedData f_computeDistance; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MAPPING_NONLINEAR() - sofa::core::objectmodel::RenamedData> f_restLengths; + sofa::core::objectmodel::lifecycle::RenamedData> f_restLengths; Data d_computeDistance; ///< if 'computeDistance = true', then rest length of each element equal 0, otherwise rest length is the initial length of each of them Data> d_restLengths; ///< Rest lengths of the connections diff --git a/Sofa/Component/Mapping/NonLinear/src/sofa/component/mapping/nonlinear/RigidMapping.inl b/Sofa/Component/Mapping/NonLinear/src/sofa/component/mapping/nonlinear/RigidMapping.inl index fa2d0f1911c..195d6803c96 100644 --- a/Sofa/Component/Mapping/NonLinear/src/sofa/component/mapping/nonlinear/RigidMapping.inl +++ b/Sofa/Component/Mapping/NonLinear/src/sofa/component/mapping/nonlinear/RigidMapping.inl @@ -772,8 +772,11 @@ void RigidMapping::setJMatrixBlock(unsigned outIdx, unsigned inIdx) template void RigidMapping::draw(const core::visual::VisualParams* vparams) { - if (!vparams->displayFlags().getShowMappings() || this->toModel==nullptr ) + if (!vparams->displayFlags().getShowMappings() || !this->toModel ) return; + + [[maybe_unused]] const auto stateLifeCycle = vparams->drawTool()->makeStateLifeCycle(); + std::vector points; type::Vec3 point; diff --git a/Sofa/Component/Mapping/NonLinear/tests/RigidMapping_test.cpp b/Sofa/Component/Mapping/NonLinear/tests/RigidMapping_test.cpp index 630add17ad0..d18e3bbf623 100644 --- a/Sofa/Component/Mapping/NonLinear/tests/RigidMapping_test.cpp +++ b/Sofa/Component/Mapping/NonLinear/tests/RigidMapping_test.cpp @@ -74,7 +74,7 @@ struct RigidMappingTest : public sofa::mapping_test::Mapping_test<_RigidMapping> typedef typename OutMechanicalObject::ReadVecCoord ReadOutVecCoord; typedef typename OutMechanicalObject::ReadVecDeriv ReadOutVecDeriv; - void SetUp() override + void doSetUp() override { } diff --git a/Sofa/Component/Mapping/NonLinear/tests/SquareDistanceMapping_test.cpp b/Sofa/Component/Mapping/NonLinear/tests/SquareDistanceMapping_test.cpp index a837a54366f..f62537fceb7 100644 --- a/Sofa/Component/Mapping/NonLinear/tests/SquareDistanceMapping_test.cpp +++ b/Sofa/Component/Mapping/NonLinear/tests/SquareDistanceMapping_test.cpp @@ -150,11 +150,11 @@ struct SquareDistanceMappingCompare_test : NumericTest simulation::Node::SPtr oneMapping; simulation::Node::SPtr twoMappings; - void onSetUp() override + void doSetUp() override { root = simulation::getSimulation()->createNewNode("root"); - simpleapi::createObject(root, "RequiredPlugin", {{"pluginName", "Sofa.Component"}}); + simpleapi::createObject(root, "RequiredPlugin", {{"pluginName", Sofa.Component}}); simpleapi::createObject(root, "DefaultAnimationLoop"); simpleapi::createObject(root, "StringMeshCreator", {{"name", "loader"}, {"resolution", "3"}}); diff --git a/Sofa/Component/Mapping/src/sofa/component/mapping/init.cpp b/Sofa/Component/Mapping/src/sofa/component/mapping/init.cpp index c3587764b84..82a3fa98dab 100644 --- a/Sofa/Component/Mapping/src/sofa/component/mapping/init.cpp +++ b/Sofa/Component/Mapping/src/sofa/component/mapping/init.cpp @@ -25,6 +25,7 @@ #include #include +#include namespace sofa::component::mapping { @@ -53,8 +54,8 @@ const char* getModuleVersion() void registerObjects(sofa::core::ObjectFactory* factory) { - factory->registerObjectsFromPlugin("Sofa.Component.Mapping.Linear"); - factory->registerObjectsFromPlugin("Sofa.Component.Mapping.NonLinear"); + factory->registerObjectsFromPlugin(Sofa.Component.Mapping.Linear); + factory->registerObjectsFromPlugin(Sofa.Component.Mapping.NonLinear); } void init() diff --git a/Sofa/Component/Mass/tests/DiagonalMass_test.cpp b/Sofa/Component/Mass/tests/DiagonalMass_test.cpp index 2fa55643d95..ca3393caa9c 100644 --- a/Sofa/Component/Mass/tests/DiagonalMass_test.cpp +++ b/Sofa/Component/Mass/tests/DiagonalMass_test.cpp @@ -96,18 +96,18 @@ class DiagonalMass_test : public BaseTest typename MechanicalObject::SPtr mstate; typename DiagonalMass::SPtr mass; - void SetUp() override + void doSetUp() override { - sofa::simpleapi::importPlugin("Sofa.Component.Topology.Container.Dynamic"); - sofa::simpleapi::importPlugin("Sofa.Component.Topology.Container.Grid"); - sofa::simpleapi::importPlugin("Sofa.Component.StateContainer"); - sofa::simpleapi::importPlugin("Sofa.Component.Mass"); + sofa::simpleapi::importPlugin(Sofa.Component.Topology.Container.Dynamic); + sofa::simpleapi::importPlugin(Sofa.Component.Topology.Container.Grid); + sofa::simpleapi::importPlugin(Sofa.Component.StateContainer); + sofa::simpleapi::importPlugin(Sofa.Component.Mass); simulation = simulation::getSimulation(); root = simulation::getSimulation()->createNewGraph("root"); } - void TearDown() override + void doTearDown() override { if (root!=nullptr) sofa::simulation::node::unload(root); diff --git a/Sofa/Component/Mass/tests/MeshMatrixMass_test.cpp b/Sofa/Component/Mass/tests/MeshMatrixMass_test.cpp index 024bf21dd13..5084b7eb1b2 100644 --- a/Sofa/Component/Mass/tests/MeshMatrixMass_test.cpp +++ b/Sofa/Component/Mass/tests/MeshMatrixMass_test.cpp @@ -99,18 +99,18 @@ class MeshMatrixMass_test : public BaseTest typename MechanicalObject::SPtr mstate; typename MeshMatrixMass::SPtr mass; - void SetUp() override + void doSetUp() override { - sofa::simpleapi::importPlugin("Sofa.Component.Topology.Container.Dynamic"); - sofa::simpleapi::importPlugin("Sofa.Component.Topology.Container.Grid"); - sofa::simpleapi::importPlugin("Sofa.Component.StateContainer"); - sofa::simpleapi::importPlugin("Sofa.Component.Mass"); + sofa::simpleapi::importPlugin(Sofa.Component.Topology.Container.Dynamic); + sofa::simpleapi::importPlugin(Sofa.Component.Topology.Container.Grid); + sofa::simpleapi::importPlugin(Sofa.Component.StateContainer); + sofa::simpleapi::importPlugin(Sofa.Component.Mass); simulation = simulation::getSimulation(); root = simulation::getSimulation()->createNewGraph("root"); } - void TearDown() override + void doTearDown() override { if (root!=nullptr) sofa::simulation::node::unload(root); diff --git a/Sofa/Component/Mass/tests/UniformMass_test.cpp b/Sofa/Component/Mass/tests/UniformMass_test.cpp index ddfa5c0eabb..42243593dca 100644 --- a/Sofa/Component/Mass/tests/UniformMass_test.cpp +++ b/Sofa/Component/Mass/tests/UniformMass_test.cpp @@ -77,17 +77,17 @@ struct UniformMassTest : public BaseTest typename MechanicalObject::SPtr m_mecaobject; bool todo {true} ; - void SetUp() override + void doSetUp() override { - sofa::simpleapi::importPlugin("Sofa.Component.StateContainer"); - sofa::simpleapi::importPlugin("Sofa.Component.Mass"); + sofa::simpleapi::importPlugin(Sofa.Component.StateContainer); + sofa::simpleapi::importPlugin(Sofa.Component.Mass); todo = true ; m_simu = sofa::simulation::getSimulation(); m_root = m_simu->createNewGraph("root"); } - void TearDown() override + void doTearDown() override { if (m_root != nullptr){ sofa::simulation::node::unload(m_root); diff --git a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/EdgePressureForceField.h b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/EdgePressureForceField.h index 95b8792aced..e6243016b1e 100644 --- a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/EdgePressureForceField.h +++ b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/EdgePressureForceField.h @@ -25,7 +25,7 @@ #include #include -#include +#include namespace sofa::component::mechanicalload { @@ -83,37 +83,37 @@ class EdgePressureForceField : public core::behavior::ForceField sofa::core::topology::BaseMeshTopology* _completeTopology{nullptr}; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData > edgePressureMap; + sofa::core::objectmodel::lifecycle::RenamedData > edgePressureMap; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData pressure; + sofa::core::objectmodel::lifecycle::RenamedData pressure; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData >edgeIndices; + sofa::core::objectmodel::lifecycle::RenamedData >edgeIndices; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData > edges; + sofa::core::objectmodel::lifecycle::RenamedData > edges; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData normal; + sofa::core::objectmodel::lifecycle::RenamedData normal; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData dmin; + sofa::core::objectmodel::lifecycle::RenamedData dmin; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData dmax; + sofa::core::objectmodel::lifecycle::RenamedData dmax; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData arrowSizeCoef; + sofa::core::objectmodel::lifecycle::RenamedData arrowSizeCoef; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData< type::vector > p_intensity; + sofa::core::objectmodel::lifecycle::RenamedData< type::vector > p_intensity; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData p_binormal; + sofa::core::objectmodel::lifecycle::RenamedData p_binormal; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData p_showForces; + sofa::core::objectmodel::lifecycle::RenamedData p_showForces; Data d_pressure; ///< Pressure force per unit area Data > d_edgeIndices; ///< Indices of edges separated with commas where a pressure is applied diff --git a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/OscillatingTorsionPressureForceField.h b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/OscillatingTorsionPressureForceField.h index 79d1d44fbe6..6328bec72d1 100644 --- a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/OscillatingTorsionPressureForceField.h +++ b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/OscillatingTorsionPressureForceField.h @@ -27,7 +27,7 @@ #include #include -#include +#include namespace sofa::component::mechanicalload { @@ -84,34 +84,34 @@ class OscillatingTorsionPressureForceField : public core::behavior::ForceField > trianglePressureMap; + sofa::core::objectmodel::lifecycle::RenamedData > trianglePressureMap; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData moment; + sofa::core::objectmodel::lifecycle::RenamedData moment; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData > triangleList; + sofa::core::objectmodel::lifecycle::RenamedData > triangleList; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData axis; + sofa::core::objectmodel::lifecycle::RenamedData axis; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData center; + sofa::core::objectmodel::lifecycle::RenamedData center; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData penalty; + sofa::core::objectmodel::lifecycle::RenamedData penalty; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData frequency; + sofa::core::objectmodel::lifecycle::RenamedData frequency; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData dmin; + sofa::core::objectmodel::lifecycle::RenamedData dmin; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData dmax; + sofa::core::objectmodel::lifecycle::RenamedData dmax; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData p_showForces; + sofa::core::objectmodel::lifecycle::RenamedData p_showForces; sofa::core::topology::TriangleSubsetData > d_trianglePressureMap; ///< Map between triangle indices and their pressure diff --git a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/QuadPressureForceField.h b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/QuadPressureForceField.h index dbd9bb1acb9..39e42d3c37b 100644 --- a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/QuadPressureForceField.h +++ b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/QuadPressureForceField.h @@ -25,7 +25,7 @@ #include #include -#include +#include namespace sofa::component::mechanicalload { @@ -55,22 +55,22 @@ class QuadPressureForceField : public core::behavior::ForceField using Index = sofa::Index; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData pressure; + sofa::core::objectmodel::lifecycle::RenamedData pressure; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData> quadList; + sofa::core::objectmodel::lifecycle::RenamedData> quadList; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData normal; + sofa::core::objectmodel::lifecycle::RenamedData normal; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData dmin; + sofa::core::objectmodel::lifecycle::RenamedData dmin; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData dmax; + sofa::core::objectmodel::lifecycle::RenamedData dmax; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData p_showForces; + sofa::core::objectmodel::lifecycle::RenamedData p_showForces; Data d_pressure; ///< Pressure force per unit area @@ -119,7 +119,7 @@ class QuadPressureForceField : public core::behavior::ForceField } }; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData > quadPressureMap; + sofa::core::objectmodel::lifecycle::RenamedData > quadPressureMap; sofa::core::topology::QuadSubsetData > d_quadPressureMap; ///< Map between quad indices and their pressure diff --git a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/SphereForceField.h b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/SphereForceField.h index 91ab0c73428..993afb57855 100644 --- a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/SphereForceField.h +++ b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/SphereForceField.h @@ -29,7 +29,7 @@ #include -#include +#include namespace sofa::component::mechanicalload { @@ -84,7 +84,7 @@ class SphereForceField : public core::behavior::ForceField }; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData > contacts; + sofa::core::objectmodel::lifecycle::RenamedData > contacts; Data > d_contacts; ///< Contacts @@ -94,25 +94,25 @@ class SphereForceField : public core::behavior::ForceField SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData sphereCenter; + sofa::core::objectmodel::lifecycle::RenamedData sphereCenter; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData sphereRadius; + sofa::core::objectmodel::lifecycle::RenamedData sphereRadius; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData stiffness; + sofa::core::objectmodel::lifecycle::RenamedData stiffness; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData damping; + sofa::core::objectmodel::lifecycle::RenamedData damping; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData color; + sofa::core::objectmodel::lifecycle::RenamedData color; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData> localRange; + sofa::core::objectmodel::lifecycle::RenamedData> localRange; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData bilateral; + sofa::core::objectmodel::lifecycle::RenamedData bilateral; Data d_sphereCenter; ///< sphere center diff --git a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/SurfacePressureForceField.h b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/SurfacePressureForceField.h index 5678ad7474d..b8a17afd690 100644 --- a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/SurfacePressureForceField.h +++ b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/SurfacePressureForceField.h @@ -25,7 +25,7 @@ #include #include -#include +#include namespace sofa::core::topology { @@ -71,43 +71,43 @@ class SurfacePressureForceField : public core::behavior::ForceField enum State { INCREASE, DECREASE }; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData m_pressure; + sofa::core::objectmodel::lifecycle::RenamedData m_pressure; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData m_min; + sofa::core::objectmodel::lifecycle::RenamedData m_min; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData m_max; + sofa::core::objectmodel::lifecycle::RenamedData m_max; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData m_triangleIndices; + sofa::core::objectmodel::lifecycle::RenamedData m_triangleIndices; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData m_quadIndices; + sofa::core::objectmodel::lifecycle::RenamedData m_quadIndices; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData m_pulseMode; + sofa::core::objectmodel::lifecycle::RenamedData m_pulseMode; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData m_pressureLowerBound; + sofa::core::objectmodel::lifecycle::RenamedData m_pressureLowerBound; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData m_pressureSpeed; + sofa::core::objectmodel::lifecycle::RenamedData m_pressureSpeed; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData m_volumeConservationMode; + sofa::core::objectmodel::lifecycle::RenamedData m_volumeConservationMode; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData m_useTangentStiffness; + sofa::core::objectmodel::lifecycle::RenamedData m_useTangentStiffness; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData m_defaultVolume; + sofa::core::objectmodel::lifecycle::RenamedData m_defaultVolume; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData m_mainDirection; + sofa::core::objectmodel::lifecycle::RenamedData m_mainDirection; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData m_drawForceScale; + sofa::core::objectmodel::lifecycle::RenamedData m_drawForceScale; Data d_pressure; ///< Pressure force per unit area Data d_min; ///< Lower bound of the selection box diff --git a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/TaitSurfacePressureForceField.h b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/TaitSurfacePressureForceField.h index dc41b36c794..98b4cb8ed60 100644 --- a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/TaitSurfacePressureForceField.h +++ b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/TaitSurfacePressureForceField.h @@ -25,7 +25,7 @@ #include #include -#include +#include namespace sofa::component::mechanicalload { @@ -74,58 +74,58 @@ class TaitSurfacePressureForceField : public core::behavior::ForceField m_p0; + sofa::core::objectmodel::lifecycle::RenamedData m_p0; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData m_B; + sofa::core::objectmodel::lifecycle::RenamedData m_B; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData m_gamma; + sofa::core::objectmodel::lifecycle::RenamedData m_gamma; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData m_injectedVolume; + sofa::core::objectmodel::lifecycle::RenamedData m_injectedVolume; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData m_maxInjectionRate; + sofa::core::objectmodel::lifecycle::RenamedData m_maxInjectionRate; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData m_initialVolume; + sofa::core::objectmodel::lifecycle::RenamedData m_initialVolume; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData m_currentInjectedVolume; + sofa::core::objectmodel::lifecycle::RenamedData m_currentInjectedVolume; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData m_v0; + sofa::core::objectmodel::lifecycle::RenamedData m_v0; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData m_currentVolume; + sofa::core::objectmodel::lifecycle::RenamedData m_currentVolume; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData m_currentPressure; + sofa::core::objectmodel::lifecycle::RenamedData m_currentPressure; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData m_currentStiffness; + sofa::core::objectmodel::lifecycle::RenamedData m_currentStiffness; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData m_pressureTriangles; + sofa::core::objectmodel::lifecycle::RenamedData m_pressureTriangles; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData m_initialSurfaceArea; + sofa::core::objectmodel::lifecycle::RenamedData m_initialSurfaceArea; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData m_currentSurfaceArea; + sofa::core::objectmodel::lifecycle::RenamedData m_currentSurfaceArea; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData m_drawForceScale; + sofa::core::objectmodel::lifecycle::RenamedData m_drawForceScale; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData m_drawForceColor; + sofa::core::objectmodel::lifecycle::RenamedData m_drawForceColor; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData m_volumeAfterTC; + sofa::core::objectmodel::lifecycle::RenamedData m_volumeAfterTC; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData m_surfaceAreaAfterTC; + sofa::core::objectmodel::lifecycle::RenamedData m_surfaceAreaAfterTC; Data< Real > d_p0; ///< IN: Rest pressure when V = V0 diff --git a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/TorsionForceField.h b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/TorsionForceField.h index d21708b69eb..d727c51636d 100644 --- a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/TorsionForceField.h +++ b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/TorsionForceField.h @@ -30,7 +30,7 @@ #include #include -#include +#include namespace sofa::component::mechanicalload { @@ -86,16 +86,16 @@ class TorsionForceField : public ForceField public : SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData m_indices; + sofa::core::objectmodel::lifecycle::RenamedData m_indices; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData m_torque; + sofa::core::objectmodel::lifecycle::RenamedData m_torque; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData m_axis; + sofa::core::objectmodel::lifecycle::RenamedData m_axis; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData m_origin; + sofa::core::objectmodel::lifecycle::RenamedData m_origin; Data d_indices; ///< indices of the selected points Data d_torque; ///< torque to apply diff --git a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/TrianglePressureForceField.h b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/TrianglePressureForceField.h index 15dc6cebe69..348503e847c 100644 --- a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/TrianglePressureForceField.h +++ b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/TrianglePressureForceField.h @@ -27,7 +27,7 @@ #include #include -#include +#include namespace sofa::component::mechanicalload { @@ -52,19 +52,19 @@ class TrianglePressureForceField : public core::behavior::ForceField using Index = sofa::Index; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData pressure; + sofa::core::objectmodel::lifecycle::RenamedData pressure; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData cauchyStress; + sofa::core::objectmodel::lifecycle::RenamedData cauchyStress; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData > triangleList; + sofa::core::objectmodel::lifecycle::RenamedData > triangleList; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData p_showForces; + sofa::core::objectmodel::lifecycle::RenamedData p_showForces; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData p_useConstantForce; + sofa::core::objectmodel::lifecycle::RenamedData p_useConstantForce; Data d_pressure; ///< Pressure force per unit area diff --git a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/UniformVelocityDampingForceField.h b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/UniformVelocityDampingForceField.h index dc0fdcef2ea..f297f3916c7 100644 --- a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/UniformVelocityDampingForceField.h +++ b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/UniformVelocityDampingForceField.h @@ -24,7 +24,7 @@ #include -#include +#include namespace sofa::component::mechanicalload { @@ -49,7 +49,7 @@ class UniformVelocityDampingForceField : public core::behavior::ForceField DataVecDeriv; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - sofa::core::objectmodel::RenamedData< Real > dampingCoefficient; + sofa::core::objectmodel::lifecycle::RenamedData< Real > dampingCoefficient; /// air drag coefficient. Data< Real > d_dampingCoefficient; diff --git a/Sofa/Component/MechanicalLoad/tests/ConstantForceField_test.cpp b/Sofa/Component/MechanicalLoad/tests/ConstantForceField_test.cpp index a901c1ec931..8785f12c84b 100644 --- a/Sofa/Component/MechanicalLoad/tests/ConstantForceField_test.cpp +++ b/Sofa/Component/MechanicalLoad/tests/ConstantForceField_test.cpp @@ -72,16 +72,16 @@ struct ConstantForceField_test : public BaseSimulationTest, NumericTest TheMechanicalObject; using Real = typename DataTypes::Coord::value_type; - void SetUp() override + void doSetUp() override { - sofa::simpleapi::importPlugin("Sofa.Component.ODESolver"); - sofa::simpleapi::importPlugin("Sofa.Component.StateContainer"); - sofa::simpleapi::importPlugin("Sofa.Component.MechanicalLoad"); - sofa::simpleapi::importPlugin("Sofa.Component.LinearSolver.Iterative"); - sofa::simpleapi::importPlugin("Sofa.Component.Mass"); + sofa::simpleapi::importPlugin(Sofa.Component.ODESolver); + sofa::simpleapi::importPlugin(Sofa.Component.StateContainer); + sofa::simpleapi::importPlugin(Sofa.Component.MechanicalLoad); + sofa::simpleapi::importPlugin(Sofa.Component.LinearSolver.Iterative); + sofa::simpleapi::importPlugin(Sofa.Component.Mass); } - void TearDown() override {} + void doTearDown() override {} void testSimpleBehavior() { diff --git a/Sofa/Component/MechanicalLoad/tests/PlaneForceField_test.cpp b/Sofa/Component/MechanicalLoad/tests/PlaneForceField_test.cpp index 5459c9291a9..2cad132b962 100644 --- a/Sofa/Component/MechanicalLoad/tests/PlaneForceField_test.cpp +++ b/Sofa/Component/MechanicalLoad/tests/PlaneForceField_test.cpp @@ -116,13 +116,13 @@ struct PlaneForceField_test : public BaseSimulationTest * by the plane force field. * In the special case where : stiffness = 500, damping = 5 and maxForce = 0 (default values) */ - void SetUp() override + void doSetUp() override { - sofa::simpleapi::importPlugin("Sofa.Component.StateContainer"); - sofa::simpleapi::importPlugin("Sofa.Component.MechanicalLoad"); + sofa::simpleapi::importPlugin(Sofa.Component.StateContainer); + sofa::simpleapi::importPlugin(Sofa.Component.MechanicalLoad); } - void TearDown() override {} + void doTearDown() override {} void setupDefaultScene() { diff --git a/Sofa/Component/MechanicalLoad/tests/SkeletalMotionConstraint_test.cpp b/Sofa/Component/MechanicalLoad/tests/SkeletalMotionConstraint_test.cpp index 51c8db83051..b91c76a8d01 100644 --- a/Sofa/Component/MechanicalLoad/tests/SkeletalMotionConstraint_test.cpp +++ b/Sofa/Component/MechanicalLoad/tests/SkeletalMotionConstraint_test.cpp @@ -67,7 +67,7 @@ struct SkeletalMotionProjectiveConstraint_test : public BaseSimulationTest, Nume typename MechanicalObject::SPtr dofs; /// Create the context for the tests. - void SetUp() override + void doSetUp() override { simulation = sofa::simulation::getSimulation(); @@ -167,7 +167,7 @@ struct SkeletalMotionProjectiveConstraint_test : public BaseSimulationTest, Nume return succeed; } - void TearDown() override + void doTearDown() override { if (root!=nullptr) sofa::simulation::node::unload(root); diff --git a/Sofa/Component/ODESolver/Backward/src/sofa/component/odesolver/backward/EulerImplicitSolver.h b/Sofa/Component/ODESolver/Backward/src/sofa/component/odesolver/backward/EulerImplicitSolver.h index 3dbece65c3b..ccebff28494 100644 --- a/Sofa/Component/ODESolver/Backward/src/sofa/component/odesolver/backward/EulerImplicitSolver.h +++ b/Sofa/Component/ODESolver/Backward/src/sofa/component/odesolver/backward/EulerImplicitSolver.h @@ -25,7 +25,7 @@ #include -#include +#include namespace sofa::component::odesolver::backward { @@ -104,20 +104,20 @@ class SOFA_COMPONENT_ODESOLVER_BACKWARD_API EulerImplicitSolver : SOFA_CLASS2(EulerImplicitSolver, sofa::core::behavior::OdeSolver, sofa::core::behavior::LinearSolverAccessor); SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ODESOLVER_BACKWARD() - sofa::core::objectmodel::RenamedData f_rayleighStiffness; + sofa::core::objectmodel::lifecycle::RenamedData f_rayleighStiffness; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ODESOLVER_BACKWARD() - sofa::core::objectmodel::RenamedData f_rayleighMass; + sofa::core::objectmodel::lifecycle::RenamedData f_rayleighMass; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ODESOLVER_BACKWARD() - sofa::core::objectmodel::RenamedData f_velocityDamping; + sofa::core::objectmodel::lifecycle::RenamedData f_velocityDamping; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ODESOLVER_BACKWARD() - sofa::core::objectmodel::RenamedData f_firstOrder; + sofa::core::objectmodel::lifecycle::RenamedData f_firstOrder; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ODESOLVER_BACKWARD() - sofa::core::objectmodel::RenamedData f_solveConstraint; + sofa::core::objectmodel::lifecycle::RenamedData f_solveConstraint; diff --git a/Sofa/Component/ODESolver/Backward/src/sofa/component/odesolver/backward/VariationalSymplecticSolver.h b/Sofa/Component/ODESolver/Backward/src/sofa/component/odesolver/backward/VariationalSymplecticSolver.h index 8e46bb57664..37e2a66ee6b 100644 --- a/Sofa/Component/ODESolver/Backward/src/sofa/component/odesolver/backward/VariationalSymplecticSolver.h +++ b/Sofa/Component/ODESolver/Backward/src/sofa/component/odesolver/backward/VariationalSymplecticSolver.h @@ -26,7 +26,7 @@ #include #include -#include +#include namespace sofa::component::odesolver::backward { @@ -46,34 +46,34 @@ class SOFA_COMPONENT_ODESOLVER_BACKWARD_API VariationalSymplecticSolver SOFA_CLASS2(VariationalSymplecticSolver, sofa::core::behavior::OdeSolver, sofa::core::behavior::LinearSolverAccessor); SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ODESOLVER_BACKWARD() - sofa::core::objectmodel::RenamedData f_newtonError; + sofa::core::objectmodel::lifecycle::RenamedData f_newtonError; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ODESOLVER_BACKWARD() - sofa::core::objectmodel::RenamedData f_newtonSteps; + sofa::core::objectmodel::lifecycle::RenamedData f_newtonSteps; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ODESOLVER_BACKWARD() - sofa::core::objectmodel::RenamedData f_rayleighStiffness; + sofa::core::objectmodel::lifecycle::RenamedData f_rayleighStiffness; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ODESOLVER_BACKWARD() - sofa::core::objectmodel::RenamedData f_rayleighMass; + sofa::core::objectmodel::lifecycle::RenamedData f_rayleighMass; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ODESOLVER_BACKWARD() - sofa::core::objectmodel::RenamedData f_saveEnergyInFile; + sofa::core::objectmodel::lifecycle::RenamedData f_saveEnergyInFile; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ODESOLVER_BACKWARD() - sofa::core::objectmodel::RenamedData f_explicit; + sofa::core::objectmodel::lifecycle::RenamedData f_explicit; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ODESOLVER_BACKWARD() - sofa::core::objectmodel::RenamedData f_fileName; + sofa::core::objectmodel::lifecycle::RenamedData f_fileName; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ODESOLVER_BACKWARD() - sofa::core::objectmodel::RenamedData f_computeHamiltonian; + sofa::core::objectmodel::lifecycle::RenamedData f_computeHamiltonian; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ODESOLVER_BACKWARD() - sofa::core::objectmodel::RenamedData f_hamiltonianEnergy; + sofa::core::objectmodel::lifecycle::RenamedData f_hamiltonianEnergy; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ODESOLVER_BACKWARD() - sofa::core::objectmodel::RenamedData f_useIncrementalPotentialEnergy; + sofa::core::objectmodel::lifecycle::RenamedData f_useIncrementalPotentialEnergy; Data d_newtonError; ///< Error tolerance for Newton iterations Data d_newtonSteps; ///< Maximum number of Newton steps diff --git a/Sofa/Component/ODESolver/Backward/tests/EulerImplicitSolverStatic_test.cpp b/Sofa/Component/ODESolver/Backward/tests/EulerImplicitSolverStatic_test.cpp index 6d6a88d522d..30c8c945c9d 100644 --- a/Sofa/Component/ODESolver/Backward/tests/EulerImplicitSolverStatic_test.cpp +++ b/Sofa/Component/ODESolver/Backward/tests/EulerImplicitSolverStatic_test.cpp @@ -103,12 +103,12 @@ struct EulerImplicit_test_2_particles_to_equilibrium : public BaseSimulationTest const simulation::Node::SPtr root = simpleapi::createRootNode(simu, "root"); //******* // begin create scene under the root node - sofa::simpleapi::importPlugin("Sofa.Component.ODESolver"); - sofa::simpleapi::importPlugin("Sofa.Component.LinearSolver.Iterative"); - sofa::simpleapi::importPlugin("Sofa.Component.StateContainer"); - sofa::simpleapi::importPlugin("Sofa.Component.Mass"); - sofa::simpleapi::importPlugin("Sofa.Component.Constraint.Projective"); - sofa::simpleapi::importPlugin("Sofa.Component.SolidMechanics.Spring"); + sofa::simpleapi::importPlugin(Sofa.Component.ODESolver); + sofa::simpleapi::importPlugin(Sofa.Component.LinearSolver.Iterative); + sofa::simpleapi::importPlugin(Sofa.Component.StateContainer); + sofa::simpleapi::importPlugin(Sofa.Component.Mass); + sofa::simpleapi::importPlugin(Sofa.Component.Constraint.Projective); + sofa::simpleapi::importPlugin(Sofa.Component.SolidMechanics.Spring); // remove warnings simpleapi::createObject(root, "DefaultAnimationLoop", {}); @@ -201,12 +201,12 @@ struct EulerImplicit_test_2_particles_in_different_nodes_to_equilibrium : publi // create scene root->setGravity(Vec3(0,0,0)); - sofa::simpleapi::importPlugin("Sofa.Component.ODESolver"); - sofa::simpleapi::importPlugin("Sofa.Component.LinearSolver.Iterative"); - sofa::simpleapi::importPlugin("Sofa.Component.StateContainer"); - sofa::simpleapi::importPlugin("Sofa.Component.Mass"); - sofa::simpleapi::importPlugin("Sofa.Component.Constraint.Projective"); - sofa::simpleapi::importPlugin("Sofa.Component.SolidMechanics.Spring"); + sofa::simpleapi::importPlugin(Sofa.Component.ODESolver); + sofa::simpleapi::importPlugin(Sofa.Component.LinearSolver.Iterative); + sofa::simpleapi::importPlugin(Sofa.Component.StateContainer); + sofa::simpleapi::importPlugin(Sofa.Component.Mass); + sofa::simpleapi::importPlugin(Sofa.Component.Constraint.Projective); + sofa::simpleapi::importPlugin(Sofa.Component.SolidMechanics.Spring); // remove warnings simpleapi::createObject(root, "DefaultAnimationLoop", {}); simpleapi::createObject(root, "DefaultVisualManagerLoop", {}); diff --git a/Sofa/Component/ODESolver/Backward/tests/EulerImplicitSolver_withDamping_test.cpp b/Sofa/Component/ODESolver/Backward/tests/EulerImplicitSolver_withDamping_test.cpp index dc1089ed0a7..25f18328d7c 100644 --- a/Sofa/Component/ODESolver/Backward/tests/EulerImplicitSolver_withDamping_test.cpp +++ b/Sofa/Component/ODESolver/Backward/tests/EulerImplicitSolver_withDamping_test.cpp @@ -57,11 +57,11 @@ struct EulerImplicit_with_damping_forcefield : public BaseSimulationTest, Numeri //******* // load appropriate modules - sofa::simpleapi::importPlugin("Sofa.Component.ODESolver.Backward"); - sofa::simpleapi::importPlugin("Sofa.Component.LinearSolver.Iterative"); - sofa::simpleapi::importPlugin("Sofa.Component.StateContainer"); - sofa::simpleapi::importPlugin("Sofa.Component.Mass"); - sofa::simpleapi::importPlugin("Sofa.Component.MechanicalLoad"); + sofa::simpleapi::importPlugin(Sofa.Component.ODESolver.Backward); + sofa::simpleapi::importPlugin(Sofa.Component.LinearSolver.Iterative); + sofa::simpleapi::importPlugin(Sofa.Component.StateContainer); + sofa::simpleapi::importPlugin(Sofa.Component.Mass); + sofa::simpleapi::importPlugin(Sofa.Component.MechanicalLoad); // avoid warnings simpleapi::createObject(root, "DefaultAnimationLoop", {}); diff --git a/Sofa/Component/ODESolver/Backward/tests/SpringSolverDynamic_test.cpp b/Sofa/Component/ODESolver/Backward/tests/SpringSolverDynamic_test.cpp index 1425fb39be1..4a7ae8a587b 100644 --- a/Sofa/Component/ODESolver/Backward/tests/SpringSolverDynamic_test.cpp +++ b/Sofa/Component/ODESolver/Backward/tests/SpringSolverDynamic_test.cpp @@ -60,7 +60,7 @@ struct SpringSolverDynamic_test : public NumericTest /// Create the context for the scene - void SetUp() override + void doSetUp() override { // Init simulation simulation = sofa::simulation::getSimulation(); diff --git a/Sofa/Component/ODESolver/Backward/tests/StaticSolver_test.cpp b/Sofa/Component/ODESolver/Backward/tests/StaticSolver_test.cpp index 510b11bf89a..868b862de62 100644 --- a/Sofa/Component/ODESolver/Backward/tests/StaticSolver_test.cpp +++ b/Sofa/Component/ODESolver/Backward/tests/StaticSolver_test.cpp @@ -51,11 +51,11 @@ static constexpr SReal l = youngModulus * poissonRatio / ((1.0 + poissonRatio) * class StaticSolverTest : public sofa::testing::BaseTest { public: - void onSetUp() override { + void doSetUp() override { root = getSimulation()->createNewNode("root"); - createObject(root, "RequiredPlugin", {{"pluginName", "Sofa.Component"}}); + createObject(root, "RequiredPlugin", {{"pluginName", Sofa.Component}}); createObject(root, "DefaultAnimationLoop"); createObject(root, "RegularGridTopology", {{"name", "grid"}, {"min", "-7.5 -7.5 0"}, {"max", "7.5 7.5 80"}, {"n", "3 3 9"}}); const auto s = createObject(root, "StaticSolver", {{"newton_iterations", "10"}}); @@ -83,7 +83,7 @@ class StaticSolverTest : public sofa::testing::BaseTest solver = dynamic_cast (s.get()); } - void onTearDown() override { + void doTearDown() override { sofa::simulation::node::unload(root); } diff --git a/Sofa/Component/ODESolver/Forward/src/sofa/component/odesolver/forward/CentralDifferenceSolver.h b/Sofa/Component/ODESolver/Forward/src/sofa/component/odesolver/forward/CentralDifferenceSolver.h index 62416f6a63d..592bbb2c960 100644 --- a/Sofa/Component/ODESolver/Forward/src/sofa/component/odesolver/forward/CentralDifferenceSolver.h +++ b/Sofa/Component/ODESolver/Forward/src/sofa/component/odesolver/forward/CentralDifferenceSolver.h @@ -24,7 +24,7 @@ #include -#include +#include namespace sofa::component::odesolver::forward { @@ -44,7 +44,7 @@ class SOFA_COMPONENT_ODESOLVER_FORWARD_API CentralDifferenceSolver : public sofa public: void solve (const core::ExecParams* params, SReal dt, sofa::core::MultiVecCoordId xResult, sofa::core::MultiVecDerivId vResult) override; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ODESOLVER_FORWARD() - sofa::core::objectmodel::RenamedData f_rayleighMass; + sofa::core::objectmodel::lifecycle::RenamedData f_rayleighMass; Data d_rayleighMass; ///< Rayleigh damping coefficient related to mass Data d_threadSafeVisitor; ///< If true, do not use realloc and free visitors in fwdInteractionForceField. diff --git a/Sofa/Component/ODESolver/Forward/src/sofa/component/odesolver/forward/DampVelocitySolver.h b/Sofa/Component/ODESolver/Forward/src/sofa/component/odesolver/forward/DampVelocitySolver.h index de737b83789..ddfe643f313 100644 --- a/Sofa/Component/ODESolver/Forward/src/sofa/component/odesolver/forward/DampVelocitySolver.h +++ b/Sofa/Component/ODESolver/Forward/src/sofa/component/odesolver/forward/DampVelocitySolver.h @@ -25,7 +25,7 @@ #include -#include +#include namespace sofa::component::odesolver::forward { @@ -37,10 +37,10 @@ class SOFA_COMPONENT_ODESOLVER_FORWARD_API DampVelocitySolver : public sofa::cor { public: SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ODESOLVER_FORWARD() - sofa::core::objectmodel::RenamedData rate; + sofa::core::objectmodel::lifecycle::RenamedData rate; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_ODESOLVER_FORWARD() - sofa::core::objectmodel::RenamedData threshold; + sofa::core::objectmodel::lifecycle::RenamedData threshold; SOFA_CLASS(DampVelocitySolver, sofa::core::behavior::OdeSolver); diff --git a/Sofa/Component/ODESolver/Testing/src/sofa/component/odesolver/testing/ODESolverSpringTest.h b/Sofa/Component/ODESolver/Testing/src/sofa/component/odesolver/testing/ODESolverSpringTest.h index 8d1cd2c5ad0..d86e90e1d09 100644 --- a/Sofa/Component/ODESolver/Testing/src/sofa/component/odesolver/testing/ODESolverSpringTest.h +++ b/Sofa/Component/ODESolver/Testing/src/sofa/component/odesolver/testing/ODESolverSpringTest.h @@ -21,6 +21,7 @@ ******************************************************************************/ #pragma once +#include #include using sofa::testing::BaseSimulationTest; @@ -43,12 +44,12 @@ struct ODESolverSpringTest : public BaseSimulationTest // Create the scene m_si.root->setGravity({ 0, -10, 0 }); - sofa::simpleapi::importPlugin("Sofa.Component.ODESolver"); - sofa::simpleapi::importPlugin("Sofa.Component.LinearSolver.Iterative"); - sofa::simpleapi::importPlugin("Sofa.Component.StateContainer"); - sofa::simpleapi::importPlugin("Sofa.Component.Mass"); - sofa::simpleapi::importPlugin("Sofa.Component.Constraint.Projective"); - sofa::simpleapi::importPlugin("Sofa.Component.SolidMechanics.Spring"); + sofa::simpleapi::importPlugin(Sofa.Component.ODESolver); + sofa::simpleapi::importPlugin(Sofa.Component.LinearSolver.Iterative); + sofa::simpleapi::importPlugin(Sofa.Component.StateContainer); + sofa::simpleapi::importPlugin(Sofa.Component.Mass); + sofa::simpleapi::importPlugin(Sofa.Component.Constraint.Projective); + sofa::simpleapi::importPlugin(Sofa.Component.SolidMechanics.Spring); // remove warnings simpleapi::createObject(m_si.root, "DefaultAnimationLoop", {}); diff --git a/Sofa/Component/ODESolver/src/sofa/component/odesolver/init.cpp b/Sofa/Component/ODESolver/src/sofa/component/odesolver/init.cpp index 7f06baa6206..4c86bf81b18 100644 --- a/Sofa/Component/ODESolver/src/sofa/component/odesolver/init.cpp +++ b/Sofa/Component/ODESolver/src/sofa/component/odesolver/init.cpp @@ -26,6 +26,7 @@ #include #include +#include namespace sofa::component::odesolver { @@ -54,8 +55,8 @@ const char* getModuleVersion() void registerObjects(sofa::core::ObjectFactory* factory) { - factory->registerObjectsFromPlugin("Sofa.Component.ODESolver.Backward"); - factory->registerObjectsFromPlugin("Sofa.Component.ODESolver.Forward"); + factory->registerObjectsFromPlugin(Sofa.Component.ODESolver.Backward); + factory->registerObjectsFromPlugin(Sofa.Component.ODESolver.Forward); } void init() diff --git a/Sofa/Component/Playback/src/sofa/component/playback/InputEventReader.h b/Sofa/Component/Playback/src/sofa/component/playback/InputEventReader.h index 6eb0e713c4f..3487ea8ee02 100644 --- a/Sofa/Component/Playback/src/sofa/component/playback/InputEventReader.h +++ b/Sofa/Component/Playback/src/sofa/component/playback/InputEventReader.h @@ -32,7 +32,7 @@ #include #endif -#include +#include namespace sofa::component::playback { @@ -78,19 +78,19 @@ class InputEventReader : public core::objectmodel::BaseObject sofa::core::objectmodel::DataFileName filename; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_PLAYBACK() - sofa::core::objectmodel::RenamedData inverseSense; + sofa::core::objectmodel::lifecycle::RenamedData inverseSense; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_PLAYBACK() - sofa::core::objectmodel::RenamedData p_printEvent; + sofa::core::objectmodel::lifecycle::RenamedData p_printEvent; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_PLAYBACK() - sofa::core::objectmodel::RenamedData p_key1; + sofa::core::objectmodel::lifecycle::RenamedData p_key1; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_PLAYBACK() - sofa::core::objectmodel::RenamedData p_key2; + sofa::core::objectmodel::lifecycle::RenamedData p_key2; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_PLAYBACK() - sofa::core::objectmodel::RenamedData p_writeEvents; + sofa::core::objectmodel::lifecycle::RenamedData p_writeEvents; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_PLAYBACK() sofa::core::objectmodel::DataFileName p_outputFilename; diff --git a/Sofa/Component/Playback/src/sofa/component/playback/ReadTopology.h b/Sofa/Component/Playback/src/sofa/component/playback/ReadTopology.h index abd7f4e23f4..f3ab73eca18 100644 --- a/Sofa/Component/Playback/src/sofa/component/playback/ReadTopology.h +++ b/Sofa/Component/Playback/src/sofa/component/playback/ReadTopology.h @@ -34,7 +34,7 @@ #include #include -#include +#include namespace sofa::component::playback { @@ -50,13 +50,13 @@ class SOFA_COMPONENT_PLAYBACK_API ReadTopology: public core::objectmodel::BaseOb sofa::core::objectmodel::DataFileName f_filename; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_PLAYBACK() - sofa::core::objectmodel::RenamedData < double > f_interval; + sofa::core::objectmodel::lifecycle::RenamedData < double > f_interval; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_PLAYBACK() - sofa::core::objectmodel::RenamedData < double > f_shift; + sofa::core::objectmodel::lifecycle::RenamedData < double > f_shift; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_PLAYBACK() - sofa::core::objectmodel::RenamedData < bool > f_loop; + sofa::core::objectmodel::lifecycle::RenamedData < bool > f_loop; sofa::core::objectmodel::DataFileName d_filename; Data < double > d_interval; ///< time duration between inputs diff --git a/Sofa/Component/Playback/src/sofa/component/playback/WriteTopology.h b/Sofa/Component/Playback/src/sofa/component/playback/WriteTopology.h index 77706b00a7a..623d33ac0c6 100644 --- a/Sofa/Component/Playback/src/sofa/component/playback/WriteTopology.h +++ b/Sofa/Component/Playback/src/sofa/component/playback/WriteTopology.h @@ -38,7 +38,7 @@ #include -#include +#include namespace sofa::component::playback { @@ -61,19 +61,19 @@ class SOFA_COMPONENT_PLAYBACK_API WriteTopology: public core::objectmodel::BaseO sofa::core::objectmodel::DataFileName f_filename; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_PLAYBACK() - sofa::core::objectmodel::RenamedData < bool > f_writeContainers; + sofa::core::objectmodel::lifecycle::RenamedData < bool > f_writeContainers; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_PLAYBACK() - sofa::core::objectmodel::RenamedData < bool > f_writeShellContainers; + sofa::core::objectmodel::lifecycle::RenamedData < bool > f_writeShellContainers; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_PLAYBACK() - sofa::core::objectmodel::RenamedData < double > f_interval; + sofa::core::objectmodel::lifecycle::RenamedData < double > f_interval; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_PLAYBACK() - sofa::core::objectmodel::RenamedData < type::vector > f_time; + sofa::core::objectmodel::lifecycle::RenamedData < type::vector > f_time; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_PLAYBACK() - sofa::core::objectmodel::RenamedData < double > f_period; + sofa::core::objectmodel::lifecycle::RenamedData < double > f_period; sofa::core::objectmodel::DataFileName d_filename; diff --git a/Sofa/Component/Playback/tests/ReadState_test.cpp b/Sofa/Component/Playback/tests/ReadState_test.cpp index 67f543ea851..967d7a7579d 100644 --- a/Sofa/Component/Playback/tests/ReadState_test.cpp +++ b/Sofa/Component/Playback/tests/ReadState_test.cpp @@ -37,8 +37,8 @@ class ReadState_test : public BaseSimulationTest const double dt = 0.01; const auto simulation = sofa::simpleapi::createSimulation(); const Node::SPtr root = sofa::simpleapi::createRootNode(simulation, "root"); - sofa::simpleapi::createObject(root, "RequiredPlugin", { { "name","Sofa.Component.Playback" } }); - sofa::simpleapi::createObject(root, "RequiredPlugin", { { "name","Sofa.Component.StateContainer" } }); + sofa::simpleapi::createObject(root, "RequiredPlugin", { { "name",Sofa.Component.Playback } }); + sofa::simpleapi::createObject(root, "RequiredPlugin", { { "name",Sofa.Component.StateContainer } }); /// no need of gravity, the file .data is just read root->setGravity(Vec3(0.0,0.0,0.0)); @@ -68,8 +68,8 @@ class ReadState_test : public BaseSimulationTest { const auto simulation = sofa::simpleapi::createSimulation(); const Node::SPtr root = sofa::simpleapi::createRootNode(simulation, "root"); - sofa::simpleapi::createObject(root, "RequiredPlugin", { { "name","Sofa.Component.Playback" } }); - sofa::simpleapi::createObject(root, "RequiredPlugin", { { "name","Sofa.Component.StateContainer" } }); + sofa::simpleapi::createObject(root, "RequiredPlugin", { { "name",Sofa.Component.Playback } }); + sofa::simpleapi::createObject(root, "RequiredPlugin", { { "name",Sofa.Component.StateContainer } }); auto meca = sofa::simpleapi::createObject(root, "MechanicalObject", {{"size", "1"}}); diff --git a/Sofa/Component/Playback/tests/WriteState_test.cpp b/Sofa/Component/Playback/tests/WriteState_test.cpp index 909a091c983..d0b92f7f4e8 100644 --- a/Sofa/Component/Playback/tests/WriteState_test.cpp +++ b/Sofa/Component/Playback/tests/WriteState_test.cpp @@ -71,7 +71,7 @@ namespace sofa { double final_expected_value=0.0; /// Create the context for the scene - void SetUp() override + void doSetUp() override { // Init simulation root = simulation::getSimulation()->createNewGraph("root"); @@ -220,7 +220,7 @@ namespace sofa { /// Unload the scene - void TearDown() override + void doTearDown() override { if (root!=nullptr) sofa::simulation::node::unload(root); @@ -237,26 +237,22 @@ namespace sofa { // Test 1 : write position of a particle falling under gravity (required to use SymplecticSolver TYPED_TEST( WriteState_test , test_write_position) { - this->SetUp(); this->createScene(true); this->initScene(); this->runScene(); ASSERT_TRUE( this->simulation_result_test(true) ); ASSERT_TRUE( this->test_export(true) ); - this->TearDown(); } // Test 2 : write velocity of a particle falling under gravity TYPED_TEST( WriteState_test , test_write_velocity) { - this->SetUp(); this->createScene(false); this->initScene(); this->runScene(); ASSERT_TRUE( this->simulation_result_test(false) ); ASSERT_TRUE( this->test_export(false) ); - this->TearDown(); } } diff --git a/Sofa/Component/SceneUtility/tests/AddResourceRepository_test.cpp b/Sofa/Component/SceneUtility/tests/AddResourceRepository_test.cpp index c7bebda42a6..5d8a3d596af 100644 --- a/Sofa/Component/SceneUtility/tests/AddResourceRepository_test.cpp +++ b/Sofa/Component/SceneUtility/tests/AddResourceRepository_test.cpp @@ -44,9 +44,9 @@ struct AddResourceRepository_test : public BaseSimulationTest sofa::simulation::Node::SPtr m_root; std::string m_testRepoDir; - void SetUp() override + void doSetUp() override { - sofa::simpleapi::importPlugin("Sofa.Component.SceneUtility"); + sofa::simpleapi::importPlugin(Sofa.Component.SceneUtility); m_testRepoDir = std::string(SOFA_COMPONENT_SCENEUTILITY_TEST_RESOURCES_DIR) + std::string("/repo"); } diff --git a/Sofa/Component/SceneUtility/tests/MakeAliasComponent_test.cpp b/Sofa/Component/SceneUtility/tests/MakeAliasComponent_test.cpp index e442de84203..552ad09b95a 100644 --- a/Sofa/Component/SceneUtility/tests/MakeAliasComponent_test.cpp +++ b/Sofa/Component/SceneUtility/tests/MakeAliasComponent_test.cpp @@ -72,7 +72,7 @@ bool inited = doInit(); void perTestInit() { - sofa::simpleapi::importPlugin("Sofa.Component.SceneUtility"); + sofa::simpleapi::importPlugin(Sofa.Component.SceneUtility); theSimulation = sofa::simulation::getSimulation(); diff --git a/Sofa/Component/SceneUtility/tests/MakeDataAliasComponent_test.cpp b/Sofa/Component/SceneUtility/tests/MakeDataAliasComponent_test.cpp index 15aaa483a2f..7a36ee55625 100644 --- a/Sofa/Component/SceneUtility/tests/MakeDataAliasComponent_test.cpp +++ b/Sofa/Component/SceneUtility/tests/MakeDataAliasComponent_test.cpp @@ -72,8 +72,8 @@ bool inited = doInit(); void perTestInit() { - sofa::simpleapi::importPlugin("Sofa.Component.SceneUtility"); - sofa::simpleapi::importPlugin("Sofa.Component.StateContainer"); + sofa::simpleapi::importPlugin(Sofa.Component.SceneUtility); + sofa::simpleapi::importPlugin(Sofa.Component.StateContainer); if(defaultHandler==nullptr) defaultHandler=new ConsoleMessageHandler(&RichConsoleStyleMessageFormatter::getInstance()) ; diff --git a/Sofa/Component/SceneUtility/tests/MessageHandlerComponent_test.cpp b/Sofa/Component/SceneUtility/tests/MessageHandlerComponent_test.cpp index 6cf6bbd792f..542ebc512b8 100644 --- a/Sofa/Component/SceneUtility/tests/MessageHandlerComponent_test.cpp +++ b/Sofa/Component/SceneUtility/tests/MessageHandlerComponent_test.cpp @@ -45,7 +45,7 @@ using sofa::helper::logging::MessageDispatcher ; bool perTestInit() { - sofa::simpleapi::importPlugin("Sofa.Component.SceneUtility"); + sofa::simpleapi::importPlugin(Sofa.Component.SceneUtility); /// THE TESTS HERE ARE NOT INHERITING FROM SOFA TEST SO WE NEED TO MANUALLY INSTALL THE HANDLER /// DO NO REMOVE diff --git a/Sofa/Component/Setting/src/sofa/component/setting/BackgroundSetting.h b/Sofa/Component/Setting/src/sofa/component/setting/BackgroundSetting.h index 7a6e255b84e..f59bbb24dbc 100644 --- a/Sofa/Component/Setting/src/sofa/component/setting/BackgroundSetting.h +++ b/Sofa/Component/Setting/src/sofa/component/setting/BackgroundSetting.h @@ -26,7 +26,7 @@ #include #include -#include +#include namespace sofa::component::setting { @@ -42,7 +42,7 @@ class SOFA_COMPONENT_SETTING_API BackgroundSetting: public core::objectmodel::Co public: SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SETTING() - sofa::core::objectmodel::RenamedData color; + sofa::core::objectmodel::lifecycle::RenamedData color; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SETTING() sofa::core::objectmodel::DataFileName image; ///< Image to be used as background of the viewer. diff --git a/Sofa/Component/Setting/src/sofa/component/setting/MouseButtonSetting.h b/Sofa/Component/Setting/src/sofa/component/setting/MouseButtonSetting.h index 90c6cafb22b..e7df8c36482 100644 --- a/Sofa/Component/Setting/src/sofa/component/setting/MouseButtonSetting.h +++ b/Sofa/Component/Setting/src/sofa/component/setting/MouseButtonSetting.h @@ -26,7 +26,7 @@ #include #include -#include +#include namespace sofa::component::setting { @@ -41,7 +41,7 @@ class SOFA_COMPONENT_SETTING_API MouseButtonSetting: public core::objectmodel::C virtual std::string getOperationType()=0; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SETTING() - sofa::core::objectmodel::RenamedData button; + sofa::core::objectmodel::lifecycle::RenamedData button; core::objectmodel::Data d_button; ///< Mouse button used diff --git a/Sofa/Component/Setting/src/sofa/component/setting/SofaDefaultPathSetting.h b/Sofa/Component/Setting/src/sofa/component/setting/SofaDefaultPathSetting.h index 363375bd021..83a5e92abaa 100644 --- a/Sofa/Component/Setting/src/sofa/component/setting/SofaDefaultPathSetting.h +++ b/Sofa/Component/Setting/src/sofa/component/setting/SofaDefaultPathSetting.h @@ -26,7 +26,7 @@ #include #include -#include +#include namespace sofa::component::setting { @@ -40,7 +40,7 @@ class SOFA_COMPONENT_SETTING_API SofaDefaultPathSetting: public core::objectmode SofaDefaultPathSetting(); /// gnuplotPath; + sofa::core::objectmodel::lifecycle::RenamedData gnuplotPath; sofa::core::objectmodel::Data d_gnuplotPath; ///< Path where will be saved the gnuplot files }; diff --git a/Sofa/Component/Setting/src/sofa/component/setting/StatsSetting.h b/Sofa/Component/Setting/src/sofa/component/setting/StatsSetting.h index 00eaad3abd3..4be75cf01ac 100644 --- a/Sofa/Component/Setting/src/sofa/component/setting/StatsSetting.h +++ b/Sofa/Component/Setting/src/sofa/component/setting/StatsSetting.h @@ -26,7 +26,7 @@ #include #include -#include +#include namespace sofa::component::setting { @@ -49,13 +49,13 @@ class SOFA_COMPONENT_SETTING_API StatsSetting: public core::objectmodel::Configu public: SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SETTING() - sofa::core::objectmodel::RenamedData dumpState; + sofa::core::objectmodel::lifecycle::RenamedData dumpState; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SETTING() - sofa::core::objectmodel::RenamedData logTime; + sofa::core::objectmodel::lifecycle::RenamedData logTime; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SETTING() - sofa::core::objectmodel::RenamedData exportState; + sofa::core::objectmodel::lifecycle::RenamedData exportState; Data d_dumpState; ///< Dump state vectors at each time step of the simulation diff --git a/Sofa/Component/Setting/src/sofa/component/setting/ViewerSetting.h b/Sofa/Component/Setting/src/sofa/component/setting/ViewerSetting.h index b98967183e8..28625d1742d 100644 --- a/Sofa/Component/Setting/src/sofa/component/setting/ViewerSetting.h +++ b/Sofa/Component/Setting/src/sofa/component/setting/ViewerSetting.h @@ -27,7 +27,7 @@ #include #include -#include +#include namespace sofa::component::setting { @@ -52,16 +52,16 @@ class SOFA_COMPONENT_SETTING_API ViewerSetting: public sofa::core::objectmodel:: public: SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SETTING() - sofa::core::objectmodel::RenamedData > resolution; + sofa::core::objectmodel::lifecycle::RenamedData > resolution; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SETTING() - sofa::core::objectmodel::RenamedData fullscreen; + sofa::core::objectmodel::lifecycle::RenamedData fullscreen; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SETTING() - sofa::core::objectmodel::RenamedData cameraMode; + sofa::core::objectmodel::lifecycle::RenamedData cameraMode; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SETTING() - sofa::core::objectmodel::RenamedData objectPickingMethod; + sofa::core::objectmodel::lifecycle::RenamedData objectPickingMethod; Data > d_resolution; ///< resolution of the Viewer Data d_fullscreen; ///< Fullscreen mode diff --git a/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/BeamFEMForceField.h b/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/BeamFEMForceField.h index 6eba2d3fc3e..29b3f8144cb 100644 --- a/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/BeamFEMForceField.h +++ b/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/BeamFEMForceField.h @@ -25,7 +25,7 @@ #include #include -#include +#include namespace sofa::component::solidmechanics::fem::elastic { @@ -132,7 +132,7 @@ class BeamFEMForceField : public BaseLinearElasticityFEMForceField }; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData> m_beamsData; + sofa::core::objectmodel::lifecycle::RenamedData> m_beamsData; EdgeData > d_beamsData; ///< Internal element data diff --git a/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/BeamFEMForceField.inl b/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/BeamFEMForceField.inl index d7aa2c49ebc..10e7cb5e22e 100644 --- a/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/BeamFEMForceField.inl +++ b/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/BeamFEMForceField.inl @@ -60,10 +60,7 @@ BeamFEMForceField::BeamFEMForceField(Real poissonRatio, Real youngMod , m_updateStiffnessMatrix(true) { d_radius.setRequired(true); - d_radiusInner.setRequired(true); - m_beamsData.setOriginalData(&d_beamsData); - this->setPoissonRatio(poissonRatio); this->setYoungModulus(youngModulus); } diff --git a/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/FastTetrahedralCorotationalForceField.h b/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/FastTetrahedralCorotationalForceField.h index cc68dbf18a5..0f5fb51e58f 100644 --- a/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/FastTetrahedralCorotationalForceField.h +++ b/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/FastTetrahedralCorotationalForceField.h @@ -31,7 +31,7 @@ #include #include -#include +#include namespace sofa::component::solidmechanics::fem::elastic { @@ -117,37 +117,37 @@ class FastTetrahedralCorotationalForceField : public BaseLinearElasticityFEMForc using VecMat3x3 = type::rebind_to; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData pointInfo; + sofa::core::objectmodel::lifecycle::RenamedData pointInfo; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData edgeInfo; + sofa::core::objectmodel::lifecycle::RenamedData edgeInfo; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData tetrahedronInfo; + sofa::core::objectmodel::lifecycle::RenamedData tetrahedronInfo; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData f_method; + sofa::core::objectmodel::lifecycle::RenamedData f_method; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData f_poissonRatio; + sofa::core::objectmodel::lifecycle::RenamedData f_poissonRatio; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() SOFA_ATTRIBUTE_DISABLED("", "v24.12", "Use d_youngModulus instead") DeprecatedAndRemoved f_youngModulus; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData f_drawing; + sofa::core::objectmodel::lifecycle::RenamedData f_drawing; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData drawColor1; + sofa::core::objectmodel::lifecycle::RenamedData drawColor1; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData drawColor2; + sofa::core::objectmodel::lifecycle::RenamedData drawColor2; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData drawColor3; + sofa::core::objectmodel::lifecycle::RenamedData drawColor3; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData drawColor4; + sofa::core::objectmodel::lifecycle::RenamedData drawColor4; core::topology::PointData d_pointInfo; ///< Internal point data diff --git a/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/HexahedralFEMForceField.h b/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/HexahedralFEMForceField.h index 8375c646bf4..49ae29b2640 100644 --- a/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/HexahedralFEMForceField.h +++ b/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/HexahedralFEMForceField.h @@ -30,7 +30,7 @@ #include -#include +#include namespace sofa::component::solidmechanics::fem::elastic { @@ -186,15 +186,15 @@ class HexahedralFEMForceField : virtual public BaseLinearElasticityFEMForceField int method; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData f_method; + sofa::core::objectmodel::lifecycle::RenamedData f_method; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData f_poissonRatio; + sofa::core::objectmodel::lifecycle::RenamedData f_poissonRatio; SOFA_ATTRIBUTE_DISABLED("", "v24.12", "Use d_youngModulus instead") DeprecatedAndRemoved f_youngModulus; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData > hexahedronInfo; + sofa::core::objectmodel::lifecycle::RenamedData > hexahedronInfo; Data d_method; ///< "large" or "polar" displacements diff --git a/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/HexahedralFEMForceFieldAndMass.h b/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/HexahedralFEMForceFieldAndMass.h index 012ce1f3433..f436dfd65c0 100644 --- a/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/HexahedralFEMForceFieldAndMass.h +++ b/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/HexahedralFEMForceFieldAndMass.h @@ -28,7 +28,7 @@ #include -#include +#include namespace sofa::component::solidmechanics::fem::elastic { @@ -128,22 +128,22 @@ class HexahedralFEMForceFieldAndMass : virtual public sofa::core::behavior::Mass protected: SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData _density; + sofa::core::objectmodel::lifecycle::RenamedData _density; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData _useLumpedMass; + sofa::core::objectmodel::lifecycle::RenamedData _useLumpedMass; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData> _elementMasses; + sofa::core::objectmodel::lifecycle::RenamedData> _elementMasses; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData > _elementTotalMass; + sofa::core::objectmodel::lifecycle::RenamedData > _elementTotalMass; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData > _particleMasses; + sofa::core::objectmodel::lifecycle::RenamedData > _particleMasses; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData > _lumpedMasses; + sofa::core::objectmodel::lifecycle::RenamedData > _lumpedMasses; Data d_density; ///< density == volumetric mass in english (kg.m-3) Data d_useLumpedMass; ///< Does it use lumped masses? diff --git a/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/HexahedronFEMForceField.h b/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/HexahedronFEMForceField.h index 082f2ee9d76..92b4462cf3c 100644 --- a/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/HexahedronFEMForceField.h +++ b/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/HexahedronFEMForceField.h @@ -32,7 +32,7 @@ #include #include -#include +#include namespace sofa::component::solidmechanics::fem::elastic { @@ -117,27 +117,27 @@ class HexahedronFEMForceField : virtual public BaseLinearElasticityFEMForceField int method; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData f_method; + sofa::core::objectmodel::lifecycle::RenamedData f_method; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData f_poissonRatio; + sofa::core::objectmodel::lifecycle::RenamedData f_poissonRatio; SOFA_ATTRIBUTE_DISABLED("", "v24.12", "Use d_youngModulus instead") DeprecatedAndRemoved f_youngModulus; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData f_updateStiffnessMatrix; + sofa::core::objectmodel::lifecycle::RenamedData f_updateStiffnessMatrix; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData< sofa::helper::OptionsGroup > _gatherPt; + sofa::core::objectmodel::lifecycle::RenamedData< sofa::helper::OptionsGroup > _gatherPt; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData< sofa::helper::OptionsGroup > _gatherBsize; + sofa::core::objectmodel::lifecycle::RenamedData< sofa::helper::OptionsGroup > _gatherBsize; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData f_drawing; + sofa::core::objectmodel::lifecycle::RenamedData f_drawing; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData f_drawPercentageOffset; + sofa::core::objectmodel::lifecycle::RenamedData f_drawPercentageOffset; @@ -194,7 +194,7 @@ class HexahedronFEMForceField : virtual public BaseLinearElasticityFEMForceField typedef type::vector VecElementStiffness; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData _elementStiffnesses; + sofa::core::objectmodel::lifecycle::RenamedData _elementStiffnesses; Data d_elementStiffnesses; ///< Stiffness matrices per element (K_i) @@ -207,7 +207,7 @@ class HexahedronFEMForceField : virtual public BaseLinearElasticityFEMForceField topology::container::grid::SparseGridTopology* _sparseGrid; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData _initialPoints; + sofa::core::objectmodel::lifecycle::RenamedData _initialPoints; Data< VecCoord > d_initialPoints; ///< Initial Position diff --git a/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/QuadBendingFEMForceField.h b/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/QuadBendingFEMForceField.h index 0c26029c00d..2e537911626 100644 --- a/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/QuadBendingFEMForceField.h +++ b/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/QuadBendingFEMForceField.h @@ -36,7 +36,7 @@ #include #include -#include +#include namespace sofa::component::solidmechanics::fem::elastic { @@ -170,13 +170,13 @@ class QuadBendingFEMForceField : public core::behavior::ForceField }; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData > quadInfo; + sofa::core::objectmodel::lifecycle::RenamedData > quadInfo; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData > vertexInfo; + sofa::core::objectmodel::lifecycle::RenamedData > vertexInfo; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData > edgeInfo; + sofa::core::objectmodel::lifecycle::RenamedData > edgeInfo; /// Topology Data core::topology::QuadData > d_quadInfo; core::topology::PointData > d_vertexInfo; ///< Internal point data @@ -233,16 +233,16 @@ protected : int method; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData f_method; + sofa::core::objectmodel::lifecycle::RenamedData f_method; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData> f_poisson; + sofa::core::objectmodel::lifecycle::RenamedData> f_poisson; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData> f_young; + sofa::core::objectmodel::lifecycle::RenamedData> f_young; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData f_thickness; + sofa::core::objectmodel::lifecycle::RenamedData f_thickness; Data d_method; ///< large: large displacements, small: small displacements Data > d_poisson; ///< Poisson ratio in Hooke's law (vector) diff --git a/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/TetrahedralCorotationalFEMForceField.h b/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/TetrahedralCorotationalFEMForceField.h index ff6292fed70..49bbc29ccf0 100644 --- a/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/TetrahedralCorotationalFEMForceField.h +++ b/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/TetrahedralCorotationalFEMForceField.h @@ -31,7 +31,7 @@ #include #include -#include +#include // corotational tetrahedron from // @InProceedings{NPF05, @@ -128,7 +128,7 @@ class TetrahedralCorotationalFEMForceField : public BaseLinearElasticityFEMForce }; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData > tetrahedronInfo; + sofa::core::objectmodel::lifecycle::RenamedData > tetrahedronInfo; /// container that stotes all requires information for each tetrahedron core::topology::TetrahedronData > d_tetrahedronInfo; @@ -151,37 +151,37 @@ class TetrahedralCorotationalFEMForceField : public BaseLinearElasticityFEMForce int method; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData f_method; + sofa::core::objectmodel::lifecycle::RenamedData f_method; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData _poissonRatio; + sofa::core::objectmodel::lifecycle::RenamedData _poissonRatio; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() SOFA_ATTRIBUTE_DISABLED("", "v24.12", "Use d_youngModulus instead") DeprecatedAndRemoved _youngModulus; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData _localStiffnessFactor; + sofa::core::objectmodel::lifecycle::RenamedData _localStiffnessFactor; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData _updateStiffnessMatrix; + sofa::core::objectmodel::lifecycle::RenamedData _updateStiffnessMatrix; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData _assembling; + sofa::core::objectmodel::lifecycle::RenamedData _assembling; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData f_drawing; + sofa::core::objectmodel::lifecycle::RenamedData f_drawing; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData drawColor1; + sofa::core::objectmodel::lifecycle::RenamedData drawColor1; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData drawColor2; + sofa::core::objectmodel::lifecycle::RenamedData drawColor2; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData drawColor3; + sofa::core::objectmodel::lifecycle::RenamedData drawColor3; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData drawColor4; + sofa::core::objectmodel::lifecycle::RenamedData drawColor4; Data d_method; ///< "small", "large" (by QR) or "polar" displacements Data d_localStiffnessFactor; ///< Allow specification of different stiffness per element. If there are N element and M values are specified, the youngModulus factor for element i would be localStiffnessFactor[i*M/N] diff --git a/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/TetrahedronFEMForceField.h b/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/TetrahedronFEMForceField.h index 10652e50b37..f5e28dabc83 100644 --- a/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/TetrahedronFEMForceField.h +++ b/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/TetrahedronFEMForceField.h @@ -33,7 +33,7 @@ #include #include -#include +#include // corotational tetrahedron from // @InProceedings{NPF05, @@ -189,28 +189,28 @@ class TetrahedronFEMForceField : public BaseLinearElasticityFEMForceField& getRotations() override; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - core::objectmodel::RenamedData _initialPoints; + core::objectmodel::lifecycle::RenamedData _initialPoints; Data< VecCoord > d_initialPoints; ///< Initial Position int method; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - core::objectmodel::RenamedData f_method; + core::objectmodel::lifecycle::RenamedData f_method; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() DeprecatedAndRemoved _poissonRatio; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - core::objectmodel::RenamedData _youngModulus; + core::objectmodel::lifecycle::RenamedData _youngModulus; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - core::objectmodel::RenamedData _localStiffnessFactor; + core::objectmodel::lifecycle::RenamedData _localStiffnessFactor; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - core::objectmodel::RenamedData _updateStiffnessMatrix; + core::objectmodel::lifecycle::RenamedData _updateStiffnessMatrix; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - core::objectmodel::RenamedData _assembling; + core::objectmodel::lifecycle::RenamedData _assembling; Data d_method; ///< "small", "large" (by QR), "polar" or "svd" displacements @@ -219,13 +219,13 @@ class TetrahedronFEMForceField : public BaseLinearElasticityFEMForceField d_assembling; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - core::objectmodel::RenamedData _plasticMaxThreshold; + core::objectmodel::lifecycle::RenamedData _plasticMaxThreshold; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - core::objectmodel::RenamedData _plasticYieldThreshold; + core::objectmodel::lifecycle::RenamedData _plasticYieldThreshold; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - core::objectmodel::RenamedData _plasticCreep; + core::objectmodel::lifecycle::RenamedData _plasticCreep; /// @name Plasticity such as "Interactive Virtual Materials", Muller & Gross, GI 2004 /// @{ @@ -235,13 +235,13 @@ class TetrahedronFEMForceField : public BaseLinearElasticityFEMForceField _gatherPt; + core::objectmodel::lifecycle::RenamedData _gatherPt; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - core::objectmodel::RenamedData _gatherBsize; + core::objectmodel::lifecycle::RenamedData _gatherBsize; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - core::objectmodel::RenamedData drawHeterogeneousTetra; + core::objectmodel::lifecycle::RenamedData drawHeterogeneousTetra; Data< sofa::helper::OptionsGroup > d_gatherPt; ///< number of dof accumulated per threads during the gather operation (Only use in GPU version) Data< sofa::helper::OptionsGroup > d_gatherBsize; ///< number of dof accumulated per threads during the gather operation (Only use in GPU version) @@ -259,16 +259,16 @@ class TetrahedronFEMForceField : public BaseLinearElasticityFEMForceField _computeVonMisesStress; + core::objectmodel::lifecycle::RenamedData _computeVonMisesStress; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - core::objectmodel::RenamedData > _vonMisesPerElement; + core::objectmodel::lifecycle::RenamedData > _vonMisesPerElement; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - core::objectmodel::RenamedData > _vonMisesPerNode; + core::objectmodel::lifecycle::RenamedData > _vonMisesPerNode; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - core::objectmodel::RenamedData > _vonMisesStressColors; + core::objectmodel::lifecycle::RenamedData > _vonMisesStressColors; Data d_computeVonMisesStress; ///< compute and display von Mises stress: 0: no computations, 1: using corotational strain, 2: using full Green strain. Set listening=1 Data > d_vonMisesPerElement; ///< von Mises Stress per element @@ -279,22 +279,22 @@ class TetrahedronFEMForceField : public BaseLinearElasticityFEMForceField _showStressColorMap; + core::objectmodel::lifecycle::RenamedData _showStressColorMap; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - core::objectmodel::RenamedData _showStressAlpha; + core::objectmodel::lifecycle::RenamedData _showStressAlpha; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - core::objectmodel::RenamedData _showVonMisesStressPerNode; + core::objectmodel::lifecycle::RenamedData _showVonMisesStressPerNode; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - core::objectmodel::RenamedData _showVonMisesStressPerNodeColorMap; + core::objectmodel::lifecycle::RenamedData _showVonMisesStressPerNodeColorMap; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - core::objectmodel::RenamedData _showVonMisesStressPerElement; + core::objectmodel::lifecycle::RenamedData _showVonMisesStressPerElement; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - core::objectmodel::RenamedData _updateStiffness; + core::objectmodel::lifecycle::RenamedData _updateStiffness; Data d_showStressColorMap; ///< Color map used to show stress values Data d_showStressAlpha; ///< Alpha for vonMises visualisation diff --git a/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/TriangleFEMForceField.h b/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/TriangleFEMForceField.h index 725c4158037..4815eec396f 100644 --- a/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/TriangleFEMForceField.h +++ b/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/TriangleFEMForceField.h @@ -28,7 +28,7 @@ #include #include -#include +#include // corotational triangle from // @InProceedings{NPF05, @@ -92,7 +92,7 @@ class TriangleFEMForceField : public BaseLinearElasticityFEMForceField _initialPoints; + sofa::core::objectmodel::lifecycle::RenamedData _initialPoints; Data< VecCoord > d_initialPoints; ///< Initial Position @@ -120,19 +120,19 @@ class TriangleFEMForceField : public BaseLinearElasticityFEMForceField f_method; + sofa::core::objectmodel::lifecycle::RenamedData f_method; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData f_poisson; + sofa::core::objectmodel::lifecycle::RenamedData f_poisson; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData f_young; + sofa::core::objectmodel::lifecycle::RenamedData f_young; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData f_thickness; + sofa::core::objectmodel::lifecycle::RenamedData f_thickness; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData f_planeStrain; + sofa::core::objectmodel::lifecycle::RenamedData f_planeStrain; Data d_method; ///< large: large displacements, small: small displacements Data d_thickness; ///< Thickness of the elements diff --git a/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/TriangularAnisotropicFEMForceField.h b/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/TriangularAnisotropicFEMForceField.h index 9c13be03ecb..27231b69eba 100644 --- a/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/TriangularAnisotropicFEMForceField.h +++ b/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/TriangularAnisotropicFEMForceField.h @@ -32,7 +32,7 @@ #include #include -#include +#include namespace sofa::component::solidmechanics::fem::elastic { @@ -77,19 +77,19 @@ class TriangularAnisotropicFEMForceField : public TriangularFEMForceField> f_young2; + sofa::core::objectmodel::lifecycle::RenamedData> f_young2; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData f_theta; + sofa::core::objectmodel::lifecycle::RenamedData f_theta; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData f_fiberCenter; + sofa::core::objectmodel::lifecycle::RenamedData f_fiberCenter; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData showFiber; + sofa::core::objectmodel::lifecycle::RenamedData showFiber; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData > localFiberDirection; + sofa::core::objectmodel::lifecycle::RenamedData > localFiberDirection; Data > f_poisson2; diff --git a/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/TriangularFEMForceField.h b/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/TriangularFEMForceField.h index 4a178998e1f..67273d2f9e5 100644 --- a/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/TriangularFEMForceField.h +++ b/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/TriangularFEMForceField.h @@ -33,7 +33,7 @@ #include #endif -#include +#include namespace sofa::helper { @@ -187,10 +187,10 @@ class TriangularFEMForceField : public BaseLinearElasticityFEMForceField> triangleInfo; + sofa::core::objectmodel::lifecycle::RenamedData> triangleInfo; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData > vertexInfo; + sofa::core::objectmodel::lifecycle::RenamedData > vertexInfo; /// Topology Data core::topology::TriangleData > d_triangleInfo; @@ -256,37 +256,37 @@ protected : int method; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData f_method; + sofa::core::objectmodel::lifecycle::RenamedData f_method; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData> f_poisson; + sofa::core::objectmodel::lifecycle::RenamedData> f_poisson; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData> f_young; + sofa::core::objectmodel::lifecycle::RenamedData> f_young; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData > > m_rotatedInitialElements; + sofa::core::objectmodel::lifecycle::RenamedData > > m_rotatedInitialElements; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData > m_initialTransformation; + sofa::core::objectmodel::lifecycle::RenamedData > m_initialTransformation; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData hosfordExponant; + sofa::core::objectmodel::lifecycle::RenamedData hosfordExponant; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData criteriaValue; + sofa::core::objectmodel::lifecycle::RenamedData criteriaValue; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData showStressValue; + sofa::core::objectmodel::lifecycle::RenamedData showStressValue; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData showStressVector; + sofa::core::objectmodel::lifecycle::RenamedData showStressVector; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData showFracturableTriangles; + sofa::core::objectmodel::lifecycle::RenamedData showFracturableTriangles; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_FEM_ELASTIC() - sofa::core::objectmodel::RenamedData f_computePrincipalStress; + sofa::core::objectmodel::lifecycle::RenamedData f_computePrincipalStress; Data d_method; ///< large: large displacements, small: small displacements diff --git a/Sofa/Component/SolidMechanics/FEM/Elastic/tests/BaseTetrahedronFEMForceField_test.h b/Sofa/Component/SolidMechanics/FEM/Elastic/tests/BaseTetrahedronFEMForceField_test.h index 7fbb0d13749..c5ed72d676e 100644 --- a/Sofa/Component/SolidMechanics/FEM/Elastic/tests/BaseTetrahedronFEMForceField_test.h +++ b/Sofa/Component/SolidMechanics/FEM/Elastic/tests/BaseTetrahedronFEMForceField_test.h @@ -64,12 +64,12 @@ class BaseTetrahedronFEMForceField_test : public sofa::testing::BaseTest public: - void SetUp() override + void doSetUp() override { m_simulation = sofa::simulation::getSimulation(); } - void TearDown() override + void doTearDown() override { if (m_root != nullptr) sofa::simulation::node::unload(m_root); @@ -93,10 +93,10 @@ class BaseTetrahedronFEMForceField_test : public sofa::testing::BaseTest simpleapi::createObject(m_root, "DefaultAnimationLoop"); simpleapi::createObject(m_root, "DefaultVisualManagerLoop"); - sofa::simpleapi::importPlugin("Sofa.Component.StateContainer"); - sofa::simpleapi::importPlugin("Sofa.Component.Topology.Container.Dynamic"); - sofa::simpleapi::importPlugin("Sofa.Component.SolidMechanics.FEM.Elastic"); - sofa::simpleapi::importPlugin("Sofa.Component.Mass"); + sofa::simpleapi::importPlugin(Sofa.Component.StateContainer); + sofa::simpleapi::importPlugin(Sofa.Component.Topology.Container.Dynamic); + sofa::simpleapi::importPlugin(Sofa.Component.SolidMechanics.FEM.Elastic); + sofa::simpleapi::importPlugin(Sofa.Component.Mass); simpleapi::createObject(m_root, "MechanicalObject", { {"template", dataTypeName}, {"position", "0 0 0 1 0 0 0 1 0 0 0 1"} }); simpleapi::createObject(m_root, "TetrahedronSetTopologyContainer", { {"tetrahedra","2 3 1 0"} }); @@ -122,16 +122,16 @@ class BaseTetrahedronFEMForceField_test : public sofa::testing::BaseTest simpleapi::createObject(m_root, "DefaultVisualManagerLoop"); - sofa::simpleapi::importPlugin("Sofa.Component.StateContainer"); - sofa::simpleapi::importPlugin("Sofa.Component.Topology.Container.Dynamic"); - sofa::simpleapi::importPlugin("Sofa.Component.SolidMechanics.FEM.Elastic"); - sofa::simpleapi::importPlugin("Sofa.Component.Mass"); - sofa::simpleapi::importPlugin("Sofa.Component.LinearSolver.Direct"); - sofa::simpleapi::importPlugin("Sofa.Component.ODESolver.Backward"); - sofa::simpleapi::importPlugin("Sofa.Component.Constraint.Lagrangian"); - sofa::simpleapi::importPlugin("Sofa.Component.Topology.Mapping"); - sofa::simpleapi::importPlugin("Sofa.Component.Engine.Select"); - sofa::simpleapi::importPlugin("Sofa.Component.Constraint.Projective"); + sofa::simpleapi::importPlugin(Sofa.Component.StateContainer); + sofa::simpleapi::importPlugin(Sofa.Component.Topology.Container.Dynamic); + sofa::simpleapi::importPlugin(Sofa.Component.SolidMechanics.FEM.Elastic); + sofa::simpleapi::importPlugin(Sofa.Component.Mass); + sofa::simpleapi::importPlugin(Sofa.Component.LinearSolver.Direct); + sofa::simpleapi::importPlugin(Sofa.Component.ODESolver.Backward); + sofa::simpleapi::importPlugin(Sofa.Component.Constraint.Lagrangian); + sofa::simpleapi::importPlugin(Sofa.Component.Topology.Mapping); + sofa::simpleapi::importPlugin(Sofa.Component.Engine.Select); + sofa::simpleapi::importPlugin(Sofa.Component.Constraint.Projective); simpleapi::createObject(m_root, "GenericConstraintSolver", { {"tolerance", "1e-3"}, {"maxIt", "1000"} }); @@ -195,7 +195,7 @@ class BaseTetrahedronFEMForceField_test : public sofa::testing::BaseTest simpleapi::createObject(m_root, "DefaultAnimationLoop"); simpleapi::createObject(m_root, "DefaultVisualManagerLoop"); - sofa::simpleapi::importPlugin("Sofa.Component.StateContainer"); + sofa::simpleapi::importPlugin(Sofa.Component.StateContainer); simpleapi::createObject(m_root, "MechanicalObject", { {"template","Vec3"}, {"position", "0 0 0 1 0 0 0 1 0 0 0 1"} }); addTetraFEMForceField(m_root, 100, 0.3, "large"); @@ -214,8 +214,8 @@ class BaseTetrahedronFEMForceField_test : public sofa::testing::BaseTest simpleapi::createObject(m_root, "DefaultAnimationLoop"); simpleapi::createObject(m_root, "DefaultVisualManagerLoop"); - sofa::simpleapi::importPlugin("Sofa.Component.StateContainer"); - sofa::simpleapi::importPlugin("Sofa.Component.Topology.Container.Dynamic"); + sofa::simpleapi::importPlugin(Sofa.Component.StateContainer); + sofa::simpleapi::importPlugin(Sofa.Component.Topology.Container.Dynamic); simpleapi::createObject(m_root, "MechanicalObject", { {"template","Vec3"} }); simpleapi::createObject(m_root, "TetrahedronSetTopologyContainer"); @@ -234,9 +234,9 @@ class BaseTetrahedronFEMForceField_test : public sofa::testing::BaseTest simpleapi::createObject(m_root, "DefaultAnimationLoop"); simpleapi::createObject(m_root, "DefaultVisualManagerLoop"); - sofa::simpleapi::importPlugin("Sofa.Component.StateContainer"); - sofa::simpleapi::importPlugin("Sofa.Component.Topology.Container.Dynamic"); - sofa::simpleapi::importPlugin("Sofa.Component.SolidMechanics.FEM.Elastic"); + sofa::simpleapi::importPlugin(Sofa.Component.StateContainer); + sofa::simpleapi::importPlugin(Sofa.Component.Topology.Container.Dynamic); + sofa::simpleapi::importPlugin(Sofa.Component.SolidMechanics.FEM.Elastic); simpleapi::createObject(m_root, "MechanicalObject", { {"template", dataTypeName}, {"position", "0 0 0 1 0 0 0 1 0 0 0 1"} }); simpleapi::createObject(m_root, "TetrahedronSetTopologyContainer", { {"tetrahedra","2 3 1 0"} }); diff --git a/Sofa/Component/SolidMechanics/FEM/Elastic/tests/BeamFEMForceField_test.cpp b/Sofa/Component/SolidMechanics/FEM/Elastic/tests/BeamFEMForceField_test.cpp index 78292aa26f6..7edff8e465e 100644 --- a/Sofa/Component/SolidMechanics/FEM/Elastic/tests/BeamFEMForceField_test.cpp +++ b/Sofa/Component/SolidMechanics/FEM/Elastic/tests/BeamFEMForceField_test.cpp @@ -66,13 +66,13 @@ class BeamFEMForceField_test : public BaseTest public: - void SetUp() override + void doSetUp() override { - sofa::simpleapi::importPlugin("Sofa.Component"); + sofa::simpleapi::importPlugin(Sofa.Component); m_simulation = sofa::simulation::getSimulation(); } - void TearDown() override + void doTearDown() override { if (m_root != nullptr) sofa::simulation::node::unload(m_root); diff --git a/Sofa/Component/SolidMechanics/FEM/Elastic/tests/TriangleFEMForceField_test.cpp b/Sofa/Component/SolidMechanics/FEM/Elastic/tests/TriangleFEMForceField_test.cpp index 9ec55cb14cb..2440c772962 100644 --- a/Sofa/Component/SolidMechanics/FEM/Elastic/tests/TriangleFEMForceField_test.cpp +++ b/Sofa/Component/SolidMechanics/FEM/Elastic/tests/TriangleFEMForceField_test.cpp @@ -79,12 +79,12 @@ class TriangleFEMForceField_test : public BaseTest public: - void SetUp() override + void doSetUp() override { m_simulation = sofa::simulation::getSimulation(); } - void TearDown() override + void doTearDown() override { if (m_root != nullptr) sofa::simulation::node::unload(m_root); @@ -97,10 +97,10 @@ class TriangleFEMForceField_test : public BaseTest createObject(m_root, "DefaultAnimationLoop"); createObject(m_root, "DefaultVisualManagerLoop"); - sofa::simpleapi::importPlugin("Sofa.Component.StateContainer"); - sofa::simpleapi::importPlugin("Sofa.Component.Topology.Container.Dynamic"); - sofa::simpleapi::importPlugin("Sofa.Component.SolidMechanics.FEM.Elastic"); - sofa::simpleapi::importPlugin("Sofa.Component.Mass"); + sofa::simpleapi::importPlugin(Sofa.Component.StateContainer); + sofa::simpleapi::importPlugin(Sofa.Component.Topology.Container.Dynamic); + sofa::simpleapi::importPlugin(Sofa.Component.SolidMechanics.FEM.Elastic); + sofa::simpleapi::importPlugin(Sofa.Component.Mass); createObject(m_root, "MechanicalObject", {{"template",dataTypeName}, {"position", "0 0 0 1 0 0 0 1 0 1 1 1"} }); createObject(m_root, "TriangleSetTopologyContainer", { {"triangles","0 1 2 1 3 2"} }); @@ -138,7 +138,7 @@ class TriangleFEMForceField_test : public BaseTest createObject(m_root, "DefaultAnimationLoop"); createObject(m_root, "DefaultVisualManagerLoop"); - sofa::simpleapi::importPlugin("Sofa.Component.Topology.Container.Grid"); + sofa::simpleapi::importPlugin(Sofa.Component.Topology.Container.Grid); createObject(m_root, "RegularGridTopology", { {"name", "grid"}, {"n", str(type::Vec3(nbrGrid, nbrGrid, 1))}, {"min", "0 0 0"}, {"max", "10 10 0"} }); @@ -175,12 +175,12 @@ class TriangleFEMForceField_test : public BaseTest { const Node::SPtr FEMNode = sofa::simpleapi::createChild(m_root, nodeName); - sofa::simpleapi::importPlugin("Sofa.Component.ODESolver.Backward"); - sofa::simpleapi::importPlugin("Sofa.Component.LinearSolver.Iterative"); - sofa::simpleapi::importPlugin("Sofa.Component.StateContainer"); - sofa::simpleapi::importPlugin("Sofa.Component.Topology.Container.Dynamic"); - sofa::simpleapi::importPlugin("Sofa.Component.Mass"); - sofa::simpleapi::importPlugin("Sofa.Component.Constraint.Projective"); + sofa::simpleapi::importPlugin(Sofa.Component.ODESolver.Backward); + sofa::simpleapi::importPlugin(Sofa.Component.LinearSolver.Iterative); + sofa::simpleapi::importPlugin(Sofa.Component.StateContainer); + sofa::simpleapi::importPlugin(Sofa.Component.Topology.Container.Dynamic); + sofa::simpleapi::importPlugin(Sofa.Component.Mass); + sofa::simpleapi::importPlugin(Sofa.Component.Constraint.Projective); createObject(FEMNode, "EulerImplicitSolver"); createObject(FEMNode, "CGLinearSolver", {{ "iterations", "20" }, { "tolerance", "1e-5" }, {"threshold", "1e-6"}}); @@ -259,8 +259,8 @@ class TriangleFEMForceField_test : public BaseTest createObject(m_root, "DefaultAnimationLoop"); createObject(m_root, "DefaultVisualManagerLoop"); - sofa::simpleapi::importPlugin("Sofa.Component.StateContainer"); - sofa::simpleapi::importPlugin("Sofa.Component.SolidMechanics.FEM.Elastic"); + sofa::simpleapi::importPlugin(Sofa.Component.StateContainer); + sofa::simpleapi::importPlugin(Sofa.Component.SolidMechanics.FEM.Elastic); createObject(m_root, "MechanicalObject", { {"template",dataTypeName}, {"position", "0 0 0 1 0 0 0 1 0"} }); if (FEMType == 0) // TriangleModel @@ -291,9 +291,9 @@ class TriangleFEMForceField_test : public BaseTest createObject(m_root, "DefaultAnimationLoop"); createObject(m_root, "DefaultVisualManagerLoop"); - sofa::simpleapi::importPlugin("Sofa.Component.StateContainer"); - sofa::simpleapi::importPlugin("Sofa.Component.Topology.Container.Dynamic"); - sofa::simpleapi::importPlugin("Sofa.Component.SolidMechanics.FEM.Elastic"); + sofa::simpleapi::importPlugin(Sofa.Component.StateContainer); + sofa::simpleapi::importPlugin(Sofa.Component.Topology.Container.Dynamic); + sofa::simpleapi::importPlugin(Sofa.Component.SolidMechanics.FEM.Elastic); createObject(m_root, "MechanicalObject", { {"template",dataTypeName} }); createObject(m_root, "TriangleSetTopologyContainer"); @@ -326,9 +326,9 @@ class TriangleFEMForceField_test : public BaseTest createObject(m_root, "DefaultAnimationLoop"); createObject(m_root, "DefaultVisualManagerLoop"); - sofa::simpleapi::importPlugin("Sofa.Component.StateContainer"); - sofa::simpleapi::importPlugin("Sofa.Component.Topology.Container.Dynamic"); - sofa::simpleapi::importPlugin("Sofa.Component.SolidMechanics.FEM.Elastic"); + sofa::simpleapi::importPlugin(Sofa.Component.StateContainer); + sofa::simpleapi::importPlugin(Sofa.Component.Topology.Container.Dynamic); + sofa::simpleapi::importPlugin(Sofa.Component.SolidMechanics.FEM.Elastic); createObject(m_root, "MechanicalObject", { {"template",dataTypeName}, {"position", "0 0 0 1 0 0 0 1 0"} }); createObject(m_root, "TriangleSetTopologyContainer", { {"triangles","0 1 2"} }); diff --git a/Sofa/Component/SolidMechanics/FEM/HyperElastic/tests/TetrahedronHyperelasticityFEMForceField_params_test.cpp b/Sofa/Component/SolidMechanics/FEM/HyperElastic/tests/TetrahedronHyperelasticityFEMForceField_params_test.cpp index 7845bbe38e8..055fb1a9279 100644 --- a/Sofa/Component/SolidMechanics/FEM/HyperElastic/tests/TetrahedronHyperelasticityFEMForceField_params_test.cpp +++ b/Sofa/Component/SolidMechanics/FEM/HyperElastic/tests/TetrahedronHyperelasticityFEMForceField_params_test.cpp @@ -74,7 +74,7 @@ struct TetrahedronHyperelasticityFEMForceField_params_test : public BaseSimulati unsigned char flags; ///< testing options. (all by default). To be used with precaution. /// } - void SetUp() override + void doSetUp() override { } diff --git a/Sofa/Component/SolidMechanics/FEM/HyperElastic/tests/TetrahedronHyperelasticityFEMForceField_scene_test.cpp b/Sofa/Component/SolidMechanics/FEM/HyperElastic/tests/TetrahedronHyperelasticityFEMForceField_scene_test.cpp index f68e680790f..5fa2c6b37e2 100644 --- a/Sofa/Component/SolidMechanics/FEM/HyperElastic/tests/TetrahedronHyperelasticityFEMForceField_scene_test.cpp +++ b/Sofa/Component/SolidMechanics/FEM/HyperElastic/tests/TetrahedronHyperelasticityFEMForceField_scene_test.cpp @@ -74,7 +74,7 @@ struct TetrahedronHyperelasticityFEMForceField_scene_test : public BaseSimulatio unsigned char flags; ///< testing options. (all by default). To be used with precaution. /// } - void SetUp() override + void doSetUp() override { } diff --git a/Sofa/Component/SolidMechanics/FEM/src/sofa/component/solidmechanics/fem/init.cpp b/Sofa/Component/SolidMechanics/FEM/src/sofa/component/solidmechanics/fem/init.cpp index 06c8c86b4fd..9e60a6ad828 100644 --- a/Sofa/Component/SolidMechanics/FEM/src/sofa/component/solidmechanics/fem/init.cpp +++ b/Sofa/Component/SolidMechanics/FEM/src/sofa/component/solidmechanics/fem/init.cpp @@ -27,6 +27,7 @@ #include #include +#include namespace sofa::component::solidmechanics::fem { @@ -55,9 +56,9 @@ const char* getModuleVersion() void registerObjects(sofa::core::ObjectFactory* factory) { - factory->registerObjectsFromPlugin("Sofa.Component.SolidMechanics.FEM.Elastic"); - factory->registerObjectsFromPlugin("Sofa.Component.SolidMechanics.FEM.HyperElastic"); - factory->registerObjectsFromPlugin("Sofa.Component.SolidMechanics.FEM.NonUniform"); + factory->registerObjectsFromPlugin(Sofa.Component.SolidMechanics.FEM.Elastic); + factory->registerObjectsFromPlugin(Sofa.Component.SolidMechanics.FEM.HyperElastic); + factory->registerObjectsFromPlugin(Sofa.Component.SolidMechanics.FEM.NonUniform); } void init() diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/AngularSpringForceField.h b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/AngularSpringForceField.h index cd5e969b749..54c20464e36 100644 --- a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/AngularSpringForceField.h +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/AngularSpringForceField.h @@ -28,7 +28,7 @@ #include #include -#include +#include namespace sofa::core::behavior @@ -67,19 +67,19 @@ class AngularSpringForceField : public core::behavior::ForceField typedef core::objectmodel::Data DataVecDeriv; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_SPRING() - sofa::core::objectmodel::RenamedData< type::vector< sofa::Index > > indices; + sofa::core::objectmodel::lifecycle::RenamedData< type::vector< sofa::Index > > indices; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_SPRING() - sofa::core::objectmodel::RenamedData angularStiffness; + sofa::core::objectmodel::lifecycle::RenamedData angularStiffness; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_SPRING() - sofa::core::objectmodel::RenamedData angularLimit; + sofa::core::objectmodel::lifecycle::RenamedData angularLimit; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_SPRING() - sofa::core::objectmodel::RenamedData drawSpring; + sofa::core::objectmodel::lifecycle::RenamedData drawSpring; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_SPRING() - sofa::core::objectmodel::RenamedData springColor; + sofa::core::objectmodel::lifecycle::RenamedData springColor; Data< type::vector< sofa::Index > > d_indices; ///< index of nodes controlled by the angular springs Data< VecReal > d_angularStiffness; ///< angular stiffness for the controlled nodes diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FrameSpringForceField.h b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FrameSpringForceField.h index 3677cf59b68..2e29259fc59 100644 --- a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FrameSpringForceField.h +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FrameSpringForceField.h @@ -29,7 +29,7 @@ #include #include -#include +#include namespace sofa::component::solidmechanics::spring { @@ -156,13 +156,13 @@ class FrameSpringForceField : public core::behavior::PairInteractionForceField > springs; + sofa::core::objectmodel::lifecycle::RenamedData > springs; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_SPRING() - sofa::core::objectmodel::RenamedData showLawfulTorsion; + sofa::core::objectmodel::lifecycle::RenamedData showLawfulTorsion; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_SPRING() - sofa::core::objectmodel::RenamedData showExtraTorsion; + sofa::core::objectmodel::lifecycle::RenamedData showExtraTorsion; SReal m_potentialEnergy; /// the list of the springs diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/GearSpringForceField.h b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/GearSpringForceField.h index de953fedabb..c555fc89d15 100644 --- a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/GearSpringForceField.h +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/GearSpringForceField.h @@ -31,7 +31,7 @@ #include #include -#include +#include namespace sofa::component::solidmechanics::spring { @@ -289,19 +289,19 @@ class GearSpringForceField : public core::behavior::PairInteractionForceField > springs; + sofa::core::objectmodel::lifecycle::RenamedData > springs; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_SPRING() sofa::core::objectmodel::DataFileName f_filename; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_SPRING() - sofa::core::objectmodel::RenamedData f_period; + sofa::core::objectmodel::lifecycle::RenamedData f_period; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_SPRING() - sofa::core::objectmodel::RenamedData f_reinit; + sofa::core::objectmodel::lifecycle::RenamedData f_reinit; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_SPRING() - sofa::core::objectmodel::RenamedData showFactorSize; + sofa::core::objectmodel::lifecycle::RenamedData showFactorSize; /// the list of the springs Data > d_springs; diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/JointSpringForceField.h b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/JointSpringForceField.h index c45e5fb5106..535bc3df98d 100644 --- a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/JointSpringForceField.h +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/JointSpringForceField.h @@ -25,7 +25,7 @@ #include #include -#include +#include namespace sofa::component::solidmechanics::spring { @@ -141,10 +141,10 @@ class JointSpringForceField : public core::behavior::PairInteractionForceField f_period; + sofa::core::objectmodel::lifecycle::RenamedData f_period; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_SPRING() - sofa::core::objectmodel::RenamedData f_reinit; + sofa::core::objectmodel::lifecycle::RenamedData f_reinit; sofa::core::objectmodel::DataFileName d_outfilename; ///< output file name sofa::core::objectmodel::DataFileName d_infilename; ///< input file containing constant joint force diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/QuadBendingSprings.h b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/QuadBendingSprings.h index aa121a98879..21059847a7c 100644 --- a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/QuadBendingSprings.h +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/QuadBendingSprings.h @@ -27,7 +27,7 @@ #include #include -#include +#include namespace sofa::component::solidmechanics::spring { @@ -47,7 +47,7 @@ class QuadBendingSprings : public SpringForceField typedef core::behavior::MechanicalState MechanicalState; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_SPRING() - sofa::core::objectmodel::RenamedData> localRange; + sofa::core::objectmodel::lifecycle::RenamedData> localRange; /// optional range of local DOF indices. Any computation involving only indices outside of this range are discarded (useful for parallelization using mesh partitioning) Data< type::Vec<2,int> > d_localRange; diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/RestShapeSpringsForceField.inl b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/RestShapeSpringsForceField.inl index c3fc5d30191..dd046de4d8c 100644 --- a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/RestShapeSpringsForceField.inl +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/RestShapeSpringsForceField.inl @@ -159,6 +159,7 @@ const typename RestShapeSpringsForceField::VecIndex& RestShapeSprings else { return this->d_indices.getValue(); + } } diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/TriangularBendingSprings.h b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/TriangularBendingSprings.h index b57362f1233..9940fd7add4 100644 --- a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/TriangularBendingSprings.h +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/TriangularBendingSprings.h @@ -28,7 +28,7 @@ #include #include -#include +#include namespace sofa::component::solidmechanics::spring { @@ -98,7 +98,7 @@ class TriangularBendingSprings : public core::behavior::ForceField } }; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_SPRING() - sofa::core::objectmodel::RenamedData> edgeInfo; + sofa::core::objectmodel::lifecycle::RenamedData> edgeInfo; sofa::core::topology::EdgeData > d_edgeInfo; ///< Internal edge data diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/TriangularBiquadraticSpringsForceField.h b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/TriangularBiquadraticSpringsForceField.h index b60ef5199cd..28fc16c2501 100644 --- a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/TriangularBiquadraticSpringsForceField.h +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/TriangularBiquadraticSpringsForceField.h @@ -29,7 +29,7 @@ #include #include -#include +#include namespace sofa::component::solidmechanics::spring { @@ -124,31 +124,31 @@ class TriangularBiquadraticSpringsForceField : public core::behavior::ForceField }; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_SPRING() - sofa::core::objectmodel::RenamedData > triangleInfo; + sofa::core::objectmodel::lifecycle::RenamedData > triangleInfo; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_SPRING() - sofa::core::objectmodel::RenamedData > edgeInfo; + sofa::core::objectmodel::lifecycle::RenamedData > edgeInfo; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_SPRING() - sofa::core::objectmodel::RenamedData _initialPoints; + sofa::core::objectmodel::lifecycle::RenamedData _initialPoints; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_SPRING() - sofa::core::objectmodel::RenamedData f_poissonRatio; + sofa::core::objectmodel::lifecycle::RenamedData f_poissonRatio; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_SPRING() - sofa::core::objectmodel::RenamedData f_youngModulus; + sofa::core::objectmodel::lifecycle::RenamedData f_youngModulus; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_SPRING() - sofa::core::objectmodel::RenamedData f_dampingRatio; + sofa::core::objectmodel::lifecycle::RenamedData f_dampingRatio; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_SPRING() - sofa::core::objectmodel::RenamedData f_useAngularSprings; + sofa::core::objectmodel::lifecycle::RenamedData f_useAngularSprings; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_SPRING() - sofa::core::objectmodel::RenamedData f_compressible; + sofa::core::objectmodel::lifecycle::RenamedData f_compressible; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_SPRING() - sofa::core::objectmodel::RenamedData f_stiffnessMatrixRegularizationWeight; + sofa::core::objectmodel::lifecycle::RenamedData f_stiffnessMatrixRegularizationWeight; diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/TriangularQuadraticSpringsForceField.h b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/TriangularQuadraticSpringsForceField.h index 998784e9994..9697d00e39b 100644 --- a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/TriangularQuadraticSpringsForceField.h +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/TriangularQuadraticSpringsForceField.h @@ -29,7 +29,7 @@ #include #include -#include +#include namespace sofa::component::solidmechanics::spring { @@ -116,19 +116,19 @@ class TriangularQuadraticSpringsForceField : public core::behavior::ForceField _initialPoints; + sofa::core::objectmodel::lifecycle::RenamedData _initialPoints; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_SPRING() - sofa::core::objectmodel::RenamedData f_poissonRatio; + sofa::core::objectmodel::lifecycle::RenamedData f_poissonRatio; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_SPRING() - sofa::core::objectmodel::RenamedData f_youngModulus; + sofa::core::objectmodel::lifecycle::RenamedData f_youngModulus; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_SPRING() - sofa::core::objectmodel::RenamedData f_dampingRatio; + sofa::core::objectmodel::lifecycle::RenamedData f_dampingRatio; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_SPRING() - sofa::core::objectmodel::RenamedData f_useAngularSprings; + sofa::core::objectmodel::lifecycle::RenamedData f_useAngularSprings; Data< VecCoord > d_initialPoints; ///< Initial Position @@ -205,10 +205,10 @@ class TriangularQuadraticSpringsForceField : public core::behavior::ForceField> triangleInfo; + sofa::core::objectmodel::lifecycle::RenamedData> triangleInfo; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_SPRING() - sofa::core::objectmodel::RenamedData > edgeInfo; + sofa::core::objectmodel::lifecycle::RenamedData > edgeInfo; sofa::core::topology::TriangleData > d_triangleInfo; ///< Internal triangle data sofa::core::topology::EdgeData > d_edgeInfo; ///< Internal edge data diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/VectorSpringForceField.h b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/VectorSpringForceField.h index c8f7660ca1e..03680f095eb 100644 --- a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/VectorSpringForceField.h +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/VectorSpringForceField.h @@ -31,7 +31,7 @@ #include #include -#include +#include namespace sofa::component::solidmechanics::spring { @@ -96,19 +96,19 @@ class VectorSpringForceField: public core::behavior::PairInteractionForceField > springArray; + sofa::core::objectmodel::lifecycle::RenamedData > springArray; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_SPRING() sofa::core::objectmodel::DataFileName m_filename; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_SPRING() - sofa::core::objectmodel::RenamedData m_stiffness; + sofa::core::objectmodel::lifecycle::RenamedData m_stiffness; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_SPRING() - sofa::core::objectmodel::RenamedData m_viscosity; + sofa::core::objectmodel::lifecycle::RenamedData m_viscosity; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_SPRING() - sofa::core::objectmodel::RenamedData m_useTopology; + sofa::core::objectmodel::lifecycle::RenamedData m_useTopology; /// where the springs information are stored diff --git a/Sofa/Component/SolidMechanics/Spring/tests/PolynomialRestShapeSpringsForceField_test.cpp b/Sofa/Component/SolidMechanics/Spring/tests/PolynomialRestShapeSpringsForceField_test.cpp index 0af527cfba3..3d987884321 100644 --- a/Sofa/Component/SolidMechanics/Spring/tests/PolynomialRestShapeSpringsForceField_test.cpp +++ b/Sofa/Component/SolidMechanics/Spring/tests/PolynomialRestShapeSpringsForceField_test.cpp @@ -42,9 +42,9 @@ class PolynomialRestShapeSpringsForceField_test : public BaseSimulationTest root->setGravity(Vec3(0.0,0.0,0.0)); root->setDt(dt); - sofa::simpleapi::importPlugin("Sofa.Component.ODESolver.Forward"); - sofa::simpleapi::importPlugin("Sofa.Component.StateContainer"); - sofa::simpleapi::importPlugin("Sofa.Component.SolidMechanics.Spring"); + sofa::simpleapi::importPlugin(Sofa.Component.ODESolver.Forward); + sofa::simpleapi::importPlugin(Sofa.Component.StateContainer); + sofa::simpleapi::importPlugin(Sofa.Component.SolidMechanics.Spring); const Node::SPtr childNode = sofa::simpleapi::createChild(root, "Particle"); sofa::simpleapi::createObject(childNode, "EulerExplicitSolver"); diff --git a/Sofa/Component/SolidMechanics/Spring/tests/RestShapeSpringsForceField_test.cpp b/Sofa/Component/SolidMechanics/Spring/tests/RestShapeSpringsForceField_test.cpp index 0a9c1f3bfe4..cc6d7bf5d39 100644 --- a/Sofa/Component/SolidMechanics/Spring/tests/RestShapeSpringsForceField_test.cpp +++ b/Sofa/Component/SolidMechanics/Spring/tests/RestShapeSpringsForceField_test.cpp @@ -58,10 +58,10 @@ sofa::simulation::Node::SPtr RestSpringsForceField_test::createScene(const std:: { const auto theSimulation = createSimulation(); auto theRoot = createRootNode(theSimulation, "root"); - sofa::simpleapi::importPlugin("Sofa.Component.ODESolver.Backward"); - sofa::simpleapi::importPlugin("Sofa.Component.LinearSolver.Iterative"); - sofa::simpleapi::importPlugin("Sofa.Component.StateContainer"); - sofa::simpleapi::importPlugin("Sofa.Component.Mass"); + sofa::simpleapi::importPlugin(Sofa.Component.ODESolver.Backward); + sofa::simpleapi::importPlugin(Sofa.Component.LinearSolver.Iterative); + sofa::simpleapi::importPlugin(Sofa.Component.StateContainer); + sofa::simpleapi::importPlugin(Sofa.Component.Mass); createObject(theRoot, "DefaultAnimationLoop"); createObject(theRoot, "EulerImplicitSolver"); diff --git a/Sofa/Component/SolidMechanics/Spring/tests/TriangularBendingSprings_test.cpp b/Sofa/Component/SolidMechanics/Spring/tests/TriangularBendingSprings_test.cpp index 0149f6d8c1c..5288e64ee48 100644 --- a/Sofa/Component/SolidMechanics/Spring/tests/TriangularBendingSprings_test.cpp +++ b/Sofa/Component/SolidMechanics/Spring/tests/TriangularBendingSprings_test.cpp @@ -67,14 +67,14 @@ class TriangularBendingSprings_test : public BaseTest public: - void SetUp() override + void doSetUp() override { m_simulation = sofa::simulation::getSimulation(); - sofa::simpleapi::importPlugin("Sofa.Component.Topology.Container.Dynamic"); - sofa::simpleapi::importPlugin("Sofa.Component.Topology.Container.Grid"); + sofa::simpleapi::importPlugin(Sofa.Component.Topology.Container.Dynamic); + sofa::simpleapi::importPlugin(Sofa.Component.Topology.Container.Grid); } - void TearDown() override + void doTearDown() override { if (m_root != nullptr) sofa::simulation::node::unload(m_root); diff --git a/Sofa/Component/SolidMechanics/TensorMass/src/sofa/component/solidmechanics/tensormass/TetrahedralTensorMassForceField.h b/Sofa/Component/SolidMechanics/TensorMass/src/sofa/component/solidmechanics/tensormass/TetrahedralTensorMassForceField.h index 4734b3db415..32b23bff853 100644 --- a/Sofa/Component/SolidMechanics/TensorMass/src/sofa/component/solidmechanics/tensormass/TetrahedralTensorMassForceField.h +++ b/Sofa/Component/SolidMechanics/TensorMass/src/sofa/component/solidmechanics/tensormass/TetrahedralTensorMassForceField.h @@ -33,7 +33,7 @@ #include #include -#include +#include namespace sofa::component::solidmechanics::tensormass { @@ -89,10 +89,10 @@ class TetrahedralTensorMassForceField : public core::behavior::ForceField f_poissonRatio; + sofa::core::objectmodel::lifecycle::RenamedData f_poissonRatio; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_TENSORMASS() - sofa::core::objectmodel::RenamedData f_youngModulus; + sofa::core::objectmodel::lifecycle::RenamedData f_youngModulus; Data d_poissonRatio; ///< Poisson ratio in Hooke's law Data d_youngModulus; ///< Young's modulus in Hooke's law @@ -166,7 +166,7 @@ class TetrahedralTensorMassForceField : public core::behavior::ForceField edgeInfo; + sofa::core::objectmodel::lifecycle::RenamedData edgeInfo; core::topology::EdgeData < edgeRestInfoVector > d_edgeInfo; ///< Internal edge data diff --git a/Sofa/Component/SolidMechanics/TensorMass/src/sofa/component/solidmechanics/tensormass/TriangularTensorMassForceField.h b/Sofa/Component/SolidMechanics/TensorMass/src/sofa/component/solidmechanics/tensormass/TriangularTensorMassForceField.h index 8593d337670..7612409982e 100644 --- a/Sofa/Component/SolidMechanics/TensorMass/src/sofa/component/solidmechanics/tensormass/TriangularTensorMassForceField.h +++ b/Sofa/Component/SolidMechanics/TensorMass/src/sofa/component/solidmechanics/tensormass/TriangularTensorMassForceField.h @@ -29,7 +29,7 @@ #include #include -#include +#include namespace sofa::component::solidmechanics::tensormass { @@ -91,7 +91,7 @@ class TriangularTensorMassForceField : public core::behavior::ForceField> edgeInfo; + sofa::core::objectmodel::lifecycle::RenamedData > edgeInfo; sofa::core::topology::EdgeData > d_edgeInfo; ///< Internal edge data @@ -124,10 +124,10 @@ class TriangularTensorMassForceField : public core::behavior::ForceField f_poissonRatio; + sofa::core::objectmodel::lifecycle::RenamedData f_poissonRatio; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_SOLIDMECHANICS_TENSORMASS() - sofa::core::objectmodel::RenamedData f_youngModulus; + sofa::core::objectmodel::lifecycle::RenamedData f_youngModulus; Data d_poissonRatio; ///< Poisson ratio in Hooke's law Data d_youngModulus; ///< Young's modulus in Hooke's law diff --git a/Sofa/Component/SolidMechanics/simutests/AffinePatch_test.cpp b/Sofa/Component/SolidMechanics/simutests/AffinePatch_test.cpp index 270088dbaca..baa7a16efde 100644 --- a/Sofa/Component/SolidMechanics/simutests/AffinePatch_test.cpp +++ b/Sofa/Component/SolidMechanics/simutests/AffinePatch_test.cpp @@ -80,7 +80,7 @@ struct AffinePatch_sofa_test : public sofa::testing::BaseSimulationTest, sofa::t Coord testedTranslation; /// Create the context for the scene - void SetUp() override + void doSetUp() override { // Init simulation simulation = sofa::simulation::getSimulation(); diff --git a/Sofa/Component/SolidMechanics/simutests/LinearElasticity_test.cpp b/Sofa/Component/SolidMechanics/simutests/LinearElasticity_test.cpp index 6202204e7e1..3db4e9cc08c 100644 --- a/Sofa/Component/SolidMechanics/simutests/LinearElasticity_test.cpp +++ b/Sofa/Component/SolidMechanics/simutests/LinearElasticity_test.cpp @@ -196,7 +196,7 @@ struct LinearElasticity_test : public sofa::testing::BaseSimulationTest, sofa::t // Create the context for the scene - void SetUp() override + void doSetUp() override { // Init simulation simulation = sofa::simulation::getSimulation(); @@ -281,7 +281,7 @@ struct LinearElasticity_test : public sofa::testing::BaseSimulationTest, sofa::t } return true; } - void TearDown() override + void doTearDown() override { if (tractionStruct.root!=nullptr) sofa::simulation::node::unload(tractionStruct.root); diff --git a/Sofa/Component/SolidMechanics/src/sofa/component/solidmechanics/init.cpp b/Sofa/Component/SolidMechanics/src/sofa/component/solidmechanics/init.cpp index a35ec25d9d9..8638bbdb020 100644 --- a/Sofa/Component/SolidMechanics/src/sofa/component/solidmechanics/init.cpp +++ b/Sofa/Component/SolidMechanics/src/sofa/component/solidmechanics/init.cpp @@ -27,6 +27,7 @@ #include #include +#include namespace sofa::component::solidmechanics { @@ -55,9 +56,9 @@ const char* getModuleVersion() void registerObjects(sofa::core::ObjectFactory* factory) { - factory->registerObjectsFromPlugin("Sofa.Component.SolidMechanics.FEM"); - factory->registerObjectsFromPlugin("Sofa.Component.SolidMechanics.Spring"); - factory->registerObjectsFromPlugin("Sofa.Component.SolidMechanics.TensorMass"); + factory->registerObjectsFromPlugin(Sofa.Component.SolidMechanics.FEM); + factory->registerObjectsFromPlugin(Sofa.Component.SolidMechanics.Spring); + factory->registerObjectsFromPlugin(Sofa.Component.SolidMechanics.TensorMass); } void init() diff --git a/Sofa/Component/StateContainer/src/sofa/component/statecontainer/MappedObject.h b/Sofa/Component/StateContainer/src/sofa/component/statecontainer/MappedObject.h index 1d96f21d115..c9de6e7431e 100644 --- a/Sofa/Component/StateContainer/src/sofa/component/statecontainer/MappedObject.h +++ b/Sofa/Component/StateContainer/src/sofa/component/statecontainer/MappedObject.h @@ -26,7 +26,7 @@ #include #include -#include +#include namespace sofa::component::statecontainer { @@ -65,10 +65,10 @@ class MappedObject : public core::State void init() override; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_STATECONTAINER() - sofa::core::objectmodel::RenamedData f_X; + sofa::core::objectmodel::lifecycle::RenamedData f_X; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_STATECONTAINER() - sofa::core::objectmodel::RenamedData f_V; + sofa::core::objectmodel::lifecycle::RenamedData f_V; Data d_X; ///< position vector Data d_V; ///< velocity vector diff --git a/Sofa/Component/Topology/Container/Constant/src/sofa/component/topology/container/constant/CubeTopology.h b/Sofa/Component/Topology/Container/Constant/src/sofa/component/topology/container/constant/CubeTopology.h index ebfc4f3b25c..8a9d87bf9eb 100644 --- a/Sofa/Component/Topology/Container/Constant/src/sofa/component/topology/container/constant/CubeTopology.h +++ b/Sofa/Component/Topology/Container/Constant/src/sofa/component/topology/container/constant/CubeTopology.h @@ -24,7 +24,7 @@ #include -#include +#include namespace sofa::component::topology::container::constant { @@ -97,25 +97,25 @@ class SOFA_COMPONENT_TOPOLOGY_CONTAINER_CONSTANT_API CubeTopology : public MeshT protected: SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_CONSTANT() - sofa::core::objectmodel::RenamedData nx; + sofa::core::objectmodel::lifecycle::RenamedData nx; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_CONSTANT() - sofa::core::objectmodel::RenamedData ny; + sofa::core::objectmodel::lifecycle::RenamedData ny; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_CONSTANT() - sofa::core::objectmodel::RenamedData nz; + sofa::core::objectmodel::lifecycle::RenamedData nz; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_CONSTANT() - sofa::core::objectmodel::RenamedData internalPoints; + sofa::core::objectmodel::lifecycle::RenamedData internalPoints; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_CONSTANT() - sofa::core::objectmodel::RenamedData splitNormals; + sofa::core::objectmodel::lifecycle::RenamedData splitNormals; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_CONSTANT() - sofa::core::objectmodel::RenamedData min; + sofa::core::objectmodel::lifecycle::RenamedData min; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_CONSTANT() - sofa::core::objectmodel::RenamedData max; + sofa::core::objectmodel::lifecycle::RenamedData max; Data d_nx; ///< x grid resolution diff --git a/Sofa/Component/Topology/Container/Constant/src/sofa/component/topology/container/constant/MeshTopology.cpp b/Sofa/Component/Topology/Container/Constant/src/sofa/component/topology/container/constant/MeshTopology.cpp index 5ae461075e0..d41efbaed97 100644 --- a/Sofa/Component/Topology/Container/Constant/src/sofa/component/topology/container/constant/MeshTopology.cpp +++ b/Sofa/Component/Topology/Container/Constant/src/sofa/component/topology/container/constant/MeshTopology.cpp @@ -492,6 +492,7 @@ MeshTopology::MeshTopology() , d_seqTetrahedra(initData(&d_seqTetrahedra, "tetrahedra", "List of tetrahedron indices")) , d_seqHexahedra(initData(&d_seqHexahedra, "hexahedra", "List of hexahedron indices")) , d_seqUVs(initData(&d_seqUVs, "uv", "List of uv coordinates")) + , d_computeAllBuffers(initData(&d_computeAllBuffers, false, "computeAllBuffers", "Option to compute all crossed topology buffers at init. False by default")) , nbPoints(0) , validTetrahedra(false), validHexahedra(false) , revision(0) @@ -524,7 +525,6 @@ MeshTopology::MeshTopology() void MeshTopology::init() { - BaseMeshTopology::init(); const auto hexahedra = sofa::helper::getReadAccessor(d_seqHexahedra); @@ -533,7 +533,6 @@ void MeshTopology::init() const auto triangles = sofa::helper::getReadAccessor(d_seqTriangles); const auto edges = sofa::helper::getReadAccessor(d_seqEdges); - // looking for upper topology if (!hexahedra.empty()) m_upperElementType = geometry::ElementType::HEXAHEDRON; @@ -548,6 +547,11 @@ void MeshTopology::init() else m_upperElementType = sofa::geometry::ElementType::POINT; + // If true, will compute all crossed element buffers such as triangleAroundEdges, EdgesIntriangle, etc. + if (d_computeAllBuffers.getValue()) + { + computeCrossElementBuffers(); + } // compute the number of points, if the topology is charged from the scene or if it was loaded from a MeshLoader without any points data. if (nbPoints==0) @@ -576,6 +580,7 @@ void MeshTopology::init() nbPoints = n; } + if(edges.empty() ) { if(d_seqEdges.getParent() != nullptr ) @@ -608,6 +613,72 @@ void MeshTopology::init() } } +void MeshTopology::computeCrossElementBuffers() +{ + const auto hexahedra = sofa::helper::getReadAccessor(d_seqHexahedra); + const auto tetrahedra = sofa::helper::getReadAccessor(d_seqTetrahedra); + const auto quads = sofa::helper::getReadAccessor(d_seqQuads); + const auto triangles = sofa::helper::getReadAccessor(d_seqTriangles); + const auto edges = sofa::helper::getReadAccessor(d_seqEdges); + + if (!hexahedra.empty()) // Create hexahedron cross element buffers. + { + createHexahedraAroundVertexArray(); + + if (!quads.empty()) + { + createQuadsInHexahedronArray(); + createHexahedraAroundQuadArray(); + } + + if (!edges.empty()) + { + createEdgesInHexahedronArray(); + createHexahedraAroundEdgeArray(); + } + } + if (!tetrahedra.empty()) // Create tetrahedron cross element buffers. + { + createTetrahedraAroundVertexArray(); + + if (!triangles.empty()) + { + createTrianglesInTetrahedronArray(); + createTetrahedraAroundTriangleArray(); + } + + if (!edges.empty()) + { + createEdgesInTetrahedronArray(); + createTetrahedraAroundEdgeArray(); + } + } + if (!quads.empty()) // Create triangle cross element buffers. + { + createQuadsAroundVertexArray(); + + if (!edges.empty()) + { + createEdgesInQuadArray(); + createQuadsAroundEdgeArray(); + } + } + if (!triangles.empty()) // Create triangle cross element buffers. + { + createTrianglesAroundVertexArray(); + + if (!edges.empty()) + { + createEdgesInTriangleArray(); + createTrianglesAroundEdgeArray(); + } + } + if (!edges.empty()) + { + createEdgesAroundVertexArray(); + } +} + void MeshTopology::clear() { nbPoints = 0; diff --git a/Sofa/Component/Topology/Container/Constant/src/sofa/component/topology/container/constant/MeshTopology.h b/Sofa/Component/Topology/Container/Constant/src/sofa/component/topology/container/constant/MeshTopology.h index d4b0d37e717..ffab38c37f3 100644 --- a/Sofa/Component/Topology/Container/Constant/src/sofa/component/topology/container/constant/MeshTopology.h +++ b/Sofa/Component/Topology/Container/Constant/src/sofa/component/topology/container/constant/MeshTopology.h @@ -27,7 +27,7 @@ #include #include -#include +#include namespace sofa::component::topology::container::constant { @@ -86,6 +86,9 @@ class SOFA_COMPONENT_TOPOLOGY_CONTAINER_CONSTANT_API MeshTopology : public core: public: void init() override; + /// Method called by component Init method. Will create all the topology buffers + void computeCrossElementBuffers() override; + Size getNbPoints() const override; void setNbPoints(Size n) override; @@ -306,40 +309,40 @@ class SOFA_COMPONENT_TOPOLOGY_CONTAINER_CONSTANT_API MeshTopology : public core: typedef type::vector SeqPoints; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_CONSTANT() - sofa::core::objectmodel::RenamedData< SeqPoints > seqPoints; + sofa::core::objectmodel::lifecycle::RenamedData< SeqPoints > seqPoints; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_CONSTANT() - sofa::core::objectmodel::RenamedData seqEdges; + sofa::core::objectmodel::lifecycle::RenamedData seqEdges; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_CONSTANT() - sofa::core::objectmodel::RenamedData seqTriangles; + sofa::core::objectmodel::lifecycle::RenamedData seqTriangles; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_CONSTANT() - sofa::core::objectmodel::RenamedData seqQuads; + sofa::core::objectmodel::lifecycle::RenamedData seqQuads; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_CONSTANT() - sofa::core::objectmodel::RenamedData seqTetrahedra; + sofa::core::objectmodel::lifecycle::RenamedData seqTetrahedra; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_CONSTANT() - sofa::core::objectmodel::RenamedData seqHexahedra; + sofa::core::objectmodel::lifecycle::RenamedData seqHexahedra; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_CONSTANT() - sofa::core::objectmodel::RenamedData seqUVs; + sofa::core::objectmodel::lifecycle::RenamedData seqUVs; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_CONSTANT() - sofa::core::objectmodel::RenamedData _drawEdges; + sofa::core::objectmodel::lifecycle::RenamedData _drawEdges; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_CONSTANT() - sofa::core::objectmodel::RenamedData _drawTriangles; + sofa::core::objectmodel::lifecycle::RenamedData _drawTriangles; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_CONSTANT() - sofa::core::objectmodel::RenamedData _drawQuads; + sofa::core::objectmodel::lifecycle::RenamedData _drawQuads; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_CONSTANT() - sofa::core::objectmodel::RenamedData _drawTetra; + sofa::core::objectmodel::lifecycle::RenamedData _drawTetra; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_CONSTANT() - sofa::core::objectmodel::RenamedData _drawHexa; + sofa::core::objectmodel::lifecycle::RenamedData _drawHexa; Data< SeqPoints > d_seqPoints; ///< List of point positions Data d_seqEdges; ///< List of edge indices @@ -348,6 +351,7 @@ class SOFA_COMPONENT_TOPOLOGY_CONTAINER_CONSTANT_API MeshTopology : public core: Data d_seqTetrahedra; ///< List of tetrahedron indices Data d_seqHexahedra; ///< List of hexahedron indices Data d_seqUVs; ///< List of uv coordinates + Data d_computeAllBuffers; ///< Option to call method computeCrossElementBuffers. False by default protected: Size nbPoints; diff --git a/Sofa/Component/Topology/Container/Constant/src/sofa/component/topology/container/constant/SphereQuadTopology.h b/Sofa/Component/Topology/Container/Constant/src/sofa/component/topology/container/constant/SphereQuadTopology.h index d8521b50088..aef14d72cb9 100644 --- a/Sofa/Component/Topology/Container/Constant/src/sofa/component/topology/container/constant/SphereQuadTopology.h +++ b/Sofa/Component/Topology/Container/Constant/src/sofa/component/topology/container/constant/SphereQuadTopology.h @@ -22,7 +22,7 @@ #pragma once #include -#include +#include namespace sofa::component::topology::container::constant { @@ -42,10 +42,10 @@ class SOFA_COMPONENT_TOPOLOGY_CONTAINER_CONSTANT_API SphereQuadTopology : public protected: SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_CONSTANT() - sofa::core::objectmodel::RenamedData< Vec3 > center; + sofa::core::objectmodel::lifecycle::RenamedData< Vec3 > center; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_CONSTANT() - sofa::core::objectmodel::RenamedData< SReal > radius; + sofa::core::objectmodel::lifecycle::RenamedData< SReal > radius; Data< Vec3 > d_center; ///< Center of the sphere diff --git a/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/DynamicSparseGridTopologyContainer.h b/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/DynamicSparseGridTopologyContainer.h index 6c3fdd28a7f..2c8ad019160 100644 --- a/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/DynamicSparseGridTopologyContainer.h +++ b/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/DynamicSparseGridTopologyContainer.h @@ -28,7 +28,7 @@ #include #include -#include +#include namespace sofa::component::topology::container::dynamic { @@ -46,22 +46,22 @@ class SOFA_COMPONENT_TOPOLOGY_CONTAINER_DYNAMIC_API DynamicSparseGridTopologyCon typedef QuadsInHexahedron QuadsInHexahedron; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_DYNAMIC() - sofa::core::objectmodel::RenamedData resolution; + sofa::core::objectmodel::lifecycle::RenamedData resolution; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_DYNAMIC() - sofa::core::objectmodel::RenamedData< sofa::type::vector > valuesIndexedInRegularGrid; + sofa::core::objectmodel::lifecycle::RenamedData< sofa::type::vector > valuesIndexedInRegularGrid; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_DYNAMIC() - sofa::core::objectmodel::RenamedData< sofa::type::vector > valuesIndexedInTopology; ///< values indexed in the topology + sofa::core::objectmodel::lifecycle::RenamedData< sofa::type::vector > valuesIndexedInTopology; ///< values indexed in the topology SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_DYNAMIC() - sofa::core::objectmodel::RenamedData< sofa::type::vector > idxInRegularGrid; + sofa::core::objectmodel::lifecycle::RenamedData< sofa::type::vector > idxInRegularGrid; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_DYNAMIC() - sofa::core::objectmodel::RenamedData< std::map< unsigned int, BaseMeshTopology::HexaID> > idInRegularGrid2IndexInTopo; + sofa::core::objectmodel::lifecycle::RenamedData< std::map< unsigned int, BaseMeshTopology::HexaID> > idInRegularGrid2IndexInTopo; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_DYNAMIC() - sofa::core::objectmodel::RenamedData< type::Vec3 > voxelSize; + sofa::core::objectmodel::lifecycle::RenamedData< type::Vec3 > voxelSize; Data d_resolution; ///< voxel grid resolution diff --git a/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/EdgeSetTopologyContainer.cpp b/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/EdgeSetTopologyContainer.cpp index 15ddadbc529..4e212ff7696 100644 --- a/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/EdgeSetTopologyContainer.cpp +++ b/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/EdgeSetTopologyContainer.cpp @@ -77,10 +77,10 @@ void EdgeSetTopologyContainer::init() // only init if edges are present at init. if (!m_edge.empty()) - initTopology(); + computeCrossElementBuffers(); } -void EdgeSetTopologyContainer::initTopology() +void EdgeSetTopologyContainer::computeCrossElementBuffers() { // force computation of neighborhood elements createEdgesAroundVertexArray(); diff --git a/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/EdgeSetTopologyContainer.h b/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/EdgeSetTopologyContainer.h index 2cf809bbe3a..7749c66f00d 100644 --- a/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/EdgeSetTopologyContainer.h +++ b/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/EdgeSetTopologyContainer.h @@ -24,7 +24,7 @@ #include -#include +#include namespace sofa::component::topology::container::dynamic { @@ -100,7 +100,7 @@ class SOFA_COMPONENT_TOPOLOGY_CONTAINER_DYNAMIC_API EdgeSetTopologyContainer : p /// Dynamic Topology API /// @{ /// Method called by component Init method. Will create all the topology neighborhood buffers. - void initTopology(); + void computeCrossElementBuffers() override; /** \brief Checks if the topology is coherent * @@ -228,7 +228,7 @@ class SOFA_COMPONENT_TOPOLOGY_CONTAINER_DYNAMIC_API EdgeSetTopologyContainer : p public: /** The array that stores the set of edges in the edge set */ SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_DYNAMIC() - sofa::core::objectmodel::RenamedData m_checkConnexity; + sofa::core::objectmodel::lifecycle::RenamedData m_checkConnexity; Data< sofa::type::vector > d_edge; ///< List of edge indices diff --git a/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/HexahedronSetTopologyContainer.cpp b/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/HexahedronSetTopologyContainer.cpp index b8fb2b1c268..554a87f9352 100644 --- a/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/HexahedronSetTopologyContainer.cpp +++ b/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/HexahedronSetTopologyContainer.cpp @@ -83,12 +83,12 @@ void HexahedronSetTopologyContainer::init() } if (!m_hexahedron.empty()) - initTopology(); + computeCrossElementBuffers(); } -void HexahedronSetTopologyContainer::initTopology() +void HexahedronSetTopologyContainer::computeCrossElementBuffers() { - QuadSetTopologyContainer::initTopology(); + QuadSetTopologyContainer::computeCrossElementBuffers(); // Create tetrahedron cross element buffers. createQuadsInHexahedronArray(); diff --git a/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/HexahedronSetTopologyContainer.h b/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/HexahedronSetTopologyContainer.h index 65238e957a2..9bb8f012910 100644 --- a/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/HexahedronSetTopologyContainer.h +++ b/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/HexahedronSetTopologyContainer.h @@ -222,8 +222,8 @@ class SOFA_COMPONENT_TOPOLOGY_CONTAINER_DYNAMIC_API HexahedronSetTopologyContain /// Dynamic Topology API /// @{ - /// Method called by component Init method. Will create all the topology neighborhood buffers and call @see TriangleSetTopologyContainer::initTopology() - void initTopology(); + /// Method called by component Init method. Will create all the topology neighboorhood buffers and call @see QuadSetTopologyContainer::computeCrossElementBuffers() + void computeCrossElementBuffers() override; /** \brief Checks if the topology is coherent * diff --git a/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/PointSetTopologyContainer.h b/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/PointSetTopologyContainer.h index 6ffe3fa0952..f5c28d9b37c 100644 --- a/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/PointSetTopologyContainer.h +++ b/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/PointSetTopologyContainer.h @@ -26,7 +26,7 @@ #include #include -#include +#include namespace sofa::component::topology::container::dynamic { @@ -160,7 +160,7 @@ class SOFA_COMPONENT_TOPOLOGY_CONTAINER_DYNAMIC_API PointSetTopologyContainer : private: SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_DYNAMIC() - sofa::core::objectmodel::RenamedData nbPoints; + sofa::core::objectmodel::lifecycle::RenamedData nbPoints; Data d_nbPoints; ///< Number of points }; diff --git a/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/QuadSetTopologyContainer.cpp b/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/QuadSetTopologyContainer.cpp index b9434772f7f..d861dfc5ea2 100644 --- a/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/QuadSetTopologyContainer.cpp +++ b/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/QuadSetTopologyContainer.cpp @@ -72,13 +72,13 @@ void QuadSetTopologyContainer::init() // only init if triangles are present at init. if (!m_quads.empty()) - initTopology(); + computeCrossElementBuffers(); } -void QuadSetTopologyContainer::initTopology() +void QuadSetTopologyContainer::computeCrossElementBuffers() { // Force creation of Edge Neighborhood buffers. - EdgeSetTopologyContainer::initTopology(); + EdgeSetTopologyContainer::computeCrossElementBuffers(); // Create triangle cross element buffers. createEdgesInQuadArray(); diff --git a/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/QuadSetTopologyContainer.h b/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/QuadSetTopologyContainer.h index 54a78981e3a..58efedcc105 100644 --- a/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/QuadSetTopologyContainer.h +++ b/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/QuadSetTopologyContainer.h @@ -144,8 +144,8 @@ class SOFA_COMPONENT_TOPOLOGY_CONTAINER_DYNAMIC_API QuadSetTopologyContainer : p /// Dynamic Topology API /// @{ - /// Method called by component Init method. Will create all the topology neighborhood buffers and call @see EdgeSetTopologyContainer::initTopology() - void initTopology(); + /// Method called by component Init method. Will create all the topology neighboorhood buffers and call @see EdgeSetTopologyContainer::computeCrossElementBuffers() + void computeCrossElementBuffers() override; /** \brief Checks if the topology is coherent * diff --git a/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/TetrahedronSetTopologyContainer.cpp b/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/TetrahedronSetTopologyContainer.cpp index d8fbe58adcd..5ad91e53519 100644 --- a/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/TetrahedronSetTopologyContainer.cpp +++ b/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/TetrahedronSetTopologyContainer.cpp @@ -79,12 +79,12 @@ void TetrahedronSetTopologyContainer::init() } if (!m_tetrahedron.empty()) - initTopology(); + computeCrossElementBuffers(); } -void TetrahedronSetTopologyContainer::initTopology() +void TetrahedronSetTopologyContainer::computeCrossElementBuffers() { - TriangleSetTopologyContainer::initTopology(); + TriangleSetTopologyContainer::computeCrossElementBuffers(); // Create tetrahedron cross element buffers. createTrianglesInTetrahedronArray(); diff --git a/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/TetrahedronSetTopologyContainer.h b/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/TetrahedronSetTopologyContainer.h index 089d3e6f7f2..2376324fbb2 100644 --- a/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/TetrahedronSetTopologyContainer.h +++ b/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/TetrahedronSetTopologyContainer.h @@ -193,8 +193,8 @@ class SOFA_COMPONENT_TOPOLOGY_CONTAINER_DYNAMIC_API TetrahedronSetTopologyContai /// Dynamic Topology API /// @{ - /// Method called by component Init method. Will create all the topology neighborhood buffers and call @see TriangleSetTopologyContainer::initTopology() - void initTopology(); + /// Method called by component Init method. Will create all the topology neighboorhood buffers and call @see TriangleSetTopologyContainer::computeCrossElementBuffers() + void computeCrossElementBuffers() override; /** \brief Checks if the topology is coherent * diff --git a/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/TriangleSetTopologyContainer.cpp b/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/TriangleSetTopologyContainer.cpp index cfc69119e8c..577727a1c01 100644 --- a/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/TriangleSetTopologyContainer.cpp +++ b/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/TriangleSetTopologyContainer.cpp @@ -73,13 +73,13 @@ void TriangleSetTopologyContainer::init() // only init if triangles are present at init. if (!m_triangle.empty()) - initTopology(); + computeCrossElementBuffers(); } -void TriangleSetTopologyContainer::initTopology() +void TriangleSetTopologyContainer::computeCrossElementBuffers() { // Force creation of Edge Neighborhood buffers. - EdgeSetTopologyContainer::initTopology(); + EdgeSetTopologyContainer::computeCrossElementBuffers(); // Create triangle cross element buffers. createEdgesInTriangleArray(); diff --git a/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/TriangleSetTopologyContainer.h b/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/TriangleSetTopologyContainer.h index 8c41f4a5ecd..ba0bfa3c8f9 100644 --- a/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/TriangleSetTopologyContainer.h +++ b/Sofa/Component/Topology/Container/Dynamic/src/sofa/component/topology/container/dynamic/TriangleSetTopologyContainer.h @@ -151,8 +151,8 @@ class SOFA_COMPONENT_TOPOLOGY_CONTAINER_DYNAMIC_API TriangleSetTopologyContainer /// Dynamic Topology API /// @{ - /// Method called by component Init method. Will create all the topology neighborhood buffers and call @see EdgeSetTopologyContainer::initTopology() - void initTopology(); + /// Method called by component Init method. Will create all the topology neighboorhood buffers and call @see EdgeSetTopologyContainer::computeCrossElementBuffers() + void computeCrossElementBuffers() override; /** \brief Checks if the topology is coherent * diff --git a/Sofa/Component/Topology/Container/Dynamic/tests/TetrahedronNumericalIntegration_test.cpp b/Sofa/Component/Topology/Container/Dynamic/tests/TetrahedronNumericalIntegration_test.cpp index 19c4cde4a41..c172e8c740e 100644 --- a/Sofa/Component/Topology/Container/Dynamic/tests/TetrahedronNumericalIntegration_test.cpp +++ b/Sofa/Component/Topology/Container/Dynamic/tests/TetrahedronNumericalIntegration_test.cpp @@ -63,7 +63,7 @@ struct TetrahedronNumericalIntegration_test : public NumericTest::SPtr geo; // Create the context for the scene - void SetUp() override + void doSetUp() override { // Init simulation simulation = sofa::simulation::getSimulation(); @@ -135,7 +135,7 @@ struct TetrahedronNumericalIntegration_test : public NumericTest::SPtr geo; // Create the context for the scene - void SetUp() override + void doSetUp() override { // Init simulation simulation = sofa::simulation::getSimulation(); @@ -135,7 +135,7 @@ struct TriangleNumericalIntegration_test : public NumericTest -#include +#include namespace sofa::component::topology::container::grid { @@ -82,19 +82,19 @@ public : protected : SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_GRID() - sofa::core::objectmodel::RenamedData> _fileTopologies; + sofa::core::objectmodel::lifecycle::RenamedData> _fileTopologies; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_GRID() - sofa::core::objectmodel::RenamedData> _dataStiffnessCoefs; + sofa::core::objectmodel::lifecycle::RenamedData> _dataStiffnessCoefs; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_GRID() - sofa::core::objectmodel::RenamedData> _dataMassCoefs; + sofa::core::objectmodel::lifecycle::RenamedData> _dataMassCoefs; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_GRID() - sofa::core::objectmodel::RenamedData _computeRamifications; + sofa::core::objectmodel::lifecycle::RenamedData _computeRamifications; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_GRID() - sofa::core::objectmodel::RenamedData _erasePreviousCoef; + sofa::core::objectmodel::lifecycle::RenamedData _erasePreviousCoef; Data< type::vector< std::string > > d_fileTopologies; ///< All topology filenames diff --git a/Sofa/Component/Topology/Container/Grid/src/sofa/component/topology/container/grid/SparseGridRamificationTopology.h b/Sofa/Component/Topology/Container/Grid/src/sofa/component/topology/container/grid/SparseGridRamificationTopology.h index 560cd3867f6..923960b7bca 100644 --- a/Sofa/Component/Topology/Container/Grid/src/sofa/component/topology/container/grid/SparseGridRamificationTopology.h +++ b/Sofa/Component/Topology/Container/Grid/src/sofa/component/topology/container/grid/SparseGridRamificationTopology.h @@ -25,7 +25,7 @@ #include -#include +#include namespace sofa::component::topology::container::grid { @@ -78,7 +78,7 @@ class SOFA_COMPONENT_TOPOLOGY_CONTAINER_GRID_API SparseGridRamificationTopology enum {UP,DOWN,RIGHT,LEFT,BEFORE,BEHIND,NUM_CONNECTED_NODES}; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_GRID() - sofa::core::objectmodel::RenamedData _finestConnectivity; + sofa::core::objectmodel::lifecycle::RenamedData _finestConnectivity; // Does the connectivity test have to be done at the finest level? (more precise but slow) diff --git a/Sofa/Component/Topology/Container/Grid/src/sofa/component/topology/container/grid/SparseGridTopology.h b/Sofa/Component/Topology/Container/Grid/src/sofa/component/topology/container/grid/SparseGridTopology.h index 52f204d08ad..7ec17f8c093 100644 --- a/Sofa/Component/Topology/Container/Grid/src/sofa/component/topology/container/grid/SparseGridTopology.h +++ b/Sofa/Component/Topology/Container/Grid/src/sofa/component/topology/container/grid/SparseGridTopology.h @@ -32,7 +32,7 @@ #include #include -#include +#include namespace sofa::core::loader { @@ -192,13 +192,13 @@ class SOFA_COMPONENT_TOPOLOGY_CONTAINER_GRID_API SparseGridTopology : public con return d_dataVoxels.getValue()[index] == 1; } SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_GRID() - sofa::core::objectmodel::RenamedData _fillWeighted; + sofa::core::objectmodel::lifecycle::RenamedData _fillWeighted; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_GRID() - sofa::core::objectmodel::RenamedData bOnlyInsideCells; + sofa::core::objectmodel::lifecycle::RenamedData bOnlyInsideCells; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_GRID() - sofa::core::objectmodel::RenamedData< type::vector< unsigned char > > dataVoxels; + sofa::core::objectmodel::lifecycle::RenamedData< type::vector< unsigned char > > dataVoxels; Data< type::vector< unsigned char > > d_dataVoxels; @@ -212,19 +212,19 @@ class SOFA_COMPONENT_TOPOLOGY_CONTAINER_GRID_API SparseGridTopology : public con SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_GRID() - sofa::core::objectmodel::RenamedData< sofa::type::Vec< 3, int > > n; + sofa::core::objectmodel::lifecycle::RenamedData< sofa::type::Vec< 3, int > > n; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_GRID() - sofa::core::objectmodel::RenamedData _min; + sofa::core::objectmodel::lifecycle::RenamedData _min; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_GRID() - sofa::core::objectmodel::RenamedData _max; + sofa::core::objectmodel::lifecycle::RenamedData _max; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_GRID() - sofa::core::objectmodel::RenamedData _cellWidth; + sofa::core::objectmodel::lifecycle::RenamedData _cellWidth; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_GRID() - sofa::core::objectmodel::RenamedData _nbVirtualFinerLevels; + sofa::core::objectmodel::lifecycle::RenamedData _nbVirtualFinerLevels; bool isVirtual; @@ -238,19 +238,19 @@ class SOFA_COMPONENT_TOPOLOGY_CONTAINER_GRID_API SparseGridTopology : public con public: SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_GRID() - sofa::core::objectmodel::RenamedData dataResolution; + sofa::core::objectmodel::lifecycle::RenamedData dataResolution; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_GRID() - sofa::core::objectmodel::RenamedData voxelSize; + sofa::core::objectmodel::lifecycle::RenamedData voxelSize; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_GRID() - sofa::core::objectmodel::RenamedData marchingCubeStep; + sofa::core::objectmodel::lifecycle::RenamedData marchingCubeStep; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_GRID() - sofa::core::objectmodel::RenamedData convolutionSize; + sofa::core::objectmodel::lifecycle::RenamedData convolutionSize; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_GRID()SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_CONTAINER_GRID() - sofa::core::objectmodel::RenamedData< type::vector< type::vector > > facets; + sofa::core::objectmodel::lifecycle::RenamedData< type::vector< type::vector > > facets; Data< type::Vec3i > d_dataResolution; ///< Dimension of the voxel File Data< type::Vec3 > d_voxelSize; ///< Dimension of one voxel diff --git a/Sofa/Component/Topology/Container/Grid/tests/SparseGridTopology_test.cpp b/Sofa/Component/Topology/Container/Grid/tests/SparseGridTopology_test.cpp index a10918d8f78..80ca289b559 100644 --- a/Sofa/Component/Topology/Container/Grid/tests/SparseGridTopology_test.cpp +++ b/Sofa/Component/Topology/Container/Grid/tests/SparseGridTopology_test.cpp @@ -40,7 +40,7 @@ using namespace sofa::testing; struct SparseGridTopology_test : public BaseTest { - void SetUp() override + void doSetUp() override { DataRepository.addFirstPath(SOFA_TESTING_RESOURCES_DIR); } diff --git a/Sofa/Component/Topology/Container/src/sofa/component/topology/container/init.cpp b/Sofa/Component/Topology/Container/src/sofa/component/topology/container/init.cpp index 99b3ffeac8d..bd43c782876 100644 --- a/Sofa/Component/Topology/Container/src/sofa/component/topology/container/init.cpp +++ b/Sofa/Component/Topology/Container/src/sofa/component/topology/container/init.cpp @@ -27,6 +27,7 @@ #include #include +#include namespace sofa::component::topology::container { @@ -55,9 +56,9 @@ const char* getModuleVersion() void registerObjects(sofa::core::ObjectFactory* factory) { - factory->registerObjectsFromPlugin("Sofa.Component.Topology.Container.Constant"); - factory->registerObjectsFromPlugin("Sofa.Component.Topology.Container.Dynamic"); - factory->registerObjectsFromPlugin("Sofa.Component.Topology.Container.Grid"); + factory->registerObjectsFromPlugin(Sofa.Component.Topology.Container.Constant); + factory->registerObjectsFromPlugin(Sofa.Component.Topology.Container.Dynamic); + factory->registerObjectsFromPlugin(Sofa.Component.Topology.Container.Grid); } void init() diff --git a/Sofa/Component/Topology/Mapping/src/sofa/component/topology/mapping/Hexa2QuadTopologicalMapping.h b/Sofa/Component/Topology/Mapping/src/sofa/component/topology/mapping/Hexa2QuadTopologicalMapping.h index 5d2d6d70e5e..234ba72670a 100644 --- a/Sofa/Component/Topology/Mapping/src/sofa/component/topology/mapping/Hexa2QuadTopologicalMapping.h +++ b/Sofa/Component/Topology/Mapping/src/sofa/component/topology/mapping/Hexa2QuadTopologicalMapping.h @@ -29,7 +29,7 @@ #include -#include +#include namespace sofa::component::topology::mapping { @@ -78,7 +78,7 @@ class SOFA_COMPONENT_TOPOLOGY_MAPPING_API Hexa2QuadTopologicalMapping : public s protected: SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA() - sofa::core::objectmodel::RenamedData flipNormals; + sofa::core::objectmodel::lifecycle::RenamedData flipNormals; Data d_flipNormals; ///< Flip Normal ? (Inverse point order when creating triangle) diff --git a/Sofa/Component/Topology/Mapping/src/sofa/component/topology/mapping/Hexa2TetraTopologicalMapping.h b/Sofa/Component/Topology/Mapping/src/sofa/component/topology/mapping/Hexa2TetraTopologicalMapping.h index f13d26e77ea..53e04c13fb8 100644 --- a/Sofa/Component/Topology/Mapping/src/sofa/component/topology/mapping/Hexa2TetraTopologicalMapping.h +++ b/Sofa/Component/Topology/Mapping/src/sofa/component/topology/mapping/Hexa2TetraTopologicalMapping.h @@ -29,7 +29,7 @@ #include -#include +#include namespace sofa::component::topology::mapping @@ -77,7 +77,7 @@ class SOFA_COMPONENT_TOPOLOGY_MAPPING_API Hexa2TetraTopologicalMapping : public Index getFromIndex(Index ind) override; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA() - sofa::core::objectmodel::RenamedData swapping; + sofa::core::objectmodel::lifecycle::RenamedData swapping; sofa::core::objectmodel::Data d_swapping; ///< Boolean enabling to swapp hexa-edges in order to avoid bias effect diff --git a/Sofa/Component/Topology/Mapping/src/sofa/component/topology/mapping/SubsetTopologicalMapping.h b/Sofa/Component/Topology/Mapping/src/sofa/component/topology/mapping/SubsetTopologicalMapping.h index 12c080e3d8e..b083a5442cd 100644 --- a/Sofa/Component/Topology/Mapping/src/sofa/component/topology/mapping/SubsetTopologicalMapping.h +++ b/Sofa/Component/Topology/Mapping/src/sofa/component/topology/mapping/SubsetTopologicalMapping.h @@ -29,7 +29,7 @@ #include -#include +#include namespace sofa::component::topology::mapping { @@ -53,58 +53,58 @@ class SOFA_COMPONENT_TOPOLOGY_MAPPING_API SubsetTopologicalMapping : public sofa public: SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA() - sofa::core::objectmodel::RenamedData samePoints; + sofa::core::objectmodel::lifecycle::RenamedData samePoints; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA() - sofa::core::objectmodel::RenamedData handleEdges; + sofa::core::objectmodel::lifecycle::RenamedData handleEdges; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA() - sofa::core::objectmodel::RenamedData handleTriangles; + sofa::core::objectmodel::lifecycle::RenamedData handleTriangles; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA() - sofa::core::objectmodel::RenamedData handleQuads; + sofa::core::objectmodel::lifecycle::RenamedData handleQuads; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA() - sofa::core::objectmodel::RenamedData handleTetrahedra; + sofa::core::objectmodel::lifecycle::RenamedData handleTetrahedra; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA() - sofa::core::objectmodel::RenamedData handleHexahedra; + sofa::core::objectmodel::lifecycle::RenamedData handleHexahedra; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA() - sofa::core::objectmodel::RenamedData pointS2D; + sofa::core::objectmodel::lifecycle::RenamedData pointS2D; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA() - sofa::core::objectmodel::RenamedData pointD2S; + sofa::core::objectmodel::lifecycle::RenamedData pointD2S; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA() - sofa::core::objectmodel::RenamedData edgeS2D; + sofa::core::objectmodel::lifecycle::RenamedData edgeS2D; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA() - sofa::core::objectmodel::RenamedData edgeD2S; + sofa::core::objectmodel::lifecycle::RenamedData edgeD2S; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA() - sofa::core::objectmodel::RenamedData triangleS2D; + sofa::core::objectmodel::lifecycle::RenamedData triangleS2D; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA() - sofa::core::objectmodel::RenamedData triangleD2S; + sofa::core::objectmodel::lifecycle::RenamedData triangleD2S; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA() - sofa::core::objectmodel::RenamedData quadS2D; + sofa::core::objectmodel::lifecycle::RenamedData quadS2D; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA() - sofa::core::objectmodel::RenamedData quadD2S; + sofa::core::objectmodel::lifecycle::RenamedData quadD2S; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA() - sofa::core::objectmodel::RenamedData tetrahedronS2D; + sofa::core::objectmodel::lifecycle::RenamedData tetrahedronS2D; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA() - sofa::core::objectmodel::RenamedData tetrahedronD2S; + sofa::core::objectmodel::lifecycle::RenamedData tetrahedronD2S; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA() - sofa::core::objectmodel::RenamedData hexahedronS2D; + sofa::core::objectmodel::lifecycle::RenamedData hexahedronS2D; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA() - sofa::core::objectmodel::RenamedData hexahedronD2S; + sofa::core::objectmodel::lifecycle::RenamedData hexahedronD2S; Data d_samePoints; ///< True if the same set of points is used in both topologies Data d_handleEdges; ///< True if edges events and mapping should be handled diff --git a/Sofa/Component/Topology/Mapping/src/sofa/component/topology/mapping/Tetra2TriangleTopologicalMapping.h b/Sofa/Component/Topology/Mapping/src/sofa/component/topology/mapping/Tetra2TriangleTopologicalMapping.h index d6c599932dd..c38d8c0858b 100644 --- a/Sofa/Component/Topology/Mapping/src/sofa/component/topology/mapping/Tetra2TriangleTopologicalMapping.h +++ b/Sofa/Component/Topology/Mapping/src/sofa/component/topology/mapping/Tetra2TriangleTopologicalMapping.h @@ -29,7 +29,7 @@ #include -#include +#include namespace sofa::component::topology::container::dynamic { @@ -84,13 +84,13 @@ class SOFA_COMPONENT_TOPOLOGY_MAPPING_API Tetra2TriangleTopologicalMapping : pub protected: SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA() - sofa::core::objectmodel::RenamedData flipNormals; + sofa::core::objectmodel::lifecycle::RenamedData flipNormals; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA() - sofa::core::objectmodel::RenamedData noNewTriangles; + sofa::core::objectmodel::lifecycle::RenamedData noNewTriangles; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA() - sofa::core::objectmodel::RenamedData noInitialTriangles; + sofa::core::objectmodel::lifecycle::RenamedData noInitialTriangles; Data d_flipNormals; ///< Flip Normal ? (Inverse point order when creating triangle) diff --git a/Sofa/Component/Topology/Testing/src/sofa/component/topology/testing/fake_TopologyScene.h b/Sofa/Component/Topology/Testing/src/sofa/component/topology/testing/fake_TopologyScene.h index bdd5bf4c915..fe2283294da 100644 --- a/Sofa/Component/Topology/Testing/src/sofa/component/topology/testing/fake_TopologyScene.h +++ b/Sofa/Component/Topology/Testing/src/sofa/component/topology/testing/fake_TopologyScene.h @@ -25,6 +25,7 @@ #include #include #include +#include class fake_TopologyScene { @@ -52,11 +53,11 @@ class fake_TopologyScene m_simu = createSimulation("DAG"); m_root = createRootNode(m_simu, "root"); - sofa::simpleapi::importPlugin("Sofa.Component.IO.Mesh"); - sofa::simpleapi::importPlugin("Sofa.Component.StateContainer"); - sofa::simpleapi::importPlugin("Sofa.Component.Topology.Container.Constant"); - sofa::simpleapi::importPlugin("Sofa.Component.Topology.Container.Dynamic"); - sofa::simpleapi::importPlugin("Sofa.Component.Mass"); + sofa::simpleapi::importPlugin(Sofa.Component.IO.Mesh); + sofa::simpleapi::importPlugin(Sofa.Component.StateContainer); + sofa::simpleapi::importPlugin(Sofa.Component.Topology.Container.Constant); + sofa::simpleapi::importPlugin(Sofa.Component.Topology.Container.Dynamic); + sofa::simpleapi::importPlugin(Sofa.Component.Mass); createObject(m_root, "DefaultAnimationLoop"); @@ -110,7 +111,7 @@ class fake_TopologyScene createObject(m_root, "MeshMatrixMass"); if (m_topoType == sofa::geometry::ElementType::EDGE) { - sofa::simpleapi::importPlugin("Sofa.Component.SolidMechanics.Spring"); + sofa::simpleapi::importPlugin(Sofa.Component.SolidMechanics.Spring); createObject(m_root, "VectorSpringForceField", { {"useTopology", "true"} }); } diff --git a/Sofa/Component/Topology/Utility/src/sofa/component/topology/utility/TopologicalChangeProcessor.h b/Sofa/Component/Topology/Utility/src/sofa/component/topology/utility/TopologicalChangeProcessor.h index 8b9d51ed1c5..9fa48c8277d 100644 --- a/Sofa/Component/Topology/Utility/src/sofa/component/topology/utility/TopologicalChangeProcessor.h +++ b/Sofa/Component/Topology/Utility/src/sofa/component/topology/utility/TopologicalChangeProcessor.h @@ -29,7 +29,7 @@ #include -#include +#include #if SOFAMISCTOPOLOGY_HAVE_ZLIB @@ -58,52 +58,52 @@ class SOFA_COMPONENT_TOPOLOGY_UTILITY_API TopologicalChangeProcessor: public cor sofa::core::objectmodel::DataFileName m_filename; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_UTILITY() - sofa::core::objectmodel::RenamedData < type::vector< type::vector > > m_listChanges; + sofa::core::objectmodel::lifecycle::RenamedData < type::vector< type::vector > > m_listChanges; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_UTILITY() - sofa::core::objectmodel::RenamedData m_interval; + sofa::core::objectmodel::lifecycle::RenamedData m_interval; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_UTILITY() - sofa::core::objectmodel::RenamedData m_shift; + sofa::core::objectmodel::lifecycle::RenamedData m_shift; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_UTILITY() - sofa::core::objectmodel::RenamedData m_loop; + sofa::core::objectmodel::lifecycle::RenamedData m_loop; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_UTILITY() - sofa::core::objectmodel::RenamedData m_useDataInputs; + sofa::core::objectmodel::lifecycle::RenamedData m_useDataInputs; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_UTILITY() - sofa::core::objectmodel::RenamedData m_timeToRemove; + sofa::core::objectmodel::lifecycle::RenamedData m_timeToRemove; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_UTILITY() - sofa::core::objectmodel::RenamedData >m_pointsToRemove; + sofa::core::objectmodel::lifecycle::RenamedData >m_pointsToRemove; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_UTILITY() - sofa::core::objectmodel::RenamedData > m_edgesToRemove; + sofa::core::objectmodel::lifecycle::RenamedData > m_edgesToRemove; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_UTILITY() - sofa::core::objectmodel::RenamedData > m_trianglesToRemove; + sofa::core::objectmodel::lifecycle::RenamedData > m_trianglesToRemove; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_UTILITY() - sofa::core::objectmodel::RenamedData > m_quadsToRemove; + sofa::core::objectmodel::lifecycle::RenamedData > m_quadsToRemove; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_UTILITY() - sofa::core::objectmodel::RenamedData > m_tetrahedraToRemove; + sofa::core::objectmodel::lifecycle::RenamedData > m_tetrahedraToRemove; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_UTILITY() - sofa::core::objectmodel::RenamedData > m_hexahedraToRemove; + sofa::core::objectmodel::lifecycle::RenamedData > m_hexahedraToRemove; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_UTILITY() - sofa::core::objectmodel::RenamedData m_saveIndicesAtInit; + sofa::core::objectmodel::lifecycle::RenamedData m_saveIndicesAtInit; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_UTILITY() - sofa::core::objectmodel::RenamedData m_epsilonSnapPath; + sofa::core::objectmodel::lifecycle::RenamedData m_epsilonSnapPath; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_UTILITY() - sofa::core::objectmodel::RenamedData m_epsilonSnapBorder; + sofa::core::objectmodel::lifecycle::RenamedData m_epsilonSnapBorder; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_TOPOLOGY_UTILITY() - sofa::core::objectmodel::RenamedData m_draw; + sofa::core::objectmodel::lifecycle::RenamedData m_draw; sofa::core::objectmodel::DataFileName d_filename; Data < type::vector< type::vector > > d_listChanges; ///< 0 for adding, 1 for removing, 2 for cutting and associated indices. diff --git a/Sofa/Component/Topology/Utility/tests/TopologicalChangeProcessor_test.cpp b/Sofa/Component/Topology/Utility/tests/TopologicalChangeProcessor_test.cpp index 2114477f075..4bda2e56669 100644 --- a/Sofa/Component/Topology/Utility/tests/TopologicalChangeProcessor_test.cpp +++ b/Sofa/Component/Topology/Utility/tests/TopologicalChangeProcessor_test.cpp @@ -46,7 +46,7 @@ struct TopologicalChangeProcessor_test: public BaseSimulationTest std::string m_fileName = ""; /// Method use at start to load the scene file - void SetUp() override + void doSetUp() override { // Load the scene from the xml file const std::string filePath = std::string(SOFA_COMPONENT_TOPOLOGY_UTILITY_TEST_SCENES_DIR) + "/" + m_fileName; @@ -68,7 +68,7 @@ struct TopologicalChangeProcessor_test: public BaseSimulationTest virtual bool testTopologyChanges() = 0; /// Unload the scene - void TearDown() override + void doTearDown() override { if (m_instance.root !=nullptr) sofa::simulation::node::unload(m_instance.root); diff --git a/Sofa/Component/Topology/Utility/tests/TopologyChecker_test.cpp b/Sofa/Component/Topology/Utility/tests/TopologyChecker_test.cpp index 2bc9934cb6f..e35ebdb0332 100644 --- a/Sofa/Component/Topology/Utility/tests/TopologyChecker_test.cpp +++ b/Sofa/Component/Topology/Utility/tests/TopologyChecker_test.cpp @@ -56,7 +56,7 @@ struct TopologyChecker_test: public BaseSimulationTest Node::SPtr m_topoNode = nullptr; /// Method use at start to load the scene file - void SetUp() override + void doSetUp() override { // Load the scene from the xml file const std::string filePath = std::string(SOFA_COMPONENT_TOPOLOGY_UTILITY_TEST_SCENES_DIR) + "/" + m_fileName; @@ -81,7 +81,7 @@ struct TopologyChecker_test: public BaseSimulationTest virtual bool testInvalidContainer() = 0; /// Unload the scene - void TearDown() override + void doTearDown() override { if (m_instance.root !=nullptr) sofa::simulation::node::unload(m_instance.root); diff --git a/Sofa/Component/Topology/src/sofa/component/topology/init.cpp b/Sofa/Component/Topology/src/sofa/component/topology/init.cpp index 145ed36c9ec..550085ae7c1 100644 --- a/Sofa/Component/Topology/src/sofa/component/topology/init.cpp +++ b/Sofa/Component/Topology/src/sofa/component/topology/init.cpp @@ -27,6 +27,7 @@ #include #include +#include namespace sofa::component::topology { @@ -55,9 +56,9 @@ const char* getModuleVersion() void registerObjects(sofa::core::ObjectFactory* factory) { - factory->registerObjectsFromPlugin("Sofa.Component.Topology.Container"); - factory->registerObjectsFromPlugin("Sofa.Component.Topology.Mapping"); - factory->registerObjectsFromPlugin("Sofa.Component.Topology.Utility"); + factory->registerObjectsFromPlugin(Sofa.Component.Topology.Container); + factory->registerObjectsFromPlugin(Sofa.Component.Topology.Mapping); + factory->registerObjectsFromPlugin(Sofa.Component.Topology.Utility); } void init() diff --git a/Sofa/Component/Visual/CMakeLists.txt b/Sofa/Component/Visual/CMakeLists.txt index 8dd7b074047..d1a525f0c29 100644 --- a/Sofa/Component/Visual/CMakeLists.txt +++ b/Sofa/Component/Visual/CMakeLists.txt @@ -8,6 +8,7 @@ set(HEADER_FILES ${SOFACOMPONENTVISUAL_SOURCE_DIR}/init.h ${SOFACOMPONENTVISUAL_SOURCE_DIR}/BaseCamera.h ${SOFACOMPONENTVISUAL_SOURCE_DIR}/Camera.h + ${SOFACOMPONENTVISUAL_SOURCE_DIR}/CylinderVisualModel.h ${SOFACOMPONENTVISUAL_SOURCE_DIR}/InteractiveCamera.h ${SOFACOMPONENTVISUAL_SOURCE_DIR}/LineAxis.h ${SOFACOMPONENTVISUAL_SOURCE_DIR}/RecordedCamera.h @@ -24,6 +25,7 @@ set(SOURCE_FILES ${SOFACOMPONENTVISUAL_SOURCE_DIR}/init.cpp ${SOFACOMPONENTVISUAL_SOURCE_DIR}/BaseCamera.cpp ${SOFACOMPONENTVISUAL_SOURCE_DIR}/Camera.cpp + ${SOFACOMPONENTVISUAL_SOURCE_DIR}/CylinderVisualModel.cpp ${SOFACOMPONENTVISUAL_SOURCE_DIR}/InteractiveCamera.cpp ${SOFACOMPONENTVISUAL_SOURCE_DIR}/LineAxis.cpp ${SOFACOMPONENTVISUAL_SOURCE_DIR}/RecordedCamera.cpp diff --git a/Sofa/Component/Visual/src/sofa/component/visual/BaseCamera.h b/Sofa/Component/Visual/src/sofa/component/visual/BaseCamera.h index 5512f37e7ed..0e9e82b9d99 100644 --- a/Sofa/Component/Visual/src/sofa/component/visual/BaseCamera.h +++ b/Sofa/Component/Visual/src/sofa/component/visual/BaseCamera.h @@ -30,7 +30,7 @@ #include #include -#include +#include namespace sofa::component::visual { @@ -68,55 +68,55 @@ class SOFA_COMPONENT_VISUAL_API BaseCamera : public core::objectmodel::BaseObjec }; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData p_position; + sofa::core::objectmodel::lifecycle::RenamedData p_position; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData p_orientation; + sofa::core::objectmodel::lifecycle::RenamedData p_orientation; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData p_lookAt; + sofa::core::objectmodel::lifecycle::RenamedData p_lookAt; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData p_distance; + sofa::core::objectmodel::lifecycle::RenamedData p_distance; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData p_fieldOfView; + sofa::core::objectmodel::lifecycle::RenamedData p_fieldOfView; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData p_zNear; + sofa::core::objectmodel::lifecycle::RenamedData p_zNear; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData p_zFar; + sofa::core::objectmodel::lifecycle::RenamedData p_zFar; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData p_computeZClip; + sofa::core::objectmodel::lifecycle::RenamedData p_computeZClip; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData p_minBBox; + sofa::core::objectmodel::lifecycle::RenamedData p_minBBox; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData p_maxBBox; + sofa::core::objectmodel::lifecycle::RenamedData p_maxBBox; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData p_widthViewport; + sofa::core::objectmodel::lifecycle::RenamedData p_widthViewport; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData p_heightViewport; + sofa::core::objectmodel::lifecycle::RenamedData p_heightViewport; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData p_type; + sofa::core::objectmodel::lifecycle::RenamedData p_type; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData p_activated; + sofa::core::objectmodel::lifecycle::RenamedData p_activated; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData p_fixedLookAtPoint; + sofa::core::objectmodel::lifecycle::RenamedData p_fixedLookAtPoint; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData > p_modelViewMatrix; + sofa::core::objectmodel::lifecycle::RenamedData > p_modelViewMatrix; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData > p_projectionMatrix; + sofa::core::objectmodel::lifecycle::RenamedData > p_projectionMatrix; Data d_position; ///< Camera's position diff --git a/Sofa/Component/Visual/src/sofa/component/visual/CylinderVisualModel.cpp b/Sofa/Component/Visual/src/sofa/component/visual/CylinderVisualModel.cpp new file mode 100644 index 00000000000..98d778731bd --- /dev/null +++ b/Sofa/Component/Visual/src/sofa/component/visual/CylinderVisualModel.cpp @@ -0,0 +1,94 @@ +/****************************************************************************** +* SOFA, Simulation Open-Framework Architecture * +* (c) 2006 INRIA, USTL, UJF, CNRS, MGH * +* * +* This program is free software; you can redistribute it and/or modify it * +* under the terms of the GNU Lesser General Public License as published by * +* the Free Software Foundation; either version 2.1 of the License, or (at * +* your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, but WITHOUT * +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * +* for more details. * +* * +* You should have received a copy of the GNU Lesser General Public License * +* along with this program. If not, see . * +******************************************************************************* +* Authors: The SOFA Team and external contributors (see Authors.txt) * +* * +* Contact information: contact@sofa-framework.org * +******************************************************************************/ +#include +#include +#include +#include + +namespace sofa::component::visual +{ + +void registerCylinderVisualModel(sofa::core::ObjectFactory* factory) +{ + factory->registerObjects(core::ObjectRegistrationData("Visualize a set of cylinders.") + .add< CylinderVisualModel >()); +} + +CylinderVisualModel::CylinderVisualModel() + : radius(initData(&radius, 1.0f, "radius", "Radius of the cylinder.")), + color(initData(&color, sofa::type::RGBAColor::white(), "color", "Color of the cylinders.")) + , d_edges(initData(&d_edges,"edges","List of edge indices")) +{ +} + +CylinderVisualModel::~CylinderVisualModel() = default; + +void CylinderVisualModel::init() +{ + VisualModel::init(); + + reinit(); +} + +void CylinderVisualModel::doDrawVisual(const core::visual::VisualParams* vparams) +{ + const VecCoord& pos = this->read( core::vec_id::read_access::position )->getValue(); + + auto* drawTool = vparams->drawTool(); + + drawTool->setLightingEnabled(true); + + const float _radius = radius.getValue(); + const sofa::type::RGBAColor& col = color.getValue(); + + const SeqEdges& edges = d_edges.getValue(); + + for(const auto& edge : edges) + { + const Coord& p1 = pos[edge[0]]; + const Coord& p2 = pos[edge[1]]; + + drawTool->drawCylinder(p1, p2, _radius, col); + } +} + +void CylinderVisualModel::exportOBJ(std::string name, std::ostream* out, std::ostream* /*mtl*/, Index& vindex, Index& /*nindex*/, Index& /*tindex*/, int& /*count*/) +{ + const VecCoord& x = this->read( core::vec_id::read_access::position )->getValue(); + const SeqEdges& edges = d_edges.getValue(); + + const int nbv = int(x.size()); + + *out << "g "<. * +******************************************************************************* +* Authors: The SOFA Team and external contributors (see Authors.txt) * +* * +* Contact information: contact@sofa-framework.org * +******************************************************************************/ +#pragma once +#include + +#include +#include +#include + +namespace sofa::component::visual +{ + +class SOFA_COMPONENT_VISUAL_API CylinderVisualModel : + public core::visual::VisualModel, public sofa::core::visual::VisualState +{ +public: + using Vec3State = sofa::core::visual::VisualState; + SOFA_CLASS2(CylinderVisualModel,core::visual::VisualModel, Vec3State); + +protected: + CylinderVisualModel(); + ~CylinderVisualModel() override; +public: + void init() override; + + void doDrawVisual(const core::visual::VisualParams* vparams) override; + + void exportOBJ(std::string /*name*/, std::ostream* /*out*/, std::ostream* /*mtl*/, Index& /*vindex*/, Index& /*nindex*/, Index& /*tindex*/, int& /*count*/) override; + +private: + Data radius; ///< Radius of the cylinder. + Data color; ///< Color of the cylinders. + + typedef sofa::type::vector SeqEdges; + Data d_edges; ///< List of edge indices + +public: + bool insertInNode( core::objectmodel::BaseNode* node ) override { Inherit1::insertInNode(node); Inherit2::insertInNode(node); return true; } + bool removeInNode( core::objectmodel::BaseNode* node ) override { Inherit1::removeInNode(node); Inherit2::removeInNode(node); return true; } +}; + +} // namespace sofa::component::visual diff --git a/Sofa/Component/Visual/src/sofa/component/visual/InteractiveCamera.h b/Sofa/Component/Visual/src/sofa/component/visual/InteractiveCamera.h index b8fc38d4913..35cf08acd05 100644 --- a/Sofa/Component/Visual/src/sofa/component/visual/InteractiveCamera.h +++ b/Sofa/Component/Visual/src/sofa/component/visual/InteractiveCamera.h @@ -25,7 +25,7 @@ #include #include -#include +#include namespace sofa::core::objectmodel { @@ -46,13 +46,13 @@ class SOFA_COMPONENT_VISUAL_API InteractiveCamera : public BaseCamera enum { CAMERA_LOOKAT_PIVOT = 0, CAMERA_POSITION_PIVOT = 1, SCENE_CENTER_PIVOT = 2, WORLD_CENTER_PIVOT = 3}; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData p_zoomSpeed; + sofa::core::objectmodel::lifecycle::RenamedData p_zoomSpeed; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData p_panSpeed; + sofa::core::objectmodel::lifecycle::RenamedData p_panSpeed; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData p_pivot; + sofa::core::objectmodel::lifecycle::RenamedData p_pivot; Data d_zoomSpeed; ///< Zoom Speed Data d_panSpeed; ///< Pan Speed diff --git a/Sofa/Component/Visual/src/sofa/component/visual/RecordedCamera.h b/Sofa/Component/Visual/src/sofa/component/visual/RecordedCamera.h index 6c1f6f9591f..4675f3a40f0 100644 --- a/Sofa/Component/Visual/src/sofa/component/visual/RecordedCamera.h +++ b/Sofa/Component/Visual/src/sofa/component/visual/RecordedCamera.h @@ -26,7 +26,7 @@ #include #include -#include +#include namespace sofa::component::visual { @@ -81,58 +81,58 @@ class SOFA_COMPONENT_VISUAL_API RecordedCamera : public BaseCamera public: SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData p_zoomSpeed; + sofa::core::objectmodel::lifecycle::RenamedData p_zoomSpeed; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData p_panSpeed; + sofa::core::objectmodel::lifecycle::RenamedData p_panSpeed; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData p_pivot; + sofa::core::objectmodel::lifecycle::RenamedData p_pivot; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData m_startTime; + sofa::core::objectmodel::lifecycle::RenamedData m_startTime; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData m_endTime; + sofa::core::objectmodel::lifecycle::RenamedData m_endTime; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData m_rotationMode; + sofa::core::objectmodel::lifecycle::RenamedData m_rotationMode; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData m_translationMode; + sofa::core::objectmodel::lifecycle::RenamedData m_translationMode; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData m_navigationMode; + sofa::core::objectmodel::lifecycle::RenamedData m_navigationMode; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData m_rotationSpeed; + sofa::core::objectmodel::lifecycle::RenamedData m_rotationSpeed; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData m_rotationCenter; + sofa::core::objectmodel::lifecycle::RenamedData m_rotationCenter; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData m_rotationStartPoint; + sofa::core::objectmodel::lifecycle::RenamedData m_rotationStartPoint; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData m_rotationLookAt; + sofa::core::objectmodel::lifecycle::RenamedData m_rotationLookAt; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData m_rotationAxis; + sofa::core::objectmodel::lifecycle::RenamedData m_rotationAxis; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData m_cameraUp; + sofa::core::objectmodel::lifecycle::RenamedData m_cameraUp; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData p_drawRotation; + sofa::core::objectmodel::lifecycle::RenamedData p_drawRotation; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData p_drawTranslation; + sofa::core::objectmodel::lifecycle::RenamedData p_drawTranslation; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData> m_translationPositions; + sofa::core::objectmodel::lifecycle::RenamedData> m_translationPositions; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData > m_translationOrientations; + sofa::core::objectmodel::lifecycle::RenamedData > m_translationOrientations; Data d_startTime; ///< Time when the camera moves will start Data d_endTime; ///< Time when the camera moves will end (or loop) diff --git a/Sofa/Component/Visual/src/sofa/component/visual/VisualModelImpl.h b/Sofa/Component/Visual/src/sofa/component/visual/VisualModelImpl.h index a225821b27d..2760ecc16ef 100644 --- a/Sofa/Component/Visual/src/sofa/component/visual/VisualModelImpl.h +++ b/Sofa/Component/Visual/src/sofa/component/visual/VisualModelImpl.h @@ -32,7 +32,7 @@ #include -#include +#include namespace sofa::component::visual { @@ -85,55 +85,55 @@ class SOFA_COMPONENT_VISUAL_API VisualModelImpl : public core::visual::VisualMod sofa::core::topology::BaseMeshTopology* m_topology; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData m_initRestPositions; + sofa::core::objectmodel::lifecycle::RenamedData m_initRestPositions; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData m_useNormals; + sofa::core::objectmodel::lifecycle::RenamedData m_useNormals; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData m_updateNormals; + sofa::core::objectmodel::lifecycle::RenamedData m_updateNormals; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData m_computeTangents; + sofa::core::objectmodel::lifecycle::RenamedData m_computeTangents; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData m_updateTangents; + sofa::core::objectmodel::lifecycle::RenamedData m_updateTangents; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData m_handleDynamicTopology; + sofa::core::objectmodel::lifecycle::RenamedData m_handleDynamicTopology; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData m_fixMergedUVSeams; + sofa::core::objectmodel::lifecycle::RenamedData m_fixMergedUVSeams; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData m_keepLines; + sofa::core::objectmodel::lifecycle::RenamedData m_keepLines; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData m_vertices2; + sofa::core::objectmodel::lifecycle::RenamedData m_vertices2; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData< VecTexCoord > m_vtexcoords; + sofa::core::objectmodel::lifecycle::RenamedData< VecTexCoord > m_vtexcoords; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData< VecCoord > m_vtangents; + sofa::core::objectmodel::lifecycle::RenamedData< VecCoord > m_vtangents; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData< VecCoord > m_vbitangents; + sofa::core::objectmodel::lifecycle::RenamedData< VecCoord > m_vbitangents; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData< VecVisualEdge > m_edges; + sofa::core::objectmodel::lifecycle::RenamedData< VecVisualEdge > m_edges; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData< VecVisualTriangle > m_triangles; + sofa::core::objectmodel::lifecycle::RenamedData< VecVisualTriangle > m_triangles; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData< VecVisualQuad > m_quads; + sofa::core::objectmodel::lifecycle::RenamedData< VecVisualQuad > m_quads; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData< type::vector > m_vertPosIdx; + sofa::core::objectmodel::lifecycle::RenamedData< type::vector > m_vertPosIdx; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData< type::vector > m_vertNormIdx; + sofa::core::objectmodel::lifecycle::RenamedData< type::vector > m_vertNormIdx; Data d_initRestPositions; ///< True if rest positions must be initialized with initial positions @@ -182,19 +182,19 @@ class SOFA_COMPONENT_VISUAL_API VisualModelImpl : public core::visual::VisualMod typedef sofa::type::Vec<3,Real> Vec3Real; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData< Vec3Real >m_translation; + sofa::core::objectmodel::lifecycle::RenamedData< Vec3Real >m_translation; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData< Vec3Real > m_rotation; + sofa::core::objectmodel::lifecycle::RenamedData< Vec3Real > m_rotation; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData< Vec3Real >m_scale; + sofa::core::objectmodel::lifecycle::RenamedData< Vec3Real >m_scale; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData< TexCoord > m_scaleTex; + sofa::core::objectmodel::lifecycle::RenamedData< TexCoord > m_scaleTex; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData< TexCoord > m_translationTex; + sofa::core::objectmodel::lifecycle::RenamedData< TexCoord > m_translationTex; Data< Vec3Real > d_translation; ///< Initial Translation of the object Data< Vec3Real > d_rotation; ///< Initial Rotation of the object @@ -237,13 +237,13 @@ class SOFA_COMPONENT_VISUAL_API VisualModelImpl : public core::visual::VisualMod sofa::type::Vec3f bbox[2]; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData< sofa::type::Material >material; + sofa::core::objectmodel::lifecycle::RenamedData< sofa::type::Material >material; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData putOnlyTexCoords; + sofa::core::objectmodel::lifecycle::RenamedData putOnlyTexCoords; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData srgbTexturing; + sofa::core::objectmodel::lifecycle::RenamedData srgbTexturing; Data< sofa::type::Material > d_material; Data< bool > d_putOnlyTexCoords; @@ -283,10 +283,10 @@ class SOFA_COMPONENT_VISUAL_API VisualModelImpl : public core::visual::VisualMod } }; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData< type::vector > materials; + sofa::core::objectmodel::lifecycle::RenamedData< type::vector > materials; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData< type::vector > groups; + sofa::core::objectmodel::lifecycle::RenamedData< type::vector > groups; Data< type::vector > d_materials; Data< type::vector > d_groups; diff --git a/Sofa/Component/Visual/src/sofa/component/visual/VisualStyle.cpp b/Sofa/Component/Visual/src/sofa/component/visual/VisualStyle.cpp index 54931804369..0e50ca0d8f2 100644 --- a/Sofa/Component/Visual/src/sofa/component/visual/VisualStyle.cpp +++ b/Sofa/Component/Visual/src/sofa/component/visual/VisualStyle.cpp @@ -62,17 +62,30 @@ VisualStyle::VisualStyle() displayFlags.setOriginalData(&d_displayFlags); } -void VisualStyle::fwdDraw(VisualParams* vparams) +void VisualStyle::updateVisualFlags(VisualParams* vparams) { backupFlags = vparams->displayFlags(); vparams->displayFlags() = sofa::core::visual::merge_displayFlags(backupFlags, d_displayFlags.getValue()); } -void VisualStyle::bwdDraw(VisualParams* vparams) +void VisualStyle::applyBackupFlags(VisualParams* vparams) { vparams->displayFlags() = backupFlags; } + +bool VisualStyle::insertInNode( sofa::core::objectmodel::BaseNode* node ) +{ + node->addVisualStyle(this); + return true; +} + +bool VisualStyle::removeInNode( sofa::core::objectmodel::BaseNode* node ) +{ + node->removeVisualStyle(this); + return true; +} + helper::WriteAccessor addVisualStyle( simulation::Node::SPtr node ) { const VisualStyle::SPtr visualStyle = New(); diff --git a/Sofa/Component/Visual/src/sofa/component/visual/VisualStyle.h b/Sofa/Component/Visual/src/sofa/component/visual/VisualStyle.h index eb43f2f5ebf..7d647960592 100644 --- a/Sofa/Component/Visual/src/sofa/component/visual/VisualStyle.h +++ b/Sofa/Component/Visual/src/sofa/component/visual/VisualStyle.h @@ -21,12 +21,14 @@ ******************************************************************************/ #pragma once #include +#include #include +#include #include #include -#include +#include namespace sofa::component::visual { @@ -56,21 +58,24 @@ namespace sofa::component::visual * showNormals hideNormals * showWireframe hideWireframe */ -class SOFA_COMPONENT_VISUAL_API VisualStyle : public sofa::core::visual::VisualModel +class SOFA_COMPONENT_VISUAL_API VisualStyle : public sofa::core::visual::BaseVisualStyle { public: - SOFA_CLASS(VisualStyle,sofa::core::visual::VisualModel); + SOFA_CLASS(VisualStyle,sofa::core::visual::BaseVisualStyle); typedef sofa::core::visual::VisualParams VisualParams; typedef sofa::core::visual::DisplayFlags DisplayFlags; protected: VisualStyle(); public: - void fwdDraw(VisualParams* ) override; - void bwdDraw(VisualParams* ) override; + void updateVisualFlags(VisualParams* ) override; + void applyBackupFlags(VisualParams* ) override; + + bool insertInNode(sofa::core::objectmodel::BaseNode* node) override; + bool removeInNode(sofa::core::objectmodel::BaseNode* node) override; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData displayFlags; + sofa::core::objectmodel::lifecycle::RenamedData displayFlags; Data d_displayFlags; ///< Display Flags diff --git a/Sofa/Component/Visual/src/sofa/component/visual/VisualTransform.h b/Sofa/Component/Visual/src/sofa/component/visual/VisualTransform.h index 9fe684a9f5a..ae9d6842d1f 100644 --- a/Sofa/Component/Visual/src/sofa/component/visual/VisualTransform.h +++ b/Sofa/Component/Visual/src/sofa/component/visual/VisualTransform.h @@ -25,7 +25,7 @@ #include #include -#include +#include namespace sofa::component::visual { @@ -53,10 +53,10 @@ class SOFA_COMPONENT_VISUAL_API VisualTransform : public sofa::core::visual::Vis void drawTransparent(const sofa::core::visual::VisualParams* vparams) override; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData transform; + sofa::core::objectmodel::lifecycle::RenamedData transform; SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_VISUAL() - sofa::core::objectmodel::RenamedData recursive; + sofa::core::objectmodel::lifecycle::RenamedData recursive; Data d_transform; ///< Transformation to apply Data d_recursive; ///< True to apply transform to all nodes below diff --git a/Sofa/Component/Visual/src/sofa/component/visual/init.cpp b/Sofa/Component/Visual/src/sofa/component/visual/init.cpp index b2f8a2c08eb..c4060d561ac 100644 --- a/Sofa/Component/Visual/src/sofa/component/visual/init.cpp +++ b/Sofa/Component/Visual/src/sofa/component/visual/init.cpp @@ -27,6 +27,7 @@ namespace sofa::component::visual { extern void registerCamera(sofa::core::ObjectFactory* factory); +extern void registerCylinderVisualModel(sofa::core::ObjectFactory* factory); extern void registerInteractiveCamera(sofa::core::ObjectFactory* factory); extern void registerLineAxis(sofa::core::ObjectFactory* factory); extern void registerRecordedCamera(sofa::core::ObjectFactory* factory); @@ -63,6 +64,7 @@ void registerObjects(sofa::core::ObjectFactory* factory) { registerCamera(factory); registerInteractiveCamera(factory); + registerCylinderVisualModel(factory); registerLineAxis(factory); registerRecordedCamera(factory); registerTrailRenderer(factory); diff --git a/Sofa/Component/src/sofa/component/init.cpp b/Sofa/Component/src/sofa/component/init.cpp index 00f7034fde6..6e1494deb84 100644 --- a/Sofa/Component/src/sofa/component/init.cpp +++ b/Sofa/Component/src/sofa/component/init.cpp @@ -45,6 +45,7 @@ #include #include +#include namespace sofa::component { @@ -73,27 +74,27 @@ const char* getModuleVersion() void registerObjects(sofa::core::ObjectFactory* factory) { - factory->registerObjectsFromPlugin("Sofa.Component.AnimationLoop"); - factory->registerObjectsFromPlugin("Sofa.Component.Collision"); - factory->registerObjectsFromPlugin("Sofa.Component.Constraint"); - factory->registerObjectsFromPlugin("Sofa.Component.Controller"); - factory->registerObjectsFromPlugin("Sofa.Component.Diffusion"); - factory->registerObjectsFromPlugin("Sofa.Component.Engine"); - factory->registerObjectsFromPlugin("Sofa.Component.Haptics"); - factory->registerObjectsFromPlugin("Sofa.Component.IO"); - factory->registerObjectsFromPlugin("Sofa.Component.LinearSolver"); - factory->registerObjectsFromPlugin("Sofa.Component.LinearSystem"); - factory->registerObjectsFromPlugin("Sofa.Component.Mapping"); - factory->registerObjectsFromPlugin("Sofa.Component.Mass"); - factory->registerObjectsFromPlugin("Sofa.Component.MechanicalLoad"); - factory->registerObjectsFromPlugin("Sofa.Component.ODESolver"); - factory->registerObjectsFromPlugin("Sofa.Component.Playback"); - factory->registerObjectsFromPlugin("Sofa.Component.SceneUtility"); - factory->registerObjectsFromPlugin("Sofa.Component.Setting"); - factory->registerObjectsFromPlugin("Sofa.Component.SolidMechanics"); - factory->registerObjectsFromPlugin("Sofa.Component.StateContainer"); - factory->registerObjectsFromPlugin("Sofa.Component.Topology"); - factory->registerObjectsFromPlugin("Sofa.Component.Visual"); + factory->registerObjectsFromPlugin(Sofa.Component.AnimationLoop); + factory->registerObjectsFromPlugin(Sofa.Component.Collision); + factory->registerObjectsFromPlugin(Sofa.Component.Constraint); + factory->registerObjectsFromPlugin(Sofa.Component.Controller); + factory->registerObjectsFromPlugin(Sofa.Component.Diffusion); + factory->registerObjectsFromPlugin(Sofa.Component.Engine); + factory->registerObjectsFromPlugin(Sofa.Component.Haptics); + factory->registerObjectsFromPlugin(Sofa.Component.IO); + factory->registerObjectsFromPlugin(Sofa.Component.LinearSolver); + factory->registerObjectsFromPlugin(Sofa.Component.LinearSystem); + factory->registerObjectsFromPlugin(Sofa.Component.Mapping); + factory->registerObjectsFromPlugin(Sofa.Component.Mass); + factory->registerObjectsFromPlugin(Sofa.Component.MechanicalLoad); + factory->registerObjectsFromPlugin(Sofa.Component.ODESolver); + factory->registerObjectsFromPlugin(Sofa.Component.Playback); + factory->registerObjectsFromPlugin(Sofa.Component.SceneUtility); + factory->registerObjectsFromPlugin(Sofa.Component.Setting); + factory->registerObjectsFromPlugin(Sofa.Component.SolidMechanics); + factory->registerObjectsFromPlugin(Sofa.Component.StateContainer); + factory->registerObjectsFromPlugin(Sofa.Component.Topology); + factory->registerObjectsFromPlugin(Sofa.Component.Visual); } void init() diff --git a/Sofa/Component/test/CMakeLists.txt b/Sofa/Component/test/CMakeLists.txt new file mode 100644 index 00000000000..ae42441ddc2 --- /dev/null +++ b/Sofa/Component/test/CMakeLists.txt @@ -0,0 +1,37 @@ +cmake_minimum_required(VERSION 3.22) + +project(Sofa.Component_test) + +set(SOURCE_FILES + Modules_test.cpp +) + +set(HEADER_FILES + Modules_test.h.in +) + +# The following block of code will generate a unit test for each of the target starting with Sofa.Component.* +# It checks that there is a corresponding data structure in Sofa.Config (otherwise it does not compile), and that the +# data structure converts to a string matching the target name. +set(ALL_SOFA_MODULES) +sofa_get_all_targets(all_targets "${CMAKE_SOURCE_DIR}") +foreach(target ${all_targets}) + if(target MATCHES "Sofa.Component.*" + AND NOT target MATCHES ".*_relocatable_install" + AND NOT target MATCHES ".*_test" + AND NOT target MATCHES ".*_simutest" + AND NOT target MATCHES ".*Testing") + string(REPLACE "." "" noDotTarget ${target}) #gtest does not like dots in test names + set(ALL_SOFA_MODULES "${ALL_SOFA_MODULES}\\\nTEST(SofaComponent, ${noDotTarget}){EXPECT_EQ(static_cast(${target}), \"${target}\");}") + endif() +endforeach() + +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/Modules_test.h.in + ${CMAKE_CURRENT_BINARY_DIR}/Modules_test.h) + +add_executable(${PROJECT_NAME} ${SOURCE_FILES} ${HEADER_FILES}) +target_link_libraries(${PROJECT_NAME} Sofa.Testing) +target_include_directories(${PROJECT_NAME} PRIVATE "${CMAKE_CURRENT_BINARY_DIR}") + +add_test(NAME ${PROJECT_NAME} COMMAND ${PROJECT_NAME}) diff --git a/Sofa/Component/test/Modules_test.cpp b/Sofa/Component/test/Modules_test.cpp new file mode 100644 index 00000000000..389379fef85 --- /dev/null +++ b/Sofa/Component/test/Modules_test.cpp @@ -0,0 +1,25 @@ +/****************************************************************************** +* SOFA, Simulation Open-Framework Architecture * +* (c) 2006 INRIA, USTL, UJF, CNRS, MGH * +* * +* This program is free software; you can redistribute it and/or modify it * +* under the terms of the GNU Lesser General Public License as published by * +* the Free Software Foundation; either version 2.1 of the License, or (at * +* your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, but WITHOUT * +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * +* for more details. * +* * +* You should have received a copy of the GNU Lesser General Public License * +* along with this program. If not, see . * +******************************************************************************* +* Authors: The SOFA Team and external contributors (see Authors.txt) * +* * +* Contact information: contact@sofa-framework.org * +******************************************************************************/ +#include +#include + +ALL_SOFA_MODULES diff --git a/applications/plugins/SofaSimpleGUI/config.h.in b/Sofa/Component/test/Modules_test.h.in similarity index 86% rename from applications/plugins/SofaSimpleGUI/config.h.in rename to Sofa/Component/test/Modules_test.h.in index 5b9af608bb5..85dd4b6b3bf 100644 --- a/applications/plugins/SofaSimpleGUI/config.h.in +++ b/Sofa/Component/test/Modules_test.h.in @@ -19,16 +19,7 @@ * * * Contact information: contact@sofa-framework.org * ******************************************************************************/ -#ifndef SOFASIMPLEGUI_CONFIG_H -#define SOFASIMPLEGUI_CONFIG_H - #include +#include -#ifdef SOFA_BUILD_SOFASIMPLEGUI -# define SOFA_TARGET SofaSimpleGUI -# define SOFA_SOFASIMPLEGUI_API SOFA_EXPORT_DYNAMIC_LIBRARY -#else -# define SOFA_SOFASIMPLEGUI_API SOFA_IMPORT_DYNAMIC_LIBRARY -#endif - -#endif +#cmakedefine ALL_SOFA_MODULES @ALL_SOFA_MODULES@ diff --git a/Sofa/GL/Component/Rendering2D/tests/OglLabel_test.cpp b/Sofa/GL/Component/Rendering2D/tests/OglLabel_test.cpp index 384a424251b..72092164165 100644 --- a/Sofa/GL/Component/Rendering2D/tests/OglLabel_test.cpp +++ b/Sofa/GL/Component/Rendering2D/tests/OglLabel_test.cpp @@ -53,9 +53,9 @@ using sofa::type::RGBAColor ; class OglLabelTest : public BaseTest { public: - void SetUp() override + void doSetUp() override { - sofa::simpleapi::importPlugin("Sofa.GL.Component.Rendering2D"); + sofa::simpleapi::importPlugin(Sofa.GL.Component.Rendering2D); } void checkExcludingAttributes() diff --git a/Sofa/GL/Component/Rendering3D/CMakeLists.txt b/Sofa/GL/Component/Rendering3D/CMakeLists.txt index 112674f2623..948bc3ac2b8 100644 --- a/Sofa/GL/Component/Rendering3D/CMakeLists.txt +++ b/Sofa/GL/Component/Rendering3D/CMakeLists.txt @@ -21,7 +21,6 @@ set(SOURCE_FILES ${SOFAGLCOMPONENTRENDERING3D_SOURCE_DIR}/ClipPlane.cpp ${SOFAGLCOMPONENTRENDERING3D_SOURCE_DIR}/DataDisplay.cpp ${SOFAGLCOMPONENTRENDERING3D_SOURCE_DIR}/MergeVisualModels.cpp - ${SOFAGLCOMPONENTRENDERING3D_SOURCE_DIR}/OglCylinderModel.cpp ${SOFAGLCOMPONENTRENDERING3D_SOURCE_DIR}/OglModel.cpp ${SOFAGLCOMPONENTRENDERING3D_SOURCE_DIR}/OglSceneFrame.cpp ${SOFAGLCOMPONENTRENDERING3D_SOURCE_DIR}/PointSplatModel.cpp diff --git a/Sofa/GL/Component/Rendering3D/src/sofa/gl/component/rendering3d/OglCylinderModel.cpp b/Sofa/GL/Component/Rendering3D/src/sofa/gl/component/rendering3d/OglCylinderModel.cpp deleted file mode 100644 index 9067ba2522b..00000000000 --- a/Sofa/GL/Component/Rendering3D/src/sofa/gl/component/rendering3d/OglCylinderModel.cpp +++ /dev/null @@ -1,163 +0,0 @@ -/****************************************************************************** -* SOFA, Simulation Open-Framework Architecture * -* (c) 2006 INRIA, USTL, UJF, CNRS, MGH * -* * -* This program is free software; you can redistribute it and/or modify it * -* under the terms of the GNU Lesser General Public License as published by * -* the Free Software Foundation; either version 2.1 of the License, or (at * -* your option) any later version. * -* * -* This program is distributed in the hope that it will be useful, but WITHOUT * -* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * -* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * -* for more details. * -* * -* You should have received a copy of the GNU Lesser General Public License * -* along with this program. If not, see . * -******************************************************************************* -* Authors: The SOFA Team and external contributors (see Authors.txt) * -* * -* Contact information: contact@sofa-framework.org * -******************************************************************************/ -#include -#include -#include -#include -#include -#include -#include -#include - -namespace sofa::gl::component::rendering3d -{ - -void registerOglCylinderModel(sofa::core::ObjectFactory* factory) -{ - factory->registerObjects(core::ObjectRegistrationData("OpenGL-based visualization for a cylinders over edges.") - .add< OglCylinderModel >()); -} - -using namespace sofa::defaulttype; -using namespace sofa::core::topology; - -OglCylinderModel::OglCylinderModel() - : radius(initData(&radius, 1.0f, "radius", "Radius of the cylinder.")), - color(initData(&color, sofa::type::RGBAColor(1.0,1.0,1.0,1.0), "color", "Color of the cylinders.")) - , d_edges(initData(&d_edges,"edges","List of edge indices")) - // , pointData(initData(&pointData, "pointData", "scalar field modulating point colors")) -{ -} - -OglCylinderModel::~OglCylinderModel() -{ -} - -void OglCylinderModel::init() -{ - VisualModel::init(); - - reinit(); -} - -void OglCylinderModel::doDrawVisual(const core::visual::VisualParams* vparams) -{ - const VecCoord& pos = this->read( core::vec_id::read_access::position )->getValue(); - - vparams->drawTool()->setLightingEnabled(true); - const float _radius = radius.getValue(); - - const sofa::type::RGBAColor col( r, g, b, a ); - - const SeqEdges& edges = d_edges.getValue(); - - for(auto edge : edges) - { - const Coord& p1 = pos[edge[0]]; - const Coord& p2 = pos[edge[1]]; - - vparams->drawTool()->drawCylinder(p1,p2,_radius,col); - } -} - - -void OglCylinderModel::setColor(float r, float g, float b, float a) -{ - this->r = r; - this->g = g; - this->b = b; - this->a = a; -} - -static int hexval(char c) -{ - if (c>='0' && c<='9') return c-'0'; - else if (c>='a' && c<='f') return (c-'a')+10; - else if (c>='A' && c<='F') return (c-'A')+10; - else return 0; -} - -void OglCylinderModel::setColor(std::string color) -{ - if (color.empty()) return; - float r = 1.0f; - float g = 1.0f; - float b = 1.0f; - float a = 1.0f; - if (color[0]>='0' && color[0]<='9') - { - sscanf(color.c_str(),"%f %f %f %f", &r, &g, &b, &a); - } - else if (color[0]=='#' && color.length()>=7) - { - r = (hexval(color[1])*16+hexval(color[2]))/255.0f; - g = (hexval(color[3])*16+hexval(color[4]))/255.0f; - b = (hexval(color[5])*16+hexval(color[6]))/255.0f; - if (color.length()>=9) - a = (hexval(color[7])*16+hexval(color[8]))/255.0f; - } - else if (color[0]=='#' && color.length()>=4) - { - r = (hexval(color[1])*17)/255.0f; - g = (hexval(color[2])*17)/255.0f; - b = (hexval(color[3])*17)/255.0f; - if (color.length()>=5) - a = (hexval(color[4])*17)/255.0f; - } - else if (color == "white") { r = 1.0f; g = 1.0f; b = 1.0f; } - else if (color == "black") { r = 0.0f; g = 0.0f; b = 0.0f; } - else if (color == "red") { r = 1.0f; g = 0.0f; b = 0.0f; } - else if (color == "green") { r = 0.0f; g = 1.0f; b = 0.0f; } - else if (color == "blue") { r = 0.0f; g = 0.0f; b = 1.0f; } - else if (color == "cyan") { r = 0.0f; g = 1.0f; b = 1.0f; } - else if (color == "magenta") { r = 1.0f; g = 0.0f; b = 1.0f; } - else if (color == "yellow") { r = 1.0f; g = 1.0f; b = 0.0f; } - else if (color == "gray") { r = 0.5f; g = 0.5f; b = 0.5f; } - else - { - msg_error() << "Unknown color " << color; - return; - } - setColor(r,g,b,a); -} - -void OglCylinderModel::exportOBJ(std::string name, std::ostream* out, std::ostream* /*mtl*/, Index& vindex, Index& /*nindex*/, Index& /*tindex*/, int& /*count*/) -{ - const VecCoord& x = this->read( core::vec_id::read_access::position )->getValue(); - const SeqEdges& edges = d_edges.getValue(); - - const int nbv = int(x.size()); - - *out << "g "< +#include -#include -#include -#include -#include -#include -#include +SOFA_HEADER_DEPRECATED("v24.12", "v25.06", "sofa/component/visual/CylinderVisualModel.h") -namespace sofa::core::topology -{ - class BaseMeshTopology; -} // namespace sofa::core::topology - -namespace sofa::core::behavior -{ - class BaseMechanicalState; -} // namespace sofa::core::behavior +#include namespace sofa::gl::component::rendering3d { - -// I have no idea what is Ogl in this component ?... -class SOFA_GL_COMPONENT_RENDERING3D_API OglCylinderModel : public core::visual::VisualModel, public sofa::core::visual::VisualState -{ -public: - using Vec3State = sofa::core::visual::VisualState; - SOFA_CLASS2(OglCylinderModel,core::visual::VisualModel, Vec3State); - - using Index = sofa::Index; -protected: - OglCylinderModel(); - ~OglCylinderModel() override; -public: - void init() override; - - void doDrawVisual(const core::visual::VisualParams* vparams) override; - - void exportOBJ(std::string /*name*/, std::ostream* /*out*/, std::ostream* /*mtl*/, Index& /*vindex*/, Index& /*nindex*/, Index& /*tindex*/, int& /*count*/) override; - -private: - void setColor(float r, float g, float b, float a); - void setColor(std::string color); - -private: - Data radius; ///< Radius of the cylinder. - // Data alpha; - Data color; ///< Color of the cylinders. - - typedef sofa::type::vector SeqEdges; - Data d_edges; ///< List of edge indices - - - float r,g,b,a; - // sofa::core::topology::PointData > pointData; - - typedef Vec3State::Coord Coord; - typedef Vec3State::VecCoord VecCoord; - typedef Vec3State::Real Real; - -public: - bool insertInNode( core::objectmodel::BaseNode* node ) override { Inherit1::insertInNode(node); Inherit2::insertInNode(node); return true; } - bool removeInNode( core::objectmodel::BaseNode* node ) override { Inherit1::removeInNode(node); Inherit2::removeInNode(node); return true; } -}; - -} // namespace sofa::gl::component::rendering3d +using OglCylinderModel = sofa::component::visual::CylinderVisualModel; +} diff --git a/Sofa/GL/Component/Rendering3D/src/sofa/gl/component/rendering3d/OglModel.cpp b/Sofa/GL/Component/Rendering3D/src/sofa/gl/component/rendering3d/OglModel.cpp index 1f88ebc2905..1e6341d4f12 100644 --- a/Sofa/GL/Component/Rendering3D/src/sofa/gl/component/rendering3d/OglModel.cpp +++ b/Sofa/GL/Component/Rendering3D/src/sofa/gl/component/rendering3d/OglModel.cpp @@ -59,7 +59,7 @@ OglModel::OglModel() , blendEquation( initData(&blendEquation, "blendEquation", "if alpha blending is enabled this specifies how source and destination colors are combined") ) , sourceFactor( initData(&sourceFactor, "sfactor", "if alpha blending is enabled this specifies how the red, green, blue, and alpha source blending factors are computed") ) , destFactor( initData(&destFactor, "dfactor", "if alpha blending is enabled this specifies how the red, green, blue, and alpha destination blending factors are computed") ) - , tex(nullptr) + , m_tex(nullptr) , vbo(0), iboEdges(0), iboTriangles(0), iboQuads(0) , VBOGenDone(false), initDone(false), useEdges(false), useTriangles(false), useQuads(false), canUsePatches(false) , oldVerticesSize(0), oldNormalsSize(0), oldTexCoordsSize(0), oldTangentsSize(0), oldBitangentsSize(0), oldEdgesSize(0), oldTrianglesSize(0), oldQuadsSize(0) @@ -88,11 +88,16 @@ void OglModel::parse(core::objectmodel::BaseObjectDescription* arg) void OglModel::deleteTextures() { - if (tex!=nullptr) delete tex; + if (m_tex != nullptr) + { + delete m_tex; + m_tex = nullptr; + } for (unsigned int i = 0 ; i < textures.size() ; i++) { delete textures[i]; + textures[i] = nullptr; } } @@ -162,7 +167,7 @@ void OglModel::drawGroup(int ig, bool transparent) if (transparent ^ isTransparent) return; - if (!tex && m.useTexture && m.activated) + if (!m_tex && m.useTexture && m.activated) { //get the texture id corresponding to the current material size_t indexInTextureArray = size_t(materialTextureIdMap[g.materialId]); @@ -288,7 +293,7 @@ void OglModel::drawGroup(int ig, bool transparent) glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } - if (!tex && m.useTexture && m.activated) + if (!m_tex && m.useTexture && m.activated) { int indexInTextureArray = materialTextureIdMap[g.materialId]; if (indexInTextureArray < int(textures.size()) && textures[size_t(indexInTextureArray)]) @@ -379,12 +384,12 @@ void OglModel::internalDraw(const core::visual::VisualParams* vparams, bool tran glEnableClientState(GL_NORMAL_ARRAY); glEnableClientState(GL_VERTEX_ARRAY); - if ((tex || d_putOnlyTexCoords.getValue()) ) + if ((m_tex || d_putOnlyTexCoords.getValue()) ) { - if(tex) + if(m_tex) { glEnable(GL_TEXTURE_2D); - tex->bind(); + m_tex->bind(); } const size_t textureArrayByteSize = vtexcoords.size()*sizeof(vtexcoords[0]); @@ -522,11 +527,11 @@ void OglModel::internalDraw(const core::visual::VisualParams* vparams, bool tran glDepthMask(GL_TRUE); } - if ( (tex || d_putOnlyTexCoords.getValue()) ) + if ( (m_tex || d_putOnlyTexCoords.getValue()) ) { - if (tex) + if (m_tex) { - tex->unbind(); + m_tex->unbind(); glDisable(GL_TEXTURE_2D); } glDisableClientState(GL_TEXTURE_COORD_ARRAY); @@ -582,7 +587,7 @@ bool OglModel::hasTransparent() bool OglModel::hasTexture() { - return !textures.empty() || tex; + return !textures.empty() || m_tex; } bool OglModel::loadTexture(const std::string& filename) @@ -590,7 +595,7 @@ bool OglModel::loadTexture(const std::string& filename) helper::io::Image *img = helper::io::Image::Create(filename); if (!img) return false; - tex = new sofa::gl::Texture(img, true, true, false, d_srgbTexturing.getValue()); + m_tex = new sofa::gl::Texture(img, true, true, false, d_srgbTexturing.getValue()); return true; } @@ -696,9 +701,9 @@ void OglModel::doInitVisual(const core::visual::VisualParams*) void OglModel::initTextures() { - if (tex) + if (m_tex) { - tex->init(); + m_tex->init(); } else { @@ -755,7 +760,7 @@ void OglModel::initVertexBuffer() positionsBufferSize = (vertices.size()*sizeof(Vec3f)); normalsBufferSize = (vnormals.size()*sizeof(Vec3f)); - if (tex || d_putOnlyTexCoords.getValue() || !textures.empty()) + if (m_tex || d_putOnlyTexCoords.getValue() || !textures.empty()) { textureCoordsBufferSize = vtexcoords.size() * sizeof(vtexcoords[0]); @@ -847,7 +852,7 @@ void OglModel::updateVertexBuffer() positionsBufferSize = (vertices.size()*sizeof(Vec3f)); normalsBufferSize = (vnormals.size()*sizeof(Vec3f)); - if (tex || d_putOnlyTexCoords.getValue() || !textures.empty()) + if (m_tex || d_putOnlyTexCoords.getValue() || !textures.empty()) { textureCoordsBufferSize = (vtexcoords.size() * sizeof(vtexcoords[0])); @@ -873,7 +878,7 @@ void OglModel::updateVertexBuffer() normalBuffer); ////Texture coords - if (tex || d_putOnlyTexCoords.getValue() || !textures.empty()) + if (m_tex || d_putOnlyTexCoords.getValue() || !textures.empty()) { glBufferSubData(GL_ARRAY_BUFFER, positionsBufferSize + normalsBufferSize, diff --git a/Sofa/GL/Component/Rendering3D/src/sofa/gl/component/rendering3d/OglModel.h b/Sofa/GL/Component/Rendering3D/src/sofa/gl/component/rendering3d/OglModel.h index d5ff3338b15..672710715ec 100644 --- a/Sofa/GL/Component/Rendering3D/src/sofa/gl/component/rendering3d/OglModel.h +++ b/Sofa/GL/Component/Rendering3D/src/sofa/gl/component/rendering3d/OglModel.h @@ -74,7 +74,7 @@ class SOFA_GL_COMPONENT_RENDERING3D_API OglModel : public sofa::component::visua Data destFactor; ///< if alpha blending is enabled this specifies how the red, green, blue, and alpha destination blending factors are computed GLenum blendEq, sfactor, dfactor; - sofa::gl::Texture *tex; //this texture is used only if a texture name is specified in the scn + sofa::gl::Texture *m_tex; //this texture is used only if a texture name is specified in the scn GLuint vbo, iboEdges, iboTriangles, iboQuads; bool VBOGenDone, initDone, useEdges, useTriangles, useQuads, canUsePatches; size_t oldVerticesSize, oldNormalsSize, oldTexCoordsSize, oldTangentsSize, oldBitangentsSize, oldEdgesSize, oldTrianglesSize, oldQuadsSize; @@ -126,7 +126,7 @@ class SOFA_GL_COMPONENT_RENDERING3D_API OglModel : public sofa::component::visua bool isUseTriangles() { return useTriangles; } bool isUseQuads() { return useQuads; } - sofa::gl::Texture* getTex() const { return tex; } + sofa::gl::Texture* getTex() const { return m_tex; } GLuint getVbo() { return vbo; } GLuint getIboEdges() { return iboEdges; } GLuint getIboTriangles() { return iboTriangles; } diff --git a/Sofa/GL/Component/Rendering3D/src/sofa/gl/component/rendering3d/init.cpp b/Sofa/GL/Component/Rendering3D/src/sofa/gl/component/rendering3d/init.cpp index a4096afa836..61a827c7dea 100644 --- a/Sofa/GL/Component/Rendering3D/src/sofa/gl/component/rendering3d/init.cpp +++ b/Sofa/GL/Component/Rendering3D/src/sofa/gl/component/rendering3d/init.cpp @@ -29,7 +29,6 @@ namespace sofa::gl::component::rendering3d extern void registerClipPlane(sofa::core::ObjectFactory* factory); extern void registerDataDisplay(sofa::core::ObjectFactory* factory); extern void registerMergeVisualModels(sofa::core::ObjectFactory* factory); -extern void registerOglCylinderModel(sofa::core::ObjectFactory* factory); extern void registerOglModel(sofa::core::ObjectFactory* factory); extern void registerOglSceneFrame(sofa::core::ObjectFactory* factory); extern void registerPointSplatModel(sofa::core::ObjectFactory* factory); @@ -62,7 +61,6 @@ void registerObjects(sofa::core::ObjectFactory* factory) registerClipPlane(factory); registerDataDisplay(factory); registerMergeVisualModels(factory); - registerOglCylinderModel(factory); registerOglModel(factory); registerOglSceneFrame(factory); registerPointSplatModel(factory); diff --git a/Sofa/GL/Component/Rendering3D/tests/ClipPlane_test.cpp b/Sofa/GL/Component/Rendering3D/tests/ClipPlane_test.cpp index f596ef6ebe9..ea821661307 100644 --- a/Sofa/GL/Component/Rendering3D/tests/ClipPlane_test.cpp +++ b/Sofa/GL/Component/Rendering3D/tests/ClipPlane_test.cpp @@ -60,10 +60,10 @@ int messageInited = initMessage(); class TestClipPlane : public BaseTest { public: - void SetUp() override + void doSetUp() override { - sofa::simpleapi::importPlugin("Sofa.GL.Component.Rendering3D"); - sofa::simpleapi::importPlugin("Sofa.Component.StateContainer"); + sofa::simpleapi::importPlugin(Sofa.GL.Component.Rendering3D); + sofa::simpleapi::importPlugin(Sofa.Component.StateContainer); } void checkClipPlaneValidAttributes(); diff --git a/Sofa/GL/Component/Shader/tests/LightManager_test.cpp b/Sofa/GL/Component/Shader/tests/LightManager_test.cpp index cde4ddc5a17..21da2ac3c47 100644 --- a/Sofa/GL/Component/Shader/tests/LightManager_test.cpp +++ b/Sofa/GL/Component/Shader/tests/LightManager_test.cpp @@ -53,10 +53,10 @@ namespace sofa { struct TestLightManager : public BaseTest { - void SetUp() override + void doSetUp() override { - sofa::simpleapi::importPlugin("Sofa.GL.Component.Shader"); - sofa::simpleapi::importPlugin("Sofa.Component.StateContainer"); + sofa::simpleapi::importPlugin(Sofa.GL.Component.Shader); + sofa::simpleapi::importPlugin(Sofa.Component.StateContainer); } }; @@ -94,7 +94,7 @@ void checkAttributes() TEST_F(TestLightManager, checkAttributes) { - sofa::simpleapi::importPlugin("Sofa.GL.Component.Shader"); + sofa::simpleapi::importPlugin(Sofa.GL.Component.Shader); checkAttributes(); } diff --git a/Sofa/GL/Component/Shader/tests/Light_test.cpp b/Sofa/GL/Component/Shader/tests/Light_test.cpp index 29fbf100cf3..2a83d5535a5 100644 --- a/Sofa/GL/Component/Shader/tests/Light_test.cpp +++ b/Sofa/GL/Component/Shader/tests/Light_test.cpp @@ -48,10 +48,10 @@ int messageInited = initMessage(); class TestLight : public BaseTest { public: - void SetUp() override + void doSetUp() override { - sofa::simpleapi::importPlugin("Sofa.GL.Component.Shader"); - sofa::simpleapi::importPlugin("Sofa.Component.StateContainer"); + sofa::simpleapi::importPlugin(Sofa.GL.Component.Shader); + sofa::simpleapi::importPlugin(Sofa.Component.StateContainer); } void checkSpotLightValidAttributes(); diff --git a/Sofa/GUI/Component/src/sofa/gui/component/performer/ConstraintAttachBodyPerformer.inl b/Sofa/GUI/Component/src/sofa/gui/component/performer/ConstraintAttachBodyPerformer.inl index a64f733f7d2..fad3af6dc4b 100644 --- a/Sofa/GUI/Component/src/sofa/gui/component/performer/ConstraintAttachBodyPerformer.inl +++ b/Sofa/GUI/Component/src/sofa/gui/component/performer/ConstraintAttachBodyPerformer.inl @@ -97,7 +97,7 @@ bool ConstraintAttachBodyPerformer::startPartial(const BodyPicked& pi this->m_interactionObject = sofa::core::objectmodel::New >(m_mstate1, m_mstate2); auto* bconstraint = dynamic_cast< BilateralLagrangianConstraint< DataTypes >* >(this->m_interactionObject.get()); - if constexpr (sofa::type::isRigidType()) + if constexpr (sofa::type::isRigidType) { // BilateralLagrangianConstraint::d_keepOrientDiff is protected auto* keepOrientDiffBaseData = bconstraint->findData("keepOrientationDifference"); diff --git a/Sofa/GUI/Qt/src/sofa/gui/qt/GraphListenerQListView.cpp b/Sofa/GUI/Qt/src/sofa/gui/qt/GraphListenerQListView.cpp index 2b529ba25fa..0a57b822880 100644 --- a/Sofa/GUI/Qt/src/sofa/gui/qt/GraphListenerQListView.cpp +++ b/Sofa/GUI/Qt/src/sofa/gui/qt/GraphListenerQListView.cpp @@ -154,7 +154,6 @@ QPixmap* getPixmap(core::objectmodel::Base* obj, bool haveInfo, bool haveWarning if(haveErrors) flags |= 1 << (4) ; - static std::map pixmaps; if (!pixmaps.count(flags)) { @@ -236,10 +235,10 @@ QPixmap* getPixmap(core::objectmodel::Base* obj, bool haveInfo, bool haveWarning flags |= 1 << (ALLCOLORS+1) ; if(haveWarning) - flags |= 1 << (ALLCOLORS+1) ; + flags |= 1 << (ALLCOLORS+2) ; if(haveErrors) - flags |= 1 << (ALLCOLORS+1) ; + flags |= 1 << (ALLCOLORS+3) ; static std::map pixmaps; if (!pixmaps.count(flags)) @@ -249,10 +248,8 @@ QPixmap* getPixmap(core::objectmodel::Base* obj, bool haveInfo, bool haveWarning if (flags & (1<setAlphaBuffer(true); img->fill(qRgba(0,0,0,0)); // Workaround for qt 3.x where fill() does not set the alpha channel for (int y=0 ; y < iconHeight ; y++) diff --git a/Sofa/GUI/Qt/src/sofa/gui/qt/SimpleDataWidget.cpp b/Sofa/GUI/Qt/src/sofa/gui/qt/SimpleDataWidget.cpp index 7942456a333..0cca21cc8c3 100644 --- a/Sofa/GUI/Qt/src/sofa/gui/qt/SimpleDataWidget.cpp +++ b/Sofa/GUI/Qt/src/sofa/gui/qt/SimpleDataWidget.cpp @@ -241,8 +241,8 @@ SelectableItemWidget::SelectableItemWidget(QWidget* parent, const char* name, bool SelectableItemWidget::createWidgets() { - if (Tdata && Tdata->getValueTypeString() != "SelectableItem" || - baseData && baseData->getValueTypeString() != "SelectableItem") + if ((Tdata && Tdata->getValueTypeString() != "SelectableItem") || + (baseData && baseData->getValueTypeString() != "SelectableItem")) { return false; } diff --git a/Sofa/framework/Config/CMakeLists.txt b/Sofa/framework/Config/CMakeLists.txt index 4683959c252..e1374daf83c 100644 --- a/Sofa/framework/Config/CMakeLists.txt +++ b/Sofa/framework/Config/CMakeLists.txt @@ -85,6 +85,7 @@ set(HEADER_FILES ${SOFACONFIGSRC_ROOT}/config.h.in ${SOFACONFIGSRC_ROOT}/version.h.in ${SOFACONFIGSRC_ROOT}/url.h.in + ${SOFACONFIGSRC_ROOT}/Modules.h ) set(SOURCE_FILES ${SOFACONFIGSRC_ROOT}/initSofaConfig.cpp # necessary to build a library @@ -105,8 +106,8 @@ if((CMAKE_SYSTEM_NAME STREQUAL Windows) AND SOFA_USE_DEPENDENCY_PACK) endif() # Compile options -# Set C++17 -target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_17) +# Set C++20 +target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_20) set(SOFACONFIG_COMPILE_OPTIONS_DEBUG "") set(SOFACONFIG_COMPILE_OPTIONS_RELEASE "") diff --git a/Sofa/framework/Config/cmake/SofaMacrosUtils.cmake b/Sofa/framework/Config/cmake/SofaMacrosUtils.cmake index bff05bcce1f..bb4aa5490cc 100644 --- a/Sofa/framework/Config/cmake/SofaMacrosUtils.cmake +++ b/Sofa/framework/Config/cmake/SofaMacrosUtils.cmake @@ -42,6 +42,12 @@ endmacro() function(sofa_get_all_targets var) set(targets) - __get_all_targets_recursive(targets ${CMAKE_CURRENT_SOURCE_DIR}) + + set(source_dir ${ARGV1}) #optional argument to define the source directory + if(NOT DEFINED source_dir) + set(source_dir "${CMAKE_CURRENT_SOURCE_DIR}") # Set a default value + endif() + + __get_all_targets_recursive(targets ${source_dir}) set(${var} ${targets} PARENT_SCOPE) endfunction() diff --git a/Sofa/framework/Config/src/sofa/Modules.h b/Sofa/framework/Config/src/sofa/Modules.h new file mode 100644 index 00000000000..a02c7962c1e --- /dev/null +++ b/Sofa/framework/Config/src/sofa/Modules.h @@ -0,0 +1,179 @@ +/****************************************************************************** +* SOFA, Simulation Open-Framework Architecture * +* (c) 2006 INRIA, USTL, UJF, CNRS, MGH * +* * +* This program is free software; you can redistribute it and/or modify it * +* under the terms of the GNU Lesser General Public License as published by * +* the Free Software Foundation; either version 2.1 of the License, or (at * +* your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, but WITHOUT * +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * +* for more details. * +* * +* You should have received a copy of the GNU Lesser General Public License * +* along with this program. If not, see . * +******************************************************************************* +* Authors: The SOFA Team and external contributors (see Authors.txt) * +* * +* Contact information: contact@sofa-framework.org * +******************************************************************************/ +#pragma once +#include + +/** + * The macro allows a simpler definition and maintenance of the module data + * structure + * @param name Module name + */ +#define START_MODULE(name, fullModuleName)\ + private:\ + struct Module ## name\ + {\ + private:\ + static constexpr const char* moduleName = fullModuleName;\ + public:\ + Module ## name() = default;\ + Module ## name(const Module ## name&) = delete;\ + Module ## name& operator=(const Module ## name&) = delete;\ + operator std::string() const { return moduleName; } + +#define END_MODULE(name)\ + };\ + public:\ + Module ## name name; + +#define MODULE(name, fullModuleName) \ + START_MODULE(name, fullModuleName) END_MODULE(name) + +inline struct ModuleSofa +{ +private: + static constexpr const char* moduleName = "Sofa"; +public: + ModuleSofa() = default; + ModuleSofa(const ModuleSofa&) = delete; + ModuleSofa& operator=(const ModuleSofa&) = delete; + operator std::string() const { return moduleName; } + + START_MODULE(Component, "Sofa.Component") + MODULE(AnimationLoop, "Sofa.Component.AnimationLoop") + START_MODULE(Collision, "Sofa.Component.Collision") + START_MODULE(Detection, "Sofa.Component.Collision.Detection") + MODULE(Algorithm, "Sofa.Component.Collision.Detection.Algorithm") + MODULE(Intersection, "Sofa.Component.Collision.Detection.Intersection") + END_MODULE(Detection) + MODULE(Geometry, "Sofa.Component.Collision.Geometry") + START_MODULE(Response, "Sofa.Component.Collision.Response") + MODULE(Contact, "Sofa.Component.Collision.Response.Contact") + MODULE(Mapper, "Sofa.Component.Collision.Response.Mapper") + END_MODULE(Response) + END_MODULE(Collision) + + START_MODULE(Constraint, "Sofa.Component.Constraint") + START_MODULE(Lagrangian, "Sofa.Component.Constraint.Lagrangian") + MODULE(Correction, "Sofa.Component.Constraint.Lagrangian.Correction") + MODULE(Model, "Sofa.Component.Constraint.Lagrangian.Model") + MODULE(Solver, "Sofa.Component.Constraint.Lagrangian.Solver") + END_MODULE(Lagrangian) + + MODULE(Projective, "Sofa.Component.Constraint.Projective") + END_MODULE(Constraint) + + MODULE(Controller, "Sofa.Component.Controller") + MODULE(Diffusion, "Sofa.Component.Diffusion") + + START_MODULE(Engine, "Sofa.Component.Engine") + MODULE(Analyze, "Sofa.Component.Engine.Analyze") + MODULE(Generate, "Sofa.Component.Engine.Generate") + MODULE(Select, "Sofa.Component.Engine.Select") + MODULE(Transform, "Sofa.Component.Engine.Transform") + END_MODULE(Engine) + + MODULE(Haptics, "Sofa.Component.Haptics") + + START_MODULE(IO, "Sofa.Component.IO") + MODULE(Mesh, "Sofa.Component.IO.Mesh") + END_MODULE(IO) + + START_MODULE(LinearSolver, "Sofa.Component.LinearSolver") + MODULE(Direct, "Sofa.Component.LinearSolver.Direct") + MODULE(Iterative, "Sofa.Component.LinearSolver.Iterative") + MODULE(Ordering, "Sofa.Component.LinearSolver.Ordering") + MODULE(Preconditioner, "Sofa.Component.LinearSolver.Preconditioner") + END_MODULE(LinearSolver) + + MODULE(LinearSystem, "Sofa.Component.LinearSystem") + + START_MODULE(Mapping, "Sofa.Component.Mapping") + MODULE(Linear, "Sofa.Component.Mapping.Linear") + MODULE(MappedMatrix, "Sofa.Component.Mapping.MappedMatrix") + MODULE(NonLinear, "Sofa.Component.Mapping.NonLinear") + END_MODULE(Mapping) + + MODULE(Mass, "Sofa.Component.Mass") + MODULE(MechanicalLoad, "Sofa.Component.MechanicalLoad") + + START_MODULE(ODESolver, "Sofa.Component.ODESolver") + MODULE(Backward, "Sofa.Component.ODESolver.Backward") + MODULE(Forward, "Sofa.Component.ODESolver.Forward") + END_MODULE(ODESolver) + + MODULE(Playback, "Sofa.Component.Playback") + MODULE(SceneUtility, "Sofa.Component.SceneUtility") + MODULE(Setting, "Sofa.Component.Setting") + + START_MODULE(SolidMechanics, "Sofa.Component.SolidMechanics") + START_MODULE(FEM, "Sofa.Component.SolidMechanics.FEM") + MODULE(Elastic, "Sofa.Component.SolidMechanics.FEM.Elastic") + MODULE(HyperElastic, "Sofa.Component.SolidMechanics.FEM.HyperElastic") + MODULE(NonUniform, "Sofa.Component.SolidMechanics.FEM.NonUniform") + END_MODULE(FEM) + + MODULE(Spring, "Sofa.Component.SolidMechanics.Spring") + MODULE(TensorMass, "Sofa.Component.SolidMechanics.TensorMass") + END_MODULE(SolidMechanics) + + MODULE(StateContainer, "Sofa.Component.StateContainer") + + START_MODULE(Topology, "Sofa.Component.Topology") + START_MODULE(Container, "Sofa.Component.Topology.Container") + MODULE(Constant, "Sofa.Component.Topology.Container.Constant") + MODULE(Dynamic, "Sofa.Component.Topology.Container.Dynamic") + MODULE(Grid, "Sofa.Component.Topology.Container.Grid") + END_MODULE(Container) + MODULE(Mapping, "Sofa.Component.Topology.Mapping") + MODULE(Utility, "Sofa.Component.Topology.Utility") + END_MODULE(Topology) + + MODULE(Visual, "Sofa.Component.Visual") + END_MODULE(Component) + + START_MODULE(GL, "Sofa.GL") + START_MODULE(Component, "Sofa.GL.Component") + MODULE(Engine, "Sofa.GL.Component.Engine") + MODULE(Rendering2D, "Sofa.GL.Component.Rendering2D") + MODULE(Rendering3D, "Sofa.GL.Component.Rendering3D") + MODULE(Shader, "Sofa.GL.Component.Shader") + END_MODULE(Component) + END_MODULE(GL) + + START_MODULE(GUI, "Sofa.GUI") + MODULE(Component, "Sofa.GUI.Component") + END_MODULE(GUI) + +} +/** + * Nested data structure reproducing the architecture of SOFA modules (tree-like + * structure). All modules and submodules can convert implicitly to std::string. + * This allows to use this structure as a string in functions accepting a module + * name as a string. From the developer point of view, the use of this data + * structure is less error-prone compared to any string and the auto-completion + * allows faster developments. + */ +Sofa; + +#undef START_MODULE +#undef END_MODULE +#undef MODULE diff --git a/Sofa/framework/Core/CMakeLists.txt b/Sofa/framework/Core/CMakeLists.txt index 4910d364c28..35669bcbb87 100644 --- a/Sofa/framework/Core/CMakeLists.txt +++ b/Sofa/framework/Core/CMakeLists.txt @@ -28,6 +28,7 @@ set(HEADER_FILES ${SRC_ROOT}/ExecParams.h ${SRC_ROOT}/fwd.h ${SRC_ROOT}/init.h + ${SRC_ROOT}/IntrusiveObject.h ${SRC_ROOT}/Mapping.h ${SRC_ROOT}/Mapping.inl ${SRC_ROOT}/MappingHelper.h @@ -150,8 +151,6 @@ set(HEADER_FILES ${SRC_ROOT}/objectmodel/DataFileName.h ${SRC_ROOT}/objectmodel/DataFileNameVector.h ${SRC_ROOT}/objectmodel/DataLink.h - ${SRC_ROOT}/objectmodel/DeprecatedData.h - ${SRC_ROOT}/objectmodel/RemovedData.h ${SRC_ROOT}/objectmodel/DetachNodeEvent.h ${SRC_ROOT}/objectmodel/Event.h ${SRC_ROOT}/objectmodel/GUIEvent.h @@ -160,9 +159,11 @@ set(HEADER_FILES ${SRC_ROOT}/objectmodel/JoystickEvent.h ${SRC_ROOT}/objectmodel/KeypressedEvent.h ${SRC_ROOT}/objectmodel/KeyreleasedEvent.h + ${SRC_ROOT}/objectmodel/lifecycle/DeprecatedData.h + ${SRC_ROOT}/objectmodel/lifecycle/RemovedData.h + ${SRC_ROOT}/objectmodel/lifecycle/RenamedData.h ${SRC_ROOT}/objectmodel/Link.h ${SRC_ROOT}/objectmodel/MouseEvent.h - ${SRC_ROOT}/objectmodel/RenamedData.h ${SRC_ROOT}/objectmodel/SPtr.h ${SRC_ROOT}/objectmodel/ScriptEvent.h ${SRC_ROOT}/objectmodel/TypeOfInsertion.h @@ -187,6 +188,7 @@ set(HEADER_FILES ${SRC_ROOT}/topology/TopologySubsetData.cpp ${SRC_ROOT}/topology/TopologySubsetIndices.h ${SRC_ROOT}/trait/DataTypes.h + ${SRC_ROOT}/visual/BaseVisualStyle.h ${SRC_ROOT}/visual/Data[DisplayFlags].h ${SRC_ROOT}/visual/DisplayFlags.h ${SRC_ROOT}/visual/FlagTreeItem.h @@ -216,6 +218,7 @@ set(SOURCE_FILES ${SRC_ROOT}/DataTrackerCallback.cpp ${SRC_ROOT}/DataTrackerFunctor.cpp ${SRC_ROOT}/ExecParams.cpp + ${SRC_ROOT}/IntrusiveObject.cpp ${SRC_ROOT}/fwd.cpp ${SRC_ROOT}/init.cpp ${SRC_ROOT}/Mapping.cpp @@ -296,7 +299,6 @@ set(SOURCE_FILES ${SRC_ROOT}/objectmodel/DataFileNameVector.cpp ${SRC_ROOT}/objectmodel/DataLink.cpp ${SRC_ROOT}/objectmodel/DetachNodeEvent.cpp - ${SRC_ROOT}/objectmodel/DeprecatedData.cpp ${SRC_ROOT}/objectmodel/Event.cpp ${SRC_ROOT}/objectmodel/GUIEvent.cpp ${SRC_ROOT}/objectmodel/HapticDeviceEvent.cpp @@ -304,6 +306,7 @@ set(SOURCE_FILES ${SRC_ROOT}/objectmodel/JoystickEvent.cpp ${SRC_ROOT}/objectmodel/KeypressedEvent.cpp ${SRC_ROOT}/objectmodel/KeyreleasedEvent.cpp + ${SRC_ROOT}/objectmodel/lifecycle/DeprecatedData.cpp ${SRC_ROOT}/objectmodel/MouseEvent.cpp ${SRC_ROOT}/objectmodel/ScriptEvent.cpp ${SRC_ROOT}/objectmodel/Tag.cpp diff --git a/applications/plugins/SensableEmulation/config.h b/Sofa/framework/Core/src/sofa/core/IntrusiveObject.cpp similarity index 83% rename from applications/plugins/SensableEmulation/config.h rename to Sofa/framework/Core/src/sofa/core/IntrusiveObject.cpp index fbe888819f0..9b4325340f4 100644 --- a/applications/plugins/SensableEmulation/config.h +++ b/Sofa/framework/Core/src/sofa/core/IntrusiveObject.cpp @@ -19,16 +19,20 @@ * * * Contact information: contact@sofa-framework.org * ******************************************************************************/ -#ifndef SENSABLEEMULATION_CONFIG_H -#define SENSABLEEMULATION_CONFIG_H +#include -#include +namespace sofa::core +{ +void IntrusiveObject::addRef() +{ + ++ref_counter; +} -#ifdef SOFA_BUILD_SENSABLEEMULATIONPLUGIN -# define SOFA_TARGET SensableEmulation -# define SOFA_SENSABLEEMUPLUGIN_API SOFA_EXPORT_DYNAMIC_LIBRARY -#else -# define SOFA_SENSABLEEMUPLUGIN_API SOFA_IMPORT_DYNAMIC_LIBRARY -#endif - -#endif +void IntrusiveObject::release() +{ + if (ref_counter.fetch_sub(1) == 1) + { + delete this; + } +} +} diff --git a/applications/plugins/SensableEmulation/initSensableEmulation.cpp b/Sofa/framework/Core/src/sofa/core/IntrusiveObject.h similarity index 61% rename from applications/plugins/SensableEmulation/initSensableEmulation.cpp rename to Sofa/framework/Core/src/sofa/core/IntrusiveObject.h index 1c218b3ab77..0b6ed680520 100644 --- a/applications/plugins/SensableEmulation/initSensableEmulation.cpp +++ b/Sofa/framework/Core/src/sofa/core/IntrusiveObject.h @@ -19,61 +19,37 @@ * * * Contact information: contact@sofa-framework.org * ******************************************************************************/ -#include +#pragma once +#include +#include -namespace sofa +namespace sofa::core { -namespace component +/** + * The `IntrusiveObject` class implements an internal reference counting mechanism + * to manage its lifetime. It is intended to work with intrusive smart pointers like + * `boost::intrusive_ptr`. + */ +class SOFA_CORE_API IntrusiveObject { + std::atomic ref_counter { 0 }; -//Here are just several convenient functions to help user to know what contains the plugin + void addRef(); + void release(); -extern "C" { - SOFA_SENSABLEEMUPLUGIN_API void initExternalModule(); - SOFA_SENSABLEEMUPLUGIN_API const char* getModuleName(); - SOFA_SENSABLEEMUPLUGIN_API const char* getModuleVersion(); - SOFA_SENSABLEEMUPLUGIN_API const char* getModuleLicense(); - SOFA_SENSABLEEMUPLUGIN_API const char* getModuleDescription(); - SOFA_SENSABLEEMUPLUGIN_API const char* getModuleComponentList(); -} - -void initExternalModule() -{ - static bool first = true; - if (first) + friend inline void intrusive_ptr_add_ref(IntrusiveObject* p) { - first = false; + p->addRef(); } -} -const char* getModuleName() -{ - return "SensableEmulation"; -} - -const char* getModuleVersion() -{ - return "beta 1.0"; -} - -const char* getModuleLicense() -{ - return "LGPL"; -} + friend inline void intrusive_ptr_release(IntrusiveObject* p) + { + p->release(); + } -const char* getModuleDescription() -{ - return "Force feedback with sensable devices into SOFA Framework"; -} +protected: + virtual ~IntrusiveObject() = default; +}; -const char* getModuleComponentList() -{ - return "OmniDriverEmu"; } - -} // namespace component - -} // namespace sofa - - diff --git a/Sofa/framework/Core/src/sofa/core/ObjectFactory.cpp b/Sofa/framework/Core/src/sofa/core/ObjectFactory.cpp index 6f9d02cf2c8..20402e7c25f 100644 --- a/Sofa/framework/Core/src/sofa/core/ObjectFactory.cpp +++ b/Sofa/framework/Core/src/sofa/core/ObjectFactory.cpp @@ -775,7 +775,8 @@ bool ObjectFactory::registerObjectsFromPlugin(const std::string& pluginName) // do not register if it was already done before if(m_registeredPluginSet.count(pluginName) > 0) { - // msg_warning("ObjectFactory") << pluginName << " has already registered its components."; + // This warning should be generalized (i.e not only in dev mode) when runSofa will not auto-load modules/plugins by default anymore + dmsg_warning("ObjectFactory") << pluginName << " has already registered its components."; return false; } @@ -837,8 +838,8 @@ RegisterObject& RegisterObject::addCreator(std::string classname, std::string te RegisterObject::operator int() const { - //std::cout << "Implicit object registration is deprecrated since v24.06. Check #4429 for more information." << std::endl; - // msg_warning("RegisterObject") << "Implicit object registration is deprecrated since v24.06. Check #4429 for more information."; + dmsg_warning("RegisterObject") << m_objectRegistrationdata.entry.className + << ": Implicit object registration is deprecated since v24.12. Check #4429 for more information."; return commitTo(ObjectFactory::getInstance()); } diff --git a/Sofa/framework/Core/src/sofa/core/ObjectFactory.h b/Sofa/framework/Core/src/sofa/core/ObjectFactory.h index 302c70f3590..2126496ac8e 100644 --- a/Sofa/framework/Core/src/sofa/core/ObjectFactory.h +++ b/Sofa/framework/Core/src/sofa/core/ObjectFactory.h @@ -377,12 +377,14 @@ class SOFA_CORE_API ObjectRegistrationData /// This is the final operation that will actually commit the additions to the ObjectFactory. bool commitTo(sofa::core::ObjectFactory* objectFactory) const; + + friend class RegisterObject; }; // Legacy structure, to keep compatibility with olden code // using the singleton to get the instance of ObjectFactory -class /* SOFA_ATTRIBUTE_DEPRECATED__REGISTEROBJECT() */ SOFA_CORE_API RegisterObject +class SOFA_ATTRIBUTE_DEPRECATED__REGISTEROBJECT() SOFA_CORE_API RegisterObject { private: ObjectRegistrationData m_objectRegistrationdata; diff --git a/Sofa/framework/Core/src/sofa/core/behavior/BaseConstraintSet.h b/Sofa/framework/Core/src/sofa/core/behavior/BaseConstraintSet.h index 8e0d839fcba..896e7641675 100644 --- a/Sofa/framework/Core/src/sofa/core/behavior/BaseConstraintSet.h +++ b/Sofa/framework/Core/src/sofa/core/behavior/BaseConstraintSet.h @@ -27,7 +27,7 @@ #include #include -#include +#include namespace sofa::core::behavior { @@ -94,7 +94,7 @@ class SOFA_CORE_API BaseConstraintSet : public virtual objectmodel::BaseObject Data< sofa::Index > d_constraintIndex; ///< Constraint index (first index in the right hand term resolution vector) SOFA_ATTRIBUTE_DEPRECATED__CORE_RENAME_DATA_IN_CORE() - sofa::core::objectmodel::RenamedData< unsigned int > m_constraintIndex; + sofa::core::objectmodel::lifecycle::RenamedData< unsigned int > m_constraintIndex; bool insertInNode( objectmodel::BaseNode* node ) override; bool removeInNode( objectmodel::BaseNode* node ) override; diff --git a/Sofa/framework/Core/src/sofa/core/behavior/BaseMechanicalState.h b/Sofa/framework/Core/src/sofa/core/behavior/BaseMechanicalState.h index d761f405d40..9344498e63f 100644 --- a/Sofa/framework/Core/src/sofa/core/behavior/BaseMechanicalState.h +++ b/Sofa/framework/Core/src/sofa/core/behavior/BaseMechanicalState.h @@ -188,7 +188,7 @@ class SOFA_CORE_API BaseMechanicalState : public virtual BaseState /// Called at the end of each integration step. virtual void endIntegration(const ExecParams* params, SReal /*dt*/) { - vOp(params, VecId::externalForce(), ConstVecId::null(), ConstVecId::null(), 1.0); // externalForce = 0 + vOp(params, sofa::core::vec_id::write_access::externalForce, ConstVecId::null(), ConstVecId::null(), 1.0); // externalForce = 0 } /// Set F = 0 @@ -202,7 +202,7 @@ class SOFA_CORE_API BaseMechanicalState : public virtual BaseState /// Add stored external forces to F virtual void accumulateForce( const ExecParams* params, VecDerivId f = vec_id::write_access::force ) { - vOp( params, f, f, ConstVecId::externalForce(), 1.0 ); // f += externalForce + vOp( params, f, f, sofa::core::vec_id::read_access::externalForce, 1.0 ); // f += externalForce } /// @} diff --git a/Sofa/framework/Core/src/sofa/core/config.h.in b/Sofa/framework/Core/src/sofa/core/config.h.in index 3742a00dc3f..a30bd9f6493 100644 --- a/Sofa/framework/Core/src/sofa/core/config.h.in +++ b/Sofa/framework/Core/src/sofa/core/config.h.in @@ -143,7 +143,7 @@ #define SOFA_ATTRIBUTE_DEPRECATED__FREE_POSITION() SOFA_ATTRIBUTE_DEPRECATED("v24.12", "v25.06", "Use the variable sofa::core::vec_id::read_access::freePosition or sofa::core::vec_id::write_access::freePosition instead") #define SOFA_ATTRIBUTE_DEPRECATED__RESET_POSITION() SOFA_ATTRIBUTE_DEPRECATED("v24.12", "v25.06", "Use the variable sofa::core::vec_id::read_access::resetPosition or sofa::core::vec_id::write_access::resetPosition instead") - #define SOFA_ATTRIBUTE_DEPRECATED__VELOCITY() SOFA_ATTRIBUTE_DEPRECATED("v24.12", "v25.06", "Use the variable sofa::core::vec_id::read_access::velocity or sofa::core::vec_id::write_access::position velocity") + #define SOFA_ATTRIBUTE_DEPRECATED__VELOCITY() SOFA_ATTRIBUTE_DEPRECATED("v24.12", "v25.06", "Use the variable sofa::core::vec_id::read_access::velocity or sofa::core::vec_id::write_access::velocity instead") #define SOFA_ATTRIBUTE_DEPRECATED__RESET_VELOCITY() SOFA_ATTRIBUTE_DEPRECATED("v24.12", "v25.06", "Use the variable sofa::core::vec_id::read_access::resetVelocity or sofa::core::vec_id::write_access::resetVelocity instead") #define SOFA_ATTRIBUTE_DEPRECATED__FREE_VELOCITY() SOFA_ATTRIBUTE_DEPRECATED("v24.12", "v25.06", "Use the variable sofa::core::vec_id::read_access::freeVelocity or sofa::core::vec_id::write_access::freeVelocity instead") #define SOFA_ATTRIBUTE_DEPRECATED__NORMAL() SOFA_ATTRIBUTE_DEPRECATED("v24.12", "v25.06", "Use the variable sofa::core::vec_id::read_access::normal or sofa::core::vec_id::write_access::normal instead") diff --git a/Sofa/framework/Core/src/sofa/core/objectmodel/Base.cpp b/Sofa/framework/Core/src/sofa/core/objectmodel/Base.cpp index 1888327ab0d..6234a73b390 100644 --- a/Sofa/framework/Core/src/sofa/core/objectmodel/Base.cpp +++ b/Sofa/framework/Core/src/sofa/core/objectmodel/Base.cpp @@ -51,8 +51,7 @@ using std::string; static const std::string unnamed_label=std::string("unnamed"); Base::Base() - : ref_counter(0) - , name(initData(&name,unnamed_label,"name","object name")) + : name(initData(&name,unnamed_label,"name","object name")) , f_printLog(initData(&f_printLog, false, "printLog", "if true, emits extra messages at runtime.")) , f_tags(initData( &f_tags, "tags", "list of the subsets the object belongs to")) , f_bbox(initData( &f_bbox, "bbox", "this object bounding box")) @@ -78,18 +77,6 @@ Base::~Base() { } -void Base::addRef() -{ - ++ref_counter; -} - -void Base::release() -{ - if (ref_counter.fetch_sub(1) == 1) - { - delete this; - } -} void Base::addUpdateCallback(const std::string& name, diff --git a/Sofa/framework/Core/src/sofa/core/objectmodel/Base.h b/Sofa/framework/Core/src/sofa/core/objectmodel/Base.h index 74948aa9674..81202a77fc3 100644 --- a/Sofa/framework/Core/src/sofa/core/objectmodel/Base.h +++ b/Sofa/framework/Core/src/sofa/core/objectmodel/Base.h @@ -23,7 +23,7 @@ #include #include -#include +#include #include #include #include @@ -33,11 +33,11 @@ #include #include -#include #include #include #include +#include #include #define SOFA_BASE_CAST_IMPLEMENTATION(CLASSNAME) \ @@ -55,7 +55,7 @@ namespace sofa::core::objectmodel * All classes deriving from Base should use the SOFA_CLASS macro within their declaration (see BaseClass.h). * */ -class SOFA_CORE_API Base +class SOFA_CORE_API Base : public IntrusiveObject { public: typedef Base* Ptr; @@ -86,20 +86,6 @@ class SOFA_CORE_API Base Base(const Base& b); Base& operator=(const Base& b); - std::atomic ref_counter; - void addRef(); - void release(); - - friend inline void intrusive_ptr_add_ref(Base* p) - { - p->addRef(); - } - - friend inline void intrusive_ptr_release(Base* p) - { - p->release(); - } - protected: std::map m_internalEngine; diff --git a/Sofa/framework/Core/src/sofa/core/objectmodel/BaseContext.h b/Sofa/framework/Core/src/sofa/core/objectmodel/BaseContext.h index 6163cb1a95e..e0ae2ddc670 100644 --- a/Sofa/framework/Core/src/sofa/core/objectmodel/BaseContext.h +++ b/Sofa/framework/Core/src/sofa/core/objectmodel/BaseContext.h @@ -413,7 +413,7 @@ class BaseContext::GetObjectsCallBackT : public BaseContext::GetObjectsCallBack GetObjectsCallBackT(Container* d) : dest(d) {} void operator()(void* ptr) override { - if constexpr (sofa::type::trait::is_vector::value) + if constexpr (sofa::type::trait::is_vector) { dest->push_back(reinterpret_cast(ptr)); } diff --git a/Sofa/framework/Core/src/sofa/core/objectmodel/BaseNode.h b/Sofa/framework/Core/src/sofa/core/objectmodel/BaseNode.h index 79cbe8e255b..16d8e21ee3f 100644 --- a/Sofa/framework/Core/src/sofa/core/objectmodel/BaseNode.h +++ b/Sofa/framework/Core/src/sofa/core/objectmodel/BaseNode.h @@ -23,6 +23,7 @@ #include #include +#include namespace sofa::core::objectmodel { @@ -172,6 +173,7 @@ class SOFA_CORE_API BaseNode : public virtual Base BASENODE_ADD_SPECIAL_COMPONENT( core::objectmodel::ConfigurationSetting, ConfigurationSetting, configurationSetting ) BASENODE_ADD_SPECIAL_COMPONENT( core::visual::Shader, Shader, shaders ) BASENODE_ADD_SPECIAL_COMPONENT( core::visual::VisualModel, VisualModel, visualModel ) + BASENODE_ADD_SPECIAL_COMPONENT( core::visual::BaseVisualStyle, VisualStyle, visualStyle ) BASENODE_ADD_SPECIAL_COMPONENT( core::visual::VisualManager, VisualManager, visualManager ) BASENODE_ADD_SPECIAL_COMPONENT( core::CollisionModel, CollisionModel, collisionModel ) BASENODE_ADD_SPECIAL_COMPONENT( core::collision::Pipeline, CollisionPipeline, collisionPipeline ) diff --git a/Sofa/framework/Core/src/sofa/core/objectmodel/DeprecatedData.cpp b/Sofa/framework/Core/src/sofa/core/objectmodel/lifecycle/DeprecatedData.cpp similarity index 97% rename from Sofa/framework/Core/src/sofa/core/objectmodel/DeprecatedData.cpp rename to Sofa/framework/Core/src/sofa/core/objectmodel/lifecycle/DeprecatedData.cpp index 5b1f42517be..b31e699fa5a 100644 --- a/Sofa/framework/Core/src/sofa/core/objectmodel/DeprecatedData.cpp +++ b/Sofa/framework/Core/src/sofa/core/objectmodel/lifecycle/DeprecatedData.cpp @@ -23,7 +23,7 @@ #include #include #include -#include +#include namespace sofa::core::objectmodel::lifecycle { diff --git a/Sofa/framework/Core/src/sofa/core/objectmodel/DeprecatedData.h b/Sofa/framework/Core/src/sofa/core/objectmodel/lifecycle/DeprecatedData.h similarity index 100% rename from Sofa/framework/Core/src/sofa/core/objectmodel/DeprecatedData.h rename to Sofa/framework/Core/src/sofa/core/objectmodel/lifecycle/DeprecatedData.h diff --git a/Sofa/framework/Core/src/sofa/core/objectmodel/RemovedData.h b/Sofa/framework/Core/src/sofa/core/objectmodel/lifecycle/RemovedData.h similarity index 97% rename from Sofa/framework/Core/src/sofa/core/objectmodel/RemovedData.h rename to Sofa/framework/Core/src/sofa/core/objectmodel/lifecycle/RemovedData.h index 43e501af011..78c6fffcf1e 100644 --- a/Sofa/framework/Core/src/sofa/core/objectmodel/RemovedData.h +++ b/Sofa/framework/Core/src/sofa/core/objectmodel/lifecycle/RemovedData.h @@ -23,7 +23,7 @@ #include #include -#include +#include namespace sofa::core::objectmodel::lifecycle { diff --git a/Sofa/framework/Core/src/sofa/core/objectmodel/RenamedData.h b/Sofa/framework/Core/src/sofa/core/objectmodel/lifecycle/RenamedData.h similarity index 99% rename from Sofa/framework/Core/src/sofa/core/objectmodel/RenamedData.h rename to Sofa/framework/Core/src/sofa/core/objectmodel/lifecycle/RenamedData.h index 47b4933a87c..f22e7149b7e 100644 --- a/Sofa/framework/Core/src/sofa/core/objectmodel/RenamedData.h +++ b/Sofa/framework/Core/src/sofa/core/objectmodel/lifecycle/RenamedData.h @@ -6,7 +6,7 @@ namespace sofa { -namespace core::objectmodel +namespace core::objectmodel::lifecycle { diff --git a/Sofa/framework/Core/src/sofa/core/topology/BaseMeshTopology.cpp b/Sofa/framework/Core/src/sofa/core/topology/BaseMeshTopology.cpp index f1fbc45235f..7eb1494c17d 100644 --- a/Sofa/framework/Core/src/sofa/core/topology/BaseMeshTopology.cpp +++ b/Sofa/framework/Core/src/sofa/core/topology/BaseMeshTopology.cpp @@ -23,7 +23,6 @@ #include #include #include - namespace sofa::core::topology { diff --git a/Sofa/framework/Core/src/sofa/core/topology/BaseMeshTopology.h b/Sofa/framework/Core/src/sofa/core/topology/BaseMeshTopology.h index 2a5348f3eb3..b8b36581ab4 100644 --- a/Sofa/framework/Core/src/sofa/core/topology/BaseMeshTopology.h +++ b/Sofa/framework/Core/src/sofa/core/topology/BaseMeshTopology.h @@ -85,6 +85,9 @@ class SOFA_CORE_API BaseMeshTopology : public core::topology::Topology public: void init() override; + /// Method to be overriden by child class to create all the topology buffers + virtual void computeCrossElementBuffers() {} + /// Load the topology from a file. /// /// The default implementation supports the following formats: obj, gmsh, mesh (custom simple text file), xs3 (deprecated description of mass-springs networks). diff --git a/applications/plugins/SofaSimpleGUI/initSimpleGUI.cpp b/Sofa/framework/Core/src/sofa/core/visual/BaseVisualStyle.h similarity index 58% rename from applications/plugins/SofaSimpleGUI/initSimpleGUI.cpp rename to Sofa/framework/Core/src/sofa/core/visual/BaseVisualStyle.h index 7cdc42b84c1..bfeb50bdd67 100644 --- a/applications/plugins/SofaSimpleGUI/initSimpleGUI.cpp +++ b/Sofa/framework/Core/src/sofa/core/visual/BaseVisualStyle.h @@ -19,62 +19,33 @@ * * * Contact information: contact@sofa-framework.org * ******************************************************************************/ -#include +#pragma once +#include +#include +#include +#include -namespace sofa::component +namespace sofa::core::visual { - //Here are just several convenient functions to help user to know what contains the plugin - - extern "C" { - SOFA_SOFASIMPLEGUI_API void initExternalModule(); - SOFA_SOFASIMPLEGUI_API const char* getModuleName(); - SOFA_SOFASIMPLEGUI_API const char* getModuleVersion(); - SOFA_SOFASIMPLEGUI_API const char* getModuleLicense(); - SOFA_SOFASIMPLEGUI_API const char* getModuleDescription(); - SOFA_SOFASIMPLEGUI_API const char* getModuleComponentList(); - } - - void initExternalModule() - { - static bool first = true; - if (first) - { - first = false; - } - } - - const char* getModuleName() - { - return "SimpleGUI"; - } - - const char* getModuleVersion() - { - return "0.2"; - } - - const char* getModuleLicense() - { - return "LGPL"; - } - - - const char* getModuleDescription() - { - return "TODO: replace this with the description of your plugin"; - } +class SOFA_CORE_API BaseVisualStyle : public sofa::core::objectmodel::BaseObject +{ +public: + SOFA_CLASS(BaseVisualStyle,sofa::core::objectmodel::BaseObject); - const char* getModuleComponentList() - { - /// string containing the names of the classes provided by the plugin - return ""; - //return "MyMappingPendulumInPlane, MyBehaviorModel, MyProjectiveConstraintSet"; - } + typedef sofa::core::visual::VisualParams VisualParams; + typedef sofa::core::visual::DisplayFlags DisplayFlags; +protected: + BaseVisualStyle() { } + ~BaseVisualStyle() override { } +public: + virtual void updateVisualFlags(VisualParams* ) { }; + virtual void applyBackupFlags(VisualParams* ) { }; -} +}; +} // namespace sofa::simulation::graph diff --git a/Sofa/framework/Core/src/sofa/core/visual/VisualState.h b/Sofa/framework/Core/src/sofa/core/visual/VisualState.h index c1a4cd4c231..4790d948149 100644 --- a/Sofa/framework/Core/src/sofa/core/visual/VisualState.h +++ b/Sofa/framework/Core/src/sofa/core/visual/VisualState.h @@ -33,7 +33,7 @@ template< typename DataTypes > class VisualState : public core::State< DataTypes > { public: - SOFA_CLASS(VisualState, SOFA_TEMPLATE(core::State, defaulttype::Vec3Types)); + SOFA_CLASS(SOFA_TEMPLATE(VisualState, DataTypes), SOFA_TEMPLATE(core::State, DataTypes)); using VecCoord = typename DataTypes::VecCoord; using VecDeriv = typename DataTypes::VecCoord; diff --git a/Sofa/framework/Core/test/DataEngine_test.cpp b/Sofa/framework/Core/test/DataEngine_test.cpp index 55f80bad61d..47b68aa5378 100644 --- a/Sofa/framework/Core/test/DataEngine_test.cpp +++ b/Sofa/framework/Core/test/DataEngine_test.cpp @@ -81,7 +81,7 @@ struct DataEngine_test: public BaseTest { TestEngine engine; - void SetUp() override + void doSetUp() override { engine.init(); } diff --git a/Sofa/framework/Core/test/Engine_test.cpp b/Sofa/framework/Core/test/Engine_test.cpp index 938a70aa950..0f872d3e7f1 100644 --- a/Sofa/framework/Core/test/Engine_test.cpp +++ b/Sofa/framework/Core/test/Engine_test.cpp @@ -47,7 +47,7 @@ struct Engine_test : public BaseTest TestEngine::SPtr engine3; /// Create the engines - void SetUp() override + void doSetUp() override { // Engine 1 engine1 = sofa::core::objectmodel::New(); diff --git a/Sofa/framework/Core/test/IntrusiveObject_test.cpp b/Sofa/framework/Core/test/IntrusiveObject_test.cpp new file mode 100644 index 00000000000..e1b38345c39 --- /dev/null +++ b/Sofa/framework/Core/test/IntrusiveObject_test.cpp @@ -0,0 +1,73 @@ +/****************************************************************************** +* SOFA, Simulation Open-Framework Architecture * +* (c) 2006 INRIA, USTL, UJF, CNRS, MGH * +* * +* This program is free software; you can redistribute it and/or modify it * +* under the terms of the GNU Lesser General Public License as published by * +* the Free Software Foundation; either version 2.1 of the License, or (at * +* your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, but WITHOUT * +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * +* for more details. * +* * +* You should have received a copy of the GNU Lesser General Public License * +* along with this program. If not, see . * +******************************************************************************* +* Authors: The SOFA Team and external contributors (see Authors.txt) * +* * +* Contact information: contact@sofa-framework.org * +******************************************************************************/ +#include +#include +#include + + +class DummyIntrusiveObject : public sofa::core::IntrusiveObject +{ +public: + DummyIntrusiveObject() = default; + explicit DummyIntrusiveObject(const std::function& _destructorCallback) + : destructorCallback(_destructorCallback) {} + + ~DummyIntrusiveObject() override + { + destructorCallback(); + } + +private: + std::function destructorCallback; +}; + + + +TEST(IntrusiveObject, IsDestructorCalled) +{ + std::size_t nbTimesDestructorCalled = 0; + { + sofa::core::sptr dummy(new DummyIntrusiveObject([&nbTimesDestructorCalled]() + { + nbTimesDestructorCalled++; + })); + } + EXPECT_EQ(1, nbTimesDestructorCalled); +} + + +TEST(IntrusiveObject, Copy) +{ + std::size_t nbTimesDestructorCalled = 0; + { + sofa::core::sptr dummy0; + { + sofa::core::sptr dummy(new DummyIntrusiveObject([&nbTimesDestructorCalled]() + { + nbTimesDestructorCalled++; + })); + + dummy0 = dummy; + } + } + EXPECT_EQ(1, nbTimesDestructorCalled); +} diff --git a/Sofa/framework/Core/test/ObjectFactoryJson_test.cpp b/Sofa/framework/Core/test/ObjectFactoryJson_test.cpp index 1306c64b794..ce051811eb5 100644 --- a/Sofa/framework/Core/test/ObjectFactoryJson_test.cpp +++ b/Sofa/framework/Core/test/ObjectFactoryJson_test.cpp @@ -25,6 +25,7 @@ #include #include #include +#include namespace sofa @@ -70,7 +71,7 @@ TEST(ObjectFactoryJson, oneTemplatedObject) TEST(ObjectFactoryJson, mainInstance) { - EXPECT_TRUE(sofa::simpleapi::importPlugin("Sofa.Component")); + EXPECT_TRUE(sofa::simpleapi::importPlugin(Sofa.Component)); const auto dump = core::ObjectFactoryJson::dump(core::ObjectFactory::getInstance()); EXPECT_NE(dump.find("MechanicalObject"), std::string::npos); } diff --git a/Sofa/framework/Core/test/TrackedData_test.cpp b/Sofa/framework/Core/test/TrackedData_test.cpp index 39780a56921..91ecdca13e8 100644 --- a/Sofa/framework/Core/test/TrackedData_test.cpp +++ b/Sofa/framework/Core/test/TrackedData_test.cpp @@ -215,7 +215,7 @@ struct DataTrackerEngine_test: public BaseTest static unsigned updateCounter; core::DataTrackerCallback dataTracker; - void SetUp() override + void doSetUp() override { updateCounter = 0; } diff --git a/Sofa/framework/Core/test/VecId_test.cpp b/Sofa/framework/Core/test/VecId_test.cpp index 00833a8a72f..ed15bbb961f 100644 --- a/Sofa/framework/Core/test/VecId_test.cpp +++ b/Sofa/framework/Core/test/VecId_test.cpp @@ -21,6 +21,7 @@ ******************************************************************************/ #include #include +#include class DerivedBaseVecId : public sofa::core::BaseVecId { @@ -98,4 +99,7 @@ TEST(VecId, name) EXPECT_EQ(sofa::core::vec_id::read_access::dforce.getName(), "dforce(V_DERIV)"); EXPECT_EQ(sofa::core::vec_id::write_access::dforce.getName(), "dforce(V_DERIV)"); + const std::string s = Sofa.Component.Collision; + EXPECT_EQ(s, std::string("Sofa.Component.Collision")); + } diff --git a/Sofa/framework/Core/test/objectmodel/BaseObjectDescription_test.cpp b/Sofa/framework/Core/test/objectmodel/BaseObjectDescription_test.cpp index 702eb1f077a..ba7c858d238 100644 --- a/Sofa/framework/Core/test/objectmodel/BaseObjectDescription_test.cpp +++ b/Sofa/framework/Core/test/objectmodel/BaseObjectDescription_test.cpp @@ -29,11 +29,11 @@ using sofa::testing::BaseTest ; struct BaseObjectDescription_test: public BaseTest { - void SetUp() override + void doSetUp() override { } - void TearDown() override + void doTearDown() override { } diff --git a/Sofa/framework/Core/test/objectmodel/DataFileName_test.cpp b/Sofa/framework/Core/test/objectmodel/DataFileName_test.cpp index 29d14e833c3..f37aa678b24 100644 --- a/Sofa/framework/Core/test/objectmodel/DataFileName_test.cpp +++ b/Sofa/framework/Core/test/objectmodel/DataFileName_test.cpp @@ -43,7 +43,7 @@ class DataFileName_test: public BaseTest { DataFileName d_filename; public: - void SetUp() override + void doSetUp() override { DataRepository.addFirstPath( SOFA_TESTING_RESOURCES_DIR ); } diff --git a/Sofa/framework/Core/test/objectmodel/DataLink_test.cpp b/Sofa/framework/Core/test/objectmodel/DataLink_test.cpp index 34cd074c650..f6b020030bf 100644 --- a/Sofa/framework/Core/test/objectmodel/DataLink_test.cpp +++ b/Sofa/framework/Core/test/objectmodel/DataLink_test.cpp @@ -40,7 +40,7 @@ struct DataLink_test: public BaseTest Data dataVec3f; Data dataVec3d; - void SetUp() override + void doSetUp() override { /// Setup the data and create a link between the two data data1.setName("data1"); @@ -50,7 +50,7 @@ struct DataLink_test: public BaseTest data2.setName("dataVec3d"); } - void TearDown() override + void doTearDown() override { data1.unset(); data2.unset(); diff --git a/Sofa/framework/Core/test/objectmodel/RemovedData_test.cpp b/Sofa/framework/Core/test/objectmodel/RemovedData_test.cpp index e06de833344..9ee53e0530b 100644 --- a/Sofa/framework/Core/test/objectmodel/RemovedData_test.cpp +++ b/Sofa/framework/Core/test/objectmodel/RemovedData_test.cpp @@ -25,7 +25,7 @@ using sofa::core::objectmodel::BaseObject ; #include using sofa::testing::BaseTest; -#include +#include using sofa::core::objectmodel::lifecycle::DeprecatedData; using sofa::core::objectmodel::lifecycle::RemovedData; diff --git a/Sofa/framework/Core/test/objectmodel/SingleLink_test.cpp b/Sofa/framework/Core/test/objectmodel/SingleLink_test.cpp index 1e741f7b646..7ad36dabcd0 100644 --- a/Sofa/framework/Core/test/objectmodel/SingleLink_test.cpp +++ b/Sofa/framework/Core/test/objectmodel/SingleLink_test.cpp @@ -47,7 +47,7 @@ class SingleLink_test: public BaseTest BaseObject::SPtr m_src ; /// Create a link to an object. - void SetUp() override + void doSetUp() override { m_dst = sofa::core::objectmodel::New() ; m_src = sofa::core::objectmodel::New() ; diff --git a/Sofa/framework/DefaultType/src/sofa/defaulttype/RigidTypes.h b/Sofa/framework/DefaultType/src/sofa/defaulttype/RigidTypes.h index e14165269ef..164249bab08 100644 --- a/Sofa/framework/DefaultType/src/sofa/defaulttype/RigidTypes.h +++ b/Sofa/framework/DefaultType/src/sofa/defaulttype/RigidTypes.h @@ -33,6 +33,7 @@ #include #include #include +#include namespace sofa::defaulttype @@ -251,6 +252,9 @@ template<> constexpr const char* Rigid3fTypes::Name() { return "Rigid3f"; } typedef StdRigidTypes<3,SReal> Rigid3Types; ///< un-defined precision type typedef StdRigidTypes<3,SReal> RigidTypes; ///< alias (beurk) +static_assert(type::isRigidType); +static_assert(type::isRigidType); + //============================================================================= // 2D Rigids //============================================================================= @@ -413,6 +417,9 @@ class StdRigidTypes<2, real> template<> constexpr const char* Rigid2dTypes::Name() { return "Rigid2d"; } template<> constexpr const char* Rigid2fTypes::Name() { return "Rigid2f"; } +static_assert(type::isRigidType); +static_assert(type::isRigidType); + /// \endcond diff --git a/Sofa/framework/DefaultType/src/sofa/defaulttype/VecTypes.h b/Sofa/framework/DefaultType/src/sofa/defaulttype/VecTypes.h index 7fbb70e7c44..789ab1ca252 100644 --- a/Sofa/framework/DefaultType/src/sofa/defaulttype/VecTypes.h +++ b/Sofa/framework/DefaultType/src/sofa/defaulttype/VecTypes.h @@ -30,6 +30,8 @@ #include #include #include +#include + namespace sofa:: defaulttype { @@ -236,4 +238,15 @@ typedef StdVectorTypes Vec2Types typedef StdVectorTypes Vec1Types; +static_assert(!type::isRigidType); +static_assert(!type::isRigidType); +static_assert(!type::isRigidType); +static_assert(!type::isRigidType); + +static_assert(!type::isRigidType); +static_assert(!type::isRigidType); +static_assert(!type::isRigidType); +static_assert(!type::isRigidType); + + } // namespace sofa:: defaulttype diff --git a/Sofa/framework/DefaultType/src/sofa/defaulttype/fwd.h b/Sofa/framework/DefaultType/src/sofa/defaulttype/fwd.h index 715d3c4a01f..fa22f6cc457 100644 --- a/Sofa/framework/DefaultType/src/sofa/defaulttype/fwd.h +++ b/Sofa/framework/DefaultType/src/sofa/defaulttype/fwd.h @@ -57,15 +57,6 @@ typedef RigidMass<3,float> Rigid3fMass; typedef StdRigidTypes<3,SReal> Rigid3Types; ///< un-defined precision type typedef RigidMass<3,SReal> Rigid3Mass; ///< un-defined precision type -typedef StdRigidTypes<2,double> Rigid2dTypes; -typedef RigidMass<2,double> Rigid2dMass; - -typedef StdRigidTypes<2,float> Rigid2fTypes; -typedef RigidMass<2,float> Rigid2fMass; - -typedef StdRigidTypes<2,SReal> Rigid2Types; -typedef RigidMass<2,SReal> Rigid2Mass; - template class StdVectorTypes; diff --git a/Sofa/framework/Helper/CMakeLists.txt b/Sofa/framework/Helper/CMakeLists.txt index 0fc3c9d2650..b1e84de9954 100644 --- a/Sofa/framework/Helper/CMakeLists.txt +++ b/Sofa/framework/Helper/CMakeLists.txt @@ -216,11 +216,6 @@ add_library(${PROJECT_NAME} SHARED ${HEADER_FILES} ${SOURCE_FILES}) if((CMAKE_SYSTEM_NAME STREQUAL Windows) AND SOFA_USE_DEPENDENCY_PACK) target_include_directories(${PROJECT_NAME} SYSTEM PUBLIC "$") endif() -# The default binary suffix for libraries/plugins is "_d" when using a debug build. -# since this is configuration specific it is a bit more convenient to put it as a debug compile definition for -# PluginManager.cpp, at the expense of being much less visible compare to having it in the generated -# SofaFramework/config.h -set_property(SOURCE ${SRC_ROOT}/system/PluginManager.cpp APPEND PROPERTY COMPILE_DEFINITIONS_DEBUG "SOFA_LIBSUFFIX=_d" ) # DEPENDENCY LINKS AND INCLUDE DIRS target_link_libraries(${PROJECT_NAME} PUBLIC Sofa.Config ) @@ -263,6 +258,23 @@ target_include_directories(${PROJECT_NAME} SYSTEM PUBLIC "$") +set(is_release "$") +set(is_debug "$") +set(is_relwithdebinfo "$") +set(is_minsizerel "$") +# set the type of build as preprocessor value +target_compile_definitions(${PROJECT_NAME} PRIVATE "$<${is_release}:SOFA_BUILD_CONFIGURATION=Release>") +target_compile_definitions(${PROJECT_NAME} PRIVATE "$<${is_debug}:SOFA_BUILD_CONFIGURATION=Debug>") +target_compile_definitions(${PROJECT_NAME} PRIVATE "$<${is_relwithdebinfo}:SOFA_BUILD_CONFIGURATION=RelWithDebInfo>") +target_compile_definitions(${PROJECT_NAME} PRIVATE "$<${is_minsizerel}:SOFA_BUILD_CONFIGURATION=MinSizeRel>") +## if the type of build is something else (not supported), then SOFA_BUILD_CONFIGURATION wont be defined +# it could be also useful to know if we are using a multi-config generator +if(CMAKE_CONFIGURATION_TYPES) + target_compile_definitions(${PROJECT_NAME} PRIVATE "SOFA_BUILD_MULTI_CONFIGURATION=1") +else() + target_compile_definitions(${PROJECT_NAME} PRIVATE "SOFA_BUILD_MULTI_CONFIGURATION=0") +endif() + set_target_properties(${PROJECT_NAME} PROPERTIES FOLDER Sofa.Framework) # IDE folder sofa_create_package_with_targets( diff --git a/Sofa/framework/Helper/simutest/AdvancedTimer_test.cpp b/Sofa/framework/Helper/simutest/AdvancedTimer_test.cpp index a92b7440451..a7dc021fb53 100644 --- a/Sofa/framework/Helper/simutest/AdvancedTimer_test.cpp +++ b/Sofa/framework/Helper/simutest/AdvancedTimer_test.cpp @@ -40,7 +40,7 @@ namespace sofa { struct AdvancedTimerTest: public BaseSimulationTest { protected: - void onSetUp() override + void doSetUp() override { using namespace sofa::helper; diff --git a/Sofa/framework/Helper/src/sofa/helper/ComponentChange.cpp b/Sofa/framework/Helper/src/sofa/helper/ComponentChange.cpp index fa6c8375885..29d9abf57d8 100644 --- a/Sofa/framework/Helper/src/sofa/helper/ComponentChange.cpp +++ b/Sofa/framework/Helper/src/sofa/helper/ComponentChange.cpp @@ -20,7 +20,7 @@ * Contact information: contact@sofa-framework.org * ******************************************************************************/ #include - +#include namespace sofa::helper::lifecycle { @@ -78,551 +78,553 @@ const std::map > movedComponents = { { "GlobalSystemMatrixExporter", Moved("v22.06", "SofaBaseLinearSolver", "SofaMatrix") }, // SofaMiscSolver was deprecated in #2571 - { "DampVelocitySolver", Moved("v22.06", "SofaMiscSolver", "Sofa.Component.ODESolver.Forward") }, - { "NewmarkImplicitSolver", Moved("v22.06", "SofaMiscSolver", "Sofa.Component.ODESolver.Backward") }, + { "DampVelocitySolver", Moved("v22.06", "SofaMiscSolver", Sofa.Component.ODESolver.Forward) }, + { "NewmarkImplicitSolver", Moved("v22.06", "SofaMiscSolver", Sofa.Component.ODESolver.Backward) }, // SofaExplicitOdeSolver was deprecated in #2571 - { "EulerExplicitSolver", Moved("v22.06", "SofaExplicitOdeSolver", "Sofa.Component.ODESolver.Forward") }, + { "EulerExplicitSolver", Moved("v22.06", "SofaExplicitOdeSolver", Sofa.Component.ODESolver.Forward) }, // SofaImplicitOdeSolver was deprecated in #2571 - { "EulerImplicitSolver", Moved("v22.06", "SofaImplicitOdeSolver", "Sofa.Component.ODESolver.Backward") }, - { "StaticSolver", Moved("v22.06", "SofaImplicitOdeSolver", "Sofa.Component.ODESolver.Backward") }, + { "EulerImplicitSolver", Moved("v22.06", "SofaImplicitOdeSolver", Sofa.Component.ODESolver.Backward) }, + { "StaticSolver", Moved("v22.06", "SofaImplicitOdeSolver", Sofa.Component.ODESolver.Backward) }, // SofaGeneralExplicitOdeSolver was deprecated in #2571 - { "CentralDifferenceSolver", Moved("v22.06", "SofaGeneralExplicitOdeSolver", "Sofa.Component.ODESolver.Forward") }, - { "RungeKutta2Solver", Moved("v22.06", "SofaGeneralExplicitOdeSolver", "Sofa.Component.ODESolver.Forward") }, - { "RungeKutta4Solver", Moved("v22.06", "SofaGeneralExplicitOdeSolver", "Sofa.Component.ODESolver.Forward") }, + { "CentralDifferenceSolver", Moved("v22.06", "SofaGeneralExplicitOdeSolver", Sofa.Component.ODESolver.Forward) }, + { "RungeKutta2Solver", Moved("v22.06", "SofaGeneralExplicitOdeSolver", Sofa.Component.ODESolver.Forward) }, + { "RungeKutta4Solver", Moved("v22.06", "SofaGeneralExplicitOdeSolver", Sofa.Component.ODESolver.Forward) }, // SofaGeneralImplicitOdeSolver was deprecated in #2571 - { "VariationalSymplecticSolver", Moved("v22.06", "SofaGeneralImplicitOdeSolver", "Sofa.Component.ODESolver.Backward") }, + { "VariationalSymplecticSolver", Moved("v22.06", "SofaGeneralImplicitOdeSolver", Sofa.Component.ODESolver.Backward) }, // SofaLoader was deprecated in #2582 - { "MeshOBJLoader", Moved("v22.06", "SofaLoader", "Sofa.Component.IO.Mesh") }, - { "MeshVTKLoader", Moved("v22.06", "SofaLoader", "Sofa.Component.IO.Mesh") }, + { "MeshOBJLoader", Moved("v22.06", "SofaLoader", Sofa.Component.IO.Mesh) }, + { "MeshVTKLoader", Moved("v22.06", "SofaLoader", Sofa.Component.IO.Mesh) }, // SofaGeneralLoader was deprecated in #2582 - { "MeshGmshLoader", Moved("v22.06", "SofaGeneralLoader", "Sofa.Component.IO.Mesh") }, - { "GIDMeshLoader", Moved("v22.06", "SofaGeneralLoader", "Sofa.Component.IO.Mesh") }, - { "GridMeshCreator", Moved("v22.06", "SofaGeneralLoader", "Sofa.Component.IO.Mesh") }, - { "MeshOffLoader", Moved("v22.06", "SofaGeneralLoader", "Sofa.Component.IO.Mesh") }, - { "MeshSTLLoader", Moved("v22.06", "SofaGeneralLoader", "Sofa.Component.IO.Mesh") }, - { "MeshTrianLoader", Moved("v22.06", "SofaGeneralLoader", "Sofa.Component.IO.Mesh") }, - { "MeshXspLoader", Moved("v22.06", "SofaGeneralLoader", "Sofa.Component.IO.Mesh") }, - { "OffSequenceLoader", Moved("v22.06", "SofaGeneralLoader", "Sofa.Component.IO.Mesh") }, - { "SphereLoader", Moved("v22.06", "SofaGeneralLoader", "Sofa.Component.IO.Mesh") }, - { "StringMeshCreator", Moved("v22.06", "SofaGeneralLoader", "Sofa.Component.IO.Mesh") }, - { "VoxelGridLoader", Moved("v22.06", "SofaGeneralLoader", "Sofa.Component.IO.Mesh") }, - { "ReadState", Moved("v22.06", "SofaGeneralLoader", "Sofa.Component.Playback") }, - { "ReadTopology", Moved("v22.06", "SofaGeneralLoader", "Sofa.Component.Playback") }, - { "InputEventReader", Moved("v22.06", "SofaGeneralLoader", "Sofa.Component.Playback") }, + { "MeshGmshLoader", Moved("v22.06", "SofaGeneralLoader", Sofa.Component.IO.Mesh) }, + { "GIDMeshLoader", Moved("v22.06", "SofaGeneralLoader", Sofa.Component.IO.Mesh) }, + { "GridMeshCreator", Moved("v22.06", "SofaGeneralLoader", Sofa.Component.IO.Mesh) }, + { "MeshOffLoader", Moved("v22.06", "SofaGeneralLoader", Sofa.Component.IO.Mesh) }, + { "MeshSTLLoader", Moved("v22.06", "SofaGeneralLoader", Sofa.Component.IO.Mesh) }, + { "MeshTrianLoader", Moved("v22.06", "SofaGeneralLoader", Sofa.Component.IO.Mesh) }, + { "MeshXspLoader", Moved("v22.06", "SofaGeneralLoader", Sofa.Component.IO.Mesh) }, + { "OffSequenceLoader", Moved("v22.06", "SofaGeneralLoader", Sofa.Component.IO.Mesh) }, + { "SphereLoader", Moved("v22.06", "SofaGeneralLoader", Sofa.Component.IO.Mesh) }, + { "StringMeshCreator", Moved("v22.06", "SofaGeneralLoader", Sofa.Component.IO.Mesh) }, + { "VoxelGridLoader", Moved("v22.06", "SofaGeneralLoader", Sofa.Component.IO.Mesh) }, + { "ReadState", Moved("v22.06", "SofaGeneralLoader", Sofa.Component.Playback) }, + { "ReadTopology", Moved("v22.06", "SofaGeneralLoader", Sofa.Component.Playback) }, + { "InputEventReader", Moved("v22.06", "SofaGeneralLoader", Sofa.Component.Playback) }, // SofaExporter was deprecated in #2582 - { "BlenderExporter", Moved("v22.06", "SofaExporter", "Sofa.Component.IO.Mesh") }, - { "MeshExporter", Moved("v22.06", "SofaExporter", "Sofa.Component.IO.Mesh") }, - { "STLExporter", Moved("v22.06", "SofaExporter", "Sofa.Component.IO.Mesh") }, - { "VisualModelOBJExporter", Moved("v22.06", "SofaExporter", "Sofa.Component.IO.Mesh") }, - { "VTKExporter", Moved("v22.06", "SofaExporter", "Sofa.Component.IO.Mesh") }, - { "WriteState", Moved("v22.06", "SofaExporter", "Sofa.Component.Playback") }, - { "WriteTopology", Moved("v22.06", "SofaExporter", "Sofa.Component.Playback") }, + { "BlenderExporter", Moved("v22.06", "SofaExporter", Sofa.Component.IO.Mesh) }, + { "MeshExporter", Moved("v22.06", "SofaExporter", Sofa.Component.IO.Mesh) }, + { "STLExporter", Moved("v22.06", "SofaExporter", Sofa.Component.IO.Mesh) }, + { "VisualModelOBJExporter", Moved("v22.06", "SofaExporter", Sofa.Component.IO.Mesh) }, + { "VTKExporter", Moved("v22.06", "SofaExporter", Sofa.Component.IO.Mesh) }, + { "WriteState", Moved("v22.06", "SofaExporter", Sofa.Component.Playback) }, + { "WriteTopology", Moved("v22.06", "SofaExporter", Sofa.Component.Playback) }, // SofaBaseUtils was deprecated in #2605 - { "AddResourceRepository", Moved("v22.06", "SofaBaseUtils", "Sofa.Component.SceneUtility") }, - { "MakeAliasComponent", Moved("v22.06", "SofaBaseUtils", "Sofa.Component.SceneUtility") }, - { "MakeDataAliasComponent", Moved("v22.06", "SofaBaseUtils", "Sofa.Component.SceneUtility") }, - { "MessageHandlerComponent", Moved("v22.06", "SofaBaseUtils", "Sofa.Component.SceneUtility") }, - { "FileMessageHandlerComponent", Moved("v22.06", "SofaBaseUtils", "Sofa.Component.SceneUtility") }, - { "InfoComponent", Moved("v22.06", "SofaBaseUtils", "Sofa.Component.SceneUtility") }, + { "AddResourceRepository", Moved("v22.06", "SofaBaseUtils", Sofa.Component.SceneUtility) }, + { "MakeAliasComponent", Moved("v22.06", "SofaBaseUtils", Sofa.Component.SceneUtility) }, + { "MakeDataAliasComponent", Moved("v22.06", "SofaBaseUtils", Sofa.Component.SceneUtility) }, + { "MessageHandlerComponent", Moved("v22.06", "SofaBaseUtils", Sofa.Component.SceneUtility) }, + { "FileMessageHandlerComponent", Moved("v22.06", "SofaBaseUtils", Sofa.Component.SceneUtility) }, + { "InfoComponent", Moved("v22.06", "SofaBaseUtils", Sofa.Component.SceneUtility) }, { "RequiredPlugin", Moved("v22.06", "SofaBaseUtils", "Sofa.Core") }, // SofaGraphComponent was deprecated in #2605, #2843 and #2895 - { "AddFrameButtonSetting", Moved("v22.06", "SofaGraphComponent", "Sofa.GUI.Component") }, - { "AddRecordedCameraButtonSetting", Moved("v22.06", "SofaGraphComponent", "Sofa.GUI.Component") }, - { "StartNavigationButtonSetting", Moved("v22.06", "SofaGraphComponent", "Sofa.Component.Setting") }, - { "AttachBodyButtonSetting", Moved("v22.06", "SofaGraphComponent", "Sofa.GUI.Component") }, - { "FixPickedParticleButtonSetting", Moved("v22.06", "SofaGraphComponent", "Sofa.GUI.Component") }, - { "SofaDefaultPathSetting", Moved("v22.06", "SofaGraphComponent", "Sofa.Component.Setting") }, - { "StatsSetting", Moved("v22.06", "SofaGraphComponent", "Sofa.Component.Setting") }, - { "ViewerSetting", Moved("v22.06", "SofaGraphComponent", "Sofa.Component.Setting") }, - { "APIVersion", Moved("v22.06", "SofaGraphComponent", "Sofa.Component.Setting") }, + { "AddFrameButtonSetting", Moved("v22.06", "SofaGraphComponent", Sofa.GUI.Component) }, + { "AddRecordedCameraButtonSetting", Moved("v22.06", "SofaGraphComponent", Sofa.GUI.Component) }, + { "StartNavigationButtonSetting", Moved("v22.06", "SofaGraphComponent", Sofa.Component.Setting) }, + { "AttachBodyButtonSetting", Moved("v22.06", "SofaGraphComponent", Sofa.GUI.Component) }, + { "FixPickedParticleButtonSetting", Moved("v22.06", "SofaGraphComponent", Sofa.GUI.Component) }, + { "SofaDefaultPathSetting", Moved("v22.06", "SofaGraphComponent", Sofa.Component.Setting) }, + { "StatsSetting", Moved("v22.06", "SofaGraphComponent", Sofa.Component.Setting) }, + { "ViewerSetting", Moved("v22.06", "SofaGraphComponent", Sofa.Component.Setting) }, + { "APIVersion", Moved("v22.06", "SofaGraphComponent", Sofa.Component.Setting) }, // SofaBaseTopology was deprecated in #2612 - { "EdgeSetGeometryAlgorithms", Moved("v22.06", "SofaBaseTopology", "Sofa.Component.Topology.Container.Dynamic") }, - { "EdgeSetTopologyAlgorithms", Moved("v22.06", "SofaBaseTopology", "Sofa.Component.Topology.Container.Dynamic") }, - { "EdgeSetTopologyContainer", Moved("v22.06", "SofaBaseTopology", "Sofa.Component.Topology.Container.Dynamic") }, - { "EdgeSetTopologyModifier", Moved("v22.06", "SofaBaseTopology", "Sofa.Component.Topology.Container.Dynamic") }, - { "HexahedronSetGeometryAlgorithms", Moved("v22.06", "SofaBaseTopology", "Sofa.Component.Topology.Container.Dynamic") }, - { "HexahedronSetTopologyAlgorithms", Moved("v22.06", "SofaBaseTopology", "Sofa.Component.Topology.Container.Dynamic") }, - { "HexahedronSetTopologyContainer", Moved("v22.06", "SofaBaseTopology", "Sofa.Component.Topology.Container.Dynamic") }, - { "HexahedronSetTopologyModifier", Moved("v22.06", "SofaBaseTopology", "Sofa.Component.Topology.Container.Dynamic") }, - { "PointSetGeometryAlgorithms", Moved("v22.06", "SofaBaseTopology", "Sofa.Component.Topology.Container.Dynamic") }, - { "PointSetTopologyAlgorithms", Moved("v22.06", "SofaBaseTopology", "Sofa.Component.Topology.Container.Dynamic") }, - { "PointSetTopologyContainer", Moved("v22.06", "SofaBaseTopology", "Sofa.Component.Topology.Container.Dynamic") }, - { "PointSetTopologyModifier", Moved("v22.06", "SofaBaseTopology", "Sofa.Component.Topology.Container.Dynamic") }, - { "QuadSetGeometryAlgorithms", Moved("v22.06", "SofaBaseTopology", "Sofa.Component.Topology.Container.Dynamic") }, - { "QuadSetTopologyAlgorithms", Moved("v22.06", "SofaBaseTopology", "Sofa.Component.Topology.Container.Dynamic") }, - { "QuadSetTopologyContainer", Moved("v22.06", "SofaBaseTopology", "Sofa.Component.Topology.Container.Dynamic") }, - { "QuadSetTopologyModifier", Moved("v22.06", "SofaBaseTopology", "Sofa.Component.Topology.Container.Dynamic") }, - { "TetrahedronSetGeometryAlgorithms", Moved("v22.06", "SofaBaseTopology", "Sofa.Component.Topology.Container.Dynamic") }, - { "TetrahedronSetTopologyAlgorithms", Moved("v22.06", "SofaBaseTopology", "Sofa.Component.Topology.Container.Dynamic") }, - { "TetrahedronSetTopologyContainer", Moved("v22.06", "SofaBaseTopology", "Sofa.Component.Topology.Container.Dynamic") }, - { "TetrahedronSetTopologyModifier", Moved("v22.06", "SofaBaseTopology", "Sofa.Component.Topology.Container.Dynamic") }, - { "TriangleSetGeometryAlgorithms", Moved("v22.06", "SofaBaseTopology", "Sofa.Component.Topology.Container.Dynamic") }, - { "TriangleSetTopologyAlgorithms", Moved("v22.06", "SofaBaseTopology", "Sofa.Component.Topology.Container.Dynamic") }, - { "TriangleSetTopologyContainer", Moved("v22.06", "SofaBaseTopology", "Sofa.Component.Topology.Container.Dynamic") }, - { "TriangleSetTopologyModifier", Moved("v22.06", "SofaBaseTopology", "Sofa.Component.Topology.Container.Dynamic") }, - { "MeshTopology", Moved("v22.06", "SofaBaseTopology", "Sofa.Component.Topology.Container.Constant") }, - { "GridTopology", Moved("v22.06", "SofaBaseTopology", "Sofa.Component.Topology.Container.Grid") }, - { "RegularGridTopology", Moved("v22.06", "SofaBaseTopology", "Sofa.Component.Topology.Container.Grid") }, - { "SparseGridTopology", Moved("v22.06", "SofaBaseTopology", "Sofa.Component.Topology.Container.Grid") }, + { "EdgeSetGeometryAlgorithms", Moved("v22.06", "SofaBaseTopology", Sofa.Component.Topology.Container.Dynamic) }, + { "EdgeSetTopologyAlgorithms", Moved("v22.06", "SofaBaseTopology", Sofa.Component.Topology.Container.Dynamic) }, + { "EdgeSetTopologyContainer", Moved("v22.06", "SofaBaseTopology", Sofa.Component.Topology.Container.Dynamic) }, + { "EdgeSetTopologyModifier", Moved("v22.06", "SofaBaseTopology", Sofa.Component.Topology.Container.Dynamic) }, + { "HexahedronSetGeometryAlgorithms", Moved("v22.06", "SofaBaseTopology", Sofa.Component.Topology.Container.Dynamic) }, + { "HexahedronSetTopologyAlgorithms", Moved("v22.06", "SofaBaseTopology", Sofa.Component.Topology.Container.Dynamic) }, + { "HexahedronSetTopologyContainer", Moved("v22.06", "SofaBaseTopology", Sofa.Component.Topology.Container.Dynamic) }, + { "HexahedronSetTopologyModifier", Moved("v22.06", "SofaBaseTopology", Sofa.Component.Topology.Container.Dynamic) }, + { "PointSetGeometryAlgorithms", Moved("v22.06", "SofaBaseTopology", Sofa.Component.Topology.Container.Dynamic) }, + { "PointSetTopologyAlgorithms", Moved("v22.06", "SofaBaseTopology", Sofa.Component.Topology.Container.Dynamic) }, + { "PointSetTopologyContainer", Moved("v22.06", "SofaBaseTopology", Sofa.Component.Topology.Container.Dynamic) }, + { "PointSetTopologyModifier", Moved("v22.06", "SofaBaseTopology", Sofa.Component.Topology.Container.Dynamic) }, + { "QuadSetGeometryAlgorithms", Moved("v22.06", "SofaBaseTopology", Sofa.Component.Topology.Container.Dynamic) }, + { "QuadSetTopologyAlgorithms", Moved("v22.06", "SofaBaseTopology", Sofa.Component.Topology.Container.Dynamic) }, + { "QuadSetTopologyContainer", Moved("v22.06", "SofaBaseTopology", Sofa.Component.Topology.Container.Dynamic) }, + { "QuadSetTopologyModifier", Moved("v22.06", "SofaBaseTopology", Sofa.Component.Topology.Container.Dynamic) }, + { "TetrahedronSetGeometryAlgorithms", Moved("v22.06", "SofaBaseTopology", Sofa.Component.Topology.Container.Dynamic) }, + { "TetrahedronSetTopologyAlgorithms", Moved("v22.06", "SofaBaseTopology", Sofa.Component.Topology.Container.Dynamic) }, + { "TetrahedronSetTopologyContainer", Moved("v22.06", "SofaBaseTopology", Sofa.Component.Topology.Container.Dynamic) }, + { "TetrahedronSetTopologyModifier", Moved("v22.06", "SofaBaseTopology", Sofa.Component.Topology.Container.Dynamic) }, + { "TriangleSetGeometryAlgorithms", Moved("v22.06", "SofaBaseTopology", Sofa.Component.Topology.Container.Dynamic) }, + { "TriangleSetTopologyAlgorithms", Moved("v22.06", "SofaBaseTopology", Sofa.Component.Topology.Container.Dynamic) }, + { "TriangleSetTopologyContainer", Moved("v22.06", "SofaBaseTopology", Sofa.Component.Topology.Container.Dynamic) }, + { "TriangleSetTopologyModifier", Moved("v22.06", "SofaBaseTopology", Sofa.Component.Topology.Container.Dynamic) }, + { "MeshTopology", Moved("v22.06", "SofaBaseTopology", Sofa.Component.Topology.Container.Constant) }, + { "GridTopology", Moved("v22.06", "SofaBaseTopology", Sofa.Component.Topology.Container.Grid) }, + { "RegularGridTopology", Moved("v22.06", "SofaBaseTopology", Sofa.Component.Topology.Container.Grid) }, + { "SparseGridTopology", Moved("v22.06", "SofaBaseTopology", Sofa.Component.Topology.Container.Grid) }, // SofaGeneralTopology was deprecated in #2612 - { "CubeTopology", Moved("v22.06", "SofaGeneralTopology", "Sofa.Component.Topology.Container.Constant") }, - { "SphereQuadTopology", Moved("v22.06", "SofaGeneralTopology", "Sofa.Component.Topology.Container.Constant") }, - { "CylinderGridTopology", Moved("v22.06", "SofaGeneralTopology", "Sofa.Component.Topology.Container.Grid") }, - { "SphereGridTopology", Moved("v22.06", "SofaGeneralTopology", "Sofa.Component.Topology.Container.Grid") }, + { "CubeTopology", Moved("v22.06", "SofaGeneralTopology", Sofa.Component.Topology.Container.Constant) }, + { "SphereQuadTopology", Moved("v22.06", "SofaGeneralTopology", Sofa.Component.Topology.Container.Constant) }, + { "CylinderGridTopology", Moved("v22.06", "SofaGeneralTopology", Sofa.Component.Topology.Container.Grid) }, + { "SphereGridTopology", Moved("v22.06", "SofaGeneralTopology", Sofa.Component.Topology.Container.Grid) }, // SofaNonUniformFem was deprecated in #2612 and #2759 - { "DynamicSparseGridGeometryAlgorithms", Moved("v22.06", "SofaNonUniformFem", "Sofa.Component.Topology.Container.Dynamic") }, - { "DynamicSparseGridTopologyAlgorithms", Moved("v22.06", "SofaNonUniformFem", "Sofa.Component.Topology.Container.Dynamic") }, - { "DynamicSparseGridTopologyContainer", Moved("v22.06", "SofaNonUniformFem", "Sofa.Component.Topology.Container.Dynamic") }, - { "DynamicSparseGridTopologyModifier", Moved("v22.06", "SofaNonUniformFem", "Sofa.Component.Topology.Container.Dynamic") }, - { "MultilevelHexahedronSetTopologyContainer", Moved("v22.06", "SofaNonUniformFem", "Sofa.Component.Topology.Container.Dynamic") }, - { "SparseGridMultipleTopology", Moved("v22.06", "SofaNonUniformFem", "Sofa.Component.Topology.Container.Grid") }, - { "SparseGridRamificationTopology", Moved("v22.06", "SofaNonUniformFem", "Sofa.Component.Topology.Container.Grid") }, - { "NonUniformHexahedralFEMForceFieldAndMass", Moved("v22.06", "SofaNonUniformFem", "Sofa.Component.SolidMechanics.FEM.NonUniform") }, - { "NonUniformHexahedronFEMForceFieldAndMass", Moved("v22.06", "SofaNonUniformFem", "Sofa.Component.SolidMechanics.FEM.NonUniform") }, - { "HexahedronCompositeFEMForceFieldAndMass", Moved("v22.06", "SofaNonUniformFem", "Sofa.Component.SolidMechanics.FEM.NonUniform") }, - { "HexahedronCompositeFEMMapping", Moved("v22.06", "SofaNonUniformFem", "Sofa.Component.SolidMechanics.FEM.NonUniform") }, + { "DynamicSparseGridGeometryAlgorithms", Moved("v22.06", "SofaNonUniformFem", Sofa.Component.Topology.Container.Dynamic) }, + { "DynamicSparseGridTopologyAlgorithms", Moved("v22.06", "SofaNonUniformFem", Sofa.Component.Topology.Container.Dynamic) }, + { "DynamicSparseGridTopologyContainer", Moved("v22.06", "SofaNonUniformFem", Sofa.Component.Topology.Container.Dynamic) }, + { "DynamicSparseGridTopologyModifier", Moved("v22.06", "SofaNonUniformFem", Sofa.Component.Topology.Container.Dynamic) }, + { "MultilevelHexahedronSetTopologyContainer", Moved("v22.06", "SofaNonUniformFem", Sofa.Component.Topology.Container.Dynamic) }, + { "SparseGridMultipleTopology", Moved("v22.06", "SofaNonUniformFem", Sofa.Component.Topology.Container.Grid) }, + { "SparseGridRamificationTopology", Moved("v22.06", "SofaNonUniformFem", Sofa.Component.Topology.Container.Grid) }, + { "NonUniformHexahedralFEMForceFieldAndMass", Moved("v22.06", "SofaNonUniformFem", Sofa.Component.SolidMechanics.FEM.NonUniform) }, + { "NonUniformHexahedronFEMForceFieldAndMass", Moved("v22.06", "SofaNonUniformFem", Sofa.Component.SolidMechanics.FEM.NonUniform) }, + { "HexahedronCompositeFEMForceFieldAndMass", Moved("v22.06", "SofaNonUniformFem", Sofa.Component.SolidMechanics.FEM.NonUniform) }, + { "HexahedronCompositeFEMMapping", Moved("v22.06", "SofaNonUniformFem", Sofa.Component.SolidMechanics.FEM.NonUniform) }, // SofaTopologicalMapping was deprecated in #2612 and #XXXX - { "CenterPointTopologicalMapping", Moved("v22.06", "SofaTopologicalMapping", "Sofa.Component.Topology.Mapping") }, - { "Edge2QuadTopologicalMapping", Moved("v22.06", "SofaTopologicalMapping", "Sofa.Component.Topology.Mapping") }, - { "Hexa2QuadTopologicalMapping", Moved("v22.06", "SofaTopologicalMapping", "Sofa.Component.Topology.Mapping") }, - { "Hexa2TetraTopologicalMapping", Moved("v22.06", "SofaTopologicalMapping", "Sofa.Component.Topology.Mapping") }, - { "IdentityTopologicalMapping", Moved("v22.06", "SofaTopologicalMapping", "Sofa.Component.Topology.Mapping") }, - { "Mesh2PointTopologicalMapping", Moved("v22.06", "SofaTopologicalMapping", "Sofa.Component.Topology.Mapping") }, - { "Quad2TriangleTopologicalMapping", Moved("v22.06", "SofaTopologicalMapping", "Sofa.Component.Topology.Mapping") }, - { "SimpleTesselatedHexaTopologicalMapping", Moved("v22.06", "SofaTopologicalMapping", "Sofa.Component.Topology.Mapping") }, - { "SimpleTesselatedTetraTopologicalMapping", Moved("v22.06", "SofaTopologicalMapping", "Sofa.Component.Topology.Mapping") }, - { "SubsetTopologicalMapping", Moved("v22.06", "SofaTopologicalMapping", "Sofa.Component.Topology.Mapping") }, - { "Tetra2TriangleTopologicalMapping", Moved("v22.06", "SofaTopologicalMapping", "Sofa.Component.Topology.Mapping") }, - { "Triangle2EdgeTopologicalMapping", Moved("v22.06", "SofaTopologicalMapping", "Sofa.Component.Topology.Mapping") }, - { "Mesh2PointMechanicalMapping", Moved("v22.06", "SofaTopologicalMapping", "Sofa.Component.Mapping.Linear") }, - { "SimpleTesselatedTetraMechanicalMapping", Moved("v22.06", "SofaTopologicalMapping", "Sofa.Component.Mapping.Linear") }, + { "CenterPointTopologicalMapping", Moved("v22.06", "SofaTopologicalMapping", Sofa.Component.Topology.Mapping) }, + { "Edge2QuadTopologicalMapping", Moved("v22.06", "SofaTopologicalMapping", Sofa.Component.Topology.Mapping) }, + { "Hexa2QuadTopologicalMapping", Moved("v22.06", "SofaTopologicalMapping", Sofa.Component.Topology.Mapping) }, + { "Hexa2TetraTopologicalMapping", Moved("v22.06", "SofaTopologicalMapping", Sofa.Component.Topology.Mapping) }, + { "IdentityTopologicalMapping", Moved("v22.06", "SofaTopologicalMapping", Sofa.Component.Topology.Mapping) }, + { "Mesh2PointTopologicalMapping", Moved("v22.06", "SofaTopologicalMapping", Sofa.Component.Topology.Mapping) }, + { "Quad2TriangleTopologicalMapping", Moved("v22.06", "SofaTopologicalMapping", Sofa.Component.Topology.Mapping) }, + { "SimpleTesselatedHexaTopologicalMapping", Moved("v22.06", "SofaTopologicalMapping", Sofa.Component.Topology.Mapping) }, + { "SimpleTesselatedTetraTopologicalMapping", Moved("v22.06", "SofaTopologicalMapping", Sofa.Component.Topology.Mapping) }, + { "SubsetTopologicalMapping", Moved("v22.06", "SofaTopologicalMapping", Sofa.Component.Topology.Mapping) }, + { "Tetra2TriangleTopologicalMapping", Moved("v22.06", "SofaTopologicalMapping", Sofa.Component.Topology.Mapping) }, + { "Triangle2EdgeTopologicalMapping", Moved("v22.06", "SofaTopologicalMapping", Sofa.Component.Topology.Mapping) }, + { "Mesh2PointMechanicalMapping", Moved("v22.06", "SofaTopologicalMapping", Sofa.Component.Mapping.Linear) }, + { "SimpleTesselatedTetraMechanicalMapping", Moved("v22.06", "SofaTopologicalMapping", Sofa.Component.Mapping.Linear) }, // SofaMiscTopology was deprecated in #2612 - { "TopologicalChangeProcessor", Moved("v22.06", "SofaMiscMapping", "Sofa.Component.Topology.Utility") }, - { "TopologyBoundingTrasher", Moved("v22.06", "SofaMiscMapping", "Sofa.Component.Topology.Utility") }, - { "TopologyChecker", Moved("v22.06", "SofaMiscMapping", "Sofa.Component.Topology.Utility") }, + { "TopologicalChangeProcessor", Moved("v22.06", "SofaMiscMapping", Sofa.Component.Topology.Utility) }, + { "TopologyBoundingTrasher", Moved("v22.06", "SofaMiscMapping", Sofa.Component.Topology.Utility) }, + { "TopologyChecker", Moved("v22.06", "SofaMiscMapping", Sofa.Component.Topology.Utility) }, // SofaBaseVisual was deprecated in #2679 and #XXXX - { "Camera", Moved("v22.06", "SofaBaseVisual", "Sofa.Component.Visual") }, - { "InteractiveCamera", Moved("v22.06", "SofaBaseVisual", "Sofa.Component.Visual") }, - { "VisualModelImpl", Moved("v22.06", "SofaBaseVisual", "Sofa.Component.Visual") }, - { "VisualStyle", Moved("v22.06", "SofaBaseVisual", "Sofa.Component.Visual") }, - { "BackgroundSetting", Moved("v22.06", "SofaBaseVisual", "Sofa.Component.Setting") }, + { "Camera", Moved("v22.06", "SofaBaseVisual", Sofa.Component.Visual) }, + { "InteractiveCamera", Moved("v22.06", "SofaBaseVisual", Sofa.Component.Visual) }, + { "VisualModelImpl", Moved("v22.06", "SofaBaseVisual", Sofa.Component.Visual) }, + { "VisualStyle", Moved("v22.06", "SofaBaseVisual", Sofa.Component.Visual) }, + { "BackgroundSetting", Moved("v22.06", "SofaBaseVisual", Sofa.Component.Setting) }, // SofaGeneralVisual was deprecated in #2679 - { "RecordedCamera", Moved("v22.06", "SofaGeneralVisual", "Sofa.Component.Visual") }, - { "Visual3DText", Moved("v22.06", "SofaGeneralVisual", "Sofa.Component.Visual") }, - { "VisualTransform", Moved("v22.06", "SofaGeneralVisual", "Sofa.Component.Visual") }, + { "RecordedCamera", Moved("v22.06", "SofaGeneralVisual", Sofa.Component.Visual) }, + { "Visual3DText", Moved("v22.06", "SofaGeneralVisual", Sofa.Component.Visual) }, + { "VisualTransform", Moved("v22.06", "SofaGeneralVisual", Sofa.Component.Visual) }, // SofaSimpleFem was deprecated in #2753 and .... - { "TetrahedronDiffusionFEMForceField", Moved("v22.06", "SofaSimpleFem", "Sofa.Component.Diffusion") }, + { "TetrahedronDiffusionFEMForceField", Moved("v22.06", "SofaSimpleFem", Sofa.Component.Diffusion) }, // SofaOpenglVisual was deprecated in #2709 - { "OglSceneFrame", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Rendering3D") }, - { "DataDisplay", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Rendering3D") }, - { "MergeVisualModels", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Rendering3D") }, - { "OglCylinderModel", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Rendering3D") }, - { "OglModel", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Rendering3D") }, - { "PointSplatModel", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Rendering3D") }, - { "SlicedVolumetricModel", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Rendering3D") }, - { "OglColorMap", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Rendering2D") }, - { "OglLabel", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Rendering2D") }, - { "OglViewport", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Rendering2D") }, - { "ClipPlane", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "CompositingVisualLoop", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "DirectionalLight", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "PositionalLight", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "SpotLight", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "LightManager", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglFloatAttribute", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglFloat2Attribute", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglFloat3Attribute", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglFloat4Attribute", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglIntAttribute", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglInt2Attribute", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglInt3Attribute", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglInt4Attribute", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglUIntAttribute", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglUInt2Attribute", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglUInt3Attribute", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglUInt4Attribute", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglOITShader", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglRenderingSRGB", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglShader", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglShaderMacro", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglShaderVisualModel", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglShadowShader", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglTexture", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglTexture2D", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglIntVariable", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglInt2Variable", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglInt3Variable", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglInt4Variable", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglFloatVariable", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglFloat2Variable", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglFloat3Variable", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglFloat4Variable", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglIntVectorVariable", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglInt2VectorVariable", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglInt3VectorVariable", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglInt4VectorVariable", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglFloatVectorVariable", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglFloat2VectorVariable", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglFloat3VectorVariable", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglFloat4VectorVariable", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglMatrix2Variable", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglMatrix3Variable", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglMatrix4Variable", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglMatrix2x3Variable", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglMatrix3x2Variable", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglMatrix2x4Variable", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglMatrix4x2Variable", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglMatrix3x4Variable", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglMatrix4x3Variable", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OglMatrix4VectorVariable", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "OrderIndependentTransparencyManager", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "PostProcessManager", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "VisualManagerPass", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "VisualManagerSecondaryPass", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Shader") }, - { "TextureInterpolation", Moved("v22.06", "SofaOpenglVisual", "Sofa.GL.Component.Engine") }, + { "OglSceneFrame", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Rendering3D) }, + { "DataDisplay", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Rendering3D) }, + { "MergeVisualModels", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Rendering3D) }, + { "OglCylinderModel", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Rendering3D) }, + { "OglModel", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Rendering3D) }, + { "PointSplatModel", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Rendering3D) }, + { "SlicedVolumetricModel", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Rendering3D) }, + { "OglColorMap", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Rendering2D) }, + { "OglLabel", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Rendering2D) }, + { "OglViewport", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Rendering2D) }, + { "ClipPlane", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "CompositingVisualLoop", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "DirectionalLight", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "PositionalLight", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "SpotLight", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "LightManager", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglFloatAttribute", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglFloat2Attribute", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglFloat3Attribute", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglFloat4Attribute", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglIntAttribute", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglInt2Attribute", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglInt3Attribute", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglInt4Attribute", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglUIntAttribute", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglUInt2Attribute", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglUInt3Attribute", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglUInt4Attribute", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglOITShader", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglRenderingSRGB", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglShader", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglShaderMacro", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglShaderVisualModel", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglShadowShader", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglTexture", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglTexture2D", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglIntVariable", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglInt2Variable", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglInt3Variable", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglInt4Variable", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglFloatVariable", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglFloat2Variable", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglFloat3Variable", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglFloat4Variable", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglIntVectorVariable", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglInt2VectorVariable", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglInt3VectorVariable", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglInt4VectorVariable", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglFloatVectorVariable", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglFloat2VectorVariable", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglFloat3VectorVariable", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglFloat4VectorVariable", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglMatrix2Variable", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglMatrix3Variable", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglMatrix4Variable", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglMatrix2x3Variable", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglMatrix3x2Variable", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglMatrix2x4Variable", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglMatrix4x2Variable", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglMatrix3x4Variable", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglMatrix4x3Variable", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OglMatrix4VectorVariable", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "OrderIndependentTransparencyManager", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "PostProcessManager", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "VisualManagerPass", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "VisualManagerSecondaryPass", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Shader) }, + { "TextureInterpolation", Moved("v22.06", "SofaOpenglVisual", Sofa.GL.Component.Engine) }, // SofaBaseLinearSolver was deprecated in #2717 - { "CGLinearSolver", Moved("v22.06", "SofaBaseLinearSolver", "Sofa.Component.LinearSolver.Iterative") }, + { "CGLinearSolver", Moved("v22.06", "SofaBaseLinearSolver", Sofa.Component.LinearSolver.Iterative) }, // SofaGeneralLinearSolver was deprecated in #2717 - { "MinResLinearSolver", Moved("v22.06", "SofaGeneralLinearSolver", "Sofa.Component.LinearSolver.Iterative") }, - { "BTDLinearSolver", Moved("v22.06", "SofaGeneralLinearSolver", "Sofa.Component.LinearSolver.Direct") }, - { "CholeskySolver", Moved("v22.06", "SofaGeneralLinearSolver", "Sofa.Component.LinearSolver.Direct") }, + { "MinResLinearSolver", Moved("v22.06", "SofaGeneralLinearSolver", Sofa.Component.LinearSolver.Iterative) }, + { "BTDLinearSolver", Moved("v22.06", "SofaGeneralLinearSolver", Sofa.Component.LinearSolver.Direct) }, + { "CholeskySolver", Moved("v22.06", "SofaGeneralLinearSolver", Sofa.Component.LinearSolver.Direct) }, // SofaSparseSolver was deprecated in #2717 - { "FillReducingOrdering", Moved("v22.06", "SofaGeneralLinearSolver", "Sofa.Component.LinearSolver.Direct") }, - { "PrecomputedLinearSolver", Moved("v22.06", "SofaGeneralLinearSolver", "Sofa.Component.LinearSolver.Direct") }, - { "SparseLDLSolver", Moved("v22.06", "SofaSparseSolver", "Sofa.Component.LinearSolver.Direct") }, + { "FillReducingOrdering", Moved("v22.06", "SofaGeneralLinearSolver", Sofa.Component.LinearSolver.Direct) }, + { "PrecomputedLinearSolver", Moved("v22.06", "SofaGeneralLinearSolver", Sofa.Component.LinearSolver.Direct) }, + { "SparseLDLSolver", Moved("v22.06", "SofaSparseSolver", Sofa.Component.LinearSolver.Direct) }, // SofaDenseSolver was deprecated in #2717 - { "SVDLinearSolver", Moved("v22.06", "SofaDenseSolver", "Sofa.Component.LinearSolver.Direct") }, + { "SVDLinearSolver", Moved("v22.06", "SofaDenseSolver", Sofa.Component.LinearSolver.Direct) }, // SofaPreconditioner was deprecated in #2717 - { "ShewchukPCGLinearSolver", Moved("v22.06", "SofaPreconditioner", "Sofa.Component.LinearSolver.Iterative") }, - { "JacobiPreconditioner", Moved("v22.06", "SofaPreconditioner", "Sofa.Component.LinearSolver.Preconditioner") }, - { "BlockJacobiPreconditioner", Moved("v22.06", "SofaPreconditioner", "Sofa.Component.LinearSolver.Preconditioner") }, - { "PrecomputedWarpPreconditioner", Moved("v22.06", "SofaPreconditioner", "Sofa.Component.LinearSolver.Preconditioner") }, - { "SSORPreconditioner", Moved("v22.06", "SofaPreconditioner", "Sofa.Component.LinearSolver.Preconditioner") }, - { "WarpPreconditioner", Moved("v22.06", "SofaPreconditioner", "Sofa.Component.LinearSolver.Preconditioner") }, + { "ShewchukPCGLinearSolver", Moved("v22.06", "SofaPreconditioner", Sofa.Component.LinearSolver.Iterative) }, + { "JacobiPreconditioner", Moved("v22.06", "SofaPreconditioner", Sofa.Component.LinearSolver.Preconditioner) }, + { "BlockJacobiPreconditioner", Moved("v22.06", "SofaPreconditioner", Sofa.Component.LinearSolver.Preconditioner) }, + { "PrecomputedWarpPreconditioner", Moved("v22.06", "SofaPreconditioner", Sofa.Component.LinearSolver.Preconditioner) }, + { "SSORPreconditioner", Moved("v22.06", "SofaPreconditioner", Sofa.Component.LinearSolver.Preconditioner) }, + { "WarpPreconditioner", Moved("v22.06", "SofaPreconditioner", Sofa.Component.LinearSolver.Preconditioner) }, // SofaBaseMechanics was deprecated in #2752, #2635 and #2766 - { "DiagonalMass", Moved("v22.06", "SofaBaseMechanics", "Sofa.Component.Mass") }, - { "UniformMass", Moved("v22.06", "SofaBaseMechanics", "Sofa.Component.Mass") }, - { "BarycentricMapping", Moved("v22.06", "SofaBaseMechanics", "Sofa.Component.Mapping.Linear") }, - { "IdentityMapping", Moved("v22.06", "SofaBaseMechanics", "Sofa.Component.Mapping.Linear") }, - { "SubsetMapping", Moved("v22.06", "SofaBaseMechanics", "Sofa.Component.Mapping.Linear") }, - { "MechanicalObject", Moved("v22.06", "SofaBaseMechanics", "Sofa.Component.StateContainer") }, - { "MappedObject", Moved("v22.06", "SofaBaseMechanics", "Sofa.Component.StateContainer") }, + { "DiagonalMass", Moved("v22.06", "SofaBaseMechanics", Sofa.Component.Mass) }, + { "UniformMass", Moved("v22.06", "SofaBaseMechanics", Sofa.Component.Mass) }, + { "BarycentricMapping", Moved("v22.06", "SofaBaseMechanics", Sofa.Component.Mapping.Linear) }, + { "IdentityMapping", Moved("v22.06", "SofaBaseMechanics", Sofa.Component.Mapping.Linear) }, + { "SubsetMapping", Moved("v22.06", "SofaBaseMechanics", Sofa.Component.Mapping.Linear) }, + { "MechanicalObject", Moved("v22.06", "SofaBaseMechanics", Sofa.Component.StateContainer) }, + { "MappedObject", Moved("v22.06", "SofaBaseMechanics", Sofa.Component.StateContainer) }, // SofaMiscForceField was deprecated in #2752 and ... - { "MeshMatrixMass", Moved("v22.06", "SofaMiscForceField", "Sofa.Component.Mass") }, - { "GearSpringForceField", Moved("v22.06", "SofaMiscForceField", "Sofa.Component.SolidMechanics.Spring") }, + { "MeshMatrixMass", Moved("v22.06", "SofaMiscForceField", Sofa.Component.Mass) }, + { "GearSpringForceField", Moved("v22.06", "SofaMiscForceField", Sofa.Component.SolidMechanics.Spring) }, // SofaRigid was deprecated in #2635 and #2759 - { "RigidMapping", Moved("v22.06", "SofaRigid", "Sofa.Component.Mapping.NonLinear") }, - { "RigidRigidMapping", Moved("v22.06", "SofaRigid", "Sofa.Component.Mapping.NonLinear") }, - { "JointSpringForceField", Moved("v22.06", "SofaRigid", "Sofa.Component.SolidMechanics.Spring") }, + { "RigidMapping", Moved("v22.06", "SofaRigid", Sofa.Component.Mapping.NonLinear) }, + { "RigidRigidMapping", Moved("v22.06", "SofaRigid", Sofa.Component.Mapping.NonLinear) }, + { "JointSpringForceField", Moved("v22.06", "SofaRigid", Sofa.Component.SolidMechanics.Spring) }, // Movedgid was deprecated in #2635 and ... - { "LineSetSkinningMapping", Moved("v22.06", "Movedgid", "Sofa.Component.Mapping.Linear") }, - { "SkinningMapping", Moved("v22.06", "Movedgid", "Sofa.Component.Mapping.Linear") }, + { "LineSetSkinningMapping", Moved("v22.06", "Movedgid", Sofa.Component.Mapping.Linear) }, + { "SkinningMapping", Moved("v22.06", "Movedgid", Sofa.Component.Mapping.Linear) }, { "ArticulatedHierarchyContainer", Moved("v22.06", "Movedgid", "ArticulatedSystemPlugin") }, { "ArticulationCenter", Moved("v22.06", "Movedgid", "ArticulatedSystemPlugin") }, { "Articulation", Moved("v22.06", "Movedgid", "ArticulatedSystemPlugin") }, { "ArticulatedSystemMapping", Moved("v22.06", "Movedgid", "ArticulatedSystemPlugin") }, // SofaMiscMapping was deprecated in #2635 - { "BeamLinearMapping", Moved("v22.06", "SofaMiscMapping", "Sofa.Component.Mapping.Linear") }, - { "CenterOfMassMapping", Moved("v22.06", "SofaMiscMapping", "Sofa.Component.Mapping.Linear") }, - { "CenterOfMassMulti2Mapping", Moved("v22.06", "SofaMiscMapping", "Sofa.Component.Mapping.Linear") }, - { "CenterOfMassMultiMapping", Moved("v22.06", "SofaMiscMapping", "Sofa.Component.Mapping.Linear") }, - { "DeformableOnRigidFrameMapping", Moved("v22.06", "SofaMiscMapping", "Sofa.Component.Mapping.Linear") }, - { "DistanceFromTargetMapping", Moved("v22.06", "SofaMiscMapping", "Sofa.Component.Mapping.NonLinear") }, - { "DistanceMapping", Moved("v22.06", "SofaMiscMapping", "Sofa.Component.Mapping.NonLinear") }, - { "IdentityMultiMapping", Moved("v22.06", "SofaMiscMapping", "Sofa.Component.Mapping.Linear") }, - { "SquareMapping", Moved("v22.06", "SofaMiscMapping", "Sofa.Component.Mapping.NonLinear") }, - { "SquareDistanceMapping", Moved("v22.06", "SofaMiscMapping", "Sofa.Component.Mapping.NonLinear") }, - { "SubsetMultiMapping", Moved("v22.06", "SofaMiscMapping", "Sofa.Component.Mapping.Linear") }, - { "TubularMapping", Moved("v22.06", "SofaMiscMapping", "Sofa.Component.Mapping.Linear") }, - { "VoidMapping", Moved("v22.06", "SofaMiscMapping", "Sofa.Component.Mapping.Linear") }, + { "BeamLinearMapping", Moved("v22.06", "SofaMiscMapping", Sofa.Component.Mapping.Linear) }, + { "CenterOfMassMapping", Moved("v22.06", "SofaMiscMapping", Sofa.Component.Mapping.Linear) }, + { "CenterOfMassMulti2Mapping", Moved("v22.06", "SofaMiscMapping", Sofa.Component.Mapping.Linear) }, + { "CenterOfMassMultiMapping", Moved("v22.06", "SofaMiscMapping", Sofa.Component.Mapping.Linear) }, + { "DeformableOnRigidFrameMapping", Moved("v22.06", "SofaMiscMapping", Sofa.Component.Mapping.Linear) }, + { "DistanceFromTargetMapping", Moved("v22.06", "SofaMiscMapping", Sofa.Component.Mapping.NonLinear) }, + { "DistanceMapping", Moved("v22.06", "SofaMiscMapping", Sofa.Component.Mapping.NonLinear) }, + { "IdentityMultiMapping", Moved("v22.06", "SofaMiscMapping", Sofa.Component.Mapping.Linear) }, + { "SquareMapping", Moved("v22.06", "SofaMiscMapping", Sofa.Component.Mapping.NonLinear) }, + { "SquareDistanceMapping", Moved("v22.06", "SofaMiscMapping", Sofa.Component.Mapping.NonLinear) }, + { "SubsetMultiMapping", Moved("v22.06", "SofaMiscMapping", Sofa.Component.Mapping.Linear) }, + { "TubularMapping", Moved("v22.06", "SofaMiscMapping", Sofa.Component.Mapping.Linear) }, + { "VoidMapping", Moved("v22.06", "SofaMiscMapping", Sofa.Component.Mapping.Linear) }, // SofaConstraint was deprecated in #2635, #2790, #2796, #2813 and ... - { "BilateralInteractionConstraint", Moved("v22.06", "SofaConstraint", "Sofa.Component.Constraint.Lagrangian.Model") }, - { "GenericConstraintCorrection", Moved("v22.06", "SofaConstraint", "Sofa.Component.Constraint.Lagrangian.Correction") }, - { "GenericConstraintSolver", Moved("v22.06", "SofaConstraint", "Sofa.Component.Constraint.Lagrangian.Solver") }, - { "LCPConstraintSolver", Moved("v22.06", "SofaConstraint", "Sofa.Component.Constraint.Lagrangian.Solver") }, - { "LinearSolverConstraintCorrection", Moved("v22.06", "SofaConstraint", "Sofa.Component.Constraint.Lagrangian.Correction") }, - { "PrecomputedConstraintCorrection", Moved("v22.06", "SofaConstraint", "Sofa.Component.Constraint.Lagrangian.Correction") }, - { "SlidingConstraint", Moved("v22.06", "SofaConstraint", "Sofa.Component.Constraint.Lagrangian.Model") }, - { "StopperConstraint", Moved("v22.06", "SofaConstraint", "Sofa.Component.Constraint.Lagrangian.Model") }, - { "UncoupledConstraintCorrection", Moved("v22.06", "SofaConstraint", "Sofa.Component.Constraint.Lagrangian.Correction") }, - { "UniformConstraint", Moved("v22.06", "SofaConstraint", "Sofa.Component.Constraint.Lagrangian.Model") }, - { "UnilateralInteractionConstraint", Moved("v22.06", "SofaConstraint", "Sofa.Component.Constraint.Lagrangian.Model") }, - { "ConstraintAnimationLoop", Moved("v22.06", "SofaConstraint", "Sofa.Component.AnimationLoop") }, - { "FreeMotionAnimationLoop", Moved("v22.06", "SofaConstraint", "Sofa.Component.AnimationLoop") }, - { "LocalMinDistance", Moved("v22.06", "SofaConstraint", "Sofa.Component.Collision.Detection.Intersection") }, + { "BilateralInteractionConstraint", Moved("v22.06", "SofaConstraint", Sofa.Component.Constraint.Lagrangian.Model) }, + { "GenericConstraintCorrection", Moved("v22.06", "SofaConstraint", Sofa.Component.Constraint.Lagrangian.Correction) }, + { "GenericConstraintSolver", Moved("v22.06", "SofaConstraint", Sofa.Component.Constraint.Lagrangian.Solver) }, + { "LCPConstraintSolver", Moved("v22.06", "SofaConstraint", Sofa.Component.Constraint.Lagrangian.Solver) }, + { "LinearSolverConstraintCorrection", Moved("v22.06", "SofaConstraint", Sofa.Component.Constraint.Lagrangian.Correction) }, + { "PrecomputedConstraintCorrection", Moved("v22.06", "SofaConstraint", Sofa.Component.Constraint.Lagrangian.Correction) }, + { "SlidingConstraint", Moved("v22.06", "SofaConstraint", Sofa.Component.Constraint.Lagrangian.Model) }, + { "StopperConstraint", Moved("v22.06", "SofaConstraint", Sofa.Component.Constraint.Lagrangian.Model) }, + { "UncoupledConstraintCorrection", Moved("v22.06", "SofaConstraint", Sofa.Component.Constraint.Lagrangian.Correction) }, + { "UniformConstraint", Moved("v22.06", "SofaConstraint", Sofa.Component.Constraint.Lagrangian.Model) }, + { "UnilateralInteractionConstraint", Moved("v22.06", "SofaConstraint", Sofa.Component.Constraint.Lagrangian.Model) }, + { "ConstraintAnimationLoop", Moved("v22.06", "SofaConstraint", Sofa.Component.AnimationLoop) }, + { "FreeMotionAnimationLoop", Moved("v22.06", "SofaConstraint", Sofa.Component.AnimationLoop) }, + { "LocalMinDistance", Moved("v22.06", "SofaConstraint", Sofa.Component.Collision.Detection.Intersection) }, // SofaGeneralAnimationLoop was deprecated in #2635 and #2796 - { "MultiStepAnimationLoop", Moved("v22.06", "SofaGeneralAnimationLoop", "Sofa.Component.AnimationLoop") }, - { "MultiTagAnimationLoop", Moved("v22.06", "SofaGeneralAnimationLoop", "Sofa.Component.AnimationLoop") }, + { "MultiStepAnimationLoop", Moved("v22.06", "SofaGeneralAnimationLoop", Sofa.Component.AnimationLoop) }, + { "MultiTagAnimationLoop", Moved("v22.06", "SofaGeneralAnimationLoop", Sofa.Component.AnimationLoop) }, // SofaSimpleFem was deprecated in #2759 - { "HexahedronFEMForceField", Moved("v22.06", "SofaSimpleFem", "Sofa.Component.SolidMechanics.FEM.Elastic") }, - { "TetrahedronFEMForceField", Moved("v22.06", "SofaSimpleFem", "Sofa.Component.SolidMechanics.FEM.Elastic") }, + { "HexahedronFEMForceField", Moved("v22.06", "SofaSimpleFem", Sofa.Component.SolidMechanics.FEM.Elastic) }, + { "TetrahedronFEMForceField", Moved("v22.06", "SofaSimpleFem", Sofa.Component.SolidMechanics.FEM.Elastic) }, // SofaGeneralSimpleFem was deprecated in #2759 - { "BeamFEMForceField", Moved("v22.06", "SofaGeneralSimpleFem", "Sofa.Component.SolidMechanics.FEM.Elastic") }, - { "HexahedralFEMForceField", Moved("v22.06", "SofaGeneralSimpleFem", "Sofa.Component.SolidMechanics.FEM.Elastic") }, - { "HexahedralFEMForceFieldAndMass", Moved("v22.06", "SofaGeneralSimpleFem", "Sofa.Component.SolidMechanics.FEM.Elastic") }, - { "HexahedronFEMForceFieldAndMass", Moved("v22.06", "SofaGeneralSimpleFem", "Sofa.Component.SolidMechanics.FEM.Elastic") }, - { "TetrahedralCorotationalFEMForceField", Moved("v22.06", "SofaGeneralSimpleFem", "Sofa.Component.SolidMechanics.FEM.Elastic") }, - { "TriangularFEMForceFieldOptim", Moved("v22.06", "SofaGeneralSimpleFem", "Sofa.Component.SolidMechanics.FEM.Elastic") }, + { "BeamFEMForceField", Moved("v22.06", "SofaGeneralSimpleFem", Sofa.Component.SolidMechanics.FEM.Elastic) }, + { "HexahedralFEMForceField", Moved("v22.06", "SofaGeneralSimpleFem", Sofa.Component.SolidMechanics.FEM.Elastic) }, + { "HexahedralFEMForceFieldAndMass", Moved("v22.06", "SofaGeneralSimpleFem", Sofa.Component.SolidMechanics.FEM.Elastic) }, + { "HexahedronFEMForceFieldAndMass", Moved("v22.06", "SofaGeneralSimpleFem", Sofa.Component.SolidMechanics.FEM.Elastic) }, + { "TetrahedralCorotationalFEMForceField", Moved("v22.06", "SofaGeneralSimpleFem", Sofa.Component.SolidMechanics.FEM.Elastic) }, + { "TriangularFEMForceFieldOptim", Moved("v22.06", "SofaGeneralSimpleFem", Sofa.Component.SolidMechanics.FEM.Elastic) }, // SofaMiscFem was deprecated in #2759 - { "FastTetrahedralCorotationalForceField", Moved("v22.06", "SofaMiscFem", "Sofa.Component.SolidMechanics.FEM.Elastic") }, - { "StandardTetrahedralFEMForceField", Moved("v22.06", "SofaMiscFem", "Sofa.Component.SolidMechanics.FEM.Elastic") }, - { "TriangleFEMForceField", Moved("v22.06", "SofaMiscFem", "Sofa.Component.SolidMechanics.FEM.Elastic") }, - { "TriangularAnisotropicFEMForceField", Moved("v22.06", "SofaMiscFem", "Sofa.Component.SolidMechanics.FEM.Elastic") }, - { "TriangularFEMForceField", Moved("v22.06", "SofaMiscFem", "Sofa.Component.SolidMechanics.FEM.Elastic") }, - { "QuadBendingFEMForceField", Moved("v22.06", "SofaMiscFem", "Sofa.Component.SolidMechanics.FEM.Elastic") }, - { "BoyceAndArruda", Moved("v22.06", "SofaMiscFem", "Sofa.Component.SolidMechanics.FEM.HyperElastic") }, - { "Costa", Moved("v22.06", "SofaMiscFem", "Sofa.Component.SolidMechanics.FEM.HyperElastic") }, - { "HyperelasticMaterial", Moved("v22.06", "SofaMiscFem", "Sofa.Component.SolidMechanics.FEM.HyperElastic") }, - { "MooneyRivlin", Moved("v22.06", "SofaMiscFem", "Sofa.Component.SolidMechanics.FEM.HyperElastic") }, - { "NeoHookean", Moved("v22.06", "SofaMiscFem", "Sofa.Component.SolidMechanics.FEM.HyperElastic") }, - { "Ogden", Moved("v22.06", "SofaMiscFem", "Sofa.Component.SolidMechanics.FEM.HyperElastic") }, - { "PlasticMaterial", Moved("v22.06", "SofaMiscFem", "Sofa.Component.SolidMechanics.FEM.HyperElastic") }, - { "StandardTetrahedralFEMForceField", Moved("v22.06", "SofaMiscFem", "Sofa.Component.SolidMechanics.FEM.HyperElastic") }, - { "STVenantKirchhoff", Moved("v22.06", "SofaMiscFem", "Sofa.Component.SolidMechanics.FEM.HyperElastic") }, - { "TetrahedronHyperelasticityFEMForceField", Moved("v22.06", "SofaMiscFem", "Sofa.Component.SolidMechanics.FEM.HyperElastic") }, - { "VerondaWestman", Moved("v22.06", "SofaMiscFem", "Sofa.Component.SolidMechanics.FEM.HyperElastic") }, - { "TetrahedralTensorMassForceField", Moved("v22.06", "SofaMiscFem", "Sofa.Component.SolidMechanics.FEM.TensorMass") }, + { "FastTetrahedralCorotationalForceField", Moved("v22.06", "SofaMiscFem", Sofa.Component.SolidMechanics.FEM.Elastic) }, + { "StandardTetrahedralFEMForceField", Moved("v22.06", "SofaMiscFem", Sofa.Component.SolidMechanics.FEM.Elastic) }, + { "TriangleFEMForceField", Moved("v22.06", "SofaMiscFem", Sofa.Component.SolidMechanics.FEM.Elastic) }, + { "TriangularAnisotropicFEMForceField", Moved("v22.06", "SofaMiscFem", Sofa.Component.SolidMechanics.FEM.Elastic) }, + { "TriangularFEMForceField", Moved("v22.06", "SofaMiscFem", Sofa.Component.SolidMechanics.FEM.Elastic) }, + { "QuadBendingFEMForceField", Moved("v22.06", "SofaMiscFem", Sofa.Component.SolidMechanics.FEM.Elastic) }, + { "BoyceAndArruda", Moved("v22.06", "SofaMiscFem", Sofa.Component.SolidMechanics.FEM.HyperElastic) }, + { "Costa", Moved("v22.06", "SofaMiscFem", Sofa.Component.SolidMechanics.FEM.HyperElastic) }, + { "HyperelasticMaterial", Moved("v22.06", "SofaMiscFem", Sofa.Component.SolidMechanics.FEM.HyperElastic) }, + { "MooneyRivlin", Moved("v22.06", "SofaMiscFem", Sofa.Component.SolidMechanics.FEM.HyperElastic) }, + { "NeoHookean", Moved("v22.06", "SofaMiscFem", Sofa.Component.SolidMechanics.FEM.HyperElastic) }, + { "Ogden", Moved("v22.06", "SofaMiscFem", Sofa.Component.SolidMechanics.FEM.HyperElastic) }, + { "PlasticMaterial", Moved("v22.06", "SofaMiscFem", Sofa.Component.SolidMechanics.FEM.HyperElastic) }, + { "StandardTetrahedralFEMForceField", Moved("v22.06", "SofaMiscFem", Sofa.Component.SolidMechanics.FEM.HyperElastic) }, + { "STVenantKirchhoff", Moved("v22.06", "SofaMiscFem", Sofa.Component.SolidMechanics.FEM.HyperElastic) }, + { "TetrahedronHyperelasticityFEMForceField", Moved("v22.06", "SofaMiscFem", Sofa.Component.SolidMechanics.FEM.HyperElastic) }, + { "VerondaWestman", Moved("v22.06", "SofaMiscFem", Sofa.Component.SolidMechanics.FEM.HyperElastic) }, + { "TetrahedralTensorMassForceField", Moved("v22.06", "SofaMiscFem", Sofa.Component.SolidMechanics.TensorMass) }, // SofaDeformable was deprecated in #2759 - { "AngularSpringForceField", Moved("v22.06", "SofaDeformable", "Sofa.Component.SolidMechanics.Spring") }, - { "MeshSpringForceField", Moved("v22.06", "SofaDeformable", "Sofa.Component.SolidMechanics.Spring") }, - { "RestShapeSpringsForceField", Moved("v22.06", "SofaDeformable", "Sofa.Component.SolidMechanics.Spring") }, - { "PolynomialRestShapeSpringsForceField", Moved("v22.06", "SofaDeformable", "Sofa.Component.SolidMechanics.Spring") }, - { "SpringForceField", Moved("v22.06", "SofaDeformable", "Sofa.Component.SolidMechanics.Spring") }, - { "StiffSpringForceField", Moved("v22.06", "SofaDeformable", "Sofa.Component.SolidMechanics.Spring") }, - { "PolynomialSpringsForceField", Moved("v22.06", "SofaDeformable", "Sofa.Component.SolidMechanics.Spring") }, + { "AngularSpringForceField", Moved("v22.06", "SofaDeformable", Sofa.Component.SolidMechanics.Spring) }, + { "MeshSpringForceField", Moved("v22.06", "SofaDeformable", Sofa.Component.SolidMechanics.Spring) }, + { "RestShapeSpringsForceField", Moved("v22.06", "SofaDeformable", Sofa.Component.SolidMechanics.Spring) }, + { "PolynomialRestShapeSpringsForceField", Moved("v22.06", "SofaDeformable", Sofa.Component.SolidMechanics.Spring) }, + { "SpringForceField", Moved("v22.06", "SofaDeformable", Sofa.Component.SolidMechanics.Spring) }, + { "StiffSpringForceField", Moved("v22.06", "SofaDeformable", Sofa.Component.SolidMechanics.Spring) }, + { "PolynomialSpringsForceField", Moved("v22.06", "SofaDeformable", Sofa.Component.SolidMechanics.Spring) }, // SofaGeneralDeformable was deprecated in #2759 - { "FastTriangularBendingSprings", Moved("v22.06", "SofaGeneralDeformable", "Sofa.Component.SolidMechanics.Spring") }, - { "FrameSpringForceField", Moved("v22.06", "SofaGeneralDeformable", "Sofa.Component.SolidMechanics.Spring") }, - { "QuadBendingSprings", Moved("v22.06", "SofaGeneralDeformable", "Sofa.Component.SolidMechanics.Spring") }, - { "QuadularBendingSprings", Moved("v22.06", "SofaGeneralDeformable", "Sofa.Component.SolidMechanics.Spring") }, - { "RegularGridSpringForceField", Moved("v22.06", "SofaGeneralDeformable", "Sofa.Component.SolidMechanics.Spring") }, - { "TriangleBendingSprings", Moved("v22.06", "SofaGeneralDeformable", "Sofa.Component.SolidMechanics.Spring") }, - { "TriangularBendingSprings", Moved("v22.06", "SofaGeneralDeformable", "Sofa.Component.SolidMechanics.Spring") }, - { "TriangleBendingSprings", Moved("v22.06", "SofaGeneralDeformable", "Sofa.Component.SolidMechanics.Spring") }, - { "TriangularBiquadraticSpringsForceField", Moved("v22.06", "SofaGeneralDeformable", "Sofa.Component.SolidMechanics.Spring") }, - { "TriangularQuadraticSpringsForceField", Moved("v22.06", "SofaGeneralDeformable", "Sofa.Component.SolidMechanics.Spring") }, - { "VectorSpringForceField", Moved("v22.06", "SofaGeneralDeformable", "Sofa.Component.SolidMechanics.Spring") }, - { "TriangularTensorMassForceField", Moved("v22.06", "SofaGeneralDeformable", "Sofa.Component.SolidMechanics.TensorMass") }, + { "FastTriangularBendingSprings", Moved("v22.06", "SofaGeneralDeformable", Sofa.Component.SolidMechanics.Spring) }, + { "FrameSpringForceField", Moved("v22.06", "SofaGeneralDeformable", Sofa.Component.SolidMechanics.Spring) }, + { "QuadBendingSprings", Moved("v22.06", "SofaGeneralDeformable", Sofa.Component.SolidMechanics.Spring) }, + { "QuadularBendingSprings", Moved("v22.06", "SofaGeneralDeformable", Sofa.Component.SolidMechanics.Spring) }, + { "RegularGridSpringForceField", Moved("v22.06", "SofaGeneralDeformable", Sofa.Component.SolidMechanics.Spring) }, + { "TriangleBendingSprings", Moved("v22.06", "SofaGeneralDeformable", Sofa.Component.SolidMechanics.Spring) }, + { "TriangularBendingSprings", Moved("v22.06", "SofaGeneralDeformable", Sofa.Component.SolidMechanics.Spring) }, + { "TriangleBendingSprings", Moved("v22.06", "SofaGeneralDeformable", Sofa.Component.SolidMechanics.Spring) }, + { "TriangularBiquadraticSpringsForceField", Moved("v22.06", "SofaGeneralDeformable", Sofa.Component.SolidMechanics.Spring) }, + { "TriangularQuadraticSpringsForceField", Moved("v22.06", "SofaGeneralDeformable", Sofa.Component.SolidMechanics.Spring) }, + { "VectorSpringForceField", Moved("v22.06", "SofaGeneralDeformable", Sofa.Component.SolidMechanics.Spring) }, + { "TriangularTensorMassForceField", Moved("v22.06", "SofaGeneralDeformable", Sofa.Component.SolidMechanics.TensorMass) }, // SofaGeneralObjectInteraction was deprecated in #2759 and #3039 - { "RepulsiveSpringForceField", Moved("v22.06", "SofaGeneralObjectInteraction", "Sofa.Component.SolidMechanics.Spring") }, - { "InteractionEllipsoidForceField", Moved("v22.06", "SofaGeneralObjectInteraction", "Sofa.Component.MechanicalLoad") }, + { "RepulsiveSpringForceField", Moved("v22.06", "SofaGeneralObjectInteraction", Sofa.Component.SolidMechanics.Spring) }, + { "InteractionEllipsoidForceField", Moved("v22.06", "SofaGeneralObjectInteraction", Sofa.Component.MechanicalLoad) }, // SofaGeneralObjectInteraction was deprecated in #2790 and ... - { "AttachConstraint", Moved("v22.06", "SofaGeneralObjectInteraction", "Sofa.Component.Constraint.Projective") }, + { "AttachConstraint", Moved("v22.06", "SofaGeneralObjectInteraction", Sofa.Component.Constraint.Projective) }, // SofaBoundaryCondition was deprecated in #2790 and #2759 - { "AffineMovementConstraint", Moved("v22.06", "SofaBoundaryCondition", "Sofa.Component.Constraint.Projective") }, - { "FixedConstraint", Moved("v22.06", "SofaBoundaryCondition", "Sofa.Component.Constraint.Projective") }, - { "FixedPlaneConstraint", Moved("v22.06", "SofaBoundaryCondition", "Sofa.Component.Constraint.Projective") }, - { "FixedRotationConstraint", Moved("v22.06", "SofaBoundaryCondition", "Sofa.Component.Constraint.Projective") }, - { "FixedTranslationConstraint", Moved("v22.06", "SofaBoundaryCondition", "Sofa.Component.Constraint.Projective") }, - { "HermiteSplineConstraint", Moved("v22.06", "SofaBoundaryCondition", "Sofa.Component.Constraint.Projective") }, - { "LinearMovementConstraint", Moved("v22.06", "SofaBoundaryCondition", "Sofa.Component.Constraint.Projective") }, - { "LinearVelocityConstraint", Moved("v22.06", "SofaBoundaryCondition", "Sofa.Component.Constraint.Projective") }, - { "OscillatorConstraint", Moved("v22.06", "SofaBoundaryCondition", "Sofa.Component.Constraint.Projective") }, - { "ParabolicConstraint", Moved("v22.06", "SofaBoundaryCondition", "Sofa.Component.Constraint.Projective") }, - { "PartialFixedConstraint", Moved("v22.06", "SofaBoundaryCondition", "Sofa.Component.Constraint.Projective") }, - { "PartialLinearMovementConstraint", Moved("v22.06", "SofaBoundaryCondition", "Sofa.Component.Constraint.Projective") }, - { "PatchTestMovementConstraint", Moved("v22.06", "SofaBoundaryCondition", "Sofa.Component.Constraint.Projective") }, - { "PointConstraint", Moved("v22.06", "SofaBoundaryCondition", "Sofa.Component.Constraint.Projective") }, - { "PositionBasedDynamicsConstraint", Moved("v22.06", "SofaBoundaryCondition", "Sofa.Component.Constraint.Projective") }, - { "ProjectDirectionConstraint", Moved("v22.06", "SofaBoundaryCondition", "Sofa.Component.Constraint.Projective") }, - { "ProjectToLineConstraint", Moved("v22.06", "SofaBoundaryCondition", "Sofa.Component.Constraint.Projective") }, - { "ProjectToPlaneConstraint", Moved("v22.06", "SofaBoundaryCondition", "Sofa.Component.Constraint.Projective") }, - { "ProjectToPointConstraint", Moved("v22.06", "SofaBoundaryCondition", "Sofa.Component.Constraint.Projective") }, - { "AttachConstraint", Moved("v22.06", "SofaBoundaryCondition", "Sofa.Component.Constraint.Projective") }, - { "SkeletalMotionConstraint", Moved("v22.06", "SofaBoundaryCondition", "Sofa.Component.Constraint.Projective") }, - { "ConicalForceField", Moved("v22.06", "SofaBoundaryCondition", "Sofa.Component.MechanicalLoad") }, - { "ConstantForceField", Moved("v22.06", "SofaBoundaryCondition", "Sofa.Component.MechanicalLoad") }, - { "DiagonalVelocityDampingForceField", Moved("v22.06", "SofaBoundaryCondition", "Sofa.Component.MechanicalLoad") }, - { "EdgePressureForceField", Moved("v22.06", "SofaBoundaryCondition", "Sofa.Component.MechanicalLoad") }, - { "EllipsoidForceField", Moved("v22.06", "SofaBoundaryCondition", "Sofa.Component.MechanicalLoad") }, - { "LinearForceField", Moved("v22.06", "SofaBoundaryCondition", "Sofa.Component.MechanicalLoad") }, - { "OscillatingTorsionPressureForceField", Moved("v22.06", "SofaBoundaryCondition", "Sofa.Component.MechanicalLoad") }, - { "PlaneForceField", Moved("v22.06", "SofaBoundaryCondition", "Sofa.Component.MechanicalLoad") }, - { "QuadPressureForceField", Moved("v22.06", "SofaBoundaryCondition", "Sofa.Component.MechanicalLoad") }, - { "SphereForceField", Moved("v22.06", "SofaBoundaryCondition", "Sofa.Component.MechanicalLoad") }, - { "SurfacePressureForceField", Moved("v22.06", "SofaBoundaryCondition", "Sofa.Component.MechanicalLoad") }, - { "TaitSurfacePressureForceField", Moved("v22.06", "SofaBoundaryCondition", "Sofa.Component.MechanicalLoad") }, - { "TorsionForceField", Moved("v22.06", "SofaBoundaryCondition", "Sofa.Component.MechanicalLoad") }, - { "TrianglePressureForceField", Moved("v22.06", "SofaBoundaryCondition", "Sofa.Component.MechanicalLoad") }, - { "UniformVelocityDampingForceField", Moved("v22.06", "SofaBoundaryCondition", "Sofa.Component.MechanicalLoad") }, + { "AffineMovementConstraint", Moved("v22.06", "SofaBoundaryCondition", Sofa.Component.Constraint.Projective) }, + { "FixedConstraint", Moved("v22.06", "SofaBoundaryCondition", Sofa.Component.Constraint.Projective) }, + { "FixedPlaneConstraint", Moved("v22.06", "SofaBoundaryCondition", Sofa.Component.Constraint.Projective) }, + { "FixedRotationConstraint", Moved("v22.06", "SofaBoundaryCondition", Sofa.Component.Constraint.Projective) }, + { "FixedTranslationConstraint", Moved("v22.06", "SofaBoundaryCondition", Sofa.Component.Constraint.Projective) }, + { "HermiteSplineConstraint", Moved("v22.06", "SofaBoundaryCondition", Sofa.Component.Constraint.Projective) }, + { "LinearMovementConstraint", Moved("v22.06", "SofaBoundaryCondition", Sofa.Component.Constraint.Projective) }, + { "LinearVelocityConstraint", Moved("v22.06", "SofaBoundaryCondition", Sofa.Component.Constraint.Projective) }, + { "OscillatorConstraint", Moved("v22.06", "SofaBoundaryCondition", Sofa.Component.Constraint.Projective) }, + { "ParabolicConstraint", Moved("v22.06", "SofaBoundaryCondition", Sofa.Component.Constraint.Projective) }, + { "PartialFixedConstraint", Moved("v22.06", "SofaBoundaryCondition", Sofa.Component.Constraint.Projective) }, + { "PartialLinearMovementConstraint", Moved("v22.06", "SofaBoundaryCondition", Sofa.Component.Constraint.Projective) }, + { "PatchTestMovementConstraint", Moved("v22.06", "SofaBoundaryCondition", Sofa.Component.Constraint.Projective) }, + { "PointConstraint", Moved("v22.06", "SofaBoundaryCondition", Sofa.Component.Constraint.Projective) }, + { "PositionBasedDynamicsConstraint", Moved("v22.06", "SofaBoundaryCondition", Sofa.Component.Constraint.Projective) }, + { "ProjectDirectionConstraint", Moved("v22.06", "SofaBoundaryCondition", Sofa.Component.Constraint.Projective) }, + { "ProjectToLineConstraint", Moved("v22.06", "SofaBoundaryCondition", Sofa.Component.Constraint.Projective) }, + { "ProjectToPlaneConstraint", Moved("v22.06", "SofaBoundaryCondition", Sofa.Component.Constraint.Projective) }, + { "ProjectToPointConstraint", Moved("v22.06", "SofaBoundaryCondition", Sofa.Component.Constraint.Projective) }, + { "AttachConstraint", Moved("v22.06", "SofaBoundaryCondition", Sofa.Component.Constraint.Projective) }, + { "SkeletalMotionConstraint", Moved("v22.06", "SofaBoundaryCondition", Sofa.Component.Constraint.Projective) }, + { "ConicalForceField", Moved("v22.06", "SofaBoundaryCondition", Sofa.Component.MechanicalLoad) }, + { "ConstantForceField", Moved("v22.06", "SofaBoundaryCondition", Sofa.Component.MechanicalLoad) }, + { "DiagonalVelocityDampingForceField", Moved("v22.06", "SofaBoundaryCondition", Sofa.Component.MechanicalLoad) }, + { "EdgePressureForceField", Moved("v22.06", "SofaBoundaryCondition", Sofa.Component.MechanicalLoad) }, + { "EllipsoidForceField", Moved("v22.06", "SofaBoundaryCondition", Sofa.Component.MechanicalLoad) }, + { "LinearForceField", Moved("v22.06", "SofaBoundaryCondition", Sofa.Component.MechanicalLoad) }, + { "OscillatingTorsionPressureForceField", Moved("v22.06", "SofaBoundaryCondition", Sofa.Component.MechanicalLoad) }, + { "PlaneForceField", Moved("v22.06", "SofaBoundaryCondition", Sofa.Component.MechanicalLoad) }, + { "QuadPressureForceField", Moved("v22.06", "SofaBoundaryCondition", Sofa.Component.MechanicalLoad) }, + { "SphereForceField", Moved("v22.06", "SofaBoundaryCondition", Sofa.Component.MechanicalLoad) }, + { "SurfacePressureForceField", Moved("v22.06", "SofaBoundaryCondition", Sofa.Component.MechanicalLoad) }, + { "TaitSurfacePressureForceField", Moved("v22.06", "SofaBoundaryCondition", Sofa.Component.MechanicalLoad) }, + { "TorsionForceField", Moved("v22.06", "SofaBoundaryCondition", Sofa.Component.MechanicalLoad) }, + { "TrianglePressureForceField", Moved("v22.06", "SofaBoundaryCondition", Sofa.Component.MechanicalLoad) }, + { "UniformVelocityDampingForceField", Moved("v22.06", "SofaBoundaryCondition", Sofa.Component.MechanicalLoad) }, // SofaBaseCollision was deprecated in #2813 - { "BruteForceBroadPhase", Moved("v22.06", "SofaBaseCollision", "Sofa.Component.Collision.Detection.Algorithm") }, - { "BruteForceDetection", Moved("v22.06", "SofaBaseCollision", "Sofa.Component.Collision.Detection.Algorithm") }, - { "BVHNarrowPhase", Moved("v22.06", "SofaBaseCollision", "Sofa.Component.Collision.Detection.Algorithm") }, - { "DefaultPipeline", Moved("v22.06", "SofaBaseCollision", "Sofa.Component.Collision.Detection.Algorithm") }, - { "DiscreteIntersection", Moved("v22.06", "SofaBaseCollision", "Sofa.Component.Collision.Detection.Intersection") }, - { "MinProximityIntersection", Moved("v22.06", "SofaBaseCollision", "Sofa.Component.Collision.Detection.Intersection") }, - { "NewProximityIntersection", Moved("v22.06", "SofaBaseCollision", "Sofa.Component.Collision.Detection.Intersection") }, - { "CubeCollisionModel", Moved("v22.06", "SofaBaseCollision", "Sofa.Component.Collision.Geometry") }, - { "SphereCollisionModel", Moved("v22.06", "SofaBaseCollision", "Sofa.Component.Collision.Geometry") }, - { "CylinderCollisionModel", Moved("v22.06", "SofaBaseCollision", "Sofa.Component.Collision.Geometry") }, - { "DefaultContactManager", Moved("v22.06", "SofaBaseCollision", "Sofa.Component.Collision.Response.Contact") }, - { "ContactListener", Moved("v22.06", "SofaBaseCollision", "Sofa.Component.Collision.Response.Contact") }, + { "BruteForceBroadPhase", Moved("v22.06", "SofaBaseCollision", Sofa.Component.Collision.Detection.Algorithm) }, + { "BruteForceDetection", Moved("v22.06", "SofaBaseCollision", Sofa.Component.Collision.Detection.Algorithm) }, + { "BVHNarrowPhase", Moved("v22.06", "SofaBaseCollision", Sofa.Component.Collision.Detection.Algorithm) }, + { "DefaultPipeline", Moved("v22.06", "SofaBaseCollision", Sofa.Component.Collision.Detection.Algorithm) }, + { "DiscreteIntersection", Moved("v22.06", "SofaBaseCollision", Sofa.Component.Collision.Detection.Intersection) }, + { "MinProximityIntersection", Moved("v22.06", "SofaBaseCollision", Sofa.Component.Collision.Detection.Intersection) }, + { "NewProximityIntersection", Moved("v22.06", "SofaBaseCollision", Sofa.Component.Collision.Detection.Intersection) }, + { "CubeCollisionModel", Moved("v22.06", "SofaBaseCollision", Sofa.Component.Collision.Geometry) }, + { "SphereCollisionModel", Moved("v22.06", "SofaBaseCollision", Sofa.Component.Collision.Geometry) }, + { "CylinderCollisionModel", Moved("v22.06", "SofaBaseCollision", Sofa.Component.Collision.Geometry) }, + { "DefaultContactManager", Moved("v22.06", "SofaBaseCollision", Sofa.Component.Collision.Response.Contact) }, + { "ContactListener", Moved("v22.06", "SofaBaseCollision", Sofa.Component.Collision.Response.Contact) }, // SofaMeshCollision was deprecated in #2813 - { "PointCollisionModel", Moved("v22.06", "SofaMeshCollision", "Sofa.Component.Collision.Geometry") }, - { "LineCollisionModel", Moved("v22.06", "SofaMeshCollision", "Sofa.Component.Collision.Geometry") }, - { "TriangleCollisionModel", Moved("v22.06", "SofaMeshCollision", "Sofa.Component.Collision.Geometry") }, + { "PointCollisionModel", Moved("v22.06", "SofaMeshCollision", Sofa.Component.Collision.Geometry) }, + { "LineCollisionModel", Moved("v22.06", "SofaMeshCollision", Sofa.Component.Collision.Geometry) }, + { "TriangleCollisionModel", Moved("v22.06", "SofaMeshCollision", Sofa.Component.Collision.Geometry) }, // SofaGeneralMeshCollision was deprecated in #2813 - { "DirectSAP", Moved("v22.06", "SofaGeneralMeshCollision", "Sofa.Component.Collision.Detection.Algorithm") }, - { "DirectSAPNarrowPhase", Moved("v22.06", "SofaGeneralMeshCollision", "Sofa.Component.Collision.Detection.Algorithm") }, - { "IncrSAPClassSofaVector", Moved("v22.06", "SofaGeneralMeshCollision", "Sofa.Component.Collision.Detection.Algorithm") }, - { "RayTraceNarrowPhase", Moved("v22.06", "SofaGeneralMeshCollision", "Sofa.Component.Collision.Detection.Algorithm") }, - { "RayTraceDetection", Moved("v22.06", "SofaGeneralMeshCollision", "Sofa.Component.Collision.Detection.Algorithm") }, - { "TriangleOctreeModel", Moved("v22.06", "SofaGeneralMeshCollision", "Sofa.Component.Collision.Geometry") }, + { "DirectSAP", Moved("v22.06", "SofaGeneralMeshCollision", Sofa.Component.Collision.Detection.Algorithm) }, + { "DirectSAPNarrowPhase", Moved("v22.06", "SofaGeneralMeshCollision", Sofa.Component.Collision.Detection.Algorithm) }, + { "IncrSAPClassSofaVector", Moved("v22.06", "SofaGeneralMeshCollision", Sofa.Component.Collision.Detection.Algorithm) }, + { "RayTraceNarrowPhase", Moved("v22.06", "SofaGeneralMeshCollision", Sofa.Component.Collision.Detection.Algorithm) }, + { "RayTraceDetection", Moved("v22.06", "SofaGeneralMeshCollision", Sofa.Component.Collision.Detection.Algorithm) }, + { "TriangleOctreeModel", Moved("v22.06", "SofaGeneralMeshCollision", Sofa.Component.Collision.Geometry) }, // SofaUserInteraction was deprecated in #2813 - { "RayCollisionModel", Moved("v22.06", "SofaUserInteraction", "Sofa.Component.Collision.Geometry") }, - { "Controller", Moved("v22.06", "SofaUserInteraction", "Sofa.Component.Controller") }, - { "MechanicalStateController", Moved("v22.06", "SofaUserInteraction", "Sofa.Component.Controller") }, + { "RayCollisionModel", Moved("v22.06", "SofaUserInteraction", Sofa.Component.Collision.Geometry) }, + { "Controller", Moved("v22.06", "SofaUserInteraction", Sofa.Component.Controller) }, + { "MechanicalStateController", Moved("v22.06", "SofaUserInteraction", Sofa.Component.Controller) }, // SofaObjectInteraction was deprecated in #2813 - { "PenalityContactForceField", Moved("v22.06", "SofaObjectInteraction", "Sofa.Component.Collision.Response.Contact") }, + { "PenalityContactForceField", Moved("v22.06", "SofaObjectInteraction", Sofa.Component.Collision.Response.Contact) }, // SofaEngine was deprecated in #2812 - { "BoxROI", Moved("v22.06", "SofaEngine", "Sofa.Component.Engine.Select") }, + { "BoxROI", Moved("v22.06", "SofaEngine", Sofa.Component.Engine.Select) }, // SofaGeneralEngine was deprecated in #2812 - { "AverageCoord", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Analyze") }, - { "BoxROI", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Select") }, - { "ClusteringEngine", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Analyze") }, - { "ComplementaryROI", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Select") }, - { "DifferenceEngine", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Transform") }, - { "DilateEngine", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Transform") }, - { "DisplacementTransformEngine", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Transform") }, - { "ExtrudeEdgesAndGenerateQuads", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Generate") }, - { "ExtrudeQuadsAndGenerateHexas", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Generate") }, - { "ExtrudeSurface", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Generate") }, - { "GenerateCylinder", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Generate") }, - { "GenerateGrid", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Generate") }, - { "GenerateRigidMass", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Generate") }, - { "GenerateSphere", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Generate") }, - { "GroupFilterYoungModulus", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Generate") }, - { "HausdorffDistance", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Analyze") }, - { "IndexValueMapper", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Transform") }, - { "Indices2ValuesMapper", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Transform") }, - { "IndicesFromValues", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Select") }, - { "InvertTransformMatrixEngine", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Transform") }, - { "JoinPoints", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Generate") }, - { "MapIndices", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Transform") }, - { "MathOp", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Transform") }, - { "MergeMeshes", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Generate") }, - { "MergePoints", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Generate") }, - { "MergeROIs", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Select") }, - { "MergeSets", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Generate") }, - { "MergeVectors", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Generate") }, - { "MeshBarycentricMapperEngine", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Generate") }, - { "MeshBoundaryROI", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Select") }, - { "MeshClosingEngine", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Generate") }, - { "MeshROI", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Select") }, - { "MeshSampler", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Transform") }, - { "MeshSplittingEngine", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Select") }, - { "MeshSubsetEngine", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Select") }, - { "NearestPointROI", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Select") }, - { "NormEngine", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Generate") }, - { "NormalsFromPoints", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Generate") }, - { "PairBoxROI", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Select") }, - { "PlaneROI", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Select") }, - { "PointsFromIndices", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Select") }, - { "ProximityROI", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Select") }, - { "QuatToRigidEngine", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Transform") }, - { "ROIValueMapper", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Transform") }, - { "RandomPointDistributionInSurface", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Generate") }, - { "RigidToQuatEngine", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Transform") }, - { "RotateTransformMatrixEngine", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Transform") }, - { "ScaleTransformMatrixEngine", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Transform") }, - { "SelectConnectedLabelsROI", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Select") }, - { "SelectLabelROI", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Select") }, - { "ShapeMatching", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Analyze") }, - { "SmoothMeshEngine", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Transform") }, - { "SphereROI", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Select") }, - { "Spiral", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Generate") }, - { "SubsetTopology", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Select") }, - { "SumEngine", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Analyze") }, - { "TransformEngine", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Transform") }, - { "TransformPosition", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Transform") }, - { "TranslateTransformMatrixEngine", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Transform") }, - { "ValuesFromIndices", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Select") }, - { "ValuesFromPositions", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Select") }, - { "Vertex2Frame", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Transform") }, + { "AverageCoord", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Analyze) }, + { "BoxROI", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Select) }, + { "ClusteringEngine", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Analyze) }, + { "ComplementaryROI", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Select) }, + { "DifferenceEngine", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Transform) }, + { "DilateEngine", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Transform) }, + { "DisplacementTransformEngine", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Transform) }, + { "ExtrudeEdgesAndGenerateQuads", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Generate) }, + { "ExtrudeQuadsAndGenerateHexas", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Generate) }, + { "ExtrudeSurface", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Generate) }, + { "GenerateCylinder", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Generate) }, + { "GenerateGrid", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Generate) }, + { "GenerateRigidMass", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Generate) }, + { "GenerateSphere", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Generate) }, + { "GroupFilterYoungModulus", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Generate) }, + { "HausdorffDistance", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Analyze) }, + { "IndexValueMapper", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Transform) }, + { "Indices2ValuesMapper", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Transform) }, + { "IndicesFromValues", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Select) }, + { "InvertTransformMatrixEngine", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Transform) }, + { "JoinPoints", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Generate) }, + { "MapIndices", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Transform) }, + { "MathOp", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Transform) }, + { "MergeMeshes", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Generate) }, + { "MergePoints", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Generate) }, + { "MergeROIs", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Select) }, + { "MergeSets", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Generate) }, + { "MergeVectors", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Generate) }, + { "MeshBarycentricMapperEngine", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Generate) }, + { "MeshBoundaryROI", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Select) }, + { "MeshClosingEngine", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Generate) }, + { "MeshROI", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Select) }, + { "MeshSampler", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Transform) }, + { "MeshSplittingEngine", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Select) }, + { "MeshSubsetEngine", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Select) }, + { "NearestPointROI", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Select) }, + { "NormEngine", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Generate) }, + { "NormalsFromPoints", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Generate) }, + { "PairBoxROI", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Select) }, + { "PlaneROI", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Select) }, + { "PointsFromIndices", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Select) }, + { "ProximityROI", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Select) }, + { "QuatToRigidEngine", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Transform) }, + { "ROIValueMapper", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Transform) }, + { "RandomPointDistributionInSurface", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Generate) }, + { "RigidToQuatEngine", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Transform) }, + { "RotateTransformMatrixEngine", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Transform) }, + { "ScaleTransformMatrixEngine", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Transform) }, + { "SelectConnectedLabelsROI", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Select) }, + { "SelectLabelROI", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Select) }, + { "ShapeMatching", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Analyze) }, + { "SmoothMeshEngine", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Transform) }, + { "SphereROI", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Select) }, + { "Spiral", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Generate) }, + { "SubsetTopology", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Select) }, + { "SumEngine", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Analyze) }, + { "TransformEngine", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Transform) }, + { "TransformPosition", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Transform) }, + { "TranslateTransformMatrixEngine", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Transform) }, + { "ValuesFromIndices", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Select) }, + { "ValuesFromPositions", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Select) }, + { "Vertex2Frame", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Transform) }, // SofaMiscEngine was deprecated in #2812 - { "Distances", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Analyze") }, - { "DisplacementMatrixEngine", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Transform") }, - { "ProjectiveTransformEngine", Moved("v22.06", "SofaGeneralEngine", "Sofa.Component.Engine.Transform") }, + { "Distances", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Analyze) }, + { "DisplacementMatrixEngine", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Transform) }, + { "ProjectiveTransformEngine", Moved("v22.06", "SofaGeneralEngine", Sofa.Component.Engine.Transform) }, // SofaMiscExtra was deprecated in #2917 - { "MeshTetraStuffing", Moved("v22.06", "SofaMiscExtra", "Sofa.Component.Engine.Generate") }, + { "MeshTetraStuffing", Moved("v22.06", "SofaMiscExtra", Sofa.Component.Engine.Generate) }, // SofaMiscCollision was deprecated in #2813 and #2820 { "OBBModel", Moved("v22.06", "SofaMiscCollision", "CollisionOBBCapsule") }, { "RigidCapsuleCollisionModel", Moved("v22.06", "SofaMiscCollision", "CollisionOBBCapsule") }, { "CapsuleCollisionModel", Moved("v22.06", "SofaMiscCollision", "CollisionOBBCapsule") }, - { "TriangleModelInRegularGrid", Moved("v22.06", "SofaMiscCollision", "Sofa.Component.Collision.Geometry") }, - { "TetrahedronCollisionModel", Moved("v22.06", "SofaMiscCollision", "Sofa.Component.Collision.Geometry") }, - { "RuleBasedContactManager", Moved("v22.06", "SofaMiscCollision", "Sofa.Component.Collision.Response.Contact") }, + { "TriangleModelInRegularGrid", Moved("v22.06", "SofaMiscCollision", Sofa.Component.Collision.Geometry) }, + { "TetrahedronCollisionModel", Moved("v22.06", "SofaMiscCollision", Sofa.Component.Collision.Geometry) }, + { "RuleBasedContactManager", Moved("v22.06", "SofaMiscCollision", Sofa.Component.Collision.Response.Contact) }, // SofaHaptics was deprecated in #3039 - { "ForceFeedback", Moved("v22.06", "SofaHaptics", "Sofa.Component.Haptics") }, - { "LCPForceFeedback", Moved("v22.06", "SofaHaptics", "Sofa.Component.Haptics") }, - { "MechanicalStateForceFeedback", Moved("v22.06", "SofaHaptics", "Sofa.Component.Haptics") }, - { "NullForceFeedback", Moved("v22.06", "SofaHaptics", "Sofa.Component.Haptics") }, + { "ForceFeedback", Moved("v22.06", "SofaHaptics", Sofa.Component.Haptics) }, + { "LCPForceFeedback", Moved("v22.06", "SofaHaptics", Sofa.Component.Haptics) }, + { "MechanicalStateForceFeedback", Moved("v22.06", "SofaHaptics", Sofa.Component.Haptics) }, + { "NullForceFeedback", Moved("v22.06", "SofaHaptics", Sofa.Component.Haptics) }, // SofaValidation was deprecated in #3039 - { "CompareState", Moved("v22.06", "SofaValidation", "Sofa.Component.Playback") }, - { "CompareTopology", Moved("v22.06", "SofaValidation", "Sofa.Component.Playback") }, + { "CompareState", Moved("v22.06", "SofaValidation", Sofa.Component.Playback) }, + { "CompareTopology", Moved("v22.06", "SofaValidation", Sofa.Component.Playback) }, // Removed in #4040, deprecated in #2777 { "MechanicalMatrixMapper", Removed("v23.06", "v23.12") }, { "MappingGeometricStiffnessForceField", Removed("v23.06", "v23.12") }, // Moved to CSparseSolvers - { "SparseCholeskySolver", Moved("v23.12", "Sofa.Component.LinearSolver.Direct", "CSparseSolvers") }, - { "SparseLUSolver", Moved("v23.12", "Sofa.Component.LinearSolver.Direct", "CSparseSolvers") }, + { "SparseCholeskySolver", Moved("v23.12", Sofa.Component.LinearSolver.Direct, "CSparseSolvers") }, + { "SparseLUSolver", Moved("v23.12", Sofa.Component.LinearSolver.Direct, "CSparseSolvers") }, // Moved to Sofa.Component.MechanicalLoad - { "Gravity", Moved("v24.12", "SofaGraphComponent", "Sofa.Component.Mechanicalload") } + { "Gravity", Moved("v24.12", "SofaGraphComponent", Sofa.Component.MechanicalLoad) }, + + { "OglCylinderModel", Moved("v24.12", "Sofa.GL.Component.Rendering3D", "Sofa.Component.Visual")} }; const std::map > uncreatableComponents = { @@ -760,8 +762,8 @@ const std::map< std::string, Renamed, std::less<> > renamedComponents = { {"UnilateralInteractionConstraint", Renamed("v24.06","v25.06","UnilateralLagrangianConstraint")}, {"StiffSpringForceField", Renamed("v24.06","v25.06","SpringForceField")}, {"ParallelStiffSpringForceField", Renamed("v24.06","v25.06","ParallelSpringForceField")}, - {"ShewchukPCGLinearSolver", Renamed("v24.12","v25.12","PCGLinearSolver")} - + {"ShewchukPCGLinearSolver", Renamed("v24.12","v25.12","PCGLinearSolver")}, + {"OglCylinderModel", Renamed("v24.12", "v25.06", "CylinderVisualModel")} }; diff --git a/Sofa/framework/Helper/src/sofa/helper/OptionsGroup.h b/Sofa/framework/Helper/src/sofa/helper/OptionsGroup.h index a6fa39ac04b..d53707e4e9a 100644 --- a/Sofa/framework/Helper/src/sofa/helper/OptionsGroup.h +++ b/Sofa/framework/Helper/src/sofa/helper/OptionsGroup.h @@ -28,7 +28,6 @@ #include #include -#include namespace sofa::helper { @@ -58,7 +57,7 @@ public : explicit OptionsGroup(int nbofRadioButton,...); ///generic constructor taking other string container like list, set, vector - template ::value> > + template explicit OptionsGroup(const T& list); template OptionsGroup(const std::initializer_list& list); @@ -114,7 +113,7 @@ public : type::vector textItems ; unsigned int selectedItem ; - template void buildFromContainer(const T& list); + template void buildFromContainer(const T& list); public: @@ -137,7 +136,7 @@ inline std::istream & operator >>(std::istream& in, OptionsGroup& m_trick) return in; } -template +template OptionsGroup::OptionsGroup(const T& list) { buildFromContainer(list); @@ -159,7 +158,7 @@ void OptionsGroup::setNames(const std::initializer_list& list) selectedItem=0; } -template +template void OptionsGroup::buildFromContainer(const T& list) { textItems.reserve(list.size()); diff --git a/Sofa/framework/Helper/src/sofa/helper/SelectableItem.h b/Sofa/framework/Helper/src/sofa/helper/SelectableItem.h index 87a32ecedd9..06a86c4cc9b 100644 --- a/Sofa/framework/Helper/src/sofa/helper/SelectableItem.h +++ b/Sofa/framework/Helper/src/sofa/helper/SelectableItem.h @@ -1,4 +1,4 @@ -/****************************************************************************** +/****************************************************************************** * SOFA, Simulation Open-Framework Architecture * * (c) 2006 INRIA, USTL, UJF, CNRS, MGH * * * @@ -87,9 +87,9 @@ struct BaseSelectableItem [[nodiscard]] virtual std::size_t getNumberOfItems() const { return 0; } [[nodiscard]] virtual const Item* getItemsData() const { return nullptr; } [[nodiscard]] virtual std::size_t getSelectedId() const { return 0; } - virtual void setSelectedId(std::size_t id) {} - virtual void print(std::ostream& out) const {} - virtual void readFromStream(std::istream& stream) {} + virtual void setSelectedId(std::size_t /* id */) {} + virtual void print(std::ostream& /* out */) const {} + virtual void readFromStream(std::istream& /* stream */) {} }; inline std::ostream& operator<<(std::ostream& out, const BaseSelectableItem& selectableItem) @@ -240,27 +240,20 @@ class SelectableItem : public BaseSelectableItem static constexpr id_type findId(const std::string_view key) { - return findId_impl(key, std::make_index_sequence{}); - } - - template - static constexpr id_type findId_impl(const std::string_view key, std::index_sequence) - { - id_type result = static_cast(-1); - ((Derived::s_items[Is].key == key ? (result = Is, true) : false) || ...); - return result; + //use std::ranges::enumerate in C++23 + for (id_type i = 0; i < numberOfItems(); ++i) + { + if (key == Derived::s_items[i].key) + { + return i; + } + } + return static_cast(-1); } - template > - struct has_deprecation_map : std::false_type {}; - - // Specialization when T has a static member s_foo - template - struct has_deprecation_map> : std::true_type {}; - void keyError(const std::string_view key) { - if constexpr (has_deprecation_map::value) + if constexpr (requires {Derived::s_deprecationMap;}) { static_assert(std::is_same_v, std::map>); const auto it = Derived::s_deprecationMap.find(key); diff --git a/Sofa/framework/Helper/src/sofa/helper/accessor/ReadAccessor.h b/Sofa/framework/Helper/src/sofa/helper/accessor/ReadAccessor.h index 624990800b3..fdf801a9ed6 100644 --- a/Sofa/framework/Helper/src/sofa/helper/accessor/ReadAccessor.h +++ b/Sofa/framework/Helper/src/sofa/helper/accessor/ReadAccessor.h @@ -72,8 +72,8 @@ class ReadAccessor const_reference operator* () const { return *vref; } }; -template -class ReadAccessor::value>> +template +class ReadAccessor : public ReadAccessorFixedArray< FixedArrayLikeType > { public: @@ -82,9 +82,8 @@ class ReadAccessor -class ReadAccessor::value> > +template +class ReadAccessor : public ReadAccessorVector< VectorLikeType > { public: diff --git a/Sofa/framework/Helper/src/sofa/helper/accessor/ReadAccessorFixedArray.h b/Sofa/framework/Helper/src/sofa/helper/accessor/ReadAccessorFixedArray.h index 62e493e45eb..71cf83fac57 100644 --- a/Sofa/framework/Helper/src/sofa/helper/accessor/ReadAccessorFixedArray.h +++ b/Sofa/framework/Helper/src/sofa/helper/accessor/ReadAccessorFixedArray.h @@ -28,7 +28,7 @@ namespace sofa::helper { ////////////////////////// ReadAccessor for wrapping around fixed array like object ////////////////////// /// ReadAccessor implementation class for fixed array types -template +template class ReadAccessorFixedArray { public: diff --git a/Sofa/framework/Helper/src/sofa/helper/accessor/ReadAccessorVector.h b/Sofa/framework/Helper/src/sofa/helper/accessor/ReadAccessorVector.h index 7e41acfd7c5..1563e8af637 100644 --- a/Sofa/framework/Helper/src/sofa/helper/accessor/ReadAccessorVector.h +++ b/Sofa/framework/Helper/src/sofa/helper/accessor/ReadAccessorVector.h @@ -28,7 +28,7 @@ namespace sofa::helper { ////////////////////////// ReadAccessor for wrapping around vector like object ////////////////////// /// ReadAccessor implementation class for vector types -template +template class ReadAccessorVector { public: diff --git a/Sofa/framework/Helper/src/sofa/helper/accessor/WriteAccessor.h b/Sofa/framework/Helper/src/sofa/helper/accessor/WriteAccessor.h index e1abe8b7442..23b4695b7ef 100644 --- a/Sofa/framework/Helper/src/sofa/helper/accessor/WriteAccessor.h +++ b/Sofa/framework/Helper/src/sofa/helper/accessor/WriteAccessor.h @@ -83,8 +83,8 @@ class WriteAccessor } }; -template -class WriteAccessor::value>> +template +class WriteAccessor : public WriteAccessorFixedArray< FixedArrayLikeType > { public: @@ -93,9 +93,8 @@ class WriteAccessor -class WriteAccessor::value>> +template +class WriteAccessor : public WriteAccessorVector< VectorLikeType > { public: diff --git a/Sofa/framework/Helper/src/sofa/helper/accessor/WriteAccessorFixedArray.h b/Sofa/framework/Helper/src/sofa/helper/accessor/WriteAccessorFixedArray.h index 0953e07da48..5f6cc826d3c 100644 --- a/Sofa/framework/Helper/src/sofa/helper/accessor/WriteAccessorFixedArray.h +++ b/Sofa/framework/Helper/src/sofa/helper/accessor/WriteAccessorFixedArray.h @@ -27,7 +27,7 @@ namespace sofa::helper { /// WriteAccessor implementation class for fixed array types -template +template class WriteAccessorFixedArray { public: diff --git a/Sofa/framework/Helper/src/sofa/helper/accessor/WriteAccessorVector.h b/Sofa/framework/Helper/src/sofa/helper/accessor/WriteAccessorVector.h index a1036e867b6..0b699c93a01 100644 --- a/Sofa/framework/Helper/src/sofa/helper/accessor/WriteAccessorVector.h +++ b/Sofa/framework/Helper/src/sofa/helper/accessor/WriteAccessorVector.h @@ -27,7 +27,7 @@ namespace sofa::helper { /// WriteAccessor implementation class for vector types -template +template class WriteAccessorVector { public: @@ -72,6 +72,7 @@ class WriteAccessorVector ////// Modifiers ////// void clear() { vref->clear(); } void resize(Size s) { vref->resize(s); } + void resize(Size s, const value_type& value) { vref->resize(s, value); } iterator insert(const_iterator pos, const T& value) { return vref->insert(pos, value); } iterator erase(iterator pos) { return vref->erase(pos); } diff --git a/Sofa/framework/Helper/src/sofa/helper/accessor/WriteOnlyAccessor.h b/Sofa/framework/Helper/src/sofa/helper/accessor/WriteOnlyAccessor.h index c333ef19b21..9004581c784 100644 --- a/Sofa/framework/Helper/src/sofa/helper/accessor/WriteOnlyAccessor.h +++ b/Sofa/framework/Helper/src/sofa/helper/accessor/WriteOnlyAccessor.h @@ -39,9 +39,8 @@ class WriteOnlyAccessor : public WriteAccessor explicit WriteOnlyAccessor(container_type& container) : WriteAccessor(container) {} }; -template -class WriteOnlyAccessor::value> > +template +class WriteOnlyAccessor : public WriteAccessorVector< VectorLikeType > { public: diff --git a/Sofa/framework/Helper/src/sofa/helper/system/FileRepository.cpp b/Sofa/framework/Helper/src/sofa/helper/system/FileRepository.cpp index 9fbef88b423..dfd888f7de4 100644 --- a/Sofa/framework/Helper/src/sofa/helper/system/FileRepository.cpp +++ b/Sofa/framework/Helper/src/sofa/helper/system/FileRepository.cpp @@ -86,7 +86,6 @@ FileRepository PluginRepository( { Utils::getSofaPathTo("bin"), Utils::getSofaPathTo("plugins"), - Utils::getSofaPathTo("collections"), Utils::getExecutableDirectory(), } ); @@ -94,9 +93,8 @@ FileRepository PluginRepository( FileRepository PluginRepository( "SOFA_PLUGIN_PATH", { - Utils::getSofaPathTo("plugins"), - Utils::getSofaPathTo("collections"), Utils::getSofaPathTo("lib"), + Utils::getSofaPathTo("plugins"), } ); #endif diff --git a/Sofa/framework/Helper/src/sofa/helper/system/PluginManager.cpp b/Sofa/framework/Helper/src/sofa/helper/system/PluginManager.cpp index bf4df3e3c7b..35ec52d97b1 100644 --- a/Sofa/framework/Helper/src/sofa/helper/system/PluginManager.cpp +++ b/Sofa/framework/Helper/src/sofa/helper/system/PluginManager.cpp @@ -40,6 +40,48 @@ using sofa::helper::system::FileSystem; #include #include +#ifdef SOFA_BUILD_CONFIGURATION +constexpr std::string_view SOFA_BUILD_CONFIGURATION_STR = sofa_tostring(SOFA_BUILD_CONFIGURATION); +#else +constexpr std::string_view SOFA_BUILD_CONFIGURATION_STR = "NONE"; +#endif + +constexpr std::string_view GetSofaBuildConfigurationString() +{ + return SOFA_BUILD_CONFIGURATION_STR; +} + +enum class SofaBuildConfiguration +{ + Release, + RelWithDebInfo, + Debug, + MinSizeRel, + NonStandard +}; + +constexpr SofaBuildConfiguration GetSofaBuildConfiguration() +{ + if constexpr (GetSofaBuildConfigurationString() == "Release") + { + return SofaBuildConfiguration::Release; + } + if constexpr (GetSofaBuildConfigurationString() == "RelWithDebInfo") + { + return SofaBuildConfiguration::RelWithDebInfo; + } + if constexpr (GetSofaBuildConfigurationString() == "Debug") + { + return SofaBuildConfiguration::Debug; + } + if constexpr (GetSofaBuildConfigurationString() == "MinSizeRel") + { + return SofaBuildConfiguration::MinSizeRel; + } + + return SofaBuildConfiguration::NonStandard; +} + namespace sofa::helper::system { @@ -146,11 +188,14 @@ void PluginManager::writeToIniFile(const std::string& path) /// (depends on platform, version, debug/release build) std::string PluginManager::getDefaultSuffix() { -#ifdef SOFA_LIBSUFFIX - return sofa_tostring(SOFA_LIBSUFFIX); -#else - return std::string(); -#endif + if constexpr(GetSofaBuildConfiguration() == SofaBuildConfiguration::Debug) + { + return "_d"; + } + else + { + return ""; + } } PluginManager::PluginLoadStatus PluginManager::loadPluginByPath(const std::string& pluginPath, std::ostream* errlog) @@ -469,17 +514,46 @@ std::string PluginManager::findPlugin(const std::string& pluginName, const std:: } } } - - // Second try: case-insensitive and recursive + + // Second try: case-insensitive and non-recursive + if (ignoreCase) + { + const std::string downcaseLibName = helper::downcaseString(libName); + + for (const auto & dir : searchPaths) + { + const std::array paths = + { + dir, // Non-Multi-Config build, install + FileSystem::append(dir, GetSofaBuildConfigurationString()) // Multi-Config build + }; + + for (const auto & path : paths) + { + if ( fs::exists(path) ) + { + for (auto const& dirEntry : std::filesystem::directory_iterator{path}) + { + const std::string filename = dirEntry.path().filename().string(); + const std::string downcaseFilename = helper::downcaseString(filename); + if (downcaseFilename == downcaseLibName) + { + return FileSystem::cleanPath(dirEntry.path().string()); + } + } + } + } + } + } + + // Last try: case-insensitive and recursive if (ignoreCase) { if(!recursive) maxRecursiveDepth = 0; const std::string downcaseLibName = helper::downcaseString(libName); - - for (std::vector::iterator i = searchPaths.begin(); i!=searchPaths.end(); i++) + + for (const auto & dir : searchPaths) { - const std::string& dir = *i; - fs::recursive_directory_iterator iter(dir); fs::recursive_directory_iterator end; diff --git a/Sofa/framework/Helper/test/io/MeshOBJ_test.cpp b/Sofa/framework/Helper/test/io/MeshOBJ_test.cpp index 8f785fe1706..b673a6e933f 100644 --- a/Sofa/framework/Helper/test/io/MeshOBJ_test.cpp +++ b/Sofa/framework/Helper/test/io/MeshOBJ_test.cpp @@ -32,11 +32,11 @@ namespace sofa { class MeshOBJ_test : public BaseTest { protected: - void SetUp() override + void doSetUp() override { sofa::helper::system::DataRepository.addFirstPath(SOFA_TESTING_RESOURCES_DIR); } - void TearDown() override + void doTearDown() override { sofa::helper::system::DataRepository.removePath(SOFA_TESTING_RESOURCES_DIR); } diff --git a/Sofa/framework/Helper/test/io/STBImage_test.cpp b/Sofa/framework/Helper/test/io/STBImage_test.cpp index df88da8b06a..cd05d8dbc99 100644 --- a/Sofa/framework/Helper/test/io/STBImage_test.cpp +++ b/Sofa/framework/Helper/test/io/STBImage_test.cpp @@ -43,11 +43,11 @@ class STBImage_test : public BaseTest } - void SetUp() override + void doSetUp() override { sofa::helper::system::DataRepository.addFirstPath(STBIMAGETEST_RESOURCES_DIR); } - void TearDown() override + void doTearDown() override { sofa::helper::system::DataRepository.removePath(STBIMAGETEST_RESOURCES_DIR); } diff --git a/Sofa/framework/Helper/test/io/XspLoader_test.cpp b/Sofa/framework/Helper/test/io/XspLoader_test.cpp index c7d1476d54e..eb3acc1574c 100644 --- a/Sofa/framework/Helper/test/io/XspLoader_test.cpp +++ b/Sofa/framework/Helper/test/io/XspLoader_test.cpp @@ -85,11 +85,11 @@ class XspLoader_test : public BaseTest } }; - void SetUp() override + void doSetUp() override { sofa::helper::system::DataRepository.addFirstPath(SOFA_TESTING_RESOURCES_DIR); } - void TearDown() override + void doTearDown() override { sofa::helper::system::DataRepository.removePath(SOFA_TESTING_RESOURCES_DIR); } diff --git a/Sofa/framework/Helper/test/system/PluginManager_test.cpp b/Sofa/framework/Helper/test/system/PluginManager_test.cpp index ec780e35207..7d9ebf95dad 100644 --- a/Sofa/framework/Helper/test/system/PluginManager_test.cpp +++ b/Sofa/framework/Helper/test/system/PluginManager_test.cpp @@ -64,7 +64,7 @@ struct PluginManager_test: public BaseTest // This list of paths will be deleted when cleaning-up the test sofa::type::vector createdFilesToDelete; - void SetUp() override + void doSetUp() override { // Set pluginDir by searching pluginFileName in the PluginRepository for ( std::string path : sofa::helper::system::PluginRepository.getPaths() ) @@ -83,7 +83,7 @@ struct PluginManager_test: public BaseTest << std::endl; } - void TearDown() override + void doTearDown() override { for (const auto& file : createdFilesToDelete) { @@ -122,12 +122,22 @@ TEST_F(PluginManager_test, loadTestPluginAByPath) /// Check that existing plugins are correctly handled and returns no /// error/warning message. { - EXPECT_MSG_NOEMIT(Warning, Error); - + EXPECT_MSG_NOEMIT(Error, Warning); + std::cout << "PluginManager_test.loadTestPluginAByPath: " - << "pm.getPluginMap().size() = " << pm.getPluginMap().size() - << std::endl; + << "pm.getPluginMap().size() = " << pm.getPluginMap().size() + << std::endl; + } + { + EXPECT_MSG_NOEMIT(Error); + // Plugin A still uses the deprecated registration mechanism + // and is expected to throw a warning when loaded + EXPECT_MSG_EMIT(Warning); + ASSERT_EQ(pm.loadPluginByPath(pluginPath), PluginManager::PluginLoadStatus::SUCCESS); + } + { + EXPECT_MSG_NOEMIT(Error, Warning); ASSERT_GT(pm.findPlugin(pluginAName).size(), 0u); } diff --git a/Sofa/framework/LinearAlgebra/Testing/src/Sofa.LinearAlgebra.Testing/BaseMatrix_test.h b/Sofa/framework/LinearAlgebra/Testing/src/Sofa.LinearAlgebra.Testing/BaseMatrix_test.h index c092397e04d..4767da3fe64 100644 --- a/Sofa/framework/LinearAlgebra/Testing/src/Sofa.LinearAlgebra.Testing/BaseMatrix_test.h +++ b/Sofa/framework/LinearAlgebra/Testing/src/Sofa.LinearAlgebra.Testing/BaseMatrix_test.h @@ -47,7 +47,7 @@ class TestBaseMatrix : public sofa::testing::NumericTest static constexpr sofa::Index NbRows = T::NbRows; static constexpr sofa::Index NbCols = T::NbCols; - void onSetUp() override + void doSetUp() override { m_testedMatrix = std::make_unique(); m_testedMatrix->resize(NbRows, NbCols); @@ -55,7 +55,7 @@ class TestBaseMatrix : public sofa::testing::NumericTest m_modelMatrix.clear(); } - void onTearDown() override + void doTearDown() override { m_testedMatrix.reset(); } diff --git a/Sofa/framework/LinearAlgebra/src/sofa/linearalgebra/CompressedRowSparseMatrixConstraintEigenUtils.h b/Sofa/framework/LinearAlgebra/src/sofa/linearalgebra/CompressedRowSparseMatrixConstraintEigenUtils.h index 434d8758e37..3096d8d1c49 100644 --- a/Sofa/framework/LinearAlgebra/src/sofa/linearalgebra/CompressedRowSparseMatrixConstraintEigenUtils.h +++ b/Sofa/framework/LinearAlgebra/src/sofa/linearalgebra/CompressedRowSparseMatrixConstraintEigenUtils.h @@ -68,7 +68,7 @@ struct CompressedRowSparseMatrixToEigenSparseVec if (row.index() < eigenMat.rows()) { const auto colInsertion = colIndex + i; - if (colInsertion < eigenMat.cols()) + if (colInsertion < (std::size_t)eigenMat.cols()) { triplets.emplace_back(row.index(), colInsertion, vec[i]); } diff --git a/Sofa/framework/LinearAlgebra/src/sofa/linearalgebra/CompressedRowSparseMatrixMechanical.h b/Sofa/framework/LinearAlgebra/src/sofa/linearalgebra/CompressedRowSparseMatrixMechanical.h index 37784038f99..5dd349255a6 100644 --- a/Sofa/framework/LinearAlgebra/src/sofa/linearalgebra/CompressedRowSparseMatrixMechanical.h +++ b/Sofa/framework/LinearAlgebra/src/sofa/linearalgebra/CompressedRowSparseMatrixMechanical.h @@ -1199,7 +1199,7 @@ class CompressedRowSparseMatrixMechanical final // final is used to allow the co /// equal result = this * v /// @warning The block sizes must be compatible ie v.size() must be a multiple of block size. - template< typename V1, typename V2, std::enable_if_t::value && sofa::type::trait::is_vector::value, int> = 0 > + template< sofa::type::trait::is_vector V1, sofa::type::trait::is_vector V2> void mul( V2& result, const V1& v ) const { this-> template tmul< Real, V2, V1 >(result, v); diff --git a/Sofa/framework/SimpleApi/test/SimpleApi_test.cpp b/Sofa/framework/SimpleApi/test/SimpleApi_test.cpp index f9c26dfccd7..2ce3a2cbb08 100644 --- a/Sofa/framework/SimpleApi/test/SimpleApi_test.cpp +++ b/Sofa/framework/SimpleApi/test/SimpleApi_test.cpp @@ -38,7 +38,7 @@ bool SimpleApi_test::testParamAPI() const Simulation::SPtr simu = createSimulation("DAG") ; const Node::SPtr root = createRootNode(simu, "root") ; - sofa::simpleapi::importPlugin("Sofa.Component.StateContainer"); + sofa::simpleapi::importPlugin(Sofa.Component.StateContainer); const auto meca1 = createObject(root, "MechanicalObject", { {"name", "aMechanicalObject1"}, @@ -62,7 +62,7 @@ bool SimpleApi_test::testParamString() const Simulation::SPtr simu = createSimulation("DAG") ; const Node::SPtr root = createRootNode(simu, "root") ; - simpleapi::importPlugin("Sofa.Component.StateContainer"); + simpleapi::importPlugin(Sofa.Component.StateContainer); const auto meca1 = createObject(root, "MechanicalObject", { {"name", "aMechanicalObject1"}, diff --git a/Sofa/framework/Simulation/Core/simutest/NodeContext_test.cpp b/Sofa/framework/Simulation/Core/simutest/NodeContext_test.cpp index 188d5daa5cd..0ee595d2963 100644 --- a/Sofa/framework/Simulation/Core/simutest/NodeContext_test.cpp +++ b/Sofa/framework/Simulation/Core/simutest/NodeContext_test.cpp @@ -41,8 +41,8 @@ class NodeContext_test: public BaseSimulationTest NodeContext_test() { - sofa::simpleapi::importPlugin("Sofa.Component.StateContainer"); - sofa::simpleapi::importPlugin("Sofa.Component.SceneUtility"); + sofa::simpleapi::importPlugin(Sofa.Component.StateContainer); + sofa::simpleapi::importPlugin(Sofa.Component.SceneUtility); } void testGetNodeObjects() diff --git a/Sofa/framework/Simulation/Core/src/sofa/simulation/MechanicalOperations.h b/Sofa/framework/Simulation/Core/src/sofa/simulation/MechanicalOperations.h index 0a52f314f56..0bf43392655 100644 --- a/Sofa/framework/Simulation/Core/src/sofa/simulation/MechanicalOperations.h +++ b/Sofa/framework/Simulation/Core/src/sofa/simulation/MechanicalOperations.h @@ -156,7 +156,7 @@ class SOFA_SIMULATION_CORE_API MechanicalOperations void addMBKdx(core::MultiVecDerivId df, SReal m, SReal b, SReal k, bool clear = true, bool accumulate = true); SOFA_ATTRIBUTE_DEPRECATED_MECHANICALOPERATIONS_ADDMBKV() void addMBKv(core::MultiVecDerivId df, SReal m, SReal b, SReal k, bool clear = true, bool accumulate = true); - SOFA_ATTRIBUTE_DEPRECATED_MECHANICALOPERATIONS_SETSYSTEMMBKMATRIX() + SOFA_ATTRIBUTE_DEPRECATED_MECHANICALOPERATIONS_SETSYSTEMMBKMATRIX_OTHER() void setSystemMBKMatrix(SReal mFact, SReal bFact, SReal kFact, core::behavior::LinearSolver* linearSolver); protected: diff --git a/Sofa/framework/Simulation/Core/src/sofa/simulation/Node.cpp b/Sofa/framework/Simulation/Core/src/sofa/simulation/Node.cpp index f3c4f3d34ec..f4f2ce91e80 100644 --- a/Sofa/framework/Simulation/Core/src/sofa/simulation/Node.cpp +++ b/Sofa/framework/Simulation/Core/src/sofa/simulation/Node.cpp @@ -100,6 +100,7 @@ Node::Node(const std::string& name) , animationManager(initLink("animationLoop","The AnimationLoop attached to this node (only valid for root node)")) , visualLoop(initLink("visualLoop", "The VisualLoop attached to this node (only valid for root node)")) + , visualStyle(initLink("visualStyle", "The VisualStyle(s) attached to this node")) , topology(initLink("topology", "The Topology attached to this node")) , meshTopology(initLink("meshTopology", "The MeshTopology / TopologyContainer attached to this node")) , state(initLink("state", "The State attached to this node (storing vectors such as position, velocity)")) @@ -930,6 +931,7 @@ void Node::printComponents() using core::objectmodel::ContextObject; using core::collision::Pipeline; using core::BaseState; + using core::visual::BaseVisualStyle; std::stringstream sstream; @@ -987,6 +989,9 @@ void Node::printComponents() sstream << "\n" << "VisualModel: "; for (NodeSequence::iterator i = visualModel.begin(), iend = visualModel.end(); i != iend; ++i) sstream << (*i)->getName() << " "; + sstream << "\n" << "BaseVisualStyle: "; + for (NodeSingle::iterator i = visualStyle.begin(), iend = visualStyle.end(); i != iend; ++i) + sstream << (*i)->getName() << " "; sstream << "\n" << "CollisionModel: "; for (NodeSequence::iterator i = collisionModel.begin(), iend = collisionModel.end(); i != iend; ++i) sstream << (*i)->getName() << " "; @@ -1045,6 +1050,7 @@ NODE_DEFINE_SEQUENCE_ACCESSOR( sofa::core::objectmodel::ContextObject, ContextOb NODE_DEFINE_SEQUENCE_ACCESSOR( sofa::core::objectmodel::ConfigurationSetting, ConfigurationSetting, configurationSetting ) NODE_DEFINE_SEQUENCE_ACCESSOR( sofa::core::visual::Shader, Shader, shaders ) NODE_DEFINE_SEQUENCE_ACCESSOR( sofa::core::visual::VisualModel, VisualModel, visualModel ) +NODE_DEFINE_SEQUENCE_ACCESSOR( sofa::core::visual::BaseVisualStyle, VisualStyle, visualStyle ) NODE_DEFINE_SEQUENCE_ACCESSOR( sofa::core::visual::VisualManager, VisualManager, visualManager ) NODE_DEFINE_SEQUENCE_ACCESSOR( sofa::core::CollisionModel, CollisionModel, collisionModel ) NODE_DEFINE_SEQUENCE_ACCESSOR( sofa::core::collision::Pipeline, CollisionPipeline, collisionPipeline ) @@ -1071,6 +1077,7 @@ template class NodeSequence; template class NodeSingle; template class NodeSingle; +template class NodeSingle; template class NodeSingle; template class NodeSingle; template class NodeSingle; diff --git a/Sofa/framework/Simulation/Core/src/sofa/simulation/Node.h b/Sofa/framework/Simulation/Core/src/sofa/simulation/Node.h index 0f6d4aa7d54..2318c243d9f 100644 --- a/Sofa/framework/Simulation/Core/src/sofa/simulation/Node.h +++ b/Sofa/framework/Simulation/Core/src/sofa/simulation/Node.h @@ -127,6 +127,7 @@ extern template class NodeSequence; extern template class NodeSingle; extern template class NodeSingle; +extern template class NodeSingle; extern template class NodeSingle; extern template class NodeSingle; extern template class NodeSingle; @@ -255,6 +256,7 @@ class SOFA_SIMULATION_CORE_API Node : public sofa::core::objectmodel::BaseNode, NodeSingle animationManager; NodeSingle visualLoop; + NodeSingle visualStyle; NodeSingle topology; NodeSingle meshTopology; NodeSingle state; @@ -599,6 +601,7 @@ class SOFA_SIMULATION_CORE_API Node : public sofa::core::objectmodel::BaseNode, NODE_DECLARE_SEQUENCE_ACCESSOR( sofa::core::objectmodel::ConfigurationSetting, ConfigurationSetting, configurationSetting ) NODE_DECLARE_SEQUENCE_ACCESSOR( sofa::core::visual::Shader, Shader, shaders ) NODE_DECLARE_SEQUENCE_ACCESSOR( sofa::core::visual::VisualModel, VisualModel, visualModel ) + NODE_DECLARE_SEQUENCE_ACCESSOR( sofa::core::visual::BaseVisualStyle, VisualStyle, visualStyle ) NODE_DECLARE_SEQUENCE_ACCESSOR( sofa::core::visual::VisualManager, VisualManager, visualManager ) NODE_DECLARE_SEQUENCE_ACCESSOR( sofa::core::CollisionModel, CollisionModel, collisionModel ) NODE_DECLARE_SEQUENCE_ACCESSOR( sofa::core::collision::Pipeline, CollisionPipeline, collisionPipeline ) diff --git a/Sofa/framework/Simulation/Core/src/sofa/simulation/RequiredPlugin.cpp b/Sofa/framework/Simulation/Core/src/sofa/simulation/RequiredPlugin.cpp index 088e72f3251..32e49c43ebe 100644 --- a/Sofa/framework/Simulation/Core/src/sofa/simulation/RequiredPlugin.cpp +++ b/Sofa/framework/Simulation/Core/src/sofa/simulation/RequiredPlugin.cpp @@ -136,17 +136,16 @@ bool RequiredPlugin::loadPlugin() objectFactory->registerObjectsFromPlugin(name); // fail-safe to check if potential components have been registered (implicitly or explicitly) - // SOFA_ATTRIBUTE_DEPRECATED__REGISTEROBJECT() std::vector entries; objectFactory->getEntriesFromTarget(entries, name); if (entries.empty()) { -// msg_warning() << "No component has been registered from " << name << ".\n" -// << "It could be because: \n" -// << " - the entrypoint registerObjects() has not been implemented;\n" -// << " - (deprecated) no sofa::core::RegisterObject() has been called;\n" -// << " - your plugin does not add any component (i.e BaseObject) into the factory. In that case, RequiredPlugin is not useful for this kind of plugin."; + msg_warning() << "No component has been registered from " << name << ".\n" + << "It could be because: \n" + << " - the entrypoint registerObjects() has not been implemented;\n" + << " - (deprecated since v24.12) no sofa::core::RegisterObject() has been called;\n" + << " - your plugin does not add any component (i.e BaseObject) into the factory. In that case, RequiredPlugin is not useful for this kind of plugin."; } if (d_stopAfterFirstSuffixFound.getValue()) break; diff --git a/Sofa/framework/Simulation/Core/src/sofa/simulation/Simulation.cpp b/Sofa/framework/Simulation/Core/src/sofa/simulation/Simulation.cpp index 337ac2008ce..79579eae660 100644 --- a/Sofa/framework/Simulation/Core/src/sofa/simulation/Simulation.cpp +++ b/Sofa/framework/Simulation/Core/src/sofa/simulation/Simulation.cpp @@ -230,7 +230,8 @@ void animate(Node* root, SReal dt) void updateVisual(Node* root) { SCOPED_TIMER("Simulation::updateVisual"); - + + sofa::core::visual::VisualParams* vparams = sofa::core::visual::visualparams::defaultInstance(); if (sofa::core::visual::VisualLoop* vloop = root->getVisualLoop()) diff --git a/Sofa/framework/Simulation/Core/src/sofa/simulation/VisualVisitor.cpp b/Sofa/framework/Simulation/Core/src/sofa/simulation/VisualVisitor.cpp index cde01030ab4..3c048b2568f 100644 --- a/Sofa/framework/Simulation/Core/src/sofa/simulation/VisualVisitor.cpp +++ b/Sofa/framework/Simulation/Core/src/sofa/simulation/VisualVisitor.cpp @@ -46,14 +46,34 @@ Visitor::Result VisualVisitor::processNodeTopDown(simulation::Node* node) } -Visitor::Result VisualDrawVisitor::processNodeTopDown(simulation::Node* node) +void VisualVisitor::fwdProcessVisualStyle(simulation::Node* node, core::visual::BaseVisualStyle* vm) { + SOFA_UNUSED(node); + vm-> updateVisualFlags(vparams); +} + + +void VisualVisitor::bwdProcessVisualStyle(simulation::Node* node, core::visual::BaseVisualStyle* vm) +{ + SOFA_UNUSED(node); + vm-> applyBackupFlags(vparams); +} + +Visitor::Result VisualDrawVisitor::processNodeTopDown(simulation::Node* node) +{ // NB: hasShader is only used when there are visual models and getShader does a graph search when there is no shader, // which will most probably be the case when there are no visual models, so we skip the search unless we have visual models. hasShader = !node->visualModel.empty() && (node->getShader()!=nullptr); + if(node->visualStyle.get()) + { + fwdProcessVisualStyle(node,node->visualStyle.get()); + } + + for_each(this, node, node->visualModel, &VisualDrawVisitor::fwdVisualModel); + this->VisualVisitor::processNodeTopDown(node); return RESULT_CONTINUE; @@ -65,6 +85,12 @@ void VisualDrawVisitor::processNodeBottomUp(simulation::Node* node) if (!vparams->displayFlags().getShowVisualModels()) return; + if(node->visualStyle.get()) + { + bwdProcessVisualStyle(node,node->visualStyle.get()); + } + + for_each(this, node, node->visualModel, &VisualDrawVisitor::bwdVisualModel); } @@ -149,11 +175,27 @@ void VisualDrawVisitor::processVisualModel(simulation::Node* node, core::visual: Visitor::Result VisualUpdateVisitor::processNodeTopDown(simulation::Node* node) { - for_each(this, node, node->visualModel, &VisualUpdateVisitor::processVisualModel); + //Necessary check for first draw + if(node->visualStyle.get()) + { + fwdProcessVisualStyle(node,node->visualStyle.get()); + } + + for_each(this, node, node->visualModel, &VisualUpdateVisitor::processVisualModel); return RESULT_CONTINUE; } +void VisualUpdateVisitor::processNodeBottomUp(simulation::Node* node) +{ + //Necessary check for first draw + if(node->visualStyle.get()) + { + bwdProcessVisualStyle(node,node->visualStyle.get()); + } +} + + void VisualUpdateVisitor::processVisualModel(simulation::Node*, core::visual::VisualModel* vm) { helper::ScopedAdvancedTimer timer("VisualUpdateVisitor process: " + vm->getName()); diff --git a/Sofa/framework/Simulation/Core/src/sofa/simulation/VisualVisitor.h b/Sofa/framework/Simulation/Core/src/sofa/simulation/VisualVisitor.h index 44ca10602b6..f44a98cef82 100644 --- a/Sofa/framework/Simulation/Core/src/sofa/simulation/VisualVisitor.h +++ b/Sofa/framework/Simulation/Core/src/sofa/simulation/VisualVisitor.h @@ -24,6 +24,7 @@ #include #include +#include namespace sofa::simulation @@ -38,6 +39,8 @@ class SOFA_SIMULATION_CORE_API VisualVisitor : public Visitor {} virtual void processVisualModel(simulation::Node* node, core::visual::VisualModel* vm) = 0; + virtual void fwdProcessVisualStyle(simulation::Node* node, core::visual::BaseVisualStyle* vm); + virtual void bwdProcessVisualStyle(simulation::Node* node, core::visual::BaseVisualStyle* vm); virtual void processObject(simulation::Node* /*node*/, core::objectmodel::BaseObject* /*o*/) {} Result processNodeTopDown(simulation::Node* node) override; @@ -54,14 +57,14 @@ class SOFA_SIMULATION_CORE_API VisualVisitor : public Visitor core::visual::VisualParams* vparams; }; + class SOFA_SIMULATION_CORE_API VisualDrawVisitor : public VisualVisitor { public: bool hasShader; VisualDrawVisitor(core::visual::VisualParams* params) - : VisualVisitor(params) - { - } + : VisualVisitor(params) + {}; Result processNodeTopDown(simulation::Node* node) override; void processNodeBottomUp(simulation::Node* node) override; virtual void fwdVisualModel(simulation::Node* node, core::visual::VisualModel* vm); @@ -83,11 +86,10 @@ class SOFA_SIMULATION_CORE_API VisualUpdateVisitor : public VisualVisitor virtual void processVisualModel(simulation::Node*, core::visual::VisualModel* vm) override; Result processNodeTopDown(simulation::Node* node) override; + void processNodeBottomUp(simulation::Node* node) override; const char* getClassName() const override { return "VisualUpdateVisitor"; } -protected: - core::visual::VisualParams* m_vparams; }; class SOFA_SIMULATION_CORE_API VisualInitVisitor : public VisualVisitor diff --git a/Sofa/framework/Simulation/Core/src/sofa/simulation/config.h.in b/Sofa/framework/Simulation/Core/src/sofa/simulation/config.h.in index 0497c54b26d..53ed3e67af5 100644 --- a/Sofa/framework/Simulation/Core/src/sofa/simulation/config.h.in +++ b/Sofa/framework/Simulation/Core/src/sofa/simulation/config.h.in @@ -296,9 +296,9 @@ SOFA_ATTRIBUTE_DISABLED("v23.12", "v24.06", "rootdata/nodedata feature was never #endif // SOFA_BUILD_SOFA_SIMULATION_CORE #ifdef SOFA_BUILD_SOFA_SIMULATION_CORE -#define SOFA_ATTRIBUTE_DEPRECATED_MECHANICALOPERATIONS_SETSYSTEMMBKMATRIX() +#define SOFA_ATTRIBUTE_DEPRECATED_MECHANICALOPERATIONS_SETSYSTEMMBKMATRIX_OTHER() #else -#define SOFA_ATTRIBUTE_DEPRECATED_MECHANICALOPERATIONS_SETSYSTEMMBKMATRIX() \ +#define SOFA_ATTRIBUTE_DEPRECATED_MECHANICALOPERATIONS_SETSYSTEMMBKMATRIX_OTHER() \ SOFA_ATTRIBUTE_DEPRECATED( \ "v24.12", "v25.06", "Use the other setSystemMBKMatrix overload instead.") #endif // SOFA_BUILD_SOFA_SIMULATION_CORE diff --git a/Sofa/framework/Simulation/Core/src/sofa/simulation/mechanicalvisitor/MechanicalPropagateOnlyPositionAndVelocityVisitor.h b/Sofa/framework/Simulation/Core/src/sofa/simulation/mechanicalvisitor/MechanicalPropagateOnlyPositionAndVelocityVisitor.h index 96e8060eaf6..a037c9d18b7 100644 --- a/Sofa/framework/Simulation/Core/src/sofa/simulation/mechanicalvisitor/MechanicalPropagateOnlyPositionAndVelocityVisitor.h +++ b/Sofa/framework/Simulation/Core/src/sofa/simulation/mechanicalvisitor/MechanicalPropagateOnlyPositionAndVelocityVisitor.h @@ -45,7 +45,7 @@ class SOFA_SIMULATION_CORE_API MechanicalPropagateOnlyPositionAndVelocityVisitor sofa::core::MultiVecDerivId v; MechanicalPropagateOnlyPositionAndVelocityVisitor(const sofa::core::MechanicalParams* mparams, SReal time=0, - sofa::core::MultiVecCoordId x = sofa::core::VecId::position(), sofa::core::MultiVecDerivId v = sofa::core::VecId::velocity()); + sofa::core::MultiVecCoordId x = sofa::core::vec_id::write_access::position, sofa::core::MultiVecDerivId v = sofa::core::vec_id::write_access::velocity); Result fwdMechanicalState(simulation::Node* /*node*/,sofa::core::behavior::BaseMechanicalState* mm) override; Result fwdMechanicalMapping(simulation::Node* /*node*/, sofa::core::BaseMapping* map) override; diff --git a/Sofa/framework/Simulation/Core/src/sofa/simulation/mechanicalvisitor/MechanicalPropagateOnlyVelocityVisitor.h b/Sofa/framework/Simulation/Core/src/sofa/simulation/mechanicalvisitor/MechanicalPropagateOnlyVelocityVisitor.h index 330a457fa48..dbdcf3d6d08 100644 --- a/Sofa/framework/Simulation/Core/src/sofa/simulation/mechanicalvisitor/MechanicalPropagateOnlyVelocityVisitor.h +++ b/Sofa/framework/Simulation/Core/src/sofa/simulation/mechanicalvisitor/MechanicalPropagateOnlyVelocityVisitor.h @@ -43,7 +43,7 @@ class SOFA_SIMULATION_CORE_API MechanicalPropagateOnlyVelocityVisitor : public M sofa::core::MultiVecDerivId v; MechanicalPropagateOnlyVelocityVisitor(const sofa::core::MechanicalParams* mparams, SReal time=0, - sofa::core::MultiVecDerivId v = sofa::core::VecId::velocity()); + sofa::core::MultiVecDerivId v = sofa::core::vec_id::write_access::velocity); Result fwdMechanicalState(simulation::Node* /*node*/,sofa::core::behavior::BaseMechanicalState* mm) override; Result fwdMechanicalMapping(simulation::Node* /*node*/, sofa::core::BaseMapping* map) override; diff --git a/Sofa/framework/Simulation/Core/test/RequiredPlugin_test.cpp b/Sofa/framework/Simulation/Core/test/RequiredPlugin_test.cpp index c9349748989..1013581b97a 100644 --- a/Sofa/framework/Simulation/Core/test/RequiredPlugin_test.cpp +++ b/Sofa/framework/Simulation/Core/test/RequiredPlugin_test.cpp @@ -85,7 +85,7 @@ struct RequiredPlugin_test : public BaseSimulationTest void testLoadPluginB() { - EXPECT_MSG_EMIT(Warning); // // TestPluginB does not register any component + EXPECT_MSG_EMIT(Warning); // TestPluginB does not register any component std::stringstream scene; scene << "" @@ -101,7 +101,7 @@ struct RequiredPlugin_test : public BaseSimulationTest void testLoadPluginC() { - EXPECT_MSG_NOEMIT(Warning); // // TestPluginC registers its component explicitly + EXPECT_MSG_NOEMIT(Warning); // TestPluginC registers its component explicitly std::stringstream scene; scene << "" @@ -118,8 +118,8 @@ struct RequiredPlugin_test : public BaseSimulationTest TEST_F(RequiredPlugin_test, testNotExistingPlugin ) { testNotExistingPlugin(); } TEST_F(RequiredPlugin_test, testNoParameter ) { testNoParameter(); } -TEST_F(RequiredPlugin_test, DISABLED_testLoadPluginA) { testLoadPluginA(); } // disabled because testLoadPluginA() should throw a warning (but this warning is commented for the moment) -TEST_F(RequiredPlugin_test, DISABLED_testLoadPluginB) { testLoadPluginB(); }// disabled because testLoadPluginB() should throw a warning (but this warning is commented for the moment) +TEST_F(RequiredPlugin_test, testLoadPluginA) { testLoadPluginA(); } +TEST_F(RequiredPlugin_test, testLoadPluginB) { testLoadPluginB(); } TEST_F(RequiredPlugin_test, testLoadPluginC) { testLoadPluginC(); } } diff --git a/Sofa/framework/Simulation/Graph/test/MutationListener_test.cpp b/Sofa/framework/Simulation/Graph/test/MutationListener_test.cpp index 1ffcafa8813..c2d20e7bc9c 100644 --- a/Sofa/framework/Simulation/Graph/test/MutationListener_test.cpp +++ b/Sofa/framework/Simulation/Graph/test/MutationListener_test.cpp @@ -411,14 +411,14 @@ struct MutationListener_test : public BaseTest listener.log); } - void SetUp() override + void doSetUp() override { sofa::simulation::Simulation* simu = sofa::simulation::getSimulation(); root = simu->createNewGraph("root"); root->addListener(&listener); } - void TearDown() override + void doTearDown() override { } }; diff --git a/Sofa/framework/Simulation/simutest/parallel_scenes_test.cpp b/Sofa/framework/Simulation/simutest/parallel_scenes_test.cpp index 8ed14089499..5bb847fea9e 100644 --- a/Sofa/framework/Simulation/simutest/parallel_scenes_test.cpp +++ b/Sofa/framework/Simulation/simutest/parallel_scenes_test.cpp @@ -29,9 +29,6 @@ using sofa::simulation::Node ; #include using sofa::component::sceneutility::InfoComponent; -#include -using sofa::helper::system::PluginManager ; - #include using sofa::simulation::SceneLoaderXML ; @@ -47,10 +44,36 @@ class ParallelScenesTest : public virtual sofa::testing::BaseTest { } + void doSetUp() override + { + EXPECT_MSG_NOEMIT(Error, Warning); + + sofa::simpleapi::importPlugin(Sofa.Component.AnimationLoop); + sofa::simpleapi::importPlugin(Sofa.Component.Collision.Detection.Algorithm); + sofa::simpleapi::importPlugin(Sofa.Component.Collision.Detection.Intersection); + sofa::simpleapi::importPlugin(Sofa.Component.Collision.Geometry); + sofa::simpleapi::importPlugin(Sofa.Component.Collision.Response.Contact); + sofa::simpleapi::importPlugin(Sofa.Component.Constraint.Lagrangian.Correction); + sofa::simpleapi::importPlugin(Sofa.Component.Constraint.Lagrangian.Solver); + sofa::simpleapi::importPlugin(Sofa.Component.Constraint.Projective); + sofa::simpleapi::importPlugin(Sofa.Component.IO.Mesh); + sofa::simpleapi::importPlugin(Sofa.Component.LinearSolver.Iterative); + sofa::simpleapi::importPlugin(Sofa.Component.Mapping.Linear); + sofa::simpleapi::importPlugin(Sofa.Component.Mass); + sofa::simpleapi::importPlugin(Sofa.Component.ODESolver.Backward); + sofa::simpleapi::importPlugin(Sofa.Component.SolidMechanics.FEM.Elastic); + sofa::simpleapi::importPlugin(Sofa.Component.StateContainer); + sofa::simpleapi::importPlugin(Sofa.Component.Topology.Container.Constant); + sofa::simpleapi::importPlugin(Sofa.Component.Topology.Container.Dynamic); + sofa::simpleapi::importPlugin(Sofa.Component.Topology.Container.Grid); + sofa::simpleapi::importPlugin(Sofa.Component.Visual); + sofa::simpleapi::importPlugin(Sofa.GL.Component.Rendering3D); + sofa::simpleapi::importPlugin(Sofa.Component.LinearSystem); + } + void executeInParallel(const char* sceneStr, const std::size_t nbScenes, const std::size_t nbSteps) { - EXPECT_MSG_NOEMIT(Error); - EXPECT_MSG_NOEMIT(Warning); + EXPECT_MSG_NOEMIT(Error, Warning); std::vector groots; groots.resize(nbScenes); @@ -104,21 +127,6 @@ class ParallelScenesTest : public virtual sofa::testing::BaseTest const std::string sceneStr = R"( - - - - - - - - - - - - - - - @@ -160,29 +168,6 @@ class ParallelScenesTest : public virtual sofa::testing::BaseTest const std::string sceneStr = R"( - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Sofa/framework/Testing/CMakeLists.txt b/Sofa/framework/Testing/CMakeLists.txt index a4152a1925c..22b0a88b2ea 100644 --- a/Sofa/framework/Testing/CMakeLists.txt +++ b/Sofa/framework/Testing/CMakeLists.txt @@ -65,6 +65,7 @@ set(HEADER_FILES ${SOFATESTINGSRC_ROOT}/BaseTest.h ${SOFATESTINGSRC_ROOT}/LinearCongruentialRandomGenerator.h ${SOFATESTINGSRC_ROOT}/NumericTest.h + ${SOFATESTINGSRC_ROOT}/ScopedPlugin.h ${SOFATESTINGSRC_ROOT}/TestMessageHandler.h ${SOFATESTINGSRC_ROOT}/BaseSimulationTest.h ) @@ -74,6 +75,7 @@ set(SOURCE_FILES ${SOFATESTINGSRC_ROOT}/BaseTest.cpp ${SOFATESTINGSRC_ROOT}/LinearCongruentialRandomGenerator.cpp ${SOFATESTINGSRC_ROOT}/NumericTest.cpp + ${SOFATESTINGSRC_ROOT}/ScopedPlugin.cpp ${SOFATESTINGSRC_ROOT}/TestMessageHandler.cpp ${SOFATESTINGSRC_ROOT}/BaseSimulationTest.cpp ) diff --git a/Sofa/framework/Testing/src/sofa/testing/BaseTest.cpp b/Sofa/framework/Testing/src/sofa/testing/BaseTest.cpp index 618a974466a..f4c6de7a263 100644 --- a/Sofa/framework/Testing/src/sofa/testing/BaseTest.cpp +++ b/Sofa/framework/Testing/src/sofa/testing/BaseTest.cpp @@ -93,14 +93,21 @@ BaseTest::BaseTest() : BaseTest::~BaseTest() {} +void BaseTest::loadPlugins( + const std::initializer_list& pluginNames) +{ + m_loadedPlugins.emplace_back(pluginNames.begin(), pluginNames.end()); +} + void BaseTest::SetUp() { - onSetUp(); + doSetUp(); } void BaseTest::TearDown() { - onTearDown(); + m_loadedPlugins.clear(); + doTearDown(); } diff --git a/Sofa/framework/Testing/src/sofa/testing/BaseTest.h b/Sofa/framework/Testing/src/sofa/testing/BaseTest.h index 1ec7c55dd14..303421e0ba3 100644 --- a/Sofa/framework/Testing/src/sofa/testing/BaseTest.h +++ b/Sofa/framework/Testing/src/sofa/testing/BaseTest.h @@ -21,10 +21,13 @@ ******************************************************************************/ #pragma once +#include #include +#include #include #include +#include namespace sofa::testing { @@ -45,15 +48,25 @@ class SOFA_TESTING_API BaseTest : public ::testing::Test BaseTest() ; ~BaseTest() override; + virtual void doSetUp() { onSetUp(); } + virtual void doTearDown() { onTearDown(); } + + SOFA_ATTRIBUTE_DEPRECATED__TESTING_ONSETUP() virtual void onSetUp() {} + + SOFA_ATTRIBUTE_DEPRECATED__TESTING_ONTEARDOWN() virtual void onTearDown() {} /// Seed value static int seed; + void loadPlugins(const std::initializer_list& pluginNames); + private: - void SetUp() override ; - void TearDown() override ; + void SetUp() final ; + void TearDown() final ; + + std::deque m_loadedPlugins; }; } // namespace sofa::testing diff --git a/Sofa/framework/Testing/src/sofa/testing/ScopedPlugin.cpp b/Sofa/framework/Testing/src/sofa/testing/ScopedPlugin.cpp new file mode 100644 index 00000000000..e0eee3ed616 --- /dev/null +++ b/Sofa/framework/Testing/src/sofa/testing/ScopedPlugin.cpp @@ -0,0 +1,60 @@ +/****************************************************************************** +* SOFA, Simulation Open-Framework Architecture * +* (c) 2006 INRIA, USTL, UJF, CNRS, MGH * +* * +* This program is free software; you can redistribute it and/or modify it * +* under the terms of the GNU Lesser General Public License as published by * +* the Free Software Foundation; either version 2.1 of the License, or (at * +* your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, but WITHOUT * +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * +* for more details. * +* * +* You should have received a copy of the GNU Lesser General Public License * +* along with this program. If not, see . * +******************************************************************************* +* Authors: The SOFA Team and external contributors (see Authors.txt) * +* * +* Contact information: contact@sofa-framework.org * +******************************************************************************/ +#include +#include + +namespace sofa::testing +{ + +ScopedPlugin::ScopedPlugin(const std::string& pluginName, + helper::system::PluginManager* pluginManager) +: m_pluginManager(pluginManager) +{ + addPlugin(pluginName); +} + +ScopedPlugin::~ScopedPlugin() +{ + if (m_pluginManager) + { + for (const auto& pluginName : m_loadedPlugins) + { + const auto [path, isLoaded] = m_pluginManager->isPluginLoaded(pluginName); + if (isLoaded) + { + m_pluginManager->unloadPlugin(path); + } + } + } +} + +void ScopedPlugin::addPlugin(const std::string& pluginName) +{ + const auto status = m_pluginManager->loadPlugin(pluginName); + if(status == helper::system::PluginManager::PluginLoadStatus::SUCCESS) + { + m_loadedPlugins.insert(pluginName); + sofa::core::ObjectFactory::getInstance()->registerObjectsFromPlugin(pluginName); + } +} + +} diff --git a/Sofa/framework/Testing/src/sofa/testing/ScopedPlugin.h b/Sofa/framework/Testing/src/sofa/testing/ScopedPlugin.h new file mode 100644 index 00000000000..4d1e24afe0e --- /dev/null +++ b/Sofa/framework/Testing/src/sofa/testing/ScopedPlugin.h @@ -0,0 +1,68 @@ +/****************************************************************************** +* SOFA, Simulation Open-Framework Architecture * +* (c) 2006 INRIA, USTL, UJF, CNRS, MGH * +* * +* This program is free software; you can redistribute it and/or modify it * +* under the terms of the GNU Lesser General Public License as published by * +* the Free Software Foundation; either version 2.1 of the License, or (at * +* your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, but WITHOUT * +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * +* for more details. * +* * +* You should have received a copy of the GNU Lesser General Public License * +* along with this program. If not, see . * +******************************************************************************* +* Authors: The SOFA Team and external contributors (see Authors.txt) * +* * +* Contact information: contact@sofa-framework.org * +******************************************************************************/ +#pragma once +#include +#include + +namespace sofa::testing +{ + +struct SOFA_TESTING_API ScopedPlugin +{ + ScopedPlugin() = delete; + ScopedPlugin(const ScopedPlugin&) = delete; + void operator=(const ScopedPlugin&) = delete; + + explicit ScopedPlugin( + const std::string& pluginName, + helper::system::PluginManager* pluginManager = &helper::system::PluginManager::getInstance()); + + template + ScopedPlugin( + InputIt first, InputIt last, + helper::system::PluginManager* pluginManager = &helper::system::PluginManager::getInstance()) + : m_pluginManager(pluginManager) + { + while (first != last) + { + addPlugin(*first++); + } + } + + ~ScopedPlugin(); + +private: + helper::system::PluginManager* m_pluginManager { nullptr }; + + std::set m_loadedPlugins; + + void addPlugin(const std::string& pluginName); +}; + + +inline std::unique_ptr makeScopedPlugin(const std::initializer_list& pluginNames) +{ + return std::make_unique(pluginNames.begin(), pluginNames.end()); +} + + +} diff --git a/Sofa/framework/Testing/src/sofa/testing/config.h.in b/Sofa/framework/Testing/src/sofa/testing/config.h.in index 35221eb58fe..04dedf7c8fb 100644 --- a/Sofa/framework/Testing/src/sofa/testing/config.h.in +++ b/Sofa/framework/Testing/src/sofa/testing/config.h.in @@ -43,3 +43,20 @@ constexpr char SOFA_TESTING_RESOURCES_DIR[] = "@SOFA_TESTING_RESOURCES_DIR@"; SOFA_ATTRIBUTE_DEPRECATED( \ "v24.06", "v24.12", "Use sofa::simpleapi::importPlugin() instead.") #endif // SOFA_BUILD_SOFA_TESTING + + +#ifdef SOFA_BUILD_SOFA_TESTING +#define SOFA_ATTRIBUTE_DEPRECATED__TESTING_ONSETUP() +#else +#define SOFA_ATTRIBUTE_DEPRECATED__TESTING_ONSETUP() \ + SOFA_ATTRIBUTE_DEPRECATED( \ + "v25.06", "v25.12", "Use doSetUp instead.") +#endif // SOFA_BUILD_SOFA_TESTING + +#ifdef SOFA_BUILD_SOFA_TESTING +#define SOFA_ATTRIBUTE_DEPRECATED__TESTING_ONTEARDOWN() +#else +#define SOFA_ATTRIBUTE_DEPRECATED__TESTING_ONTEARDOWN() \ + SOFA_ATTRIBUTE_DEPRECATED( \ + "v25.06", "v25.12", "Use doTearDown instead.") +#endif // SOFA_BUILD_SOFA_TESTING diff --git a/Sofa/framework/Testing/test/CMakeLists.txt b/Sofa/framework/Testing/test/CMakeLists.txt index 7d24aab0b58..3b0abcc8063 100644 --- a/Sofa/framework/Testing/test/CMakeLists.txt +++ b/Sofa/framework/Testing/test/CMakeLists.txt @@ -3,7 +3,8 @@ cmake_minimum_required(VERSION 3.22) project(Sofa.Testing_test) set(SOURCE_FILES - TestMessageHandler_test.cpp + ScopedPlugin_test.cpp + TestMessageHandler_test.cpp ) add_executable(${PROJECT_NAME} ${SOURCE_FILES}) diff --git a/Sofa/framework/Testing/test/ScopedPlugin_test.cpp b/Sofa/framework/Testing/test/ScopedPlugin_test.cpp new file mode 100644 index 00000000000..3519649f2b9 --- /dev/null +++ b/Sofa/framework/Testing/test/ScopedPlugin_test.cpp @@ -0,0 +1,59 @@ +/****************************************************************************** +* SOFA, Simulation Open-Framework Architecture * +* (c) 2006 INRIA, USTL, UJF, CNRS, MGH * +* * +* This program is free software; you can redistribute it and/or modify it * +* under the terms of the GNU Lesser General Public License as published by * +* the Free Software Foundation; either version 2.1 of the License, or (at * +* your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, but WITHOUT * +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * +* for more details. * +* * +* You should have received a copy of the GNU Lesser General Public License * +* along with this program. If not, see . * +******************************************************************************* +* Authors: The SOFA Team and external contributors (see Authors.txt) * +* * +* Contact information: contact@sofa-framework.org * +******************************************************************************/ +#include +#include + +TEST(ScopedPlugin, test) +{ + static std::string pluginName = "Sofa.Component.AnimationLoop"; + auto& pluginManager = sofa::helper::system::PluginManager::getInstance(); + + //make sure that pluginName is not already loaded + { + const auto [path, isLoaded] = pluginManager.isPluginLoaded(pluginName); + if (isLoaded) + { + pluginManager.unloadPlugin(path); + } + } + + { + const auto [path, isLoaded] = pluginManager.isPluginLoaded(pluginName); + EXPECT_FALSE(isLoaded); + } + + { + const sofa::testing::ScopedPlugin plugin(pluginName); + + { + const auto [path, isLoaded] = pluginManager.isPluginLoaded(pluginName); + EXPECT_TRUE(isLoaded); + } + + //end of scope: plugin should be unloaded + } + + { + const auto [path, isLoaded] = pluginManager.isPluginLoaded(pluginName); + EXPECT_FALSE(isLoaded); + } +} diff --git a/Sofa/framework/Type/src/sofa/type/BoundingBox.cpp b/Sofa/framework/Type/src/sofa/type/BoundingBox.cpp index 08c9121191e..b2d5e391af3 100644 --- a/Sofa/framework/Type/src/sofa/type/BoundingBox.cpp +++ b/Sofa/framework/Type/src/sofa/type/BoundingBox.cpp @@ -36,56 +36,23 @@ BoundingBox::bbox_t make_neutralBBox() return std::make_pair(minBBox,maxBBox); } -BoundingBox::BoundingBox() - :bbox(make_neutralBBox()) -{ -} - -BoundingBox::BoundingBox(const bbox_t& bbox) - :bbox(bbox) -{ -} - -BoundingBox::BoundingBox(const sofa::type::Vec3& minBBox, const sofa::type::Vec3& maxBBox) - :bbox(std::make_pair(minBBox,maxBBox)) -{ -} - -BoundingBox::BoundingBox(SReal xmin, SReal xmax, SReal ymin, SReal ymax, SReal zmin, SReal zmax ) - :bbox(std::make_pair(sofa::type::Vec3((SReal)xmin, (SReal)ymin, (SReal)zmin),sofa::type::Vec3( (SReal)xmax, (SReal)ymax, (SReal)zmax))) -{ -} - - -BoundingBox::BoundingBox(const Vec6f& v ) - :bbox(std::make_pair(sofa::type::Vec3(v[0],v[2],v[4]),sofa::type::Vec3(v[1],v[3],v[5]))) -{ -} - -BoundingBox::BoundingBox(const Vec6d& v ) - :bbox(std::make_pair(sofa::type::Vec3((SReal)v[0],(SReal)v[2],(SReal)v[4]),sofa::type::Vec3((SReal)v[1],(SReal)v[3],(SReal)v[5]))) -{ -} - - -/*static*/ -BoundingBox BoundingBox::neutral_bbox() -{ - return BoundingBox(make_neutralBBox()); -} - void BoundingBox::invalidate() { this->bbox = make_neutralBBox(); } -bool BoundingBox::isNegligeable() const +bool BoundingBox::isNegligible() const { return minBBox().x() >= maxBBox().x() && minBBox().y() >= maxBBox().y() && minBBox().z() >= maxBBox().z(); } +bool BoundingBox::isNegligeable() const +{ + return isNegligible(); +} + bool BoundingBox::isValid() const { return minBBox().x() <= maxBBox().x() && @@ -112,6 +79,11 @@ BoundingBox::operator bbox_t() const return bbox; } +bool BoundingBox::operator==(const BoundingBox& other) const +{ + return this->bbox == other.bbox; +} + SReal* BoundingBox::minBBoxPtr() { return bbox.first.ptr(); diff --git a/Sofa/framework/Type/src/sofa/type/BoundingBox.h b/Sofa/framework/Type/src/sofa/type/BoundingBox.h index fd7a4bcdd85..d868b56fff4 100644 --- a/Sofa/framework/Type/src/sofa/type/BoundingBox.h +++ b/Sofa/framework/Type/src/sofa/type/BoundingBox.h @@ -35,41 +35,68 @@ class SOFA_TYPE_API BoundingBox public: typedef std::pair< sofa::type::Vec3, sofa::type::Vec3 > bbox_t; + using Real = sofa::type::Vec3::value_type; - BoundingBox(); - /// Define using the endpoints of the main diagonal - BoundingBox(const sofa::type::Vec3& minBBox, const sofa::type::Vec3& maxBBox); - BoundingBox(const bbox_t& bbox); - /// Define using xmin, xmax, ymin, ymax, zmin, zmax in this order - BoundingBox(SReal xmin, SReal xmax, SReal ymin, SReal ymax, SReal zmin, SReal zmax ); - /// Define using xmin, xmax, ymin, ymax, zmin, zmax in this order - BoundingBox(const Vec6f& bbox); - /// Define using xmin, xmax, ymin, ymax, zmin, zmax in this order - BoundingBox(const Vec6d& bbox); + constexpr BoundingBox() + : BoundingBox(neutral_bbox().bbox) + {} - static BoundingBox neutral_bbox(); + /// Define using the endpoints of the main diagonal + constexpr BoundingBox(const sofa::type::Vec3& minBBox, const sofa::type::Vec3& maxBBox) + : bbox({minBBox, maxBBox}) {} + + constexpr explicit BoundingBox(const bbox_t& bbox) + : bbox(bbox) + {} + + /// Define using xMin, xMax, yMin, yMax, zMin, zMax in this order + constexpr BoundingBox( + const Real xMin, const Real xMax, + const Real yMin, const Real yMax, + const Real zMin, const Real zMax ) + : BoundingBox({xMin, yMin, zMin}, {xMax, yMax, zMax}) + {} + + template + constexpr explicit BoundingBox(const Vec<6, Scalar>& bbox) + : BoundingBox(bbox[0], bbox[1], bbox[2], bbox[3], bbox[4], bbox[5]) + {} + + static constexpr BoundingBox neutral_bbox() + { + constexpr Real max_real = std::numeric_limits::max(); + constexpr Real min_real = std::numeric_limits::lowest(); + return BoundingBox{ + {max_real, max_real, max_real}, + {min_real, min_real, min_real} + }; + } operator bbox_t() const; + [[nodiscard]] bool operator==(const BoundingBox& other) const; + void invalidate(); - bool isValid() const; - bool isFlat() const; - bool isNegligeable() const; // !valid || flat - bool isNull() const; + [[nodiscard]] bool isValid() const; + [[nodiscard]] bool isFlat() const; + [[nodiscard]] bool isNegligible() const; // !valid || flat + SOFA_ATTRIBUTE_DISABLED__BOUNDINGBOX_TYPO() + [[nodiscard]] bool isNegligeable() const; + [[nodiscard]] bool isNull() const; SReal* minBBoxPtr(); SReal* maxBBoxPtr(); - const SReal* minBBoxPtr() const; - const SReal* maxBBoxPtr() const; - const sofa::type::Vec3& minBBox() const; - const sofa::type::Vec3& maxBBox() const; + [[nodiscard]] const SReal* minBBoxPtr() const; + [[nodiscard]] const SReal* maxBBoxPtr() const; + [[nodiscard]] const sofa::type::Vec3& minBBox() const; + [[nodiscard]] const sofa::type::Vec3& maxBBox() const; sofa::type::Vec3& minBBox(); sofa::type::Vec3& maxBBox(); - bool contains( const sofa::type::Vec3& point) const; - bool contains( const BoundingBox& other) const; + [[nodiscard]] bool contains( const sofa::type::Vec3& point) const; + [[nodiscard]] bool contains( const BoundingBox& other) const; - bool intersect( const BoundingBox& other) const; + [[nodiscard]] bool intersect( const BoundingBox& other) const; void intersection( const BoundingBox& other); void include( const sofa::type::Vec3& point); @@ -77,10 +104,10 @@ class SOFA_TYPE_API BoundingBox void inflate( SReal amount ); - BoundingBox getIntersection( const BoundingBox& other ) const; - BoundingBox getInclude( const sofa::type::Vec3& point ) const; - BoundingBox getInclude( const BoundingBox& other ) const; - BoundingBox getInflate( SReal amount ) const; + [[nodiscard]] BoundingBox getIntersection( const BoundingBox& other ) const; + [[nodiscard]] BoundingBox getInclude( const sofa::type::Vec3& point ) const; + [[nodiscard]] BoundingBox getInclude( const BoundingBox& other ) const; + [[nodiscard]] BoundingBox getInflate( SReal amount ) const; friend std::ostream& operator << ( std::ostream& out, const BoundingBox& bbox) { diff --git a/Sofa/framework/Type/src/sofa/type/MatSym.h b/Sofa/framework/Type/src/sofa/type/MatSym.h index 8a4140fdfb4..5de7389e6d1 100644 --- a/Sofa/framework/Type/src/sofa/type/MatSym.h +++ b/Sofa/framework/Type/src/sofa/type/MatSym.h @@ -137,7 +137,7 @@ class MatSym : public VecNoInit { for (sofa::Size j = 0; j < D; j++) { - for (int i = 0; i <= j; i++) + for (sofa::Size i = 0; i <= j; i++) { W(i, j) = (M(i, j) + M(j, i)) / 2; } diff --git a/Sofa/framework/Type/src/sofa/type/Quat.h b/Sofa/framework/Type/src/sofa/type/Quat.h index 739fa6e5f59..05b534d7e33 100644 --- a/Sofa/framework/Type/src/sofa/type/Quat.h +++ b/Sofa/framework/Type/src/sofa/type/Quat.h @@ -116,7 +116,7 @@ class Quat static Quat identity() { - return Quat(0,0,0,1); + return Quat(0, 0, 0, 1); } void set(Real x, Real y, Real z, Real w) @@ -147,7 +147,7 @@ class Quat void clear() { - set(0.0,0.0,0.0,1); + set(0, 0, 0, 1); } /// Convert the reference frame orientation into an orientation quaternion @@ -311,6 +311,30 @@ class Quat return _q[index]; } + template< std::size_t I > + [[nodiscard]] constexpr Real& get() & noexcept requires (I < 4) + { + return _q[I]; + } + + template< std::size_t I > + [[nodiscard]] constexpr const Real& get() const& noexcept requires (I < 4) + { + return _q[I]; + } + + template< std::size_t I > + [[nodiscard]] constexpr Real&& get() && noexcept requires (I < 4) + { + return std::move(_q[I]); + } + + template< std::size_t I > + [[nodiscard]] constexpr const Real&& get() const&& noexcept requires (I < 4) + { + return std::move(_q[I]); + } + auto inverse() const -> Quat; auto quatToRotationVector() const -> Vec3; @@ -462,3 +486,17 @@ extern template class SOFA_TYPE_API Quat; #endif } // namespace sofa::type + +namespace std +{ + +template +struct tuple_size<::sofa::type::Quat > : integral_constant {}; + +template +struct tuple_element > +{ + using type = typename::sofa::type::Quat::value_type; +}; + +} diff --git a/Sofa/framework/Type/src/sofa/type/RGBAColor.h b/Sofa/framework/Type/src/sofa/type/RGBAColor.h index 44fefc4eacc..0d4af4739a8 100644 --- a/Sofa/framework/Type/src/sofa/type/RGBAColor.h +++ b/Sofa/framework/Type/src/sofa/type/RGBAColor.h @@ -33,6 +33,8 @@ #include #include +#include + namespace sofa::type { @@ -45,8 +47,9 @@ namespace sofa::type class SOFA_TYPE_API RGBAColor { public: + using value_type = float; static constexpr sofa::Size NumberOfComponents = 4; - using ComponentArray = std::array; + using ComponentArray = std::array; constexpr RGBAColor() : m_components{ 1.f, 1.f, 1.f, 1.f } {} @@ -132,6 +135,30 @@ class SOFA_TYPE_API RGBAColor return m_components[i]; } + template< std::size_t I > + [[nodiscard]] constexpr float& get() & noexcept requires (I < 4) + { + return m_components[I]; + } + + template< std::size_t I > + [[nodiscard]] constexpr const float& get() const& noexcept requires (I < 4) + { + return m_components[I]; + } + + template< std::size_t I > + [[nodiscard]] constexpr float&& get() && noexcept requires (I < 4) + { + return std::move(m_components[I]); + } + + template< std::size_t I > + [[nodiscard]] constexpr const float&& get() const&& noexcept requires (I < 4) + { + return std::move(m_components[I]); + } + void set(float r, float g, float b, float a) ; bool operator==(const RGBAColor& b) const @@ -209,7 +236,6 @@ class SOFA_TYPE_API RGBAColor static constexpr sofa::Size static_size = NumberOfComponents; static constexpr sofa::Size size() { return static_size; } - using value_type = float; using size_type = sofa::Size; private: @@ -285,3 +311,18 @@ constexpr const RGBAColor& RGBAColor::gold() { return g_gold ; } } // namespace sofa::type + + +namespace std +{ + +template<> +struct tuple_size<::sofa::type::RGBAColor > : integral_constant {}; + +template +struct tuple_element +{ + using type = ::sofa::type::RGBAColor::value_type; +}; + +} diff --git a/Sofa/framework/Type/src/sofa/type/Vec.h b/Sofa/framework/Type/src/sofa/type/Vec.h index 48e38f038b2..7c0b5a7ff23 100644 --- a/Sofa/framework/Type/src/sofa/type/Vec.h +++ b/Sofa/framework/Type/src/sofa/type/Vec.h @@ -613,6 +613,30 @@ class Vec return elems[i]; } + template< std::size_t I > + [[nodiscard]] constexpr reference get() & noexcept requires( I < N ) + { + return elems[I]; + } + + template< std::size_t I > + [[nodiscard]] constexpr const_reference get() const& noexcept requires( I < N ) + { + return elems[I]; + } + + template< std::size_t I > + [[nodiscard]] constexpr ValueType&& get() && noexcept requires( I < N ) + { + return std::move(elems[I]); + } + + template< std::size_t I > + [[nodiscard]] constexpr const ValueType&& get() const&& noexcept requires( I < N ) + { + return std::move(elems[I]); + } + // direct access to data constexpr const ValueType* data() const noexcept { @@ -782,4 +806,13 @@ struct less< sofa::type::Vec > } }; +template +struct tuple_size<::sofa::type::Vec > : integral_constant {}; + +template +struct tuple_element > +{ + using type = T; +}; + } // namespace std diff --git a/Sofa/framework/Type/src/sofa/type/config.h.in b/Sofa/framework/Type/src/sofa/type/config.h.in index 3fc2d71b07b..2bb528f7e5f 100644 --- a/Sofa/framework/Type/src/sofa/type/config.h.in +++ b/Sofa/framework/Type/src/sofa/type/config.h.in @@ -41,3 +41,21 @@ "v23.12", "v24.06", \ "RGBAColor does not inherit anymore from sofa::type::fixed_array. Use respective functions accordingly.") #endif + +#ifdef SOFA_BUILD_SOFA_TYPE +#define SOFA_ATTRIBUTE_DISABLED__BOUNDINGBOX_TYPO() +#else +#define SOFA_ATTRIBUTE_DISABLED__BOUNDINGBOX_TYPO() \ + SOFA_ATTRIBUTE_DISABLED( \ + "v24.12", "v25.06", \ + "Use isNegligible instead.") +#endif + +#ifdef SOFA_BUILD_SOFA_TYPE +#define SOFA_ATTRIBUTE_DEPRECATED__IS_CONTAINER() +#else +#define SOFA_ATTRIBUTE_DEPRECATED__IS_CONTAINER() \ + SOFA_ATTRIBUTE_DISABLED( \ + "v25.06", "v25.12", \ + "Use std::ranges::ranges concept instead.") +#endif diff --git a/Sofa/framework/Type/src/sofa/type/fixed_array.h b/Sofa/framework/Type/src/sofa/type/fixed_array.h index ec1e711ca9d..edbffaa367d 100644 --- a/Sofa/framework/Type/src/sofa/type/fixed_array.h +++ b/Sofa/framework/Type/src/sofa/type/fixed_array.h @@ -83,18 +83,16 @@ class fixed_array constexpr fixed_array() {} /// Specific constructor for 1-element vectors. - template::type = 0> explicit constexpr fixed_array(value_type r1) noexcept + requires (N == 1) { elems[0] = r1; } - template && ...) >, - typename = std::enable_if_t< (sizeof...(ArgsT) == N && sizeof...(ArgsT) > 1) > - > + template constexpr fixed_array(ArgsT&&... r) noexcept - : elems{static_cast(std::forward< ArgsT >(r))...} + requires ((std::convertible_to && ...) && sizeof...(ArgsT) == N && sizeof...(ArgsT) > 1) + : elems{static_cast(std::forward(r))...} {} // iterator support diff --git a/Sofa/framework/Type/src/sofa/type/isRigidType.h b/Sofa/framework/Type/src/sofa/type/isRigidType.h index 41e17b5f9de..f43631703f9 100644 --- a/Sofa/framework/Type/src/sofa/type/isRigidType.h +++ b/Sofa/framework/Type/src/sofa/type/isRigidType.h @@ -1,31 +1,41 @@ -// -// Created by hugo on 28/11/23. -// - -#ifndef SOFA_ISRIGIDTYPE_H -#define SOFA_ISRIGIDTYPE_H +/****************************************************************************** +* SOFA, Simulation Open-Framework Architecture * +* (c) 2006 INRIA, USTL, UJF, CNRS, MGH * +* * +* This program is free software; you can redistribute it and/or modify it * +* under the terms of the GNU Lesser General Public License as published by * +* the Free Software Foundation; either version 2.1 of the License, or (at * +* your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, but WITHOUT * +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * +* for more details. * +* * +* You should have received a copy of the GNU Lesser General Public License * +* along with this program. If not, see . * +******************************************************************************* +* Authors: The SOFA Team and external contributors (see Authors.txt) * +* * +* Contact information: contact@sofa-framework.org * +******************************************************************************/ +#pragma once namespace sofa::type { - // Boiler-plate code to test if a type implements a method - // explanation https://stackoverflow.com/a/30848101 - - template - using void_t = void; - - // Primary template handles all types not supporting the operation. - template class, typename = void_t<>> - struct detect : std::false_type {}; - // Specialization recognizes/validates only types supporting the archetype. - template class Op> - struct detect>> : std::true_type {}; - - // Actual test if DataType::Coord implements getOrientation() (hence is a RigidType) - template - using isRigid_t = decltype(std::declval().getOrientation()); +/** + * A type T satisfies the isRigidType concept if: + * - T has a nested type named Coord. + * - An object of type T::Coord has a member function getOrientation that can be + * invoked without arguments. + * + * It allows to identify types such as StdRigidTypes and CudaRigidTypes at compile-time. + */ +template +concept isRigidType = requires +{ + std::declval().getOrientation(); +}; - template - using isRigidType = detect; } -#endif //SOFA_ISRIGIDTYPE_H diff --git a/Sofa/framework/Type/src/sofa/type/trait/Rebind.h b/Sofa/framework/Type/src/sofa/type/trait/Rebind.h index c462e08a1f4..994158d70b8 100644 --- a/Sofa/framework/Type/src/sofa/type/trait/Rebind.h +++ b/Sofa/framework/Type/src/sofa/type/trait/Rebind.h @@ -23,19 +23,18 @@ namespace sofa::type { - // primary template handles types that have no nested ::rebind_to member: - template< class T, class OtherType, class = void > - struct HasRebindTypedef : std::false_type { }; + template + concept CanTypeRebind = requires + { + typename T::template rebind_to; + }; - // specialization recognizes types that do have a nested ::rebind_to member: - template< class T, class OtherType > - struct HasRebindTypedef > > : std::true_type { }; /** * Depending on the type _T, has a public member typedef to. Otherwise, there is no member typedef (this is the * case of this implementation). */ - template + template struct Rebind {}; /** @@ -45,33 +44,20 @@ namespace sofa::type * \tparam _T Type that does have a nested ::rebind_to member */ template - struct Rebind<_T, _OtherType, std::enable_if_t::value > > + requires CanTypeRebind<_T, _OtherType> + struct Rebind<_T, _OtherType> { using to = typename _T::template rebind_to<_OtherType>; }; - template - inline constexpr auto deny = false; - - /** - * \brief Specialization for types that do NOT have a nested ::rebind_to member. In this implementation, Rebind has - * no public member typedef \ref to. If this implementation is chosen by the compiler (the number of template - * parameters is probably different from 1), a compilation error occurs. - * \tparam _T Type that does NOT have a nested ::rebind_to member - */ - template - struct Rebind<_T, _OtherType, std::enable_if_t::value > > - { - static_assert(deny<_T>, "_T must match _T"); - }; - /** * \brief Specialization for types that do NOT have a nested ::rebind_to member. In this implementation, Rebind has * a public member typedef \ref to. * \tparam _T Type that does NOT have a nested ::rebind_to member */ template class _T, class A, class _OtherType> - struct Rebind<_T, _OtherType, std::enable_if_t, _OtherType >::value > > + requires (!CanTypeRebind<_T, _OtherType>) + struct Rebind<_T, _OtherType> { using to = _T<_OtherType>; }; @@ -83,7 +69,7 @@ namespace sofa::type * 1) sofa::type::rebind_to< sofa::type::vector, float> is of type sofa::type::vector. In this example, * sofa::type::vector has a typedef rebind_to that will be used to deduce the type. * 2) sofa::type::rebind_to< sofa::type::Quat, double> is of type sofa::type::Quat. In this example, - * sofa::type::Quat does not have a typdef rebind_to. + * sofa::type::Quat does not have a typedef rebind_to. * 3) It makes no sense to use sofa::type::rebind on types having more than one template parameter, such as * sofa::type::fixed_array. A compilation error would occur. */ diff --git a/Sofa/framework/Type/src/sofa/type/trait/is_container.h b/Sofa/framework/Type/src/sofa/type/trait/is_container.h index 7ce8867ee55..52537fa767f 100644 --- a/Sofa/framework/Type/src/sofa/type/trait/is_container.h +++ b/Sofa/framework/Type/src/sofa/type/trait/is_container.h @@ -21,12 +21,17 @@ ******************************************************************************/ #pragma once #include +#include + +SOFA_HEADER_DEPRECATED_NOT_REPLACED("v25.06", "v25.12") + namespace sofa::type::trait { /// Detect if a type T has iterator/const iterator function. template +SOFA_ATTRIBUTE_DEPRECATED__IS_CONTAINER() struct is_container { typedef typename std::remove_const::type test_type; diff --git a/Sofa/framework/Type/src/sofa/type/trait/is_fixed_array.h b/Sofa/framework/Type/src/sofa/type/trait/is_fixed_array.h index 48a1e5166a1..f84787d514d 100644 --- a/Sofa/framework/Type/src/sofa/type/trait/is_fixed_array.h +++ b/Sofa/framework/Type/src/sofa/type/trait/is_fixed_array.h @@ -27,39 +27,17 @@ namespace sofa::type::trait /// Detect if a type T has iterator/const iterator function, operator[](size_t) and defines a static size template -struct is_fixed_array +concept is_fixed_array = requires(std::remove_cv_t t, const std::remove_cv_t ct) { - typedef typename std::remove_const::type test_type; + T::static_size; - template - static constexpr bool test( - A * pt, - A const * cpt = nullptr, - decltype(pt->begin()) * = nullptr, - decltype(pt->end()) * = nullptr, - decltype(cpt->begin()) * = nullptr, - decltype(cpt->end()) * = nullptr, - typename std::decay::type * = nullptr, ///< Is there an operator[] ? - decltype(A::static_size) * = nullptr, ///< fixed array containers define static_size - typename A::iterator * = nullptr, - typename A::const_iterator * = nullptr, - typename A::value_type * = nullptr) - { + {t.begin()} -> std::convertible_to; + {t.end()} -> std::convertible_to; - typedef typename A::iterator iterator; - typedef typename A::const_iterator const_iterator; - return std::is_samebegin()),iterator>::value - && std::is_sameend()),iterator>::value - && std::is_samebegin()),const_iterator>::value - && std::is_sameend()),const_iterator>::value; - } + {ct.begin()} -> std::convertible_to; + {ct.end()} -> std::convertible_to; - template - static constexpr bool test(...) { - return false; - } - - static const bool value = test(nullptr); + { t[0] } -> std::convertible_to; }; } diff --git a/Sofa/framework/Type/src/sofa/type/trait/is_vector.h b/Sofa/framework/Type/src/sofa/type/trait/is_vector.h index d2be28d54a9..bc7aa2c0861 100644 --- a/Sofa/framework/Type/src/sofa/type/trait/is_vector.h +++ b/Sofa/framework/Type/src/sofa/type/trait/is_vector.h @@ -27,38 +27,16 @@ namespace sofa::type::trait /// Detect if a type T has iterator/const iterator function, operator[](size_t) and is dynamically resizable (resize function) template -struct is_vector +concept is_vector = requires(std::remove_cv_t t, const std::remove_cv_t ct) { - typedef typename std::remove_const::type test_type; + {t.begin()} -> std::convertible_to; + {t.end()} -> std::convertible_to; - template - static constexpr bool test( - A * pt, - A const * cpt = nullptr, - decltype(pt->begin()) * = nullptr, - decltype(pt->end()) * = nullptr, - decltype(cpt->begin()) * = nullptr, - decltype(cpt->end()) * = nullptr, - typename std::decay::type * = nullptr, ///< Is there an operator[] ? - decltype(pt->resize(1)) * = nullptr, - typename A::iterator * = nullptr, - typename A::const_iterator * = nullptr, - typename A::value_type * = nullptr) { + {ct.begin()} -> std::convertible_to; + {ct.end()} -> std::convertible_to; - typedef typename A::iterator iterator; - typedef typename A::const_iterator const_iterator; - return std::is_samebegin()),iterator>::value - && std::is_sameend()),iterator>::value - && std::is_samebegin()),const_iterator>::value - && std::is_sameend()),const_iterator>::value; - } - - template - static constexpr bool test(...) { - return false; - } - - static const bool value = test(nullptr); + { t[0] } -> std::convertible_to; + t.resize(1); }; } diff --git a/Sofa/framework/Type/test/BoundingBox_test.cpp b/Sofa/framework/Type/test/BoundingBox_test.cpp new file mode 100644 index 00000000000..6b10e77db15 --- /dev/null +++ b/Sofa/framework/Type/test/BoundingBox_test.cpp @@ -0,0 +1,123 @@ +/****************************************************************************** +* SOFA, Simulation Open-Framework Architecture * +* (c) 2006 INRIA, USTL, UJF, CNRS, MGH * +* * +* This program is free software; you can redistribute it and/or modify it * +* under the terms of the GNU Lesser General Public License as published by * +* the Free Software Foundation; either version 2.1 of the License, or (at * +* your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, but WITHOUT * +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * +* for more details. * +* * +* You should have received a copy of the GNU Lesser General Public License * +* along with this program. If not, see . * +******************************************************************************* +* Authors: The SOFA Team and external contributors (see Authors.txt) * +* * +* Contact information: contact@sofa-framework.org * +******************************************************************************/ +#include +#include + +namespace sofa +{ + +using sofa::type::BoundingBox; +using sofa::type::Vec3; + +TEST(BoundingBoxTest, DefaultConstructor) +{ + static constexpr BoundingBox bbox; + EXPECT_TRUE(bbox.isNegligible()); // Default neutral box should be negligible +} + +TEST(BoundingBoxTest, ConstructorWithEndpoints) { + static constexpr Vec3 minVec(0.0, 0.0, 0.0); + static constexpr Vec3 maxVec(1.0, 1.0, 1.0); + static constexpr BoundingBox bbox(minVec, maxVec); + + EXPECT_EQ(bbox.minBBox(), minVec); + EXPECT_EQ(bbox.maxBBox(), maxVec); +} + +TEST(BoundingBoxTest, ConstructorWithLimits) { + static constexpr BoundingBox bbox(0.0, 1.0, 0.0, 1.0, 0.0, 1.0); + EXPECT_EQ(bbox.minBBox(), Vec3(0.0, 0.0, 0.0)); + EXPECT_EQ(bbox.maxBBox(), Vec3(1.0, 1.0, 1.0)); +} + +TEST(BoundingBoxTest, NeutralBoundingBox) { + static constexpr auto neutral = BoundingBox::neutral_bbox(); + EXPECT_FALSE(neutral.isValid()); // Neutral bbox is invalid +} + +TEST(BoundingBoxTest, Invalidate) { + BoundingBox bbox(Vec3(0.0, 0.0, 0.0), Vec3(1.0, 1.0, 1.0)); + bbox.invalidate(); + EXPECT_FALSE(bbox.isValid()); +} + +TEST(BoundingBoxTest, IsFlat) { + static constexpr BoundingBox flatBBox(Vec3(0.0, 0.0, 0.0), Vec3(1.0, 0.0, 0.0)); + EXPECT_TRUE(flatBBox.isFlat()); + + static constexpr BoundingBox nonFlatBBox(Vec3(0.0, 0.0, 0.0), Vec3(1.0, 1.0, 1.0)); + EXPECT_FALSE(nonFlatBBox.isFlat()); +} + +TEST(BoundingBoxTest, ContainsPoint) { + static constexpr BoundingBox bbox(Vec3(0.0, 0.0, 0.0), Vec3(1.0, 1.0, 1.0)); + static constexpr Vec3 pointInside(0.5, 0.5, 0.5); + static constexpr Vec3 pointOutside(1.5, 1.5, 1.5); + + EXPECT_TRUE(bbox.contains(pointInside)); + EXPECT_FALSE(bbox.contains(pointOutside)); +} + +TEST(BoundingBoxTest, ContainsBoundingBox) { + static constexpr BoundingBox bbox(Vec3(0.0, 0.0, 0.0), Vec3(2.0, 2.0, 2.0)); + static constexpr BoundingBox containedBBox(Vec3(0.5, 0.5, 0.5), Vec3(1.5, 1.5, 1.5)); + static constexpr BoundingBox outsideBBox(Vec3(2.5, 2.5, 2.5), Vec3(3.0, 3.0, 3.0)); + + EXPECT_TRUE(bbox.contains(containedBBox)); + EXPECT_FALSE(bbox.contains(outsideBBox)); +} + +TEST(BoundingBoxTest, Intersection) { + static constexpr BoundingBox bbox1(Vec3(0.0, 0.0, 0.0), Vec3(2.0, 2.0, 2.0)); + static constexpr BoundingBox bbox2(Vec3(1.0, 1.0, 1.0), Vec3(3.0, 3.0, 3.0)); + static constexpr BoundingBox expectedIntersection(Vec3(1.0, 1.0, 1.0), Vec3(2.0, 2.0, 2.0)); + + EXPECT_TRUE(bbox1.intersect(bbox2)); + EXPECT_EQ(bbox1.getIntersection(bbox2), expectedIntersection); +} + +TEST(BoundingBoxTest, Inflate) { + BoundingBox bbox(Vec3(0.0, 0.0, 0.0), Vec3(1.0, 1.0, 1.0)); + bbox.inflate(1.0); + + EXPECT_EQ(bbox.minBBox(), Vec3(-1.0, -1.0, -1.0)); + EXPECT_EQ(bbox.maxBBox(), Vec3(2.0, 2.0, 2.0)); +} + +TEST(BoundingBoxTest, IncludePoint) { + BoundingBox bbox(Vec3(0.0, 0.0, 0.0), Vec3(1.0, 1.0, 1.0)); + static constexpr Vec3 point(2.0, 2.0, 2.0); + bbox.include(point); + + EXPECT_EQ(bbox.maxBBox(), point); +} + +TEST(BoundingBoxTest, IncludeBoundingBox) { + BoundingBox bbox(Vec3(0.0, 0.0, 0.0), Vec3(1.0, 1.0, 1.0)); + static constexpr BoundingBox other(Vec3(-1.0, -1.0, -1.0), Vec3(2.0, 2.0, 2.0)); + bbox.include(other); + + EXPECT_EQ(bbox.minBBox(), other.minBBox()); + EXPECT_EQ(bbox.maxBBox(), other.maxBBox()); +} + +} diff --git a/Sofa/framework/Type/test/CMakeLists.txt b/Sofa/framework/Type/test/CMakeLists.txt index 84f70ddc9d4..7e9ba83bd72 100644 --- a/Sofa/framework/Type/test/CMakeLists.txt +++ b/Sofa/framework/Type/test/CMakeLists.txt @@ -3,10 +3,12 @@ cmake_minimum_required(VERSION 3.22) project(Sofa.Type_test) set(SOURCE_FILES + BoundingBox_test.cpp MatSym_test.cpp MatTypes_test.cpp Material_test.cpp Quater_test.cpp + Rebind_test.cpp RGBAColor_test.cpp StrongType_test.cpp SVector_test.cpp diff --git a/Sofa/framework/Type/test/MatSym_test.cpp b/Sofa/framework/Type/test/MatSym_test.cpp index f91f864460a..6e7926f3766 100644 --- a/Sofa/framework/Type/test/MatSym_test.cpp +++ b/Sofa/framework/Type/test/MatSym_test.cpp @@ -43,7 +43,7 @@ class MatSymTest : public testing::NumericTest using Real = typename ParameterPack::Real; static constexpr auto Size = ParameterPack::Size; - void onSetUp() override + void doSetUp() override { sofa::testing::LinearCongruentialRandomGenerator lcg(96547); diff --git a/Sofa/framework/Type/test/Quater_test.cpp b/Sofa/framework/Type/test/Quater_test.cpp index 7fdf2a0849b..408dfa53a01 100644 --- a/Sofa/framework/Type/test/Quater_test.cpp +++ b/Sofa/framework/Type/test/Quater_test.cpp @@ -707,4 +707,12 @@ TEST(QuaterTest, QuaterdFromUnitVectors) EXPECT_NEAR(0.5894552112230939, quat1[3], errorThreshold); } - +TEST(QuaterTest, StructuredBindings) +{ + Quat quat1; + const auto& [a,b,c,d] = quat1; + EXPECT_NEAR(0., a, errorThreshold); + EXPECT_NEAR(0., b, errorThreshold); + EXPECT_NEAR(0., c, errorThreshold); + EXPECT_NEAR(1., d, errorThreshold); +} diff --git a/Sofa/framework/Type/test/RGBAColor_test.cpp b/Sofa/framework/Type/test/RGBAColor_test.cpp index 1f4d37dc5b1..a31e3582a96 100644 --- a/Sofa/framework/Type/test/RGBAColor_test.cpp +++ b/Sofa/framework/Type/test/RGBAColor_test.cpp @@ -44,6 +44,7 @@ class Color_Test : public BaseTest, void checkStreamingOperator(const std::vector&) ; void checkDoubleStreamingOperator(const std::vector&) ; void testEnlight(); + void testStructuredBindings(); }; void Color_Test::testEnlight() @@ -54,6 +55,15 @@ void Color_Test::testEnlight() EXPECT_EQ( RGBAColor::lighten(RGBAColor::red(), 0.5), RGBAColor(1.0,0.5,0.5,1.0) ) ; } +void Color_Test::testStructuredBindings() +{ + const auto& [r, g, b, a] = RGBAColor::red(); + EXPECT_EQ(r, 1.); + EXPECT_EQ(g, 0.); + EXPECT_EQ(b, 0.); + EXPECT_EQ(a, 1.); +} + void Color_Test::checkCreateFromString() { EXPECT_EQ( RGBAColor::fromString("white"), RGBAColor(1.0,1.0,1.0,1.0) ) ; @@ -277,6 +287,11 @@ TEST_F(Color_Test, checkEnlight) this->testEnlight() ; } +TEST_F(Color_Test, testStructuredBindings) +{ + this->testStructuredBindings(); +} + std::vector> testvalues = { {" 0 0 0 0","0 0 0 0", "S"}, diff --git a/Sofa/framework/Type/test/Rebind_test.cpp b/Sofa/framework/Type/test/Rebind_test.cpp new file mode 100644 index 00000000000..5ef91da5aea --- /dev/null +++ b/Sofa/framework/Type/test/Rebind_test.cpp @@ -0,0 +1,59 @@ +/****************************************************************************** +* SOFA, Simulation Open-Framework Architecture * +* (c) 2006 INRIA, USTL, UJF, CNRS, MGH * +* * +* This program is free software; you can redistribute it and/or modify it * +* under the terms of the GNU Lesser General Public License as published by * +* the Free Software Foundation; either version 2.1 of the License, or (at * +* your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, but WITHOUT * +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * +* for more details. * +* * +* You should have received a copy of the GNU Lesser General Public License * +* along with this program. If not, see . * +******************************************************************************* +* Authors: The SOFA Team and external contributors (see Authors.txt) * +* * +* Contact information: contact@sofa-framework.org * +******************************************************************************/ +#include +#include + +static_assert(sofa::type::CanTypeRebind, int>); +static_assert(sofa::type::CanTypeRebind, int>); + +static_assert( + std::is_same_v< + sofa::type::rebind_to, int>, + sofa::type::vector + >); +static_assert( + std::is_same_v< + sofa::type::rebind_to, int>, + sofa::type::vector + >); + +template +struct DummyNoRebind{}; + +static_assert(!sofa::type::CanTypeRebind, int>); + +static_assert( + std::is_same_v< + sofa::type::rebind_to, int>, + DummyNoRebind + >); + +template +struct DummyWithConstraintRebind +{ + template + requires std::is_integral_v + using rebind_to = U; +}; + +static_assert(sofa::type::CanTypeRebind, int>); +static_assert(!sofa::type::CanTypeRebind, std::string>); diff --git a/Sofa/framework/Type/test/StrongType_test.cpp b/Sofa/framework/Type/test/StrongType_test.cpp index 767813b0baa..e18426be54e 100644 --- a/Sofa/framework/Type/test/StrongType_test.cpp +++ b/Sofa/framework/Type/test/StrongType_test.cpp @@ -31,6 +31,7 @@ TEST(StrongType, constructor) // myint a; //this is not possible as the default constructor is explicit constexpr myint a ( 2 ); + EXPECT_EQ(a.get(), 2); } TEST(StrongType, preIncrementable) diff --git a/Sofa/framework/Type/test/VecTypes_test.cpp b/Sofa/framework/Type/test/VecTypes_test.cpp index a4f10dab1ab..ed3460a56ce 100644 --- a/Sofa/framework/Type/test/VecTypes_test.cpp +++ b/Sofa/framework/Type/test/VecTypes_test.cpp @@ -23,4 +23,11 @@ #include #include - +TEST(VecTest, StructuredBindings) +{ + constexpr sofa::type::Vec3 vec { 1.0, 2.0, 3.0 }; + const auto& [a, b, c] = vec; + EXPECT_EQ(a, 1.); + EXPECT_EQ(b, 2.); + EXPECT_EQ(c, 3.); +} diff --git a/Sofa/framework/Type/test/vector_test.cpp b/Sofa/framework/Type/test/vector_test.cpp index 11fa007a3a7..4322c605587 100644 --- a/Sofa/framework/Type/test/vector_test.cpp +++ b/Sofa/framework/Type/test/vector_test.cpp @@ -49,7 +49,7 @@ class vector_test : public NumericTest<>, void checkVector(const std::vector& params) ; void checkVectorAccessFailure() const; - void checkRebind(); + void checkRebind() const; }; template @@ -103,14 +103,18 @@ void vector_test::checkVectorAccessFailure() const } template -void vector_test::checkRebind() +void vector_test::checkRebind() const { - constexpr bool hasRebind = sofa::type::HasRebindTypedef, int>::value; + constexpr bool hasRebind = sofa::type::CanTypeRebind, int>; + static_assert(hasRebind); EXPECT_TRUE(hasRebind); - using rebinded = typename sofa::type::Rebind, int >::to; - using vec_int = vector; - constexpr bool isRebindOK = std::is_same_v; - EXPECT_TRUE(isRebindOK); + if constexpr (hasRebind) + { + using rebinded = typename sofa::type::Rebind, int >::to; + using vec_int = vector; + constexpr bool isRebindOK = std::is_same_v; + EXPECT_TRUE(isRebindOK); + } } //////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/applications/plugins/CImgPlugin/CImgPlugin_test/ImageCImg_test.cpp b/applications/plugins/CImgPlugin/CImgPlugin_test/ImageCImg_test.cpp index f830e0834de..20b2be44f5a 100644 --- a/applications/plugins/CImgPlugin/CImgPlugin_test/ImageCImg_test.cpp +++ b/applications/plugins/CImgPlugin/CImgPlugin_test/ImageCImg_test.cpp @@ -42,11 +42,11 @@ class ImageCImg_test : public BaseTest } - void SetUp() override + void doSetUp() override { sofa::helper::system::DataRepository.addFirstPath(CIMGPLUGIN_RESOURCES_DIR); } - void TearDown() override + void doTearDown() override { sofa::helper::system::DataRepository.removePath(CIMGPLUGIN_RESOURCES_DIR); } diff --git a/applications/plugins/CMakeLists.txt b/applications/plugins/CMakeLists.txt index cfd74c7f771..56af63924fc 100644 --- a/applications/plugins/CMakeLists.txt +++ b/applications/plugins/CMakeLists.txt @@ -25,7 +25,6 @@ sofa_add_subdirectory(directory SofaPython3 SofaPython3 EXTERNAL GIT_REF master) sofa_add_subdirectory(plugin CGALPlugin CGALPlugin EXTERNAL GIT_REF master) # Depends on image sofa_add_subdirectory(plugin Registration Registration EXTERNAL GIT_REF master) # Depends on image, SofaPython, SofaGui and SofaDistanceGrid sofa_add_subdirectory(plugin BulletCollisionDetection BulletCollisionDetection) # Depends on Compliant and LMConstraint -sofa_add_subdirectory(plugin InvertibleFVM InvertibleFVM EXTERNAL GIT_REF master) sofa_add_subdirectory(plugin MeshSTEPLoader MeshSTEPLoader EXTERNAL GIT_REF master) sofa_add_subdirectory(plugin PluginExample PluginExample EXTERNAL GIT_REF master) sofa_add_subdirectory(plugin ManifoldTopologies ManifoldTopologies EXTERNAL GIT_REF master) @@ -35,7 +34,6 @@ sofa_add_subdirectory(plugin Xitact Xitact) sofa_add_subdirectory(plugin Haption Haption) sofa_add_subdirectory(plugin PersistentContact PersistentContact) sofa_add_subdirectory(plugin Sensable Sensable) -sofa_add_subdirectory(plugin SensableEmulation SensableEmulation) sofa_add_subdirectory(plugin SofaHAPI SofaHAPI) sofa_add_subdirectory(plugin SofaCarving SofaCarving) sofa_add_subdirectory(plugin LeapMotion LeapMotion) @@ -66,10 +64,9 @@ sofa_add_subdirectory(plugin SofaCUDA SofaCUDA) sofa_find_package(Sofa.GL QUIET) if(Sofa.GL_FOUND) - sofa_add_subdirectory(plugin SofaSimpleGUI SofaSimpleGUI) # SofaSimpleGUI plugin can't work without OPENGL sofa_add_subdirectory(plugin VolumetricRendering VolumetricRendering) # VolumetricRendering plugin can't work without OPENGL else() - message("Sofa.GL not found; disabling SofaSimpleGUI and VolumetricRendering plugins") + message("Sofa.GL not found; disabling VolumetricRendering plugin") endif() sofa_add_subdirectory(plugin SofaDistanceGrid SofaDistanceGrid) # Also defines SofaDistanceGrid.CUDA diff --git a/applications/plugins/CollisionOBBCapsule/src/CollisionOBBCapsule/response/contact/CapsuleContact.cpp b/applications/plugins/CollisionOBBCapsule/src/CollisionOBBCapsule/response/contact/CapsuleContact.cpp index e667cbfc1c5..29eb62b3706 100644 --- a/applications/plugins/CollisionOBBCapsule/src/CollisionOBBCapsule/response/contact/CapsuleContact.cpp +++ b/applications/plugins/CollisionOBBCapsule/src/CollisionOBBCapsule/response/contact/CapsuleContact.cpp @@ -27,6 +27,7 @@ #include #include #include +#include using namespace sofa::core::collision; @@ -79,6 +80,18 @@ template class COLLISIONOBBCAPSULE_API BarycentricPenalityContact, CapsuleCollisionModel>; template class COLLISIONOBBCAPSULE_API BarycentricPenalityContact, CylinderCollisionModel>; +template class COLLISIONOBBCAPSULE_API BaseUnilateralContactResponse, CapsuleCollisionModel, sofa::component::constraint::lagrangian::model::UnilateralLagrangianContactParameters>; +template class COLLISIONOBBCAPSULE_API BaseUnilateralContactResponse, TriangleCollisionModel, sofa::component::constraint::lagrangian::model::UnilateralLagrangianContactParameters>; +template class COLLISIONOBBCAPSULE_API BaseUnilateralContactResponse, SphereCollisionModel, sofa::component::constraint::lagrangian::model::UnilateralLagrangianContactParameters>; +template class COLLISIONOBBCAPSULE_API BaseUnilateralContactResponse, RigidSphereModel, sofa::component::constraint::lagrangian::model::UnilateralLagrangianContactParameters>; +template class COLLISIONOBBCAPSULE_API BaseUnilateralContactResponse, CapsuleCollisionModel, sofa::component::constraint::lagrangian::model::UnilateralLagrangianContactParameters>; +template class COLLISIONOBBCAPSULE_API BaseUnilateralContactResponse, CapsuleCollisionModel, sofa::component::constraint::lagrangian::model::UnilateralLagrangianContactParameters>; +template class COLLISIONOBBCAPSULE_API BaseUnilateralContactResponse, TriangleCollisionModel, sofa::component::constraint::lagrangian::model::UnilateralLagrangianContactParameters>; +template class COLLISIONOBBCAPSULE_API BaseUnilateralContactResponse, SphereCollisionModel, sofa::component::constraint::lagrangian::model::UnilateralLagrangianContactParameters>; +template class COLLISIONOBBCAPSULE_API BaseUnilateralContactResponse, RigidSphereModel, sofa::component::constraint::lagrangian::model::UnilateralLagrangianContactParameters>; +template class COLLISIONOBBCAPSULE_API BaseUnilateralContactResponse, OBBCollisionModel, sofa::component::constraint::lagrangian::model::UnilateralLagrangianContactParameters>; +template class COLLISIONOBBCAPSULE_API BaseUnilateralContactResponse, OBBCollisionModel, sofa::component::constraint::lagrangian::model::UnilateralLagrangianContactParameters>; + template class COLLISIONOBBCAPSULE_API FrictionContact, CapsuleCollisionModel>; template class COLLISIONOBBCAPSULE_API FrictionContact, TriangleCollisionModel>; template class COLLISIONOBBCAPSULE_API FrictionContact, SphereCollisionModel>; diff --git a/applications/plugins/CollisionOBBCapsule/src/CollisionOBBCapsule/response/contact/OBBContact.cpp b/applications/plugins/CollisionOBBCapsule/src/CollisionOBBCapsule/response/contact/OBBContact.cpp index fe3f0a79efd..15fcd595c99 100644 --- a/applications/plugins/CollisionOBBCapsule/src/CollisionOBBCapsule/response/contact/OBBContact.cpp +++ b/applications/plugins/CollisionOBBCapsule/src/CollisionOBBCapsule/response/contact/OBBContact.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include @@ -57,6 +58,12 @@ template class COLLISIONOBBCAPSULE_API response::contact::BarycentricPenalityCon template class COLLISIONOBBCAPSULE_API response::contact::BarycentricPenalityContact, OBBCollisionModel>; template class COLLISIONOBBCAPSULE_API response::contact::BarycentricPenalityContact, OBBCollisionModel>; + +template class COLLISIONOBBCAPSULE_API response::contact::BaseUnilateralContactResponse, OBBCollisionModel,constraint::lagrangian::model::UnilateralLagrangianContactParameters>; +template class COLLISIONOBBCAPSULE_API response::contact::BaseUnilateralContactResponse, OBBCollisionModel,constraint::lagrangian::model::UnilateralLagrangianContactParameters>; +template class COLLISIONOBBCAPSULE_API response::contact::BaseUnilateralContactResponse, OBBCollisionModel,constraint::lagrangian::model::UnilateralLagrangianContactParameters>; +template class COLLISIONOBBCAPSULE_API response::contact::BaseUnilateralContactResponse,constraint::lagrangian::model::UnilateralLagrangianContactParameters>; + template class COLLISIONOBBCAPSULE_API response::contact::FrictionContact, OBBCollisionModel>; template class COLLISIONOBBCAPSULE_API response::contact::FrictionContact, OBBCollisionModel>; template class COLLISIONOBBCAPSULE_API response::contact::FrictionContact, OBBCollisionModel>; diff --git a/applications/plugins/InvertibleFVM/ExternalProjectConfig.cmake.in b/applications/plugins/InvertibleFVM/ExternalProjectConfig.cmake.in deleted file mode 100644 index 3ae32c83c66..00000000000 --- a/applications/plugins/InvertibleFVM/ExternalProjectConfig.cmake.in +++ /dev/null @@ -1,14 +0,0 @@ -cmake_minimum_required(VERSION 3.22) - -include(ExternalProject) -ExternalProject_Add(InvertibleFVM - GIT_REPOSITORY https://github.com/sofa-framework/InvertibleFVM - GIT_TAG origin/@ARG_GIT_REF@ - SOURCE_DIR "${CMAKE_SOURCE_DIR}/applications/plugins/InvertibleFVM" - BINARY_DIR "" - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - TEST_COMMAND "" - GIT_CONFIG "remote.origin.fetch=+refs/pull/*:refs/remotes/origin/pr/*" -) diff --git a/applications/plugins/MultiThreading/src/MultiThreading/DataExchange.cpp b/applications/plugins/MultiThreading/src/MultiThreading/DataExchange.cpp index 1a7e71ce619..dbe0d4f11cf 100644 --- a/applications/plugins/MultiThreading/src/MultiThreading/DataExchange.cpp +++ b/applications/plugins/MultiThreading/src/MultiThreading/DataExchange.cpp @@ -33,25 +33,25 @@ namespace sofa::core SOFA_EVENT_CPP(DataExchangeEvent) -// Register in the Factory -int DataExchangeClass = core::RegisterObject("DataExchange") -.add< DataExchange< sofa::type::vector > >(true) -.add< DataExchange< sofa::type::vector > >() -.add< DataExchange< sofa::type::vector > >() -.add< DataExchange< sofa::type::Vec3d > >() -.add< DataExchange< double > >() - -.add< DataExchange< sofa::type::vector > >() -.add< DataExchange< sofa::type::vector > >() -.add< DataExchange< sofa::type::vector > >() -.add< DataExchange< sofa::type::Vec3f > >() -.add< DataExchange< float > >() +void registerDataExchange(sofa::core::ObjectFactory* factory) +{ + factory->registerObjects(core::ObjectRegistrationData("Component for data memory sharing in the context of multi-threading applications") + .add< DataExchange< sofa::type::vector > >(true) + .add< DataExchange< sofa::type::vector > >() + .add< DataExchange< sofa::type::vector > >() + .add< DataExchange< sofa::type::Vec3d > >() + .add< DataExchange< double > >() -.add< DataExchange< sofa::type::vector > >() -.add< DataExchange< sofa::type::vector > >() -.add< DataExchange< bool > >() -; + .add< DataExchange< sofa::type::vector > >() + .add< DataExchange< sofa::type::vector > >() + .add< DataExchange< sofa::type::vector > >() + .add< DataExchange< sofa::type::Vec3f > >() + .add< DataExchange< float > >() + .add< DataExchange< sofa::type::vector > >() + .add< DataExchange< sofa::type::vector > >() + .add< DataExchange< bool > >()); +} template class SOFA_MULTITHREADING_PLUGIN_API DataExchange< sofa::type::vector >; template class SOFA_MULTITHREADING_PLUGIN_API DataExchange< sofa::type::vector >; diff --git a/applications/plugins/MultiThreading/src/MultiThreading/MeanComputation.cpp b/applications/plugins/MultiThreading/src/MultiThreading/MeanComputation.cpp index 4fb6c374091..3d4fcbac040 100644 --- a/applications/plugins/MultiThreading/src/MultiThreading/MeanComputation.cpp +++ b/applications/plugins/MultiThreading/src/MultiThreading/MeanComputation.cpp @@ -29,13 +29,15 @@ namespace sofa::component::engine { -int MeanComputationEngineClass = core::RegisterObject("Compute the mean of the input elements") - .add< MeanComputation >(true) // default template - .add< MeanComputation >() - .add< MeanComputation >() - .add< MeanComputation >() - .add< MeanComputation >() - ; +void registerMeanComputationEngine(sofa::core::ObjectFactory* factory) +{ + factory->registerObjects(core::ObjectRegistrationData("Compute the mean of the input elements.") + .add< MeanComputation >(true) // default template + .add< MeanComputation >() + .add< MeanComputation >() + .add< MeanComputation >() + .add< MeanComputation >()); +} template class SOFA_MULTITHREADING_PLUGIN_API MeanComputation< defaulttype::Vec3Types >; template class SOFA_MULTITHREADING_PLUGIN_API MeanComputation< defaulttype::Vec1Types >; diff --git a/applications/plugins/MultiThreading/src/MultiThreading/component/animationloop/AnimationLoopParallelScheduler.cpp b/applications/plugins/MultiThreading/src/MultiThreading/component/animationloop/AnimationLoopParallelScheduler.cpp index 1698d38bc96..636f04472d5 100644 --- a/applications/plugins/MultiThreading/src/MultiThreading/component/animationloop/AnimationLoopParallelScheduler.cpp +++ b/applications/plugins/MultiThreading/src/MultiThreading/component/animationloop/AnimationLoopParallelScheduler.cpp @@ -39,9 +39,11 @@ namespace multithreading::component::animationloop { -int AnimationLoopParallelSchedulerClass = sofa::core::RegisterObject("parallel animation loop, using intel tbb library") - .add< AnimationLoopParallelScheduler >() - ; +void registerAnimationLoopParallelScheduler(sofa::core::ObjectFactory* factory) +{ + factory->registerObjects(sofa::core::ObjectRegistrationData("Parallel animation loop, using the Intel tbb library.") + .add< AnimationLoopParallelScheduler >()); +} AnimationLoopParallelScheduler::AnimationLoopParallelScheduler(sofa::simulation::Node* _gnode) : Inherit() diff --git a/applications/plugins/MultiThreading/src/MultiThreading/component/collision/detection/algorithm/ParallelBVHNarrowPhase.cpp b/applications/plugins/MultiThreading/src/MultiThreading/component/collision/detection/algorithm/ParallelBVHNarrowPhase.cpp index 3cf5782a58d..3c1a0a06af7 100644 --- a/applications/plugins/MultiThreading/src/MultiThreading/component/collision/detection/algorithm/ParallelBVHNarrowPhase.cpp +++ b/applications/plugins/MultiThreading/src/MultiThreading/component/collision/detection/algorithm/ParallelBVHNarrowPhase.cpp @@ -36,13 +36,14 @@ namespace multithreading::component::collision::detection::algorithm const bool isParallelBVHNarrowPhaseImplementationRegistered = multithreading::ParallelImplementationsRegistry::addEquivalentImplementations("BVHNarrowPhase", "ParallelBVHNarrowPhase"); +void registerParallelBVHNarrowPhase(sofa::core::ObjectFactory* factory) +{ + factory->registerObjects(sofa::core::ObjectRegistrationData("Parallel version of the narrow phase collision detection based on boundary volume hierarchy.") + .add< ParallelBVHNarrowPhase >()); +} using sofa::helper::ScopedAdvancedTimer; -int ParallelBVHNarrowPhaseClass = sofa::core::RegisterObject("Narrow phase collision detection based on boundary volume hierarchy") - .add< ParallelBVHNarrowPhase >() -; - ParallelBVHNarrowPhase::ParallelBVHNarrowPhase() {} @@ -131,22 +132,10 @@ void ParallelBVHNarrowPhase::initializeTopology(sofa::core::topology::BaseMeshTo auto insertionIt = m_initializedTopology.insert(topology); if (insertionIt.second) { - // The following calls force the creation of some topology arrays before the concurrent computing. - // Those arrays cannot be created on the fly, in a concurrent environment, + // We need to make sure all topology buffers are well created. + // Those arrays cannot be created on the fly later, in a concurrent environment, // due to possible race conditions. - // Depending on the scene graph, it is possible that those calls are not enough. - if (topology->getNbPoints()) - { - topology->getTrianglesAroundVertex(0); - } - if (topology->getNbTriangles()) - { - topology->getEdgesInTriangle(0); - } - if (topology->getNbEdges()) - { - topology->getTrianglesAroundEdge(0); - } + topology->computeCrossElementBuffers(); } } diff --git a/applications/plugins/MultiThreading/src/MultiThreading/component/collision/detection/algorithm/ParallelBruteForceBroadPhase.cpp b/applications/plugins/MultiThreading/src/MultiThreading/component/collision/detection/algorithm/ParallelBruteForceBroadPhase.cpp index 72cf9d8b848..242d543a303 100644 --- a/applications/plugins/MultiThreading/src/MultiThreading/component/collision/detection/algorithm/ParallelBruteForceBroadPhase.cpp +++ b/applications/plugins/MultiThreading/src/MultiThreading/component/collision/detection/algorithm/ParallelBruteForceBroadPhase.cpp @@ -34,11 +34,13 @@ namespace multithreading::component::collision::detection::algorithm const bool isParallelParallelBruteForceBroadPhaseImplementationRegistered = multithreading::ParallelImplementationsRegistry::addEquivalentImplementations("BruteForceBroadPhase", "ParallelBruteForceBroadPhase"); -using sofa::helper::ScopedAdvancedTimer; +void registerParallelBruteForceBroadPhase(sofa::core::ObjectFactory* factory) +{ + factory->registerObjects(sofa::core::ObjectRegistrationData("Parallel version of the collision detection using extensive pair-wise tests performed concurrently.") + .add< ParallelBruteForceBroadPhase >()); +} -int ParallelBruteForceBroadPhaseClass = sofa::core::RegisterObject("Collision detection using extensive pair-wise tests performed in parallel") - .add< ParallelBruteForceBroadPhase >() -; +using sofa::helper::ScopedAdvancedTimer; ParallelBruteForceBroadPhase::ParallelBruteForceBroadPhase() : BruteForceBroadPhase() diff --git a/applications/plugins/MultiThreading/src/MultiThreading/component/linearsolver/iterative/ParallelCGLinearSolver.cpp b/applications/plugins/MultiThreading/src/MultiThreading/component/linearsolver/iterative/ParallelCGLinearSolver.cpp index 22cd5f3569b..5838bb7295c 100644 --- a/applications/plugins/MultiThreading/src/MultiThreading/component/linearsolver/iterative/ParallelCGLinearSolver.cpp +++ b/applications/plugins/MultiThreading/src/MultiThreading/component/linearsolver/iterative/ParallelCGLinearSolver.cpp @@ -1,4 +1,4 @@ -/****************************************************************************** +/****************************************************************************** * SOFA, Simulation Open-Framework Architecture * * (c) 2006 INRIA, USTL, UJF, CNRS, MGH * * * @@ -59,9 +59,12 @@ ParallelCGLinearSolver< ParallelCompressedRowSparseMatrixMechanical, sofa template class SOFA_MULTITHREADING_PLUGIN_API ParallelCGLinearSolver< ParallelCompressedRowSparseMatrixMechanical>, sofa::linearalgebra::FullVector >; -int ParallelCGLinearSolverClass = sofa::core::RegisterObject("Linear system solver using the conjugate gradient iterative algorithm in parallel") - .add< ParallelCGLinearSolver< ParallelCompressedRowSparseMatrixMechanical, sofa::linearalgebra::FullVector > >(true) - .add< ParallelCGLinearSolver< ParallelCompressedRowSparseMatrixMechanical>, sofa::linearalgebra::FullVector > >(); +void registerParallelCGLinearSolver(sofa::core::ObjectFactory* factory) +{ + factory->registerObjects(sofa::core::ObjectRegistrationData("Parallel version of the linear solver using the conjugate gradient iterative algorithm.") + .add< ParallelCGLinearSolver< ParallelCompressedRowSparseMatrixMechanical, sofa::linearalgebra::FullVector > >(true) + .add< ParallelCGLinearSolver< ParallelCompressedRowSparseMatrixMechanical>, sofa::linearalgebra::FullVector > >()); +} const bool isParallelCGLinearSolverImplementationRegistered = ParallelImplementationsRegistry::addEquivalentImplementations("CGLinearSolver", "ParallelCGLinearSolver"); diff --git a/applications/plugins/MultiThreading/src/MultiThreading/component/mapping/linear/BeamLinearMapping_mt.cpp b/applications/plugins/MultiThreading/src/MultiThreading/component/mapping/linear/BeamLinearMapping_mt.cpp index dbd167d2989..20013a22c14 100644 --- a/applications/plugins/MultiThreading/src/MultiThreading/component/mapping/linear/BeamLinearMapping_mt.cpp +++ b/applications/plugins/MultiThreading/src/MultiThreading/component/mapping/linear/BeamLinearMapping_mt.cpp @@ -32,11 +32,11 @@ namespace multithreading::component::mapping::linear const bool isBeamLinearMapping_mtImplementationRegistered = multithreading::ParallelImplementationsRegistry::addEquivalentImplementations("BeamLinearMapping", "BeamLinearMapping_mt"); -//using namespace defaulttype; -// Register in the Factory -int BeamLinearMapping_mtClass = sofa::core::RegisterObject("Set the positions and velocities of points attached to a beam using linear interpolation between DOFs") - .add< BeamLinearMapping_mt< Rigid3Types, Vec3Types > >() - ; +void registerBeamLinearMapping_mt(sofa::core::ObjectFactory* factory) +{ + factory->registerObjects(sofa::core::ObjectRegistrationData("Set the positions and velocities of points attached to a beam using linear interpolation between DOFs.") + .add< BeamLinearMapping_mt< Rigid3Types, Vec3Types > >()); +} template class BeamLinearMapping_mt< Rigid3Types, Vec3Types >; diff --git a/applications/plugins/MultiThreading/src/MultiThreading/component/solidmechanics/fem/elastic/ParallelHexahedronFEMForceField.cpp b/applications/plugins/MultiThreading/src/MultiThreading/component/solidmechanics/fem/elastic/ParallelHexahedronFEMForceField.cpp index e8f55a188f7..e1d5b7c737a 100644 --- a/applications/plugins/MultiThreading/src/MultiThreading/component/solidmechanics/fem/elastic/ParallelHexahedronFEMForceField.cpp +++ b/applications/plugins/MultiThreading/src/MultiThreading/component/solidmechanics/fem/elastic/ParallelHexahedronFEMForceField.cpp @@ -29,14 +29,16 @@ namespace multithreading::component::forcefield::solidmechanics::fem::elastic { +using namespace sofa::defaulttype; + const bool isParallelHexahedronFEMForceFieldImplementationRegistered = multithreading::ParallelImplementationsRegistry::addEquivalentImplementations("HexahedronFEMForceField", "ParallelHexahedronFEMForceField"); -using namespace sofa::defaulttype; - -// Register in the Factory -int ParallelHexahedronFEMForceFieldClass = sofa::core::RegisterObject("Parallel hexahedral finite elements") - .add < ParallelHexahedronFEMForceField < Vec3Types > > (); +void registerParallelHexahedronFEMForceField(sofa::core::ObjectFactory* factory) +{ + factory->registerObjects(sofa::core::ObjectRegistrationData("Parallel implementation of a linear elastic material using hexahedral finite elements.") + .add < ParallelHexahedronFEMForceField < Vec3Types > > ()); +} template class SOFA_MULTITHREADING_PLUGIN_API ParallelHexahedronFEMForceField; diff --git a/applications/plugins/MultiThreading/src/MultiThreading/component/solidmechanics/fem/elastic/ParallelTetrahedronFEMForceField.cpp b/applications/plugins/MultiThreading/src/MultiThreading/component/solidmechanics/fem/elastic/ParallelTetrahedronFEMForceField.cpp index bf73f5b1fa1..cc0d876f5fa 100644 --- a/applications/plugins/MultiThreading/src/MultiThreading/component/solidmechanics/fem/elastic/ParallelTetrahedronFEMForceField.cpp +++ b/applications/plugins/MultiThreading/src/MultiThreading/component/solidmechanics/fem/elastic/ParallelTetrahedronFEMForceField.cpp @@ -26,7 +26,7 @@ #include -namespace multithreading::component::solidmechanics::fem::elastic +namespace multithreading::component::forcefield::solidmechanics::fem::elastic { using namespace sofa::defaulttype; @@ -34,9 +34,11 @@ using namespace sofa::defaulttype; const bool isParallelTetrahedronFEMForceFieldImplementationRegistered = multithreading::ParallelImplementationsRegistry::addEquivalentImplementations("TetrahedronFEMForceField", "ParallelTetrahedronFEMForceField"); -// Register in the Factory -int ParallelTetrahedronFEMForceFieldClass = sofa::core::RegisterObject("Parallel tetrahedral finite elements") - .add < ParallelTetrahedronFEMForceField < Vec3Types > > (); +void registerParallelTetrahedronFEMForceField(sofa::core::ObjectFactory* factory) +{ + factory->registerObjects(sofa::core::ObjectRegistrationData("Parallel implementation of a linear elastic material using tetrahedral finite elements..") + .add < ParallelTetrahedronFEMForceField < Vec3Types > > ()); +} template class SOFA_MULTITHREADING_PLUGIN_API ParallelTetrahedronFEMForceField; diff --git a/applications/plugins/MultiThreading/src/MultiThreading/component/solidmechanics/fem/elastic/ParallelTetrahedronFEMForceField.h b/applications/plugins/MultiThreading/src/MultiThreading/component/solidmechanics/fem/elastic/ParallelTetrahedronFEMForceField.h index 0e9cb332cbd..be6a9186b19 100644 --- a/applications/plugins/MultiThreading/src/MultiThreading/component/solidmechanics/fem/elastic/ParallelTetrahedronFEMForceField.h +++ b/applications/plugins/MultiThreading/src/MultiThreading/component/solidmechanics/fem/elastic/ParallelTetrahedronFEMForceField.h @@ -30,7 +30,7 @@ #include -namespace multithreading::component::solidmechanics::fem::elastic +namespace multithreading::component::forcefield::solidmechanics::fem::elastic { /** diff --git a/applications/plugins/MultiThreading/src/MultiThreading/component/solidmechanics/fem/elastic/ParallelTetrahedronFEMForceField.inl b/applications/plugins/MultiThreading/src/MultiThreading/component/solidmechanics/fem/elastic/ParallelTetrahedronFEMForceField.inl index e144a95b764..f2f620b5505 100644 --- a/applications/plugins/MultiThreading/src/MultiThreading/component/solidmechanics/fem/elastic/ParallelTetrahedronFEMForceField.inl +++ b/applications/plugins/MultiThreading/src/MultiThreading/component/solidmechanics/fem/elastic/ParallelTetrahedronFEMForceField.inl @@ -27,7 +27,7 @@ #include #include -namespace multithreading::component::solidmechanics::fem::elastic +namespace multithreading::component::forcefield::solidmechanics::fem::elastic { template diff --git a/applications/plugins/MultiThreading/src/MultiThreading/component/solidmechanics/spring/ParallelMeshSpringForceField.cpp b/applications/plugins/MultiThreading/src/MultiThreading/component/solidmechanics/spring/ParallelMeshSpringForceField.cpp index dcfd24c396a..132a645626e 100644 --- a/applications/plugins/MultiThreading/src/MultiThreading/component/solidmechanics/spring/ParallelMeshSpringForceField.cpp +++ b/applications/plugins/MultiThreading/src/MultiThreading/component/solidmechanics/spring/ParallelMeshSpringForceField.cpp @@ -25,10 +25,13 @@ namespace multithreading::component::solidmechanics::spring { -int ParallelMeshSpringForceFieldClass = sofa::core::RegisterObject("Parallel stiff springs acting along the edges of a mesh") - .add< ParallelMeshSpringForceField >() - .add< ParallelMeshSpringForceField >() - .add< ParallelMeshSpringForceField >(); +void registerParallelMeshSpringForceField(sofa::core::ObjectFactory* factory) +{ + factory->registerObjects(sofa::core::ObjectRegistrationData("Parallel stiff springs acting along the edges of a mesh.") + .add< ParallelMeshSpringForceField >() + .add< ParallelMeshSpringForceField >() + .add< ParallelMeshSpringForceField >()); +} template class SOFA_MULTITHREADING_PLUGIN_API ParallelMeshSpringForceField; template class SOFA_MULTITHREADING_PLUGIN_API ParallelMeshSpringForceField; diff --git a/applications/plugins/MultiThreading/src/MultiThreading/component/solidmechanics/spring/ParallelSpringForceField.cpp b/applications/plugins/MultiThreading/src/MultiThreading/component/solidmechanics/spring/ParallelSpringForceField.cpp index 6c2b2d858b0..682b67ae414 100644 --- a/applications/plugins/MultiThreading/src/MultiThreading/component/solidmechanics/spring/ParallelSpringForceField.cpp +++ b/applications/plugins/MultiThreading/src/MultiThreading/component/solidmechanics/spring/ParallelSpringForceField.cpp @@ -25,12 +25,15 @@ namespace multithreading::component::solidmechanics::spring { -int ParallelSpringForceFieldClass = sofa::core::RegisterObject("Parallel stiff springs") - .add< ParallelSpringForceField >() - .add< ParallelSpringForceField >() - .add< ParallelSpringForceField >() - .add< ParallelSpringForceField >() - .add< ParallelSpringForceField >(); +void registerParallelSpringForceField(sofa::core::ObjectFactory* factory) +{ + factory->registerObjects(sofa::core::ObjectRegistrationData("Parallel stiff springs.") + .add< ParallelSpringForceField >() + .add< ParallelSpringForceField >() + .add< ParallelSpringForceField >() + .add< ParallelSpringForceField >() + .add< ParallelSpringForceField >()); +} template class SOFA_MULTITHREADING_PLUGIN_API ParallelSpringForceField; template class SOFA_MULTITHREADING_PLUGIN_API ParallelSpringForceField; diff --git a/applications/plugins/MultiThreading/src/MultiThreading/config.h.in b/applications/plugins/MultiThreading/src/MultiThreading/config.h.in index e00cd0f836f..8b2f185328b 100644 --- a/applications/plugins/MultiThreading/src/MultiThreading/config.h.in +++ b/applications/plugins/MultiThreading/src/MultiThreading/config.h.in @@ -19,8 +19,7 @@ * * * Contact information: contact@sofa-framework.org * ******************************************************************************/ -#ifndef MULTITHREADING_CONFIG_H -#define MULTITHREADING_CONFIG_H +#pragma once #include @@ -31,7 +30,11 @@ # define SOFA_MULTITHREADING_PLUGIN_API SOFA_IMPORT_DYNAMIC_LIBRARY #endif -#endif +namespace multithreading +{ + constexpr const char* MODULE_NAME = "@PROJECT_NAME@"; + constexpr const char* MODULE_VERSION = "@PROJECT_VERSION@"; +} // namespace multithreading #ifdef SOFA_BUILD_MULTITHREADING #define SOFA_ATTRIBUTE_DISABLED__TASKSCHEDULERUSER_DATANAME(msg) diff --git a/applications/plugins/MultiThreading/src/MultiThreading/initMultiThreading.cpp b/applications/plugins/MultiThreading/src/MultiThreading/initMultiThreading.cpp index d14bb740f10..853e1ddfc68 100644 --- a/applications/plugins/MultiThreading/src/MultiThreading/initMultiThreading.cpp +++ b/applications/plugins/MultiThreading/src/MultiThreading/initMultiThreading.cpp @@ -24,16 +24,63 @@ #include +#include +#include + +namespace sofa::core +{ +extern void registerDataExchange(sofa::core::ObjectFactory* factory); +} + +namespace sofa::component::engine +{ +extern void registerMeanComputationEngine(sofa::core::ObjectFactory* factory); +} + namespace multithreading { +namespace component::animationloop +{ +extern void registerAnimationLoopParallelScheduler(sofa::core::ObjectFactory* factory); +} + +namespace component::collision::detection::algorithm +{ +extern void registerParallelBVHNarrowPhase(sofa::core::ObjectFactory* factory); +extern void registerParallelBruteForceBroadPhase(sofa::core::ObjectFactory* factory); +} + +namespace component::linearsolver::iterative +{ +extern void registerParallelCGLinearSolver(sofa::core::ObjectFactory* factory); +} + +namespace component::mapping::linear +{ +extern void registerBeamLinearMapping_mt(sofa::core::ObjectFactory* factory); +} + +namespace component::forcefield::solidmechanics::fem::elastic +{ +extern void registerParallelHexahedronFEMForceField(sofa::core::ObjectFactory* factory); +extern void registerParallelTetrahedronFEMForceField(sofa::core::ObjectFactory* factory); +} + +namespace component::solidmechanics::spring +{ +extern void registerParallelMeshSpringForceField(sofa::core::ObjectFactory* factory); +extern void registerParallelSpringForceField(sofa::core::ObjectFactory* factory); +} + extern "C" { SOFA_MULTITHREADING_PLUGIN_API void initExternalModule(); SOFA_MULTITHREADING_PLUGIN_API const char* getModuleName(); SOFA_MULTITHREADING_PLUGIN_API const char* getModuleVersion(); SOFA_MULTITHREADING_PLUGIN_API const char* getModuleLicense(); SOFA_MULTITHREADING_PLUGIN_API const char* getModuleDescription(); +SOFA_MULTITHREADING_PLUGIN_API void registerObjects(sofa::core::ObjectFactory* factory); } void init() @@ -41,6 +88,9 @@ void init() static bool first = true; if (first) { + // make sure that this plugin is registered into the PluginManager + sofa::helper::system::PluginManager::getInstance().registerPlugin(MODULE_NAME); + sofa::component::linearsolver::iterative::init(); first = false; } @@ -53,12 +103,12 @@ void initExternalModule() const char* getModuleName() { - return "MultiThreading"; + return MODULE_NAME; } const char* getModuleVersion() { - return "1.0"; + return MODULE_VERSION; } const char* getModuleLicense() @@ -71,4 +121,20 @@ const char* getModuleDescription() return "MultiThreading SOFA Framework"; } +void registerObjects(sofa::core::ObjectFactory* factory) +{ + sofa::core::registerDataExchange(factory); + sofa::component::engine::registerMeanComputationEngine(factory); + multithreading::component::animationloop::registerAnimationLoopParallelScheduler(factory); + multithreading::component::collision::detection::algorithm::registerParallelBVHNarrowPhase(factory); + multithreading::component::collision::detection::algorithm::registerParallelBruteForceBroadPhase(factory); + multithreading::component::linearsolver::iterative::registerParallelCGLinearSolver(factory); + multithreading::component::mapping::linear::registerBeamLinearMapping_mt(factory); + multithreading::component::forcefield::solidmechanics::fem::elastic::registerParallelHexahedronFEMForceField(factory); + multithreading::component::forcefield::solidmechanics::fem::elastic::registerParallelTetrahedronFEMForceField(factory); + multithreading::component::solidmechanics::spring::registerParallelMeshSpringForceField(factory); + multithreading::component::solidmechanics::spring::registerParallelSpringForceField(factory); + +} + } diff --git a/applications/plugins/MultiThreading/test/ParallelImplementationsRegistry_test.cpp b/applications/plugins/MultiThreading/test/ParallelImplementationsRegistry_test.cpp index e93fcf403df..6bb03c78cdf 100644 --- a/applications/plugins/MultiThreading/test/ParallelImplementationsRegistry_test.cpp +++ b/applications/plugins/MultiThreading/test/ParallelImplementationsRegistry_test.cpp @@ -1,4 +1,4 @@ -/****************************************************************************** +/****************************************************************************** * SOFA, Simulation Open-Framework Architecture * * (c) 2006 INRIA, USTL, UJF, CNRS, MGH * * * @@ -23,6 +23,7 @@ #include #include #include +#include #include @@ -32,10 +33,11 @@ namespace multithreading TEST(ParallelImplementationsRegistry, existInObjectFactory) { // sequential versions will be added to the ObjectFactory - sofa::simpleapi::importPlugin("Sofa.Component.LinearSolver.Iterative"); - sofa::simpleapi::importPlugin("Sofa.Component.Collision.Detection.Algorithm"); - sofa::simpleapi::importPlugin("Sofa.Component.SolidMechanics.FEM.Elastic"); - sofa::simpleapi::importPlugin("Sofa.Component.Mapping.Linear"); + sofa::simpleapi::importPlugin(Sofa.Component.LinearSolver.Iterative); + sofa::simpleapi::importPlugin(Sofa.Component.Collision.Detection.Algorithm); + sofa::simpleapi::importPlugin(Sofa.Component.SolidMechanics.FEM.Elastic); + sofa::simpleapi::importPlugin(Sofa.Component.Mapping.Linear); + sofa::simpleapi::importPlugin("MultiThreading"); const auto implementations = ParallelImplementationsRegistry::getImplementations(); diff --git a/applications/plugins/SceneCreator/SceneCreator_test/SceneCreator_test.cpp b/applications/plugins/SceneCreator/SceneCreator_test/SceneCreator_test.cpp index 4168eec9f92..5fc3bdbb1ab 100644 --- a/applications/plugins/SceneCreator/SceneCreator_test/SceneCreator_test.cpp +++ b/applications/plugins/SceneCreator/SceneCreator_test/SceneCreator_test.cpp @@ -58,10 +58,10 @@ using sofa::simulation::Node; class SceneCreator_test : public BaseSimulationTest { public: - void SetUp() override + void doSetUp() override { - sofa::simpleapi::importPlugin("Sofa.Component"); - sofa::simpleapi::importPlugin("Sofa.GL.Component.Rendering3D"); + sofa::simpleapi::importPlugin(Sofa.Component); + sofa::simpleapi::importPlugin(Sofa.GL.Component.Rendering3D); } bool createCubeFailed(); diff --git a/applications/plugins/SceneCreator/src/SceneCreator/SceneCreator.cpp b/applications/plugins/SceneCreator/src/SceneCreator/SceneCreator.cpp index e1519db54d7..943f28fbb1c 100644 --- a/applications/plugins/SceneCreator/src/SceneCreator/SceneCreator.cpp +++ b/applications/plugins/SceneCreator/src/SceneCreator/SceneCreator.cpp @@ -21,6 +21,7 @@ ******************************************************************************/ #include "SceneCreator.h" #include +#include #include #include @@ -87,15 +88,15 @@ Node::SPtr createEulerSolverNode(Node::SPtr parent, const std::string& name, co if (scheme == "Explicit") { - simpleapi::createObject(parent, "RequiredPlugin", {{"name", "Sofa.Component.ODESolver.Forward"}}); + simpleapi::createObject(parent, "RequiredPlugin", {{"name", Sofa.Component.ODESolver.Forward}}); simpleapi::createObject(node, "EulerExplicitSolver", {{"name","Euler Explicit"}}); return node ; } if (scheme == "Implicit") { - simpleapi::createObject(parent, "RequiredPlugin", {{"name", "Sofa.Component.ODESolver.Backward"}}); - simpleapi::createObject(parent, "RequiredPlugin", {{"name", "Sofa.Component.LinearSolver.Iterative"}}); + simpleapi::createObject(parent, "RequiredPlugin", {{"name", Sofa.Component.ODESolver.Backward}}); + simpleapi::createObject(parent, "RequiredPlugin", {{"name", Sofa.Component.LinearSolver.Iterative}}); simpleapi::createObject(node, "EulerImplicitSolver", {{"name","Euler Implicit"}, {"rayleighStiffness","0.01"}, {"rayleighMass", "1.0"}}) ; @@ -109,8 +110,8 @@ Node::SPtr createEulerSolverNode(Node::SPtr parent, const std::string& name, co if (scheme == "Implicit_SparseLDL") { - simpleapi::createObject(parent, "RequiredPlugin", {{"name", "Sofa.Component.ODESolver.Backward"}}); - simpleapi::createObject(parent, "RequiredPlugin", {{"name", "Sofa.Component.LinearSolver.Direct"}}); + simpleapi::createObject(parent, "RequiredPlugin", {{"name", Sofa.Component.ODESolver.Backward}}); + simpleapi::createObject(parent, "RequiredPlugin", {{"name", Sofa.Component.LinearSolver.Direct}}); simpleapi::createObject(node, "EulerImplicitSolver", {{"name","Euler Implicit"}, {"rayleighStiffness","0.01"}, {"rayleighMass", "1.0"}}) ; diff --git a/applications/plugins/SensableEmulation/CMakeLists.txt b/applications/plugins/SensableEmulation/CMakeLists.txt deleted file mode 100644 index 33002d04038..00000000000 --- a/applications/plugins/SensableEmulation/CMakeLists.txt +++ /dev/null @@ -1,43 +0,0 @@ -cmake_minimum_required(VERSION 3.22) -project(SensableEmulation) - - -set(HEADER_FILES - OmniDriverEmu.h - config.h -) - -set(SOURCE_FILES - OmniDriverEmu.cpp - initSensableEmulation.cpp -) - -set(README_FILES PluginSensableEmulation.txt) - -find_package(Sofa.Config REQUIRED) -sofa_find_package(Sofa.Component.Haptics REQUIRED) -sofa_find_package(Sofa.Component.Controller REQUIRED) -sofa_find_package(Sofa.GL.Component.Rendering3D REQUIRED) -sofa_find_package(Boost COMPONENTS thread REQUIRED) - -include_directories(${Boost_INCLUDE_DIRS}) - -add_library(${PROJECT_NAME} SHARED ${HEADER_FILES} ${SOURCE_FILES} ${README_FILES}) -set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "-DSOFA_BUILD_SENSABLEEMULATIONPLUGIN") -target_link_libraries(${PROJECT_NAME} Sofa.Component.Haptics Sofa.Component.Controller Sofa.GL.Component.Rendering3D Boost::thread) - -include_directories("${CMAKE_CURRENT_SOURCE_DIR}/..") - -# Seems to be required by boost::asio -if(UNIX) - target_link_libraries(${PROJECT_NAME} pthread) -endif() - -install(TARGETS ${PROJECT_NAME} - COMPONENT SensableEmulation_libraries - EXPORT SensableEmulationTargets - RUNTIME DESTINATION bin - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib) - -install(DIRECTORY examples/ DESTINATION share/sofa/plugins/${PROJECT_NAME}) diff --git a/applications/plugins/SensableEmulation/NewOmniDriverEmu.cpp b/applications/plugins/SensableEmulation/NewOmniDriverEmu.cpp deleted file mode 100644 index 95c5d1065b5..00000000000 --- a/applications/plugins/SensableEmulation/NewOmniDriverEmu.cpp +++ /dev/null @@ -1,547 +0,0 @@ -/****************************************************************************** -* SOFA, Simulation Open-Framework Architecture * -* (c) 2006 INRIA, USTL, UJF, CNRS, MGH * -* * -* This program is free software; you can redistribute it and/or modify it * -* under the terms of the GNU Lesser General Public License as published by * -* the Free Software Foundation; either version 2.1 of the License, or (at * -* your option) any later version. * -* * -* This program is distributed in the hope that it will be useful, but WITHOUT * -* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * -* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * -* for more details. * -* * -* You should have received a copy of the GNU Lesser General Public License * -* along with this program. If not, see . * -******************************************************************************* -* Authors: The SOFA Team and external contributors (see Authors.txt) * -* * -* Contact information: contact@sofa-framework.org * -******************************************************************************/ - -#include "NewOmniDriverEmu.h" - -#include -#include -#include -// -////force feedback -#include -#include -// -#include -#include - -#include -// -#include -#include - -#include -#include -#include -#include -//sensable namespace -#include -#include - - - -double prevTime; - -namespace sofa -{ - -namespace component -{ - -namespace controller -{ - -using namespace sofa::defaulttype; -using namespace core::behavior; -using namespace sofa::defaulttype; - -NewOmniDriverEmu::NewOmniDriverEmu() - : forceScale(initData(&forceScale, 1.0, "forceScale","Default scaling factor applied to the force feedback")) - , scale(initData(&scale, 1.0, "scale","Default scale applied to the Phantom Coordinates. ")) - , positionBase(initData(&positionBase, Vec3d(0,0,0), "positionBase","Position of the interface base in the scene world coordinates")) - , orientationBase(initData(&orientationBase, Quat(0,0,0,1), "orientationBase","Orientation of the interface base in the scene world coordinates")) - , positionTool(initData(&positionTool, Vec3d(0,0,0), "positionTool","Position of the tool in the omni end effector frame")) - , orientationTool(initData(&orientationTool, Quat(0,0,0,1), "orientationTool","Orientation of the tool in the omni end effector frame")) - , permanent(initData(&permanent, false, "permanent" , "Apply the force feedback permanently")) - , omniVisu(initData(&omniVisu, false, "omniVisu", "Visualize the position of the interface in the virtual scene")) - , simuFreq(initData(&simuFreq, 1000, "simuFreq", "frequency of the \"simulated Omni\"")) - , simulateTranslation(initData(&simulateTranslation, false, "simulateTranslation", "do very naive \"translation simulation\" of omni, with constant orientation <0 0 0 1>")) - , trajPts(initData(&trajPts, "trajPoints","Trajectory positions")) - , trajTim(initData(&trajTim, "trajTiming","Trajectory timing")) - , visu_base(NULL) - , visu_end(NULL) -{ - - this->f_listening.setValue(true); - data.forceFeedback = new NullForceFeedback(); - noDevice = false; - moveOmniBase = false; - executeAsynchro = false; - omniSimThreadCreated = false; -} - -NewOmniDriverEmu::~NewOmniDriverEmu() -{ - if (visu_base) - { - delete visu_base; - } - if (visu_end) - { - delete visu_end; - } - -} - -void NewOmniDriverEmu::cleanup() -{ - sout << "NewOmniDriverEmu::cleanup()" << sendl; -} - -void NewOmniDriverEmu::init() -{ - std::cout << "[NewOmniEmu] init" << endl; -} - -void *hapticSimuExecute( void *ptr ) -{ - - NewOmniDriverEmu *omniDrv = (NewOmniDriverEmu*)ptr; - double timeScale = 1.0 / (double)CTime::getTicksPerSec(); - double startTime, endTime, totalTime, realTimePrev = -1.0, realTimeAct; - double requiredTime = 1.0/double(omniDrv->simuFreq.getValue()) * 1.0/timeScale; // [us] - double timeCorrection = 0.1 * requiredTime; - int timeToSleep; - - // construct the "trajectory" - NewOmniDriverEmu::VecCoord pts = omniDrv->trajPts.getValue(); - unsigned int numPts = pts.size(); - type::vector tmg = omniDrv->trajTim.getValue(); - unsigned int numSegs = tmg.size(); - double stepTime = 1.0/omniDrv->simuFreq.getValue(); - - if (numSegs != (2*numPts - 1)) - { - std::cerr << "Bad trajectory specification " << std::endl; - return(0); - } - NewOmniDriverEmu::VecCoord stepDiff; - type::vector stepNum; - - unsigned int seg = 0; - for (unsigned int np = 0; np < numPts; np++) - { - //for the point - unsigned int n = tmg[seg]*omniDrv->simuFreq.getValue(); - stepNum.push_back(n); - cout << "N pts = " << n << endl; - NewOmniDriverEmu::Coord crd; - cout << " adding " << crd << endl; - stepDiff.push_back(crd); - - //for the line - if (np < numPts-1) - { - seg++; - n = tmg[seg]*omniDrv->simuFreq.getValue(); - cout << "N lin = " << n << endl; - stepNum.push_back(n); - Vec3d dx = (pts[np+1].getCenter() - pts[np].getCenter())/double(n); - type::Quat dor; ///TODO difference for rotations!!! - NewOmniDriverEmu::Coord crd(dx, dor); - cout << "adding " << crd << endl; - stepDiff.push_back(crd); - } - seg++; - } - - std::cout << " stepNum = " << stepNum << std::endl; - std::cout << " stepDiff = " << stepDiff << std::endl; - - //trajectory done - - std::cout << "TimeScale = " << timeScale << std::endl; - - SolidTypes::SpatialVector temp1, temp2; - - long long unsigned asynchroStep=0; - double averageFreq = 0.0, minimalFreq=1e10; - - unsigned int actSeg = 0; - unsigned int actStep = 0; - - sofa::type::Quat actualRot; - sofa::type::Vec3d actualPos = pts[0].getCenter(); - - cout << "numSegs = " << numSegs << endl; - cout << "numSegs = " << numSegs << endl; - - while (true) - { - if (omniDrv->executeAsynchro) - { - startTime = double(omniDrv->thTimer->getTime()); - - //compute the actual position - if (actSeg < numSegs) - { - if (actStep < stepNum[actSeg]) - { - actualPos += stepDiff[actSeg].getCenter(); - //cout << "Adding [" << actStep << "] " << stepDiff[actSeg] << endl; - actStep++; - } - else - { - actStep=0; - actSeg++; - //cout << "Changing " << endl; - } - } - //else - // cout << "Finished" << endl; - - - omniDrv->data.servoDeviceData.pos = actualPos; - omniDrv->data.servoDeviceData.quat = actualRot; - SolidTypes::Transform baseOmni_H_endOmni(actualPos * omniDrv->data.scale, actualRot); - SolidTypes::Transform world_H_virtualTool = omniDrv->data.world_H_baseOmni * baseOmni_H_endOmni * omniDrv->data.endOmni_H_virtualTool; - - omniDrv->data.forceFeedback->computeWrench(world_H_virtualTool,temp1,temp2); - - realTimeAct = double(omniDrv->thTimer->getTime()); - if (asynchroStep > 0) - { - double realFreq = 1.0/( (realTimeAct - realTimePrev)*timeScale ); - averageFreq += realFreq; - //std::cout << "actual frequency = " << realFreq << std::endl; - if (realFreq < minimalFreq) - minimalFreq = realFreq; - - if ( ((asynchroStep+1) % 1000) == 0) - { - std::cout << "Average frequency of the loop = " << averageFreq/double(asynchroStep) << " Hz " << std::endl; - std::cout << "Minimal frequency of the loop = " << minimalFreq << " Hz " << std::endl; - } - } - - realTimePrev = realTimeAct; - asynchroStep++; - - endTime = double(omniDrv->thTimer->getTime()); //[s] - totalTime = (endTime - startTime); // [us] - timeToSleep = int( (requiredTime - totalTime) - timeCorrection); // [us] - if (timeToSleep > 0) - { - std::this_thread::sleep_for(std::chrono::microseconds(timeToSleep)); - } - else - { - std::cout << "Cannot achieve desired frequency, computation too slow: " << totalTime << std::endl; - } - - } - else - { - std::this_thread::sleep_for(std::chrono::milliseconds(10)); - } - } -} - -void NewOmniDriverEmu::bwdInit() -{ - sout<<"NewOmniDriverEmu::bwdInit() is called"<(this->getContext()); // access to current node - ForceFeedback *ff = context->getTreeObject(); - - data.forceFeedback = ff; - - setDataValue(); - - if (!omniSimThreadCreated) - { - sout << "Not initializing phantom, starting emulating thread..." << sendl; - pthread_t hapSimuThread; - - if (thTimer == NULL) - thTimer = new(CTime); - - if ( pthread_create( &hapSimuThread, NULL, hapticSimuExecute, (void*)this) == 0 ) - { - sout << "Thread created for Omni simulation" << sendl; - omniSimThreadCreated=true; - } - } - else - sout << "Emulating thread already running" << sendl; -} - - -void NewOmniDriverEmu::setDataValue() -{ - data.scale = scale.getValue(); - data.forceScale = forceScale.getValue(); - Quat q = orientationBase.getValue(); - q.normalize(); - orientationBase.setValue(q); - data.world_H_baseOmni.set( positionBase.getValue(), q ); - q=orientationTool.getValue(); - q.normalize(); - data.endOmni_H_virtualTool.set(positionTool.getValue(), q); - data.permanent_feedback = permanent.getValue(); -} - -void NewOmniDriverEmu::reset() -{ - std::cout<<"NewOmniDriver::reset() is called" <reinit(); -} - -void NewOmniDriverEmu::reinitVisual() -{ - cout << "NewOmniDriver::reinitVisual() is called " << endl; - if(visu_base!=NULL) - { - cout << "visu_base = " << visu_base << endl; - delete(visu_base); - visu_base = new sofa::component::visualmodel::OglModel(); - visu_base->fileMesh.setValue("mesh/omni_test2.obj"); - visu_base->m_scale.setValue(type::Vector3(scale.getValue(),scale.getValue(),scale.getValue())); - visu_end->setColor(1.0f,1.0f,1.0f,1.0f); - visu_base->init(); - visu_base->initVisual(); - visu_base->updateVisual(); - visu_base->applyRotation(orientationBase.getValue()); - visu_base->applyTranslation( positionBase.getValue()[0],positionBase.getValue()[1], positionBase.getValue()[2]); - - } - - if (visu_end != NULL) - { - //serr<<"create visual model for NewOmniDriver end"<m_scale.setValue(type::Vector3(scale.getValue(),scale.getValue(),scale.getValue())); - visu_end->setColor(1.0f,0.3f,0.0f,1.0f); - visu_end->init(); - visu_end->initVisual(); - visu_end->updateVisual(); - } - - -} - -void NewOmniDriverEmu::reinit() -{ - std::cout<<"NewOmniDriver::reinit() is called" <cleanup(); - this->bwdInit(); - this->reinitVisual(); - std::cout<<"NewOmniDriver::reinit() done" <getRigidX(); - // x_rigid->resize(1); - //(*x_rigid)[0].getOrientation() = q; - //(*x_rigid)[0].getCenter() = positionBase.getValue(); - //double s = - //this->scale=Vector3(this->) - -} - -void NewOmniDriverEmu::draw() -{ - //cout << "NewOmniDriver::draw is called" << endl; - if(omniVisu.getValue()) - { - if (visu_base == NULL) - { - cout << "Creating visu_base" << endl; - // create visual object - //serr<<"create visual model for NewOmniDriver base"<fileMesh.setValue("mesh/omni_test2.obj"); - visu_base->m_scale.setValue(type::Vector3(scale.getValue(),scale.getValue(),scale.getValue())); - visu_base->init(); - visu_base->initVisual(); - visu_base->updateVisual(); - visu_base->applyRotation(orientationBase.getValue()); - visu_base->applyTranslation( positionBase.getValue()[0],positionBase.getValue()[1], positionBase.getValue()[2]); - //getContext()->addObject(visu_base); - } - - - if (visu_end == NULL) - { - //serr<<"create visual model for NewOmniDriver end"<fileMesh.setValue("mesh/stylus.obj"); - visu_end->m_scale.setValue(type::Vector3(scale.getValue(),scale.getValue(),scale.getValue())); - visu_end->setColor(1.0f,0.3f,0.0f,1.0f); - visu_end->init(); - visu_end->initVisual(); - visu_end->updateVisual(); - } - - // compute position of the endOmni in worldframe - SolidTypes::Transform baseOmni_H_endOmni(data.deviceData.pos*data.scale, data.deviceData.quat); - SolidTypes::Transform world_H_endOmni = data.world_H_baseOmni * baseOmni_H_endOmni ; - - - visu_end->xforms.resize(1); - (visu_end->xforms)[0].getOrientation() = world_H_endOmni.getOrientation(); - (visu_end->xforms)[0].getCenter() = world_H_endOmni.getOrigin(); - - // draw the 2 visual models - visu_base->drawVisual(); - visu_end->drawVisual(); - } -} - -void NewOmniDriverEmu::copyDeviceDataCallback(OmniData *pUserData) -{ - OmniData *data = pUserData; // static_cast(pUserData); - memcpy(&data->deviceData, &data->servoDeviceData, sizeof(DeviceData)); - data->servoDeviceData.nupdates = 0; - data->servoDeviceData.ready = true; -} - -void NewOmniDriverEmu::stopCallback(OmniData *pUserData) -{ - OmniData *data = pUserData; // static_cast(pUserData); - data->servoDeviceData.stop = true; -} - -void NewOmniDriverEmu::onKeyPressedEvent(core::objectmodel::KeypressedEvent *kpe) -{ - - - -} - -void NewOmniDriverEmu::onKeyReleasedEvent(core::objectmodel::KeyreleasedEvent *kre) -{ - - //omniVisu.setValue(false); - -} - -void NewOmniDriverEmu::handleEvent(core::objectmodel::Event *event) -{ - - //std::cout<<"NewEvent detected !!"<(event)) - { - //getData(); // copy data->servoDeviceData to gDeviceData - //if (!simulateTranslation.getValue()) { - copyDeviceDataCallback(&data); - if (data.deviceData.ready) - { - cout << "Data ready, event" << endl; - data.deviceData.quat.normalize(); - //sout << "driver is working ! " << data->servoDeviceData.transform[12+0] << endl; - - - /// COMPUTATION OF THE vituralTool 6D POSITION IN THE World COORDINATES - SolidTypes::Transform baseOmni_H_endOmni(data.deviceData.pos*data.scale, data.deviceData.quat); - SolidTypes::Transform world_H_virtualTool = data.world_H_baseOmni * baseOmni_H_endOmni * data.endOmni_H_virtualTool; - - - // store actual position of interface for the forcefeedback (as it will be used as soon as new LCP will be computed) - data.forceFeedback->setReferencePosition(world_H_virtualTool); - - /// TODO : SHOULD INCLUDE VELOCITY !! - sofa::core::objectmodel::HapticDeviceEvent omniEvent(data.deviceData.id, world_H_virtualTool.getOrigin(), world_H_virtualTool.getOrientation() , data.deviceData.m_buttonState); - - this->getContext()->propagateEvent(sofa::core::ExecParams::defaultInstance(), &omniEvent); - - if (moveOmniBase) - { - std::cout<<" new positionBase = "<applyTranslation(positionBase_buf[0] - positionBase.getValue()[0], - positionBase_buf[1] - positionBase.getValue()[1], - positionBase_buf[2] - positionBase.getValue()[2]); - positionBase.setValue(positionBase_buf); - setDataValue(); - //this->reinitVisual(); - } - executeAsynchro=true; - } - else - std::cout<<"data not ready"<(event)) - { - core::objectmodel::KeypressedEvent *kpe = dynamic_cast(event); - if (kpe->getKey()=='Z' ||kpe->getKey()=='z' ) - { - moveOmniBase = !moveOmniBase; - std::cout<<"key z detected "<cleanup(); - positionBase_buf = positionBase.getValue(); - - } - else - { - this->reinit(); - } - } - - if(kpe->getKey()=='K' || kpe->getKey()=='k') - { - positionBase_buf.x()=0.0; - positionBase_buf.y()=0.5; - positionBase_buf.z()=2.6; - } - - if(kpe->getKey()=='L' || kpe->getKey()=='l') - { - positionBase_buf.x()=-0.15; - positionBase_buf.y()=1.5; - positionBase_buf.z()=2.6; - } - - if(kpe->getKey()=='M' || kpe->getKey()=='m') - { - positionBase_buf.x()=0.0; - positionBase_buf.y()=2.5; - positionBase_buf.z()=2.6; - } - - - - } -} - -int NewOmniDriverEmuClass = core::RegisterObject("Solver to test compliance computation for new articulated system objects") - .add< NewOmniDriverEmu >(); - -} // namespace controller - -} // namespace component - -} // namespace sofa diff --git a/applications/plugins/SensableEmulation/NewOmniDriverEmu.h b/applications/plugins/SensableEmulation/NewOmniDriverEmu.h deleted file mode 100644 index c12a68bec9d..00000000000 --- a/applications/plugins/SensableEmulation/NewOmniDriverEmu.h +++ /dev/null @@ -1,162 +0,0 @@ -/****************************************************************************** -* SOFA, Simulation Open-Framework Architecture * -* (c) 2006 INRIA, USTL, UJF, CNRS, MGH * -* * -* This program is free software; you can redistribute it and/or modify it * -* under the terms of the GNU Lesser General Public License as published by * -* the Free Software Foundation; either version 2.1 of the License, or (at * -* your option) any later version. * -* * -* This program is distributed in the hope that it will be useful, but WITHOUT * -* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * -* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * -* for more details. * -* * -* You should have received a copy of the GNU Lesser General Public License * -* along with this program. If not, see . * -******************************************************************************* -* Authors: The SOFA Team and external contributors (see Authors.txt) * -* * -* Contact information: contact@sofa-framework.org * -******************************************************************************/ -#ifndef SOFA_COMPONENT_CONTROLLER_OMNIEMU_H -#define SOFA_COMPONENT_CONTROLLER_OMNIEMU_H - -//Sensable include -#include -#include - -#include -#include -#include - -#include - -namespace sofa -{ -namespace simulation { class Node; } - -namespace component -{ -namespace visualModel { class OglModel; } - -namespace controller -{ - -class ForceFeedback; - - -using namespace sofa::defaulttype; -using namespace helper::system::thread; -using core::objectmodel::Data; - -/** Holds data retrieved from HDAPI. */ -typedef struct -{ - unsigned int id; - int nupdates; - int m_buttonState; /* Has the device button has been pressed. */ - //hduVector3Dd m_devicePosition; /* Current device coordinates. */ - //HDErrorInfo m_error; - Vec3d pos; - Quat quat; - bool ready; - bool stop; -} DeviceData; - -typedef struct -{ - ForceFeedback* forceFeedback; - simulation::Node *context; - - sofa::defaulttype::SolidTypes::Transform endOmni_H_virtualTool; - //Transform baseOmni_H_endOmni; - sofa::defaulttype::SolidTypes::Transform world_H_baseOmni; - double forceScale; - double scale; - bool permanent_feedback; - - // API OMNI // - DeviceData servoDeviceData; // for the haptic loop - DeviceData deviceData; // for the simulation loop - -} OmniData; - -/** -* Omni driver -*/ -class NewOmniDriverEmu : public Controller -{ - -public: - typedef Rigid3dTypes::Coord Coord; - typedef Rigid3dTypes::VecCoord VecCoord; - - SOFA_CLASS(NewOmniDriverEmu, Controller); - Data scale; ///< Default scale applied to the Phantom Coordinates. - Data forceScale; ///< Default scaling factor applied to the force feedback - Data simuFreq; ///< frequency of the "simulated Omni" - Data positionBase; ///< Position of the interface base in the scene world coordinates - Data orientationBase; ///< Orientation of the interface base in the scene world coordinates - Data positionTool; ///< Position of the tool in the omni end effector frame - Data orientationTool; ///< Orientation of the tool in the omni end effector frame - Data permanent; ///< Apply the force feedback permanently - Data omniVisu; ///< Visualize the position of the interface in the virtual scene - Data simulateTranslation; ///< do very naive "translation simulation" of omni, with constant orientation <0 0 0 1> - - OmniData data; - - - NewOmniDriverEmu(); - virtual ~NewOmniDriverEmu(); - - virtual void init(); - virtual void bwdInit(); - virtual void reset(); - void reinit(); - - int initDevice(OmniData& data); - - void cleanup(); - virtual void draw(); - - void onKeyPressedEvent(core::objectmodel::KeypressedEvent *); - void onKeyReleasedEvent(core::objectmodel::KeyreleasedEvent *); - - void setDataValue(); - void reinitVisual(); - - bool afterFirstStep; - SolidTypes::Transform prevPosition; - - //neede for "omni simulation" - CTime *thTimer; - double lastStep; - bool executeAsynchro; - Data trajPts; ///< Trajectory positions - Data > trajTim; ///< Trajectory timing - -private: - void handleEvent(core::objectmodel::Event *); - void copyDeviceDataCallback(OmniData *pUserData); - void stopCallback(OmniData *pUserData); - sofa::component::visualmodel::OglModel *visu_base, *visu_end; - bool noDevice; - - bool moveOmniBase; - Vec3d positionBase_buf; - bool omniSimThreadCreated; - - - - -}; - - -} // namespace controller - -} // namespace component - -} // namespace sofa - -#endif // SOFA_COMPONENT_CONTROLLER_OMNIEMU_H diff --git a/applications/plugins/SensableEmulation/OmniDriverEmu.cpp b/applications/plugins/SensableEmulation/OmniDriverEmu.cpp deleted file mode 100644 index cbfe2cfd3bc..00000000000 --- a/applications/plugins/SensableEmulation/OmniDriverEmu.cpp +++ /dev/null @@ -1,589 +0,0 @@ -/****************************************************************************** -* SOFA, Simulation Open-Framework Architecture * -* (c) 2006 INRIA, USTL, UJF, CNRS, MGH * -* * -* This program is free software; you can redistribute it and/or modify it * -* under the terms of the GNU Lesser General Public License as published by * -* the Free Software Foundation; either version 2.1 of the License, or (at * -* your option) any later version. * -* * -* This program is distributed in the hope that it will be useful, but WITHOUT * -* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * -* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * -* for more details. * -* * -* You should have received a copy of the GNU Lesser General Public License * -* along with this program. If not, see . * -******************************************************************************* -* Authors: The SOFA Team and external contributors (see Authors.txt) * -* * -* Contact information: contact@sofa-framework.org * -******************************************************************************/ - -#include "OmniDriverEmu.h" - -#include -#include -#include - -#include - -////force feedback -#include -#include - -#include -#include - -#include -#include - -#include -#include - -#include -#include -#include - -#include - -#include - -#include -using sofa::simulation::mechanicalvisitor::MechanicalPropagateOnlyPositionAndVelocityVisitor; - -#include - -namespace sofa -{ - -namespace component -{ - -namespace controller -{ - -using namespace sofa::type; -using namespace sofa::defaulttype; -using namespace core::behavior; -using type::vector; - -OmniDriverEmu::OmniDriverEmu() - : forceScale(initData(&forceScale, 1.0, "forceScale","Default scaling factor applied to the force feedback")) - , scale(initData(&scale, 1.0, "scale","Default scale applied to the Phantom Coordinates. ")) - , positionBase(initData(&positionBase, Vec3d(0,0,0), "positionBase","Position of the interface base in the scene world coordinates")) - , orientationBase(initData(&orientationBase, Quat(0,0,0,1), "orientationBase","Orientation of the interface base in the scene world coordinates")) - , positionTool(initData(&positionTool, Vec3d(0,0,0), "positionTool","Position of the tool in the omni end effector frame")) - , orientationTool(initData(&orientationTool, Quat(0,0,0,1), "orientationTool","Orientation of the tool in the omni end effector frame")) - , permanent(initData(&permanent, false, "permanent" , "Apply the force feedback permanently")) - , omniVisu(initData(&omniVisu, false, "omniVisu", "Visualize the position of the interface in the virtual scene")) - , simuFreq(initData(&simuFreq, 1000, "simuFreq", "frequency of the \"simulated Omni\"")) - , simulateTranslation(initData(&simulateTranslation, false, "simulateTranslation", "do very naive \"translation simulation\" of omni, with constant orientation <0 0 0 1>")) - , thTimer(nullptr) - , trajPts(initData(&trajPts, "trajPoints","Trajectory positions")) - , trajTim(initData(&trajTim, "trajTiming","Trajectory timing")) - , visu_base(nullptr) - , visu_end(nullptr) - , currentToolIndex(0) - , isToolControlled(true) -{ - this->f_listening.setValue(true); - noDevice = false; - moveOmniBase = false; - executeAsynchro = false; - omniSimThreadCreated = false; - m_terminate = true; -} - - -OmniDriverEmu::~OmniDriverEmu() -{ - if (thTimer != nullptr) - delete thTimer; -} - - -void OmniDriverEmu::setForceFeedbacks(vector ffs) -{ - data.forceFeedbacks.clear(); - for (unsigned int i=0; i *> (this->getContext()->getMechanicalState()); - if (!mState) - msg_warning() << "OmniDriverEmu has no binding MechanicalState."; - else - msg_info() << "[Omni] init" ; - - if(mState->getSize()resize(toolCount.getValue()); -} - - -/** - function that is used to emulate a haptic device by interpolating the position of the tool between several points. -*/ -void hapticSimuExecute(std::atomic& terminate, void *ptr ) -{ - assert(ptr!=nullptr); - - // Initialization - OmniDriverEmu *omniDrv = static_cast(ptr); - - // Init the "trajectory" data - OmniDriverEmu::VecCoord pts = omniDrv->trajPts.getValue(); //sets of points use for interpolation - type::vector tmg = omniDrv->trajTim.getValue(); //sets of "key time" for interpolation - - if (pts.empty()) - { - msg_error(omniDrv) << "Bad trajectory specification : there are no points for interpolation. "; - return; - } - - // Add a first point ( 0 0 0 0 0 0 1 ) if the first "key time" is not 0 - if (sofa::helper::isEqual(tmg[0], 0.0)) - { - pts.insert(pts.begin(), OmniDriverEmu::Coord()); - tmg.insert(tmg.begin(), 0); - } - - size_t numPts = pts.size(); - size_t numSegs = tmg.size(); - - // test if "trajectory" data are correct - if (numSegs != numPts) - { - msg_error(omniDrv) << "Bad trajectory specification : the number of trajectory timing does not match the number of trajectory points. "; - return; - } - - type::vector< unsigned int > stepNum; - // Init the Step list - for (unsigned int i = 0; i < numPts; i++) - { - stepNum.push_back(tmg[i] * omniDrv->simuFreq.getValue()); - } - - // Init data for interpolation. - SolidTypes::SpatialVector temp1, temp2; - long long unsigned asynchroStep=0; - double averageFreq = 0.0, minimalFreq=1e10; - unsigned int actSeg = 0; - unsigned int actStep = 0; - sofa::type::Quat actualRot; - sofa::type::Vec3d actualPos = pts[0].getCenter(); - - double timeScale = 1.0 / (double)helper::system::thread::CTime::getTicksPerSec(); - double startTime, endTime, totalTime, realTimePrev = -1.0, realTimeAct; - double requiredTime = 1.0 / (double)omniDrv->simuFreq.getValue() * 1.0 / timeScale; - double timeCorrection = 0.1 * requiredTime; - int timeToSleep; - - int oneTimeMessage = 0; - // loop that updates the position tool. - while (!terminate) - { - if (omniDrv->executeAsynchro) - { - if (oneTimeMessage == 1) - { - oneTimeMessage = 0; - } - - startTime = double(omniDrv->thTimer->getTime()); - - // compute the new position and orientataion - if (actSeg < numSegs) - { - - if (actSeg > 0 && actStep < stepNum[actSeg]) - { - - //compute the coeff for interpolation - double t = ((double)(actStep-stepNum[actSeg-1]))/((double)(stepNum[actSeg]-stepNum[actSeg-1])); - - //compute the actual position - actualPos = (pts[actSeg-1].getCenter())*(1-t)+(pts[actSeg].getCenter())*t; - - //compute the actual orientation - actualRot.slerp(pts[actSeg-1].getOrientation(),pts[actSeg].getOrientation(),t,true); - - actStep++; - } - else - { - actualPos = pts[actSeg].getCenter(); - actualRot = pts[actSeg].getOrientation(); - actSeg++; - } - } - else - { - msg_info(omniDrv) << "End of the movement!" ; - return; - } - - // Update the position of the tool - omniDrv->data.servoDeviceData.pos = actualPos; - omniDrv->data.servoDeviceData.quat = actualRot; - SolidTypes::Transform baseOmni_H_endOmni(actualPos * omniDrv->data.scale, actualRot); - SolidTypes::Transform world_H_virtualTool = omniDrv->data.world_H_baseOmni * baseOmni_H_endOmni * omniDrv->data.endOmni_H_virtualTool; - - // transmit the position of the tool to the force feedback - omniDrv->data.forceFeedbackIndice= omniDrv->getCurrentToolIndex(); - // store actual position of interface for the forcefeedback (as it will be used as soon as new LCP will be computed) - for (unsigned int i=0; idata.forceFeedbacks.size(); i++) - { - if (omniDrv->data.forceFeedbacks[i]->d_indice.getValue()==omniDrv->data.forceFeedbackIndice) - { - omniDrv->data.forceFeedbacks[i]->computeWrench(world_H_virtualTool,temp1,temp2); - } - } - - realTimeAct = double(omniDrv->thTimer->getTime()); - - if (asynchroStep > 0) - { - double realFreq = 1.0/( (realTimeAct - realTimePrev)*timeScale ); - averageFreq += realFreq; - if (realFreq < minimalFreq) - minimalFreq = realFreq; - - if ( ((asynchroStep+1) % 1000) == 0) - { - msg_info(omniDrv) << "Average frequency of the loop = " << averageFreq/double(asynchroStep) << " Hz " - << "Minimal frequency of the loop = " << minimalFreq << " Hz " ; - } - } - - realTimePrev = realTimeAct; - asynchroStep++; - - endTime = (double)omniDrv->thTimer->getTime(); //[s] - totalTime = (endTime - startTime); // [us] - timeToSleep = int( ((requiredTime - totalTime) - timeCorrection) ); // [us] - - if (timeToSleep > 0) - { - std::this_thread::sleep_for(std::chrono::seconds(int(timeToSleep * timeScale))); - } - else - { - msg_info(omniDrv) << "Cannot achieve desired frequency, computation too slow : " << totalTime * timeScale << " seconds for last iteration."; - } - } - else - { - if (oneTimeMessage == 0) - { - msg_info(omniDrv) << "Running Asynchro without action" ; - oneTimeMessage = 1; - } - - std::this_thread::sleep_for(std::chrono::milliseconds(10)); - } - } -} - -void OmniDriverEmu::bwdInit() -{ - msg_info()<<"OmniDriverEmu::bwdInit() is called"; - sofa::simulation::Node *context = dynamic_cast(this->getContext()); // access to current node - - // depending on toolCount, search either the first force feedback, or the feedback with indice "0" - sofa::simulation::Node *groot = dynamic_cast(context->getRootContext()); // access to current node - - vector ffs; - groot->getTreeObjects(&ffs); - msg_info() << "OmniDriver: "<m_terminate), this); - setOmniSimThreadCreated(true); - msg_info() << "OmniDriver : Thread created for Omni simulation."; -} - - -void OmniDriverEmu::setDataValue() -{ - data.forceFeedbackIndice=0; - data.scale = scale.getValue(); - data.forceScale = forceScale.getValue(); - Quat q = orientationBase.getValue(); - q.normalize(); - orientationBase.setValue(q); - data.world_H_baseOmni.set( positionBase.getValue(), q ); - q=orientationTool.getValue(); - q.normalize(); - data.endOmni_H_virtualTool.set(positionTool.getValue(), q); - data.permanent_feedback = permanent.getValue(); -} - -void OmniDriverEmu::reinit() -{ - msg_info()<<"OmniDriverEmu::reinit() is called"; - this->cleanup(); - this->bwdInit(); - msg_info()<<"OmniDriverEmu::reinit() done"; -} - -void OmniDriverEmu::draw(const core::visual::VisualParams *) -{ - using sofa::gl::component::rendering3d::OglModel; - if(omniVisu.getValue()) - { - static bool isInited=false; - if(!isInited) - { - // compute position of the endOmni in worldframe - defaulttype::SolidTypes::Transform baseOmni_H_endOmni(data.deviceData.pos*data.scale, data.deviceData.quat); - defaulttype::SolidTypes::Transform world_H_endOmni = data.world_H_baseOmni * baseOmni_H_endOmni ; - - visu_base = sofa::core::objectmodel::New(); - visu_base->d_fileMesh.setValue("mesh/omni_test2.obj"); - visu_base->d_scale.setValue(type::Vec3(scale.getValue(),scale.getValue(),scale.getValue())); - visu_base->setColor(1.0f,1.0f,1.0f,1.0f); - visu_base->init(); - visu_base->initVisual(sofa::core::visual::visualparams::defaultInstance()); - visu_base->updateVisual(sofa::core::visual::visualparams::defaultInstance()); - visu_base->applyRotation(orientationBase.getValue()); - visu_base->applyTranslation( positionBase.getValue()[0],positionBase.getValue()[1], positionBase.getValue()[2]); - - visu_end = sofa::core::objectmodel::New(); - visu_end->d_fileMesh.setValue("mesh/stylus.obj"); - visu_end->d_scale.setValue(type::Vec3(scale.getValue(),scale.getValue(),scale.getValue())); - visu_end->setColor(1.0f,0.3f,0.0f,1.0f); - visu_end->init(); - visu_end->initVisual(sofa::core::visual::visualparams::defaultInstance()); - visu_end->updateVisual(sofa::core::visual::visualparams::defaultInstance()); - visu_end->applyRotation(world_H_endOmni.getOrientation()); - visu_end->applyTranslation(world_H_endOmni.getOrigin()[0],world_H_endOmni.getOrigin()[1],world_H_endOmni.getOrigin()[2]); - isInited=true; - } - - // draw the 2 visual models - visu_base->doDrawVisual(sofa::core::visual::VisualParams::defaultInstance()); - visu_end->doDrawVisual(sofa::core::visual::VisualParams::defaultInstance()); - } -} - -void OmniDriverEmu::copyDeviceDataCallback(OmniData *pUserData) -{ - OmniData *data = pUserData; - memcpy(&data->deviceData, &data->servoDeviceData, sizeof(DeviceData)); - data->servoDeviceData.ready = true; - data->servoDeviceData.nupdates = 0; -} - -void OmniDriverEmu::stopCallback(OmniData *pUserData) -{ - OmniData *data = pUserData; - data->servoDeviceData.stop = true; -} - -void OmniDriverEmu::handleEvent(core::objectmodel::Event *event) -{ - if (dynamic_cast(event)) - { - msg_info() << "Test handle event "; - - copyDeviceDataCallback(&data); - - msg_info() << data.deviceData.ready; - - if (data.deviceData.ready) - { - msg_info() << "Data ready, event 2"; - - data.deviceData.quat.normalize(); - - if (isToolControlled) // ignore haptic device if tool is unselected - { - /// COMPUTATION OF THE vituralTool 6D POSITION IN THE World COORDINATES - SolidTypes< double >::Transform baseOmni_H_endOmni(data.deviceData.pos*data.scale, data.deviceData.quat); - SolidTypes< double >::Transform world_H_virtualTool = data.world_H_baseOmni * baseOmni_H_endOmni * data.endOmni_H_virtualTool; - - //---------------------------- - data.forceFeedbackIndice=currentToolIndex; - // store actual position of interface for the forcefeedback (as it will be used as soon as new LCP will be computed) - //data.forceFeedback->setReferencePosition(world_H_virtualTool); - for (unsigned int i=0; id_indice.getValue()==data.forceFeedbackIndice) - data.forceFeedbacks[i]->setReferencePosition(world_H_virtualTool); - - //----------------------------- - //TODO : SHOULD INCLUDE VELOCITY !! - //sofa::core::objectmodel::HapticDeviceEvent omniEvent(data.deviceData.id, world_H_virtualTool.getOrigin(), world_H_virtualTool.getOrientation() , data.deviceData.m_buttonState); - //this->getContext()->propagateEvent(sofa::core::ExecParams::defaultInstance(), &omniEvent); - helper::WriteAccessor > > > x = *this->mState->write(core::VecCoordId::position()); - this->getContext()->getMechanicalState()->vRealloc( sofa::core::MechanicalParams::defaultInstance(), core::VecCoordId::freePosition() ); // freePosition is not allocated by default - helper::WriteAccessor > > > xfree = *this->mState->write(core::VecCoordId::freePosition()); - - /// FIX : check if the mechanical state is empty, if true, resize it - /// otherwise: crash when accessing xfree[] and x[] - if(xfree.size() == 0) - xfree.resize(1); - if(x.size() == 0) - x.resize(1); - - if((size_t)currentToolIndex >= xfree.size() || (size_t)currentToolIndex >= x.size()) - msg_warning()<<"currentToolIndex exceed the size of xfree/x vectors"; - else - { - xfree[currentToolIndex].getCenter() = world_H_virtualTool.getOrigin(); - x[currentToolIndex].getCenter() = world_H_virtualTool.getOrigin(); - - xfree[currentToolIndex].getOrientation() = world_H_virtualTool.getOrientation(); - x[currentToolIndex].getOrientation() = world_H_virtualTool.getOrientation(); - } - - sofa::simulation::Node *node = dynamic_cast (this->getContext()); - if (node != nullptr) - { - MechanicalPropagateOnlyPositionAndVelocityVisitor mechaVisitor(sofa::core::MechanicalParams::defaultInstance()); mechaVisitor.execute(node); - sofa::simulation::UpdateMappingVisitor updateVisitor(sofa::core::ExecParams::defaultInstance()); updateVisitor.execute(node); - } - } - else - { - data.forceFeedbackIndice = -1; - } - - if (moveOmniBase) - { - msg_info()<<" new positionBase = "<applyTranslation(positionBase_buf[0]-positionBase.getValue()[0], - positionBase_buf[1]-positionBase.getValue()[1], - positionBase_buf[2]-positionBase.getValue()[2]); - positionBase.setValue(positionBase_buf); - setDataValue(); - } - - executeAsynchro = true; - } - else - msg_info()<<"data not ready"; - } - - if (dynamic_cast(event)) - { - core::objectmodel::KeypressedEvent *kpe = dynamic_cast(event); - if (kpe->getKey()=='Z' ||kpe->getKey()=='z' ) - { - moveOmniBase = !moveOmniBase; - msg_info()<<"key z detected "; - omniVisu.setValue(moveOmniBase); - - if(moveOmniBase) - { - this->cleanup(); - positionBase_buf = positionBase.getValue(); - } - else - { - this->reinit(); - } - } - - if(kpe->getKey()=='K' || kpe->getKey()=='k') - { - positionBase_buf.x()=0.0; - positionBase_buf.y()=0.5; - positionBase_buf.z()=2.6; - } - - if(kpe->getKey()=='L' || kpe->getKey()=='l') - { - positionBase_buf.x()=-0.15; - positionBase_buf.y()=1.5; - positionBase_buf.z()=2.6; - } - - if(kpe->getKey()=='M' || kpe->getKey()=='m') - { - positionBase_buf.x()=0.0; - positionBase_buf.y()=2.5; - positionBase_buf.z()=2.6; - } - - // emulated haptic buttons B=btn1, N=btn2 - if (kpe->getKey()=='H' || kpe->getKey()=='h') - { - msg_info() << "emulated button 1 pressed"; - Vec3 dummyVector; - Quat dummyQuat; - sofa::core::objectmodel::HapticDeviceEvent event(currentToolIndex,dummyVector,dummyQuat, - sofa::core::objectmodel::HapticDeviceEvent::Button1StateMask); - sofa::simulation::Node *groot = dynamic_cast(getContext()->getRootContext()); // access to current node - groot->propagateEvent(core::ExecParams::defaultInstance(), &event); - } - if (kpe->getKey()=='J' || kpe->getKey()=='j') - { - std::cout << "emulated button 2 pressed" << std::endl; - Vec3 dummyVector; - Quat dummyQuat; - sofa::core::objectmodel::HapticDeviceEvent event(currentToolIndex,dummyVector,dummyQuat, - sofa::core::objectmodel::HapticDeviceEvent::Button2StateMask); - sofa::simulation::Node *groot = dynamic_cast(getContext()->getRootContext()); // access to current node - groot->propagateEvent(core::ExecParams::defaultInstance(), &event); - } - - } - if (dynamic_cast(event)) - { - core::objectmodel::KeyreleasedEvent *kre = dynamic_cast(event); - // emulated haptic buttons B=btn1, N=btn2 - if (kre->getKey()=='H' || kre->getKey()=='h' - || kre->getKey()=='J' || kre->getKey()=='j') - { - msg_info() << "emulated button released" ; - Vec3 dummyVector; - Quat dummyQuat; - sofa::core::objectmodel::HapticDeviceEvent event(currentToolIndex,dummyVector,dummyQuat,0); - sofa::simulation::Node *groot = dynamic_cast(getContext()->getRootContext()); // access to current node - groot->propagateEvent(core::ExecParams::defaultInstance(), &event); - } - } -} - - -static int OmniDriverEmuClass = core::RegisterObject("Solver to test compliance computation for new articulated system objects") - .add< OmniDriverEmu >(); - -} // namespace controller - -} // namespace component - -} // namespace sofa diff --git a/applications/plugins/SensableEmulation/OmniDriverEmu.h b/applications/plugins/SensableEmulation/OmniDriverEmu.h deleted file mode 100644 index 0590808fa47..00000000000 --- a/applications/plugins/SensableEmulation/OmniDriverEmu.h +++ /dev/null @@ -1,173 +0,0 @@ -/****************************************************************************** -* SOFA, Simulation Open-Framework Architecture * -* (c) 2006 INRIA, USTL, UJF, CNRS, MGH * -* * -* This program is free software; you can redistribute it and/or modify it * -* under the terms of the GNU Lesser General Public License as published by * -* the Free Software Foundation; either version 2.1 of the License, or (at * -* your option) any later version. * -* * -* This program is distributed in the hope that it will be useful, but WITHOUT * -* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * -* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * -* for more details. * -* * -* You should have received a copy of the GNU Lesser General Public License * -* along with this program. If not, see . * -******************************************************************************* -* Authors: The SOFA Team and external contributors (see Authors.txt) * -* * -* Contact information: contact@sofa-framework.org * -******************************************************************************/ -#ifndef SOFA_COMPONENT_CONTROLLER_OMNIEMU_H -#define SOFA_COMPONENT_CONTROLLER_OMNIEMU_H - -#include -#include -#include - -#include - -#include -#include - -#include -#include -#include -#include - -namespace sofa::gl::component::rendering3d -{ - class OglModel; - -} // namespace sofa::gl::component::rendering3d - -namespace sofa::component::haptics -{ - class ForceFeedback; -} - -namespace sofa::component::controller -{ - -/** Holds data retrieved from HDAPI. */ -typedef struct -{ - int nupdates; - int m_buttonState; /* Has the device button has been pressed. */ - type::Vec3d pos; - type::Quat quat; - bool ready; - bool stop; -} DeviceData; - -typedef struct -{ - type::vector forceFeedbacks; - int forceFeedbackIndice; - simulation::Node *context; - - sofa::defaulttype::SolidTypes::Transform endOmni_H_virtualTool; - sofa::defaulttype::SolidTypes::Transform world_H_baseOmni; - double forceScale; - double scale; - bool permanent_feedback; - - // API OMNI // - DeviceData servoDeviceData; // for the haptic loop - DeviceData deviceData; // for the simulation loop - -} OmniData; - -/** -* Omni driver emulator you can add to your scene. -* -* Controller's actions: -* key z: reset to base position -* key k, l, m: move base position -* key h: emulate button 1 press/release -* key i: emulate button 2 press/release -*/ -class SOFA_SENSABLEEMUPLUGIN_API OmniDriverEmu : public Controller -{ - -public: - typedef defaulttype::Rigid3dTypes::Coord Coord; - typedef defaulttype::Rigid3dTypes::VecCoord VecCoord; - - using Vec3d = sofa::type::Vec3d; - using Quat = sofa::type::Quat; - - SOFA_CLASS(OmniDriverEmu, Controller); - Data forceScale; ///< Default scaling factor applied to the force feedback - Data scale; ///< Default scale applied to the Phantom Coordinates. - Data positionBase; ///< Position of the interface base in the scene world coordinates - Data orientationBase; ///< Orientation of the interface base in the scene world coordinates - Data positionTool; ///< Position of the tool in the omni end effector frame - Data orientationTool; ///< Orientation of the tool in the omni end effector frame - Data permanent; ///< Apply the force feedback permanently - Data omniVisu; ///< Visualize the position of the interface in the virtual scene - Data simuFreq; ///< frequency of the "simulated Omni" - Data simulateTranslation; ///< do very naive "translation simulation" of omni, with constant orientation <0 0 0 1> - Data toolSelector; - Data toolCount; - - OmniData data; - - OmniDriverEmu(); - ~OmniDriverEmu() override; - - void init() override; - void bwdInit() override; - void reinit() override; - void cleanup() override; - void draw(const core::visual::VisualParams*) override; - - int initDevice(OmniData& data); - void setForceFeedbacks(type::vector ffs); - - void setDataValue(); - - void setOmniSimThreadCreated(bool b) { omniSimThreadCreated = b;} - - bool afterFirstStep; - defaulttype::SolidTypes::Transform prevPosition; - - //need for "omni simulation" - helper::system::thread::CTime *thTimer; - - /// Thread object - std::thread hapSimuThread; - - /// Bool to notify thread to stop work - std::atomic m_terminate; - - double lastStep; - bool executeAsynchro; - Data trajPts; ///< Trajectory positions - Data > trajTim; ///< Trajectory timing - - int getCurrentToolIndex() { return currentToolIndex;} - void handleEvent(core::objectmodel::Event *) override ; - -private: - - void copyDeviceDataCallback(OmniData *pUserData); - void stopCallback(OmniData *pUserData); - gl::component::rendering3d::OglModel::SPtr visu_base, visu_end; - bool noDevice; - - bool moveOmniBase; - Vec3d positionBase_buf; - - core::behavior::MechanicalState *mState; ///< Controlled MechanicalState. - - bool omniSimThreadCreated; - int currentToolIndex; - bool isToolControlled; -}; - - -} // namespace sofa::component::controller - -#endif // SOFA_COMPONENT_CONTROLLER_OMNIEMU_H diff --git a/applications/plugins/SensableEmulation/PluginSensableEmulation.txt b/applications/plugins/SensableEmulation/PluginSensableEmulation.txt deleted file mode 100644 index befe3d9bc7b..00000000000 --- a/applications/plugins/SensableEmulation/PluginSensableEmulation.txt +++ /dev/null @@ -1,10 +0,0 @@ -************************************ -* SensableEmulation.txt * -************************************ -AUTHOR : - - C.Duriez - -LICENCE : - - None - -OTHER COMMENTS : diff --git a/applications/plugins/SensableEmulation/examples/SimpleBox-Method2.scn b/applications/plugins/SensableEmulation/examples/SimpleBox-Method2.scn deleted file mode 100644 index becbb2480b0..00000000000 --- a/applications/plugins/SensableEmulation/examples/SimpleBox-Method2.scn +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/applications/plugins/SensableEmulation/examples/SimpleBox-Method2.scn.view b/applications/plugins/SensableEmulation/examples/SimpleBox-Method2.scn.view deleted file mode 100644 index 97e71316b4f..00000000000 --- a/applications/plugins/SensableEmulation/examples/SimpleBox-Method2.scn.view +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/applications/plugins/SensableEmulation/examples/data/mesh/box.obj b/applications/plugins/SensableEmulation/examples/data/mesh/box.obj deleted file mode 100644 index 439b773295b..00000000000 --- a/applications/plugins/SensableEmulation/examples/data/mesh/box.obj +++ /dev/null @@ -1,20 +0,0 @@ -# Blender v2.68 (sub 0) OBJ File: '' -# www.blender.org -mtllib box.mtl -o Cube -v 1.000000 -1.000000 -1.000000 -v 1.000000 -1.000000 1.000000 -v -1.000000 -1.000000 1.000000 -v -1.000000 -1.000000 -1.000000 -v 1.000000 1.000000 -0.999999 -v 0.999999 1.000000 1.000001 -v -1.000000 1.000000 1.000000 -v -1.000000 1.000000 -1.000000 -usemtl Material -s off -f 1 2 3 4 -f 5 8 7 6 -f 1 5 6 2 -f 2 6 7 3 -f 3 7 8 4 -f 5 1 4 8 diff --git a/applications/plugins/SensableEmulation/examples/data/mesh/dental_instrument.obj b/applications/plugins/SensableEmulation/examples/data/mesh/dental_instrument.obj deleted file mode 100644 index 358faf79ad5..00000000000 --- a/applications/plugins/SensableEmulation/examples/data/mesh/dental_instrument.obj +++ /dev/null @@ -1,1194 +0,0 @@ -#### -# -# OBJ File Generated by LightWave3D -# LightWave3D OBJ Export v2.3 -# -#### -o dental_instrument.obj -mtllib dental_instrument.mtl -g default -v 0.020625 0.0233891 2.71688 -v 0.0350288 0.0174173 2.71666 -v 0.0409951 0.003 2.71656 -v 0.0350288 -0.0114173 2.71666 -v 0.020625 -0.0173891 2.71688 -v 0.00622117 -0.0114173 2.71709 -v 0.00025491 0.003 2.71719 -v 0.00622117 0.0174173 2.71709 -v 0.027375 0.0233891 2.85037 -v 0.0416982 0.0174173 2.84884 -v 0.0476311 0.003 2.8482 -v 0.0416982 -0.0114173 2.84884 -v 0.027375 -0.0173891 2.85037 -v 0.0130518 -0.0114173 2.85191 -v 0.00711889 0.003 2.85255 -v 0.0130518 0.0174173 2.85191 -v 0.051625 0.0233891 3.00175 -v 0.065948 0.0174173 3.00024 -v 0.0718807 0.003 2.99962 -v 0.065948 -0.0114173 3.00024 -v 0.051625 -0.0173891 3.00175 -v 0.037302 -0.0114173 3.00326 -v 0.0313693 0.003 3.00388 -v 0.037302 0.0174173 3.00326 -v 0.089375 0.0233891 3.193 -v 0.103764 0.0174173 3.19319 -v 0.109724 0.003 3.19327 -v 0.103764 -0.0114173 3.19319 -v 0.089375 -0.0173891 3.193 -v 0.0749862 -0.0114173 3.19281 -v 0.0690262 0.003 3.19273 -v 0.0749862 0.0174173 3.19281 -v 0.10075 0.0233891 3.285 -v 0.114998 0.0174173 3.28691 -v 0.1209 0.003 3.2877 -v 0.114998 -0.0114173 3.28691 -v 0.10075 -0.0173891 3.285 -v 0.0865018 -0.0114173 3.28309 -v 0.0806 0.003 3.2823 -v 0.0865018 0.0174173 3.28309 -v 0.09775 0.0233891 3.35875 -v 0.111383 0.0174173 3.36321 -v 0.11703 0.003 3.36506 -v 0.111383 -0.0114173 3.36321 -v 0.09775 -0.0173891 3.35875 -v 0.0841168 -0.0114173 3.35429 -v 0.0784698 0.003 3.35244 -v 0.0841168 0.0174173 3.35429 -v 0.077 0.0233891 3.42925 -v 0.0893074 0.0174173 3.43653 -v 0.0944051 0.003 3.43955 -v 0.0893074 -0.0114173 3.43653 -v 0.077 -0.0173891 3.42925 -v 0.0646926 -0.0114173 3.42197 -v 0.0595949 0.003 3.41895 -v 0.0646926 0.0174173 3.42197 -v 0.0335 0.0233891 3.48675 -v 0.0431682 0.0174173 3.49721 -v 0.0471728 0.003 3.50154 -v 0.0431682 -0.0114173 3.49721 -v 0.0335 -0.0173891 3.48675 -v 0.0238318 -0.0114173 3.47629 -v 0.0198272 0.003 3.47196 -v 0.0238318 0.0174173 3.47629 -v -0.029 0.0233891 3.5265 -v -0.0229674 0.0174173 3.53945 -v -0.0204688 0.003 3.54482 -v -0.0229674 -0.0114173 3.53945 -v -0.029 -0.0173891 3.5265 -v -0.0350326 -0.0114173 3.51355 -v -0.0375312 0.003 3.50818 -v -0.0350326 0.0174173 3.51355 -v -0.10025 0.0229813 3.5475 -v -0.0970845 0.0171289 3.5612 -v -0.0957734 0.003 3.56687 -v -0.0970845 -0.0111289 3.5612 -v -0.10025 -0.0169813 3.5475 -v -0.103415 -0.0111289 3.5338 -v -0.104727 0.003 3.52813 -v -0.103415 0.0171289 3.5338 -v -0.1735 0.0192929 3.556 -v -0.173106 0.0145208 3.56747 -v -0.172942 0.003 3.57223 -v -0.173106 -0.00852083 3.56747 -v -0.1735 -0.0132929 3.556 -v -0.173894 -0.00852083 3.54452 -v -0.174058 0.003 3.53977 -v -0.173894 0.0145208 3.54452 -v -0.235875 0.010649 3.557 -v -0.235943 0.00840138 3.56243 -v -0.235972 0.00297517 3.56467 -v -0.235943 -0.00245105 3.56243 -v -0.235875 -0.00469866 3.557 -v -0.235807 -0.00245105 3.55157 -v -0.235778 0.00297517 3.54933 -v -0.235807 0.00840138 3.55157 -v -0.24875 0.00281127 3.557 -v 0.02 0.0233891 -3.551 -v 0.00558274 0.0174173 -3.551 -v -0.000389087 0.003 -3.551 -v 0.00558274 -0.0114173 -3.551 -v 0.02 -0.0173891 -3.551 -v 0.0344173 -0.0114173 -3.551 -v 0.0403891 0.003 -3.551 -v 0.0344173 0.0174173 -3.551 -v -0.209024 0.0141993 3.56164 -v -0.208976 0.0141993 3.55236 -v -0.209 0.0151601 3.557 -v -0.136125 0.0202759 3.56006 -v -0.173287 0.0180056 3.56219 -v -0.209058 0.0076389 3.5682 -v -0.209044 0.0115985 3.5656 -v -0.244748 0.00733716 3.55883 -v -0.235788 0.0101966 3.55999 -v -0.134888 0.0101559 3.57003 -v -0.172986 0.00921554 3.57094 -v -0.209058 -0.0016389 3.5682 -v -0.209063 0.003 3.56916 -v -0.244748 0.00474996 3.56142 -v -0.235842 0.00596929 3.56422 -v -0.134888 -0.00415592 3.57003 -v -0.172986 -0.00321554 3.57094 -v -0.209024 -0.0081993 3.56164 -v -0.209044 -0.00559846 3.5656 -v -0.244748 0.00109111 3.56142 -v -0.235842 -9.01913e-006 3.56422 -v -0.136125 -0.0142759 3.56006 -v -0.173287 -0.0120056 3.56219 -v -0.208976 -0.0081993 3.55236 -v -0.209 -0.00916005 3.557 -v -0.244748 -0.00149609 3.55883 -v -0.235788 -0.00423632 3.55999 -v -0.137875 -0.0142759 3.54594 -v -0.173713 -0.0120056 3.54981 -v -0.208942 -0.0016389 3.5458 -v -0.208956 -0.00559846 3.5484 -v -0.244748 -0.00149609 3.55517 -v -0.235712 -0.00423632 3.55401 -v -0.139112 -0.00415592 3.53596 -v -0.174014 -0.00321554 3.54105 -v -0.208942 0.0076389 3.5458 -v -0.208937 0.003 3.54484 -v -0.244748 0.00109111 3.55258 -v -0.235658 -9.01913e-006 3.54978 -v -0.139112 0.0101559 3.53596 -v -0.174014 0.00921554 3.54105 -v -0.208956 0.0115985 3.5484 -v -0.244748 0.00474996 3.55258 -v -0.235658 0.00596929 3.54978 -v -0.137875 0.0202759 3.54594 -v -0.173713 0.0180056 3.54981 -v -0.244748 0.00733716 3.55517 -v -0.235712 0.0101966 3.55401 -v -0.246248 0.00704938 3.557 -v -0.246248 0.00583425 3.55993 -v -0.246248 0.00290067 3.56115 -v -0.246248 -3.29167e-005 3.55993 -v -0.246248 -0.00124805 3.557 -v -0.246248 -3.29167e-005 3.55407 -v -0.246248 0.00290067 3.55285 -v -0.246248 0.00583425 3.55407 -v -0.137 0.021758 3.553 -v -0.0615432 0.0217782 3.54634 -v -0.0985422 0.0214026 3.55489 -v -0.135378 0.0162639 3.56608 -v -0.0664567 0.0217782 3.53166 -v -0.064 0.0233891 3.539 -v 0.00823424 0.0217782 3.5154 -v -0.0257454 0.0217782 3.53349 -v -0.058069 0.0107782 3.55673 -v -0.0594463 0.0174173 3.55261 -v -0.000234232 0.0217782 3.5026 -v 0.00400001 0.0233891 3.509 -v 0.0640204 0.0217782 3.46479 -v 0.038716 0.0217782 3.49239 -v 0.0142223 0.0107782 3.52444 -v 0.0118484 0.0174173 3.52086 -v 0.0519796 0.0217782 3.45521 -v 0.058 0.0233891 3.46 -v 0.0970668 0.0217782 3.39815 -v 0.0836399 0.0217782 3.43318 -v 0.0725345 0.0107782 3.47156 -v 0.0691592 0.0174173 3.46888 -v 0.0829332 0.0217782 3.39185 -v 0.09 0.0233891 3.395 -v 0.108559 0.0217782 3.32368 -v 0.105105 0.0217782 3.36116 -v 0.107061 0.0107782 3.4026 -v 0.103099 0.0174173 3.40083 -v 0.0934411 0.0217782 3.32032 -v 0.101 0.0233891 3.322 -v 0.105749 0.0217782 3.24854 -v 0.108437 0.0217782 3.28603 -v 0.119249 0.0107782 3.32605 -v 0.115011 0.0174173 3.32511 -v 0.0902514 0.0217782 3.24746 -v 0.098 0.0233891 3.248 -v 0.0792486 0.0217782 3.10159 -v 0.0971378 0.0217782 3.1931 -v 0.116707 0.0107782 3.24931 -v 0.112362 0.0174173 3.249 -v 0.0637514 0.0217782 3.10241 -v 0.0715 0.0233891 3.102 -v 0.0447202 0.0217782 2.91805 -v 0.0593523 0.0217782 3.00094 -v 0.0902068 0.0107782 3.10102 -v 0.0858624 0.0174173 3.10125 -v 0.0292798 0.0217782 2.91995 -v 0.037 0.0233891 2.919 -v 0.0302492 0.0217782 2.79203 -v 0.0351024 0.0217782 2.84955 -v 0.0556382 0.0107782 2.91671 -v 0.0513098 0.0174173 2.91724 -v 0.0147508 0.0217782 2.79297 -v 0.0225 0.0233891 2.7925 -v 0.0283959 0.0217782 2.71676 -v 0.0412082 0.0107782 2.79136 -v 0.0368635 0.0174173 2.79162 -v 0.0277782 0.0217782 -3.551 -v -0.0961271 0.0106226 3.56534 -v -0.134707 0.003 3.5715 -v -0.0211428 0.0107782 3.54337 -v -0.058069 -0.00477817 3.55673 -v -0.0575602 0.003 3.55825 -v 0.0460925 0.0107782 3.50037 -v 0.0142223 -0.00477817 3.52444 -v 0.0150991 0.003 3.52577 -v 0.09303 0.0107782 3.43873 -v 0.0725345 -0.00477817 3.47156 -v 0.0737814 0.003 3.47255 -v 0.115507 0.0107782 3.36456 -v 0.107061 -0.00477817 3.4026 -v 0.108524 0.003 3.40325 -v 0.119308 0.0107782 3.28748 -v 0.119249 -0.00477817 3.32605 -v 0.120814 0.003 3.32639 -v 0.108116 0.0107782 3.19325 -v 0.116707 -0.00477817 3.24931 -v 0.118312 0.003 3.24942 -v 0.0702803 0.0107782 2.99979 -v 0.0902068 -0.00477817 3.10102 -v 0.0918115 0.003 3.10094 -v 0.0460307 0.0107782 2.84837 -v 0.0556382 -0.00477817 2.91671 -v 0.0572371 0.003 2.91652 -v 0.0393857 0.0107782 2.71659 -v 0.0412082 -0.00477817 2.79136 -v 0.0428131 0.003 2.79126 -v 0.0387782 0.0107782 -3.551 -v -0.0961271 -0.00462261 3.56534 -v -0.135378 -0.0102639 3.56608 -v -0.0211428 -0.00477817 3.54337 -v -0.0615432 -0.0157782 3.54634 -v -0.0594463 -0.0114173 3.55261 -v 0.0460925 -0.00477817 3.50037 -v 0.00823424 -0.0157782 3.5154 -v 0.0118484 -0.0114173 3.52086 -v 0.09303 -0.00477817 3.43873 -v 0.0640204 -0.0157782 3.46479 -v 0.0691592 -0.0114173 3.46888 -v 0.115507 -0.00477817 3.36456 -v 0.0970668 -0.0157782 3.39815 -v 0.103099 -0.0114173 3.40083 -v 0.119308 -0.00477817 3.28748 -v 0.108559 -0.0157782 3.32368 -v 0.115011 -0.0114173 3.32511 -v 0.108116 -0.00477817 3.19325 -v 0.105749 -0.0157782 3.24854 -v 0.112362 -0.0114173 3.249 -v 0.0702803 -0.00477817 2.99979 -v 0.0792486 -0.0157782 3.10159 -v 0.0858624 -0.0114173 3.10125 -v 0.0460307 -0.00477817 2.84837 -v 0.0447202 -0.0157782 2.91805 -v 0.0513098 -0.0114173 2.91724 -v 0.0393857 -0.00477817 2.71659 -v 0.0302492 -0.0157782 2.79203 -v 0.0368635 -0.0114173 2.79162 -v 0.0387782 -0.00477817 -3.551 -v -0.0985422 -0.0154026 3.55489 -v -0.137 -0.015758 3.553 -v -0.0257454 -0.0157782 3.53349 -v -0.0664567 -0.0157782 3.53166 -v -0.064 -0.0173891 3.539 -v 0.038716 -0.0157782 3.49239 -v -0.000234232 -0.0157782 3.5026 -v 0.00400001 -0.0173891 3.509 -v 0.0836399 -0.0157782 3.43318 -v 0.0519796 -0.0157782 3.45521 -v 0.058 -0.0173891 3.46 -v 0.105105 -0.0157782 3.36116 -v 0.0829332 -0.0157782 3.39185 -v 0.09 -0.0173891 3.395 -v 0.108437 -0.0157782 3.28603 -v 0.0934411 -0.0157782 3.32032 -v 0.101 -0.0173891 3.322 -v 0.0971378 -0.0157782 3.1931 -v 0.0902514 -0.0157782 3.24746 -v 0.098 -0.0173891 3.248 -v 0.0593523 -0.0157782 3.00094 -v 0.0637514 -0.0157782 3.10241 -v 0.0715 -0.0173891 3.102 -v 0.0351024 -0.0157782 2.84955 -v 0.0292798 -0.0157782 2.91995 -v 0.037 -0.0173891 2.919 -v 0.0283959 -0.0157782 2.71676 -v 0.0147508 -0.0157782 2.79297 -v 0.0225 -0.0173891 2.7925 -v 0.0277782 -0.0157782 -3.551 -v -0.101958 -0.0154026 3.54011 -v -0.138622 -0.0102639 3.53992 -v -0.0322546 -0.0157782 3.51951 -v -0.069931 -0.00477817 3.52127 -v -0.0685537 -0.0114173 3.52539 -v 0.028284 -0.0157782 3.48111 -v -0.00622225 -0.00477817 3.49356 -v -0.00384836 -0.0114173 3.49714 -v 0.0703601 -0.0157782 3.42532 -v 0.0434655 -0.00477817 3.44844 -v 0.0468408 -0.0114173 3.45112 -v 0.0903948 -0.0157782 3.35634 -v 0.0729393 -0.00477817 3.3874 -v 0.0769013 -0.0114173 3.38917 -v 0.093063 -0.0157782 3.28397 -v 0.0827513 -0.00477817 3.31795 -v 0.0869893 -0.0114173 3.31889 -v 0.0816122 -0.0157782 3.1929 -v 0.0792932 -0.00477817 3.24669 -v 0.0836376 -0.0114173 3.247 -v 0.0438977 -0.0157782 3.00256 -v 0.0527932 -0.00477817 3.10298 -v 0.0571376 -0.0114173 3.10275 -v 0.0196476 -0.0157782 2.8512 -v 0.0183618 -0.00477817 2.92129 -v 0.0226902 -0.0114173 2.92076 -v 0.0128541 -0.0157782 2.71699 -v 0.00379181 -0.00477817 2.79364 -v 0.00813647 -0.0114173 2.79338 -v 0.0122218 -0.0157782 -3.551 -v -0.104373 -0.00462261 3.52966 -v -0.139293 0.003 3.5345 -v -0.0368572 -0.00477817 3.50963 -v -0.069931 0.0107782 3.52127 -v -0.0704398 0.003 3.51975 -v 0.0209075 -0.00477817 3.47313 -v -0.00622225 0.0107782 3.49356 -v -0.00709914 0.003 3.49223 -v 0.06097 -0.00477817 3.41977 -v 0.0434655 0.0107782 3.44844 -v 0.0422186 0.003 3.44745 -v 0.0799931 -0.00477817 3.35294 -v 0.0729393 0.0107782 3.3874 -v 0.0714757 0.003 3.38675 -v 0.082192 -0.00477817 3.28252 -v 0.0827513 0.0107782 3.31795 -v 0.0811859 0.003 3.31761 -v 0.070634 -0.00477817 3.19275 -v 0.0792932 0.0107782 3.24669 -v 0.0776885 0.003 3.24658 -v 0.0329697 -0.00477817 3.00371 -v 0.0527932 0.0107782 3.10298 -v 0.0511885 0.003 3.10306 -v 0.0087193 -0.00477817 2.85238 -v 0.0183618 0.0107782 2.92129 -v 0.0167629 0.003 2.92148 -v 0.00186432 -0.00477817 2.71716 -v 0.00379181 0.0107782 2.79364 -v 0.0021869 0.003 2.79374 -v 0.00122183 -0.00477817 -3.551 -v -0.104373 0.0106226 3.52966 -v -0.138622 0.0162639 3.53992 -v -0.0368572 0.0107782 3.50963 -v -0.0685537 0.0174173 3.52539 -v 0.0209075 0.0107782 3.47313 -v -0.00384836 0.0174173 3.49714 -v 0.06097 0.0107782 3.41977 -v 0.0468408 0.0174173 3.45112 -v 0.0799931 0.0107782 3.35294 -v 0.0769013 0.0174173 3.38917 -v 0.082192 0.0107782 3.28252 -v 0.0869893 0.0174173 3.31889 -v 0.070634 0.0107782 3.19275 -v 0.0836376 0.0174173 3.247 -v 0.0329697 0.0107782 3.00371 -v 0.0571376 0.0174173 3.10275 -v 0.0087193 0.0107782 2.85238 -v 0.0226902 0.0174173 2.92076 -v 0.00186432 0.0107782 2.71716 -v 0.00813647 0.0174173 2.79338 -v 0.00122183 0.0107782 -3.551 -v -0.101958 0.0214026 3.54011 -v -0.0322546 0.0217782 3.51951 -v 0.028284 0.0217782 3.48111 -v 0.0703601 0.0217782 3.42532 -v 0.0903948 0.0217782 3.35634 -v 0.093063 0.0217782 3.28397 -v 0.0816122 0.0217782 3.1929 -v 0.0438977 0.0217782 3.00256 -v 0.0196476 0.0217782 2.8512 -v 0.0128541 0.0217782 2.71699 -v 0.0122218 0.0217782 -3.551 -f 108 89 114 -f 106 108 114 -f 81 108 106 -f 110 81 106 -f 110 106 112 -f 82 110 112 -f 106 114 90 -f 112 106 90 -f 111 90 120 -f 112 90 111 -f 116 112 111 -f 82 112 116 -f 111 118 83 -f 116 111 83 -f 118 120 91 -f 111 120 118 -f 118 126 117 -f 118 91 126 -f 83 117 122 -f 83 118 117 -f 122 124 84 -f 122 117 124 -f 117 92 124 -f 117 126 92 -f 92 132 123 -f 124 92 123 -f 124 123 128 -f 84 124 128 -f 123 130 85 -f 128 123 85 -f 132 93 130 -f 123 132 130 -f 138 129 130 -f 93 138 130 -f 129 134 85 -f 130 129 85 -f 136 86 134 -f 129 136 134 -f 94 136 129 -f 138 94 129 -f 94 135 136 -f 144 135 94 -f 135 140 136 -f 136 140 86 -f 142 87 135 -f 135 87 140 -f 144 142 135 -f 95 142 144 -f 149 142 95 -f 149 141 142 -f 141 146 87 -f 141 87 142 -f 147 146 141 -f 147 88 146 -f 96 141 149 -f 96 147 141 -f 107 147 96 -f 153 107 96 -f 151 88 147 -f 107 151 147 -f 81 151 107 -f 108 81 107 -f 108 107 153 -f 89 108 153 -f 155 154 97 -f 113 154 155 -f 113 89 154 -f 114 89 113 -f 114 113 155 -f 90 114 155 -f 156 155 97 -f 119 155 156 -f 120 155 119 -f 120 90 155 -f 91 119 156 -f 120 119 91 -f 156 97 157 -f 125 156 157 -f 91 125 126 -f 91 156 125 -f 126 157 92 -f 126 125 157 -f 97 158 131 -f 157 97 131 -f 157 131 132 -f 92 157 132 -f 131 158 93 -f 132 131 93 -f 97 159 137 -f 158 97 137 -f 137 138 93 -f 158 137 93 -f 159 94 138 -f 137 159 138 -f 160 143 159 -f 97 160 159 -f 159 144 94 -f 143 144 159 -f 143 95 144 -f 160 95 143 -f 161 160 97 -f 161 148 160 -f 148 95 160 -f 148 149 95 -f 161 149 148 -f 96 149 161 -f 154 161 97 -f 154 152 161 -f 153 96 161 -f 152 153 161 -f 89 152 154 -f 89 153 152 -f 162 81 110 -f 109 162 110 -f 73 162 109 -f 164 73 109 -f 164 109 165 -f 74 164 165 -f 109 110 82 -f 165 109 82 -f 167 73 164 -f 163 167 164 -f 65 167 163 -f 169 65 163 -f 169 163 171 -f 66 169 171 -f 171 163 74 -f 163 164 74 -f 173 65 169 -f 168 173 169 -f 57 173 168 -f 175 57 168 -f 175 168 177 -f 58 175 177 -f 177 168 66 -f 168 169 66 -f 174 57 175 -f 179 57 174 -f 181 179 174 -f 49 179 181 -f 50 174 183 -f 181 174 50 -f 183 175 58 -f 174 175 183 -f 180 49 181 -f 185 49 180 -f 187 185 180 -f 41 185 187 -f 42 180 189 -f 187 180 42 -f 189 181 50 -f 180 181 189 -f 186 41 187 -f 191 41 186 -f 193 191 186 -f 33 191 193 -f 34 186 195 -f 193 186 34 -f 195 187 42 -f 186 187 195 -f 192 33 193 -f 197 33 192 -f 199 197 192 -f 25 197 199 -f 26 192 201 -f 199 192 26 -f 201 193 34 -f 192 193 201 -f 198 25 199 -f 203 25 198 -f 205 203 198 -f 17 203 205 -f 18 198 207 -f 205 198 18 -f 207 199 26 -f 198 199 207 -f 204 17 205 -f 209 17 204 -f 211 209 204 -f 9 209 211 -f 10 204 213 -f 211 204 10 -f 213 205 18 -f 204 205 213 -f 210 9 211 -f 215 9 210 -f 1 215 210 -f 216 1 210 -f 216 210 218 -f 2 216 218 -f 218 211 10 -f 210 211 218 -f 165 82 116 -f 115 165 116 -f 74 165 115 -f 220 74 115 -f 75 220 221 -f 220 115 221 -f 221 115 83 -f 115 116 83 -f 171 74 220 -f 170 171 220 -f 66 171 170 -f 222 66 170 -f 67 222 224 -f 222 170 224 -f 224 170 75 -f 170 220 75 -f 177 66 222 -f 176 177 222 -f 58 177 176 -f 225 58 176 -f 225 176 227 -f 59 225 227 -f 227 176 67 -f 176 222 67 -f 182 58 225 -f 183 58 182 -f 228 183 182 -f 50 183 228 -f 228 182 51 -f 51 182 230 -f 230 225 59 -f 182 225 230 -f 188 50 228 -f 189 50 188 -f 231 189 188 -f 42 189 231 -f 231 188 43 -f 43 188 233 -f 188 228 233 -f 233 228 51 -f 194 42 231 -f 195 42 194 -f 234 195 194 -f 34 195 234 -f 234 194 35 -f 35 194 236 -f 194 231 236 -f 236 231 43 -f 200 34 234 -f 201 34 200 -f 237 201 200 -f 26 201 237 -f 27 200 239 -f 237 200 27 -f 200 234 239 -f 239 234 35 -f 207 26 237 -f 206 207 237 -f 18 207 206 -f 240 18 206 -f 240 206 242 -f 19 240 242 -f 206 237 27 -f 242 206 27 -f 213 18 240 -f 212 213 240 -f 243 10 212 -f 10 213 212 -f 243 212 245 -f 11 243 245 -f 212 240 19 -f 245 212 19 -f 218 10 243 -f 217 218 243 -f 2 218 217 -f 246 2 217 -f 246 217 248 -f 3 246 248 -f 217 243 11 -f 248 217 11 -f 83 122 121 -f 221 83 121 -f 221 121 250 -f 75 221 250 -f 121 251 76 -f 250 121 76 -f 122 84 251 -f 121 122 251 -f 75 250 223 -f 224 75 223 -f 252 224 223 -f 67 224 252 -f 68 223 254 -f 252 223 68 -f 250 76 254 -f 223 250 254 -f 226 67 252 -f 227 67 226 -f 59 227 255 -f 255 227 226 -f 60 226 257 -f 255 226 60 -f 252 68 257 -f 226 252 257 -f 230 59 255 -f 229 230 255 -f 51 230 229 -f 258 51 229 -f 52 258 260 -f 258 229 260 -f 229 255 60 -f 229 60 260 -f 233 51 258 -f 232 233 258 -f 43 233 232 -f 261 43 232 -f 44 261 263 -f 261 232 263 -f 232 258 52 -f 232 52 263 -f 236 43 261 -f 235 236 261 -f 35 236 235 -f 264 35 235 -f 36 264 266 -f 264 235 266 -f 235 261 44 -f 235 44 266 -f 239 35 264 -f 238 239 264 -f 27 239 238 -f 267 27 238 -f 28 267 269 -f 267 238 269 -f 238 264 36 -f 238 36 269 -f 241 27 267 -f 242 27 241 -f 270 242 241 -f 19 242 270 -f 20 241 272 -f 270 241 20 -f 267 28 272 -f 241 267 272 -f 244 19 270 -f 245 19 244 -f 273 245 244 -f 11 245 273 -f 12 244 275 -f 273 244 12 -f 270 20 275 -f 244 270 275 -f 247 11 273 -f 248 11 247 -f 276 248 247 -f 3 248 276 -f 276 247 4 -f 4 247 278 -f 273 12 278 -f 247 273 278 -f 84 128 127 -f 251 84 127 -f 251 127 280 -f 76 251 280 -f 127 281 77 -f 280 127 77 -f 128 85 281 -f 127 128 281 -f 76 280 253 -f 254 76 253 -f 282 254 253 -f 68 254 282 -f 69 253 284 -f 282 253 69 -f 280 77 284 -f 253 280 284 -f 256 68 282 -f 257 68 256 -f 285 257 256 -f 60 257 285 -f 61 256 287 -f 285 256 61 -f 287 282 69 -f 256 282 287 -f 260 60 285 -f 259 260 285 -f 52 260 259 -f 288 52 259 -f 53 288 290 -f 288 259 290 -f 259 285 61 -f 290 259 61 -f 263 52 288 -f 262 263 288 -f 44 263 262 -f 291 44 262 -f 45 291 293 -f 291 262 293 -f 262 288 53 -f 293 262 53 -f 266 44 291 -f 265 266 291 -f 36 266 265 -f 294 36 265 -f 37 294 296 -f 294 265 296 -f 265 291 45 -f 296 265 45 -f 269 36 294 -f 268 269 294 -f 28 269 268 -f 297 28 268 -f 29 297 299 -f 297 268 299 -f 268 294 37 -f 299 268 37 -f 272 28 297 -f 271 272 297 -f 20 272 271 -f 300 20 271 -f 21 300 302 -f 300 271 302 -f 271 297 29 -f 302 271 29 -f 275 20 300 -f 274 275 300 -f 12 275 274 -f 303 12 274 -f 13 303 305 -f 303 274 305 -f 274 300 21 -f 305 274 21 -f 278 12 303 -f 277 278 303 -f 306 278 277 -f 4 278 306 -f 5 277 308 -f 306 277 5 -f 277 303 13 -f 308 277 13 -f 134 133 281 -f 85 134 281 -f 281 310 77 -f 133 310 281 -f 133 78 310 -f 311 78 133 -f 86 311 133 -f 134 86 133 -f 77 283 284 -f 310 283 77 -f 312 69 284 -f 283 312 284 -f 70 312 283 -f 314 70 283 -f 310 314 283 -f 78 314 310 -f 286 287 69 -f 312 286 69 -f 315 61 287 -f 286 315 287 -f 62 315 286 -f 317 62 286 -f 317 286 312 -f 70 317 312 -f 315 290 61 -f 315 289 290 -f 289 318 53 -f 289 53 290 -f 320 318 289 -f 320 54 318 -f 62 289 315 -f 62 320 289 -f 318 293 53 -f 318 292 293 -f 292 321 45 -f 292 45 293 -f 323 321 292 -f 323 46 321 -f 54 292 318 -f 54 323 292 -f 321 296 45 -f 321 295 296 -f 295 324 37 -f 295 37 296 -f 326 324 295 -f 326 38 324 -f 46 295 321 -f 46 326 295 -f 324 299 37 -f 324 298 299 -f 298 327 29 -f 298 29 299 -f 329 327 298 -f 329 30 327 -f 38 298 324 -f 38 329 298 -f 327 302 29 -f 327 301 302 -f 301 330 21 -f 301 21 302 -f 332 330 301 -f 332 22 330 -f 30 301 327 -f 30 332 301 -f 330 305 21 -f 330 304 305 -f 304 333 13 -f 304 13 305 -f 335 333 304 -f 335 14 333 -f 22 304 330 -f 22 335 304 -f 333 308 13 -f 333 307 308 -f 336 5 308 -f 307 336 308 -f 6 336 307 -f 338 6 307 -f 14 307 333 -f 14 338 307 -f 86 139 311 -f 140 139 86 -f 311 340 78 -f 139 340 311 -f 341 79 139 -f 139 79 340 -f 87 341 140 -f 140 341 139 -f 78 313 314 -f 340 313 78 -f 342 70 314 -f 313 342 314 -f 344 71 313 -f 71 342 313 -f 79 344 340 -f 340 344 313 -f 70 316 317 -f 342 316 70 -f 345 62 317 -f 316 345 317 -f 63 345 316 -f 347 63 316 -f 347 316 342 -f 71 347 342 -f 62 345 320 -f 345 319 320 -f 319 348 54 -f 319 54 320 -f 350 348 319 -f 350 55 348 -f 63 319 345 -f 63 350 319 -f 54 348 323 -f 348 322 323 -f 322 351 46 -f 322 46 323 -f 353 351 322 -f 353 47 351 -f 55 322 348 -f 55 353 322 -f 46 351 326 -f 351 325 326 -f 325 354 38 -f 325 38 326 -f 356 354 325 -f 356 39 354 -f 47 325 351 -f 47 356 325 -f 38 354 329 -f 354 328 329 -f 328 357 30 -f 328 30 329 -f 359 357 328 -f 359 31 357 -f 39 328 354 -f 39 359 328 -f 30 331 332 -f 357 331 30 -f 360 22 332 -f 331 360 332 -f 23 360 331 -f 362 23 331 -f 362 331 357 -f 31 362 357 -f 22 334 335 -f 360 334 22 -f 363 14 335 -f 334 363 335 -f 15 363 334 -f 365 15 334 -f 365 334 360 -f 23 365 360 -f 14 337 338 -f 363 337 14 -f 366 6 338 -f 337 366 338 -f 7 366 337 -f 368 7 337 -f 368 337 363 -f 15 368 363 -f 146 145 341 -f 146 341 87 -f 145 370 79 -f 145 79 341 -f 371 370 145 -f 371 80 370 -f 88 145 146 -f 88 371 145 -f 370 343 344 -f 370 344 79 -f 343 372 71 -f 343 71 344 -f 373 372 343 -f 373 72 372 -f 80 343 370 -f 80 373 343 -f 372 347 71 -f 372 346 347 -f 346 63 347 -f 346 374 63 -f 375 374 346 -f 375 64 374 -f 72 346 372 -f 72 375 346 -f 349 350 63 -f 374 349 63 -f 376 55 350 -f 349 376 350 -f 56 376 349 -f 377 56 349 -f 377 349 374 -f 64 377 374 -f 352 353 55 -f 376 352 55 -f 378 47 353 -f 352 378 353 -f 48 378 352 -f 379 48 352 -f 379 352 376 -f 56 379 376 -f 355 356 47 -f 378 355 47 -f 380 39 356 -f 355 380 356 -f 40 380 355 -f 381 40 355 -f 381 355 378 -f 48 381 378 -f 358 359 39 -f 380 358 39 -f 382 31 359 -f 358 382 359 -f 32 382 358 -f 383 32 358 -f 383 358 380 -f 40 383 380 -f 382 362 31 -f 382 361 362 -f 361 23 362 -f 361 384 23 -f 385 384 361 -f 385 24 384 -f 32 361 382 -f 32 385 361 -f 384 365 23 -f 384 364 365 -f 364 15 365 -f 364 386 15 -f 387 16 386 -f 387 386 364 -f 24 364 384 -f 24 387 364 -f 386 368 15 -f 386 367 368 -f 367 7 368 -f 367 388 7 -f 389 388 367 -f 389 8 388 -f 16 367 386 -f 16 389 367 -f 150 371 88 -f 151 150 88 -f 150 80 371 -f 150 391 80 -f 162 391 150 -f 162 73 391 -f 162 150 151 -f 81 162 151 -f 391 166 373 -f 391 373 80 -f 166 72 373 -f 166 392 72 -f 167 392 166 -f 167 65 392 -f 73 166 391 -f 73 167 166 -f 392 172 375 -f 392 375 72 -f 172 64 375 -f 172 393 64 -f 173 393 172 -f 173 57 393 -f 65 172 392 -f 65 173 172 -f 178 377 64 -f 393 178 64 -f 394 56 377 -f 178 394 377 -f 49 394 178 -f 179 49 178 -f 179 178 393 -f 57 179 393 -f 184 379 56 -f 394 184 56 -f 395 48 379 -f 184 395 379 -f 41 395 184 -f 185 41 184 -f 185 184 394 -f 49 185 394 -f 190 381 48 -f 395 190 48 -f 396 40 381 -f 190 396 381 -f 33 396 190 -f 191 33 190 -f 191 190 395 -f 41 191 395 -f 196 383 40 -f 396 196 40 -f 397 32 383 -f 196 397 383 -f 25 397 196 -f 197 25 196 -f 197 196 396 -f 33 197 396 -f 202 385 32 -f 397 202 32 -f 398 24 385 -f 202 398 385 -f 17 398 202 -f 203 17 202 -f 203 202 397 -f 25 203 397 -f 208 387 24 -f 398 208 24 -f 399 16 387 -f 208 399 387 -f 9 399 208 -f 209 9 208 -f 209 208 398 -f 17 209 398 -f 214 389 16 -f 399 214 16 -f 214 8 389 -f 214 400 8 -f 215 400 214 -f 215 1 400 -f 215 214 399 -f 9 215 399 -f 105 2 246 -f 249 105 246 -f 249 246 3 -f 104 249 3 -f 104 3 279 -f 279 3 276 -f 279 276 103 -f 276 4 103 -f 103 4 309 -f 309 4 306 -f 309 306 102 -f 102 306 5 -f 339 102 5 -f 336 339 5 -f 101 339 336 -f 6 101 336 -f 6 369 101 -f 366 369 6 -f 7 100 366 -f 100 369 366 -f 388 390 100 -f 388 100 7 -f 8 99 390 -f 8 390 388 -f 400 401 99 -f 400 99 8 -f 1 401 400 -f 1 98 401 -f 219 98 216 -f 98 1 216 -f 105 219 2 -f 219 216 2 diff --git a/applications/plugins/SensableEmulation/examples/testOmniDriverEmu.scn b/applications/plugins/SensableEmulation/examples/testOmniDriverEmu.scn deleted file mode 100644 index e27e25b8c6f..00000000000 --- a/applications/plugins/SensableEmulation/examples/testOmniDriverEmu.scn +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/applications/plugins/SensableEmulation/pthread/pthread.h b/applications/plugins/SensableEmulation/pthread/pthread.h deleted file mode 100644 index b4072f72c6f..00000000000 --- a/applications/plugins/SensableEmulation/pthread/pthread.h +++ /dev/null @@ -1,1368 +0,0 @@ -/* This is an implementation of the threads API of POSIX 1003.1-2001. - * - * -------------------------------------------------------------------------- - * - * Pthreads-win32 - POSIX Threads Library for Win32 - * Copyright(C) 1998 John E. Bossom - * Copyright(C) 1999,2005 Pthreads-win32 contributors - * - * Contact Email: rpj@callisto.canberra.edu.au - * - * The current list of contributors is contained - * in the file CONTRIBUTORS included with the source - * code distribution. The list can also be seen at the - * following World Wide Web location: - * http://sources.redhat.com/pthreads-win32/contributors.html - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library in the file COPYING.LIB; - * if not, write to the Free Software Foundation, Inc., - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#if !defined( PTHREAD_H ) -#define PTHREAD_H - -/* - * See the README file for an explanation of the pthreads-win32 version - * numbering scheme and how the DLL is named etc. - */ -#define PTW32_VERSION 2,9,1,0 -#define PTW32_VERSION_STRING "2, 9, 1, 0\0" - -/* There are three implementations of cancel cleanup. - * Note that pthread.h is included in both application - * compilation units and also internally for the library. - * The code here and within the library aims to work - * for all reasonable combinations of environments. - * - * The three implementations are: - * - * WIN32 SEH - * C - * C++ - * - * Please note that exiting a push/pop block via - * "return", "exit", "break", or "continue" will - * lead to different behaviour amongst applications - * depending upon whether the library was built - * using SEH, C++, or C. For example, a library built - * with SEH will call the cleanup routine, while both - * C++ and C built versions will not. - */ - -/* - * Define defaults for cleanup code. - * Note: Unless the build explicitly defines one of the following, then - * we default to standard C style cleanup. This style uses setjmp/longjmp - * in the cancelation and thread exit implementations and therefore won't - * do stack unwinding if linked to applications that have it (e.g. - * C++ apps). This is currently consistent with most/all commercial Unix - * POSIX threads implementations. - */ -#if !defined( __CLEANUP_SEH ) && !defined( __CLEANUP_CXX ) && !defined( __CLEANUP_C ) -# define __CLEANUP_C -#endif - -#if defined( __CLEANUP_SEH ) && ( !defined( _MSC_VER ) && !defined(PTW32_RC_MSC)) -#error ERROR [__FILE__, line __LINE__]: SEH is not supported for this compiler. -#endif - -/* - * Stop here if we are being included by the resource compiler. - */ -#if !defined(RC_INVOKED) - -#undef PTW32_LEVEL - -#if defined(_POSIX_SOURCE) -#define PTW32_LEVEL 0 -/* Early POSIX */ -#endif - -#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309 -#undef PTW32_LEVEL -#define PTW32_LEVEL 1 -/* Include 1b, 1c and 1d */ -#endif - -#if defined(INCLUDE_NP) -#undef PTW32_LEVEL -#define PTW32_LEVEL 2 -/* Include Non-Portable extensions */ -#endif - -#define PTW32_LEVEL_MAX 3 - -#if ( defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200112 ) || !defined(PTW32_LEVEL) -#define PTW32_LEVEL PTW32_LEVEL_MAX -/* Include everything */ -#endif - -#if defined(_UWIN) -# define HAVE_STRUCT_TIMESPEC 1 -# define HAVE_SIGNAL_H 1 -# undef HAVE_PTW32_CONFIG_H -# pragma comment(lib, "pthread") -#endif - -/* - * ------------------------------------------------------------- - * - * - * Module: pthread.h - * - * Purpose: - * Provides an implementation of PThreads based upon the - * standard: - * - * POSIX 1003.1-2001 - * and - * The Single Unix Specification version 3 - * - * (these two are equivalent) - * - * in order to enhance code portability between Windows, - * various commercial Unix implementations, and Linux. - * - * See the ANNOUNCE file for a full list of conforming - * routines and defined constants, and a list of missing - * routines and constants not defined in this implementation. - * - * Authors: - * There have been many contributors to this library. - * The initial implementation was contributed by - * John Bossom, and several others have provided major - * sections or revisions of parts of the implementation. - * Often significant effort has been contributed to - * find and fix important bugs and other problems to - * improve the reliability of the library, which sometimes - * is not reflected in the amount of code which changed as - * result. - * As much as possible, the contributors are acknowledged - * in the ChangeLog file in the source code distribution - * where their changes are noted in detail. - * - * Contributors are listed in the CONTRIBUTORS file. - * - * As usual, all bouquets go to the contributors, and all - * brickbats go to the project maintainer. - * - * Maintainer: - * The code base for this project is coordinated and - * eventually pre-tested, packaged, and made available by - * - * Ross Johnson - * - * QA Testers: - * Ultimately, the library is tested in the real world by - * a host of competent and demanding scientists and - * engineers who report bugs and/or provide solutions - * which are then fixed or incorporated into subsequent - * versions of the library. Each time a bug is fixed, a - * test case is written to prove the fix and ensure - * that later changes to the code don't reintroduce the - * same error. The number of test cases is slowly growing - * and therefore so is the code reliability. - * - * Compliance: - * See the file ANNOUNCE for the list of implemented - * and not-implemented routines and defined options. - * Of course, these are all defined is this file as well. - * - * Web site: - * The source code and other information about this library - * are available from - * - * http://sources.redhat.com/pthreads-win32/ - * - * ------------------------------------------------------------- - */ - -/* Try to avoid including windows.h */ -#if (defined(__MINGW64__) || defined(__MINGW32__)) && defined(__cplusplus) -#define PTW32_INCLUDE_WINDOWS_H -#endif - -#if defined(PTW32_INCLUDE_WINDOWS_H) -#include -#endif - -#if defined(_MSC_VER) && _MSC_VER < 1300 || defined(__DMC__) -/* - * VC++6.0 or early compiler's header has no DWORD_PTR type. - */ -typedef unsigned long DWORD_PTR; -typedef unsigned long ULONG_PTR; -#endif -/* - * ----------------- - * autoconf switches - * ----------------- - */ - -#if defined(HAVE_PTW32_CONFIG_H) -#include "config.h" -#endif /* HAVE_PTW32_CONFIG_H */ - -#if !defined(NEED_FTIME) -#include -#else /* NEED_FTIME */ -/* use native WIN32 time API */ -#endif /* NEED_FTIME */ - -#if defined(HAVE_SIGNAL_H) -#include -#endif /* HAVE_SIGNAL_H */ - -#include - -/* - * Boolean values to make us independent of system includes. - */ -enum { - PTW32_FALSE = 0, - PTW32_TRUE = (! PTW32_FALSE) -}; - -/* - * This is a duplicate of what is in the autoconf config.h, - * which is only used when building the pthread-win32 libraries. - */ - -#if !defined(PTW32_CONFIG_H) -# if defined(WINCE) -# define NEED_ERRNO -# define NEED_SEM -# endif -# if defined(__MINGW64__) -# define HAVE_STRUCT_TIMESPEC -# define HAVE_MODE_T -# elif defined(_UWIN) || defined(__MINGW32__) -# define HAVE_MODE_T -# endif -#endif - -/* - * - */ - -#if PTW32_LEVEL >= PTW32_LEVEL_MAX -#if defined(NEED_ERRNO) -#include "need_errno.h" -#else -#include -#endif -#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */ - -/* - * Several systems don't define some error numbers. - */ -#if !defined(ENOTSUP) -# define ENOTSUP 48 /* This is the value in Solaris. */ -#endif - -#if !defined(ETIMEDOUT) -# define ETIMEDOUT 10060 /* Same as WSAETIMEDOUT */ -#endif - -#if !defined(ENOSYS) -# define ENOSYS 140 /* Semi-arbitrary value */ -#endif - -#if !defined(EDEADLK) -# if defined(EDEADLOCK) -# define EDEADLK EDEADLOCK -# else -# define EDEADLK 36 /* This is the value in MSVC. */ -# endif -#endif - -/* POSIX 2008 - related to robust mutexes */ -#if !defined(EOWNERDEAD) -# define EOWNERDEAD 43 -#endif -#if !defined(ENOTRECOVERABLE) -# define ENOTRECOVERABLE 44 -#endif - -#include - -/* - * To avoid including windows.h we define only those things that we - * actually need from it. - */ -#if !defined(PTW32_INCLUDE_WINDOWS_H) -#if !defined(HANDLE) -# define PTW32__HANDLE_DEF -# define HANDLE void * -#endif -#if !defined(DWORD) -# define PTW32__DWORD_DEF -# define DWORD unsigned long -#endif -#endif - -#if !defined(HAVE_STRUCT_TIMESPEC) -#define HAVE_STRUCT_TIMESPEC -#if !defined(_TIMESPEC_DEFINED) -#define _TIMESPEC_DEFINED -struct timespec { - time_t tv_sec; - long tv_nsec; -}; -#endif /* _TIMESPEC_DEFINED */ -#endif /* HAVE_STRUCT_TIMESPEC */ - -#if !defined(SIG_BLOCK) -#define SIG_BLOCK 0 -#endif /* SIG_BLOCK */ - -#if !defined(SIG_UNBLOCK) -#define SIG_UNBLOCK 1 -#endif /* SIG_UNBLOCK */ - -#if !defined(SIG_SETMASK) -#define SIG_SETMASK 2 -#endif /* SIG_SETMASK */ - -#if defined(__cplusplus) -extern "C" -{ -#endif /* __cplusplus */ - -/* - * ------------------------------------------------------------- - * - * POSIX 1003.1-2001 Options - * ========================= - * - * Options are normally set in , which is not provided - * with pthreads-win32. - * - * For conformance with the Single Unix Specification (version 3), all of the - * options below are defined, and have a value of either -1 (not supported) - * or 200112L (supported). - * - * These options can neither be left undefined nor have a value of 0, because - * either indicates that sysconf(), which is not implemented, may be used at - * runtime to check the status of the option. - * - * _POSIX_THREADS (== 200112L) - * If == 200112L, you can use threads - * - * _POSIX_THREAD_ATTR_STACKSIZE (== 200112L) - * If == 200112L, you can control the size of a thread's - * stack - * pthread_attr_getstacksize - * pthread_attr_setstacksize - * - * _POSIX_THREAD_ATTR_STACKADDR (== -1) - * If == 200112L, you can allocate and control a thread's - * stack. If not supported, the following functions - * will return ENOSYS, indicating they are not - * supported: - * pthread_attr_getstackaddr - * pthread_attr_setstackaddr - * - * _POSIX_THREAD_PRIORITY_SCHEDULING (== -1) - * If == 200112L, you can use realtime scheduling. - * This option indicates that the behaviour of some - * implemented functions conforms to the additional TPS - * requirements in the standard. E.g. rwlocks favour - * writers over readers when threads have equal priority. - * - * _POSIX_THREAD_PRIO_INHERIT (== -1) - * If == 200112L, you can create priority inheritance - * mutexes. - * pthread_mutexattr_getprotocol + - * pthread_mutexattr_setprotocol + - * - * _POSIX_THREAD_PRIO_PROTECT (== -1) - * If == 200112L, you can create priority ceiling mutexes - * Indicates the availability of: - * pthread_mutex_getprioceiling - * pthread_mutex_setprioceiling - * pthread_mutexattr_getprioceiling - * pthread_mutexattr_getprotocol + - * pthread_mutexattr_setprioceiling - * pthread_mutexattr_setprotocol + - * - * _POSIX_THREAD_PROCESS_SHARED (== -1) - * If set, you can create mutexes and condition - * variables that can be shared with another - * process.If set, indicates the availability - * of: - * pthread_mutexattr_getpshared - * pthread_mutexattr_setpshared - * pthread_condattr_getpshared - * pthread_condattr_setpshared - * - * _POSIX_THREAD_SAFE_FUNCTIONS (== 200112L) - * If == 200112L you can use the special *_r library - * functions that provide thread-safe behaviour - * - * _POSIX_READER_WRITER_LOCKS (== 200112L) - * If == 200112L, you can use read/write locks - * - * _POSIX_SPIN_LOCKS (== 200112L) - * If == 200112L, you can use spin locks - * - * _POSIX_BARRIERS (== 200112L) - * If == 200112L, you can use barriers - * - * + These functions provide both 'inherit' and/or - * 'protect' protocol, based upon these macro - * settings. - * - * ------------------------------------------------------------- - */ - -/* - * POSIX Options - */ -#undef _POSIX_THREADS -#define _POSIX_THREADS 200809L - -#undef _POSIX_READER_WRITER_LOCKS -#define _POSIX_READER_WRITER_LOCKS 200809L - -#undef _POSIX_SPIN_LOCKS -#define _POSIX_SPIN_LOCKS 200809L - -#undef _POSIX_BARRIERS -#define _POSIX_BARRIERS 200809L - -#undef _POSIX_THREAD_SAFE_FUNCTIONS -#define _POSIX_THREAD_SAFE_FUNCTIONS 200809L - -#undef _POSIX_THREAD_ATTR_STACKSIZE -#define _POSIX_THREAD_ATTR_STACKSIZE 200809L - -/* - * The following options are not supported - */ -#undef _POSIX_THREAD_ATTR_STACKADDR -#define _POSIX_THREAD_ATTR_STACKADDR -1 - -#undef _POSIX_THREAD_PRIO_INHERIT -#define _POSIX_THREAD_PRIO_INHERIT -1 - -#undef _POSIX_THREAD_PRIO_PROTECT -#define _POSIX_THREAD_PRIO_PROTECT -1 - -/* TPS is not fully supported. */ -#undef _POSIX_THREAD_PRIORITY_SCHEDULING -#define _POSIX_THREAD_PRIORITY_SCHEDULING -1 - -#undef _POSIX_THREAD_PROCESS_SHARED -#define _POSIX_THREAD_PROCESS_SHARED -1 - - -/* - * POSIX 1003.1-2001 Limits - * =========================== - * - * These limits are normally set in , which is not provided with - * pthreads-win32. - * - * PTHREAD_DESTRUCTOR_ITERATIONS - * Maximum number of attempts to destroy - * a thread's thread-specific data on - * termination (must be at least 4) - * - * PTHREAD_KEYS_MAX - * Maximum number of thread-specific data keys - * available per process (must be at least 128) - * - * PTHREAD_STACK_MIN - * Minimum supported stack size for a thread - * - * PTHREAD_THREADS_MAX - * Maximum number of threads supported per - * process (must be at least 64). - * - * SEM_NSEMS_MAX - * The maximum number of semaphores a process can have. - * (must be at least 256) - * - * SEM_VALUE_MAX - * The maximum value a semaphore can have. - * (must be at least 32767) - * - */ -#undef _POSIX_THREAD_DESTRUCTOR_ITERATIONS -#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS 4 - -#undef PTHREAD_DESTRUCTOR_ITERATIONS -#define PTHREAD_DESTRUCTOR_ITERATIONS _POSIX_THREAD_DESTRUCTOR_ITERATIONS - -#undef _POSIX_THREAD_KEYS_MAX -#define _POSIX_THREAD_KEYS_MAX 128 - -#undef PTHREAD_KEYS_MAX -#define PTHREAD_KEYS_MAX _POSIX_THREAD_KEYS_MAX - -#undef PTHREAD_STACK_MIN -#define PTHREAD_STACK_MIN 0 - -#undef _POSIX_THREAD_THREADS_MAX -#define _POSIX_THREAD_THREADS_MAX 64 - - /* Arbitrary value */ -#undef PTHREAD_THREADS_MAX -#define PTHREAD_THREADS_MAX 2019 - -#undef _POSIX_SEM_NSEMS_MAX -#define _POSIX_SEM_NSEMS_MAX 256 - - /* Arbitrary value */ -#undef SEM_NSEMS_MAX -#define SEM_NSEMS_MAX 1024 - -#undef _POSIX_SEM_VALUE_MAX -#define _POSIX_SEM_VALUE_MAX 32767 - -#undef SEM_VALUE_MAX -#define SEM_VALUE_MAX INT_MAX - - -#if defined(__GNUC__) && !defined(__declspec) -# error Please upgrade your GNU compiler to one that supports __declspec. -#endif - -/* - * When building the library, you should define PTW32_BUILD so that - * the variables/functions are exported correctly. When using the library, - * do NOT define PTW32_BUILD, and then the variables/functions will - * be imported correctly. - */ -#if !defined(PTW32_STATIC_LIB) -# if defined(PTW32_BUILD) -# define PTW32_DLLPORT __declspec (dllexport) -# else -# define PTW32_DLLPORT __declspec (dllimport) -# endif -#else -# define PTW32_DLLPORT -#endif - -/* - * The Open Watcom C/C++ compiler uses a non-standard calling convention - * that passes function args in registers unless __cdecl is explicitly specified - * in exposed function prototypes. - * - * We force all calls to cdecl even though this could slow Watcom code down - * slightly. If you know that the Watcom compiler will be used to build both - * the DLL and application, then you can probably define this as a null string. - * Remember that pthread.h (this file) is used for both the DLL and application builds. - */ -#define PTW32_CDECL __cdecl - -#if defined(_UWIN) && PTW32_LEVEL >= PTW32_LEVEL_MAX -# include -#else -/* - * Generic handle type - intended to extend uniqueness beyond - * that available with a simple pointer. It should scale for either - * IA-32 or IA-64. - */ -typedef struct { - void * p; /* Pointer to actual object */ - unsigned int x; /* Extra information - reuse count etc */ -} ptw32_handle_t; - -typedef ptw32_handle_t pthread_t; -typedef struct pthread_attr_t_ * pthread_attr_t; -typedef struct pthread_once_t_ pthread_once_t; -typedef struct pthread_key_t_ * pthread_key_t; -typedef struct pthread_mutex_t_ * pthread_mutex_t; -typedef struct pthread_mutexattr_t_ * pthread_mutexattr_t; -typedef struct pthread_cond_t_ * pthread_cond_t; -typedef struct pthread_condattr_t_ * pthread_condattr_t; -#endif -typedef struct pthread_rwlock_t_ * pthread_rwlock_t; -typedef struct pthread_rwlockattr_t_ * pthread_rwlockattr_t; -typedef struct pthread_spinlock_t_ * pthread_spinlock_t; -typedef struct pthread_barrier_t_ * pthread_barrier_t; -typedef struct pthread_barrierattr_t_ * pthread_barrierattr_t; - -/* - * ==================== - * ==================== - * POSIX Threads - * ==================== - * ==================== - */ - -enum { -/* - * pthread_attr_{get,set}detachstate - */ - PTHREAD_CREATE_JOINABLE = 0, /* Default */ - PTHREAD_CREATE_DETACHED = 1, - -/* - * pthread_attr_{get,set}inheritsched - */ - PTHREAD_INHERIT_SCHED = 0, - PTHREAD_EXPLICIT_SCHED = 1, /* Default */ - -/* - * pthread_{get,set}scope - */ - PTHREAD_SCOPE_PROCESS = 0, - PTHREAD_SCOPE_SYSTEM = 1, /* Default */ - -/* - * pthread_setcancelstate paramters - */ - PTHREAD_CANCEL_ENABLE = 0, /* Default */ - PTHREAD_CANCEL_DISABLE = 1, - -/* - * pthread_setcanceltype parameters - */ - PTHREAD_CANCEL_ASYNCHRONOUS = 0, - PTHREAD_CANCEL_DEFERRED = 1, /* Default */ - -/* - * pthread_mutexattr_{get,set}pshared - * pthread_condattr_{get,set}pshared - */ - PTHREAD_PROCESS_PRIVATE = 0, - PTHREAD_PROCESS_SHARED = 1, - -/* - * pthread_mutexattr_{get,set}robust - */ - PTHREAD_MUTEX_STALLED = 0, /* Default */ - PTHREAD_MUTEX_ROBUST = 1, - -/* - * pthread_barrier_wait - */ - PTHREAD_BARRIER_SERIAL_THREAD = -1 -}; - -/* - * ==================== - * ==================== - * Cancelation - * ==================== - * ==================== - */ -#define PTHREAD_CANCELED ((void *)(size_t) -1) - - -/* - * ==================== - * ==================== - * Once Key - * ==================== - * ==================== - */ -#define PTHREAD_ONCE_INIT { PTW32_FALSE, 0, 0, 0} - -struct pthread_once_t_ -{ - int done; /* indicates if user function has been executed */ - void * lock; - int reserved1; - int reserved2; -}; - - -/* - * ==================== - * ==================== - * Object initialisers - * ==================== - * ==================== - */ -#define PTHREAD_MUTEX_INITIALIZER ((pthread_mutex_t)(size_t) -1) -#define PTHREAD_RECURSIVE_MUTEX_INITIALIZER ((pthread_mutex_t)(size_t) -2) -#define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER ((pthread_mutex_t)(size_t) -3) - -/* - * Compatibility with LinuxThreads - */ -#define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP PTHREAD_RECURSIVE_MUTEX_INITIALIZER -#define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP PTHREAD_ERRORCHECK_MUTEX_INITIALIZER - -#define PTHREAD_COND_INITIALIZER ((pthread_cond_t)(size_t) -1) - -#define PTHREAD_RWLOCK_INITIALIZER ((pthread_rwlock_t)(size_t) -1) - -#define PTHREAD_SPINLOCK_INITIALIZER ((pthread_spinlock_t)(size_t) -1) - - -/* - * Mutex types. - */ -enum -{ - /* Compatibility with LinuxThreads */ - PTHREAD_MUTEX_FAST_NP, - PTHREAD_MUTEX_RECURSIVE_NP, - PTHREAD_MUTEX_ERRORCHECK_NP, - PTHREAD_MUTEX_TIMED_NP = PTHREAD_MUTEX_FAST_NP, - PTHREAD_MUTEX_ADAPTIVE_NP = PTHREAD_MUTEX_FAST_NP, - /* For compatibility with POSIX */ - PTHREAD_MUTEX_NORMAL = PTHREAD_MUTEX_FAST_NP, - PTHREAD_MUTEX_RECURSIVE = PTHREAD_MUTEX_RECURSIVE_NP, - PTHREAD_MUTEX_ERRORCHECK = PTHREAD_MUTEX_ERRORCHECK_NP, - PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL -}; - - -typedef struct ptw32_cleanup_t ptw32_cleanup_t; - -#if defined(_MSC_VER) -/* Disable MSVC 'anachronism used' warning */ -#pragma warning( disable : 4229 ) -#endif - -typedef void (* PTW32_CDECL ptw32_cleanup_callback_t)(void *); - -#if defined(_MSC_VER) -#pragma warning( default : 4229 ) -#endif - -struct ptw32_cleanup_t -{ - ptw32_cleanup_callback_t routine; - void *arg; - struct ptw32_cleanup_t *prev; -}; - -#if defined(__CLEANUP_SEH) - /* - * WIN32 SEH version of cancel cleanup. - */ - -#define pthread_cleanup_push( _rout, _arg ) \ - { \ - ptw32_cleanup_t _cleanup; \ - \ - _cleanup.routine = (ptw32_cleanup_callback_t)(_rout); \ - _cleanup.arg = (_arg); \ - __try \ - { \ - -#define pthread_cleanup_pop( _execute ) \ - } \ - __finally \ - { \ - if( _execute || AbnormalTermination()) \ - { \ - (*(_cleanup.routine))( _cleanup.arg ); \ - } \ - } \ - } - -#else /* __CLEANUP_SEH */ - -#if defined(__CLEANUP_C) - - /* - * C implementation of PThreads cancel cleanup - */ - -#define pthread_cleanup_push( _rout, _arg ) \ - { \ - ptw32_cleanup_t _cleanup; \ - \ - ptw32_push_cleanup( &_cleanup, (ptw32_cleanup_callback_t) (_rout), (_arg) ); \ - -#define pthread_cleanup_pop( _execute ) \ - (void) ptw32_pop_cleanup( _execute ); \ - } - -#else /* __CLEANUP_C */ - -#if defined(__CLEANUP_CXX) - - /* - * C++ version of cancel cleanup. - * - John E. Bossom. - */ - - class PThreadCleanup { - /* - * PThreadCleanup - * - * Purpose - * This class is a C++ helper class that is - * used to implement pthread_cleanup_push/ - * pthread_cleanup_pop. - * The destructor of this class automatically - * pops the pushed cleanup routine regardless - * of how the code exits the scope - * (i.e. such as by an exception) - */ - ptw32_cleanup_callback_t cleanUpRout; - void * obj; - int executeIt; - - public: - PThreadCleanup() : - cleanUpRout( 0 ), - obj( 0 ), - executeIt( 0 ) - /* - * No cleanup performed - */ - { - } - - PThreadCleanup( - ptw32_cleanup_callback_t routine, - void * arg ) : - cleanUpRout( routine ), - obj( arg ), - executeIt( 1 ) - /* - * Registers a cleanup routine for 'arg' - */ - { - } - - ~PThreadCleanup() - { - if ( executeIt && ((void *) cleanUpRout != (void *) 0) ) - { - (void) (*cleanUpRout)( obj ); - } - } - - void execute( int exec ) - { - executeIt = exec; - } - }; - - /* - * C++ implementation of PThreads cancel cleanup; - * This implementation takes advantage of a helper - * class who's destructor automatically calls the - * cleanup routine if we exit our scope weirdly - */ -#define pthread_cleanup_push( _rout, _arg ) \ - { \ - PThreadCleanup cleanup((ptw32_cleanup_callback_t)(_rout), \ - (void *) (_arg) ); - -#define pthread_cleanup_pop( _execute ) \ - cleanup.execute( _execute ); \ - } - -#else - -#error ERROR [__FILE__, line __LINE__]: Cleanup type undefined. - -#endif /* __CLEANUP_CXX */ - -#endif /* __CLEANUP_C */ - -#endif /* __CLEANUP_SEH */ - -/* - * =============== - * =============== - * Methods - * =============== - * =============== - */ - -/* - * PThread Attribute Functions - */ -PTW32_DLLPORT int PTW32_CDECL pthread_attr_init (pthread_attr_t * attr); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_destroy (pthread_attr_t * attr); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_getdetachstate (const pthread_attr_t * attr, - int *detachstate); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_getstackaddr (const pthread_attr_t * attr, - void **stackaddr); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_getstacksize (const pthread_attr_t * attr, - size_t * stacksize); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_setdetachstate (pthread_attr_t * attr, - int detachstate); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_setstackaddr (pthread_attr_t * attr, - void *stackaddr); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_setstacksize (pthread_attr_t * attr, - size_t stacksize); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_getschedparam (const pthread_attr_t *attr, - struct sched_param *param); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_setschedparam (pthread_attr_t *attr, - const struct sched_param *param); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_setschedpolicy (pthread_attr_t *, - int); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_getschedpolicy (const pthread_attr_t *, - int *); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_setinheritsched(pthread_attr_t * attr, - int inheritsched); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_getinheritsched(const pthread_attr_t * attr, - int * inheritsched); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_setscope (pthread_attr_t *, - int); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_getscope (const pthread_attr_t *, - int *); - -/* - * PThread Functions - */ -PTW32_DLLPORT int PTW32_CDECL pthread_create (pthread_t * tid, - const pthread_attr_t * attr, - void *(PTW32_CDECL *start) (void *), - void *arg); - -PTW32_DLLPORT int PTW32_CDECL pthread_detach (pthread_t tid); - -PTW32_DLLPORT int PTW32_CDECL pthread_equal (pthread_t t1, - pthread_t t2); - -PTW32_DLLPORT void PTW32_CDECL pthread_exit (void *value_ptr); - -PTW32_DLLPORT int PTW32_CDECL pthread_join (pthread_t thread, - void **value_ptr); - -PTW32_DLLPORT pthread_t PTW32_CDECL pthread_self (void); - -PTW32_DLLPORT int PTW32_CDECL pthread_cancel (pthread_t thread); - -PTW32_DLLPORT int PTW32_CDECL pthread_setcancelstate (int state, - int *oldstate); - -PTW32_DLLPORT int PTW32_CDECL pthread_setcanceltype (int type, - int *oldtype); - -PTW32_DLLPORT void PTW32_CDECL pthread_testcancel (void); - -PTW32_DLLPORT int PTW32_CDECL pthread_once (pthread_once_t * once_control, - void (PTW32_CDECL *init_routine) (void)); - -#if PTW32_LEVEL >= PTW32_LEVEL_MAX -PTW32_DLLPORT ptw32_cleanup_t * PTW32_CDECL ptw32_pop_cleanup (int execute); - -PTW32_DLLPORT void PTW32_CDECL ptw32_push_cleanup (ptw32_cleanup_t * cleanup, - ptw32_cleanup_callback_t routine, - void *arg); -#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */ - -/* - * Thread Specific Data Functions - */ -PTW32_DLLPORT int PTW32_CDECL pthread_key_create (pthread_key_t * key, - void (PTW32_CDECL *destructor) (void *)); - -PTW32_DLLPORT int PTW32_CDECL pthread_key_delete (pthread_key_t key); - -PTW32_DLLPORT int PTW32_CDECL pthread_setspecific (pthread_key_t key, - const void *value); - -PTW32_DLLPORT void * PTW32_CDECL pthread_getspecific (pthread_key_t key); - - -/* - * Mutex Attribute Functions - */ -PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_init (pthread_mutexattr_t * attr); - -PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_destroy (pthread_mutexattr_t * attr); - -PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_getpshared (const pthread_mutexattr_t - * attr, - int *pshared); - -PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_setpshared (pthread_mutexattr_t * attr, - int pshared); - -PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_settype (pthread_mutexattr_t * attr, int kind); -PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_gettype (const pthread_mutexattr_t * attr, int *kind); - -PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_setrobust( - pthread_mutexattr_t *attr, - int robust); -PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_getrobust( - const pthread_mutexattr_t * attr, - int * robust); - -/* - * Barrier Attribute Functions - */ -PTW32_DLLPORT int PTW32_CDECL pthread_barrierattr_init (pthread_barrierattr_t * attr); - -PTW32_DLLPORT int PTW32_CDECL pthread_barrierattr_destroy (pthread_barrierattr_t * attr); - -PTW32_DLLPORT int PTW32_CDECL pthread_barrierattr_getpshared (const pthread_barrierattr_t - * attr, - int *pshared); - -PTW32_DLLPORT int PTW32_CDECL pthread_barrierattr_setpshared (pthread_barrierattr_t * attr, - int pshared); - -/* - * Mutex Functions - */ -PTW32_DLLPORT int PTW32_CDECL pthread_mutex_init (pthread_mutex_t * mutex, - const pthread_mutexattr_t * attr); - -PTW32_DLLPORT int PTW32_CDECL pthread_mutex_destroy (pthread_mutex_t * mutex); - -PTW32_DLLPORT int PTW32_CDECL pthread_mutex_lock (pthread_mutex_t * mutex); - -PTW32_DLLPORT int PTW32_CDECL pthread_mutex_timedlock(pthread_mutex_t * mutex, - const struct timespec *abstime); - -PTW32_DLLPORT int PTW32_CDECL pthread_mutex_trylock (pthread_mutex_t * mutex); - -PTW32_DLLPORT int PTW32_CDECL pthread_mutex_unlock (pthread_mutex_t * mutex); - -PTW32_DLLPORT int PTW32_CDECL pthread_mutex_consistent (pthread_mutex_t * mutex); - -/* - * Spinlock Functions - */ -PTW32_DLLPORT int PTW32_CDECL pthread_spin_init (pthread_spinlock_t * lock, int pshared); - -PTW32_DLLPORT int PTW32_CDECL pthread_spin_destroy (pthread_spinlock_t * lock); - -PTW32_DLLPORT int PTW32_CDECL pthread_spin_lock (pthread_spinlock_t * lock); - -PTW32_DLLPORT int PTW32_CDECL pthread_spin_trylock (pthread_spinlock_t * lock); - -PTW32_DLLPORT int PTW32_CDECL pthread_spin_unlock (pthread_spinlock_t * lock); - -/* - * Barrier Functions - */ -PTW32_DLLPORT int PTW32_CDECL pthread_barrier_init (pthread_barrier_t * barrier, - const pthread_barrierattr_t * attr, - unsigned int count); - -PTW32_DLLPORT int PTW32_CDECL pthread_barrier_destroy (pthread_barrier_t * barrier); - -PTW32_DLLPORT int PTW32_CDECL pthread_barrier_wait (pthread_barrier_t * barrier); - -/* - * Condition Variable Attribute Functions - */ -PTW32_DLLPORT int PTW32_CDECL pthread_condattr_init (pthread_condattr_t * attr); - -PTW32_DLLPORT int PTW32_CDECL pthread_condattr_destroy (pthread_condattr_t * attr); - -PTW32_DLLPORT int PTW32_CDECL pthread_condattr_getpshared (const pthread_condattr_t * attr, - int *pshared); - -PTW32_DLLPORT int PTW32_CDECL pthread_condattr_setpshared (pthread_condattr_t * attr, - int pshared); - -/* - * Condition Variable Functions - */ -PTW32_DLLPORT int PTW32_CDECL pthread_cond_init (pthread_cond_t * cond, - const pthread_condattr_t * attr); - -PTW32_DLLPORT int PTW32_CDECL pthread_cond_destroy (pthread_cond_t * cond); - -PTW32_DLLPORT int PTW32_CDECL pthread_cond_wait (pthread_cond_t * cond, - pthread_mutex_t * mutex); - -PTW32_DLLPORT int PTW32_CDECL pthread_cond_timedwait (pthread_cond_t * cond, - pthread_mutex_t * mutex, - const struct timespec *abstime); - -PTW32_DLLPORT int PTW32_CDECL pthread_cond_signal (pthread_cond_t * cond); - -PTW32_DLLPORT int PTW32_CDECL pthread_cond_broadcast (pthread_cond_t * cond); - -/* - * Scheduling - */ -PTW32_DLLPORT int PTW32_CDECL pthread_setschedparam (pthread_t thread, - int policy, - const struct sched_param *param); - -PTW32_DLLPORT int PTW32_CDECL pthread_getschedparam (pthread_t thread, - int *policy, - struct sched_param *param); - -PTW32_DLLPORT int PTW32_CDECL pthread_setconcurrency (int); - -PTW32_DLLPORT int PTW32_CDECL pthread_getconcurrency (void); - -/* - * Read-Write Lock Functions - */ -PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_init(pthread_rwlock_t *lock, - const pthread_rwlockattr_t *attr); - -PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_destroy(pthread_rwlock_t *lock); - -PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_tryrdlock(pthread_rwlock_t *); - -PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_trywrlock(pthread_rwlock_t *); - -PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_rdlock(pthread_rwlock_t *lock); - -PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_timedrdlock(pthread_rwlock_t *lock, - const struct timespec *abstime); - -PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_wrlock(pthread_rwlock_t *lock); - -PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_timedwrlock(pthread_rwlock_t *lock, - const struct timespec *abstime); - -PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_unlock(pthread_rwlock_t *lock); - -PTW32_DLLPORT int PTW32_CDECL pthread_rwlockattr_init (pthread_rwlockattr_t * attr); - -PTW32_DLLPORT int PTW32_CDECL pthread_rwlockattr_destroy (pthread_rwlockattr_t * attr); - -PTW32_DLLPORT int PTW32_CDECL pthread_rwlockattr_getpshared (const pthread_rwlockattr_t * attr, - int *pshared); - -PTW32_DLLPORT int PTW32_CDECL pthread_rwlockattr_setpshared (pthread_rwlockattr_t * attr, - int pshared); - -#if PTW32_LEVEL >= PTW32_LEVEL_MAX - 1 - -/* - * Signal Functions. Should be defined in but MSVC and MinGW32 - * already have signal.h that don't define these. - */ -PTW32_DLLPORT int PTW32_CDECL pthread_kill(pthread_t thread, int sig); - -/* - * Non-portable functions - */ - -/* - * Compatibility with Linux. - */ -PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_setkind_np(pthread_mutexattr_t * attr, - int kind); -PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_getkind_np(pthread_mutexattr_t * attr, - int *kind); - -/* - * Possibly supported by other POSIX threads implementations - */ -PTW32_DLLPORT int PTW32_CDECL pthread_delay_np (struct timespec * interval); -PTW32_DLLPORT int PTW32_CDECL pthread_num_processors_np(void); -PTW32_DLLPORT unsigned __int64 PTW32_CDECL pthread_getunique_np(pthread_t thread); - -/* - * Useful if an application wants to statically link - * the lib rather than load the DLL at run-time. - */ -PTW32_DLLPORT int PTW32_CDECL pthread_win32_process_attach_np(void); -PTW32_DLLPORT int PTW32_CDECL pthread_win32_process_detach_np(void); -PTW32_DLLPORT int PTW32_CDECL pthread_win32_thread_attach_np(void); -PTW32_DLLPORT int PTW32_CDECL pthread_win32_thread_detach_np(void); - -/* - * Features that are auto-detected at load/run time. - */ -PTW32_DLLPORT int PTW32_CDECL pthread_win32_test_features_np(int); -enum ptw32_features { - PTW32_SYSTEM_INTERLOCKED_COMPARE_EXCHANGE = 0x0001, /* System provides it. */ - PTW32_ALERTABLE_ASYNC_CANCEL = 0x0002 /* Can cancel blocked threads. */ -}; - -/* - * Register a system time change with the library. - * Causes the library to perform various functions - * in response to the change. Should be called whenever - * the application's top level window receives a - * WM_TIMECHANGE message. It can be passed directly to - * pthread_create() as a new thread if desired. - */ -PTW32_DLLPORT void * PTW32_CDECL pthread_timechange_handler_np(void *); - -#endif /*PTW32_LEVEL >= PTW32_LEVEL_MAX - 1 */ - -#if PTW32_LEVEL >= PTW32_LEVEL_MAX - -/* - * Returns the Win32 HANDLE for the POSIX thread. - */ -PTW32_DLLPORT HANDLE PTW32_CDECL pthread_getw32threadhandle_np(pthread_t thread); -/* - * Returns the win32 thread ID for POSIX thread. - */ -PTW32_DLLPORT DWORD PTW32_CDECL pthread_getw32threadid_np (pthread_t thread); - - -/* - * Protected Methods - * - * This function blocks until the given WIN32 handle - * is signaled or pthread_cancel had been called. - * This function allows the caller to hook into the - * PThreads cancel mechanism. It is implemented using - * - * WaitForMultipleObjects - * - * on 'waitHandle' and a manually reset WIN32 Event - * used to implement pthread_cancel. The 'timeout' - * argument to TimedWait is simply passed to - * WaitForMultipleObjects. - */ -PTW32_DLLPORT int PTW32_CDECL pthreadCancelableWait (HANDLE waitHandle); -PTW32_DLLPORT int PTW32_CDECL pthreadCancelableTimedWait (HANDLE waitHandle, - DWORD timeout); - -#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */ - -/* - * Thread-Safe C Runtime Library Mappings. - */ -#if !defined(_UWIN) -# if defined(NEED_ERRNO) - PTW32_DLLPORT int * PTW32_CDECL _errno( void ); -# else -# if !defined(errno) -# if (defined(_MT) || defined(_DLL)) - __declspec(dllimport) extern int * __cdecl _errno(void); -# define errno (*_errno()) -# endif -# endif -# endif -#endif - -/* - * Some compiler environments don't define some things. - */ -#if defined(__BORLANDC__) -# define _ftime ftime -# define _timeb timeb -#endif - -#if defined(__cplusplus) - -/* - * Internal exceptions - */ -class ptw32_exception {}; -class ptw32_exception_cancel : public ptw32_exception {}; -class ptw32_exception_exit : public ptw32_exception {}; - -#endif - -#if PTW32_LEVEL >= PTW32_LEVEL_MAX - -/* FIXME: This is only required if the library was built using SEH */ -/* - * Get internal SEH tag - */ -PTW32_DLLPORT DWORD PTW32_CDECL ptw32_get_exception_services_code(void); - -#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */ - -#if !defined(PTW32_BUILD) - -#if defined(__CLEANUP_SEH) - -/* - * Redefine the SEH __except keyword to ensure that applications - * propagate our internal exceptions up to the library's internal handlers. - */ -#define __except( E ) \ - __except( ( GetExceptionCode() == ptw32_get_exception_services_code() ) \ - ? EXCEPTION_CONTINUE_SEARCH : ( E ) ) - -#endif /* __CLEANUP_SEH */ - -#if defined(__CLEANUP_CXX) - -/* - * Redefine the C++ catch keyword to ensure that applications - * propagate our internal exceptions up to the library's internal handlers. - */ -#if defined(_MSC_VER) - /* - * WARNING: Replace any 'catch( ... )' with 'PtW32CatchAll' - * if you want Pthread-Win32 cancelation and pthread_exit to work. - */ - -#if !defined(PtW32NoCatchWarn) - -#pragma message("Specify \"/DPtW32NoCatchWarn\" compiler flag to skip this message.") -#pragma message("------------------------------------------------------------------") -#pragma message("When compiling applications with MSVC++ and C++ exception handling:") -#pragma message(" Replace any 'catch( ... )' in routines called from POSIX threads") -#pragma message(" with 'PtW32CatchAll' or 'CATCHALL' if you want POSIX thread") -#pragma message(" cancelation and pthread_exit to work. For example:") -#pragma message("") -#pragma message(" #if defined(PtW32CatchAll)") -#pragma message(" PtW32CatchAll") -#pragma message(" #else") -#pragma message(" catch(...)") -#pragma message(" #endif") -#pragma message(" {") -#pragma message(" /* Catchall block processing */") -#pragma message(" }") -#pragma message("------------------------------------------------------------------") - -#endif - -#define PtW32CatchAll \ - catch( ptw32_exception & ) { throw; } \ - catch( ... ) - -#else /* _MSC_VER */ - -#define catch( E ) \ - catch( ptw32_exception & ) { throw; } \ - catch( E ) - -#endif /* _MSC_VER */ - -#endif /* __CLEANUP_CXX */ - -#endif /* ! PTW32_BUILD */ - -#if defined(__cplusplus) -} /* End of extern "C" */ -#endif /* __cplusplus */ - -#if defined(PTW32__HANDLE_DEF) -# undef HANDLE -#endif -#if defined(PTW32__DWORD_DEF) -# undef DWORD -#endif - -#undef PTW32_LEVEL -#undef PTW32_LEVEL_MAX - -#endif /* ! RC_INVOKED */ - -#endif /* PTHREAD_H */ diff --git a/applications/plugins/SensableEmulation/pthread/pthreadVC2.dll b/applications/plugins/SensableEmulation/pthread/pthreadVC2.dll deleted file mode 100644 index fcb5d9dcc1c18b0be18845a34c3aaf0ae37be200..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55808 zcmeHw3w%`7wf9ak2?Gqw023G`K-7tXAkJj+noJVHBOxe+NkV2oATcBZNrWU$W&|um zaftPJNVV5@A1bA`-d0f`IYwJW@3tK!ScYHDhI@yk5%UVlw|RZaY?`9<-oYAZZbhYcHIR;!+K=!r4I zo_%Ll5HvgH&C=t2w0Xv?;XMA`Sy%J-Z2msl>{ru$vm$tW&MY1Oou&THUc{&+AK8Rw1KDgg1 zAAHW(qe|DpV!Ixv`aElVc)jm#1k^vmRqZ#P_`i6@uASY$x^{lK##-u@r0Ihhw1HJOi=pHlh){_GJ=wI8dM#kE9fX~`8>JXfmh9EHu z!90+^?KXO{U4UR}Is$tUf~RLAs2zvkV~l)T&SV5PgGbtaOZn~vi?v-(!Cb0z(A5ZT zxdOqs3lXG&|J!C#lld6Ewl=U~o5q6Rp;!bLUWp)w+P#@7czy(e7z$pahUP9saM^SO zUyMgEkE%a37D3Ad1mh{+9I9{QDg?hTMsSkyB~#7BqisK+%zpxBx4lPY_Yn#|ga~N! zQfrx4A-L@#1Vs}OY#WJS5uuf|0>PDY5u_95#RUlBS0Wf&g&^j71e*!1eMF%#RP#$Y z2<9aqxSyK5s{+9`s`OdvUs5%KJ2DWwJPg4fYY}8$gW#to1TG?zm7ab^PtOp(k$wcL zh|Xz*{z}8!Gjo3 zJ_81V0Sf%Dq<}cftf^+zvQv(Ae!&cl&Avf+oQubnKI!2W*O|4|%q_=W%d`8ZxSaSW z$1cHZH4{5rNK$I@53ZJ7a_mAR;Aa7TN=kcGO6|KupIPU2H8p6RLQHF}j@GDFtPBWq zG1sA(##Zpgd__g#II6sw33ZxkInbSyU`u zL6}pY4dQrrHEU|nxaGg0>hUgTk%GIU!*_XLx6UQK+bPR|oggrB5S0VX+TMgNEm^v_ z-!6bYT5+yfV>?jjED*GUQztkPYLtdf92(mkI1)ZoL{AW8gvbyM-H`UF+`Q8tWovHP z8UaG~Zl>B)9U;f&9b<;TPA!m#*-GSZ5f_-XgrZikpt06$tP6~ZSLuX2UE^L~lrY^W z%+R%FLy99h-y-B`m1u*IYq2$-fud^v3Ph(tM4nf#efk8CbXIT7*u+UQyJtc{G zM$xIXS)fz08^t`0eYy_G1v&xf$_ca3{obhY0i*T;N7EXc^&5>?WK{kM4x+m$&(h?K zYg&`kI?K$F5$2lXg#~7lu+ALURAFYIy-7w|(=78uX903y$ze>YJt51W(L^y4WCIV( zHCu#1px2ZF&I$!hNGo)@NNrlsrlZxL&&liVqE`VWs^pr~t3&-!i(0jSSZ;Nu9Sp-0DAi%!w!Ly1Bj?hB zZgGM^Y|w~f#QB;+4Esbmb|o^1k~pZEfxwk`Y5YXLaReq#V4c~Z(cck+M=_J8KlML2 zHg90s^cwKu;DA%=c?|d)-3B}~SUz(auQu!q7zT3qNFc!;TGYGRb;agBJ-yr6ya~@&?vpCNn4!2)V(|5Xso@n|`PZD#DV!lqv z5R@EX5PKa>-#i`G1)94dnodFe96#_y5Wk7eAbvEF{zvGlZ)`dx%ROnU-*^XNmA>*$ zeh(_QO`)n3CQ@dBI-31pOY2J?quJj?;G;=1p-(OXHyfG0@uF{Jnbw}b&a{4n=NZ<) zfuz1E5IAbwY&pUVww(}sh9YqZMB_}Y%l$w#i;mwsh*f6K(6hh+R_K&otAsQeN;;D` zQ&TBHbUF*flhTcdj_Me75&}?HD92{g{J`|XLWCt6vqQ}(6;km-`e!KZl>T1 z$3nB{mML&lOG}2<2~n&qupO6UeGr!rr!Y*BcA0=xQ)Ao9wGmoh8(;E8Opj{zpFq4p z+${_#!GhYdbto2D{?x7VK3-g;km_v59jE;~b-6Cy}iqw2d8R>fT{Kb)5jb|*&3 zuhtSB_&UP>38ZV!v7su?SUy`rRq!6D&Gq^@V|gl^r|H)08S`h8YWscL)Anjlq}5$3 z7MKJ>w=@-hZ9rna3-WwHs$oP#ZR>OsF$nT+-OwNHsl2ONQyoEU-K8??Nm+iD)Mg=4 z+)>iPak2;z;_g25U?gf>w&NJ=(P9J`!Qd3EA?BeHDrfZ~yc(g>GnS9Po|-~cgGAOJ z+o<_XBIO%NJq?_U@M#(k_@iyj!iZj+cCPsKjUDKNMNNzOav`5D#=a)T88Q5K;}oG|`Kao5to&i?i@ z{qaRGp6KV8W!Cw*OmRT)V@pSz4XNLkKvC$uR-Fr5>WC=e88=f*SV7RQsMzJ^I4dMP zZj+^Jf$C<4We-#gbVm5bVcRAQ;}MWWF~Tqn(!@0eq0T7Q>C|1r5;OMkSSC!$o{6Yt zC=70)5l^JNQX%DiZQV%OrPlN`T8M9yViJ)~6W-|{an9kF@T2jLBNTNCmq;7Xyx5=< zOAM6{gOt!mrJZGrDN9O;AtK)(H0WA$O@ojq!`T%&D|5=yj1_$QR;ls&4DYjm{uN4Q?3jd@6t+K#KeP&yDo?>j%Zs&(Du zJyeQ*++uZXKTjVFh(4Va0IOojR)2Y4xEgT5utQT2L^;A2y^ToQry`@$ zEW{80F8(3>v$Y{)c>iy{KSX(IUyKmJs7i+lnlxsovap z-puvW@#_9&G-A1Sh52*C;8qNtqG|WB%TdesyFW7Yr|1Ux@l5?!wB_Lb$k-8|aMI-?O91HyB3<)DyviUX-*zX3}X7n$|Jjh+rp4Vc^OA zZ;sLH{@TYm(06VBjO_#oRE=uME*#{A9=+{F((jvIP-HtSEHP^o4T}`4MJ==;(Yl?| z!$+WIt~AF5cG48Qcsp^2t6JMl!NPhsp($5aQo0lc$@CGBBO2Zed>i5aTWM3yWfV&> zW591Fp#kOyszk6Nzu1B_QmYH3z3-wSXm#QtYU(g*B-OhqSK}0}lzvOSK!O$tF|9GQ z0}`(w>qevOi@`aTQiL{2rmlKj^54MF)N|faE7%3b}Z^Qr!F=X(Hb8RQnk!n^3R_GD-xshTkj``H7H$uqO;8742)AodGEz!L3%XGHkV!Q-iP_t0krOfIul-Tq4e6&=+o_=??sT zW6@1bVN;IQDa}P?U^iWXbk#dt3>J53=grvR#-EkeXB&&Y()syxqwL41m$pFvBS8fN zD;=QF>5fb6lw&vHp#)<}Am{*lz|hmq6VB@4SH)HeZWp%>GeMX}U5Rt zPRV*0(`c4CNlfNT5#}EbshslbstlmV(h~8*rG4>0IA4*m!zRN{RQh*R*de~@IN`rc zu>z>)=E}bJgnuxJ67g@e-Ms;_#b7(Uc?||9&>S%$a~&SG(3{&W#B8Rw>IgT)kg$y} z{o6L8_rkVK2wQKx6CoGc4e>%loY1gFXjm8A>Y8y@dI6oixpW1E(mXy4T55Nx?ZDy| zZu$@p_U}v(j#xj>-RwKJp`*4>VBfj<5RhMDo+3s;l98Ov@44^)%0H-Sy-u*TUssHO z!c?I~Bh;9L8m&+hwo%`Ojr#T;8+DXP4RoINkF1P`k)%kPtYX#K9v|rZ7SU!NZ45;Z zcI@&;Z|576aq3wtY|bkMO&yn?1Cta7xZktyYGswqje%FTVFi+3U84u($1aKzSi zC{85(*D-AvtwWPNfMMp7-6eLQ)&+vK%iA!0wB8xcRAi9Zt$GpzZSPjmm`SAtPIC_KQMPch~6P=+* zM(`YrXn~v7G2bExSaJa>zEhmNPPD)>gi~eM+{iWL05-psTA^AiI?0~|FFK)GXP-_R zVeGRD)*(0f17ItEP|SyblUKgFy2Clk~i+T|O>!A%AFz{&BeV{qPnZu^C! zCR7;*`jLWOOv_smEpFuS!kv2Pm{R;SAV;nqw3Rjq?L*~*p&f;zL%-=4ppTMFdybyT zcMu;3PJiB@3!FZ^e$b2Xu8`aHfz$f+LjtEG8=_w%O%SS~fltuDOR$UE{t5!GGn>TO z#J9y*ne#Yr`Y+^pn(9VNCX4|Vn4m4!M0%@9c!q=}5HJ=R6{Yq;P}icGDo2Nw)-K(vo26F~PvjvK zrh+|wpqqH=&(cd~Rbs&Jf(p;8te+c>?gJ@d==N*L&TVqq4s&BZb|!JsUAzl0<@#1) zEp_A@{1w}2L9%lR5@}s^yyvum;$bBs;nmulTD>=B(jVeG5rWIQHXkV3rxio*Q2a zk_^6E1z{4s*Wmz89I&aGkG+@CHwR8Y)iUNb`6oi3z@!V)BhrF;L>nPB%Usci9+8bA zsvgm@_#9M;?>tt06;Rg?9A46pw17}_5D6uPwn>V@MG4q29aMI0!7bCE?WD)HUl_hy z8m8`+XisN5E+i|G+@D5up*$J%vDu1lTBAF2Ij)z=zG!Lxek?tt^wIM9-I)^z^97BR zF1{*Wp)QJtLW^QiP=Uv8R4=a9iM0lj5?t?+#)A`}qkW9^@&-=s3 zG}4*mk5CDz4kU|+qfNqSZY&>BSk1BRaZNLa*APuXTbS!Zw7LZv; z7jEU!D3)mEDwLLRCe()d(%0CXOI+Znj`o*EF^6G7@XZE#GK9-EY?^c}(22aU#ZoQr zmj==s%Z0viBxVjxXC{_t-HnI!x6#_{zgoa0$V8YW5q;_39wpGM~dB8&{zM3XhmAa z#K1QZe!a~1*`XRrOMsEqjEnA{wuL$ z#5=(~YM1=K6kSHhpSfs9ASx_v^ z!XV)th8SIN;Hug4M4lq3W`q*DsKseq+iq$Mt18xJqnK+bfIM)v zp<2-^#2K2dLp6QlK2(R2woj-c{~j_2k?(@81y5ZPOPcVqA~|UL>=t}*uwG&|hq!T! zuv#aS8d_)bS=?0z_6hdYI{yU6EB>)unA>M-^^ISm$%xsSuxtu4O8;@ZOnujH`~f(w zNB{3aFM9M}*RB6MNwq{F6Ln~IA03+AC0R@%M%Hiq2(?I#y{P@q^5kP(l7;p|*yaZ> zFX%UZfsBdEahj=mdvNJtHk0+q^h%WK#)0CgtOqsYn|uArP8vF6njNn67Iuq@+FS zP#VUfzo(pJ!d`u#ArdiT@-3acoOkl%MLa1Fk<>> z;u zGn6``vk{j-`i9$r)aBK5wwOY6883(!V0B4HYobUT5gkV^}- zPH-7i-Ocf~zVReVNuRWIjb|GoXguG;Z$wQuRYcMC!bICJC_P(AqVcIL{R-7!%&OVs zZ&V!!{p~K4F2z0qK1Eb*NQsisIlPA}QI2o?mrHI`2ffDN6m!W?bQ`iMs*=8!iu3?a z<0=xDo&Jlv1Vk~KlYZK}4M=%Dz%)nDd`RIsw}JW><>KeBm~&0}niGc#FhZ@l+)N~~ zm*{lr3h@oIs?HYHAp*9zCaFKHzwHaZ6K)rbrq^k1$66s0q#TGjB|N>3xiM@Hl)0AruRaH9Doi zJ&+py93eIN4adtjT`ul8aVY99!f^1;C63kx95Q3usf=n6#YtIB3xVSEgd#W{mdmZ% z6fQXIO9*nJU{WadJc;(6k>82iy5ml7wEDs#@QH7+xSoNw3zS{dydqcAYK=>32SWtW zPIM98anfj|he}6E7MF(R$;_6E zg~!k8Nw0JWsAyb}NtvPry+{q5mf;phD;F-3M3O~7-847Ep{a&Z)XYfUOvej+982I= zeWs>@_|4|{O;_Dfn>v8JrYI zPE4f1x47JnL%ulaC+M%(0fij!E?&xE<<}((wTgEYh^l zi1WTIkc&ISd8aV;(o(axS8Kc5|TjzJ(`R2BZ0v$fBkaW0ACTYY?Yv#C$Ed zVXtozmD+;5P%89dC-k6vt#bLXecALpeqe|gXw(b9&<*RG@*&Rk!D@VCR03Lxq+kD$ z*Dda*FL8i|#A%c884%^{L-q|3v($PA$-|X;8?;4I9f}1d!Ub;rwT->cP)&4_hkGQX zG zL@6_l>Nh@4m7;(+4|i!aVzChyZ!iWfoukud6X$E;cOl%hk(vP$!tzE-xqY_LKUP}z zv@D}3lXxe0NTOxExt(uciPxG$IwUKo*0?I8M#6Q(Da@4$wK2BUM7+Ted3zlggeFj6lcB@PlehN!#H+{szgsZ4w(ZMC``%ai{qj~n1z|lAo zb!Ionvm85*DIie^xA~BL5li$OC`(4H4w?e#!lyX@2C|s{QmiFL`nrRz@<~wKDK#RE zygQ{^o}^3$#jzL55VjN_WAMNQG+zTdm4U>;SD z*C+8_@o5?8yh+~}O`HgfIH%k5wf<4|e2s57>{<{=P1E({tBG92)`2YVWuUJXW>s=O{^q8 zHR&xhL(A>7Z@n7f%J%3Nxg90=wGP;HxgOf>wjCraxU`oW>?B^3;#1qd8|*HUzto$v z6Zw1O!1n~y`<6y$<^AM;B1>O90fHu1;syB9L;`P_n|?{=aY$qT1x@oKFmwhf{v`6< zU=ll(JpO+ux+n(E2x{P>E1V@1cR36eIm{VD4s%A;!#KWB8jIFIeU!ki4?1W_0S$MU zJMr$=X3!&WWGF~-{$CSN?qAS;%*6L&BWWSx`@0PdruQFzOdq;=k0Z+>_h8NhcP zO|Br(2>D{Sk$SIcqqzU5T0!7Zv*8=E8Qc)dFH`l(kW3C7bjuLVsiX$d7N@BWPLteB z6{<*>&{V6j9fpE(9rwL_U6K7-M+Y1<7V6q9^id%wRB$TAy~$iHOm{)AQ6uQ2cQq}< zhY?h9X*&+5ct3L-@{e~`Qs?LkUK23^h1s-im{=^mp^UnFTQ_gbo}GexH40>Tvo)Wq zLF_DZLER6K#iCGL3PZB*>ZW?^>Sqwos|LL+d(`^zE~(~mKB(Jio+};WUExMRd~*XB zkw^hE`Nv5!)Vy65mae?5IW%!tYZMVeG9jm!S%;D&nP5AX-*8EL75)iy8hoEZM^&kK zK6sNq8FVgO_r_SlBa&pT^6jLb;|c8U%MWBlVMjUap*Y>c! z($JmUuBAADrB?SCS1 zeD>MP?WgdN@m+^8Fk;%5yQJk2FD~Y4)Gd}? zR~|xSg^wMCJAE0)P{7x6X(DpKE=1!e#;(L16>I=N6X~=< zQ%rU)u#7mmDW(l(hLo#j4cq;3E6QxdLz^{1ob%3by-@lS>LEp_?N!iTk*w0CXdAh} z1)=>Tx7rL3#jC5bXuw{{K(+*_?N_Kr@wV{~bxRK`-4i7{A1D7198qqe0c?l$Bn}#{ zP++nvLy4rgEi|Zx38q{OO!O_jK-M) zc-igP<%_jX#ODVvH@5Q=Za$}xn#t88`pU!`%1xWE{7SB_IlZ){h*TonG=VpuP-Cl|rpXs5J?-TA?`w4^WF3u?8&plZyay?)1Y1! z7fJVlhk`Z6LA5M)N)J5}itM}k4tYF5$Zu_8D62HHMoO;yB!qYrM(n#*H88kdj3_TYhh~IoOjTyYzh@(-T=7x7nc;iQ zt(#oU;nxvEst)8SeL#lH^0;f^8wOVqAHVn;kIlhx?!_G8ixXRIdtt55^J@cp<@P8s zAD2UeCi?0K>B3)fTwx4LgCH@ZWH;96^CfW9THgNHIep$3r>Cf(G6JaeM~CskBjP=Nnp$o5Jd$1t_9bxDOsW zA(HUbS9(TCP)sJKE|bZ>^zH}|T%qr{&EfPV$3UVlA7mofJBa9_?xuZ_d)s{hUzUhP9+m@uA$;P_8h3kM^!T z=k_)n-H&tY;3qaWn)l(&B|dF_3%{5`a8JgD2&-HKBuX4f6nr11z}33Zyc1)+|9WPS zW8)DmZZcCnCANLGX6ZOKP8)X8``LGB(0?&E<7i!n`d=W$JV+y|6ErYL>lwto;m#K4x4j<$9D{**KUWjJTj8nb9Ki(^| zz4#PKZ?S$e7HJHEsX&^^No7D4bQAz8Vw*|ifmXa7Ugym5#`;lMDzLrA>Bd}S0TG9{ zYZc7b(UmbR$67k6bgip~zFG6%607P~iULCFIPL>3`zgdv&-;KkArd3{eeVPQ{3nXU zAm;AZ79G^^&qIab%+kv!gGCo+*W>M@`!dS->DwRVL9VW|IK(juu8E>@eeAezWbZ;f zq~b6!7vHJ~md84MEhiSftl70rlTvmbBgofV<&+Q%CjIgOb!DI%4P(_A1#j(KGq!}Z z|I}~Cv}f()cu5-tuAmlR=TC|VIMqm;x+l=a^cxQ#b&hXL_;S^>Wiq)rH%JtWIDOxEBgnR&?jZ6a9}&>rOc&o+>0O4ZC3Azl8k?ZhL(EGudOeq z3fz2XPtwp*LhEcrx&2{Kxs~$JuRe!%ctI}};><&va=#)E!iSdJPNWZ&gp#c!N;wi- zHv2{>R$CsUeCi0cJ^pr17C%C<-IZyt!rcPqt5R<7h9 zK6rf#tw202kV%ise^F~RJ$!{f<^~Bs&Qo`yOlve%1LCoETjc_!ERtj7{b+6kub``3 z`^$k$p4~Snz`qt3DQ+@rfeqQw@mcLH5GEUT66(EK{(F(M+xkNrV5~py-wk5+Tz?(} zg#+Jz{TYY4F>(3n-@jx1;eJ4n%~QCG(WT@cIoc(?t+WdA55}2`zHuW)MNH{=2I!Ke za3o=}@O$K3-G&C8j3b;Pw|_1-UJU0XJ8g#57wMe=~$uD-g zut^v$U9G-yK9(}^rV;^uvn1-2Iw{0)7D?aleE!{IxMAZ3caB%~*NueDaf7 zN;s0Yr}V{FRIghq;2G(tZ&Z&{VyX*jCO_)Zou{0JzDd(G9+z-!p$l%(htvz0a4>Gs zfmiWO6{loWheG0_sa_d)D512NUGKI>0qdXtsDG?Yg!OpoMkNb;T2rtt8tKo@#B=PQ z0QQAAi-{-49mx%xL4{)JlP_`ennzv5OBxmT|1s(*7nW8KK+w{eIoAeNYMj3j0{dgW z-Q|jq@=Xz+Stm{7t&@)!ZJp!kqavfkKhd<$SA4=g4(!G~iEX63U^ha(QN^V9k)sNI zOud_<3Pu}lJNOhKk)X>_#oNTm$Cs*p9aZq%MDXKENknE)ehBx1=i5*Rw)K940|Z5^ zndSoDochf0Pa=N$#j)U2G-GJ7-S&Xn_e z=l*0J*sW;LLq=PT?f9j|Q@`<#cv2V8OB6oA$YXKzMPm`gCrDG^{%UYbrcFUa^mHd^ zc<>cIT#DBuu0ICgJO=8*ZU*X;hE{oGAu$*^w8EHydgG-pP_RgnM5@hz7+Rn%0wpFo zxi{uSg&1f)cxtAFzafm;(smR;q>zocW*WcBwF{7QR)79vGC z2U(H<^8vX1cSb8b9vsHEC(ygyy6pwT==p&7cJ{XkYI%`491zh5}2!% zZumA-H~vyWu5q1Y+Y4j#Jv$1d_XXb0Qf%0U1aI5s8bZy64b^!)_DiqdDENiw^-6#A zqDwJx__B+UBLt?^H$E7o8jkwDMLk3|atXr%JXk@8`oENuo71hTAG#IvBHOFHybkV6 z7ZelaGEQ|-PDhmc5EtO+z%xX^&9`v^f_^dhz=^ETPHFqRDArX-PN1_?<5t`_o5Ci zMp9P``}VnAMK+q;#-YvYjkC#l_{5S{%|$L!13{373D( z!*<}r=e$7!eh;=!$1|nC)`S`iueHDS_t!pt?agy(NS@NRrCP%OBN6|zZ9n;#H+nS-d;XAZAsCx=e72+`JqPR$-WEFCBPM*De z1pa=*82;y@6hi=fTio*NkcR(kAJm#dN5gFMTd21>lD-@`xO#$gDZa$lZm%>v%?y>= zCuxsN>6B55M$)21G<$BurmIr(2V}t?3O7g}0mDT?GG(+KUSwaY^J~!zzXxw0rvZ6< zah3EVMNmdGGz{0vTrls*u@o(H)Z6&2?=yAxRH(aj7jPIlyO!!}djg%4lW7>lWDO`K zzYYS>>KNb&G&FFuJOqb(A;%yr)dt!%j-@(pe!#(e$6)ZoaN47MZL*CD;&_K5gebYV zQ>j#bT~4MtDD8D|UZ;H?{jHcBt?wBDPWSUrsa8DH{u|kkMUUJB7b!Jxmf*}`Yu-Yn zvFDufYw3Gt73d@Q1Q*x$V)3XpR6hD5XtN8fA$~1>Auh#d!Lx;&4{Updd8dTrY)n@n z=al1fzroJA0w434_dy#SdEryt(fH(^f9mEtVZ6ZK9>M1aisbz$8(9AV?3Z^T4`QS{ zAiEJsB)M6Q`mc>VioUvG20O&Nokdau;@sr@REqq(N(@yD#lRqPoSKUA&!qaMAsvOH zE>aruDeWV3La_bzv0~0q+?5$D%sYZ3lQ*E`EyA4^j}-8Hz=)??b53FPm8HSxkC^j; zqyzRXtXSeAUGi+HiCt>fW;TeGqBb(-g)& zLE*T^C`^8o!pvVHT)ruGKmQrFlmCo+nEyoojQ=Fu&wsAC8$Un0BYF>h@Hwt6FYsT@ zmS+6o3&&gb(R&Y4HTnsJgEg$VHTr2hadstXD>NQLkcv0vhEqita*3FYWRq7E4}I}urVH-=JiC>Hih_&UE2^~;eJf}Y4M&jE!6gc_(^NRp zlyk({l=Fd;h@VWdPJZ1f%|RJx1wzhSvi}45b&dZqo#Q*w3w{HY1<>`88M${htGt-SlF8wpt$Jh?wJBnJ|67-D~*V7;9aD43@EH2bW z{oV16cgT!D^F+t%UI~U*eCeW_lFRF>K3&;?p{jiLPFi3v378XqM-P6&+-_>k>9p+v z={qX6P?F%mHPln|R0%LhmxFrHq(PtsxcYJh#W|G}Cr^Qfs%FRE4D3}vPB3ul>UgN-p(aFWh29EI z;3)i~g&UXe3{8N^N4n5E1@wTG?8kSVPpR!ezJ@Sv32$2IY=I&ZWWN!Mhr-I0r+)|% z(hQSmON8w#@e;q!Yv6PYcsjYXDROVm|0w(U=P@m0IFk-*Z1D{~v40Cq$aasbDW?+# zVF@!%^q;c%u>#x-Ubl59pAV$pqe!!Lpm)gELHTmNwB>ZzI^b^x*hIR9v%{A$q5^IcpDEl@$gO_ zlKmW-A`fTrFq?-NJWS(Z5)UmroWjG2JT&t#o`-QfH1W{LLjw$L6%_yP|FH%K8v2i*fTy#0K6R9C3M~N`aoldi zFz1qLWEK!E`Ygi(O}4(D7hr;b>Jb=;%{`ICnQ2*;}QS`Aj$U=|@Kck5|7}Fv?e;%e}FC*ofMJOua&U?0GV z_#uEPcoqRaK;8!d4m|%i;0>hRj&}{72Ll!WG7z@{aVPQnL%{C=op`?kZ~>kl#cv{h zKfv!RfM24_VZbyze+$UQvk9;bdCKv-3a}LMsd%^I`C0tF2iODn5bs|D?nZhFexF8M zGM?K2Mm#@&-&+xX37*sOtjF)5os3-!NCV6RQ~_=UYzDjtI0*OzFlZP03rGeO0#*S8 zz(as%0S5u?0EWN684IuioPa98ZGig#zXP-Y{s!QGr?VAf0GJGz4ZvSIU~2)l0UiK6 z3iuPC1@I=I1EAT1egIMd1%ML3^?;3l9|L{^Xa*bvd;~ZRFygZNB*09-wSe`22LMk2 zUIzRVpurzfiwC3w768fsYXF-7zW}@lI0X0{Fa&on;sGgu0zfU`hk!=_PXhJ=-US>7 z==LEmAQ>dCz%jtcS3x&`6W|4G1l$Ms9bgyW5TG4!0ub?M#)bhd z1Y81`0!RkT1{4Fz04o7Bvm>#~(y(Y2!v--e8_b5Vp-jhyvEfV);W&bgWTTjo#j??C z3^TC{*oAB?i(}*1cs7B>vy0fp>=I^X3G7mK8Jox^vCG+HHiccmrm`!Ug;`l5v#}(W z%u-k?OJjDH&KxX*WwI;|@)sXG+fmQ<`<8GM~tR#Wa-S+;DYXF=5}PldY-J6APlS5kOvX_?RGEv@j> z`@FSlgISfx6&_!O$5&QfS???Jd3vQ))l_=CRlfT2N>4?vL>^mL<}F**Pg3p5s`B3L z)tA@S^==96mtR*_QQ_@f7p2r!-PofH_VFRK6HoR7G>8>&3IS4^Ln zQ&yhP2il>uUj677VHgU+rbh*)-`diex)24FITU*JT<;G<#Z|H~o|>+)R}y*-z7pGw>Ppng+Vbl{{ZOL# z==T-xUE4>jzovI&pM1e94>HDeRbbq(VeFRJlj*x9dTW>Y!&tprns05GeCtZ-jdqaR z`tL>`bFZsHB=*}4q;=~?jek{Xowv5!Q(s@}tq;c;%-AJay{n0gy_O0!x*G;+oVTJI z;ni3^cxOmj?d`LacWpmqyleX|(PP-v*89xcCpRbsg6z<9#KThiKs`8mJxkSlRxS_m zGR8p>mfhFaP;|FJqS!uU1ETwo4HVl`Hq_Tu)$|%X9@(w`Jf_Y*FM2|O|y;fJ%*b;-RN9#0njsDXWIodm&nk`)p8SM9Zx^b^ky(0Mf ztzAtHuN=~{6hgDqv!>ir=c}r%Da8rF4ON&QkY*J$At*;(ZCz>kN>5phpF};6@z+;| zqWGxrYU;dIwa}B+maZyW!}^Mbm<>hq2meYBG(FO*(6TbVVNq+VJS!_$y=N8Ls;&3% zr=T#USakh{vXy=%fsZZ4LKi_Zc&Mv|YzjU=NU!u&)vZ)AcP*-vjv?pEDLrGPt7@*} z#dsX4+XMdwC@?^Q0SXLI;QuNG=zN)g{sn*Ona-T)pB87vMu76h7~P!w!v))C1>a#t z=Kq541Hb=S6v+O(tG}ba#CILOfGxJ8D{et2Y_4H>x>6W>>?_y-k$ySA062Amv3CG3 z0e%N~5bz_w8bBo=ACLvO955Q71$=oN^#k?+wgP?u_z_?opc1eEa1#BBL0e`(A|Ma2 z5a0#e2DlgSOTccxn}Cl2oq*vedm+FKNCM0N{Hy;RLEl~n{29;;_!Hp20P6tNfF*!@ zzzjelzzi4yhy-*VgY6aYCg5d2GvH5v#{drk?geZDeBXZql zPdGJ+UhegH@C|~<(&eO9rzDluGqy8&m70DqdX;AtlzYa;N0xfL-kMs*#^R}_LfMdb z)_}`2r2bd0syjDZoiro7CDrts(CXBJv5 z7H%76Nm1B*P{&}y@v#f29oosjzTt<#=84Es+9vos-c{@mUC*T+wkx8vY*qaV?1abx z${JBxIVs#&qp zGk;mNr`*SGVKcdXi&r=uXF=gL2CJH0QNh^JzEap8&4QKn=#Y!=y;|vQcJS>n^ zr;g=DBFd?lTBa{wPE=nzudE(4YmPw5Om6uLW?+$&doHY|IbLtAm$93p=3^757H2zp zmzYz*c2T?26&~D8&$+~g^+c(#nwCXS^xUdt-ZJl6mJ{q1u)`J_eEI<8U%)+}oa*kC z{fKh)h?CeXe;o|@uz#ww-5J&^B{NQRdc~om>~vHijE80Qo+8hxvbxGzFJ{YU;gp?I z1B2r#KDwhcg`RrPF3DvI&aQ=Sk%{J0B)nYG}IHQvE49jO4HDJBPXg0V*kkN%UR=G4zpC!Z5TN5uMd z6ucU}Yn>kN@>=gIGRDuW_4B^m#qqByzm7-X1hNZ*1rSlw>(MAbHey%j6z1p5wJ9e{ z-*@pEDE~i5fe5bXn;9gmL?ai7$>hzRy{RQFN?Z@nq-bW{=|T{y`t zMVQ0Sbm!oFHy`hF5a!~U{=KOA>@@Aj2CF-<;O{h^s`vs2_h@PqGlKpRsM&{;-YT5> zu0U;7I05#c<{F#|LrGvAC=`K_Oaj>X?=l)!oFPv@yb~pBafa;2NwN>UDZ}Y81S|eI z(XS%ZvyjE(47w8eJV=Eh5${y97r$=aY6ad_^Z2!C8>82ke5a!k+_}#pCQf9$r0Z zXpR15;mkjR)6K_wSp#fWhEarS=%RuPr4w<^KMU9@_~!ER^LcA4I9;fG5C^JFq3qe} zsf0&C1ZuBE{yLPZVQa&B0lyr?dJr2A9BMIcUSQ}^-vDA9&_U{I3tgD~QchUfT+!cBfxGye(F9 zYTMAxm8feLAObUus1T%n*KELk3?3iYWg?YmTMx|3(2FkK7_51MG7S71puqp16o6%K z6EGW^GCCzaWllj;DN^l9XDI>Px*T^|{oTv|VXmqU&U`ZSmCOT~9hnQJZJq|<06!-9HCn1HuUqC= z?Y3KO7bGo9I+-*j*^#_1S)X!IN@mK{DN9mTq}-5lcS>{0D=G1*#i=V&SEa5^y*0Hp zH8<_YX)mVjPn%@F!G0wD636I_(V6zlTQj#$`-~P&EOh(uGuCp2CDk&=;Q9o8n3-NqIjdD|Kn=^3>}knCPXGvL+(=MO( za@6vLWvDgQnrxkJJpz|Ad*X(~`xB2O4zgWnE4S6#Zo!{l%}KgC>H4I*l8z@Qr~DwL zCFQG>^wf$}Z|d(-52v=Lo=mMs+mrTr+J*K>_B+ylo!*%~#BsHw%yFxuJY#pp*BLvr zzRXIPwqe@-X%PBs9r|Fl_$>EX+|~x`UDmk7*@?eOyx4ZT?KPV&X-ral(z8i3LACPa zJCdJI-kUrDAg&~oy$$EQ6u1)XiI*i> z689#)o%mJa7+bRKDcj4of7HehWk_IOiCm#eS{WWD&suiQPHdRc$D|Jii zZ&II3U5=i-k#>RIYQM%_VfWi_vj5orJNqxvPo?V}iye1mypU0rS(|xdW+3z7%$G9X z%)Ac0dLZl3tf#VG$ogy6Ct3TZwNE=qd{(FM*_T&ahr>t+1}Q zzGi*b`myzxRhO8MI6ZNG;x&ooiR%*YNqi>pt;A0fk0t)q_7B^qwi7me(!`|1BuCO! zNo7fX^gc6rRr1ZrJCY+(v?=|CN2a{WJTDbRqq&^as;_m)@MdD}7)3f%L=a|45h8KTSW8{!My}L+2Rd znB=$;v)195<#^HY30xDWX8@O*;TIYKA4$tYmX|G`S?;m!v3_kWNxV1lw~0p+^+}VG zRwP-I7bGuCUXpxm@+B$Pq<)(EC3uLXol1+eYwg4BM*D^Kc>AUHDfa31tL;vEF?zPz zen0y4lzl5C$Up6!c0+nX`sL}C^t|+W>5I~<(reRiNN+-af1SQP{f+du(>u})j*A>q z97&EPj&et(W0k|_*x>jt$L}34IR5ImEMoyU<*ylUW*o`*DC20x7vNHsIVf{@W^86$ z<|UbvA#EI)vooEU#hHsUJ()F`Ycm@&Z_oTm=0ll}Wd1gDN9LZ)zhu6hDP?||8Id(Q z>!PgGtod1svhL0LDMofj){(4_vTmE!H0_~jFHU=H+8fi@o$z}GX|gP{ELT~amNH9& z;<)jog|6XH0;#!hT7#u#I4;{n6WfC+{H2Fzo44a57z z?fufw0oYNr|M!Ltj3W&?xWmwqzYr-p{C7h~t|AROddASHbwrAeuQhb-X(C0F3k{uq zhe*){*i&@&Q$y!IAyRa4*w7`^PtkdlMbX7y89KioY0xRuS{J`|Lc7wsRV`K8g;Jwjq1lL7Te?VvVyDw8 zRO{7_(#>TFvgJy<(`wxH#M4|s0|hQuI>pj-yHo7wGCDXuQ_ye6^nIqF4+tQaZWPPq zmRD@f5_Dlcq{~@?t~K7S-V_{>NM8#T;-G*)<;E~?df8xQqH>7HR1BZR#3;N6_?Mglp6K2&;(v~KqsxA zt$eDMasrxewQ|ZXGobHQD5vi-x&Do6t(LX3NpXqF&2G^VNs?R!_EFJNx7DiDOU^9f z=W{L8O4Rc6xz3+Ep(^WaPmW1X}8%n%@k8sNZ0MPyt>N`S#bL;Z^7k8 zEOhR=vqn~as2f&D7bOhormT=IjJFzBx^3qT#E>mBqz?cqlCQYK6!h`ZthcM}PNnXH zGmfCC{Q)JvQLUE?^=39MSkY5%$O4L&%7}$ex!eNu5DJ+0^>ndbu2one0_?DjDzAjA zpRjVe-Fo$AHwWwFa*cX-rqFCP5UI2qtu`yIz~Z{Mt98UZS#*L>f*A<$MJotj3Rf$| zPPc`i$?dtsN{-L1v~JfL2qp4SQ;reTOJ@Vy|3u>cpa<41LfXfcraHj*I5H6eB zux{TjO;^gzMy={j;UZJeM-jvNJ~O6YY!zp+k*DEPb;A?1QMqb;y3(qeLU{T)u3!Ne z5eqpkx8N1fw!W8bbaX4}c)!`IHc;Zbg_+_VDunXGTGhI&rSe@ZR9_qK)+z{<4Gzz9 zrEQ^IX`bgw->p_^2-J+xB$4ndGX=z}s*LHcj8m#L+K6QpEBTr6y7gMMe#0>BZ^N|> z+iq6tUI^f1aoHP{yM+=KYVIP%&C5%dE47L*ZS%OaYL{lERJ~d)WiH1uxxAT;k{PpL z)=$E8B?w4%lDRWzCePKF0lqD61A?d;U1RR?yX>?k5C6zRr>v#>Ey0@K6-F8<)1!is+)vBH) zj7^o*Y^Z=M`^7nhnQpC9ZPt=;r-YrXOcoA&t61wMVp+;7yBdSMu6hibEJ4;bTUtwH zz-9{aX`3;HG?!~6E5w3n9;?A~t%llfX*Qaecq+wuSBH7IEGFA+Pv?YLo|QIRAZpE5 zXjiY*-E|Yo6y&e88pU#{=myMM#mV=yygALzaa;t!1q<KHB+7i`CJLidhh2Q(}d=EMwLS_Q|Kc0Xcoa~hG zd>?W{Geq}mkjKf;CncP);<>#-^aGUTgI%x(`Vq?eAlQiaNNhVIfGT1HRNlk_y5qXzAx?@*1NrBT{Vuh7f1 zj&9Q!?V@kf8oEHs=>Q$12|7g2(OOzbFVYLNf?lHMX*I2)SLr-mqpNh2TJ$|?Q-?0m zJsP47^g3;%w`rQH^b8%Q{Zyo#G)Yr*g09m=YSJEBPp{E9Jwm7GG;N`+w2j`R@6uaz znT}I|w$o8MMz`n)?V#@eyZSD|uEK+zf~F^(IzG-`np4?(k) zga$%A16E2p__TX^wvalg2(J#+8Z=OLttk~pGwi~Z*F>{|5sBtXEvXo>W=#3vHcUlA zCGORF$vTQ+gJDWtZ#dF!li_G*jj-)Tom3ckS4!KBd2=R!UI`rX zF`2-CXEOE}R4At|3!tQBa%Lmgcy{3QENOUZ%1|KFtE3Q-O4{?JP};Rh7CV6%F5yZw zPgr)n$y+sHYS-y4VHaSsjoGhUMSa-?lLE$&V-9N6t=j~=&k+hYp!J=Ajlf2~d6S7@ z8Jxp#B^Oc5@U#kUcv@A=z_c3M{nI?D`kEn4E1D75oz^_LN5flJ$_s@}R_-mqy`Pwv zdCBR$B}q&biJzv6Qt5p^yWJF#5)jpvJLazNtw(FFkG*-LqMboFVGVQr6H}B+8!=~~ zuAcR^JSTVfnLF3?CM&fe1)$`pB>_n{y0f%7M9tFXkcX$mbDUhbrV!P>n6s!-S#V5! z-kO;-5=o?)t;VLZ^;(X1+T9oR)@U|lwG$6pnfOe;Ch@uMK$m&a{RQ2hdIgfx$<`hs zOSr0OW(6hj*xR41*Nuan9S)XB1Vo$Nv=^-fy^%i#63xy(fh z?m{PI$o78v%J6_RUj)m&Y^T%XYEI(H+wX*PT5$G(t0%F?EU}E{a9hAN< ztq2xufmDrGKg~wZqS6X$1$}av{UBk(Bl*#5DVeD9-g{lFw_BWZLN7v!S~)#E*4ma}$YFNu+&7!+Wh@Yi=b_Y=l zxc3HapSyYX#vlSu=MrGr**q#%DbwTXmx+YcFMiR~V-1ySwGFF!eE~YMaWwfB^zxF41&gTi?~ji@u>dD;I3ZJqWJBf3mF~4Q zCrlEjZTRtDHjzBXXzA{uDuRgOnoX9q3_tz{^w%U~5uRhT@#92pG|9%f8cybbXXRA> z7_ItvA)Zg+JWl<4oLA~)dUENb$W|uRza^mMKYQYEwbW{~8&^B4)=j>$YU02VoFC@@ zJ%%i$s0`p-Q~y$B_=^6;fl!iCW2T8BFaOzp(|`VBA(fW;r^>jHY|Y1rbg8Fpj;^D^ zT4ZyEl?*a)o|kBiWH~DTMfG3uPg%zaYm!org*bJ@mxm8{qBTgb*)+1*@tTF&Yd+E? zROOVtrmR`ne~#B|wz6y(fsusB0}SbG@2iiupioJ{)U9^ECjtq@B4ibYxT#& z*z-P`zbRwS^JrcwqCSk#{H-AJAV#zO%Q~yPH|08v<|kZayFG2!lb(C=Wbc_X78g7z z;Yt%p-##5fT_&OGl`OB@1H6+1Gp340o)S>mmXrt1lfBz{G!TDn0QS=%Y-i(><2^v# z-;m#suK@qsA^d^#b*$#!2_fU7P9E#Vw_edJCTTtFixdw>O$iC|ui*sHOk;BttzqO97T2_nL zgYe{7jb9W|!_#8lH4gN%nibbDY;(Jm+wcGVlWqZeqxJ>hz2xGhr@V7UjMQ)~N7Sdt zbH=lOCef?mO4RUW7tfqhdvHA2dz=mjW+b)$xQ?NzLvU{W0eUZhrrv3|w@mhQqn31>ldJi+Zg5ZJnKj#MCr9 zih~EwlfCO4+qD@Ap_>~N9IEfuj*XrTF0#I$;eqwt$|LFDQ{_96>ilM-i{@ManNQ3& ze9Yv6$y_mGt-6U}stYW0MTj|J0`y`Dc;{l9BsJ0V;0m^#>&fO$D)(Y}#)%~k<7x&FjqJg=SwYGmGjGmn~F z@bEzU?$_ANyDf(r3-ftNde=90D)U_#88L;ukj2p+z_$W3u{sml9z-A1PDCu;e=CTd zTqyIZ&Xcof_s9v!jv%(a_{5?5_wY#UxKl z)Aj_h2jOY4S#8`!&R@KoqmRcTpS>=!zSrr2^*wvXcBA&WXvu}kKmgJ|ZeX>bcHZ6= zaHV0)>)w0bip5&{1Kya1!veA#g7Ny#&99FLsB&fdMUDB^(L8D_@ax~V0<(wOYd99b z9^4LZY*leQfIf)%Ycx{p$pG%)c6np(r4uf?z7Ws7ssHFY_FkIeXzarMoN*&7x0537 zAfk;}ZBO~A&WA_yS=-Yd?!(y=J>#Q3ggw!-3{(A~&4EQZkrT~xIn+VS5wV+G=W~by z+3SexI$X#h+HXzf?74xtP{ofIbEpG)&jwcfYVY-ui|KqSGuL{?=KKP~6hFoB;CZrl zWHB0;4L733mtFMGmp&Y@|JXT#Uku}CANtG{Kj7Qyrp=W+e(pOZ55E66CxTxR@cr+g z<`cgh#1A%q-}SeDC(*yjratzm82nz}ad}O^lf6ekY(Bl3mB9T>j6?M8^Rd18YYw9O z6`BXxcRR=8k78+~yOv8p6d_baTdy%;eV@uCBQLB5yu1Z)BJV*awF>9GE{> zVEoiFO!JkYS3#caJyM1PZ{%lzHKVcc6`}cvk(>583@}pODUHomv)2f1)~9q}W{Dc9F7A zU_D5l?Cl*Rk$XBFix|AZ*DqRZG= 199309 -#undef PTW32_SCHED_LEVEL -#define PTW32_SCHED_LEVEL 1 -/* Include 1b, 1c and 1d */ -#endif - -#if defined(INCLUDE_NP) -#undef PTW32_SCHED_LEVEL -#define PTW32_SCHED_LEVEL 2 -/* Include Non-Portable extensions */ -#endif - -#define PTW32_SCHED_LEVEL_MAX 3 - -#if ( defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200112 ) || !defined(PTW32_SCHED_LEVEL) -#define PTW32_SCHED_LEVEL PTW32_SCHED_LEVEL_MAX -/* Include everything */ -#endif - - -#if defined(__GNUC__) && !defined(__declspec) -# error Please upgrade your GNU compiler to one that supports __declspec. -#endif - -/* - * When building the library, you should define PTW32_BUILD so that - * the variables/functions are exported correctly. When using the library, - * do NOT define PTW32_BUILD, and then the variables/functions will - * be imported correctly. - */ -#if !defined(PTW32_STATIC_LIB) -# if defined(PTW32_BUILD) -# define PTW32_DLLPORT __declspec (dllexport) -# else -# define PTW32_DLLPORT __declspec (dllimport) -# endif -#else -# define PTW32_DLLPORT -#endif - -/* - * This is a duplicate of what is in the autoconf config.h, - * which is only used when building the pthread-win32 libraries. - */ - -#if !defined(PTW32_CONFIG_H) -# if defined(WINCE) -# define NEED_ERRNO -# define NEED_SEM -# endif -# if defined(__MINGW64__) -# define HAVE_STRUCT_TIMESPEC -# define HAVE_MODE_T -# elif defined(_UWIN) || defined(__MINGW32__) -# define HAVE_MODE_T -# endif -#endif - -/* - * - */ - -#if PTW32_SCHED_LEVEL >= PTW32_SCHED_LEVEL_MAX -#if defined(NEED_ERRNO) -#include "need_errno.h" -#else -#include -#endif -#endif /* PTW32_SCHED_LEVEL >= PTW32_SCHED_LEVEL_MAX */ - -#if (defined(__MINGW64__) || defined(__MINGW32__)) || defined(_UWIN) -# if PTW32_SCHED_LEVEL >= PTW32_SCHED_LEVEL_MAX -/* For pid_t */ -# include -/* Required by Unix 98 */ -# include -# else - typedef int pid_t; -# endif -#else - typedef int pid_t; -#endif - -/* Thread scheduling policies */ - -enum { - SCHED_OTHER = 0, - SCHED_FIFO, - SCHED_RR, - SCHED_MIN = SCHED_OTHER, - SCHED_MAX = SCHED_RR -}; - -struct sched_param { - int sched_priority; -}; - -#if defined(__cplusplus) -extern "C" -{ -#endif /* __cplusplus */ - -PTW32_DLLPORT int __cdecl sched_yield (void); - -PTW32_DLLPORT int __cdecl sched_get_priority_min (int policy); - -PTW32_DLLPORT int __cdecl sched_get_priority_max (int policy); - -PTW32_DLLPORT int __cdecl sched_setscheduler (pid_t pid, int policy); - -PTW32_DLLPORT int __cdecl sched_getscheduler (pid_t pid); - -/* - * Note that this macro returns ENOTSUP rather than - * ENOSYS as might be expected. However, returning ENOSYS - * should mean that sched_get_priority_{min,max} are - * not implemented as well as sched_rr_get_interval. - * This is not the case, since we just don't support - * round-robin scheduling. Therefore I have chosen to - * return the same value as sched_setscheduler when - * SCHED_RR is passed to it. - */ -#define sched_rr_get_interval(_pid, _interval) \ - ( errno = ENOTSUP, (int) -1 ) - - -#if defined(__cplusplus) -} /* End of extern "C" */ -#endif /* __cplusplus */ - -#undef PTW32_SCHED_LEVEL -#undef PTW32_SCHED_LEVEL_MAX - -#endif /* !_SCHED_H */ - diff --git a/applications/plugins/SensableEmulation/pthread/semaphore.h b/applications/plugins/SensableEmulation/pthread/semaphore.h deleted file mode 100644 index c6e9407e25b..00000000000 --- a/applications/plugins/SensableEmulation/pthread/semaphore.h +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Module: semaphore.h - * - * Purpose: - * Semaphores aren't actually part of the PThreads standard. - * They are defined by the POSIX Standard: - * - * POSIX 1003.1b-1993 (POSIX.1b) - * - * -------------------------------------------------------------------------- - * - * Pthreads-win32 - POSIX Threads Library for Win32 - * Copyright(C) 1998 John E. Bossom - * Copyright(C) 1999,2005 Pthreads-win32 contributors - * - * Contact Email: rpj@callisto.canberra.edu.au - * - * The current list of contributors is contained - * in the file CONTRIBUTORS included with the source - * code distribution. The list can also be seen at the - * following World Wide Web location: - * http://sources.redhat.com/pthreads-win32/contributors.html - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library in the file COPYING.LIB; - * if not, write to the Free Software Foundation, Inc., - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ -#if !defined( SEMAPHORE_H ) -#define SEMAPHORE_H - -#undef PTW32_SEMAPHORE_LEVEL - -#if defined(_POSIX_SOURCE) -#define PTW32_SEMAPHORE_LEVEL 0 -/* Early POSIX */ -#endif - -#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309 -#undef PTW32_SEMAPHORE_LEVEL -#define PTW32_SEMAPHORE_LEVEL 1 -/* Include 1b, 1c and 1d */ -#endif - -#if defined(INCLUDE_NP) -#undef PTW32_SEMAPHORE_LEVEL -#define PTW32_SEMAPHORE_LEVEL 2 -/* Include Non-Portable extensions */ -#endif - -#define PTW32_SEMAPHORE_LEVEL_MAX 3 - -#if !defined(PTW32_SEMAPHORE_LEVEL) -#define PTW32_SEMAPHORE_LEVEL PTW32_SEMAPHORE_LEVEL_MAX -/* Include everything */ -#endif - -#if defined(__GNUC__) && ! defined (__declspec) -# error Please upgrade your GNU compiler to one that supports __declspec. -#endif - -/* - * When building the library, you should define PTW32_BUILD so that - * the variables/functions are exported correctly. When using the library, - * do NOT define PTW32_BUILD, and then the variables/functions will - * be imported correctly. - */ -#if !defined(PTW32_STATIC_LIB) -# if defined(PTW32_BUILD) -# define PTW32_DLLPORT __declspec (dllexport) -# else -# define PTW32_DLLPORT __declspec (dllimport) -# endif -#else -# define PTW32_DLLPORT -#endif - -/* - * This is a duplicate of what is in the autoconf config.h, - * which is only used when building the pthread-win32 libraries. - */ - -#if !defined(PTW32_CONFIG_H) -# if defined(WINCE) -# define NEED_ERRNO -# define NEED_SEM -# endif -# if defined(__MINGW64__) -# define HAVE_STRUCT_TIMESPEC -# define HAVE_MODE_T -# elif defined(_UWIN) || defined(__MINGW32__) -# define HAVE_MODE_T -# endif -#endif - -/* - * - */ - -#if PTW32_SEMAPHORE_LEVEL >= PTW32_SEMAPHORE_LEVEL_MAX -#if defined(NEED_ERRNO) -#include "need_errno.h" -#else -#include -#endif -#endif /* PTW32_SEMAPHORE_LEVEL >= PTW32_SEMAPHORE_LEVEL_MAX */ - -#define _POSIX_SEMAPHORES - -#if defined(__cplusplus) -extern "C" -{ -#endif /* __cplusplus */ - -#if !defined(HAVE_MODE_T) -typedef unsigned int mode_t; -#endif - - -typedef struct sem_t_ * sem_t; - -PTW32_DLLPORT int __cdecl sem_init (sem_t * sem, - int pshared, - unsigned int value); - -PTW32_DLLPORT int __cdecl sem_destroy (sem_t * sem); - -PTW32_DLLPORT int __cdecl sem_trywait (sem_t * sem); - -PTW32_DLLPORT int __cdecl sem_wait (sem_t * sem); - -PTW32_DLLPORT int __cdecl sem_timedwait (sem_t * sem, - const struct timespec * abstime); - -PTW32_DLLPORT int __cdecl sem_post (sem_t * sem); - -PTW32_DLLPORT int __cdecl sem_post_multiple (sem_t * sem, - int count); - -PTW32_DLLPORT int __cdecl sem_open (const char * name, - int oflag, - mode_t mode, - unsigned int value); - -PTW32_DLLPORT int __cdecl sem_close (sem_t * sem); - -PTW32_DLLPORT int __cdecl sem_unlink (const char * name); - -PTW32_DLLPORT int __cdecl sem_getvalue (sem_t * sem, - int * sval); - -#if defined(__cplusplus) -} /* End of extern "C" */ -#endif /* __cplusplus */ - -#undef PTW32_SEMAPHORE_LEVEL -#undef PTW32_SEMAPHORE_LEVEL_MAX - -#endif /* !SEMAPHORE_H */ diff --git a/applications/plugins/SofaCUDA/CMakeLists.txt b/applications/plugins/SofaCUDA/CMakeLists.txt index 9ec20b48eda..ed1cb7f93d0 100644 --- a/applications/plugins/SofaCUDA/CMakeLists.txt +++ b/applications/plugins/SofaCUDA/CMakeLists.txt @@ -396,7 +396,7 @@ target_link_libraries(${PROJECT_NAME} Sofa.Component.MechanicalLoad ) -target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17) +target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17 cuda_std_17) if(Sofa.GL_FOUND) target_link_libraries(${PROJECT_NAME} Sofa.GL) diff --git a/applications/plugins/SofaCUDA/sofa/gpu/cuda/mycuda.cu b/applications/plugins/SofaCUDA/sofa/gpu/cuda/mycuda.cu index 89bd6e5d672..0617c7ee550 100644 --- a/applications/plugins/SofaCUDA/sofa/gpu/cuda/mycuda.cu +++ b/applications/plugins/SofaCUDA/sofa/gpu/cuda/mycuda.cu @@ -28,9 +28,6 @@ #include #include - -//#define NO_CUDA - cudaDeviceProp mycudaDeviceProp; @@ -43,139 +40,6 @@ namespace cuda { #endif -#ifdef NO_CUDA - -bool cudaCheck(cudaError_t, const char*) -{ - return true; -} - -bool cudaInitCalled = false; - -int mycudaInit(int) -{ - cudaInitCalled = true; - return 0; -} - -void mycudaMalloc(void **devPtr, size_t,int ) -{ - *devPtr = NULL; -} - -void mycudaMallocPitch(void **devPtr, size_t*, size_t, size_t) -{ - *devPtr = NULL; -} - -void mycudaFree(void *, int) -{ -} - -void mycudaMallocHost(void **hostPtr, size_t size) -{ - *hostPtr = malloc(size); -} - -void mycudaFreeHost(void *hostPtr) -{ - free(hostPtr); -} - -void mycudaMemcpyHostToDevice(void *, const void *, size_t, int) -{ -} - -void mycudaMemcpyDeviceToDevice(void *, const void *, size_t,int ) -{ -} - -void mycudaMemcpyDeviceToHost(void *, const void *, size_t,int ) -{ -} - -void mycudaMemcpyHostToDevice2D(void *, size_t, const void *, size_t, size_t, size_t) -{ -} - -void mycudaMemcpyDeviceToDevice2D(void *, size_t, const void *, size_t, size_t, size_t ) -{ -} - -void mycudaMemcpyDeviceToHost2D(void *, size_t, const void *, size_t, size_t, size_t) -{ -} - -void mycudaGLRegisterBufferObject(int) -{ -} - -void mycudaGLUnregisterBufferObject(int) -{ -} - -void mycudaGLMapBufferObject(void** ptr, int) -{ - *ptr = NULL; -} - -void mycudaGLUnmapBufferObject(int) -{ -} - -int mycudaGetnumDevices() -{ - return 0; -} - -int mycudaGetBufferDevice() -{ - return 0; -} - -void mycudaMemset(void *devPtr, int val, size_t size,int ) -{ -} - -void cuda_void_kernel() -{ -} - -#ifdef SOFA_GPU_CUBLAS -cusparseHandle_t getCusparseCtx() -{ - return NULL; -} - -cublasHandle_t getCublasCtx() -{ - return NULL; -} - -cusparseMatDescr_t getCusparseMatGeneralDescr() -{ - return NULL; -} - -cusparseMatDescr_t getCusparseMatTriangularLowerDescr() -{ - return NULL; -} - -cusparseMatDescr_t getCusparseMatTriangularUpperDescr() -{ - return NULL; -} - - -void SOFA_GPU_CUDA_API mycudaMemGetInfo(size_t * free,size_t * total) { - -} - -#endif //SOFA_GPU_CUBLAS - -#else - extern "C" { int SOFA_GPU_CUDA_API mycudaGetMultiProcessorCount(); @@ -513,8 +377,6 @@ void SOFA_GPU_CUDA_API mycudaMemGetInfo(size_t * free,size_t * total) { #endif //SOFA_GPU_CUBLAS -#endif - #if defined(__cplusplus) } // namespace cuda } // namespace gpu diff --git a/applications/plugins/SofaCarving/SofaCarving_test/SofaCarving_test.cpp b/applications/plugins/SofaCarving/SofaCarving_test/SofaCarving_test.cpp index 1424f4cca7f..5e8eef63918 100644 --- a/applications/plugins/SofaCarving/SofaCarving_test/SofaCarving_test.cpp +++ b/applications/plugins/SofaCarving/SofaCarving_test/SofaCarving_test.cpp @@ -61,9 +61,10 @@ class SofaCarving_test : public BaseSimulationTest void doCarvingWithPenetration(); /// Unload the scene - void TearDown() override + void doTearDown() override { - if (m_simu != nullptr && m_root != nullptr) { + if (m_root != nullptr) + { sofa::simulation::node::unload(m_root); } } diff --git a/applications/plugins/SofaDistanceGrid/src/SofaDistanceGrid/RegisterModelToCollisionFactory.cpp b/applications/plugins/SofaDistanceGrid/src/SofaDistanceGrid/RegisterModelToCollisionFactory.cpp index c6bf75f0684..6a0f20f31d5 100644 --- a/applications/plugins/SofaDistanceGrid/src/SofaDistanceGrid/RegisterModelToCollisionFactory.cpp +++ b/applications/plugins/SofaDistanceGrid/src/SofaDistanceGrid/RegisterModelToCollisionFactory.cpp @@ -35,6 +35,7 @@ using sofa::core::collision::Contact ; #include #include +#include #include "components/collision/DistanceGridCollisionModel.h" #include "components/collision/FFDDistanceGridDiscreteIntersection.h" diff --git a/applications/plugins/SofaSimpleGUI/CMakeLists.txt b/applications/plugins/SofaSimpleGUI/CMakeLists.txt deleted file mode 100644 index 6f8153328c4..00000000000 --- a/applications/plugins/SofaSimpleGUI/CMakeLists.txt +++ /dev/null @@ -1,44 +0,0 @@ -cmake_minimum_required(VERSION 3.22) -project(SofaSimpleGUI) - -set(SOFASIMPLEGUI_VERSION 0.1) - -set(HEADER_FILES - Camera.h - Interactor.h - PickedPoint.h - SofaGL.h - SofaScene.h - SpringInteractor.h - VisualPickVisitor.h - config.h.in -) - -set(SOURCE_FILES - Camera.cpp - Interactor.cpp - SofaGL.cpp - SofaScene.cpp - SpringInteractor.cpp - VisualPickVisitor.cpp - initSimpleGUI.cpp -) - -sofa_find_package(Sofa.Component REQUIRED) -sofa_find_package(Eigen3 REQUIRED) -sofa_find_package(Sofa.GL REQUIRED) -sofa_find_package(Sofa.Simulation.Graph REQUIRED) - -add_library(${PROJECT_NAME} SHARED ${HEADER_FILES} ${SOURCE_FILES}) -target_link_libraries(${PROJECT_NAME} PUBLIC Sofa.Component Sofa.GL Sofa.Simulation.Graph) -target_link_libraries(${PROJECT_NAME} PUBLIC Eigen3::Eigen) - -set_target_properties(${PROJECT_NAME} PROPERTIES VERSION ${SOFASIMPLEGUI_VERSION}) - -## Install rules for the library and headers; CMake package configurations files -sofa_create_package_with_targets( - PACKAGE_NAME ${PROJECT_NAME} - PACKAGE_VERSION ${SOFASIMPLEGUI_VERSION} - TARGETS ${PROJECT_NAME} AUTO_SET_TARGET_PROPERTIES - INCLUDE_INSTALL_DIR ${PROJECT_NAME} - ) diff --git a/applications/plugins/SofaSimpleGUI/Camera.cpp b/applications/plugins/SofaSimpleGUI/Camera.cpp deleted file mode 100644 index 498cb77f94d..00000000000 --- a/applications/plugins/SofaSimpleGUI/Camera.cpp +++ /dev/null @@ -1,196 +0,0 @@ -#include "Camera.h" -#include -#include -using std::cout; -using std::endl; - - -namespace sofa::simplegui -{ - -Camera::Camera() -{ - transform.matrix() = Eigen::Matrix4f::Identity(); - tb_tournerXY=0, tb_translaterXY=0, tb_bougerZ=0; -} - -void Camera::lookAt() -{ - - glMultMatrixf( transform.data() ); -} - -template inline T sqr(const T& t){ return t*t; } - -void Camera::viewAll( float xmin, float ymin, float zmin, float xmax, float ymax, float zmax ) -{ - Vec3 pmin(xmin,ymin,zmin), pmax(xmax,ymax,zmax); - Vec3 pcen = (pmin+pmax)*0.5; - Vec3 diag = pmax-pmin; - float radius = diag.norm(); - // cout<<"Camera, diag = " << diag.transpose() << endl; - // cout<<"Camera, scene radius = " << radius << endl; - - // Desired distance: distance * tan(a) = radius - float distance = 1.5 * radius / tan(fovy * M_PI/180); - // cout<<"Camera::viewAll, angle = " << fovy << ", tan = " << tan(fovy) << ", distance = " << distance << endl; - // cout<<"Camera::viewAll, xmin xmax ymin ymax zmin zmax = " << xmin << " " << xmax <<" "<fabs(dy) ) -// { // rotation z -// float angle = dx; -// Eigen::AngleAxisf rot( angle, Vec3(0,0,-1) ); -// transform.linear() = rot*transform.linear(); -// } -// else if( fabs(dy)>fabs(dx) ) -// { - transform.translation() += Vec3( 0,0, -dy/100); -// } - } - tb_ancienX = x; - tb_ancienY = y; - return true; - } - return false; -} - -Camera::Vec3 Camera::eye() const { - return - transform.linear().inverse() * transform.translation(); -} - - -} - diff --git a/applications/plugins/SofaSimpleGUI/Camera.h b/applications/plugins/SofaSimpleGUI/Camera.h deleted file mode 100644 index 1ef48542626..00000000000 --- a/applications/plugins/SofaSimpleGUI/Camera.h +++ /dev/null @@ -1,86 +0,0 @@ -#ifndef SOFA_SIMPLEGUI_CAMERA_H -#define SOFA_SIMPLEGUI_CAMERA_H - -#include -#include - - -namespace sofa::simplegui -{ - -/** - * @brief The Camera class implements a simple viewpoint transformation, and its update using the mouse. - * Currently only one displacement mode is implemented, and it is not extensively tested. - * - * @author Francois Faure, 2014 - */ -class SOFA_SOFASIMPLEGUI_API Camera -{ -public: - typedef Eigen::Transform Transform; - typedef Eigen::Vector3f Vec3; - - enum {ButtonLeft, ButtonMiddle, ButtonRight}; - enum {ButtonDown,ButtonUp}; - - - Camera(); - - - /// Set the view point. Parameters correspond to gluLookAt. - /// Note that this just sets the parameters. The actual viewing transform is applied in void lookAt() . - void setlookAt( - float eyeX, float eyeY, float eyeZ, - float targetX, float targetY, float targetZ, - float upX, float upY, float upZ - ); - - /// Apply the viewing transform, typically just after glLoadIdentity() in the draw function. - void lookAt(); - - void viewAll( float xmin, float ymin, float zmin, float xmax, float ymax, float zmax ); - - /// Equivalent of gluPerspective. - /// Alternatively, the definition and the application of the projection matrix can be done separately using other functions. - /// @sa void setPerspective( float fovy, float ratio, float znear, float zfar ) @sa void perspective() - void perspective( float fovy, float ratio, float znear, float zfar ); - - /// Set the projection matrix, without applying it. Parameters correspond to gluPerspective. - /// Note that this just sets the parameters. The actual projection transform is applied in void perspective() . - void setPerspective( float fovy, float ratio, float znear, float zfar ); - - /// Apply the projection matrix defined in setPerspective, typically in the reshape function - void perspective(); - - - - - /// Set the camera displacement modes and return true. - bool handleMouseButton(int button, int state, int x, int y); - /// Displace the camera based on the mouse motion and return true. - bool handleMouseMotion(int x, int y); - - /// Center of the camera in world coordinates - Vec3 eye() const; - - /// Viewing matrix - const Transform& getTransform() const { return transform; } - -protected: - - Transform transform; ///< Viewing transform: world wrt camera, i.e. inverse of the camera pose - - // camera projection - float fovy, ratio, znear, zfar; // parameters of perspective - - - int tb_ancienX, tb_ancienY, tb_tournerXY, tb_translaterXY, tb_bougerZ; - -}; - - - -} - - -#endif // CAMERA_H diff --git a/applications/plugins/SofaSimpleGUI/Interactor.cpp b/applications/plugins/SofaSimpleGUI/Interactor.cpp deleted file mode 100644 index dd5eeceab22..00000000000 --- a/applications/plugins/SofaSimpleGUI/Interactor.cpp +++ /dev/null @@ -1,35 +0,0 @@ -#include "Interactor.h" -#include "PickedPoint.h" -#include "SofaScene.h" -#include -#include - -using namespace sofa; - - -namespace sofa::simplegui -{ - -Interactor::Interactor(const PickedPoint& picked) - : _pickedPoint( picked ) -{ - _interactionNode = sofa::simulation::getSimulation()->createNewNode("picked point interaction node"); -} - -Interactor::~Interactor() -{ - _interactionNode->execute(sofa::core::execparams::defaultInstance()); -} - -void Interactor::attach(SofaScene *scene) -{ - scene->insertInteractor(this); -} - -void Interactor::detach() -{ - _interactionNode->detachFromGraph(); -} - -} - diff --git a/applications/plugins/SofaSimpleGUI/Interactor.h b/applications/plugins/SofaSimpleGUI/Interactor.h deleted file mode 100644 index f7dd353a718..00000000000 --- a/applications/plugins/SofaSimpleGUI/Interactor.h +++ /dev/null @@ -1,58 +0,0 @@ -#ifndef SOFA_Interactor_H -#define SOFA_Interactor_H - -#include -#include -#include "PickedPoint.h" - - -namespace sofa::simplegui -{ - -class SofaScene; - -using simulation::Node; - - -/** @brief Base class for all interactors. - * Interactors are sofa subgraphs used to apply actions to the scene, typically through user interaction. - * - * Note that they are not necessarily moved using the mouse, since there is no mouse or window coordinates in the API. - * @author Francois Faure, 2014 -*/ -class SOFA_SOFASIMPLEGUI_API Interactor -{ -protected: - Node::SPtr _interactionNode; ///< Scene node used to implement this - PickedPoint _pickedPoint; ///< The point attached to this - -public: - - typedef type::Vec3 Vec3; - - Interactor( const PickedPoint& picked ); - virtual ~Interactor(); - - /// Insert this in the scene as a child of the given node. If overloaded, this function should be called at the beginning of the overloaded function. - virtual void attach( SofaScene* ); - - /// Remove this from the scene, without destroying it. If overloaded, this function should be called at the end of the overloaded function. - virtual void detach(); - - /// Current interaction point - virtual Vec3 getPoint()=0; - - /// Displace the interaction to the given point - virtual void setPoint( const Vec3& p ) = 0; - - /// Root of the interactor graph - Node::SPtr getNode() { return _interactionNode; } - - /// Simulated point attached to this - const PickedPoint& getPickedPoint() const { return _pickedPoint; } -}; - -} - - -#endif // SOFA_Interactor_H diff --git a/applications/plugins/SofaSimpleGUI/PickedPoint.h b/applications/plugins/SofaSimpleGUI/PickedPoint.h deleted file mode 100644 index 640bb9079b9..00000000000 --- a/applications/plugins/SofaSimpleGUI/PickedPoint.h +++ /dev/null @@ -1,64 +0,0 @@ -#ifndef GLPICKEDPOINT_H -#define GLPICKEDPOINT_H - -#include -#include -#include - -using sofa::core::behavior::BaseMechanicalState; -typedef std::size_t nat; -typedef sofa::type::Vec3 Vec3; - - -namespace sofa::simplegui -{ - -/** - * @brief The PickedPoint struct represents a vertex of a State, typically picked using the mouse. - * It is returned by the Sofa interface to the user application to set up an interaction. - * We call it valid if it corresponds to a valid index of an existing mechanical state, and invalid if not so (the pointer to the mechanical state is null) - * @author Francois Faure, 2014 - */ -struct SOFA_SOFASIMPLEGUI_API PickedPoint -{ - BaseMechanicalState::SPtr state; ///< the DOF of the picked object - nat index; ///< index of the particle picked - Vec3 point; ///< location of the picked particle in world space - - /// Conversion to boolean for easier test writing. True iff the PickedPoint is valid. Default value is converted to false. - operator bool() const { return state != NULL; } - - PickedPoint(BaseMechanicalState::SPtr state=0, nat index=0) - : state(state) - , index(index) - { } - - inline friend std::ostream& operator << ( std::ostream& out, const PickedPoint p){ - out << "state: " << p.state->getName() << ", index: " << p.index << ", point: " << p.point; - return out; - } - - /// Comparison operator used in maps - bool operator < (const PickedPoint& p ) const { - return state < p.state || index < p.index; - } - - /// Comparison operator used in maps - bool operator != (const PickedPoint& p ) const { - return *this

Examples - -- `glutOnePick`: A Sofa simulation within a basic Glut interface. The user can - click and drag one point at a time to interact with the simulaton. -- `qtSofa`: A Sofa simulation within a basic Qt interface. The user can click and - drag multiple points. -- `qtSofa/qtSofa.pro`: Project file for the same application, built as an - application which is not a sub-project of Sofa. See comments inside. -- `qtQuickSofa`: A Sofa simulation within a QtQuick interface. Not yet mature, may - be temporarily disabled. - - -

Dependencies

- -- Qt > 5.0 is necessary for qtQuickSofa - - -

Issues

- -- Currently there is no way to create interactors in plugins. They are created - by the user application. -- The application built using qtSofa/qtSofa.pro crashes at scene creation time, - while the same code running as a Sofa sub-project works fine. - -*/ diff --git a/applications/plugins/SofaSimpleGUI/SofaGL.cpp b/applications/plugins/SofaSimpleGUI/SofaGL.cpp deleted file mode 100644 index 24903830b67..00000000000 --- a/applications/plugins/SofaSimpleGUI/SofaGL.cpp +++ /dev/null @@ -1,322 +0,0 @@ -#include -#include "SofaGL.h" -#include "VisualPickVisitor.h" -#include -#include -#include -#include - -#include -using sofa::simulation::mechanicalvisitor::MechanicalPickParticlesVisitor; - -using std::cout; -using std::cerr; -using std::endl; - -namespace sofa { -using core::objectmodel::Tag; - -namespace simplegui { - -template inline T sqr(const T& t){ return t*t; } - - -SofaGL::SofaGL(SofaScene *s) : - _sofaScene(s) -{ - if(!_sofaScene) - { - std::cerr << "Error: you are trying to create a SofaGL object with a null SofaScene" << std::endl; - return; - } - - glewInit(); - - _vparams = sofa::core::visual::VisualParams::defaultInstance(); - _vparams->drawTool() = &_drawToolGL; - _vparams->setSupported(sofa::core::visual::API_OpenGL); - - _isPicking = false; - - - _sofaScene->initVisual(); -} - -void SofaGL::draw() -{ - glGetIntegerv (GL_VIEWPORT, _viewport); - glGetDoublev (GL_MODELVIEW_MATRIX, _mvmatrix); - glGetDoublev (GL_PROJECTION_MATRIX, _projmatrix); - - if(_vparams) - { - _vparams->viewport() = sofa::type::fixed_array(_viewport[0], _viewport[1], _viewport[2], _viewport[3]); - SReal xmin,xmax,ymin,ymax,zmin,zmax; - _sofaScene->getBoundingBox(&xmin,&xmax,&ymin,&ymax,&zmin,&zmax); - _vparams->sceneBBox() = sofa::type::BoundingBox(xmin,xmax,ymin,ymax,zmin,zmax); - _vparams->setProjectionMatrix(_projmatrix); - _vparams->setModelViewMatrix(_mvmatrix); - } - - //_sofaScene->getSimulation()->updateVisual(_sofaScene->getSimulation()->GetRoot().get()); // needed to update normals and VBOs ! (i think it should be better if updateVisual() was called from draw(), why it is not already the case ?) - _sofaScene->updateVisual(); // needed to update normals and VBOs ! (i think it should be better if updateVisual() was called from draw(), why it is not already the case ?) - - if( _isPicking ){ - - // start picking - glSelectBuffer(BUFSIZE,selectBuf); - glRenderMode(GL_SELECT); - - glInitNames(); - - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glLoadIdentity(); - - gluPickMatrix(pickX,_viewport[3]-pickY,5,5,_viewport); - glMultMatrixd(_projmatrix); - glMatrixMode(GL_MODELVIEW); - - // draw - _vparams->pass() = sofa::core::visual::VisualParams::Std; - VisualPickVisitor pick ( _vparams ); - pick.setTags(_sofaScene->groot()->getTags()); - cerr<<"SofaGL::draw root used " << endl; - _sofaScene->groot()->execute ( &pick ); - - // stop picking - glMatrixMode(GL_PROJECTION); - glPopMatrix(); - glMatrixMode(GL_MODELVIEW); - glFlush(); - hits = glRenderMode(GL_RENDER); - if (hits != 0) - { - GLuint* buffer = selectBuf; - // process the hits - GLint i, j, numberOfNames=0; - GLuint names, *ptr, minZ,*ptrNames=nullptr; - - ptr = (GLuint *) buffer; - minZ = 0xffffffff; - for (i = 0; i < hits; i++) { - names = *ptr; - ptr++; - if (*ptr < minZ) { - numberOfNames = names; - minZ = *ptr; - ptrNames = ptr+2; - } - - ptr += names+2; - } - if (numberOfNames > 0) { - cerr << "You picked object "; - ptr = ptrNames; - for (j = 0; j < numberOfNames; j++,ptr++) { - cerr<< pick.names[*ptr] << " "; - } - } - else - cerr<<"You didn't click a snowman!"; - cerr<getSimulation()->draw(_vparams, _sofaScene->getSimulation()->GetRoot().get()); - draw(_vparams); -} - -void SofaGL::draw(sofa::core::visual::VisualParams* vparams) -{ - core::visual::VisualLoop* vloop = _sofaScene->groot()->getVisualLoop(); - assert(vloop); - if (!vparams) vparams = sofa::core::visual::VisualParams::defaultInstance(); - vparams->update(); - vloop->drawStep(vparams); -} - -void SofaGL::getPickDirection( GLdouble* dx, GLdouble* dy, GLdouble* dz, int x, int y ) -{ - // Intersection of the ray with the near and far planes - GLint realy = _viewport[3] - (GLint) y - 1; // convert coordinates from image space (y downward) to window space (y upward) - GLdouble wx, wy, wz; /* returned world x, y, z coords */ - gluUnProject ((GLdouble) x, (GLdouble) realy, 0.0, _mvmatrix, _projmatrix, _viewport, &wx, &wy, &wz); // z=0: near plane - //cout<<"World coords at z=0.0 are ("<groot()->getContext() ); - - PickedPoint pickedPoint; - if (!picker.particles.empty()) - { - sofa::core::behavior::BaseMechanicalState *mstate = picker.particles.begin()->second.first; - unsigned index = picker.particles.begin()->second.second; - - pickedPoint.state = mstate; - pickedPoint.index = index; - pickedPoint.point = Vec3(mstate->getPX(index), mstate->getPY(index), mstate->getPZ(index)); - } - - return pickedPoint; -} - - -Interactor* SofaGL::getInteractor( const PickedPoint& glpicked ) -{ - cout << "SofaGL::getInteractor, looking for " << glpicked << endl; - for( Picked_to_Interactor::iterator i=_picked_to_interactor.begin(); i!=_picked_to_interactor.end(); i++ ) - { - cout << "SofaGL::getInteractor, map contains " << (*i).first << endl; - } - if( _picked_to_interactor.find(glpicked)!=_picked_to_interactor.end() ) // there is already an interactor on this particle - { - return _picked_to_interactor[glpicked]; - } - else { // new interactor - return NULL; - } -} - - - -Interactor* SofaGL::pickInteractor( GLdouble ox, GLdouble oy, GLdouble oz, int x, int y ) -{ - - type::Vec3d origin(ox,oy,oz), direction; - getPickDirection(&direction[0],&direction[1],&direction[2],x,y); - double distance = 10.5, distanceGrowth = 0.1; // cone around the ray ???? - // cout<< "SofaScene::rayPick from origin " << origin << ", in direction " << direction << endl; - MechanicalPickParticlesVisitor picker(sofa::core::ExecParams::defaultInstance(), origin, direction, distance, distanceGrowth, sofa::core::objectmodel::Tag("!NoPicking") ); - picker.execute(_sofaScene->groot()->getContext()); - - if (!picker.particles.empty()) - { - PickedPoint pickedPoint(picker.particles.begin()->second.first, picker.particles.begin()->second.second); - if( _picked_to_interactor.find(pickedPoint)!=_picked_to_interactor.end() ) - return _picked_to_interactor[pickedPoint]; - } - - return NULL; -} - - -void SofaGL::attach( Interactor* interactor ) -{ - interactor->attach( _sofaScene ); - _picked_to_interactor[interactor->getPickedPoint()] = interactor; - // cout<<"SofaGL::attach "<< endl; _sofaScene->printGraph(); -} - -void SofaGL::move( Interactor* interactor, int x, int y) -{ - if( !interactor ) - return; - - // get the distance to the current point - Vec3 current = interactor->getPoint(); - GLdouble wcur[3]; // window coordinates of the current point - gluProject(current[0],current[1],current[2],_mvmatrix,_projmatrix,_viewport,wcur,wcur+1,wcur+2); - // cout << "current point = " << current << endl; - // cout<<"move anchor, distance = " << wcur[2] << endl; - - // compute and set the position of the new point - GLdouble p[3]; - gluUnProject ( x, _viewport[3]-y-1, wcur[2], _mvmatrix, _projmatrix, _viewport, &p[0], &p[1], &p[2]); // new position of the picked point - // cout<<"x="<< x <<", y="<< y <<", X="<detach(); - // cout<<"SofaGL::detach "<< endl; _sofaScene->printGraph(); -} - -void SofaGL::getSceneBBox( float* xmin, float* ymin, float* zmin, float* xmax, float* ymax, float* zmax ) -{ - SReal xm, xM, ym, yM, zm, zM; - _sofaScene->getBoundingBox(&xm,&xM,&ym,&yM,&zm,&zM); - - *xmin = helper::narrow_cast(xm); - *xmax = helper::narrow_cast(xM); - *ymin = helper::narrow_cast(ym); - *ymax = helper::narrow_cast(yM); - *zmin = helper::narrow_cast(zm); - *zmax = helper::narrow_cast(zM); -} - - -void SofaGL::viewAll( SReal* xcam, SReal* ycam, SReal* zcam, SReal* xcen, SReal* ycen, SReal* zcen, SReal a, SReal* nearPlane, SReal* farPlane) -{ - // scene center and radius - SReal xmin, xmax, ymin, ymax, zmin, zmax; - _sofaScene->getBoundingBox(&xmin,&xmax,&ymin,&ymax,&zmin,&zmax); - cout<<"SofaGL::viewAll, bounding box = ("<< xmin <<" "< -#include "SofaScene.h" -#include -#include - -#include "PickedPoint.h" -#include "SpringInteractor.h" - - -namespace sofa::simplegui -{ - -/** OpenGL interface to a SofaScene. - * This is not a viewer, this is an object used by a viewer to display a Sofa scene and to pick objects in it. - * It contains a pointer to the Sofa scene. Several viewers can be connected to a single scene through such interfaces. - * - * Picking returns a PickedPoint which describes a particle. - * It is up to the application to create the appropriate Interactor, which can then be inserted in the Sofa scene. - * This class provides the functions to attach/detach an interactor and move it. - * - * @author Francois Faure, 2014 - - */ -class SOFA_SOFASIMPLEGUI_API SofaGL -{ -public: - /** - * @param s The Sofa scene to interact with, the scene MUST already be opened ! - */ - SofaGL( SofaScene* s ); - /** - * @brief Draw the scene and stores the transformation matrices, for picking. - * This requires an OpenGL context. It is supposed to be used by the drawing method of a viewer, after setting the modelview matrix. - */ - void draw(); - /** - * @brief Compute the parameters to pass to gluPerspective to make the whole scene visible. - * The new camera center is set on the line from the current camera center to the scene center, at the appropriate distance. - * @param xcam Camera center (input-output) - * @param ycam Camera center (input-output) - * @param zcam Camera center (input-output) - * @param xcen Center of the scene (output) - * @param ycen Center of the scene (output) - * @param zcen Center of the scene (output) - * @param a Camera vertical angle (input) - * @param near Smaller than the nearest distance from the new camera center to the scene (output) - * @param far Larger than the nearest distance from the new camera center to the scene (output) - */ - void viewAll( SReal* xcam, SReal* ycam, SReal* zcam, SReal* xcen, SReal* ycen, SReal* zcen, SReal a, SReal* nearPlane, SReal* farPlane); - - /// Compute the bounding box of the scene - void getSceneBBox( float* xmin, float* ymin, float* zmin, float* xmax, float* ymax, float* zmax ); - - /// @name Interaction - /// @{ - /** @brief Try to pick a particle along a ray. - * The ray starts at the camera center and passes through point with coordinates x,y - * ox, oy, oz are the camera center in world coordinates. - * x,y in image coordinates (origin on top left). - * If a point is picked, the application may create an Interactor based on it. - * @return a valid PickedPoint if succeeded, an invalid PickedPoint if not. - */ - PickedPoint pick(GLdouble ox, GLdouble oy, GLdouble oz, int x, int y); - - - /** @brief Insert an interactor in the scene - * Does not check if it is already there, so be careful not to insert the same twice - */ - void attach( Interactor* ); - - /** - * @brief getInteractor - * @param picked - * @return Interactor acting on the given picked point, or NULL if none - */ - Interactor* getInteractor( const PickedPoint& picked ); - - - /** @brief Try to pick an Interactor along a ray. - * The ray starts at the camera center and passes through point with coordinates x,y - * ox, oy, oz are the camera center in world coordinates. - * x,y in image coordinates (origin on top left). - * @return Pointer if an Interactor is found, NULL if not. - */ - Interactor* pickInteractor(GLdouble ox, GLdouble oy, GLdouble oz, int x, int y); - - /** - * @brief move the interactor according to the mouse pointer. - * x,y in image coordinates (origin on top left). - */ - void move( Interactor*, int x, int y); - - /// Remove the interactor from the scene, without deleting it. - void detach(Interactor*); - - /// @} - - /** @brief Try to pick a displayed thing along a ray, using OpenGL picking. - * The ray starts at the camera center and passes through point with coordinates x,y in image coordinates (origin on top left). - * In this experimental implementation, this function just prints something on the standard output. - */ - void glPick(int x, int y); - - /** - * @brief getPickDirection Compute the direction of a button click, returned as a unit vector - * @param dx normalized direction - * @param dy normalized direction - * @param dz normalized direction - * @param x x-coordinate of the click - * @param y y-coordinate of the click (origin on top) - */ - void getPickDirection( GLdouble* dx, GLdouble* dy, GLdouble* dz, int x, int y ); - - -protected: - SofaScene* _sofaScene; - - // matrices used for picking - GLint _viewport[4]; - GLdouble _mvmatrix[16], _projmatrix[16]; - - // rendering tools - sofa::gl::DrawToolGL _drawToolGL; - sofa::core::visual::VisualParams* _vparams; - void draw(sofa::core::visual::VisualParams*); - - // Interaction tools - typedef std::map< PickedPoint, Interactor*> Picked_to_Interactor; - /** Currently available interactors, associated with picked points. - * The interactors are not necessarily being manipulated. Only one is typically manipulated at a given time. - */ - Picked_to_Interactor _picked_to_interactor; - Interactor* _drag; ///< The currently active interactor - - - - // OpenGL picking data - bool _isPicking; ///< if we are doing OpenGL picking - GLint pickX, pickY; // window coordinates of the pick point - enum {BUFSIZE=1024}; - GLuint selectBuf[BUFSIZE]; - GLint hits; - - -}; - -} - - -#endif // SOFA_NEWGUI_SofaGL_H diff --git a/applications/plugins/SofaSimpleGUI/SofaGlutAnt.zip b/applications/plugins/SofaSimpleGUI/SofaGlutAnt.zip deleted file mode 100644 index 02195aba1f63a340e5c706633438048aded8985f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5452 zcmZ{o1yEc|v&WafA`2wALvRo7Zi~AH_W;2)K!D%@LhvBL9fB?{Ss(<5#hu07A!v~B zxZiu#0*Sr>gs3)qPG)&-~Pt5Rvc@0gpCV*D3SY{BOf}TxdDJGM97k^pJG& zU|0ViPt<>Twmp+S-gxvdMgRaP{^qF(mXuKeo7(($Ae)D`hl(0h^*aaF(mmcXs%9hr z!i5+417Kw?;!rI3`j+`t8C7kBN$PcR;?eE$x-q@fIvkft34su6NmGy2D412aRVV~> z3GSsE-wpc$;hB!~BZKE^o_1oQ?C~C*ct4zMz~6gpEKR1WFcsR@rvbeY>CT)(hq1pm zgXmSUH=vUpo2k0|CNx_cTF)SkpAKP&J#%g_B7ri%96!@HMmZ2l-e>c0auZ~Bi|qO zb3J+;^u4|0|SL{V1*vv;su!)C|;oXMzoZ~ zHCRxK7VFaS$Ux#RPt)ZePHND(pK~Kp+NR}Ez8&A~*R+&e$u-l?N!;K7oM`Fv^z~nU zK&qeNEROrv-+{gYerH!w+bN^|@fq6+ z2mq*g4ge7TExUhzc1stRZelz4HNNw=0p0dO6RDG{^3Dk!il|ryPcQ^j-ps4Y&T^I5 zv&K3|k2^lRT~6Gji7V)JFgz@W6udF@)g|dY_9P>d=G#gP=nZdvS&X0*ieZj(dQwm| z``NkB7oB{wQl@i}RtFxAsmF;>zo(MwnG1Y{1X<`r<{6BieBY%t&;8wu~*_Bx6_ z`RTYEe&o&9xcbV)82n}YZFb0xAPcs1!3K^eqTdDnHkOk399Q?qibl~&4Hn*&Oa>!F z9``9V0)a1Pso4wBRq-_`Np?)pN=kiK`6h#2N`Fz}XlL^d>B^UY2@h;kLfOtu^PwQB zcLtGq@R06&CJiQJ zxeX(hVql5H^83zhU_lOiqL3enkDe%3v!UWV4VAqf-gM#dSc>CR`gtR515Y2x6;G2y zDauUaK3Iwo;!a%}E=u&Ndg?y>FtpjGEeNgGCKJix!0vi?6!oz5+?fNxqE3J1Ta=>! zRRT?#7WfEeQG2p!iB2&F$=pn5@KKJGEyPiXJDfkXX5K@IxW}BJnA+V?3_arZuUqH5XL3sP zdmc54sTupdxuaZ@h|W}R`tF{NAKTu|lRJvL+M`Rlr`V@j8<( z?oa5LTSI9;15~*ds*0W%Sr$r7fv1PI9?974@pvA2fr8%c1b10XL1ZU67Ey1jzcCpi zi4=wCGK_yS+dxU6!;08sZtlH0j1|w1I9}N}ul1b>S38Y|em|z=?qf`V$oJt8<9JKC zrm#Y!qbmrX&l4Nja;!zPrta_QBt7ZvF3~y2!lU#- z??+9dDA^LrHt(=4Y4wQtmTn@{hJ&Cf+}@k z%Z^0Sy>y@+MCaC)qs8+`*x2UU|F~^`h{Gyiq<=`yJN3bl`fT5Pxm0}@>0P$0jSOD2 z7%QH~k5IhHNX4J}4Gx`i4%e&^t|+~-pgkQh7m@zCiLmz@0HCjiH0NV0SI(t~yWE9_ z^Z|yGjOrEtw3&xE$!8^6{mUvUW6az81)q@s65n^hJlU5XTK31G zrcCDS1xPHT;p+%TqODVYuhzftdsZH2F2TRSmOu8FOvOIAyv~3HR<|UMS$VzlSvbBr zvDxWxRv%^7Q<|bZ3#TxUH#2nJ%(Kz>`tx)mo0m)n6`dSyEzbve?GD$^@6Hty0m&Ms zpwI5Iijg9oyScT$_5C<7mpdccaTag9fQD(=3#a;0v-oE%v~{wx5Q;RxS#xE3h@_@5 zzdyL52yx8y&W|T0B4XVLsrZoJOSn58QG$4e`@CHD6S!2;jREht2t5XiPTIzP){6B+ z^!BE(mY6_U-}Nvjhhw>BhwH*W)5WIQNUzlC*0OmkaBcQ;AiH)39(B6uVn;d0>YfWs zIwhSQjS0U~yp9{4Hnoh+x;WQ7LDw0y%vHwgT@3zg!OguME(Wr0P?6HYzFzDqUh{5~ zA@lg^5SCKz0JH990u4mmo18e(;@^B`wbeT4S<_>Cja+KPQ4$vE{4%c#ahldj%9SVG zZ((1P7D_hRQ=?VMsDKNRoE-7+Z&dE*b0F=8yVTbvINQ+O(-Aw->p{n^zAqWm#cYY3 z*Tq%?CDw8o8YMvSxGauoXtBbW9KHT56YZld)dz;Zn&OmwbV+(Fh~1tUiS*kE)^flC z7)_Tq8VHEW`*Is4L;P%P)$toqC(MX3O40_hx6vB7k3gt3$i%!U-DIlm9gJKd;t^fr zXl6Z9xv%E%!2G8&7Mr>B_SipR%8AK8ny znKUJto_aHNZHDBkC?OhxK`k2cAqvH||7IJ1(bg7^6%jUDx?zU|CmfHiA!JHV5~Z9- z(V9NuJJcPvlZ(joR>Ik;WX%h4!Nc9`TMxcVRob6Yppn{FUmKH2EBzZ&dS!D({Fc%LKUutB#!b6ZezABEC?rUn9k&0MSMrAk^1H;M5*Nq5~_sj*zDB_PH?c+p|$#kf4?6FqijU28}9Vdlo8 zXKExJRxC1@NLF6Vb6IUaVy>#Pi&zH6IMqPdXO5vtMhFIzSdza;kI92DvNI{a%RStH zFRB$mPtC0M?NPcG?8Qv*n0Co)jLW=$JDzFW}NTnSC< zrf~h;I)wX`uW6SjweFV+%i*yD#|)t%fiJvWTzPzbv)zzz zJhzsB$eAWwsKO1oZ=67XTuRzt@3m} ze}&7>fk~B#7ZWY_Y|GFHB2uw&=V_Y`KJ%)cW7e`i5tDW4vrSzXIZ&-%jM?GBcVA;S z)!ujWxjr{4AC#Xtjb&yCh+_j2Ey#U~_a~CyB7Y@bjb}^DvC!&~XT-UmZ{%>>CkNt@ z27PXwju?_V_hNhr{ik<6HU~B!xUVA_d@Uz<@cfZ zwOOf50szrE;|T!p1{nar|J$M1!OqLtjm_QC>7(|76A34lzf)W158=Uz3KAw-N2(k} zs#2+>6y`5OzO$Yi7v&D@pm)osCN-=;Y?JC(o8ckI$iWoMuxO5;T+5c;j|fwswYjaS zMGkE!0)rk-?K_Oa(lBsL@7Lj*GS*0yFR^P!iYa?{6FheO8ktnX_Q7y7=ab!!;*xsM zIp(l5lvhZICLtj6Zi0Yf%hobA=>4pgl!}XZUWrpA6A8OTJDx19*?vuZUBX~;@~M~I$)}BB$hRzm^--TpbC(*z65G2r6(hKrN9k1v-xR!@RsG6F zHBHO-Ocx32)G22wa8`oG!3lnv%ilyxOGnQ1dX6%aL`lfdiVZ4FwQO%S3dnFw3MV++ z&*94pWrN{*vuMTIuR?ro& z#z_vNLF*a&e&)ts#^*7`V1VlzMF2fvb{TO_DYV}P)rm||0I>zH@#sX`tI=GN^WC1p zELYIndA1zhhbbg8q8rB%_Jkn7_T48J1Pv;fH1!71ovraOjfamhgHQvky|uxCHGx-%Q~G@Bkr|( zDu3XyYHx{(8L&Ca?ZefZ5@0}K0emvB`@d>RdNv8c1QbYT~kMHm_@hb~R zp)xNzM@&768)J<;D%QH_8uzyzp8x)xPeVIpIxf$4^dHGU(IW`>`yJ2ykqdymJsxkb zcA1}yohLZ(!jI2bs6V1(B}K%t(6ZgcCo9fH?Fg~O+h-S{kS)v(&t6|2)6OX;&i2z& z*SjsXiHV8z29RX(s(oE#Eq3+0e6BV*R9pzD>Bz=fpy@*CZ@vqnj>U(_ow0rS{%$Vd zbGuqhP2h%vB4%VR*kU6{*{u#n*?b1`+IKj$jvw|abA7NfrMAHxi0oVbn#nPn;sf^? zw!mCgn(X+J;i0@HJi==mqFI-6oAheeBYlY-b*6xi_I+DH7?~C<%)- zH>mG?-Oq00#&^s7tNM2=+R$I|Wep#~=@}W>iDfhzvUpikYI2$fj;vMuE0CQ3^haMufwx{=hSl)ybYXX%XR zmCQ&`=#;p^Rdr69Y#3i`?b8T+dn=IyehuH3!>j{Ec)lDp0cm-uAOSDgb^9f0u$4@x z&y<3~g&-8!xP|H)j&@AEVRTPy$nm2t*)rg;JE^G5j*v;Pqx0NWf;*3=u`2$G{FoDw z16{k*u@X@k8fZ|+(HRJ5#1d?m(#m3PXG2~yRxlwj;~fV=XzRi%+f8$nN@-JmR!n#y zpBua!4Q&x?#hrxhkPVGFwpyNbsikHM)$8;YxgQd5OT@}h^4_2G-&RRDQf2}tRVd#+ zRkd^KX}4U_ZfsrROzqd?$aCI4g4fsX>d{u9{b(`l2BNN$thzac^{E5KoD?5$OkV>` z50@n{D_{u;3xkH9Em9piZ|vxP?A_X2G@~$)qNqPFa^*d9>dM=?O{STu z&nJ4HhE1Z0sss3wFQPFSE6_02kz!uT3O%TzyPje?So=gqBmXbC`%~+mxYoa<{-ve(NCN-V`eXeU<@!_TpAgb-A;!lZ z`bRMPA3*6(k$-BrzePkb|5N0D8}OeJ|Fq5hmcYRJPYL(mo1VH7@Uh7Q0LYIc<1z2g IxPQI<7o{uFi2wiq diff --git a/applications/plugins/SofaSimpleGUI/SofaScene.cpp b/applications/plugins/SofaSimpleGUI/SofaScene.cpp deleted file mode 100644 index 8cbf2a7abdc..00000000000 --- a/applications/plugins/SofaSimpleGUI/SofaScene.cpp +++ /dev/null @@ -1,154 +0,0 @@ -#include "SofaScene.h" -#include "Interactor.h" -#include -using std::cerr; -using std::cout; -using std::endl; - -#include -#include -#include -#include -#include - -// sofa types should not be exposed -//typedef sofa::type::Vec3 Vec3; -//typedef sofa::component::container::MechanicalObject< defaulttype::Vec3Types > Vec3DOF; -typedef sofa::simulation::graph::DAGSimulation SofaSimulation; - - -namespace sofa::simplegui -{ - - -typedef sofa::type::Vec3 Vec3; -typedef sofa::component::statecontainer::MechanicalObject< defaulttype::Vec3Types > Vec3DOF; - - -SofaScene::SofaScene() -{ - _groot = _iroot = nullptr; - std::shared_ptr classVisualModel;// = NULL; - sofa::core::ObjectFactory::AddAlias("VisualModel", "OglModel", true, &classVisualModel); - - sofa::component::init(); -} - -void SofaScene::step( SReal dt) -{ - sofa::simulation::node::animate(_groot.get(),dt); -} - -void SofaScene::printGraph() -{ - sofa::simulation::node::print(_groot.get()); -} - -void SofaScene::loadPlugins( const std::vector& plugins ) -{ - for (const auto& plugin : plugins) - { - cout <<"SofaScene::init, loading plugin " << plugin << '\n'; - sofa::helper::system::PluginManager::getInstance().loadPlugin(plugin); - } - - sofa::helper::system::PluginManager::getInstance().init(); -} - -void SofaScene::open(const std::string& fileName ) -{ - // --- Create simulation graph --- - assert( !fileName.empty()); - - if(_groot) sofa::simulation::node::unload (_groot); - _groot = sofa::simulation::node::load( fileName.c_str() ).get(); - if(!_groot) - { - cerr << "loading failed" << endl; - return; - } - - _iroot = _groot->createChild("iroot").get(); - -// _currentFileName = fileName; - - sofa::simulation::node::init(_groot.get()); - - printGraph(); - SReal xm,xM,ym,yM,zm,zM; - getBoundingBox(&xm,&xM,&ym,&yM,&zm,&zM); - cout<<"SofaScene::setScene, xm="<addChild(node); - _iroot = _groot->createChild("iroot").get(); - sofa::simulation::node::init(_groot.get()); -} - -void SofaScene::reset() -{ - sofa::simulation::node::reset(_groot.get()); -} - -//void SofaScene::open(const char *filename) -//{ -// unload(_groot); - -// _groot = load( filename ); -// if(!_groot) -// { -// cerr << "loading failed" << endl; -// return; -// } - -// _iroot = _groot->createChild("iroot"); - -// _currentFileName = filename; - -// sofa::simulation::node::::init(_groot); -//// cout<<"SofaScene::init, scene loaded" << endl; -//// printGraph(); -//} - -void SofaScene::getBoundingBox( SReal* xmin, SReal* xmax, SReal* ymin, SReal* ymax, SReal* zmin, SReal* zmax ) -{ - SReal pmin[3], pmax[3]; - sofa::simulation::node::computeBBox( _groot.get(), pmin, pmax ); - *xmin = pmin[0]; *xmax = pmax[0]; - *ymin = pmin[1]; *ymax = pmax[1]; - *zmin = pmin[2]; *zmax = pmax[2]; -} - -void SofaScene::insertInteractor( Interactor * interactor ) -{ - if(_iroot) - _iroot->addChild(interactor->getNode()); -} - -simulation::Node* SofaScene::groot() { return _groot.get(); } - -void SofaScene::initVisual(){ - sofa::simulation::node::initTextures(_groot.get()); -} - -void SofaScene::updateVisual() -{ - sofa::simulation::node::updateVisual(_groot.get()); // needed to update normals and VBOs ! (i think it should be better if updateVisual() was called from draw(), why it is not already the case ?) -} - -//void SofaScene::draw( sofa::core::visual::VisualParams* v) -//{ -// if( v==NULL ) -// { -// -// } -// sofa::simulation::node::draw(_vparams, groot() ); -//} - - -} diff --git a/applications/plugins/SofaSimpleGUI/SofaScene.h b/applications/plugins/SofaSimpleGUI/SofaScene.h deleted file mode 100644 index 83de56ad63b..00000000000 --- a/applications/plugins/SofaSimpleGUI/SofaScene.h +++ /dev/null @@ -1,120 +0,0 @@ -#ifndef SOFA_NEWGUI_SofaScene_H -#define SOFA_NEWGUI_SofaScene_H - -#include -#include -#include -#include - -namespace sofa { -namespace simulation { - class Simulation; -} - -namespace simplegui { - -class Interactor; - - -/** @brief A sofa scene graph with simulation functions. - * - * There are methods to initialize and update the visual models, but rendering must be performed externally, see e.g. class SofaGL. - * - * The typical life cycle is: - * - loadPlugins( list of plugin names ); - setScene( scenegraph ); or open(filename) - initVisual() - [ your main loop: ] - step(dt); - updateVisual(); - [ use a SofaGL object to display the simulated objects ] - - - * @author Francois Faure, 2014 - */ -class SOFA_SOFASIMPLEGUI_API SofaScene -{ -public: - /** - * @brief Initialize Sofa - */ - SofaScene(); - virtual ~SofaScene(){} - - /** - * @brief load the given plugin - * @param plugins names of the plugins - */ - void loadPlugins( const std::vector& plugins ); - /** - * @brief Load a scene file. The previous scene graph, if any, is deleted. - * @param fileName Scene file to load - */ - void open( const std::string& fileName ); - /** - * @brief Set the scene graph. The previous scene graph, if any, is deleted. - * @param graph the scene to simulate - */ - void setScene( simulation::Node* graph ); - /** - * @brief Print the scene graph on the standard output, for debugging. - */ - void printGraph(); - /** - * @brief Integrate time by one step and update the Sofa scene. - */ - void step( SReal dt ); - /** - * @brief restart from the beginning - */ - void reset(); - /** - * @brief Compute the bounding box of the simulated objects - * @param xmin min coordinate in the X direction - * @param xmax max coordinate in the X direction - * @param ymin etc. - * @param ymax - * @param zmin - * @param zmax - */ - void getBoundingBox( SReal* xmin, SReal* xmax, SReal* ymin, SReal* ymax, SReal* zmin, SReal* zmax ); - - /// To do once before rendering a scene, typically at initialization time - void initVisual(); - - /// Update the visual models. To do after animating and before rendering. - void updateVisual(); - - - - /** @name Developer API - * To be used to create new functionalities. - */ - ///@{ - - /// Root of the simulated scene. - simulation::Node* groot(); - - /// Root of the interactors, set as child of groot - simulation::Node* iroot(){ return _iroot; } - - /// Do not use this directly. Use Interactor::attach, which calls this. - void insertInteractor( Interactor* ); - - ///@} - - - - -protected: - simulation::Node::SPtr _groot; ///< root of the scene - simulation::Node* _iroot; ///< root of the interactors, child of _groot - -}; - -} -} - - -#endif // SOFA_NEWGUI_SofaScene_H diff --git a/applications/plugins/SofaSimpleGUI/SofaSimpleGUIConfig.cmake.in b/applications/plugins/SofaSimpleGUI/SofaSimpleGUIConfig.cmake.in deleted file mode 100644 index 25e069ed35b..00000000000 --- a/applications/plugins/SofaSimpleGUI/SofaSimpleGUIConfig.cmake.in +++ /dev/null @@ -1,15 +0,0 @@ -# CMake package configuration file for the SofaSimpleGUI plugin - -@PACKAGE_GUARD@ -@PACKAGE_INIT@ - -find_package(Sofa.Component REQUIRED) -find_package(Eigen3 QUIET REQUIRED) -find_package(Sofa.GL QUIET REQUIRED) -find_package(Sofa.Simulation.Graph QUIET REQUIRED) - -if(NOT TARGET SofaSimpleGUI) - include("${CMAKE_CURRENT_LIST_DIR}/SofaSimpleGUITargets.cmake") -endif() - -check_required_components(SofaSimpleGUI) diff --git a/applications/plugins/SofaSimpleGUI/SpringInteractor.cpp b/applications/plugins/SofaSimpleGUI/SpringInteractor.cpp deleted file mode 100644 index 0e6948d9743..00000000000 --- a/applications/plugins/SofaSimpleGUI/SpringInteractor.cpp +++ /dev/null @@ -1,68 +0,0 @@ -#include -#include "SpringInteractor.h" -#include "PickedPoint.h" -#include -#include -#include - - -namespace sofa::simplegui -{ -typedef sofa::component::constraint::projective::FixedConstraint FixedConstraint3; - -SpringInteractor::SpringInteractor(const PickedPoint &picked, SReal stiffness) - : Interactor(picked) -{ - // get the DOF of the picked object - MechanicalObject3* pickedDof=dynamic_cast(picked.state.get()); assert(pickedDof); - - // create DOF to represent the actuator - _interactorDof = sofa::core::objectmodel::New(); - _interactionNode->addObject(_interactorDof); - _interactorDof->setName("interactorDOF"); - _interactorDof->addTag(std::string("Interactor")); - MechanicalObject3::WriteVecCoord xanchor = _interactorDof->writePositions(); - xanchor[0] = picked.point; - FixedConstraint3::SPtr fixed= sofa::core::objectmodel::New(); // Makes it unmovable through forces - _interactionNode->addObject(fixed); - fixed->init(); - - // create spring to drag the picked object - _spring = sofa::core::objectmodel::New(_interactorDof.get(),pickedDof); - _interactionNode->addObject(_spring); - _spring->addSpring(0,picked.index,stiffness,0.1,0.); - - - -// cout << "SpringInteractor set spring to " << pickedDof->getName() << ", " << picked.index << endl; -} - -Vec3 SpringInteractor::getPoint() -{ - MechanicalObject3::ReadVecCoord xanchor = _interactorDof->readPositions(); - return xanchor[0]; -} - -void SpringInteractor::setPoint( const Vec3& p ) -{ - MechanicalObject3::WriteVecCoord xanchor = _interactorDof->writePositions(); - xanchor[0] = p; -} - -void SpringInteractor::attach(SofaScene *scene) -{ - Inherited::attach(scene); - _interactionNode->removeObject(_spring); - Node* targetParent = dynamic_cast(_spring->getMState2()->getContext()); - targetParent->addObject(_spring); -} - -void SpringInteractor::detach() -{ - Inherited::detach(); - Node* parent = dynamic_cast(_spring->getMState2()->getContext()); - parent->removeObject(_spring); - _interactionNode->addObject(_spring); -} - -} diff --git a/applications/plugins/SofaSimpleGUI/SpringInteractor.h b/applications/plugins/SofaSimpleGUI/SpringInteractor.h deleted file mode 100644 index ec3c187ccd8..00000000000 --- a/applications/plugins/SofaSimpleGUI/SpringInteractor.h +++ /dev/null @@ -1,54 +0,0 @@ -#ifndef SOFA_SpringInteractor_H -#define SOFA_SpringInteractor_H - -#include -#include "Interactor.h" - -#include -#include -#include - - -namespace sofa::simplegui -{ - using sofa::defaulttype::Vec3Types ; - using MechanicalObject3 = sofa::component::statecontainer::MechanicalObject ; - using SpringForceField3 = sofa::component::solidmechanics::spring::SpringForceField ; - -/** - * @brief Interaction using a spring. - * An interactor, typically attached to the mouse pointer, pulls a control point using a spring. - * @author Francois Faure, 2014 - */ -class SOFA_SOFASIMPLEGUI_API SpringInteractor: public Interactor -{ - typedef Interactor Inherited; -protected: - MechanicalObject3::SPtr _interactorDof; - SpringForceField3::SPtr _spring; -public: - /** - * @brief SpringInteractor - * @param picked The picked point. - * @param stiffness The stiffness of the spring attached to the picked point. - */ - SpringInteractor(const PickedPoint& picked, SReal stiffness=(SReal) 100.); - - /// Insert this in the scene as a child of the given node - void attach( SofaScene* scene ) override; - - /// Remove this from the scene, without destroying it. - void detach() override; - - /// current interaction point - Vec3 getPoint() override; - - /// Displace the interaction to the given point - void setPoint( const Vec3& p ) override; - -}; - -} - - -#endif // SOFA_SpringInteractor_H diff --git a/applications/plugins/SofaSimpleGUI/VisualPickVisitor.cpp b/applications/plugins/SofaSimpleGUI/VisualPickVisitor.cpp deleted file mode 100644 index c7b3203a8d7..00000000000 --- a/applications/plugins/SofaSimpleGUI/VisualPickVisitor.cpp +++ /dev/null @@ -1,138 +0,0 @@ -#include "VisualPickVisitor.h" -#include -using std::cout; -using std::cerr; -using std::endl; - -#include -#include -#include -#include - - -namespace sofa::simplegui -{ - -VisualPickVisitor::VisualPickVisitor(core::visual::VisualParams* params) - : VisualVisitor(params) -{ - pickedId = 0; -} - - -simulation::Visitor::Result VisualPickVisitor::processNodeTopDown(simulation::Node* node) -{ -// cerr <<"VisualPickVisitor::processNodeTopDown" << endl; - hasShader = (node->getShader()!=NULL); - - for_each(this, node, node->visualModel, &VisualPickVisitor::fwdVisualModel); - this->VisualVisitor::processNodeTopDown(node); - - return RESULT_CONTINUE; -} - -void VisualPickVisitor::processNodeBottomUp(simulation::Node* node) -{ -// cerr <<"VisualPickVisitor::processNodeBottomUp" << endl; - for_each(this, node, node->visualModel, &VisualPickVisitor::bwdVisualModel); -} - -void VisualPickVisitor::processObject(simulation::Node* /*node*/, core::objectmodel::BaseObject* o) -{ -#ifdef DEBUG_DRAW - std::cerr << ">" << o->getClassName() << "::draw() of " << o->getName() << std::endl; -#endif -// cout<<"VisualPickVisitor::processObject push name of "<< o->getName() << " = " << pickedId << endl; - names.push_back(o->getName()); - glPushName(pickedId++); - o->draw(vparams); - glPopName(); -// cout<<"VisualPickVisitor::processObject end " << endl; - -#ifdef DEBUG_DRAW - std::cerr << "<" << o->getClassName() << "::draw() of " << o->getName() << std::endl; -#endif -} - -void VisualPickVisitor::fwdVisualModel(simulation::Node* /*node*/, core::visual::VisualModel* vm) -{ -#ifdef DEBUG_DRAW - std::cerr << ">" << vm->getClassName() << "::fwdDraw() of " << vm->getName() << std::endl; -#endif - vm->fwdDraw(vparams); -#ifdef DEBUG_DRAW - std::cerr << "<" << vm->getClassName() << "::fwdDraw() of " << vm->getName() << std::endl; -#endif -} - -void VisualPickVisitor::bwdVisualModel(simulation::Node* /*node*/,core::visual::VisualModel* vm) -{ -#ifdef DEBUG_DRAW - std::cerr << ">" << vm->getClassName() << "::bwdDraw() of " << vm->getName() << std::endl; -#endif - vm->bwdDraw(vparams); -#ifdef DEBUG_DRAW - std::cerr << "<" << vm->getClassName() << "::bwdDraw() of " << vm->getName() << std::endl; -#endif -} - -void VisualPickVisitor::processVisualModel(simulation::Node* node, core::visual::VisualModel* vm) -{ - //cerr<<"VisualPickVisitor::processVisualModel "<getName()<(node->getShader(subsetsToManage)); - - - switch(vparams->pass()) - { - case core::visual::VisualParams::Std: - { - if (shader && shader->isActive()) - shader->start(); -#ifdef DEBUG_DRAW - std::cerr << ">" << vm->getClassName() << "::drawVisual() of " << vm->getName() << std::endl; -#endif - names.push_back(vm->getName()); - glPushName(pickedId++); - vm->drawVisual(vparams); - glPopName(); -#ifdef DEBUG_DRAW - std::cerr << "<" << vm->getClassName() << "::drawVisual() of " << vm->getName() << std::endl; -#endif - if (shader && shader->isActive()) - shader->stop(); - break; - } - case core::visual::VisualParams::Transparent: - { - if (shader && shader->isActive()) - shader->start(); -#ifdef DEBUG_DRAW - std::cerr << ">" << vm->getClassName() << "::drawTransparent() of " << vm->getName() << std::endl; -#endif - vm->drawTransparent(vparams); -#ifdef DEBUG_DRAW - std::cerr << "<" << vm->getClassName() << "::drawTransparent() of " << vm->getName() << std::endl; -#endif - if (shader && shader->isActive()) - shader->stop(); - break; - } - case core::visual::VisualParams::Shadow: -#ifdef DEBUG_DRAW - std::cerr << ">" << vm->getClassName() << "::drawShadow() of " << vm->getName() << std::endl; -#endif - vm->drawShadow(vparams); -#ifdef DEBUG_DRAW - std::cerr << "<" << vm->getClassName() << "::drawShadow() of " << vm->getName() << std::endl; -#endif - break; - } - -} - - -} - - diff --git a/applications/plugins/SofaSimpleGUI/VisualPickVisitor.h b/applications/plugins/SofaSimpleGUI/VisualPickVisitor.h deleted file mode 100644 index fe72aa97004..00000000000 --- a/applications/plugins/SofaSimpleGUI/VisualPickVisitor.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef SOFA_SIMPLEGUI_VisualPickVisitor_H -#define SOFA_SIMPLEGUI_VisualPickVisitor_H -#include -#include - - -namespace sofa::simplegui -{ - -/** - * @brief The VisualPickVisitor class displays the scene for OpenGL picking. - * It uses the glPushName instruction, and it must be called within a specific OpenGL context, see http://www.lighthouse3d.com/opengl/picking/ - * The names vector member contains the names of all the objects rendered, in the traversal order. - * This allows to associate a hit number to an object during the pre-processing. - * @sa SofaGL - * @author Francois Faure, 2014 - * - * @warning The code is directly adapted from VisualDrawVisitor, without much insight - */ -class VisualPickVisitor : public ::sofa::simulation::VisualVisitor -{ -public: - bool hasShader; - VisualPickVisitor(core::visual::VisualParams* params); - Result processNodeTopDown(simulation::Node* node) override; - void processNodeBottomUp(simulation::Node* node) override; - virtual void fwdVisualModel(simulation::Node* node, core::visual::VisualModel* vm); - void processVisualModel(simulation::Node* node, core::visual::VisualModel* vm) override; - void processObject(simulation::Node* node, core::objectmodel::BaseObject* o) override; - virtual void bwdVisualModel(simulation::Node* node, core::visual::VisualModel* vm); - const char* getClassName() const override { return "VisualPickVisitor"; } - - sofa::type::vector names; // names of the object displayed - -private: - int pickedId; - - -}; - -} - -#endif // SOFA_SIMPLEGUI_VisualPickVisitor_H diff --git a/applications/plugins/SofaSimpleGUI/doc/Doxyfile b/applications/plugins/SofaSimpleGUI/doc/Doxyfile deleted file mode 100644 index 1ff35ada7e4..00000000000 --- a/applications/plugins/SofaSimpleGUI/doc/Doxyfile +++ /dev/null @@ -1,1918 +0,0 @@ -# Doxyfile 1.8.4 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project -# -# All text after a hash (#) is considered a comment and will be ignored -# The format is: -# TAG = value [value, ...] -# For lists items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (" ") - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# This tag specifies the encoding used for all characters in the config file -# that follow. The default is UTF-8 which is also the encoding used for all -# text before the first occurrence of this tag. Doxygen uses libiconv (or the -# iconv built into libc) for the transcoding. See -# http://www.gnu.org/software/libiconv for the list of possible encodings. - -DOXYFILE_ENCODING = UTF-8 - -# The PROJECT_NAME tag is a single word (or sequence of words) that should -# identify the project. Note that if you do not use Doxywizard you need -# to put quotes around the project name if it contains spaces. - -PROJECT_NAME = SimpleGUI - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. -# This could be handy for archiving the generated documentation or -# if some version control system is used. - -PROJECT_NUMBER = - -# Using the PROJECT_BRIEF tag one can provide an optional one line description -# for a project that appears at the top of each page and should give viewer -# a quick idea about the purpose of the project. Keep the description short. - -PROJECT_BRIEF = - -# With the PROJECT_LOGO tag one can specify an logo or icon that is -# included in the documentation. The maximum height of the logo should not -# exceed 55 pixels and the maximum width should not exceed 200 pixels. -# Doxygen will copy the logo to the output directory. - -PROJECT_LOGO = - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) -# base path where the generated documentation will be put. -# If a relative path is entered, it will be relative to the location -# where doxygen was started. If left blank the current directory will be used. - -OUTPUT_DIRECTORY = code - -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create -# 4096 sub-directories (in 2 levels) under the output directory of each output -# format and will distribute the generated files over these directories. -# Enabling this option can be useful when feeding doxygen a huge amount of -# source files, where putting all generated files in the same directory would -# otherwise cause performance problems for the file system. - -CREATE_SUBDIRS = NO - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# The default language is English, other supported languages are: -# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, -# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, -# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English -# messages), Korean, Korean-en, Latvian, Lithuanian, Norwegian, Macedonian, -# Persian, Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, -# Slovak, Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. - -OUTPUT_LANGUAGE = English - -# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will -# include brief member descriptions after the members that are listed in -# the file and class documentation (similar to JavaDoc). -# Set to NO to disable this. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend -# the brief description of a member or function before the detailed description. -# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator -# that is used to form the text in various listings. Each string -# in this list, if found as the leading text of the brief description, will be -# stripped from the text and the result after processing the whole list, is -# used as the annotated text. Otherwise, the brief description is used as-is. -# If left blank, the following values are used ("$name" is automatically -# replaced with the name of the entity): "The $name class" "The $name widget" -# "The $name file" "is" "provides" "specifies" "contains" -# "represents" "a" "an" "the" - -ABBREVIATE_BRIEF = "The $name class" \ - "The $name widget" \ - "The $name file" \ - is \ - provides \ - specifies \ - contains \ - represents \ - a \ - an \ - the - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# Doxygen will generate a detailed section even if there is only a brief -# description. - -ALWAYS_DETAILED_SEC = NO - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -# inherited members of a class in the documentation of that class as if those -# members were ordinary class members. Constructors, destructors and assignment -# operators of the base classes will not be shown. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full -# path before files name in the file list and in the header files. If set -# to NO the shortest path that makes the file name unique will be used. - -FULL_PATH_NAMES = YES - -# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag -# can be used to strip a user-defined part of the path. Stripping is -# only done if one of the specified strings matches the left-hand part of -# the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the -# path to strip. Note that you specify absolute paths here, but also -# relative paths, which will be relative from the directory where doxygen is -# started. - -STRIP_FROM_PATH = - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of -# the path mentioned in the documentation of a class, which tells -# the reader which header file to include in order to use a class. -# If left blank only the name of the header file containing the class -# definition is used. Otherwise one should specify the include paths that -# are normally passed to the compiler using the -I flag. - -STRIP_FROM_INC_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter -# (but less readable) file names. This can be useful if your file system -# doesn't support long names like on DOS, Mac, or CD-ROM. - -SHORT_NAMES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen -# will interpret the first line (until the first dot) of a JavaDoc-style -# comment as the brief description. If set to NO, the JavaDoc -# comments will behave just like regular Qt-style comments -# (thus requiring an explicit @brief command for a brief description.) - -JAVADOC_AUTOBRIEF = NO - -# If the QT_AUTOBRIEF tag is set to YES then Doxygen will -# interpret the first line (until the first dot) of a Qt-style -# comment as the brief description. If set to NO, the comments -# will behave just like regular Qt-style comments (thus requiring -# an explicit \brief command for a brief description.) - -QT_AUTOBRIEF = NO - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen -# treat a multi-line C++ special comment block (i.e. a block of //! or /// -# comments) as a brief description. This used to be the default behaviour. -# The new default is to treat a multi-line C++ comment block as a detailed -# description. Set this tag to YES if you prefer the old behaviour instead. - -MULTILINE_CPP_IS_BRIEF = NO - -# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented -# member inherits the documentation from any documented member that it -# re-implements. - -INHERIT_DOCS = YES - -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce -# a new page for each member. If set to NO, the documentation of a member will -# be part of the file/class/namespace that contains it. - -SEPARATE_MEMBER_PAGES = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. -# Doxygen uses this value to replace tabs by spaces in code fragments. - -TAB_SIZE = 4 - -# This tag can be used to specify a number of aliases that acts -# as commands in the documentation. An alias has the form "name=value". -# For example adding "sideeffect=\par Side Effects:\n" will allow you to -# put the command \sideeffect (or @sideeffect) in the documentation, which -# will result in a user-defined paragraph with heading "Side Effects:". -# You can put \n's in the value part of an alias to insert newlines. - -ALIASES = - -# This tag can be used to specify a number of word-keyword mappings (TCL only). -# A mapping has the form "name=value". For example adding -# "class=itcl::class" will allow you to use the command class in the -# itcl::class meaning. - -TCL_SUBST = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C -# sources only. Doxygen will then generate output that is more tailored for C. -# For instance, some of the names that are used will be different. The list -# of all members will be omitted, etc. - -OPTIMIZE_OUTPUT_FOR_C = NO - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java -# sources only. Doxygen will then generate output that is more tailored for -# Java. For instance, namespaces will be presented as packages, qualified -# scopes will look different, etc. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran -# sources only. Doxygen will then generate output that is more tailored for -# Fortran. - -OPTIMIZE_FOR_FORTRAN = NO - -# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL -# sources. Doxygen will then generate output that is tailored for -# VHDL. - -OPTIMIZE_OUTPUT_VHDL = NO - -# Doxygen selects the parser to use depending on the extension of the files it -# parses. With this tag you can assign which parser to use for a given -# extension. Doxygen has a built-in mapping, but you can override or extend it -# using this tag. The format is ext=language, where ext is a file extension, -# and language is one of the parsers supported by doxygen: IDL, Java, -# Javascript, CSharp, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, -# C++. For instance to make doxygen treat .inc files as Fortran files (default -# is PHP), and .f files as C (default is Fortran), use: inc=Fortran f=C. Note -# that for custom extensions you also need to set FILE_PATTERNS otherwise the -# files are not read by doxygen. - -EXTENSION_MAPPING = - -# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all -# comments according to the Markdown format, which allows for more readable -# documentation. See http://daringfireball.net/projects/markdown/ for details. -# The output of markdown processing is further processed by doxygen, so you -# can mix doxygen, HTML, and XML commands with Markdown formatting. -# Disable only in case of backward compatibilities issues. - -MARKDOWN_SUPPORT = YES - -# When enabled doxygen tries to link words that correspond to documented -# classes, or namespaces to their corresponding documentation. Such a link can -# be prevented in individual cases by by putting a % sign in front of the word -# or globally by setting AUTOLINK_SUPPORT to NO. - -AUTOLINK_SUPPORT = YES - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want -# to include (a tag file for) the STL sources as input, then you should -# set this tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. -# func(std::string) {}). This also makes the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. - -BUILTIN_STL_SUPPORT = NO - -# If you use Microsoft's C++/CLI language, you should set this option to YES to -# enable parsing support. - -CPP_CLI_SUPPORT = NO - -# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. -# Doxygen will parse them like normal C++ but will assume all classes use public -# instead of private inheritance when no explicit protection keyword is present. - -SIP_SUPPORT = NO - -# For Microsoft's IDL there are propget and propput attributes to indicate -# getter and setter methods for a property. Setting this option to YES (the -# default) will make doxygen replace the get and set methods by a property in -# the documentation. This will only work if the methods are indeed getting or -# setting a simple type. If this is not the case, or you want to show the -# methods anyway, you should set this option to NO. - -IDL_PROPERTY_SUPPORT = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. - -DISTRIBUTE_GROUP_DOC = NO - -# Set the SUBGROUPING tag to YES (the default) to allow class member groups of -# the same type (for instance a group of public functions) to be put as a -# subgroup of that type (e.g. under the Public Functions section). Set it to -# NO to prevent subgrouping. Alternatively, this can be done per class using -# the \nosubgrouping command. - -SUBGROUPING = YES - -# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and -# unions are shown inside the group in which they are included (e.g. using -# @ingroup) instead of on a separate page (for HTML and Man pages) or -# section (for LaTeX and RTF). - -INLINE_GROUPED_CLASSES = NO - -# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and -# unions with only public data fields or simple typedef fields will be shown -# inline in the documentation of the scope in which they are defined (i.e. file, -# namespace, or group documentation), provided this scope is documented. If set -# to NO (the default), structs, classes, and unions are shown on a separate -# page (for HTML and Man pages) or section (for LaTeX and RTF). - -INLINE_SIMPLE_STRUCTS = NO - -# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum -# is documented as struct, union, or enum with the name of the typedef. So -# typedef struct TypeS {} TypeT, will appear in the documentation as a struct -# with name TypeT. When disabled the typedef will appear as a member of a file, -# namespace, or class. And the struct will be named TypeS. This can typically -# be useful for C code in case the coding convention dictates that all compound -# types are typedef'ed and only the typedef is referenced, never the tag name. - -TYPEDEF_HIDES_STRUCT = NO - -# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This -# cache is used to resolve symbols given their name and scope. Since this can -# be an expensive process and often the same symbol appear multiple times in -# the code, doxygen keeps a cache of pre-resolved symbols. If the cache is too -# small doxygen will become slower. If the cache is too large, memory is wasted. -# The cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid -# range is 0..9, the default is 0, corresponding to a cache size of 2^16 = 65536 -# symbols. - -LOOKUP_CACHE_SIZE = 0 - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. -# Private class members and static file members will be hidden unless -# the EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES - -EXTRACT_ALL = NO - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -# will be included in the documentation. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal -# scope will be included in the documentation. - -EXTRACT_PACKAGE = NO - -# If the EXTRACT_STATIC tag is set to YES all static members of a file -# will be included in the documentation. - -EXTRACT_STATIC = NO - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -# defined locally in source files will be included in the documentation. -# If set to NO only classes defined in header files are included. - -EXTRACT_LOCAL_CLASSES = YES - -# This flag is only useful for Objective-C code. When set to YES local -# methods, which are defined in the implementation section but not in -# the interface are included in the documentation. -# If set to NO (the default) only methods in the interface are included. - -EXTRACT_LOCAL_METHODS = NO - -# If this flag is set to YES, the members of anonymous namespaces will be -# extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base -# name of the file that contains the anonymous namespace. By default -# anonymous namespaces are hidden. - -EXTRACT_ANON_NSPACES = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. -# This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. -# If set to NO (the default) these classes will be included in the various -# overviews. This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -# friend (class|struct|union) declarations. -# If set to NO (the default) these declarations will be included in the -# documentation. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any -# documentation blocks found inside the body of a function. -# If set to NO (the default) these blocks will be appended to the -# function's detailed documentation block. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation -# that is typed after a \internal command is included. If the tag is set -# to NO (the default) then the documentation will be excluded. -# Set it to YES to include the internal documentation. - -INTERNAL_DOCS = NO - -# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate -# file names in lower-case letters. If set to YES upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. - -CASE_SENSE_NAMES = NO - -# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen -# will show members with their full class and namespace scopes in the -# documentation. If set to YES the scope will be hidden. - -HIDE_SCOPE_NAMES = YES - -# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put a list of the files that are included by a file in the documentation -# of that file. - -SHOW_INCLUDE_FILES = YES - -# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen -# will list include files with double quotes in the documentation -# rather than with sharp brackets. - -FORCE_LOCAL_INCLUDES = NO - -# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] -# is inserted in the documentation for inline members. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen -# will sort the (detailed) documentation of file and class members -# alphabetically by member name. If set to NO the members will appear in -# declaration order. - -SORT_MEMBER_DOCS = YES - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in -# declaration order. - -SORT_BRIEF_DOCS = NO - -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen -# will sort the (brief and detailed) documentation of class members so that -# constructors and destructors are listed first. If set to NO (the default) -# the constructors will appear in the respective orders defined by -# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. -# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO -# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. - -SORT_MEMBERS_CTORS_1ST = NO - -# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the -# hierarchy of group names into alphabetical order. If set to NO (the default) -# the group names will appear in their defined order. - -SORT_GROUP_NAMES = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be -# sorted by fully-qualified names, including namespaces. If set to -# NO (the default), the class list will be sorted only by class name, -# not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the -# alphabetical list. - -SORT_BY_SCOPE_NAME = NO - -# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to -# do proper type resolution of all parameters of a function it will reject a -# match between the prototype and the implementation of a member function even -# if there is only one candidate or it is obvious which candidate to choose -# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen -# will still accept a match between prototype and implementation in such cases. - -STRICT_PROTO_MATCHING = NO - -# The GENERATE_TODOLIST tag can be used to enable (YES) or -# disable (NO) the todo list. This list is created by putting \todo -# commands in the documentation. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable (YES) or -# disable (NO) the test list. This list is created by putting \test -# commands in the documentation. - -GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable (YES) or -# disable (NO) the bug list. This list is created by putting \bug -# commands in the documentation. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or -# disable (NO) the deprecated list. This list is created by putting -# \deprecated commands in the documentation. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional -# documentation sections, marked by \if section-label ... \endif -# and \cond section-label ... \endcond blocks. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or macro consists of for it to appear in -# the documentation. If the initializer consists of more lines than specified -# here it will be hidden. Use a value of 0 to hide initializers completely. -# The appearance of the initializer of individual variables and macros in the -# documentation can be controlled using \showinitializer or \hideinitializer -# command in the documentation regardless of this setting. - -MAX_INITIALIZER_LINES = 30 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated -# at the bottom of the documentation of classes and structs. If set to YES the -# list will mention the files that were used to generate the documentation. - -SHOW_USED_FILES = YES - -# Set the SHOW_FILES tag to NO to disable the generation of the Files page. -# This will remove the Files entry from the Quick Index and from the -# Folder Tree View (if specified). The default is YES. - -SHOW_FILES = YES - -# Set the SHOW_NAMESPACES tag to NO to disable the generation of the -# Namespaces page. This will remove the Namespaces entry from the Quick Index -# and from the Folder Tree View (if specified). The default is YES. - -SHOW_NAMESPACES = YES - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from -# the version control system). Doxygen will invoke the program by executing (via -# popen()) the command , where is the value of -# the FILE_VERSION_FILTER tag, and is the name of an input file -# provided by doxygen. Whatever the program writes to standard output -# is used as the file version. See the manual for examples. - -FILE_VERSION_FILTER = - -# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed -# by doxygen. The layout file controls the global structure of the generated -# output files in an output format independent way. To create the layout file -# that represents doxygen's defaults, run doxygen with the -l option. -# You can optionally specify a file name after the option, if omitted -# DoxygenLayout.xml will be used as the name of the layout file. - -LAYOUT_FILE = - -# The CITE_BIB_FILES tag can be used to specify one or more bib files -# containing the references data. This must be a list of .bib files. The -# .bib extension is automatically appended if omitted. Using this command -# requires the bibtex tool to be installed. See also -# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style -# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this -# feature you need bibtex and perl available in the search path. Do not use -# file names with spaces, bibtex cannot handle them. - -CITE_BIB_FILES = - -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated -# by doxygen. Possible values are YES and NO. If left blank NO is used. - -QUIET = NO - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated by doxygen. Possible values are YES and NO. If left blank -# NO is used. - -WARNINGS = YES - -# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings -# for undocumented members. If EXTRACT_ALL is set to YES then this flag will -# automatically be disabled. - -WARN_IF_UNDOCUMENTED = YES - -# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some -# parameters in a documented function, or documenting parameters that -# don't exist or using markup commands wrongly. - -WARN_IF_DOC_ERROR = YES - -# The WARN_NO_PARAMDOC option can be enabled to get warnings for -# functions that are documented, but have no documentation for their parameters -# or return value. If set to NO (the default) doxygen will only warn about -# wrong or incomplete parameter documentation, but not about the absence of -# documentation. - -WARN_NO_PARAMDOC = NO - -# The WARN_FORMAT tag determines the format of the warning messages that -# doxygen can produce. The string should contain the $file, $line, and $text -# tags, which will be replaced by the file and line number from which the -# warning originated and the warning text. Optionally the format may contain -# $version, which will be replaced by the version of the file (if it could -# be obtained via FILE_VERSION_FILTER) - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning -# and error messages should be written. If left blank the output is written -# to stderr. - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag can be used to specify the files and/or directories that contain -# documented source files. You may enter file names like "myfile.cpp" or -# directories like "/usr/src/myproject". Separate the files or directories -# with spaces. - -INPUT = .. - -# This tag can be used to specify the character encoding of the source files -# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is -# also the default input encoding. Doxygen uses libiconv (or the iconv built -# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for -# the list of possible encodings. - -INPUT_ENCODING = UTF-8 - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh -# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py -# *.f90 *.f *.for *.vhd *.vhdl - -FILE_PATTERNS = *.c \ - *.cc \ - *.cxx \ - *.cpp \ - *.c++ \ - *.d \ - *.java \ - *.ii \ - *.ixx \ - *.ipp \ - *.i++ \ - *.inl \ - *.h \ - *.hh \ - *.hxx \ - *.hpp \ - *.h++ \ - *.idl \ - *.odl \ - *.cs \ - *.php \ - *.php3 \ - *.inc \ - *.m \ - *.mm \ - *.dox \ - *.py \ - *.f90 \ - *.f \ - *.vhd \ - *.vhdl - -# The RECURSIVE tag can be used to turn specify whether or not subdirectories -# should be searched for input files as well. Possible values are YES and NO. -# If left blank NO is used. - -RECURSIVE = YES - -# The EXCLUDE tag can be used to specify files and/or directories that should be -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. -# Note that relative paths are relative to the directory from which doxygen is -# run. - -EXCLUDE = - -# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or -# directories that are symbolic links (a Unix file system feature) are excluded -# from the input. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. Note that the wildcards are matched -# against the file with absolute path, so to exclude all test directories -# for example use the pattern */test/* - -EXCLUDE_PATTERNS = - -# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names -# (namespaces, classes, functions, etc.) that should be excluded from the -# output. The symbol name can be a fully qualified name, a word, or if the -# wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test - -EXCLUDE_SYMBOLS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see -# the \include command). - -EXAMPLE_PATH = ../glutOnePick - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank all files are included. - -EXAMPLE_PATTERNS = * - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude -# commands irrespective of the value of the RECURSIVE tag. -# Possible values are YES and NO. If left blank NO is used. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see -# the \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command , where -# is the value of the INPUT_FILTER tag, and is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. If FILTER_PATTERNS is specified, this tag will be ignored. -# Note that the filter must not add or remove lines; it is applied before the -# code is scanned, but not when the output code is generated. If lines are added -# or removed, the anchors will not be placed correctly. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: -# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further -# info on how filters are used. If FILTER_PATTERNS is empty or if -# non of the patterns match the file name, INPUT_FILTER is applied. - -FILTER_PATTERNS = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will be used to filter the input files when producing source -# files to browse (i.e. when SOURCE_BROWSER is set to YES). - -FILTER_SOURCE_FILES = NO - -# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file -# pattern. A pattern will override the setting for FILTER_PATTERN (if any) -# and it is also possible to disable source filtering for a specific pattern -# using *.ext= (so without naming a filter). This option only has effect when -# FILTER_SOURCE_FILES is enabled. - -FILTER_SOURCE_PATTERNS = - -# If the USE_MD_FILE_AS_MAINPAGE tag refers to the name of a markdown file that -# is part of the input, its contents will be placed on the main page -# (index.html). This can be useful if you have a project on for instance GitHub -# and want reuse the introduction page also for the doxygen output. - -USE_MDFILE_AS_MAINPAGE = - -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will -# be generated. Documented entities will be cross-referenced with these sources. -# Note: To get rid of all source code in the generated output, make sure also -# VERBATIM_HEADERS is set to NO. - -SOURCE_BROWSER = YES - -# Setting the INLINE_SOURCES tag to YES will include the body -# of functions and classes directly in the documentation. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct -# doxygen to hide any special comment blocks from generated source code -# fragments. Normal C, C++ and Fortran comments will always remain visible. - -STRIP_CODE_COMMENTS = YES - -# If the REFERENCED_BY_RELATION tag is set to YES -# then for each documented function all documented -# functions referencing it will be listed. - -REFERENCED_BY_RELATION = NO - -# If the REFERENCES_RELATION tag is set to YES -# then for each documented function all documented entities -# called/used by that function will be listed. - -REFERENCES_RELATION = NO - -# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) -# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from -# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will -# link to the source code. Otherwise they will link to the documentation. - -REFERENCES_LINK_SOURCE = YES - -# If the USE_HTAGS tag is set to YES then the references to source code -# will point to the HTML generated by the htags(1) tool instead of doxygen -# built-in source browser. The htags tool is part of GNU's global source -# tagging system (see http://www.gnu.org/software/global/global.html). You -# will need version 4.8.6 or higher. - -USE_HTAGS = NO - -# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen -# will generate a verbatim copy of the header file for each class for -# which an include is specified. Set to NO to disable this. - -VERBATIM_HEADERS = YES - -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index -# of all compounds will be generated. Enable this if the project -# contains a lot of classes, structs, unions or interfaces. - -ALPHABETICAL_INDEX = NO - -# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then -# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns -# in which this list will be split (can be a number in the range [1..20]) - -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all -# classes will be put under the same header in the alphabetical index. -# The IGNORE_PREFIX tag can be used to specify one or more prefixes that -# should be ignored while generating the index headers. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES (the default) Doxygen will -# generate HTML output. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `html' will be used as the default path. - -HTML_OUTPUT = html - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for -# each generated HTML page (for example: .htm,.php,.asp). If it is left blank -# doxygen will generate files with .html extension. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a personal HTML header for -# each generated HTML page. If it is left blank doxygen will generate a -# standard header. Note that when using a custom header you are responsible -# for the proper inclusion of any scripts and style sheets that doxygen -# needs, which is dependent on the configuration options used. -# It is advised to generate a default header using "doxygen -w html -# header.html footer.html stylesheet.css YourConfigFile" and then modify -# that header. Note that the header is subject to change so you typically -# have to redo this when upgrading to a newer version of doxygen or when -# changing the value of configuration settings such as GENERATE_TREEVIEW! - -HTML_HEADER = - -# The HTML_FOOTER tag can be used to specify a personal HTML footer for -# each generated HTML page. If it is left blank doxygen will generate a -# standard footer. - -HTML_FOOTER = - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading -# style sheet that is used by each HTML page. It can be used to -# fine-tune the look of the HTML output. If left blank doxygen will -# generate a default style sheet. Note that it is recommended to use -# HTML_EXTRA_STYLESHEET instead of this one, as it is more robust and this -# tag will in the future become obsolete. - -HTML_STYLESHEET = - -# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional -# user-defined cascading style sheet that is included after the standard -# style sheets created by doxygen. Using this option one can overrule -# certain style aspects. This is preferred over using HTML_STYLESHEET -# since it does not replace the standard style sheet and is therefor more -# robust against future updates. Doxygen will copy the style sheet file to -# the output directory. - -HTML_EXTRA_STYLESHEET = - -# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or -# other source files which should be copied to the HTML output directory. Note -# that these files will be copied to the base HTML output directory. Use the -# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these -# files. In the HTML_STYLESHEET file, use the file name only. Also note that -# the files will be copied as-is; there are no commands or markers available. - -HTML_EXTRA_FILES = - -# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. -# Doxygen will adjust the colors in the style sheet and background images -# according to this color. Hue is specified as an angle on a colorwheel, -# see http://en.wikipedia.org/wiki/Hue for more information. -# For instance the value 0 represents red, 60 is yellow, 120 is green, -# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. -# The allowed range is 0 to 359. - -HTML_COLORSTYLE_HUE = 220 - -# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of -# the colors in the HTML output. For a value of 0 the output will use -# grayscales only. A value of 255 will produce the most vivid colors. - -HTML_COLORSTYLE_SAT = 100 - -# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to -# the luminance component of the colors in the HTML output. Values below -# 100 gradually make the output lighter, whereas values above 100 make -# the output darker. The value divided by 100 is the actual gamma applied, -# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, -# and 100 does not change the gamma. - -HTML_COLORSTYLE_GAMMA = 80 - -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting -# this to NO can help when comparing the output of multiple runs. - -HTML_TIMESTAMP = YES - -# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML -# documentation will contain sections that can be hidden and shown after the -# page has loaded. - -HTML_DYNAMIC_SECTIONS = NO - -# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of -# entries shown in the various tree structured indices initially; the user -# can expand and collapse entries dynamically later on. Doxygen will expand -# the tree to such a level that at most the specified number of entries are -# visible (unless a fully collapsed tree already exceeds this amount). -# So setting the number of entries 1 will produce a full collapsed tree by -# default. 0 is a special value representing an infinite number of entries -# and will result in a full expanded tree by default. - -HTML_INDEX_NUM_ENTRIES = 100 - -# If the GENERATE_DOCSET tag is set to YES, additional index files -# will be generated that can be used as input for Apple's Xcode 3 -# integrated development environment, introduced with OSX 10.5 (Leopard). -# To create a documentation set, doxygen will generate a Makefile in the -# HTML output directory. Running make will produce the docset in that -# directory and running "make install" will install the docset in -# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find -# it at startup. -# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html -# for more information. - -GENERATE_DOCSET = NO - -# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the -# feed. A documentation feed provides an umbrella under which multiple -# documentation sets from a single provider (such as a company or product suite) -# can be grouped. - -DOCSET_FEEDNAME = "Doxygen generated docs" - -# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that -# should uniquely identify the documentation set bundle. This should be a -# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen -# will append .docset to the name. - -DOCSET_BUNDLE_ID = org.doxygen.Project - -# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely -# identify the documentation publisher. This should be a reverse domain-name -# style string, e.g. com.mycompany.MyDocSet.documentation. - -DOCSET_PUBLISHER_ID = org.doxygen.Publisher - -# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. - -DOCSET_PUBLISHER_NAME = Publisher - -# If the GENERATE_HTMLHELP tag is set to YES, additional index files -# will be generated that can be used as input for tools like the -# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) -# of the generated HTML documentation. - -GENERATE_HTMLHELP = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can -# be used to specify the file name of the resulting .chm file. You -# can add a path in front of the file if the result should not be -# written to the html output directory. - -CHM_FILE = - -# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can -# be used to specify the location (absolute path including file name) of -# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run -# the HTML help compiler on the generated index.hhp. - -HHC_LOCATION = - -# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag -# controls if a separate .chi index file is generated (YES) or that -# it should be included in the master .chm file (NO). - -GENERATE_CHI = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING -# is used to encode HtmlHelp index (hhk), content (hhc) and project file -# content. - -CHM_INDEX_ENCODING = - -# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag -# controls whether a binary table of contents is generated (YES) or a -# normal table of contents (NO) in the .chm file. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members -# to the contents of the HTML help documentation and to the tree view. - -TOC_EXPAND = NO - -# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and -# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated -# that can be used as input for Qt's qhelpgenerator to generate a -# Qt Compressed Help (.qch) of the generated HTML documentation. - -GENERATE_QHP = NO - -# If the QHG_LOCATION tag is specified, the QCH_FILE tag can -# be used to specify the file name of the resulting .qch file. -# The path specified is relative to the HTML output folder. - -QCH_FILE = - -# The QHP_NAMESPACE tag specifies the namespace to use when generating -# Qt Help Project output. For more information please see -# http://doc.trolltech.com/qthelpproject.html#namespace - -QHP_NAMESPACE = org.doxygen.Project - -# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating -# Qt Help Project output. For more information please see -# http://doc.trolltech.com/qthelpproject.html#virtual-folders - -QHP_VIRTUAL_FOLDER = doc - -# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to -# add. For more information please see -# http://doc.trolltech.com/qthelpproject.html#custom-filters - -QHP_CUST_FILTER_NAME = - -# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the -# custom filter to add. For more information please see -#
-# Qt Help Project / Custom Filters. - -QHP_CUST_FILTER_ATTRS = - -# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this -# project's -# filter section matches. -# -# Qt Help Project / Filter Attributes. - -QHP_SECT_FILTER_ATTRS = - -# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can -# be used to specify the location of Qt's qhelpgenerator. -# If non-empty doxygen will try to run qhelpgenerator on the generated -# .qhp file. - -QHG_LOCATION = - -# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files -# will be generated, which together with the HTML files, form an Eclipse help -# plugin. To install this plugin and make it available under the help contents -# menu in Eclipse, the contents of the directory containing the HTML and XML -# files needs to be copied into the plugins directory of eclipse. The name of -# the directory within the plugins directory should be the same as -# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before -# the help appears. - -GENERATE_ECLIPSEHELP = NO - -# A unique identifier for the eclipse help plugin. When installing the plugin -# the directory name containing the HTML and XML files should also have -# this name. - -ECLIPSE_DOC_ID = org.doxygen.Project - -# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) -# at top of each HTML page. The value NO (the default) enables the index and -# the value YES disables it. Since the tabs have the same information as the -# navigation tree you can set this option to NO if you already set -# GENERATE_TREEVIEW to YES. - -DISABLE_INDEX = NO - -# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index -# structure should be generated to display hierarchical information. -# If the tag value is set to YES, a side panel will be generated -# containing a tree-like index structure (just like the one that -# is generated for HTML Help). For this to work a browser that supports -# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). -# Windows users are probably better off using the HTML help feature. -# Since the tree basically has the same information as the tab index you -# could consider to set DISABLE_INDEX to NO when enabling this option. - -GENERATE_TREEVIEW = YES - -# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values -# (range [0,1..20]) that doxygen will group on one line in the generated HTML -# documentation. Note that a value of 0 will completely suppress the enum -# values from appearing in the overview section. - -ENUM_VALUES_PER_LINE = 4 - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be -# used to set the initial width (in pixels) of the frame in which the tree -# is shown. - -TREEVIEW_WIDTH = 250 - -# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open -# links to external symbols imported via tag files in a separate window. - -EXT_LINKS_IN_WINDOW = NO - -# Use this tag to change the font size of Latex formulas included -# as images in the HTML documentation. The default is 10. Note that -# when you change the font size after a successful doxygen run you need -# to manually remove any form_*.png images from the HTML output directory -# to force them to be regenerated. - -FORMULA_FONTSIZE = 10 - -# Use the FORMULA_TRANPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are -# not supported properly for IE 6.0, but are supported on all modern browsers. -# Note that when changing this option you need to delete any form_*.png files -# in the HTML output before the changes have effect. - -FORMULA_TRANSPARENT = YES - -# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax -# (see http://www.mathjax.org) which uses client side Javascript for the -# rendering instead of using prerendered bitmaps. Use this if you do not -# have LaTeX installed or if you want to formulas look prettier in the HTML -# output. When enabled you may also need to install MathJax separately and -# configure the path to it using the MATHJAX_RELPATH option. - -USE_MATHJAX = NO - -# When MathJax is enabled you can set the default output format to be used for -# the MathJax output. Supported types are HTML-CSS, NativeMML (i.e. MathML) and -# SVG. The default value is HTML-CSS, which is slower, but has the best -# compatibility. - -MATHJAX_FORMAT = HTML-CSS - -# When MathJax is enabled you need to specify the location relative to the -# HTML output directory using the MATHJAX_RELPATH option. The destination -# directory should contain the MathJax.js script. For instance, if the mathjax -# directory is located at the same level as the HTML output directory, then -# MATHJAX_RELPATH should be ../mathjax. The default value points to -# the MathJax Content Delivery Network so you can quickly see the result without -# installing MathJax. However, it is strongly recommended to install a local -# copy of MathJax from http://www.mathjax.org before deployment. - -MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest - -# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension -# names that should be enabled during MathJax rendering. - -MATHJAX_EXTENSIONS = - -# The MATHJAX_CODEFILE tag can be used to specify a file with javascript -# pieces of code that will be used on startup of the MathJax code. - -MATHJAX_CODEFILE = - -# When the SEARCHENGINE tag is enabled doxygen will generate a search box -# for the HTML output. The underlying search engine uses javascript -# and DHTML and should work on any modern browser. Note that when using -# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets -# (GENERATE_DOCSET) there is already a search function so this one should -# typically be disabled. For large projects the javascript based search engine -# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. - -SEARCHENGINE = YES - -# When the SERVER_BASED_SEARCH tag is enabled the search engine will be -# implemented using a web server instead of a web client using Javascript. -# There are two flavours of web server based search depending on the -# EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for -# searching and an index file used by the script. When EXTERNAL_SEARCH is -# enabled the indexing and searching needs to be provided by external tools. -# See the manual for details. - -SERVER_BASED_SEARCH = NO - -# When EXTERNAL_SEARCH is enabled doxygen will no longer generate the PHP -# script for searching. Instead the search results are written to an XML file -# which needs to be processed by an external indexer. Doxygen will invoke an -# external search engine pointed to by the SEARCHENGINE_URL option to obtain -# the search results. Doxygen ships with an example indexer (doxyindexer) and -# search engine (doxysearch.cgi) which are based on the open source search -# engine library Xapian. See the manual for configuration details. - -EXTERNAL_SEARCH = NO - -# The SEARCHENGINE_URL should point to a search engine hosted by a web server -# which will returned the search results when EXTERNAL_SEARCH is enabled. -# Doxygen ships with an example search engine (doxysearch) which is based on -# the open source search engine library Xapian. See the manual for configuration -# details. - -SEARCHENGINE_URL = - -# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed -# search data is written to a file for indexing by an external tool. With the -# SEARCHDATA_FILE tag the name of this file can be specified. - -SEARCHDATA_FILE = searchdata.xml - -# When SERVER_BASED_SEARCH AND EXTERNAL_SEARCH are both enabled the -# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is -# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple -# projects and redirect the results back to the right project. - -EXTERNAL_SEARCH_ID = - -# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen -# projects other than the one defined by this configuration file, but that are -# all added to the same external search index. Each project needs to have a -# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id -# of to a relative location where the documentation can be found. -# The format is: EXTRA_SEARCH_MAPPINGS = id1=loc1 id2=loc2 ... - -EXTRA_SEARCH_MAPPINGS = - -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- - -# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will -# generate Latex output. - -GENERATE_LATEX = NO - -# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `latex' will be used as the default path. - -LATEX_OUTPUT = latex - -# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be -# invoked. If left blank `latex' will be used as the default command name. -# Note that when enabling USE_PDFLATEX this option is only used for -# generating bitmaps for formulas in the HTML output, but not in the -# Makefile that is written to the output directory. - -LATEX_CMD_NAME = latex - -# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to -# generate index for LaTeX. If left blank `makeindex' will be used as the -# default command name. - -MAKEINDEX_CMD_NAME = makeindex - -# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact -# LaTeX documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_LATEX = NO - -# The PAPER_TYPE tag can be used to set the paper type that is used -# by the printer. Possible values are: a4, letter, legal and -# executive. If left blank a4 will be used. - -PAPER_TYPE = a4wide - -# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX -# packages that should be included in the LaTeX output. - -EXTRA_PACKAGES = - -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for -# the generated latex document. The header should contain everything until -# the first chapter. If it is left blank doxygen will generate a -# standard header. Notice: only use this tag if you know what you are doing! - -LATEX_HEADER = - -# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for -# the generated latex document. The footer should contain everything after -# the last chapter. If it is left blank doxygen will generate a -# standard footer. Notice: only use this tag if you know what you are doing! - -LATEX_FOOTER = - -# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images -# or other source files which should be copied to the LaTeX output directory. -# Note that the files will be copied as-is; there are no commands or markers -# available. - -LATEX_EXTRA_FILES = - -# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated -# is prepared for conversion to pdf (using ps2pdf). The pdf file will -# contain links (just like the HTML output) instead of page references -# This makes the output suitable for online browsing using a pdf viewer. - -PDF_HYPERLINKS = YES - -# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of -# plain latex in the generated Makefile. Set this option to YES to get a -# higher quality PDF documentation. - -USE_PDFLATEX = YES - -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. -# command to the generated LaTeX files. This will instruct LaTeX to keep -# running if errors occur, instead of asking the user for help. -# This option is also used when generating formulas in HTML. - -LATEX_BATCHMODE = NO - -# If LATEX_HIDE_INDICES is set to YES then doxygen will not -# include the index chapters (such as File Index, Compound Index, etc.) -# in the output. - -LATEX_HIDE_INDICES = NO - -# If LATEX_SOURCE_CODE is set to YES then doxygen will include -# source code with syntax highlighting in the LaTeX output. -# Note that which sources are shown also depends on other settings -# such as SOURCE_BROWSER. - -LATEX_SOURCE_CODE = NO - -# The LATEX_BIB_STYLE tag can be used to specify the style to use for the -# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See -# http://en.wikipedia.org/wiki/BibTeX for more info. - -LATEX_BIB_STYLE = plain - -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- - -# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output -# The RTF output is optimized for Word 97 and may not look very pretty with -# other RTF readers or editors. - -GENERATE_RTF = NO - -# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `rtf' will be used as the default path. - -RTF_OUTPUT = rtf - -# If the COMPACT_RTF tag is set to YES Doxygen generates more compact -# RTF documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_RTF = NO - -# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated -# will contain hyperlink fields. The RTF file will -# contain links (just like the HTML output) instead of page references. -# This makes the output suitable for online browsing using WORD or other -# programs which support those fields. -# Note: wordpad (write) and others do not support links. - -RTF_HYPERLINKS = NO - -# Load style sheet definitions from file. Syntax is similar to doxygen's -# config file, i.e. a series of assignments. You only have to provide -# replacements, missing definitions are set to their default value. - -RTF_STYLESHEET_FILE = - -# Set optional variables used in the generation of an rtf document. -# Syntax is similar to doxygen's config file. - -RTF_EXTENSIONS_FILE = - -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- - -# If the GENERATE_MAN tag is set to YES (the default) Doxygen will -# generate man pages - -GENERATE_MAN = NO - -# The MAN_OUTPUT tag is used to specify where the man pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `man' will be used as the default path. - -MAN_OUTPUT = man - -# The MAN_EXTENSION tag determines the extension that is added to -# the generated man pages (default is the subroutine's section .3) - -MAN_EXTENSION = .3 - -# If the MAN_LINKS tag is set to YES and Doxygen generates man output, -# then it will generate one additional man file for each entity -# documented in the real man page(s). These additional files -# only source the real man page, but without them the man command -# would be unable to find the correct page. The default is NO. - -MAN_LINKS = NO - -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- - -# If the GENERATE_XML tag is set to YES Doxygen will -# generate an XML file that captures the structure of -# the code including all documentation. - -GENERATE_XML = NO - -# The XML_OUTPUT tag is used to specify where the XML pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `xml' will be used as the default path. - -XML_OUTPUT = xml - -# The XML_SCHEMA tag can be used to specify an XML schema, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_SCHEMA = - -# The XML_DTD tag can be used to specify an XML DTD, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_DTD = - -# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -# dump the program listings (including syntax highlighting -# and cross-referencing information) to the XML output. Note that -# enabling this will significantly increase the size of the XML output. - -XML_PROGRAMLISTING = YES - -#--------------------------------------------------------------------------- -# configuration options related to the DOCBOOK output -#--------------------------------------------------------------------------- - -# If the GENERATE_DOCBOOK tag is set to YES Doxygen will generate DOCBOOK files -# that can be used to generate PDF. - -GENERATE_DOCBOOK = NO - -# The DOCBOOK_OUTPUT tag is used to specify where the DOCBOOK pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in -# front of it. If left blank docbook will be used as the default path. - -DOCBOOK_OUTPUT = docbook - -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- - -# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will -# generate an AutoGen Definitions (see autogen.sf.net) file -# that captures the structure of the code including all -# documentation. Note that this feature is still experimental -# and incomplete at the moment. - -GENERATE_AUTOGEN_DEF = NO - -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- - -# If the GENERATE_PERLMOD tag is set to YES Doxygen will -# generate a Perl module file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the -# moment. - -GENERATE_PERLMOD = NO - -# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -# the necessary Makefile rules, Perl scripts and LaTeX code to be able -# to generate PDF and DVI output from the Perl module output. - -PERLMOD_LATEX = NO - -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -# nicely formatted so it can be parsed by a human reader. This is useful -# if you want to understand what is going on. On the other hand, if this -# tag is set to NO the size of the Perl module output will be much smaller -# and Perl will parse it just the same. - -PERLMOD_PRETTY = YES - -# The names of the make variables in the generated doxyrules.make file -# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -# This is useful so different doxyrules.make files included by the same -# Makefile don't overwrite each other's variables. - -PERLMOD_MAKEVAR_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- - -# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will -# evaluate all C-preprocessor directives found in the sources and include -# files. - -ENABLE_PREPROCESSING = YES - -# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro -# names in the source code. If set to NO (the default) only conditional -# compilation will be performed. Macro expansion can be done in a controlled -# way by setting EXPAND_ONLY_PREDEF to YES. - -MACRO_EXPANSION = NO - -# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES -# then the macro expansion is limited to the macros specified with the -# PREDEFINED and EXPAND_AS_DEFINED tags. - -EXPAND_ONLY_PREDEF = NO - -# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -# pointed to by INCLUDE_PATH will be searched when a #include is found. - -SEARCH_INCLUDES = YES - -# The INCLUDE_PATH tag can be used to specify one or more directories that -# contain include files that are not input files but should be processed by -# the preprocessor. - -INCLUDE_PATH = - -# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard -# patterns (like *.h and *.hpp) to filter out the header-files in the -# directories. If left blank, the patterns specified with FILE_PATTERNS will -# be used. - -INCLUDE_FILE_PATTERNS = - -# The PREDEFINED tag can be used to specify one or more macro names that -# are defined before the preprocessor is started (similar to the -D option of -# gcc). The argument of the tag is a list of macros of the form: name -# or name=definition (no spaces). If the definition and the = are -# omitted =1 is assumed. To prevent a macro definition from being -# undefined via #undef or recursively expanded use the := operator -# instead of the = operator. - -PREDEFINED = - -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then -# this tag can be used to specify a list of macro names that should be expanded. -# The macro definition that is found in the sources will be used. -# Use the PREDEFINED tag if you want to use a different macro definition that -# overrules the definition found in the source code. - -EXPAND_AS_DEFINED = - -# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all references to function-like macros -# that are alone on a line, have an all uppercase name, and do not end with a -# semicolon, because these will confuse the parser if not removed. - -SKIP_FUNCTION_MACROS = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to external references -#--------------------------------------------------------------------------- - -# The TAGFILES option can be used to specify one or more tagfiles. For each -# tag file the location of the external documentation should be added. The -# format of a tag file without this location is as follows: -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths -# or URLs. Note that each tag file must have a unique name (where the name does -# NOT include the path). If a tag file is not located in the directory in which -# doxygen is run, you must also specify the path to the tagfile here. - -TAGFILES = - -# When a file name is specified after GENERATE_TAGFILE, doxygen will create -# a tag file that is based on the input files it reads. - -GENERATE_TAGFILE = - -# If the ALLEXTERNALS tag is set to YES all external classes will be listed -# in the class index. If set to NO only the inherited external classes -# will be listed. - -ALLEXTERNALS = NO - -# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will -# be listed. - -EXTERNAL_GROUPS = YES - -# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed -# in the related pages index. If set to NO, only the current project's -# pages will be listed. - -EXTERNAL_PAGES = YES - -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of `which perl'). - -PERL_PATH = /usr/bin/perl - -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- - -# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will -# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base -# or super classes. Setting the tag to NO turns the diagrams off. Note that -# this option also works with HAVE_DOT disabled, but it is recommended to -# install and use dot, since it yields more powerful graphs. - -CLASS_DIAGRAMS = YES - -# You can define message sequence charts within doxygen comments using the \msc -# command. Doxygen will then run the mscgen tool (see -# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the -# documentation. The MSCGEN_PATH tag allows you to specify the directory where -# the mscgen tool resides. If left empty the tool is assumed to be found in the -# default search path. - -MSCGEN_PATH = - -# If set to YES, the inheritance and collaboration graphs will hide -# inheritance and usage relations if the target is undocumented -# or is not a class. - -HIDE_UNDOC_RELATIONS = YES - -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is -# available from the path. This tool is part of Graphviz, a graph visualization -# toolkit from AT&T and Lucent Bell Labs. The other options in this section -# have no effect if this option is set to NO (the default) - -HAVE_DOT = NO - -# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is -# allowed to run in parallel. When set to 0 (the default) doxygen will -# base this on the number of processors available in the system. You can set it -# explicitly to a value larger than 0 to get control over the balance -# between CPU load and processing speed. - -DOT_NUM_THREADS = 0 - -# By default doxygen will use the Helvetica font for all dot files that -# doxygen generates. When you want a differently looking font you can specify -# the font name using DOT_FONTNAME. You need to make sure dot is able to find -# the font, which can be done by putting it in a standard location or by setting -# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the -# directory containing the font. - -DOT_FONTNAME = FreeSans - -# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. -# The default size is 10pt. - -DOT_FONTSIZE = 10 - -# By default doxygen will tell dot to use the Helvetica font. -# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to -# set the path where dot can find it. - -DOT_FONTPATH = - -# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect inheritance relations. Setting this tag to YES will force the -# CLASS_DIAGRAMS tag to NO. - -CLASS_GRAPH = YES - -# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect implementation dependencies (inheritance, containment, and -# class references variables) of the class with other documented classes. - -COLLABORATION_GRAPH = YES - -# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for groups, showing the direct groups dependencies - -GROUP_GRAPHS = YES - -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling -# Language. - -UML_LOOK = NO - -# If the UML_LOOK tag is enabled, the fields and methods are shown inside -# the class node. If there are many fields or methods and many nodes the -# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS -# threshold limits the number of items for each type to make the size more -# manageable. Set this to 0 for no limit. Note that the threshold may be -# exceeded by 50% before the limit is enforced. - -UML_LIMIT_NUM_FIELDS = 10 - -# If set to YES, the inheritance and collaboration graphs will show the -# relations between templates and their instances. - -TEMPLATE_RELATIONS = NO - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT -# tags are set to YES then doxygen will generate a graph for each documented -# file showing the direct and indirect include dependencies of the file with -# other documented files. - -INCLUDE_GRAPH = YES - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and -# HAVE_DOT tags are set to YES then doxygen will generate a graph for each -# documented header file showing the documented files that directly or -# indirectly include this file. - -INCLUDED_BY_GRAPH = YES - -# If the CALL_GRAPH and HAVE_DOT options are set to YES then -# doxygen will generate a call dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable call graphs -# for selected functions only using the \callgraph command. - -CALL_GRAPH = NO - -# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then -# doxygen will generate a caller dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable caller -# graphs for selected functions only using the \callergraph command. - -CALLER_GRAPH = NO - -# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen -# will generate a graphical hierarchy of all classes instead of a textual one. - -GRAPHICAL_HIERARCHY = YES - -# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES -# then doxygen will show the dependencies a directory has on other directories -# in a graphical way. The dependency relations are determined by the #include -# relations between the files in the directories. - -DIRECTORY_GRAPH = YES - -# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are svg, png, jpg, or gif. -# If left blank png will be used. If you choose svg you need to set -# HTML_FILE_EXTENSION to xhtml in order to make the SVG files -# visible in IE 9+ (other browsers do not have this requirement). - -DOT_IMAGE_FORMAT = png - -# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to -# enable generation of interactive SVG images that allow zooming and panning. -# Note that this requires a modern browser other than Internet Explorer. -# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you -# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files -# visible. Older versions of IE do not have SVG support. - -INTERACTIVE_SVG = NO - -# The tag DOT_PATH can be used to specify the path where the dot tool can be -# found. If left blank, it is assumed the dot tool can be found in the path. - -DOT_PATH = - -# The DOTFILE_DIRS tag can be used to specify one or more directories that -# contain dot files that are included in the documentation (see the -# \dotfile command). - -DOTFILE_DIRS = - -# The MSCFILE_DIRS tag can be used to specify one or more directories that -# contain msc files that are included in the documentation (see the -# \mscfile command). - -MSCFILE_DIRS = - -# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of -# nodes that will be shown in the graph. If the number of nodes in a graph -# becomes larger than this value, doxygen will truncate the graph, which is -# visualized by representing a node as a red box. Note that doxygen if the -# number of direct children of the root node in a graph is already larger than -# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note -# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. - -DOT_GRAPH_MAX_NODES = 50 - -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the -# graphs generated by dot. A depth value of 3 means that only nodes reachable -# from the root by following a path via at most 3 edges will be shown. Nodes -# that lay further from the root node will be omitted. Note that setting this -# option to 1 or 2 may greatly reduce the computation time needed for large -# code bases. Also note that the size of a graph can be further restricted by -# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. - -MAX_DOT_GRAPH_DEPTH = 0 - -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, because dot on Windows does not -# seem to support this out of the box. Warning: Depending on the platform used, -# enabling this option may lead to badly anti-aliased labels on the edges of -# a graph (i.e. they become hard to read). - -DOT_TRANSPARENT = NO - -# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output -# files in one run (i.e. multiple -o and -T options on the command line). This -# makes dot run faster, but since only newer versions of dot (>1.8.10) -# support this, this feature is disabled by default. - -DOT_MULTI_TARGETS = NO - -# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will -# generate a legend page explaining the meaning of the various boxes and -# arrows in the dot generated graphs. - -GENERATE_LEGEND = YES - -# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will -# remove the intermediate dot files that are used to generate -# the various graphs. - -DOT_CLEANUP = YES diff --git a/applications/plugins/SofaSimpleGUI/doc/DoxygenLayout.xml b/applications/plugins/SofaSimpleGUI/doc/DoxygenLayout.xml deleted file mode 100644 index 4be599bd1a7..00000000000 --- a/applications/plugins/SofaSimpleGUI/doc/DoxygenLayout.xml +++ /dev/null @@ -1,185 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/applications/plugins/SofaSimpleGUI/doc/SimpleGUI.png b/applications/plugins/SofaSimpleGUI/doc/SimpleGUI.png deleted file mode 100644 index 25881a4e2bd974f3229c06699ea1fdde20d25d95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18862 zcmb4rRa6~Kur3zdEjS^#ySoP`xNC5CclQK$cXzj-A-KB--MBk<_|Lg7_wBOQUNC#6 zt4q47tG=!wLQ!542_6p~3=9lO>YJDn7#R3G@S%W(2EJkIffoXPK{<&?slWn1-mpKy zfonMXZ<AMhkvWPIRDSx*%WXB7))YZEXq_srSJKa+Cv3Nm!`(({b+6Z4D{ z3NmwYlXL-0@zShLO3n#R=+`qba?Z+13DUE-2`tw)vrf`7FV{+tEC~(DU?e*@I9p#b zGr_>VfJuo7tGH*Lth;6Em~=f{PFg6tHW#^}fBT{YA@(IyPZX_sXE5;8Q?-_sqcc(v zO;N>K{ijzKyk3nunu-dYIvOS{EX0i1)X$BC^&bf~v+^F5*sU3BE@owA(P=kF(`z@YsG2spbosse8r5m2 zPErrE$$>ext<`R@_Lm(v4)d=q+78DOj%9G#iA@aua@R*x-Ov#1iD#+cAG&muEpmuc zNt;hp9%&9WG@vaCT{Evmse|Nyd`jk=6M!jbqJRxVizraBkhOE~$ES%ju00?=e3Sh9 z%?~VQA0(JQDfn|ynmXjb!(_4zlE3&1EY*E?rJ9N!DpbGcWOND2^P!I*o|H@FDE`r8 zY(VsoS7rMByE|X;FDkR#1LQOnm~yr%_E5u{=k);ZUZOw3)J4!Q{;A=9HnBtchDAf8 zFjMZ&kcIIFlFX7)O*(Od0Yim}c$bA*Ps8>_QZAj@3DeJdTIETDyl5N7Nu}a4O*i*G zJ+V7S+M)b&QRrQD1vb(N$KS{oAj=4(;6h1jHaRyR?9Y;BF`obm=(iK7MSNW zL!3b=%%IoGo5$%%YyC$} z-KC}2Ami1g<`@&r!A?_6HLhYUt#6wPB}(O~Tm^tO{EnKL>>=o0+v7J;8rOv)xU%Fi zpul-%UACGy{e^zNAw$*_ex9f^kWLt4f$_^mHFCxk7V`4)s_I8gP)Rg1s>3O^Fjz&t zbVnR^wKqa$78DvZh6?yfgkpA-Q5>N}BU@SHwGMK&2xLVpP-mf+D-=eZ>h@ERLso$$ z3C6J^e*PmFF=#Zf>wq4?b?F``#wSm=j~Yj5pIOUpm1epGOD9+E)8Sc=7Faame73gS z<;u0ibS|VE0~57$__~_c0(va2Kh3v;Szf`p7$x!J9;kHdCnB@>A^MX2x#Giesk!d|7*9{AY8PHEmLiZ9E$u- z&D$WH@}_PI(pyEY^XWMaUD88oQrF#fEmA1kO7-F(`|cE$q|3mRX2ut@T-8(!pUsj2A4cV3 zHWY%gk99M0y16;gQQaCZ_Ep};hd;tS@P}^d593%2*U#G6Lm6i}#Z45l`Pm|Sa)FJ) zQ)j4+tImAJQ)_D~pj|W(SQ5+fuC5^3jZ67s5U5O{=-UE$nM`Qaf(9M7{0|!2DsaR` z+*~8P`NZKknBE($LB?QIk!ac@S?JZ~e%#*J7&9-8=8&1~pBAYqO%kA5FU<;(3ihc& zKhCV;;vqxbsPZOcxBNc68_Urt9s(s0|ELBAGFQm^eK(@{7D+4kDD}$}Q*ZA;{n(BP zUr`Dy97!x)w=UXhh=;ntQ+YT3)JbP+z>Q zun_8v&ZMO#bhF9!(p@gb_r?Xoo25+SQS)Mb3$KT9B?q0x8meN{c0FCLZ3X~!^IENAvN(e&=zuB6I_k=OO)$MydBfHCt) z-x#gjNIuqg?rsHva~8KVon$&q+3Q4VwzsNfFBp6dYlG*zQ{drnZjIzm1cz5z z>E4nsryenAc0Ydaq|~_!V;p_X{-L{pI~>tOb|%I@i%)m8ZZX51BLrD2C+fuS;(DrZ zqIm9Z#>S&6mrdx#Y%cCvd93~D+~oG_JIC!fQsIgHyKgQtUDR*ES;^K3$$zQr-DWej zTU6ML=Ecu7e)~n8tepcZ6?(@JpOBqm`6CLjIcg8KpWQi(?-ks6dQITN2z;mzj_)tW zcJVLK=gHJ!QfdqYF*I{{Jf9+B9xhp23fZNDbU8zgkQ}a_wGVG%NG8VXw%drZ5742& zeYfs)LZwN{TwR{5HLWh5l4|zm$V;}VGMasCyiYf3)Ljl>i!iG}%%rA{v$P5Zwmt+^ z5Q+jk>%Zwne=I~}(webft&r|t*rD|N$?l9&ZXH)`q^)AFKG^0${+#8-pj^U%0Tua0 z(b>%nEpAw|)&M*ToBrP)(zt(l^A#f(lWiy+Q!n^8|=HPzNU<# zM-8U2nsHnoOq!f;a1eR?Q}}nq5TSuM+Kin0m;I3;u7Bg1*xS=2e$45BW-=; zbx~kwa|Sz>m1vXBXUF%%s`H%pnd^xDeD}75_;)lH)U*D-FwTv?K}Qc<-zr~sea_uD zlot)+42=kX<2VcP%=Sid#tHk-=GfYS+db?^wz~h7@O@~ry9h&u%w!N=Nx(nE#RowY3)abos>7Q%%dTm@6*RJ)vBvZCm z`i^L|;dU0C@3InW!F&1kZ>rUhe{P`d4n`zAyPr3?W3^0Fph%!hxxY+;mOV)oEf%+o@a}>ny~vITq<8|D$|yyqMCpULQA=-8NCo z%KW)o0kyO?>~oA7d`H9VK^vu!3Dyp3OJjdl4F;1)2%fs+G22z%Mm2uP60GOz;64eujuOa$uH)gbY&g ziAP{;_1}Dd6L{(EZzhywm7VG)HqgXA$mxmHSR=_o9u<}xo>!I^HReCa@e{b;c=poS zBsIm+=-1_u^7?l|s?o#;SLksZhhHXGd~@HvM*gE|n)3|Ct@ffSXYchOw4o=c6G6%x zgvfMy90o1HzX8L6K5$xIZAc)hu|A+G*&S_!Mp^;4YFNuSA&2F)wq zmg+!uLHV^PK!5@xx-dJsEn7dOmjg(r3IP-MXAD4s>I~^nry7|LjR(_#jkG^ zWeQp$YC=NIv@#3IP~}XTqs>x7NH3XT_~uM>Mk7!$E=BZVr8>m=R*17-^->B2Y;T`v z>-5*OOPm(M(!t`)?B2NaUz{l6gW9Q)xYBG_uE5KgtkxU}j+La)In4KF>KLQK#C4q_ z6OnAyKNA8`RED`~dT1(AhevWD=8XlqKXQ65bAUM%_Z%8!82<2ZVi(%q&_E0MHfE$x z{{@fn^Fqz%;C@I~7I7!Sf1#>1kb^&mC(V`$pjX~eYif}H9C>86wQZmVD3u)94mohaqbd``J&=CoArfIb|T{ z^pMOdb?K4|sSKz2`$*ezi=Japb8pk#h|9sBe~_5aw@JZR0#5$dOw8XnONUP7XW7m9 zF$FMm#8Io3Z8ZlHd^Q+GGZAjtHBIvzI3ka<4kuJVuJJZCP zm|y8aOLo6v7>ZQ=`$k({P%GeAEpo)h;yGKm>1*o9Ct&}baA@ML&m{c)kBBr6HHbY z=$cvvGpivJyM^6Si?W?&t9!FjH@f|WVYqtTv1+^heD2$qyz#+$>&{-Yjm|bQbU2nY zx+$-=0do#JHtj_wM7~MNv`XW%&bAW^3v$yz*iQfD1~cUxX{^5iFvL3ihx7$%RXm?3 zuOs&wo12Y5ksDn;G@`%UKwNj71>xX?3Ibz8I?fOr^~bE6MoGr#&bE7(`fvWL#A^`= zwajpToQJtyc4*zNLns|J5+YjcAmiSihF{JhSL;CZSC3_x&u1-;XWy^WW;1)mrknO~ z-!9yFqvQoc_MAXp7W*1{x`N&x<~_#}mFe7$$j^7^KX+w@+)~)C@(?{f625FrdWBQM zuQNgpo>F+Yp!XU+s&ZZ@RQTT%c<;Zu?dbR-oeLVH%^u5skp!g=KQ7;&?N2^qbw4`V zwu0c185`Yw=Z)$g{@Puwvnu_|et}o_b;5A1Ov7OGgZZ3o&lP1_SnGdsCwLWNb#9cf z+578V#iuiaFDlfeW~bkdCu7%?QfSX&^9icOXAk)eZ9q{o$iu8VtwrYwJ~k5#rY0-J z_np4`qG65c*d-T-sK9F3#M`p>mG|L@L~k=OfCYn1RdX}0MVr4WT#4pOf}G>OLA$-% zisXjYW$3Ju0uxF`{ujtM(1z|muFS>GJqSHpHzR>(woRLuY`!Q??^})yu-aSsjrXH@ z_ZWwJg@^m@3@i9tT;v-j!M|$jvsN@3w!9nxqNZF$j}n zTM|pdw2l;Tz2m@`A55ay_S5_55{e6eRa~OV`+y`{jmo5kR9kU_$nBo}y!Vl4xhhAX zkS68^GjE%%THj_g|8@B2%nvZrCNtG=2bA&g$>L#W|FPPzCmKCiK!Xx8!XABpgzUU` z4|CT0bspNkab+R!+K!>AQFC}UhLPdQb)ff1E#NGYdDe-?az^Dmzy7=X_4H(YKDGk# zrTs|O;mX;i@bVkewTao~hC*i~w?|DN0PoDsazA$NYVwhWgh+0L6)ww{5Sxu?hvC{? z!wcMOM{(J@2Idwd>DmyLl{wUFivLs{>o~!)^?t_PhDp1E%`{D4LnNACu;TK_w?m8* z?D2O)srTzy17)an36#)Ooi9J~>1|#sQeSCi6l^@=3f#6QXslUJPtS;C5SLiovhz zkk#S*8*8}76@de_?VS5B@sTbw?TezsQUZbh6_&8#>wznK+y!EI_mNaF+HP71Y`ecFVsr**6*tACB@Q&=bEncb8GYcK78Aq ztSFF%?-NAyXO5pX0zsTPyjXv(=31)vtWeyTp7Sdnk9!Cv0%hLPOnN#(N?zg}t2@$H zwURF*v;}%295mif;~dBPu@5#cu&Ol(c1x44nRE0cs~-_J+AZ;FgF4<$p?#al4fZ{9 z{$;4sZSSRI3eE2N^+oY2Qk)6;K4N&AWyKjTv$63!wD<&%_MHB-wEV(;OD1sjxY*#n zGEKn0S7JS)s%#v>qX{w`GS-kQxy&;h1Q{}>P9kC$U~G2WA*`+98LT+q9b0!U!N1+c zFZ&N8Y`*j9KfS6sl9^X>Dh?$cAK#|Qp*B2sEyOvGZ4C(DotLPo-9D-5Y>vA*ZEnc( zNb?$4hb=`rdCVTg2&E5qzggJ&vWy0DZv0W#*BvoppnrLJnzX-<1)GhS);KrF|E{|5 zm`c=uG3=0U*Y0r`TG4iU4(>GZ&b8@2jK-GbiYEDfLCmN77{T4z+n?i$U8A)Rmc?g3 z`@Y+geOkQTX!URglZ?qR^PuaapMq0IU7})7l+0JO@#7lxylFg(|JLo@Mg96TM!EGN zl=1SeUn$dmhy=%q<7bAeXPOgq6|zkN1e6o}TarW#*vJ6|g;==fYoF6lvk zQc>TI_Uf+F1TXJn{oB)IG;kVf5z1j zd=X#rQgydm|xGQ)N2OR=4khXvaB zb*d4}i4wN(Cx>AWsI-CoQ8v(c>KZ4q-h90pLy@!>E*tDKecuZ z5)&nqLg*VIgUnjpJNCAYdn9a;*revuPblSFdY;Q!eu*X3upa+0q7qfY<4J7t=+q!s zZZx8>eX_pIiI4-v$#zTdULs}+=5m&49@8rEO@ zGd;Nv9wK^qZ}L-&6wC4uzj{|t&Oo|G>rRvRl}}0iR-oI(ilo5Eq*+%QC!y_6pC`Y^ z4dtxTUFmGTrMfr6Lmn1IjRw6TzWy%;6cqv&)DwR?{;l&pc1Bfai1f`BQj^h%<}rm2 z({;Xjjf|y56%Z0YI-@2=TS=@>Pm2f_6tM9p`r1s|auq(r)IdOB5j7g(y>bvmm-UYb z=q~eJ3gtD?yxEQ~WW9LH!PxOUYMgl-pVMir4E&O-+c`&?E#%EWphQeFWB8D{E3rkFjEDu=vnpe<6Q@fN;%^sbR{ zqAB)X+gGnWwudw~xh3sjCTKW_E6FZ6<8DJl2+FpF0$Xn|SE)I;`K(A+d;!XKltUCP zK&oH@&yS%zdqtop_mew5b8$}RkO*Q#{Twy=V)_-z>S!2yx;rXeQ2xB1H=>9F%Rw4d_4GfjZE`6za90JoAj4m zGYjqum{3E~m9%18^AIL?s3sn;YJK_c7JW z3rD!Ah2@IJ<>X}DFw({A7lNJ9vjO%#L&%`)H=io@@(Te(cn={ML$}HRVYY7GC!6_z z<(Ny0K|2VnVEREl8rbov)Z)SRY63}Zc&y;6{##vv_wME>l&{>mb^jUQgG6s5cRu zlIyT^OpGU z2AuLGnl1?qaKVAnQwiX-7x5O216DXoKEleJwwE2Jc*0Gms)y)W*oE%slOH88ytB9a7#VKrEL zLFhS6<`>tBw;Kwz%-VNdYS~g#?Y4(b!nA<{By`eEwWcyK*(~1(9Uv&j5ka1IUZKvT z99qRUCv)E>3``;YWmcOB`QD1O+er26wMQv9oP^VOSYWj{Yb6;CX{2^+7%!&uwJsV1 zvaHF(kvAa<7PqS6Kxu3fIZ`^*d`aY=slEuM;q}9;27Z}J(kJEXJF#{1yTqSmdj6y| zeWG6!&W#+`Sj6oKeJHYMqgx+~l6B7#>#Tiw*I3t@mlmgA8}AOHXv~4ju^x1{uTdB) z>mL|swz)f77o|xegM~m8HB2vW6|l2VLJG_-v|Qz=s;c5j<~QIj#%<;!_IqK3BnmqB zqAH5oTWVG|xv%+pu5eJ<(4YL?9F|=;SX)-`UfKF4$Q0os@H>vEHFz>}b}Zuj8Q!fM zCST!Mx99nj-?+A-3rcpx{2it5%TkEabsjuhdM6%PY0D zK-RCcH!|sgq5r>K)ON>F z{c^RnsEi`J{WQznK^D3mI+X4~&56|ferMR(jkVB{COflcl>{Braq#`j_b$oX+=GyI z<5}GIVWZpR-VaIEjaR{TicYX^J2=ie=-kZPXgTcBkGLa>Uif^ss`O*YHRX3KRZRaW zpWGNb;`!csBGzz}a)05rNs?DC$SF5J^u%vJ!xy$&)BX!(^G2%svd?(!vLx!^p9K>2UhpVTSy-m{Jp>FzaPuu$)Ugx0 zE+6-r+0q$Um{PuVV>@qQG@hF{EUN7fWAa=u%O;d`uvc`@Td#scTJsKd`#c}Xn<>)h z2rk{~=q%FmNq67r@G%m^t+(`K-Mv1;&=22w#|pl2sa10QN}^RT+WU)DspEl8tCsmE zg0h=n5g{dA+Ki>~)TTdTS#=y%S=c|_1O0#wY-tEmq0x{B(v1Wqv7DZAtLWS>wuhm( z`TzC;Fut8=HoMR=ksL1d6$n1D!?8q_d_eHU{mlby# zrEsOi??`WDHyC1C*cePXa}Sgw1iy7cF*%A~CcDZy(YgMr?PM^_ulI6ZbJ-S`xgU8io>!`=A4{Y7mkRJ~QwI;&2czGjz&@yu(b9sEKEvx6{1l!h!MusnKuk8JW zK>u~m$@&zr*SXd?Im-t7(vnuK!k1Y?E$wx?_jtNJ?~Pwv z*0DJ%AMqz`5xjmTo?{JVc(NL2@i~H89!>@Cwhez)HvDm=v6jgTQ$8^E81t{B{t zYjpN72!Uf?tPg#*dne$0X-;Z2HbmN8V~go}d0Qa9y4Yuc&{^T(r=uK3Xj$(~@qJ^< z;Pnotl){O$ewKfGTT^41W)jX>B*!Lx;giLwdcE82VpHK)VftE0?ZrT4eKN+Ay;`4B ziA##cIkntX>G6+p&Hi-Vy3Uvjz!Pqz@Q(YfqP>`9$GUSOaF*(RgANA|ntu)sNVQhB zfil)y-=nP0Z>CrJ#1gFRiXah0@iio3yE;~-I`Ck@t+!UmHNR_b z^;JukAk<@F#hG!Qvw^+xXupQ9#EB{E+dmiQ{go?Vil}M3fdIcQv#sGuht>~=sazi3Vc!Z>Ez?}chsZ>q;XXrR z>c0TbdGPCAH4m?!*@;(;EBp6f0e^RwtzRS1P~}s9Ir@qg;vE{Mgl615;yUqzt;UQD zcsR;}rJ8pS&yp7tCswp=}(xk=E(tWWv3m@(>h4~38K#!qhau3~32zMer> zw>wc@a=qS_xCk+Twy~?vndqW|O_*Qj`zx=R`Ail6u@c$lQZaO!rVkj&xBe6wN%d1>!z871-EIxo=acO68% z?e;$9c7VY$c0@4imbBE0+tC=50oUB(YEaD}?>9otW^opa&y&A;uN{0;GlvY*v73#z zHMR}Bx5AwCRNNnMiX$xWG)zZg*$3a6raNa-L7qDHZ=cxMIhakPS;xo6+1S_sFd_uB zY`4@_)asBmE7VtAl5nvq)9C1}v8;iR5Z z504*cw%GDJ9ZXQ9$)d~W)9{zpX7(a1b^E|bQxgnRJM*hQ^qI$0m^nS+Hh?W%3?D4n zX_H0iT2r{(j?9cR8#~|?fQRn5Lc7vQ_|yc1&1~M&5BHYI>|pi~x9fE1w?%g9>#m`( zVw29dbn3094WK(fuZaZ_<)0W1Tk*^lK|hez>hKHg-Iil{xGnfItF*uW)!)pP`@86N z4zaEinUwR!a?YdjOU8^O>FY_>>R%tfHMrP-Ashog?1)0~I!e3n-KydV$@kR$dZQ8H zi8j4S+@Us$6*48)I=y_SHN3;6$UQ{U+G{WWSH)tYzrM{Xt_(QEqFMa*ke0pe%|>h- ziObNXm9dDj!z9d87MQQohMK96h<>-5c6%7sl2NaJq7?GrS#9L{jeK_v8=FsyD`<1U z%kk8muRV4yxv~u}n_Q!?#CW-3Y;(!QK=4K^^Qx0&Ec zXv7}X`#i^9Fo2M#(Ido`nkuo{bYjn{*^Zn!FEt=2_k*3**ajCWEpP^Q9QYH=h{jQRTp&( z4EnQ6)N}XnJi3r(!kY=XldLxXqcY5&B{r`OFK5-n*Q@-fZZzI@3gNq0LHNI&gjEK< zb=d~^-W2OQ95(jQD;*$rBI+A?#0s*~4S@TIzAI$JQ}%Xl zza4Ej%T{NDK)Ig_5kjMLuHteZaCI~RWsZnmhO>J`!3LRT?hqH|J}io8VzHJPr+xy@ z&O{faF-D?xs_iL4P=m7un~eami4uD9#-6O-Ax506F=BJxh0A$9y}UdEIk`F7d|Flc zcJw;v6{SYoNzxW$k``hmR^dgNT%CzYF?h&GtxHFH0#Ur!3NqL$Efv+jr&BFR0vcPy?1Y(|m6}o*(aP7brWeM^E|8p86jcQp_Jz$*sX=*-~4+Of1Op zw!Urm6fg#l0gR)Wr7asWq8N>h za(Ioi+gUg3!SWa6=XoGB0vc+Za$soMN9`gbD*ggG+^a z@SSmRQbUDVmKitUffgAfSjdfA={>|iYn4X$+jC*MIlZnaalOC| z3>o>h%f(WJ`%A8TW$8}$KU9kmL!(r z$k?myINP}#Ca!U@{vZ=<1gYaVLZ0b!x4h=Es9UMqfxYO${qLu!M$Z{>Q>+5OdMcB( zKWQ9a{CbDmbrA6jK<>M=!+x5Xv=SCTq1-@nu@nHqZjNT*0>LJ)FMN6y>OPu;Fd{t$ z&?GPBlogn*7U(t}hBzJnQkU4D)D73$uD5FqQ+&uqwSToY+IEob^{~h2H}diK!%h@j zpucX1>pTy~haN@h?7D8%isdqfPFpr77JJ@Y5|sdF1w7T^dgc?|hopbA1$=nGSWU+a zj_1k-nN=5EtO(LSWUu?PgYqFH?61NPB}Jn?Pl=+4Tgjn9J#@z%c>KHes9&aAZMLm+ z@%~R2hMR7iK0@xRoJA_kzoCVD$8eP`39>&ZIV`no`g%Fkh3POzGNcq#R76co$ooD7 zozL?Kd~n%U%bF(ZFk~l?Lzy!AYw}>^;JPVRE<7lHp*{cfpWYvlXhD|mQXkE9B=IUA zc0&6qrTYI|hQkRJlff}Fe^bIT%4GHbyAO##Vk!53tyqM~xn>V3O`WLJl}sx;KWIsq z^TC+mQuYD(MTP!rq&0_(I&j!cNZ8oablHYqUFF~|La7|=Cnpj6dt1Aknc+#GO(i)=t9{qG^D#zXa$B!2ptud6MqEk#8|CkY{_1!7iI ziy|@T6{tpIDp@K8HD+U}BvPv3c4B(-lT1W3>K2}xQ;dWmA^JhN|CcA}F zXv$!!@248&0EbCdW!MRpb0V)-DLpzmFWYB1FXnTQm?F_%G%-cOzq6mnSl*p1lNtkj z^@8i?(5&~0M5i0ZmC0vt$PEFL)6U$|4g@RCyOe(yp`Un5lCca#7N3tI64q~_u%2>U2d@>t|0F8`dY4yAbQwJJii8)PYI{Hk&UdW1vSf<6(r0zk_m6~d(J_~4Bt*os4 zko{PaRNpUCk1I7BQU(145I!^f_#OBOXhcRFjRygOVl`=;2y0b{5Y#$)OmmDg)pQ@L z)`(Dx|F1{ATvsp>Md5^S9mXsdu{oZWqrw!PxRl54UOX-K5COq~FV0&)fg^)FOMX<0 zoJ1msPKs(E*hCXM0Izd+I9t%qx6ULT@SZ)#!dZ*<_Vy_~S42@Pk!ZM&5{B>&_VLyF zBoxW@QG%Ty-SeH-b3Z|0)QctKxH=b*n!MnvGhpAMXZ7%3EJWI6Xh+c4`9>xkevDl= zN{z^yiXE<}Mo%|KnV!dGV`;3CfDK^~KA!n%l5k9`|0vBjSx{8;3E0xYAw|0f7lfkLQ7kFxy~2{2o}be`KU%Z zzZS|-`%RNK#bBA~L>rZc*WE4k<26EXu%*iX3(d@+Uz33;pumc4R;|}se|>?S(lSn`s0RI|Ga&i< zOAQbn#c93WMI(7|e>@{9f*lruB~2C}E+R_?Xb|Fhgfi#H?obSHA7K5$hZyMffBD2P zuvM7E!z5L?^TiB;?{-cZAdR-#yxeSqFHL>)hGhgrfVo>H68?3zo(?SA>x`SjW+fP4 zV6(f+Jt79!&&9PWcD|VM#0J@fRbUCczg%0dHX{K9y1d+CL@|sqku59|~eOBpblfxLTucfO<)mW_56t%Ll`WQt}o}c776;~o{rAiPi z3uK6OHu$T}4g@g%x1hyEHYSn*vM&*;1V18Md|BmyV^JnV$RbQ()HxOgk|APT87z@R zLzEj)Tm`KBJNZwh;0XRW+Zpqaci>ea@5B|F&Z^;B6^kRpWJXu`Ol6i;X#ze^8pB@) z3Ypg~=Vk-Qg&>(?n9?Yuea|7~f=8MWG~j>0uWI-s$imz~Wcc%4%-N$Dkx3b0!9?gu zsZxu7{gqo?UCm`71^c_y?KN8{^-BqaGJG6W8lFD`Uu9oEv{JAXhyIc&4Zq!?D4cey zRlsAfufc7pIAd@)Caalq3f^k7RLLw^!id%o`GD{)!4_BFf<<60mX>5H)oUMz@HXhs z3@KRmH__Hqg1JrKav1y{h=u?i!{-(-`rcP#ds#@p`M6-0gdC*$ey~UZo}Dm)8Z~H% zmx{V8kyJHj+3w2-X$r;~AknvAYP^kx>U!`L@{VPQPH)p@dUW*E1cyKOJx3?h(gR8#BFb0e#R?aB3n0 zd1fkGRIRv{bodhlC6zPVk7@^lTPBxqJ}Qk;vo{%?;U3S8#;d=Q}5M z`&TL;WrJa5O&FO1y1w1q+?au=BuSH04g@<{uDu~;kbeqBtc^UWb(TD3=C?#L*-&gl zmS~DE;#E^P{8dT`+01h|{1L4;@1=tvREkqEDNTV31yYx(eiB;x2&uowfw`^m@iwbK zc5Ikly!Ip){{8UDhtyCcOFUH!A5J?>$`d_bRH3CtVY0ArhFmirw_9!dQEkL2AKNxD zcUOp#KY~kvi`IQToM@Tp8)t25@X6s!+85Yw6ba^4mwYJylU65;D)oURF@hslrBcBP z1oF)3<_b$>IMa``d7ANjkh+GI3v3Dm!&Id-Ier#XPVd7}GQyEaBm=HGone(=V8kwt?P9m6w%9qgaIEr~M)x!HPaL>$B=6%Z|qx zlT1UWiztGj*MsMCI-3x^-gmC$zZrWt4M+0T)cGCQR1VWbxcc4T4Ws4_w`|vE7ECNg z8ymeiwSEYSb5(H4pQm+C@1RYaaAQx&wO+ibZJ8B#&6V19B=E8JUlue-b0Icn){d$Wj0jf2L46Tvv+0 zwhR{oRI<#lV3wf-ZK!V7n3;!QO<`RHPa+Wqr>L$jDJlvHpi)IuRWZrQ*y-u%|G8rz zMdlv%4qymol6GjyE^-+3?Pu!IZ}%h#9yo&gJZMnOi{;^%Hg8@XhP=@~d_pN`;) zG;hEPxW_2Fw!3YK;O}^gWNr!GOeb2}oheR3bkiV58FO zQw4J|P1~&IKNmDay~;2m-TESuZkaR|$zDiTft$VLiE(=Isdkb)8Z-Dml$w4d1> z89mIKlj=-uTWqb%_E~)=uZx5eTX@5QY5AU+i+MzmDTF!I;4gZ#ZvMnjtY5}p0JBZE zIo`WRicyWa1NM zj=N>3&GHSwK)sR?mLe~mKe@O^)rZ?Pi8^totE&44BZEwh8T_Mq#T1ufZ|9^z?CJOn z-0#``Vx9)iEG+eLCy8Q4!V`OzcmjWtlt9#nk^f$W{}5O{(N6IygTE~h+kHtoaUUW2 z#ExehF!PGNLl8JPNAGrn^aEq4((0EWw`VUo@D4F^^^E6q`)GF z)+{a4;S(l3{tgz4-!(-616atxbgFPAD+xn29MS}RBa_dv%5~Oj;ate-)fK`HDi*H* zhmudK(um+FMMaxOPH)Xr#Lrn%01-aEcM@5QIBYUb$g zu*{B;2**}PAZ>zJfhU}a9(#dhXD@mnjnpYO<-_ufw`BWHEu}!qPBTdVQi<@ucX5gq zeV>cgq*lXQTC;_<>yMP1Xgbc2!74A9q-s_}mUEil;6uE46h!dT@r!;_+Eu)ybkAb$1E2 zNvY!WDJ0ugAL$<~h85=&G9Sbk z|E1S9;Z;@6LBHU&erm=1w#d*pB7xr-JMgv{RiKc(Gzqdw zW^IR?;P%5Y$CeL!%r{u(^po9W2JouorV{)~6j*OUfx>5XS!nk3T+C&mNtdz~lHFos z2@3iMJmv(KTjye3M-O7bsfU0*b@&fF0u#xM535h=TMrbGIQnsFf~~=K$o-QvxzywU zVyaG|?PqY`Tv!N;vPd}F)GC!Km!4rE!J0XWt+Mh00Ok@a2DLYyj_y21_NqTfV?b#E zpaCjIPNUi&4lAeik~9q#ZLxVF@9FhZsezh_d#uBXSE8b$zo3*=?>?TYo+L=`=3Uf1% zTr(RGH&}CLa8z#xJhSWSS|k&CvBjcY+`ABd;9BX-)hO?adrv+nWFExdjFK*mNQTIH z4WH@s*ixGC-zIiZ-0Dh9IENW{Ganl=J`%Bc`~Wq}IUYinrf+{>yjYUONd~AI5=O|t z7zG{3{k+cL-s(LGL5oC#nI2*GPt#`e96TgLD=wba=*IzgwvK#%w1)>lQG&eA{5T0) z8savo#TLMeTYubISd8~|_9wE1+xP4${oVoqTv5ygxiQI;snGz@_yGl15Idg^e|D&u zU4C7K!_FtYt)Ya~M~hWg7l2nO2A0ApYB15u8tpr- z%H0T!Dxi2kBtWd1y%a*P=lZq;z0FgMus=S;gqT=gYm*`N^*fLgmaf^i`;zC$Ba&wR ztU14a6~htvj1gvo10B1YtFmM?50q7=AC;f8lt`9ybw#c?ZG~~fw5cdp=$spY)KJnu z@OL@drpbr0R2&+q)TFian)D6?IA#LZDo6mH`UY}dD}_#)KZ z5HeNfM*=c9)sKrfpJkI2hohpDtM2=*IN&|?c^)DX8deQjmv}N2+!jnDqk7gfL@=Nb z;=&|B?uEh?Oj;;HP0+4;zVAa|{P!=H(PHv&dTosScuu}@jO+LB`)_WS3MXQ?AFKs z1xP`~N+6>N#$i0+J!=ipwrvY3E~c>Uel)dSH3jfwAc^=WDo3(;TxgU_E1N-a$gYy3WUv{af9FK9I z$PCww7=d!tnEwOUm6*$Dik33UL_ZOgRPse+b+|49mFfo)%}gR&`shvM4-$Bk=V@;M zAlsVafd9tCR5eLh>B^Q%5_SJUd+|(J_!fx2*@nU z^=kTVNhlx`=fn1aH9##0mgV<5my`b|=KP^wRylHqKY7WA(DS%_WzzRGfIhw_fe)$l zM@Yvjf56M*^=%WOVrr^0CuD`CDruKgT=2z z|4D&oa92Z-;^v_HA50|1{zN|C2}&6E_#YI#RH+BpXeaU#MQCxA|2u`4W-No2E@=Gv zGx_7x17O1RohET+=6{YT=KSvL@<8fR{~4n+63zg?2VtrYWd6rEp+++E^>pbsrf>I> zJqGJTr{CoNBWa8m8eowQ08<3RhUW`rkArq^y*b(L)&G0EAzk;p=s*xZLe^}`t9ACtJB`E<#HP3gdlExbK%Wz4D08X zpMB)=#(8s=NuIYHiEW+Y(``O8B{*ZF3}9yK=I8Be*6^0qiOXjGmYe$jaZ*6C+O7Un zID*^iZi)%Y{VAGlclE-4e*MfZk%Nh$``(a!ND+^#?i{loJ(It@CfPG*b~n;Qipw$u zfd26H?pr1AP_DQ;AgI)4rr@%wV*Q$bWq}|_V4i-s6>@n`|9g@DzzM_SN!wVv0N~h> z^R@B==kpq~uY%x4KtpTmwccX)%CUv1#p#|X3Pl2CP|hw+b=5HJ(dZJFbOytyvfsef z)m6FjXLH8N?%mPNIUtqTZk8eDPe?|Dw{p+^C z$3wVd=Fc>3lMT?ZzUkwbXt}n2>8}rY{OvVA?0}7U;468Ou`g&cHj*6Xp;dW~u<rmlGpDRqEsZZ16W z&b`|7WT9{0XLdH#oWf>3RarVH*IH5#o&5UN5P*TB(3ciHW&FG?e*70ZZwo4r zXH{|kqb{B&$+8X(ySI`o3&O_=LjLd-?jb=pTc947QjCDoJhF?kK(Bgd*-HD3*{%?8 zMJzNfff3N9D9<~DqI6dI@kRB6!R!t&cbAjf^N#`Lv`d%FB$O!NboRQ_jP5&7 z1j~7=TOKkgj=Fw|K)T)Z^Z<^Yf7x53q@bp=Rq2NJ2sa1 zxc%}I!4X&zE7@4@%%dxljc%|&13kMf&0Pt`P37oL5D5>h1kU{4oV%FD{@l!#)X3H& zA;fbXJ5{wZn3=K{#-e`Fe=*rX%$p@wxqt_p1r6kC-+GE>m{d@d}5dcmFr=J zhO4YIi|jPE3(OsqBF>vrc8uyA?JSa)rt-+50NyI(z8gq1lgWIwrDkt3hh)JU|JM0F z4ukMC*XO68b|5V1zcgS| z=MH+jG_03#lDFr;k-#;W!sgsf9=QZD`?EkVI1qC=l}6L6?0;zZVbdWnMo#oY)oV1G z*&*RRK1nUmP=sc5aza;>^=(%0&UEggv1G|<<_@9c#42CO3^Hq~DQ1IW0*n~Esi z;=$Fa$$t@_ZTEQ{YnHO$#TR`Xx9@G>O-#d=$ch4^sg@QW6un-!q%FP<%KYiZ+rJdc ze*u%~tq#=IjL^?hz3A*ZM~CXrL_-pQpjWlVgvMm&>U0Sm868yLu{5x6V`D!kO0p?< zm9{Z-#h|Z=Bg_rPV+`j%(GintUTWmg8GUtTo*+MfF4Q`x(L2k-_YAKYYRXJmQrew) zCw=A8?}vxDoY4hl5dN)gHwuHnkb2gid7Z_l9_o#MVN*yNv51zb%Ls(6hu^dhXnA2S zpj%IP7d1-pQQmtpkxqPQg{Z{xQ$QJ4aPM~5H22=Y5BroAfpr5+R(I=?-cbWPSeP{9 z28u4yPQGW&)lzwsq98^-fvZ`5uou7*82PeK(W%zBLrI16f{Mkkd9A1@Hs zOdMJJ>QTTjiPJQqLL7QZJ+5{6w^a)ER!Q^42a(fUPMd0iv8&raVSTN_x%BzDxE$LH zADW?$$v8$nQ>^==90QbDQ5iz2VD9eIhaum;;LN+=EIM-iE)B5E<~nqn`c?`;ToS3u R2%4<~I~+p5*9FJs{RNgh$rAto diff --git a/applications/plugins/SofaSimpleGUI/doc/index.html b/applications/plugins/SofaSimpleGUI/doc/index.html deleted file mode 100644 index f612f48076b..00000000000 --- a/applications/plugins/SofaSimpleGUI/doc/index.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - SimpleGUI - - - - - - - - -

SimpleGUI

- - - - - - - - - - - -
SimpleGUI helps inserting a Sofa simulation in graphics applications, such as this simple Glut program.
-
representative image of the plugin
- -
- - - -
- -

Introduction

-This is a simpler alternative to the standard Sofa GUI. See the code documentation (*) for more detail.
-
-

Compilation

-One subproject uses qtquick. On Ubuntu 14.04, it requires package qtdeclarative5-dev. - - -

Examples

- - -
    - -
  • glutOnePick: a glut application with a Sofa simulation. The user can interact by clicking and dragging particles. -
  • -
  • qtSofa: a qt application with a Sofa simulation. The user can interact by shift-clicking and dragging particles. -
  • -
- - - -

Intellectual -property and rights

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Authors
-
Francois Faure
Contact
-
Francois.Faure@inria.fr
-
License
-
This plugin is distributed under -the same license as the core of SOFA. -
Patents
-

-
APP registration
-

-
Sponsors
-
-
-
- -
- -
- -

HowTo

- -

Code documentation

- -can be generated using doxygen. In Unix -systems, simply type doxygen -Doxyfile in the doc directory.
- -
- -

LaTeX formulas

- -can be directly copy-pasted from .tex to this html document thanks to the mathjax config and -script included in the header. Equation numbering and cross-referencing works, as well a newcommand.
- -
- -
- -
- -
- - diff --git a/applications/plugins/SofaSimpleGUI/examples/liver.scn b/applications/plugins/SofaSimpleGUI/examples/liver.scn deleted file mode 100644 index 2ea0cb8954c..00000000000 --- a/applications/plugins/SofaSimpleGUI/examples/liver.scn +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/applications/plugins/SofaSimpleGUI/examples/oneTet.scn b/applications/plugins/SofaSimpleGUI/examples/oneTet.scn deleted file mode 100644 index d888792de76..00000000000 --- a/applications/plugins/SofaSimpleGUI/examples/oneTet.scn +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/applications/plugins/image/image_test/DataImage_test.cpp b/applications/plugins/image/image_test/DataImage_test.cpp index 76ef76c395a..ce749b58a7d 100644 --- a/applications/plugins/image/image_test/DataImage_test.cpp +++ b/applications/plugins/image/image_test/DataImage_test.cpp @@ -45,7 +45,7 @@ struct DataImageLink_test : public sofa::testing::BaseTest core::objectmodel::Data< defaulttype::Image > data2; /// Create a link between the two images - void SetUp() + void doSetUp() { } diff --git a/applications/plugins/image/image_test/ImageEngine_test.cpp b/applications/plugins/image/image_test/ImageEngine_test.cpp index 7890e89d929..dcae5fee3d9 100644 --- a/applications/plugins/image/image_test/ImageEngine_test.cpp +++ b/applications/plugins/image/image_test/ImageEngine_test.cpp @@ -51,7 +51,7 @@ struct ImageEngine_test : public sofa::testing::BaseTest simulation::Node::SPtr root; // Unload scene - void TearDown() + void doTearDown() { if (root!=NULL) sofa::simulation::node::unload(root); diff --git a/applications/projects/SceneChecking/tests/SceneChecker_test.cpp b/applications/projects/SceneChecking/tests/SceneChecker_test.cpp index 9de8d0bbcf4..1324a6773c1 100644 --- a/applications/projects/SceneChecking/tests/SceneChecker_test.cpp +++ b/applications/projects/SceneChecking/tests/SceneChecker_test.cpp @@ -76,13 +76,13 @@ int ComponentDeprecatedClassId = sofa::core::RegisterObject("") //////////////////////////////////////////////////////////////////////////////////////////////////// struct SceneChecker_test : public BaseSimulationTest { - void SetUp() override + void doSetUp() override { } void checkRequiredPlugin(bool missing) { - sofa::simpleapi::importPlugin("Sofa.Component.ODESolver.Forward"); + sofa::simpleapi::importPlugin(Sofa.Component.ODESolver.Forward); const std::string missStr = missing ? "" : " \n"; std::stringstream scene; @@ -173,11 +173,12 @@ struct SceneChecker_test : public BaseSimulationTest EXPECT_MSG_NOEMIT(Warning); const std::string lvl = (shouldWarn)?"17.06":"17.12"; - + + sofa::simpleapi::importPlugin("Sofa.Component.SceneUtility"); + std::stringstream scene; scene << " \n" << " \n" - << " \n" << " \n" << " \n" << " \n"; diff --git a/applications/projects/SofaPhysicsAPI/src/SofaPhysicsAPI/SofaPhysicsSimulation.cpp b/applications/projects/SofaPhysicsAPI/src/SofaPhysicsAPI/SofaPhysicsSimulation.cpp index f0e53e0ac62..56e4c217bec 100644 --- a/applications/projects/SofaPhysicsAPI/src/SofaPhysicsAPI/SofaPhysicsSimulation.cpp +++ b/applications/projects/SofaPhysicsAPI/src/SofaPhysicsAPI/SofaPhysicsSimulation.cpp @@ -1123,13 +1123,12 @@ void SofaPhysicsSimulation::calcProjection() xFactor *= 0.01; yFactor *= 0.01; - //std::cout << xNear << " " << yNear << std::endl; - - double zForeground = -vparams->zNear() - offset; - double zBackground = -vparams->zFar() + offset; - if (currentCamera->getCameraType() == sofa::core::visual::VisualParams::PERSPECTIVE_TYPE) - gluPerspective(currentCamera->getFieldOfView(), (double) width / (double) height, vparams->zNear(), vparams->zFar()); + { + gluPerspective(currentCamera->getFieldOfView(), + (double) width / (double) height, + vparams->zNear(),vparams->zFar()); + } else { double ratio = vparams->zFar() / (vparams->zNear() * 20); @@ -1138,8 +1137,8 @@ void SofaPhysicsSimulation::calcProjection() { ratio = -300 * (tcenter.norm2()) / tcenter[2]; } - glOrtho((-xNear * xFactor) * ratio, (xNear * xFactor) * ratio, (-yNear - * yFactor) * ratio, (yNear * yFactor) * ratio, + glOrtho((-xNear * xFactor) * ratio, (xNear * xFactor) * ratio, + (-yNear * yFactor) * ratio, (yNear * yFactor) * ratio, vparams->zNear(), vparams->zFar()); } diff --git a/applications/projects/runSofa/runSofa_test/runSofa_test.cpp b/applications/projects/runSofa/runSofa_test/runSofa_test.cpp index 70fb826b39e..7d0607e198e 100644 --- a/applications/projects/runSofa/runSofa_test/runSofa_test.cpp +++ b/applications/projects/runSofa/runSofa_test/runSofa_test.cpp @@ -44,7 +44,7 @@ class runSofa_test : public sofa::testing::BaseTest } - void SetUp() override + void doSetUp() override { const std::string& pluginDir = PluginRepository.getFirstPath(); @@ -58,7 +58,7 @@ class runSofa_test : public sofa::testing::BaseTest testPluginList << m_testPluginName << std::endl; testPluginList.close(); } - void TearDown() override + void doTearDown() override { } diff --git a/examples/Component/Constraint/Projective/LinearVelocityProjectiveConstraint.scn b/examples/Component/Constraint/Projective/LinearVelocityProjectiveConstraint.scn new file mode 100644 index 00000000000..9f1617fb152 --- /dev/null +++ b/examples/Component/Constraint/Projective/LinearVelocityProjectiveConstraint.scn @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/Component/ODESolver/Forward/EulerSymplecticSolver.scn b/examples/Component/ODESolver/Forward/EulerSymplecticSolver.scn index a82b531ff07..47e9608e636 100644 --- a/examples/Component/ODESolver/Forward/EulerSymplecticSolver.scn +++ b/examples/Component/ODESolver/Forward/EulerSymplecticSolver.scn @@ -21,7 +21,7 @@ trivially, it requires a linear solver, here SparseLDLSolver. - + diff --git a/examples/Component/ODESolver/Forward/EulerSymplecticSolver_diagonal.scn b/examples/Component/ODESolver/Forward/EulerSymplecticSolver_diagonal.scn index f8a7a002d4a..73bbc5ebfc3 100644 --- a/examples/Component/ODESolver/Forward/EulerSymplecticSolver_diagonal.scn +++ b/examples/Component/ODESolver/Forward/EulerSymplecticSolver_diagonal.scn @@ -22,7 +22,7 @@ trivially, it does not require a linear solver. - + diff --git a/examples/Component/Visual/CylinderVisualModel.scn b/examples/Component/Visual/CylinderVisualModel.scn new file mode 100644 index 00000000000..65191fc0e44 --- /dev/null +++ b/examples/Component/Visual/CylinderVisualModel.scn @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/examples/Component/Visual/OglCylinderModel.scn b/examples/Component/Visual/OglCylinderModel.scn deleted file mode 100644 index 0db4bc72a6c..00000000000 --- a/examples/Component/Visual/OglCylinderModel.scn +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/examples/Demos/SofaWasher.scn b/examples/Demos/SofaWasher.scn new file mode 100644 index 00000000000..bddd71116e9 --- /dev/null +++ b/examples/Demos/SofaWasher.scn @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/Demos/fallingBeamAugmentedLagrangianCollision.scn b/examples/Demos/fallingBeamAugmentedLagrangianCollision.scn new file mode 100644 index 00000000000..18f52f4a548 --- /dev/null +++ b/examples/Demos/fallingBeamAugmentedLagrangianCollision.scn @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Container,TriangleSetTopologyModifier] --> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/RegressionStateScenes.regression-tests b/examples/RegressionStateScenes.regression-tests index 9c28cd6161b..2f0c0ef182e 100644 --- a/examples/RegressionStateScenes.regression-tests +++ b/examples/RegressionStateScenes.regression-tests @@ -31,6 +31,7 @@ Component/Constraint/Lagrangian/BilateralLagrangianConstraint_UGS.scn 100 1e-4 0 Component/Constraint/Lagrangian/FrictionContact_LCP_with_friction.scn 500 1e-4 0 1 Component/Constraint/Lagrangian/FrictionContact_LCP_without_friction.scn 500 1e-4 0 1 Component/Constraint/Projective/FixedProjectiveConstraint.scn 100 1e-4 0 1 +Component/Constraint/Projective/LinearVelocityProjectiveConstraint.scn 100 1e-4 0 1 Component/LinearSolver/Direct/FEMBAR_EigenSimplicialLDLT.scn 100 1e-8 0 1 Component/LinearSolver/Direct/FEMBAR_EigenSimplicialLLT.scn 100 1e-8 0 1 Component/LinearSolver/Direct/FEMBAR_EigenSparseLU.scn 100 1e-8 0 1 diff --git a/share/mesh/SOFA_collision_center.obj b/share/mesh/SOFA_collision_center.obj new file mode 100644 index 00000000000..c071bf0c129 --- /dev/null +++ b/share/mesh/SOFA_collision_center.obj @@ -0,0 +1,331 @@ +v -192.234 60.457 0.000 +v -189.317 52.829 0.000 +v -183.414 47.615 0.000 +v -173.613 45.920 0.000 +v -165.855 48.929 0.000 +v -160.167 56.092 0.000 +v -159.376 66.516 0.000 +v -156.116 74.076 0.000 +v -152.857 81.636 0.000 +v -145.511 90.817 0.000 +v -134.622 100.230 0.000 +v -125.799 97.927 0.000 +v -115.953 97.236 0.000 +v -106.068 96.982 0.000 +v -100.334 87.901 0.000 +v -96.236 80.052 0.000 +v -91.153 68.625 0.000 +v -87.038 57.346 0.000 +v -83.743 44.803 0.000 +v -87.666 37.097 0.000 +v -89.744 26.562 0.000 +v -86.884 14.815 0.000 +v -79.864 6.052 0.000 +v -66.864 0.540 0.000 +v -59.681 0.157 0.000 +v -48.396 4.304 0.000 +v -40.186 12.733 0.000 +v -38.370 20.114 0.000 +v -36.553 27.495 0.000 +v -40.379 38.100 0.000 +v -43.974 45.348 0.000 +v -49.977 50.135 0.000 +v -57.590 52.968 0.000 +v -66.192 54.088 0.000 +v -71.055 60.605 0.000 +v -75.918 67.122 0.000 +v -82.815 79.950 0.000 +v -86.197 87.816 0.000 +v -89.579 95.682 0.000 +v -92.541 106.558 0.000 +v -86.900 113.639 0.000 +v -83.049 121.064 0.000 +v -78.827 131.435 0.000 +v -70.977 133.787 0.000 +v -63.127 136.138 0.000 +v -52.440 137.705 0.000 +v -38.773 137.039 0.000 +v -28.245 128.966 0.000 +v -20.523 127.103 0.000 +v -12.125 128.879 0.000 +v -5.314 133.780 0.000 +v -0.968 141.173 0.000 +v -0.366 149.833 0.000 +v -5.899 161.931 0.000 +v -13.518 167.123 0.000 +v -20.675 168.349 0.000 +v -27.648 167.107 0.000 +v -36.038 160.817 0.000 +v -43.298 150.255 0.000 +v -50.895 148.359 0.000 +v -58.491 146.464 0.000 +v -70.331 144.893 0.000 +v -81.939 146.078 0.000 +v -87.792 156.517 0.000 +v -93.706 163.818 0.000 +v -92.080 171.240 0.000 +v -90.454 178.663 0.000 +v -85.634 190.998 0.000 +v -81.758 197.794 0.000 +v -77.881 204.591 0.000 +v -72.676 211.814 0.000 +v -73.665 219.375 0.000 +v -81.676 224.300 0.000 +v -90.935 219.789 0.000 +v -92.652 209.204 0.000 +v -94.458 196.914 0.000 +v -97.278 185.909 0.000 +v -100.159 178.624 0.000 +v -103.041 171.340 0.000 +v -112.111 171.350 0.000 +v -123.510 171.135 0.000 +v -128.272 160.279 0.000 +v -133.109 152.563 0.000 +v -138.716 147.545 0.000 +v -145.255 144.460 0.000 +v -153.680 142.985 0.000 +v -155.439 133.793 0.000 +v -154.376 125.587 0.000 +v -150.570 116.142 0.000 +v -145.562 108.566 0.000 +v -150.057 100.036 0.000 +v -156.761 92.282 0.000 +v -163.721 85.325 0.000 +v -172.760 79.516 0.000 +v -183.268 77.238 0.000 +v -188.655 72.565 0.000 +v -192.138 63.034 0.000 +v -90.795 120.277 0.000 +v -130.272 145.871 0.000 +v -120.301 105.784 0.000 +v -62.800 46.549 0.000 +v -63.135 5.437 0.000 +v -96.507 155.697 0.000 +v -13.675 157.951 0.000 +v -185.764 65.444 0.000 +v -141.503 116.374 0.000 +v -80.470 30.205 0.000 +v -45.671 17.996 0.000 +v -23.522 135.760 0.000 +v -47.179 37.207 0.000 +v -148.552 130.362 0.000 +v -167.233 61.709 0.000 +v -33.229 150.407 0.000 +v -9.474 141.199 0.000 +v -107.547 163.366 0.000 +v -124.912 151.937 0.000 +v -122.780 144.132 0.000 +v -127.723 138.297 0.000 +v -120.290 136.758 0.000 +v -125.332 130.728 0.000 +v -117.518 129.306 0.000 +v -112.406 135.570 0.000 +v -117.124 149.722 0.000 +v -109.427 127.981 0.000 +v -104.036 134.449 0.000 +v -122.815 123.018 0.000 +v -133.461 132.959 0.000 +v -177.256 53.433 0.000 +v -107.224 141.761 0.000 +v -98.587 141.232 0.000 +v -75.922 15.439 0.000 +v -70.669 48.053 0.000 +v -67.603 39.843 0.000 +v -119.648 157.364 0.000 +v -96.300 132.718 0.000 +v -80.476 215.243 0.000 +v -176.303 70.947 0.000 +v -59.590 38.697 0.000 +v -64.262 31.912 0.000 +v -56.123 30.793 0.000 +v -60.818 24.042 0.000 +v -21.816 161.521 0.000 +v -20.204 152.975 0.000 +v -139.601 139.090 0.000 +v -186.968 59.497 0.000 +v -43.956 30.900 0.000 +v -110.569 154.657 0.000 +v -71.732 24.802 0.000 +v -66.562 16.822 0.000 +v -57.474 16.376 0.000 +v -52.401 22.470 0.000 +v -166.964 70.386 0.000 +v -179.232 61.803 0.000 +v -88.694 129.669 0.000 +v -136.215 108.170 0.000 +v -133.205 116.870 0.000 +v -137.458 124.346 0.000 +v -75.926 41.599 0.000 +v -69.054 9.458 0.000 +v -12.567 149.561 0.000 +v -19.315 143.842 0.000 +v -114.797 121.441 0.000 +v -106.597 120.038 0.000 +v -112.461 113.194 0.000 +v -103.795 112.578 0.000 +v -78.551 52.368 0.000 +v -101.658 126.642 0.000 +v -97.365 97.626 0.000 +v -110.077 105.141 0.000 +v -120.631 114.536 0.000 +v -127.595 111.085 0.000 +v -84.929 138.868 0.000 +v -73.533 34.167 0.000 +v -91.945 146.612 0.000 +v -102.784 149.063 0.000 +v -147.215 137.146 0.000 +v -86.808 202.831 0.000 +v -98.580 119.870 0.000 +v -141.115 131.911 0.000 +v -55.575 44.877 0.000 +v -145.596 124.120 0.000 +v -115.244 142.559 0.000 +v -84.787 72.337 0.000 +v -77.401 139.012 0.000 +v -163.303 77.412 0.000 +v -129.740 124.259 0.000 +v -15.414 136.172 0.000 +v -29.817 142.309 0.000 +v -100.362 163.051 0.000 +v -44.688 143.607 0.000 +v -115.100 164.442 0.000 +v -56.927 8.503 0.000 +v -50.711 12.663 0.000 +v -44.251 24.437 0.000 +v -142.393 101.564 0.000 +v -7.768 153.257 0.000 +v -78.377 59.970 0.000 +v -93.256 89.441 0.000 +v -81.804 22.091 0.000 +v -182.803 70.875 0.000 +v -27.532 155.822 0.000 +v -173.475 59.055 0.000 +v -95.749 112.999 0.000 +v -89.074 79.703 0.000 +v -97.094 168.914 0.000 +v -121.633 163.305 0.000 +v -169.600 54.190 0.000 +v -30.089 136.018 0.000 +v -103.554 157.167 0.000 +v -100.933 105.314 0.000 +v -92.355 190.512 0.000 +v -172.687 65.092 0.000 +v -62.630 11.319 0.000 +v -110.589 147.553 0.000 +v -6.335 147.008 0.000 +v -26.019 149.071 0.000 +v -94.895 126.094 0.000 +v -50.100 42.830 0.000 +v -85.750 210.332 0.000 +v -92.091 137.820 0.000 +v -183.237 55.035 0.000 +v -133.955 140.752 0.000 +v -49.618 30.398 0.000 +v -95.295 175.834 0.000 +v -37.961 144.723 0.000 +v -88.202 195.810 0.000 +v -72.555 54.413 0.000 +v -126.797 117.954 0.000 +v -28.258 161.317 0.000 +v -83.454 65.080 0.000 +v -80.537 37.306 0.000 +v -53.249 37.215 0.000 +v -128.948 104.318 0.000 +l 9 10 +l 10 11 +l 11 12 +l 12 13 +l 13 14 +l 14 15 +l 15 16 +l 16 17 +l 17 18 +l 18 19 +l 19 20 +l 20 21 +l 21 22 +l 22 23 +l 23 24 +l 24 25 +l 25 26 +l 26 27 +l 27 28 +l 28 29 +l 29 30 +l 30 31 +l 31 32 +l 32 33 +l 33 34 +l 34 35 +l 35 36 +l 36 37 +l 37 38 +l 38 39 +l 39 40 +l 40 41 +l 41 42 +l 42 43 +l 43 44 +l 44 45 +l 45 46 +l 46 47 +l 47 48 +l 48 49 +l 49 50 +l 50 51 +l 51 52 +l 52 53 +l 53 54 +l 54 55 +l 55 56 +l 56 57 +l 57 58 +l 58 59 +l 59 60 +l 60 61 +l 61 62 +l 62 63 +l 63 64 +l 64 65 +l 65 66 +l 66 67 +l 67 68 +l 68 69 +l 69 70 +l 70 71 +l 71 72 +l 72 73 +l 73 74 +l 74 75 +l 75 76 +l 76 77 +l 77 78 +l 78 79 +l 79 80 +l 80 81 +l 81 82 +l 82 83 +l 83 84 +l 84 85 +l 85 86 +l 86 87 +l 87 88 +l 88 89 +l 89 90 +l 90 91 +l 91 92 +l 92 93 +l 93 94 +l 94 95 +l 95 96 +l 96 97 +l 97 1 +l 1 2 +l 2 3 +l 3 4 +l 4 5 +l 5 6 +l 6 7 +l 7 8 +l 8 9 +l 9 10 diff --git a/share/mesh/SOFA_collision_no_face.obj b/share/mesh/SOFA_collision_no_face.obj new file mode 100644 index 00000000000..e57e58f326e --- /dev/null +++ b/share/mesh/SOFA_collision_no_face.obj @@ -0,0 +1,663 @@ +# Created by meshio v5.3.5, 2024-09-25T18:14:02.430293 +v -192.2342 60.457245 10.0 +v -189.31730740740738 52.82884722222222 10.0 +v -183.41376592592582 47.61546277777778 10.0 +v -173.6132583333333 45.920255000000004 10.0 +v -165.85462666666666 48.92924000000001 10.0 +v -160.16704666666664 56.09198166666665 10.0 +v -159.37593763888887 66.51596805555556 10.0 +v -156.11633567129627 74.07602837962963 10.0 +v -152.8567337037037 81.63608870370372 10.0 +v -145.51108629629633 90.81706796296298 10.0 +v -134.6217261111111 100.22958703703705 10.0 +v -125.79946277777776 97.92726842592593 10.0 +v -115.953295 97.23594333333337 10.0 +v -106.06834694444444 96.98207342592596 10.0 +v -100.3339277777778 87.90088314814818 10.0 +v -96.23609499999999 80.05152500000003 10.0 +v -91.15257314814814 68.62492833333336 10.0 +v -87.03835351851848 57.34572500000003 10.0 +v -83.74313000000001 44.80251500000002 10.0 +v -87.66622499999998 37.096515000000025 10.0 +v -89.74371333333333 26.562383333333358 10.0 +v -86.88399333333336 14.815341600000025 10.0 +v -79.86389111111112 6.052006637592616 10.0 +v -66.86430944444444 0.540367772870393 10.0 +v -59.681045 0.15701463000002247 10.0 +v -48.39609007407407 4.303864712592599 10.0 +v -40.186471592592554 12.732514897407409 10.0 +v -38.36987618518516 20.11385351351852 10.0 +v -36.55328077777778 27.49519212962963 10.0 +v -40.37934666666666 38.099591249999996 10.0 +v -43.973831777777775 45.34838324074073 10.0 +v -49.97722092592592 50.13503537037036 10.0 +v -57.59017840740741 52.96834796296295 10.0 +v -66.19233837962963 54.088347361111104 10.0 +v -71.05505891203704 60.605059884259255 10.0 +v -75.91777944444445 67.1217724074074 10.0 +v -82.81507722222221 79.95018425925926 10.0 +v -86.19711277777778 87.81599125 10.0 +v -89.57914833333334 95.68179824074073 10.0 +v -92.54104875 106.55805377314815 10.0 +v -86.89993870370371 113.6386588888889 10.0 +v -83.04949462962965 121.06399111111115 10.0 +v -78.82741104166666 131.43537312499998 10.0 +v -70.97719724305556 133.7867217476852 10.0 +v -63.12698344444444 136.13807037037037 10.0 +v -52.43966322222221 137.70537962962962 10.0 +v -38.77308843518518 137.0387159259259 10.0 +v -28.24538698148148 128.96565074074073 10.0 +v -20.5235 127.10275999999999 10.0 +v -12.125082784074074 128.8794311111111 10.0 +v -5.313775472592594 133.78004888888893 10.0 +v -0.9682875699999975 141.17252 10.0 +v -0.3660809085479142 149.83270736111112 10.0 +v -5.899070161666663 161.93091666666663 10.0 +v -13.517511999999996 167.12332999999995 10.0 +v -20.675108999999992 168.34940888888886 10.0 +v -27.64777533333333 167.10740777777775 10.0 +v -36.03802499999999 160.8171541666666 10.0 +v -43.298451629629625 150.25509138888884 10.0 +v -50.89456226851851 148.35949513888883 10.0 +v -58.4906729074074 146.46389888888882 10.0 +v -70.33091166666667 144.89254499999998 10.0 +v -81.93915148148147 146.0783130555555 10.0 +v -87.7921037037037 156.5167438888888 10.0 +v -93.70557393518519 163.81800837962953 10.0 +v -92.07963502314814 171.2402660416666 10.0 +v -90.4536961111111 178.66252370370367 10.0 +v -85.63357388888889 190.99786962962963 10.0 +v -81.75751805555555 197.79434719907402 10.0 +v -77.88146222222221 204.59082476851844 10.0 +v -72.67621055555556 211.81439907407403 10.0 +v -73.66474944444445 219.37477092592593 10.0 +v -81.6759438888889 224.2998306481481 10.0 +v -90.9351136111111 219.78926435185178 10.0 +v -92.65223499999999 209.20385499999992 10.0 +v -94.4578737037037 196.914474074074 10.0 +v -97.2777946296296 185.9085259259259 10.0 +v -100.1594729398148 178.62421442129624 10.0 +v -103.04115125 171.3399029166666 10.0 +v -112.11144648148147 171.35005407407402 10.0 +v -123.51036842592592 171.13475379629622 10.0 +v -128.27178666666663 160.27901666666656 10.0 +v -133.10878 152.5625499999999 10.0 +v -138.7159614814815 147.54539999999992 10.0 +v -145.25479851851856 144.45964333333328 10.0 +v -153.68033000000003 142.9850049999999 10.0 +v -155.4393640740741 133.79316740740734 10.0 +v -154.37636592592597 125.58727259259257 10.0 +v -150.5701890740741 116.14194944444435 10.0 +v -145.56223212962965 108.56584944444434 10.0 +v -150.0574383333333 100.03593583333323 10.0 +v -156.7614892592593 92.2815485185184 10.0 +v -163.72093740740743 85.32462814814801 10.0 +v -172.7604129166667 79.51592083333321 10.0 +v -183.26769 77.23760666666655 10.0 +v -188.65461888888893 72.56539074074061 10.0 +v -192.1384777777778 63.03370259259246 10.0 +v -90.79469223931024 120.2765345697156 10.0 +v -130.27206178203218 145.8707036079303 10.0 +v -120.3005012223003 105.783518677909 10.0 +v -62.79996643270988 46.54901183909538 10.0 +v -63.13452677356536 5.437126051548473 10.0 +v -96.50657002421443 155.69681879997668 10.0 +v -13.674701802772079 157.95127051897657 10.0 +v -185.7644801212342 65.44386782625185 10.0 +v -141.50342607075757 116.37374434367861 10.0 +v -80.4699907926312 30.205388253184243 10.0 +v -45.67060064437615 17.996401976675905 10.0 +v -23.521931285775775 135.75980957560998 10.0 +v -47.17948981920532 37.20687091978861 10.0 +v -148.5521073725251 130.36183817460127 10.0 +v -167.23284357891862 61.70889978311311 10.0 +v -33.2292240615551 150.40729488607099 10.0 +v -9.474409401453354 141.19920964051374 10.0 +v -107.54701855215194 163.3662169261165 10.0 +v -124.91199637725182 151.9369300685621 10.0 +v -122.78034056892332 144.1321534749725 10.0 +v -127.72296417457406 138.2969416718167 10.0 +v -120.28968738633553 136.75832228825092 10.0 +v -125.33180300765987 130.72837635807107 10.0 +v -117.51777454488052 129.30632680970731 10.0 +v -112.40616428744056 135.5700944536723 10.0 +v -117.12440687367832 149.72215371523376 10.0 +v -109.42670339762846 127.98068658856891 10.0 +v -104.03640048232853 134.44857377633608 10.0 +v -122.81523559906748 123.01827677799912 10.0 +v -133.46063411910313 132.95893672936003 10.0 +v -177.25566492113205 53.4328323624113 10.0 +v -107.22358255156996 141.76124776350443 10.0 +v -98.58714198065006 141.23188017805398 10.0 +v -75.92246618500151 15.438510193798813 10.0 +v -70.66940315406168 48.05318695890437 10.0 +v -67.60265428612371 39.843463356753325 10.0 +v -119.64816976632478 157.36389944240634 10.0 +v -96.30049213195124 132.71820653113966 10.0 +v -80.47583145551187 215.242994152514 10.0 +v -176.30287519797622 70.94732087614447 10.0 +v -59.589602523612896 38.69714312606434 10.0 +v -64.26165108917482 31.912413856518423 10.0 +v -56.1228785275038 30.79318385967851 10.0 +v -60.817899793284056 24.0422240894983 10.0 +v -21.81614250571405 161.52104661054761 10.0 +v -20.20361652546872 152.97476595251652 10.0 +v -139.6012067195076 139.08978868869883 10.0 +v -186.96764720778108 59.49704198867249 10.0 +v -43.95649136671274 30.90012061856282 10.0 +v -110.56873433140078 154.65727911147232 10.0 +v -71.73195670069174 24.80246156696747 10.0 +v -66.56191299351336 16.822146889176754 10.0 +v -57.47399949333125 16.375773056706407 10.0 +v -52.40112634816329 22.469668797807255 10.0 +v -166.96426211048424 70.385973194771 10.0 +v -179.23192725936863 61.80318698035899 10.0 +v -88.69422404576852 129.6694305325907 10.0 +v -136.21485140975886 108.17019137977269 10.0 +v -133.2054296001303 116.87019483999154 10.0 +v -137.45796418074139 124.34647456323945 10.0 +v -75.92586906245883 41.59926399575145 10.0 +v -69.05399628925638 9.458216470913737 10.0 +v -12.566572203762508 149.56075146378697 10.0 +v -19.31546983634809 143.84219703854268 10.0 +v -114.7968604000771 121.44090235560448 10.0 +v -106.59683511965208 120.03837444788589 10.0 +v -112.46058398821174 113.19383432910763 10.0 +v -103.79512254140776 112.5775905962738 10.0 +v -78.55117919390311 52.36757171218854 10.0 +v -101.65789746937159 126.64235334361702 10.0 +v -97.36520334842065 97.62616152063724 10.0 +v -110.07664451058537 105.14110934238123 10.0 +v -120.63070665700958 114.53618048163405 10.0 +v -127.59545086979477 111.08457023353913 10.0 +v -84.92890185938371 138.86761580983347 10.0 +v -73.5334343737174 34.166696207816926 10.0 +v -91.94460973105883 146.61200255335748 10.0 +v -102.7837008134617 149.0632233620782 10.0 +v -147.21501196993654 137.14609675533566 10.0 +v -86.80773501061078 202.83109437700378 10.0 +v -98.58018726698994 119.87032050328325 10.0 +v -141.11543834219395 131.9107245740923 10.0 +v -55.57453807726806 44.87722893206972 10.0 +v -145.59591516103634 124.12033394877476 10.0 +v -115.24428130213164 142.5589140592931 10.0 +v -84.78659718782622 72.3373679748638 10.0 +v -77.40071465845081 139.0121137476148 10.0 +v -163.30283152017378 77.41244750040703 10.0 +v -129.7399151522091 124.25909662143171 10.0 +v -15.414403146806585 136.17184595580434 10.0 +v -29.816751282996158 142.30887133715973 10.0 +v -100.36243383841085 163.05064047579359 10.0 +v -44.68796992696312 143.60667606514036 10.0 +v -115.10036498536482 164.44151577735752 10.0 +v -56.9270288371536 8.503313084216492 10.0 +v -50.71124127425364 12.662660906820408 10.0 +v -44.25081263248774 24.437135524813453 10.0 +v -142.3934668560258 101.56372633151004 10.0 +v -7.768196597964453 153.25674051409266 10.0 +v -78.37668440984068 59.97022527437368 10.0 +v -93.25601766220184 89.44088171196435 10.0 +v -81.80397686948136 22.09083461396302 10.0 +v -182.8028881521716 70.87542394540759 10.0 +v -27.53181776661814 155.82180672084945 10.0 +v -173.47475178294061 59.055267843154056 10.0 +v -95.74883447809327 112.99914233717453 10.0 +v -89.07391216636267 79.70347975490343 10.0 +v -97.09353709184268 168.91385892921875 10.0 +v -121.63267246107056 163.30479642068167 10.0 +v -169.59969865827628 54.18974610922418 10.0 +v -30.089289496359648 136.01826189485905 10.0 +v -103.55369151192792 157.16683573508746 10.0 +v -100.93253342882522 105.31402183259011 10.0 +v -92.3553207784182 190.51153119469672 10.0 +v -172.68685153415072 65.09196268593557 10.0 +v -62.630292877363985 11.319315110512372 10.0 +v -110.58894117444848 147.55256360231635 10.0 +v -6.334557913073101 147.0080565599221 10.0 +v -26.01937589459724 149.07098718702784 10.0 +v -94.89477521804297 126.09444472552833 10.0 +v -50.09998557118215 42.830181832596594 10.0 +v -85.75047545989118 210.33160652997756 10.0 +v -92.09107394976247 137.81982712099506 10.0 +v -183.237262544323 55.03547426628854 10.0 +v -133.95456565533968 140.75235413956113 10.0 +v -49.617607658301104 30.398395070110706 10.0 +v -95.29549562271511 175.8339607785908 10.0 +v -37.96109706726583 144.72332992063713 10.0 +v -88.20240428743541 195.8098632948956 10.0 +v -72.5550344666457 54.413171209256355 10.0 +v -126.79734757564225 117.95366379091912 10.0 +v -28.258440151416373 161.3168538189603 10.0 +v -83.4543975417556 65.08000379799563 10.0 +v -80.53651683589368 37.30639298460086 10.0 +v -53.24901614176597 37.21465969289774 10.0 +v -128.9482251766824 104.31788098259726 10.0 +v -192.2342 60.457245 -10.0 +v -189.31730740740738 52.82884722222222 -10.0 +v -183.41376592592582 47.61546277777778 -10.0 +v -173.6132583333333 45.920255000000004 -10.0 +v -165.85462666666666 48.92924000000001 -10.0 +v -160.16704666666664 56.09198166666665 -10.0 +v -159.37593763888887 66.51596805555556 -10.0 +v -156.11633567129627 74.07602837962963 -10.0 +v -152.8567337037037 81.63608870370372 -10.0 +v -145.51108629629633 90.81706796296298 -10.0 +v -134.6217261111111 100.22958703703705 -10.0 +v -125.79946277777776 97.92726842592593 -10.0 +v -115.953295 97.23594333333337 -10.0 +v -106.06834694444444 96.98207342592596 -10.0 +v -100.3339277777778 87.90088314814818 -10.0 +v -96.23609499999999 80.05152500000003 -10.0 +v -91.15257314814814 68.62492833333336 -10.0 +v -87.03835351851848 57.34572500000003 -10.0 +v -83.74313000000001 44.80251500000002 -10.0 +v -87.66622499999998 37.096515000000025 -10.0 +v -89.74371333333333 26.562383333333358 -10.0 +v -86.88399333333336 14.815341600000025 -10.0 +v -79.86389111111112 6.052006637592616 -10.0 +v -66.86430944444444 0.540367772870393 -10.0 +v -59.681045 0.15701463000002247 -10.0 +v -48.39609007407407 4.303864712592599 -10.0 +v -40.186471592592554 12.732514897407409 -10.0 +v -38.36987618518516 20.11385351351852 -10.0 +v -36.55328077777778 27.49519212962963 -10.0 +v -40.37934666666666 38.099591249999996 -10.0 +v -43.973831777777775 45.34838324074073 -10.0 +v -49.97722092592592 50.13503537037036 -10.0 +v -57.59017840740741 52.96834796296295 -10.0 +v -66.19233837962963 54.088347361111104 -10.0 +v -71.05505891203704 60.605059884259255 -10.0 +v -75.91777944444445 67.1217724074074 -10.0 +v -82.81507722222221 79.95018425925926 -10.0 +v -86.19711277777778 87.81599125 -10.0 +v -89.57914833333334 95.68179824074073 -10.0 +v -92.54104875 106.55805377314815 -10.0 +v -86.89993870370371 113.6386588888889 -10.0 +v -83.04949462962965 121.06399111111115 -10.0 +v -78.82741104166666 131.43537312499998 -10.0 +v -70.97719724305556 133.7867217476852 -10.0 +v -63.12698344444444 136.13807037037037 -10.0 +v -52.43966322222221 137.70537962962962 -10.0 +v -38.77308843518518 137.0387159259259 -10.0 +v -28.24538698148148 128.96565074074073 -10.0 +v -20.5235 127.10275999999999 -10.0 +v -12.125082784074074 128.8794311111111 -10.0 +v -5.313775472592594 133.78004888888893 -10.0 +v -0.9682875699999975 141.17252 -10.0 +v -0.3660809085479142 149.83270736111112 -10.0 +v -5.899070161666663 161.93091666666663 -10.0 +v -13.517511999999996 167.12332999999995 -10.0 +v -20.675108999999992 168.34940888888886 -10.0 +v -27.64777533333333 167.10740777777775 -10.0 +v -36.03802499999999 160.8171541666666 -10.0 +v -43.298451629629625 150.25509138888884 -10.0 +v -50.89456226851851 148.35949513888883 -10.0 +v -58.4906729074074 146.46389888888882 -10.0 +v -70.33091166666667 144.89254499999998 -10.0 +v -81.93915148148147 146.0783130555555 -10.0 +v -87.7921037037037 156.5167438888888 -10.0 +v -93.70557393518519 163.81800837962953 -10.0 +v -92.07963502314814 171.2402660416666 -10.0 +v -90.4536961111111 178.66252370370367 -10.0 +v -85.63357388888889 190.99786962962963 -10.0 +v -81.75751805555555 197.79434719907402 -10.0 +v -77.88146222222221 204.59082476851844 -10.0 +v -72.67621055555556 211.81439907407403 -10.0 +v -73.66474944444445 219.37477092592593 -10.0 +v -81.6759438888889 224.2998306481481 -10.0 +v -90.9351136111111 219.78926435185178 -10.0 +v -92.65223499999999 209.20385499999992 -10.0 +v -94.4578737037037 196.914474074074 -10.0 +v -97.2777946296296 185.9085259259259 -10.0 +v -100.1594729398148 178.62421442129624 -10.0 +v -103.04115125 171.3399029166666 -10.0 +v -112.11144648148147 171.35005407407402 -10.0 +v -123.51036842592592 171.13475379629622 -10.0 +v -128.27178666666663 160.27901666666656 -10.0 +v -133.10878 152.5625499999999 -10.0 +v -138.7159614814815 147.54539999999992 -10.0 +v -145.25479851851856 144.45964333333328 -10.0 +v -153.68033000000003 142.9850049999999 -10.0 +v -155.4393640740741 133.79316740740734 -10.0 +v -154.37636592592597 125.58727259259257 -10.0 +v -150.5701890740741 116.14194944444435 -10.0 +v -145.56223212962965 108.56584944444434 -10.0 +v -150.0574383333333 100.03593583333323 -10.0 +v -156.7614892592593 92.2815485185184 -10.0 +v -163.72093740740743 85.32462814814801 -10.0 +v -172.7604129166667 79.51592083333321 -10.0 +v -183.26769 77.23760666666655 -10.0 +v -188.65461888888893 72.56539074074061 -10.0 +v -192.1384777777778 63.03370259259246 -10.0 +v -90.79469223931024 120.2765345697156 -10.0 +v -130.27206178203218 145.8707036079303 -10.0 +v -120.3005012223003 105.783518677909 -10.0 +v -62.79996643270988 46.54901183909538 -10.0 +v -63.13452677356536 5.437126051548473 -10.0 +v -96.50657002421443 155.69681879997668 -10.0 +v -13.674701802772079 157.95127051897657 -10.0 +v -185.7644801212342 65.44386782625185 -10.0 +v -141.50342607075757 116.37374434367861 -10.0 +v -80.4699907926312 30.205388253184243 -10.0 +v -45.67060064437615 17.996401976675905 -10.0 +v -23.521931285775775 135.75980957560998 -10.0 +v -47.17948981920532 37.20687091978861 -10.0 +v -148.5521073725251 130.36183817460127 -10.0 +v -167.23284357891862 61.70889978311311 -10.0 +v -33.2292240615551 150.40729488607099 -10.0 +v -9.474409401453354 141.19920964051374 -10.0 +v -107.54701855215194 163.3662169261165 -10.0 +v -124.91199637725182 151.9369300685621 -10.0 +v -122.78034056892332 144.1321534749725 -10.0 +v -127.72296417457406 138.2969416718167 -10.0 +v -120.28968738633553 136.75832228825092 -10.0 +v -125.33180300765987 130.72837635807107 -10.0 +v -117.51777454488052 129.30632680970731 -10.0 +v -112.40616428744056 135.5700944536723 -10.0 +v -117.12440687367832 149.72215371523376 -10.0 +v -109.42670339762846 127.98068658856891 -10.0 +v -104.03640048232853 134.44857377633608 -10.0 +v -122.81523559906748 123.01827677799912 -10.0 +v -133.46063411910313 132.95893672936003 -10.0 +v -177.25566492113205 53.4328323624113 -10.0 +v -107.22358255156996 141.76124776350443 -10.0 +v -98.58714198065006 141.23188017805398 -10.0 +v -75.92246618500151 15.438510193798813 -10.0 +v -70.66940315406168 48.05318695890437 -10.0 +v -67.60265428612371 39.843463356753325 -10.0 +v -119.64816976632478 157.36389944240634 -10.0 +v -96.30049213195124 132.71820653113966 -10.0 +v -80.47583145551187 215.242994152514 -10.0 +v -176.30287519797622 70.94732087614447 -10.0 +v -59.589602523612896 38.69714312606434 -10.0 +v -64.26165108917482 31.912413856518423 -10.0 +v -56.1228785275038 30.79318385967851 -10.0 +v -60.817899793284056 24.0422240894983 -10.0 +v -21.81614250571405 161.52104661054761 -10.0 +v -20.20361652546872 152.97476595251652 -10.0 +v -139.6012067195076 139.08978868869883 -10.0 +v -186.96764720778108 59.49704198867249 -10.0 +v -43.95649136671274 30.90012061856282 -10.0 +v -110.56873433140078 154.65727911147232 -10.0 +v -71.73195670069174 24.80246156696747 -10.0 +v -66.56191299351336 16.822146889176754 -10.0 +v -57.47399949333125 16.375773056706407 -10.0 +v -52.40112634816329 22.469668797807255 -10.0 +v -166.96426211048424 70.385973194771 -10.0 +v -179.23192725936863 61.80318698035899 -10.0 +v -88.69422404576852 129.6694305325907 -10.0 +v -136.21485140975886 108.17019137977269 -10.0 +v -133.2054296001303 116.87019483999154 -10.0 +v -137.45796418074139 124.34647456323945 -10.0 +v -75.92586906245883 41.59926399575145 -10.0 +v -69.05399628925638 9.458216470913737 -10.0 +v -12.566572203762508 149.56075146378697 -10.0 +v -19.31546983634809 143.84219703854268 -10.0 +v -114.7968604000771 121.44090235560448 -10.0 +v -106.59683511965208 120.03837444788589 -10.0 +v -112.46058398821174 113.19383432910763 -10.0 +v -103.79512254140776 112.5775905962738 -10.0 +v -78.55117919390311 52.36757171218854 -10.0 +v -101.65789746937159 126.64235334361702 -10.0 +v -97.36520334842065 97.62616152063724 -10.0 +v -110.07664451058537 105.14110934238123 -10.0 +v -120.63070665700958 114.53618048163405 -10.0 +v -127.59545086979477 111.08457023353913 -10.0 +v -84.92890185938371 138.86761580983347 -10.0 +v -73.5334343737174 34.166696207816926 -10.0 +v -91.94460973105883 146.61200255335748 -10.0 +v -102.7837008134617 149.0632233620782 -10.0 +v -147.21501196993654 137.14609675533566 -10.0 +v -86.80773501061078 202.83109437700378 -10.0 +v -98.58018726698994 119.87032050328325 -10.0 +v -141.11543834219395 131.9107245740923 -10.0 +v -55.57453807726806 44.87722893206972 -10.0 +v -145.59591516103634 124.12033394877476 -10.0 +v -115.24428130213164 142.5589140592931 -10.0 +v -84.78659718782622 72.3373679748638 -10.0 +v -77.40071465845081 139.0121137476148 -10.0 +v -163.30283152017378 77.41244750040703 -10.0 +v -129.7399151522091 124.25909662143171 -10.0 +v -15.414403146806585 136.17184595580434 -10.0 +v -29.816751282996158 142.30887133715973 -10.0 +v -100.36243383841085 163.05064047579359 -10.0 +v -44.68796992696312 143.60667606514036 -10.0 +v -115.10036498536482 164.44151577735752 -10.0 +v -56.9270288371536 8.503313084216492 -10.0 +v -50.71124127425364 12.662660906820408 -10.0 +v -44.25081263248774 24.437135524813453 -10.0 +v -142.3934668560258 101.56372633151004 -10.0 +v -7.768196597964453 153.25674051409266 -10.0 +v -78.37668440984068 59.97022527437368 -10.0 +v -93.25601766220184 89.44088171196435 -10.0 +v -81.80397686948136 22.09083461396302 -10.0 +v -182.8028881521716 70.87542394540759 -10.0 +v -27.53181776661814 155.82180672084945 -10.0 +v -173.47475178294061 59.055267843154056 -10.0 +v -95.74883447809327 112.99914233717453 -10.0 +v -89.07391216636267 79.70347975490343 -10.0 +v -97.09353709184268 168.91385892921875 -10.0 +v -121.63267246107056 163.30479642068167 -10.0 +v -169.59969865827628 54.18974610922418 -10.0 +v -30.089289496359648 136.01826189485905 -10.0 +v -103.55369151192792 157.16683573508746 -10.0 +v -100.93253342882522 105.31402183259011 -10.0 +v -92.3553207784182 190.51153119469672 -10.0 +v -172.68685153415072 65.09196268593557 -10.0 +v -62.630292877363985 11.319315110512372 -10.0 +v -110.58894117444848 147.55256360231635 -10.0 +v -6.334557913073101 147.0080565599221 -10.0 +v -26.01937589459724 149.07098718702784 -10.0 +v -94.89477521804297 126.09444472552833 -10.0 +v -50.09998557118215 42.830181832596594 -10.0 +v -85.75047545989118 210.33160652997756 -10.0 +v -92.09107394976247 137.81982712099506 -10.0 +v -183.237262544323 55.03547426628854 -10.0 +v -133.95456565533968 140.75235413956113 -10.0 +v -49.617607658301104 30.398395070110706 -10.0 +v -95.29549562271511 175.8339607785908 -10.0 +v -37.96109706726583 144.72332992063713 -10.0 +v -88.20240428743541 195.8098632948956 -10.0 +v -72.5550344666457 54.413171209256355 -10.0 +v -126.79734757564225 117.95366379091912 -10.0 +v -28.258440151416373 161.3168538189603 -10.0 +v -83.4543975417556 65.08000379799563 -10.0 +v -80.53651683589368 37.30639298460086 -10.0 +v -53.24901614176597 37.21465969289774 -10.0 +v -128.9482251766824 104.31788098259726 -10.0 +f 9 10 243 +f 243 242 9 +f 10 11 244 +f 244 243 10 +f 11 12 245 +f 245 244 11 +f 12 13 246 +f 246 245 12 +f 13 14 247 +f 247 246 13 +f 14 15 248 +f 248 247 14 +f 15 16 249 +f 249 248 15 +f 16 17 250 +f 250 249 16 +f 17 18 251 +f 251 250 17 +f 18 19 252 +f 252 251 18 +f 19 20 253 +f 253 252 19 +f 20 21 254 +f 254 253 20 +f 21 22 255 +f 255 254 21 +f 22 23 256 +f 256 255 22 +f 23 24 257 +f 257 256 23 +f 24 25 258 +f 258 257 24 +f 25 26 259 +f 259 258 25 +f 26 27 260 +f 260 259 26 +f 27 28 261 +f 261 260 27 +f 28 29 262 +f 262 261 28 +f 29 30 263 +f 263 262 29 +f 30 31 264 +f 264 263 30 +f 31 32 265 +f 265 264 31 +f 32 33 266 +f 266 265 32 +f 33 34 267 +f 267 266 33 +f 34 35 268 +f 268 267 34 +f 35 36 269 +f 269 268 35 +f 36 37 270 +f 270 269 36 +f 37 38 271 +f 271 270 37 +f 38 39 272 +f 272 271 38 +f 39 40 273 +f 273 272 39 +f 40 41 274 +f 274 273 40 +f 41 42 275 +f 275 274 41 +f 42 43 276 +f 276 275 42 +f 43 44 277 +f 277 276 43 +f 44 45 278 +f 278 277 44 +f 45 46 279 +f 279 278 45 +f 46 47 280 +f 280 279 46 +f 47 48 281 +f 281 280 47 +f 48 49 282 +f 282 281 48 +f 49 50 283 +f 283 282 49 +f 50 51 284 +f 284 283 50 +f 51 52 285 +f 285 284 51 +f 52 53 286 +f 286 285 52 +f 53 54 287 +f 287 286 53 +f 54 55 288 +f 288 287 54 +f 55 56 289 +f 289 288 55 +f 56 57 290 +f 290 289 56 +f 57 58 291 +f 291 290 57 +f 58 59 292 +f 292 291 58 +f 59 60 293 +f 293 292 59 +f 60 61 294 +f 294 293 60 +f 61 62 295 +f 295 294 61 +f 62 63 296 +f 296 295 62 +f 63 64 297 +f 297 296 63 +f 64 65 298 +f 298 297 64 +f 65 66 299 +f 299 298 65 +f 66 67 300 +f 300 299 66 +f 67 68 301 +f 301 300 67 +f 68 69 302 +f 302 301 68 +f 69 70 303 +f 303 302 69 +f 70 71 304 +f 304 303 70 +f 71 72 305 +f 305 304 71 +f 72 73 306 +f 306 305 72 +f 73 74 307 +f 307 306 73 +f 74 75 308 +f 308 307 74 +f 75 76 309 +f 309 308 75 +f 76 77 310 +f 310 309 76 +f 77 78 311 +f 311 310 77 +f 78 79 312 +f 312 311 78 +f 79 80 313 +f 313 312 79 +f 80 81 314 +f 314 313 80 +f 81 82 315 +f 315 314 81 +f 82 83 316 +f 316 315 82 +f 83 84 317 +f 317 316 83 +f 84 85 318 +f 318 317 84 +f 85 86 319 +f 319 318 85 +f 86 87 320 +f 320 319 86 +f 87 88 321 +f 321 320 87 +f 88 89 322 +f 322 321 88 +f 89 90 323 +f 323 322 89 +f 90 91 324 +f 324 323 90 +f 91 92 325 +f 325 324 91 +f 92 93 326 +f 326 325 92 +f 93 94 327 +f 327 326 93 +f 94 95 328 +f 328 327 94 +f 95 96 329 +f 329 328 95 +f 96 97 330 +f 330 329 96 +f 97 1 234 +f 234 330 97 +f 1 2 235 +f 235 234 1 +f 2 3 236 +f 236 235 2 +f 3 4 237 +f 237 236 3 +f 4 5 238 +f 238 237 4 +f 5 6 239 +f 239 238 5 +f 6 7 240 +f 240 239 6 +f 7 8 241 +f 241 240 7 +f 8 9 242 +f 242 241 8 +f 9 10 243 +f 243 242 9 diff --git a/share/mesh/SOFA_surface.obj b/share/mesh/SOFA_surface.obj new file mode 100644 index 00000000000..0bb37757fac --- /dev/null +++ b/share/mesh/SOFA_surface.obj @@ -0,0 +1,2409 @@ +# Created by meshio v5.3.5, 2024-09-24T17:57:39.586615 +v -192.2342 60.457245 10.0 +v -189.31730740740738 52.82884722222222 10.0 +v -183.41376592592582 47.61546277777778 10.0 +v -173.6132583333333 45.920255000000004 10.0 +v -165.85462666666666 48.92924000000001 10.0 +v -160.16704666666664 56.09198166666665 10.0 +v -158.8940022222222 63.55143388888888 10.0 +v -159.85787305555553 69.48050222222223 10.0 +v -156.35730337962963 75.55829546296297 10.0 +v -152.8567337037037 81.63608870370372 10.0 +v -145.51108629629633 90.81706796296298 10.0 +v -140.0664062037037 95.52332750000002 10.0 +v -134.6217261111111 100.22958703703705 10.0 +v -125.79946277777776 97.92726842592593 10.0 +v -115.953295 97.23594333333337 10.0 +v -106.06834694444444 96.98207342592596 10.0 +v -100.3339277777778 87.90088314814818 10.0 +v -96.23609499999999 80.05152500000003 10.0 +v -91.15257314814814 68.62492833333336 10.0 +v -87.03835351851848 57.34572500000003 10.0 +v -83.74313000000001 44.80251500000002 10.0 +v -87.66622499999998 37.096515000000025 10.0 +v -89.74371333333333 26.562383333333358 10.0 +v -86.88399333333336 14.815341600000025 10.0 +v -79.86389111111112 6.052006637592616 10.0 +v -70.11096555555555 1.0513059157407634 10.0 +v -61.64934916666667 0.09322213000002247 10.0 +v -55.02271962037037 2.1985434212963106 10.0 +v -48.39609007407407 4.303864712592599 10.0 +v -40.186471592592554 12.732514897407409 10.0 +v -38.24271392129628 19.346265782037037 10.0 +v -36.29895625 25.960016666666668 10.0 +v -37.29351061111111 33.92115018518518 10.0 +v -40.633671194444446 39.63476671296296 10.0 +v -43.973831777777775 45.34838324074073 10.0 +v -49.97722092592592 50.13503537037036 10.0 +v -57.59017840740741 52.96834796296295 10.0 +v -66.19233837962963 54.088347361111104 10.0 +v -71.86131314814816 60.90463675925926 10.0 +v -75.91777944444445 67.1217724074074 10.0 +v -79.36642833333333 73.53597833333333 10.0 +v -82.81507722222221 79.95018425925926 10.0 +v -86.19711277777778 87.81599125 10.0 +v -89.57914833333334 95.68179824074073 10.0 +v -92.66648541666666 105.96417962962963 10.0 +v -86.89993870370371 113.6386588888889 10.0 +v -83.04949462962965 121.06399111111115 10.0 +v -76.95362795138888 132.31780457175927 10.0 +v -70.04030569791666 134.22793747106482 10.0 +v -63.12698344444444 136.13807037037037 10.0 +v -52.43966322222221 137.70537962962962 10.0 +v -45.60637582870369 137.37204777777777 10.0 +v -38.77308843518518 137.0387159259259 10.0 +v -31.333042462962958 130.26321814814813 10.0 +v -22.84061575 127.38542166666666 10.0 +v -12.125082784074074 128.8794311111111 10.0 +v -5.313775472592594 133.78004888888893 10.0 +v -0.5900747368970809 142.69963833333333 10.0 +v -0.32077573758249756 151.01752499999998 10.0 +v -3.7391141985185157 159.69738037037033 10.0 +v -8.05902612481481 164.16445296296294 10.0 +v -13.517511999999996 167.12332999999995 10.0 +v -20.675108999999992 168.34940888888886 10.0 +v -27.64777533333333 167.10740777777775 10.0 +v -33.877182999999995 163.49677999999994 10.0 +v -38.19886699999999 158.13752833333325 10.0 +v -41.82407624999999 150.65757249999996 10.0 +v -48.64911351851851 148.5135555555555 10.0 +v -55.12316081481481 147.0686377777777 10.0 +v -64.58940907407407 145.502692037037 10.0 +v -73.34119018518518 144.6388659259259 10.0 +v -81.93915148148147 146.0783130555555 10.0 +v -87.7921037037037 156.5167438888888 10.0 +v -93.14944 162.89553333333328 10.0 +v -92.39023888888889 171.5462068518518 10.0 +v -90.4536961111111 178.66252370370367 10.0 +v -88.043635 184.83019666666667 10.0 +v -85.63357388888889 190.99786962962963 10.0 +v -82.41569722222222 197.0997860185185 10.0 +v -77.88146222222221 204.59082476851844 10.0 +v -72.67621055555556 211.81439907407403 10.0 +v -73.66474944444445 219.37477092592593 10.0 +v -78.65621666666667 223.9302066666666 10.0 +v -86.87440833333335 223.70262166666657 10.0 +v -92.81708166666664 216.84273999999994 10.0 +v -92.65223499999999 209.20385499999992 10.0 +v -94.4578737037037 196.914474074074 10.0 +v -97.2777946296296 185.9085259259259 10.0 +v -100.1594729398148 178.62421442129624 10.0 +v -103.04115125 171.3399029166666 10.0 +v -112.11144648148147 171.35005407407402 10.0 +v -123.51036842592592 171.13475379629622 10.0 +v -126.86862296296295 163.15518481481473 10.0 +v -131.39186518518517 154.98269925925916 10.0 +v -138.7159614814815 147.54539999999992 10.0 +v -145.25479851851856 144.45964333333328 10.0 +v -153.68033000000003 142.9850049999999 10.0 +v -155.4393640740741 133.79316740740734 10.0 +v -154.37636592592597 125.58727259259257 10.0 +v -150.5701890740741 116.14194944444435 10.0 +v -145.56223212962965 108.56584944444434 10.0 +v -150.0574383333333 100.03593583333323 10.0 +v -156.7614892592593 92.2815485185184 10.0 +v -163.72093740740743 85.32462814814801 10.0 +v -170.3772353240741 80.06991004629617 10.0 +v -180.58388435185188 78.10908324074062 10.0 +v -188.65461888888893 72.56539074074061 10.0 +v -192.1384777777778 63.03370259259246 10.0 +v -149.18391000001193 86.22657833331846 10.0 +v -103.20113736112101 92.44147828705273 10.0 +v -93.69433407408025 74.3382266666806 10.0 +v -89.09546333333697 62.98532666667673 10.0 +v -85.390741759263 51.074120000014304 10.0 +v -88.70496916666403 31.829449166680053 10.0 +v -88.31385333333677 20.68886246668074 10.0 +v -83.37394222224493 10.433674118824648 10.0 +v -74.9874283333426 3.5516562766714417 10.0 +v -44.29128083334392 8.51818980498911 10.0 +v -91.12281687499541 100.8229889351699 10.0 +v -80.00156129051929 126.6908978414167 10.0 +v -57.78332333334907 136.92172499999768 10.0 +v -17.482849267052096 128.13242638888678 10.0 +v -84.86562759257572 151.29752847219208 10.0 +v -93.5550543518495 203.05916453705288 10.0 +v -95.86783416666265 191.4115000000156 10.0 +v -117.81090745368427 171.24240393518548 10.0 +v -135.05391333332506 151.26404962963795 10.0 +v -152.47327750000352 120.86461101852709 10.0 +v -153.40946379629256 96.15874217593016 10.0 +v -175.48055983795228 79.08949664352045 10.0 +v -190.39654833332625 67.79954666668604 10.0 +v -112.61363976482797 132.37651196857635 10.0 +v -62.794126187428034 26.925572070958196 10.0 +v -132.74869116817663 126.23527104176367 10.0 +v -20.66359310947816 149.39137347776946 10.0 +v -179.69156181921727 60.39157277237746 10.0 +v -107.48106372885374 114.24625118970177 10.0 +v -109.21810432265733 151.66018759499505 10.0 +v -94.86269038634182 135.45345358234098 10.0 +v -123.52016149379807 144.26158254426875 10.0 +v -71.88487417537208 16.65899176023219 10.0 +v -75.71009647407351 32.205572105651505 10.0 +v -124.10280001092862 113.31299015657467 10.0 +v -51.04832026637624 18.558700896176642 10.0 +v -143.2508098410173 127.32575796537697 10.0 +v -97.49071268910893 148.05335475646126 10.0 +v -54.05740310300297 34.69019513104045 10.0 +v -170.9019814538135 69.02904101182762 10.0 +v -65.2889915322752 39.712855367306084 10.0 +v -132.8459531417201 137.74870352128752 10.0 +v -96.66947260896579 120.54485361629601 10.0 +v -120.45179735294654 153.40995811694273 10.0 +v -15.871759930713631 137.78249437455995 10.0 +v -60.38894972246748 12.210702200485459 10.0 +v -102.85345496547308 106.31323695482779 10.0 +v -120.58551674578825 124.50579855243562 10.0 +v -114.7795800313773 161.68170680093095 10.0 +v -30.18574206346438 146.1793633707325 10.0 +v -104.91720124259349 140.65616972555046 10.0 +v -12.950704632958375 155.5691166242777 10.0 +v -79.47794031946907 22.719085188097328 10.0 +v -135.60752775043986 114.92276253513306 10.0 +v -23.513868317172488 157.71701534552506 10.0 +v -104.02504876597546 160.65854566510868 10.0 +v -46.51768506114806 28.629529067959663 10.0 +v -170.4382460616899 58.633248249806435 10.0 +v -124.45710068417264 133.21832106616432 10.0 +v -85.4002835769833 137.0409235615415 10.0 +v -180.72588141053458 69.49557023237567 10.0 +v -74.87800591642414 41.48219118175313 10.0 +v -10.87057202155038 146.23542013347412 10.0 +v -97.35613889490511 114.15554864202421 10.0 +v -98.57130960258112 99.09161278505954 10.0 +v -106.5666497668307 123.69623933588376 10.0 +v -185.7538129574276 61.56469022622263 10.0 +v -142.38570865820594 136.90413894358718 10.0 +v -89.0471335772174 127.95168164118039 10.0 +v -127.56819287210189 147.18832534292295 10.0 +v -68.84743632079375 8.84462574458947 10.0 +v -26.682333077462346 140.69907084238028 10.0 +v -82.13722757315318 214.30708683055687 10.0 +v -75.58281832608827 51.25183024046182 10.0 +v -114.06659932804132 144.29958734278853 10.0 +v -142.30733973898768 118.48202755775482 10.0 +v -89.74748016578735 144.1975480564824 10.0 +v -50.987539729146626 12.235796138012141 10.0 +v -71.4514914213818 24.518368776615684 10.0 +v -115.34408492336009 107.37910985789038 10.0 +v -54.753644159520675 27.540095866655633 10.0 +v -165.47020390849775 74.59206134275321 10.0 +v -102.15947228005643 131.02965339744247 10.0 +v -116.24991264786372 118.69194089054814 10.0 +v -29.206795819261156 153.91930957675152 10.0 +v -64.0372819804237 20.06164387409527 10.0 +v -57.51625586975341 44.49488688221496 10.0 +v -94.92011156920341 92.13678199092148 10.0 +v -81.71918535734214 28.229754562335884 10.0 +v -77.16555954984904 15.978187345693062 10.0 +v -20.664799558686134 133.26579715347685 10.0 +v -118.3086269359735 135.691414362191 10.0 +v -79.587763257123 36.68951183888918 10.0 +v -130.3633504040716 107.8263417305775 10.0 +v -126.87574606269612 120.64944880742733 10.0 +v -133.13756623719271 145.33352134996 10.0 +v -176.56832393098423 54.45182506046542 10.0 +v -66.54012127794655 31.883470628765625 10.0 +v -93.74433282394848 86.30702333472244 10.0 +v -81.89428372790314 62.31292181003704 10.0 +v -135.4794376958717 132.13668494573707 10.0 +v -109.2541471627385 103.47605785834577 10.0 +v -95.12742666015211 155.12818405338663 10.0 +v -85.83935550590081 205.0641914260199 10.0 +v -60.83960169234864 33.69183662870564 10.0 +v -165.22907388171194 65.5644412741443 10.0 +v -75.60703232475981 10.428456097924188 10.0 +v -98.91722462951948 140.8536487605854 10.0 +v -31.758330602827662 138.65591914712004 10.0 +v -176.5870327643798 72.91436322592749 10.0 +v -46.262217846952595 15.511816704556345 10.0 +v -86.93553417805927 74.20042873321275 10.0 +v -89.91788090996734 121.99111666059198 10.0 +v -102.51305084288111 154.4502879198301 10.0 +v -17.840968756026474 161.18931135269943 10.0 +v -138.58310036027464 122.68923657406965 10.0 +v -46.377351676871676 35.57531013637028 10.0 +v -68.8666768011649 46.663393842186345 10.0 +v -148.61184155737973 125.16542586230193 10.0 +v -148.05003260581543 132.19252685675707 10.0 +v -113.16158095979287 125.48394037087797 10.0 +v -138.27510069689401 141.52543913728053 10.0 +v -108.6998243895774 165.25540687556511 10.0 +v -50.728618685192785 41.71045417583674 10.0 +v -122.77090688990447 105.52114657783105 10.0 +v -57.24451439464515 22.516937108008147 10.0 +v -183.646957085236 55.649757206200555 10.0 +v -90.89825784110239 149.38593653933265 10.0 +v -38.23285761547356 144.2299086965887 10.0 +v -103.17670934898433 118.64055054368569 10.0 +v -78.60116614794693 139.61846861315385 10.0 +v -44.17088320560375 22.214632534220133 10.0 +v -185.224251261044 66.6119032219068 10.0 +v -89.93708101268132 80.44389654064581 10.0 +v -88.67945621608992 198.11492678415127 10.0 +v -114.67259568601912 155.63100399560747 10.0 +v -62.71039794180494 6.783561101371762 10.0 +v -128.1718242752539 141.24505127464408 10.0 +v -176.46387971984902 65.91361074063495 10.0 +v -9.295022756077598 140.28467594984272 10.0 +v -154.80576656378688 86.96004552720281 10.0 +v -151.56068129218465 91.17278572956354 10.0 +v -95.37364860863566 129.0445938596803 10.0 +v -79.87515919057925 55.386436107996126 10.0 +v -126.38126598161969 152.6040450303485 10.0 +v -130.25125394537474 132.23814600352435 10.0 +v -142.74283416397503 101.08935229015907 10.0 +v -137.88380127505246 107.10790202536317 10.0 +v -119.6710540772821 165.57142954285834 10.0 +v -97.6913703339818 103.93468193119973 10.0 +v -84.0603436942042 68.1302260473334 10.0 +v -118.99642103444621 147.1408627054416 10.0 +v -147.22465168096423 95.79953524865813 10.0 +v -15.377805279731225 132.73599141350533 10.0 +v -8.178490788127922 152.50345642799454 10.0 +v -66.13341888644547 14.17678182480144 10.0 +v -118.91793994505413 130.31282400540107 10.0 +v -126.00422388247239 127.31435667281222 10.0 +v -111.84350422253367 139.20774846846476 10.0 +v -102.73925499460077 111.87946956642377 10.0 +v -25.78504776466719 149.61370018636947 10.0 +v -49.00684341305548 142.62164852292943 10.0 +v -170.1920386370679 74.91233538657211 10.0 +v -83.22459718541577 18.907332042128427 10.0 +v -102.83231069486008 101.15047760601426 10.0 +v -83.77798471229748 131.13915527305468 10.0 +v -120.27513162406541 159.62573633168427 10.0 +v -103.56908226143673 146.92671864600814 10.0 +v -18.863991888843884 154.57611488571482 10.0 +v -132.80987861826344 120.35726111880774 10.0 +v -108.49287394020055 109.30385741640775 10.0 +v -84.81588491280799 24.51348984319275 10.0 +v -55.81355621549013 15.73767189688498 10.0 +v -26.7585691735779 135.1321523346713 10.0 +v -56.36710707452994 8.510197592189758 10.0 +v -28.482181152571982 160.72053429435744 10.0 +v -188.59886732229197 64.44122709096534 10.0 +v -35.14605780294754 151.94058641811327 10.0 +v -55.298618931071 141.31242602796476 10.0 +v -161.56189185740607 79.29332031483796 10.0 +v -148.96204677132283 138.0668963082169 10.0 +v -91.19931014912805 193.0082170034069 10.0 +v -114.87835533587725 166.9112959015805 10.0 +v -108.98470067308128 158.22285647533954 10.0 +v -84.02525788602065 33.091169269171324 10.0 +v -147.41225974396417 119.80135805038064 10.0 +v -16.621265073661583 143.94777552506966 10.0 +v -71.95835263535592 36.06334363664765 10.0 +v -67.96407680668207 140.17918659291422 10.0 +v -94.33266397453244 97.08812655783045 10.0 +v -99.39221131056253 165.59851466634262 10.0 +v -63.09088819804611 47.58556628315628 10.0 +v -101.6646503585405 125.57241167590148 10.0 +v -121.51116541707808 118.64640043974792 10.0 +v -89.88038281261694 139.28053138299745 10.0 +v -9.040773219884631 158.892712064265 10.0 +v -91.91003719590783 188.14076711231542 10.0 +v -74.14800920058578 21.23760440934918 10.0 +v -110.01475949884141 119.37457438091921 10.0 +v -106.446228584111 134.67923571423322 10.0 +v -108.84871602374449 146.12666165169193 10.0 +v -129.62284374164608 114.96946825201876 10.0 +v -93.38156823838149 111.80437333571398 10.0 +v -89.72368727901542 133.31838988346584 10.0 +v -43.996148393030694 145.3986806148298 10.0 +v -76.2811373801007 27.352713349381915 10.0 +v -97.78137880733482 109.0085816766365 10.0 +v -41.23557227625154 29.380921118044053 10.0 +v -114.59394361840621 150.17527311624409 10.0 +v -165.2795875994173 59.99195817074071 10.0 +v -78.1622595364689 46.12832000877525 10.0 +v -87.04434282596489 212.05165588195266 10.0 +v -171.08466996844345 63.69568543258864 10.0 +v -85.16665229882163 142.13291317199653 10.0 +v -157.85622484948323 82.06134319474958 10.0 +v -50.13766507824386 24.82782925274673 10.0 +v -14.691436252436716 150.37054284571667 10.0 +v -50.70595416894695 30.895639426479697 10.0 +v -123.43804911924559 149.10869755713824 10.0 +v -91.11017637606575 90.48539870409614 10.0 +v -93.85690228060476 182.0541723432715 10.0 +v -69.03251566312554 20.631270677946297 10.0 +v -145.2140546766078 115.00148940980999 10.0 +v -112.8482902689793 113.30373091174762 10.0 +v -168.65351487645964 54.00308469127986 10.0 +v -60.647595400739235 141.1871229676769 10.0 +v -123.48291525400015 138.69753943861318 10.0 +v -93.34268393946915 116.690120003289 10.0 +v -5.765276913217555 146.35002566264848 10.0 +v -99.22146010593194 94.3599450985287 10.0 +v -23.571259330208818 163.1727702469831 10.0 +v -185.32357043705238 70.07729284202841 10.0 +v -182.37499757054152 72.63234005636255 10.0 +v -174.9548547207055 60.28666718068122 10.0 +v -11.596689244637826 134.69252834758157 10.0 +v -57.98056153379969 38.67009437093907 10.0 +v -100.02861794443483 135.70412994233672 10.0 +v -189.3461090083697 61.3540636257212 10.0 +v -188.0250449680746 57.67340490878471 10.0 +v -107.26184612814806 128.95409911412204 10.0 +v -94.20973569807228 143.19423406745048 10.0 +v -130.7065607218849 150.2745281224257 10.0 +v -166.203594585317 70.2542126651304 10.0 +v -67.23760910282147 4.764658638841699 10.0 +v -45.59804557577396 40.565741975161146 10.0 +v -81.05958689501233 135.0208250793613 10.0 +v -151.24040377732902 128.84315250369076 10.0 +v -161.23523515938143 74.00653630768495 10.0 +v -118.36970471146549 141.54978914362792 10.0 +v -76.85238297985545 59.99831447206051 10.0 +v -84.96354615726295 125.69986238922839 10.0 +v -140.950893498254 131.89828077301965 10.0 +v -86.47913530998382 146.8463292825033 10.0 +v -79.65361018697368 32.164916791472955 10.0 +v -118.45837264148139 112.68596015219606 10.0 +v -78.92819673773052 218.6198585691766 10.0 +v -137.65592359013507 136.59052450646803 10.0 +v -86.07192219907705 28.65863232537254 10.0 +v -95.78500244067857 176.36351895660462 10.0 +v -128.05516512007566 136.55663883070335 10.0 +v -166.0473687501964 78.79842142161944 10.0 +v -181.57187743361453 64.7954694387035 10.0 +v -125.11185176776982 157.19827042727886 10.0 +v -81.99341035080363 14.336458622261908 10.0 +v -21.481932430910486 139.0677094448596 10.0 +v -98.66624937952757 160.06687670784856 10.0 +v -144.03307024832472 122.69276120197681 10.0 +v -95.11096110226923 100.89302327462225 10.0 +v -23.56998558660736 144.81649880786347 10.0 +v -23.606659379884576 153.04350269442605 10.0 +v -81.61761551160266 208.90917197923758 10.0 +v -71.45030333794237 29.408002676976903 10.0 +v -79.60076711175371 11.445756564459282 10.0 +v -52.02264592266354 7.073052969855479 10.0 +v -80.80747674200319 41.23981060588351 10.0 +v -32.98221695495612 157.64294772451106 10.0 +v -59.11305344463253 29.471876752306617 10.0 +v -141.00163728049768 112.5875080109367 10.0 +v -86.02947721911154 217.35567758002233 10.0 +v -25.399256736306747 131.5116473257407 10.0 +v -101.97891294178771 96.80511744051623 10.0 +v -60.25846782504612 17.012106254241132 10.0 +v -73.30072772916478 138.43053437553104 10.0 +v -12.281796946736858 161.387784600841 10.0 +v -42.36092783617979 140.96960487852178 10.0 +v -72.86989652928646 7.050578302506484 10.0 +v -138.35446803029726 127.97266195385718 10.0 +v -70.09265515964667 40.75441747867028 10.0 +v -128.38886154571622 102.87608594284286 10.0 +v -71.67914179853301 55.29061261460011 10.0 +v -42.21557164161129 17.451307479555226 10.0 +v -80.51360318574571 50.10824259419291 10.0 +v -71.59641361361157 12.208916381791504 10.0 +v -67.55097331137466 25.57138811755966 10.0 +v -192.2342 60.457245 -10.0 +v -189.31730740740738 52.82884722222222 -10.0 +v -183.41376592592582 47.61546277777778 -10.0 +v -173.6132583333333 45.920255000000004 -10.0 +v -165.85462666666666 48.92924000000001 -10.0 +v -160.16704666666664 56.09198166666665 -10.0 +v -158.8940022222222 63.55143388888888 -10.0 +v -159.85787305555553 69.48050222222223 -10.0 +v -156.35730337962963 75.55829546296297 -10.0 +v -152.8567337037037 81.63608870370372 -10.0 +v -145.51108629629633 90.81706796296298 -10.0 +v -140.0664062037037 95.52332750000002 -10.0 +v -134.6217261111111 100.22958703703705 -10.0 +v -125.79946277777776 97.92726842592593 -10.0 +v -115.953295 97.23594333333337 -10.0 +v -106.06834694444444 96.98207342592596 -10.0 +v -100.3339277777778 87.90088314814818 -10.0 +v -96.23609499999999 80.05152500000003 -10.0 +v -91.15257314814814 68.62492833333336 -10.0 +v -87.03835351851848 57.34572500000003 -10.0 +v -83.74313000000001 44.80251500000002 -10.0 +v -87.66622499999998 37.096515000000025 -10.0 +v -89.74371333333333 26.562383333333358 -10.0 +v -86.88399333333336 14.815341600000025 -10.0 +v -79.86389111111112 6.052006637592616 -10.0 +v -70.11096555555555 1.0513059157407634 -10.0 +v -61.64934916666667 0.09322213000002247 -10.0 +v -55.02271962037037 2.1985434212963106 -10.0 +v -48.39609007407407 4.303864712592599 -10.0 +v -40.186471592592554 12.732514897407409 -10.0 +v -38.24271392129628 19.346265782037037 -10.0 +v -36.29895625 25.960016666666668 -10.0 +v -37.29351061111111 33.92115018518518 -10.0 +v -40.633671194444446 39.63476671296296 -10.0 +v -43.973831777777775 45.34838324074073 -10.0 +v -49.97722092592592 50.13503537037036 -10.0 +v -57.59017840740741 52.96834796296295 -10.0 +v -66.19233837962963 54.088347361111104 -10.0 +v -71.86131314814816 60.90463675925926 -10.0 +v -75.91777944444445 67.1217724074074 -10.0 +v -79.36642833333333 73.53597833333333 -10.0 +v -82.81507722222221 79.95018425925926 -10.0 +v -86.19711277777778 87.81599125 -10.0 +v -89.57914833333334 95.68179824074073 -10.0 +v -92.66648541666666 105.96417962962963 -10.0 +v -86.89993870370371 113.6386588888889 -10.0 +v -83.04949462962965 121.06399111111115 -10.0 +v -76.95362795138888 132.31780457175927 -10.0 +v -70.04030569791666 134.22793747106482 -10.0 +v -63.12698344444444 136.13807037037037 -10.0 +v -52.43966322222221 137.70537962962962 -10.0 +v -45.60637582870369 137.37204777777777 -10.0 +v -38.77308843518518 137.0387159259259 -10.0 +v -31.333042462962958 130.26321814814813 -10.0 +v -22.84061575 127.38542166666666 -10.0 +v -12.125082784074074 128.8794311111111 -10.0 +v -5.313775472592594 133.78004888888893 -10.0 +v -0.5900747368970809 142.69963833333333 -10.0 +v -0.32077573758249756 151.01752499999998 -10.0 +v -3.7391141985185157 159.69738037037033 -10.0 +v -8.05902612481481 164.16445296296294 -10.0 +v -13.517511999999996 167.12332999999995 -10.0 +v -20.675108999999992 168.34940888888886 -10.0 +v -27.64777533333333 167.10740777777775 -10.0 +v -33.877182999999995 163.49677999999994 -10.0 +v -38.19886699999999 158.13752833333325 -10.0 +v -41.82407624999999 150.65757249999996 -10.0 +v -48.64911351851851 148.5135555555555 -10.0 +v -55.12316081481481 147.0686377777777 -10.0 +v -64.58940907407407 145.502692037037 -10.0 +v -73.34119018518518 144.6388659259259 -10.0 +v -81.93915148148147 146.0783130555555 -10.0 +v -87.7921037037037 156.5167438888888 -10.0 +v -93.14944 162.89553333333328 -10.0 +v -92.39023888888889 171.5462068518518 -10.0 +v -90.4536961111111 178.66252370370367 -10.0 +v -88.043635 184.83019666666667 -10.0 +v -85.63357388888889 190.99786962962963 -10.0 +v -82.41569722222222 197.0997860185185 -10.0 +v -77.88146222222221 204.59082476851844 -10.0 +v -72.67621055555556 211.81439907407403 -10.0 +v -73.66474944444445 219.37477092592593 -10.0 +v -78.65621666666667 223.9302066666666 -10.0 +v -86.87440833333335 223.70262166666657 -10.0 +v -92.81708166666664 216.84273999999994 -10.0 +v -92.65223499999999 209.20385499999992 -10.0 +v -94.4578737037037 196.914474074074 -10.0 +v -97.2777946296296 185.9085259259259 -10.0 +v -100.1594729398148 178.62421442129624 -10.0 +v -103.04115125 171.3399029166666 -10.0 +v -112.11144648148147 171.35005407407402 -10.0 +v -123.51036842592592 171.13475379629622 -10.0 +v -126.86862296296295 163.15518481481473 -10.0 +v -131.39186518518517 154.98269925925916 -10.0 +v -138.7159614814815 147.54539999999992 -10.0 +v -145.25479851851856 144.45964333333328 -10.0 +v -153.68033000000003 142.9850049999999 -10.0 +v -155.4393640740741 133.79316740740734 -10.0 +v -154.37636592592597 125.58727259259257 -10.0 +v -150.5701890740741 116.14194944444435 -10.0 +v -145.56223212962965 108.56584944444434 -10.0 +v -150.0574383333333 100.03593583333323 -10.0 +v -156.7614892592593 92.2815485185184 -10.0 +v -163.72093740740743 85.32462814814801 -10.0 +v -170.3772353240741 80.06991004629617 -10.0 +v -180.58388435185188 78.10908324074062 -10.0 +v -188.65461888888893 72.56539074074061 -10.0 +v -192.1384777777778 63.03370259259246 -10.0 +v -149.18391000001193 86.22657833331846 -10.0 +v -103.20113736112101 92.44147828705273 -10.0 +v -93.69433407408025 74.3382266666806 -10.0 +v -89.09546333333697 62.98532666667673 -10.0 +v -85.390741759263 51.074120000014304 -10.0 +v -88.70496916666403 31.829449166680053 -10.0 +v -88.31385333333677 20.68886246668074 -10.0 +v -83.37394222224493 10.433674118824648 -10.0 +v -74.9874283333426 3.5516562766714417 -10.0 +v -44.29128083334392 8.51818980498911 -10.0 +v -91.12281687499541 100.8229889351699 -10.0 +v -80.00156129051929 126.6908978414167 -10.0 +v -57.78332333334907 136.92172499999768 -10.0 +v -17.482849267052096 128.13242638888678 -10.0 +v -84.86562759257572 151.29752847219208 -10.0 +v -93.5550543518495 203.05916453705288 -10.0 +v -95.86783416666265 191.4115000000156 -10.0 +v -117.81090745368427 171.24240393518548 -10.0 +v -135.05391333332506 151.26404962963795 -10.0 +v -152.47327750000352 120.86461101852709 -10.0 +v -153.40946379629256 96.15874217593016 -10.0 +v -175.48055983795228 79.08949664352045 -10.0 +v -190.39654833332625 67.79954666668604 -10.0 +v -112.61363976482797 132.37651196857635 -10.0 +v -62.794126187428034 26.925572070958196 -10.0 +v -132.74869116817663 126.23527104176367 -10.0 +v -20.66359310947816 149.39137347776946 -10.0 +v -179.69156181921727 60.39157277237746 -10.0 +v -107.48106372885374 114.24625118970177 -10.0 +v -109.21810432265733 151.66018759499505 -10.0 +v -94.86269038634182 135.45345358234098 -10.0 +v -123.52016149379807 144.26158254426875 -10.0 +v -71.88487417537208 16.65899176023219 -10.0 +v -75.71009647407351 32.205572105651505 -10.0 +v -124.10280001092862 113.31299015657467 -10.0 +v -51.04832026637624 18.558700896176642 -10.0 +v -143.2508098410173 127.32575796537697 -10.0 +v -97.49071268910893 148.05335475646126 -10.0 +v -54.05740310300297 34.69019513104045 -10.0 +v -170.9019814538135 69.02904101182762 -10.0 +v -65.2889915322752 39.712855367306084 -10.0 +v -132.8459531417201 137.74870352128752 -10.0 +v -96.66947260896579 120.54485361629601 -10.0 +v -120.45179735294654 153.40995811694273 -10.0 +v -15.871759930713631 137.78249437455995 -10.0 +v -60.38894972246748 12.210702200485459 -10.0 +v -102.85345496547308 106.31323695482779 -10.0 +v -120.58551674578825 124.50579855243562 -10.0 +v -114.7795800313773 161.68170680093095 -10.0 +v -30.18574206346438 146.1793633707325 -10.0 +v -104.91720124259349 140.65616972555046 -10.0 +v -12.950704632958375 155.5691166242777 -10.0 +v -79.47794031946907 22.719085188097328 -10.0 +v -135.60752775043986 114.92276253513306 -10.0 +v -23.513868317172488 157.71701534552506 -10.0 +v -104.02504876597546 160.65854566510868 -10.0 +v -46.51768506114806 28.629529067959663 -10.0 +v -170.4382460616899 58.633248249806435 -10.0 +v -124.45710068417264 133.21832106616432 -10.0 +v -85.4002835769833 137.0409235615415 -10.0 +v -180.72588141053458 69.49557023237567 -10.0 +v -74.87800591642414 41.48219118175313 -10.0 +v -10.87057202155038 146.23542013347412 -10.0 +v -97.35613889490511 114.15554864202421 -10.0 +v -98.57130960258112 99.09161278505954 -10.0 +v -106.5666497668307 123.69623933588376 -10.0 +v -185.7538129574276 61.56469022622263 -10.0 +v -142.38570865820594 136.90413894358718 -10.0 +v -89.0471335772174 127.95168164118039 -10.0 +v -127.56819287210189 147.18832534292295 -10.0 +v -68.84743632079375 8.84462574458947 -10.0 +v -26.682333077462346 140.69907084238028 -10.0 +v -82.13722757315318 214.30708683055687 -10.0 +v -75.58281832608827 51.25183024046182 -10.0 +v -114.06659932804132 144.29958734278853 -10.0 +v -142.30733973898768 118.48202755775482 -10.0 +v -89.74748016578735 144.1975480564824 -10.0 +v -50.987539729146626 12.235796138012141 -10.0 +v -71.4514914213818 24.518368776615684 -10.0 +v -115.34408492336009 107.37910985789038 -10.0 +v -54.753644159520675 27.540095866655633 -10.0 +v -165.47020390849775 74.59206134275321 -10.0 +v -102.15947228005643 131.02965339744247 -10.0 +v -116.24991264786372 118.69194089054814 -10.0 +v -29.206795819261156 153.91930957675152 -10.0 +v -64.0372819804237 20.06164387409527 -10.0 +v -57.51625586975341 44.49488688221496 -10.0 +v -94.92011156920341 92.13678199092148 -10.0 +v -81.71918535734214 28.229754562335884 -10.0 +v -77.16555954984904 15.978187345693062 -10.0 +v -20.664799558686134 133.26579715347685 -10.0 +v -118.3086269359735 135.691414362191 -10.0 +v -79.587763257123 36.68951183888918 -10.0 +v -130.3633504040716 107.8263417305775 -10.0 +v -126.87574606269612 120.64944880742733 -10.0 +v -133.13756623719271 145.33352134996 -10.0 +v -176.56832393098423 54.45182506046542 -10.0 +v -66.54012127794655 31.883470628765625 -10.0 +v -93.74433282394848 86.30702333472244 -10.0 +v -81.89428372790314 62.31292181003704 -10.0 +v -135.4794376958717 132.13668494573707 -10.0 +v -109.2541471627385 103.47605785834577 -10.0 +v -95.12742666015211 155.12818405338663 -10.0 +v -85.83935550590081 205.0641914260199 -10.0 +v -60.83960169234864 33.69183662870564 -10.0 +v -165.22907388171194 65.5644412741443 -10.0 +v -75.60703232475981 10.428456097924188 -10.0 +v -98.91722462951948 140.8536487605854 -10.0 +v -31.758330602827662 138.65591914712004 -10.0 +v -176.5870327643798 72.91436322592749 -10.0 +v -46.262217846952595 15.511816704556345 -10.0 +v -86.93553417805927 74.20042873321275 -10.0 +v -89.91788090996734 121.99111666059198 -10.0 +v -102.51305084288111 154.4502879198301 -10.0 +v -17.840968756026474 161.18931135269943 -10.0 +v -138.58310036027464 122.68923657406965 -10.0 +v -46.377351676871676 35.57531013637028 -10.0 +v -68.8666768011649 46.663393842186345 -10.0 +v -148.61184155737973 125.16542586230193 -10.0 +v -148.05003260581543 132.19252685675707 -10.0 +v -113.16158095979287 125.48394037087797 -10.0 +v -138.27510069689401 141.52543913728053 -10.0 +v -108.6998243895774 165.25540687556511 -10.0 +v -50.728618685192785 41.71045417583674 -10.0 +v -122.77090688990447 105.52114657783105 -10.0 +v -57.24451439464515 22.516937108008147 -10.0 +v -183.646957085236 55.649757206200555 -10.0 +v -90.89825784110239 149.38593653933265 -10.0 +v -38.23285761547356 144.2299086965887 -10.0 +v -103.17670934898433 118.64055054368569 -10.0 +v -78.60116614794693 139.61846861315385 -10.0 +v -44.17088320560375 22.214632534220133 -10.0 +v -185.224251261044 66.6119032219068 -10.0 +v -89.93708101268132 80.44389654064581 -10.0 +v -88.67945621608992 198.11492678415127 -10.0 +v -114.67259568601912 155.63100399560747 -10.0 +v -62.71039794180494 6.783561101371762 -10.0 +v -128.1718242752539 141.24505127464408 -10.0 +v -176.46387971984902 65.91361074063495 -10.0 +v -9.295022756077598 140.28467594984272 -10.0 +v -154.80576656378688 86.96004552720281 -10.0 +v -151.56068129218465 91.17278572956354 -10.0 +v -95.37364860863566 129.0445938596803 -10.0 +v -79.87515919057925 55.386436107996126 -10.0 +v -126.38126598161969 152.6040450303485 -10.0 +v -130.25125394537474 132.23814600352435 -10.0 +v -142.74283416397503 101.08935229015907 -10.0 +v -137.88380127505246 107.10790202536317 -10.0 +v -119.6710540772821 165.57142954285834 -10.0 +v -97.6913703339818 103.93468193119973 -10.0 +v -84.0603436942042 68.1302260473334 -10.0 +v -118.99642103444621 147.1408627054416 -10.0 +v -147.22465168096423 95.79953524865813 -10.0 +v -15.377805279731225 132.73599141350533 -10.0 +v -8.178490788127922 152.50345642799454 -10.0 +v -66.13341888644547 14.17678182480144 -10.0 +v -118.91793994505413 130.31282400540107 -10.0 +v -126.00422388247239 127.31435667281222 -10.0 +v -111.84350422253367 139.20774846846476 -10.0 +v -102.73925499460077 111.87946956642377 -10.0 +v -25.78504776466719 149.61370018636947 -10.0 +v -49.00684341305548 142.62164852292943 -10.0 +v -170.1920386370679 74.91233538657211 -10.0 +v -83.22459718541577 18.907332042128427 -10.0 +v -102.83231069486008 101.15047760601426 -10.0 +v -83.77798471229748 131.13915527305468 -10.0 +v -120.27513162406541 159.62573633168427 -10.0 +v -103.56908226143673 146.92671864600814 -10.0 +v -18.863991888843884 154.57611488571482 -10.0 +v -132.80987861826344 120.35726111880774 -10.0 +v -108.49287394020055 109.30385741640775 -10.0 +v -84.81588491280799 24.51348984319275 -10.0 +v -55.81355621549013 15.73767189688498 -10.0 +v -26.7585691735779 135.1321523346713 -10.0 +v -56.36710707452994 8.510197592189758 -10.0 +v -28.482181152571982 160.72053429435744 -10.0 +v -188.59886732229197 64.44122709096534 -10.0 +v -35.14605780294754 151.94058641811327 -10.0 +v -55.298618931071 141.31242602796476 -10.0 +v -161.56189185740607 79.29332031483796 -10.0 +v -148.96204677132283 138.0668963082169 -10.0 +v -91.19931014912805 193.0082170034069 -10.0 +v -114.87835533587725 166.9112959015805 -10.0 +v -108.98470067308128 158.22285647533954 -10.0 +v -84.02525788602065 33.091169269171324 -10.0 +v -147.41225974396417 119.80135805038064 -10.0 +v -16.621265073661583 143.94777552506966 -10.0 +v -71.95835263535592 36.06334363664765 -10.0 +v -67.96407680668207 140.17918659291422 -10.0 +v -94.33266397453244 97.08812655783045 -10.0 +v -99.39221131056253 165.59851466634262 -10.0 +v -63.09088819804611 47.58556628315628 -10.0 +v -101.6646503585405 125.57241167590148 -10.0 +v -121.51116541707808 118.64640043974792 -10.0 +v -89.88038281261694 139.28053138299745 -10.0 +v -9.040773219884631 158.892712064265 -10.0 +v -91.91003719590783 188.14076711231542 -10.0 +v -74.14800920058578 21.23760440934918 -10.0 +v -110.01475949884141 119.37457438091921 -10.0 +v -106.446228584111 134.67923571423322 -10.0 +v -108.84871602374449 146.12666165169193 -10.0 +v -129.62284374164608 114.96946825201876 -10.0 +v -93.38156823838149 111.80437333571398 -10.0 +v -89.72368727901542 133.31838988346584 -10.0 +v -43.996148393030694 145.3986806148298 -10.0 +v -76.2811373801007 27.352713349381915 -10.0 +v -97.78137880733482 109.0085816766365 -10.0 +v -41.23557227625154 29.380921118044053 -10.0 +v -114.59394361840621 150.17527311624409 -10.0 +v -165.2795875994173 59.99195817074071 -10.0 +v -78.1622595364689 46.12832000877525 -10.0 +v -87.04434282596489 212.05165588195266 -10.0 +v -171.08466996844345 63.69568543258864 -10.0 +v -85.16665229882163 142.13291317199653 -10.0 +v -157.85622484948323 82.06134319474958 -10.0 +v -50.13766507824386 24.82782925274673 -10.0 +v -14.691436252436716 150.37054284571667 -10.0 +v -50.70595416894695 30.895639426479697 -10.0 +v -123.43804911924559 149.10869755713824 -10.0 +v -91.11017637606575 90.48539870409614 -10.0 +v -93.85690228060476 182.0541723432715 -10.0 +v -69.03251566312554 20.631270677946297 -10.0 +v -145.2140546766078 115.00148940980999 -10.0 +v -112.8482902689793 113.30373091174762 -10.0 +v -168.65351487645964 54.00308469127986 -10.0 +v -60.647595400739235 141.1871229676769 -10.0 +v -123.48291525400015 138.69753943861318 -10.0 +v -93.34268393946915 116.690120003289 -10.0 +v -5.765276913217555 146.35002566264848 -10.0 +v -99.22146010593194 94.3599450985287 -10.0 +v -23.571259330208818 163.1727702469831 -10.0 +v -185.32357043705238 70.07729284202841 -10.0 +v -182.37499757054152 72.63234005636255 -10.0 +v -174.9548547207055 60.28666718068122 -10.0 +v -11.596689244637826 134.69252834758157 -10.0 +v -57.98056153379969 38.67009437093907 -10.0 +v -100.02861794443483 135.70412994233672 -10.0 +v -189.3461090083697 61.3540636257212 -10.0 +v -188.0250449680746 57.67340490878471 -10.0 +v -107.26184612814806 128.95409911412204 -10.0 +v -94.20973569807228 143.19423406745048 -10.0 +v -130.7065607218849 150.2745281224257 -10.0 +v -166.203594585317 70.2542126651304 -10.0 +v -67.23760910282147 4.764658638841699 -10.0 +v -45.59804557577396 40.565741975161146 -10.0 +v -81.05958689501233 135.0208250793613 -10.0 +v -151.24040377732902 128.84315250369076 -10.0 +v -161.23523515938143 74.00653630768495 -10.0 +v -118.36970471146549 141.54978914362792 -10.0 +v -76.85238297985545 59.99831447206051 -10.0 +v -84.96354615726295 125.69986238922839 -10.0 +v -140.950893498254 131.89828077301965 -10.0 +v -86.47913530998382 146.8463292825033 -10.0 +v -79.65361018697368 32.164916791472955 -10.0 +v -118.45837264148139 112.68596015219606 -10.0 +v -78.92819673773052 218.6198585691766 -10.0 +v -137.65592359013507 136.59052450646803 -10.0 +v -86.07192219907705 28.65863232537254 -10.0 +v -95.78500244067857 176.36351895660462 -10.0 +v -128.05516512007566 136.55663883070335 -10.0 +v -166.0473687501964 78.79842142161944 -10.0 +v -181.57187743361453 64.7954694387035 -10.0 +v -125.11185176776982 157.19827042727886 -10.0 +v -81.99341035080363 14.336458622261908 -10.0 +v -21.481932430910486 139.0677094448596 -10.0 +v -98.66624937952757 160.06687670784856 -10.0 +v -144.03307024832472 122.69276120197681 -10.0 +v -95.11096110226923 100.89302327462225 -10.0 +v -23.56998558660736 144.81649880786347 -10.0 +v -23.606659379884576 153.04350269442605 -10.0 +v -81.61761551160266 208.90917197923758 -10.0 +v -71.45030333794237 29.408002676976903 -10.0 +v -79.60076711175371 11.445756564459282 -10.0 +v -52.02264592266354 7.073052969855479 -10.0 +v -80.80747674200319 41.23981060588351 -10.0 +v -32.98221695495612 157.64294772451106 -10.0 +v -59.11305344463253 29.471876752306617 -10.0 +v -141.00163728049768 112.5875080109367 -10.0 +v -86.02947721911154 217.35567758002233 -10.0 +v -25.399256736306747 131.5116473257407 -10.0 +v -101.97891294178771 96.80511744051623 -10.0 +v -60.25846782504612 17.012106254241132 -10.0 +v -73.30072772916478 138.43053437553104 -10.0 +v -12.281796946736858 161.387784600841 -10.0 +v -42.36092783617979 140.96960487852178 -10.0 +v -72.86989652928646 7.050578302506484 -10.0 +v -138.35446803029726 127.97266195385718 -10.0 +v -70.09265515964667 40.75441747867028 -10.0 +v -128.38886154571622 102.87608594284286 -10.0 +v -71.67914179853301 55.29061261460011 -10.0 +v -42.21557164161129 17.451307479555226 -10.0 +v -80.51360318574571 50.10824259419291 -10.0 +v -71.59641361361157 12.208916381791504 -10.0 +v -67.55097331137466 25.57138811755966 -10.0 +f 90 75 367 +f 127 95 204 +f 33 225 316 +f 138 222 292 +f 186 118 219 +f 221 177 251 +f 33 34 225 +f 127 204 350 +f 373 295 377 +f 184 162 224 +f 75 90 299 +f 5 6 333 +f 26 27 352 +f 96 176 230 +f 201 142 296 +f 229 132 265 +f 189 147 385 +f 240 32 316 +f 140 178 246 +f 151 221 251 +f 130 106 218 +f 181 81 364 +f 245 28 283 +f 318 166 333 +f 249 104 323 +f 255 102 261 +f 147 189 326 +f 40 41 259 +f 118 186 382 +f 36 195 232 +f 93 94 371 +f 36 37 195 +f 54 55 388 +f 217 158 237 +f 263 60 304 +f 3 4 205 +f 180 373 377 +f 180 158 217 +f 149 195 300 +f 172 151 238 +f 133 194 234 +f 11 12 261 +f 59 60 263 +f 53 54 217 +f 78 243 290 +f 198 215 401 +f 27 28 245 +f 222 164 292 +f 208 40 259 +f 100 101 331 +f 231 164 299 +f 53 217 237 +f 90 231 299 +f 31 32 240 +f 206 133 213 +f 62 63 223 +f 178 140 327 +f 144 186 219 +f 12 255 261 +f 151 172 336 +f 141 198 401 +f 287 69 334 +f 81 181 379 +f 218 106 341 +f 196 17 207 +f 206 380 402 +f 139 303 349 +f 170 201 296 +f 111 220 242 +f 153 248 295 +f 179 245 264 +f 156 192 229 +f 170 226 319 +f 147 213 385 +f 15 188 233 +f 216 139 349 +f 224 162 278 +f 29 118 382 +f 55 122 199 +f 150 204 230 +f 191 251 345 +f 133 206 402 +f 78 79 243 +f 234 144 324 +f 158 180 377 +f 149 206 213 +f 174 238 301 +f 147 225 232 +f 134 203 266 +f 101 102 255 +f 95 96 230 +f 86 124 212 +f 43 44 328 +f 17 196 338 +f 189 234 324 +f 251 139 345 +f 178 204 246 +f 112 20 208 +f 57 58 248 +f 69 70 334 +f 204 178 350 +f 210 16 273 +f 142 201 362 +f 268 155 315 +f 218 169 247 +f 188 15 210 +f 56 57 343 +f 204 95 230 +f 156 229 265 +f 193 158 269 +f 163 193 378 +f 118 30 219 +f 226 149 300 +f 192 156 302 +f 245 154 264 +f 104 105 369 +f 176 96 289 +f 81 82 364 +f 195 149 344 +f 148 218 247 +f 73 211 236 +f 226 182 319 +f 248 171 295 +f 73 74 211 +f 83 84 364 +f 18 111 242 +f 155 210 273 +f 193 163 284 +f 98 99 355 +f 238 151 301 +f 25 117 394 +f 133 234 385 +f 198 141 306 +f 161 198 306 +f 186 144 281 +f 201 22 293 +f 144 219 240 +f 137 238 307 +f 79 80 212 +f 158 193 286 +f 132 229 348 +f 238 174 307 +f 225 165 316 +f 194 133 402 +f 143 202 233 +f 215 25 394 +f 270 69 287 +f 66 67 286 +f 97 98 289 +f 46 47 221 +f 223 63 339 +f 3 205 235 +f 165 240 316 +f 14 15 233 +f 161 197 280 +f 232 225 353 +f 197 161 314 +f 146 211 222 +f 216 159 345 +f 41 220 259 +f 130 218 271 +f 88 89 329 +f 203 156 266 +f 159 308 345 +f 167 200 335 +f 79 212 243 +f 227 145 228 +f 265 167 266 +f 147 232 344 +f 139 251 312 +f 132 200 265 +f 123 73 236 +f 183 267 309 +f 196 44 298 +f 197 314 362 +f 107 131 340 +f 160 223 277 +f 111 19 220 +f 251 177 312 +f 136 205 342 +f 208 20 252 +f 295 135 377 +f 66 286 384 +f 85 86 320 +f 202 162 256 +f 216 146 276 +f 131 108 285 +f 318 214 321 +f 131 241 340 +f 205 136 235 +f 7 8 214 +f 199 122 262 +f 222 138 276 +f 200 167 265 +f 204 150 246 +f 105 130 271 +f 267 159 309 +f 198 161 272 +f 211 146 236 +f 71 72 239 +f 92 93 257 +f 234 189 385 +f 203 134 278 +f 364 84 387 +f 68 69 270 +f 153 262 343 +f 13 202 256 +f 74 75 299 +f 186 281 283 +f 136 175 235 +f 35 36 232 +f 99 128 227 +f 110 17 338 +f 229 174 348 +f 156 265 266 +f 150 209 254 +f 140 335 357 +f 212 124 243 +f 335 200 357 +f 98 228 289 +f 159 216 276 +f 185 236 349 +f 223 163 277 +f 314 142 362 +f 51 270 287 +f 358 252 398 +f 206 149 296 +f 200 132 267 +f 236 146 349 +f 202 143 310 +f 281 154 283 +f 209 134 254 +f 241 175 370 +f 12 13 255 +f 141 264 330 +f 172 268 315 +f 137 307 332 +f 351 8 356 +f 380 187 402 +f 286 193 384 +f 78 290 305 +f 232 195 344 +f 182 226 398 +f 153 199 262 +f 112 208 259 +f 176 228 360 +f 205 166 342 +f 9 10 323 +f 190 351 356 +f 126 92 257 +f 20 113 252 +f 220 42 242 +f 207 18 242 +f 248 58 337 +f 94 253 371 +f 307 192 332 +f 251 191 301 +f 124 87 243 +f 26 352 394 +f 252 182 398 +f 160 263 304 +f 220 19 259 +f 244 157 275 +f 77 78 305 +f 210 155 279 +f 117 26 394 +f 152 244 275 +f 248 153 343 +f 150 230 365 +f 255 13 256 +f 263 160 325 +f 188 210 279 +f 43 207 242 +f 89 90 367 +f 32 33 316 +f 227 228 355 +f 228 145 360 +f 264 194 330 +f 84 85 387 +f 80 81 379 +f 55 199 388 +f 202 13 397 +f 276 138 309 +f 120 48 274 +f 272 161 280 +f 42 43 242 +f 162 184 386 +f 175 136 370 +f 214 8 351 +f 156 203 302 +f 162 202 310 +f 13 14 397 +f 164 222 374 +f 254 134 266 +f 134 209 395 +f 173 258 273 +f 149 213 344 +f 51 52 270 +f 166 318 321 +f 41 42 220 +f 169 218 341 +f 144 240 324 +f 218 148 271 +f 239 72 322 +f 171 263 325 +f 243 87 290 +f 195 37 300 +f 223 160 392 +f 271 148 351 +f 231 91 291 +f 153 295 373 +f 103 249 250 +f 143 233 363 +f 109 11 250 +f 140 260 327 +f 224 145 375 +f 231 157 292 +f 184 224 375 +f 163 223 339 +f 190 271 351 +f 7 214 318 +f 209 150 365 +f 213 133 385 +f 203 143 302 +f 155 258 315 +f 258 155 273 +f 237 158 286 +f 44 196 328 +f 221 47 359 +f 244 138 292 +f 86 212 320 +f 214 148 321 +f 177 221 359 +f 244 152 317 +f 167 254 266 +f 129 103 250 +f 157 231 291 +f 233 188 363 +f 168 239 322 +f 146 222 276 +f 154 245 283 +f 224 134 395 +f 10 109 249 +f 188 279 332 +f 27 245 352 +f 152 260 317 +f 38 39 398 +f 6 7 318 +f 96 97 289 +f 166 205 333 +f 222 211 374 +f 228 176 289 +f 238 137 268 +f 19 112 259 +f 144 234 281 +f 226 38 398 +f 122 56 262 +f 172 238 268 +f 229 192 307 +f 199 153 373 +f 201 170 383 +f 250 11 261 +f 64 65 284 +f 2 3 235 +f 67 237 286 +f 183 309 317 +f 296 149 396 +f 25 215 381 +f 160 304 392 +f 227 128 294 +f 143 203 310 +f 126 257 291 +f 85 320 387 +f 253 152 371 +f 46 221 336 +f 102 129 261 +f 226 170 396 +f 249 109 250 +f 40 208 358 +f 269 158 377 +f 257 157 291 +f 134 224 278 +f 148 214 351 +f 180 217 282 +f 115 24 272 +f 239 48 391 +f 329 89 367 +f 157 257 275 +f 129 250 261 +f 146 216 349 +f 282 199 373 +f 48 239 354 +f 23 115 280 +f 225 147 326 +f 105 271 369 +f 49 50 297 +f 298 173 338 +f 196 298 338 +f 149 226 396 +f 274 48 354 +f 360 209 365 +f 296 142 380 +f 48 49 391 +f 217 54 282 +f 213 147 344 +f 205 4 333 +f 165 225 326 +f 181 364 387 +f 157 244 292 +f 171 248 337 +f 221 151 336 +f 279 137 332 +f 207 43 328 +f 267 183 357 +f 135 295 325 +f 253 94 350 +f 193 269 378 +f 28 29 382 +f 309 138 317 +f 194 264 390 +f 215 198 381 +f 121 51 287 +f 294 100 331 +f 200 267 357 +f 240 165 324 +f 119 45 376 +f 139 216 345 +f 8 9 356 +f 45 258 376 +f 115 272 280 +f 288 9 323 +f 264 154 390 +f 30 31 399 +f 176 360 365 +f 123 236 361 +f 219 30 399 +f 87 125 290 +f 152 275 371 +f 174 229 307 +f 128 100 294 +f 196 207 328 +f 155 268 279 +f 175 241 285 +f 260 140 357 +f 62 223 392 +f 271 190 369 +f 39 40 358 +f 235 175 347 +f 91 126 291 +f 161 306 314 +f 164 231 292 +f 206 296 380 +f 257 93 275 +f 239 168 354 +f 22 114 293 +f 185 303 322 +f 236 185 361 +f 267 132 308 +f 346 1 347 +f 297 50 334 +f 178 253 350 +f 240 219 399 +f 303 168 322 +f 50 121 334 +f 35 232 353 +f 116 25 381 +f 37 38 300 +f 306 187 314 +f 268 137 279 +f 145 224 395 +f 180 282 373 +f 245 179 352 +f 44 119 298 +f 183 260 357 +f 256 162 386 +f 308 191 345 +f 241 131 285 +f 67 68 313 +f 203 278 310 +f 225 34 353 +f 4 5 333 +f 260 183 317 +f 113 21 400 +f 234 194 390 +f 275 93 371 +f 58 59 337 +f 125 88 305 +f 60 61 304 +f 76 77 329 +f 237 67 313 +f 184 331 386 +f 233 202 397 +f 295 171 325 +f 270 52 393 +f 308 132 348 +f 303 185 349 +f 99 227 355 +f 192 302 363 +f 151 251 301 +f 290 125 305 +f 53 237 393 +f 258 45 315 +f 148 247 321 +f 313 270 393 +f 247 169 370 +f 64 284 339 +f 269 135 378 +f 260 152 327 +f 191 308 348 +f 101 255 256 +f 70 71 297 +f 247 136 342 +f 179 264 401 +f 10 249 323 +f 274 168 312 +f 293 114 366 +f 277 135 325 +f 75 76 367 +f 174 301 348 +f 301 191 348 +f 352 179 394 +f 16 110 389 +f 152 253 327 +f 38 226 300 +f 121 287 334 +f 278 162 310 +f 31 240 399 +f 253 178 327 +f 302 143 363 +f 177 274 312 +f 264 141 401 +f 189 324 326 +f 138 244 317 +f 184 294 331 +f 246 150 368 +f 135 277 378 +f 324 165 326 +f 63 64 339 +f 252 113 400 +f 45 311 315 +f 159 267 308 +f 211 74 374 +f 76 329 367 +f 228 98 355 +f 263 171 337 +f 140 246 335 +f 197 293 366 +f 284 163 339 +f 288 190 356 +f 59 263 337 +f 159 276 309 +f 136 247 370 +f 150 254 368 +f 61 62 392 +f 68 270 313 +f 34 35 353 +f 190 288 369 +f 94 127 350 +f 47 120 359 +f 258 173 376 +f 254 167 368 +f 72 123 361 +f 65 66 384 +f 208 252 358 +f 120 274 359 +f 303 139 312 +f 21 319 400 +f 114 23 366 +f 14 233 397 +f 24 116 372 +f 274 177 359 +f 160 277 325 +f 230 176 365 +f 281 234 390 +f 52 53 393 +f 262 56 343 +f 82 83 364 +f 241 169 340 +f 311 46 336 +f 145 227 375 +f 285 108 346 +f 212 80 379 +f 282 54 388 +f 135 269 377 +f 168 303 312 +f 311 172 315 +f 77 305 329 +f 320 181 387 +f 321 247 342 +f 288 104 369 +f 305 88 329 +f 169 241 370 +f 101 256 386 +f 272 24 372 +f 168 274 354 +f 39 358 398 +f 283 28 382 +f 173 273 389 +f 273 16 389 +f 175 346 347 +f 172 311 336 +f 306 141 330 +f 182 252 400 +f 23 280 366 +f 198 272 372 +f 186 283 382 +f 199 282 388 +f 187 306 330 +f 9 288 356 +f 57 248 343 +f 110 338 389 +f 142 314 380 +f 104 288 323 +f 330 194 402 +f 280 197 366 +f 193 284 384 +f 215 394 401 +f 71 239 391 +f 284 65 384 +f 277 163 378 +f 227 294 375 +f 154 281 390 +f 394 179 401 +f 322 72 361 +f 2 235 347 +f 314 187 380 +f 298 119 376 +f 299 164 374 +f 293 197 362 +f 173 298 376 +f 170 319 383 +f 70 297 334 +f 167 335 368 +f 335 246 368 +f 185 322 361 +f 201 293 362 +f 74 299 374 +f 294 184 375 +f 319 21 383 +f 304 61 392 +f 340 169 341 +f 188 332 363 +f 166 321 342 +f 332 192 363 +f 170 296 396 +f 297 71 391 +f 320 212 379 +f 181 320 379 +f 108 1 346 +f 49 297 391 +f 372 116 381 +f 237 313 393 +f 360 145 395 +f 198 372 381 +f 338 173 389 +f 187 330 402 +f 175 285 346 +f 319 182 400 +f 331 101 386 +f 209 360 395 +f 1 2 347 +f 45 46 311 +f 106 107 341 +f 107 340 341 +f 6 318 333 +f 15 16 210 +f 17 18 207 +f 21 22 383 +f 22 201 383 +f 90 91 231 +f 103 104 249 +f 769 477 492 +f 606 497 529 +f 718 627 435 +f 694 624 540 +f 621 520 588 +f 653 579 623 +f 627 436 435 +f 752 606 529 +f 779 697 775 +f 626 564 586 +f 701 492 477 +f 735 408 407 +f 754 429 428 +f 632 578 498 +f 698 544 603 +f 667 534 631 +f 787 549 591 +f 718 434 642 +f 648 580 542 +f 653 623 553 +f 620 508 532 +f 766 483 583 +f 685 430 647 +f 735 568 720 +f 725 506 651 +f 663 504 657 +f 728 591 549 +f 661 443 442 +f 784 588 520 +f 634 597 438 +f 773 496 495 +f 597 439 438 +f 790 457 456 +f 639 560 619 +f 706 462 665 +f 607 406 405 +f 779 775 582 +f 619 560 582 +f 702 597 551 +f 640 553 574 +f 636 596 535 +f 663 414 413 +f 665 462 461 +f 619 456 455 +f 692 645 480 +f 803 617 600 +f 647 430 429 +f 694 566 624 +f 661 442 610 +f 733 503 502 +f 701 566 633 +f 639 619 455 +f 701 633 492 +f 642 434 433 +f 615 535 608 +f 625 465 464 +f 729 542 580 +f 621 588 546 +f 663 657 414 +f 738 574 553 +f 803 600 543 +f 736 471 689 +f 781 583 483 +f 743 508 620 +f 609 419 598 +f 804 782 608 +f 751 705 541 +f 698 603 572 +f 644 622 513 +f 697 650 555 +f 666 647 581 +f 631 594 558 +f 721 628 572 +f 787 615 549 +f 635 590 417 +f 751 541 618 +f 680 564 626 +f 784 520 431 +f 601 524 457 +f 632 606 552 +f 747 653 593 +f 804 608 535 +f 645 481 480 +f 726 546 636 +f 779 582 560 +f 615 608 551 +f 703 640 576 +f 634 627 549 +f 668 605 536 +f 657 504 503 +f 632 498 497 +f 614 526 488 +f 730 446 445 +f 740 598 419 +f 726 636 591 +f 747 541 653 +f 648 606 580 +f 610 422 514 +f 650 460 459 +f 736 472 471 +f 752 580 606 +f 675 418 612 +f 764 603 544 +f 717 557 670 +f 649 571 620 +f 612 417 590 +f 745 459 458 +f 632 497 606 +f 667 631 558 +f 671 560 595 +f 780 595 565 +f 621 432 520 +f 702 551 628 +f 704 558 594 +f 666 556 647 +f 771 507 506 +f 691 498 578 +f 766 484 483 +f 746 551 597 +f 649 620 550 +f 638 613 475 +f 721 584 628 +f 697 573 650 +f 613 476 475 +f 766 486 485 +f 644 513 420 +f 675 612 557 +f 686 565 595 +f 757 501 500 +f 703 553 640 +f 796 519 427 +f 787 636 535 +f 708 543 600 +f 708 600 563 +f 683 546 588 +f 695 424 603 +f 642 621 546 +f 709 640 539 +f 614 482 481 +f 688 595 560 +f 750 631 534 +f 709 576 640 +f 718 567 627 +f 804 535 596 +f 635 604 545 +f 796 427 617 +f 689 471 672 +f 688 469 468 +f 691 500 499 +f 623 449 448 +f 741 465 625 +f 637 607 405 +f 718 642 567 +f 635 417 416 +f 682 599 563 +f 755 627 634 +f 716 563 599 +f 624 613 548 +f 747 561 618 +f 661 622 443 +f 673 620 532 +f 731 491 490 +f 668 558 605 +f 747 710 561 +f 737 602 569 +f 645 614 481 +f 630 547 629 +f 668 569 667 +f 746 634 549 +f 714 653 541 +f 667 602 534 +f 638 475 525 +f 711 669 585 +f 700 446 598 +f 764 716 599 +f 742 533 509 +f 679 625 562 +f 622 421 513 +f 714 579 653 +f 744 607 538 +f 654 422 610 +f 779 537 697 +f 786 688 468 +f 722 488 487 +f 658 564 604 +f 678 548 618 +f 687 510 533 +f 723 616 720 +f 742 643 533 +f 637 538 607 +f 616 410 409 +f 664 524 601 +f 678 540 624 +f 667 569 602 +f 648 552 606 +f 673 532 507 +f 711 561 669 +f 674 563 600 +f 638 548 613 +f 641 474 473 +f 659 495 494 +f 787 591 636 +f 680 536 605 +f 789 486 766 +f 672 471 470 +f 745 664 555 +f 658 604 415 +f 701 477 476 +f 685 683 588 +f 637 577 538 +f 634 438 437 +f 629 530 501 +f 740 419 512 +f 750 576 631 +f 668 667 558 +f 656 611 552 +f 759 737 542 +f 645 526 614 +f 759 602 737 +f 691 630 500 +f 678 618 561 +f 751 638 587 +f 679 565 625 +f 764 544 716 +f 689 672 453 +f 800 654 760 +f 698 551 608 +f 669 534 602 +f 751 548 638 +f 712 545 604 +f 685 556 683 +f 656 536 611 +f 772 577 643 +f 657 415 414 +f 732 666 543 +f 717 670 574 +f 734 709 539 +f 758 410 753 +f 804 589 782 +f 786 595 688 +f 707 692 480 +f 746 597 634 +f 800 628 584 +f 664 601 555 +f 661 610 514 +f 762 630 578 +f 744 568 607 +f 725 412 411 +f 758 753 592 +f 659 494 528 +f 654 515 422 +f 644 444 622 +f 644 420 609 +f 739 460 650 +f 773 655 496 +f 734 594 709 +f 703 593 653 +f 645 489 526 +f 796 754 428 +f 800 584 654 +f 706 665 562 +f 661 421 622 +f 677 559 646 +f 707 480 479 +f 681 557 612 +f 796 428 519 +f 677 646 554 +f 745 555 650 +f 767 632 552 +f 658 415 657 +f 727 562 665 +f 681 612 590 +f 644 609 445 +f 769 492 491 +f 718 435 434 +f 757 630 629 +f 762 547 630 +f 732 596 666 +f 789 487 486 +f 781 483 482 +f 790 601 457 +f 799 415 604 +f 711 540 678 +f 676 450 522 +f 682 563 674 +f 644 445 444 +f 788 586 564 +f 772 538 577 +f 753 410 616 +f 704 605 558 +f 712 604 564 +f 799 416 415 +f 776 624 566 +f 668 536 656 +f 797 611 536 +f 675 660 575 +f 746 615 551 +f 672 454 453 +f 723 720 568 +f 622 444 443 +f 743 620 571 +f 726 642 546 +f 673 550 620 +f 724 474 641 +f 727 665 573 +f 692 489 645 +f 702 439 597 +f 794 562 625 +f 753 550 673 +f 693 493 633 +f 775 697 555 +f 652 651 505 +f 765 635 545 +f 652 413 511 +f 729 662 542 +f 777 547 626 +f 694 559 633 +f 777 626 586 +f 741 625 565 +f 753 673 592 +f 720 616 409 +f 767 552 611 +f 787 535 615 +f 704 545 605 +f 717 660 557 +f 675 557 660 +f 688 560 639 +f 730 598 446 +f 761 449 623 +f 694 540 646 +f 722 614 488 +f 723 550 616 +f 761 623 579 +f 719 554 646 +f 668 656 569 +f 652 505 531 +f 693 633 559 +f 765 590 635 +f 724 641 570 +f 678 624 548 +f 685 647 556 +f 797 536 626 +f 651 511 412 +f 734 681 590 +f 754 647 429 +f 719 662 554 +f 800 441 440 +f 720 409 408 +f 691 499 498 +f 735 607 568 +f 776 613 624 +f 691 578 630 +f 670 539 640 +f 661 514 421 +f 683 636 546 +f 800 440 628 +f 664 458 524 +f 670 640 574 +f 709 594 631 +f 775 555 601 +f 785 572 603 +f 663 413 652 +f 686 467 466 +f 637 405 404 +f 688 639 469 +f 719 711 585 +f 798 551 698 +f 783 617 427 +f 794 706 562 +f 696 530 629 +f 712 605 545 +f 693 659 528 +f 789 722 487 +f 773 554 655 +f 738 623 448 +f 663 531 504 +f 798 572 628 +f 652 511 651 +f 760 610 442 +f 779 560 671 +f 693 559 659 +f 680 626 536 +f 753 616 550 +f 684 619 582 +f 674 426 517 +f 793 450 641 +f 769 491 731 +f 677 659 559 +f 663 652 531 +f 751 618 548 +f 775 601 684 +f 756 641 450 +f 682 517 425 +f 728 549 627 +f 771 673 507 +f 699 452 451 +f 740 575 700 +f 740 700 598 +f 798 628 551 +f 756 450 676 +f 767 611 762 +f 782 544 698 +f 793 451 450 +f 684 456 619 +f 746 549 615 +f 735 406 607 +f 728 627 567 +f 789 766 583 +f 694 646 559 +f 739 650 573 +f 738 553 623 +f 734 539 681 +f 730 445 609 +f 759 585 669 +f 727 697 537 +f 752 496 655 +f 780 671 595 +f 784 431 430 +f 719 540 711 +f 792 666 596 +f 783 600 617 +f 689 453 523 +f 733 502 696 +f 759 669 602 +f 726 567 642 +f 778 447 521 +f 747 618 541 +f 758 411 410 +f 778 660 447 +f 682 674 517 +f 725 411 690 +f 792 556 666 +f 801 433 432 +f 767 762 578 +f 763 638 525 +f 801 432 621 +f 692 527 489 +f 773 677 554 +f 709 631 576 +f 696 502 530 +f 730 609 598 +f 681 670 557 +f 687 643 577 +f 759 542 662 +f 794 625 464 +f 771 592 673 +f 760 442 441 +f 749 577 637 +f 693 528 493 +f 716 708 563 +f 694 633 566 +f 782 698 608 +f 677 495 659 +f 756 570 641 +f 695 516 424 +f 724 705 587 +f 763 587 638 +f 710 534 669 +f 749 403 748 +f 736 452 699 +f 752 655 580 +f 801 621 642 +f 724 570 705 +f 736 523 452 +f 755 634 437 +f 783 427 518 +f 702 440 439 +f 716 589 708 +f 681 539 670 +f 797 626 547 +f 775 684 582 +f 754 581 647 +f 700 521 446 +f 759 662 585 +f 788 564 658 +f 747 593 710 +f 687 533 643 +f 715 470 469 +f 712 680 605 +f 755 436 627 +f 735 407 406 +f 719 585 662 +f 802 423 515 +f 792 596 636 +f 773 495 677 +f 739 461 460 +f 707 490 527 +f 706 463 462 +f 731 479 478 +f 715 469 639 +f 788 733 586 +f 799 604 635 +f 727 573 697 +f 795 454 672 +f 750 534 710 +f 751 587 705 +f 757 629 501 +f 765 704 594 +f 703 653 553 +f 707 527 692 +f 795 639 455 +f 717 447 660 +f 723 649 550 +f 795 672 715 +f 772 571 649 +f 741 686 466 +f 780 537 671 +f 729 554 662 +f 750 710 593 +f 658 657 503 +f 699 473 472 +f 744 538 649 +f 803 666 581 +f 725 651 412 +f 714 570 676 +f 768 516 695 +f 727 537 679 +f 769 478 477 +f 750 703 576 +f 750 593 703 +f 796 581 754 +f 791 512 418 +f 729 655 554 +f 702 628 440 +f 736 689 523 +f 712 564 680 +f 801 642 433 +f 729 580 655 +f 765 545 704 +f 714 676 579 +f 803 543 666 +f 728 726 591 +f 719 646 540 +f 733 696 586 +f 770 552 648 +f 780 679 537 +f 728 567 726 +f 741 466 465 +f 802 515 654 +f 717 713 447 +f 710 669 561 +f 776 476 613 +f 769 731 478 +f 757 500 630 +f 739 573 665 +f 737 648 542 +f 768 695 599 +f 741 565 686 +f 758 592 690 +f 739 665 461 +f 711 678 561 +f 772 649 538 +f 770 656 552 +f 794 464 463 +f 715 672 470 +f 755 437 436 +f 771 690 592 +f 752 529 496 +f 761 522 449 +f 778 575 660 +f 770 569 656 +f 763 525 474 +f 786 468 467 +f 760 654 610 +f 761 676 522 +f 714 541 705 +f 802 721 423 +f 768 425 516 +f 799 635 416 +f 774 518 426 +f 761 579 676 +f 727 679 562 +f 767 578 632 +f 792 636 683 +f 795 455 454 +f 745 458 664 +f 766 485 484 +f 742 571 643 +f 738 448 713 +f 777 629 547 +f 748 510 687 +f 781 482 614 +f 790 456 684 +f 779 671 537 +f 714 705 570 +f 717 574 713 +f 731 707 479 +f 789 583 722 +f 744 649 723 +f 771 506 690 +f 731 490 707 +f 772 643 571 +f 788 658 503 +f 774 426 674 +f 756 676 570 +f 800 760 441 +f 784 430 685 +f 791 675 575 +f 791 418 675 +f 749 748 577 +f 738 713 574 +f 732 543 708 +f 802 654 584 +f 768 682 425 +f 774 674 600 +f 784 685 588 +f 790 684 601 +f 732 708 589 +f 758 690 411 +f 745 650 459 +f 791 740 512 +f 782 716 544 +f 725 690 506 +f 804 596 732 +f 768 599 682 +f 786 686 595 +f 803 796 617 +f 793 641 473 +f 786 467 686 +f 780 565 679 +f 777 696 629 +f 792 683 556 +f 803 581 796 +f 763 474 724 +f 749 637 404 +f 782 589 716 +f 778 521 700 +f 776 566 701 +f 764 599 695 +f 778 700 575 +f 785 721 572 +f 736 699 472 +f 770 737 569 +f 770 648 737 +f 763 724 587 +f 764 695 603 +f 776 701 476 +f 777 586 696 +f 785 423 721 +f 794 463 706 +f 743 571 742 +f 765 734 590 +f 744 723 568 +f 765 594 734 +f 798 698 572 +f 793 473 699 +f 781 614 722 +f 781 722 583 +f 748 403 510 +f 793 699 451 +f 783 518 774 +f 795 715 639 +f 797 547 762 +f 783 774 600 +f 791 575 740 +f 804 732 589 +f 748 687 577 +f 802 584 721 +f 788 503 733 +f 797 762 611 +f 749 404 403 +f 713 448 447 +f 743 509 508 +f 743 742 509 +f 735 720 408 +f 612 418 417 +f 609 420 419 +f 785 424 423 +f 785 603 424 +f 633 493 492 +f 651 506 505 +f 478 76 75 +f 75 477 478 +f 479 77 76 +f 76 478 479 +f 480 78 77 +f 77 479 480 +f 481 79 78 +f 78 480 481 +f 482 80 79 +f 79 481 482 +f 483 81 80 +f 80 482 483 +f 484 82 81 +f 81 483 484 +f 485 83 82 +f 82 484 485 +f 486 84 83 +f 83 485 486 +f 487 85 84 +f 84 486 487 +f 488 86 85 +f 85 487 488 +f 526 124 86 +f 86 488 526 +f 489 87 124 +f 124 526 489 +f 527 125 87 +f 87 489 527 +f 490 88 125 +f 125 527 490 +f 491 89 88 +f 88 490 491 +f 492 90 89 +f 89 491 492 +f 493 91 90 +f 90 492 493 +f 528 126 91 +f 91 493 528 +f 494 92 126 +f 126 528 494 +f 495 93 92 +f 92 494 495 +f 496 94 93 +f 93 495 496 +f 529 127 94 +f 94 496 529 +f 497 95 127 +f 127 529 497 +f 498 96 95 +f 95 497 498 +f 499 97 96 +f 96 498 499 +f 500 98 97 +f 97 499 500 +f 501 99 98 +f 98 500 501 +f 530 128 99 +f 99 501 530 +f 502 100 128 +f 128 530 502 +f 503 101 100 +f 100 502 503 +f 504 102 101 +f 101 503 504 +f 531 129 102 +f 102 504 531 +f 505 103 129 +f 129 531 505 +f 506 104 103 +f 103 505 506 +f 507 105 104 +f 104 506 507 +f 532 130 105 +f 105 507 532 +f 508 106 130 +f 130 532 508 +f 509 107 106 +f 106 508 509 +f 533 131 107 +f 107 509 533 +f 510 108 131 +f 131 533 510 +f 403 1 108 +f 108 510 403 +f 404 2 1 +f 1 403 404 +f 405 3 2 +f 2 404 405 +f 406 4 3 +f 3 405 406 +f 407 5 4 +f 4 406 407 +f 408 6 5 +f 5 407 408 +f 409 7 6 +f 6 408 409 +f 410 8 7 +f 7 409 410 +f 411 9 8 +f 8 410 411 +f 412 10 9 +f 9 411 412 +f 511 109 10 +f 10 412 511 +f 413 11 109 +f 109 511 413 +f 414 12 11 +f 11 413 414 +f 415 13 12 +f 12 414 415 +f 416 14 13 +f 13 415 416 +f 417 15 14 +f 14 416 417 +f 418 16 15 +f 15 417 418 +f 512 110 16 +f 16 418 512 +f 419 17 110 +f 110 512 419 +f 420 18 17 +f 17 419 420 +f 513 111 18 +f 18 420 513 +f 421 19 111 +f 111 513 421 +f 514 112 19 +f 19 421 514 +f 422 20 112 +f 112 514 422 +f 515 113 20 +f 20 422 515 +f 423 21 113 +f 113 515 423 +f 424 22 21 +f 21 423 424 +f 516 114 22 +f 22 424 516 +f 425 23 114 +f 114 516 425 +f 517 115 23 +f 23 425 517 +f 426 24 115 +f 115 517 426 +f 518 116 24 +f 24 426 518 +f 427 25 116 +f 116 518 427 +f 519 117 25 +f 25 427 519 +f 428 26 117 +f 117 519 428 +f 429 27 26 +f 26 428 429 +f 430 28 27 +f 27 429 430 +f 431 29 28 +f 28 430 431 +f 520 118 29 +f 29 431 520 +f 432 30 118 +f 118 520 432 +f 433 31 30 +f 30 432 433 +f 434 32 31 +f 31 433 434 +f 435 33 32 +f 32 434 435 +f 436 34 33 +f 33 435 436 +f 437 35 34 +f 34 436 437 +f 438 36 35 +f 35 437 438 +f 439 37 36 +f 36 438 439 +f 440 38 37 +f 37 439 440 +f 441 39 38 +f 38 440 441 +f 442 40 39 +f 39 441 442 +f 443 41 40 +f 40 442 443 +f 444 42 41 +f 41 443 444 +f 445 43 42 +f 42 444 445 +f 446 44 43 +f 43 445 446 +f 521 119 44 +f 44 446 521 +f 447 45 119 +f 119 521 447 +f 448 46 45 +f 45 447 448 +f 449 47 46 +f 46 448 449 +f 522 120 47 +f 47 449 522 +f 450 48 120 +f 120 522 450 +f 451 49 48 +f 48 450 451 +f 452 50 49 +f 49 451 452 +f 523 121 50 +f 50 452 523 +f 453 51 121 +f 121 523 453 +f 454 52 51 +f 51 453 454 +f 455 53 52 +f 52 454 455 +f 456 54 53 +f 53 455 456 +f 457 55 54 +f 54 456 457 +f 524 122 55 +f 55 457 524 +f 458 56 122 +f 122 524 458 +f 459 57 56 +f 56 458 459 +f 460 58 57 +f 57 459 460 +f 461 59 58 +f 58 460 461 +f 462 60 59 +f 59 461 462 +f 463 61 60 +f 60 462 463 +f 464 62 61 +f 61 463 464 +f 465 63 62 +f 62 464 465 +f 466 64 63 +f 63 465 466 +f 467 65 64 +f 64 466 467 +f 468 66 65 +f 65 467 468 +f 469 67 66 +f 66 468 469 +f 470 68 67 +f 67 469 470 +f 471 69 68 +f 68 470 471 +f 472 70 69 +f 69 471 472 +f 473 71 70 +f 70 472 473 +f 474 72 71 +f 71 473 474 +f 525 123 72 +f 72 474 525 +f 475 73 123 +f 123 525 475 +f 476 74 73 +f 73 475 476 +f 477 75 74 +f 74 476 477 diff --git a/share/mesh/SOFA_volume.vtk b/share/mesh/SOFA_volume.vtk new file mode 100644 index 00000000000..a8154f93049 --- /dev/null +++ b/share/mesh/SOFA_volume.vtk @@ -0,0 +1,27110 @@ +# vtk DataFile Version 2.0 +SOFA Exported Mesh file +ASCII +DATASET UNSTRUCTURED_GRID +POINTS 959 float +-62.9340105 0.238680527 0.0726657012 +-60.8621492 0.343320431 6.53189141 +-64.1565509 0.377105165 -6.28200574 +-61.9997025 0.619668927 -10 +-68.2981047 0.846041041 -8.99210949 +-69.8279696 1.01926313 -3.61391911 +-70.4142073 1.20678962 3.38779665 +-58.1236573 1.21335628 -3.60133154 +-57.8310204 1.30632884 -8.39389041 +-72.2277481 2.13666189 -8.00040902 +-53.6074808 2.64817356 2.72361783 +-53.1820512 2.78333518 -4.21780712 +-75.61466 3.87326212 8.72558373 +-67.778393 3.9123025 10 +-50.9757007 3.98429226 -10 +-49.2646865 4.02790625 -5.43068725 +-54.6665053 4.02831804 -10 +-76.1498914 4.1476959 -8.37174522 +-70.9945718 4.41700682 -10 +-76.8207192 4.49165513 -3.42225543 +-51.6954964 5.10071125 10 +-78.183835 5.19057716 2.3567598 +-65.8742461 5.26722757 -10 +-60.4341048 5.74126208 -10 +-46.5440538 6.20531313 -8.06185262 +-46.5409692 6.20848002 -1.84011218 +-80.34929 6.65793985 7.98010566 +-80.903891 7.35025945 -8.96111781 +-49.5011473 7.46247027 -10 +-45.293714 7.48901183 3.61845162 +-74.9589502 8.07404677 -10 +-55.5190286 8.33902969 -10 +-60.8403856 8.60539167 10 +-82.0418856 8.77084098 -3.18644186 +-45.0227049 9.55502208 -10 +-82.9743959 9.93491243 3.95290225 +-61.2504459 10.2672477 -0.278628941 +-42.3969448 10.4630665 -5.76765758 +-77.3970565 11.694885 10 +-84.6447581 12.0200592 9.41056195 +-69.4569699 12.3219599 -10 +-61.5271028 12.643136 -10 +-77.6737262 12.6685156 -10 +-70.2852753 12.8745076 10 +-40.1108257 12.9899044 -9.4454898 +-85.9892785 13.698451 -5.44048445 +-86.341303 14.1378903 0.721743989 +-52.8313015 14.1978674 -10 +-39.7362619 14.2643802 -0.198302551 +-84.6147828 14.2677401 -10 +-53.1740532 14.3921817 10 +-41.1040316 14.4410184 10 +-86.7838503 14.690331 6.66838572 +-43.7763445 15.5377622 -10 +-73.3097012 15.8105291 0.131556283 +-84.8521212 16.1025483 10 +-87.5300635 17.4692424 -8.71911382 +-79.3248663 17.5215179 10 +-38.6910127 17.8209026 -6.93990588 +-78.5888549 18.6962211 -10 +-87.9674966 19.2661124 8.84658698 +-47.2483416 20.0283768 -10 +-88.2794806 20.5476675 -4.19508717 +-65.4742267 20.69585 -10 +-62.7370243 21.4216675 10 +-88.6414794 22.0346714 2.94430915 +-84.3107888 22.4448899 -10 +-56.6362104 22.6469482 -10 +-37.1941065 22.9142148 -1.32443532 +-50.528741 24.3625936 10 +-83.1988424 24.3643531 10 +-89.2285388 24.4461704 9.12889899 +-73.0729908 24.5978683 -10 +-36.5991256 24.9386728 8.9243724 +-39.8604999 25.0496921 -10 +-74.0953922 25.0528469 10 +-89.5424657 25.7357067 -9.00195313 +-49.6757555 28.0852139 -10 +-89.3010136 28.8071406 -3.35000149 +-81.7654656 29.4854301 -10 +-89.0489577 30.0852178 5.47595139 +-36.8300891 30.2115891 -6.33138301 +-36.891107 30.7000205 1.93306844 +-44.9376755 30.9865912 10 +-62.88132 31.8097941 -10 +-43.9753883 31.9597873 -10 +-82.8427257 32.4732641 10 +-37.121061 32.5407385 8.68640426 +-46.7367021 32.8055134 -0.748682708 +-66.3555559 33.0538588 10 +-54.9769072 34.5171697 10 +-40.4208855 34.939324 -10 +-53.3616238 35.670692 -10 +-38.6403912 36.225099 -2.23876322 +-87.8209528 36.3119509 -1.0827908 +-73.5492282 36.3508886 -10 +-38.9003181 36.6697252 -7.83778792 +-40.3403639 37.0368639 10 +-75.8634462 37.9871186 10 +-45.8551501 38.074289 -10 +-84.9537316 38.2857066 -10 +-40.4482036 39.3175092 3.57843379 +-40.8330782 39.7501424 -10 +-86.1868189 40.0024614 7.93025611 +-47.5488815 40.1108083 10 +-55.0515043 40.1749969 0.0700446927 +-41.774517 41.5862763 -5.85248083 +-60.9343217 41.6466603 10 +-41.9730251 41.9258406 8.68085547 +-65.262679 41.9503113 -10 +-50.4459353 41.9740966 -10 +-44.3983028 42.9907075 -10 +-56.798216 43.1460685 -10 +-43.3180982 44.2266976 -0.561040314 +-83.9459522 44.4041183 2.83667253 +-68.6228853 44.6301953 -0.348412299 +-51.8754402 44.7738608 10 +-79.6797708 45.5632755 10 +-70.1974496 45.6298417 10 +-77.3833272 45.9537616 -10 +-44.7428644 45.9615522 -6.84398364 +-173.258062 46.1933102 10 +-84.1326518 46.2852227 -3.11918453 +-175.930298 46.3210367 4.41961605 +-175.997426 46.3326479 -3.11769523 +-176.094134 46.3493756 8.71363536 +-172.474491 46.3618964 6.7767965 +-45.3206517 46.4222364 7.64549644 +-171.209881 46.852343 0.980656741 +-179.207166 46.8878412 -8.65075711 +-174.121667 46.9822641 -10 +-48.2617486 47.0164286 -10 +-179.951333 47.0165608 3.09769912 +-170.314515 47.1995876 -4.73529869 +-183.289481 47.593965 -1.13233898 +-171.460098 47.7222174 10 +-183.547666 47.7337092 -7.06964608 +-83.7829831 47.7771445 -10 +-179.551808 48.0560962 10 +-70.8339521 48.1177558 -10 +-61.6497518 48.1580616 -10 +-167.834557 48.1613751 -8.53877077 +-167.777993 48.183312 5.02296587 +-168.982856 48.6855081 10 +-48.248165 48.7564159 2.30193864 +-48.3759814 48.8583271 -3.37981938 +-63.2318933 49.152167 10 +-55.6051983 49.2006518 -10 +-55.8531133 49.2689286 10 +-185.438566 49.4035523 6.63439302 +-175.464045 49.4285925 10 +-164.950402 50.0679896 -3.86003686 +-50.5567996 50.350737 7.79831141 +-84.6793053 50.4148455 10 +-164.598413 50.5112721 8.05494163 +-51.20639 50.5924949 -7.64733077 +-66.1292081 50.7308781 -10 +-171.203116 50.9418101 -10 +-187.370476 51.1096113 -3.44231215 +-163.795337 51.5226379 1.68672975 +-165.638188 51.8495522 -10 +-182.54069 51.898468 -10 +-55.2163948 52.0848975 2.12426221 +-55.3040591 52.1175235 -4.26918387 +-181.899626 52.3985949 10 +-62.4294843 52.6019924 -10 +-85.8102466 52.6709576 -3.83451627 +-85.8398483 52.7836362 4.15221977 +-85.8425447 52.7938999 -9.87865718 +-76.2088247 52.9809496 10 +-58.4510213 53.0804295 -9.38732716 +-188.633848 53.2080959 -10 +-59.5579747 53.2245546 7.64431274 +-60.8875099 53.3976598 -6.31612275 +-62.6521084 53.6274102 3.99494958 +-62.7693012 53.6426687 -2.11809852 +-170.672683 53.821916 10 +-175.842231 53.8748308 10 +-161.871353 53.9456372 -8.86961219 +-65.5459102 54.0041826 -7.95521373 +-176.38002 54.1109668 -10 +-187.741618 54.1906249 10 +-189.889888 54.3262872 3.51036383 +-68.5578723 54.4940363 10 +-69.1786698 54.7417663 -10 +-80.7991039 55.0163548 -10 +-160.829972 55.2571169 7.27751451 +-190.249658 55.2671743 -2.26088109 +-83.1000136 55.8241526 10 +-75.0727404 55.8727849 -10 +-160.268766 55.9638795 -4.2800623 +-165.568732 56.1203949 10 +-67.9940658 56.2547172 2.81409289 +-190.630364 56.2628149 -7.36804949 +-68.4947659 56.8567514 -4.3304966 +-169.706854 57.2038771 -10 +-87.0501244 57.3779949 -7.45994265 +-173.039676 57.600155 0.0860111392 +-186.410411 58.3151934 -10 +-159.747081 58.5527838 0.552937842 +-162.161473 58.5900663 -10 +-87.5572111 58.768182 5.00883297 +-181.458616 58.7821555 10 +-87.6685001 59.0732827 9.47467287 +-190.636631 59.3296593 -10 +-180.831134 59.4499253 -10 +-70.6962069 59.5037306 -8.35379553 +-87.850576 59.5724467 -0.838445627 +-190.530587 59.7974716 10 +-192.12241 60.1648876 -2.24539238 +-192.234131 60.4591061 3.71861502 +-192.228215 60.6183285 -7.78961498 +-174.178451 60.8962827 10 +-161.091396 61.5284369 10 +-72.3577424 61.6654881 -0.195204336 +-72.406262 61.7398516 7.39561754 +-83.0154175 61.7532523 10 +-77.7334279 61.7735209 10 +-85.0163928 62.0523543 -10 +-183.345818 62.1609099 0.502213891 +-189.143613 62.3121969 -10 +-185.594693 62.3822509 10 +-192.162513 62.3867772 7.72852621 +-78.6322668 62.3950001 -10 +-189.980643 63.1699068 10 +-158.946056 63.2464209 4.27071153 +-192.038927 63.3060697 -9.80814067 +-158.929644 63.3425874 -7.43629237 +-191.960614 63.5203302 -5.34152523 +-166.417445 63.5918833 -10 +-73.6480078 63.6430111 -7.29344007 +-89.4996933 64.09353 6.57648883 +-87.4619885 64.114228 10 +-167.688465 64.4627621 10 +-174.590502 64.489496 -10 +-89.7472712 64.772269 -6.17165997 +-185.368838 64.8305994 -10 +-190.60302 64.8368303 -10 +-191.262037 65.4316056 4.39177894 +-191.232929 65.5112456 -0.880878704 +-191.127159 65.8006267 9.81403883 +-180.343833 66.8253422 10 +-190.705332 66.9547282 -5.28319486 +-77.6460214 67.2369608 -10 +-186.759586 67.3997033 10 +-90.7217223 67.4437435 2.23017346 +-159.529596 67.4611685 -2.08019009 +-190.431703 67.7033648 -9.68498076 +-76.3941068 68.0077025 -4.70970434 +-90.5774436 68.2130867 10 +-159.682933 68.4043891 7.5281324 +-76.6819705 68.5431055 1.68118947 +-87.5158102 68.5774254 -10 +-83.84074 68.8167917 10 +-189.83858 69.3261229 7.30925702 +-82.3205234 69.5851567 -10 +-180.941403 69.651569 -10 +-162.612066 70.4744179 -10 +-77.755403 70.5396026 8.42839651 +-174.77609 70.5728225 10 +-189.341799 70.6852963 2.74141306 +-186.996956 70.7003299 -10 +-77.9682946 70.9355635 -9.79859329 +-188.952878 71.7493663 -6.27861092 +-188.351594 71.7810967 10 +-166.95933 72.1618705 10 +-92.7863327 72.2972469 -7.81158295 +-92.8660757 72.476491 -1.42246762 +-158.6862 73.1709705 10 +-93.1785186 73.1787911 7.38928803 +-187.458923 73.3867004 -1.72586736 +-183.086818 73.625144 10 +-88.9067797 73.7446087 10 +-79.5152314 73.81274 -6.56749811 +-169.778001 73.9408147 -10 +-157.182655 74.125296 -1.20121753 +-89.5929723 75.2906181 -10 +-184.653992 75.3133742 4.2476868 +-83.2235018 75.6101043 -10 +-184.115978 75.68293 -8.68904136 +-80.7528792 76.1146639 -2.16768393 +-176.5286 76.3058485 -10 +-83.3560122 76.5491127 10 +-81.0404504 76.6495229 4.85688713 +-172.781503 76.7359802 10 +-155.676534 76.7402668 -8.42209103 +-178.300731 76.8491032 10 +-95.2249535 77.7787097 3.74641693 +-154.970964 77.965299 3.77544845 +-180.482677 78.1285264 -1.94190739 +-180.295612 78.1644639 6.08064959 +-164.932508 78.3556036 10 +-177.710655 78.661067 -7.62327676 +-93.4110473 78.8988318 10 +-162.91814 78.915711 -10 +-174.213277 79.3329578 4.40186518 +-154.178436 79.3413098 -8.87172785 +-94.8465056 79.6778535 -10 +-172.321279 79.6964346 -1.82791272 +-172.305846 79.6993994 -9.30744024 +-96.2104405 79.9938596 -3.45598606 +-159.066535 80.0771446 10 +-83.7058635 80.4182923 -10 +-88.75081 80.6925687 -10 +-153.367451 80.7493669 8.64958331 +-169.510253 80.754337 8.6059412 +-89.1198819 81.3440575 10 +-152.992619 81.4001607 -3.0202489 +-168.669067 81.4183984 -9.09693894 +-97.2721881 82.036151 8.30634128 +-83.7545019 82.1350618 0.789326288 +-83.8133659 82.2719653 -6.02062789 +-151.997016 82.7106091 -8.71926877 +-84.4299544 83.1391814 10 +-158.223672 83.2193022 3.32142203 +-166.315138 83.276674 9.53169431 +-166.003143 83.5229742 -5.41213223 +-165.907306 83.5986308 0.461085711 +-165.702108 83.7606214 5.19169272 +-158.36056 84.0511033 -10 +-98.4041894 84.2044885 -8.59003889 +-98.420324 84.2353941 2.77847717 +-162.578487 84.7249323 10 +-91.708671 84.9915926 -10 +-150.149563 85.019654 2.78728835 +-93.941783 85.1125666 10 +-86.4309955 85.680775 -10 +-158.480659 85.8023615 10 +-148.709729 86.8192347 8.45042827 +-87.0012508 86.8773608 10 +-99.9273201 87.1220302 8.3440159 +-85.9809702 87.3132952 3.89310711 +-100.139287 87.5280506 -5.59824681 +-154.286869 87.6120548 10 +-161.388963 87.655756 -6.80879764 +-147.979127 87.7323794 -3.98390177 +-161.033349 88.0112408 7.28675072 +-99.0891928 88.0878524 -10 +-94.6830479 88.1149461 -10 +-86.3826952 88.2476117 -4.38267543 +-100.798675 88.6368696 -1.23931708 +-160.300891 88.7434327 1.28348563 +-151.853494 89.0538805 -10 +-91.8218817 89.4159008 10 +-102.054422 90.6255065 -9.20681583 +-145.511653 90.8163593 3.00011477 +-156.256196 90.9941704 -10 +-157.987898 91.0555848 8.40733764 +-97.5781761 91.2306691 10 +-150.115263 91.4193833 10 +-102.808363 91.8194697 8.79635477 +-102.823435 91.8433376 3.56482026 +-144.233838 91.9210928 -8.1940019 +-89.0643696 91.9318406 -10 +-87.9874513 91.9798912 8.43020983 +-98.1890216 92.0784045 -10 +-143.957265 92.160156 8.36361286 +-154.434603 92.7308926 10 +-151.467507 93.0846805 -10 +-155.99508 93.168033 -2.21164085 +-155.937124 93.2350684 4.98797646 +-142.648806 93.2911593 -2.11265166 +-103.900819 93.5495146 -6.26444935 +-149.078574 93.6331401 -3.17124192 +-147.131803 93.6646408 -10 +-88.8797466 94.0551568 2.95242962 +-88.9437544 94.2040237 -2.7996719 +-93.8523468 94.2487441 -10 +-154.761989 94.5943139 -7.60508197 +-94.6785992 95.5227982 10 +-139.86077 95.7010747 4.88446038 +-148.893689 95.7017406 10 +-100.080845 95.7072565 -10 +-153.374315 95.7327257 10 +-144.689219 95.7520883 10 +-105.472753 96.0388733 -1.28538803 +-104.666002 96.3723501 -10 +-139.448091 96.8396483 10 +-102.370504 96.8775578 10 +-138.338862 97.0165784 -5.3020549 +-108.429594 97.0427161 4.72758798 +-110.034744 97.0839403 -6.16669814 +-90.0110017 97.1200866 9.01678724 +-114.977479 97.210882 -0.987650274 +-115.506286 97.224463 6.03459738 +-152.466744 97.2491597 2.37823891 +-97.6159752 97.3206478 -1.22465467 +-152.282296 97.4625058 -8.55096118 +-119.779724 97.5046069 -5.06087286 +-121.135513 97.5998004 -9.1945078 +-121.24987 97.6526219 10 +-152.090189 97.6847099 8.72063502 +-90.1832776 97.6938518 -7.91968273 +-123.519977 97.7672198 1.03321648 +-148.8445 97.8437115 -10 +-125.220763 97.8866364 -9.49755182 +-126.423187 98.0900399 -5.42991373 +-151.723515 98.1088323 -4.01401041 +-115.37014 98.2400156 -10 +-140.190493 98.4133342 -10 +-136.623418 98.4993693 1.16700984 +-95.9622163 98.843818 -10 +-109.567343 98.9477022 10 +-130.57735 99.1741389 3.9642615 +-131.871175 99.5117842 -3.82141244 +-110.41073 99.575666 -10 +-128.655726 99.7972247 10 +-148.648384 99.8323199 10 +-128.332912 99.9400722 -10 +-144.478589 100.358262 -10 +-91.0485198 100.575542 2.64678833 +-91.0717647 100.65296 9.16523976 +-101.095383 100.656671 -10 +-133.765218 101.084179 -10 +-142.550681 101.110899 10 +-149.484411 101.123288 5.55725002 +-149.290413 101.49141 -8.14082912 +-136.805512 101.75806 10 +-98.0949774 101.782918 10 +-93.5658092 101.838835 -10 +-116.871115 102.165702 10 +-91.5889839 102.375559 -4.2949372 +-124.53914 102.663537 -10 +-148.606243 102.789662 -3.29717502 +-106.914747 102.93616 -10 +-148.481171 103.026993 1.43010477 +-146.971621 103.24877 10 +-92.1319595 104.18394 8.63789346 +-139.7352 104.339136 -1.31004424 +-119.194091 104.852079 -10 +-106.944619 104.974429 10 +-147.297649 105.272795 -8.59135557 +-142.742171 105.674301 -10 +-137.140101 106.052381 -10 +-130.163565 106.846323 -10 +-91.9835783 106.873035 4.08227484 +-92.6412639 107.485133 -10 +-101.08789 107.516248 -10 +-91.458961 107.571228 -0.20991377 +-127.627033 107.59368 10 +-146.060028 107.621253 1.58055245 +-103.568204 107.639137 0.0097468279 +-122.348694 107.903004 -0.259715515 +-145.75765 108.195033 7.62570885 +-90.9378514 108.264753 8.5591931 +-111.778613 108.569932 -10 +-145.811058 108.942276 -5.0864221 +-138.743416 109.003904 10 +-100.807068 109.676125 10 +-90.5262966 109.695998 -10 +-89.6368165 109.996252 -4.88981477 +-145.49453 110.903897 -10 +-115.882988 111.229706 10 +-88.1362786 111.993261 8.25564758 +-140.746456 112.373417 -10 +-87.7202177 112.54698 -9.03386027 +-148.299119 112.706246 0.642448042 +-95.7790241 112.815974 -10 +-87.4457245 112.912293 1.87613242 +-125.29943 113.372674 -10 +-135.155598 113.991629 0.179605273 +-149.309948 114.235441 -7.45601643 +-145.83074 115.190626 10 +-134.208399 115.221367 -10 +-94.5814104 115.985178 10 +-87.6174703 116.015239 10 +-85.1443689 117.024162 -5.22674161 +-117.962264 117.175813 -10 +-127.216619 117.453118 10 +-151.271296 117.8818 2.45997872 +-136.458737 118.299249 10 +-97.0199516 118.537811 -10 +-84.341668 118.572118 2.97736605 +-104.987944 118.682795 10 +-151.616417 118.738246 -9.0351437 +-107.655208 118.938113 -10 +-151.717216 118.988387 -3.67432615 +-84.032241 119.168828 8.42779445 +-151.924865 119.503683 7.12264525 +-143.017204 119.88631 -10 +-87.5355909 121.288586 -10 +-87.6462705 122.076774 10 +-95.2202144 122.141231 0.226104572 +-118.169849 122.757925 10 +-142.894729 123.285042 10 +-81.3500895 124.201328 7.26736842 +-81.347595 124.205933 -3.06224083 +-150.802257 124.46164 -10 +-154.368784 125.568458 -2.98255984 +-154.37644 125.587843 6.67168137 +-92.871082 125.900382 10 +-132.040075 126.319191 -10 +-149.562644 126.484199 10 +-22.0352279 127.497713 -4.86213429 +-98.9535859 127.541196 -10 +-21.1016634 127.627874 6.69300343 +-120.288828 127.732419 -10 +-24.1920593 127.84338 1.15581761 +-24.7250693 128.023999 7.79952109 +-17.998543 128.060526 0.451348723 +-19.0736549 128.175943 10 +-16.4673272 128.274015 5.7365399 +-142.9183 128.474655 -10 +-14.4250813 128.558755 -7.24796046 +-14.1643087 128.595113 -3.24061207 +-154.39891 128.644038 -10 +-12.5227979 128.82398 7.58243708 +-27.5679782 128.987365 4.86451278 +-27.722941 129.039877 -8.99554285 +-108.756505 129.120079 10 +-11.7059677 129.180977 1.93876611 +-82.1843945 129.195221 -10 +-15.4610985 129.326284 10 +-29.0053301 129.474435 -4.74654398 +-22.2161005 129.553874 10 +-22.3108394 129.907358 -10 +-129.790236 129.973208 10 +-27.4670083 129.999112 10 +-31.0414745 130.164416 7.25846895 +-31.1548811 130.202845 0.822271168 +-16.8406077 130.42743 -10 +-155.014875 130.516292 2.89838288 +-77.9212759 130.531393 3.09146543 +-80.573377 130.569865 10 +-9.47268676 130.787784 -8.42883666 +-12.6412806 130.920085 -10 +-9.16286626 131.010695 -4.16578547 +-8.83973401 131.243183 6.54376865 +-30.9509521 131.591355 -10 +-18.9668541 131.797154 10 +-153.93677 131.836779 10 +-10.6899707 131.916594 10 +-33.3812931 132.128518 -7.45128326 +-139.79821 132.284186 10 +-7.15719759 132.453739 1.41452447 +-7.09429135 132.498999 -8.84525441 +-33.9622681 132.6576 6.84417862 +-75.5773549 132.698065 -2.42655986 +-34.0908338 132.774682 -3.18270051 +-110.008768 132.776636 -10 +-6.68273067 132.795109 9.14453432 +-155.333223 132.973806 -9.10490695 +-74.3297429 133.042777 7.70204483 +-74.1336495 133.096957 -9.30362235 +-98.8438482 133.155877 10 +-24.7425407 133.553528 10 +-155.435169 133.815087 -2.44126798 +-14.8614013 133.877176 10 +-5.25668386 133.887853 -7.04387561 +-90.5194956 133.930759 -10 +-5.09332382 134.19632 -2.67605156 +-70.0256238 134.231994 8.06032168 +-35.4695652 134.370978 -10 +-147.387402 134.463705 -10 +-31.1209629 134.842964 10 +-88.513897 134.90692 10 +-67.5725428 134.909774 3.07500037 +-4.70174839 134.935717 5.2394171 +-68.2934845 135.041635 -10 +-145.933811 135.05708 0.696086993 +-14.6967762 135.073212 -10 +-147.607234 135.197688 10 +-36.9608329 135.388332 2.87337545 +-65.4769958 135.488768 -3.18240702 +-37.0922201 135.507983 -6.8123733 +-137.541049 135.645673 -10 +-79.163286 135.93636 10 +-133.677161 135.966717 -0.067837189 +-155.012239 136.025109 -7.98339504 +-37.8879535 136.232642 9.03718969 +-23.5195229 136.265238 -10 +-5.52710415 136.282244 10 +-154.946272 136.369819 6.07829658 +-66.1911841 136.382907 10 +-30.6501739 136.547428 -10 +-118.557634 136.621413 10 +-9.59653855 136.664613 -10 +-4.93046745 136.69752 -10 +-57.9741434 136.893741 2.47178605 +-63.8274325 136.907022 -10 +-57.7760515 136.922791 -6.84151146 +-39.737772 137.085774 -2.05741995 +-72.6814061 137.202278 10 +-10.7129831 137.231016 10 +-19.9038166 137.240547 10 +-45.5024998 137.366981 5.26336559 +-45.7786968 137.380454 -2.43914166 +-46.3270164 137.407201 -8.00478212 +-53.0599943 137.614407 9.0227439 +-39.4536165 137.639732 -10 +-51.8901047 137.678572 -1.90482427 +-60.5494818 137.704744 10 +-151.355925 137.838723 -10 +-25.3839385 137.844873 0.978207179 +-3.13142442 137.900902 -6.3535054 +-2.9821194 138.182829 0.379890479 +-124.026465 138.77426 -10 +-2.53859084 139.020327 6.05305334 +-35.712671 139.037868 -10 +-51.701559 139.138961 -10 +-79.554654 139.230595 -10 +-151.617367 139.45111 10 +-154.323658 139.623292 -5.12961656 +-143.23663 139.64598 10 +-134.851585 139.924569 10 +-70.6280465 140.031049 -10 +-100.192851 140.204707 -10 +-154.173732 140.406733 4.97703928 +-154.153821 140.510774 0.152675703 +-14.2452503 140.764695 -0.132167146 +-44.0340612 140.786444 10 +-75.3151907 140.802123 10 +-4.82504671 140.820247 10 +-15.24581 140.94692 -10 +-34.6049305 141.164971 10 +-33.5829217 141.204041 -1.9577231 +-44.316822 141.24156 -10 +-66.9095978 141.26168 10 +-25.3675397 141.268597 10 +-1.34076279 141.282142 -5.60887182 +-135.375113 141.449616 -10 +-153.965234 141.496239 -9.42696901 +-83.6040375 141.583609 10 +-63.2489841 141.58928 -10 +-1.02670929 141.875157 7.43363199 +-144.700574 141.90079 -10 +-57.2053729 142.044423 -10 +-149.453826 142.089375 -10 +-15.4696092 142.401807 10 +-106.940597 142.511882 10 +-153.287207 143.05381 8.17913057 +-56.345194 143.129203 10 +-6.58455093 143.132838 -10 +-152.117986 143.258447 -5.60896711 +-141.049357 143.33444 -10 +-29.274736 143.372986 -10 +-150.832561 143.483422 3.39215768 +-150.588893 143.526069 8.31827172 +-86.1552282 143.907925 -10 +-147.961601 143.985898 -3.44539822 +-126.742107 144.038609 10 +-51.0890542 144.326875 -10 +-0.535577106 144.382916 -0.138648926 +-145.06842 144.547598 2.75498066 +-144.696848 144.722947 8.28506493 +-74.0711153 144.761068 9.43668247 +-37.021929 144.792316 -10 +-74.4278904 144.820798 2.99813729 +-94.3475463 144.842399 10 +-70.9284677 144.877009 -7.04671732 +-49.2072964 145.052856 10 +-69.1403535 145.053501 0.0117436779 +-68.0693574 145.159211 7.14454907 +-111.050073 145.181271 -10 +-2.54173493 145.228909 10 +-20.7933311 145.343266 -10 +-9.13491379 145.432009 10 +-130.716552 145.565038 -10 +-0.495948489 145.606933 -7.78968512 +-79.343555 145.643765 6.67302029 +-63.0324242 145.760255 -2.99206592 +-142.433582 145.79101 -7.3212809 +-62.6267285 145.827367 -8.8650119 +-80.5168272 145.840191 -3.80676917 +-62.0853265 145.916928 6.63162457 +-142.122321 145.937898 -2.05905854 +-0.484874036 145.948991 4.95675188 +-137.871701 146.390177 -10 +-43.6732426 146.476683 -10 +-57.041336 146.751325 0.364719697 +-56.7334473 146.802258 -7.18617527 +-29.2866788 147.000775 10 +-55.1657324 147.061595 6.77870949 +-38.4562258 147.080683 10 +-139.462806 147.192955 8.99824512 +-139.149593 147.340764 3.89083394 +-51.0123417 147.986116 -8.19042852 +-95.9571955 148.147026 -10 +-50.1651605 148.175195 -2.24988711 +-49.0316479 148.428179 4.17505949 +-137.807456 148.467947 -6.1075532 +-83.4993299 148.860809 8.92182715 +-45.7573845 149.421963 -6.86331613 +-0.370149726 149.492502 8.23380381 +-8.72403209 149.630169 -10 +-44.4682876 149.82692 8.48076712 +-29.5290009 149.842948 0.0960971675 +-17.9454578 149.900353 10 +-136.342703 149.95534 -9.45325094 +-43.4548346 150.145286 0.470762937 +-120.055623 150.262836 -10 +-135.953978 150.350073 -0.2341669 +-3.87794275 150.399314 10 +-42.182089 150.545106 -8.17600684 +-0.33243567 150.657383 0.365499101 +-33.4063003 151.069519 -10 +-41.4969812 151.332473 6.76452431 +-132.65248 151.340776 -10 +-0.448904643 151.34287 -7.94812642 +-118.739411 151.346425 10 +-127.50513 151.374962 -10 +-134.776734 151.545513 7.87756619 +-10.0112341 151.836368 10 +-85.4585811 152.35503 2.00739386 +-25.4953958 152.376494 -10 +-33.1097335 152.531407 10 +-1.02921475 152.816395 6.01095038 +-133.330786 153.01381 -4.98441269 +-40.6390655 153.102625 -3.93949846 +-16.272758 153.222791 -10 +-88.009258 153.592586 -10 +-107.588158 153.622834 10 +-24.5336388 153.644465 10 +-40.053381 154.311078 8.67737777 +-98.0607964 154.397997 10 +-39.9994707 154.422312 -9.9375842 +-86.7899845 154.729517 -4.89028204 +-13.5735329 154.847839 -0.407298383 +-1.85206806 154.905787 -3.55966412 +-131.371417 155.019644 -8.42676126 +-90.0787635 155.098837 10 +-103.824457 155.163492 -10 +-39.6228992 155.199298 2.58915435 +-1.99747867 155.275014 9.85759238 +-6.37511234 156.07348 10 +-95.5950274 156.194645 -10 +-36.3996517 156.19885 10 +-130.706837 156.220392 2.5742836 +-2.45154963 156.427993 1.90490734 +-111.411725 156.519577 -10 +-3.4888874 156.681354 -10 +-35.9820403 156.970553 -10 +-125.861499 157.844943 -10 +-117.412472 157.926333 0.0977199044 +-38.2839351 157.962006 -7.02532682 +-30.6524584 157.985726 -10 +-8.9244636 158.131424 -10 +-11.7867833 158.150786 10 +-128.720699 158.346921 10 +-89.4268796 158.463213 5.20898514 +-3.25783896 158.475325 9.35578441 +-3.29341252 158.565653 5.59870978 +-129.16137 159.012705 -4.65758945 +-37.4833426 159.024839 5.75650066 +-37.4360418 159.083496 -1.62392617 +-31.0352516 159.239546 10 +-3.59088086 159.320986 -5.12836025 +-14.1721671 159.613682 -10 +-36.6880095 160.011119 9.60522072 +-90.7633835 160.054541 -8.41108876 +-4.14047266 160.112411 -9.51642157 +-119.865486 160.168752 -10 +-17.1762065 160.243738 10 +-5.2978594 160.877974 10 +-91.4988866 160.930278 -2.10312605 +-21.8656913 160.983411 -10 +-5.19518113 161.203049 -0.575958483 +-114.738714 161.301738 10 +-35.5729655 161.393867 -9.31450341 +-25.1401857 161.414488 10 +-94.5751368 161.942833 10 +-6.08084664 162.118885 -6.69993572 +-105.307548 162.196543 -0.442459223 +-121.565387 162.272567 10 +-26.3784788 162.39209 -10 +-96.1864379 162.458906 -10 +-6.45335098 162.504079 4.55941159 +-113.490401 162.672053 -10 +-101.404099 162.741122 10 +-34.4787883 162.750739 -5.89632477 +-126.873669 163.146067 6.84765461 +-34.068008 163.260141 2.74346971 +-33.8125019 163.53427 9.50461805 +-102.385099 163.603478 -10 +-126.641018 163.695999 -9.01407557 +-93.0731194 163.765164 3.12380628 +-107.471196 163.766883 10 +-16.7871819 163.993707 -10 +-7.94518838 164.046737 -8.4819356 +-126.480573 164.077234 -2.45293426 +-31.4107118 164.185187 -10 +-11.1114585 164.41208 -10 +-8.95074142 164.647824 8.55608378 +-9.16564865 164.764319 -3.23488736 +-119.253702 165.304104 -4.08279839 +-30.4199196 165.500645 -3.75477446 +-121.842361 165.540028 -10 +-29.8436214 165.834673 8.07306658 +-125.675365 165.990492 2.57454094 +-19.7754907 166.231022 10 +-13.2560359 166.253779 -10 +-107.851704 166.394414 -10 +-117.415251 166.67449 -10 +-13.0519349 166.870955 0.941427202 +-28.0093784 166.897819 1.55539458 +-13.3050285 167.008149 8.17985915 +-125.219287 167.074181 -6.9100898 +-92.7652546 167.273112 -8.08672476 +-14.5651935 167.302795 -5.45225752 +-25.9980289 167.401268 -7.46663994 +-25.9831837 167.403912 9.66245224 +-92.7475137 167.475259 7.36899991 +-96.2531705 167.53256 10 +-112.170959 167.60557 -10 +-23.5738286 167.833077 5.50166526 +-17.6867609 167.837512 4.9090059 +-18.9740346 168.058019 -9.02563661 +-21.4194367 168.216826 -2.21364807 +-96.7808578 168.369058 -10 +-92.6575539 168.500301 -3.02271966 +-123.987686 168.797895 -10 +-124.407361 169.003404 9.15661339 +-104.021746 169.071521 10 +-118.152541 169.18881 10 +-103.56487 169.286785 -10 +-111.178343 169.41152 10 +-115.078844 170.239211 -10 +-123.873992 170.270746 -2.08101067 +-123.64127 170.823718 -6.71843373 +-121.520177 171.172344 -9.33554273 +-121.445298 171.173758 3.90178233 +-119.798211 171.204868 -5.79934762 +-118.521097 171.22899 -9.03990167 +-118.136286 171.236258 -1.62391303 +-114.983726 171.295803 4.79094769 +-114.155496 171.311447 -6.26755196 +-104.389334 171.341412 5.99280162 +-107.693534 171.34511 -6.41022088 +-108.597687 171.346122 3.97471026 +-110.945122 171.348749 -1.42183092 +-111.153709 171.348982 -9.55346029 +-92.3192397 171.807111 2.60870073 +-102.824968 171.88637 -7.6245013 +-98.7090296 172.038436 -10 +-92.2520013 172.054196 -8.15497656 +-98.1418025 172.132733 10 +-102.695677 172.213194 -1.84768905 +-102.003814 173.13366 -10 +-91.7874496 173.761309 8.73027891 +-101.74362 174.619805 8.4677359 +-96.1146458 174.948592 -10 +-91.4303673 175.073498 -3.14491766 +-101.430029 175.412502 3.18316063 +-92.3600546 176.444848 -10 +-95.1473175 176.927041 10 +-100.679027 177.310884 -6.19753617 +-99.6764757 177.59521 10 +-90.639855 177.978436 4.68149162 +-90.4907948 178.526195 -7.84874417 +-93.2260553 179.621295 -10 +-98.1735837 179.720784 -10 +-99.5477718 180.170474 -0.0611601446 +-99.4975968 180.297306 5.27965725 +-89.7784953 180.390454 -1.5485897 +-89.6529815 180.711661 9.37666512 +-96.2645643 181.271559 10 +-98.907244 181.789601 8.81936735 +-89.579655 181.895389 -10 +-89.0047594 182.370549 -5.94963823 +-93.4664009 183.002166 10 +-95.1258598 183.294503 -10 +-98.2112769 183.548868 -3.76082504 +-88.3887174 183.947084 1.96920453 +-88.2978427 184.179645 6.98002011 +-97.7381296 184.74489 -8.21315358 +-91.3953372 184.789873 -10 +-87.9744576 185.007231 -8.86970955 +-97.4667938 185.430773 7.10808627 +-89.9991092 185.51952 10 +-96.8352076 187.635911 2.12277728 +-86.9336647 187.670761 -4.32541424 +-92.5714091 188.134412 -10 +-95.2367312 188.682081 10 +-86.4001438 189.036113 7.16279108 +-96.3238258 189.631797 -3.22122239 +-96.2798595 189.803395 -8.69772734 +-89.8571391 190.013227 10 +-85.7689433 190.651441 1.0923438 +-86.5225448 190.674275 -10 +-95.8619235 191.434569 7.01050963 +-84.5788693 192.997859 8.35457696 +-93.3424803 193.055659 10 +-92.3029057 193.279673 -10 +-90.2004973 193.304824 3.63775972 +-88.5049283 193.531759 10 +-95.0959667 194.424043 8.28088183 +-95.034015 194.665836 2.08150295 +-94.9940782 194.821707 -5.88255308 +-83.3275346 195.370709 -4.96258933 +-91.3179891 196.200787 10 +-94.570931 196.210407 10 +-82.7748059 196.418824 3.59905643 +-83.5695152 197.579731 10 +-87.2205004 197.58077 10 +-88.1473012 197.598058 -10 +-94.3270224 197.805063 6.07960483 +-93.7662182 198.528687 10 +-94.0923137 199.402517 -1.42306659 +-94.0520259 199.67672 -8.71470268 +-80.2530447 200.672718 6.9580859 +-89.6448562 200.78306 10 +-93.8546254 201.02025 7.76410333 +-81.2379054 201.223887 -10 +-79.7560753 201.493765 -0.69925503 +-83.562082 201.761402 10 +-93.0544759 202.955545 10 +-93.5468699 203.114869 3.88355653 +-93.5437483 203.136115 -9.35588739 +-78.3736441 203.777688 9.78886967 +-87.2932756 204.136543 -10 +-93.3112166 204.718752 -3.35645739 +-92.8817421 205.444425 -10 +-84.5205663 206.173167 10 +-76.5839785 206.391404 4.33500719 +-89.2812921 206.599366 10 +-85.4639515 207.331011 -0.990995272 +-75.8393949 207.424698 -2.32608297 +-92.8179116 208.076242 8.09687897 +-92.369416 208.650571 -10 +-92.6980723 208.891881 2.25679628 +-92.6867751 208.968771 -6.19169806 +-74.4940699 209.291669 9.38100886 +-74.3455572 209.497768 -7.32411078 +-84.0236712 209.584276 -10 +-81.3845595 210.244356 10 +-77.4429106 210.343351 -10 +-72.7435342 212.329292 3.25120405 +-92.7197851 212.33408 -1.82541838 +-87.5305655 212.794323 10 +-76.5422193 212.882198 10 +-89.6957521 213.159946 -10 +-72.9366732 213.806424 7.34581118 +-92.7652539 214.441076 6.90113712 +-81.7198852 214.770237 1.45664846 +-92.7812194 215.180907 -6.80547969 +-73.1422126 215.378395 -1.32672659 +-80.0140006 215.956679 -10 +-73.3574228 217.024328 -7.46491831 +-79.1948542 217.038338 10 +-73.3892754 217.267938 9.03469164 +-85.7658291 217.83228 -10 +-91.6752089 218.160853 1.19977451 +-84.2104654 218.237574 10 +-90.7450992 218.586303 -10 +-90.31359 219.732627 9.19178373 +-74.5177195 220.15323 3.62285803 +-89.8815899 220.231304 -4.40210594 +-74.8826293 220.486262 9.00552594 +-77.3039036 221.101689 -10 +-75.8120717 221.334513 -2.71714872 +-81.5491329 222.622964 -10 +-87.5064838 222.97299 2.32226673 +-87.3501649 223.153436 -8.91299766 +-77.8344432 223.18022 8.97336604 +-78.2412357 223.551477 -7.22062931 +-85.3497298 223.744844 -3.57835386 +-84.5052302 223.768231 8.25422157 +-80.5807366 223.876911 -2.88573978 +-80.2993634 223.884703 3.05234436 +CELLS 13072 50401 +2 0 36 +2 0 13 +2 0 1 +2 13 36 +2 1 36 +2 1 13 +2 5 36 +2 0 5 +2 2 5 +2 2 36 +2 0 2 +2 0 6 +2 6 13 +2 1 6 +2 6 36 +2 7 10 +2 7 36 +2 0 7 +2 10 36 +2 0 10 +2 5 6 +2 2 7 +2 1 10 +2 20 32 +2 10 20 +2 1 20 +2 10 32 +2 1 32 +2 13 32 +2 32 36 +2 3 23 +2 2 3 +2 3 8 +2 2 23 +2 8 23 +2 2 8 +2 23 36 +2 22 36 +2 22 23 +2 2 22 +2 5 22 +2 3 22 +2 7 23 +2 7 8 +2 2 4 +2 3 4 +2 4 22 +2 4 5 +2 18 22 +2 4 18 +2 5 18 +2 5 9 +2 4 9 +2 9 18 +2 22 40 +2 5 40 +2 18 40 +2 6 54 +2 36 54 +2 5 54 +2 18 19 +2 19 40 +2 5 19 +2 36 40 +2 19 54 +2 40 54 +2 6 19 +2 9 19 +2 43 54 +2 21 54 +2 6 43 +2 6 21 +2 21 43 +2 36 43 +2 12 43 +2 6 12 +2 12 21 +2 13 43 +2 19 21 +2 12 13 +2 7 31 +2 23 31 +2 8 31 +2 7 11 +2 11 36 +2 11 31 +2 31 36 +2 10 11 +2 11 16 +2 7 16 +2 8 16 +2 8 11 +2 16 31 +2 16 23 +2 9 30 +2 17 30 +2 18 30 +2 9 17 +2 17 18 +2 19 30 +2 17 19 +2 20 50 +2 32 50 +2 10 50 +2 20 29 +2 29 50 +2 10 29 +2 25 36 +2 10 25 +2 11 25 +2 29 36 +2 36 50 +2 25 29 +2 15 31 +2 11 15 +2 15 16 +2 15 25 +2 25 31 +2 11 14 +2 14 15 +2 14 16 +2 21 38 +2 21 26 +2 12 38 +2 12 26 +2 26 38 +2 38 43 +2 32 43 +2 15 24 +2 15 28 +2 14 24 +2 24 28 +2 14 28 +2 28 31 +2 14 31 +2 15 47 +2 28 47 +2 31 47 +2 25 47 +2 25 28 +2 24 25 +2 17 27 +2 27 30 +2 19 27 +2 30 40 +2 30 54 +2 30 42 +2 19 42 +2 42 54 +2 19 33 +2 27 33 +2 30 33 +2 33 42 +2 33 54 +2 21 33 +2 50 51 +2 29 51 +2 20 51 +2 38 54 +2 35 38 +2 35 54 +2 21 35 +2 33 35 +2 26 35 +2 36 41 +2 22 41 +2 23 41 +2 40 41 +2 31 41 +2 28 37 +2 28 34 +2 24 37 +2 34 37 +2 24 34 +2 25 37 +2 25 50 +2 36 47 +2 37 48 +2 25 48 +2 47 48 +2 37 47 +2 29 47 +2 47 50 +2 29 37 +2 29 48 +2 38 39 +2 26 39 +2 35 39 +2 27 42 +2 33 49 +2 27 49 +2 42 49 +2 33 45 +2 27 45 +2 45 49 +2 34 47 +2 48 51 +2 48 50 +2 40 42 +2 41 47 +2 50 64 +2 32 64 +2 36 64 +2 43 64 +2 33 46 +2 46 54 +2 35 46 +2 42 45 +2 45 54 +2 45 46 +2 34 44 +2 34 53 +2 37 44 +2 37 53 +2 44 53 +2 47 53 +2 38 57 +2 39 57 +2 35 57 +2 52 57 +2 35 52 +2 46 52 +2 46 57 +2 54 57 +2 39 52 +2 63 64 +2 54 64 +2 36 63 +2 54 63 +2 63 67 +2 41 63 +2 36 67 +2 41 67 +2 50 67 +2 64 67 +2 47 67 +2 40 63 +2 37 61 +2 47 61 +2 53 61 +2 48 61 +2 37 58 +2 48 58 +2 48 53 +2 53 58 +2 44 58 +2 43 57 +2 55 57 +2 39 55 +2 52 55 +2 54 72 +2 59 72 +2 40 72 +2 54 59 +2 40 59 +2 63 72 +2 42 59 +2 49 59 +2 45 59 +2 54 75 +2 64 75 +2 43 75 +2 57 75 +2 59 62 +2 56 59 +2 56 62 +2 45 62 +2 45 56 +2 49 56 +2 46 59 +2 46 62 +2 57 65 +2 52 65 +2 46 65 +2 54 65 +2 62 65 +2 54 62 +2 50 61 +2 61 67 +2 68 69 +2 51 69 +2 48 69 +2 51 68 +2 48 68 +2 50 69 +2 61 69 +2 48 73 +2 51 73 +2 68 73 +2 58 61 +2 61 68 +2 58 68 +2 59 66 +2 56 66 +2 49 66 +2 67 69 +2 64 69 +2 69 73 +2 57 60 +2 60 65 +2 52 60 +2 55 60 +2 53 74 +2 58 74 +2 61 74 +2 72 75 +2 75 79 +2 72 79 +2 54 79 +2 66 79 +2 54 66 +2 59 79 +2 63 75 +2 62 79 +2 65 79 +2 62 66 +2 54 70 +2 70 75 +2 57 70 +2 65 75 +2 65 70 +2 55 70 +2 60 70 +2 62 76 +2 66 76 +2 56 76 +2 68 74 +2 60 71 +2 70 71 +2 65 71 +2 74 88 +2 68 88 +2 61 88 +2 67 88 +2 69 88 +2 61 77 +2 67 77 +2 77 88 +2 74 77 +2 65 78 +2 78 79 +2 62 78 +2 66 78 +2 76 78 +2 64 72 +2 63 84 +2 64 84 +2 84 89 +2 63 89 +2 64 89 +2 67 84 +2 72 89 +2 72 84 +2 64 90 +2 84 90 +2 67 90 +2 69 90 +2 75 89 +2 89 90 +2 78 80 +2 70 80 +2 65 80 +2 70 78 +2 70 79 +2 71 80 +2 76 79 +2 88 90 +2 84 88 +2 84 92 +2 67 92 +2 88 92 +2 77 92 +2 74 81 +2 81 88 +2 68 81 +2 83 88 +2 82 88 +2 68 83 +2 82 83 +2 68 82 +2 69 83 +2 73 83 +2 81 82 +2 73 82 +2 83 90 +2 78 86 +2 80 86 +2 70 86 +2 79 86 +2 75 86 +2 71 86 +2 75 95 +2 72 95 +2 79 95 +2 89 95 +2 84 95 +2 73 87 +2 83 87 +2 82 87 +2 85 88 +2 77 85 +2 74 85 +2 81 85 +2 89 98 +2 95 98 +2 75 98 +2 86 95 +2 86 98 +2 79 100 +2 78 100 +2 76 100 +2 85 92 +2 86 94 +2 78 94 +2 80 94 +2 94 100 +2 79 94 +2 94 95 +2 95 100 +2 80 103 +2 86 103 +2 94 103 +2 85 91 +2 81 91 +2 91 93 +2 85 93 +2 81 93 +2 88 93 +2 82 93 +2 81 96 +2 91 96 +2 93 96 +2 87 101 +2 83 101 +2 82 101 +2 88 101 +2 93 101 +2 83 104 +2 88 104 +2 101 104 +2 90 104 +2 97 104 +2 83 97 +2 97 101 +2 87 97 +2 88 105 +2 90 105 +2 84 105 +2 84 109 +2 109 115 +2 95 109 +2 84 115 +2 95 115 +2 105 109 +2 109 112 +2 105 112 +2 84 112 +2 105 115 +2 92 105 +2 89 115 +2 89 105 +2 92 112 +2 88 96 +2 85 96 +2 85 99 +2 96 99 +2 91 99 +2 92 99 +2 88 99 +2 94 98 +2 98 103 +2 88 106 +2 88 113 +2 106 113 +2 93 106 +2 93 113 +2 99 106 +2 93 99 +2 88 110 +2 99 110 +2 99 105 +2 105 110 +2 92 110 +2 105 113 +2 104 113 +2 104 105 +2 101 113 +2 99 113 +2 90 107 +2 105 107 +2 89 107 +2 98 115 +2 107 115 +2 107 118 +2 115 118 +2 89 118 +2 98 118 +2 104 116 +2 90 116 +2 105 116 +2 107 116 +2 96 102 +2 99 102 +2 91 102 +2 110 112 +2 96 106 +2 95 114 +2 98 114 +2 94 114 +2 100 122 +2 95 122 +2 94 122 +2 103 114 +2 114 122 +2 115 119 +2 95 119 +2 119 139 +2 115 139 +2 95 139 +2 109 139 +2 114 115 +2 100 119 +2 119 122 +2 115 122 +2 102 106 +2 101 108 +2 104 108 +2 97 108 +2 115 117 +2 98 117 +2 117 118 +2 114 117 +2 103 117 +2 106 110 +2 110 113 +2 110 111 +2 106 111 +2 99 111 +2 102 111 +2 122 137 +2 119 137 +2 100 137 +2 108 127 +2 101 127 +2 113 127 +2 108 113 +2 104 127 +2 104 144 +2 116 144 +2 127 144 +2 116 127 +2 113 144 +2 105 144 +2 116 148 +2 116 162 +2 148 162 +2 105 148 +2 105 162 +2 110 145 +2 113 145 +2 105 145 +2 105 174 +2 107 162 +2 107 174 +2 162 174 +2 109 140 +2 105 140 +2 112 140 +2 115 140 +2 140 175 +2 115 175 +2 105 175 +2 107 148 +2 115 174 +2 115 162 +2 162 175 +2 163 175 +2 162 163 +2 105 163 +2 140 163 +2 144 162 +2 112 163 +2 112 145 +2 145 163 +2 145 162 +2 144 145 +2 106 120 +2 111 120 +2 110 120 +2 113 120 +2 107 146 +2 146 148 +2 146 162 +2 115 146 +2 146 174 +2 118 146 +2 109 156 +2 115 156 +2 139 156 +2 140 156 +2 145 155 +2 110 155 +2 112 155 +2 120 145 +2 131 155 +2 131 145 +2 110 131 +2 120 131 +2 111 131 +2 110 147 +2 131 147 +2 147 155 +2 112 147 +2 155 163 +2 147 163 +2 140 147 +2 117 153 +2 114 153 +2 153 167 +2 117 167 +2 114 167 +2 167 169 +2 122 169 +2 114 169 +2 122 167 +2 117 169 +2 115 169 +2 115 189 +2 139 189 +2 119 189 +2 189 194 +2 115 194 +2 139 194 +2 156 175 +2 118 169 +2 139 179 +2 115 179 +2 179 194 +2 169 192 +2 115 192 +2 122 192 +2 174 192 +2 174 175 +2 175 192 +2 118 192 +2 156 179 +2 175 179 +2 175 194 +2 118 174 +2 192 194 +2 122 189 +2 122 194 +2 152 162 +2 144 152 +2 116 152 +2 148 152 +2 127 152 +2 153 169 +2 118 183 +2 146 183 +2 174 183 +2 183 192 +2 169 183 +2 119 185 +2 185 189 +2 122 185 +2 137 185 +2 126 150 +2 125 126 +2 121 126 +2 125 150 +2 121 150 +2 121 125 +2 135 150 +2 126 135 +2 121 135 +2 166 167 +2 166 169 +2 122 166 +2 166 189 +2 166 185 +2 166 192 +2 166 194 +2 137 166 +2 176 177 +2 123 176 +2 126 176 +2 123 177 +2 126 177 +2 123 126 +2 132 138 +2 123 132 +2 132 150 +2 123 138 +2 138 150 +2 123 150 +2 123 125 +2 125 138 +2 123 197 +2 124 197 +2 128 197 +2 123 124 +2 123 128 +2 124 128 +2 132 177 +2 150 177 +2 176 197 +2 126 197 +2 126 128 +2 177 197 +2 132 197 +2 124 132 +2 125 132 +2 124 180 +2 124 133 +2 124 157 +2 133 180 +2 157 180 +2 133 157 +2 130 133 +2 124 130 +2 130 157 +2 129 136 +2 124 129 +2 129 161 +2 124 136 +2 136 161 +2 124 161 +2 129 180 +2 161 180 +2 129 130 +2 130 180 +2 124 134 +2 134 161 +2 134 180 +2 180 197 +2 134 197 +2 133 197 +2 128 133 +2 134 136 +2 132 134 +2 128 176 +2 150 176 +2 135 142 +2 142 176 +2 126 142 +2 135 176 +2 128 142 +2 135 143 +2 126 143 +2 142 143 +2 128 151 +2 151 197 +2 133 151 +2 159 197 +2 128 159 +2 142 159 +2 142 197 +2 151 159 +2 133 141 +2 141 157 +2 130 141 +2 138 177 +2 132 219 +2 132 149 +2 134 219 +2 149 219 +2 134 149 +2 164 219 +2 132 164 +2 149 164 +2 197 219 +2 164 197 +2 164 177 +2 138 149 +2 138 164 +2 151 157 +2 141 151 +2 157 197 +2 161 197 +2 134 158 +2 136 158 +2 158 161 +2 134 182 +2 182 219 +2 149 182 +2 158 197 +2 158 182 +2 149 158 +2 158 219 +2 143 176 +2 158 171 +2 136 171 +2 161 171 +2 137 168 +2 166 168 +2 168 185 +2 184 189 +2 184 194 +2 139 184 +2 156 184 +2 179 184 +2 140 173 +2 156 173 +2 173 175 +2 163 173 +2 147 173 +2 165 173 +2 140 165 +2 156 165 +2 140 170 +2 170 173 +2 165 170 +2 147 170 +2 141 160 +2 157 160 +2 151 160 +2 142 154 +2 154 176 +2 159 176 +2 154 159 +2 143 154 +2 172 183 +2 146 172 +2 172 174 +2 162 172 +2 148 172 +2 163 170 +2 164 181 +2 149 181 +2 181 182 +2 164 182 +2 151 195 +2 195 197 +2 157 195 +2 160 195 +2 151 190 +2 190 197 +2 190 195 +2 151 178 +2 178 195 +2 178 190 +2 159 190 +2 160 178 +2 153 188 +2 169 188 +2 167 188 +2 159 191 +2 186 191 +2 154 191 +2 159 186 +2 154 186 +2 176 191 +2 173 179 +2 165 179 +2 180 195 +2 161 219 +2 198 205 +2 158 205 +2 205 219 +2 158 198 +2 198 219 +2 171 198 +2 161 198 +2 161 205 +2 193 198 +2 171 193 +2 158 193 +2 187 219 +2 182 187 +2 158 187 +2 187 198 +2 187 193 +2 159 199 +2 197 199 +2 191 199 +2 191 197 +2 186 199 +2 190 199 +2 195 200 +2 178 200 +2 160 200 +2 180 205 +2 197 205 +2 182 202 +2 181 202 +2 164 202 +2 197 202 +2 202 219 +2 177 202 +2 166 207 +2 166 196 +2 185 207 +2 196 207 +2 185 196 +2 207 214 +2 166 214 +2 185 214 +2 168 196 +2 194 214 +2 189 214 +2 167 192 +2 167 214 +2 167 207 +2 192 214 +2 201 214 +2 201 207 +2 167 201 +2 167 217 +2 188 217 +2 201 217 +2 188 201 +2 214 217 +2 169 214 +2 188 214 +2 183 215 +2 169 215 +2 192 215 +2 169 217 +2 214 215 +2 215 217 +2 191 212 +2 197 212 +2 176 212 +2 177 212 +2 202 212 +2 190 200 +2 205 234 +2 180 234 +2 197 234 +2 195 234 +2 202 221 +2 181 221 +2 182 221 +2 182 208 +2 208 221 +2 181 208 +2 182 210 +2 210 219 +2 187 210 +2 208 210 +2 210 221 +2 219 221 +2 184 206 +2 189 206 +2 194 206 +2 185 223 +2 207 223 +2 214 223 +2 185 218 +2 218 223 +2 196 223 +2 196 218 +2 189 223 +2 186 213 +2 199 213 +2 191 213 +2 186 225 +2 199 225 +2 213 225 +2 187 209 +2 198 209 +2 193 209 +2 209 210 +2 209 219 +2 188 216 +2 216 217 +2 201 216 +2 203 216 +2 201 203 +2 188 203 +2 189 230 +2 206 223 +2 206 230 +2 223 230 +2 214 230 +2 206 214 +2 197 229 +2 190 229 +2 195 229 +2 200 229 +2 227 229 +2 200 227 +2 190 227 +2 199 229 +2 199 227 +2 191 233 +2 197 233 +2 199 233 +2 191 225 +2 213 233 +2 225 233 +2 212 233 +2 198 211 +2 198 204 +2 193 211 +2 193 204 +2 204 211 +2 209 211 +2 229 234 +2 207 218 +2 196 235 +2 207 235 +2 218 235 +2 212 259 +2 197 259 +2 233 259 +2 229 246 +2 234 246 +2 197 246 +2 197 225 +2 212 219 +2 197 274 +2 259 274 +2 246 274 +2 246 259 +2 225 246 +2 233 246 +2 219 234 +2 219 259 +2 234 259 +2 197 241 +2 241 259 +2 212 241 +2 234 274 +2 199 246 +2 219 241 +2 198 220 +2 198 228 +2 219 220 +2 219 228 +2 220 228 +2 209 228 +2 211 228 +2 219 236 +2 198 236 +2 220 236 +2 205 236 +2 211 220 +2 204 220 +2 227 246 +2 214 251 +2 217 251 +2 201 251 +2 207 251 +2 207 231 +2 201 231 +2 231 251 +2 201 232 +2 216 231 +2 216 232 +2 231 232 +2 216 251 +2 203 232 +2 203 231 +2 202 241 +2 221 241 +2 220 226 +2 211 226 +2 204 226 +2 219 256 +2 234 256 +2 205 256 +2 236 256 +2 218 248 +2 235 248 +2 207 248 +2 214 248 +2 248 251 +2 223 248 +2 235 251 +2 207 245 +2 231 245 +2 245 251 +2 235 245 +2 221 222 +2 208 222 +2 210 222 +2 221 224 +2 222 224 +2 208 224 +2 210 239 +2 219 239 +2 209 239 +2 228 239 +2 238 239 +2 219 238 +2 210 238 +2 221 238 +2 222 238 +2 226 228 +2 213 250 +2 233 250 +2 225 250 +2 215 251 +2 230 248 +2 217 258 +2 215 258 +2 251 258 +2 217 253 +2 253 258 +2 216 253 +2 216 258 +2 251 253 +2 231 253 +2 232 253 +2 235 255 +2 218 255 +2 248 255 +2 223 255 +2 218 252 +2 235 252 +2 252 255 +2 236 242 +2 228 236 +2 219 242 +2 228 242 +2 219 260 +2 239 260 +2 238 260 +2 219 289 +2 256 289 +2 234 289 +2 219 277 +2 219 270 +2 260 277 +2 260 270 +2 270 277 +2 219 244 +2 221 244 +2 238 244 +2 259 277 +2 241 277 +2 241 260 +2 241 244 +2 244 260 +2 259 289 +2 239 270 +2 263 270 +2 242 263 +2 219 263 +2 242 270 +2 256 263 +2 236 263 +2 239 242 +2 256 270 +2 277 289 +2 270 289 +2 228 237 +2 220 237 +2 226 237 +2 220 242 +2 237 242 +2 236 237 +2 224 238 +2 224 244 +2 224 240 +2 222 240 +2 238 240 +2 243 248 +2 223 243 +2 243 255 +2 230 243 +2 240 244 +2 246 250 +2 229 257 +2 246 257 +2 227 257 +2 229 274 +2 257 274 +2 231 249 +2 249 253 +2 232 249 +2 245 249 +2 245 253 +2 233 265 +2 246 265 +2 250 265 +2 259 265 +2 234 281 +2 256 281 +2 281 289 +2 234 298 +2 259 298 +2 289 298 +2 274 298 +2 274 281 +2 281 298 +2 245 248 +2 245 280 +2 248 280 +2 235 280 +2 255 280 +2 252 280 +2 267 280 +2 252 267 +2 235 267 +2 235 266 +2 252 266 +2 266 267 +2 245 267 +2 237 247 +2 242 247 +2 236 247 +2 236 261 +2 261 263 +2 256 261 +2 242 261 +2 247 261 +2 238 254 +2 254 260 +2 244 254 +2 240 254 +2 244 277 +2 259 271 +2 241 271 +2 271 277 +2 244 271 +2 247 263 +2 255 262 +2 248 262 +2 243 262 +2 254 277 +2 254 271 +2 254 264 +2 244 264 +2 264 271 +2 245 269 +2 245 272 +2 269 272 +2 267 269 +2 267 272 +2 280 283 +2 251 280 +2 245 283 +2 251 283 +2 253 283 +2 272 283 +2 267 283 +2 249 272 +2 253 272 +2 249 269 +2 257 275 +2 274 275 +2 246 275 +2 265 298 +2 246 298 +2 275 298 +2 265 275 +2 250 275 +2 255 273 +2 248 273 +2 273 280 +2 262 273 +2 265 268 +2 268 275 +2 250 268 +2 258 283 +2 255 278 +2 252 278 +2 273 278 +2 252 273 +2 278 280 +2 252 276 +2 266 276 +2 267 276 +2 276 280 +2 276 278 +2 253 282 +2 282 283 +2 272 282 +2 258 282 +2 264 277 +2 260 264 +2 262 278 +2 256 279 +2 270 279 +2 279 289 +2 256 292 +2 279 292 +2 289 292 +2 279 281 +2 281 292 +2 263 279 +2 261 279 +2 275 294 +2 274 294 +2 257 294 +2 257 285 +2 285 294 +2 275 285 +2 286 295 +2 259 286 +2 286 290 +2 259 295 +2 290 295 +2 259 290 +2 259 284 +2 265 284 +2 284 295 +2 265 295 +2 289 295 +2 295 298 +2 284 286 +2 271 290 +2 277 290 +2 289 290 +2 271 286 +2 295 305 +2 284 305 +2 265 305 +2 268 291 +2 265 291 +2 275 291 +2 291 298 +2 291 305 +2 298 305 +2 298 317 +2 265 317 +2 275 317 +2 291 317 +2 284 291 +2 267 300 +2 276 300 +2 266 300 +2 266 297 +2 276 297 +2 297 300 +2 269 283 +2 283 287 +2 267 287 +2 269 287 +2 267 311 +2 267 303 +2 300 311 +2 300 303 +2 303 311 +2 300 310 +2 287 300 +2 267 310 +2 287 310 +2 276 311 +2 276 303 +2 283 310 +2 280 310 +2 280 311 +2 310 311 +2 268 301 +2 288 301 +2 301 304 +2 268 288 +2 268 304 +2 288 304 +2 288 291 +2 275 288 +2 291 301 +2 272 287 +2 269 306 +2 269 293 +2 272 306 +2 272 293 +2 293 306 +2 287 306 +2 287 293 +2 282 306 +2 283 306 +2 306 310 +2 272 310 +2 281 299 +2 274 299 +2 298 299 +2 274 316 +2 298 316 +2 294 316 +2 294 298 +2 308 316 +2 298 308 +2 274 308 +2 299 308 +2 294 308 +2 275 316 +2 314 317 +2 316 317 +2 275 314 +2 314 316 +2 291 314 +2 275 307 +2 307 316 +2 294 307 +2 285 307 +2 307 314 +2 288 314 +2 288 307 +2 278 311 +2 278 303 +2 297 303 +2 302 303 +2 302 311 +2 278 302 +2 292 298 +2 292 299 +2 282 313 +2 306 313 +2 283 313 +2 310 313 +2 307 319 +2 294 319 +2 285 319 +2 296 307 +2 296 319 +2 285 296 +2 306 325 +2 287 325 +2 293 325 +2 306 331 +2 310 331 +2 287 331 +2 287 321 +2 321 325 +2 309 321 +2 287 309 +2 309 325 +2 325 331 +2 321 331 +2 300 331 +2 300 321 +2 293 309 +2 288 324 +2 314 324 +2 307 324 +2 304 314 +2 304 324 +2 301 314 +2 315 322 +2 291 315 +2 315 318 +2 291 322 +2 318 322 +2 291 318 +2 314 318 +2 317 318 +2 301 318 +2 301 322 +2 305 317 +2 305 318 +2 305 315 +2 316 319 +2 295 317 +2 295 318 +2 307 312 +2 296 312 +2 312 319 +2 300 323 +2 320 323 +2 297 323 +2 300 320 +2 297 320 +2 303 323 +2 331 339 +2 300 339 +2 321 339 +2 332 339 +2 300 332 +2 332 338 +2 338 339 +2 300 338 +2 310 339 +2 303 339 +2 323 339 +2 311 339 +2 323 338 +2 321 332 +2 320 332 +2 320 338 +2 304 327 +2 314 327 +2 301 327 +2 322 327 +2 314 322 +2 311 326 +2 302 326 +2 303 326 +2 311 323 +2 323 326 +2 314 333 +2 324 333 +2 304 333 +2 327 333 +2 324 328 +2 304 328 +2 328 333 +2 313 331 +2 329 331 +2 306 329 +2 325 329 +2 313 329 +2 334 341 +2 307 341 +2 314 341 +2 307 334 +2 314 334 +2 312 342 +2 307 342 +2 319 342 +2 342 359 +2 334 342 +2 307 359 +2 334 359 +2 312 335 +2 307 335 +2 335 342 +2 335 359 +2 316 334 +2 319 334 +2 324 341 +2 341 359 +2 324 359 +2 324 335 +2 309 330 +2 325 330 +2 321 330 +2 326 339 +2 322 336 +2 327 336 +2 314 336 +2 333 336 +2 324 360 +2 333 360 +2 314 360 +2 317 334 +2 341 360 +2 317 341 +2 318 341 +2 318 336 +2 333 347 +2 314 347 +2 336 347 +2 347 360 +2 336 341 +2 341 347 +2 334 346 +2 342 346 +2 319 346 +2 332 337 +2 337 338 +2 320 337 +2 343 348 +2 343 365 +2 321 343 +2 348 365 +2 321 348 +2 321 365 +2 340 365 +2 365 366 +2 340 366 +2 321 340 +2 321 366 +2 325 343 +2 330 343 +2 331 365 +2 339 365 +2 339 366 +2 331 343 +2 348 351 +2 330 351 +2 321 351 +2 330 348 +2 339 340 +2 340 348 +2 332 340 +2 340 351 +2 323 353 +2 339 353 +2 326 353 +2 338 353 +2 335 363 +2 324 363 +2 359 363 +2 328 360 +2 345 349 +2 328 349 +2 324 349 +2 328 345 +2 324 345 +2 335 345 +2 345 363 +2 345 360 +2 360 363 +2 359 360 +2 349 360 +2 329 343 +2 325 348 +2 327 347 +2 333 349 +2 345 356 +2 349 356 +2 328 356 +2 343 354 +2 329 354 +2 331 354 +2 350 351 +2 348 350 +2 330 350 +2 354 365 +2 344 355 +2 332 355 +2 355 362 +2 332 344 +2 344 362 +2 332 362 +2 332 366 +2 337 344 +2 337 355 +2 338 366 +2 338 367 +2 332 367 +2 366 367 +2 340 386 +2 332 386 +2 366 386 +2 338 355 +2 362 386 +2 340 362 +2 367 386 +2 355 367 +2 355 386 +2 333 357 +2 357 360 +2 347 357 +2 349 357 +2 346 359 +2 345 361 +2 361 363 +2 335 361 +2 342 364 +2 335 364 +2 358 364 +2 342 358 +2 335 358 +2 342 352 +2 335 352 +2 352 364 +2 352 361 +2 352 363 +2 342 363 +2 358 363 +2 363 364 +2 353 366 +2 353 367 +2 365 386 +2 340 375 +2 351 386 +2 351 375 +2 375 386 +2 351 365 +2 362 375 +2 363 368 +2 342 368 +2 358 368 +2 346 368 +2 359 368 +2 346 358 +2 343 369 +2 365 369 +2 354 369 +2 348 369 +2 355 372 +2 362 372 +2 344 372 +2 362 376 +2 372 376 +2 344 376 +2 361 385 +2 361 425 +2 345 385 +2 385 425 +2 345 425 +2 371 374 +2 345 374 +2 356 374 +2 345 371 +2 356 371 +2 349 371 +2 363 385 +2 361 370 +2 361 415 +2 345 370 +2 345 415 +2 370 415 +2 360 385 +2 371 415 +2 374 415 +2 415 425 +2 385 415 +2 370 374 +2 356 370 +2 349 385 +2 371 385 +2 369 386 +2 348 386 +2 351 369 +2 369 378 +2 351 378 +2 348 378 +2 350 378 +2 385 391 +2 349 391 +2 371 391 +2 371 373 +2 349 373 +2 373 391 +2 357 373 +2 360 373 +2 360 391 +2 378 380 +2 350 380 +2 351 380 +2 378 386 +2 375 378 +2 375 380 +2 352 409 +2 363 409 +2 364 409 +2 352 399 +2 352 379 +2 399 409 +2 379 399 +2 379 409 +2 361 409 +2 364 399 +2 361 379 +2 367 392 +2 366 392 +2 353 392 +2 354 382 +2 365 382 +2 369 382 +2 367 372 +2 372 386 +2 374 377 +2 356 377 +2 370 377 +2 358 387 +2 368 387 +2 363 387 +2 364 387 +2 358 394 +2 364 394 +2 387 394 +2 368 397 +2 359 397 +2 363 397 +2 385 397 +2 359 385 +2 379 423 +2 409 423 +2 361 423 +2 423 428 +2 423 425 +2 361 428 +2 425 428 +2 363 423 +2 361 400 +2 400 428 +2 379 428 +2 379 400 +2 370 425 +2 363 425 +2 370 428 +2 370 400 +2 376 381 +2 375 376 +2 362 381 +2 375 381 +2 375 412 +2 386 412 +2 362 412 +2 372 412 +2 376 412 +2 387 397 +2 409 416 +2 416 423 +2 363 416 +2 363 394 +2 394 397 +2 397 425 +2 394 409 +2 397 423 +2 397 416 +2 394 416 +2 369 410 +2 365 410 +2 382 410 +2 386 410 +2 366 410 +2 386 392 +2 386 421 +2 392 421 +2 366 421 +2 410 421 +2 386 401 +2 367 401 +2 372 401 +2 392 401 +2 386 418 +2 410 418 +2 369 418 +2 411 418 +2 410 411 +2 369 411 +2 382 411 +2 378 418 +2 370 414 +2 377 414 +2 374 414 +2 377 417 +2 370 417 +2 414 417 +2 414 415 +2 400 417 +2 400 414 +2 414 428 +2 414 425 +2 391 415 +2 371 407 +2 374 407 +2 407 415 +2 391 407 +2 401 412 +2 407 414 +2 386 441 +2 380 386 +2 375 441 +2 380 441 +2 412 424 +2 375 424 +2 376 424 +2 381 441 +2 424 441 +2 381 424 +2 381 383 +2 383 441 +2 375 383 +2 412 441 +2 380 383 +2 381 405 +2 376 405 +2 405 424 +2 380 402 +2 402 430 +2 378 402 +2 380 430 +2 378 430 +2 380 418 +2 418 430 +2 428 433 +2 379 433 +2 413 433 +2 413 428 +2 379 413 +2 379 404 +2 404 428 +2 400 404 +2 404 413 +2 409 428 +2 399 428 +2 399 413 +2 399 433 +2 418 441 +2 383 430 +2 430 441 +2 380 420 +2 380 384 +2 420 430 +2 384 420 +2 384 430 +2 402 420 +2 384 402 +2 383 384 +2 381 445 +2 424 445 +2 441 445 +2 383 445 +2 398 405 +2 383 398 +2 381 398 +2 383 405 +2 405 445 +2 383 393 +2 393 442 +2 384 393 +2 383 442 +2 384 442 +2 429 445 +2 383 429 +2 405 429 +2 442 445 +2 429 442 +2 420 442 +2 383 420 +2 383 388 +2 388 398 +2 398 429 +2 388 429 +2 441 442 +2 388 442 +2 388 393 +2 420 441 +2 384 390 +2 390 420 +2 390 393 +2 393 420 +2 435 441 +2 386 435 +2 418 435 +2 435 438 +2 410 435 +2 410 438 +2 386 438 +2 412 421 +2 421 441 +2 401 421 +2 438 441 +2 421 438 +2 387 416 +2 393 396 +2 388 396 +2 396 442 +2 389 398 +2 388 389 +2 389 429 +2 388 422 +2 422 442 +2 396 422 +2 389 422 +2 389 396 +2 422 429 +2 395 422 +2 389 395 +2 395 396 +2 390 439 +2 390 442 +2 420 439 +2 439 442 +2 393 439 +2 406 439 +2 393 406 +2 390 406 +2 392 419 +2 419 421 +2 401 419 +2 403 442 +2 393 403 +2 403 404 +2 404 442 +2 393 404 +2 403 406 +2 403 439 +2 396 404 +2 395 408 +2 396 408 +2 408 422 +2 434 442 +2 422 434 +2 396 434 +2 404 408 +2 404 422 +2 404 434 +2 399 432 +2 428 432 +2 432 433 +2 409 432 +2 400 403 +2 403 428 +2 417 428 +2 403 417 +2 412 419 +2 417 439 +2 406 417 +2 403 460 +2 403 447 +2 428 460 +2 447 460 +2 428 447 +2 404 460 +2 417 447 +2 439 447 +2 442 460 +2 439 460 +2 434 460 +2 428 434 +2 408 434 +2 404 433 +2 433 434 +2 413 434 +2 408 413 +2 414 426 +2 415 426 +2 407 426 +2 423 432 +2 409 431 +2 416 431 +2 423 431 +2 431 432 +2 418 427 +2 410 427 +2 411 427 +2 427 435 +2 437 441 +2 412 437 +2 421 437 +2 424 437 +2 419 437 +2 428 440 +2 440 443 +2 414 440 +2 428 443 +2 414 443 +2 414 447 +2 425 443 +2 425 426 +2 426 443 +2 425 440 +2 443 447 +2 415 443 +2 441 448 +2 435 448 +2 418 448 +2 427 448 +2 430 448 +2 421 436 +2 436 437 +2 419 436 +2 430 452 +2 420 452 +2 441 452 +2 439 452 +2 442 452 +2 437 438 +2 436 438 +2 421 450 +2 436 450 +2 438 450 +2 422 459 +2 442 459 +2 429 459 +2 434 459 +2 423 440 +2 423 446 +2 440 446 +2 428 446 +2 431 446 +2 428 431 +2 437 445 +2 444 448 +2 427 444 +2 435 444 +2 440 447 +2 440 460 +2 446 460 +2 433 446 +2 446 454 +2 428 454 +2 433 454 +2 454 460 +2 432 446 +2 433 460 +2 429 467 +2 442 467 +2 445 467 +2 459 467 +2 452 473 +2 441 473 +2 430 473 +2 448 473 +2 446 451 +2 432 451 +2 431 451 +2 432 454 +2 451 454 +2 434 463 +2 460 463 +2 433 463 +2 454 463 +2 459 460 +2 459 463 +2 444 453 +2 453 464 +2 435 453 +2 444 464 +2 435 464 +2 441 464 +2 448 464 +2 438 464 +2 458 464 +2 438 458 +2 435 458 +2 453 458 +2 436 457 +2 437 457 +2 438 457 +2 436 449 +2 450 457 +2 449 457 +2 449 450 +2 457 475 +2 441 475 +2 437 475 +2 441 457 +2 445 475 +2 441 482 +2 438 482 +2 457 482 +2 450 482 +2 458 482 +2 464 482 +2 450 458 +2 460 468 +2 460 470 +2 439 468 +2 439 470 +2 468 470 +2 442 468 +2 447 470 +2 452 468 +2 446 456 +2 440 456 +2 456 460 +2 443 460 +2 443 456 +2 473 475 +2 452 475 +2 441 471 +2 471 482 +2 457 471 +2 473 482 +2 475 482 +2 441 467 +2 467 475 +2 448 482 +2 471 475 +2 452 467 +2 445 452 +2 459 468 +2 442 483 +2 468 483 +2 467 468 +2 467 483 +2 452 483 +2 460 462 +2 447 462 +2 443 462 +2 456 462 +2 454 461 +2 446 461 +2 451 461 +2 456 461 +2 454 456 +2 462 470 +2 464 473 +2 449 455 +2 455 457 +2 450 455 +2 450 471 +2 455 466 +2 450 466 +2 457 466 +2 458 466 +2 466 482 +2 466 471 +2 461 479 +2 451 479 +2 454 479 +2 475 483 +2 473 483 +2 453 465 +2 458 465 +2 465 472 +2 453 472 +2 458 472 +2 464 465 +2 460 479 +2 456 479 +2 463 479 +2 455 471 +2 455 480 +2 466 480 +2 471 480 +2 456 484 +2 460 484 +2 462 484 +2 469 476 +2 456 476 +2 476 479 +2 456 469 +2 469 479 +2 469 484 +2 462 469 +2 461 476 +2 460 469 +2 466 472 +2 472 482 +2 464 472 +2 468 496 +2 459 496 +2 467 496 +2 468 491 +2 491 496 +2 459 491 +2 460 491 +2 463 491 +2 460 502 +2 479 491 +2 491 502 +2 479 502 +2 491 516 +2 460 516 +2 468 516 +2 479 484 +2 470 484 +2 484 567 +2 470 567 +2 460 567 +2 470 516 +2 516 567 +2 484 502 +2 491 567 +2 484 491 +2 474 479 +2 474 476 +2 461 474 +2 462 478 +2 478 484 +2 469 478 +2 465 482 +2 464 481 +2 465 481 +2 481 482 +2 464 490 +2 482 490 +2 481 490 +2 473 490 +2 472 481 +2 477 481 +2 472 477 +2 465 477 +2 466 486 +2 472 486 +2 482 486 +2 480 482 +2 480 486 +2 475 496 +2 483 496 +2 496 516 +2 483 516 +2 469 559 +2 484 559 +2 476 559 +2 476 484 +2 488 559 +2 488 492 +2 469 488 +2 492 559 +2 469 492 +2 476 488 +2 484 492 +2 478 492 +2 469 489 +2 489 492 +2 478 489 +2 488 489 +2 484 516 +2 482 494 +2 475 494 +2 471 494 +2 480 494 +2 481 485 +2 472 485 +2 477 485 +2 482 485 +2 485 486 +2 473 509 +2 482 509 +2 509 544 +2 473 544 +2 482 544 +2 475 509 +2 490 544 +2 483 509 +2 476 487 +2 474 487 +2 479 487 +2 494 509 +2 509 539 +2 494 539 +2 475 539 +2 496 509 +2 496 539 +2 487 502 +2 476 502 +2 488 502 +2 487 488 +2 502 559 +2 480 549 +2 494 549 +2 482 549 +2 486 549 +2 480 511 +2 511 549 +2 486 511 +2 490 555 +2 485 490 +2 481 555 +2 485 555 +2 481 523 +2 523 555 +2 485 523 +2 494 544 +2 544 549 +2 544 555 +2 482 555 +2 486 490 +2 486 555 +2 549 555 +2 483 575 +2 496 575 +2 509 575 +2 516 575 +2 559 567 +2 502 567 +2 533 567 +2 484 533 +2 533 559 +2 492 533 +2 516 533 +2 522 523 +2 522 555 +2 485 522 +2 486 522 +2 511 537 +2 511 522 +2 522 537 +2 486 537 +2 522 549 +2 487 553 +2 488 553 +2 505 553 +2 487 505 +2 488 505 +2 502 553 +2 492 521 +2 488 521 +2 489 521 +2 521 559 +2 488 546 +2 521 546 +2 546 559 +2 553 559 +2 546 553 +2 505 546 +2 521 530 +2 492 530 +2 489 530 +2 567 596 +2 565 567 +2 491 596 +2 565 596 +2 491 565 +2 496 567 +2 502 565 +2 496 596 +2 521 561 +2 559 561 +2 492 561 +2 530 561 +2 533 561 +2 493 560 +2 504 560 +2 499 560 +2 493 504 +2 493 499 +2 499 504 +2 515 570 +2 513 515 +2 493 515 +2 513 570 +2 493 570 +2 493 513 +2 493 508 +2 508 513 +2 508 515 +2 493 593 +2 570 593 +2 499 570 +2 499 593 +2 497 593 +2 493 497 +2 497 513 +2 513 593 +2 520 570 +2 493 520 +2 515 520 +2 497 499 +2 504 520 +2 520 560 +2 560 570 +2 503 504 +2 503 520 +2 493 503 +2 539 544 +2 539 606 +2 544 606 +2 494 606 +2 549 606 +2 498 507 +2 498 545 +2 495 498 +2 507 545 +2 495 507 +2 495 545 +2 499 529 +2 495 499 +2 529 593 +2 495 529 +2 495 593 +2 495 497 +2 497 507 +2 497 545 +2 545 593 +2 514 545 +2 498 514 +2 495 514 +2 514 529 +2 500 514 +2 495 500 +2 500 529 +2 499 501 +2 501 529 +2 495 501 +2 529 545 +2 500 501 +2 497 498 +2 539 575 +2 539 596 +2 575 596 +2 567 575 +2 507 593 +2 497 519 +2 513 519 +2 519 593 +2 507 519 +2 507 517 +2 517 545 +2 498 517 +2 514 517 +2 499 609 +2 499 584 +2 584 609 +2 501 609 +2 501 584 +2 593 609 +2 584 593 +2 529 584 +2 501 510 +2 499 510 +2 510 609 +2 560 593 +2 560 609 +2 504 609 +2 504 510 +2 512 529 +2 501 512 +2 500 512 +2 547 584 +2 547 609 +2 501 547 +2 506 547 +2 501 506 +2 506 512 +2 512 547 +2 510 547 +2 506 510 +2 529 547 +2 559 565 +2 553 565 +2 503 560 +2 503 526 +2 526 560 +2 504 526 +2 503 525 +2 525 560 +2 525 526 +2 524 525 +2 503 524 +2 524 526 +2 520 525 +2 526 609 +2 510 526 +2 505 541 +2 541 553 +2 541 546 +2 510 527 +2 527 547 +2 506 527 +2 506 531 +2 531 547 +2 527 531 +2 512 531 +2 518 545 +2 545 554 +2 518 554 +2 507 518 +2 507 554 +2 517 518 +2 518 519 +2 518 593 +2 554 593 +2 528 570 +2 528 574 +2 508 528 +2 570 574 +2 508 570 +2 508 574 +2 513 574 +2 513 528 +2 575 629 +2 509 629 +2 539 629 +2 544 629 +2 527 609 +2 510 534 +2 526 534 +2 534 609 +2 527 534 +2 537 543 +2 543 600 +2 511 543 +2 537 600 +2 511 600 +2 549 600 +2 537 549 +2 532 574 +2 513 532 +2 528 532 +2 513 538 +2 532 538 +2 538 574 +2 538 593 +2 519 538 +2 574 593 +2 516 640 +2 516 604 +2 567 640 +2 604 640 +2 567 604 +2 533 604 +2 575 640 +2 517 554 +2 536 593 +2 536 554 +2 518 536 +2 519 536 +2 562 593 +2 538 562 +2 519 562 +2 536 562 +2 559 572 +2 521 572 +2 561 572 +2 546 572 +2 530 572 +2 522 659 +2 622 659 +2 659 663 +2 522 622 +2 522 663 +2 622 663 +2 537 663 +2 537 659 +2 555 566 +2 522 566 +2 523 566 +2 522 647 +2 537 647 +2 647 659 +2 537 542 +2 542 647 +2 522 542 +2 523 542 +2 542 566 +2 555 663 +2 549 663 +2 555 622 +2 566 622 +2 566 659 +2 566 647 +2 526 576 +2 524 576 +2 535 576 +2 526 535 +2 524 535 +2 524 560 +2 560 576 +2 525 576 +2 550 576 +2 548 550 +2 526 550 +2 548 576 +2 526 548 +2 550 609 +2 534 550 +2 576 609 +2 535 548 +2 527 583 +2 527 540 +2 531 583 +2 540 583 +2 531 540 +2 534 583 +2 534 557 +2 557 583 +2 527 557 +2 547 583 +2 583 609 +2 540 557 +2 528 552 +2 532 552 +2 552 574 +2 545 584 +2 530 601 +2 561 601 +2 572 601 +2 564 574 +2 538 564 +2 532 564 +2 552 564 +2 561 603 +2 559 603 +2 533 603 +2 567 603 +2 603 604 +2 595 609 +2 550 595 +2 534 595 +2 557 609 +2 557 595 +2 548 577 +2 576 577 +2 535 577 +2 554 614 +2 554 569 +2 536 614 +2 569 614 +2 536 569 +2 554 562 +2 562 614 +2 562 569 +2 647 663 +2 537 563 +2 537 558 +2 537 605 +2 558 563 +2 563 605 +2 558 605 +2 647 651 +2 556 647 +2 556 651 +2 537 651 +2 537 556 +2 563 649 +2 537 649 +2 605 649 +2 647 649 +2 649 651 +2 543 563 +2 543 558 +2 600 663 +2 600 649 +2 649 663 +2 543 605 +2 556 563 +2 563 651 +2 600 605 +2 542 556 +2 562 615 +2 593 615 +2 538 615 +2 562 581 +2 581 615 +2 538 581 +2 564 581 +2 564 615 +2 574 615 +2 575 653 +2 596 653 +2 539 653 +2 629 653 +2 606 629 +2 606 653 +2 571 583 +2 540 571 +2 557 571 +2 553 568 +2 541 568 +2 546 568 +2 541 592 +2 553 592 +2 568 592 +2 566 611 +2 611 647 +2 542 611 +2 582 611 +2 542 582 +2 566 582 +2 542 551 +2 556 582 +2 551 556 +2 551 582 +2 582 647 +2 544 648 +2 555 648 +2 549 648 +2 606 648 +2 629 648 +2 584 618 +2 593 618 +2 545 618 +2 554 618 +2 546 592 +2 546 602 +2 546 608 +2 559 602 +2 559 608 +2 602 608 +2 572 608 +2 553 602 +2 592 602 +2 568 602 +2 547 628 +2 609 628 +2 583 628 +2 584 628 +2 548 594 +2 576 594 +2 577 594 +2 550 594 +2 555 638 +2 638 663 +2 549 638 +2 600 638 +2 638 648 +2 606 638 +2 594 595 +2 594 609 +2 573 617 +2 556 573 +2 551 573 +2 556 617 +2 551 617 +2 573 582 +2 582 617 +2 564 589 +2 564 598 +2 589 598 +2 552 589 +2 552 598 +2 574 598 +2 592 627 +2 553 627 +2 627 639 +2 592 639 +2 553 639 +2 559 592 +2 625 639 +2 559 639 +2 553 625 +2 559 625 +2 625 627 +2 565 625 +2 593 614 +2 614 618 +2 648 663 +2 622 648 +2 556 664 +2 651 664 +2 578 664 +2 556 578 +2 578 651 +2 556 652 +2 651 652 +2 652 664 +2 582 652 +2 617 652 +2 647 652 +2 556 591 +2 578 591 +2 591 664 +2 617 664 +2 591 617 +2 573 591 +2 578 660 +2 563 578 +2 556 660 +2 563 660 +2 651 660 +2 597 609 +2 583 597 +2 557 597 +2 571 612 +2 583 612 +2 557 612 +2 571 597 +2 597 612 +2 595 597 +2 579 605 +2 563 579 +2 558 579 +2 559 643 +2 567 643 +2 603 643 +2 639 665 +2 559 665 +2 643 665 +2 639 643 +2 625 665 +2 608 639 +2 608 636 +2 559 636 +2 636 639 +2 636 643 +2 567 665 +2 565 665 +2 603 636 +2 625 634 +2 565 634 +2 559 634 +2 559 607 +2 607 608 +2 572 607 +2 634 665 +2 602 639 +2 607 636 +2 561 607 +2 561 636 +2 609 613 +2 560 613 +2 576 613 +2 570 609 +2 570 613 +2 561 637 +2 636 637 +2 603 637 +2 601 603 +2 601 637 +2 601 607 +2 601 636 +2 562 585 +2 581 585 +2 585 610 +2 562 610 +2 581 610 +2 562 673 +2 581 673 +2 615 673 +2 614 673 +2 610 614 +2 610 673 +2 569 610 +2 614 615 +2 569 585 +2 578 580 +2 580 660 +2 563 580 +2 563 623 +2 579 623 +2 580 623 +2 579 580 +2 649 660 +2 623 660 +2 623 649 +2 605 623 +2 581 598 +2 598 615 +2 581 589 +2 620 665 +2 620 634 +2 565 620 +2 567 620 +2 596 620 +2 611 659 +2 611 622 +2 665 691 +2 680 691 +2 567 691 +2 665 680 +2 567 680 +2 643 675 +2 665 675 +2 567 675 +2 640 657 +2 657 691 +2 567 657 +2 640 691 +2 620 657 +2 596 657 +2 620 680 +2 657 680 +2 675 691 +2 640 675 +2 604 675 +2 603 675 +2 596 640 +2 592 621 +2 602 621 +2 568 621 +2 613 655 +2 609 655 +2 570 655 +2 635 655 +2 593 635 +2 570 635 +2 593 655 +2 574 635 +2 615 635 +2 598 635 +2 653 690 +2 575 690 +2 596 690 +2 640 690 +2 575 699 +2 640 699 +2 690 699 +2 653 699 +2 629 699 +2 576 632 +2 609 632 +2 594 632 +2 577 632 +2 613 632 +2 594 619 +2 619 632 +2 577 619 +2 580 669 +2 660 669 +2 578 669 +2 660 664 +2 590 669 +2 578 590 +2 580 590 +2 578 631 +2 631 672 +2 588 631 +2 578 672 +2 578 588 +2 588 672 +2 664 669 +2 590 672 +2 669 672 +2 591 631 +2 588 591 +2 588 590 +2 664 672 +2 631 664 +2 579 626 +2 623 626 +2 580 626 +2 580 670 +2 669 670 +2 590 670 +2 660 670 +2 590 626 +2 626 670 +2 599 626 +2 590 599 +2 580 599 +2 626 660 +2 581 646 +2 581 616 +2 589 646 +2 616 646 +2 589 616 +2 598 646 +2 586 668 +2 581 668 +2 668 689 +2 581 586 +2 586 689 +2 581 689 +2 646 689 +2 615 646 +2 615 689 +2 586 587 +2 586 616 +2 581 587 +2 587 616 +2 616 668 +2 646 668 +2 587 589 +2 585 673 +2 585 689 +2 673 689 +2 585 586 +2 611 652 +2 611 617 +2 583 656 +2 609 656 +2 628 656 +2 609 612 +2 612 656 +2 593 628 +2 618 628 +2 610 689 +2 588 650 +2 650 679 +2 585 650 +2 588 679 +2 585 588 +2 585 679 +2 610 679 +2 679 689 +2 586 679 +2 588 610 +2 610 650 +2 590 679 +2 585 590 +2 586 590 +2 590 678 +2 590 641 +2 586 678 +2 641 678 +2 586 641 +2 586 682 +2 616 682 +2 668 682 +2 682 689 +2 678 679 +2 678 689 +2 616 678 +2 678 682 +2 587 641 +2 616 641 +2 587 590 +2 599 616 +2 587 599 +2 599 641 +2 650 672 +2 631 650 +2 672 679 +2 669 678 +2 669 679 +2 670 678 +2 641 670 +2 626 641 +2 627 633 +2 592 633 +2 621 633 +2 621 627 +2 602 633 +2 633 639 +2 618 687 +2 593 687 +2 609 687 +2 609 618 +2 593 686 +2 593 671 +2 615 686 +2 671 686 +2 615 671 +2 618 686 +2 686 687 +2 618 671 +2 614 671 +2 655 686 +2 609 686 +2 635 686 +2 609 619 +2 595 619 +2 597 642 +2 642 656 +2 595 642 +2 597 656 +2 595 656 +2 619 642 +2 609 642 +2 657 690 +2 597 666 +2 656 666 +2 612 666 +2 642 666 +2 597 624 +2 612 624 +2 624 666 +2 624 642 +2 635 646 +2 607 637 +2 630 637 +2 601 630 +2 607 630 +2 608 633 +2 637 643 +2 643 644 +2 644 675 +2 603 644 +2 637 644 +2 674 675 +2 604 674 +2 603 674 +2 644 674 +2 675 701 +2 604 701 +2 674 701 +2 640 701 +2 606 677 +2 629 677 +2 653 677 +2 648 677 +2 638 677 +2 630 636 +2 609 684 +2 642 684 +2 632 684 +2 632 642 +2 613 684 +2 613 709 +2 609 709 +2 655 709 +2 628 687 +2 656 717 +2 609 717 +2 642 717 +2 656 687 +2 686 717 +2 687 717 +2 684 717 +2 655 717 +2 684 709 +2 709 717 +2 679 685 +2 610 685 +2 650 685 +2 673 685 +2 685 689 +2 645 647 +2 645 652 +2 611 645 +2 617 645 +2 645 659 +2 612 654 +2 654 656 +2 624 656 +2 624 654 +2 614 686 +2 671 673 +2 673 686 +2 646 686 +2 646 708 +2 686 708 +2 615 708 +2 689 708 +2 686 689 +2 646 695 +2 635 695 +2 615 695 +2 686 695 +2 641 682 +2 641 668 +2 671 687 +2 619 658 +2 642 658 +2 632 658 +2 661 665 +2 620 661 +2 634 661 +2 620 667 +2 667 680 +2 657 667 +2 661 680 +2 634 680 +2 634 667 +2 622 703 +2 663 703 +2 659 703 +2 648 703 +2 622 681 +2 681 703 +2 648 681 +2 659 681 +2 649 662 +2 623 662 +2 660 662 +2 626 662 +2 654 666 +2 625 661 +2 639 661 +2 662 670 +2 711 714 +2 677 714 +2 629 714 +2 677 711 +2 629 711 +2 653 711 +2 653 733 +2 711 733 +2 629 733 +2 629 721 +2 653 721 +2 711 721 +2 699 733 +2 699 711 +2 648 714 +2 677 721 +2 658 684 +2 661 667 +2 686 704 +2 695 704 +2 635 704 +2 655 704 +2 663 716 +2 703 716 +2 638 716 +2 638 703 +2 638 710 +2 677 710 +2 710 716 +2 677 716 +2 677 703 +2 663 710 +2 657 700 +2 640 700 +2 691 700 +2 691 701 +2 700 727 +2 690 700 +2 640 727 +2 690 727 +2 640 738 +2 727 738 +2 699 727 +2 699 738 +2 707 727 +2 691 727 +2 640 707 +2 691 707 +2 701 727 +2 700 707 +2 701 738 +2 641 676 +2 676 678 +2 676 682 +2 670 676 +2 668 676 +2 656 694 +2 666 694 +2 642 694 +2 694 717 +2 684 694 +2 658 694 +2 646 693 +2 689 693 +2 668 693 +2 695 708 +2 693 695 +2 693 708 +2 703 714 +2 648 720 +2 703 720 +2 714 720 +2 681 720 +2 690 733 +2 653 729 +2 711 729 +2 721 729 +2 690 729 +2 729 733 +2 654 692 +2 666 692 +2 683 692 +2 654 683 +2 666 683 +2 656 692 +2 704 717 +2 704 709 +2 687 702 +2 656 702 +2 702 717 +2 692 702 +2 666 702 +2 694 702 +2 657 707 +2 697 707 +2 697 700 +2 657 697 +2 680 697 +2 680 707 +2 680 688 +2 657 688 +2 688 697 +2 667 688 +2 694 698 +2 684 698 +2 658 698 +2 692 706 +2 683 706 +2 666 706 +2 692 694 +2 694 706 +2 682 693 +2 671 705 +2 686 705 +2 673 705 +2 686 712 +2 671 712 +2 705 712 +2 687 712 +2 696 705 +2 705 713 +2 673 696 +2 696 713 +2 673 713 +2 686 696 +2 689 696 +2 685 696 +2 714 725 +2 714 754 +2 677 725 +2 677 754 +2 725 754 +2 716 754 +2 716 725 +2 710 725 +2 703 754 +2 714 721 +2 721 725 +2 688 707 +2 682 708 +2 683 723 +2 706 723 +2 692 723 +2 694 718 +2 684 718 +2 698 718 +2 684 730 +2 718 730 +2 730 736 +2 684 736 +2 718 736 +2 717 718 +2 709 736 +2 717 736 +2 698 730 +2 686 735 +2 686 785 +2 686 764 +2 735 785 +2 735 764 +2 764 785 +2 743 745 +2 705 743 +2 686 743 +2 705 745 +2 686 745 +2 744 785 +2 686 744 +2 735 744 +2 686 722 +2 705 722 +2 696 722 +2 695 735 +2 695 744 +2 686 759 +2 686 771 +2 745 759 +2 745 771 +2 759 771 +2 708 744 +2 759 794 +2 717 759 +2 686 794 +2 717 794 +2 712 717 +2 712 745 +2 712 759 +2 771 794 +2 771 785 +2 785 794 +2 755 785 +2 686 755 +2 755 764 +2 704 755 +2 704 764 +2 755 794 +2 708 722 +2 689 722 +2 744 771 +2 717 755 +2 704 735 +2 743 771 +2 743 744 +2 722 743 +2 722 744 +2 687 752 +2 687 737 +2 717 752 +2 717 737 +2 737 752 +2 712 752 +2 702 737 +2 733 742 +2 732 733 +2 690 742 +2 690 732 +2 732 742 +2 733 751 +2 690 751 +2 732 751 +2 729 751 +2 700 742 +2 700 732 +2 727 733 +2 700 733 +2 692 724 +2 706 724 +2 723 724 +2 702 706 +2 702 724 +2 708 715 +2 695 715 +2 693 715 +2 706 728 +2 694 728 +2 702 728 +2 718 728 +2 717 728 +2 695 731 +2 731 735 +2 731 744 +2 708 734 +2 695 734 +2 734 744 +2 731 734 +2 708 731 +2 715 731 +2 713 722 +2 697 719 +2 707 719 +2 700 719 +2 733 738 +2 699 757 +2 711 757 +2 733 757 +2 738 763 +2 733 763 +2 699 763 +2 757 763 +2 707 742 +2 727 742 +2 719 742 +2 719 732 +2 724 728 +2 724 737 +2 717 724 +2 714 739 +2 703 739 +2 739 754 +2 720 739 +2 716 739 +2 709 755 +2 726 745 +2 726 743 +2 705 726 +2 722 726 +2 713 726 +2 706 741 +2 724 741 +2 728 741 +2 723 741 +2 715 734 +2 717 747 +2 709 747 +2 747 755 +2 736 747 +2 716 749 +2 725 749 +2 710 749 +2 721 762 +2 729 762 +2 711 762 +2 762 768 +2 711 768 +2 768 776 +2 762 776 +2 711 776 +2 757 776 +2 757 762 +2 733 762 +2 714 762 +2 714 768 +2 752 759 +2 713 743 +2 714 775 +2 739 775 +2 760 775 +2 714 760 +2 739 760 +2 754 775 +2 762 775 +2 754 762 +2 720 760 +2 768 775 +2 725 762 +2 760 768 +2 749 754 +2 717 783 +2 756 783 +2 766 783 +2 717 756 +2 717 766 +2 756 766 +2 717 741 +2 777 798 +2 747 798 +2 717 798 +2 747 777 +2 717 777 +2 717 793 +2 752 793 +2 737 793 +2 717 807 +2 794 807 +2 755 807 +2 752 804 +2 759 804 +2 717 804 +2 766 793 +2 737 766 +2 736 746 +2 717 746 +2 746 761 +2 736 761 +2 717 761 +2 804 807 +2 752 807 +2 717 805 +2 752 805 +2 793 805 +2 741 766 +2 737 741 +2 759 807 +2 718 746 +2 798 807 +2 755 798 +2 755 777 +2 747 783 +2 736 783 +2 746 756 +2 718 756 +2 761 783 +2 783 793 +2 793 798 +2 783 798 +2 728 766 +2 728 756 +2 756 761 +2 805 807 +2 793 807 +2 728 746 +2 730 746 +2 721 773 +2 725 773 +2 762 773 +2 729 773 +2 723 740 +2 724 740 +2 740 741 +2 740 753 +2 724 753 +2 741 753 +2 753 766 +2 724 766 +2 737 753 +2 762 765 +2 725 765 +2 754 765 +2 765 773 +2 749 765 +2 726 748 +2 745 748 +2 743 748 +2 727 779 +2 727 770 +2 733 779 +2 733 770 +2 770 779 +2 738 770 +2 742 779 +2 741 756 +2 729 791 +2 762 791 +2 773 791 +2 733 767 +2 751 767 +2 729 767 +2 762 767 +2 767 791 +2 730 750 +2 746 750 +2 736 750 +2 734 735 +2 731 758 +2 731 769 +2 758 769 +2 735 758 +2 735 769 +2 734 769 +2 734 758 +2 732 774 +2 732 779 +2 774 779 +2 751 774 +2 751 779 +2 742 751 +2 742 774 +2 779 788 +2 733 788 +2 770 788 +2 763 788 +2 763 820 +2 733 820 +2 788 820 +2 733 784 +2 779 784 +2 784 788 +2 733 829 +2 762 829 +2 784 829 +2 762 784 +2 751 784 +2 757 824 +2 762 824 +2 733 824 +2 784 820 +2 820 824 +2 784 824 +2 767 784 +2 824 829 +2 763 770 +2 763 824 +2 744 769 +2 780 785 +2 764 780 +2 735 780 +2 769 785 +2 758 780 +2 769 780 +2 750 761 +2 761 778 +2 747 778 +2 736 778 +2 747 761 +2 778 781 +2 747 781 +2 736 781 +2 750 778 +2 737 795 +2 793 795 +2 752 795 +2 737 782 +2 753 782 +2 766 782 +2 782 793 +2 782 795 +2 771 772 +2 745 772 +2 743 772 +2 748 772 +2 769 771 +2 772 787 +2 745 787 +2 771 787 +2 759 787 +2 781 798 +2 781 783 +2 777 781 +2 778 783 +2 754 797 +2 749 797 +2 765 797 +2 774 784 +2 784 786 +2 774 786 +2 751 786 +2 784 792 +2 751 792 +2 767 792 +2 786 792 +2 759 789 +2 752 789 +2 789 804 +2 804 805 +2 789 805 +2 795 805 +2 789 795 +2 754 809 +2 775 809 +2 762 809 +2 765 809 +2 797 809 +2 785 807 +2 764 807 +2 806 807 +2 777 807 +2 755 806 +2 777 806 +2 799 807 +2 755 799 +2 799 806 +2 764 799 +2 762 828 +2 757 828 +2 824 828 +2 776 828 +2 776 824 +2 757 813 +2 813 824 +2 813 815 +2 757 815 +2 815 824 +2 776 815 +2 763 813 +2 800 804 +2 759 800 +2 789 800 +2 794 804 +2 787 804 +2 787 794 +2 787 800 +2 760 801 +2 760 802 +2 775 801 +2 801 802 +2 775 802 +2 768 802 +2 776 826 +2 768 826 +2 762 826 +2 775 836 +2 809 836 +2 762 836 +2 826 836 +2 775 826 +2 791 814 +2 791 827 +2 762 814 +2 762 827 +2 814 827 +2 767 829 +2 773 809 +2 773 836 +2 828 836 +2 828 829 +2 829 836 +2 803 829 +2 762 803 +2 767 803 +2 814 836 +2 827 836 +2 826 828 +2 827 829 +2 773 814 +2 791 829 +2 791 803 +2 763 811 +2 788 811 +2 770 811 +2 811 820 +2 813 820 +2 811 813 +2 785 799 +2 780 799 +2 765 808 +2 808 809 +2 797 808 +2 773 808 +2 792 803 +2 784 803 +2 768 812 +2 812 826 +2 802 826 +2 802 812 +2 776 812 +2 814 832 +2 773 832 +2 832 836 +2 808 836 +2 808 814 +2 808 832 +2 784 796 +2 779 796 +2 774 796 +2 796 810 +2 786 796 +2 786 810 +2 774 810 +2 801 831 +2 826 831 +2 775 831 +2 801 826 +2 809 831 +2 831 836 +2 812 828 +2 812 815 +2 815 828 +2 798 806 +2 790 798 +2 777 790 +2 790 806 +2 781 790 +2 788 817 +2 784 817 +2 779 817 +2 796 817 +2 823 824 +2 784 823 +2 820 823 +2 786 821 +2 784 821 +2 792 821 +2 818 821 +2 796 821 +2 784 818 +2 796 818 +2 817 820 +2 784 825 +2 792 825 +2 803 825 +2 825 829 +2 823 829 +2 821 825 +2 817 821 +2 817 818 +2 817 823 +2 821 823 +2 823 825 +2 794 799 +2 786 818 +2 818 819 +2 786 819 +2 819 821 +2 810 819 +2 810 818 +2 792 819 +2 803 827 +2 827 830 +2 791 830 +2 803 830 +2 819 822 +2 792 822 +2 821 822 +2 822 825 +2 792 816 +2 816 825 +2 816 822 +2 803 816 +2 808 834 +2 809 834 +2 797 834 +2 831 835 +2 831 838 +2 801 835 +2 835 838 +2 801 838 +2 802 835 +2 802 838 +2 802 831 +2 812 835 +2 826 835 +2 825 827 +2 825 830 +2 816 830 +2 809 833 +2 833 836 +2 808 833 +2 833 834 +2 814 833 +2 832 833 +2 834 841 +2 809 841 +2 833 841 +2 836 841 +2 831 841 +2 815 826 +2 812 839 +2 835 839 +2 826 839 +2 814 837 +2 833 837 +2 832 837 +2 827 832 +2 836 842 +2 831 842 +2 826 842 +2 839 842 +2 835 842 +2 835 844 +2 838 844 +2 831 844 +2 841 851 +2 831 851 +2 842 851 +2 841 842 +2 842 844 +2 831 847 +2 847 851 +2 842 847 +2 844 847 +2 841 847 +2 838 847 +2 833 845 +2 832 845 +2 837 845 +2 836 845 +2 841 845 +2 833 840 +2 840 845 +2 840 841 +2 834 840 +2 837 840 +2 834 843 +2 840 843 +2 841 843 +2 841 848 +2 834 848 +2 843 848 +2 844 846 +2 839 844 +2 835 846 +2 839 846 +2 836 851 +2 845 851 +2 840 850 +2 845 850 +2 837 850 +2 844 854 +2 838 854 +2 847 854 +2 846 852 +2 842 846 +2 842 852 +2 839 852 +2 841 849 +2 845 849 +2 840 849 +2 843 849 +2 840 848 +2 848 849 +2 849 850 +2 853 861 +2 841 853 +2 851 853 +2 841 861 +2 851 861 +2 849 861 +2 845 861 +2 848 853 +2 848 861 +2 847 853 +2 847 852 +2 851 852 +2 844 852 +2 844 855 +2 844 859 +2 855 859 +2 847 855 +2 847 859 +2 852 855 +2 846 855 +2 854 859 +2 850 861 +2 852 856 +2 855 856 +2 846 856 +2 859 867 +2 847 867 +2 862 867 +2 859 862 +2 847 862 +2 854 863 +2 859 863 +2 847 863 +2 862 863 +2 851 869 +2 847 869 +2 852 869 +2 853 869 +2 862 869 +2 853 862 +2 867 869 +2 852 867 +2 852 859 +2 849 858 +2 857 858 +2 848 858 +2 849 857 +2 848 857 +2 858 861 +2 853 858 +2 849 860 +2 860 861 +2 850 860 +2 849 865 +2 858 865 +2 857 865 +2 860 865 +2 858 860 +2 860 864 +2 861 864 +2 850 864 +2 861 869 +2 855 867 +2 856 867 +2 869 874 +2 853 874 +2 862 874 +2 861 874 +2 858 874 +2 853 870 +2 870 874 +2 858 870 +2 862 870 +2 863 868 +2 859 868 +2 854 868 +2 857 866 +2 865 866 +2 858 866 +2 870 871 +2 858 871 +2 865 871 +2 865 870 +2 861 865 +2 871 874 +2 866 870 +2 865 874 +2 867 868 +2 863 867 +2 859 872 +2 868 872 +2 867 872 +2 864 865 +2 860 871 +2 864 871 +2 864 874 +2 863 869 +2 862 883 +2 869 883 +2 863 883 +2 862 877 +2 874 877 +2 870 877 +2 863 873 +2 873 883 +2 862 873 +2 873 877 +2 877 883 +2 874 883 +2 863 876 +2 873 876 +2 868 876 +2 868 873 +2 868 879 +2 863 872 +2 863 879 +2 872 879 +2 876 883 +2 869 879 +2 879 883 +2 869 872 +2 876 879 +2 871 875 +2 874 875 +2 864 875 +2 866 871 +2 866 878 +2 870 878 +2 871 878 +2 867 879 +2 872 876 +2 869 886 +2 874 886 +2 883 886 +2 879 886 +2 882 887 +2 887 888 +2 870 887 +2 882 888 +2 870 882 +2 870 888 +2 877 888 +2 877 887 +2 870 883 +2 883 887 +2 874 887 +2 871 882 +2 874 882 +2 878 888 +2 878 882 +2 875 882 +2 876 881 +2 872 881 +2 879 881 +2 880 883 +2 873 880 +2 880 884 +2 883 884 +2 873 884 +2 876 884 +2 877 880 +2 875 887 +2 886 887 +2 881 884 +2 881 883 +2 888 891 +2 877 891 +2 883 891 +2 883 888 +2 880 891 +2 888 894 +2 882 894 +2 878 894 +2 879 885 +2 883 885 +2 885 886 +2 881 885 +2 884 893 +2 880 893 +2 883 893 +2 891 893 +2 892 893 +2 880 892 +2 891 892 +2 881 889 +2 885 889 +2 883 889 +2 884 889 +2 889 890 +2 885 890 +2 881 890 +2 887 894 +2 894 898 +2 887 898 +2 882 898 +2 891 900 +2 891 906 +2 900 906 +2 883 900 +2 883 906 +2 885 895 +2 883 895 +2 886 895 +2 888 897 +2 887 897 +2 883 897 +2 886 897 +2 895 897 +2 897 906 +2 891 897 +2 893 900 +2 889 895 +2 889 893 +2 893 895 +2 895 900 +2 895 906 +2 890 895 +2 894 897 +2 897 898 +2 888 910 +2 894 910 +2 909 910 +2 888 909 +2 894 909 +2 888 915 +2 897 910 +2 910 915 +2 897 915 +2 903 909 +2 909 915 +2 903 915 +2 888 903 +2 902 909 +2 888 902 +2 902 903 +2 891 915 +2 891 903 +2 894 902 +2 889 900 +2 900 901 +2 895 901 +2 889 901 +2 896 900 +2 889 896 +2 896 901 +2 895 896 +2 890 896 +2 904 906 +2 906 915 +2 891 904 +2 904 915 +2 893 904 +2 892 904 +2 899 904 +2 891 899 +2 892 899 +2 899 915 +2 899 903 +2 900 904 +2 898 909 +2 898 907 +2 907 909 +2 894 907 +2 898 910 +2 901 906 +2 900 905 +2 896 905 +2 901 905 +2 906 910 +2 907 910 +2 913 915 +2 912 915 +2 912 913 +2 899 913 +2 899 912 +2 899 908 +2 904 912 +2 908 912 +2 904 908 +2 903 913 +2 908 913 +2 900 914 +2 906 914 +2 905 914 +2 905 906 +2 912 914 +2 906 912 +2 900 912 +2 915 923 +2 909 923 +2 902 923 +2 902 915 +2 916 925 +2 902 916 +2 916 923 +2 902 925 +2 923 925 +2 916 922 +2 902 922 +2 922 925 +2 915 916 +2 903 916 +2 913 916 +2 914 917 +2 905 917 +2 906 917 +2 906 919 +2 917 919 +2 914 919 +2 914 915 +2 910 919 +2 915 919 +2 910 911 +2 907 911 +2 909 911 +2 912 924 +2 913 924 +2 908 924 +2 908 921 +2 913 921 +2 921 924 +2 909 918 +2 909 920 +2 918 920 +2 918 923 +2 920 923 +2 915 920 +2 910 920 +2 911 918 +2 911 920 +2 910 927 +2 919 927 +2 915 927 +2 920 927 +2 924 928 +2 915 924 +2 915 928 +2 912 928 +2 914 928 +2 915 933 +2 913 933 +2 924 933 +2 913 926 +2 916 933 +2 916 926 +2 926 933 +2 929 933 +2 913 929 +2 926 929 +2 924 929 +2 921 926 +2 921 929 +2 917 928 +2 919 928 +2 919 933 +2 928 933 +2 923 933 +2 923 930 +2 915 930 +2 930 933 +2 927 930 +2 927 933 +2 920 930 +2 922 935 +2 922 933 +2 933 935 +2 916 935 +2 925 933 +2 926 935 +2 919 932 +2 928 932 +2 917 932 +2 930 934 +2 920 934 +2 918 934 +2 918 930 +2 932 933 +2 933 941 +2 927 941 +2 919 941 +2 932 941 +2 927 932 +2 927 934 +2 926 931 +2 929 931 +2 921 931 +2 935 937 +2 935 936 +2 922 937 +2 936 937 +2 922 936 +2 925 936 +2 933 936 +2 925 937 +2 933 940 +2 923 940 +2 923 936 +2 936 940 +2 930 940 +2 929 938 +2 933 938 +2 924 938 +2 933 942 +2 928 942 +2 924 942 +2 938 942 +2 933 945 +2 926 945 +2 931 945 +2 931 933 +2 935 945 +2 941 946 +2 934 946 +2 927 946 +2 934 941 +2 933 946 +2 930 946 +2 941 942 +2 928 941 +2 928 944 +2 932 944 +2 932 942 +2 942 944 +2 931 939 +2 929 939 +2 938 939 +2 931 938 +2 934 943 +2 930 943 +2 940 943 +2 934 940 +2 940 946 +2 938 945 +2 939 945 +2 941 944 +2 938 958 +2 933 958 +2 942 958 +2 935 949 +2 933 949 +2 936 949 +2 933 955 +2 933 951 +2 933 957 +2 951 955 +2 955 957 +2 951 957 +2 946 955 +2 940 955 +2 957 958 +2 949 958 +2 949 957 +2 940 957 +2 951 958 +2 946 951 +2 941 951 +2 945 949 +2 945 958 +2 936 957 +2 942 951 +2 943 946 +2 937 949 +2 954 957 +2 950 954 +2 936 954 +2 950 957 +2 936 950 +2 949 954 +2 936 948 +2 948 950 +2 948 954 +2 940 950 +2 948 949 +2 937 948 +2 942 953 +2 938 953 +2 953 958 +2 938 947 +2 947 953 +2 945 947 +2 945 953 +2 939 947 +2 950 955 +2 950 952 +2 940 952 +2 952 955 +2 946 952 +2 943 952 +2 944 951 +2 944 956 +2 942 956 +2 951 956 +2 953 956 +2 956 958 +2 955 958 +3 1 36 13 +3 0 1 13 +3 0 36 1 +3 0 13 36 +3 0 2 36 +3 0 5 2 +3 2 5 36 +3 0 36 5 +3 1 13 6 +3 0 1 6 +3 0 6 13 +3 0 6 36 +3 6 13 36 +3 0 10 36 +3 0 36 7 +3 0 7 10 +3 7 36 10 +3 0 6 5 +3 5 6 36 +3 2 36 7 +3 0 2 7 +3 0 10 1 +3 1 10 36 +3 1 32 10 +3 1 10 20 +3 1 20 32 +3 10 32 20 +3 1 36 32 +3 1 32 13 +3 13 32 36 +3 10 36 32 +3 2 8 23 +3 2 3 8 +3 3 23 8 +3 2 23 3 +3 2 22 23 +3 2 36 22 +3 22 36 23 +3 2 23 36 +3 5 36 22 +3 2 5 22 +3 2 22 3 +3 3 22 23 +3 7 8 23 +3 2 8 7 +3 2 7 23 +3 7 23 36 +3 3 4 22 +3 2 22 4 +3 2 4 3 +3 4 5 22 +3 2 5 4 +3 4 5 18 +3 5 22 18 +3 4 18 22 +3 4 9 18 +3 5 18 9 +3 4 5 9 +3 5 40 18 +3 18 40 22 +3 5 22 40 +3 5 54 36 +3 5 6 54 +3 6 36 54 +3 5 40 19 +3 5 19 18 +3 18 19 40 +3 22 40 36 +3 5 36 40 +3 5 40 54 +3 19 54 40 +3 5 54 19 +3 6 54 19 +3 5 6 19 +3 9 19 18 +3 5 19 9 +3 36 40 54 +3 6 43 21 +3 21 43 54 +3 6 21 54 +3 6 54 43 +3 6 36 43 +3 36 54 43 +3 6 12 21 +3 12 43 21 +3 6 43 12 +3 13 36 43 +3 6 13 43 +3 6 21 19 +3 19 21 54 +3 6 13 12 +3 12 13 43 +3 8 23 31 +3 7 8 31 +3 7 31 23 +3 7 36 31 +3 11 31 36 +3 7 31 11 +3 7 11 36 +3 23 36 31 +3 7 11 10 +3 10 11 36 +3 7 8 11 +3 7 16 8 +3 8 16 11 +3 7 11 16 +3 8 31 16 +3 7 16 31 +3 11 16 31 +3 16 23 31 +3 8 23 16 +3 9 17 18 +3 17 30 18 +3 9 18 30 +3 9 30 17 +3 9 19 17 +3 9 30 19 +3 17 19 30 +3 18 30 19 +3 10 32 50 +3 10 50 20 +3 20 50 32 +3 10 50 29 +3 10 29 20 +3 20 29 50 +3 10 11 25 +3 11 36 25 +3 10 25 36 +3 29 36 50 +3 10 50 36 +3 10 36 29 +3 25 36 29 +3 10 25 29 +3 32 50 36 +3 11 16 15 +3 15 16 31 +3 11 15 31 +3 11 25 31 +3 11 15 25 +3 15 31 25 +3 14 16 15 +3 11 16 14 +3 11 14 15 +3 25 31 36 +3 12 38 26 +3 21 26 38 +3 12 26 21 +3 12 21 38 +3 12 43 38 +3 21 38 43 +3 13 32 43 +3 32 36 43 +3 14 28 24 +3 14 15 28 +3 15 24 28 +3 14 24 15 +3 14 31 28 +3 14 15 31 +3 15 28 31 +3 14 16 31 +3 28 31 47 +3 15 47 31 +3 15 28 47 +3 15 28 25 +3 25 28 47 +3 15 25 47 +3 24 28 25 +3 15 24 25 +3 25 47 31 +3 19 30 27 +3 17 19 27 +3 17 27 30 +3 19 40 30 +3 18 30 40 +3 19 54 42 +3 30 42 54 +3 19 42 30 +3 19 30 54 +3 27 33 30 +3 19 30 33 +3 19 33 27 +3 30 33 42 +3 19 42 33 +3 33 54 42 +3 19 54 33 +3 30 54 40 +3 19 21 33 +3 21 54 33 +3 20 29 51 +3 20 51 50 +3 29 50 51 +3 21 35 54 +3 21 38 35 +3 35 38 54 +3 21 54 38 +3 33 35 54 +3 21 35 33 +3 21 26 35 +3 26 38 35 +3 38 43 54 +3 22 41 23 +3 23 41 36 +3 22 36 41 +3 22 40 41 +3 36 41 40 +3 31 41 36 +3 23 41 31 +3 24 34 37 +3 24 28 34 +3 28 37 34 +3 24 37 28 +3 25 37 28 +3 24 37 25 +3 25 50 29 +3 25 36 50 +3 25 47 36 +3 31 36 47 +3 25 47 37 +3 25 48 47 +3 37 47 48 +3 25 37 48 +3 28 47 37 +3 25 50 47 +3 25 47 29 +3 29 47 50 +3 25 29 48 +3 25 37 29 +3 29 37 48 +3 29 48 47 +3 36 50 47 +3 26 39 35 +3 35 39 38 +3 26 38 39 +3 27 42 30 +3 27 33 42 +3 27 49 42 +3 33 42 49 +3 27 33 49 +3 27 45 49 +3 33 49 45 +3 27 33 45 +3 28 47 34 +3 34 47 37 +3 48 50 51 +3 29 50 48 +3 29 48 51 +3 47 50 48 +3 30 42 40 +3 40 42 54 +3 31 41 47 +3 36 47 41 +3 32 64 36 +3 36 64 50 +3 32 50 64 +3 32 64 43 +3 36 43 64 +3 35 54 46 +3 33 35 46 +3 33 46 54 +3 42 49 45 +3 33 42 45 +3 42 45 54 +3 33 54 45 +3 45 46 54 +3 33 46 45 +3 37 44 53 +3 34 53 44 +3 34 37 53 +3 34 44 37 +3 37 53 47 +3 34 47 53 +3 35 39 57 +3 35 57 38 +3 38 57 39 +3 35 46 57 +3 35 52 46 +3 46 52 57 +3 35 57 52 +3 46 57 54 +3 35 54 57 +3 38 54 57 +3 35 39 52 +3 39 57 52 +3 36 54 63 +3 36 64 54 +3 54 64 63 +3 36 63 64 +3 36 41 67 +3 36 63 41 +3 41 63 67 +3 36 67 63 +3 36 64 67 +3 36 67 50 +3 50 67 64 +3 41 67 47 +3 36 47 67 +3 40 54 63 +3 36 40 63 +3 47 67 50 +3 43 64 54 +3 63 64 67 +3 40 63 41 +3 47 61 53 +3 37 53 61 +3 37 61 47 +3 37 61 48 +3 47 48 61 +3 48 58 53 +3 37 53 58 +3 37 48 53 +3 37 58 48 +3 44 53 58 +3 37 44 58 +3 48 53 61 +3 43 54 57 +3 38 43 57 +3 39 55 52 +3 52 55 57 +3 39 57 55 +3 40 54 59 +3 40 59 72 +3 40 72 54 +3 54 72 59 +3 40 72 63 +3 54 63 72 +3 40 42 59 +3 42 54 59 +3 45 59 49 +3 42 59 45 +3 42 49 59 +3 45 54 59 +3 43 64 75 +3 43 75 54 +3 54 75 64 +3 43 75 57 +3 54 57 75 +3 45 62 56 +3 45 56 59 +3 45 59 62 +3 56 62 59 +3 45 56 49 +3 49 56 59 +3 46 54 59 +3 45 46 59 +3 46 59 62 +3 45 46 62 +3 46 52 65 +3 46 65 57 +3 52 57 65 +3 46 65 54 +3 54 65 57 +3 46 62 54 +3 46 65 62 +3 54 62 65 +3 54 59 62 +3 47 67 61 +3 47 61 50 +3 50 61 67 +3 48 61 50 +3 48 68 51 +3 48 51 69 +3 48 69 68 +3 51 68 69 +3 50 51 69 +3 48 50 69 +3 50 69 61 +3 48 61 69 +3 51 73 68 +3 48 68 73 +3 48 73 51 +3 53 61 58 +3 48 58 61 +3 61 69 68 +3 48 61 68 +3 48 58 68 +3 58 61 68 +3 49 56 66 +3 49 66 59 +3 56 59 66 +3 61 67 69 +3 50 69 67 +3 64 69 67 +3 50 69 64 +3 51 73 69 +3 68 69 73 +3 52 60 65 +3 52 57 60 +3 57 65 60 +3 52 55 60 +3 55 57 60 +3 58 74 61 +3 53 61 74 +3 53 74 58 +3 54 79 72 +3 54 75 79 +3 72 79 75 +3 54 72 75 +3 54 59 79 +3 54 66 59 +3 59 66 79 +3 54 79 66 +3 59 79 72 +3 63 75 64 +3 54 75 63 +3 62 65 79 +3 54 79 65 +3 54 62 79 +3 54 66 62 +3 59 62 66 +3 57 75 70 +3 54 57 70 +3 54 70 75 +3 65 75 79 +3 54 75 65 +3 63 72 75 +3 62 79 66 +3 54 70 65 +3 65 70 75 +3 57 70 65 +3 57 60 70 +3 55 70 60 +3 55 57 70 +3 56 62 66 +3 56 76 66 +3 56 62 76 +3 62 66 76 +3 60 70 65 +3 61 68 74 +3 58 74 68 +3 65 71 70 +3 60 71 65 +3 60 70 71 +3 61 68 88 +3 61 88 74 +3 68 74 88 +3 67 69 88 +3 61 88 69 +3 61 67 88 +3 67 88 77 +3 61 77 88 +3 61 67 77 +3 61 77 74 +3 74 77 88 +3 68 88 69 +3 62 78 79 +3 62 65 78 +3 65 79 78 +3 66 78 79 +3 62 78 66 +3 66 76 78 +3 62 78 76 +3 63 72 64 +3 64 72 75 +3 63 64 89 +3 64 84 89 +3 63 89 84 +3 63 84 64 +3 64 67 84 +3 63 84 67 +3 64 89 72 +3 63 72 89 +3 63 72 84 +3 72 89 84 +3 67 84 90 +3 64 67 90 +3 64 90 84 +3 67 90 69 +3 64 69 90 +3 72 75 89 +3 64 89 75 +3 84 89 90 +3 64 90 89 +3 65 78 70 +3 65 70 80 +3 65 80 78 +3 70 78 80 +3 65 79 70 +3 70 79 78 +3 70 75 79 +3 70 80 71 +3 65 71 80 +3 66 76 79 +3 76 78 79 +3 84 90 88 +3 67 84 88 +3 67 88 90 +3 67 92 88 +3 84 88 92 +3 67 84 92 +3 69 88 90 +3 77 92 88 +3 67 92 77 +3 68 81 88 +3 68 74 81 +3 74 88 81 +3 68 82 83 +3 68 88 82 +3 82 88 83 +3 68 83 88 +3 68 83 69 +3 69 83 88 +3 69 73 83 +3 68 83 73 +3 68 81 82 +3 81 88 82 +3 73 82 83 +3 68 82 73 +3 83 88 90 +3 69 83 90 +3 70 86 80 +3 70 78 86 +3 78 80 86 +3 70 79 86 +3 78 86 79 +3 70 75 86 +3 75 79 86 +3 71 86 80 +3 70 86 71 +3 72 79 95 +3 75 95 79 +3 72 95 75 +3 84 95 89 +3 72 95 84 +3 72 89 95 +3 75 89 95 +3 82 83 87 +3 73 82 87 +3 73 87 83 +3 74 77 85 +3 74 85 88 +3 77 88 85 +3 81 85 88 +3 74 85 81 +3 75 98 95 +3 75 89 98 +3 89 95 98 +3 79 86 95 +3 75 95 86 +3 75 98 86 +3 86 98 95 +3 76 78 100 +3 76 100 79 +3 78 79 100 +3 77 92 85 +3 85 92 88 +3 78 80 94 +3 80 86 94 +3 78 94 86 +3 79 100 94 +3 78 79 94 +3 78 94 100 +3 79 94 86 +3 94 95 100 +3 79 100 95 +3 79 95 94 +3 86 95 94 +3 86 94 103 +3 80 103 94 +3 80 86 103 +3 81 93 85 +3 81 91 93 +3 85 93 91 +3 81 85 91 +3 85 88 93 +3 81 93 88 +3 82 93 88 +3 81 93 82 +3 91 93 96 +3 81 96 93 +3 81 91 96 +3 82 83 101 +3 82 101 87 +3 83 87 101 +3 82 88 101 +3 83 101 88 +3 88 101 93 +3 82 93 101 +3 88 104 101 +3 83 101 104 +3 83 104 88 +3 88 90 104 +3 83 104 90 +3 83 101 97 +3 97 101 104 +3 83 97 104 +3 87 101 97 +3 83 87 97 +3 84 90 105 +3 84 105 88 +3 88 105 90 +3 84 115 95 +3 95 115 109 +3 84 95 109 +3 84 109 115 +3 84 112 105 +3 84 109 112 +3 105 112 109 +3 84 105 109 +3 105 109 115 +3 84 105 115 +3 88 92 105 +3 84 105 92 +3 84 105 89 +3 89 105 115 +3 84 89 115 +3 89 90 105 +3 89 115 95 +3 84 112 92 +3 92 112 105 +3 85 96 93 +3 88 93 96 +3 85 88 96 +3 91 99 96 +3 85 91 96 +3 85 99 91 +3 85 96 99 +3 85 99 88 +3 85 92 99 +3 88 99 92 +3 88 96 99 +3 86 98 103 +3 94 103 98 +3 86 94 98 +3 94 98 95 +3 93 106 113 +3 88 93 113 +3 88 106 93 +3 88 113 106 +3 88 99 93 +3 93 99 106 +3 88 106 99 +3 99 110 105 +3 88 105 110 +3 88 99 105 +3 88 110 99 +3 88 110 92 +3 92 110 99 +3 88 104 105 +3 88 113 104 +3 104 113 105 +3 88 105 113 +3 101 113 104 +3 88 113 101 +3 93 96 99 +3 88 113 99 +3 99 113 106 +3 93 113 101 +3 99 105 113 +3 90 104 105 +3 92 105 110 +3 89 107 105 +3 89 90 107 +3 90 105 107 +3 95 98 115 +3 89 115 98 +3 105 115 107 +3 89 107 115 +3 89 118 115 +3 89 107 118 +3 107 115 118 +3 89 118 98 +3 98 118 115 +3 90 116 105 +3 104 105 116 +3 90 104 116 +3 105 107 116 +3 90 116 107 +3 91 99 102 +3 91 102 96 +3 96 102 99 +3 105 110 112 +3 92 112 110 +3 93 96 106 +3 96 99 106 +3 94 98 114 +3 94 114 95 +3 95 114 98 +3 94 95 122 +3 94 122 100 +3 95 100 122 +3 98 114 103 +3 94 103 114 +3 95 122 114 +3 94 114 122 +3 95 139 115 +3 95 119 139 +3 115 139 119 +3 95 115 119 +3 95 139 109 +3 109 139 115 +3 95 114 115 +3 98 115 114 +3 95 119 122 +3 100 122 119 +3 95 100 119 +3 95 122 115 +3 114 115 122 +3 115 119 122 +3 99 106 102 +3 96 102 106 +3 97 108 104 +3 97 101 108 +3 101 104 108 +3 98 118 117 +3 115 117 118 +3 98 117 115 +3 98 117 114 +3 114 117 115 +3 103 117 114 +3 98 117 103 +3 99 113 110 +3 106 110 113 +3 99 110 106 +3 99 111 106 +3 99 110 111 +3 106 111 110 +3 105 113 110 +3 99 111 102 +3 102 111 106 +3 100 137 119 +3 100 122 137 +3 119 137 122 +3 101 113 108 +3 101 127 113 +3 108 113 127 +3 101 108 127 +3 101 104 127 +3 104 108 127 +3 104 127 113 +3 116 127 144 +3 104 127 116 +3 104 144 127 +3 104 116 144 +3 104 144 113 +3 113 144 127 +3 104 105 144 +3 105 116 144 +3 105 144 113 +3 105 148 162 +3 105 162 116 +3 105 116 148 +3 116 162 148 +3 105 113 145 +3 105 145 110 +3 110 145 113 +3 107 162 174 +3 105 174 162 +3 105 107 174 +3 105 162 107 +3 105 112 140 +3 109 140 112 +3 105 140 109 +3 105 140 115 +3 109 115 140 +3 105 175 115 +3 105 140 175 +3 115 175 140 +3 105 107 148 +3 107 116 148 +3 115 174 162 +3 105 115 162 +3 105 174 115 +3 107 148 162 +3 105 163 162 +3 105 175 163 +3 162 163 175 +3 105 162 175 +3 115 162 175 +3 105 140 163 +3 140 175 163 +3 116 144 162 +3 105 162 144 +3 112 163 145 +3 105 145 163 +3 105 112 145 +3 105 163 112 +3 105 145 144 +3 105 162 145 +3 144 145 162 +3 110 112 145 +3 107 174 115 +3 145 163 162 +3 112 140 163 +3 113 145 144 +3 110 120 111 +3 106 120 110 +3 106 111 120 +3 106 120 113 +3 110 113 120 +3 146 148 162 +3 107 146 162 +3 107 148 146 +3 107 174 146 +3 107 146 115 +3 115 146 174 +3 146 162 174 +3 107 146 118 +3 115 118 146 +3 115 156 139 +3 109 139 156 +3 109 156 115 +3 115 140 156 +3 109 156 140 +3 110 112 155 +3 112 145 155 +3 110 155 145 +3 110 145 120 +3 113 120 145 +3 110 131 145 +3 110 155 131 +3 131 155 145 +3 110 131 111 +3 110 120 131 +3 111 131 120 +3 120 131 145 +3 131 147 155 +3 110 155 147 +3 110 147 131 +3 112 155 147 +3 110 112 147 +3 145 155 163 +3 112 163 155 +3 147 163 155 +3 112 163 147 +3 112 140 147 +3 140 163 147 +3 114 167 117 +3 114 153 167 +3 117 167 153 +3 114 117 153 +3 114 167 122 +3 114 122 169 +3 114 169 167 +3 122 167 169 +3 114 169 117 +3 117 169 167 +3 114 115 169 +3 115 122 169 +3 115 169 117 +3 119 189 139 +3 115 189 119 +3 115 139 189 +3 115 139 194 +3 139 189 194 +3 115 194 189 +3 140 156 175 +3 115 175 156 +3 117 118 169 +3 115 169 118 +3 115 179 194 +3 139 194 179 +3 115 139 179 +3 115 122 192 +3 122 169 192 +3 115 192 169 +3 115 192 175 +3 174 175 192 +3 115 175 174 +3 115 174 192 +3 115 192 118 +3 118 192 169 +3 162 175 174 +3 139 179 156 +3 115 156 179 +3 115 175 194 +3 175 179 194 +3 115 179 175 +3 115 118 174 +3 118 146 174 +3 118 174 192 +3 115 192 194 +3 175 194 192 +3 115 189 122 +3 119 122 189 +3 115 122 194 +3 122 192 194 +3 156 179 175 +3 122 194 189 +3 116 144 152 +3 116 152 162 +3 144 162 152 +3 148 152 162 +3 116 152 148 +3 127 144 152 +3 116 127 152 +3 117 169 153 +3 153 169 167 +3 146 174 183 +3 118 183 174 +3 118 146 183 +3 118 183 192 +3 174 192 183 +3 169 183 192 +3 118 183 169 +3 122 189 185 +3 119 122 185 +3 119 185 189 +3 122 185 137 +3 119 137 185 +3 121 150 125 +3 121 125 126 +3 121 126 150 +3 125 150 126 +3 121 126 135 +3 121 135 150 +3 126 150 135 +3 122 166 169 +3 122 167 166 +3 166 167 169 +3 166 189 185 +3 122 166 185 +3 122 189 166 +3 166 169 192 +3 122 166 192 +3 166 194 189 +3 122 194 166 +3 166 192 194 +3 122 166 137 +3 137 166 185 +3 123 126 177 +3 123 176 126 +3 126 176 177 +3 123 177 176 +3 123 150 138 +3 123 132 150 +3 132 138 150 +3 123 138 132 +3 125 150 138 +3 123 150 125 +3 123 125 138 +3 123 124 128 +3 124 197 128 +3 123 128 197 +3 123 197 124 +3 123 177 150 +3 132 150 177 +3 123 132 177 +3 126 197 176 +3 123 197 126 +3 123 176 197 +3 126 128 197 +3 123 128 126 +3 123 177 197 +3 176 197 177 +3 124 132 197 +3 123 132 124 +3 123 197 132 +3 123 126 125 +3 123 150 126 +3 123 125 132 +3 125 138 132 +3 126 177 150 +3 132 177 197 +3 133 157 180 +3 124 157 133 +3 124 180 157 +3 124 133 180 +3 124 157 130 +3 130 157 133 +3 124 130 133 +3 124 161 136 +3 124 129 161 +3 129 136 161 +3 124 136 129 +3 124 180 161 +3 124 129 180 +3 129 161 180 +3 129 180 130 +3 124 130 180 +3 124 129 130 +3 130 180 157 +3 134 180 161 +3 124 180 134 +3 124 134 161 +3 134 197 180 +3 124 197 134 +3 124 180 197 +3 128 133 197 +3 124 133 128 +3 124 197 133 +3 134 161 136 +3 124 134 136 +3 132 197 134 +3 124 132 134 +3 133 180 197 +3 128 197 176 +3 126 128 176 +3 126 176 150 +3 150 176 177 +3 126 135 176 +3 126 176 142 +3 126 142 135 +3 135 142 176 +3 135 176 150 +3 126 128 142 +3 128 176 142 +3 126 142 143 +3 135 143 142 +3 126 143 135 +3 133 197 151 +3 128 133 151 +3 128 151 197 +3 128 142 197 +3 128 159 142 +3 142 159 197 +3 128 197 159 +3 142 197 176 +3 128 151 159 +3 151 197 159 +3 130 157 141 +3 130 141 133 +3 133 141 157 +3 138 150 177 +3 132 138 177 +3 134 149 219 +3 132 149 134 +3 132 219 149 +3 132 134 219 +3 132 164 149 +3 149 164 219 +3 132 219 164 +3 132 197 164 +3 164 197 219 +3 132 219 197 +3 134 219 197 +3 132 177 164 +3 164 177 197 +3 132 164 138 +3 138 164 149 +3 132 138 149 +3 138 177 164 +3 133 141 151 +3 141 157 151 +3 133 151 157 +3 133 157 197 +3 157 180 197 +3 151 157 197 +3 134 197 161 +3 161 197 180 +3 136 158 161 +3 134 161 158 +3 134 158 136 +3 149 219 182 +3 134 149 182 +3 134 182 219 +3 134 197 158 +3 158 197 161 +3 134 149 158 +3 134 158 182 +3 149 182 158 +3 134 158 219 +3 158 182 219 +3 158 219 197 +3 142 176 143 +3 135 143 176 +3 136 171 161 +3 158 161 171 +3 136 158 171 +3 166 185 168 +3 137 168 185 +3 137 166 168 +3 139 184 194 +3 139 189 184 +3 184 189 194 +3 139 179 184 +3 156 184 179 +3 139 184 156 +3 179 184 194 +3 156 175 173 +3 140 173 175 +3 140 156 173 +3 147 173 163 +3 140 173 147 +3 140 163 173 +3 140 156 165 +3 156 173 165 +3 140 165 173 +3 165 173 170 +3 140 165 170 +3 140 170 173 +3 163 173 175 +3 147 170 173 +3 140 170 147 +3 151 160 157 +3 141 160 151 +3 141 157 160 +3 154 159 176 +3 142 159 154 +3 142 176 159 +3 142 154 176 +3 142 154 143 +3 143 154 176 +3 159 197 176 +3 146 174 172 +3 172 174 183 +3 146 172 183 +3 146 162 172 +3 162 174 172 +3 146 148 172 +3 148 162 172 +3 163 170 173 +3 147 170 163 +3 149 182 164 +3 149 181 182 +3 164 182 181 +3 149 164 181 +3 164 219 182 +3 157 197 195 +3 151 157 195 +3 151 195 197 +3 151 160 195 +3 157 195 160 +3 190 195 197 +3 151 195 190 +3 151 190 197 +3 178 195 190 +3 151 178 190 +3 151 195 178 +3 151 190 159 +3 159 190 197 +3 151 160 178 +3 160 195 178 +3 167 188 169 +3 153 188 167 +3 153 169 188 +3 154 159 186 +3 154 186 191 +3 154 191 159 +3 159 191 186 +3 159 176 191 +3 154 191 176 +3 156 179 165 +3 165 179 173 +3 156 173 179 +3 173 179 175 +3 157 180 195 +3 180 197 195 +3 158 219 161 +3 161 219 197 +3 158 219 198 +3 158 205 219 +3 198 219 205 +3 158 198 205 +3 158 161 198 +3 161 171 198 +3 158 198 171 +3 158 161 205 +3 161 198 205 +3 158 193 171 +3 158 198 193 +3 171 193 198 +3 161 205 219 +3 158 182 187 +3 158 187 219 +3 182 219 187 +3 158 187 198 +3 187 219 198 +3 187 198 193 +3 158 187 193 +3 191 199 197 +3 159 191 197 +3 159 199 191 +3 159 197 199 +3 186 199 191 +3 159 199 186 +3 159 190 199 +3 190 197 199 +3 176 191 197 +3 160 200 178 +3 160 195 200 +3 178 200 195 +3 161 197 205 +3 161 205 180 +3 180 205 197 +3 197 205 219 +3 164 202 181 +3 164 182 202 +3 181 202 182 +3 164 202 219 +3 164 197 202 +3 197 219 202 +3 164 177 202 +3 177 197 202 +3 182 202 219 +3 185 196 207 +3 166 196 185 +3 166 207 196 +3 166 185 207 +3 166 185 214 +3 185 207 214 +3 166 214 207 +3 166 196 168 +3 168 196 185 +3 189 214 194 +3 166 214 189 +3 166 194 214 +3 185 214 189 +3 166 167 192 +3 167 169 192 +3 166 167 207 +3 166 214 167 +3 167 214 207 +3 167 192 214 +3 166 214 192 +3 192 194 214 +3 167 201 207 +3 167 214 201 +3 201 214 207 +3 167 188 201 +3 188 217 201 +3 167 201 217 +3 167 217 188 +3 201 217 214 +3 167 214 217 +3 167 169 214 +3 169 192 214 +3 167 188 214 +3 169 214 188 +3 188 214 217 +3 169 215 192 +3 183 192 215 +3 169 183 215 +3 169 217 188 +3 169 214 217 +3 169 215 217 +3 169 214 215 +3 214 217 215 +3 192 214 215 +3 176 212 197 +3 176 191 212 +3 191 197 212 +3 176 212 177 +3 177 212 197 +3 177 212 202 +3 197 202 212 +3 178 200 190 +3 190 200 195 +3 180 234 197 +3 197 234 205 +3 180 205 234 +3 180 234 195 +3 195 234 197 +3 181 221 182 +3 182 221 202 +3 181 202 221 +3 181 221 208 +3 181 208 182 +3 182 208 221 +3 187 210 219 +3 182 210 187 +3 182 219 210 +3 208 221 210 +3 182 210 221 +3 182 208 210 +3 202 219 221 +3 182 221 219 +3 210 221 219 +3 189 194 206 +3 184 206 194 +3 184 189 206 +3 207 214 223 +3 185 223 214 +3 185 207 223 +3 196 223 218 +3 185 196 218 +3 185 223 196 +3 185 218 223 +3 196 207 223 +3 189 223 214 +3 185 223 189 +3 191 213 199 +3 186 213 191 +3 186 199 213 +3 199 213 225 +3 186 225 213 +3 186 199 225 +3 193 209 198 +3 187 209 193 +3 187 198 209 +3 209 210 219 +3 187 209 219 +3 187 210 209 +3 198 209 219 +3 201 216 217 +3 188 216 201 +3 188 217 216 +3 188 203 201 +3 188 216 203 +3 201 203 216 +3 206 223 230 +3 189 230 223 +3 189 206 230 +3 189 223 206 +3 214 230 223 +3 189 230 214 +3 206 230 214 +3 189 206 214 +3 194 206 214 +3 190 195 229 +3 195 197 229 +3 190 229 197 +3 190 200 229 +3 195 229 200 +3 190 200 227 +3 190 227 229 +3 200 229 227 +3 190 229 199 +3 197 199 229 +3 190 227 199 +3 199 227 229 +3 197 233 199 +3 191 199 233 +3 191 233 197 +3 213 225 233 +3 191 225 213 +3 191 233 225 +3 191 213 233 +3 191 233 212 +3 197 212 233 +3 191 225 199 +3 199 233 225 +3 193 211 204 +3 198 204 211 +3 193 204 198 +3 193 198 211 +3 198 211 209 +3 193 209 211 +3 195 234 229 +3 197 229 234 +3 207 223 218 +3 196 207 218 +3 207 218 235 +3 196 235 218 +3 196 207 235 +3 197 259 233 +3 212 233 259 +3 197 212 259 +3 197 246 234 +3 197 229 246 +3 229 234 246 +3 197 225 199 +3 197 233 225 +3 197 219 212 +3 202 212 219 +3 246 274 259 +3 197 246 259 +3 197 274 246 +3 197 259 274 +3 197 233 246 +3 225 246 233 +3 197 246 225 +3 197 234 259 +3 197 259 219 +3 197 219 234 +3 219 259 234 +3 212 259 241 +3 197 212 241 +3 197 241 259 +3 197 234 274 +3 234 259 274 +3 205 219 234 +3 197 199 246 +3 199 229 246 +3 197 241 219 +3 219 241 259 +3 199 246 225 +3 234 274 246 +3 233 246 259 +3 212 241 219 +3 219 220 228 +3 198 228 220 +3 198 219 228 +3 198 220 219 +3 198 211 228 +3 198 228 209 +3 209 228 211 +3 198 220 236 +3 219 236 220 +3 198 236 219 +3 198 236 205 +3 205 236 219 +3 209 219 228 +3 198 211 220 +3 211 228 220 +3 204 211 220 +3 198 204 220 +3 199 227 246 +3 227 229 246 +3 201 217 251 +3 201 251 214 +3 214 251 217 +3 201 251 231 +3 207 231 251 +3 201 231 207 +3 201 207 251 +3 216 231 232 +3 201 232 231 +3 201 216 232 +3 201 231 216 +3 207 251 214 +3 201 216 251 +3 216 217 251 +3 201 203 231 +3 203 232 231 +3 201 232 203 +3 203 216 232 +3 216 251 231 +3 202 212 241 +3 202 241 219 +3 202 241 221 +3 219 221 241 +3 204 211 226 +3 204 226 220 +3 211 220 226 +3 205 256 234 +3 205 219 256 +3 219 234 256 +3 219 256 236 +3 205 236 256 +3 207 248 235 +3 207 218 248 +3 218 235 248 +3 207 251 248 +3 207 248 214 +3 214 248 251 +3 214 223 248 +3 207 248 223 +3 207 251 235 +3 235 251 248 +3 231 251 245 +3 207 245 251 +3 207 231 245 +3 207 245 235 +3 235 245 251 +3 218 248 223 +3 208 222 210 +3 210 222 221 +3 208 221 222 +3 208 224 222 +3 208 221 224 +3 221 222 224 +3 209 239 219 +3 209 210 239 +3 210 219 239 +3 219 228 239 +3 209 239 228 +3 210 219 238 +3 210 238 239 +3 219 239 238 +3 210 221 238 +3 219 238 221 +3 221 238 222 +3 210 222 238 +3 220 226 228 +3 211 228 226 +3 225 233 250 +3 213 225 250 +3 213 250 233 +3 215 251 217 +3 214 251 215 +3 214 230 248 +3 223 248 230 +3 215 251 258 +3 217 258 251 +3 215 258 217 +3 216 253 258 +3 216 258 217 +3 216 217 253 +3 217 258 253 +3 216 253 251 +3 216 251 258 +3 251 253 258 +3 216 253 232 +3 231 232 253 +3 216 231 253 +3 231 253 251 +3 218 255 248 +3 235 248 255 +3 218 235 255 +3 223 255 248 +3 218 255 223 +3 235 255 252 +3 218 252 255 +3 218 235 252 +3 219 242 228 +3 228 242 236 +3 219 228 236 +3 219 236 242 +3 238 260 239 +3 219 260 238 +3 219 239 260 +3 234 256 289 +3 219 234 289 +3 219 289 256 +3 260 277 270 +3 219 270 277 +3 219 260 270 +3 219 277 260 +3 221 244 238 +3 219 238 244 +3 219 244 221 +3 219 241 277 +3 219 277 259 +3 241 259 277 +3 219 244 260 +3 219 241 244 +3 241 260 244 +3 219 260 241 +3 238 244 260 +3 221 241 244 +3 234 289 259 +3 219 259 289 +3 219 239 270 +3 239 260 270 +3 219 270 242 +3 219 242 263 +3 219 263 270 +3 242 270 263 +3 236 263 256 +3 219 263 236 +3 219 256 263 +3 241 277 260 +3 220 228 236 +3 239 270 242 +3 219 239 242 +3 228 239 242 +3 219 256 270 +3 256 263 270 +3 236 242 263 +3 259 289 277 +3 219 277 289 +3 270 277 289 +3 219 270 289 +3 256 270 289 +3 220 226 237 +3 226 228 237 +3 220 237 228 +3 228 242 237 +3 220 237 242 +3 220 242 228 +3 220 242 236 +3 236 237 242 +3 220 237 236 +3 222 224 238 +3 221 238 224 +3 221 244 224 +3 224 244 238 +3 222 240 238 +3 224 238 240 +3 222 224 240 +3 223 255 243 +3 243 255 248 +3 223 243 248 +3 230 243 248 +3 223 243 230 +3 238 240 244 +3 224 244 240 +3 233 250 246 +3 225 246 250 +3 227 257 246 +3 227 229 257 +3 229 246 257 +3 246 257 274 +3 229 246 274 +3 229 274 257 +3 229 234 274 +3 232 253 249 +3 231 232 249 +3 231 249 253 +3 231 245 253 +3 231 249 245 +3 245 249 253 +3 245 253 251 +3 246 265 250 +3 233 250 265 +3 233 265 246 +3 233 265 259 +3 246 259 265 +3 256 289 281 +3 234 281 289 +3 234 256 281 +3 259 298 289 +3 234 289 298 +3 234 298 259 +3 259 274 298 +3 234 298 274 +3 274 281 298 +3 234 298 281 +3 234 281 274 +3 281 289 298 +3 235 245 248 +3 245 251 248 +3 235 280 248 +3 235 245 280 +3 245 248 280 +3 235 280 252 +3 235 255 280 +3 252 280 255 +3 248 255 280 +3 235 267 252 +3 235 280 267 +3 252 267 280 +3 252 266 267 +3 235 267 266 +3 235 266 252 +3 235 245 267 +3 245 280 267 +3 236 247 242 +3 236 237 247 +3 237 242 247 +3 256 261 263 +3 236 261 256 +3 236 263 261 +3 242 263 261 +3 236 242 261 +3 242 261 247 +3 236 247 261 +3 244 260 254 +3 238 244 254 +3 238 254 260 +3 238 240 254 +3 240 244 254 +3 241 277 244 +3 244 277 260 +3 241 271 277 +3 259 277 271 +3 241 259 271 +3 244 271 277 +3 241 271 244 +3 242 263 247 +3 247 263 261 +3 243 262 248 +3 243 255 262 +3 248 262 255 +3 254 277 260 +3 244 277 254 +3 244 271 264 +3 254 264 271 +3 244 264 254 +3 244 254 271 +3 254 271 277 +3 267 269 272 +3 245 267 272 +3 245 269 267 +3 245 272 269 +3 245 251 283 +3 245 280 251 +3 251 280 283 +3 245 283 280 +3 248 280 251 +3 245 253 283 +3 251 283 253 +3 245 267 283 +3 267 272 283 +3 245 283 272 +3 245 272 253 +3 249 253 272 +3 245 249 272 +3 249 272 269 +3 245 249 269 +3 267 283 280 +3 253 283 272 +3 246 275 274 +3 246 257 275 +3 257 274 275 +3 246 275 265 +3 246 298 275 +3 265 275 298 +3 246 265 298 +3 246 298 274 +3 274 298 275 +3 246 298 259 +3 259 265 298 +3 250 275 265 +3 246 275 250 +3 248 273 280 +3 255 280 273 +3 248 255 273 +3 255 273 262 +3 248 262 273 +3 250 275 268 +3 250 268 265 +3 265 268 275 +3 253 258 283 +3 251 283 258 +3 252 273 278 +3 252 255 273 +3 255 278 273 +3 252 278 255 +3 252 280 278 +3 273 278 280 +3 252 273 280 +3 266 267 276 +3 252 276 267 +3 252 266 276 +3 267 280 276 +3 252 276 280 +3 276 280 278 +3 252 276 278 +3 272 282 283 +3 253 282 272 +3 253 283 282 +3 253 258 282 +3 258 283 282 +3 254 264 260 +3 254 277 264 +3 260 264 277 +3 264 271 277 +3 255 278 262 +3 262 278 273 +3 270 289 279 +3 256 279 289 +3 256 270 279 +3 279 289 292 +3 256 292 289 +3 256 279 292 +3 279 292 281 +3 256 281 292 +3 256 279 281 +3 281 292 289 +3 263 270 279 +3 256 263 279 +3 261 263 279 +3 256 261 279 +3 257 274 294 +3 257 294 275 +3 274 275 294 +3 275 285 294 +3 257 285 275 +3 257 294 285 +3 259 290 295 +3 259 286 290 +3 286 295 290 +3 259 295 286 +3 265 295 284 +3 259 295 265 +3 259 284 295 +3 259 265 284 +3 289 295 298 +3 259 298 295 +3 259 295 289 +3 259 284 286 +3 284 295 286 +3 271 290 277 +3 259 277 290 +3 259 290 271 +3 259 290 289 +3 289 290 295 +3 277 290 289 +3 265 298 295 +3 271 286 290 +3 259 286 271 +3 265 305 284 +3 265 295 305 +3 284 305 295 +3 265 291 275 +3 268 275 291 +3 265 268 291 +3 265 305 298 +3 265 291 305 +3 291 298 305 +3 265 298 291 +3 265 275 317 +3 275 298 317 +3 265 317 298 +3 265 317 291 +3 291 317 298 +3 284 291 305 +3 265 291 284 +3 295 305 298 +3 275 317 291 +3 266 300 276 +3 266 267 300 +3 267 276 300 +3 276 297 300 +3 266 300 297 +3 266 297 276 +3 267 269 287 +3 269 283 287 +3 267 287 283 +3 267 283 269 +3 300 311 303 +3 267 303 311 +3 267 300 303 +3 267 311 300 +3 269 272 283 +3 267 310 287 +3 287 310 300 +3 267 287 300 +3 267 300 310 +3 267 303 276 +3 276 303 311 +3 267 276 311 +3 267 310 280 +3 280 310 283 +3 267 283 310 +3 276 311 280 +3 267 280 311 +3 283 310 287 +3 300 310 311 +3 267 311 310 +3 276 300 303 +3 280 311 310 +3 268 288 304 +3 288 301 304 +3 268 304 301 +3 268 301 288 +3 275 291 288 +3 268 275 288 +3 268 288 291 +3 288 291 301 +3 268 301 291 +3 272 283 287 +3 269 272 287 +3 272 306 293 +3 269 293 306 +3 269 272 293 +3 269 306 272 +3 287 293 306 +3 269 293 287 +3 269 287 306 +3 272 287 306 +3 272 306 283 +3 272 282 306 +3 282 283 306 +3 272 310 283 +3 272 306 310 +3 283 310 306 +3 272 287 310 +3 287 306 310 +3 274 299 298 +3 281 298 299 +3 274 281 299 +3 294 316 298 +3 274 294 298 +3 274 316 294 +3 274 298 316 +3 275 294 298 +3 274 298 308 +3 274 308 316 +3 298 316 308 +3 298 308 299 +3 274 299 308 +3 274 308 294 +3 294 308 316 +3 275 316 298 +3 275 294 316 +3 275 316 314 +3 275 317 316 +3 314 316 317 +3 275 314 317 +3 291 314 317 +3 275 314 291 +3 294 316 307 +3 275 294 307 +3 275 307 316 +3 285 294 307 +3 275 285 307 +3 275 307 314 +3 307 316 314 +3 298 317 316 +3 288 307 314 +3 275 307 288 +3 275 288 314 +3 288 314 291 +3 276 303 278 +3 278 303 311 +3 276 278 311 +3 297 300 303 +3 276 297 303 +3 278 311 280 +3 278 302 311 +3 278 303 302 +3 302 303 311 +3 281 292 299 +3 281 298 292 +3 292 298 299 +3 289 298 292 +3 283 306 313 +3 282 283 313 +3 282 313 306 +3 283 310 313 +3 306 313 310 +3 285 294 319 +3 285 319 307 +3 294 307 319 +3 285 319 296 +3 285 296 307 +3 296 319 307 +3 287 293 325 +3 293 306 325 +3 287 325 306 +3 287 331 310 +3 287 306 331 +3 306 310 331 +3 287 325 309 +3 309 325 321 +3 287 309 321 +3 287 321 325 +3 287 325 331 +3 306 331 325 +3 321 325 331 +3 287 321 331 +3 300 321 331 +3 287 321 300 +3 287 300 331 +3 287 293 309 +3 293 325 309 +3 300 331 310 +3 307 314 324 +3 288 307 324 +3 288 324 314 +3 288 324 304 +3 304 324 314 +3 288 304 314 +3 288 314 301 +3 291 301 314 +3 301 304 314 +3 291 318 322 +3 291 315 318 +3 315 322 318 +3 291 322 315 +3 291 318 317 +3 314 317 318 +3 291 314 318 +3 291 301 322 +3 291 318 301 +3 301 318 322 +3 301 314 318 +3 305 318 317 +3 291 318 305 +3 291 305 317 +3 305 315 318 +3 291 315 305 +3 298 305 317 +3 307 319 316 +3 294 316 319 +3 295 305 317 +3 295 317 298 +3 295 318 317 +3 295 305 318 +3 296 319 312 +3 307 312 319 +3 296 312 307 +3 297 300 320 +3 297 320 323 +3 297 323 300 +3 300 323 320 +3 300 303 323 +3 297 323 303 +3 300 321 339 +3 321 331 339 +3 300 339 331 +3 300 338 339 +3 300 332 338 +3 332 339 338 +3 300 339 332 +3 310 339 331 +3 300 339 310 +3 303 323 339 +3 300 339 323 +3 300 303 339 +3 303 339 311 +3 300 311 339 +3 300 338 323 +3 323 338 339 +3 300 321 332 +3 321 339 332 +3 320 332 338 +3 300 320 338 +3 300 332 320 +3 310 311 339 +3 320 338 323 +3 301 327 314 +3 301 304 327 +3 304 314 327 +3 314 322 327 +3 301 322 314 +3 301 327 322 +3 314 318 322 +3 302 303 326 +3 303 311 326 +3 302 326 311 +3 303 323 311 +3 311 323 339 +3 311 326 323 +3 303 323 326 +3 304 324 333 +3 304 333 314 +3 314 333 324 +3 304 333 327 +3 314 327 333 +3 304 328 333 +3 324 333 328 +3 304 324 328 +3 310 331 313 +3 306 313 331 +3 306 329 325 +3 325 329 331 +3 306 331 329 +3 306 313 329 +3 313 331 329 +3 307 314 334 +3 307 341 314 +3 314 341 334 +3 307 334 341 +3 307 342 319 +3 312 319 342 +3 307 312 342 +3 307 359 334 +3 334 359 342 +3 307 334 342 +3 307 342 359 +3 307 335 342 +3 312 342 335 +3 307 312 335 +3 307 335 359 +3 335 342 359 +3 307 319 334 +3 307 334 316 +3 316 334 319 +3 319 334 342 +3 324 359 341 +3 307 359 324 +3 307 341 359 +3 307 324 341 +3 314 334 316 +3 324 335 359 +3 307 335 324 +3 334 341 359 +3 314 324 341 +3 321 330 325 +3 309 330 321 +3 309 325 330 +3 323 339 326 +3 311 326 339 +3 314 336 327 +3 314 322 336 +3 322 327 336 +3 327 333 336 +3 314 336 333 +3 314 333 360 +3 314 360 324 +3 324 360 333 +3 316 317 334 +3 314 334 317 +3 324 341 360 +3 314 360 341 +3 314 341 318 +3 317 318 341 +3 314 317 341 +3 314 318 336 +3 318 322 336 +3 314 336 347 +3 333 347 336 +3 314 347 333 +3 314 347 360 +3 333 360 347 +3 318 336 341 +3 314 341 336 +3 317 341 334 +3 336 347 341 +3 314 341 347 +3 341 347 360 +3 319 346 342 +3 319 334 346 +3 334 342 346 +3 320 337 338 +3 320 332 337 +3 332 338 337 +3 321 348 365 +3 321 365 343 +3 321 343 348 +3 343 365 348 +3 321 340 366 +3 321 366 365 +3 321 365 340 +3 340 365 366 +3 325 343 330 +3 321 330 343 +3 321 343 325 +3 321 365 339 +3 321 331 365 +3 331 339 365 +3 321 366 339 +3 339 366 365 +3 321 331 343 +3 331 365 343 +3 325 331 343 +3 321 348 330 +3 321 330 351 +3 321 351 348 +3 330 348 351 +3 339 340 366 +3 321 340 339 +3 340 348 365 +3 321 348 340 +3 332 340 339 +3 321 340 332 +3 340 351 348 +3 321 351 340 +3 330 343 348 +3 326 353 339 +3 323 353 326 +3 323 339 353 +3 323 338 353 +3 338 339 353 +3 324 363 359 +3 335 359 363 +3 324 335 363 +3 324 360 328 +3 328 360 333 +3 324 345 328 +3 324 328 349 +3 324 349 345 +3 328 345 349 +3 324 345 363 +3 335 363 345 +3 324 335 345 +3 345 363 360 +3 324 360 363 +3 324 345 360 +3 359 360 363 +3 324 360 359 +3 324 349 360 +3 345 360 349 +3 328 349 360 +3 341 360 359 +3 325 329 343 +3 329 331 343 +3 325 343 348 +3 325 348 330 +3 327 333 347 +3 327 347 336 +3 328 349 333 +3 333 349 360 +3 328 356 349 +3 328 345 356 +3 345 349 356 +3 329 331 354 +3 331 343 354 +3 329 354 343 +3 330 348 350 +3 330 350 351 +3 348 351 350 +3 331 365 354 +3 343 354 365 +3 332 362 344 +3 332 355 362 +3 344 362 355 +3 332 344 355 +3 332 366 339 +3 332 340 366 +3 332 337 355 +3 337 344 355 +3 332 344 337 +3 332 366 367 +3 338 367 366 +3 332 367 338 +3 332 338 366 +3 332 386 366 +3 340 366 386 +3 332 340 386 +3 332 338 355 +3 337 355 338 +3 340 386 362 +3 332 340 362 +3 332 362 386 +3 366 367 386 +3 332 386 367 +3 338 366 339 +3 355 386 367 +3 332 386 355 +3 332 355 367 +3 355 362 386 +3 338 355 367 +3 347 357 360 +3 333 357 347 +3 333 360 357 +3 333 349 357 +3 349 360 357 +3 334 359 346 +3 342 346 359 +3 335 363 361 +3 335 361 345 +3 345 361 363 +3 335 358 342 +3 335 364 358 +3 342 358 364 +3 335 342 364 +3 335 352 364 +3 342 364 352 +3 335 342 352 +3 335 363 352 +3 352 363 361 +3 335 352 361 +3 342 359 363 +3 335 342 363 +3 335 358 363 +3 342 363 358 +3 352 364 363 +3 335 363 364 +3 358 363 364 +3 339 353 366 +3 338 366 353 +3 338 367 353 +3 353 367 366 +3 365 366 386 +3 340 365 386 +3 351 386 375 +3 340 375 386 +3 340 351 375 +3 340 386 351 +3 351 365 386 +3 340 365 351 +3 348 365 351 +3 340 375 362 +3 362 375 386 +3 342 368 358 +3 358 368 363 +3 342 363 368 +3 342 368 359 +3 342 346 368 +3 346 359 368 +3 342 346 358 +3 346 368 358 +3 359 363 368 +3 354 365 369 +3 343 354 369 +3 343 369 365 +3 343 369 348 +3 348 369 365 +3 344 362 372 +3 344 372 355 +3 355 372 362 +3 344 376 372 +3 344 362 376 +3 362 372 376 +3 345 425 385 +3 345 361 425 +3 361 385 425 +3 345 385 361 +3 345 356 371 +3 345 374 356 +3 356 374 371 +3 345 371 374 +3 345 349 371 +3 349 356 371 +3 361 363 385 +3 345 385 363 +3 345 370 415 +3 361 415 370 +3 345 415 361 +3 345 361 370 +3 345 385 360 +3 360 385 363 +3 345 415 374 +3 345 371 415 +3 371 374 415 +3 345 415 385 +3 345 425 415 +3 385 415 425 +3 356 370 374 +3 345 370 356 +3 345 374 370 +3 361 425 415 +3 345 385 349 +3 349 385 360 +3 349 371 385 +3 345 385 371 +3 370 415 374 +3 371 415 385 +3 348 369 386 +3 348 386 365 +3 365 386 369 +3 348 378 351 +3 348 369 378 +3 351 378 369 +3 348 351 369 +3 348 386 351 +3 348 378 350 +3 350 378 351 +3 351 369 386 +3 349 371 391 +3 371 385 391 +3 349 391 385 +3 349 373 391 +3 371 391 373 +3 349 371 373 +3 349 360 373 +3 357 373 360 +3 349 373 357 +3 349 391 360 +3 360 391 385 +3 360 373 391 +3 350 380 351 +3 351 380 378 +3 350 378 380 +3 369 386 378 +3 351 378 386 +3 375 378 386 +3 351 378 375 +3 375 380 378 +3 351 380 375 +3 363 409 364 +3 352 364 409 +3 352 409 363 +3 379 399 409 +3 352 379 409 +3 352 399 379 +3 352 409 399 +3 352 409 361 +3 361 409 363 +3 364 409 399 +3 352 364 399 +3 361 379 409 +3 352 379 361 +3 353 392 366 +3 353 367 392 +3 366 392 367 +3 365 369 382 +3 354 382 369 +3 354 365 382 +3 355 386 372 +3 355 372 367 +3 367 372 386 +3 362 386 372 +3 356 370 377 +3 370 374 377 +3 356 377 374 +3 363 387 368 +3 358 387 363 +3 358 368 387 +3 363 364 387 +3 358 387 364 +3 364 394 387 +3 358 387 394 +3 358 394 364 +3 359 363 397 +3 363 368 397 +3 359 397 368 +3 359 363 385 +3 363 397 385 +3 359 385 397 +3 359 360 385 +3 361 423 409 +3 361 379 423 +3 379 409 423 +3 361 428 425 +3 423 425 428 +3 361 425 423 +3 361 423 428 +3 363 423 409 +3 361 423 363 +3 379 428 400 +3 361 379 400 +3 361 428 379 +3 361 400 428 +3 370 425 415 +3 361 425 370 +3 379 423 428 +3 361 425 363 +3 363 425 423 +3 361 400 370 +3 370 400 428 +3 361 370 428 +3 370 428 425 +3 363 385 425 +3 362 375 381 +3 362 376 375 +3 375 376 381 +3 362 381 376 +3 362 412 386 +3 362 375 412 +3 375 386 412 +3 362 412 372 +3 372 412 386 +3 375 412 376 +3 362 376 412 +3 372 376 412 +3 363 387 397 +3 368 397 387 +3 363 423 416 +3 363 416 409 +3 409 416 423 +3 363 394 397 +3 387 397 394 +3 363 387 394 +3 385 425 397 +3 363 397 425 +3 363 394 364 +3 364 394 409 +3 363 409 394 +3 397 425 423 +3 363 397 423 +3 363 397 416 +3 397 423 416 +3 394 397 416 +3 363 394 416 +3 394 416 409 +3 365 410 382 +3 369 382 410 +3 365 369 410 +3 369 410 386 +3 365 386 410 +3 366 386 410 +3 365 366 410 +3 367 386 392 +3 366 392 386 +3 366 392 421 +3 366 421 386 +3 386 421 392 +3 366 421 410 +3 386 410 421 +3 367 372 401 +3 372 386 401 +3 367 401 386 +3 367 401 392 +3 386 392 401 +3 369 410 418 +3 369 418 386 +3 386 418 410 +3 369 410 411 +3 369 411 418 +3 410 418 411 +3 382 410 411 +3 369 382 411 +3 369 418 378 +3 378 418 386 +3 374 377 414 +3 370 374 414 +3 370 414 377 +3 370 414 417 +3 377 417 414 +3 370 417 377 +3 370 415 414 +3 374 414 415 +3 400 414 417 +3 370 414 400 +3 370 400 417 +3 414 428 425 +3 370 414 425 +3 370 428 414 +3 400 428 414 +3 414 425 415 +3 385 391 415 +3 371 415 391 +3 374 415 407 +3 371 407 415 +3 371 374 407 +3 371 407 391 +3 391 407 415 +3 386 401 412 +3 372 412 401 +3 374 414 407 +3 407 414 415 +3 375 380 441 +3 375 386 380 +3 380 386 441 +3 375 441 386 +3 375 424 376 +3 376 424 412 +3 375 412 424 +3 375 381 424 +3 375 424 441 +3 375 441 381 +3 381 441 424 +3 375 441 383 +3 375 383 381 +3 381 383 441 +3 386 412 441 +3 375 441 412 +3 375 380 383 +3 380 441 383 +3 378 386 380 +3 376 381 424 +3 412 424 441 +3 376 405 424 +3 381 424 405 +3 376 381 405 +3 378 380 430 +3 378 430 402 +3 378 402 380 +3 380 402 430 +3 378 418 430 +3 378 380 418 +3 380 430 418 +3 380 418 386 +3 379 413 428 +3 379 433 413 +3 413 433 428 +3 379 428 433 +3 400 404 428 +3 379 404 400 +3 379 428 404 +3 404 413 428 +3 379 413 404 +3 409 423 428 +3 379 409 428 +3 379 399 428 +3 399 409 428 +3 399 433 413 +3 379 433 399 +3 379 399 413 +3 399 428 433 +3 380 418 441 +3 386 441 418 +3 383 430 441 +3 380 441 430 +3 380 430 383 +3 384 420 430 +3 380 384 430 +3 380 420 384 +3 380 430 420 +3 380 402 384 +3 384 402 420 +3 380 420 402 +3 418 441 430 +3 402 430 420 +3 380 384 383 +3 383 384 430 +3 424 445 441 +3 381 441 445 +3 381 445 424 +3 383 441 445 +3 381 383 445 +3 381 405 383 +3 381 383 398 +3 381 398 405 +3 383 405 398 +3 381 405 445 +3 383 445 405 +3 405 445 424 +3 383 442 384 +3 384 442 393 +3 383 384 393 +3 383 393 442 +3 383 429 405 +3 405 429 445 +3 383 445 429 +3 383 442 429 +3 383 445 442 +3 429 442 445 +3 383 442 420 +3 383 420 384 +3 384 420 442 +3 388 429 398 +3 383 429 388 +3 383 398 429 +3 383 388 398 +3 383 441 442 +3 441 445 442 +3 383 442 388 +3 388 442 429 +3 388 393 442 +3 383 393 388 +3 383 441 420 +3 420 441 442 +3 420 430 441 +3 383 430 420 +3 398 429 405 +3 390 420 393 +3 384 393 420 +3 384 390 393 +3 384 420 390 +3 393 420 442 +3 386 435 418 +3 418 435 441 +3 386 441 435 +3 386 438 410 +3 386 410 435 +3 386 435 438 +3 410 438 435 +3 412 441 421 +3 386 421 441 +3 386 412 421 +3 386 421 401 +3 392 401 421 +3 435 438 441 +3 386 441 438 +3 386 438 421 +3 410 421 438 +3 410 435 418 +3 401 412 421 +3 421 441 438 +3 387 416 394 +3 387 397 416 +3 388 396 442 +3 393 442 396 +3 388 393 396 +3 388 429 389 +3 389 429 398 +3 388 389 398 +3 396 442 422 +3 388 396 422 +3 388 422 442 +3 388 396 389 +3 389 396 422 +3 388 389 422 +3 422 442 429 +3 388 422 429 +3 389 422 429 +3 389 396 395 +3 395 396 422 +3 389 395 422 +3 420 442 439 +3 390 442 420 +3 390 439 442 +3 390 420 439 +3 390 406 393 +3 390 439 406 +3 393 406 439 +3 390 393 439 +3 390 442 393 +3 393 439 442 +3 401 421 419 +3 392 401 419 +3 392 419 421 +3 393 404 442 +3 393 403 404 +3 403 442 404 +3 393 442 403 +3 403 406 439 +3 393 403 439 +3 393 406 403 +3 396 404 442 +3 393 404 396 +3 403 439 442 +3 396 422 408 +3 395 408 422 +3 395 396 408 +3 396 434 422 +3 396 442 434 +3 422 434 442 +3 396 422 404 +3 404 422 408 +3 396 404 408 +3 396 404 434 +3 404 442 434 +3 404 434 422 +3 428 433 432 +3 399 432 433 +3 399 428 432 +3 409 428 432 +3 399 409 432 +3 403 404 428 +3 400 403 428 +3 400 404 403 +3 414 417 428 +3 400 428 417 +3 403 428 417 +3 400 403 417 +3 412 421 419 +3 401 412 419 +3 406 439 417 +3 403 406 417 +3 403 417 439 +3 428 447 460 +3 403 447 428 +3 403 460 447 +3 403 428 460 +3 404 428 460 +3 403 404 460 +3 417 447 428 +3 403 447 417 +3 417 439 447 +3 403 447 439 +3 403 442 460 +3 404 460 442 +3 439 460 447 +3 403 460 439 +3 439 442 460 +3 404 428 434 +3 428 460 434 +3 404 434 460 +3 404 434 408 +3 408 434 422 +3 428 434 433 +3 404 428 433 +3 404 433 434 +3 434 460 442 +3 404 413 433 +3 413 433 434 +3 404 413 434 +3 404 413 408 +3 408 413 434 +3 407 426 415 +3 407 414 426 +3 414 415 426 +3 423 428 432 +3 409 423 432 +3 416 423 431 +3 409 431 423 +3 409 416 431 +3 423 432 431 +3 409 431 432 +3 410 427 411 +3 411 427 418 +3 410 418 427 +3 418 427 435 +3 410 435 427 +3 412 437 421 +3 421 437 441 +3 412 441 437 +3 412 424 437 +3 424 441 437 +3 419 437 421 +3 412 437 419 +3 414 428 443 +3 414 443 440 +3 414 440 428 +3 428 440 443 +3 414 447 428 +3 414 417 447 +3 414 443 426 +3 425 426 443 +3 414 426 425 +3 414 425 443 +3 414 440 425 +3 425 440 428 +3 415 426 425 +3 428 443 447 +3 414 447 443 +3 425 443 440 +3 415 426 443 +3 415 443 425 +3 418 435 448 +3 418 448 441 +3 435 441 448 +3 418 427 448 +3 427 435 448 +3 418 448 430 +3 430 448 441 +3 419 437 436 +3 419 436 421 +3 421 436 437 +3 420 452 441 +3 430 441 452 +3 420 430 452 +3 420 442 452 +3 420 452 439 +3 439 452 442 +3 441 442 452 +3 437 441 438 +3 421 437 438 +3 421 436 438 +3 436 437 438 +3 436 438 450 +3 421 450 438 +3 421 436 450 +3 429 459 442 +3 422 459 429 +3 422 442 459 +3 422 434 459 +3 434 442 459 +3 428 446 440 +3 423 446 428 +3 423 440 446 +3 423 428 440 +3 423 431 428 +3 428 431 446 +3 423 446 431 +3 428 432 431 +3 423 425 440 +3 437 445 441 +3 424 445 437 +3 427 435 444 +3 435 448 444 +3 427 444 448 +3 428 440 447 +3 440 443 447 +3 428 446 460 +3 440 460 446 +3 428 460 440 +3 428 433 454 +3 433 446 454 +3 428 454 446 +3 428 446 433 +3 428 454 460 +3 446 460 454 +3 440 447 460 +3 428 432 446 +3 431 446 432 +3 433 460 434 +3 428 460 433 +3 432 446 433 +3 433 454 460 +3 442 445 467 +3 429 467 445 +3 429 442 467 +3 442 467 459 +3 429 459 467 +3 430 441 473 +3 430 473 452 +3 441 452 473 +3 430 448 473 +3 441 473 448 +3 431 451 432 +3 431 446 451 +3 432 451 446 +3 432 454 433 +3 432 446 454 +3 432 451 454 +3 446 454 451 +3 433 460 463 +3 433 463 434 +3 434 463 460 +3 454 460 463 +3 433 454 463 +3 434 460 459 +3 442 459 460 +3 434 463 459 +3 459 463 460 +3 435 444 464 +3 435 464 453 +3 435 453 444 +3 444 453 464 +3 435 464 448 +3 435 441 464 +3 441 448 464 +3 435 438 458 +3 435 458 464 +3 435 464 438 +3 438 464 458 +3 435 458 453 +3 453 458 464 +3 438 441 464 +3 444 464 448 +3 437 438 457 +3 436 457 438 +3 436 437 457 +3 449 457 450 +3 436 449 450 +3 436 457 449 +3 436 450 457 +3 438 450 457 +3 437 457 441 +3 437 441 475 +3 437 475 457 +3 441 457 475 +3 441 475 445 +3 437 445 475 +3 438 457 441 +3 438 457 482 +3 441 482 457 +3 438 482 441 +3 450 457 482 +3 438 450 482 +3 458 482 464 +3 438 464 482 +3 438 482 458 +3 438 450 458 +3 450 482 458 +3 441 464 482 +3 439 468 470 +3 460 470 468 +3 439 470 460 +3 439 460 468 +3 442 460 468 +3 439 442 468 +3 439 470 447 +3 447 470 460 +3 442 468 452 +3 439 452 468 +3 440 460 456 +3 446 456 460 +3 440 456 446 +3 440 443 456 +3 443 460 456 +3 440 460 443 +3 443 447 460 +3 441 452 475 +3 452 473 475 +3 441 475 473 +3 457 471 482 +3 441 471 457 +3 441 482 471 +3 473 482 475 +3 441 475 482 +3 441 482 473 +3 445 467 475 +3 441 467 445 +3 441 475 467 +3 448 482 473 +3 441 482 448 +3 457 475 471 +3 441 471 475 +3 471 475 482 +3 441 452 467 +3 452 475 467 +3 441 452 445 +3 445 452 467 +3 448 464 482 +3 442 452 445 +3 459 460 468 +3 442 459 468 +3 467 468 483 +3 442 467 483 +3 442 468 467 +3 442 483 468 +3 442 483 452 +3 452 483 468 +3 452 467 483 +3 442 467 452 +3 459 468 467 +3 443 447 462 +3 443 462 460 +3 447 460 462 +3 456 462 460 +3 443 462 456 +3 446 461 451 +3 451 461 454 +3 446 454 461 +3 454 461 456 +3 446 454 456 +3 446 456 461 +3 454 456 460 +3 447 470 462 +3 460 462 470 +3 464 482 473 +3 448 464 473 +3 450 455 457 +3 449 455 450 +3 449 457 455 +3 450 471 482 +3 450 457 471 +3 450 466 457 +3 455 457 466 +3 450 455 466 +3 450 482 466 +3 450 466 458 +3 458 466 482 +3 457 471 466 +3 450 466 471 +3 466 471 482 +3 451 479 454 +3 454 479 461 +3 451 461 479 +3 467 483 475 +3 452 475 483 +3 473 475 483 +3 452 473 483 +3 453 458 472 +3 458 465 472 +3 453 472 465 +3 453 465 458 +3 458 464 465 +3 453 465 464 +3 454 456 479 +3 454 479 460 +3 456 460 479 +3 456 479 461 +3 454 479 463 +3 460 463 479 +3 455 457 471 +3 455 471 466 +3 466 480 471 +3 455 471 480 +3 455 480 466 +3 460 484 462 +3 456 462 484 +3 456 484 460 +3 456 479 469 +3 456 476 479 +3 469 479 476 +3 456 469 476 +3 462 484 469 +3 456 462 469 +3 456 469 484 +3 456 476 461 +3 461 476 479 +3 456 460 469 +3 460 479 469 +3 460 469 484 +3 466 482 472 +3 458 472 482 +3 458 466 472 +3 464 472 482 +3 458 472 464 +3 464 465 472 +3 459 496 467 +3 467 496 468 +3 459 468 496 +3 459 491 496 +3 459 468 491 +3 468 496 491 +3 459 460 491 +3 460 468 491 +3 459 463 491 +3 460 491 463 +3 479 502 491 +3 460 502 479 +3 460 491 502 +3 460 479 491 +3 460 468 516 +3 468 491 516 +3 460 516 491 +3 460 479 484 +3 469 484 479 +3 463 479 491 +3 460 567 470 +3 460 484 567 +3 470 567 484 +3 460 470 484 +3 470 516 567 +3 460 567 516 +3 460 516 470 +3 460 502 484 +3 479 484 502 +3 468 516 470 +3 462 470 484 +3 484 567 491 +3 460 484 491 +3 460 491 567 +3 491 567 516 +3 484 491 502 +3 461 476 474 +3 461 474 479 +3 474 476 479 +3 469 478 484 +3 462 478 469 +3 462 484 478 +3 465 472 482 +3 464 465 482 +3 465 482 481 +3 464 481 482 +3 464 465 481 +3 481 482 490 +3 464 481 490 +3 464 490 482 +3 473 490 482 +3 464 490 473 +3 472 482 481 +3 465 472 481 +3 465 472 477 +3 465 477 481 +3 472 481 477 +3 472 486 482 +3 466 482 486 +3 466 486 472 +3 480 482 486 +3 466 480 486 +3 466 482 480 +3 471 482 480 +3 467 483 496 +3 467 496 475 +3 475 496 483 +3 468 483 496 +3 468 496 516 +3 491 516 496 +3 468 483 516 +3 483 496 516 +3 476 559 484 +3 469 476 484 +3 469 559 476 +3 469 484 559 +3 469 559 492 +3 469 492 488 +3 469 488 559 +3 488 492 559 +3 476 488 559 +3 469 488 476 +3 478 484 492 +3 469 478 492 +3 469 492 484 +3 484 559 492 +3 478 492 489 +3 469 478 489 +3 469 489 492 +3 476 484 479 +3 488 489 492 +3 469 489 488 +3 484 516 567 +3 470 516 484 +3 471 475 494 +3 471 494 482 +3 475 482 494 +3 480 494 482 +3 471 494 480 +3 472 485 477 +3 477 485 481 +3 472 481 485 +3 472 482 485 +3 481 485 482 +3 472 486 485 +3 482 485 486 +3 473 482 544 +3 482 509 544 +3 473 544 509 +3 473 509 482 +3 473 509 475 +3 475 509 482 +3 482 544 490 +3 473 490 544 +3 475 483 509 +3 473 509 483 +3 474 487 479 +3 476 479 487 +3 474 476 487 +3 475 509 494 +3 482 494 509 +3 475 539 494 +3 475 509 539 +3 494 539 509 +3 475 496 509 +3 483 509 496 +3 475 496 539 +3 496 509 539 +3 476 488 487 +3 476 502 488 +3 487 488 502 +3 476 487 502 +3 488 559 502 +3 476 502 559 +3 476 502 479 +3 476 484 502 +3 479 487 502 +3 484 502 559 +3 482 549 494 +3 480 549 482 +3 480 494 549 +3 480 549 486 +3 482 486 549 +3 486 511 549 +3 480 511 486 +3 480 549 511 +3 481 485 555 +3 481 490 485 +3 485 490 555 +3 481 555 490 +3 485 555 523 +3 481 485 523 +3 481 523 555 +3 482 490 485 +3 494 509 544 +3 482 494 544 +3 494 544 549 +3 482 549 544 +3 482 555 490 +3 482 544 555 +3 490 555 544 +3 482 490 486 +3 485 486 490 +3 482 555 486 +3 486 555 490 +3 486 549 555 +3 482 555 549 +3 544 555 549 +3 496 575 509 +3 483 509 575 +3 483 575 496 +3 496 516 575 +3 483 575 516 +3 484 502 567 +3 502 559 567 +3 484 567 559 +3 484 533 559 +3 533 567 559 +3 484 567 533 +3 492 533 559 +3 484 533 492 +3 491 502 567 +3 516 567 533 +3 484 516 533 +3 485 555 522 +3 485 522 523 +3 522 555 523 +3 485 555 486 +3 485 486 522 +3 486 555 522 +3 486 537 522 +3 486 522 511 +3 486 511 537 +3 511 522 537 +3 511 549 522 +3 486 522 549 +3 522 549 555 +3 487 488 505 +3 488 553 505 +3 487 505 553 +3 487 553 488 +3 487 553 502 +3 488 502 553 +3 488 489 521 +3 489 492 521 +3 488 521 492 +3 488 521 559 +3 492 559 521 +3 521 559 546 +3 488 546 559 +3 488 521 546 +3 488 559 553 +3 502 553 559 +3 505 546 553 +3 488 546 505 +3 488 553 546 +3 546 559 553 +3 489 492 530 +3 489 530 521 +3 492 521 530 +3 491 565 596 +3 491 567 565 +3 565 567 596 +3 491 596 567 +3 491 567 496 +3 496 567 516 +3 502 567 565 +3 491 502 565 +3 491 596 496 +3 496 596 567 +3 492 559 561 +3 492 561 521 +3 521 561 559 +3 521 530 561 +3 492 561 530 +3 492 533 561 +3 533 559 561 +3 493 504 499 +3 499 504 560 +3 493 499 560 +3 493 560 504 +3 493 570 513 +3 493 513 515 +3 493 515 570 +3 513 570 515 +3 508 513 515 +3 493 508 515 +3 493 513 508 +3 499 570 593 +3 493 499 593 +3 493 570 499 +3 493 593 570 +3 493 513 593 +3 493 497 513 +3 497 593 513 +3 493 593 497 +3 493 515 520 +3 515 570 520 +3 493 520 570 +3 493 499 497 +3 497 499 593 +3 504 520 560 +3 493 560 520 +3 493 520 504 +3 513 593 570 +3 499 560 570 +3 493 570 560 +3 520 570 560 +3 493 520 503 +3 493 503 504 +3 503 520 504 +3 494 606 544 +3 494 539 606 +3 539 544 606 +3 494 544 539 +3 494 606 549 +3 544 549 606 +3 509 544 539 +3 495 507 545 +3 495 545 498 +3 495 498 507 +3 498 545 507 +3 495 529 593 +3 495 593 499 +3 495 499 529 +3 499 593 529 +3 497 507 545 +3 495 497 545 +3 495 507 497 +3 495 593 545 +3 495 497 593 +3 497 545 593 +3 495 514 498 +3 495 545 514 +3 498 514 545 +3 495 529 500 +3 500 529 514 +3 495 500 514 +3 495 514 529 +3 495 501 529 +3 495 499 501 +3 499 529 501 +3 514 529 545 +3 495 545 529 +3 500 501 529 +3 495 501 500 +3 529 593 545 +3 495 497 499 +3 497 498 507 +3 495 498 497 +3 496 575 596 +3 539 596 575 +3 496 596 539 +3 496 539 575 +3 496 567 575 +3 516 575 567 +3 567 575 596 +3 509 539 575 +3 497 507 593 +3 507 545 593 +3 513 519 593 +3 497 593 519 +3 497 519 513 +3 497 507 519 +3 507 593 519 +3 498 545 517 +3 498 517 507 +3 507 517 545 +3 498 514 517 +3 514 545 517 +3 501 609 584 +3 499 501 584 +3 499 609 501 +3 499 584 609 +3 499 584 593 +3 499 593 609 +3 584 609 593 +3 501 584 529 +3 499 529 584 +3 499 609 510 +3 501 510 609 +3 499 510 501 +3 499 560 593 +3 560 570 593 +3 499 560 609 +3 560 593 609 +3 529 584 593 +3 504 609 510 +3 499 504 510 +3 499 609 504 +3 504 560 609 +3 500 501 512 +3 500 512 529 +3 501 529 512 +3 501 609 547 +3 501 547 584 +3 547 609 584 +3 501 512 547 +3 501 506 512 +3 506 547 512 +3 501 547 506 +3 501 510 506 +3 506 510 547 +3 501 547 510 +3 501 547 529 +3 529 547 584 +3 510 609 547 +3 512 547 529 +3 502 553 565 +3 553 559 565 +3 502 565 559 +3 559 567 565 +3 504 526 560 +3 503 526 504 +3 503 560 526 +3 503 504 560 +3 503 520 560 +3 525 560 526 +3 503 525 526 +3 503 560 525 +3 503 524 526 +3 524 525 526 +3 503 525 524 +3 503 520 525 +3 520 560 525 +3 504 526 510 +3 504 609 526 +3 510 526 609 +3 526 560 609 +3 541 546 553 +3 505 546 541 +3 505 541 553 +3 506 527 547 +3 506 510 527 +3 510 547 527 +3 527 547 531 +3 506 527 531 +3 506 531 547 +3 512 531 547 +3 506 531 512 +3 507 518 554 +3 507 554 545 +3 507 545 518 +3 518 545 554 +3 507 517 518 +3 517 545 518 +3 507 593 518 +3 507 518 519 +3 518 593 519 +3 507 593 554 +3 518 554 593 +3 545 593 554 +3 508 570 574 +3 508 574 528 +3 508 528 570 +3 528 574 570 +3 508 513 570 +3 508 570 515 +3 513 570 574 +3 508 513 574 +3 508 513 528 +3 513 574 528 +3 509 539 629 +3 539 575 629 +3 509 629 575 +3 539 629 544 +3 509 544 629 +3 510 609 527 +3 527 609 547 +3 526 609 534 +3 510 534 609 +3 510 526 534 +3 510 534 527 +3 527 534 609 +3 511 537 600 +3 511 600 543 +3 511 543 537 +3 537 543 600 +3 511 537 549 +3 511 549 600 +3 537 600 549 +3 522 537 549 +3 513 532 528 +3 528 532 574 +3 513 574 532 +3 532 538 574 +3 513 574 538 +3 513 538 532 +3 513 519 538 +3 513 538 593 +3 519 593 538 +3 513 574 593 +3 538 593 574 +3 570 574 593 +3 567 604 640 +3 516 604 567 +3 516 640 604 +3 516 567 640 +3 516 604 533 +3 533 604 567 +3 516 575 640 +3 567 640 575 +3 517 545 554 +3 517 554 518 +3 518 554 536 +3 518 536 593 +3 536 554 593 +3 518 536 519 +3 519 536 593 +3 519 562 538 +3 519 593 562 +3 538 562 593 +3 519 536 562 +3 536 593 562 +3 521 561 572 +3 559 572 561 +3 521 572 559 +3 521 572 546 +3 546 572 559 +3 521 530 572 +3 530 561 572 +3 522 622 663 +3 622 659 663 +3 522 663 659 +3 522 659 622 +3 537 663 659 +3 522 537 659 +3 522 663 537 +3 522 566 523 +3 523 566 555 +3 522 555 566 +3 537 659 647 +3 522 647 659 +3 522 537 647 +3 522 542 647 +3 522 537 542 +3 537 647 542 +3 522 566 542 +3 523 542 566 +3 522 542 523 +3 522 549 663 +3 522 663 555 +3 549 555 663 +3 522 622 566 +3 555 566 622 +3 522 555 622 +3 555 622 663 +3 522 647 566 +3 566 647 659 +3 522 566 659 +3 542 647 566 +3 566 659 622 +3 537 549 663 +3 524 535 526 +3 524 576 535 +3 526 535 576 +3 524 526 576 +3 524 525 560 +3 524 560 526 +3 524 560 576 +3 526 576 560 +3 524 525 576 +3 525 560 576 +3 526 576 548 +3 526 548 550 +3 526 550 576 +3 548 576 550 +3 534 550 609 +3 526 550 534 +3 526 609 550 +3 526 609 576 +3 550 576 609 +3 535 576 548 +3 526 535 548 +3 560 609 576 +3 531 540 583 +3 527 540 531 +3 527 583 540 +3 527 531 583 +3 527 557 583 +3 527 534 557 +3 534 583 557 +3 527 583 534 +3 527 547 583 +3 531 583 547 +3 527 609 583 +3 547 583 609 +3 540 557 583 +3 527 557 540 +3 534 609 583 +3 532 574 552 +3 528 552 574 +3 528 532 552 +3 529 584 545 +3 545 584 593 +3 561 572 601 +3 530 601 572 +3 530 561 601 +3 532 538 564 +3 532 564 574 +3 538 574 564 +3 552 564 574 +3 532 564 552 +3 533 559 603 +3 533 603 561 +3 559 561 603 +3 533 604 603 +3 533 603 567 +3 567 603 604 +3 559 603 567 +3 534 550 595 +3 534 595 609 +3 550 609 595 +3 534 609 557 +3 557 609 583 +3 534 595 557 +3 557 595 609 +3 535 576 577 +3 535 577 548 +3 548 577 576 +3 536 569 614 +3 536 554 569 +3 554 614 569 +3 536 614 554 +3 536 554 562 +3 554 593 562 +3 536 614 562 +3 554 562 614 +3 562 569 614 +3 536 569 562 +3 647 663 659 +3 537 663 647 +3 558 605 563 +3 537 605 558 +3 537 563 605 +3 537 558 563 +3 537 651 556 +3 537 556 647 +3 537 647 651 +3 556 651 647 +3 537 649 605 +3 563 605 649 +3 537 563 649 +3 537 649 651 +3 647 651 649 +3 537 647 649 +3 537 558 543 +3 537 543 563 +3 543 558 563 +3 600 663 649 +3 537 649 663 +3 537 600 649 +3 537 663 600 +3 647 649 663 +3 543 605 558 +3 537 605 543 +3 549 663 600 +3 537 651 563 +3 537 563 556 +3 556 563 651 +3 543 600 605 +3 537 605 600 +3 600 649 605 +3 563 649 651 +3 542 556 647 +3 537 556 542 +3 538 615 593 +3 538 562 615 +3 562 593 615 +3 538 581 615 +3 538 562 581 +3 562 615 581 +3 564 581 615 +3 538 564 615 +3 538 581 564 +3 564 615 574 +3 538 574 615 +3 574 615 593 +3 539 596 653 +3 539 653 575 +3 575 653 596 +3 539 653 629 +3 575 629 653 +3 539 653 606 +3 539 606 629 +3 606 653 629 +3 544 606 629 +3 540 557 571 +3 557 583 571 +3 540 571 583 +3 541 546 568 +3 546 553 568 +3 541 568 553 +3 553 592 568 +3 541 568 592 +3 541 592 553 +3 542 647 611 +3 542 611 566 +3 566 611 647 +3 542 582 566 +3 566 582 611 +3 542 611 582 +3 551 556 582 +3 542 551 582 +3 542 556 551 +3 542 582 556 +3 542 647 582 +3 582 647 611 +3 556 647 582 +3 549 648 555 +3 544 648 549 +3 544 555 648 +3 606 629 648 +3 544 648 629 +3 544 606 648 +3 549 606 648 +3 545 618 593 +3 545 584 618 +3 584 593 618 +3 545 618 554 +3 554 618 593 +3 546 592 568 +3 546 553 592 +3 559 602 608 +3 546 608 602 +3 546 559 608 +3 546 602 559 +3 559 608 572 +3 546 572 608 +3 546 602 592 +3 553 592 602 +3 546 553 602 +3 553 602 559 +3 546 602 568 +3 568 602 592 +3 583 609 628 +3 547 583 628 +3 547 628 609 +3 547 628 584 +3 584 628 609 +3 576 594 577 +3 548 577 594 +3 548 594 576 +3 548 594 550 +3 550 594 576 +3 549 638 663 +3 549 555 638 +3 555 663 638 +3 600 638 663 +3 549 638 600 +3 555 638 648 +3 549 648 638 +3 549 606 638 +3 606 648 638 +3 594 609 595 +3 550 609 594 +3 550 594 595 +3 576 609 594 +3 551 617 556 +3 551 556 573 +3 551 573 617 +3 556 617 573 +3 551 582 617 +3 551 573 582 +3 573 617 582 +3 556 582 617 +3 552 589 598 +3 552 598 564 +3 552 564 589 +3 564 598 589 +3 552 598 574 +3 564 574 598 +3 553 639 592 +3 553 627 639 +3 592 639 627 +3 553 592 627 +3 559 592 602 +3 553 592 559 +3 553 625 559 +3 559 625 639 +3 553 559 639 +3 553 639 625 +3 625 627 639 +3 553 627 625 +3 559 639 592 +3 559 565 625 +3 553 625 565 +3 562 614 593 +3 554 593 614 +3 554 618 614 +3 593 614 618 +3 555 622 648 +3 622 663 648 +3 555 648 663 +3 638 648 663 +3 556 651 578 +3 578 651 664 +3 556 578 664 +3 556 664 651 +3 651 652 664 +3 556 664 652 +3 556 652 651 +3 582 617 652 +3 556 652 617 +3 556 582 652 +3 556 652 647 +3 647 652 651 +3 578 664 591 +3 556 591 664 +3 556 578 591 +3 556 664 617 +3 617 664 652 +3 582 652 647 +3 556 591 573 +3 556 617 591 +3 573 591 617 +3 556 660 563 +3 563 660 578 +3 556 563 578 +3 556 578 660 +3 563 651 660 +3 556 660 651 +3 591 664 617 +3 578 660 651 +3 557 597 583 +3 557 609 597 +3 583 597 609 +3 557 583 612 +3 557 612 571 +3 571 612 583 +3 557 612 597 +3 557 597 571 +3 571 597 612 +3 583 612 597 +3 557 595 597 +3 595 609 597 +3 558 579 563 +3 558 605 579 +3 563 579 605 +3 567 643 603 +3 559 603 643 +3 559 643 567 +3 559 643 639 +3 559 665 643 +3 639 643 665 +3 559 639 665 +3 559 625 665 +3 625 639 665 +3 559 639 636 +3 608 636 639 +3 559 636 608 +3 559 608 639 +3 636 643 639 +3 559 643 636 +3 559 665 565 +3 559 567 665 +3 565 665 567 +3 603 643 636 +3 559 603 636 +3 559 565 634 +3 559 634 625 +3 565 625 634 +3 572 607 608 +3 559 607 572 +3 559 608 607 +3 559 634 665 +3 625 665 634 +3 602 608 639 +3 559 602 639 +3 559 636 607 +3 607 636 608 +3 559 607 561 +3 561 607 572 +3 561 603 636 +3 559 561 636 +3 592 602 639 +3 561 636 607 +3 567 665 643 +3 565 634 665 +3 560 613 576 +3 576 613 609 +3 560 609 613 +3 560 570 613 +3 560 609 570 +3 570 609 613 +3 570 593 609 +3 603 636 637 +3 561 603 637 +3 561 637 636 +3 601 603 637 +3 561 601 637 +3 561 603 601 +3 572 601 607 +3 561 607 601 +3 561 601 636 +3 601 637 636 +3 601 636 607 +3 562 581 610 +3 581 585 610 +3 562 610 585 +3 562 585 581 +3 581 673 615 +3 562 615 673 +3 562 673 581 +3 562 610 673 +3 562 614 610 +3 610 614 673 +3 562 673 614 +3 569 614 610 +3 562 569 610 +3 581 610 673 +3 562 615 614 +3 614 615 673 +3 593 615 614 +3 569 610 585 +3 562 569 585 +3 563 660 580 +3 563 580 578 +3 578 580 660 +3 563 579 580 +3 579 623 580 +3 563 580 623 +3 563 623 579 +3 563 649 623 +3 563 623 660 +3 563 660 649 +3 623 649 660 +3 563 605 623 +3 605 649 623 +3 649 651 660 +3 580 623 660 +3 579 605 623 +3 581 615 598 +3 564 598 615 +3 564 581 598 +3 574 598 615 +3 564 581 589 +3 581 598 589 +3 565 634 620 +3 565 620 665 +3 620 634 665 +3 565 620 596 +3 567 596 620 +3 565 567 620 +3 567 620 665 +3 611 647 659 +3 566 611 659 +3 611 659 622 +3 566 611 622 +3 567 665 680 +3 567 680 691 +3 567 691 665 +3 665 691 680 +3 567 665 675 +3 567 675 643 +3 643 675 665 +3 567 640 691 +3 567 691 657 +3 567 657 640 +3 640 657 691 +3 596 620 657 +3 567 596 657 +3 567 657 620 +3 567 657 680 +3 567 680 620 +3 620 680 657 +3 567 640 675 +3 567 675 691 +3 640 691 675 +3 567 603 675 +3 603 604 675 +3 567 675 604 +3 620 665 680 +3 575 596 640 +3 567 640 596 +3 665 675 691 +3 596 657 640 +3 657 680 691 +3 604 640 675 +3 603 675 643 +3 568 602 621 +3 568 621 592 +3 592 621 602 +3 570 609 655 +3 570 655 613 +3 609 613 655 +3 570 655 593 +3 570 593 635 +3 570 635 655 +3 593 655 635 +3 570 574 635 +3 574 593 635 +3 593 609 655 +3 598 615 635 +3 574 598 635 +3 574 635 615 +3 593 635 615 +3 575 690 596 +3 596 690 653 +3 575 653 690 +3 596 640 690 +3 575 690 640 +3 640 699 690 +3 575 690 699 +3 575 699 640 +3 653 690 699 +3 575 653 699 +3 575 629 699 +3 629 653 699 +3 594 632 609 +3 576 632 594 +3 576 609 632 +3 576 632 577 +3 577 632 594 +3 576 613 632 +3 609 632 613 +3 577 632 619 +3 577 619 594 +3 594 619 632 +3 578 669 660 +3 578 580 669 +3 580 660 669 +3 651 664 660 +3 578 660 664 +3 578 580 590 +3 580 669 590 +3 578 590 669 +3 578 672 588 +3 588 672 631 +3 578 588 631 +3 578 631 672 +3 660 664 669 +3 578 669 664 +3 578 672 669 +3 590 669 672 +3 578 590 672 +3 588 631 591 +3 578 588 591 +3 578 591 631 +3 588 590 672 +3 578 590 588 +3 664 672 669 +3 578 672 664 +3 591 631 664 +3 578 664 631 +3 631 672 664 +3 580 626 623 +3 579 626 580 +3 579 623 626 +3 590 670 669 +3 580 670 590 +3 580 669 670 +3 660 669 670 +3 580 660 670 +3 580 670 626 +3 590 626 670 +3 580 626 590 +3 580 599 590 +3 580 626 599 +3 590 599 626 +3 626 660 670 +3 580 660 626 +3 623 660 626 +3 589 616 646 +3 581 616 589 +3 581 646 616 +3 581 589 646 +3 581 598 646 +3 589 646 598 +3 581 689 586 +3 581 668 689 +3 586 689 668 +3 581 586 668 +3 615 646 689 +3 581 615 689 +3 581 646 615 +3 581 689 646 +3 581 587 616 +3 586 616 587 +3 581 616 586 +3 581 586 587 +3 581 646 668 +3 616 668 646 +3 581 668 616 +3 587 616 589 +3 581 587 589 +3 598 646 615 +3 585 673 689 +3 581 689 673 +3 581 585 689 +3 581 673 585 +3 586 668 616 +3 615 689 673 +3 585 689 586 +3 581 585 586 +3 585 610 673 +3 646 668 689 +3 611 652 647 +3 582 652 611 +3 582 617 611 +3 611 617 652 +3 609 628 656 +3 583 656 628 +3 583 609 656 +3 597 609 612 +3 583 612 609 +3 609 656 612 +3 583 612 656 +3 593 618 628 +3 584 628 618 +3 584 593 628 +3 593 628 609 +3 610 673 689 +3 585 610 689 +3 585 588 679 +3 585 679 650 +3 585 650 588 +3 588 650 679 +3 585 679 689 +3 585 610 679 +3 610 689 679 +3 586 679 689 +3 585 679 586 +3 588 610 650 +3 585 650 610 +3 585 610 588 +3 585 590 679 +3 585 588 590 +3 588 679 590 +3 610 679 650 +3 585 590 586 +3 586 590 679 +3 586 641 678 +3 586 590 641 +3 590 678 641 +3 586 678 590 +3 616 682 668 +3 586 668 682 +3 586 682 616 +3 586 689 682 +3 668 682 689 +3 678 679 689 +3 586 678 689 +3 586 679 678 +3 616 678 682 +3 586 682 678 +3 586 678 616 +3 678 689 682 +3 586 616 641 +3 587 641 616 +3 586 641 587 +3 590 679 678 +3 587 590 641 +3 586 590 587 +3 616 641 678 +3 587 641 599 +3 599 641 616 +3 587 599 616 +3 590 641 599 +3 587 590 599 +3 588 650 631 +3 588 672 650 +3 631 650 672 +3 590 672 679 +3 588 679 672 +3 650 679 672 +3 590 679 669 +3 590 669 678 +3 669 679 678 +3 590 670 641 +3 641 670 678 +3 590 678 670 +3 669 672 679 +3 626 670 641 +3 590 626 641 +3 599 626 641 +3 669 678 670 +3 592 621 627 +3 592 633 621 +3 621 633 627 +3 592 627 633 +3 602 633 621 +3 592 633 602 +3 592 639 633 +3 627 633 639 +3 602 639 633 +3 593 609 618 +3 593 687 609 +3 609 687 618 +3 593 618 687 +3 615 671 686 +3 593 671 615 +3 593 686 671 +3 593 615 686 +3 593 686 687 +3 593 618 686 +3 618 687 686 +3 614 618 671 +3 593 614 671 +3 593 671 618 +3 609 655 686 +3 593 609 686 +3 593 686 655 +3 593 635 686 +3 615 686 635 +3 609 618 628 +3 618 686 671 +3 614 671 615 +3 635 686 655 +3 609 686 687 +3 609 619 632 +3 594 619 609 +3 595 619 609 +3 594 619 595 +3 595 597 656 +3 595 656 642 +3 595 642 597 +3 597 642 656 +3 597 656 609 +3 595 609 656 +3 595 642 609 +3 609 642 619 +3 595 619 642 +3 609 656 642 +3 640 690 657 +3 596 657 690 +3 612 666 656 +3 597 666 612 +3 597 656 666 +3 597 612 656 +3 642 656 666 +3 597 642 666 +3 612 624 666 +3 597 666 624 +3 597 624 612 +3 624 642 666 +3 597 642 624 +3 598 646 635 +3 615 635 646 +3 601 637 607 +3 607 637 636 +3 601 630 607 +3 607 630 637 +3 601 637 630 +3 608 639 633 +3 602 608 633 +3 603 643 637 +3 636 637 643 +3 603 675 644 +3 603 644 643 +3 643 644 675 +3 603 644 637 +3 637 644 643 +3 603 604 674 +3 603 674 675 +3 604 675 674 +3 603 674 644 +3 644 674 675 +3 604 701 674 +3 674 701 675 +3 604 675 701 +3 604 640 701 +3 640 675 701 +3 629 677 653 +3 606 653 677 +3 606 677 629 +3 638 677 648 +3 606 677 638 +3 606 648 677 +3 629 648 677 +3 607 630 636 +3 630 637 636 +3 632 684 642 +3 609 632 642 +3 609 684 632 +3 609 642 684 +3 613 684 632 +3 609 684 613 +3 609 709 655 +3 613 655 709 +3 609 613 709 +3 609 687 628 +3 618 628 687 +3 609 717 642 +3 642 717 656 +3 609 656 717 +3 609 687 656 +3 628 656 687 +3 686 687 717 +3 609 717 687 +3 609 686 717 +3 642 684 717 +3 609 717 684 +3 619 632 642 +3 655 686 717 +3 609 655 717 +3 609 717 709 +3 609 709 684 +3 684 709 717 +3 656 717 687 +3 655 717 709 +3 613 709 684 +3 610 685 650 +3 650 685 679 +3 610 679 685 +3 610 685 689 +3 610 673 685 +3 673 689 685 +3 679 685 689 +3 611 652 645 +3 611 645 647 +3 645 652 647 +3 611 617 645 +3 617 652 645 +3 645 647 659 +3 611 645 659 +3 624 656 654 +3 612 624 654 +3 612 656 624 +3 612 654 656 +3 624 666 656 +3 614 686 615 +3 614 671 686 +3 671 686 673 +3 614 673 686 +3 614 671 673 +3 615 673 686 +3 615 686 708 +3 615 708 646 +3 615 646 686 +3 646 708 686 +3 615 686 689 +3 615 689 708 +3 686 708 689 +3 646 689 708 +3 615 635 695 +3 615 695 646 +3 635 646 695 +3 673 686 689 +3 635 695 686 +3 615 686 695 +3 646 686 695 +3 616 641 668 +3 616 682 641 +3 641 682 668 +3 641 678 682 +3 671 687 686 +3 618 687 671 +3 632 642 658 +3 619 632 658 +3 619 658 642 +3 620 634 661 +3 634 665 661 +3 620 661 665 +3 657 667 680 +3 620 667 657 +3 620 680 667 +3 634 661 680 +3 620 634 680 +3 620 680 661 +3 661 665 680 +3 634 680 667 +3 620 634 667 +3 659 663 703 +3 622 659 703 +3 622 703 663 +3 622 703 648 +3 648 703 663 +3 648 681 703 +3 622 681 648 +3 622 703 681 +3 659 703 681 +3 622 659 681 +3 623 662 660 +3 649 660 662 +3 623 649 662 +3 623 662 626 +3 626 662 660 +3 654 666 656 +3 624 666 654 +3 625 665 661 +3 625 661 634 +3 639 665 661 +3 625 639 661 +3 660 670 662 +3 626 662 670 +3 629 711 677 +3 629 677 714 +3 629 714 711 +3 677 711 714 +3 629 711 733 +3 629 733 653 +3 629 653 711 +3 653 733 711 +3 653 711 721 +3 629 721 711 +3 629 653 721 +3 629 711 699 +3 629 699 733 +3 699 711 733 +3 648 677 714 +3 629 648 714 +3 653 699 733 +3 677 721 711 +3 629 721 677 +3 653 721 677 +3 632 684 658 +3 642 658 684 +3 634 661 667 +3 661 680 667 +3 635 695 704 +3 635 704 686 +3 686 704 695 +3 635 704 655 +3 655 704 686 +3 638 663 703 +3 638 703 716 +3 638 716 663 +3 663 716 703 +3 677 716 710 +3 638 716 677 +3 638 710 716 +3 638 677 710 +3 677 703 716 +3 638 703 677 +3 638 648 703 +3 648 703 677 +3 638 710 663 +3 663 710 716 +3 640 700 691 +3 657 691 700 +3 640 657 700 +3 675 701 691 +3 640 691 701 +3 640 690 727 +3 640 700 690 +3 690 700 727 +3 640 727 700 +3 657 700 690 +3 699 727 738 +3 640 699 738 +3 640 727 699 +3 640 738 727 +3 640 691 707 +3 640 727 691 +3 691 727 707 +3 640 707 727 +3 640 727 701 +3 691 701 727 +3 640 707 700 +3 700 707 727 +3 701 738 727 +3 640 738 701 +3 690 727 699 +3 691 707 700 +3 676 678 682 +3 641 676 682 +3 641 678 676 +3 670 678 676 +3 641 670 676 +3 668 676 682 +3 641 676 668 +3 642 694 666 +3 642 656 694 +3 656 666 694 +3 642 684 694 +3 642 694 717 +3 684 717 694 +3 642 658 694 +3 658 684 694 +3 656 694 717 +3 668 689 693 +3 646 668 693 +3 646 693 689 +3 646 708 693 +3 646 693 695 +3 646 695 708 +3 693 708 695 +3 689 708 693 +3 686 695 708 +3 648 703 714 +3 677 714 703 +3 703 714 720 +3 648 720 714 +3 648 703 720 +3 681 703 720 +3 648 681 720 +3 690 699 733 +3 653 690 733 +3 711 721 729 +3 653 729 721 +3 653 711 729 +3 653 729 733 +3 653 690 729 +3 690 733 729 +3 711 729 733 +3 654 666 683 +3 666 692 683 +3 654 683 692 +3 654 692 666 +3 656 692 666 +3 654 692 656 +3 655 704 717 +3 686 717 704 +3 655 704 709 +3 704 717 709 +3 656 717 702 +3 687 702 717 +3 656 702 687 +3 666 702 692 +3 656 702 666 +3 656 692 702 +3 656 694 702 +3 694 717 702 +3 666 694 702 +3 657 697 700 +3 657 707 697 +3 697 707 700 +3 657 700 707 +3 657 707 680 +3 680 707 697 +3 657 680 697 +3 657 691 707 +3 657 688 697 +3 680 697 688 +3 657 680 688 +3 657 667 688 +3 667 680 688 +3 680 691 707 +3 658 684 698 +3 658 698 694 +3 684 694 698 +3 666 706 683 +3 666 692 706 +3 683 706 692 +3 692 694 702 +3 666 694 692 +3 666 694 706 +3 692 706 694 +3 668 682 693 +3 682 689 693 +3 673 705 686 +3 671 705 673 +3 671 686 705 +3 671 712 705 +3 686 705 712 +3 671 686 712 +3 686 712 687 +3 671 687 712 +3 673 713 696 +3 673 705 713 +3 696 713 705 +3 673 696 705 +3 686 696 705 +3 673 696 686 +3 686 689 696 +3 673 696 689 +3 673 696 685 +3 685 696 689 +3 677 725 754 +3 714 754 725 +3 677 754 714 +3 677 714 725 +3 677 725 716 +3 716 725 754 +3 677 716 754 +3 677 725 710 +3 710 725 716 +3 703 716 754 +3 677 703 754 +3 677 721 714 +3 711 714 721 +3 714 725 721 +3 677 721 725 +3 703 754 714 +3 688 707 697 +3 680 707 688 +3 682 689 708 +3 682 708 693 +3 692 723 706 +3 683 723 692 +3 683 706 723 +3 684 718 698 +3 694 698 718 +3 684 694 718 +3 684 718 736 +3 718 730 736 +3 684 736 730 +3 684 730 718 +3 694 718 717 +3 684 717 718 +3 709 717 736 +3 684 736 717 +3 684 709 736 +3 698 730 718 +3 684 730 698 +3 717 718 736 +3 735 785 764 +3 686 764 785 +3 686 735 764 +3 686 785 735 +3 686 745 705 +3 686 705 743 +3 686 743 745 +3 705 745 743 +3 686 744 735 +3 735 744 785 +3 686 785 744 +3 696 705 722 +3 686 696 722 +3 686 722 705 +3 686 744 695 +3 695 744 735 +3 686 695 735 +3 745 759 771 +3 686 771 759 +3 686 745 771 +3 686 759 745 +3 695 708 744 +3 686 744 708 +3 686 794 717 +3 717 794 759 +3 686 717 759 +3 686 759 794 +3 687 717 712 +3 686 712 717 +3 686 759 712 +3 686 712 745 +3 712 759 745 +3 686 785 794 +3 686 771 785 +3 771 794 785 +3 686 794 771 +3 686 764 755 +3 755 764 785 +3 686 755 785 +3 704 764 755 +3 686 764 704 +3 686 704 755 +3 686 755 794 +3 755 785 794 +3 686 722 689 +3 689 722 708 +3 686 708 722 +3 712 717 759 +3 744 771 785 +3 686 771 744 +3 686 717 755 +3 704 755 717 +3 686 704 735 +3 695 735 704 +3 705 712 745 +3 704 735 764 +3 686 743 744 +3 743 771 744 +3 686 771 743 +3 686 722 744 +3 686 743 722 +3 722 743 744 +3 743 745 771 +3 689 696 722 +3 708 722 744 +3 717 755 794 +3 705 743 722 +3 759 794 771 +3 717 752 737 +3 687 737 752 +3 687 717 737 +3 687 752 717 +3 712 752 717 +3 687 752 712 +3 687 702 737 +3 702 717 737 +3 690 742 732 +3 732 742 733 +3 690 732 733 +3 690 733 742 +3 690 732 751 +3 732 733 751 +3 690 751 733 +3 690 751 729 +3 729 751 733 +3 700 742 732 +3 690 700 732 +3 690 742 700 +3 700 727 733 +3 690 700 733 +3 690 733 727 +3 699 733 727 +3 700 733 742 +3 706 724 723 +3 692 723 724 +3 692 724 706 +3 692 706 702 +3 694 702 706 +3 702 724 706 +3 692 724 702 +3 693 715 695 +3 693 708 715 +3 695 715 708 +3 694 702 728 +3 702 706 728 +3 694 728 706 +3 717 728 718 +3 694 728 717 +3 694 718 728 +3 702 728 717 +3 731 744 735 +3 695 744 731 +3 695 731 735 +3 695 734 744 +3 708 744 734 +3 695 708 734 +3 708 734 731 +3 695 708 731 +3 695 731 734 +3 731 734 744 +3 708 731 715 +3 695 715 731 +3 696 713 722 +3 705 722 713 +3 700 719 707 +3 697 719 700 +3 697 707 719 +3 699 733 738 +3 727 738 733 +3 711 733 757 +3 699 757 733 +3 699 711 757 +3 699 733 763 +3 699 763 738 +3 733 738 763 +3 699 757 763 +3 733 763 757 +3 700 742 727 +3 700 707 742 +3 707 727 742 +3 727 733 742 +3 700 719 732 +3 700 742 719 +3 719 742 732 +3 707 742 719 +3 706 728 724 +3 702 724 728 +3 702 717 724 +3 717 737 724 +3 702 724 737 +3 717 724 728 +3 703 754 739 +3 714 739 754 +3 703 739 714 +3 703 739 720 +3 714 720 739 +3 703 716 739 +3 716 754 739 +3 704 755 709 +3 709 755 717 +3 705 726 743 +3 705 745 726 +3 726 745 743 +3 705 726 713 +3 713 726 722 +3 705 722 726 +3 722 726 743 +3 724 741 728 +3 706 728 741 +3 706 741 724 +3 723 741 724 +3 706 741 723 +3 715 734 731 +3 708 734 715 +3 709 755 747 +3 717 747 755 +3 709 747 717 +3 709 747 736 +3 717 736 747 +3 710 725 749 +3 710 749 716 +3 716 749 725 +3 711 762 729 +3 711 721 762 +3 721 729 762 +3 711 776 762 +3 711 768 776 +3 762 776 768 +3 711 762 768 +3 711 757 762 +3 711 776 757 +3 757 776 762 +3 711 733 762 +3 733 757 762 +3 714 721 762 +3 711 714 762 +3 729 733 762 +3 711 714 768 +3 714 762 768 +3 717 759 752 +3 712 752 759 +3 713 743 722 +3 713 726 743 +3 714 739 760 +3 739 775 760 +3 714 760 775 +3 714 775 739 +3 714 762 754 +3 714 775 762 +3 754 762 775 +3 714 754 775 +3 714 720 760 +3 720 739 760 +3 739 754 775 +3 762 768 775 +3 714 775 768 +3 714 725 762 +3 721 762 725 +3 714 760 768 +3 760 775 768 +3 725 762 754 +3 725 754 749 +3 716 749 754 +3 717 756 766 +3 756 783 766 +3 717 766 783 +3 717 783 756 +3 717 724 741 +3 717 741 728 +3 717 777 747 +3 717 747 798 +3 717 798 777 +3 747 777 798 +3 737 793 752 +3 717 793 737 +3 717 752 793 +3 755 794 807 +3 717 755 807 +3 717 807 794 +3 717 759 804 +3 717 804 752 +3 752 804 759 +3 737 766 793 +3 717 766 737 +3 717 793 766 +3 717 761 736 +3 717 746 761 +3 736 761 746 +3 717 736 746 +3 717 807 752 +3 717 804 807 +3 752 807 804 +3 752 793 805 +3 717 805 793 +3 717 752 805 +3 717 741 737 +3 737 741 766 +3 717 766 741 +3 717 807 759 +3 759 807 794 +3 717 718 746 +3 718 736 746 +3 717 755 798 +3 755 807 798 +3 717 798 807 +3 717 777 755 +3 747 755 777 +3 717 736 783 +3 736 747 783 +3 717 783 747 +3 717 718 756 +3 718 746 756 +3 717 756 746 +3 717 761 783 +3 736 783 761 +3 717 798 783 +3 717 793 798 +3 783 798 793 +3 717 783 793 +3 717 756 728 +3 728 756 766 +3 717 728 766 +3 717 756 761 +3 746 761 756 +3 718 756 728 +3 766 783 793 +3 793 807 805 +3 717 807 793 +3 717 805 807 +3 752 805 807 +3 793 798 807 +3 728 766 741 +3 747 798 783 +3 756 761 783 +3 759 804 807 +3 724 741 737 +3 755 798 777 +3 728 746 756 +3 718 746 728 +3 730 736 746 +3 718 730 746 +3 725 773 762 +3 721 762 773 +3 721 773 725 +3 721 729 773 +3 729 762 773 +3 724 740 741 +3 723 741 740 +3 723 740 724 +3 724 753 741 +3 740 741 753 +3 724 740 753 +3 724 766 741 +3 741 766 753 +3 724 753 766 +3 724 766 737 +3 737 753 766 +3 724 753 737 +3 725 765 754 +3 754 765 762 +3 725 762 765 +3 762 765 773 +3 725 773 765 +3 725 765 749 +3 749 765 754 +3 743 748 745 +3 726 748 743 +3 726 745 748 +3 733 779 770 +3 727 770 779 +3 727 733 770 +3 727 779 733 +3 733 770 738 +3 727 738 770 +3 727 779 742 +3 733 742 779 +3 728 756 741 +3 741 756 766 +3 762 773 791 +3 729 791 773 +3 729 762 791 +3 729 751 767 +3 729 767 733 +3 733 767 751 +3 729 767 762 +3 733 762 767 +3 762 791 767 +3 729 767 791 +3 736 746 750 +3 730 736 750 +3 730 750 746 +3 734 744 735 +3 731 734 735 +3 735 758 769 +3 731 735 769 +3 731 758 735 +3 731 769 758 +3 734 735 769 +3 731 734 769 +3 731 734 758 +3 734 769 758 +3 751 774 779 +3 732 751 779 +3 732 774 751 +3 732 779 774 +3 742 751 779 +3 732 751 742 +3 732 742 779 +3 733 751 742 +3 742 779 774 +3 732 742 774 +3 733 751 779 +3 733 788 770 +3 770 788 779 +3 733 779 788 +3 733 788 820 +3 763 820 788 +3 733 820 763 +3 733 763 788 +3 779 788 784 +3 733 784 788 +3 733 779 784 +3 762 784 829 +3 733 784 762 +3 733 829 784 +3 733 762 829 +3 751 779 784 +3 733 751 784 +3 733 824 762 +3 733 757 824 +3 757 762 824 +3 733 784 824 +3 784 820 824 +3 733 824 820 +3 733 820 784 +3 762 767 784 +3 733 784 767 +3 784 824 829 +3 733 829 824 +3 763 788 770 +3 733 763 770 +3 784 788 820 +3 751 784 767 +3 757 824 763 +3 733 763 824 +3 762 829 824 +3 738 763 770 +3 763 824 820 +3 735 769 744 +3 734 744 769 +3 735 780 764 +3 735 785 780 +3 764 780 785 +3 735 769 785 +3 744 785 769 +3 735 780 769 +3 758 769 780 +3 735 758 780 +3 769 785 780 +3 736 761 750 +3 746 750 761 +3 736 761 747 +3 736 747 778 +3 736 778 761 +3 747 761 778 +3 736 747 781 +3 736 781 778 +3 747 778 781 +3 750 778 761 +3 736 778 750 +3 747 783 761 +3 752 795 793 +3 737 795 752 +3 737 793 795 +3 753 766 782 +3 737 782 766 +3 737 753 782 +3 737 782 793 +3 766 793 782 +3 737 782 795 +3 782 793 795 +3 743 745 772 +3 743 772 771 +3 745 771 772 +3 745 772 748 +3 743 748 772 +3 744 771 769 +3 769 771 785 +3 745 771 787 +3 771 772 787 +3 745 787 772 +3 745 759 787 +3 759 771 787 +3 781 798 783 +3 747 781 783 +3 747 798 781 +3 777 798 781 +3 747 777 781 +3 778 781 783 +3 747 778 783 +3 761 778 783 +3 749 765 797 +3 754 797 765 +3 749 797 754 +3 751 774 784 +3 774 779 784 +3 751 774 786 +3 751 786 784 +3 774 784 786 +3 751 792 767 +3 767 792 784 +3 751 784 792 +3 751 786 792 +3 784 792 786 +3 752 804 789 +3 759 789 804 +3 752 789 759 +3 752 805 789 +3 752 804 805 +3 789 805 804 +3 793 805 795 +3 752 795 805 +3 752 795 789 +3 789 795 805 +3 804 805 807 +3 762 775 809 +3 754 762 809 +3 754 809 775 +3 765 809 797 +3 754 797 809 +3 754 809 765 +3 762 809 765 +3 755 764 807 +3 764 785 807 +3 755 807 785 +3 785 794 807 +3 755 806 777 +3 777 806 807 +3 755 777 807 +3 755 807 806 +3 755 799 806 +3 799 807 806 +3 755 807 799 +3 755 764 799 +3 764 807 799 +3 777 807 798 +3 757 828 824 +3 762 824 828 +3 757 762 828 +3 776 828 824 +3 757 776 824 +3 757 828 776 +3 757 824 815 +3 813 815 824 +3 757 815 813 +3 757 813 824 +3 762 828 776 +3 757 776 815 +3 776 824 815 +3 763 813 824 +3 757 813 763 +3 759 789 800 +3 789 804 800 +3 759 800 804 +3 787 804 794 +3 759 787 794 +3 759 804 787 +3 759 794 804 +3 794 804 807 +3 771 787 794 +3 759 800 787 +3 787 800 804 +3 775 802 801 +3 760 802 775 +3 760 801 802 +3 760 775 801 +3 768 802 775 +3 760 802 768 +3 762 826 768 +3 762 776 826 +3 768 826 776 +3 762 836 809 +3 762 775 836 +3 775 809 836 +3 775 836 826 +3 762 775 826 +3 762 826 836 +3 762 814 827 +3 791 827 814 +3 762 827 791 +3 762 791 814 +3 767 784 829 +3 762 767 829 +3 762 836 773 +3 773 836 809 +3 762 773 809 +3 762 829 836 +3 762 828 829 +3 828 836 829 +3 762 836 828 +3 762 767 803 +3 767 829 803 +3 762 803 829 +3 762 836 827 +3 762 814 836 +3 814 827 836 +3 762 826 828 +3 826 836 828 +3 762 829 827 +3 827 829 836 +3 773 791 814 +3 762 773 814 +3 768 775 826 +3 773 814 836 +3 762 803 791 +3 791 803 829 +3 762 791 829 +3 776 826 828 +3 767 803 791 +3 791 829 827 +3 765 773 809 +3 824 828 829 +3 770 811 788 +3 763 811 770 +3 763 788 811 +3 763 820 811 +3 788 811 820 +3 811 813 820 +3 763 813 811 +3 763 820 813 +3 813 824 820 +3 764 785 799 +3 785 807 799 +3 764 780 799 +3 780 785 799 +3 797 808 809 +3 765 808 797 +3 765 809 808 +3 765 773 808 +3 773 809 808 +3 784 803 792 +3 767 803 784 +3 767 792 803 +3 784 829 803 +3 802 826 812 +3 768 802 812 +3 768 826 802 +3 768 812 826 +3 776 812 826 +3 768 812 776 +3 775 826 802 +3 773 832 836 +3 814 836 832 +3 773 814 832 +3 808 836 809 +3 773 836 808 +3 808 814 832 +3 773 808 832 +3 773 814 808 +3 808 832 836 +3 774 779 796 +3 774 796 784 +3 779 784 796 +3 774 810 786 +3 774 786 796 +3 774 796 810 +3 786 810 796 +3 784 786 796 +3 775 801 826 +3 775 826 831 +3 775 831 801 +3 801 831 826 +3 809 836 831 +3 775 831 836 +3 775 809 831 +3 826 831 836 +3 801 826 802 +3 812 826 828 +3 776 812 828 +3 776 815 828 +3 812 828 815 +3 776 812 815 +3 815 828 824 +3 777 806 798 +3 798 806 807 +3 777 806 790 +3 790 806 798 +3 777 790 798 +3 777 790 781 +3 781 790 798 +3 779 817 784 +3 779 788 817 +3 784 817 788 +3 784 796 817 +3 779 817 796 +3 784 820 823 +3 820 824 823 +3 784 823 824 +3 784 792 821 +3 786 821 792 +3 784 821 786 +3 784 818 796 +3 796 818 821 +3 784 796 821 +3 784 821 818 +3 786 796 821 +3 788 820 817 +3 784 817 820 +3 792 825 803 +3 784 803 825 +3 784 825 792 +3 803 825 829 +3 784 829 825 +3 784 823 829 +3 823 824 829 +3 784 825 821 +3 792 821 825 +3 817 821 818 +3 784 817 818 +3 784 821 817 +3 796 817 818 +3 784 821 823 +3 817 823 821 +3 784 823 817 +3 821 823 825 +3 784 825 823 +3 817 820 823 +3 823 829 825 +3 785 794 799 +3 794 807 799 +3 786 819 821 +3 818 821 819 +3 786 821 818 +3 786 818 819 +3 810 818 819 +3 786 818 810 +3 786 810 819 +3 786 818 796 +3 796 818 810 +3 792 819 821 +3 786 819 792 +3 791 803 827 +3 803 829 827 +3 791 803 830 +3 803 827 830 +3 791 830 827 +3 792 822 821 +3 819 821 822 +3 792 819 822 +3 792 822 825 +3 821 825 822 +3 816 822 825 +3 792 822 816 +3 792 816 825 +3 803 816 825 +3 792 816 803 +3 797 834 809 +3 797 808 834 +3 808 809 834 +3 801 838 835 +3 801 831 838 +3 831 835 838 +3 801 835 831 +3 802 838 835 +3 801 838 802 +3 801 802 835 +3 801 802 831 +3 802 835 831 +3 802 831 826 +3 802 826 835 +3 812 835 826 +3 802 835 812 +3 826 835 831 +3 825 829 827 +3 803 825 827 +3 803 825 830 +3 825 827 830 +3 816 825 830 +3 803 816 830 +3 808 836 833 +3 808 833 809 +3 809 833 836 +3 808 833 834 +3 809 834 833 +3 814 832 833 +3 808 833 832 +3 808 814 833 +3 832 836 833 +3 809 841 833 +3 833 841 834 +3 809 834 841 +3 833 836 841 +3 809 841 836 +3 831 841 836 +3 809 841 831 +3 815 826 828 +3 812 826 815 +3 826 839 835 +3 812 839 826 +3 812 835 839 +3 832 833 837 +3 814 832 837 +3 814 837 833 +3 827 836 832 +3 814 827 832 +3 826 831 842 +3 826 842 836 +3 831 836 842 +3 835 842 839 +3 826 842 835 +3 826 839 842 +3 831 842 835 +3 831 844 838 +3 831 835 844 +3 835 838 844 +3 831 842 841 +3 831 851 842 +3 841 842 851 +3 831 841 851 +3 831 842 844 +3 835 844 842 +3 842 847 851 +3 831 847 842 +3 831 851 847 +3 842 844 847 +3 831 847 844 +3 841 851 847 +3 831 841 847 +3 836 842 841 +3 838 847 844 +3 831 847 838 +3 832 845 837 +3 833 837 845 +3 832 833 845 +3 833 845 836 +3 832 836 845 +3 836 841 845 +3 833 845 841 +3 840 845 841 +3 833 840 841 +3 833 845 840 +3 834 840 841 +3 833 840 834 +3 837 845 840 +3 833 837 840 +3 840 841 843 +3 834 843 841 +3 834 840 843 +3 834 843 848 +3 841 848 843 +3 834 848 841 +3 835 846 839 +3 839 846 844 +3 835 839 844 +3 835 844 846 +3 839 844 842 +3 836 851 841 +3 836 842 851 +3 841 845 851 +3 836 851 845 +3 837 845 850 +3 837 850 840 +3 840 850 845 +3 838 847 854 +3 844 854 847 +3 838 854 844 +3 839 852 842 +3 839 842 846 +3 839 846 852 +3 842 852 846 +3 842 846 844 +3 840 845 849 +3 840 849 841 +3 841 849 845 +3 840 848 849 +3 843 849 848 +3 840 849 843 +3 840 843 848 +3 840 841 848 +3 841 848 849 +3 840 850 849 +3 845 849 850 +3 841 851 861 +3 841 853 851 +3 851 853 861 +3 841 861 853 +3 845 861 849 +3 841 861 845 +3 841 849 861 +3 845 851 861 +3 841 861 848 +3 848 861 853 +3 841 848 853 +3 848 849 861 +3 847 853 851 +3 841 853 847 +3 847 851 852 +3 842 852 851 +3 842 847 852 +3 842 844 852 +3 844 847 852 +3 844 852 846 +3 847 855 859 +3 844 847 859 +3 844 855 847 +3 844 859 855 +3 844 855 852 +3 847 852 855 +3 846 855 852 +3 844 855 846 +3 847 859 854 +3 844 854 859 +3 849 850 861 +3 845 861 850 +3 846 855 856 +3 846 856 852 +3 852 856 855 +3 847 862 859 +3 847 867 862 +3 859 862 867 +3 847 859 867 +3 847 859 863 +3 847 863 854 +3 854 863 859 +3 847 862 863 +3 859 863 862 +3 847 869 852 +3 851 852 869 +3 847 851 869 +3 851 869 853 +3 847 853 869 +3 847 853 862 +3 847 862 869 +3 853 869 862 +3 852 867 869 +3 847 867 852 +3 847 869 867 +3 862 869 867 +3 852 855 859 +3 847 852 859 +3 852 859 867 +3 848 849 857 +3 848 857 858 +3 848 858 849 +3 849 858 857 +3 848 858 861 +3 849 861 858 +3 848 858 853 +3 853 858 861 +3 850 861 860 +3 849 850 860 +3 849 860 861 +3 857 865 858 +3 849 865 857 +3 849 858 865 +3 849 858 860 +3 858 865 860 +3 849 860 865 +3 858 860 861 +3 850 861 864 +3 850 864 860 +3 860 864 861 +3 853 861 869 +3 851 869 861 +3 852 856 867 +3 855 867 856 +3 852 867 855 +3 855 859 867 +3 853 874 862 +3 862 874 869 +3 853 869 874 +3 858 861 874 +3 853 858 874 +3 853 874 861 +3 858 874 870 +3 853 858 870 +3 853 870 874 +3 862 870 874 +3 853 870 862 +3 861 869 874 +3 854 868 859 +3 854 863 868 +3 859 868 863 +3 858 866 865 +3 857 866 858 +3 857 865 866 +3 858 865 870 +3 858 871 865 +3 865 871 870 +3 858 870 871 +3 858 865 861 +3 860 861 865 +3 858 874 871 +3 870 871 874 +3 858 866 870 +3 865 870 866 +3 865 874 871 +3 858 874 865 +3 861 874 865 +3 863 867 868 +3 859 867 863 +3 859 868 867 +3 867 872 868 +3 859 872 867 +3 859 868 872 +3 862 867 863 +3 861 865 864 +3 860 864 865 +3 864 865 871 +3 860 864 871 +3 860 871 865 +3 864 874 865 +3 861 874 864 +3 862 869 863 +3 863 869 867 +3 863 883 869 +3 862 883 863 +3 862 869 883 +3 870 874 877 +3 862 870 877 +3 862 877 874 +3 862 883 873 +3 862 873 863 +3 863 873 883 +3 873 877 883 +3 862 883 877 +3 862 877 873 +3 874 883 877 +3 862 883 874 +3 869 883 874 +3 863 873 868 +3 868 873 876 +3 863 868 876 +3 863 876 873 +3 863 872 879 +3 868 879 872 +3 863 879 868 +3 863 868 872 +3 873 883 876 +3 863 876 883 +3 863 883 879 +3 863 879 869 +3 869 879 883 +3 867 872 869 +3 863 872 867 +3 863 869 872 +3 876 883 879 +3 863 876 879 +3 869 872 879 +3 868 876 879 +3 864 874 871 +3 864 874 875 +3 864 875 871 +3 871 875 874 +3 865 871 866 +3 866 871 870 +3 870 878 871 +3 866 871 878 +3 866 878 870 +3 867 872 879 +3 867 879 869 +3 872 876 879 +3 868 876 872 +3 874 886 883 +3 869 883 886 +3 869 886 874 +3 879 883 886 +3 869 879 886 +3 870 882 888 +3 870 888 887 +3 870 887 882 +3 882 887 888 +3 870 877 887 +3 877 888 887 +3 870 888 877 +3 870 874 887 +3 874 883 887 +3 870 887 883 +3 870 883 874 +3 870 882 874 +3 870 871 882 +3 871 874 882 +3 874 887 882 +3 870 882 878 +3 870 878 888 +3 878 882 888 +3 870 883 877 +3 877 887 883 +3 871 882 878 +3 871 875 882 +3 874 882 875 +3 872 881 879 +3 876 879 881 +3 872 876 881 +3 873 884 883 +3 873 880 884 +3 880 883 884 +3 873 883 880 +3 873 884 876 +3 876 884 883 +3 873 877 880 +3 877 883 880 +3 875 887 882 +3 874 887 875 +3 883 887 886 +3 874 886 887 +3 881 884 883 +3 876 881 883 +3 876 884 881 +3 879 881 883 +3 877 883 888 +3 877 891 883 +3 883 891 888 +3 877 888 891 +3 883 888 887 +3 880 891 883 +3 877 891 880 +3 878 882 894 +3 878 894 888 +3 882 888 894 +3 883 886 885 +3 879 885 886 +3 879 883 885 +3 879 881 885 +3 881 883 885 +3 880 883 893 +3 883 884 893 +3 880 893 884 +3 880 891 892 +3 891 893 892 +3 880 892 893 +3 880 893 891 +3 883 893 891 +3 883 885 889 +3 881 883 889 +3 881 889 885 +3 881 884 889 +3 883 889 884 +3 881 890 885 +3 881 889 890 +3 885 890 889 +3 882 887 894 +3 887 888 894 +3 882 887 898 +3 882 898 894 +3 887 894 898 +3 883 900 906 +3 883 906 891 +3 883 891 900 +3 891 906 900 +3 883 886 895 +3 885 895 886 +3 883 895 885 +3 883 897 887 +3 883 888 897 +3 887 897 888 +3 883 897 895 +3 886 895 897 +3 883 886 897 +3 883 897 891 +3 883 906 897 +3 891 897 906 +3 883 893 900 +3 891 900 893 +3 888 897 891 +3 883 895 889 +3 885 889 895 +3 884 893 889 +3 883 889 893 +3 889 893 895 +3 883 895 893 +3 886 897 887 +3 893 900 895 +3 883 895 900 +3 883 895 906 +3 895 900 906 +3 895 906 897 +3 889 895 890 +3 885 890 895 +3 887 897 898 +3 887 894 897 +3 894 898 897 +3 888 894 897 +3 888 894 909 +3 894 910 909 +3 888 909 910 +3 888 910 894 +3 897 915 910 +3 888 915 897 +3 888 910 915 +3 888 897 910 +3 888 903 915 +3 888 915 909 +3 888 909 903 +3 903 909 915 +3 888 902 903 +3 902 909 903 +3 888 909 902 +3 891 903 915 +3 888 903 891 +3 888 891 915 +3 894 897 910 +3 891 915 897 +3 894 909 902 +3 888 894 902 +3 909 910 915 +3 889 901 895 +3 889 900 901 +3 895 901 900 +3 889 895 900 +3 889 893 900 +3 889 896 901 +3 896 900 901 +3 889 900 896 +3 895 896 901 +3 889 896 895 +3 890 896 895 +3 889 896 890 +3 891 915 904 +3 891 906 915 +3 904 915 906 +3 891 904 906 +3 891 904 892 +3 892 904 893 +3 891 893 904 +3 891 899 892 +3 892 899 904 +3 891 904 899 +3 899 915 904 +3 891 915 899 +3 899 903 915 +3 891 903 899 +3 897 906 915 +3 891 904 900 +3 900 904 906 +3 893 904 900 +3 894 907 909 +3 894 898 907 +3 898 909 907 +3 894 909 898 +3 894 898 910 +3 897 910 898 +3 898 910 909 +3 895 901 906 +3 900 906 901 +3 896 905 901 +3 900 901 905 +3 896 900 905 +3 906 915 910 +3 897 906 910 +3 898 910 907 +3 907 910 909 +3 899 913 912 +3 899 912 915 +3 899 915 913 +3 912 913 915 +3 904 908 912 +3 899 908 904 +3 899 912 908 +3 899 904 912 +3 904 912 915 +3 899 903 913 +3 903 915 913 +3 899 913 908 +3 908 913 912 +3 905 914 906 +3 900 905 906 +3 900 914 905 +3 900 906 914 +3 900 906 912 +3 900 912 914 +3 906 914 912 +3 901 905 906 +3 900 904 912 +3 904 906 912 +3 902 915 909 +3 902 909 923 +3 902 923 915 +3 909 915 923 +3 902 923 925 +3 902 916 923 +3 916 925 923 +3 902 925 916 +3 902 925 922 +3 916 922 925 +3 902 922 916 +3 903 916 915 +3 902 903 915 +3 902 916 903 +3 902 915 916 +3 915 916 923 +3 903 916 913 +3 913 916 915 +3 906 912 915 +3 905 917 906 +3 906 917 914 +3 905 914 917 +3 914 919 917 +3 906 919 914 +3 906 917 919 +3 906 914 915 +3 912 915 914 +3 906 915 919 +3 906 919 910 +3 910 919 915 +3 914 915 919 +3 907 911 909 +3 909 911 910 +3 907 910 911 +3 908 913 924 +3 908 924 912 +3 912 924 913 +3 913 924 921 +3 908 921 924 +3 908 913 921 +3 918 920 923 +3 909 923 920 +3 909 918 923 +3 909 920 918 +3 915 923 920 +3 909 915 920 +3 909 910 920 +3 910 915 920 +3 909 920 911 +3 909 911 918 +3 911 920 918 +3 910 920 911 +3 915 927 919 +3 910 927 915 +3 910 919 927 +3 910 927 920 +3 915 920 927 +3 912 928 915 +3 912 915 924 +3 912 924 928 +3 915 928 924 +3 913 915 924 +3 914 928 915 +3 912 928 914 +3 913 933 924 +3 915 924 933 +3 913 915 933 +3 916 933 926 +3 913 926 933 +3 913 916 926 +3 913 933 916 +3 915 933 916 +3 913 926 929 +3 926 933 929 +3 913 929 933 +3 924 929 933 +3 913 929 924 +3 921 926 929 +3 913 921 929 +3 913 926 921 +3 921 929 924 +3 914 919 928 +3 914 928 917 +3 917 928 919 +3 915 919 928 +3 915 933 928 +3 919 928 933 +3 915 919 933 +3 916 923 933 +3 915 933 923 +3 915 933 930 +3 923 930 933 +3 915 930 923 +3 924 933 928 +3 915 933 927 +3 927 933 930 +3 915 927 930 +3 919 933 927 +3 915 920 930 +3 920 927 930 +3 920 930 923 +3 916 935 933 +3 916 933 922 +3 916 922 935 +3 922 933 935 +3 916 925 933 +3 923 933 925 +3 916 935 926 +3 926 935 933 +3 922 925 933 +3 917 928 932 +3 917 932 919 +3 919 932 928 +3 918 930 920 +3 918 920 934 +3 918 934 930 +3 920 930 934 +3 918 930 923 +3 928 933 932 +3 919 932 933 +3 919 941 927 +3 919 933 941 +3 927 941 933 +3 919 932 941 +3 932 933 941 +3 919 932 927 +3 927 932 941 +3 927 930 934 +3 920 927 934 +3 921 931 929 +3 921 926 931 +3 926 929 931 +3 922 936 937 +3 922 935 936 +3 935 937 936 +3 922 937 935 +3 922 936 933 +3 925 933 936 +3 922 925 936 +3 933 935 936 +3 925 936 937 +3 922 925 937 +3 923 940 936 +3 933 936 940 +3 923 936 933 +3 923 933 940 +3 930 933 940 +3 923 930 940 +3 923 936 925 +3 924 938 933 +3 924 929 938 +3 929 933 938 +3 924 942 928 +3 924 933 942 +3 928 942 933 +3 933 942 938 +3 924 938 942 +3 926 931 933 +3 926 945 931 +3 931 945 933 +3 926 933 945 +3 926 935 945 +3 933 945 935 +3 929 931 933 +3 927 941 934 +3 927 934 946 +3 927 946 941 +3 934 941 946 +3 927 946 930 +3 930 946 933 +3 927 933 946 +3 933 946 941 +3 930 934 946 +3 928 941 933 +3 928 942 941 +3 933 941 942 +3 932 944 942 +3 928 942 944 +3 928 932 942 +3 928 944 932 +3 932 942 941 +3 928 932 941 +3 929 938 931 +3 929 939 938 +3 931 938 939 +3 929 931 939 +3 931 933 938 +3 930 940 934 +3 930 943 940 +3 934 940 943 +3 930 934 943 +3 934 946 940 +3 930 940 946 +3 933 940 946 +3 931 945 938 +3 933 938 945 +3 931 945 939 +3 938 939 945 +3 932 944 941 +3 941 944 942 +3 933 942 958 +3 938 958 942 +3 933 958 938 +3 933 949 936 +3 935 936 949 +3 933 935 949 +3 951 957 955 +3 933 957 951 +3 933 955 957 +3 933 951 955 +3 933 940 955 +3 933 955 946 +3 940 946 955 +3 933 957 949 +3 933 949 958 +3 933 958 957 +3 949 957 958 +3 940 955 957 +3 933 940 957 +3 951 958 957 +3 933 958 951 +3 941 951 946 +3 933 951 941 +3 933 946 951 +3 935 949 945 +3 933 945 949 +3 945 949 958 +3 933 945 958 +3 946 951 955 +3 936 940 957 +3 933 936 957 +3 936 957 949 +3 933 951 942 +3 941 942 951 +3 942 958 951 +3 938 945 958 +3 940 943 946 +3 934 946 943 +3 936 949 937 +3 935 937 949 +3 936 957 950 +3 936 950 954 +3 936 954 957 +3 950 957 954 +3 936 954 949 +3 949 954 957 +3 948 950 954 +3 936 948 954 +3 936 950 948 +3 940 957 950 +3 936 940 950 +3 936 948 937 +3 937 948 949 +3 936 949 948 +3 948 954 949 +3 938 958 953 +3 942 953 958 +3 938 953 942 +3 938 953 945 +3 945 953 947 +3 938 945 947 +3 938 947 953 +3 938 939 947 +3 939 945 947 +3 945 958 953 +3 940 955 952 +3 950 952 955 +3 940 952 950 +3 940 950 955 +3 940 946 952 +3 946 955 952 +3 950 955 957 +3 940 943 952 +3 943 946 952 +3 942 951 944 +3 941 944 951 +3 942 951 956 +3 944 956 951 +3 942 956 944 +3 953 958 956 +3 942 956 958 +3 942 953 956 +3 951 956 958 +3 951 958 955 +3 955 958 957 +4 0 36 13 1 +4 5 36 0 2 +4 6 0 13 1 +4 6 36 13 0 +4 7 10 36 0 +4 36 6 5 0 +4 7 0 36 2 +4 36 10 1 0 +4 20 32 10 1 +4 13 36 32 1 +4 10 32 36 1 +4 3 23 2 8 +4 36 23 2 22 +4 22 5 2 36 +4 23 3 2 22 +4 2 23 7 8 +4 36 23 7 2 +4 2 3 4 22 +4 4 2 22 5 +4 22 4 5 18 +4 9 5 4 18 +4 40 22 5 18 +4 6 54 36 5 +4 19 18 40 5 +4 5 40 36 22 +4 19 54 5 40 +4 5 6 54 19 +4 9 19 5 18 +4 5 54 36 40 +4 54 6 43 21 +4 54 43 6 36 +4 12 43 6 21 +4 6 36 43 13 +4 21 54 6 19 +4 43 6 13 12 +4 7 23 31 8 +4 11 7 36 31 +4 36 7 23 31 +4 10 36 11 7 +4 16 11 7 8 +4 7 8 31 16 +4 31 11 7 16 +4 8 23 31 16 +4 30 9 17 18 +4 30 19 17 9 +4 30 19 9 18 +4 50 20 32 10 +4 20 50 29 10 +4 36 25 10 11 +4 36 10 29 50 +4 25 10 29 36 +4 50 32 36 10 +4 31 15 11 16 +4 15 25 31 11 +4 11 15 14 16 +4 36 31 25 11 +4 21 12 38 26 +4 21 12 43 38 +4 43 36 32 13 +4 15 24 14 28 +4 15 28 14 31 +4 14 15 31 16 +4 15 47 28 31 +4 47 25 15 28 +4 24 15 25 28 +4 25 47 15 31 +4 17 30 27 19 +4 18 30 19 40 +4 30 19 54 42 +4 19 27 33 30 +4 42 19 33 30 +4 33 54 19 42 +4 40 19 54 30 +4 54 21 33 19 +4 50 29 51 20 +4 38 54 21 35 +4 21 54 33 35 +4 35 38 26 21 +4 43 54 21 38 +4 41 36 22 23 +4 36 40 41 22 +4 23 41 36 31 +4 28 37 24 34 +4 25 37 24 28 +4 36 29 25 50 +4 31 25 47 36 +4 48 37 25 47 +4 47 37 25 28 +4 29 50 47 25 +4 37 29 48 25 +4 29 47 48 25 +4 36 47 50 25 +4 39 38 26 35 +4 42 33 27 30 +4 49 33 27 42 +4 33 27 45 49 +4 47 34 37 28 +4 48 29 51 50 +4 50 47 48 29 +4 54 40 30 42 +4 36 41 47 31 +4 50 32 64 36 +4 43 36 64 32 +4 46 33 54 35 +4 45 33 49 42 +4 33 45 54 42 +4 33 54 45 46 +4 34 37 44 53 +4 34 47 37 53 +4 57 38 39 35 +4 52 57 35 46 +4 35 57 54 46 +4 38 54 35 57 +4 39 57 35 52 +4 64 63 36 54 +4 63 67 36 41 +4 67 50 64 36 +4 36 41 67 47 +4 63 36 54 40 +4 36 67 50 47 +4 36 54 43 64 +4 63 67 64 36 +4 63 41 36 40 +4 37 47 61 53 +4 48 47 61 37 +4 37 48 58 53 +4 37 44 53 58 +4 61 48 37 53 +4 38 43 54 57 +4 57 39 55 52 +4 72 54 59 40 +4 54 72 63 40 +4 42 54 40 59 +4 42 49 45 59 +4 59 54 45 42 +4 75 54 64 43 +4 75 54 43 57 +4 59 62 56 45 +4 49 59 56 45 +4 46 45 59 54 +4 45 59 62 46 +4 65 57 52 46 +4 65 54 57 46 +4 65 54 46 62 +4 46 59 62 54 +4 61 50 67 47 +4 50 48 47 61 +4 69 68 51 48 +4 48 51 69 50 +4 61 48 69 50 +4 73 48 51 68 +4 58 48 61 53 +4 61 48 68 69 +4 61 58 68 48 +4 66 59 56 49 +4 50 69 61 67 +4 69 50 64 67 +4 68 69 51 73 +4 57 60 65 52 +4 57 55 60 52 +4 74 53 58 61 +4 75 72 54 79 +4 66 79 54 59 +4 54 79 72 59 +4 54 64 63 75 +4 54 79 62 65 +4 66 59 54 62 +4 54 75 70 57 +4 54 75 79 65 +4 54 75 63 72 +4 54 79 66 62 +4 75 70 65 54 +4 70 54 57 65 +4 55 70 57 60 +4 62 66 59 56 +4 62 66 56 76 +4 60 70 57 65 +4 58 61 68 74 +4 60 71 70 65 +4 88 74 68 61 +4 61 88 67 69 +4 61 77 67 88 +4 74 88 77 61 +4 68 69 88 61 +4 65 78 79 62 +4 62 78 79 66 +4 62 76 78 66 +4 75 64 63 72 +4 84 63 64 89 +4 67 63 64 84 +4 89 63 64 72 +4 72 84 89 63 +4 64 84 90 67 +4 90 64 67 69 +4 64 89 72 75 +4 64 84 89 90 +4 80 78 70 65 +4 78 79 70 65 +4 79 70 65 75 +4 65 71 70 80 +4 78 76 79 66 +4 67 90 88 84 +4 92 84 67 88 +4 69 67 90 88 +4 67 92 88 77 +4 74 88 68 81 +4 88 83 68 82 +4 83 69 88 68 +4 68 83 69 73 +4 81 88 68 82 +4 68 83 73 82 +4 69 88 90 83 +4 78 86 80 70 +4 79 86 78 70 +4 79 86 70 75 +4 70 71 86 80 +4 75 95 72 79 +4 72 95 89 84 +4 72 95 75 89 +4 87 73 83 82 +4 85 88 77 74 +4 74 85 88 81 +4 89 95 75 98 +4 86 95 75 79 +4 98 95 75 86 +4 100 79 78 76 +4 88 85 77 92 +4 86 94 78 80 +4 94 78 100 79 +4 86 78 94 79 +4 95 79 94 100 +4 95 86 94 79 +4 80 86 94 103 +4 91 85 81 93 +4 81 85 88 93 +4 82 81 88 93 +4 81 91 93 96 +4 87 83 101 82 +4 101 83 88 82 +4 82 88 101 93 +4 104 83 88 101 +4 90 104 83 88 +4 104 83 101 97 +4 97 83 101 87 +4 88 90 105 84 +4 109 84 115 95 +4 109 105 84 112 +4 84 115 105 109 +4 84 105 88 92 +4 115 89 84 105 +4 84 90 105 89 +4 84 95 89 115 +4 112 105 84 92 +4 96 88 85 93 +4 85 99 96 91 +4 92 88 85 99 +4 99 88 85 96 +4 96 85 91 93 +4 98 94 86 103 +4 95 98 94 86 +4 88 106 113 93 +4 99 106 88 93 +4 88 99 110 105 +4 99 92 88 110 +4 113 105 88 104 +4 88 113 104 101 +4 96 99 88 93 +4 106 99 88 113 +4 101 88 113 93 +4 105 88 99 113 +4 88 90 104 105 +4 110 92 88 105 +4 90 105 89 107 +4 98 89 95 115 +4 115 107 89 105 +4 107 115 89 118 +4 115 98 89 118 +4 104 90 116 105 +4 90 107 116 105 +4 102 96 99 91 +4 92 105 110 112 +4 106 99 96 93 +4 95 98 114 94 +4 100 95 122 94 +4 94 98 114 103 +4 94 95 122 114 +4 119 115 95 139 +4 115 109 95 139 +4 98 115 95 114 +4 100 95 119 122 +4 122 115 114 95 +4 95 115 119 122 +4 96 99 106 102 +4 101 104 97 108 +4 115 98 118 117 +4 117 115 98 114 +4 98 117 114 103 +4 106 110 99 113 +4 110 106 99 111 +4 105 99 110 113 +4 111 106 99 102 +4 122 119 100 137 +4 127 108 101 113 +4 108 101 104 127 +4 113 104 101 127 +4 104 144 116 127 +4 144 127 104 113 +4 105 144 116 104 +4 113 144 105 104 +4 116 148 162 105 +4 110 113 145 105 +4 105 107 162 174 +4 109 105 112 140 +4 109 115 105 140 +4 140 115 105 175 +4 107 148 116 105 +4 105 115 174 162 +4 148 107 162 105 +4 175 162 105 163 +4 175 115 105 162 +4 140 175 105 163 +4 105 144 162 116 +4 105 112 163 145 +4 162 144 105 145 +4 110 105 145 112 +4 107 115 174 105 +4 162 105 163 145 +4 112 105 163 140 +4 144 105 145 113 +4 106 111 110 120 +4 120 113 110 106 +4 107 146 148 162 +4 146 115 174 107 +4 162 107 146 174 +4 118 115 146 107 +4 156 109 115 139 +4 140 109 115 156 +4 145 110 112 155 +4 113 145 120 110 +4 155 145 110 131 +4 120 111 110 131 +4 120 110 145 131 +4 147 110 131 155 +4 112 110 147 155 +4 155 163 112 145 +4 163 112 147 155 +4 163 112 140 147 +4 153 117 114 167 +4 169 167 122 114 +4 167 169 117 114 +4 115 169 122 114 +4 117 169 115 114 +4 115 139 119 189 +4 189 115 139 194 +4 115 140 156 175 +4 118 169 115 117 +4 139 115 179 194 +4 169 192 115 122 +4 174 115 192 175 +4 169 118 115 192 +4 175 174 115 162 +4 115 156 139 179 +4 179 115 175 194 +4 146 115 118 174 +4 174 115 118 192 +4 175 115 192 194 +4 119 115 189 122 +4 122 192 115 194 +4 156 115 175 179 +4 115 194 189 122 +4 162 144 152 116 +4 152 116 148 162 +4 116 144 152 127 +4 169 167 117 153 +4 118 146 174 183 +4 174 118 183 192 +4 169 183 118 192 +4 185 119 189 122 +4 137 119 185 122 +4 126 150 125 121 +4 150 126 135 121 +4 167 169 122 166 +4 122 189 185 166 +4 122 169 192 166 +4 122 194 189 166 +4 166 194 192 122 +4 185 137 122 166 +4 176 177 123 126 +4 132 138 123 150 +4 123 138 125 150 +4 197 123 124 128 +4 132 123 177 150 +4 123 197 176 126 +4 126 123 197 128 +4 177 197 176 123 +4 123 132 197 124 +4 123 150 125 126 +4 138 132 123 125 +4 123 150 126 177 +4 132 197 177 123 +4 124 180 133 157 +4 133 130 124 157 +4 129 136 124 161 +4 129 161 124 180 +4 124 129 180 130 +4 180 124 130 157 +4 124 161 134 180 +4 124 197 180 134 +4 124 197 128 133 +4 124 136 134 161 +4 124 132 197 134 +4 197 124 180 133 +4 126 197 176 128 +4 177 150 126 176 +4 142 135 176 126 +4 126 150 135 176 +4 176 126 128 142 +4 135 143 126 142 +4 128 197 151 133 +4 159 197 128 142 +4 128 197 176 142 +4 197 128 151 159 +4 141 133 157 130 +4 138 132 177 150 +4 132 219 134 149 +4 164 219 132 149 +4 197 219 132 164 +4 219 134 197 132 +4 164 197 177 132 +4 149 138 132 164 +4 132 164 138 177 +4 157 151 133 141 +4 157 197 180 133 +4 151 197 157 133 +4 161 180 197 134 +4 158 134 136 161 +4 134 219 182 149 +4 161 197 158 134 +4 158 182 149 134 +4 158 219 182 134 +4 197 219 158 134 +4 135 176 143 142 +4 158 136 171 161 +4 137 166 185 168 +4 189 184 194 139 +4 156 139 179 184 +4 139 194 179 184 +4 140 156 175 173 +4 140 163 147 173 +4 173 140 156 165 +4 140 173 170 165 +4 163 140 175 173 +4 170 140 147 173 +4 141 157 151 160 +4 142 176 154 159 +4 143 176 154 142 +4 176 197 159 142 +4 183 146 174 172 +4 162 174 146 172 +4 148 162 146 172 +4 170 147 163 173 +4 181 164 149 182 +4 164 182 219 149 +4 195 151 197 157 +4 157 195 151 160 +4 151 197 190 195 +4 151 195 190 178 +4 197 190 159 151 +4 195 178 151 160 +4 153 169 167 188 +4 191 159 186 154 +4 154 176 191 159 +4 173 156 179 165 +4 156 175 173 179 +4 197 195 157 180 +4 197 219 161 158 +4 205 198 158 219 +4 171 158 161 198 +4 198 158 161 205 +4 198 171 158 193 +4 219 205 161 158 +4 219 182 187 158 +4 219 198 158 187 +4 158 198 193 187 +4 159 199 197 191 +4 199 159 186 191 +4 190 199 197 159 +4 176 197 191 159 +4 195 178 160 200 +4 205 180 197 161 +4 197 205 161 219 +4 182 181 164 202 +4 197 202 219 164 +4 202 197 177 164 +4 202 182 219 164 +4 166 207 185 196 +4 207 214 166 185 +4 185 166 196 168 +4 166 194 189 214 +4 166 189 185 214 +4 167 192 169 166 +4 214 207 166 167 +4 166 192 214 167 +4 194 192 214 166 +4 214 201 207 167 +4 217 167 188 201 +4 214 167 217 201 +4 192 169 214 167 +4 169 214 167 188 +4 167 214 217 188 +4 183 169 215 192 +4 217 214 169 188 +4 214 215 217 169 +4 192 215 214 169 +4 191 212 197 176 +4 212 197 176 177 +4 197 212 202 177 +4 190 195 200 178 +4 234 205 180 197 +4 197 234 195 180 +4 202 181 221 182 +4 182 221 208 181 +4 182 210 219 187 +4 182 208 221 210 +4 182 219 221 202 +4 210 219 221 182 +4 184 189 194 206 +4 185 207 214 223 +4 185 223 218 196 +4 196 207 185 223 +4 185 189 223 214 +4 186 199 191 213 +4 186 225 199 213 +4 187 209 198 193 +4 187 210 219 209 +4 219 209 198 187 +4 188 217 201 216 +4 216 201 188 203 +4 189 206 223 230 +4 214 189 223 230 +4 214 206 189 230 +4 206 194 214 189 +4 197 229 190 195 +4 195 229 190 200 +4 229 200 227 190 +4 229 199 197 190 +4 227 229 190 199 +4 191 197 233 199 +4 191 233 213 225 +4 197 233 212 191 +4 191 199 225 213 +4 225 191 233 199 +4 198 193 211 204 +4 193 209 198 211 +4 229 197 234 195 +4 196 223 218 207 +4 196 235 207 218 +4 259 212 197 233 +4 229 234 197 246 +4 197 225 233 199 +4 202 197 219 212 +4 197 274 259 246 +4 225 197 233 246 +4 219 234 259 197 +4 241 197 259 212 +4 234 274 259 197 +4 197 234 205 219 +4 199 246 229 197 +4 241 219 259 197 +4 225 246 199 197 +4 234 274 197 246 +4 259 197 246 233 +4 241 219 197 212 +4 198 219 220 228 +4 228 209 211 198 +4 219 236 198 220 +4 205 219 236 198 +4 209 228 219 198 +4 211 228 198 220 +4 220 204 198 211 +4 246 229 227 199 +4 251 214 217 201 +4 207 201 251 231 +4 201 216 231 232 +4 207 214 251 201 +4 217 251 201 216 +4 232 201 203 231 +4 201 216 232 203 +4 201 216 251 231 +4 202 219 241 212 +4 221 219 241 202 +4 220 211 226 204 +4 219 234 205 256 +4 205 219 256 236 +4 218 235 207 248 +4 248 214 251 207 +4 207 248 214 223 +4 251 248 207 235 +4 207 231 251 245 +4 251 207 245 235 +4 223 248 218 207 +4 222 221 208 210 +4 221 224 222 208 +4 210 239 219 209 +4 228 239 209 219 +4 239 219 238 210 +4 238 219 221 210 +4 210 222 221 238 +4 211 228 220 226 +4 213 233 250 225 +4 251 214 215 217 +4 223 248 214 230 +4 217 215 251 258 +4 217 253 258 216 +4 251 258 253 216 +4 231 216 253 232 +4 231 251 253 216 +4 217 258 251 216 +4 235 218 255 248 +4 223 218 248 255 +4 218 252 235 255 +4 236 219 242 228 +4 219 260 239 238 +4 219 256 289 234 +4 219 260 277 270 +4 244 219 221 238 +4 277 259 241 219 +4 241 260 219 244 +4 244 260 219 238 +4 219 241 244 221 +4 289 219 234 259 +4 239 260 219 270 +4 263 270 242 219 +4 219 263 256 236 +4 277 260 219 241 +4 236 220 219 228 +4 242 239 219 270 +4 242 219 239 228 +4 270 263 256 219 +4 242 263 219 236 +4 219 277 259 289 +4 219 277 289 270 +4 219 270 289 256 +4 228 220 226 237 +4 220 228 242 237 +4 236 228 242 220 +4 220 242 236 237 +4 221 222 224 238 +4 238 244 224 221 +4 224 222 240 238 +4 248 223 255 243 +4 230 223 248 243 +4 240 244 224 238 +4 225 233 250 246 +4 229 246 227 257 +4 274 229 257 246 +4 274 234 229 246 +4 231 253 249 232 +4 249 245 253 231 +4 245 251 253 231 +4 265 233 246 250 +4 246 233 265 259 +4 234 281 256 289 +4 298 234 259 289 +4 274 298 234 259 +4 234 274 281 298 +4 289 234 281 298 +4 248 251 245 235 +4 245 280 248 235 +4 255 252 235 280 +4 255 248 280 235 +4 280 252 235 267 +4 235 252 266 267 +4 245 280 235 267 +4 237 242 236 247 +4 236 263 256 261 +4 236 242 263 261 +4 261 236 242 247 +4 238 260 254 244 +4 240 254 244 238 +4 277 244 260 241 +4 259 241 271 277 +4 241 244 271 277 +4 261 242 263 247 +4 255 248 243 262 +4 244 260 254 277 +4 254 244 271 264 +4 277 244 271 254 +4 245 269 272 267 +4 280 283 245 251 +4 280 251 245 248 +4 251 283 245 253 +4 272 245 267 283 +4 249 245 272 253 +4 245 272 269 249 +4 283 245 267 280 +4 283 272 245 253 +4 257 275 274 246 +4 298 265 246 275 +4 275 298 274 246 +4 259 274 298 246 +4 246 265 298 259 +4 246 265 250 275 +4 255 248 273 280 +4 273 248 255 262 +4 268 265 275 250 +4 283 251 258 253 +4 255 278 252 273 +4 273 252 280 278 +4 252 276 266 267 +4 255 252 280 273 +4 280 252 267 276 +4 278 252 280 276 +4 253 283 272 282 +4 283 258 282 253 +4 277 260 254 264 +4 277 254 271 264 +4 273 255 278 262 +4 256 270 289 279 +4 256 279 289 292 +4 256 281 279 292 +4 289 281 256 292 +4 279 256 270 263 +4 279 256 263 261 +4 275 274 294 257 +4 257 294 275 285 +4 286 295 259 290 +4 259 284 265 295 +4 259 289 295 298 +4 295 259 284 286 +4 259 271 290 277 +4 290 295 259 289 +4 290 259 277 289 +4 259 265 298 295 +4 271 286 259 290 +4 295 284 265 305 +4 291 268 265 275 +4 291 298 265 305 +4 298 265 275 317 +4 298 291 265 317 +4 291 265 284 305 +4 295 265 298 305 +4 275 265 291 317 +4 267 276 266 300 +4 297 266 276 300 +4 283 267 269 287 +4 267 300 311 303 +4 267 269 272 283 +4 300 267 310 287 +4 311 276 267 303 +4 310 283 267 280 +4 267 280 276 311 +4 287 283 267 310 +4 267 310 311 300 +4 303 276 267 300 +4 311 267 280 310 +4 301 268 288 304 +4 268 291 288 275 +4 291 301 268 288 +4 272 269 287 283 +4 269 272 306 293 +4 269 306 287 293 +4 269 272 287 306 +4 282 283 272 306 +4 306 283 272 310 +4 306 272 287 310 +4 287 272 283 310 +4 299 281 274 298 +4 274 316 298 294 +4 298 274 294 275 +4 308 316 298 274 +4 308 274 298 299 +4 308 316 274 294 +4 294 316 298 275 +4 317 314 275 316 +4 275 291 314 317 +4 275 316 307 294 +4 307 275 294 285 +4 316 314 275 307 +4 316 317 298 275 +4 275 314 288 307 +4 288 291 314 275 +4 311 278 276 303 +4 297 276 303 300 +4 280 278 276 311 +4 303 302 311 278 +4 298 299 281 292 +4 292 289 281 298 +4 282 306 313 283 +4 310 306 283 313 +4 307 294 319 285 +4 296 307 319 285 +4 306 325 287 293 +4 306 331 310 287 +4 321 287 325 309 +4 325 331 306 287 +4 287 331 321 325 +4 300 287 331 321 +4 293 325 287 309 +4 287 310 300 331 +4 324 288 314 307 +4 314 288 324 304 +4 301 291 314 288 +4 301 288 314 304 +4 315 322 291 318 +4 314 291 318 317 +4 318 322 291 301 +4 291 318 301 314 +4 291 317 305 318 +4 291 318 305 315 +4 298 317 305 291 +4 294 319 316 307 +4 317 295 298 305 +4 305 317 295 318 +4 307 312 296 319 +4 323 300 320 297 +4 303 323 297 300 +4 331 339 300 321 +4 332 339 300 338 +4 339 300 310 331 +4 300 339 303 323 +4 300 339 311 303 +4 338 339 300 323 +4 321 339 300 332 +4 300 332 338 320 +4 300 310 311 339 +4 338 300 320 323 +4 304 327 314 301 +4 301 327 314 322 +4 322 314 301 318 +4 311 326 302 303 +4 339 311 303 323 +4 303 311 326 323 +4 314 324 333 304 +4 333 314 304 327 +4 328 324 304 333 +4 313 306 331 310 +4 329 331 306 325 +4 313 331 306 329 +4 341 334 307 314 +4 342 312 307 319 +4 342 307 359 334 +4 312 307 335 342 +4 342 307 335 359 +4 316 319 334 307 +4 334 342 307 319 +4 307 341 324 359 +4 307 334 316 314 +4 335 307 324 359 +4 341 359 307 334 +4 341 324 314 307 +4 309 325 321 330 +4 339 326 311 323 +4 322 327 314 336 +4 314 333 336 327 +4 324 333 360 314 +4 314 334 316 317 +4 314 324 341 360 +4 341 317 314 318 +4 322 336 314 318 +4 333 347 314 336 +4 347 360 333 314 +4 336 341 314 318 +4 341 334 314 317 +4 347 341 314 336 +4 341 314 360 347 +4 334 346 342 319 +4 332 337 338 320 +4 343 348 365 321 +4 365 340 366 321 +4 321 325 343 330 +4 331 365 339 321 +4 365 366 339 321 +4 343 365 331 321 +4 325 343 331 321 +4 351 348 330 321 +4 321 340 366 339 +4 321 348 365 340 +4 332 340 321 339 +4 321 351 348 340 +4 330 348 343 321 +4 323 353 339 326 +4 338 339 323 353 +4 335 324 363 359 +4 333 324 360 328 +4 349 345 328 324 +4 335 324 345 363 +4 324 360 345 363 +4 360 324 359 363 +4 360 345 349 324 +4 328 360 349 324 +4 359 341 324 360 +4 329 343 331 325 +4 330 325 343 348 +4 336 333 347 327 +4 360 328 349 333 +4 345 349 328 356 +4 343 354 329 331 +4 351 348 350 330 +4 365 354 343 331 +4 355 344 332 362 +4 366 340 332 339 +4 344 332 337 355 +4 338 332 366 367 +4 340 332 386 366 +4 337 332 338 355 +4 362 332 386 340 +4 386 332 367 366 +4 332 366 339 338 +4 332 367 355 386 +4 332 355 362 386 +4 367 338 332 355 +4 333 360 347 357 +4 349 360 333 357 +4 346 342 359 334 +4 345 363 361 335 +4 364 342 335 358 +4 352 342 335 364 +4 361 335 363 352 +4 363 335 359 342 +4 342 363 335 358 +4 364 363 335 352 +4 358 363 335 364 +4 338 366 339 353 +4 366 367 353 338 +4 386 340 366 365 +4 340 351 386 375 +4 340 365 386 351 +4 365 340 348 351 +4 362 386 375 340 +4 368 363 342 358 +4 346 359 342 368 +4 368 342 346 358 +4 359 363 342 368 +4 343 365 369 354 +4 348 365 369 343 +4 372 355 362 344 +4 362 372 344 376 +4 361 385 345 425 +4 374 371 345 356 +4 356 349 371 345 +4 345 361 363 385 +4 361 345 370 415 +4 363 345 385 360 +4 371 415 374 345 +4 425 385 345 415 +4 345 370 374 356 +4 361 425 345 415 +4 360 349 345 385 +4 345 349 371 385 +4 370 374 415 345 +4 385 345 415 371 +4 386 365 369 348 +4 369 351 348 378 +4 348 386 365 351 +4 378 351 348 350 +4 351 369 348 386 +4 385 349 371 391 +4 371 349 373 391 +4 357 349 360 373 +4 385 360 349 391 +4 373 349 360 391 +4 380 378 350 351 +4 386 351 369 378 +4 378 351 375 386 +4 351 378 375 380 +4 352 363 409 364 +4 352 399 409 379 +4 409 363 352 361 +4 399 364 352 409 +4 352 379 409 361 +4 367 392 366 353 +4 354 365 369 382 +4 367 386 372 355 +4 386 355 362 372 +4 374 377 356 370 +4 358 368 363 387 +4 364 358 363 387 +4 358 364 394 387 +4 368 359 363 397 +4 397 359 363 385 +4 363 359 360 385 +4 379 423 409 361 +4 423 361 428 425 +4 361 423 409 363 +4 361 428 400 379 +4 361 425 415 370 +4 361 379 423 428 +4 425 423 361 363 +4 428 361 400 370 +4 425 361 428 370 +4 361 425 363 385 +4 376 381 362 375 +4 375 412 386 362 +4 372 386 412 362 +4 362 375 412 376 +4 412 372 362 376 +4 387 368 363 397 +4 409 423 416 363 +4 387 363 394 397 +4 363 425 397 385 +4 409 363 394 364 +4 363 425 423 397 +4 423 363 397 416 +4 416 363 397 394 +4 409 363 416 394 +4 363 364 387 394 +4 369 365 410 382 +4 386 365 410 369 +4 365 410 366 386 +4 366 386 392 367 +4 386 392 421 366 +4 421 386 366 410 +4 386 401 367 372 +4 401 392 386 367 +4 386 410 418 369 +4 411 418 410 369 +4 411 369 410 382 +4 418 386 369 378 +4 414 370 377 374 +4 377 370 414 417 +4 374 414 370 415 +4 400 370 417 414 +4 370 428 425 414 +4 400 428 370 414 +4 425 370 414 415 +4 391 415 371 385 +4 371 374 415 407 +4 415 371 407 391 +4 372 386 401 412 +4 415 374 414 407 +4 386 441 375 380 +4 424 412 375 376 +4 441 381 424 375 +4 383 381 441 375 +4 412 441 375 386 +4 380 383 441 375 +4 386 380 375 378 +4 424 381 376 375 +4 424 441 375 412 +4 405 381 376 424 +4 402 380 430 378 +4 380 418 430 378 +4 386 418 380 378 +4 433 428 379 413 +4 379 404 428 400 +4 404 413 379 428 +4 428 379 423 409 +4 409 428 379 399 +4 379 413 399 433 +4 399 428 379 433 +4 418 441 386 380 +4 380 383 430 441 +4 380 420 430 384 +4 402 420 380 384 +4 430 441 418 380 +4 420 430 402 380 +4 430 380 384 383 +4 381 424 445 441 +4 445 381 441 383 +4 398 405 383 381 +4 405 445 383 381 +4 445 381 405 424 +4 393 383 442 384 +4 429 445 383 405 +4 445 442 429 383 +4 384 442 420 383 +4 383 398 388 429 +4 442 445 441 383 +4 442 429 383 388 +4 383 442 388 393 +4 420 442 441 383 +4 383 420 430 441 +4 429 405 383 398 +4 384 420 430 383 +4 384 390 420 393 +4 442 393 384 420 +4 435 441 386 418 +4 435 438 410 386 +4 386 412 441 421 +4 392 386 421 401 +4 438 441 386 435 +4 410 421 386 438 +4 410 435 386 418 +4 401 386 421 412 +4 441 386 421 438 +4 416 397 387 394 +4 393 388 396 442 +4 398 388 429 389 +4 422 388 442 396 +4 422 389 388 396 +4 388 442 429 422 +4 389 422 388 429 +4 422 395 389 396 +4 390 439 420 442 +4 439 393 390 406 +4 393 390 420 442 +4 442 393 390 439 +4 392 421 419 401 +4 403 442 393 404 +4 393 406 439 403 +4 396 393 442 404 +4 439 442 393 403 +4 395 396 422 408 +4 442 422 396 434 +4 408 396 422 404 +4 442 396 404 434 +4 404 396 422 434 +4 399 432 428 433 +4 399 409 428 432 +4 400 404 428 403 +4 428 400 417 414 +4 400 428 417 403 +4 401 412 421 419 +4 417 403 439 406 +4 403 460 428 447 +4 460 404 403 428 +4 403 428 417 447 +4 403 439 447 417 +4 404 442 460 403 +4 439 460 403 447 +4 460 442 439 403 +4 460 434 404 428 +4 422 408 404 434 +4 404 434 433 428 +4 434 442 460 404 +4 433 413 404 428 +4 434 413 404 433 +4 434 404 413 408 +4 414 415 407 426 +4 409 432 423 428 +4 409 431 416 423 +4 432 431 409 423 +4 418 410 427 411 +4 410 435 418 427 +4 437 441 412 421 +4 441 424 437 412 +4 412 437 421 419 +4 440 428 443 414 +4 417 447 428 414 +4 425 414 443 426 +4 428 440 425 414 +4 414 425 415 426 +4 414 447 428 443 +4 414 440 425 443 +4 443 415 425 426 +4 448 441 435 418 +4 427 435 418 448 +4 441 448 430 418 +4 421 437 436 419 +4 452 430 420 441 +4 452 439 442 420 +4 420 442 452 441 +4 421 437 441 438 +4 437 436 438 421 +4 421 450 436 438 +4 422 442 429 459 +4 434 442 422 459 +4 423 440 428 446 +4 446 423 431 428 +4 423 432 431 428 +4 440 425 423 428 +4 424 445 441 437 +4 448 427 435 444 +4 443 447 428 440 +4 440 460 428 446 +4 446 428 433 454 +4 446 460 428 454 +4 428 447 460 440 +4 446 431 432 428 +4 428 460 434 433 +4 428 432 446 433 +4 433 428 460 454 +4 429 442 445 467 +4 467 429 442 459 +4 473 452 441 430 +4 473 441 448 430 +4 446 432 431 451 +4 454 446 432 433 +4 451 446 432 454 +4 434 460 463 433 +4 433 460 463 454 +4 459 442 460 434 +4 459 460 463 434 +4 453 444 464 435 +4 441 464 448 435 +4 464 438 458 435 +4 453 464 458 435 +4 464 441 438 435 +4 444 448 464 435 +4 436 457 437 438 +4 436 457 450 449 +4 438 457 450 436 +4 475 457 441 437 +4 437 445 441 475 +4 438 437 441 457 +4 441 438 457 482 +4 482 438 457 450 +4 438 458 482 464 +4 458 482 450 438 +4 482 441 438 464 +4 460 439 468 470 +4 439 468 442 460 +4 470 460 439 447 +4 439 468 452 442 +4 446 440 460 456 +4 460 440 443 456 +4 443 460 447 440 +4 473 475 441 452 +4 441 471 482 457 +4 482 441 473 475 +4 441 467 475 445 +4 441 473 448 482 +4 475 471 441 457 +4 471 482 475 441 +4 452 467 475 441 +4 452 467 441 445 +4 441 448 464 482 +4 445 441 452 442 +4 442 459 460 468 +4 442 468 483 467 +4 468 483 452 442 +4 442 483 452 467 +4 452 467 445 442 +4 459 467 468 442 +4 460 447 462 443 +4 443 460 456 462 +4 454 446 461 451 +4 456 446 461 454 +4 456 460 446 454 +4 460 447 470 462 +4 464 448 473 482 +4 449 457 450 455 +4 450 457 482 471 +4 466 455 450 457 +4 466 458 482 450 +4 450 471 466 457 +4 471 466 482 450 +4 479 461 451 454 +4 475 452 483 467 +4 473 452 483 475 +4 465 453 458 472 +4 464 453 458 465 +4 479 460 456 454 +4 461 479 456 454 +4 463 460 479 454 +4 471 455 466 457 +4 455 466 480 471 +4 456 460 484 462 +4 476 469 456 479 +4 456 484 469 462 +4 476 479 456 461 +4 460 479 456 469 +4 460 484 469 456 +4 458 472 466 482 +4 464 472 458 482 +4 465 472 458 464 +4 468 459 496 467 +4 468 491 496 459 +4 491 468 460 459 +4 460 491 459 463 +4 460 491 479 502 +4 491 516 460 468 +4 469 479 484 460 +4 463 491 479 460 +4 484 470 460 567 +4 516 460 470 567 +4 479 460 502 484 +4 468 516 460 470 +4 484 460 470 462 +4 460 567 491 484 +4 516 567 491 460 +4 460 484 491 502 +4 479 476 474 461 +4 462 484 469 478 +4 464 465 472 482 +4 464 481 465 482 +4 490 464 482 481 +4 490 464 473 482 +4 465 481 472 482 +4 477 481 472 465 +4 466 472 486 482 +4 466 482 486 480 +4 480 466 482 471 +4 475 483 496 467 +4 483 468 496 467 +4 491 496 516 468 +4 496 483 516 468 +4 469 559 484 476 +4 488 559 492 469 +4 469 488 559 476 +4 469 484 492 478 +4 559 484 492 469 +4 489 469 492 478 +4 469 476 484 479 +4 469 488 489 492 +4 470 516 567 484 +4 494 482 475 471 +4 494 471 480 482 +4 481 472 485 477 +4 482 481 472 485 +4 486 485 482 472 +4 509 473 482 544 +4 482 473 509 475 +4 473 544 490 482 +4 483 509 473 475 +4 476 474 487 479 +4 494 482 509 475 +4 509 539 494 475 +4 496 509 483 475 +4 509 496 539 475 +4 502 487 476 488 +4 476 488 559 502 +4 476 502 484 479 +4 487 479 502 476 +4 484 559 502 476 +4 480 494 482 549 +4 486 482 549 480 +4 480 511 549 486 +4 490 555 481 485 +4 523 481 555 485 +4 482 490 481 485 +4 482 509 544 494 +4 482 544 549 494 +4 544 555 490 482 +4 485 482 490 486 +4 490 482 555 486 +4 482 549 555 486 +4 555 544 549 482 +4 575 483 496 509 +4 516 483 496 575 +4 559 567 484 502 +4 533 567 484 559 +4 492 484 559 533 +4 484 567 491 502 +4 484 516 567 533 +4 523 555 522 485 +4 486 522 555 485 +4 485 490 555 486 +4 511 537 522 486 +4 549 522 486 511 +4 522 555 549 486 +4 553 487 488 505 +4 488 502 487 553 +4 492 521 488 489 +4 521 559 492 488 +4 488 546 521 559 +4 559 502 488 553 +4 488 553 505 546 +4 559 553 488 546 +4 521 492 530 489 +4 567 596 491 565 +4 496 516 567 491 +4 491 565 502 567 +4 567 596 496 491 +4 521 559 561 492 +4 492 530 561 521 +4 533 559 492 561 +4 560 493 504 499 +4 515 570 513 493 +4 493 508 513 515 +4 493 570 593 499 +4 497 593 493 513 +4 570 520 493 515 +4 593 493 499 497 +4 520 493 504 560 +4 513 570 593 493 +4 570 493 560 499 +4 520 493 560 570 +4 504 520 503 493 +4 539 544 494 606 +4 544 606 549 494 +4 539 544 509 494 +4 498 507 545 495 +4 499 529 593 495 +4 495 507 545 497 +4 497 593 545 495 +4 545 498 495 514 +4 514 495 529 500 +4 499 501 529 495 +4 495 545 514 529 +4 495 529 500 501 +4 495 593 545 529 +4 499 495 593 497 +4 495 507 497 498 +4 539 496 575 596 +4 516 496 567 575 +4 575 596 496 567 +4 496 575 509 539 +4 593 545 507 497 +4 519 497 513 593 +4 507 519 593 497 +4 517 507 545 498 +4 545 517 498 514 +4 499 609 584 501 +4 609 584 593 499 +4 584 529 499 501 +4 501 499 609 510 +4 560 593 570 499 +4 560 609 593 499 +4 529 593 584 499 +4 499 504 609 510 +4 504 609 560 499 +4 512 529 501 500 +4 547 584 609 501 +4 506 547 501 512 +4 547 501 510 506 +4 529 584 547 501 +4 609 547 501 510 +4 512 529 547 501 +4 559 565 502 553 +4 565 502 567 559 +4 503 560 504 526 +4 520 560 504 503 +4 503 525 560 526 +4 524 525 503 526 +4 520 525 560 503 +4 609 510 504 526 +4 504 560 609 526 +4 541 505 553 546 +4 510 547 506 527 +4 531 506 547 527 +4 512 506 547 531 +4 545 518 554 507 +4 517 545 507 518 +4 518 519 593 507 +4 518 593 554 507 +4 545 554 593 507 +4 528 570 574 508 +4 570 515 513 508 +4 574 513 508 570 +4 513 574 508 528 +4 575 629 509 539 +4 509 629 544 539 +4 609 547 510 527 +4 510 526 609 534 +4 609 510 534 527 +4 543 537 600 511 +4 549 600 537 511 +4 537 549 511 522 +4 574 513 532 528 +4 513 532 538 574 +4 538 593 519 513 +4 593 538 574 513 +4 570 593 574 513 +4 516 640 567 604 +4 567 516 604 533 +4 575 640 567 516 +4 517 518 554 545 +4 536 593 554 518 +4 519 593 536 518 +4 593 562 538 519 +4 562 593 536 519 +4 559 572 521 561 +4 572 546 559 521 +4 530 561 521 572 +4 659 522 622 663 +4 522 537 663 659 +4 555 522 566 523 +4 522 647 537 659 +4 537 647 522 542 +4 523 522 566 542 +4 663 555 549 522 +4 622 555 522 566 +4 663 622 555 522 +4 659 566 522 647 +4 542 566 647 522 +4 522 622 566 659 +4 537 663 549 522 +4 576 526 524 535 +4 560 526 525 524 +4 560 576 526 524 +4 576 560 525 524 +4 550 576 548 526 +4 526 609 534 550 +4 550 609 576 526 +4 526 576 548 535 +4 576 609 560 526 +4 527 583 531 540 +4 534 583 527 557 +4 583 531 547 527 +4 609 583 547 527 +4 540 527 583 557 +4 583 609 534 527 +4 528 532 574 552 +4 593 584 545 529 +4 530 601 561 572 +4 574 538 564 532 +4 552 532 574 564 +4 603 561 559 533 +4 567 604 603 533 +4 603 567 533 559 +4 609 550 595 534 +4 583 534 609 557 +4 609 534 595 557 +4 577 548 576 535 +4 554 614 536 569 +4 593 554 562 536 +4 614 562 554 536 +4 536 614 562 569 +4 647 663 537 659 +4 537 563 558 605 +4 647 651 556 537 +4 649 563 537 605 +4 649 647 537 651 +4 543 563 558 537 +4 537 600 663 649 +4 663 537 649 647 +4 543 537 558 605 +4 663 600 537 549 +4 563 556 651 537 +4 600 605 537 543 +4 605 600 537 649 +4 651 563 537 649 +4 537 647 542 556 +4 562 615 593 538 +4 562 581 615 538 +4 538 581 615 564 +4 538 615 574 564 +4 615 593 538 574 +4 653 575 596 539 +4 575 653 629 539 +4 629 653 606 539 +4 544 629 606 539 +4 583 571 540 557 +4 553 541 546 568 +4 541 553 592 568 +4 611 566 647 542 +4 611 542 582 566 +4 542 556 582 551 +4 647 582 611 542 +4 556 542 582 647 +4 544 648 555 549 +4 544 648 606 629 +4 606 648 544 549 +4 584 618 593 545 +4 554 593 618 545 +4 592 553 546 568 +4 546 559 602 608 +4 608 546 559 572 +4 602 553 546 592 +4 559 553 546 602 +4 602 592 546 568 +4 547 609 628 583 +4 584 609 628 547 +4 548 576 594 577 +4 550 576 594 548 +4 555 638 663 549 +4 549 638 663 600 +4 638 648 549 555 +4 648 606 638 549 +4 594 550 595 609 +4 609 576 594 550 +4 573 617 556 551 +4 573 582 617 551 +4 617 582 556 551 +4 564 589 598 552 +4 574 564 598 552 +4 627 592 553 639 +4 592 553 559 602 +4 639 553 625 559 +4 553 625 627 639 +4 639 553 559 592 +4 565 625 553 559 +4 554 614 593 562 +4 614 593 618 554 +4 663 648 555 622 +4 648 638 663 555 +4 664 556 651 578 +4 652 556 651 664 +4 556 652 582 617 +4 651 647 556 652 +4 556 591 578 664 +4 617 652 664 556 +4 652 647 556 582 +4 617 591 573 556 +4 578 556 660 563 +4 660 556 651 563 +4 664 591 617 556 +4 578 556 651 660 +4 609 583 557 597 +4 612 571 583 557 +4 597 571 612 557 +4 597 612 583 557 +4 595 609 557 597 +4 605 563 558 579 +4 559 567 643 603 +4 665 639 559 643 +4 639 559 625 665 +4 608 559 639 636 +4 636 559 639 643 +4 567 565 559 665 +4 603 559 636 643 +4 625 565 634 559 +4 559 608 572 607 +4 625 559 634 665 +4 602 559 639 608 +4 636 608 559 607 +4 572 559 607 561 +4 561 559 636 603 +4 559 639 592 602 +4 559 636 607 561 +4 643 665 567 559 +4 559 565 634 665 +4 613 609 560 576 +4 609 613 560 570 +4 560 609 570 593 +4 561 636 637 603 +4 561 601 603 637 +4 607 561 601 572 +4 601 636 637 561 +4 561 636 607 601 +4 585 562 581 610 +4 673 562 581 615 +4 614 673 562 610 +4 562 569 614 610 +4 610 562 581 673 +4 673 562 615 614 +4 614 615 593 562 +4 569 562 585 610 +4 578 660 580 563 +4 623 563 579 580 +4 660 649 623 563 +4 623 649 605 563 +4 649 660 651 563 +4 660 563 623 580 +4 563 623 579 605 +4 564 581 615 598 +4 564 615 574 598 +4 581 598 564 589 +4 620 665 634 565 +4 567 565 620 596 +4 565 620 665 567 +4 566 659 611 647 +4 611 566 622 659 +4 691 665 680 567 +4 675 643 665 567 +4 657 640 691 567 +4 567 620 657 596 +4 620 657 680 567 +4 675 691 640 567 +4 604 675 567 603 +4 665 567 620 680 +4 640 567 596 575 +4 567 691 665 675 +4 640 596 567 657 +4 657 691 680 567 +4 640 675 567 604 +4 603 675 567 643 +4 621 592 602 568 +4 613 609 655 570 +4 635 655 593 570 +4 593 635 570 574 +4 593 570 655 609 +4 635 574 615 598 +4 574 615 593 635 +4 653 575 690 596 +4 690 575 640 596 +4 575 640 699 690 +4 575 699 653 690 +4 653 629 699 575 +4 576 632 609 594 +4 594 576 632 577 +4 613 632 609 576 +4 594 632 619 577 +4 580 660 578 669 +4 664 578 651 660 +4 669 590 578 580 +4 631 578 672 588 +4 578 669 660 664 +4 590 578 672 669 +4 591 578 631 588 +4 588 578 672 590 +4 578 664 672 669 +4 578 591 631 664 +4 664 631 578 672 +4 579 623 580 626 +4 580 669 590 670 +4 670 660 580 669 +4 590 580 670 626 +4 626 590 580 599 +4 626 580 670 660 +4 623 660 580 626 +4 581 646 589 616 +4 589 581 598 646 +4 668 586 581 689 +4 581 646 689 615 +4 586 581 587 616 +4 616 668 581 646 +4 589 587 581 616 +4 598 581 615 646 +4 581 585 673 689 +4 616 586 581 668 +4 689 581 615 673 +4 581 586 585 689 +4 585 610 581 673 +4 668 689 581 646 +4 582 652 647 611 +4 617 652 582 611 +4 583 609 628 656 +4 583 612 597 609 +4 656 612 583 609 +4 584 593 618 628 +4 593 609 628 584 +4 689 585 673 610 +4 650 588 679 585 +4 610 689 585 679 +4 585 586 679 689 +4 610 585 588 650 +4 588 590 679 585 +4 585 610 679 650 +4 586 679 590 585 +4 590 678 586 641 +4 682 586 616 668 +4 668 682 586 689 +4 586 678 679 689 +4 586 616 678 682 +4 678 586 682 689 +4 587 586 616 641 +4 586 678 590 679 +4 587 590 586 641 +4 616 586 678 641 +4 616 587 641 599 +4 599 587 641 590 +4 672 631 588 650 +4 588 672 679 590 +4 672 650 588 679 +4 669 678 679 590 +4 678 590 670 641 +4 590 672 679 669 +4 641 626 590 670 +4 599 626 590 641 +4 590 669 678 670 +4 633 627 592 621 +4 633 592 602 621 +4 627 592 639 633 +4 639 592 602 633 +4 687 618 593 609 +4 593 686 615 671 +4 618 686 687 593 +4 593 618 671 614 +4 686 593 655 609 +4 686 615 635 593 +4 628 593 618 609 +4 618 686 593 671 +4 615 593 671 614 +4 635 686 593 655 +4 609 687 686 593 +4 619 594 609 632 +4 594 595 619 609 +4 642 597 656 595 +4 595 597 656 609 +4 619 595 642 609 +4 656 642 595 609 +4 690 657 596 640 +4 597 656 612 666 +4 612 656 597 609 +4 666 597 656 642 +4 597 612 624 666 +4 597 624 642 666 +4 615 635 598 646 +4 607 636 637 601 +4 630 637 601 607 +4 602 639 633 608 +4 636 643 637 603 +4 644 643 675 603 +4 644 643 603 637 +4 674 675 604 603 +4 675 603 674 644 +4 701 675 604 674 +4 640 675 604 701 +4 606 629 677 653 +4 606 677 648 638 +4 629 648 606 677 +4 630 636 637 607 +4 609 684 642 632 +4 609 632 613 684 +4 613 609 709 655 +4 628 618 687 609 +4 656 609 717 642 +4 628 609 687 656 +4 609 717 686 687 +4 609 684 717 642 +4 632 619 642 609 +4 609 655 686 717 +4 684 717 709 609 +4 687 609 717 656 +4 609 717 709 655 +4 613 609 684 709 +4 679 610 685 650 +4 673 689 610 685 +4 689 610 685 679 +4 645 647 652 611 +4 617 645 652 611 +4 659 611 647 645 +4 612 656 654 624 +4 612 656 624 666 +4 671 686 615 614 +4 614 671 686 673 +4 614 686 615 673 +4 646 686 708 615 +4 689 708 686 615 +4 689 646 708 615 +4 646 635 695 615 +4 686 689 615 673 +4 615 695 686 635 +4 695 686 646 615 +4 682 641 668 616 +4 678 682 616 641 +4 671 618 686 687 +4 619 642 658 632 +4 665 661 620 634 +4 620 667 680 657 +4 620 661 680 634 +4 661 680 665 620 +4 620 634 680 667 +4 622 663 703 659 +4 663 703 648 622 +4 622 703 648 681 +4 622 659 703 681 +4 662 649 623 660 +4 662 660 623 626 +4 624 656 654 666 +4 625 634 661 665 +4 625 661 639 665 +4 626 662 660 670 +4 714 711 677 629 +4 653 711 733 629 +4 629 653 711 721 +4 733 711 699 629 +4 629 677 714 648 +4 653 733 699 629 +4 677 629 711 721 +4 721 677 629 653 +4 684 642 632 658 +4 680 634 661 667 +4 686 695 704 635 +4 686 635 704 655 +4 716 663 703 638 +4 638 710 677 716 +4 638 677 703 716 +4 638 703 648 663 +4 677 703 648 638 +4 716 663 638 710 +4 657 640 700 691 +4 691 640 701 675 +4 700 727 640 690 +4 690 700 657 640 +4 640 727 738 699 +4 727 707 640 691 +4 691 727 701 640 +4 727 707 700 640 +4 701 640 727 738 +4 640 727 699 690 +4 640 707 700 691 +4 641 676 678 682 +4 641 676 670 678 +4 668 676 641 682 +4 656 666 642 694 +4 694 717 684 642 +4 684 694 642 658 +4 656 717 694 642 +4 693 646 689 668 +4 695 708 693 646 +4 646 693 689 708 +4 686 708 695 646 +4 703 677 648 714 +4 648 703 714 720 +4 648 703 720 681 +4 690 653 733 699 +4 653 729 711 721 +4 690 733 653 729 +4 729 733 653 711 +4 692 654 666 683 +4 692 654 656 666 +4 704 686 655 717 +4 704 717 655 709 +4 687 656 717 702 +4 656 702 692 666 +4 702 717 694 656 +4 666 656 702 694 +4 707 700 657 697 +4 697 680 657 707 +4 657 700 707 691 +4 680 657 688 697 +4 688 680 667 657 +4 691 707 657 680 +4 698 694 684 658 +4 692 706 683 666 +4 666 702 692 694 +4 692 694 706 666 +4 682 693 689 668 +4 671 705 686 673 +4 712 686 671 705 +4 712 671 686 687 +4 705 696 673 713 +4 673 705 686 696 +4 673 686 689 696 +4 689 696 685 673 +4 714 677 725 754 +4 754 716 677 725 +4 725 716 677 710 +4 677 703 716 754 +4 721 711 677 714 +4 725 721 677 714 +4 703 677 714 754 +4 688 680 697 707 +4 693 708 682 689 +4 683 706 692 723 +4 718 694 684 698 +4 730 684 718 736 +4 718 717 684 694 +4 684 709 717 736 +4 684 718 698 730 +4 717 684 736 718 +4 686 735 785 764 +4 743 745 705 686 +4 744 785 686 735 +4 722 686 705 696 +4 735 695 686 744 +4 686 745 759 771 +4 708 686 695 744 +4 759 686 794 717 +4 686 712 687 717 +4 745 759 712 686 +4 771 794 686 785 +4 785 755 686 764 +4 686 755 704 764 +4 785 794 686 755 +4 722 708 686 689 +4 759 712 686 717 +4 744 771 686 785 +4 717 755 704 686 +4 704 695 686 735 +4 712 705 745 686 +4 704 735 686 764 +4 771 686 743 744 +4 743 744 686 722 +4 686 743 745 771 +4 686 722 689 696 +4 708 744 722 686 +4 686 794 717 755 +4 686 722 705 743 +4 794 686 759 771 +4 687 717 752 737 +4 712 752 687 717 +4 702 717 687 737 +4 733 690 742 732 +4 733 751 690 732 +4 733 751 729 690 +4 690 742 732 700 +4 733 690 727 700 +4 699 733 690 727 +4 690 733 742 700 +4 692 706 724 723 +4 694 702 692 706 +4 724 692 702 706 +4 708 715 695 693 +4 706 728 694 702 +4 694 718 717 728 +4 717 694 728 702 +4 731 695 735 744 +4 708 695 734 744 +4 731 695 734 708 +4 734 695 731 744 +4 695 731 715 708 +4 705 722 696 713 +4 697 707 700 719 +4 738 727 733 699 +4 699 711 733 757 +4 738 733 763 699 +4 733 699 757 763 +4 707 742 727 700 +4 742 733 727 700 +4 742 719 732 700 +4 707 742 700 719 +4 724 702 728 706 +4 737 702 717 724 +4 728 717 702 724 +4 714 703 754 739 +4 739 714 703 720 +4 754 703 716 739 +4 755 717 704 709 +4 745 726 743 705 +4 726 722 705 713 +4 743 722 705 726 +4 741 706 724 728 +4 706 724 723 741 +4 734 708 715 731 +4 717 709 755 747 +4 717 709 747 736 +4 749 716 725 710 +4 721 729 711 762 +4 768 762 711 776 +4 776 762 711 757 +4 757 762 711 733 +4 762 711 721 714 +4 711 729 733 762 +4 714 762 711 768 +4 712 759 752 717 +4 726 713 743 722 +4 775 714 739 760 +4 775 754 714 762 +4 720 739 714 760 +4 754 714 739 775 +4 714 775 762 768 +4 725 721 714 762 +4 760 775 714 768 +4 714 725 762 754 +4 716 754 749 725 +4 783 717 756 766 +4 717 728 741 724 +4 798 777 747 717 +4 717 793 752 737 +4 807 717 794 755 +4 804 752 759 717 +4 717 766 793 737 +4 746 736 717 761 +4 804 752 717 807 +4 717 752 793 805 +4 741 766 717 737 +4 794 759 717 807 +4 736 717 718 746 +4 807 717 755 798 +4 777 755 747 717 +4 747 717 736 783 +4 746 717 718 756 +4 761 736 717 783 +4 793 783 717 798 +4 766 717 756 728 +4 756 746 717 761 +4 756 717 718 728 +4 766 783 717 793 +4 717 805 793 807 +4 805 807 717 752 +4 717 793 798 807 +4 728 766 717 741 +4 783 747 717 798 +4 717 756 761 783 +4 804 717 759 807 +4 717 741 737 724 +4 798 755 777 717 +4 728 746 718 756 +4 730 718 746 736 +4 773 721 725 762 +4 729 762 721 773 +4 740 723 724 741 +4 740 724 753 741 +4 766 753 724 741 +4 766 724 737 741 +4 753 724 737 766 +4 762 725 765 754 +4 765 773 725 762 +4 749 754 765 725 +4 726 745 743 748 +4 727 733 779 770 +4 770 727 733 738 +4 733 779 742 727 +4 756 741 766 728 +4 729 762 773 791 +4 733 751 767 729 +4 767 733 729 762 +4 729 767 762 791 +4 750 730 746 736 +4 734 731 735 744 +4 731 758 769 735 +4 734 731 769 735 +4 734 758 769 731 +4 732 774 779 751 +4 732 779 742 751 +4 742 751 733 732 +4 732 774 742 779 +4 779 751 733 742 +4 779 733 788 770 +4 763 733 788 820 +4 733 784 779 788 +4 733 829 762 784 +4 784 751 733 779 +4 757 762 733 824 +4 820 733 784 824 +4 733 762 767 784 +4 824 733 784 829 +4 770 733 788 763 +4 788 733 784 820 +4 767 751 733 784 +4 824 763 733 757 +4 829 733 762 824 +4 733 770 738 763 +4 820 763 733 824 +4 769 744 734 735 +4 785 764 735 780 +4 769 785 744 735 +4 758 735 780 769 +4 780 785 769 735 +4 746 750 736 761 +4 778 761 747 736 +4 778 747 781 736 +4 736 761 750 778 +4 761 783 747 736 +4 737 793 752 795 +4 737 753 766 782 +4 793 766 782 737 +4 795 793 782 737 +4 771 745 772 743 +4 772 743 745 748 +4 785 744 771 769 +4 772 745 771 787 +4 771 745 759 787 +4 747 781 798 783 +4 781 777 747 798 +4 783 747 781 778 +4 778 783 747 761 +4 754 749 765 797 +4 774 784 779 751 +4 786 784 774 751 +4 792 784 751 767 +4 784 786 792 751 +4 759 789 752 804 +4 804 805 789 752 +4 752 793 805 795 +4 805 752 795 789 +4 805 804 807 752 +4 809 754 775 762 +4 809 754 765 797 +4 762 754 765 809 +4 785 807 755 764 +4 807 794 785 755 +4 807 755 806 777 +4 807 755 799 806 +4 807 764 799 755 +4 807 777 798 755 +4 828 762 757 824 +4 757 776 828 824 +4 813 757 824 815 +4 776 762 757 828 +4 824 757 776 815 +4 763 757 824 813 +4 804 759 789 800 +4 759 804 794 787 +4 759 794 804 807 +4 787 794 759 771 +4 804 759 800 787 +4 760 801 775 802 +4 760 768 802 775 +4 776 768 762 826 +4 775 809 762 836 +4 762 836 826 775 +4 791 762 814 827 +4 762 829 767 784 +4 809 773 762 836 +4 828 836 762 829 +4 829 762 767 803 +4 814 827 762 836 +4 826 836 762 828 +4 836 827 762 829 +4 762 773 791 814 +4 775 768 826 762 +4 814 762 773 836 +4 829 791 762 803 +4 762 828 776 826 +4 762 791 767 803 +4 827 791 762 829 +4 765 773 762 809 +4 762 828 829 824 +4 763 788 770 811 +4 820 788 763 811 +4 763 820 811 813 +4 820 763 824 813 +4 807 764 785 799 +4 780 785 764 799 +4 765 809 797 808 +4 809 765 773 808 +4 767 792 784 803 +4 829 767 784 803 +4 768 826 812 802 +4 776 812 768 826 +4 802 768 826 775 +4 832 814 773 836 +4 773 809 808 836 +4 773 808 814 832 +4 832 773 808 836 +4 784 779 796 774 +4 796 810 786 774 +4 784 796 786 774 +4 831 801 826 775 +4 775 831 809 836 +4 826 831 775 836 +4 826 801 802 775 +4 828 812 776 826 +4 812 776 815 828 +4 776 828 824 815 +4 807 777 806 798 +4 798 790 777 806 +4 798 777 790 781 +4 788 784 779 817 +4 779 817 784 796 +4 824 784 820 823 +4 786 821 784 792 +4 821 784 818 796 +4 796 821 784 786 +4 784 817 788 820 +4 784 792 825 803 +4 829 784 825 803 +4 823 824 784 829 +4 792 821 784 825 +4 784 817 821 818 +4 818 784 817 796 +4 817 823 784 821 +4 823 784 821 825 +4 823 817 784 820 +4 784 823 829 825 +4 794 807 785 799 +4 818 786 819 821 +4 810 786 819 818 +4 818 810 786 796 +4 818 821 796 786 +4 819 786 792 821 +4 803 829 791 827 +4 827 791 803 830 +4 822 819 792 821 +4 822 825 821 792 +4 792 825 816 822 +4 792 816 825 803 +4 808 834 809 797 +4 831 835 801 838 +4 802 801 835 838 +4 802 835 801 831 +4 826 802 801 831 +4 812 835 802 826 +4 826 835 802 831 +4 803 829 827 825 +4 827 803 825 830 +4 803 825 830 816 +4 809 836 833 808 +4 833 834 809 808 +4 808 814 832 833 +4 808 836 833 832 +4 834 809 841 833 +4 836 841 809 833 +4 809 831 841 836 +4 812 828 815 826 +4 812 835 826 839 +4 814 833 837 832 +4 832 827 814 836 +4 836 831 842 826 +4 826 839 835 842 +4 835 826 842 831 +4 835 844 838 831 +4 851 841 831 842 +4 842 844 835 831 +4 831 847 851 842 +4 831 842 844 847 +4 847 841 831 851 +4 831 841 836 842 +4 831 844 838 847 +4 833 832 845 837 +4 832 836 833 845 +4 833 836 841 845 +4 833 840 845 841 +4 834 840 833 841 +4 840 833 845 837 +4 834 843 840 841 +4 841 848 834 843 +4 844 835 846 839 +4 839 844 835 842 +4 836 851 842 841 +4 836 851 841 845 +4 840 845 850 837 +4 844 838 847 854 +4 846 852 842 839 +4 846 844 839 842 +4 849 841 845 840 +4 843 840 848 849 +4 843 841 848 840 +4 840 841 848 849 +4 849 845 850 840 +4 853 861 841 851 +4 841 861 849 845 +4 845 841 861 851 +4 853 848 841 861 +4 861 848 841 849 +4 841 851 847 853 +4 842 847 851 852 +4 847 842 844 852 +4 842 846 844 852 +4 844 855 859 847 +4 855 852 847 844 +4 855 844 846 852 +4 854 844 859 847 +4 850 861 845 849 +4 856 852 855 846 +4 867 859 847 862 +4 863 854 859 847 +4 859 863 847 862 +4 869 851 847 852 +4 869 853 847 851 +4 869 853 862 847 +4 847 869 852 867 +4 862 869 847 867 +4 847 855 859 852 +4 859 867 847 852 +4 858 849 857 848 +4 858 861 849 848 +4 861 853 848 858 +4 849 861 860 850 +4 849 865 858 857 +4 865 860 849 858 +4 861 849 860 858 +4 860 861 864 850 +4 869 851 861 853 +4 855 867 852 856 +4 859 855 867 852 +4 874 869 853 862 +4 853 861 874 858 +4 870 853 874 858 +4 853 874 862 870 +4 861 869 853 874 +4 863 868 859 854 +4 857 865 858 866 +4 871 870 858 865 +4 861 860 865 858 +4 870 874 871 858 +4 865 870 858 866 +4 858 874 871 865 +4 874 858 861 865 +4 859 867 868 863 +4 859 868 867 872 +4 863 867 862 859 +4 860 864 861 865 +4 860 865 871 864 +4 861 864 874 865 +4 867 862 869 863 +4 862 883 869 863 +4 877 862 874 870 +4 863 883 873 862 +4 862 873 877 883 +4 883 862 874 877 +4 883 869 874 862 +4 876 863 873 868 +4 868 863 872 879 +4 883 876 863 873 +4 879 869 883 863 +4 863 869 867 872 +4 876 863 879 883 +4 867 863 872 868 +4 863 879 869 872 +4 863 868 876 879 +4 864 871 874 865 +4 871 874 875 864 +4 866 870 871 865 +4 866 870 878 871 +4 879 867 869 872 +4 876 868 872 879 +4 869 874 886 883 +4 869 886 879 883 +4 887 882 888 870 +4 877 888 870 887 +4 883 870 874 887 +4 871 882 874 870 +4 887 882 870 874 +4 878 888 882 870 +4 877 870 874 883 +4 877 870 883 887 +4 871 878 882 870 +4 882 874 875 871 +4 876 872 881 879 +4 880 883 873 884 +4 884 883 873 876 +4 877 883 873 880 +4 874 887 882 875 +4 887 874 883 886 +4 876 884 883 881 +4 881 876 879 883 +4 891 888 877 883 +4 887 877 888 883 +4 877 891 883 880 +4 888 882 894 878 +4 879 883 886 885 +4 883 879 881 885 +4 884 893 880 883 +4 893 880 891 892 +4 893 883 891 880 +4 889 881 885 883 +4 889 883 884 881 +4 889 885 881 890 +4 894 888 887 882 +4 898 894 887 882 +4 891 900 906 883 +4 885 895 883 886 +4 888 887 883 897 +4 897 886 883 895 +4 906 897 891 883 +4 891 883 893 900 +4 888 883 891 897 +4 895 885 883 889 +4 883 884 893 889 +4 895 883 893 889 +4 887 886 883 897 +4 900 883 893 895 +4 895 906 900 883 +4 897 906 895 883 +4 895 885 889 890 +4 894 897 898 887 +4 888 897 894 887 +4 910 888 894 909 +4 888 910 897 915 +4 909 903 915 888 +4 909 888 902 903 +4 891 888 915 903 +4 894 910 897 888 +4 891 888 897 915 +4 894 888 902 909 +4 910 909 915 888 +4 900 895 889 901 +4 895 889 893 900 +4 900 889 896 901 +4 896 889 895 901 +4 889 895 890 896 +4 906 904 891 915 +4 904 893 891 892 +4 904 891 899 892 +4 899 891 904 915 +4 899 903 891 915 +4 891 897 906 915 +4 904 900 906 891 +4 904 893 900 891 +4 898 909 894 907 +4 898 910 897 894 +4 909 894 910 898 +4 901 900 895 906 +4 905 900 896 901 +4 910 906 897 915 +4 910 909 898 907 +4 915 913 912 899 +4 899 912 904 908 +4 912 915 899 904 +4 913 915 903 899 +4 912 899 913 908 +4 900 914 906 905 +4 912 914 906 900 +4 906 900 905 901 +4 906 904 912 900 +4 923 915 909 902 +4 916 925 902 923 +4 916 922 902 925 +4 902 916 915 903 +4 916 915 923 902 +4 902 915 909 903 +4 916 915 903 913 +4 904 912 915 906 +4 917 914 905 906 +4 906 917 914 919 +4 914 915 912 906 +4 910 915 919 906 +4 906 914 915 919 +4 910 907 911 909 +4 924 912 913 908 +4 908 913 924 921 +4 909 918 920 923 +4 920 915 909 923 +4 910 915 909 920 +4 911 918 920 909 +4 911 920 910 909 +4 910 919 915 927 +4 915 910 927 920 +4 924 928 915 912 +4 915 912 913 924 +4 912 928 915 914 +4 933 915 913 924 +4 913 916 933 926 +4 915 916 933 913 +4 933 913 926 929 +4 913 933 924 929 +4 913 926 929 921 +4 929 924 913 921 +4 917 919 928 914 +4 915 928 919 914 +4 919 915 933 928 +4 933 915 923 916 +4 923 930 915 933 +4 928 915 933 924 +4 930 927 915 933 +4 915 933 927 919 +4 927 915 920 930 +4 930 915 920 923 +4 922 935 933 916 +4 925 933 923 916 +4 933 916 935 926 +4 916 922 925 933 +4 919 928 932 917 +4 934 930 920 918 +4 920 923 918 930 +4 919 933 932 928 +4 933 941 927 919 +4 933 919 932 941 +4 941 919 932 927 +4 934 927 920 930 +4 926 929 921 931 +4 935 937 922 936 +4 925 922 936 933 +4 935 922 933 936 +4 922 925 936 937 +4 933 923 940 936 +4 923 930 933 940 +4 923 925 936 933 +4 929 933 924 938 +4 933 928 924 942 +4 924 933 942 938 +4 945 933 926 931 +4 935 933 926 945 +4 926 933 929 931 +4 946 941 934 927 +4 946 933 927 930 +4 933 941 946 927 +4 930 946 934 927 +4 942 933 928 941 +4 928 932 944 942 +4 928 932 942 941 +4 928 933 932 941 +4 939 931 929 938 +4 938 929 933 931 +4 943 934 930 940 +4 946 930 934 940 +4 946 940 933 930 +4 945 938 933 931 +4 938 945 939 931 +4 942 932 944 941 +4 938 933 942 958 +4 935 933 949 936 +4 933 955 951 957 +4 955 946 940 933 +4 958 957 949 933 +4 933 955 957 940 +4 933 957 951 958 +4 933 946 941 951 +4 933 945 935 949 +4 933 949 958 945 +4 955 946 933 951 +4 936 933 957 940 +4 933 957 949 936 +4 941 942 933 951 +4 951 942 933 958 +4 958 938 933 945 +4 946 934 943 940 +4 949 937 935 936 +4 954 957 950 936 +4 949 957 954 936 +4 936 950 954 948 +4 936 957 950 940 +4 948 949 936 937 +4 954 949 936 948 +4 942 953 938 958 +4 947 938 953 945 +4 945 947 938 939 +4 945 938 953 958 +4 950 940 955 952 +4 946 955 940 952 +4 950 957 955 940 +4 946 952 940 943 +4 944 941 951 942 +4 944 942 951 956 +4 942 956 953 958 +4 956 942 951 958 +4 957 955 951 958 +CELL_TYPES 13072 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 diff --git a/tools/postinstall-fixup/macos-postinstall-fixup.sh b/tools/postinstall-fixup/macos-postinstall-fixup.sh index b905d0d0ed0..329be2877c7 100644 --- a/tools/postinstall-fixup/macos-postinstall-fixup.sh +++ b/tools/postinstall-fixup/macos-postinstall-fixup.sh @@ -70,6 +70,7 @@ check-all-deps() { echo " Checking (pass $pass) $lib" libqt="" + libpython="" libboost="" libicu="" libglew="" @@ -83,6 +84,7 @@ check-all-deps() { is_fixup_needed="false" if echo "$dependencies" | grep --quiet "/Qt" || + echo "$dependencies" | grep --quiet "/Python" || echo "$dependencies" | grep --quiet "/libboost" || echo "$dependencies" | grep --quiet "/libicu" || echo "$dependencies" | grep --quiet "/libGLEW" || @@ -101,6 +103,8 @@ check-all-deps() { (echo "$dependencies") | while read dep; do if libqt="$(echo $dep | egrep -o "/Qt[A-Za-z]*$" | cut -c2-)" && [ -n "$libqt" ]; then libname="$libqt" + elif libpython="$(echo $dep | egrep -o "/Python.framework.*" | cut -c2-)" && [ -n "$libpython" ]; then + libname="$libpython" elif libboost="$(echo $dep | egrep -o "/libboost_[^\/]*?\.dylib" | cut -c2-)" && [ -n "$libboost" ]; then libname="$libboost" elif libicu="$(echo $dep | egrep -o "/libicu[^\/]*?\.dylib$" | cut -c2-)" && [ -n "$libicu" ]; then @@ -135,13 +139,15 @@ check-all-deps() { originlib="$dep" destlib="$INSTALL_DIR/lib/$libname" fi - if [ -e $originlib ] && [ ! -e $destlib ]; then + if [ -e $originlib ] && [ ! -e $destlib ] && [ -z "$libpython" ]; then echo " cp -Rf $dep $INSTALL_DIR/lib" cp -Rf $originlib $INSTALL_DIR/lib fi elif [[ "$mode" == "fixup" ]]; then if [ -n "$libqt" ]; then rpathlib="$libqt.framework/$libqt" + elif [ -n "$libpython" ]; then + rpathlib="$libpython" else rpathlib="$libname" fi From 5e455e40581d4be035646949594485db9fed0b18 Mon Sep 17 00:00:00 2001 From: Paul Baksic Date: Thu, 23 Jan 2025 14:49:55 +0100 Subject: [PATCH 12/14] Fix compilation --- .../solidmechanics/spring/FixedWeakConstraint.h | 2 +- .../solidmechanics/spring/FixedWeakConstraint.inl | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.h b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.h index d5ed13fe513..1fc80413b7a 100644 --- a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.h +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.h @@ -29,7 +29,7 @@ #include #include #include -#include +#include namespace sofa::core::behavior diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.inl b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.inl index 5ab787e4025..5dba0d315f9 100644 --- a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.inl +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.inl @@ -108,7 +108,7 @@ const bool FixedWeakConstraint::checkState() /// Compile time condition to check if we are working with a Rigid3Types or a type that does not /// need the Angular Stiffness parameters. //if constexpr (isRigid()) - if constexpr (sofa::type::isRigidType()) + if constexpr (sofa::type::isRigidType) { sofa::helper::ReadAccessor> s = d_stiffness; sofa::helper::WriteOnlyAccessor> as = d_angularStiffness; @@ -274,7 +274,7 @@ void FixedWeakConstraint::addForce(const MechanicalParams* mparams , const auto & activeDirections = getActiveDirections(); // rigid case - if constexpr (sofa::type::isRigidType()) + if constexpr (sofa::type::isRigidType) { CPos dx = p1[index].getCenter() - p0[ext_index].getCenter(); @@ -362,7 +362,7 @@ void FixedWeakConstraint::addDForce(const MechanicalParams* mparams, const auto stiffness = k[static_cast(i < k.size()) * i]; - if constexpr (sofa::type::isRigidType()) + if constexpr (sofa::type::isRigidType) { const auto angularStiffness = k_a[static_cast(i < k_a.size()) * i]; @@ -458,7 +458,7 @@ void FixedWeakConstraint::addKToMatrix(const MechanicalParams* mparam } // rotation (if applicable) - if constexpr (sofa::type::isRigidType()) + if constexpr (sofa::type::isRigidType) { const auto vr = -kFact * k_a[(index < k_a.size()) * index]; for (sofa::Size i = space_size; i < total_size; i++) @@ -507,7 +507,7 @@ void FixedWeakConstraint::buildStiffnessMatrix(core::behavior::Stiffn } // rotation (if applicable) - if constexpr (sofa::type::isRigidType()) + if constexpr (sofa::type::isRigidType) { const auto vr = -k_a[(index < k_a.size()) * index]; for (sofa::Size i = space_size; i < total_size; ++i) From 1985599e59ed197dcfe3097c435715c8b818e65c Mon Sep 17 00:00:00 2001 From: Paul Baksic Date: Thu, 23 Jan 2025 15:39:36 +0100 Subject: [PATCH 13/14] Try to fix windows compilation --- .../component/solidmechanics/spring/FixedWeakConstraint.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.h b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.h index 1fc80413b7a..c710d994709 100644 --- a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.h +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/FixedWeakConstraint.h @@ -104,12 +104,12 @@ class FixedWeakConstraint : public core::behavior::ForceField protected : FixedWeakConstraint(); - static constexpr type::fixed_array s_defaultActiveDirections = sofa::type::makeHomogeneousArray(true); + static constexpr type::fixed_array::coord_total_size> s_defaultActiveDirections = sofa::type::makeHomogeneousArray::coord_total_size>(true); virtual const DataVecCoord* getExtPosition() const; virtual const VecIndex& getIndices() const; virtual const VecIndex& getExtIndices() const; - virtual const type::fixed_array& getActiveDirections() const; + virtual const type::fixed_array::coord_total_size>& getActiveDirections() const; virtual const bool checkState(); virtual bool checkOutOfBoundsIndices(); From b4e8d4308589649c9bb052674c1c178ab8d3ad3c Mon Sep 17 00:00:00 2001 From: Paul Baksic Date: Thu, 23 Jan 2025 16:40:34 +0100 Subject: [PATCH 14/14] Avoid using an intermediate expression and directly use the right term --- .../solidmechanics/spring/RestShapeSpringsForceField.inl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/RestShapeSpringsForceField.inl b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/RestShapeSpringsForceField.inl index c3fc5d30191..14e67f2cf63 100644 --- a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/RestShapeSpringsForceField.inl +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/RestShapeSpringsForceField.inl @@ -163,7 +163,7 @@ const typename RestShapeSpringsForceField::VecIndex& RestShapeSprings } template -const type::fixed_array::coord_total_size>& RestShapeSpringsForceField::getActiveDirections() const +const type::fixed_array& RestShapeSpringsForceField::getActiveDirections() const { return d_activeDirections.getValue(); }