Пример #1
0
float* _glfwPlatformGetJoystickAxes(int joy, int* count)
{
    JOYCAPS jc;
    JOYINFOEX ji;
    float* axes = _glfw.win32.joystick[joy].axes;

    if (_glfw_joyGetDevCaps(joy, &jc, sizeof(JOYCAPS)) != JOYERR_NOERROR)
        return NULL;

    ji.dwSize = sizeof(JOYINFOEX);
    ji.dwFlags = JOY_RETURNX | JOY_RETURNY | JOY_RETURNZ |
                 JOY_RETURNR | JOY_RETURNU | JOY_RETURNV;
    if (_glfw_joyGetPosEx(joy, &ji) != JOYERR_NOERROR)
        return NULL;

    axes[(*count)++] = calcJoystickPos(ji.dwXpos, jc.wXmin, jc.wXmax);
    axes[(*count)++] = -calcJoystickPos(ji.dwYpos, jc.wYmin, jc.wYmax);

    if (jc.wCaps & JOYCAPS_HASZ)
        axes[(*count)++] = calcJoystickPos(ji.dwZpos, jc.wZmin, jc.wZmax);

    if (jc.wCaps & JOYCAPS_HASR)
        axes[(*count)++] = calcJoystickPos(ji.dwRpos, jc.wRmin, jc.wRmax);

    if (jc.wCaps & JOYCAPS_HASU)
        axes[(*count)++] = calcJoystickPos(ji.dwUpos, jc.wUmin, jc.wUmax);

    if (jc.wCaps & JOYCAPS_HASV)
        axes[(*count)++] = -calcJoystickPos(ji.dwVpos, jc.wVmin, jc.wVmax);

    return axes;
}
Пример #2
0
int _glfwPlatformGetJoystickButtons( int joy, unsigned char *buttons,
    int numbuttons )
{
    JOYCAPS   jc;
    JOYINFOEX ji;
    int       button;

//  return 0;

    // Is joystick present?
    if( !_glfwJoystickPresent( 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
    button = 0;
    while( button < numbuttons && button < (int) jc.wNumButtons )
    {
        buttons[ button ] = (unsigned char)
            (ji.dwButtons & (1UL << button) ? GLFW_PRESS : GLFW_RELEASE);
        button ++;
    }

    return button;
}
Пример #3
0
int _glfwPlatformGetJoystickPos( int joy, float *pos, int numaxes )
{
    JOYCAPS   jc;
    JOYINFOEX ji;
    int       axis;

//  return 0;

    // Is joystick present?
    if( !_glfwJoystickPresent( 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++ ] = _glfwCalcJoystickPos( ji.dwXpos, jc.wXmin,
                                              jc.wXmax );
    }
    if( axis < numaxes )
    {
        pos[ axis++ ] = -_glfwCalcJoystickPos( ji.dwYpos, jc.wYmin,
                                               jc.wYmax );
    }
    if( axis < numaxes && jc.wCaps & JOYCAPS_HASZ )
    {
        pos[ axis++ ] = _glfwCalcJoystickPos( ji.dwZpos, jc.wZmin,
                                              jc.wZmax );
    }
    if( axis < numaxes && jc.wCaps & JOYCAPS_HASR )
    {
        pos[ axis++ ] = _glfwCalcJoystickPos( ji.dwRpos, jc.wRmin,
                                              jc.wRmax );
    }
    if( axis < numaxes && jc.wCaps & JOYCAPS_HASU )
    {
        pos[ axis++ ] = _glfwCalcJoystickPos( ji.dwUpos, jc.wUmin,
                                              jc.wUmax );
    }
    if( axis < numaxes && jc.wCaps & JOYCAPS_HASV )
    {
        pos[ axis++ ] = -_glfwCalcJoystickPos( ji.dwVpos, jc.wVmin,
                                               jc.wVmax );
    }

    // Return number of returned axes
    return axis;
}
Пример #4
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;
}
Пример #5
0
unsigned char* _glfwPlatformGetJoystickButtons(int joy, int* count)
{
    JOYCAPS jc;
    JOYINFOEX ji;
    unsigned char* buttons = _glfw.win32.joystick[joy].buttons;

    if (_glfw_joyGetDevCaps(joy, &jc, sizeof(JOYCAPS)) != JOYERR_NOERROR)
        return NULL;

    ji.dwSize = sizeof(JOYINFOEX);
    ji.dwFlags = JOY_RETURNBUTTONS | JOY_RETURNPOV;
    if (_glfw_joyGetPosEx(joy, &ji) != JOYERR_NOERROR)
        return NULL;

    while (*count < jc.wNumButtons)
    {
        buttons[*count] = (unsigned char)
            (ji.dwButtons & (1UL << *count) ? GLFW_PRESS : GLFW_RELEASE);
        (*count)++;
    }

    // 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

    if ((jc.wCaps & JOYCAPS_HASPOV) && (jc.wCaps & JOYCAPS_POV4DIR))
    {
        int i, value = ji.dwPOV / 100 / 45;

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

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

        for (i = 0;  i < 4;  i++)
        {
            if (directions[value] & (1 << i))
                buttons[(*count)++] = GLFW_PRESS;
            else
                buttons[(*count)++] = GLFW_RELEASE;
        }
    }

    return buttons;
}
Пример #6
0
int _glfwPlatformGetJoystickAxes(int joy, float* axes, 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)
        axes[axis++] = calcJoystickPos(ji.dwXpos, jc.wXmin, jc.wXmax);

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

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

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

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

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

    return axis;
}