From 7dc20f380c80b1b0597e619e66d23921f0309aa0 Mon Sep 17 00:00:00 2001 From: Wim Vriend Date: Tue, 8 Mar 2011 22:10:06 +0000 Subject: Start after update 1.5 Begin placing faceAPI in DLL git-svn-id: svn+ssh://svn.code.sf.net/p/facetracknoir/code@52 19e81ba0-9b1a-49c3-bd6c-561e1906d5fb --- FTNoIR_Filter_EWMA2/ftnoir_filter_base.h | 2 +- FTNoIR_Tracker_Base/ftnoir_tracker_base.h | 71 +++++ FTNoIR_Tracker_Base/ftnoir_tracker_base_global.h | 12 + FTNoIR_Tracker_SM/FTNoIR_Tracker_SM.h | 44 +++ FTNoIR_Tracker_SM/FTNoIR_Tracker_SM.vcproj | 266 +++++++++++++++++++ .../FTNoIR_Tracker_SM.vcproj.VRIEND200810.Wim.user | 65 +++++ FTNoIR_Tracker_SM/ftnoir_tracker_faceapi.cpp | 142 ++++++++++ FTNoIR_Tracker_UDP/FTNoIR_Tracker_UDP.h | 2 +- FTNoIR_Tracker_UDP/FTNoIR_Tracker_UDP.vcproj | 26 +- FTNoIR_Tracker_UDP/ftnoir_tracker_base.h | 71 ----- FTNoIR_Tracker_UDP/ftnoir_tracker_base_global.h | 12 - FTNoIR_Tracker_UDP/ftnoir_tracker_udp.cpp | 2 +- FaceTrackNoIR.sln | 6 + FaceTrackNoIR.suo | Bin 347136 -> 343552 bytes FaceTrackNoIR/FTNServer.cpp | 294 +++++++++++++++++++++ FaceTrackNoIR/FTNServer.h | 107 ++++++++ FaceTrackNoIR/FTNoIR_FTNServerControls.ui | 261 ++++++++++++++++++ FaceTrackNoIR/FaceTrackNoIR.cpp | 4 +- FaceTrackNoIR/tracker.cpp | 77 ++++-- FaceTrackNoIR/tracker.h | 33 ++- List of compatible games.xls | Bin 26624 -> 28672 bytes List of compatible webcams.xls | Bin 20992 -> 21504 bytes bin/FaceTrackNoIR.exe | Bin 761856 -> 761856 bytes bin/Settings/ArmA.ini | 12 +- bin/Settings/FF5.ini | 60 ++++- bin/Settings/SimConnect.ini | 8 +- bin/Settings/Wings of Prey.ini | 8 +- bin/image6.0.dll | Bin 1282048 -> 1282048 bytes 28 files changed, 1427 insertions(+), 158 deletions(-) create mode 100644 FTNoIR_Tracker_Base/ftnoir_tracker_base.h create mode 100644 FTNoIR_Tracker_Base/ftnoir_tracker_base_global.h create mode 100644 FTNoIR_Tracker_SM/FTNoIR_Tracker_SM.h create mode 100644 FTNoIR_Tracker_SM/FTNoIR_Tracker_SM.vcproj create mode 100644 FTNoIR_Tracker_SM/FTNoIR_Tracker_SM.vcproj.VRIEND200810.Wim.user create mode 100644 FTNoIR_Tracker_SM/ftnoir_tracker_faceapi.cpp delete mode 100644 FTNoIR_Tracker_UDP/ftnoir_tracker_base.h delete mode 100644 FTNoIR_Tracker_UDP/ftnoir_tracker_base_global.h create mode 100644 FaceTrackNoIR/FTNServer.cpp create mode 100644 FaceTrackNoIR/FTNServer.h create mode 100644 FaceTrackNoIR/FTNoIR_FTNServerControls.ui diff --git a/FTNoIR_Filter_EWMA2/ftnoir_filter_base.h b/FTNoIR_Filter_EWMA2/ftnoir_filter_base.h index dd8c7582..87c5c14f 100644 --- a/FTNoIR_Filter_EWMA2/ftnoir_filter_base.h +++ b/FTNoIR_Filter_EWMA2/ftnoir_filter_base.h @@ -2,7 +2,7 @@ #define FTNOIR_FILTER_BASE_H #include "ftnoir_filter_base_global.h" -#include "ftnoir_tracker_base.h" +#include "..\ftnoir_tracker_base\ftnoir_tracker_base.h" #include #include diff --git a/FTNoIR_Tracker_Base/ftnoir_tracker_base.h b/FTNoIR_Tracker_Base/ftnoir_tracker_base.h new file mode 100644 index 00000000..f39a8b4d --- /dev/null +++ b/FTNoIR_Tracker_Base/ftnoir_tracker_base.h @@ -0,0 +1,71 @@ +#ifndef FTNOIR_TRACKER_BASE_H +#define FTNOIR_TRACKER_BASE_H + +#include "ftnoir_tracker_base_global.h" +#include + +// +// x,y,z position in centimetres, yaw, pitch and roll in degrees... +// +#pragma pack(push, 2) +struct THeadPoseData { + double x, y, z, yaw, pitch, roll; +}; +#pragma pack(pop) + +// COM-Like abstract interface. +// This interface doesn't require __declspec(dllexport/dllimport) specifier. +// Method calls are dispatched via virtual table. +// Any C++ compiler can use it. +// Instances are obtained via factory function. +struct ITracker +{ + virtual void Release() = 0; // Member required to enable Auto-remove + virtual void Initialize() = 0; + virtual void StartTracker() = 0; + virtual void GiveHeadPoseData(THeadPoseData *data) = 0; +}; + +// Handle type. In C++ language the iterface type is used. +typedef ITracker* TRACKERHANDLE; + +//////////////////////////////////////////////////////////////////////////////// +// +#ifdef __cplusplus +# define EXTERN_C extern "C" +#else +# define EXTERN_C +#endif // __cplusplus + +// Factory function that creates instances of the Tracker object. +EXTERN_C +FTNOIR_TRACKER_BASE_EXPORT +TRACKERHANDLE +__stdcall +GetTracker( + void); + + +// COM-Like abstract interface. +// This interface doesn't require __declspec(dllexport/dllimport) specifier. +// Method calls are dispatched via virtual table. +// Any C++ compiler can use it. +// Instances are obtained via factory function. +struct ITrackerDialog +{ + virtual void Release() = 0; // Member required to enable Auto-remove + virtual void Initialize(QWidget *parent) = 0; +}; + +// Handle type. In C++ language the iterface type is used. +typedef ITrackerDialog* TRACKERDIALOGHANDLE; + +// Factory function that creates instances of the Tracker object. +EXTERN_C +FTNOIR_TRACKER_BASE_EXPORT +TRACKERDIALOGHANDLE +__stdcall +GetTrackerDialog(void); + + +#endif // FTNOIR_TRACKER_BASE_H diff --git a/FTNoIR_Tracker_Base/ftnoir_tracker_base_global.h b/FTNoIR_Tracker_Base/ftnoir_tracker_base_global.h new file mode 100644 index 00000000..9f4a6118 --- /dev/null +++ b/FTNoIR_Tracker_Base/ftnoir_tracker_base_global.h @@ -0,0 +1,12 @@ +#ifndef FTNOIR_TRACKER_BASE_GLOBAL_H +#define FTNOIR_TRACKER_BASE_GLOBAL_H + +#include + +#ifdef FTNOIR_TRACKER_BASE_LIB +# define FTNOIR_TRACKER_BASE_EXPORT Q_DECL_EXPORT +#else +# define FTNOIR_TRACKER_BASE_EXPORT Q_DECL_IMPORT +#endif + +#endif // FTNOIR_TRACKER_BASE_GLOBAL_H diff --git a/FTNoIR_Tracker_SM/FTNoIR_Tracker_SM.h b/FTNoIR_Tracker_SM/FTNoIR_Tracker_SM.h new file mode 100644 index 00000000..0687730a --- /dev/null +++ b/FTNoIR_Tracker_SM/FTNoIR_Tracker_SM.h @@ -0,0 +1,44 @@ +#include "..\ftnoir_tracker_base\ftnoir_tracker_base.h" +#include "ui_FTNoIR_SMClientcontrols.h" + +#include +#include +#include +#include "Windows.h" +#include "math.h" + +using namespace sm::faceapi; +using namespace sm::faceapi::qt; + +class FTNoIR_Tracker_SM : public ITracker +{ +public: + FTNoIR_Tracker_SM(); + ~FTNoIR_Tracker_SM(); + + void Release(); + void Initialize(); + void StartTracker(); + void GiveHeadPoseData(THeadPoseData *data); + void loadSettings(); + + bool setParameterValue(const int index, const float newvalue); + +private: + /** face api variables **/ + APIScope *faceapi_scope; + QSharedPointer _engine; + smEngineHandle _engine_handle; + + THeadPoseData newHeadPose; // Structure with new headpose + + //parameter list for the filter-function(s) + enum + { + kPortAddress=0, // Index in QList + kNumFilterParameters // Indicate number of parameters used + }; + QList> parameterRange; + QList parameterValueAsFloat; + +}; diff --git a/FTNoIR_Tracker_SM/FTNoIR_Tracker_SM.vcproj b/FTNoIR_Tracker_SM/FTNoIR_Tracker_SM.vcproj new file mode 100644 index 00000000..243e919b --- /dev/null +++ b/FTNoIR_Tracker_SM/FTNoIR_Tracker_SM.vcproj @@ -0,0 +1,266 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/FTNoIR_Tracker_SM/FTNoIR_Tracker_SM.vcproj.VRIEND200810.Wim.user b/FTNoIR_Tracker_SM/FTNoIR_Tracker_SM.vcproj.VRIEND200810.Wim.user new file mode 100644 index 00000000..12f78238 --- /dev/null +++ b/FTNoIR_Tracker_SM/FTNoIR_Tracker_SM.vcproj.VRIEND200810.Wim.user @@ -0,0 +1,65 @@ + + + + + + + + + + + diff --git a/FTNoIR_Tracker_SM/ftnoir_tracker_faceapi.cpp b/FTNoIR_Tracker_SM/ftnoir_tracker_faceapi.cpp new file mode 100644 index 00000000..930ce090 --- /dev/null +++ b/FTNoIR_Tracker_SM/ftnoir_tracker_faceapi.cpp @@ -0,0 +1,142 @@ +#include "ftnoir_tracker_sm.h" + +using namespace sm::faceapi; +using namespace sm::faceapi::qt; + +FTNoIR_Tracker_SM::FTNoIR_Tracker_SM() +{ + //allocate memory for the parameters + parameterValueAsFloat.clear(); + parameterRange.clear(); + + // Add the parameters to the list + parameterRange.append(std::pair(1000.0f,9999.0f)); + parameterValueAsFloat.append(0.0f); + setParameterValue(kPortAddress,5551.0f); + + newHeadPose.x = 0.0f; + newHeadPose.y = 0.0f; + newHeadPose.z = 0.0f; + newHeadPose.yaw = 0.0f; + newHeadPose.pitch = 0.0f; + newHeadPose.roll = 0.0f; +} + +FTNoIR_Tracker_SM::~FTNoIR_Tracker_SM() +{ +} + +void FTNoIR_Tracker_SM::Release() +{ + delete this; +} + +void FTNoIR_Tracker_SM::Initialize() +{ + qDebug() << "FTNoIR_Tracker_SM::Initialize says: Starting "; + loadSettings(); + + try { + // Initialize the faceAPI Qt library + sm::faceapi::qt::initialize(); + smLoggingSetFileOutputEnable( false ); + + // Initialize the API + faceapi_scope = new APIScope(); + + //if (APIScope::internalQtGuiIsDisabled()){ + // QMessageBox::warning(0,"faceAPI Error","Something Bad",QMessageBox::Ok,QMessageBox::NoButton); + //} + + // Create head-tracking engine v2 using first detected webcam + CameraInfo::registerType(SM_API_CAMERA_TYPE_WDM); + _engine = QSharedPointer(new HeadTrackerV2()); + + // starts the faceapi engine + _engine->start(); + } + catch (sm::faceapi::Error &e) + { + /* ERROR with camera */ + QMessageBox::warning(0,"faceAPI Error",e.what(),QMessageBox::Ok,QMessageBox::NoButton); + } + + return; +} + +void FTNoIR_Tracker_SM::StartTracker() +{ + return; +} + +void FTNoIR_Tracker_SM::GiveHeadPoseData(THeadPoseData *data) +{ + data->x = newHeadPose.x; + data->y = newHeadPose.y; + data->z = newHeadPose.z; + data->yaw = newHeadPose.yaw; + data->pitch = newHeadPose.pitch; + data->roll = newHeadPose.roll; + return; +} + +bool FTNoIR_Tracker_SM::setParameterValue(const int index, const float newvalue) +{ + if ((index >= 0) && (index < parameterValueAsFloat.size())) + { + // + // Limit the new value, using the defined range. + // + if (newvalue < parameterRange[index].first) { + parameterValueAsFloat[index] = parameterRange[index].first; + } + else { + if (newvalue > parameterRange[index].second) { + parameterValueAsFloat[index] = parameterRange[index].second; + } + else { + parameterValueAsFloat[index] = newvalue; + } + } + +// updateParameterString(index); + return true; + } + else + { + return false; + } +}; + +// +// Load the current Settings from the currently 'active' INI-file. +// +void FTNoIR_Tracker_SM::loadSettings() { + + qDebug() << "FTNoIR_Tracker_SM::loadSettings says: Starting "; + QSettings settings("Abbequerque Inc.", "FaceTrackNoIR"); // Registry settings (in HK_USER) + + QString currentFile = settings.value ( "SettingsFile", QCoreApplication::applicationDirPath() + "/Settings/default.ini" ).toString(); + QSettings iniFile( currentFile, QSettings::IniFormat ); // Application settings (in INI-file) + + qDebug() << "FTNoIR_Tracker_SM::loadSettings says: iniFile = " << currentFile; + + iniFile.beginGroup ( "FTNClient" ); + setParameterValue(kPortAddress, (float) iniFile.value ( "PortNumber", 5550 ).toInt()); + iniFile.endGroup (); +} + + +//////////////////////////////////////////////////////////////////////////////// +// Factory function that creates instances if the Tracker object. + +// Export both decorated and undecorated names. +// GetTracker - Undecorated name, which can be easily used with GetProcAddress +// Win32 API function. +// _GetTracker@0 - Common name decoration for __stdcall functions in C language. +#pragma comment(linker, "/export:GetTracker=_GetTracker@0") + +FTNOIR_TRACKER_BASE_EXPORT TRACKERHANDLE __stdcall GetTracker() +{ + return new FTNoIR_Tracker_SM; +} diff --git a/FTNoIR_Tracker_UDP/FTNoIR_Tracker_UDP.h b/FTNoIR_Tracker_UDP/FTNoIR_Tracker_UDP.h index b3467341..9a0cad1f 100644 --- a/FTNoIR_Tracker_UDP/FTNoIR_Tracker_UDP.h +++ b/FTNoIR_Tracker_UDP/FTNoIR_Tracker_UDP.h @@ -1,4 +1,4 @@ -#include "ftnoir_tracker_base.h" +#include "..\ftnoir_tracker_base\ftnoir_tracker_base.h" #include "ui_FTNoIR_FTNClientcontrols.h" #include #include diff --git a/FTNoIR_Tracker_UDP/FTNoIR_Tracker_UDP.vcproj b/FTNoIR_Tracker_UDP/FTNoIR_Tracker_UDP.vcproj index ae299ed2..2e01f009 100644 --- a/FTNoIR_Tracker_UDP/FTNoIR_Tracker_UDP.vcproj +++ b/FTNoIR_Tracker_UDP/FTNoIR_Tracker_UDP.vcproj @@ -178,33 +178,11 @@ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" > - - - - - - - -// -// x,y,z position in centimetres, yaw, pitch and roll in degrees... -// -#pragma pack(push, 2) -struct THeadPoseData { - double x, y, z, yaw, pitch, roll; -}; -#pragma pack(pop) - -// COM-Like abstract interface. -// This interface doesn't require __declspec(dllexport/dllimport) specifier. -// Method calls are dispatched via virtual table. -// Any C++ compiler can use it. -// Instances are obtained via factory function. -struct ITracker -{ - virtual void Release() = 0; // Member required to enable Auto-remove - virtual void Initialize() = 0; - virtual void StartTracker() = 0; - virtual void GiveHeadPoseData(THeadPoseData *data) = 0; -}; - -// Handle type. In C++ language the iterface type is used. -typedef ITracker* TRACKERHANDLE; - -//////////////////////////////////////////////////////////////////////////////// -// -#ifdef __cplusplus -# define EXTERN_C extern "C" -#else -# define EXTERN_C -#endif // __cplusplus - -// Factory function that creates instances of the Tracker object. -EXTERN_C -FTNOIR_TRACKER_BASE_EXPORT -TRACKERHANDLE -__stdcall -GetTracker( - void); - - -// COM-Like abstract interface. -// This interface doesn't require __declspec(dllexport/dllimport) specifier. -// Method calls are dispatched via virtual table. -// Any C++ compiler can use it. -// Instances are obtained via factory function. -struct ITrackerDialog -{ - virtual void Release() = 0; // Member required to enable Auto-remove - virtual void Initialize(QWidget *parent) = 0; -}; - -// Handle type. In C++ language the iterface type is used. -typedef ITrackerDialog* TRACKERDIALOGHANDLE; - -// Factory function that creates instances of the Tracker object. -EXTERN_C -FTNOIR_TRACKER_BASE_EXPORT -TRACKERDIALOGHANDLE -__stdcall -GetTrackerDialog(void); - - -#endif // FTNOIR_TRACKER_BASE_H diff --git a/FTNoIR_Tracker_UDP/ftnoir_tracker_base_global.h b/FTNoIR_Tracker_UDP/ftnoir_tracker_base_global.h deleted file mode 100644 index 9f4a6118..00000000 --- a/FTNoIR_Tracker_UDP/ftnoir_tracker_base_global.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef FTNOIR_TRACKER_BASE_GLOBAL_H -#define FTNOIR_TRACKER_BASE_GLOBAL_H - -#include - -#ifdef FTNOIR_TRACKER_BASE_LIB -# define FTNOIR_TRACKER_BASE_EXPORT Q_DECL_EXPORT -#else -# define FTNOIR_TRACKER_BASE_EXPORT Q_DECL_IMPORT -#endif - -#endif // FTNOIR_TRACKER_BASE_GLOBAL_H diff --git a/FTNoIR_Tracker_UDP/ftnoir_tracker_udp.cpp b/FTNoIR_Tracker_UDP/ftnoir_tracker_udp.cpp index 93ef60b6..1a64261e 100644 --- a/FTNoIR_Tracker_UDP/ftnoir_tracker_udp.cpp +++ b/FTNoIR_Tracker_UDP/ftnoir_tracker_udp.cpp @@ -88,7 +88,7 @@ quint16 senderPort; //for lower cpu load usleep(10000); - yieldCurrentThread(); +// yieldCurrentThread(); } } diff --git a/FaceTrackNoIR.sln b/FaceTrackNoIR.sln index d125c314..31b3fa30 100644 --- a/FaceTrackNoIR.sln +++ b/FaceTrackNoIR.sln @@ -11,6 +11,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FTNoIR_Tracker_UDP", "FTNoI EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FTNoIR_Filter_EWMA2", "FTNoIR_Filter_EWMA2\FTNoIR_Filter_EWMA2.vcproj", "{7DD9F1AA-B7C0-4056-AC4A-1501840E6438}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FTNoIR_Tracker_SM", "FTNoIR_Tracker_SM\FTNoIR_Tracker_SM.vcproj", "{26346BCF-92A5-47A7-B4CF-73C402F7C3AD}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 @@ -34,6 +36,10 @@ Global {7DD9F1AA-B7C0-4056-AC4A-1501840E6438}.Debug|Win32.Build.0 = Debug|Win32 {7DD9F1AA-B7C0-4056-AC4A-1501840E6438}.Release|Win32.ActiveCfg = Release|Win32 {7DD9F1AA-B7C0-4056-AC4A-1501840E6438}.Release|Win32.Build.0 = Release|Win32 + {26346BCF-92A5-47A7-B4CF-73C402F7C3AD}.Debug|Win32.ActiveCfg = Debug|Win32 + {26346BCF-92A5-47A7-B4CF-73C402F7C3AD}.Debug|Win32.Build.0 = Debug|Win32 + {26346BCF-92A5-47A7-B4CF-73C402F7C3AD}.Release|Win32.ActiveCfg = Release|Win32 + {26346BCF-92A5-47A7-B4CF-73C402F7C3AD}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/FaceTrackNoIR.suo b/FaceTrackNoIR.suo index 006a6e0c..f545da19 100644 Binary files a/FaceTrackNoIR.suo and b/FaceTrackNoIR.suo differ diff --git a/FaceTrackNoIR/FTNServer.cpp b/FaceTrackNoIR/FTNServer.cpp new file mode 100644 index 00000000..101d06a5 --- /dev/null +++ b/FaceTrackNoIR/FTNServer.cpp @@ -0,0 +1,294 @@ +/******************************************************************************** +* FaceTrackNoIR This program is a private project of the some enthusiastic * +* gamers from Holland, who don't like to pay much for * +* head-tracking. * +* * +* Copyright (C) 2010 Wim Vriend (Developing) * +* Ron Hendriks (Researching and Testing) * +* * +* Homepage * +* * +* This program is free software; you can redistribute it and/or modify it * +* under the terms of the GNU General Public License as published by the * +* Free Software Foundation; either version 3 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 General Public License for * +* more details. * +* * +* You should have received a copy of the GNU General Public License along * +* with this program; if not, see . * +* * +* FTNServer FTNServer is the Class, that communicates headpose-data * +* to another FaceTrackNoIR program, using UDP. * +* It is based on the (Linux) example made by Melchior FRANZ. * +********************************************************************************/ +/* + Modifications (last one on top): + 20101224 - WVR: Base class is no longer inheriting QThread. sendHeadposeToGame + is called from run() of Tracker.cpp +*/ +#include +#include +#include "FTNServer.h" +#include "Tracker.h" +#include + +/** constructor **/ +FTNServer::FTNServer( Tracker *parent ) { + + // Save the parent + headTracker = parent; + loadSettings(); +} + +/** destructor **/ +FTNServer::~FTNServer() { + if (inSocket != 0) { + inSocket->close(); + delete inSocket; + } + + if (outSocket != 0) { + outSocket->close(); + delete outSocket; + } +} + +// +// Update Headpose in Game. +// +void FTNServer::sendHeadposeToGame() { +int no_bytes; +QHostAddress sender; +quint16 senderPort; + + // + // Create UDP-sockets if they don't exist already. + // They must be created here, because they must be in the Tracker thread (Tracker::run()) + // + if (inSocket == 0) { + qDebug() << "FTNServer::sendHeadposeToGame creating sockets"; + inSocket = new QUdpSocket(); + // Connect the inSocket to the port, to receive messages + if (!inSocket->bind(QHostAddress::Any, destPort+1)) { + qDebug() << "FTNServer::writePendingDatagrams says: unable to bind inSocket!"; + delete inSocket; + inSocket = 0; + } + } + + if (outSocket == 0) { + outSocket = new QUdpSocket(); + } + + // + // Copy the Raw measurements directly to the client. + // + TestData.x = virtPosX; + TestData.y = virtPosY; + TestData.z = virtPosZ; + TestData.pitch = virtRotX; + TestData.yaw = virtRotY; + TestData.roll = virtRotZ; + + // + // Try to send an UDP-message to the receiver + // + + //! [1] + no_bytes = outSocket->writeDatagram((const char *) &TestData, sizeof( TestData ), destIP, destPort); + if ( no_bytes > 0) { +// qDebug() << "FTNServer::writePendingDatagrams says: bytes send =" << no_bytes << sizeof( double ); + } + else { + qDebug() << "FTNServer::writePendingDatagrams says: nothing sent!"; + } + + // + // Receiver may send data, so we must read that here. + // + if (inSocket != 0) { + while (inSocket->hasPendingDatagrams()) { + + QByteArray datagram; + datagram.resize(inSocket->pendingDatagramSize()); + + inSocket->readDatagram( (char * ) &cmd, sizeof(cmd), &sender, &senderPort); + + fg_cmd = cmd; // Let's just accept that command for now... + if ( cmd > 0 ) { + qDebug() << "FTNServer::sendHeadposeToGame hasPendingDatagrams, cmd = " << cmd; + headTracker->handleGameCommand ( cmd ); // Send it upstream, for the Tracker to handle + } + } + } +} + +// +// Check if the Client DLL exists and load it (to test it), if so. +// Returns 'true' if all seems OK. +// +bool FTNServer::checkServerInstallationOK( HANDLE handle ) +{ + // Init. the data + TestData.x = 0.0f; + TestData.y = 0.0f; + TestData.z = 0.0f; + TestData.yaw = 0.0f; + TestData.pitch = 0.0f; + TestData.roll = 0.0f; +// TestData.status = 0; + fg_cmd = 1; + + inSocket = 0; + outSocket = 0; + + return true; +} + +// +// Load the current Settings from the currently 'active' INI-file. +// +void FTNServer::loadSettings() { + + QSettings settings("Abbequerque Inc.", "FaceTrackNoIR"); // Registry settings (in HK_USER) + + QString currentFile = settings.value ( "SettingsFile", QCoreApplication::applicationDirPath() + "/Settings/default.ini" ).toString(); + QSettings iniFile( currentFile, QSettings::IniFormat ); // Application settings (in INI-file) + + iniFile.beginGroup ( "FTN" ); + + QString destAddr = iniFile.value ( "IP-1", 192 ).toString() + "." + iniFile.value ( "IP-2", 168 ).toString() + "." + iniFile.value ( "IP-3", 2 ).toString() + "." + iniFile.value ( "IP-4", 1 ).toString(); + destIP = QHostAddress( destAddr ); + destPort = iniFile.value ( "PortNumber", 5550 ).toInt(); + + iniFile.endGroup (); +} + +// +// Constructor for server-settings-dialog +// +FTNServerControls::FTNServerControls( QWidget *parent, Qt::WindowFlags f ) : +QWidget( parent , f) +{ + ui.setupUi( this ); + + QPoint offsetpos(100, 100); + this->move(parent->pos() + offsetpos); + + // Connect Qt signals to member-functions + connect(ui.btnOK, SIGNAL(clicked()), this, SLOT(doOK())); + connect(ui.btnCancel, SIGNAL(clicked()), this, SLOT(doCancel())); + connect(ui.spinIPFirstNibble, SIGNAL(valueChanged(int)), this, SLOT(settingChanged())); + connect(ui.spinIPSecondNibble, SIGNAL(valueChanged(int)), this, SLOT(settingChanged())); + connect(ui.spinIPThirdNibble, SIGNAL(valueChanged(int)), this, SLOT(settingChanged())); + connect(ui.spinIPFourthNibble, SIGNAL(valueChanged(int)), this, SLOT(settingChanged())); + connect(ui.spinPortNumber, SIGNAL(valueChanged(int)), this, SLOT(settingChanged())); + + // Load the settings from the current .INI-file + loadSettings(); +} + +// +// Destructor for server-dialog +// +FTNServerControls::~FTNServerControls() { + qDebug() << "~FTNServerControls() says: started"; +} + +// +// OK clicked on server-dialog +// +void FTNServerControls::doOK() { + save(); + this->close(); +} + +// override show event +void FTNServerControls::showEvent ( QShowEvent * event ) { + loadSettings(); +} + +// +// Cancel clicked on server-dialog +// +void FTNServerControls::doCancel() { + // + // Ask if changed Settings should be saved + // + if (settingsDirty) { + int ret = QMessageBox::question ( this, "Settings have changed", "Do you want to save the settings?", QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Discard ); + + qDebug() << "doCancel says: answer =" << ret; + + switch (ret) { + case QMessageBox::Save: + save(); + this->close(); + break; + case QMessageBox::Discard: + this->close(); + break; + case QMessageBox::Cancel: + // Cancel was clicked + break; + default: + // should never be reached + break; + } + } + else { + this->close(); + } +} + +// +// Load the current Settings from the currently 'active' INI-file. +// +void FTNServerControls::loadSettings() { + +// qDebug() << "loadSettings says: Starting "; + QSettings settings("Abbequerque Inc.", "FaceTrackNoIR"); // Registry settings (in HK_USER) + + QString currentFile = settings.value ( "SettingsFile", QCoreApplication::applicationDirPath() + "/Settings/default.ini" ).toString(); + QSettings iniFile( currentFile, QSettings::IniFormat ); // Application settings (in INI-file) + +// qDebug() << "loadSettings says: iniFile = " << currentFile; + + iniFile.beginGroup ( "FTN" ); + ui.spinIPFirstNibble->setValue( iniFile.value ( "IP-1", 192 ).toInt() ); + ui.spinIPSecondNibble->setValue( iniFile.value ( "IP-2", 168 ).toInt() ); + ui.spinIPThirdNibble->setValue( iniFile.value ( "IP-3", 2 ).toInt() ); + ui.spinIPFourthNibble->setValue( iniFile.value ( "IP-4", 1 ).toInt() ); + + ui.spinPortNumber->setValue( iniFile.value ( "PortNumber", 5550 ).toInt() ); + iniFile.endGroup (); + + settingsDirty = false; +} + +// +// Save the current Settings to the currently 'active' INI-file. +// +void FTNServerControls::save() { + + QSettings settings("Abbequerque Inc.", "FaceTrackNoIR"); // Registry settings (in HK_USER) + + QString currentFile = settings.value ( "SettingsFile", QCoreApplication::applicationDirPath() + "/Settings/default.ini" ).toString(); + QSettings iniFile( currentFile, QSettings::IniFormat ); // Application settings (in INI-file) + + iniFile.beginGroup ( "FTN" ); + iniFile.setValue ( "IP-1", ui.spinIPFirstNibble->value() ); + iniFile.setValue ( "IP-2", ui.spinIPSecondNibble->value() ); + iniFile.setValue ( "IP-3", ui.spinIPThirdNibble->value() ); + iniFile.setValue ( "IP-4", ui.spinIPFourthNibble->value() ); + iniFile.setValue ( "PortNumber", ui.spinPortNumber->value() ); + iniFile.endGroup (); + + settingsDirty = false; +} + +//END diff --git a/FaceTrackNoIR/FTNServer.h b/FaceTrackNoIR/FTNServer.h new file mode 100644 index 00000000..f392e708 --- /dev/null +++ b/FaceTrackNoIR/FTNServer.h @@ -0,0 +1,107 @@ +/******************************************************************************** +* FaceTrackNoIR This program is a private project of the some enthusiastic * +* gamers from Holland, who don't like to pay much for * +* head-tracking. * +* * +* Copyright (C) 2010 Wim Vriend (Developing) * +* Ron Hendriks (Researching and Testing) * +* * +* Homepage * +* * +* This program is free software; you can redistribute it and/or modify it * +* under the terms of the GNU General Public License as published by the * +* Free Software Foundation; either version 3 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 General Public License for * +* more details. * +* * +* You should have received a copy of the GNU General Public License along * +* with this program; if not, see . * +* * +* FTNServer FTNServer is the Class, that communicates headpose-data * +* to FlightGear, using UDP. * +* It is based on the (Linux) example made by Melchior FRANZ. * +********************************************************************************/ +#pragma once +#ifndef INCLUDED_FTNSERVER_H +#define INCLUDED_FTNSERVER_H + +#include "FTNoIR_cxx_protocolserver.h" +#include "..\ftnoir_tracker_base\ftnoir_tracker_base.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace v4friend::ftnoir; + +#include "ui_FTNoIR_FTNServercontrols.h" + +class Tracker; // pre-define parent-class to avoid circular includes + +class FTNServer : public ProtocolServerBase { + Q_OBJECT + +public: + + // public member methods + FTNServer( Tracker *parent ); + ~FTNServer(); + + // protected member methods +protected: + bool checkServerInstallationOK( HANDLE handle ); + void sendHeadposeToGame(); + void setVirtPosX(float pos) { virtPosX = pos; } + void setVirtPosY(float pos) { virtPosY = pos; } + void setVirtPosZ(float pos) { virtPosZ = pos; } + +private: + Tracker *headTracker; // For upstream messages... + THeadPoseData TestData; + QUdpSocket *inSocket; // Receive from FligthGear + QUdpSocket *outSocket; // Send to FligthGear + qint32 cmd; + qint32 fg_cmd; // Command from FlightGear + QHostAddress destIP; // Destination IP-address + int destPort; // Destination port-number + void loadSettings(); +}; + +// Widget that has controls for FTNoIR protocol server-settings. +class FTNServerControls: public QWidget, public Ui::UICFTNServerControls +{ + Q_OBJECT +public: + + explicit FTNServerControls( QWidget *parent=0, Qt::WindowFlags f=0 ); + virtual ~FTNServerControls(); + void showEvent ( QShowEvent * event ); + +private: + Ui::UICFTNServerControls ui; + void loadSettings(); + void save(); + + /** helper **/ + bool settingsDirty; + +private slots: + void doOK(); + void doCancel(); + void settingChanged() { settingsDirty = true; }; +}; + + + +#endif//INCLUDED_FTNSERVER_H +//END diff --git a/FaceTrackNoIR/FTNoIR_FTNServerControls.ui b/FaceTrackNoIR/FTNoIR_FTNServerControls.ui new file mode 100644 index 00000000..44c7e99f --- /dev/null +++ b/FaceTrackNoIR/FTNoIR_FTNServerControls.ui @@ -0,0 +1,261 @@ + + + UICFTNServerControls + + + + 0 + 0 + 411 + 156 + + + + FTNoIR protocol settings FaceTrackNoIR + + + + images/FaceTrackNoIR.icoimages/FaceTrackNoIR.ico + + + Qt::LeftToRight + + + false + + + + + + + + + 60 + 16777215 + + + + 255 + + + 1 + + + + + + + + 60 + 16777215 + + + + 255 + + + 1 + + + + + + + + 60 + 16777215 + + + + 255 + + + 1 + + + + + + + + 60 + 16777215 + + + + 255 + + + 1 + + + + + + + IP-address remote PC + + + + + + + Port-number + + + + + + + 5550 + + + 10000 + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + Enter IP-address and port-number for the remote PC. + + + true + + + + + + + Remember: you may have to change firewall-settings too! + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + QLayout::SetDefaultConstraint + + + + + + 0 + 0 + + + + + 100 + 0 + + + + + 100 + 16777215 + + + + OK + + + + + + + + 0 + 0 + + + + + 100 + 0 + + + + + 100 + 16777215 + + + + Cancel + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 10 + 20 + + + + + + + + + + spinIPFirstNibble + spinIPSecondNibble + spinIPThirdNibble + spinIPFourthNibble + spinPortNumber + btnOK + btnCancel + + + + + startEngineClicked() + stopEngineClicked() + cameraSettingsClicked() + + diff --git a/FaceTrackNoIR/FaceTrackNoIR.cpp b/FaceTrackNoIR/FaceTrackNoIR.cpp index 7197a5f7..d8184fff 100644 --- a/FaceTrackNoIR/FaceTrackNoIR.cpp +++ b/FaceTrackNoIR/FaceTrackNoIR.cpp @@ -398,7 +398,7 @@ void FaceTrackNoIR::loadSettings() { // Put the filename in the window-title. // QFileInfo pathInfo ( currentFile ); - setWindowTitle ( "FaceTrackNoIR (1.5) - " + pathInfo.fileName() ); + setWindowTitle ( "FaceTrackNoIR (1.6) - " + pathInfo.fileName() ); // // Get a List of all the INI-files in the (currently active) Settings-folder. @@ -492,7 +492,7 @@ void FaceTrackNoIR::startTracker( ) { // Show the video widget ui.video_frame->show(); - _display = new VideoDisplayWidget( tracker->getEngine(), ui.video_frame ); + _display = new VideoDisplayWidget( tracker->getEngine(), ui.video_frame, 0 ); l = new QVBoxLayout(ui.video_frame); l->setMargin(0); l->setSpacing(0); diff --git a/FaceTrackNoIR/tracker.cpp b/FaceTrackNoIR/tracker.cpp index 6455f9b6..2571be40 100644 --- a/FaceTrackNoIR/tracker.cpp +++ b/FaceTrackNoIR/tracker.cpp @@ -55,8 +55,8 @@ #define USE_HEADPOSE_CALLBACK //#define USE_DEBUG_CLIENT -using namespace sm::faceapi; -using namespace sm::faceapi::qt; +//using namespace sm::faceapi; +//using namespace sm::faceapi::qt; // Flags bool Tracker::confid = false; @@ -104,27 +104,60 @@ QLibrary *filterLib; Tracker::hTrackMutex = CreateMutexA(NULL, false, "HeadPose_mutex"); + // + // Initialize the headpose-data + // + Tracker::Yaw.initHeadPoseData(); + Tracker::Pitch.initHeadPoseData(); + Tracker::Roll.initHeadPoseData(); + Tracker::X.initHeadPoseData(); + Tracker::Y.initHeadPoseData(); + Tracker::Z.initHeadPoseData(); + + // + // Start the selected Tracker-engine + // switch (selectedTracker) { case FT_SM_FACEAPI: - try { - // Initialize the faceAPI Qt library - sm::faceapi::qt::initialize(); - smLoggingSetFileOutputEnable( false ); - - // Initialize the API - faceapi_scope = new APIScope; - - // Create head-tracking engine v2 using first detected webcam - CameraInfo::registerType(SM_API_CAMERA_TYPE_WDM); - _engine = QSharedPointer(new HeadTrackerV2()); - - // starts the faceapi engine - _engine->start(); - } - catch (sm::faceapi::Error &e) - { - /* ERROR with camera */ - QMessageBox::warning(0,"faceAPI Error",e.what(),QMessageBox::Ok,QMessageBox::NoButton); + //try { + // // Initialize the faceAPI Qt library + // sm::faceapi::qt::initialize(); + // smLoggingSetFileOutputEnable( false ); + + // // Initialize the API + // faceapi_scope = new APIScope(); + + // //if (APIScope::internalQtGuiIsDisabled()){ + // // QMessageBox::warning(0,"faceAPI Error","Something Bad",QMessageBox::Ok,QMessageBox::NoButton); + // //} + + // // Create head-tracking engine v2 using first detected webcam + // CameraInfo::registerType(SM_API_CAMERA_TYPE_WDM); + // _engine = QSharedPointer(new HeadTrackerV2()); + + // // starts the faceapi engine + // _engine->start(); + //} + //catch (sm::faceapi::Error &e) + //{ + // /* ERROR with camera */ + // QMessageBox::warning(0,"faceAPI Error",e.what(),QMessageBox::Ok,QMessageBox::NoButton); + //} + trackerLib = new QLibrary("FTNoIR_Tracker_SM.dll"); + + getIT = (importGetTracker) trackerLib->resolve("GetTracker"); + + if (getIT) { + ITrackerPtr ptrXyz(getIT()); + if (ptrXyz) + { + pTracker = ptrXyz; + pTracker->Initialize(); + qDebug() << "Tracker::setup Function Resolved!"; + } + } + else { + QMessageBox::warning(0,"FaceTrackNoIR Error", "DLL not loaded",QMessageBox::Ok,QMessageBox::NoButton); } break; @@ -681,7 +714,7 @@ void Tracker::run() { //for lower cpu load usleep(10000); - yieldCurrentThread(); +// yieldCurrentThread(); } } diff --git a/FaceTrackNoIR/tracker.h b/FaceTrackNoIR/tracker.h index 3eeae2f2..bfed3cd4 100644 --- a/FaceTrackNoIR/tracker.h +++ b/FaceTrackNoIR/tracker.h @@ -23,7 +23,7 @@ #ifndef __TRACKER_H__ #define __TRACKER_H__ -#include +//#include #include #include #include @@ -46,7 +46,7 @@ #include "FTNServer.h" // FaceTrackNoIR-server (for client-server) #include "FTNoIR_cxx_protocolserver.h" -#include "FTNoIR_Tracker_base.h" +#include "..\ftnoir_tracker_base\FTNoIR_Tracker_base.h" #include "FTNoIR_Filter_base.h" #include "AutoClosePtr.h" @@ -94,14 +94,31 @@ class FaceTrackNoIR; // pre-define parent-class to avoid circular includes // // Structure to hold all variables concerning one of 6 DOF's // -struct THeadPoseDOF { +class THeadPoseDOF { +public: + void initHeadPoseData(){ + headPos = 0.0f; + initial_headPos = 0.0f; + offset_headPos = 0.0f; + invert = 0.0f; + red = 0.0f; + rawList.clear(); + maxItems = 10.0f; + prevPos = 0.0f; + prevRawPos = 0.0f; +// curve.??? + NeutralZone = 0; + MaxInput = 0; + confidence = 0.0f; + newSample = FALSE; + } float headPos; // Current position (from faceTracker, radials or meters) float initial_headPos; // Position on startup (first valid value) float offset_headPos; // Offset for centering float invert; // Invert measured value (= 1.0f or -1.0f) float red; // Reduction factor (used for EWMA-filtering, between 0.0f and 1.0f) QList rawList; // List of 'n' headPos values (used for moving average) - int maxItems; // Maximum number of elements is rawList + int maxItems; // Maximum number of elements in rawList float prevPos; // Previous Position float prevRawPos; // Previous Raw Position QPainterPath curve; // Bezier curve to translate input -> output @@ -138,10 +155,10 @@ private: FTNoIR_Client selectedClient; FTNoIR_Face_Tracker selectedTracker; - /** face api variables **/ - APIScope *faceapi_scope; - QSharedPointer _engine; - smEngineHandle _engine_handle; + ///** face api variables **/ +// APIScope *faceapi_scope; + // QSharedPointer _engine; + //smEngineHandle _engine_handle; static ITrackerPtr pTracker; // Pointer to Tracker instance (in DLL) static IFilterPtr pFilter; // Pointer to Filter instance (in DLL) diff --git a/List of compatible games.xls b/List of compatible games.xls index c95bafb0..27f99e67 100644 Binary files a/List of compatible games.xls and b/List of compatible games.xls differ diff --git a/List of compatible webcams.xls b/List of compatible webcams.xls index db8cd81a..4c53818d 100644 Binary files a/List of compatible webcams.xls and b/List of compatible webcams.xls differ diff --git a/bin/FaceTrackNoIR.exe b/bin/FaceTrackNoIR.exe index 389124a0..0a93dfc9 100644 Binary files a/bin/FaceTrackNoIR.exe and b/bin/FaceTrackNoIR.exe differ diff --git a/bin/Settings/ArmA.ini b/bin/Settings/ArmA.ini index 1d87a0b7..cb6471d1 100644 --- a/bin/Settings/ArmA.ini +++ b/bin/Settings/ArmA.ini @@ -1,5 +1,5 @@ [Tracking] -Smooth=3 +Smooth=10 NeutralZone=5 sensYaw=90 sensPitch=90 @@ -20,9 +20,9 @@ redRoll=60 redX=71 redY=70 redZ=70 -minSmooth=15 -powCurve=10 -maxSmooth=50 +minSmooth=20 +powCurve=5 +maxSmooth=70 [GameProtocol] Selection=0 @@ -58,7 +58,7 @@ Keycode_Center=199 Shift_Center=false Ctrl_Center=false Alt_Center=false -Keycode_StartStop=211 +Keycode_StartStop=207 Shift_StartStop=false Ctrl_StartStop=false Alt_StartStop=false @@ -72,6 +72,8 @@ Inhibit_Roll=false Inhibit_X=false Inhibit_Y=false Inhibit_Z=false +SetZero=false +SetEngineStop=false [TrackerSource] Selection=0 diff --git a/bin/Settings/FF5.ini b/bin/Settings/FF5.ini index db4901fd..85d0502c 100644 --- a/bin/Settings/FF5.ini +++ b/bin/Settings/FF5.ini @@ -1,5 +1,5 @@ [Tracking] -Smooth=15 +Smooth=10 NeutralZone=5 sensYaw=200 sensPitch=200 @@ -7,8 +7,8 @@ sensRoll=100 sensX=100 sensY=100 sensZ=100 -invertYaw=true -invertPitch=false +invertYaw=false +invertPitch=true invertRoll=false invertX=true invertY=false @@ -20,6 +20,60 @@ redRoll=75 redX=75 redY=75 redZ=75 +minSmooth=20 +powCurve=10 +maxSmooth=70 [GameProtocol] Selection=4 + +[Curves] +Yaw_point1=@Variant(\0\0\0\x1a@\b\0\0\0\0\0\0@\x18\0\0\0\0\0\0) +Yaw_point2=@Variant(\0\0\0\x1a@@\x80\0\0\0\0\0@1\0\0\0\0\0\0) +Yaw_point3=@Variant(\0\0\0\x1a@P\xc0\0\0\0\0\0@@\x80\0\0\0\0\0) +Yaw_point4=@Variant(\0\0\0\x1a@e`\0\0\0\0\0@I\0\0\0\0\0\0) +Pitch_point1=@Variant(\0\0\0\x1a@\x14\0\0\0\0\0\0@\x14\0\0\0\0\0\0) +Pitch_point2=@Variant(\0\0\0\x1a@@\x80\0\0\0\0\0@1\0\0\0\0\0\0) +Pitch_point3=@Variant(\0\0\0\x1a@R\0\0\0\0\0\0@@\x80\0\0\0\0\0) +Pitch_point4=@Variant(\0\0\0\x1a@e\x80\0\0\0\0\0@I\0\0\0\0\0\0) +Roll_point1=@Variant(\0\0\0\x1a@\x10\0\0\0\0\0\0@\x18\0\0\0\0\0\0) +Roll_point2=@Variant(\0\0\0\x1a@1\0\0\0\0\0\0@1\0\0\0\0\0\0) +Roll_point3=@Variant(\0\0\0\x1a@D\x80\0\0\0\0\0@A\0\0\0\0\0\0) +Roll_point4=@Variant(\0\0\0\x1a@Y@\0\0\0\0\0@I\0\0\0\0\0\0) +X_point1=@Variant(\0\0\0\x1a\0\0\0\0\0\0\0\0@\x14\0\0\0\0\0\0) +X_point2="@Variant(\0\0\0\x1a@;\0\0\0\0\0\0@1\0\0\0\0\0\0)" +X_point3=@Variant(\0\0\0\x1a@K\0\0\0\0\0\0@B\0\0\0\0\0\0) +X_point4=@Variant(\0\0\0\x1a@Z@\0\0\0\0\0@I\0\0\0\0\0\0) +Y_point1=@Variant(\0\0\0\x1a\0\0\0\0\0\0\0\0@\x14\0\0\0\0\0\0) +Y_point2=@Variant(\0\0\0\x1a@A\0\0\0\0\0\0@4\0\0\0\0\0\0) +Y_point3=@Variant(\0\0\0\x1a@O\x80\0\0\0\0\0@B\x80\0\0\0\0\0) +Y_point4=@Variant(\0\0\0\x1a@Z\0\0\0\0\0\0@I\0\0\0\0\0\0) +Z_point1=@Variant(\0\0\0\x1a\0\0\0\0\0\0\0\0@\x14\0\0\0\0\0\0) +Z_point2=@Variant(\0\0\0\x1a@<\0\0\0\0\0\0@3\0\0\0\0\0\0) +Z_point3=@Variant(\0\0\0\x1a@N\x80\0\0\0\0\0@D\0\0\0\0\0\0) +Z_point4=@Variant(\0\0\0\x1a@Y\x80\0\0\0\0\0@I\0\0\0\0\0\0) + +[TrackerSource] +Selection=0 + +[KB_Shortcuts] +Keycode_Center=199 +Shift_Center=false +Ctrl_Center=false +Alt_Center=false +Keycode_StartStop=207 +Shift_StartStop=false +Ctrl_StartStop=false +Alt_StartStop=false +SetZero=false +SetEngineStop=false +Keycode_Inhibit=0 +Shift_Inhibit=false +Ctrl_Inhibit=false +Alt_Inhibit=false +Inhibit_Pitch=false +Inhibit_Yaw=false +Inhibit_Roll=false +Inhibit_X=false +Inhibit_Y=false +Inhibit_Z=false diff --git a/bin/Settings/SimConnect.ini b/bin/Settings/SimConnect.ini index 95b6202b..b8d1db51 100644 --- a/bin/Settings/SimConnect.ini +++ b/bin/Settings/SimConnect.ini @@ -1,5 +1,5 @@ [Tracking] -Smooth=4 +Smooth=10 invertYaw=false invertPitch=false invertRoll=false @@ -13,7 +13,7 @@ redRoll=90 redX=90 redY=90 redZ=90 -minSmooth=10 +minSmooth=20 powCurve=12 maxSmooth=70 @@ -58,7 +58,7 @@ Keycode_StartStop=207 Shift_StartStop=false Ctrl_StartStop=false Alt_StartStop=false -SetZero=true +SetZero=false Keycode_Inhibit=0 Shift_Inhibit=false Ctrl_Inhibit=false @@ -69,7 +69,7 @@ Inhibit_Roll=false Inhibit_X=false Inhibit_Y=false Inhibit_Z=false -SetEngineStop=true +SetEngineStop=false [FTN] LocalPCOnly=true diff --git a/bin/Settings/Wings of Prey.ini b/bin/Settings/Wings of Prey.ini index 742e3ec4..6e34cb00 100644 --- a/bin/Settings/Wings of Prey.ini +++ b/bin/Settings/Wings of Prey.ini @@ -1,5 +1,5 @@ [Tracking] -Smooth=3 +Smooth=7 NeutralZone=5 sensYaw=200 sensPitch=200 @@ -20,9 +20,9 @@ redRoll=60 redX=50 redY=50 redZ=50 -minSmooth=10 -powCurve=2 -maxSmooth=50 +minSmooth=20 +powCurve=10 +maxSmooth=70 [GameProtocol] Selection=4 diff --git a/bin/image6.0.dll b/bin/image6.0.dll index 17a1e7b4..5024bd10 100644 Binary files a/bin/image6.0.dll and b/bin/image6.0.dll differ -- cgit v1.2.3