SOFA-NG transition
Project timeline
Project is now over and all changes are integrated within SOFA.
- A dedicated Github project was created for SOFA NG
- A GitHub issue was referencing all different PRs, the description of the task and the drafts for SOFA-NG
Components
SOFA-NG introduced new libraries, or more exactly replaces the previous "modules" (e.g. SofaBaseTopology, etc.), as it was deemed difficult for the new users to find a specific component in the code. Moreover, the dependencies between the module were difficult to manage and the sorting was seemingly weird because of unholy hard-dependency in the code.
Since v22.06, a new architecture has been proposed and the SOFA team worked on a compatibility layer aiming at making the transition as smooth as possible for the community. Nevertheless, the compatibility layer might not cover some specifal cases. Do not hesitate to report your technical issues.
We need to handle either the developers of new plugins designing components and simulations; and the "normal" users which only executes simulations. There are 3 layers to manage the compatibility: CMake configure process, at compile-time and at run-time:
- at run-time, highlighting that a component should be loaded from the new library and not the deprecated one (user and dev)
- in the CMake process, informing that the deprecated package should be replaced by which new library (dev only)
- at the compilation time, to warn the user that the path for a chosen header changed in the new architecture (dev only)
CMake
CMake packages for the deprecated modules throw warnings message at the configuration time and redirect to the new ones. Effectively, it does :
find_package(new_package1)
find_package(new_package2)
...
target_link_library(oldmodule new_package1 new_package2)
and it creates an empty shell of a project, dedicated to route the new includes and the new library (.lib, .so) to the new packages.
Compilation
One big package called Sofa.Component.Compat contains all the previous headers (with the previous paths), which merely redirects to the new paths and, if the case occurs, creates an alias of the component into the previous namespace.
This is the most problematic case and where the compatibility is most likely to fail:
- C++ does not allow specialization of templated classes with aliases
- forward declaration in dev files will fail as well, as it is not possible to declare twice a class (first created by the alias and then by the forward declaration, or vice-versa)
- if one did not use explicitly the include of a header but was relying on the other file (e.g using
PointSetTopologyContainer
but was includingTriangleSetTopologyContainer
, which is usingPointSetTopologyContainer
), the compilation will fail.
Obviously, if the move did not imply a change of namespace, the transition is much smoother (for example, with Controller from Sofa.Component.Controller)
Run-time
When a user loads a deprecated module in its scene (either by using RequiredPlugin
or by manually loading it), the loading process will display a warning, advising to load the new modules, and then will load automatically the new one. This will allow the scene to still load, even if only the deprecated module was set.
Mapping deprecated modules ↔ new libraries
SofaBase
SofaBaseTopology | Sofa.Component.Topology |
SofaBaseLinearSolver | Sofa.Component.LinearSolver.Iterative |
SofaBaseUtils | Sofa.Component.SceneUtility |
SofaBaseCollision | Sofa.Component.Collision.Model |
Sofa.Component.Collision.Detection.Algorithm | |
Sofa.Component.Collision.Detection.Intersection | |
Sofa.Component.Collision.Response.Mapper | |
Sofa.Component.Collision.Response.Contact | |
SofaBaseMechanics | Sofa.Component.Mass |
Sofa.Component.Mapping.Linear | |
Sofa.Component.StateContainer | |
SofaBaseTopology | Sofa.Component.Topology.Container.Grid |
Sofa.Component.Topology.Container.Constant | |
Sofa.Component.Topology.Container.Dynamic | |
SofaBaseVisual | Sofa.Component.Visual |
Sofa.Component.Setting |
SofaCommon
SofaDeformable | Sofa.Component.SolidMechanics.Spring |
SofaEngine | Sofa.Component.Engine.Select |
SofaExplicitOdeSolver | Sofa.Component.ODESolver.Forward |
SofaImplicitOdeSolver | Sofa.Component.ODESolver.Backward |
SofaLoader | Sofa.Component.IO.Mesh |
SofaObjectInteraction | Sofa.Component.Collision.Response.Contact |
SofaMeshCollision | Sofa.Component.Collision.Geometry |
Sofa.Component.Collision.Detection.Intersection | |
Sofa.Component.Collision.Response.Mapper | |
Sofa.Component.Collision.Response.Contact | |
SofaRigid | Sofa.Component.Mapping |
Sofa.Component.SolidMechanics.Spring | |
SofaSimpleFem | Sofa.Component.Diffusion |
Sofa.Component.SolidMechanics.FEM.Elastic |
SofaGeneral
SofaGeneralExplicitOdeSolver | Sofa.Component.ODESolver.Forward |
SofaGeneralImplicitOdeSolver | Sofa.Component.ODESolver.Backward |
SofaGeneralRigid | Sofa.Component.Mapping |
SofaGeneralSimpleFem | Sofa.Component.SolidMechanics.FEM.Elastic |
SofaGeneralVisual | Sofa.Component.Visual |
SofaBoundaryCondition | Sofa.Component.Constraint.Projective |
Sofa.Component.MechanicalLoad | |
SofaConstraint | Sofa.Component.Mapping.MappedMatrix |
Sofa.Component.Constraint.Lagrangian.Model | |
Sofa.Component.Constraint.Lagrangian.Correction | |
Sofa.Component.Constraint.Lagrangian.Solver | |
Sofa.Component.AnimationLoop | |
Sofa.Component.Collision.Detection.Intersection | |
Sofa.Component.Collision.Response.Contact | |
Sofa.GUI.Component | |
SofaGeneralAnimationLoop | Sofa.Component.Mapping.MappedMatrix |
Sofa.Component.AnimationLoop | |
SofaGeneralDeformable | Sofa.Component.SolidMechanics.Spring |
Sofa.Component.SolidMechanics.TensorMass | |
SofaGeneralEngine | Sofa.Component.Engine.Analyze |
Sofa.Component.Engine.Generate | |
Sofa.Component.Engine.Select | |
Sofa.Component.Engine.Transform | |
SofaGeneralLinearSolver | Sofa.Component.LinearSolver.Iterative |
Sofa.Component.LinearSolver.Direct | |
SofaGeneralLoader | Sofa.Component.IO.Mesh |
Sofa.Component.Playback | |
SofaGeneralMeshCollision | Sofa.Component.Collision.Geometry |
Sofa.Component.Collision.Detection.Algorithm | |
Sofa.Component.Collision.Detection.Intersection | |
SofaGeneralObjectInteraction | Sofa.Component.SolidMechanics.Spring |
Sofa.Component.Constraint.Projective | |
Sofa.Component.MechanicalLoad | |
SofaGeneralTopology | Sofa.Component.Topology.Container.Grid |
Sofa.Component.Topology.Container.Constant | |
SofaGraphComponent | Sofa.Component.SceneUtility |
Sofa.Component.Setting | |
Sofa.GUI.Component | |
the plugin SceneChecking | |
SofaUserInteraction | Sofa.Component.Collision.Geometry |
Sofa.Component.Collision.Detection.Algorithm | |
Sofa.Component.Collision.Detection.Intersection | |
Sofa.Component.Collision.Response.Contact | |
Sofa.Component.Controller | |
Sofa.GUI.Component (from Sofa.GUI) | |
SofaTopologyMapping | Sofa.Component.Topology.Mapping |
Sofa.Component.Mapping |
SofaMisc
SofaMiscExtra | Sofa.Component.Engine.Generate |
SofaMiscTopology | Sofa.Component.Topology.Utility |
SofaMiscCollision | Sofa.Component.Collision.Geometry |
Sofa.Component.Collision.Detection.Intersection | |
Sofa.Component.Collision.Response.Contact | |
the plugin CollisionOBBCapsule | |
SofaMiscEngine | Sofa.Component.Engine.Analyze |
Sofa.Component.Engine.Transform | |
SofaMiscFem | Sofa.Component.SolidMechanics.FEM.Elastic |
Sofa.Component.SolidMechanics.FEM.HyperElastic | |
Sofa.Component.SolidMechanics.TensorMass | |
SofaMiscForceField | Sofa.Component.Mass |
Sofa.Component.SolidMechanics.Spring | |
SofaMiscSolver | Sofa.Component.ODESolver.Backward |
Sofa.Component.ODESolver.Forward |
Plugins
SofaDenseSolver | Sofa.Component.LinearSolver.Direct |
SofaExporter | Sofa.Component.IO.Mesh and Sofa.Component.Playback |
SofaHaptics | Sofa.Component.Haptics |
SofaValidation | Sofa.Component.Playback |
SofaNonUniformFem | Sofa.Component.Topology.Container.Grid |
Sofa.Component.Topology.Container.Dynamic | |
Sofa.Component.SolidMechanics.FEM.NonUniform | |
SofaOpenglVisual | Sofa.GL.Component.Rendering2D |
Sofa.GL.Component.Rendering3D | |
Sofa.GL.Component.Shader (from Sofa.GL) | |
SofaPreconditioner | Sofa.Component.LinearSolver.Iterative |
Sofa.Component.LinearSolver.Preconditioner | |
SofaSparseSolver | Sofa.Component.LinearSolver.Iterative |
Sofa.Component.LinearSolver.Direct |
Collection
SofaComponentAll | Sofa.Component |
Framework
SOFA-NG induced also a cleaning in the framework of SOFA. All parts of the framework have been renamed to reflect the same pattern started with Sofa.Component. For example, SofaSimulationGraph becomes Sofa.Simulation.Graph.
The list of the differents packages which are considered as part of the framework is:
SofaHelper | Sofa.Helper |
SofaDefaulttype | Sofa.Defaulttype |
SofaCore | Sofa.Core |
SofaSimulationCore | Sofa.Simulation.Core |
SofaSimulationCommon | Sofa.Simulation.Common |
SofaSimulationGraph | Sofa.Simulation.Graph |
Sofa.Config (new), which gathers all CMake files used in SOFA projects (macros, config, flags, etc) | |
Sofa.Type (new) | |
Sofa.LinearAlgebra (new) | |
Sofa.Geometry (new) | |
Sofa.Topology (new) |
Report technical issues
In case you face any technical difficulty in the transition, please report it using our GitHub Discussion forum.