// // Created by Epagris on 2020. 03. 01.. // #include "EventHandler.h" #include "Logger.h" #include 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(key, cbAData)); } void eg3d::EventHandler::regMouseCB(EventType et, const CB_AssigmentData& cbAData) { mMouseAssignments.insert(std::pair(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((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; }