// ---------------------------------------------------------------- // From Game Programming in C++ by Sanjay Madhav // Copyright (C) 2017 Sanjay Madhav. All rights reserved. // // Released under the BSD License // See LICENSE in root directory for full details. // ---------------------------------------------------------------- #include "InputSystem.h" #include #include bool KeyboardState::GetKeyValue(int keyCode) const { return mCurrState[keyCode] == 1; } ButtonState KeyboardState::GetKeyState(int keyCode) const { if (mPrevState[keyCode] == 0) { if (mCurrState[keyCode] == 0) { return ENone; } else { return EPressed; } } else // Prev state must be 1 { if (mCurrState[keyCode] == 0) { return EReleased; } else { return EHeld; } } } bool MouseState::GetButtonValue(int button) const { return (SDL_BUTTON(button) & mCurrButtons) == 1; } ButtonState MouseState::GetButtonState(int button) const { int mask = SDL_BUTTON(button); if ((mask & mPrevButtons) == 0) { if ((mask & mCurrButtons) == 0) { return ENone; } else { return EPressed; } } else { if ((mask & mCurrButtons) == 0) { return EReleased; } else { return EHeld; } } } bool InputSystem::Initialize() { // Keyboard // Assign current state pointer mState.Keyboard.mCurrState = SDL_GetKeyboardState(NULL); // Clear previous state memory memset(mState.Keyboard.mPrevState, 0, SDL_NUM_SCANCODES); // Mouse (just set everything to 0) mState.Mouse.mCurrButtons = 0; mState.Mouse.mPrevButtons = 0; return true; } void InputSystem::Shutdown() { } void InputSystem::PrepareForUpdate() { // Copy current state to previous // Keyboard memcpy(mState.Keyboard.mPrevState, mState.Keyboard.mCurrState, SDL_NUM_SCANCODES); // Mouse mState.Mouse.mPrevButtons = mState.Mouse.mCurrButtons; mState.Mouse.mIsRelative = false; mState.Mouse.mScrollWheel = Vector2::Zero; } void InputSystem::Update() { // Mouse int x = 0, y = 0; if (mState.Mouse.mIsRelative) { mState.Mouse.mCurrButtons = SDL_GetRelativeMouseState(&x, &y); } else { mState.Mouse.mCurrButtons = SDL_GetMouseState(&x, &y); } mState.Mouse.mMousePos.x = static_cast(x); mState.Mouse.mMousePos.y = static_cast(y); } void InputSystem::ProcessEvent(SDL_Event& event) { switch (event.type) { case SDL_MOUSEWHEEL: mState.Mouse.mScrollWheel = Vector2( static_cast(event.wheel.x), static_cast(event.wheel.y)); break; default: break; } } void InputSystem::SetRelativeMouseMode(bool value) { SDL_bool set = value ? SDL_TRUE : SDL_FALSE; SDL_SetRelativeMouseMode(set); mState.Mouse.mIsRelative = value; }