summaryrefslogtreecommitdiffhomepage
path: root/ftnoir_protocol_ft
diff options
context:
space:
mode:
Diffstat (limited to 'ftnoir_protocol_ft')
-rw-r--r--ftnoir_protocol_ft/FTNoIR_FTcontrols.ui437
-rw-r--r--ftnoir_protocol_ft/FTNoIR_Protocol_FT.cpp513
-rw-r--r--ftnoir_protocol_ft/FTNoIR_Protocol_FT.h143
-rw-r--r--ftnoir_protocol_ft/FTNoIR_Protocol_FT_vc8.vcproj393
-rw-r--r--ftnoir_protocol_ft/FTNoIR_Protocol_FT_vc9.vcproj385
-rw-r--r--ftnoir_protocol_ft/FTTypes.h104
-rw-r--r--ftnoir_protocol_ft/Protocol.qrc5
-rw-r--r--ftnoir_protocol_ft/csv.cpp99
-rw-r--r--ftnoir_protocol_ft/csv.h38
-rw-r--r--ftnoir_protocol_ft/ftnoir_protocol_FT_dialog.cpp235
-rw-r--r--ftnoir_protocol_ft/ftnoir_protocol_FT_dll.cpp56
-rw-r--r--ftnoir_protocol_ft/images/Freetrack.icobin0 -> 17542 bytes
12 files changed, 2408 insertions, 0 deletions
diff --git a/ftnoir_protocol_ft/FTNoIR_FTcontrols.ui b/ftnoir_protocol_ft/FTNoIR_FTcontrols.ui
new file mode 100644
index 00000000..fc5abbcf
--- /dev/null
+++ b/ftnoir_protocol_ft/FTNoIR_FTcontrols.ui
@@ -0,0 +1,437 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>UICFTControls</class>
+ <widget class="QWidget" name="UICFTControls">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>645</width>
+ <height>416</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>645</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="windowTitle">
+ <string>FreeTrack 2.0 settings FaceTrackNoIR</string>
+ </property>
+ <property name="windowIcon">
+ <iconset>
+ <normaloff>images/FaceTrackNoIR.ico</normaloff>images/FaceTrackNoIR.ico</iconset>
+ </property>
+ <property name="layoutDirection">
+ <enum>Qt::LeftToRight</enum>
+ </property>
+ <property name="autoFillBackground">
+ <bool>false</bool>
+ </property>
+ <layout class="QVBoxLayout" name="_vertical_layout">
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="QGroupBox" name="groupBox">
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>70</height>
+ </size>
+ </property>
+ <property name="title">
+ <string>TIRViews</string>
+ </property>
+ <widget class="QCheckBox" name="chkTIRViews">
+ <property name="geometry">
+ <rect>
+ <x>80</x>
+ <y>30</y>
+ <width>88</width>
+ <height>17</height>
+ </rect>
+ </property>
+ <property name="layoutDirection">
+ <enum>Qt::RightToLeft</enum>
+ </property>
+ <property name="text">
+ <string>Use TIRViews</string>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_4">
+ <property name="geometry">
+ <rect>
+ <x>189</x>
+ <y>10</y>
+ <width>421</width>
+ <height>16</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>TIRViews is only required for some older games (like CFS3). For it to work, TIRViews.dll</string>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_5">
+ <property name="geometry">
+ <rect>
+ <x>189</x>
+ <y>30</y>
+ <width>421</width>
+ <height>16</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>must be placed in the FaceTrackNoIR program folder. If the checkbox is disabled, the</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_6">
+ <property name="geometry">
+ <rect>
+ <x>189</x>
+ <y>50</y>
+ <width>411</width>
+ <height>16</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>the DLL was not found. You can get it from NaturalPoint.</string>
+ </property>
+ </widget>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox_2">
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>70</height>
+ </size>
+ </property>
+ <property name="title">
+ <string>TrackIR.exe</string>
+ </property>
+ <widget class="QCheckBox" name="chkStartDummy">
+ <property name="geometry">
+ <rect>
+ <x>20</x>
+ <y>30</y>
+ <width>145</width>
+ <height>17</height>
+ </rect>
+ </property>
+ <property name="layoutDirection">
+ <enum>Qt::RightToLeft</enum>
+ </property>
+ <property name="text">
+ <string>Start dummy TrackIR.exe</string>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_3">
+ <property name="geometry">
+ <rect>
+ <x>189</x>
+ <y>10</y>
+ <width>351</width>
+ <height>16</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Some programs check, to see if a process called TrackIR.exe is running,</string>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label">
+ <property name="geometry">
+ <rect>
+ <x>189</x>
+ <y>30</y>
+ <width>261</width>
+ <height>16</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>before enabling head-tracking (EZCA is one of them).</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_7">
+ <property name="geometry">
+ <rect>
+ <x>189</x>
+ <y>50</y>
+ <width>231</width>
+ <height>16</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Check the checkbox, to overcome this problem.</string>
+ </property>
+ </widget>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox_3">
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>70</height>
+ </size>
+ </property>
+ <property name="title">
+ <string>Select interface</string>
+ </property>
+ <widget class="QLabel" name="label_8">
+ <property name="geometry">
+ <rect>
+ <x>189</x>
+ <y>10</y>
+ <width>351</width>
+ <height>16</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Some games support both FreeTrack and TrackIR and may get confused,</string>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_2">
+ <property name="geometry">
+ <rect>
+ <x>189</x>
+ <y>30</y>
+ <width>261</width>
+ <height>16</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>when both interfaces are visible.</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_9">
+ <property name="geometry">
+ <rect>
+ <x>189</x>
+ <y>50</y>
+ <width>381</width>
+ <height>16</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Try to disable one interface, if you experience problems.</string>
+ </property>
+ </widget>
+ <widget class="QComboBox" name="cbxSelectInterface">
+ <property name="geometry">
+ <rect>
+ <x>6</x>
+ <y>30</y>
+ <width>168</width>
+ <height>22</height>
+ </rect>
+ </property>
+ </widget>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox_4">
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>70</height>
+ </size>
+ </property>
+ <property name="title">
+ <string>Repair NPClient location</string>
+ </property>
+ <widget class="QLabel" name="label_10">
+ <property name="geometry">
+ <rect>
+ <x>188</x>
+ <y>10</y>
+ <width>381</width>
+ <height>20</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Users who use other software with an NPClient DLL (like TrackIR, FreeTrack or </string>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_11">
+ <property name="geometry">
+ <rect>
+ <x>184</x>
+ <y>30</y>
+ <width>411</width>
+ <height>20</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string> GlovePIE) may need to repair the location of the DLL, after running FaceTrackNoIR.</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_12">
+ <property name="geometry">
+ <rect>
+ <x>187</x>
+ <y>50</y>
+ <width>391</width>
+ <height>20</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Use this button to locate the desired NPClient DLL.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" name="bntLocateNPClient">
+ <property name="geometry">
+ <rect>
+ <x>4</x>
+ <y>30</y>
+ <width>171</width>
+ <height>23</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Locate DLL</string>
+ </property>
+ </widget>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <property name="sizeConstraint">
+ <enum>QLayout::SetDefaultConstraint</enum>
+ </property>
+ <item>
+ <widget class="QPushButton" name="btnOK">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>100</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>OK</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnCancel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>100</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>10</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+ <slots>
+ <slot>startEngineClicked()</slot>
+ <slot>stopEngineClicked()</slot>
+ <slot>cameraSettingsClicked()</slot>
+ </slots>
+</ui>
diff --git a/ftnoir_protocol_ft/FTNoIR_Protocol_FT.cpp b/ftnoir_protocol_ft/FTNoIR_Protocol_FT.cpp
new file mode 100644
index 00000000..b8461993
--- /dev/null
+++ b/ftnoir_protocol_ft/FTNoIR_Protocol_FT.cpp
@@ -0,0 +1,513 @@
+/********************************************************************************
+* 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) 2013 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 <http://www.gnu.org/licenses/>. *
+* *
+* FTServer FTServer is the Class, that communicates headpose-data *
+* to games, using the FreeTrackClient.dll. *
+********************************************************************************/
+/*
+ Modifications (last one on top):
+ 20130209 - WVR: Some games support both interfaces and cause trouble. Added ComboBox to fix this (hide one interface
+ by clearing the appropriate Registry-setting).
+ 20130203 - WVR: Added Tirviews and dummy checkboxes to the Settings dialog. This is necessary for CFS3 etc.
+ 20130125 - WVR: Upgraded to FT2.0: now the FreeTrack protocol supports all TIR-enabled games.
+ 20110401 - WVR: Moved protocol to a DLL, convenient for installation etc.
+ 20101224 - WVR: Base class is no longer inheriting QThread. sendHeadposeToGame
+ is called from run() of Tracker.cpp
+ 20100601 - WVR: Added Mutex-bit in run(). Thought it wasn't so important (still do...).
+ 20100523 - WVR: Implemented the Freetrack-protocol just like Freetrack does. Earlier
+ FaceTrackNoIR only worked with an adapted DLL, with a putdata function.
+ Now it works direcly in shared memory!
+*/
+#include "ftnoir_protocol_ft.h"
+#include "csv.h"
+
+/** constructor **/
+FTNoIR_Protocol::FTNoIR_Protocol()
+{
+ comhandle = 0;
+ useTIRViews = false;
+ useDummyExe = false;
+ intUsedInterface = 0;
+
+ //
+ // Load the INI-settings.
+ //
+ loadSettings();
+
+ ProgramName = "";
+ intGameID = 0;
+
+ dummyTrackIR = 0;
+ viewsStart = 0;
+ viewsStop = 0;
+
+}
+
+/** destructor **/
+FTNoIR_Protocol::~FTNoIR_Protocol()
+{
+
+ qDebug()<< "~FTNoIR_Protocol: Destructor started.";
+
+ //
+ // Stop if started
+ //
+ if (viewsStop != NULL) {
+ qDebug()<< "~FTNoIR_Protocol: Stopping TIRViews.";
+ viewsStop();
+ FTIRViewsLib.unload();
+ }
+
+ //
+ // Kill the dummy TrackIR process.
+ //
+ qDebug() << "~FTNoIR_Protocol() about to kill TrackIR.exe process";
+ try {
+ if (dummyTrackIR) {
+ qDebug() << "FTServer::~FTServer() about to kill TrackIR.exe process";
+// dummyTrackIR->close();
+ dummyTrackIR->kill();
+ }
+ }
+ catch (...)
+ {
+ qDebug() << "~FTServer says: some error occurred";
+ }
+
+ //
+ // Destroy the File-mapping
+ //
+ FTDestroyMapping();
+}
+
+void FTNoIR_Protocol::Initialize()
+{
+ return;
+}
+
+//
+// Read the game-data from CSV
+//
+bool FTNoIR_Protocol::getGameData( QString gameID ){
+QStringList gameLine;
+
+ qDebug() << "getGameData, ID = " << gameID;
+
+ //
+ // Open the supported games list, to get the Name.
+ //
+ QFile file(QCoreApplication::applicationDirPath() + "/Settings/FaceTrackNoIR Supported Games.csv");
+ if (!file.open(QIODevice::ReadOnly | QIODevice::Text)){
+ QString strError( "Cannot load file: FaceTrackNoIR Supported Games.csv" );
+ sprintf_s(pMemData->ProgramName, 99, strError.toAscii());
+ sprintf_s(pMemData->FTNVERSION, 9, "V160");
+
+ //
+ // Return true anyway, because maybe it's V160 compatible.
+ //
+ return true;
+ }
+ CSV csv(&file);
+ gameLine = csv.parseLine();
+
+ while (gameLine.count() > 2) {
+ //qDebug() << "Column 0: " << gameLine.at(0); // No.
+ //qDebug() << "Column 1: " << gameLine.at(1); // Game Name
+ //qDebug() << "Column 2: " << gameLine.at(2); // Game Protocol
+ //qDebug() << "Column 3: " << gameLine.at(3); // Supported since version
+ //qDebug() << "Column 4: " << gameLine.at(4); // Verified
+ //qDebug() << "Column 5: " << gameLine.at(5); // By
+ //qDebug() << "Column 6: " << gameLine.at(6); // International ID
+ //qDebug() << "Column 7: " << gameLine.at(7); // FaceTrackNoIR ID
+
+ //
+ // If the gameID was found, fill the shared memory
+ //
+ if (gameLine.count() > 6) {
+ if (gameLine.at(6).compare( gameID, Qt::CaseInsensitive ) == 0) {
+ if (pMemData != NULL) {
+ sprintf_s(pMemData->ProgramName, 99, gameLine.at(1).toAscii());
+ sprintf_s(pMemData->FTNVERSION, 9, gameLine.at(3).toAscii());
+ sprintf_s(pMemData->FTNID, 24, gameLine.at(7).toAscii());
+ }
+ file.close();
+ return true;
+ }
+ }
+
+ gameLine = csv.parseLine();
+ }
+
+ //
+ // If the gameID was NOT found, fill only the name "Unknown game connected"
+ //
+ QString strUnknown("Unknown game connected (ID = " + gameID + ")");
+ sprintf_s(pMemData->ProgramName, 99, strUnknown.toAscii());
+ file.close();
+ return true;
+}
+
+//
+// Load the current Settings from the currently 'active' INI-file.
+//
+void FTNoIR_Protocol::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 ( "FT" );
+ intUsedInterface = iniFile.value ( "UsedInterface", 0 ).toInt();
+ iniFile.endGroup ();
+
+ //
+ // Use the settings-section from the deprecated fake-TIR protocol, as they are most likely to be found there.
+ //
+ iniFile.beginGroup ( "FTIR" );
+ useTIRViews = iniFile.value ( "useTIRViews", 0 ).toBool();
+ useDummyExe = iniFile.value ( "useDummyExe", 1 ).toBool();
+ iniFile.endGroup ();
+}
+
+//
+// Update Headpose in Game.
+//
+void FTNoIR_Protocol::sendHeadposeToGame( THeadPoseData *headpose, THeadPoseData *rawheadpose ) {
+float virtPosX;
+float virtPosY;
+float virtPosZ;
+
+float virtRotX;
+float virtRotY;
+float virtRotZ;
+
+float headPosX;
+float headPosY;
+float headPosZ;
+
+float headRotX;
+float headRotY;
+float headRotZ;
+
+PDWORD_PTR MsgResult = 0;
+
+
+ //
+ // Scale the Raw measurements to the client measurements.
+ //
+ headRotX = getRadsFromDegrees(headpose->pitch);
+ headRotY = getRadsFromDegrees(headpose->yaw);
+ headRotZ = getRadsFromDegrees(headpose->roll);
+ headPosX = headpose->x * 10;
+ headPosY = headpose->y * 10;
+ headPosZ = headpose->z * 10;
+
+ virtRotX = getRadsFromDegrees(headpose->pitch);
+ virtRotY = getRadsFromDegrees(headpose->yaw);
+ virtRotZ = getRadsFromDegrees(headpose->roll);
+ virtPosX = headpose->x * 10;
+ virtPosY = headpose->y * 10;
+ virtPosZ = headpose->z * 10;
+
+ //
+ // Check if the pointer is OK and wait for the Mutex.
+ //
+ if ( (pMemData != NULL) && (WaitForSingleObject(hFTMutex, 100) == WAIT_OBJECT_0) ) {
+
+ //
+ // Copy the Raw measurements directly to the client.
+ //
+ pMemData->data.RawX = headPosX;
+ pMemData->data.RawY = headPosY;
+ pMemData->data.RawZ = headPosZ;
+ pMemData->data.RawPitch = headRotX;
+ pMemData->data.RawYaw = headRotY;
+ pMemData->data.RawRoll = headRotZ;
+
+ //
+ //
+ pMemData->data.X = virtPosX;
+ pMemData->data.Y = virtPosY;
+ pMemData->data.Z = virtPosZ;
+ pMemData->data.Pitch = virtRotX;
+ pMemData->data.Yaw = virtRotY;
+ pMemData->data.Roll = virtRotZ;
+
+ //
+ // Leave some values 0 yet...
+ //
+ pMemData->data.X1 = pMemData->data.DataID + 10;
+ pMemData->data.X2 = 0;
+ pMemData->data.X3 = 0;
+ pMemData->data.X4 = 0;
+ pMemData->data.Y1 = 0;
+ pMemData->data.Y2 = 0;
+ pMemData->data.Y3 = 0;
+ pMemData->data.Y4 = 0;
+
+ //
+ // Check if the handle that was sent to the Game, was changed (on x64, this will be done by the ED-API)
+ // If the "Report Program Name" command arrives (which is a '1', for now), raise the event from here!
+ //
+ if (hMainWindow != pMemData->handle) { // Handle in memory-mapping was changed!
+ comhandle = (__int32) pMemData->handle; // Get the command from the Game.
+ if (comhandle == 1) { // "Report Program Name"
+ SendMessageTimeout( (HWND) hMainWindow, RegisterWindowMessageA(FT_PROGRAMID), 0, 0, 0, 2000, MsgResult);
+ pMemData->handle = 0; // Reset the command, to enable future commands...
+ }
+ }
+
+ //
+ // The game-ID was changed?
+ //
+ QString gameID = QString(pMemData->GameID);
+ //QString gameID = QString("9999");
+
+// qDebug() << "sendHeadposeToGame: gameID = " << gameID;
+ if (gameID.length() > 0) {
+ if ( gameID.toInt() != intGameID ) {
+ if (getGameData( gameID ) ) {
+ SendMessageTimeout( (HWND) hMainWindow, RegisterWindowMessageA(FT_PROGRAMID), 0, 0, 0, 2000, MsgResult);
+ }
+ intGameID = gameID.toInt();
+ }
+ }
+ else {
+ intGameID = 0;
+ pMemData->ProgramName[0] = NULL;
+ pMemData->FTNID[0] = NULL;
+ pMemData->FTNVERSION[0] = NULL;
+ }
+
+ ReleaseMutex(hFTMutex);
+ }
+
+ pMemData->data.DataID += 1;
+}
+
+//
+// Set the Path variables and load the memory-mapping.
+// Simplified function: No need to check if the DLL's actually exist. The are installed by the installer.
+// If they are absent, something went terribly wrong anyway...
+//
+// Returns 'true' if all seems OK.
+//
+//
+bool FTNoIR_Protocol::checkServerInstallationOK( HANDLE handle )
+{
+ QSettings settings("Freetrack", "FreetrackClient"); // Registry settings (in HK_USER)
+ QSettings settingsTIR("NaturalPoint", "NATURALPOINT\\NPClient Location"); // Registry settings (in HK_USER)
+ QString aLocation; // Location of Client DLL
+
+ qDebug() << "checkServerInstallationOK says: Starting Function";
+
+ try {
+
+ //
+ // Write the path in the registry (for FreeTrack and FreeTrack20), for the game(s).
+ //
+ aLocation = QCoreApplication::applicationDirPath() + "/";
+
+ qDebug() << "checkServerInstallationOK says: used interface = " << intUsedInterface;
+ switch (intUsedInterface) {
+ case 0: // Use both interfaces
+ settings.setValue( "Path" , aLocation );
+ settingsTIR.setValue( "Path" , aLocation );
+ break;
+ case 1: // Use FreeTrack, disable TrackIR
+ settings.setValue( "Path" , aLocation );
+ settingsTIR.setValue( "Path" , "" );
+ break;
+ case 2: // Use TrackIR, disable FreeTrack
+ settings.setValue( "Path" , "" );
+ settingsTIR.setValue( "Path" , aLocation );
+ break;
+ default:
+ // should never be reached
+ break;
+ }
+
+ //
+ // TIRViews must be started first, or the NPClient DLL will never be loaded.
+ //
+ if (useTIRViews) {
+
+ QString aFileName = QCoreApplication::applicationDirPath() + "/TIRViews.dll";
+ if ( QFile::exists( aFileName ) ) {
+
+ FTIRViewsLib.setFileName(aFileName);
+ FTIRViewsLib.load();
+
+ viewsStart = (importTIRViewsStart) FTIRViewsLib.resolve("TIRViewsStart");
+ if (viewsStart == NULL) {
+ qDebug() << "FTServer::run() says: TIRViewsStart function not found in DLL!";
+ }
+ else {
+ qDebug() << "FTServer::run() says: TIRViewsStart executed!";
+ viewsStart();
+ }
+
+ //
+ // Load the Stop function from TIRViews.dll. Call it when terminating the thread.
+ //
+ viewsStop = (importTIRViewsStop) FTIRViewsLib.resolve("TIRViewsStop");
+ if (viewsStop == NULL) {
+ qDebug() << "FTServer::run() says: TIRViewsStop function not found in DLL!";
+ }
+ }
+ }
+
+ //
+ // Check if TIRViews or dummy TrackIR.exe is required for this game
+ //
+ if (useDummyExe) {
+ QString program = QCoreApplication::applicationDirPath() + "/TrackIR.exe";
+ dummyTrackIR = new QProcess();
+ dummyTrackIR->start(program);
+
+ qDebug() << "FTServer::run() says: TrackIR.exe executed!";
+ }
+
+
+ } catch(...) {
+ settings.~QSettings();
+ }
+ return FTCreateMapping( handle );
+}
+
+//
+// Create a memory-mapping to the FreeTrack data.
+// It contains the tracking data, a handle to the main-window and the program-name of the Game!
+//
+//
+bool FTNoIR_Protocol::FTCreateMapping( HANDLE handle )
+{
+bool bFirst = false;
+
+ qDebug() << "FTCreateMapping says: Starting Function";
+
+ //
+ // A FileMapping is used to create 'shared memory' between the FTServer and the FTClient.
+ //
+ // Try to create a FileMapping to the Shared Memory.
+ // If one already exists: close it.
+ //
+ hFTMemMap = CreateFileMappingA( INVALID_HANDLE_VALUE , 00 , PAGE_READWRITE , 0 ,
+// sizeof( TFreeTrackData ) + sizeof( HANDLE ) + 100,
+ sizeof( FTMemMap ),
+ (LPCSTR) FT_MM_DATA );
+
+ if ( hFTMemMap != 0 ) {
+ bFirst = true;
+ qDebug() << "FTCreateMapping says: FileMapping Created!" << hFTMemMap;
+ }
+
+ if ( ( hFTMemMap != 0 ) && ( (long) GetLastError == ERROR_ALREADY_EXISTS ) ) {
+ bFirst = false;
+ qDebug() << "FTCreateMapping says: FileMapping already exists!" << hFTMemMap;
+ CloseHandle( hFTMemMap );
+ hFTMemMap = 0;
+ }
+
+ //
+ // Create a new FileMapping, Read/Write access
+ //
+ hFTMemMap = OpenFileMappingA( FILE_MAP_ALL_ACCESS , false , (LPCSTR) FT_MM_DATA );
+ if ( ( hFTMemMap != 0 ) ) {
+ qDebug() << "FTCreateMapping says: FileMapping Opened:" << hFTMemMap;
+ pMemData = (FTMemMap *) MapViewOfFile(hFTMemMap, FILE_MAP_ALL_ACCESS, 0, 0,
+// sizeof(TFreeTrackData) + sizeof(hFTMemMap) + 100);
+ sizeof(FTMemMap));
+ if (pMemData != NULL) {
+ if (bFirst) {
+ memset(pMemData, 0, sizeof(FTMemMap)); // Write zero's, if first...
+ }
+ pMemData->handle = handle; // The game uses the handle, to send a message that the Program-Name was set!
+ hMainWindow = handle;
+ }
+ hFTMutex = CreateMutexA(NULL, false, FREETRACK_MUTEX);
+ }
+ else {
+ QMessageBox::information(0, "FaceTrackNoIR error", QString("FTServer Error! \n"));
+ return false;
+ }
+
+ if (pMemData != NULL) {
+ pMemData->data.DataID = 1;
+ pMemData->data.CamWidth = 100;
+ pMemData->data.CamHeight = 250;
+ }
+
+ return true;
+}
+
+//
+// Destory the FileMapping to the shared memory
+//
+void FTNoIR_Protocol::FTDestroyMapping()
+{
+ if ( pMemData != NULL ) {
+ UnmapViewOfFile ( pMemData );
+ }
+
+ CloseHandle( hFTMutex );
+ CloseHandle( hFTMemMap );
+ hFTMemMap = 0;
+
+}
+
+//
+// Return a name, if present the name from the Game, that is connected...
+//
+void FTNoIR_Protocol::getNameFromGame( char *dest )
+{
+ sprintf_s(dest, 99, "FreeTrack interface");
+
+ qDebug() << "FTNoIR_Protocol::getNameFromGame says: Started, pMemData = " << pMemData << ", mutex = " << hFTMutex;
+
+ //
+ // Check if the pointer is OK and wait for the Mutex.
+ //
+// if ( (pMemData != NULL) && (WaitForSingleObject(hFTMutex, 100) == WAIT_OBJECT_0) ) {
+ if (pMemData != NULL) {
+ qDebug() << "FTNoIR_Protocol::getNameFromGame says: Inside MemData";
+ sprintf_s(dest, 99, "%s", pMemData->ProgramName);
+ }
+
+ return;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Factory function that creates instances if the Protocol object.
+
+// Export both decorated and undecorated names.
+// GetProtocol - Undecorated name, which can be easily used with GetProcAddress
+// Win32 API function.
+// _GetProtocol@0 - Common name decoration for __stdcall functions in C language.
+#pragma comment(linker, "/export:GetProtocol=_GetProtocol@0")
+
+FTNOIR_PROTOCOL_BASE_EXPORT IProtocolPtr __stdcall GetProtocol()
+{
+ return new FTNoIR_Protocol;
+}
diff --git a/ftnoir_protocol_ft/FTNoIR_Protocol_FT.h b/ftnoir_protocol_ft/FTNoIR_Protocol_FT.h
new file mode 100644
index 00000000..c82c3e79
--- /dev/null
+++ b/ftnoir_protocol_ft/FTNoIR_Protocol_FT.h
@@ -0,0 +1,143 @@
+/********************************************************************************
+* FaceTrackNoIR This program is a private project of 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 <http://www.gnu.org/licenses/>. *
+* *
+* FTServer FTServer is the Class, that communicates headpose-data *
+* to games, using the FreeTrackClient.dll. *
+********************************************************************************/
+#pragma once
+#ifndef INCLUDED_FTSERVER_H
+#define INCLUDED_FTSERVER_H
+
+#include "..\ftnoir_protocol_base\ftnoir_protocol_base.h"
+#include "ui_FTNoIR_FTcontrols.h"
+#include "FTTypes.h"
+#include <QMessageBox>
+#include <QSettings>
+#include <QLibrary>
+#include <QProcess>
+#include <QDebug>
+#include <QFile>
+#include "Windows.h"
+//#include "math.h"
+
+//typedef char *(WINAPI *importProvider)(void);
+typedef void (WINAPI *importTIRViewsStart)(void);
+typedef void (WINAPI *importTIRViewsStop)(void);
+
+class FTNoIR_Protocol : public IProtocol
+{
+public:
+ FTNoIR_Protocol();
+ ~FTNoIR_Protocol();
+
+ void Release();
+ void Initialize();
+
+ bool checkServerInstallationOK( HANDLE handle );
+ void sendHeadposeToGame( THeadPoseData *headpose, THeadPoseData *rawheadpose );
+ void getNameFromGame( char *dest ); // Take care dest can handle up to 100 chars...
+
+private:
+ bool FTCreateMapping(HANDLE handle);
+ void FTDestroyMapping();
+
+ importTIRViewsStart viewsStart; // Functions inside TIRViews.dll
+ importTIRViewsStop viewsStop;
+
+ HANDLE hFTMemMap;
+ FTMemMap *pMemData;
+ HANDLE hFTMutex;
+
+ HANDLE hMainWindow; // Save the handle to FaceTrackNoIR main-window
+ __int32 comhandle; // Handle on x32, command on x64
+
+ // Private properties
+ QString ProgramName;
+ QLibrary FTIRViewsLib;
+ QProcess *dummyTrackIR;
+ int intGameID;
+ int intUsedInterface; // Determine which interface to use (or to hide from the game)
+ bool useTIRViews; // Needs to be in the Settings dialog
+ bool useDummyExe;
+
+ float getRadsFromDegrees ( float degrees ) { return (degrees * 0.017453f); }
+ bool getGameData( QString gameID );
+ void loadSettings();
+
+};
+
+// Widget that has controls for FTNoIR protocol client-settings.
+class FTControls: public QWidget, Ui::UICFTControls, public IProtocolDialog
+{
+ Q_OBJECT
+public:
+
+ explicit FTControls();
+ virtual ~FTControls();
+ void showEvent ( QShowEvent * event );
+
+ void Release(); // Member functions which are accessible from outside the DLL
+ void Initialize(QWidget *parent);
+ void registerProtocol(IProtocol *protocol) {
+ theProtocol = (FTNoIR_Protocol *) protocol; // Accept the pointer to the Protocol
+ };
+ void unRegisterProtocol() {
+ theProtocol = NULL; // Reset the pointer
+ };
+
+private:
+ Ui::UICFTControls ui;
+ void loadSettings();
+ void save();
+
+ /** helper **/
+ bool settingsDirty;
+ FTNoIR_Protocol *theProtocol;
+
+private slots:
+ void selectDLL();
+ void doOK();
+ void doCancel();
+ void settingChanged() { settingsDirty = true; };
+ void settingChanged(int) { settingsDirty = true; };
+};
+
+//*******************************************************************************************************
+// FaceTrackNoIR Protocol DLL. Functions used to get general info on the Protocol
+//*******************************************************************************************************
+class FTNoIR_ProtocolDll : public IProtocolDll
+{
+public:
+ FTNoIR_ProtocolDll();
+ ~FTNoIR_ProtocolDll();
+
+ void getFullName(QString *strToBeFilled) { *strToBeFilled = QString("FreeTrack 2.0"); };
+ void getShortName(QString *strToBeFilled) { *strToBeFilled = QString("FreeTrack 2.0"); };
+ void getDescription(QString *strToBeFilled) { *strToBeFilled = QString("Enhanced FreeTrack protocol"); };
+
+ void getIcon(QIcon *icon) { *icon = QIcon(":/images/Freetrack.ico"); };
+};
+
+
+#endif//INCLUDED_FTSERVER_H
+//END
diff --git a/ftnoir_protocol_ft/FTNoIR_Protocol_FT_vc8.vcproj b/ftnoir_protocol_ft/FTNoIR_Protocol_FT_vc8.vcproj
new file mode 100644
index 00000000..f8f80412
--- /dev/null
+++ b/ftnoir_protocol_ft/FTNoIR_Protocol_FT_vc8.vcproj
@@ -0,0 +1,393 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="FTNoIR_Protocol_FT"
+ ProjectGUID="{FE2FF09B-207D-468C-9763-23861956F388}"
+ RootNamespace="FTNoIR_Protocol_FT"
+ Keyword="Qt4VSv1.0"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)/bin"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ InlineFunctionExpansion="0"
+ EnableIntrinsicFunctions="true"
+ FavorSizeOrSpeed="1"
+ AdditionalIncludeDirectories=".\GeneratedFiles;&quot;$(QTDIR)\include&quot;;&quot;.\GeneratedFiles\$(ConfigurationName)&quot;;&quot;$(QTDIR)\include\qtmain&quot;;&quot;$(QTDIR)\include\QtCore&quot;;&quot;$(QTDIR)\include\QtNetwork&quot;;&quot;$(QTDIR)\include\QtGui&quot;;.\"
+ PreprocessorDefinitions="UNICODE;WIN32;QT_LARGEFILE_SUPPORT;QT_THREAD_SUPPORT;QT_NO_DEBUG;NDEBUG;QT_CORE_LIB;FTNOIR_PROTOCOL_BASE_LIB;QT_DLL"
+ RuntimeLibrary="2"
+ FloatingPointModel="0"
+ TreatWChar_tAsBuiltInType="false"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="qtmain.lib QtCore4.lib QtGui4.lib"
+ OutputFile="$(OutDir)\$(ProjectName).dll"
+ AdditionalLibraryDirectories="$(QTDIR)\lib"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="1"
+ EnableCOMDATFolding="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)/bin_dbg"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories=".\GeneratedFiles;&quot;$(QTDIR)\include&quot;;&quot;.\GeneratedFiles\$(ConfigurationName)&quot;;&quot;$(QTDIR)\include\qtmain&quot;;&quot;$(QTDIR)\include\QtCore&quot;;&quot;$(QTDIR)\include\QtNetwork&quot;;&quot;$(QTDIR)\include\QtGui&quot;;.\"
+ PreprocessorDefinitions="UNICODE;WIN32;QT_LARGEFILE_SUPPORT;QT_THREAD_SUPPORT;QT_CORE_LIB;FTNOIR_PROTOCOL_BASE_LIB;QT_DLL"
+ RuntimeLibrary="3"
+ TreatWChar_tAsBuiltInType="false"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="qtmaind.lib QtCored4.lib QtGuid4.lib"
+ OutputFile="$(OutDir)\$(ProjectName).dll"
+ AdditionalLibraryDirectories="$(QTDIR)\lib"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;cxx;c;def"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath=".\ftnoir_Protocol_FT.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\ftnoir_protocol_FT_dialog.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\ftnoir_protocol_FT_dll.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\FTNoIR_Protocol_Base\ftnoir_protocol_base.h"
+ >
+ </File>
+ <File
+ RelativePath="..\FTNoIR_Protocol_Base\ftnoir_protocol_base_global.h"
+ >
+ </File>
+ <File
+ RelativePath=".\FTNoIR_Protocol_FT.h"
+ >
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Moc&apos;ing $(InputFileName)..."
+ CommandLine="&quot;$(QTDIR)\bin\moc.exe&quot; -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_THREAD_SUPPORT -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DFTNOIR_PROTOCOL_BASE_LIB -DQT_DLL -D_WINDLL -I&quot;.\GeneratedFiles\.&quot; -I&quot;$(QTDIR)\include\.&quot; -I&quot;.\GeneratedFiles\$(ConfigurationName)\.&quot; -I&quot;$(QTDIR)\include\qtmain\.&quot; -I&quot;$(QTDIR)\include\QtCore\.&quot; -I&quot;$(QTDIR)\include\QtNetwork\.&quot; -I&quot;$(QTDIR)\include\QtGui\.&quot; -I&quot;.\.&quot; &quot;.\FTNoIR_Protocol_FT.h&quot; -o &quot;.\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp&quot;&#x0D;&#x0A;"
+ AdditionalDependencies="&quot;$(QTDIR)\bin\moc.exe&quot;;$(InputPath)"
+ Outputs="&quot;.\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp&quot;"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Moc&apos;ing $(InputFileName)..."
+ CommandLine="&quot;$(QTDIR)\bin\moc.exe&quot; &quot;$(InputPath)&quot; -o &quot;.\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp&quot; -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_THREAD_SUPPORT -DQT_CORE_LIB -DFTNOIR_PROTOCOL_BASE_LIB -DQT_DLL -D_WINDLL &quot;-I.\GeneratedFiles&quot; &quot;-I$(QTDIR)\include&quot; &quot;-I.\GeneratedFiles\$(ConfigurationName)\.&quot; &quot;-I$(QTDIR)\include\qtmain&quot; &quot;-I$(QTDIR)\include\QtCore&quot; &quot;-I$(QTDIR)\include\QtNetwork&quot; &quot;-I$(QTDIR)\include\QtGui&quot; &quot;-I.&quot;&#x0D;&#x0A;"
+ AdditionalDependencies="&quot;$(QTDIR)\bin\moc.exe&quot;;$(InputPath)"
+ Outputs="&quot;.\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp&quot;"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\FTTypes.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Form Files"
+ Filter="ui"
+ UniqueIdentifier="{99349809-55BA-4b9d-BF79-8FDBB0286EB3}"
+ >
+ <File
+ RelativePath=".\FTNoIR_FTcontrols.ui"
+ >
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Uic&apos;ing $(InputFileName)..."
+ CommandLine="&quot;$(QTDIR)\bin\uic.exe&quot; -o &quot;.\GeneratedFiles\ui_$(InputName).h&quot; &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+ AdditionalDependencies="$(QTDIR)\bin\uic.exe"
+ Outputs="&quot;.\GeneratedFiles\ui_$(InputName).h&quot;"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Uic&apos;ing $(InputFileName)..."
+ CommandLine="&quot;$(QTDIR)\bin\uic.exe&quot; -o &quot;.\GeneratedFiles\ui_$(InputName).h&quot; &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+ AdditionalDependencies="$(QTDIR)\bin\uic.exe"
+ Outputs="&quot;.\GeneratedFiles\ui_$(InputName).h&quot;"
+ />
+ </FileConfiguration>
+ </File>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="qrc;*"
+ UniqueIdentifier="{D9D6E242-F8AF-46E4-B9FD-80ECBC20BA3E}"
+ ParseFiles="false"
+ >
+ <File
+ RelativePath=".\Protocol.qrc"
+ >
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Rcc&apos;ing $(InputFileName)..."
+ CommandLine="&quot;$(QTDIR)\bin\rcc.exe&quot; -name &quot;$(InputName)&quot; -no-compress &quot;$(InputPath)&quot; -o .\GeneratedFiles\qrc_$(InputName).cpp&#x0D;&#x0A;"
+ AdditionalDependencies="$(InputPath);.\images\FS9.ico"
+ Outputs=".\GeneratedFiles\qrc_$(InputName).cpp"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Rcc&apos;ing $(InputFileName)..."
+ CommandLine="&quot;$(QTDIR)\bin\rcc.exe&quot; -name &quot;$(InputName)&quot; -no-compress &quot;$(InputPath)&quot; -o .\GeneratedFiles\qrc_$(InputName).cpp&#x0D;&#x0A;"
+ AdditionalDependencies="$(InputPath);.\images\FS9.ico"
+ Outputs=".\GeneratedFiles\qrc_$(InputName).cpp"
+ />
+ </FileConfiguration>
+ </File>
+ </Filter>
+ <Filter
+ Name="Generated Files"
+ Filter="moc;h;cpp"
+ UniqueIdentifier="{71ED8ED8-ACB9-4CE9-BBE1-E00B30144E11}"
+ SourceControlFiles="false"
+ >
+ <File
+ RelativePath=".\generatedfiles\qrc_Protocol.cpp"
+ >
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\GeneratedFiles\ui_FTNoIR_FTcontrols.h"
+ >
+ </File>
+ <Filter
+ Name="Release"
+ Filter="cpp;moc"
+ SourceControlFiles="false"
+ >
+ <File
+ RelativePath=".\GeneratedFiles\Release\moc_FTNoIR_Protocol_FT.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ </File>
+ </Filter>
+ <Filter
+ Name="Debug"
+ Filter="cpp;moc"
+ SourceControlFiles="false"
+ >
+ <File
+ RelativePath=".\GeneratedFiles\Debug\moc_FTNoIR_Protocol_FT.cpp"
+ >
+ <FileConfiguration
+ Name="Release|Win32"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ </File>
+ </Filter>
+ </Filter>
+ </Files>
+ <Globals>
+ <Global
+ Name="lupdateOnBuild"
+ Value="0"
+ />
+ <Global
+ Name="MocDir"
+ Value=".\GeneratedFiles\$(ConfigurationName)"
+ />
+ <Global
+ Name="MocOptions"
+ Value=""
+ />
+ <Global
+ Name="QtVersion Win32"
+ Value="qt-everywhere-opensource-src-4.6.2"
+ />
+ <Global
+ Name="RccDir"
+ Value=".\GeneratedFiles"
+ />
+ <Global
+ Name="UicDir"
+ Value=".\GeneratedFiles"
+ />
+ </Globals>
+</VisualStudioProject>
diff --git a/ftnoir_protocol_ft/FTNoIR_Protocol_FT_vc9.vcproj b/ftnoir_protocol_ft/FTNoIR_Protocol_FT_vc9.vcproj
new file mode 100644
index 00000000..e5146727
--- /dev/null
+++ b/ftnoir_protocol_ft/FTNoIR_Protocol_FT_vc9.vcproj
@@ -0,0 +1,385 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9,00"
+ Name="FTNoIR_Protocol_FT"
+ ProjectGUID="{FE2FF09B-207D-468C-9763-23861956F388}"
+ RootNamespace="FTNoIR_Protocol_FT"
+ Keyword="Qt4VSv1.0"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)/bin"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=".\GeneratedFiles;&quot;$(QTDIR)\include&quot;;&quot;.\GeneratedFiles\$(ConfigurationName)&quot;;&quot;$(QTDIR)\include\qtmain&quot;;&quot;$(QTDIR)\include\QtCore&quot;;&quot;$(QTDIR)\include\QtNetwork&quot;;&quot;$(QTDIR)\include\QtGui&quot;;.\"
+ PreprocessorDefinitions="UNICODE;WIN32;QT_LARGEFILE_SUPPORT;QT_THREAD_SUPPORT;QT_NO_DEBUG;NDEBUG;QT_CORE_LIB;FTNOIR_PROTOCOL_BASE_LIB;QT_DLL"
+ RuntimeLibrary="2"
+ TreatWChar_tAsBuiltInType="false"
+ DebugInformationFormat="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="qtmain.lib QtCore4.lib QtGui4.lib"
+ OutputFile="$(OutDir)\$(ProjectName).dll"
+ AdditionalLibraryDirectories="$(QTDIR)\lib"
+ GenerateDebugInformation="false"
+ SubSystem="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)/bin_dbg"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories=".\GeneratedFiles;&quot;$(QTDIR)\include&quot;;&quot;.\GeneratedFiles\$(ConfigurationName)&quot;;&quot;$(QTDIR)\include\qtmain&quot;;&quot;$(QTDIR)\include\QtCore&quot;;&quot;$(QTDIR)\include\QtNetwork&quot;;&quot;$(QTDIR)\include\QtGui&quot;;.\"
+ PreprocessorDefinitions="UNICODE;WIN32;QT_LARGEFILE_SUPPORT;QT_THREAD_SUPPORT;QT_CORE_LIB;FTNOIR_PROTOCOL_BASE_LIB;QT_DLL"
+ RuntimeLibrary="3"
+ TreatWChar_tAsBuiltInType="false"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="qtmaind.lib QtCored4.lib QtGuid4.lib"
+ OutputFile="$(OutDir)\$(ProjectName).dll"
+ AdditionalLibraryDirectories="$(QTDIR)\lib"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;cxx;c;def"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath=".\ftnoir_Protocol_FT.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\ftnoir_protocol_FT_dialog.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\ftnoir_protocol_FT_dll.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\FTNoIR_Protocol_Base\ftnoir_protocol_base.h"
+ >
+ </File>
+ <File
+ RelativePath="..\FTNoIR_Protocol_Base\ftnoir_protocol_base_global.h"
+ >
+ </File>
+ <File
+ RelativePath=".\FTNoIR_Protocol_FT.h"
+ >
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Moc&apos;ing $(InputFileName)..."
+ CommandLine="&quot;$(QTDIR)\bin\moc.exe&quot; -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_THREAD_SUPPORT -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DFTNOIR_PROTOCOL_BASE_LIB -DQT_DLL -D_WINDLL -I&quot;.\GeneratedFiles\.&quot; -I&quot;$(QTDIR)\include\.&quot; -I&quot;.\GeneratedFiles\$(ConfigurationName)\.&quot; -I&quot;$(QTDIR)\include\qtmain\.&quot; -I&quot;$(QTDIR)\include\QtCore\.&quot; -I&quot;$(QTDIR)\include\QtNetwork\.&quot; -I&quot;$(QTDIR)\include\QtGui\.&quot; -I&quot;.\.&quot; &quot;.\FTNoIR_Protocol_FT.h&quot; -o &quot;.\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp&quot;&#x0D;&#x0A;"
+ AdditionalDependencies="&quot;$(QTDIR)\bin\moc.exe&quot;;$(InputPath)"
+ Outputs="&quot;.\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp&quot;"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Moc&apos;ing $(InputFileName)..."
+ CommandLine="&quot;$(QTDIR)\bin\moc.exe&quot; &quot;$(InputPath)&quot; -o &quot;.\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp&quot; -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_THREAD_SUPPORT -DQT_CORE_LIB -DFTNOIR_PROTOCOL_BASE_LIB -DQT_DLL -D_WINDLL &quot;-I.\GeneratedFiles&quot; &quot;-I$(QTDIR)\include&quot; &quot;-I.\GeneratedFiles\$(ConfigurationName)\.&quot; &quot;-I$(QTDIR)\include\qtmain&quot; &quot;-I$(QTDIR)\include\QtCore&quot; &quot;-I$(QTDIR)\include\QtNetwork&quot; &quot;-I$(QTDIR)\include\QtGui&quot; &quot;-I.&quot;&#x0D;&#x0A;"
+ AdditionalDependencies="&quot;$(QTDIR)\bin\moc.exe&quot;;$(InputPath)"
+ Outputs="&quot;.\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp&quot;"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\FTTypes.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Form Files"
+ Filter="ui"
+ UniqueIdentifier="{99349809-55BA-4b9d-BF79-8FDBB0286EB3}"
+ >
+ <File
+ RelativePath=".\FTNoIR_FTcontrols.ui"
+ >
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Uic&apos;ing $(InputFileName)..."
+ CommandLine="&quot;$(QTDIR)\bin\uic.exe&quot; -o &quot;.\GeneratedFiles\ui_$(InputName).h&quot; &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+ AdditionalDependencies="$(QTDIR)\bin\uic.exe"
+ Outputs="&quot;.\GeneratedFiles\ui_$(InputName).h&quot;"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Uic&apos;ing $(InputFileName)..."
+ CommandLine="&quot;$(QTDIR)\bin\uic.exe&quot; -o &quot;.\GeneratedFiles\ui_$(InputName).h&quot; &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+ AdditionalDependencies="$(QTDIR)\bin\uic.exe"
+ Outputs="&quot;.\GeneratedFiles\ui_$(InputName).h&quot;"
+ />
+ </FileConfiguration>
+ </File>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="qrc;*"
+ UniqueIdentifier="{D9D6E242-F8AF-46E4-B9FD-80ECBC20BA3E}"
+ ParseFiles="false"
+ >
+ <File
+ RelativePath=".\Protocol.qrc"
+ >
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Rcc&apos;ing $(InputFileName)..."
+ CommandLine="&quot;$(QTDIR)\bin\rcc.exe&quot; -name &quot;$(InputName)&quot; -no-compress &quot;$(InputPath)&quot; -o .\GeneratedFiles\qrc_$(InputName).cpp&#x0D;&#x0A;"
+ AdditionalDependencies="$(InputPath);.\images\FS9.ico"
+ Outputs=".\GeneratedFiles\qrc_$(InputName).cpp"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Rcc&apos;ing $(InputFileName)..."
+ CommandLine="&quot;$(QTDIR)\bin\rcc.exe&quot; -name &quot;$(InputName)&quot; -no-compress &quot;$(InputPath)&quot; -o .\GeneratedFiles\qrc_$(InputName).cpp&#x0D;&#x0A;"
+ AdditionalDependencies="$(InputPath);.\images\FS9.ico"
+ Outputs=".\GeneratedFiles\qrc_$(InputName).cpp"
+ />
+ </FileConfiguration>
+ </File>
+ </Filter>
+ <Filter
+ Name="Generated Files"
+ Filter="moc;h;cpp"
+ UniqueIdentifier="{71ED8ED8-ACB9-4CE9-BBE1-E00B30144E11}"
+ SourceControlFiles="false"
+ >
+ <File
+ RelativePath=".\generatedfiles\qrc_Protocol.cpp"
+ >
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\GeneratedFiles\ui_FTNoIR_FTcontrols.h"
+ >
+ </File>
+ <Filter
+ Name="Release"
+ Filter="cpp;moc"
+ SourceControlFiles="false"
+ >
+ <File
+ RelativePath=".\GeneratedFiles\Release\moc_FTNoIR_Protocol_FT.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ </File>
+ </Filter>
+ <Filter
+ Name="Debug"
+ Filter="cpp;moc"
+ SourceControlFiles="false"
+ >
+ <File
+ RelativePath=".\GeneratedFiles\Debug\moc_FTNoIR_Protocol_FT.cpp"
+ >
+ <FileConfiguration
+ Name="Release|Win32"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ </File>
+ </Filter>
+ </Filter>
+ </Files>
+ <Globals>
+ <Global
+ Name="lupdateOnBuild"
+ Value="0"
+ />
+ <Global
+ Name="MocDir"
+ Value=".\GeneratedFiles\$(ConfigurationName)"
+ />
+ <Global
+ Name="MocOptions"
+ Value=""
+ />
+ <Global
+ Name="QtVersion Win32"
+ Value="$(DefaultQtVersion)"
+ />
+ <Global
+ Name="RccDir"
+ Value=".\GeneratedFiles"
+ />
+ <Global
+ Name="UicDir"
+ Value=".\GeneratedFiles"
+ />
+ </Globals>
+</VisualStudioProject>
diff --git a/ftnoir_protocol_ft/FTTypes.h b/ftnoir_protocol_ft/FTTypes.h
new file mode 100644
index 00000000..1f389711
--- /dev/null
+++ b/ftnoir_protocol_ft/FTTypes.h
@@ -0,0 +1,104 @@
+/********************************************************************************
+* FTTypes FTTypes contains th specific type definitions for the *
+* FreeTrack protocol. *
+* It was loosely translated from FTTypes.pas *
+* which was created by the FreeTrack-team. *
+* *
+* Copyright (C) 2013 Wim Vriend (Developing) *
+* Ron Hendriks (Testing and Research) *
+* *
+* Homepage <http://www.free-track.net> *
+* *
+* 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 <http://www.gnu.org/licenses/>. *
+* *
+* We would like to extend our grattitude to the creators of SweetSpotter, *
+* which has become the basis of this program: "Great work guys!" *
+********************************************************************************/
+/*
+ Modifications (last one on top):
+ 20130125 - WVR: Upgraded to FT2.0: now the FreeTrack protocol supports all TIR-enabled games. The memory-mapping was expanded for this purpose.
+*/
+#pragma once
+#ifndef INCLUDED_FTTYPES_H
+#define INCLUDED_FTTYPES_H
+
+#include "Windows.h"
+#include <tchar.h>
+#include <stdio.h>
+
+//#include "Registry.h"
+
+// static const char* FT_CLIENT_LOCATION = "Software\\Freetrack\\FreetrackClient";
+ static const char* FT_CLIENT_FILENAME = "FreeTrackClient.Dll";
+ static const char* FT_MM_DATA = "FT_SharedMem";
+ static const char* FREETRACK = "Freetrack";
+ static const char* FREETRACK_MUTEX = "FT_Mutext";
+ static const char* FT_PROGRAMID = "FT_ProgramID";
+
+
+struct TFreeTrackData {
+ int DataID;
+ int CamWidth;
+ int CamHeight;
+ // virtual pose
+ float Yaw; // positive yaw to the left
+ float Pitch; // positive pitch up
+ float Roll; // positive roll to the left
+ float X;
+ float Y;
+ float Z;
+ // raw pose with no smoothing, sensitivity, response curve etc.
+ float RawYaw;
+ float RawPitch;
+ float RawRoll;
+ float RawX;
+ float RawY;
+ float RawZ;
+ // raw points, sorted by Y, origin top left corner
+ float X1;
+ float Y1;
+ float X2;
+ float Y2;
+ float X3;
+ float Y3;
+ float X4;
+ float Y4;
+};
+typedef TFreeTrackData * PFreetrackData;
+
+struct FTMemMap {
+ TFreeTrackData data;
+
+#ifdef WIN64
+ __int32 command;
+#else
+ HANDLE handle;
+#endif
+ char ProgramName[100]; // The name of the game
+ char GameID[10]; // The international game-ID
+ char FTNID[30]; // The FaceTrackNoIR game-ID
+ char FTNVERSION[10]; // The version of FaceTrackNoIR, in which the game was first supported
+};
+typedef FTMemMap * PFTMemMap;
+
+//extern bool (*FTGetData) (PFreetrackData data);
+// DLL function signatures
+// These match those given in FTTypes.pas
+// WINAPI is macro for __stdcall defined somewhere in the depths of windows.h
+typedef bool (WINAPI *importGetData)(TFreeTrackData * data);
+typedef char *(WINAPI *importGetDllVersion)(void);
+typedef void (WINAPI *importReportID)(int name);
+typedef char *(WINAPI *importProvider)(void);
+
+#endif//INCLUDED_FTTYPES_H
diff --git a/ftnoir_protocol_ft/Protocol.qrc b/ftnoir_protocol_ft/Protocol.qrc
new file mode 100644
index 00000000..25ecc6fe
--- /dev/null
+++ b/ftnoir_protocol_ft/Protocol.qrc
@@ -0,0 +1,5 @@
+<RCC>
+ <qresource prefix="/">
+ <file>images/Freetrack.ico</file>
+ </qresource>
+</RCC>
diff --git a/ftnoir_protocol_ft/csv.cpp b/ftnoir_protocol_ft/csv.cpp
new file mode 100644
index 00000000..22852f89
--- /dev/null
+++ b/ftnoir_protocol_ft/csv.cpp
@@ -0,0 +1,99 @@
+/********************************************************************************
+* 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) 2013 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 <http://www.gnu.org/licenses/>. *
+* *
+********************************************************************************/
+#include "csv.h"
+#include <QTextDecoder>
+
+CSV::CSV(QIODevice * device)
+{
+ m_device = device;
+ m_codec = QTextCodec::codecForLocale();
+ m_pos = 0;
+ m_rx = QRegExp("((?:(?:[^;\\n]*;?)|(?:\"[^\"]*\";?))*)\\n");
+}
+CSV::CSV(QString &string){
+ m_device = NULL;
+ m_codec = QTextCodec::codecForLocale();
+ m_string = string;
+ m_pos = 0;
+ m_rx = QRegExp("((?:(?:[^;\\n]*;?)|(?:\"[^\"]*\";?))*)\\n");
+}
+
+CSV::~CSV()
+{
+ //delete m_codec;
+}
+
+
+void CSV::setCodec(const char* codecName){
+ //delete m_codec;
+ m_codec = QTextCodec::codecForName(codecName);
+}
+
+QString CSV::readLine(){
+ QString line;
+
+ if(m_string.isNull()){
+ //READ DATA FROM DEVICE
+ if(m_device && m_device->isReadable()){
+ QTextDecoder dec(m_codec);
+ m_string = dec.toUnicode(m_device->readAll());
+ }else{
+ return QString();
+ }
+ }
+
+ //PARSE
+ if((m_pos = m_rx.indexIn(m_string,m_pos)) != -1) {
+ line = m_rx.cap(1);
+ m_pos += m_rx.matchedLength();
+ }
+ return line;
+
+}
+QStringList CSV::parseLine(){
+ return parseLine(readLine());
+}
+QStringList CSV::parseLine(QString line){
+ QStringList list;
+ int pos2 = 0;
+ QRegExp rx2("(?:\"([^\"]*)\";?)|(?:([^;]*);?)");
+ if(line.size()<1){
+ list << "";
+ }else while (line.size()>pos2 && (pos2 = rx2.indexIn(line, pos2)) != -1) {
+ QString col;
+ if(rx2.cap(1).size()>0)
+ col = rx2.cap(1);
+ else if(rx2.cap(2).size()>0)
+ col = rx2.cap(2);
+
+ list << col;
+
+ if(col.size())
+ pos2 += rx2.matchedLength();
+ else
+ pos2++;
+ }
+ return list;
+} \ No newline at end of file
diff --git a/ftnoir_protocol_ft/csv.h b/ftnoir_protocol_ft/csv.h
new file mode 100644
index 00000000..13231293
--- /dev/null
+++ b/ftnoir_protocol_ft/csv.h
@@ -0,0 +1,38 @@
+/*dummy CSV reader for QT4*/
+/*version 0.1*/
+/*11.1.2009*/
+#ifndef CSV_H
+#define CSV_H
+
+//#include "myclass_api.h"
+
+#include <QObject>
+#include <QStringList>
+#include <QIODevice>
+#include <QTextCodec>
+#include <QRegExp>
+
+class /*MYCLASS_API*/ CSV /*: public QObject*/
+{
+ /*Q_OBJECT*/
+
+public:
+ CSV(QIODevice * device);
+ CSV(QString &string);
+ ~CSV();
+
+ QString readLine();
+ QStringList parseLine();
+ static QStringList parseLine(QString line);
+
+ void setCodec(const char* codecName);
+private:
+ QIODevice *m_device;
+ QTextCodec *m_codec;
+ QString m_string;
+ int m_pos;
+ QRegExp m_rx;
+
+};
+
+#endif // CSV_H
diff --git a/ftnoir_protocol_ft/ftnoir_protocol_FT_dialog.cpp b/ftnoir_protocol_ft/ftnoir_protocol_FT_dialog.cpp
new file mode 100644
index 00000000..2e6c91f7
--- /dev/null
+++ b/ftnoir_protocol_ft/ftnoir_protocol_FT_dialog.cpp
@@ -0,0 +1,235 @@
+/********************************************************************************
+* FaceTrackNoIR This program is a private project of some enthusiastic *
+* gamers from Holland, who don't like to pay much for *
+* head-tracking. *
+* *
+* Copyright (C) 2012 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 <http://www.gnu.org/licenses/>. *
+* *
+********************************************************************************/
+/*
+ Modifications (last one on top):
+ 20120830 - WVR: The Dialog class was used to get general info on the DLL. This
+ had a big disadvantage: the complete dialog was loaded, just to get
+ some data and then it was deleted again (without ever showing the dialog).
+ The ProtocolDll class solves this.
+ The functions to get the name(s) and icon were removed from the two other classes.
+*/
+#include "ftnoir_protocol_ft.h"
+#include <QDebug>
+#include <QFileDialog>
+
+//*******************************************************************************************************
+// FaceTrackNoIR Client Settings-dialog.
+//*******************************************************************************************************
+
+//
+// Constructor for server-settings-dialog
+//
+FTControls::FTControls() :
+QWidget()
+{
+ QString aFileName; // File Path and Name
+
+ ui.setupUi( this );
+
+ // Connect Qt signals to member-functions
+ connect(ui.btnOK, SIGNAL(clicked()), this, SLOT(doOK()));
+ connect(ui.btnCancel, SIGNAL(clicked()), this, SLOT(doCancel()));
+ connect(ui.bntLocateNPClient, SIGNAL(clicked()), this, SLOT(selectDLL()));
+ connect(ui.chkTIRViews, SIGNAL(stateChanged(int)), this, SLOT(settingChanged()));
+ connect(ui.chkStartDummy, SIGNAL(stateChanged(int)), this, SLOT(settingChanged()));
+ connect(ui.cbxSelectInterface, SIGNAL(currentIndexChanged(int)), this, SLOT(settingChanged( int )));
+
+ ui.cbxSelectInterface->addItem("Enable both");
+ ui.cbxSelectInterface->addItem("Use FreeTrack, hide TrackIR");
+ ui.cbxSelectInterface->addItem("Use TrackIR, hide FreeTrack");
+
+ theProtocol = NULL;
+
+ // Load the settings from the current .INI-file
+ loadSettings();
+
+
+ aFileName = QCoreApplication::applicationDirPath() + "/TIRViews.dll";
+ if ( !QFile::exists( aFileName ) ) {
+ ui.chkTIRViews->setChecked( false );
+ ui.chkTIRViews->setEnabled ( false );
+
+ //
+ // Best do this save() last, or it will continually reset the settings... :-(
+ //
+ save();
+ }
+ else {
+ ui.chkTIRViews->setEnabled ( true );
+ }
+
+
+}
+
+//
+// Destructor for server-dialog
+//
+FTControls::~FTControls() {
+ qDebug() << "~FTControls() says: started";
+}
+
+//
+// Initialize tracker-client-dialog
+//
+void FTControls::Initialize(QWidget *parent) {
+
+ QPoint offsetpos(100, 100);
+ if (parent) {
+ this->move(parent->pos() + offsetpos);
+ }
+ show();
+}
+
+//
+// OK clicked on server-dialog
+//
+void FTControls::doOK() {
+ save();
+ this->close();
+}
+
+// override show event
+void FTControls::showEvent ( QShowEvent * event ) {
+ loadSettings();
+}
+
+//
+// Cancel clicked on server-dialog
+//
+void FTControls::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 FTControls::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 ( "FT" );
+ ui.cbxSelectInterface->setCurrentIndex( iniFile.value ( "UsedInterface", 0 ).toInt() );
+ iniFile.endGroup ();
+
+ iniFile.beginGroup ( "FTIR" );
+ ui.chkTIRViews->setChecked (iniFile.value ( "useTIRViews", 0 ).toBool());
+ ui.chkStartDummy->setChecked (iniFile.value ( "useDummyExe", 1 ).toBool());
+ iniFile.endGroup ();
+
+ settingsDirty = false;
+}
+
+//
+// Save the current Settings to the currently 'active' INI-file.
+//
+void FTControls::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 ( "FT" );
+ iniFile.setValue ( "UsedInterface", ui.cbxSelectInterface->currentIndex());
+ iniFile.endGroup ();
+
+ iniFile.beginGroup ( "FTIR" );
+ iniFile.setValue ( "useTIRViews", ui.chkTIRViews->isChecked() );
+ iniFile.setValue ( "useDummyExe", ui.chkStartDummy->isChecked() );
+ iniFile.endGroup ();
+
+ settingsDirty = false;
+}
+
+//
+// Select a NPClient.dll file, to repair the Location in the Registry.
+// Several program distribute their own version of this file.
+//
+void FTControls::selectDLL() {
+ QFileDialog::Options options;
+ QFileDialog::FileMode mode;
+
+ options |= QFileDialog::DontUseNativeDialog;
+ mode = QFileDialog::ExistingFile;
+ QString selectedFilter;
+ QString fileName = QFileDialog::getOpenFileName( this, tr("Select the desired NPClient DLL"), QCoreApplication::applicationDirPath() + "/NPClient.dll", tr("Dll file (*.dll);;All Files (*)"));
+
+ //
+ // Write the location of the file in the required Registry-key.
+ //
+ if (! fileName.isEmpty() ) {
+ if (fileName.endsWith("NPClient.dll", Qt::CaseInsensitive) ) {
+ QSettings settingsTIR("NaturalPoint", "NATURALPOINT\\NPClient Location"); // Registry settings (in HK_USER)
+ QString aLocation = fileName.left(fileName.length() - 12); // Location of Client DLL
+
+ settingsTIR.setValue( "Path" , aLocation );
+ }
+ }
+}
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Factory function that creates instances if the Protocol-settings dialog object.
+
+// Export both decorated and undecorated names.
+// GetProtocolDialog - Undecorated name, which can be easily used with GetProcAddress
+// Win32 API function.
+// _GetProtocolDialog@0 - Common name decoration for __stdcall functions in C language.
+#pragma comment(linker, "/export:GetProtocolDialog=_GetProtocolDialog@0")
+
+FTNOIR_PROTOCOL_BASE_EXPORT IProtocolDialogPtr __stdcall GetProtocolDialog( )
+{
+ return new FTControls;
+}
diff --git a/ftnoir_protocol_ft/ftnoir_protocol_FT_dll.cpp b/ftnoir_protocol_ft/ftnoir_protocol_FT_dll.cpp
new file mode 100644
index 00000000..4513c6ba
--- /dev/null
+++ b/ftnoir_protocol_ft/ftnoir_protocol_FT_dll.cpp
@@ -0,0 +1,56 @@
+/********************************************************************************
+* FaceTrackNoIR This program is a private project of some enthusiastic *
+* gamers from Holland, who don't like to pay much for *
+* head-tracking. *
+* *
+* Copyright (C) 2012 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 <http://www.gnu.org/licenses/>. *
+* *
+********************************************************************************/
+/*
+ Modifications (last one on top):
+ 20120830 - WVR: The Dialog class was used to get general info on the DLL. This
+ had a big disadvantage: the complete dialog was loaded, just to get
+ some data and then it was deleted again (without ever showing the dialog).
+ The ProtocolDll class solves this.
+ The functions to get the name(s) and icon were removed from the two other classes.
+*/
+#include "ftnoir_protocol_ft.h"
+#include <QDebug>
+
+FTNoIR_ProtocolDll::FTNoIR_ProtocolDll() {
+}
+
+FTNoIR_ProtocolDll::~FTNoIR_ProtocolDll()
+{
+
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Factory function that creates instances if the Protocol object.
+
+// Export both decorated and undecorated names.
+// GetProtocolDll - Undecorated name, which can be easily used with GetProcAddress
+// Win32 API function.
+// _GetProtocolDll@0 - Common name decoration for __stdcall functions in C language.
+#pragma comment(linker, "/export:GetProtocolDll=_GetProtocolDll@0")
+
+FTNOIR_PROTOCOL_BASE_EXPORT IProtocolDllPtr __stdcall GetProtocolDll()
+{
+ return new FTNoIR_ProtocolDll;
+}
diff --git a/ftnoir_protocol_ft/images/Freetrack.ico b/ftnoir_protocol_ft/images/Freetrack.ico
new file mode 100644
index 00000000..02554c3d
--- /dev/null
+++ b/ftnoir_protocol_ft/images/Freetrack.ico
Binary files differ