+++ /dev/null
-\r
-Microsoft Visual Studio Solution File, Format Version 11.00\r
-# Visual Studio 2010\r
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DwellCursor", "DwellCursor\DwellCursor.vcxproj", "{2928B2FC-98F8-427E-B0D2-2CEA2DA1FFC9}"\r
-EndProject\r
-Global\r
- GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
- Debug|Win32 = Debug|Win32\r
- Release|Win32 = Release|Win32\r
- EndGlobalSection\r
- GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
- {2928B2FC-98F8-427E-B0D2-2CEA2DA1FFC9}.Debug|Win32.ActiveCfg = Debug|Win32\r
- {2928B2FC-98F8-427E-B0D2-2CEA2DA1FFC9}.Debug|Win32.Build.0 = Debug|Win32\r
- {2928B2FC-98F8-427E-B0D2-2CEA2DA1FFC9}.Release|Win32.ActiveCfg = Release|Win32\r
- {2928B2FC-98F8-427E-B0D2-2CEA2DA1FFC9}.Release|Win32.Build.0 = Release|Win32\r
- EndGlobalSection\r
- GlobalSection(SolutionProperties) = preSolution\r
- HideSolutionNode = FALSE\r
- EndGlobalSection\r
-EndGlobal\r
#include "PushButton.h"\r
\r
#include <QBrush>\r
+#include <QDebug>\r
\r
QColor PushButton::_bgcolor = Qt::gray;\r
QColor PushButton::_hovercolor = Qt::lightGray;\r
QColor PushButton::_targetcolor = Qt::green;\r
QColor PushButton::_targethovercolor = Qt::yellow;\r
\r
-const float PushButton::_pushdistance = 0.1;\r
+const float PushButton::_pushdistance = 0.05;\r
\r
\r
PushButton::PushButton(QGraphicsItem *parent)\r
EndProject\r
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DwellCursor", "DwellCursor\DwellCursor.vcxproj", "{2928B2FC-98F8-427E-B0D2-2CEA2DA1FFC9}"\r
EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TactileFluids", "TactileFluids\TactileFluids.vcxproj", "{014A41B9-3E4D-48F0-B5D7-8C6FE42A142E}"\r
+EndProject\r
Global\r
GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
Debug|Win32 = Debug|Win32\r
{2928B2FC-98F8-427E-B0D2-2CEA2DA1FFC9}.Debug|Win32.Build.0 = Debug|Win32\r
{2928B2FC-98F8-427E-B0D2-2CEA2DA1FFC9}.Release|Win32.ActiveCfg = Release|Win32\r
{2928B2FC-98F8-427E-B0D2-2CEA2DA1FFC9}.Release|Win32.Build.0 = Release|Win32\r
+ {014A41B9-3E4D-48F0-B5D7-8C6FE42A142E}.Debug|Win32.ActiveCfg = Debug|Win32\r
+ {014A41B9-3E4D-48F0-B5D7-8C6FE42A142E}.Debug|Win32.Build.0 = Debug|Win32\r
+ {014A41B9-3E4D-48F0-B5D7-8C6FE42A142E}.Release|Win32.ActiveCfg = Release|Win32\r
+ {014A41B9-3E4D-48F0-B5D7-8C6FE42A142E}.Release|Win32.Build.0 = Release|Win32\r
EndGlobalSection\r
GlobalSection(SolutionProperties) = preSolution\r
HideSolutionNode = FALSE\r
--- /dev/null
+#include "KinectInput.h"\r
+\r
+#include <QDebug>\r
+\r
+#define TIMEOUT 100\r
+\r
+KinectInput::KinectInput()\r
+:_running(false), _skeletonid(-1), _skeletonEvent(NULL)\r
+{\r
+ //creates the kinect sensor (id 0)\r
+ if(FAILED(NuiCreateSensorByIndex(0, &_kinect)))\r
+ {\r
+ qDebug() << "Cannot find a KINECT sensor" << endl;\r
+ //I should do something else, sucha as an exception\r
+ return;\r
+ }\r
+\r
+ if (_kinect->NuiInitialize(NUI_INITIALIZE_FLAG_USES_DEPTH_AND_PLAYER_INDEX | NUI_INITIALIZE_FLAG_USES_SKELETON) == E_NUI_SKELETAL_ENGINE_BUSY)\r
+ {\r
+ qDebug() << "Cannot initialize the KINECT sensor" << endl;\r
+ return;\r
+ }\r
+\r
+ //initialize the skeleton tracking\r
+ _skeletonEvent = CreateEvent(NULL, TRUE, FALSE, NULL);\r
+ if(!HasSkeletalEngine(_kinect) || FAILED(_kinect->NuiSkeletonTrackingEnable(_skeletonEvent, 0)))\r
+ {\r
+ qDebug() << "Cannot Initialize skeleton tracking" << endl;\r
+ return;\r
+ }\r
+}\r
+\r
+KinectInput::~KinectInput()\r
+{\r
+ NuiShutdown();\r
+ if( _skeletonEvent && ( _skeletonEvent != INVALID_HANDLE_VALUE ) )\r
+ CloseHandle( _skeletonEvent );\r
+}\r
+\r
+//thread that manages the kinect events\r
+void KinectInput::run()\r
+{\r
+ _running = true;\r
+ while(_running)\r
+ {\r
+ //wait for an event\r
+ if (WaitForSingleObject(_skeletonEvent, TIMEOUT) != 0)\r
+ continue;\r
+\r
+ //get skeleton values\r
+ NUI_SKELETON_FRAME SkeletonFrame;\r
+ HRESULT hr = _kinect->NuiSkeletonGetNextFrame( 0, &SkeletonFrame );\r
+// qDebug() << "Kinect frame " << SkeletonFrame.dwFrameNumber;\r
+\r
+ //if no skeleton already identified or not tracked anymore, search for one\r
+ if (_skeletonid < 0 || SkeletonFrame.SkeletonData[_skeletonid].eTrackingState != NUI_SKELETON_TRACKED)\r
+ {\r
+ for( int i = 0 ; i < NUI_SKELETON_COUNT ; i++ )\r
+ {\r
+ if(SkeletonFrame.SkeletonData[i].eTrackingState == NUI_SKELETON_TRACKED)\r
+ {\r
+ _skeletonid = i;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ //no skeleton found\r
+ if (_skeletonid < 0)\r
+ continue;\r
+\r
+ //retrieve information on the skeleton\r
+ NUI_SKELETON_DATA &data = SkeletonFrame.SkeletonData[_skeletonid];\r
+\r
+ //checking if we have a skeleton\r
+/* if (data.eTrackingState != NUI_SKELETON_TRACKED)\r
+ continue;*/\r
+\r
+ //smooth out the skeleton data\r
+ _kinect->NuiTransformSmooth(&SkeletonFrame, NULL);\r
+\r
+\r
+ if (data.eSkeletonPositionTrackingState[NUI_SKELETON_POSITION_HAND_RIGHT] == NUI_SKELETON_NOT_TRACKED)\r
+ continue; //right hand not detected\r
+ else\r
+ {\r
+/* float posx, posy;\r
+ NuiTransformSkeletonToDepthImageF(data.SkeletonPositions[NUI_SKELETON_POSITION_HAND_RIGHT], &posx, &posy);\r
+ emit rightHandMove(posx, posy,0);*/\r
+ Vector4 &skelpos = data.SkeletonPositions[NUI_SKELETON_POSITION_HAND_RIGHT];\r
+ emit rightHandMove(skelpos.x, skelpos.y, skelpos.z);\r
+ }\r
+ }\r
+}\r
+\r
+void KinectInput::stop()\r
+{\r
+ _running = false;\r
+}\r
--- /dev/null
+#ifndef __KINECTINPUT__\r
+#define __KINECTINPUT__\r
+\r
+#include <QObject>\r
+#include <QThread>\r
+#include <Windows.h>\r
+#include <NuiAPI.h>\r
+\r
+class KinectInput: public QThread\r
+{\r
+ Q_OBJECT\r
+ public:\r
+ KinectInput();\r
+ ~KinectInput();\r
+\r
+ void run();\r
+ void stop();\r
+\r
+ private:\r
+ INuiSensor* _kinect;\r
+ HANDLE _skeletonEvent;\r
+ bool _running;\r
+ int _skeletonid;\r
+\r
+ signals:\r
+ void rightHandMove(float x, float y, float z);\r
+};\r
+\r
+#endif\r
--- /dev/null
+#include "OneEuroFilter.h"\r
+\r
+#define _USE_MATH_DEFINES \r
+#include <cmath>\r
+#include <stdexcept>\r
+\r
+LowPassFilter::LowPassFilter(double alpha, double initval) \r
+:_y(initval), _s(initval), _initialized(false)\r
+{\r
+ setAlpha(alpha);\r
+}\r
+\r
+double LowPassFilter::filter(double value) \r
+{\r
+ double result;\r
+ if (_initialized)\r
+ result = _a * value + (1.0 - _a) * _s;\r
+ else \r
+ {\r
+ result = value;\r
+ _initialized = true;\r
+ }\r
+ _y = value;\r
+ _s = result;\r
+ return result;\r
+}\r
+\r
+double LowPassFilter::filterWithAlpha(double value, double alpha) \r
+{\r
+ setAlpha(alpha);\r
+ return filter(value);\r
+}\r
+\r
+bool LowPassFilter::hasLastRawValue(void) \r
+{\r
+ return _initialized;\r
+}\r
+\r
+double LowPassFilter::lastRawValue(void) \r
+{\r
+ return _y ;\r
+}\r
+\r
+void LowPassFilter::setAlpha(double alpha) \r
+{\r
+ if (alpha <= 0.0 || alpha > 1.0) \r
+ throw std::range_error("alpha should be in ]0.0., 1.0]");\r
+ _a = alpha;\r
+}\r
+\r
+\r
+OneEuroFilter::OneEuroFilter(double freq, double mincutoff, double beta, double dcutoff)\r
+:_x(new LowPassFilter(alpha(mincutoff))), _dx(new LowPassFilter(alpha(dcutoff))), _lasttime(UndefinedTime)\r
+{\r
+ setFrequency(freq);\r
+ setMinCutoff(mincutoff);\r
+ setBeta(beta);\r
+ setDerivateCutoff(dcutoff);\r
+}\r
+\r
+OneEuroFilter::~OneEuroFilter(void) \r
+{\r
+ delete _x;\r
+ delete _dx;\r
+}\r
+\r
+double OneEuroFilter::filter(double value, TimeStamp timestamp) \r
+{\r
+ // update the sampling frequency based on timestamps\r
+ if (_lasttime != UndefinedTime && timestamp != UndefinedTime)\r
+ _freq = 1.0 / (timestamp - _lasttime);\r
+ _lasttime = timestamp;\r
+ // estimate the current variation per second \r
+ double dvalue = _x->hasLastRawValue() ? (value - _x->lastRawValue()) * _freq : 0.0; // FIXME: 0.0 or value?\r
+ double edvalue = _dx->filterWithAlpha(dvalue, alpha(_dcutoff));\r
+ // use it to update the cutoff frequency\r
+ double cutoff = _mincutoff + _beta * fabs(edvalue);\r
+ // filter the given value\r
+ return _x->filterWithAlpha(value, alpha(cutoff));\r
+}\r
+\r
+double OneEuroFilter::alpha(double cutoff) \r
+{\r
+ double te = 1.0 / _freq;\r
+ double tau = 1.0 / (2 * M_PI * cutoff);\r
+ return 1.0 / (1.0 + tau/te);\r
+}\r
+\r
+void OneEuroFilter::setFrequency(double f) \r
+{\r
+ if (f <= 0) \r
+ throw std::range_error("freq should be >0");\r
+ _freq = f;\r
+}\r
+\r
+void OneEuroFilter::setMinCutoff(double mc) \r
+{\r
+ if (mc <= 0) \r
+ throw std::range_error("mincutoff should be >0");\r
+ _mincutoff = mc;\r
+}\r
+\r
+void OneEuroFilter::setBeta(double b) \r
+{\r
+ _beta = b;\r
+}\r
+\r
+void OneEuroFilter::setDerivateCutoff(double dc) \r
+{\r
+ if (dc <= 0) \r
+ throw std::range_error("dcutoff should be >0");\r
+ _dcutoff = dc;\r
+}\r
--- /dev/null
+/*\r
+ * OneEuroFilter.h/.cpp -\r
+ *\r
+ * Author: Thomas Pietrzak (thomas.pietrzak@lifl.fr)\r
+ * based on code from\r
+ * Nicolas Roussel (nicolas.roussel@inria.fr)\r
+ *\r
+ */\r
+\r
+\r
+#ifndef __ONEEURO__\r
+#define __ONEEURO__\r
+\r
+\r
+typedef double TimeStamp ; // in seconds\r
+\r
+static const TimeStamp UndefinedTime = -1.0 ;\r
+\r
+\r
+class LowPassFilter \r
+{\r
+ public:\r
+ LowPassFilter(double alpha, double initval=0.0);\r
+\r
+ double filterWithAlpha(double value, double alpha);\r
+ inline bool hasLastRawValue(void);\r
+ inline double lastRawValue(void);\r
+\r
+ private:\r
+ double _y, _a, _s;\r
+ bool _initialized;\r
+\r
+ void setAlpha(double alpha);\r
+ double filter(double value);\r
+} ;\r
+\r
+class OneEuroFilter \r
+{\r
+ public:\r
+ OneEuroFilter(\r
+ double freq, \r
+ double mincutoff=1.0, \r
+ double beta_=0.0, \r
+ double dcutoff=1.0);\r
+ \r
+ ~OneEuroFilter();\r
+\r
+ double filter(double value, TimeStamp timestamp=UndefinedTime);\r
+\r
+ private:\r
+ double _freq, _mincutoff, _beta;, _dcutoff;\r
+ LowPassFilter *_x, *_dx;\r
+ TimeStamp _lasttime;\r
+\r
+ double alpha(double cutoff);\r
+ inline void setFrequency(double f);\r
+ inline void setMinCutoff(double mc);\r
+ inline void setBeta(double b);\r
+ inline void setDerivateCutoff(double dc);\r
+} ;\r
+\r
+#endif\r
--- /dev/null
+#include "TactileFluids.h"\r
+\r
+#include <QDebug>\r
+#include <QDateTime>\r
+\r
+TactileFluids::TactileFluids(QWidget *parent, Qt::WFlags flags)\r
+: QMainWindow(parent, flags), _filter(100.0, 1.0)\r
+{\r
+ try\r
+ {\r
+ _tactonplayer = new TactonPlayer("COM8");\r
+ }\r
+ catch (...)\r
+ {\r
+ _tactonplayer = NULL;\r
+ qDebug() << "No wristband found";\r
+ }\r
+\r
+ setupUi(this);\r
+\r
+ _pos.x = _pos.y = _pos.z = 0.0;\r
+\r
+ _tactonplayer->setFrequency(_frequency->value());\r
+\r
+ connect(_frequency, SIGNAL(valueChanged(int)), this, SLOT(updateFrequency(int)));\r
+\r
+ connect(&_kinectsensor, SIGNAL(rightHandMove(float,float,float)), \r
+ this, SLOT(updateHand(float,float,float)));\r
+\r
+ _kinectsensor.start();\r
+ _timer.start();\r
+\r
+ _tactonplayer->setFrequency(_frequency->value());\r
+}\r
+\r
+TactileFluids::~TactileFluids()\r
+{\r
+ _kinectsensor.stop();\r
+\r
+ if (_tactonplayer)\r
+ {\r
+ unsigned char amp[] = {0, 0, 0, 0};\r
+ _tactonplayer->setAmplitudes(4, amp);\r
+ delete _tactonplayer;\r
+ }\r
+}\r
+\r
+void TactileFluids::updateFrequency(int f)\r
+{\r
+ _tactonplayer->setFrequency(f);\r
+}\r
+\r
+void TactileFluids::updateHand(float x, float y, float z)\r
+{\r
+ float dx = x - _pos.x;\r
+ float dy = y - _pos.y;\r
+ float dz = z - _pos.z;\r
+ float speed = 100000 * sqrt(dx*dx + dy*dy + dz*dz) / _timer.elapsed();\r
+\r
+ //filter the speed value\r
+ try\r
+ {\r
+ speed = _filter.filter(speed, QDateTime::currentMSecsSinceEpoch());\r
+ }\r
+ catch(...)\r
+ {\r
+ qDebug() << "Filter went wrong speed=" << speed << " timestamp=" << QDateTime::currentMSecsSinceEpoch();\r
+ }\r
+\r
+ //cap values between 0 and 255\r
+ if (speed <= _minspeed->value())\r
+ {\r
+ unsigned char amp[] = {0, 0, 0, 0};\r
+ _tactonplayer->setAmplitudes(4, amp);\r
+ }\r
+ else if (speed >= _maxspeed->value())\r
+ {\r
+ unsigned char amp[] = {255, 255, 255, 255};\r
+ _tactonplayer->setAmplitudes(4, amp);\r
+ }\r
+ else\r
+ {\r
+ unsigned char amp[4];\r
+ memset(amp, unsigned char(255 * (speed - _minspeed->value()) / (_maxspeed->value() - _minspeed->value())), 4);\r
+ _tactonplayer->setAmplitudes(4, amp);\r
+ }\r
+\r
+ //qDebug() << "deltat = " << _timer.elapsed() << " dist = " << sqrt(dx*dx + dy*dy + dz*dz) << "\n";\r
+ _timer.restart();\r
+\r
+ _pos.x = x;\r
+ _pos.y = y;\r
+ _pos.z = z;\r
+\r
+ _x->setText("x=" + QString::number(_pos.x, 'f', 3));\r
+ _y->setText("y=" + QString::number(_pos.y, 'f', 3));\r
+ _z->setText("z=" + QString::number(_pos.z, 'f', 3));\r
+ _v->setText("v=" + QString::number(speed, 'f', 3));\r
+\r
+}\r
--- /dev/null
+#ifndef TACTILEFLUIDS_H\r
+#define TACTILEFLUIDS_H\r
+\r
+#include <QtGui/QMainWindow>\r
+#include "ui_tactilefluids.h"\r
+\r
+#include <QTime>\r
+#include <TactonPlayer\TactonPlayer.hpp>\r
+\r
+#include "KinectInput.h"\r
+#include "OneEuroFilter.h"\r
+\r
+class TactileFluids : public QMainWindow, public Ui::TactileFluidsClass\r
+{\r
+ Q_OBJECT\r
+\r
+ public:\r
+ TactileFluids(QWidget *parent = 0, Qt::WFlags flags = 0);\r
+ ~TactileFluids();\r
+\r
+ private:\r
+ KinectInput _kinectsensor;\r
+ TactonPlayer *_tactonplayer;\r
+ struct { float x, y, z; } _pos;\r
+ QTime _timer;\r
+ OneEuroFilter _filter;\r
+ \r
+ public slots:\r
+ void updateHand(float, float, float);\r
+ void updateFrequency(int);\r
+};\r
+\r
+#endif // TACTILEFLUIDS_H\r
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+ <ItemGroup Label="ProjectConfigurations">\r
+ <ProjectConfiguration Include="Debug|Win32">\r
+ <Configuration>Debug</Configuration>\r
+ <Platform>Win32</Platform>\r
+ </ProjectConfiguration>\r
+ <ProjectConfiguration Include="Release|Win32">\r
+ <Configuration>Release</Configuration>\r
+ <Platform>Win32</Platform>\r
+ </ProjectConfiguration>\r
+ </ItemGroup>\r
+ <PropertyGroup Label="Globals">\r
+ <ProjectGuid>{014A41B9-3E4D-48F0-B5D7-8C6FE42A142E}</ProjectGuid>\r
+ <Keyword>Qt4VSv1.0</Keyword>\r
+ </PropertyGroup>\r
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+ <ConfigurationType>Application</ConfigurationType>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+ <ConfigurationType>Application</ConfigurationType>\r
+ </PropertyGroup>\r
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+ <ImportGroup Label="ExtensionSettings">\r
+ </ImportGroup>\r
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+ </ImportGroup>\r
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+ </ImportGroup>\r
+ <PropertyGroup Label="UserMacros" />\r
+ <PropertyGroup>\r
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\r
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>\r
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>\r
+ </PropertyGroup>\r
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+ <ClCompile>\r
+ <PreprocessorDefinitions>UNICODE;WIN32;QT_LARGEFILE_SUPPORT;QT_DLL;QT_CORE_LIB;QT_GUI_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <AdditionalIncludeDirectories>$(KINECTSDK10_DIR)\inc;.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+ <Optimization>Disabled</Optimization>\r
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+ <TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>\r
+ </ClCompile>\r
+ <Link>\r
+ <SubSystem>Windows</SubSystem>\r
+ <OutputFile>$(OutDir)\$(ProjectName).exe</OutputFile>\r
+ <AdditionalLibraryDirectories>$(KINECTSDK10_DIR)\lib\x86;;$(QTDIR)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+ <GenerateDebugInformation>true</GenerateDebugInformation>\r
+ <AdditionalDependencies>TactonPlayerd.lib;Kinect10.lib;qtmaind.lib;QtCored4.lib;QtGuid4.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+ </Link>\r
+ </ItemDefinitionGroup>\r
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+ <ClCompile>\r
+ <PreprocessorDefinitions>UNICODE;WIN32;QT_LARGEFILE_SUPPORT;QT_DLL;QT_NO_DEBUG;NDEBUG;QT_CORE_LIB;QT_GUI_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <AdditionalIncludeDirectories>$(KINECTSDK10_DIR)\inc;.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+ <DebugInformationFormat>\r
+ </DebugInformationFormat>\r
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+ <TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>\r
+ </ClCompile>\r
+ <Link>\r
+ <SubSystem>Windows</SubSystem>\r
+ <OutputFile>$(OutDir)\$(ProjectName).exe</OutputFile>\r
+ <AdditionalLibraryDirectories>$(KINECTSDK10_DIR)\lib\x86;;$(QTDIR)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+ <GenerateDebugInformation>false</GenerateDebugInformation>\r
+ <AdditionalDependencies>TactonPlayer.lib;Kinect10.lib;qtmain.lib;QtCore4.lib;QtGui4.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+ </Link>\r
+ </ItemDefinitionGroup>\r
+ <ItemGroup>\r
+ <ClCompile Include="GeneratedFiles\Debug\moc_KinectInput.cpp">\r
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>\r
+ </ClCompile>\r
+ <ClCompile Include="GeneratedFiles\Debug\moc_TactileFluids.cpp">\r
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>\r
+ </ClCompile>\r
+ <ClCompile Include="GeneratedFiles\qrc_tactilefluids.cpp">\r
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+ </PrecompiledHeader>\r
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+ </PrecompiledHeader>\r
+ </ClCompile>\r
+ <ClCompile Include="GeneratedFiles\Release\moc_KinectInput.cpp">\r
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>\r
+ </ClCompile>\r
+ <ClCompile Include="GeneratedFiles\Release\moc_TactileFluids.cpp">\r
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>\r
+ </ClCompile>\r
+ <ClCompile Include="KinectInput.cpp" />\r
+ <ClCompile Include="main.cpp" />\r
+ <ClCompile Include="OneEuroFilter.cpp" />\r
+ <ClCompile Include="TactileFluids.cpp" />\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <CustomBuild Include="TactileFluids.h">\r
+ <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>\r
+ <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing TactileFluids.h...</Message>\r
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>\r
+ <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB "-I$(KINECTSDK10_DIR)\inc" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui"</Command>\r
+ <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>\r
+ <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing TactileFluids.h...</Message>\r
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>\r
+ <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB "-I$(KINECTSDK10_DIR)\inc" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui"</Command>\r
+ </CustomBuild>\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <CustomBuild Include="tactilefluids.ui">\r
+ <FileType>Document</FileType>\r
+ <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\uic.exe;%(AdditionalInputs)</AdditionalInputs>\r
+ <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Uic%27ing %(Identity)...</Message>\r
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\ui_%(Filename).h;%(Outputs)</Outputs>\r
+ <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)"</Command>\r
+ <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\uic.exe;%(AdditionalInputs)</AdditionalInputs>\r
+ <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Uic%27ing %(Identity)...</Message>\r
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\ui_%(Filename).h;%(Outputs)</Outputs>\r
+ <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)"</Command>\r
+ </CustomBuild>\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <ClInclude Include="GeneratedFiles\ui_tactilefluids.h" />\r
+ <ClInclude Include="OneEuroFilter.h" />\r
+ <CustomBuild Include="KinectInput.h">\r
+ <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>\r
+ <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing KinectInput.h...</Message>\r
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>\r
+ <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB "-I$(KINECTSDK10_DIR)\inc" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui"</Command>\r
+ <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>\r
+ <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing KinectInput.h...</Message>\r
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>\r
+ <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB "-I$(KINECTSDK10_DIR)\inc" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui"</Command>\r
+ </CustomBuild>\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <CustomBuild Include="tactilefluids.qrc">\r
+ <FileType>Document</FileType>\r
+ <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(FullPath);%(AdditionalInputs)</AdditionalInputs>\r
+ <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Rcc%27ing %(Identity)...</Message>\r
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\qrc_%(Filename).cpp;%(Outputs)</Outputs>\r
+ <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\rcc.exe" -name "%(Filename)" -no-compress "%(FullPath)" -o .\GeneratedFiles\qrc_%(Filename).cpp</Command>\r
+ <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(FullPath);%(AdditionalInputs)</AdditionalInputs>\r
+ <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Rcc%27ing %(Identity)...</Message>\r
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\qrc_%(Filename).cpp;%(Outputs)</Outputs>\r
+ <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\rcc.exe" -name "%(Filename)" -no-compress "%(FullPath)" -o .\GeneratedFiles\qrc_%(Filename).cpp</Command>\r
+ </CustomBuild>\r
+ </ItemGroup>\r
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+ <ImportGroup Label="ExtensionTargets">\r
+ </ImportGroup>\r
+ <ProjectExtensions>\r
+ <VisualStudio>\r
+ <UserProperties UicDir=".\GeneratedFiles" MocDir=".\GeneratedFiles\$(ConfigurationName)" MocOptions="" RccDir=".\GeneratedFiles" lupdateOnBuild="0" lupdateOptions="" lreleaseOptions="" QtVersion_x0020_Win32="4.8.2" />\r
+ </VisualStudio>\r
+ </ProjectExtensions>\r
+</Project>
\ No newline at end of file
--- /dev/null
+#include "TactileFluids.h"\r
+#include <QtGui/QApplication>\r
+\r
+int main(int argc, char *argv[])\r
+{\r
+ QApplication a(argc, argv);\r
+ TactileFluids w;\r
+ w.show();\r
+ return a.exec();\r
+}\r
--- /dev/null
+<RCC>\r
+ <qresource prefix="TactileFluids">\r
+ </qresource>\r
+</RCC>\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<ui version="4.0">\r
+ <class>TactileFluidsClass</class>\r
+ <widget class="QMainWindow" name="TactileFluidsClass">\r
+ <property name="geometry">\r
+ <rect>\r
+ <x>0</x>\r
+ <y>0</y>\r
+ <width>322</width>\r
+ <height>164</height>\r
+ </rect>\r
+ </property>\r
+ <property name="windowTitle">\r
+ <string>TactileFluids</string>\r
+ </property>\r
+ <widget class="QWidget" name="centralWidget">\r
+ <layout class="QVBoxLayout" name="verticalLayout">\r
+ <item>\r
+ <layout class="QHBoxLayout" name="horizontalLayout">\r
+ <item>\r
+ <widget class="QLabel" name="label">\r
+ <property name="text">\r
+ <string>Min speed</string>\r
+ </property>\r
+ </widget>\r
+ </item>\r
+ <item>\r
+ <widget class="QSpinBox" name="_minspeed">\r
+ <property name="maximum">\r
+ <number>10000</number>\r
+ </property>\r
+ <property name="singleStep">\r
+ <number>10</number>\r
+ </property>\r
+ <property name="value">\r
+ <number>5</number>\r
+ </property>\r
+ </widget>\r
+ </item>\r
+ <item>\r
+ <widget class="QLabel" name="label_4">\r
+ <property name="text">\r
+ <string>cm/s</string>\r
+ </property>\r
+ </widget>\r
+ </item>\r
+ </layout>\r
+ </item>\r
+ <item>\r
+ <layout class="QHBoxLayout" name="horizontalLayout_2">\r
+ <item>\r
+ <widget class="QLabel" name="label_2">\r
+ <property name="text">\r
+ <string>Max speed</string>\r
+ </property>\r
+ </widget>\r
+ </item>\r
+ <item>\r
+ <widget class="QSpinBox" name="_maxspeed">\r
+ <property name="minimum">\r
+ <number>1</number>\r
+ </property>\r
+ <property name="maximum">\r
+ <number>10000</number>\r
+ </property>\r
+ <property name="singleStep">\r
+ <number>10</number>\r
+ </property>\r
+ <property name="value">\r
+ <number>100</number>\r
+ </property>\r
+ </widget>\r
+ </item>\r
+ <item>\r
+ <widget class="QLabel" name="label_5">\r
+ <property name="text">\r
+ <string>cm/s</string>\r
+ </property>\r
+ </widget>\r
+ </item>\r
+ </layout>\r
+ </item>\r
+ <item>\r
+ <layout class="QHBoxLayout" name="horizontalLayout_3">\r
+ <item>\r
+ <widget class="QLabel" name="label_3">\r
+ <property name="text">\r
+ <string>Frequency</string>\r
+ </property>\r
+ </widget>\r
+ </item>\r
+ <item>\r
+ <widget class="QSpinBox" name="_frequency">\r
+ <property name="minimum">\r
+ <number>1</number>\r
+ </property>\r
+ <property name="maximum">\r
+ <number>1000</number>\r
+ </property>\r
+ <property name="singleStep">\r
+ <number>10</number>\r
+ </property>\r
+ <property name="value">\r
+ <number>250</number>\r
+ </property>\r
+ </widget>\r
+ </item>\r
+ <item>\r
+ <widget class="QLabel" name="label_6">\r
+ <property name="text">\r
+ <string>Hz</string>\r
+ </property>\r
+ </widget>\r
+ </item>\r
+ </layout>\r
+ </item>\r
+ <item>\r
+ <layout class="QHBoxLayout" name="horizontalLayout_4">\r
+ <item>\r
+ <widget class="QLabel" name="_x">\r
+ <property name="text">\r
+ <string>x=</string>\r
+ </property>\r
+ </widget>\r
+ </item>\r
+ <item>\r
+ <widget class="QLabel" name="_y">\r
+ <property name="text">\r
+ <string>y=</string>\r
+ </property>\r
+ </widget>\r
+ </item>\r
+ <item>\r
+ <widget class="QLabel" name="_z">\r
+ <property name="text">\r
+ <string>z=</string>\r
+ </property>\r
+ </widget>\r
+ </item>\r
+ <item>\r
+ <widget class="QLabel" name="_v">\r
+ <property name="text">\r
+ <string>v=</string>\r
+ </property>\r
+ </widget>\r
+ </item>\r
+ </layout>\r
+ </item>\r
+ </layout>\r
+ </widget>\r
+ </widget>\r
+ <layoutdefault spacing="6" margin="11"/>\r
+ <resources>\r
+ <include location="tactilefluids.qrc"/>\r
+ </resources>\r
+ <connections/>\r
+</ui>\r