void Input::update(float time) { backend->update(); bool keyJustPressed = false; iKeyId = -1; int modifier = 0; for(int i = 0; i < Keyboard::KeyCount; i++) { if(isKeyPressed(i)) { switch(i) { case Keyboard::Key_LeftShift: case Keyboard::Key_RightShift: case Keyboard::Key_LeftCtrl: case Keyboard::Key_RightCtrl: case Keyboard::Key_LeftAlt: case Keyboard::Key_RightAlt: modifier = i; break; } if(keysStates[i] < 2) { keysStates[i]++; } if(!keyJustPressed) { if(keysStates[i] == 1) { iKeyId = i; keyJustPressed = true; } else { iKeyId = i; } } } else { if(keysStates[i] > 0) { keysStates[i]--; } } } if(modifier != 0 && iKeyId != modifier) { iKeyId |= (modifier << 16); } if(iKeyId >= 0) { //keys priority switch(iKeyId) { case Keyboard::Key_LeftShift: case Keyboard::Key_RightShift: case Keyboard::Key_LeftCtrl: case Keyboard::Key_RightCtrl: case Keyboard::Key_LeftAlt: case Keyboard::Key_RightAlt: { bool bFound = false; for(int i = 0; i < Keyboard::KeyCount; i++) { if(bFound) { break; } switch(i & 0xFFFF) { case Keyboard::Key_LeftShift: case Keyboard::Key_RightShift: case Keyboard::Key_LeftCtrl: case Keyboard::Key_RightCtrl: case Keyboard::Key_LeftAlt: case Keyboard::Key_RightAlt: continue; default: { if(keysStates[i]) { bFound = true; iKeyId &= ~0xFFFF; iKeyId |= i; } break; } } } } } } const PlatformInstant now = g_platformTime.frameStart(); for(int buttonId = Mouse::ButtonBase; buttonId < Mouse::ButtonMax; buttonId++) { int i = buttonId - Mouse::ButtonBase; int iNumClick; int iNumUnClick; backend->getMouseButtonClickCount(buttonId, iNumClick, iNumUnClick); iOldNumClick[i] += iNumClick + iNumUnClick; if(!bMouseButton[i] && iOldNumClick[i] == iNumUnClick) { iOldNumClick[i] = 0; } bOldMouseButton[i] = bMouseButton[i]; if(bMouseButton[i]) { if(iOldNumClick[i]) { bMouseButton[i] = false; } } else { if(iOldNumClick[i]) { bMouseButton[i] = true; } } if(iOldNumClick[i]) { iOldNumClick[i]--; } if(iMouseTimeSet[i] > 1 || (iMouseTimeSet[i] == 1 && now - iMouseTime[i][0] > PlatformDurationMs(300))) { iMouseTime[i][0] = 0; iMouseTime[i][1] = 0; iMouseTimeSet[i] = 0; } if(getMouseButtonNowPressed(buttonId)) { switch(iMouseTimeSet[i]) { case 0: iMouseTime[i][0] = now; iMouseTimeSet[i]++; break; case 1: iMouseTime[i][1] = now; iMouseTimeSet[i]++; break; } } } // Get the new coordinates int absX, absY; mouseInWindow = backend->getAbsoluteMouseCoords(absX, absY); Vec2s newMousePosition(absX, absY); Vec2i wndSize = mainApp->getWindow()->getSize(); if(absX >= 0 && absX < wndSize.x && absY >= 0 && absY < wndSize.y) { // Use the absolute mouse position reported by the backend, as is if(m_mouseMode == Mouse::Absolute) { iMouseA = newMousePosition; } else { iMouseA = wndSize / s32(2); } } else { mouseInWindow = false; } int relX, relY; backend->getRelativeMouseCoords(relX, relY, iWheelDir); if(m_mouseMode == Mouse::Relative) { if(m_useRawMouseInput) { m_mouseMovement = Vec2f(relX * 2, relY * 2); } else { m_mouseMovement = Vec2f(newMousePosition - m_lastMousePosition); if(newMousePosition != m_lastMousePosition) { centerMouse(); } else { m_lastMousePosition = newMousePosition; } } // Use the sensitivity config value to adjust relative mouse mouvements m_mouseMovement *= m_mouseSensitivity; if(m_mouseAcceleration > 0 && time > 0.0f) { Vec2f speed = m_mouseMovement / (time * 0.14f); Vec2f sign(speed.x < 0 ? -1.f : 1.f, speed.y < 0 ? -1.f : 1.f); float exponent = 1.f + m_mouseAcceleration * 0.05f; speed.x = (std::pow(speed.x * sign.x + 1.f, exponent) - 1.f) * sign.x; speed.y = (std::pow(speed.y * sign.y + 1.f, exponent) - 1.f) * sign.y; m_mouseMovement = speed * (time * 0.14f); } if(m_invertMouseY) { m_mouseMovement.y *= -1.f; } if(!mouseInWindow) { LogWarning << "Cursor escaped the window while in relative input mode"; centerMouse(); } } else { m_mouseMovement = Vec2f_ZERO; if(!m_useRawMouseInput) { m_lastMousePosition = newMousePosition; } } }
void Input::update() { backend->update(); bool keyJustPressed = false; iKeyId = -1; int modifier = 0; for(int i = 0; i < Keyboard::KeyCount; i++) { if(isKeyPressed(i)) { switch(i) { case Keyboard::Key_LeftShift: case Keyboard::Key_RightShift: case Keyboard::Key_LeftCtrl: case Keyboard::Key_RightCtrl: case Keyboard::Key_LeftAlt: case Keyboard::Key_RightAlt: modifier = i; break; } if(keysStates[i] < 2) { keysStates[i]++; } if(!keyJustPressed) { if(keysStates[i] == 1) { iKeyId = i; keyJustPressed = true; } else { iKeyId = i; } } } else { if(keysStates[i] > 0) { keysStates[i]--; } } } if(modifier != 0 && iKeyId != modifier) { iKeyId |= (modifier << 16); } if(iKeyId >= 0) { //keys priority switch(iKeyId) { case Keyboard::Key_LeftShift: case Keyboard::Key_RightShift: case Keyboard::Key_LeftCtrl: case Keyboard::Key_RightCtrl: case Keyboard::Key_LeftAlt: case Keyboard::Key_RightAlt: { bool bFound=false; for(int i = 0; i < Keyboard::KeyCount; i++) { if(bFound) { break; } switch(i & 0xFFFF) { case Keyboard::Key_LeftShift: case Keyboard::Key_RightShift: case Keyboard::Key_LeftCtrl: case Keyboard::Key_RightCtrl: case Keyboard::Key_LeftAlt: case Keyboard::Key_RightAlt: continue; default: { if(keysStates[i]) { bFound=true; iKeyId&=~0xFFFF; iKeyId|=i; } } break; } } } } } const s64 now = platform::getTimeMs(); for(int buttonId = Mouse::ButtonBase; buttonId < Mouse::ButtonMax; buttonId++) { int i = buttonId - Mouse::ButtonBase; int iNumClick; int iNumUnClick; backend->getMouseButtonClickCount(buttonId, iNumClick, iNumUnClick); iOldNumClick[i] += iNumClick + iNumUnClick; if(!bMouseButton[i] && iOldNumClick[i] == iNumUnClick) { iOldNumClick[i] = 0; } bOldMouseButton[i] = bMouseButton[i]; if(bMouseButton[i]) { if(iOldNumClick[i]) { bMouseButton[i] = false; } } else { if(iOldNumClick[i]) { bMouseButton[i] = true; } } if(iOldNumClick[i]) iOldNumClick[i]--; int iDTime; backend->isMouseButtonPressed(buttonId, iDTime); if(iDTime) { iMouseTime[i] = iDTime; iMouseTimeSet[i] = 2; } else { if(iMouseTimeSet[i] > 0 && (now - iMouseTime[i]) > 300) { iMouseTime[i] = 0; iMouseTimeSet[i] = 0; } if(getMouseButtonNowPressed(buttonId)) { switch(iMouseTimeSet[i]) { case 0: iMouseTime[i] = now; iMouseTimeSet[i]++; break; case 1: iMouseTime[i] = now - iMouseTime[i]; iMouseTimeSet[i]++; break; } } } } // Get the new coordinates int absX, absY; mouseInWindow = backend->getAbsoluteMouseCoords(absX, absY); Vec2s newMousePosition(absX, absY); Vec2i wndSize = mainApp->getWindow()->getSize(); if(absX >= 0 && absX < wndSize.x && absY >= 0 && absY < wndSize.y) { // Use the absolute mouse position reported by the backend, as is if(m_mouseMode == Mouse::Absolute) { iMouseA = newMousePosition; } else { iMouseA = wndSize / s32(2); } } else { mouseInWindow = false; } int relX, relY; backend->getRelativeMouseCoords(relX, relY, iWheelDir); if(m_mouseMode == Mouse::Relative) { if(m_useRawMouseInput) { iMouseR = Vec2s(relX * 2, relY * 2); } else { iMouseR = newMousePosition - m_lastMousePosition; m_lastMousePosition = newMousePosition; if(iMouseR != Vec2s_ZERO) { centerMouse(); } } // Use the sensitivity config value to adjust relative mouse mouvements float fSensMax = 1.f / 6.f; float fSensMin = 2.f; float fSens = ( ( fSensMax - fSensMin ) * ( (float)iSensibility ) / 10.f ) + fSensMin; fSens = std::pow(0.7f, fSens) * 2.f; iMouseR *= fSens; if(!mouseInWindow) { LogWarning << "Cursor escaped the window while in relative input mode"; centerMouse(); } } else { iMouseR = Vec2s_ZERO; m_lastMousePosition = newMousePosition; } }