Skip to content
Commits on Source (4)
# Explicitly declare text files we want to always be normalized and converted
# to native line endings on checkout.
## C/C++/Cuda code
*.h text
*.c text
*.cpp text
*.inl text
*.hpp text
## Cuda
*.cu text
## Shaders
*.frag text
*.vert text
*.glsl text
## Scenes
*.scn text
*.xml text
## Scripts
*.sh text
*.awk text
______________________________________________________
Suggested labels: <!--- see https://github.com/sofa-framework/sofa/labels -->
\ No newline at end of file
______________________________________________________
<!--- Please leave this at the end of your message -->
This PR:
- [ ] builds with SUCCESS for all platforms on the CI.
- [ ] does not generate new warnings.
- [ ] does not generate new unit test failures.
- [ ] does not generate new scene test failures.
- [ ] does not break API compatibility.
- [ ] is more than 1 week old (or has fast-merge label).
**Reviewers will merge only if all these checks are true.**
# Lines that begin with '#' are comments.
# Ignore foo.txt file
#foo.txt
# Ignore all html file
#*.html
# except foo.html which is maintain by hand
#!foo.html
# Ignore all objets and archives
#*.[oa]
########## GITIGNORE SOFA ##############
# vim journal files
.*.swp
.*.swo
# git diff temporary files
*.orig
# Backup files
*~
# Python byte code
*.pyc
# Files generated by OS X
.DS_Store
# Misc
/applications/plugins/EmptyPlugin
/applications-dev
# Files created by QtCreator
CMakeLists.txt.user*
# custom cmake file
custom.cmake
# Ignore other .gitignore
.gitignore
# anything user-specific (as opposed to repository-specific) should go
# to .git/info/exclude instead of .gitignore. Also, .gitignore files
# can be placed in sub-directories to avoid polluting the root one.
/**************************************************************************
* SOFA, Simulation Open-Framework Architecture, version 1.0 beta 4 *
* (c) 2006-2009 MGH, INRIA, USTL, UJF, CNRS *
* SOFA, Simulation Open-Framework Architecture, development version *
* (c) 2006-2017 INRIA, USTL, UJF, CNRS, MGH *
* *
* CONTRIBUTORS *
* *
......@@ -15,20 +15,40 @@
Jeremie Allard
Barbara Andre
Pierre-Jean Bensoussan
Guillaume Bousquet
Frederic Chateau
Hadrien Courtecuisse
Olivier Comas
Stephane Cotin
Jeremie Dequidt
Marie Durand
Christian Duriez
Herve Delingette
Florent Falipou
Francois Faure
Sylvere Fonteneau
Christophe Guebert
Laure Heigeas
Tobias Heimann
Everton Hermann
Jeremy Jaussaud
Lenka Jerabkova
Francois Jourdes
Hoeryong Jung
Vincent Majorczyk
Stephanie Marchesseau
Cesar Mendoza
Matthieu Nesme
Paul Neumann
Chi-Thanh Nguyen
Marek Olsak
Erik Pernod
Igor Peterlik
Juan Pablo de la Plata Alcalde
Francois Poyer
Frederick Roy
Hugo Talbot
Moreno Trlin
:: SOFA Modules ::
......@@ -39,7 +59,7 @@
Matthieu Nesme and Francois Faure
+ Dynamic Topologies
Barbara Andre and Herve Delingette
Barbara Andre, Herve Delingette, Erik Pernod
+ Tetrahedral volume rendering
Sebastien Barbier and George-Pierre Bonneau
......@@ -51,4 +71,11 @@
Juan Pablo de la Plata Alcalde, Christian Duriez
+ GPU support using CUDA
Jeremie Allard
Jeremie Allard, Hadrien Courtecuisse
+ GPU support using OpenCL
Jeremie Allard, Vincent Majorczyk
+ Geomagic Interface
Hadrien Courtecuisse
Raffaela Trivisonne
\ No newline at end of file
This diff is collapsed.
cmake_minimum_required(VERSION 3.1)
project(Sofa)
set(SOFA_KERNEL_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/SofaKernel" CACHE STRING "Path to SofaKernel")
if(NOT EXISTS ${SOFA_KERNEL_SOURCE_DIR}/framework)
set(SOFA_KERNEL_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/SofaKernel")
if(NOT EXISTS ${SOFA_KERNEL_SOURCE_DIR}/framework)
message( FATAL_ERROR "SofaKernel is not present or is inaccessible. Check if ${SOFA_KERNEL_SOURCE_DIR} exists or is accessible.")
endif()
endif()
## Default build type
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Release")
endif()
# Enable the organisation in folders for generators that support
# it. (E.g. some versions of Visual Studio have 'solution folders')
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
## Change default install prefix
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/install CACHE PATH "Install path prefix, prepended onto install directories." FORCE)
endif()
message(STATUS "Install prefix: ${CMAKE_INSTALL_PREFIX}")
# Remove generated CMake files, this prevents CMake from finding packages that
# were disabled (like, unchecked in cmake-gui) after being built once.
file(REMOVE_RECURSE ${CMAKE_BINARY_DIR}/cmake)
# Remove generated SofaPython configuration files, to prevent SofaPython from
# adding paths to disabled plugins.
file(REMOVE_RECURSE ${CMAKE_BINARY_DIR}/etc/sofa/python.d)
set(ARCHIVE_OUTPUT_DIRECTORY lib)
set(RUNTIME_OUTPUT_DIRECTORY bin)
if(WIN32)
set(LIBRARY_OUTPUT_DIRECTORY ${RUNTIME_OUTPUT_DIRECTORY})
else()
set(LIBRARY_OUTPUT_DIRECTORY ${ARCHIVE_OUTPUT_DIRECTORY})
endif()
## Set the output directories globally
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${ARCHIVE_OUTPUT_DIRECTORY})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${RUNTIME_OUTPUT_DIRECTORY})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${LIBRARY_OUTPUT_DIRECTORY})
## Environment
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules")
list(APPEND CMAKE_MODULE_PATH "${SOFA_KERNEL_SOURCE_DIR}/cmake")
list(APPEND CMAKE_MODULE_PATH "${SOFA_KERNEL_SOURCE_DIR}/cmake/Modules")
list(APPEND CMAKE_MODULE_PATH "${SOFA_KERNEL_SOURCE_DIR}/SofaFramework")
list(APPEND CMAKE_PREFIX_PATH ${CMAKE_BINARY_DIR})
list(APPEND CMAKE_PREFIX_PATH ${CMAKE_BINARY_DIR}/extlibs)
list(APPEND CMAKE_PREFIX_PATH ${CMAKE_BINARY_DIR}/applications/plugins)
list(APPEND CMAKE_PREFIX_PATH ${CMAKE_BINARY_DIR}/applications/packages)
list(APPEND CMAKE_PREFIX_PATH ${CMAKE_BINARY_DIR}/applications/projects)
# Create etc/sofa.ini: it contains the paths to share/ and examples/. In the
# build directory, it points to the source tree,
set(SHARE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/share")
set(EXAMPLES_DIR "${CMAKE_CURRENT_SOURCE_DIR}/examples")
configure_file(${SOFA_KERNEL_SOURCE_DIR}/etc/sofa.ini.in "${CMAKE_BINARY_DIR}/etc/sofa.ini")
## RPATH
if(UNIX)
# RPATH is a field in ELF binaries that is used as a hint by the system
# loader to find needed shared libraries.
#
# In the build directory, cmake creates binaries with absolute paths in
# RPATH. And by default, it strips RPATH from installed binaries. Here we
# use CMAKE_INSTALL_RPATH to set a relative RPATH. By doing so, we avoid
# the need to play with LD_LIBRARY_PATH to get applications to run.
# see https://cmake.org/Wiki/CMake_RPATH_handling for $ORIGIN doc
set(CMAKE_INSTALL_RPATH "$ORIGIN/../lib:$$ORIGIN/../lib")
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
set(CMAKE_MACOSX_RPATH ON)
endif()
endif(UNIX)
include(CompilerOptions)
## Boost (1.54.0 or higher) is now mandatory.
if(WIN32)
message("Boost autodetection on Windows was removed.\n"
"Please follow CMake documentation to find Boost on your system.\n"
"Hint: set BOOST_ROOT to your Boost location.")
endif()
set(BOOST_MIN_VERSION "1.54.0")
find_package(Boost ${BOOST_MIN_VERSION} REQUIRED)
### Dependency pack for Windows
if(MSVC)
#define BOOST_ALL_DYN_LINK needed for dynamic linking with boost libraries
add_definitions(-DBOOST_ALL_DYN_LINK)
set(SOFA_DEPENDENCY_PACK_DIR "" CACHE PATH "sofa windows dependency pack path")
if(SOFA_DEPENDENCY_PACK_DIR)
set(DEPENDENCY_PACK_DIR "${SOFA_DEPENDENCY_PACK_DIR}")
else()
# Default
set(DEPENDENCY_PACK_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
endif()
list(APPEND CMAKE_INCLUDE_PATH ${DEPENDENCY_PACK_DIR}/include)
if(CMAKE_CL_64)
list(APPEND CMAKE_LIBRARY_PATH ${DEPENDENCY_PACK_DIR}/lib/win64)
else()
list(APPEND CMAKE_LIBRARY_PATH ${DEPENDENCY_PACK_DIR}/lib/win32)
endif()
install(DIRECTORY ${DEPENDENCY_PACK_DIR}/include/ DESTINATION include COMPONENT headers)
install(DIRECTORY ${DEPENDENCY_PACK_DIR}/licenses/ DESTINATION licenses COMPONENT applications)
endif()
### Mask
option(SOFA_USE_MASK "Use mask optimization" OFF)
### SOFA_DEV_TOOL
option(SOFA_WITH_DEVTOOLS "Compile with developement extra features." ON)
### Threading
option(SOFA_WITH_THREADING "Compile sofa with thread-safetiness support (PARTIAL/EXPERIMENTAL)" ON)
### Experimental
option(SOFA_WITH_EXPERIMENTAL_FEATURES "Compile sofa with exprimental features regarding sparse matrices treatments under mappings" OFF)
### Testing
option(SOFA_BUILD_TESTS "Compile the automatic tests for Sofa, along with the gtest library." ON)
if(SOFA_BUILD_TESTS)
# Enable testing features of cmake, like the add_test() command.
enable_testing()
add_subdirectory(extlibs/gtest)
endif()
### Ninja build pools
option(SOFA_NINJA_BUILD_POOLS "Activate the Ninja build pools feature, to limit the cores used by specific targets" OFF)
### Sofa using type double or float or both
set(SOFA_FLOATING_POINT_TYPE both CACHE STRING
"Type used for floating point values in SOFA. It actually determines:
- what template instanciations will be compiled (via the definition of the
SOFA_FLOAT and SOFA_DOUBLE macros)
- what is the type behind the 'SReal' typedef used throughout SOFA. (If 'both'
is selected, SReal defaults to double.)")
set_property(CACHE SOFA_FLOATING_POINT_TYPE PROPERTY STRINGS float double both)
if(${SOFA_FLOATING_POINT_TYPE} STREQUAL double)
set(SOFA_DOUBLE 1) # Used in sofa/config.h.in
elseif(${SOFA_FLOATING_POINT_TYPE} STREQUAL float)
set(SOFA_FLOAT 1) # Used in sofa/config.h.in
endif()
# If you really don't understand the negated logics of SOFA_DOUBLE and
# SOFA_FLOAT please consider using SOFA_WITH_FLOAT and SOFA_WITH_DOUBLE.
# Eg: SOFA_WITH_FLOAT indicate that you need to generate the
# float code and SOFA_WITH_DOUBLE indicates that you
# nedd to generate the double related code.
if(${SOFA_FLOATING_POINT_TYPE} STREQUAL float)
set(SOFA_WITH_FLOAT 1)
endif()
if(${SOFA_FLOATING_POINT_TYPE} STREQUAL double)
set(SOFA_WITH_DOUBLE 1)
endif()
if(${SOFA_FLOATING_POINT_TYPE} STREQUAL both)
set(SOFA_WITH_FLOAT 1)
set(SOFA_WITH_DOUBLE 1)
endif()
### Extlibs
add_subdirectory(extlibs)
### Main Sofa subdirectories
add_subdirectory(${SOFA_KERNEL_SOURCE_DIR}/SofaFramework)
add_subdirectory(${SOFA_KERNEL_SOURCE_DIR}/SofaSimulation)
if(SOFA_BUILD_TESTS)
# Depends on SofaSimulation
add_subdirectory(tools/SofaGTestMain)
endif()
add_subdirectory(${SOFA_KERNEL_SOURCE_DIR}/SofaBase)
add_subdirectory(${SOFA_KERNEL_SOURCE_DIR}/SofaCommon)
add_subdirectory(SofaGeneral)
add_subdirectory(SofaAdvanced)
add_subdirectory(SofaMisc)
add_subdirectory(SofaGui)
# SofaTest depends on SofaPython, so we add SofaPython before SofaTest.
sofa_add_plugin( applications/plugins/SofaPython SofaPython )
## Scene creator option
option(SOFA_BUILD_SCENECREATOR "Compile the C++ API located in applications/plugins/SceneCreator" OFF)
## Tutorials option
option(SOFA_BUILD_TUTORIALS "Build (most of) the tutorials available." OFF)
# Activate SceneCreator when required
if(SOFA_BUILD_TESTS OR SOFA_BUILD_TUTORIALS)
set(SOFA_BUILD_SCENECREATOR ON CACHE BOOL "" FORCE)
endif()
# Library used by SOFA_BUILD_TESTS and SOFA_BUILD_TUTORIALS
if(SOFA_BUILD_SCENECREATOR)
add_subdirectory(applications/plugins/SceneCreator SceneCreator)
endif()
# Tests : define subdirectories
if(SOFA_BUILD_TESTS)
# Library used to write high level tests involving many components.
add_subdirectory(applications/plugins/SofaTest SofaTest)
# Tests for all the modules, written using SofaTest.
add_subdirectory(modules/tests)
# SofaPython_test is a special case, because it depends on
# SofaTest, which depends on SofaPython...
if(PLUGIN_SOFAPYTHON)
add_subdirectory(applications/plugins/SofaPython/SofaPython_test)
endif()
# Not sure what is it
add_subdirectory(applications/plugins/SofaTest/SofaTest_test SofaTest/SofaTest_test)
endif()
## Plugins
add_subdirectory(applications/plugins)
## Packages
add_subdirectory(applications/packages)
## Applications
add_subdirectory(applications/projects)
# Tutorial add subdirectory
if(SOFA_BUILD_TUTORIALS)
add_subdirectory(applications/tutorials)
endif()
## Build external projects at the same time
set(SOFA_EXTERNAL_DIRECTORIES "" CACHE STRING "list of paths separated by ';'")
if(NOT "${SOFA_EXTERNAL_DIRECTORIES}" STREQUAL "")
foreach(dir ${SOFA_EXTERNAL_DIRECTORIES})
get_filename_component(name ${dir} NAME) # Get the name of the actual directory
message("Adding external directory: ${name} (${dir})")
add_subdirectory(${dir} "${CMAKE_CURRENT_BINARY_DIR}/external_directories/${name}")
endforeach()
endif()
### Deprecated components
option(SOFA_WITH_DEPRECATED_COMPONENTS "Compile SOFA with all deprecated components" ON)
if(SOFA_WITH_DEPRECATED_COMPONENTS)
message(DEPRECATION "Deprecated components are activated (SOFA_WITH_DEPRECATED_COMPONENTS variable is ON)")
endif()
## Custom
if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/custom.cmake")
message("Adding custom file")
include( "custom.cmake" )
endif()
# Install configuration
#install(FILES "${CMAKE_BINARY_DIR}/CMakeCache.txt" DESTINATION . COMPONENT headers)
install(FILES "${CMAKE_SOURCE_DIR}/README.md" DESTINATION . COMPONENT applications)
install(FILES "${CMAKE_SOURCE_DIR}/CHANGELOG.md" DESTINATION . COMPONENT applications)
install(FILES "${CMAKE_SOURCE_DIR}/LICENSE.LGPL.txt" DESTINATION . COMPONENT applications)
install(FILES "${CMAKE_SOURCE_DIR}/Authors.txt" DESTINATION . COMPONENT applications)
## Create etc/installedSofa.ini: it contains the paths to share/ and examples/. Compare to the Sofa.ini in the
## build directory, this one contains relative paths to the installed resource directory.
set(SHARE_DIR "../share/sofa")
set(EXAMPLES_DIR "../share/sofa/examples")
configure_file(${SOFA_KERNEL_SOURCE_DIR}/etc/sofa.ini.in "${CMAKE_BINARY_DIR}/etc/installedSofa.ini")
install(FILES "${CMAKE_BINARY_DIR}/etc/installedSofa.ini" DESTINATION etc RENAME sofa.ini COMPONENT applications)
option(SOFA_INSTALL_RESOURCES_FILES "Copy resources files (etc/, share/, examples/) when installing" ON)
## Install resource files
if(SOFA_INSTALL_RESOURCES_FILES)
install(DIRECTORY share/ DESTINATION share/sofa COMPONENT resources)
install(DIRECTORY examples/ DESTINATION share/sofa/examples COMPONENT resources)
endif()
#CPack install
SET(CPACK_PACKAGE_VERSION_MAJOR "18")
SET(CPACK_PACKAGE_VERSION_MINOR "06")
SET(CPACK_PACKAGE_VERSION_PATCH "00")
SET(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
set(CPACK_PACKAGE_NAME "SOFA v${CPACK_PACKAGE_VERSION}")
set(CPACK_PACKAGE_FILE_NAME "SOFA_v${CPACK_PACKAGE_VERSION}")
set(CPACK_PACKAGE_VENDOR "The SOFA Team")
#set(CPACK_PACKAGE_CONTACT "contact@sofa-framework.org")
set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/README.md")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Real-time multi-physics simulation with an emphasis on medical simulation.")
set(CPACK_PACKAGE_EXECUTABLES "runSofa" "runSofa")
set(CPACK_COMPONENTS_ALL applications headers Eigen_headers GTest_headers libraries resources)
set(CPACK_COMPONENT_APPLICATIONS_DISPLAY_NAME "runSofa Application")
set(CPACK_COMPONENT_HEADERS_DISPLAY_NAME "C++ Headers")
set(CPACK_COMPONENT_EIGEN_HEADERS_DISPLAY_NAME "Eigen Headers")
set(CPACK_COMPONENT_GTEST_HEADERS_DISPLAY_NAME "GTest Headers")
set(CPACK_COMPONENT_LIBRARIES_DISPLAY_NAME "Libraries")
set(CPACK_COMPONENT_RESOURCES_DISPLAY_NAME "Resources")
set(CPACK_COMPONENT_APPLICATIONS_GROUP "Runtime")
set(CPACK_COMPONENT_HEADERS_GROUP "Development")
set(CPACK_COMPONENT_EIGEN_HEADERS_GROUP "Development")
set(CPACK_COMPONENT_GTEST_HEADERS_GROUP "Development")
set(CPACK_COMPONENT_LIBRARIES_GROUP "Development")
set(CPACK_COMPONENT_RESOURCES_GROUP "Runtime")
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE.LGPL.txt")
set(CPACK_RESOURCE_FILE_README "${CMAKE_SOURCE_DIR}/README.md")
set(CPACK_RESOURCE_FILE_WELCOME "${CMAKE_SOURCE_DIR}/README.md")
if(WIN32)
# There is a bug in NSI that does not handle full unix paths properly. Make
# sure there is at least one set of four (4) backlasshes.
set(CPACK_PACKAGE_INSTALL_DIRECTORY "SOFA_v${CPACK_PACKAGE_VERSION}")
set(CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/share/icons\\\\SOFA.png")
set(CPACK_NSIS_INSTALLED_ICON_NAME "bin\\\\runSofa.exe")
set(CPACK_NSIS_DISPLAY_NAME "SOFA v${CPACK_PACKAGE_VERSION}")
set(CPACK_NSIS_HELP_LINK "https:\\\\\\\\www.sofa-framework.org")
set(CPACK_NSIS_URL_INFO_ABOUT "https:\\\\\\\\www.sofa-framework.org")
set(CPACK_NSIS_CONTACT "contact@sofa-framework.org")
set(CPACK_NSIS_INSTALL_ROOT "$PROFILE")
elseif(APPLE)
#set(CPACK_PACKAGE_INSTALL_DIRECTORY "SOFA/v${CPACK_PACKAGE_VERSION}")
#set(CPACK_DMG_BACKGROUND_IMAGE "${CMAKE_SOURCE_DIR}/back.png")
else()
set(CPACK_PACKAGE_INSTALL_DIRECTORY "SOFA/v${CPACK_PACKAGE_VERSION}")
find_package(ICU COMPONENTS data i18n uc)
if(ICU_FOUND)
sofa_install_libraries(${ICU_LIBRARIES})
endif()
endif()
#dirty hack to pack component we want (named BundlePack from runSofa for example, and that will install .app + share)
#if not set, it will install everything as usual
#TODO: Redesign of a better architecture about bundling (runSofa ? libraries ? modeler ? other application ?)
get_property(TEMP_CPACK_COMPONENTS_ALL GLOBAL PROPERTY RUNSOFA_CPACK_COMPONENTS_ALL )
if(TEMP_CPACK_COMPONENTS_ALL)
set(CPACK_ARCHIVE_COMPONENT_INSTALL ON)
set(CPACK_COMPONENTS_ALL ${TEMP_CPACK_COMPONENTS_ALL})
endif()
if(NOT ${CPACK_PACKAGE_VERSION_PATCH} STREQUAL "dev" AND EXISTS "${CMAKE_CURRENT_LIST_DIR}/package.cmake")
message("Using package.cmake")
include( "package.cmake" )
endif()
INCLUDE(CPack)
# Welcome
Welcome to the SOFA Community! Here is a brief summary of how it is structured:
- SOFA Users: people using SOFA by writing scenes or using the SOFA API.
- SOFA Developpers: people programming into SOFA, modifying the API, writing plugins.
- SOFA Contributors: (awesome) people proposing their changes in SOFA code via pull-requests.
- SOFA Reviewers: people reviewing and merging the pull-requests. This group is validated by the Scientific and Technical Committee (STC).
- SOFA Consortium: research centers and companies willing to share the cost of development and maintenance of SOFA, hosted by the Inria Foundation.
- SOFA Consortium Staff: administrators of SOFA and its ecosystem. This group is directed by the Executive Committee (EC).
All SOFA Developpers are gladly invited to the SOFA-dev meetings.
They take place remotely every Wednesday at 10 a.m. CET and are animated by the SOFA Reviewers + the Consortium Staff.
[Subscribe to SOFA-dev mailing-list](https://sympa.inria.fr/sympa/subscribe/sofa-dev) to get the agenda, reports and conference room url.
About the steering committees:
- SOFA Scientific and Technical Committee (STC): defines the technical roadmap twice a year, validate the contribution rules, the Reviewers team and discuss every technical point in SOFA.
- SOFA Executive Committee (EC): decides on evolutions of the membership contract, the communication policy and the priorities of the Consortium.
A more detailed definition of the committees is available [in the SOFA website](https://www.sofa-framework.org/consortium/presentation/).
# Getting started
Please **read carefully** [the GitHub guide on Contributing to Open Source](https://guides.github.com/activities/contributing-to-open-source/). We also recommend you to check this [more detailed documentation on issues and pull requests](https://help.github.com/categories/collaborating-with-issues-and-pull-requests/).
# Forum
For any **question** (help needed, problem of understanding SOFA, announcements), create a topic on [the SOFA forum](https://www.sofa-framework.org/community/forum/) and benefit from the feedback of the community.
When creating a new topic, pay attention to some tips:
- **Check existing topics** using the Search bar. Your question may have been answered already.
- **Be clear** about what your problem is: what was the expected outcome, what happened instead? Detail how someone else can recreate the problem.
- **Additional infos**: link to demos, screenshots or code showing the problem.
# Issues
For **bug tracking**, **feature proposals** and **task management**, create a [SOFA issue](https://github.com/sofa-framework/sofa/issues)! There is nothing to it and whatever issue you are having, you are likely not the only one, so others will find your issue helpful, too. Issues labeled "discussion" are also used for larger topics: architecture, future of SOFA, long term dev, etc.
Please **DO NOT create an issue for questions or support**. Use [the SOFA forum](https://www.sofa-framework.org/community/forum/) instead.
When creating an issue, pay attention to the following tips:
- **Check existing issues**. What you are running into may have been addressed already.
- **Set the right label** to your issue among our label list or propose them in the description.
- **Be clear** about what your problem is: what was the expected outcome, what happened instead? Detail how someone else can recreate the problem.
- If your issue reports a bug or any abnormal behavior in SOFA, a **test highlighting the issue** should be written and pull requested.
For more information on issues, check out [this GitHub guide](https://guides.github.com/features/issues/).
# Pull requests
If you are able to patch the bug or add the feature yourself – fantastic, make a pull request with the code! Be sure you have read any documents on contributing and you understand [the SOFA license](https://github.com/sofa-framework/sofa/blob/master/LICENCE.txt). Once you have submitted a pull request the maintainer(s) can compare your branch to the existing one and decide whether or not to incorporate (pull in) your changes.
### Reminder - How to pull request (from GitHub documentation)
- **[Fork](http://guides.github.com/activities/forking/)** the repository and clone it locally.
- [Connect your clone](https://help.github.com/articles/configuring-a-remote-for-a-fork/) to [the original **upstream** repository](https://github.com/sofa-framework/sofa/) by adding it as a remote.
- **Create a branch** for your changes.
- Make your changes.
- Pull in changes from upstream often to [**sync your fork**](https://help.github.com/articles/syncing-a-fork/) so that merge conflicts will be less likely in your pull request.
- [**Create a pull request**](https://help.github.com/articles/creating-a-pull-request-from-a-fork/) when you are ready to propose your changes into the main project.
### Rules
- Description must explain the **issue solved** or the **feature added**, and this must be reported in the **[CHANGELOG.md](https://github.com/sofa-framework/sofa/blob/master/CHANGELOG.md)** file.
- Code must follow **[our guidelines](https://github.com/sofa-framework/sofa/blob/master/GUIDELINES.md)**.
- Commit must build **successfully** on Jenkins for all steps (compilation + tests + examples).
- **Unit Tests** are required for each new component or if an issue is fixed.
- **Examples** (at least one) must be provided showing the new feature.
### Lifecycle
Standard pull-requests are reviewed and approved by the "Reviewers" team.
Major pull-requests (BREAKING, major features) are reviewed by the "Reviewers" team and approved by the "STC members" team through a vote within a maximum period of 2 weeks.
Reviewing:
- Make sure the pull request is **labelized** and well assigned.
- Control that it follows **our rules** (defined above).
- Track the **status of each pull request** using the dedicated labels:
- "pr: wip" must be set if the PR has been created for a team work or if some fixes are needed (discussed in the comments).
- "pr: to review" must be set if the PR is ready to be reviewed.
- "pr: ready" must be set **instead of merge** if another PR merge is being built on the [Dashboard](https://www.sofa-framework.org/dash/?branch=origin/master). It is used to delay the merge and avoid CI overflow.
- **Control the builds**: Dashboard > Details in the pull request checks.
- Merge method: **prefer "merge"** or "squash" over "rebase".
Remember that:
- You can **add commits** in a pull request: see [GitHub documentation](https://help.github.com/articles/committing-changes-to-a-pull-request-branch-created-from-a-fork/).
- If the pull request contains out of scope commits (from a previous merge with master), **consider rebasing it**.
For more information on forks and pull request, check out [this GitHub guide](https://guides.github.com/activities/forking/).
### SOFA Developer Certificate Of Origin (DCO)
SOFA is using the [mechanism of the linux project](https://www.kernel.org/doc/html/latest/process/submitting-patches.html#sign-your-work-the-developer-s-certificate-of-origin) to track and secure all issues related to copyrights: the Developper Certificate of Origin (DCO). If you are contributing code or documentation to the SOFA project, and using the git signed-off-by mechanism, you are agreeing to this certificate. This DCO essentially means that:
- you offer the changes under the same license agreement as the project, and
- you have the right to do that,
- you did not steal somebody else’s work.
The original DCO is available online : [http://developercertificate.org](http://developercertificate.org)
```
Developer Certificate of Origin
Version 1.1
Copyright (C) 2004, 2006 The Linux Foundation and its contributors.
1 Letterman Drive
Suite D4700
San Francisco, CA, 94129
Everyone is permitted to copy and distribute verbatim copies of this
license document, but changing it is not allowed.
Developer's Certificate of Origin 1.1
By making a contribution to this project, I certify that:
(a) The contribution was created in whole or in part by me and I
have the right to submit it under the open source license
indicated in the file; or
(b) The contribution is based upon previous work that, to the best
of my knowledge, is covered under an appropriate open source
license and I have the right under that license to submit that
work with modifications, whether created in whole or in part
by me, under the same open source license (unless I am
permitted to submit under a different license), as indicated
in the file; or
(c) The contribution was provided directly to me by some other
person who certified (a), (b) or (c) and I have not modified
it.
(d) I understand and agree that this project and the contribution
are public and that a record of the contribution (including all
personal information I submit with it, including my sign-off) is
maintained indefinitely and may be redistributed consistent with
this project or the open source license(s) involved.
```
\ No newline at end of file
# Doxyfile 1.4.7
#---------------------------------------------------------------------------
# Project related configuration options
#---------------------------------------------------------------------------
PROJECT_NAME = Sofa
PROJECT_NUMBER = "1.0 beta 4"
OUTPUT_DIRECTORY = doc/doxygen
CREATE_SUBDIRS = NO
OUTPUT_LANGUAGE = English
USE_WINDOWS_ENCODING = NO
BRIEF_MEMBER_DESC = YES
REPEAT_BRIEF = YES
ABBREVIATE_BRIEF = "The $name class" \
"The $name widget" \
"The $name file" \
is \
provides \
specifies \
contains \
represents \
a \
an \
the
ALWAYS_DETAILED_SEC = NO
INLINE_INHERITED_MEMB = NO
FULL_PATH_NAMES = YES
STRIP_FROM_PATH = $(PWD)
STRIP_FROM_INC_PATH =
SHORT_NAMES = NO
JAVADOC_AUTOBRIEF = YES
MULTILINE_CPP_IS_BRIEF = NO
DETAILS_AT_TOP = YES
INHERIT_DOCS = YES
SEPARATE_MEMBER_PAGES = NO
TAB_SIZE = 4
ALIASES =
OPTIMIZE_OUTPUT_FOR_C = YES
OPTIMIZE_OUTPUT_JAVA = NO
BUILTIN_STL_SUPPORT = NO
DISTRIBUTE_GROUP_DOC = NO
SUBGROUPING = YES
#---------------------------------------------------------------------------
# Build related configuration options
#---------------------------------------------------------------------------
EXTRACT_ALL = YES
EXTRACT_PRIVATE = YES
EXTRACT_STATIC = YES
EXTRACT_LOCAL_CLASSES = YES
EXTRACT_LOCAL_METHODS = YES
HIDE_UNDOC_MEMBERS = NO
HIDE_UNDOC_CLASSES = NO
HIDE_FRIEND_COMPOUNDS = NO
HIDE_IN_BODY_DOCS = NO
INTERNAL_DOCS = YES
CASE_SENSE_NAMES = YES
HIDE_SCOPE_NAMES = NO
SHOW_INCLUDE_FILES = YES
INLINE_INFO = YES
SORT_MEMBER_DOCS = YES
SORT_BRIEF_DOCS = NO
SORT_BY_SCOPE_NAME = NO
GENERATE_TODOLIST = YES
GENERATE_TESTLIST = YES
GENERATE_BUGLIST = YES
GENERATE_DEPRECATEDLIST= YES
ENABLED_SECTIONS =
MAX_INITIALIZER_LINES = 30
SHOW_USED_FILES = YES
SHOW_DIRECTORIES = YES
FILE_VERSION_FILTER =
#---------------------------------------------------------------------------
# configuration options related to warning and progress messages
#---------------------------------------------------------------------------
QUIET = NO
WARNINGS = YES
WARN_IF_UNDOCUMENTED = YES
WARN_IF_DOC_ERROR = YES
WARN_NO_PARAMDOC = NO
WARN_FORMAT = "$file:$line: $text"
WARN_LOGFILE = doxygen.log
#---------------------------------------------------------------------------
# configuration options related to the input files
#---------------------------------------------------------------------------
INPUT = framework modules applications
FILE_PATTERNS = *.c \
*.cc \
*.cxx \
*.cpp \
*.c++ \
*.java \
*.ii \
*.ixx \
*.ipp \
*.i++ \
*.inl \
*.h \
*.hh \
*.hxx \
*.hpp \
*.h++ \
*.idl \
*.odl \
*.cs \
*.php \
*.php3 \
*.inc \
*.m \
*.mm \
*.dox \
*.C \
*.CC \
*.C++ \
*.II \
*.I++ \
*.H \
*.HH \
*.H++ \
*.CS \
*.PHP \
*.PHP3 \
*.M \
*.MM \
*.C \
*.H \
*.tlh \
*.diff \
*.patch \
*.moc \
*.xpm \
*.dox
RECURSIVE = YES
EXCLUDE = include
EXCLUDE_SYMLINKS = NO
EXCLUDE_PATTERNS =
EXAMPLE_PATH =
EXAMPLE_PATTERNS = *
EXAMPLE_RECURSIVE = NO
IMAGE_PATH =
INPUT_FILTER =
FILTER_PATTERNS =
FILTER_SOURCE_FILES = NO
#---------------------------------------------------------------------------
# configuration options related to source browsing
#---------------------------------------------------------------------------
SOURCE_BROWSER = YES
INLINE_SOURCES = NO
STRIP_CODE_COMMENTS = YES
REFERENCED_BY_RELATION = YES
REFERENCES_RELATION = YES
REFERENCES_LINK_SOURCE = YES
USE_HTAGS = NO
VERBATIM_HEADERS = YES
#---------------------------------------------------------------------------
# configuration options related to the alphabetical class index
#---------------------------------------------------------------------------
ALPHABETICAL_INDEX = YES
COLS_IN_ALPHA_INDEX = 3
IGNORE_PREFIX =
#---------------------------------------------------------------------------
# configuration options related to the HTML output
#---------------------------------------------------------------------------
GENERATE_HTML = YES
HTML_OUTPUT = html
HTML_FILE_EXTENSION = .html
HTML_HEADER =
HTML_FOOTER =
HTML_STYLESHEET =
HTML_ALIGN_MEMBERS = YES
GENERATE_HTMLHELP = NO
CHM_FILE =
HHC_LOCATION =
GENERATE_CHI = NO
BINARY_TOC = NO
TOC_EXPAND = NO
DISABLE_INDEX = NO
ENUM_VALUES_PER_LINE = 4
GENERATE_TREEVIEW = YES
TREEVIEW_WIDTH = 250
#---------------------------------------------------------------------------
# configuration options related to the LaTeX output
#---------------------------------------------------------------------------
GENERATE_LATEX = NO
LATEX_OUTPUT = latex
LATEX_CMD_NAME = latex
MAKEINDEX_CMD_NAME = makeindex
COMPACT_LATEX = NO
PAPER_TYPE = a4wide
EXTRA_PACKAGES = amsmath
LATEX_HEADER =
PDF_HYPERLINKS = NO
USE_PDFLATEX = NO
LATEX_BATCHMODE = NO
LATEX_HIDE_INDICES = NO
#---------------------------------------------------------------------------
# configuration options related to the RTF output
#---------------------------------------------------------------------------
GENERATE_RTF = NO
RTF_OUTPUT = rtf
COMPACT_RTF = NO
RTF_HYPERLINKS = NO
RTF_STYLESHEET_FILE =
RTF_EXTENSIONS_FILE =
#---------------------------------------------------------------------------
# configuration options related to the man page output
#---------------------------------------------------------------------------
GENERATE_MAN = NO
MAN_OUTPUT = man
MAN_EXTENSION = .3
MAN_LINKS = NO
#---------------------------------------------------------------------------
# configuration options related to the XML output
#---------------------------------------------------------------------------
GENERATE_XML = NO
XML_OUTPUT = xml
XML_SCHEMA =
XML_DTD =
XML_PROGRAMLISTING = YES
#---------------------------------------------------------------------------
# configuration options for the AutoGen Definitions output
#---------------------------------------------------------------------------
GENERATE_AUTOGEN_DEF = NO
#---------------------------------------------------------------------------
# configuration options related to the Perl module output
#---------------------------------------------------------------------------
GENERATE_PERLMOD = NO
PERLMOD_LATEX = NO
PERLMOD_PRETTY = YES
PERLMOD_MAKEVAR_PREFIX =
#---------------------------------------------------------------------------
# Configuration options related to the preprocessor
#---------------------------------------------------------------------------
ENABLE_PREPROCESSING = YES
MACRO_EXPANSION = NO
EXPAND_ONLY_PREDEF = NO
SEARCH_INCLUDES = YES
INCLUDE_PATH =
INCLUDE_FILE_PATTERNS =
PREDEFINED = SOFA_GUI_QT \
SOFA_GUI_FLTK \
SOFA_HAVE_PNG
EXPAND_AS_DEFINED =
SKIP_FUNCTION_MACROS = YES
#---------------------------------------------------------------------------
# Configuration::additions related to external references
#---------------------------------------------------------------------------
TAGFILES =
GENERATE_TAGFILE = Sofa.tag
ALLEXTERNALS = NO
EXTERNAL_GROUPS = YES
PERL_PATH = /usr/bin/perl
#---------------------------------------------------------------------------
# Configuration options related to the dot tool
#---------------------------------------------------------------------------
CLASS_DIAGRAMS = YES
HIDE_UNDOC_RELATIONS = NO
HAVE_DOT = YES
CLASS_GRAPH = YES
COLLABORATION_GRAPH = YES
GROUP_GRAPHS = YES
UML_LOOK = NO
TEMPLATE_RELATIONS = NO
INCLUDE_GRAPH = YES
INCLUDED_BY_GRAPH = YES
CALL_GRAPH = NO
CALLER_GRAPH = NO
GRAPHICAL_HIERARCHY = YES
DIRECTORY_GRAPH = YES
DOT_IMAGE_FORMAT = png
DOT_PATH =
DOTFILE_DIRS =
MAX_DOT_GRAPH_WIDTH = 1024
MAX_DOT_GRAPH_HEIGHT = 1024
MAX_DOT_GRAPH_DEPTH = 1000
DOT_TRANSPARENT = NO
DOT_MULTI_TARGETS = NO
GENERATE_LEGEND = YES
DOT_CLEANUP = YES
#---------------------------------------------------------------------------
# Configuration::additions related to the search engine
#---------------------------------------------------------------------------
SEARCHENGINE = NO
# Code style guide
## General rules
### Base rules
The base rules are in Google C++ Style Guide: https://google.github.io/styleguide/cppguide.html
All rules below **replace** the corresponding base rules.
For any subject not mentionned below, please refer to the base.
### Commit message
A correct commit message must therefore be structured as:
`[NAME_OF_MODULE_OR_PLUGIN] ACTION message`
where ACTION includes ADD, REMOVE, FIX, CLEAN, REVERT.
Example: `[SofaKernel] ADD test for the mass conservation in UniformMass`
### Naming
Identifiers must respect the following conventions:
- [N1] Class names are in UpperCamelCase
- [N2] Function names are in lowerCamelCase()
- [N3] Namespaces names are in lowercase
- [N4] Variables names are in lowerCamelCase and must express their use more than their type. **Exceptions**: mathematical objects like `Matrix M`, local iterators variables like `i`, `j`, `k` and usual symbols like `x` for positions or `v` for velocities.
- [N5] Data member variables names must begin with `d_`
- [N6] Link member variables names (e.g. SingleLink) must begin with `l_`
- [N7] Other member variables names must begin with `m_ `(exception: this is not mandatory for PODs as well as public attributes)
- [N8] Names for booleans variables must answer a question: `m_isRed`, `m_hasName`
- [N9] C++ files must must have the extension .h, .cpp, or .inl
- [N10] Files that define a class should have the same name as the class and should contain only one class.
- [N11] Each library name should be prefixed with `Sofa`.
### Formatting
- Special characters like TAB and page break must be avoided.
- Indentation must use **4 spaces** everywhere (C++ and Python), but there must be no indentation for namespaces
- Braces use the **Allman style**: the opening brace associated with a control statement is on the next line, indented to the same level as the control statement, and statements within the braces are indented to the next level.
```cpp
while (x == y)
{
something();
somethingElse();
}
finalThing();
```
- A space character should be used in the following situations:
- After C++ reserved words: `if (true)`
- Around binary operators: `a + b`
- After commas: `doSomething(a, b, c)`
- After semicolons in for statements: `for (unsigned int i = 0; i < container.size(); i++)`
```cpp
for (unsigned int i = 0; i < container.size(); ++i )
{
if ((a + b) > c)
{
doSomething(a, b, c);
}
}
```
- Template declarations are split on two lines
```cpp
template<class T>
static void dynamicCast(T*& ptr, Base* b);
```
### Commenting
Code must be commented in a Doxygen compliant way.
Most used commands are `///` or `/**` before blocks and `///<` after member declarations.
Please DO NOT use `//` or `///` after member declarations.
Example
```cpp
/**
* @brief MechanicalObject class
*/
template <class DataTypes>
class MechanicalObject : public sofa::core::behavior::MechanicalState<DataTypes>
{
Data< bool > d_showObject; ///< Show objects. (default=false)
Data< defaulttype::Vec4f > d_color; ///< drawing color
Data< bool > d_isToPrint; ///< ignore some Data for file export
/// @name New vectors access API based on VecId
/// @{
virtual Data< VecCoord >* write(core::VecCoordId v);
virtual const Data< VecCoord >* read(core::ConstVecCoordId v) const;
virtual Data< VecDeriv >* write(core::VecDerivId v);
virtual const Data< VecDeriv >* read(core::ConstVecDerivId v) const;
/// @}
/** \brief Reorder values according to parameter.
*
* Result of this method is :
* newValue[ i ] = oldValue[ index[i] ];
*/
void renumberValues( const sofa::helper::vector<unsigned int> &index );
/// Force the position of a point (and force its velocity to zero value)
void forcePointPosition( const unsigned int i, const sofa::helper::vector< double >& m_x);
/// src and dest must have the same size.
/// Performs: dest[i][j] += src[offset + i][j] 0<= i < src_entries 0<= j < 3 (for 3D objects) 0 <= j < 2 (for 2D objects)
/// @param offset the offset in the BaseVector where the scalar values will be used. It will be updated to the first scalar value after the ones used by this operation when this method returns
virtual void addFromBaseVectorSameSize(core::VecId dest, const defaulttype::BaseVector* src, unsigned int &offset);
}
```
More info about Doxygen here: https://www.stack.nl/~dimitri/doxygen/manual/index.html
### Good practices
- [G1] You should try to use as few `#include` directive as possible.
- [G2] You should limit as much as possible the amount of code in included files (*.h, *.inl).
- [G3] All definitions should reside in source files. The header files should declare an interface only.
- [G4] Variables should be initialized when they are declared.
- [G5] You should use `const` profusely.
- [G6] You should use `assert` profusely.
- [G7] You must avoid the `using` directive in header files (.h and .inl): ~~`using namespace foo;`~~
- [G8] You should declare automatic variables only when you need them (not before).
- [G9] You must always initialize pointers, either to the address of something, or to `nullptr`
## SOFA specific rules
- Tricky code should not be commented but rewritten! In general, the use of comments should be minimized by making the code self-documenting by appropriate name choices and an explicit logical structure.
- All the code under development must be tagged `SOFA_DEV`
- The use of magic numbers in the code should be avoided. Numbers other than 0 and 1 should be declared as named constants instead.
- All internal data, needed by your component, and that can’t be recomputed must be put inside a `Data` or a `DataPtr`. This way, your component can be saved. Also, this `Data` will be automatically displayed inside the GUI.
- Use `sout`, `serr`, `sendl` instead of `cout`, `cerr`, `endl` in SOFA Components.
- `serr` will automatically display inside the console a message with a warning, the name of the component, and its class.
If you modify the component in the graph, you will see a tabulation named `Warnings` with the log of all the `serr` done by the component.
- `sout` will display inside the console a message ONLY if the Data f_printLog is set to true.
If you modify the component in the graph, you will see a tabulation named `Outputs` with the log of all the `sout` done by the component
- Use `sofa::helper::vector` instead of `std::vector`
- Only use `sofa::simulation::tree::GNode` when you need to directly use access to the children or the parent of the node. If not, use the more generic `sofa::simulation::Node`
SOFA, Simulation Open-Framework Architecture, version 1.0 beta 4
(c) 2006-2009 MGH, INRIA, USTL, UJF, CNRS
Authors: See Authors.txt
SOFA is an Open Source framework primarily targeted at real-time simulation,
with an emphasis on medical simulation. It is mainly intended for the
research community to help foster newer algorithms, but can also be used as
an efficient prototyping tool. SOFA's advanced software architecture allows:
(1) the creation of complex and evolving simulations by combining new algorithms with
existing algorithms;
(2) the modification of key parameters of the simulation such as deformable
behavior, surface representation, solvers, constraints, collision algorithm, etc. by
simply editing an XML file;
(3) the synthesis of complex models from simpler ones using a scene-graph description;
(4) the efficient simulation of the dynamics of interacting objects using abstract
equation solvers; and
(5) the comparison of various algorithms available in SOFA.
LICENSES:
The SOFA distribution is composed of three parts:
- SOFA FRAMEWORK: this is essential the core of SOFA
- SOFA MODULES: represent the functionalities available in SOFA
- SOFA APPLICATIONS: they are built using the SOFA framework and modules.
SOFA is free software; you can redistribute it and/or modify it under the
terms of the following licenses.
The SOFA FRAMEWORK can be redistributed and/or modified 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.
The SOFA MODULES can be redistributed and/or modified 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 SOFA APPLICATIONS can be redistributed and/or modified under the terms of
the GNU 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 and GNU General Public License for more details.
Contact information: contact@sofa-framework.org
This diff is collapsed.
#! /bin/sh
find . -name .svn -prune -o '-(' -name Makefile -o -name 'Makefile.*' '-)' -exec rm '{}' ';'
qmake
#! /bin/sh
# generate a XCODE Project
qmake -recursive -spec macx-xcode Sofa.pro
# Generate a Makefile
#qmake -recursive -spec macx-g++ Makefile Sofa.pro
qmake -spec macx-g++
[![SOFA, Simulation Open-Framework Architecture](https://www.sofa-framework.org/wp-content/uploads/2013/01/SOFA_LOGO_ORANGE_2-normal.png)](https://www.sofa-framework.org/)
## Introduction
SOFA is an open source framework primarily targeted at real-time simulation,
with an emphasis on medical simulation.
It is mainly intended for the research community to help foster newer
algorithms, but can also be used as an efficient prototyping tool.
SOFA's advanced software architecture allows:
(1) the creation of complex and evolving simulations by combining new algorithms
with existing algorithms;
(2) the modification of key parameters of the simulation such as deformable
behavior, surface representation, solvers, constraints, collision algorithm,
etc. by simply editing an XML file;
(3) the synthesis of complex models from simpler ones using a scene-graph
description;
(4) the efficient simulation of the dynamics of interacting objects using
abstract equation solvers; and
(5) the comparison of various algorithms available in SOFA.
## Installation
For up-to-date instructions, please refer to the SOFA documentation:
https://www.sofa-framework.org/documentation
## Contribution
The SOFA community will be pleased to welcome you!
Find all the ways to get involved here: https://www.sofa-framework.org/community/get-involved/
Before creating any issue or pull request, please read carefully [our CONTRIBUTING rules](https://github.com/sofa-framework/sofa/blob/master/CONTRIBUTING.md).
## Information
### Authors
See [Authors.txt](https://github.com/sofa-framework/sofa/blob/master/Authors.txt)
### License
SOFA is LGPL, except:
- applications/projects (GPL)
- applications/sofa (GPL)
- applications/tutorials (GPL)
- applications/plugins/OptiTrackNatNet (GPL)
- applications/plugins/SofaPML (GPL)
- applications/plugins/Registration (QPL)
- sub-directories with a license file specifying a different license
LGPL refers to 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.
GPL refers to the GNU General Public License as published by the Free Software Foundation;
either version 2 of the License, or (at your option) any later version.
### Contact information
contact@sofa-framework.org
-----------------------------------------------------------------------------
SOFA, Simulation Open-Framework Architecture
(c) 2006-2017 INRIA, USTL, UJF, CNRS, MGH
<?xml version = '1.0'?>
<kdevelop>
<general>
<author>The SOFA team</author>
<email>/www.sofa-framework.org</email>
<version>0.1</version>
<projectmanagement>KDevTrollProject</projectmanagement>
<primarylanguage>C++</primarylanguage>
<keywords>
<keyword>Qt</keyword>
</keywords>
<projectdirectory>.</projectdirectory>
<absoluteprojectpath>false</absoluteprojectpath>
<description/>
<ignoreparts/>
<secondaryLanguages/>
<versioncontrol>kdevsubversion</versioncontrol>
<projectname>Sofa</projectname>
<defaultencoding/>
</general>
<kdevfileview>
<groups>
<group pattern="*.cpp;*.cxx;*.h;*.inl;*.cu" name="Sources" />
<group pattern="*.ui" name="User Interface" />
<group pattern="*.png" name="Icons" />
<group pattern="*" name="Others" />
<hidenonprojectfiles>false</hidenonprojectfiles>
<hidenonlocation>false</hidenonlocation>
</groups>
<tree>
<hidepatterns>*.o,*.lo,CVS,*~</hidepatterns>
<hidenonprojectfiles>false</hidenonprojectfiles>
<showvcsfields>false</showvcsfields>
</tree>
</kdevfileview>
<kdevdoctreeview>
<ignoretocs>
<toc>ada</toc>
<toc>ada_bugs_gcc</toc>
<toc>bash</toc>
<toc>bash_bugs</toc>
<toc>clanlib</toc>
<toc>w3c-dom-level2-html</toc>
<toc>fortran_bugs_gcc</toc>
<toc>gnome1</toc>
<toc>gnustep</toc>
<toc>gtk</toc>
<toc>gtk_bugs</toc>
<toc>haskell</toc>
<toc>haskell_bugs_ghc</toc>
<toc>java_bugs_gcc</toc>
<toc>java_bugs_sun</toc>
<toc>kde2book</toc>
<toc>opengl</toc>
<toc>pascal_bugs_fp</toc>
<toc>php</toc>
<toc>php_bugs</toc>
<toc>perl</toc>
<toc>perl_bugs</toc>
<toc>python</toc>
<toc>python_bugs</toc>
<toc>ruby</toc>
<toc>ruby_bugs</toc>
<toc>sdl</toc>
<toc>stl</toc>
<toc>w3c-svg</toc>
<toc>sw</toc>
<toc>w3c-uaag10</toc>
<toc>wxwidgets_bugs</toc>
</ignoretocs>
<ignoredoxygen>
<toc>KDE Libraries (Doxygen)</toc>
</ignoredoxygen>
<projectdoc>
<userdocDir>doxygen</userdocDir>
<apidocDir>doxygen</apidocDir>
</projectdoc>
<ignoreqt_xml/>
<ignorekdocs/>
<ignoredevhelp/>
</kdevdoctreeview>
<kdevdebugger>
<general>
<dbgshell/>
<programargs>examples/Demos/liver.scn</programargs>
<gdbpath/>
<configGdbScript/>
<runShellScript/>
<runGdbScript/>
<breakonloadinglibs>true</breakonloadinglibs>
<separatetty>false</separatetty>
<floatingtoolbar>false</floatingtoolbar>
<raiseGDBOnStart>false</raiseGDBOnStart>
</general>
<display>
<staticmembers>false</staticmembers>
<demanglenames>true</demanglenames>
<outputradix>10</outputradix>
</display>
</kdevdebugger>
<kdevtrollproject>
<run>
<mainprogram>./bin/runSofa-latest</mainprogram>
<programargs>-r</programargs>
<directoryradio>build</directoryradio>
<customdirectory>/</customdirectory>
<terminal>false</terminal>
<autocompile>true</autocompile>
<envvars>
<envvar value="./lib/linux:/usr/local/cuda/lib:$LD_LIBRARY_PATH" name="LD_LIBRARY_PATH" />
</envvars>
<globaldebugarguments/>
<globalcwd>/home/allardj/work/Sofa</globalcwd>
<useglobalprogram>true</useglobalprogram>
<autoinstall>false</autoinstall>
<autokdesu>false</autokdesu>
</run>
<general>
<activedir></activedir>
</general>
<make>
<abortonerror>true</abortonerror>
<numberofjobs>4</numberofjobs>
<dontact>false</dontact>
<makebin/>
<envvars/>
<prio>0</prio>
<runmultiplejobs>true</runmultiplejobs>
</make>
<subclassing/>
<qmake>
<savebehaviour>2</savebehaviour>
<replacePaths>false</replacePaths>
<disableDefaultOpts>true</disableDefaultOpts>
<enableFilenamesOnly>false</enableFilenamesOnly>
<showVariablesInTree>true</showVariablesInTree>
<showParseErrors>false</showParseErrors>
</qmake>
</kdevtrollproject>
<kdevfilecreate>
<filetypes/>
<useglobaltypes>
<type ext="ui" />
<type ext="cpp" />
<type ext="h" />
<type ext="ts" />
</useglobaltypes>
</kdevfilecreate>
<kdevcppsupport>
<references/>
<codecompletion>
<includeGlobalFunctions>true</includeGlobalFunctions>
<includeTypes>true</includeTypes>
<includeEnums>true</includeEnums>
<includeTypedefs>true</includeTypedefs>
<automaticCodeCompletion>true</automaticCodeCompletion>
<automaticArgumentsHint>true</automaticArgumentsHint>
<automaticHeaderCompletion>true</automaticHeaderCompletion>
<codeCompletionDelay>250</codeCompletionDelay>
<argumentsHintDelay>400</argumentsHintDelay>
<headerCompletionDelay>250</headerCompletionDelay>
<showOnlyAccessibleItems>false</showOnlyAccessibleItems>
<completionBoxItemOrder>0</completionBoxItemOrder>
<howEvaluationContextMenu>true</howEvaluationContextMenu>
<showCommentWithArgumentHint>true</showCommentWithArgumentHint>
<statusBarTypeEvaluation>false</statusBarTypeEvaluation>
<namespaceAliases>std=_GLIBCXX_STD;__gnu_cxx=std</namespaceAliases>
<processPrimaryTypes>true</processPrimaryTypes>
<processFunctionArguments>false</processFunctionArguments>
<preProcessAllHeaders>false</preProcessAllHeaders>
<parseMissingHeadersExperimental>false</parseMissingHeadersExperimental>
<resolveIncludePathsUsingMakeExperimental>false</resolveIncludePathsUsingMakeExperimental>
<alwaysParseInBackground>true</alwaysParseInBackground>
<usePermanentCaching>true</usePermanentCaching>
<alwaysIncludeNamespaces>false</alwaysIncludeNamespaces>
<includePaths>.;framework;modules;applications</includePaths>
</codecompletion>
<creategettersetter>
<prefixGet/>
<prefixSet>set</prefixSet>
<prefixVariable>m_,_</prefixVariable>
<parameterName>theValue</parameterName>
<inlineGet>true</inlineGet>
<inlineSet>true</inlineSet>
</creategettersetter>
<qt>
<used>false</used>
<version>3</version>
<root></root>
<includestyle>3</includestyle>
<designerintegration>EmbeddedKDevDesigner</designerintegration>
<qmake>/usr/bin/qmake</qmake>
<designer>/usr/bin/designer-qt3</designer>
<designerpluginpaths/>
</qt>
<designerintegration>
<qtdesigner/>
</designerintegration>
<splitheadersource>
<enabled>false</enabled>
<synchronize>true</synchronize>
<orientation>Vertical</orientation>
</splitheadersource>
</kdevcppsupport>
<cppsupportpart>
<filetemplates>
<interfacesuffix>.h</interfacesuffix>
<implementationsuffix>.cpp</implementationsuffix>
</filetemplates>
</cppsupportpart>
<kdevdocumentation>
<projectdoc>
<docsystem>Doxygen Documentation Collection</docsystem>
<docurl>doc/doxygen/html/index.html</docurl>
<usermanualurl/>
</projectdoc>
</kdevdocumentation>
<ctagspart>
<customArguments/>
<customTagfilePath/>
<activeTagsFiles/>
</ctagspart>
<kdevvisualadvance>
<emulator>VisualBoyAdvance</emulator>
<binary/>
<addOptions/>
<terminal>false</terminal>
<fullscreen>false</fullscreen>
<graphicFilter>-f0</graphicFilter>
<scaling>-1</scaling>
</kdevvisualadvance>
</kdevelop>