Example #1
0
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;
		}
	}
	
	
}
Example #2
0
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;
	}
	
}