diff --git a/DXWindow.cpp b/DXWindow.cpp index 042e45b..003de22 100644 --- a/DXWindow.cpp +++ b/DXWindow.cpp @@ -9,9 +9,6 @@ namespace eg3d { { init(); initDrawObjects(); - - rotAngle = 0.0f; - camPosition = 0.0f; } @@ -376,7 +373,7 @@ namespace eg3d { void DXWindow::updateConstantBuffers() { - DirectX::XMStoreFloat4x4(&constantBuffer.transformMatrix, XMMatrixRotationX(-XM_PIDIV2)); + DirectX::XMStoreFloat4x4(&constantBuffer.transformMatrix, XMMatrixTranspose(XMMatrixRotationX(-XM_PIDIV2))); // TODO vetítés mátrixának kicserélése float viewHeight = 1.5; diff --git a/EventHandler.cpp b/EventHandler.cpp index 17961d6..293ff91 100644 --- a/EventHandler.cpp +++ b/EventHandler.cpp @@ -5,6 +5,19 @@ #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(); } @@ -13,8 +26,6 @@ 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 @@ -22,18 +33,45 @@ 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 - EventHandler * pThis_EH = static_cast((void *)GetWindowLongPtrA(hwnd, GWLP_USERDATA))->getEventHandler(); // ablakhoz rendelt eseménykezelő elkérése + 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)); @@ -45,39 +83,113 @@ int eg3d::EventHandler::processEvent(HWND hwnd, UINT message, WPARAM wParam, LPA int displacementX = pRawInput->data.mouse.lLastX; int displacementY = pRawInput->data.mouse.lLastY; - LOG(std::string("(") + std::to_string(displacementX) + ", " + std::to_string(displacementY) + ")"); + 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: { - switch (wParam) - { - case 'W': - pThis_EH->mCamVelocity = -cCAM_VELOCITY; - break; - case 'S': - pThis_EH->mCamVelocity = cCAM_VELOCITY; - break; - case 'L': + et = ET_KeyDown; // esemény típusának beállítása + + if (wParam == 'L') { pThis_EH->mMouseLocked = !pThis_EH->mMouseLocked; - LOG(std::string("Mouse ") + (pThis_EH->mMouseLocked ? "" : "un") + "locked"); - break; + + 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 - } - break; - - case WM_KEYUP: - { - if (wParam == 'W' || wParam == 'S') + // esemény lekezelése + if (mKeyAssigments.find(wParam) != mKeyAssigments.end()) { - pThis_EH->mCamVelocity = 0.0f; - } - } + CB_AssigmentData cbAData = mKeyAssigments[wParam]; - break; + 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; diff --git a/EventHandler.h b/EventHandler.h index ff9e640..c7f9dd4 100644 --- a/EventHandler.h +++ b/EventHandler.h @@ -1,21 +1,67 @@ #pragma once #include +#include +#include "IHasDefault.h" namespace eg3d { + class EventHandler; + + // esemény-típusok + enum EventType { ET_KeyUp, ET_KeyDown, ET_LMouseDown, ET_LMouseUp, ET_RMouseDown, ET_RMouseUp, ET_MouseMove, ET_None }; + + // esemény-callback adat + struct EventHandlerCBData + { + EventHandler * pEH; // eseménykezelő pointere + EventType eventType; // lenyomás vagy felengedés + void * pUser; // egyéb információ + int data[4]; // egyéb adat + + HWND hwnd; // ablak fogantyúja + UINT message; // üzenet + WPARAM wParam; // ... + LPARAM lParam; // ... + }; + + typedef void (CB_EH)(EventHandlerCBData *); // callback-függvény típusa + + struct CB_AssigmentData : public IHasDefault // hozzárendelési struktúra + { + EventType eventType; // esemény típusa, melyhez hozzárendelünk + CB_EH * pcbFunction; // callback-függvény pointere + void * pUser; // tetszőleges adat pointere + + CB_AssigmentData(); // konstr. + void loadDefaults() override; + }; + + struct MouseDisplacement // egér-elmozdulás objektuma + { + int dx, dy; + }; + class EventHandler { private: float mCamVelocity; // kamera mozgási sebessége bool mMouseLocked; // lockolvan van az egér? void init(); // osztály inicializálása + + std::multimap mMouseAssignments; // egér-hozzárendelések + std::multimap mKeyAssigments; // billentyű-hozzárendelések + MouseDisplacement mMouseDisplacement; // public: static constexpr float cCAM_VELOCITY = 0.05; EventHandler(); // konstr. int processEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); // esemény feldolgozása (0 -> feldolgozva, 1 -> nincs feldolgozva) float getCamVelocity() const; // kamera sebességének lekérése + + void regKeyCB(char key, const CB_AssigmentData& cbAData); // billentyűesemények hozzárendelése + void regMouseCB(EventType et, const CB_AssigmentData& cbAData); // egéresemények hozzárendelése + MouseDisplacement getMouseDisplacement(); // egér elmozdulásának elkérése }; -} \ No newline at end of file +} diff --git a/main.cpp b/main.cpp index a214380..102f6a9 100644 --- a/main.cpp +++ b/main.cpp @@ -27,6 +27,11 @@ void CB_FPSaux(eg3d::Timer *pTimer, const double *pTrigTimeElapsed, void *ptr) { using namespace eg3d; +void keyCB(EventHandlerCBData * pCBData) +{ + LOG("Key pressed!"); +} + int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgs, int nWinMode) { eg3d::DXWindow win; // megjelenĂ­tĂ©s be, alapĂ©rtelmezett window procedure használata @@ -36,6 +41,11 @@ int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszA EventHandler eventHandler; win.setEventHandler(&eventHandler); + CB_AssigmentData cbAData; + cbAData.pcbFunction = keyCB; + cbAData.pUser = nullptr; + eventHandler.regKeyCB('Z', cbAData); + // FPS-mĂ©rĹ‘ callback-fĂĽggvĂ©ny regisztrálása TimerCallbackData timerCBData; timerCBData.callBackFn = CB_FPSaux; @@ -78,7 +88,6 @@ int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszA { Sleep(15); - win.moveCam(eventHandler.getCamVelocity()); // kamera elmozdĂ­tása win.Draw(drawables); // kirajzolás gFrames++; // kĂ©pkockaszám lĂ©ptetĂ©se