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 ); }