summaryrefslogtreecommitdiffhomepage
path: root/contrib
diff options
context:
space:
mode:
Diffstat (limited to 'contrib')
-rw-r--r--contrib/very-important-source-code/npclient.c176
1 files changed, 92 insertions, 84 deletions
diff --git a/contrib/very-important-source-code/npclient.c b/contrib/very-important-source-code/npclient.c
index b991dc35..06d1fdc9 100644
--- a/contrib/very-important-source-code/npclient.c
+++ b/contrib/very-important-source-code/npclient.c
@@ -1,14 +1,19 @@
+#define _USE_MATH_DEFINES
+
#include <stdarg.h>
#include <stdlib.h>
-#include <stdio.h>
+#include <stdbool.h>
+#include <math.h>
#include <string.h>
+#include <stdio.h>
+
#include <windows.h>
-#include <tchar.h>
#define FREETRACK_MUTEX "FT_Mutext"
#define FT_MM_DATA "FT_SharedMem"
-typedef struct TFreeTrackData {
+typedef struct TFreeTrackData
+{
int DataID;
int CamWidth;
int CamHeight;
@@ -34,24 +39,25 @@ typedef struct TFreeTrackData {
float Y4;
} TFreeTrackData;
-typedef struct FTMemMap {
+typedef struct FTMemMap
+{
TFreeTrackData data;
__int32 GameId;
unsigned char table[8];
__int32 GameId2;
} FTMemMap;
-static BOOL bEncryptionChecked = FALSE;
+static bool bEncryptionChecked = false;
static double r = 0, p = 0, y = 0, tx = 0, ty = 0, tz = 0;
#define NP_DECLSPEC __declspec(dllexport)
#define NP_EXPORT(t) t NP_DECLSPEC __stdcall
-#define NP_AXIS_MAX 16383
+#define NP_AXIS_MAX 16384
-static BOOL FTCreateMapping(void);
+static bool FTCreateMapping(void);
static void FTDestroyMapping(void);
-static __inline double scale2AnalogLimits( double x, double min_x, double max_x );
-static __inline double getDegreesFromRads ( double rads );
+static __inline double clamp_rotation(double x);
+static __inline double clamp(double x, double xmin, double xmax);
#if DEBUG
static FILE *debug_stream;
@@ -66,28 +72,30 @@ typedef enum npclient_status_ {
} npclient_status;
static HANDLE hFTMemMap = 0;
-static FTMemMap *pMemData = 0;
-static HANDLE hFTMutex = 0;
-static BOOL bEncryption = FALSE;
+static FTMemMap volatile * pMemData = 0;
+static bool bEncryption = false;
static unsigned char table[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
-typedef struct tir_data{
+typedef struct tir_data
+{
short status;
short frame;
- unsigned int cksum;
+ unsigned cksum;
float roll, pitch, yaw;
float tx, ty, tz;
float padding[9];
} tir_data_t;
-typedef struct tir_signature{
+typedef struct tir_signature
+{
char DllSignature[200];
char AppSignature[200];
} tir_signature_t;
BOOL DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
- switch (fdwReason) {
+ switch (fdwReason)
+ {
case DLL_PROCESS_ATTACH:
#if DEBUG
debug_stream = fopen("c:\\NPClient.log", "a");
@@ -100,14 +108,18 @@ BOOL DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
dbg_report("DllMain: (%p, %ld, %p)\n", (void*) hinstDLL, (long) fdwReason, lpvReserved);
dbg_report("DllMain: Attach request\n");
DisableThreadLibraryCalls(hinstDLL);
+#if 0
timeBeginPeriod(1);
+#endif
break;
case DLL_PROCESS_DETACH:
dbg_report("DllMain: Detach\n");
dbg_report("DllMain: (%p, %ld, %p)\n", (void*) hinstDLL, (long) fdwReason, lpvReserved);
dbg_report("==========================================================================================\n");
+#if 0
timeEndPeriod(1);
+#endif
FTDestroyMapping();
break;
}
@@ -185,7 +197,7 @@ NP_EXPORT(int) NPPriv_SetVersion(void)
}
/* TIR5 requires a checksum to be calculated over the headpose-data and to be relayed to the game. */
-static unsigned int cksum(unsigned char buf[], unsigned int size)
+static unsigned cksum(unsigned char buf[], unsigned size)
{
int rounds = size >> 2;
int rem = size % 4;
@@ -193,11 +205,11 @@ static unsigned int cksum(unsigned char buf[], unsigned int size)
int c = size;
int a0, a2;
- if((size == 0) || (buf == NULL)){
+ if (size == 0 || buf == NULL)
return 0;
- }
- while(rounds != 0){
+ while (rounds != 0)
+ {
a0 = *(short int*)buf;
a2 = *(short int*)(buf+2);
buf += 4;
@@ -208,7 +220,8 @@ static unsigned int cksum(unsigned char buf[], unsigned int size)
c += (c >> 11);
--rounds;
}
- switch(rem){
+ switch (rem)
+ {
case 3:
a0 = *(short int*)buf;
a2 = *(signed char*)(buf+2);
@@ -232,9 +245,8 @@ static unsigned int cksum(unsigned char buf[], unsigned int size)
default:
break;
}
- if(rem != 0){
+ if(rem != 0)
c+=a2;
- }
c ^= (c << 3);
c += (c >> 5);
@@ -243,28 +255,29 @@ static unsigned int cksum(unsigned char buf[], unsigned int size)
c ^= (c << 25);
c += (c >> 6);
- return (unsigned int)c;
+ return (unsigned)c;
}
-static __inline void enhance(unsigned char buf[], unsigned int size,
- unsigned char table[], int table_size)
+static __inline void enhance(unsigned char buf[], unsigned size, unsigned char table[], int table_size)
{
- unsigned int table_ptr = 0;
+ unsigned table_ptr = 0;
unsigned char var = 0x88;
unsigned char tmp;
- if((size <= 0) || (table_size <= 0) ||
- (buf == NULL) || (table == NULL)){
+
+ if (size <= 0 || table_size <= 0 || buf == NULL || table == NULL)
return;
- }
- do{
+
+ do
+ {
tmp = buf[--size];
buf[size] = tmp ^ table[table_ptr] ^ var;
var += size + tmp;
++table_ptr;
- if(table_ptr >= table_size){
+
+ if (table_ptr >= table_size)
table_ptr -= table_size;
- }
- }while(size != 0);
+ }
+ while (size != 0);
}
/******************************************************************
@@ -284,13 +297,15 @@ NP_EXPORT(int) NP_GetData(tir_data_t * data)
return 0;
}
- if (pMemData && hFTMutex && WaitForSingleObject(hFTMutex, 15) == WAIT_OBJECT_0) {
+ if (pMemData)
+ {
#if DEBUG
recv = 1;
#endif
- y = getDegreesFromRads( pMemData->data.Yaw );
- p = getDegreesFromRads( pMemData->data.Pitch );
- r = getDegreesFromRads( pMemData->data.Roll );
+ y = pMemData->data.Yaw * (NP_AXIS_MAX / M_PI);
+ p = pMemData->data.Pitch * (NP_AXIS_MAX / M_PI);
+ r = pMemData->data.Roll * (NP_AXIS_MAX / M_PI);
+
tx = pMemData->data.X;
ty = pMemData->data.Y;
tz = pMemData->data.Z;
@@ -298,38 +313,37 @@ NP_EXPORT(int) NP_GetData(tir_data_t * data)
if (pMemData->GameId == pMemData->GameId2 && !bEncryptionChecked)
{
dbg_report("NP_GetData: game = %d\n", pMemData->GameId);
- memcpy(table, pMemData->table, 8);
+ bEncryptionChecked = true;
+ memcpy(table, (void*)pMemData->table, 8);
for (i = 0; i < 8; i++)
if (table[i])
{
- bEncryption = TRUE;
+ bEncryption = true;
break;
}
dbg_report("NP_GetData: Table = %02d %02d %02d %02d %02d %02d %02d %02d\n", table[0],table[1],table[2],table[3],table[4],table[5], table[6], table[7]);
- bEncryptionChecked = pMemData->GameId2 == pMemData->GameId;
}
-
- ReleaseMutex(hFTMutex);
}
- data->frame = frameno += 1;
+ frameno++;
+ data->frame = frameno;
+
bool running = y != 0 || p != 0 || r != 0 ||
tx != 0 || ty != 0 || tz != 0;
data->status = running ? NPCLIENT_STATUS_OK : NPCLIENT_STATUS_DISABLED;
data->cksum = 0;
- data->roll = scale2AnalogLimits (r, -180.0, 180.0);
- data->pitch = scale2AnalogLimits (p, -180.0, 180.0);
- data->yaw = scale2AnalogLimits (y, -180.0, 180.0);
+ data->roll = clamp_rotation(r);
+ data->pitch = clamp_rotation(p);
+ data->yaw = clamp_rotation(y);
- data->tx = scale2AnalogLimits (tx, -500.0, 500.0);
- data->ty = scale2AnalogLimits (ty, -500.0, 500.0);
- data->tz = scale2AnalogLimits (tz, -500.0, 500.0);
+ data->tx = clamp(tx, -500.0, 500.0);
+ data->ty = clamp(ty, -500.0, 500.0);
+ data->tz = clamp(tz, -500.0, 500.0);
- for(i = 0; i < 9; ++i) {
+ for(i = 0; i < 9; ++i)
data->padding[i] = 0.0;
- }
#if DEBUG
dbg_report("GetData: rotation: %d %f %f %f\n", recv, data->yaw, data->pitch, data->roll);
@@ -337,9 +351,8 @@ NP_EXPORT(int) NP_GetData(tir_data_t * data)
data->cksum = cksum((unsigned char*)data, sizeof(tir_data_t));
- if(bEncryption) {
+ if (bEncryption)
enhance((unsigned char*)data, sizeof(tir_data_t), table, sizeof(table));
- }
return running ? NPCLIENT_STATUS_OK : NPCLIENT_STATUS_DISABLED;
}
@@ -443,8 +456,6 @@ NP_EXPORT(int) NP_GetSignature(tir_signature_t * sig)
sig->DllSignature[i] = part1_2[i] ^ part1_1[i];
for (i = 0; i < 200; i++)
sig->AppSignature[i] = part2_1[i] ^ part2_2[i];
- memset(sig->DllSignature + strlen(sig->DllSignature), 0, 200 - strlen(sig->DllSignature));
- memset(sig->AppSignature + strlen(sig->AppSignature), 0, 200 - strlen(sig->AppSignature));
return 0;
}
@@ -548,49 +559,46 @@ NP_EXPORT(int) NP_UnregisterWindowHandle(void)
return (int) 0;
}
-static BOOL FTCreateMapping(void)
+static bool FTCreateMapping(void)
{
- BOOL bMappingExists = FALSE;
-
if (pMemData)
- return TRUE;
+ return true;
dbg_report("FTCreateMapping request (pMemData == NULL).\n");
- hFTMutex = CreateMutexA(NULL, FALSE, FREETRACK_MUTEX);
- hFTMemMap = CreateFileMappingA( INVALID_HANDLE_VALUE, 00, PAGE_READWRITE, 0, sizeof( FTMemMap ), (LPCSTR) FT_MM_DATA );
- pMemData = (FTMemMap *) MapViewOfFile(hFTMemMap, FILE_MAP_WRITE, 0, 0, sizeof( FTMemMap ) );
- return pMemData != NULL && hFTMutex != NULL;
+ HANDLE hFTMutex = CreateMutexA(NULL, FALSE, FREETRACK_MUTEX);
+ CloseHandle(hFTMutex);
+
+ hFTMemMap = CreateFileMappingA(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, sizeof(FTMemMap), (LPCSTR) FT_MM_DATA);
+ pMemData = (FTMemMap *) MapViewOfFile(hFTMemMap, FILE_MAP_WRITE, 0, 0, sizeof(FTMemMap));
+ return pMemData != NULL;
}
static void FTDestroyMapping(void)
{
- if ( pMemData != NULL ) {
- UnmapViewOfFile ( pMemData );
- }
+ if (pMemData != NULL)
+ UnmapViewOfFile((void*)pMemData);
- CloseHandle( hFTMutex );
- CloseHandle( hFTMemMap );
+ CloseHandle(hFTMemMap);
pMemData = 0;
hFTMemMap = 0;
}
-static __inline double getDegreesFromRads ( double rads ) {
- return (rads * 57.295781);
-}
+static __inline double clamp(double x, double xmin, double xmax)
+{
+ if (x > xmax)
+ return xmax;
-static __inline double scale2AnalogLimits( double x, double min_x, double max_x ) {
- double y;
- double local_x;
+ if (x < xmin)
+ return xmin;
- local_x = x;
- if (local_x > max_x) {
- local_x = max_x;
- }
- if (local_x < min_x) {
- local_x = min_x;
- }
- y = ( NP_AXIS_MAX * local_x ) / max_x;
+ return x;
+}
- return y;
+#define ROT_MAX (NP_AXIS_MAX)
+#define ROT_MIN (-ROT_MAX)
+
+static __inline double clamp_rotation(double x)
+{
+ return clamp(x, ROT_MIN, ROT_MAX);
}