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] [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"<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();
- }
-
-
-}
-
-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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