Program Listing for File inputSystem.cpp
↰ Return to documentation for file (PrismEngine/src/inputSystem.cpp)
#include "inputSystem.h"
#include "inputResource.h"
#include "windowResource.h"
void prism::scene::InputSystem::start()
{
if (scene->hasResource<InputResource>()) {
scene->getResource<InputResource>()->disableAllKey();
}
}
void prism::scene::InputSystem::update()
{
if (scene->hasResource<InputResource>()) {
scene->getResource<InputResource>()->updateKeyStates();
scene->getResource<InputResource>()->resetStuckKeys();
}
SDL_Event event;
while (SDL_PollEvent(&event)) {
switch (event.type) {
case SDL_QUIT:
case SDL_WINDOWEVENT:
processWindowEvent(event);
break;
case SDL_KEYDOWN:
case SDL_KEYUP:
processKeyboardEvent(event);
break;
case SDL_MOUSEMOTION:
case SDL_MOUSEBUTTONDOWN:
case SDL_MOUSEBUTTONUP:
case SDL_MOUSEWHEEL:
processMouseEvent(event);
break;
default:
break;
}
}
}
void prism::scene::InputSystem::processKeyboardEvent(SDL_Event event)
{
if (scene->hasResource<InputResource>()) {
SDL_Scancode scancode = event.key.keysym.scancode;
KeyCode keyCode = sdlScancodeToKeyCode(scancode);
if (keyCode == KeyCode::Unknown) {
return;
}
switch (event.type) {
case SDL_KEYDOWN:
if (event.key.repeat == 0) {
scene->getResource<InputResource>()->enableKey(keyCode);
}
break;
case SDL_KEYUP:
scene->getResource<InputResource>()->disableKey(keyCode);
break;
default:
break;
}
}
}
void prism::scene::InputSystem::processMouseEvent(SDL_Event event)
{
if (!scene->hasResource<InputResource>()) return;
auto input = scene->getResource<InputResource>();
switch (event.type) {
case SDL_MOUSEMOTION:
input->mouseX = static_cast<double>(event.motion.x);
input->mouseY = static_cast<double>(event.motion.y);
break;
case SDL_MOUSEBUTTONDOWN:
input->enableMouseKey(sdlButtonToMouseCode(event.button.button));
break;
case SDL_MOUSEBUTTONUP:
input->disableMouseKey(sdlButtonToMouseCode(event.button.button));
break;
case SDL_MOUSEWHEEL:
input->mouseScrollX = static_cast<double>(event.wheel.x);
input->mouseScrollY = static_cast<double>(event.wheel.y);
break;
}
}
void prism::scene::InputSystem::processWindowEvent(SDL_Event event) {
WindowResource* window = scene->getResource<WindowResource>();
if (event.type == SDL_QUIT) {
window->close();
}
if (event.window.event == SDL_WINDOWEVENT_RESIZED) {
window->windowResized = true;
}
else if (event.window.event == SDL_WINDOWEVENT_MINIMIZED) {
window->windowMinimized = true;
}
else if (event.window.event == SDL_WINDOWEVENT_RESTORED) {
window->windowMinimized = false;
}
}