summaryrefslogtreecommitdiffhomepage
path: root/protocol-vjoy/ftnoir_protocol_vjoy.cpp
blob: 24148c63bb89101c2274b38193ae80d31c7aef5b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include "ftnoir_protocol_vjoy.h"
#include "opentrack/plugin-api.hpp"

FTNoIR_Protocol::FTNoIR_Protocol()
{
    static char meh[1] = {0};
    VJoy_Initialize(meh, meh);
}

FTNoIR_Protocol::~FTNoIR_Protocol()
{
    VJoy_Shutdown();
}

void FTNoIR_Protocol::pose( const double *headpose ) {
#ifdef __GNUC__
#	pragma GCC diagnostic ignored "-Wmissing-field-initializers"
#endif
    JOYSTICK_STATE state[2] = { 0 };

    state[0].POV = (4 << 12) | (4 << 8) | (4 << 4) | 4;

    state[0].XAxis = std::min<int>(VJOY_AXIS_MAX, std::max<int>(VJOY_AXIS_MIN, headpose[Yaw] * VJOY_AXIS_MAX / 180.0));
    state[0].YAxis = std::min<int>(VJOY_AXIS_MAX, std::max<int>(VJOY_AXIS_MIN, headpose[Pitch] * VJOY_AXIS_MAX / 180.0));
    state[0].ZAxis = std::min<int>(VJOY_AXIS_MAX, std::max<int>(VJOY_AXIS_MIN, headpose[Roll] * VJOY_AXIS_MAX / 180.0));
    state[0].XRotation = std::min<int>(VJOY_AXIS_MAX, std::max<int>(VJOY_AXIS_MIN, headpose[TX] * VJOY_AXIS_MAX / 100.0));
    state[0].YRotation = std::min<int>(VJOY_AXIS_MAX, std::max<int>(VJOY_AXIS_MIN, headpose[TY] * VJOY_AXIS_MAX / 100.0));
    state[0].ZRotation = std::min<int>(VJOY_AXIS_MAX, std::max<int>(VJOY_AXIS_MIN, headpose[TZ] * VJOY_AXIS_MAX / 100.0));

    VJoy_UpdateJoyState(0, state);
}

OPENTRACK_DECLARE_PROTOCOL(FTNoIR_Protocol, VJoyControls, FTNoIR_ProtocolDll)