grafika-latest-working/EventHandler.cpp

199 lines
4.4 KiB
C++

//
// Created by Epagris on 2020. 03. 01..
//
#include "EventHandler.h"
#include "Logger.h"
#include <hidusage.h>
eg3d::CB_AssigmentData::CB_AssigmentData()
{
loadDefaults();
}
void eg3d::CB_AssigmentData::loadDefaults()
{
eventType = ET_None;
pcbFunction = nullptr;
pUser = nullptr;
}
eg3d::EventHandler::EventHandler() {
init();
}
void eg3d::EventHandler::init()
{
mCamVelocity = 0.0f; // kamera sebességének inicializációja
mMouseLocked = false; // nincs befogva az egér
}
float eg3d::EventHandler::getCamVelocity() const
{
return mCamVelocity;
}
void eg3d::EventHandler::regKeyCB(char key, const CB_AssigmentData& cbAData)
{
mKeyAssigments.insert(std::pair<char, CB_AssigmentData>(key, cbAData));
}
void eg3d::EventHandler::regMouseCB(EventType et, const CB_AssigmentData& cbAData)
{
mMouseAssignments.insert(std::pair<EventType, CB_AssigmentData>(et, cbAData));
}
eg3d::MouseDisplacement eg3d::EventHandler::getMouseDisplacement()
{
MouseDisplacement md = mMouseDisplacement;
mMouseDisplacement.dx = 0;
mMouseDisplacement.dy = 0;
return md;
}
// -----------------------------------
int eg3d::EventHandler::processEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
// TODO eseménykezelés megvalósítása
Window * pWindow = static_cast<Window *>((void *)GetWindowLongPtrA(hwnd, GWLP_USERDATA));
EventHandler * pThis_EH = pWindow->getEventHandler(); // ablakhoz rendelt eseménykezelõ elkérése
UINT rawDataLength = 64;
BYTE pRawData[64];
EventType et;
switch (message)
{
// ----------------
// RAW-INPUT KEZELÉSE
// ----------------
case WM_INPUT:
{
GetRawInputData((HRAWINPUT)lParam, RID_INPUT, pRawData, &rawDataLength, sizeof(RAWINPUTHEADER));
RAWINPUT * pRawInput = (RAWINPUT *)pRawData;
if (pRawInput->header.dwType == RIM_TYPEMOUSE)
{
int displacementX = pRawInput->data.mouse.lLastX;
int displacementY = pRawInput->data.mouse.lLastY;
pThis_EH->mMouseDisplacement.dx += displacementX;
pThis_EH->mMouseDisplacement.dy += displacementY;
//LOG(std::string("(") + std::to_string(displacementX) + ", " + std::to_string(displacementY) + ")");
}
}
break;
// ----------------
// EGÉRESEMÉNYEK KEZELÉSE
// ----------------
case WM_LBUTTONDOWN:
et = ET_LMouseDown;
case WM_LBUTTONUP:
et = ET_LMouseUp;
case WM_RBUTTONDOWN:
et = ET_RMouseDown;
case WM_RBUTTONUP: {
et = ET_RMouseUp;
auto assigments = mMouseAssignments.equal_range(et); // hozzárendelések elkérése
auto rangeBegin = assigments.first;
auto rangeEnd = assigments.second;
if (rangeBegin == rangeEnd) // ha nincs találat, akkor kilépünk
{
break;
}
// esemény-adatok kitöltése
EventHandlerCBData cbData;
cbData.pEH = pThis_EH; // eseménykezelõ pointere
cbData.eventType = et; // esemény típusa
cbData.hwnd = hwnd; // ablak fogantyúja
cbData.message = message; // üzenet
cbData.wParam = wParam; // ...
cbData.lParam = lParam; // ...
for (auto iter = rangeBegin; iter != rangeEnd; iter++)
{
cbData.pUser = iter->second.pUser; // elõre definiált pointer beállítása
iter->second.pcbFunction(&cbData); // függvény meghívása
}
break;
}
// ----------------
// BILLENTYÛZET-KEZELÉS
// ----------------
case WM_KEYDOWN:
{
et = ET_KeyDown; // esemény típusának beállítása
if (wParam == 'L') {
pThis_EH->mMouseLocked = !pThis_EH->mMouseLocked;
bool locked = pThis_EH->mMouseLocked;
LOG(std::string("Mouse ") + (locked ? "" : "un") + "locked");
if (locked == true) {
RECT clipRect = pWindow->getRect();
LONG width = clipRect.right - clipRect.left;
LONG height = clipRect.bottom - clipRect.top;
clipRect.top += height / 2;
clipRect.bottom = clipRect.top + 1;
clipRect.left += width / 2;
clipRect.right = clipRect.left + 1;
ClipCursor(&clipRect);
}
else {
ClipCursor(nullptr);
}
}
} // DIRECT NINCS BREAK
case WM_KEYUP: {
et = ET_KeyUp; // esemény típusának beállítása
// esemény lekezelése
if (mKeyAssigments.find(wParam) != mKeyAssigments.end())
{
CB_AssigmentData cbAData = mKeyAssigments[wParam];
EventHandlerCBData cbData;
cbData.pEH = pThis_EH; // eseménykezelõ pointere
cbData.eventType = et; // esemény típusa
cbData.pUser = cbAData.pUser; // elõre definiált pointer
cbData.hwnd = hwnd; // ablak fogantyúja
cbData.message = message; // üzenet
cbData.wParam = wParam; // ...
cbData.lParam = lParam; // ...
cbAData.pcbFunction(&cbData);
}
break;
}
default:
return 1;
}
return 0;
}