Beispiel #1
0
void CLFE_Input::CaptureMouse()
{
    if(NULL == m_pMouseState)
    {
        return;
    }

    m_pMouseState->m_nRelX = 0;
    m_pMouseState->m_nRelY = 0;
    m_pMouseState->m_nRelZ = 0;

    DIDEVICEOBJECTDATA diBuff[MOUSE_DX_BUFFERSIZE];
    DWORD entries = MOUSE_DX_BUFFERSIZE;

    HRESULT hr = m_pMouse->GetDeviceData(sizeof(DIDEVICEOBJECTDATA), diBuff, &entries, 0);
    if( hr != DI_OK )
    {
        hr = m_pMouse->Acquire();
        while( hr == DIERR_INPUTLOST )
            hr = m_pMouse->Acquire();

        hr = m_pMouse->GetDeviceData( sizeof(DIDEVICEOBJECTDATA), diBuff, &entries, 0 );

        if( FAILED(hr) )
        {
            ResetMousePos();
            return;
        }
    }

    bool axesMoved = false;

    for(unsigned int i = 0; i < entries; ++i )
    {
        switch( diBuff[i].dwOfs )
        {
        case DIMOFS_BUTTON0:
            if(!DoMouseClick(0, diBuff[i])) return;
            break;
        case DIMOFS_BUTTON1:
            if(!DoMouseClick(1, diBuff[i])) return;
            break;
        case DIMOFS_BUTTON2:
            if(!DoMouseClick(2, diBuff[i])) return;
            break;
        case DIMOFS_BUTTON3:
            if(!DoMouseClick(3, diBuff[i])) return;
            break;
        case DIMOFS_BUTTON4:
            if(!DoMouseClick(4, diBuff[i])) return;
            break;
        case DIMOFS_BUTTON5:
            if(!DoMouseClick(5, diBuff[i])) return;
            break;
        case DIMOFS_BUTTON6:
            if(!DoMouseClick(6, diBuff[i])) return;
            break;
        case DIMOFS_BUTTON7:
            if(!DoMouseClick(7, diBuff[i])) return;
            break;
        case DIMOFS_X:
            m_pMouseState->m_nRelX += diBuff[i].dwData;
            axesMoved = true;
            break;
        case DIMOFS_Y:
            m_pMouseState->m_nRelY += diBuff[i].dwData;
            axesMoved = true;
            break;
        case DIMOFS_Z:
            m_pMouseState->m_nRelZ += diBuff[i].dwData;
            axesMoved = true;
            break;
        default:
            break;
        } //end switch
    }//end for

    if( axesMoved )
    {
        if( m_dwMouseCoopSetting & DISCL_NONEXCLUSIVE )
        {
            //DirectInput provides us with meaningless values, so correct that
            POINT point;
            GetCursorPos(&point);
            ScreenToClient(m_hWnd, &point);
            m_pMouseState->m_nAbsX = point.x;
            m_pMouseState->m_nAbsY = point.y;
        }
        else
        {
            m_pMouseState->m_nAbsX +=  m_pMouseState->m_nRelX;
            m_pMouseState->m_nAbsY +=  m_pMouseState->m_nRelY;
        }
        m_pMouseState->m_nAbsZ +=  m_pMouseState->m_nRelZ;

        //Clip values to window
        if( m_pMouseState->m_nAbsX < 0 )
            m_pMouseState->m_nAbsX = 0;
        else if( m_pMouseState->m_nAbsX > m_pMouseState->m_nWindowWidth )
            m_pMouseState->m_nAbsX = m_pMouseState->m_nWindowWidth;
        if( m_pMouseState->m_nAbsY < 0 )
            m_pMouseState->m_nAbsY = 0;
        else if( m_pMouseState->m_nAbsY > m_pMouseState->m_nWindowHeight )
            m_pMouseState->m_nAbsY = m_pMouseState->m_nWindowHeight;

        //Do the move
        if( m_pMouseListener && m_bBuffered )
            m_pMouseListener->MouseMoved(m_pMouseState);
    }
}
static void mouse_button_callback( GLFWwindow* window, int button, int action, int mods )
{
	DoMouseClick( button, action, mods );
}