101 lines
2.9 KiB
C++
101 lines
2.9 KiB
C++
#include "InputSystem.h"
|
|||
|
|
#include "log/NLog.h"
|
||
|
|
|
||
|
|
|
||
|
|
namespace LifeCore {
|
||
|
|
InputSystem::InputSystem() {
|
||
|
|
auto hInst = GetModuleHandle(NULL);
|
||
|
|
hwnd = NULL;
|
||
|
|
|
||
|
|
WNDCLASSEX wndClass = { NULL };
|
||
|
|
|
||
|
|
wndClass.cbSize = sizeof(WNDCLASSEX);
|
||
|
|
wndClass.cbClsExtra = NULL;
|
||
|
|
wndClass.cbWndExtra = NULL;
|
||
|
|
wndClass.hbrBackground = (HBRUSH)GetStockObject(1);
|
||
|
|
wndClass.hCursor = (HCURSOR)LoadCursor(NULL, IDC_ARROW);
|
||
|
|
wndClass.hIcon = LoadIcon(hInst, IDI_APPLICATION);
|
||
|
|
wndClass.hIconSm = LoadIcon(hInst, IDI_APPLICATION);
|
||
|
|
wndClass.hInstance = hInst;
|
||
|
|
wndClass.lpfnWndProc = WndProc;
|
||
|
|
wndClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
|
||
|
|
wndClass.lpszMenuName = NULL;
|
||
|
|
wndClass.lpszClassName = _text("LifeEngineInputWindow");
|
||
|
|
|
||
|
|
if(!RegisterClassEx(&wndClass)) {
|
||
|
|
MessageBox((HWND)hwnd, _text("Can not create window class! We all gonna die!!"), _text("OH SHIT!"), MB_OK);
|
||
|
|
}
|
||
|
|
|
||
|
|
RECT NewWindowSize;
|
||
|
|
NewWindowSize.top = 30;
|
||
|
|
NewWindowSize.left = 300;
|
||
|
|
NewWindowSize.bottom = NewWindowSize.top + 100;
|
||
|
|
NewWindowSize.right = NewWindowSize.left + 100;
|
||
|
|
|
||
|
|
AdjustWindowRect(&NewWindowSize, WS_OVERLAPPEDWINDOW, false);
|
||
|
|
|
||
|
|
|
||
|
|
if(!(hwnd = (long)CreateWindowEx(NULL, _text("LifeEngineInputWindow"), _text("LifeEngine Input window"), WS_THICKFRAME,
|
||
|
|
NewWindowSize.left, NewWindowSize.top, NewWindowSize.right - NewWindowSize.left, NewWindowSize.bottom - NewWindowSize.top, NULL, NULL, hInst, NULL))) {
|
||
|
|
MessageBox((HWND)hwnd, _text("Can not create window! We all gonna die!!"), _text("HOLY SHIT!"), MB_OK);
|
||
|
|
}
|
||
|
|
|
||
|
|
SetWindowLongPtr((HWND)hwnd, GWLP_USERDATA, (long)(this));
|
||
|
|
ShowWindow((HWND)hwnd, SW_HIDE);
|
||
|
|
}
|
||
|
|
|
||
|
|
void InputSystem::Init() {
|
||
|
|
RAWINPUTDEVICE dev;
|
||
|
|
dev.usUsagePage = 1;
|
||
|
|
dev.usUsage = 2;
|
||
|
|
dev.dwFlags = 0;
|
||
|
|
dev.hwndTarget = (HWND)hwnd;
|
||
|
|
|
||
|
|
if(!RegisterRawInputDevices(&dev, 1, sizeof(dev))) {
|
||
|
|
LogInfo() << "Raw devices registration failed!";
|
||
|
|
} else {
|
||
|
|
LogInfo() << "Raw devices registered!";
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
void InputSystem::Update() {
|
||
|
|
MSG msg = { 0 };
|
||
|
|
while(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) {
|
||
|
|
TranslateMessage(&msg);
|
||
|
|
DispatchMessage(&msg);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
LRESULT __stdcall InputSystem::WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) {
|
||
|
|
switch(message) {
|
||
|
|
case WM_INPUT:
|
||
|
|
{
|
||
|
|
UINT dwSize;
|
||
|
|
GetRawInputData((HRAWINPUT)lparam, RID_INPUT, NULL, &dwSize, sizeof(RAWINPUTHEADER));
|
||
|
|
char* data = new char[dwSize];
|
||
|
|
|
||
|
|
if(GetRawInputData((HRAWINPUT)lparam, RID_INPUT, data, &dwSize, sizeof(RAWINPUTHEADER)) != dwSize) {
|
||
|
|
LogInfo() << "Wrong raw input size!";
|
||
|
|
}
|
||
|
|
|
||
|
|
RAWINPUT* inp = (RAWINPUT*)data;
|
||
|
|
if(inp->header.dwType == RIM_TYPEMOUSE) {
|
||
|
|
LogInfo() << "Read mouse input2!";
|
||
|
|
LogInfo() << "Buttons: " << inp->data.mouse.ulButtons;
|
||
|
|
}
|
||
|
|
|
||
|
|
long val = GetWindowLongPtr(hwnd, GWLP_USERDATA);
|
||
|
|
if(val) {
|
||
|
|
InputSystem* input = reinterpret_cast<InputSystem*>(val);
|
||
|
|
LogInfo() << "OnInput";
|
||
|
|
//wnd->OnInput();
|
||
|
|
}
|
||
|
|
|
||
|
|
delete[] data;
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
return DefWindowProc(hwnd, message, wparam, lparam);
|
||
|
|
}
|
||
|
|
}
|