Beispiel #1
0
int _glfwPlatformGetJoystickParam(int joy, int param)
{
    JOYCAPS jc;

    if (!isJoystickPresent(joy))
        return 0;

    // We got this far, the joystick is present
    if (param == GLFW_PRESENT)
        return GL_TRUE;

    // Get joystick capabilities
    _glfw_joyGetDevCaps(joy - GLFW_JOYSTICK_1, &jc, sizeof(JOYCAPS));

    switch (param)
    {
        case GLFW_AXES:
            // Return number of joystick axes
            return jc.wNumAxes;

        case GLFW_BUTTONS:
            // Return number of joystick axes
            return jc.wNumButtons;

        default:
            break;
    }

    return 0;
}
Beispiel #2
0
int _glfwPlatformGetJoystickButtons(int joy, unsigned char* buttons,
                                    int numbuttons)
{
    JOYCAPS jc;
    JOYINFOEX ji;
    int button;

    if (!isJoystickPresent(joy))
        return 0;

    // Get joystick capabilities
    _glfw_joyGetDevCaps(joy - GLFW_JOYSTICK_1, &jc, sizeof(JOYCAPS));

    // Get joystick state
    ji.dwSize = sizeof(JOYINFOEX);
    ji.dwFlags = JOY_RETURNBUTTONS;
    _glfw_joyGetPosEx(joy - GLFW_JOYSTICK_1, &ji);

    // Get states of all requested buttons
    for (button = 0;  button < numbuttons && button < (int) jc.wNumButtons;  button++)
    {
        buttons[button] = (unsigned char)
            (ji.dwButtons & (1UL << button) ? GLFW_PRESS : GLFW_RELEASE);
    }

    return button;
}
Beispiel #3
0
int _glfwPlatformGetJoystickButtons(int joy, unsigned char* buttons,
                                    int numbuttons)
{
    JOYCAPS jc;
    JOYINFOEX ji;
    int button, hats;

    // Bit fields of button presses for each direction, including nil
    const int directions[9] = { 1, 3, 2, 6, 4, 12, 8, 9, 0 };

    if (!isJoystickPresent(joy))
        return 0;

    // Get joystick capabilities
    _glfw_joyGetDevCaps(joy - GLFW_JOYSTICK_1, &jc, sizeof(JOYCAPS));

    // Get joystick state
    ji.dwSize = sizeof(JOYINFOEX);
    ji.dwFlags = JOY_RETURNBUTTONS | JOY_RETURNPOV;
    _glfw_joyGetPosEx(joy - GLFW_JOYSTICK_1, &ji);

    // Get states of all requested buttons
    for (button = 0;  button < numbuttons && button < (int) jc.wNumButtons;  button++)
    {
        buttons[button] = (unsigned char)
            (ji.dwButtons & (1UL << button) ? GLFW_PRESS : GLFW_RELEASE);
    }

    // Virtual buttons - Inject data from hats
    // Each hat is exposed as 4 buttons which exposes 8 directions with
    // concurrent button presses
    // NOTE: this API exposes only one hat

    hats = (jc.wCaps & JOYCAPS_HASPOV) && (jc.wCaps & JOYCAPS_POV4DIR) ? 1 : 0;

    if (hats > 0)
    {
        int j, value = ji.dwPOV / 100 / 45;

        if (value < 0 || value > 8)
            value = 8;

        for (j = 0; j < 4 && button < numbuttons; j++)
        {
            if (directions[value] & (1 << j))
                buttons[button] = GLFW_PRESS;
            else
                buttons[button] = GLFW_RELEASE;

            button++;
        }
    }

    return button;
}
Beispiel #4
0
const char* _glfwPlatformGetJoystickName(int joy)
{
    JOYCAPS jc;
    const int i = joy - GLFW_JOYSTICK_1;

    if (!isJoystickPresent(joy))
        return NULL;

    _glfw_joyGetDevCaps(i, &jc, sizeof(JOYCAPS));

    free(_glfw.win32.joystick[i].name);
    _glfw.win32.joystick[i].name = _glfwCreateUTF8FromWideString(jc.szPname);

    return _glfw.win32.joystick[i].name;
}
Beispiel #5
0
int _glfwPlatformGetJoystickPos(int joy, float* pos, int numaxes)
{
    JOYCAPS jc;
    JOYINFOEX ji;
    int axis;

    if (!isJoystickPresent(joy))
        return 0;

    // Get joystick capabilities
    _glfw_joyGetDevCaps(joy - GLFW_JOYSTICK_1, &jc, sizeof(JOYCAPS));

    // Get joystick state
    ji.dwSize = sizeof(JOYINFOEX);
    ji.dwFlags = JOY_RETURNX | JOY_RETURNY | JOY_RETURNZ |
                 JOY_RETURNR | JOY_RETURNU | JOY_RETURNV;
    _glfw_joyGetPosEx(joy - GLFW_JOYSTICK_1, &ji);

    // Get position values for all axes
    axis = 0;
    if (axis < numaxes)
        pos[axis++] = calcJoystickPos(ji.dwXpos, jc.wXmin, jc.wXmax);

    if (axis < numaxes)
        pos[axis++] = -calcJoystickPos(ji.dwYpos, jc.wYmin, jc.wYmax);

    if (axis < numaxes && jc.wCaps & JOYCAPS_HASZ)
        pos[axis++] = calcJoystickPos(ji.dwZpos, jc.wZmin, jc.wZmax);

    if (axis < numaxes && jc.wCaps & JOYCAPS_HASR)
        pos[axis++] = calcJoystickPos(ji.dwRpos, jc.wRmin, jc.wRmax);

    if (axis < numaxes && jc.wCaps & JOYCAPS_HASU)
        pos[axis++] = calcJoystickPos(ji.dwUpos, jc.wUmin, jc.wUmax);

    if (axis < numaxes && jc.wCaps & JOYCAPS_HASV)
        pos[axis++] = -calcJoystickPos(ji.dwVpos, jc.wVmin, jc.wVmax);

    return axis;
}