From 4aca2680b8ace1c0504a0977343c89cbe1137fac Mon Sep 17 00:00:00 2001 From: Frederick Roy Date: Wed, 18 Dec 2024 21:28:35 +0900 Subject: [PATCH 1/8] [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 --- .../model/AugmentedLagrangianConstraint.cpp | 10 +-- .../constraint/lagrangian/model/init.cpp | 2 + .../IO/Mesh/tests/STLExporter_test.cpp | 2 +- .../Core/src/sofa/core/ObjectFactory.cpp | 7 +- .../Core/src/sofa/core/ObjectFactory.h | 4 +- .../Helper/test/system/PluginManager_test.cpp | 18 +++-- .../src/sofa/simulation/RequiredPlugin.cpp | 11 ++- .../Core/test/RequiredPlugin_test.cpp | 8 +-- .../simutest/parallel_scenes_test.cpp | 71 ++++++++----------- .../SceneChecking/tests/SceneChecker_test.cpp | 5 +- 10 files changed, 69 insertions(+), 69 deletions(-) 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 index 0f2ac2fad2f..e3970402ce7 100644 --- 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 @@ -31,11 +31,11 @@ namespace sofa::component::constraint::lagrangian::model using namespace sofa::defaulttype; using namespace sofa::helper; -int AugmentedLagrangianConstraintClass = core::RegisterObject("AugmentedLagrangianConstraint") - .add< AugmentedLagrangianConstraint >() - - ; - +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; 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/IO/Mesh/tests/STLExporter_test.cpp b/Sofa/Component/IO/Mesh/tests/STLExporter_test.cpp index 55b6be2b8b8..067f0bfef90 100644 --- a/Sofa/Component/IO/Mesh/tests/STLExporter_test.cpp +++ b/Sofa/Component/IO/Mesh/tests/STLExporter_test.cpp @@ -69,6 +69,7 @@ class STLExporter_test : public BaseSimulationTest { { sofa::simpleapi::importPlugin("Sofa.Component.StateContainer"); sofa::simpleapi::importPlugin("Sofa.Component.Visual"); + sofa::simpleapi::importPlugin("Sofa.Component.IO.Mesh"); } void TearDown() override @@ -98,7 +99,6 @@ class STLExporter_test : public BaseSimulationTest { " \n" " \n" " \n" - " \n" " \n" " \n" " \n" 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/Helper/test/system/PluginManager_test.cpp b/Sofa/framework/Helper/test/system/PluginManager_test.cpp index ec780e35207..7673e8b6445 100644 --- a/Sofa/framework/Helper/test/system/PluginManager_test.cpp +++ b/Sofa/framework/Helper/test/system/PluginManager_test.cpp @@ -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/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/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/simutest/parallel_scenes_test.cpp b/Sofa/framework/Simulation/simutest/parallel_scenes_test.cpp index 8ed14089499..9e0385facb7 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 SetUp() 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/applications/projects/SceneChecking/tests/SceneChecker_test.cpp b/applications/projects/SceneChecking/tests/SceneChecker_test.cpp index 9de8d0bbcf4..2ccaba88ecb 100644 --- a/applications/projects/SceneChecking/tests/SceneChecker_test.cpp +++ b/applications/projects/SceneChecking/tests/SceneChecker_test.cpp @@ -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"; From 3ecd69c9374c47ef411e55072e5dc604bafe5134 Mon Sep 17 00:00:00 2001 From: Alex Bilger Date: Wed, 18 Dec 2024 17:24:59 +0100 Subject: [PATCH 2/8] [SofaCUDA] Remove NO_CUDA condition (#5171) --- .../plugins/SofaCUDA/sofa/gpu/cuda/mycuda.cu | 138 ------------------ 1 file changed, 138 deletions(-) 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 From 3e508d34dabf30754009cbdb891f32136327ea07 Mon Sep 17 00:00:00 2001 From: Alex Bilger Date: Fri, 20 Dec 2024 04:53:09 +0100 Subject: [PATCH 3/8] [Type] Test and clean BoundingBox (#5138) [Type] Test for BoundingBox --- .../sofa/component/engine/select/MeshROI.inl | 4 +- .../Type/src/sofa/type/BoundingBox.cpp | 50 ++----- .../Type/src/sofa/type/BoundingBox.h | 79 +++++++---- Sofa/framework/Type/src/sofa/type/config.h.in | 9 ++ Sofa/framework/Type/test/BoundingBox_test.cpp | 123 ++++++++++++++++++ Sofa/framework/Type/test/CMakeLists.txt | 1 + 6 files changed, 200 insertions(+), 66 deletions(-) create mode 100644 Sofa/framework/Type/test/BoundingBox_test.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/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/config.h.in b/Sofa/framework/Type/src/sofa/type/config.h.in index 3fc2d71b07b..c4c1194ef7a 100644 --- a/Sofa/framework/Type/src/sofa/type/config.h.in +++ b/Sofa/framework/Type/src/sofa/type/config.h.in @@ -41,3 +41,12 @@ "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 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..d6ac8363490 100644 --- a/Sofa/framework/Type/test/CMakeLists.txt +++ b/Sofa/framework/Type/test/CMakeLists.txt @@ -3,6 +3,7 @@ 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 From 642cdc6e3971d1d15e77c547f658e1339c0cd173 Mon Sep 17 00:00:00 2001 From: Hugo Date: Fri, 20 Dec 2024 04:54:50 +0100 Subject: [PATCH 4/8] [Lagrangian] Remove unused data numericalTolerance in BLC (#5164) --- .../lagrangian/model/BilateralLagrangianConstraint.cpp | 6 ++---- .../lagrangian/model/BilateralLagrangianConstraint.h | 3 ++- .../lagrangian/model/BilateralLagrangianConstraint.inl | 2 -- .../component/constraint/lagrangian/model/config.h.in | 10 ++++++++++ 4 files changed, 14 insertions(+), 7 deletions(-) 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..97b6f4a396b 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 @@ -114,7 +114,8 @@ class BilateralLagrangianConstraint : public PairInteractionConstraint 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/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 From ca6655444308f62edc0573ba4a093a93271eae2b Mon Sep 17 00:00:00 2001 From: Alex Bilger Date: Fri, 20 Dec 2024 13:31:30 +0100 Subject: [PATCH 5/8] [Config] Upgrade to C++20 (#5111) --- Sofa/framework/Config/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sofa/framework/Config/CMakeLists.txt b/Sofa/framework/Config/CMakeLists.txt index 4683959c252..6d72f023115 100644 --- a/Sofa/framework/Config/CMakeLists.txt +++ b/Sofa/framework/Config/CMakeLists.txt @@ -105,8 +105,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 "") From e2b94280b27e59533f1080d736fa93d66137a541 Mon Sep 17 00:00:00 2001 From: Alex Bilger Date: Mon, 23 Dec 2024 05:52:16 +0100 Subject: [PATCH 6/8] [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 --- .../Engine/Select/tests/BoxROI_test.cpp | 11 +-- .../Direct/tests/SparseLDLSolver_test.cpp | 22 +++--- Sofa/framework/Testing/CMakeLists.txt | 2 + .../Testing/src/sofa/testing/BaseTest.cpp | 7 ++ .../Testing/src/sofa/testing/BaseTest.h | 6 ++ .../Testing/src/sofa/testing/ScopedPlugin.cpp | 60 ++++++++++++++++ .../Testing/src/sofa/testing/ScopedPlugin.h | 68 +++++++++++++++++++ Sofa/framework/Testing/test/CMakeLists.txt | 3 +- .../Testing/test/ScopedPlugin_test.cpp | 59 ++++++++++++++++ 9 files changed, 222 insertions(+), 16 deletions(-) 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 diff --git a/Sofa/Component/Engine/Select/tests/BoxROI_test.cpp b/Sofa/Component/Engine/Select/tests/BoxROI_test.cpp index 6b0d14609ae..c695c34e884 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 onSetUp() 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 onTearDown() override { if (m_root != nullptr){ sofa::simulation::node::unload(m_root); diff --git a/Sofa/Component/LinearSolver/Direct/tests/SparseLDLSolver_test.cpp b/Sofa/Component/LinearSolver/Direct/tests/SparseLDLSolver_test.cpp index 6dd556f57b6..c55dceb4748 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/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..474fa830b5c 100644 --- a/Sofa/framework/Testing/src/sofa/testing/BaseTest.cpp +++ b/Sofa/framework/Testing/src/sofa/testing/BaseTest.cpp @@ -93,6 +93,12 @@ BaseTest::BaseTest() : BaseTest::~BaseTest() {} +void BaseTest::loadPlugins( + const std::initializer_list& pluginNames) +{ + m_loadedPlugins.emplace_back(pluginNames.begin(), pluginNames.end()); +} + void BaseTest::SetUp() { onSetUp(); @@ -100,6 +106,7 @@ void BaseTest::SetUp() void BaseTest::TearDown() { + m_loadedPlugins.clear(); onTearDown(); } diff --git a/Sofa/framework/Testing/src/sofa/testing/BaseTest.h b/Sofa/framework/Testing/src/sofa/testing/BaseTest.h index 1ec7c55dd14..c42cdedfb0e 100644 --- a/Sofa/framework/Testing/src/sofa/testing/BaseTest.h +++ b/Sofa/framework/Testing/src/sofa/testing/BaseTest.h @@ -21,10 +21,12 @@ ******************************************************************************/ #pragma once +#include #include #include #include +#include namespace sofa::testing { @@ -51,9 +53,13 @@ class SOFA_TESTING_API BaseTest : public ::testing::Test /// Seed value static int seed; + void loadPlugins(const std::initializer_list& pluginNames); + private: void SetUp() override ; void TearDown() override ; + + 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/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); + } +} From 30844d0078e1d509b9555491bfe7a1e7aba0610a Mon Sep 17 00:00:00 2001 From: Paul Baksic <30337881+bakpaul@users.noreply.github.com> Date: Thu, 26 Dec 2024 18:36:11 +0100 Subject: [PATCH 7/8] [Plugins] Remove unsupported plugins: InvertibleFVM, SofaSimpleGUI and SensableEmulation (#5175) Remove unsupported plugins --- applications/plugins/CMakeLists.txt | 5 +- .../ExternalProjectConfig.cmake.in | 14 - .../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 - .../plugins/SensableEmulation/config.h | 34 - .../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 - .../initSensableEmulation.cpp | 79 - .../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 -- .../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/config.h.in | 34 - .../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 - .../plugins/SofaSimpleGUI/initSimpleGUI.cpp | 80 - 46 files changed, 1 insertion(+), 8761 deletions(-) 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/config.h 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/initSensableEmulation.cpp 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/config.h.in 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 delete mode 100644 applications/plugins/SofaSimpleGUI/initSimpleGUI.cpp 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/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/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/config.h b/applications/plugins/SensableEmulation/config.h deleted file mode 100644 index fbe888819f0..00000000000 --- a/applications/plugins/SensableEmulation/config.h +++ /dev/null @@ -1,34 +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 SENSABLEEMULATION_CONFIG_H -#define SENSABLEEMULATION_CONFIG_H - -#include - -#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 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/initSensableEmulation.cpp b/applications/plugins/SensableEmulation/initSensableEmulation.cpp deleted file mode 100644 index 1c218b3ab77..00000000000 --- a/applications/plugins/SensableEmulation/initSensableEmulation.cpp +++ /dev/null @@ -1,79 +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 - -namespace sofa -{ - -namespace component -{ - -//Here are just several convenient functions to help user to know what contains the plugin - -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) - { - first = false; - } -} - -const char* getModuleName() -{ - return "SensableEmulation"; -} - -const char* getModuleVersion() -{ - return "beta 1.0"; -} - -const char* getModuleLicense() -{ - return "LGPL"; -} - -const char* getModuleDescription() -{ - return "Force feedback with sensable devices into SOFA Framework"; -} - -const char* getModuleComponentList() -{ - return "OmniDriverEmu"; -} - -} // namespace component - -} // namespace sofa - - 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 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 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/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 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 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/config.h.in b/applications/plugins/SofaSimpleGUI/config.h.in deleted file mode 100644 index 5b9af608bb5..00000000000 --- a/applications/plugins/SofaSimpleGUI/config.h.in +++ /dev/null @@ -1,34 +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 SOFASIMPLEGUI_CONFIG_H -#define SOFASIMPLEGUI_CONFIG_H - -#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 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 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 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/SofaSimpleGUI/initSimpleGUI.cpp b/applications/plugins/SofaSimpleGUI/initSimpleGUI.cpp deleted file mode 100644 index 7cdc42b84c1..00000000000 --- a/applications/plugins/SofaSimpleGUI/initSimpleGUI.cpp +++ /dev/null @@ -1,80 +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 - - -namespace sofa::component -{ - - //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"; - } - - const char* getModuleComponentList() - { - /// string containing the names of the classes provided by the plugin - return ""; - //return "MyMappingPendulumInPlane, MyBehaviorModel, MyProjectiveConstraintSet"; - } - - - -} - - From 238851c9e97237c8a9d30a62277ca8b63be56600 Mon Sep 17 00:00:00 2001 From: Alex Bilger Date: Thu, 26 Dec 2024 22:01:07 +0100 Subject: [PATCH 8/8] [SofaCUDA] Explicit the CUDA C++ standard version to 17 (#5165) --- applications/plugins/SofaCUDA/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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)