-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathInput.cpp
More file actions
128 lines (103 loc) · 2.43 KB
/
Input.cpp
File metadata and controls
128 lines (103 loc) · 2.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include "stdafx.h"
#include "Input.h"
#include "System.h"
Input::Input()
{
}
Input::Input(const Input&)
{
}
Input* Input::createInstance()
{
static bool exists = false;
if (!exists)
{
exists = true;
return new Input();
}
else
{
ErrorSafe("Can not create multiple instances of System.");
return nullptr;
}
}
bool Input::initialise()
{
keys.resize(256, false);
deltaMouseX = deltaMouseY = 0;
RAWINPUTDEVICE rIDev[2];
//Mouse
rIDev[0].dwFlags = 0;
rIDev[0].hwndTarget = 0;
rIDev[0].usUsage = 0x02;
rIDev[0].usUsagePage = 0x01;
//keyboad
rIDev[1].dwFlags = 0;
rIDev[1].hwndTarget = 0;
rIDev[1].usUsage = 0x06;
rIDev[1].usUsagePage = 0x01;
if (!RegisterRawInputDevices(rIDev, 2, sizeof(rIDev[0])))
return false;
return true;
}
void Input::shutdown() {}
void Input::frame(MSG& msg)
{
static UINT dwSize;
GetRawInputData((HRAWINPUT)msg.lParam, RID_INPUT, NULL, &dwSize, sizeof(RAWINPUTHEADER));
RAWINPUT* buffer = (RAWINPUT*)malloc(dwSize);
if (GetRawInputData((HRAWINPUT)msg.lParam, RID_INPUT, buffer, &dwSize, sizeof(RAWINPUTHEADER)))
{
//if keyboard
if (buffer->header.dwType == RIM_TYPEKEYBOARD)
{
//key down
if (buffer->data.keyboard.Flags == RI_KEY_MAKE)
{
if (buffer->data.keyboard.VKey == Input::Code::Esc)
PostQuitMessage(0);
keys[buffer->data.keyboard.VKey] = true;
}
//key up
else if
(buffer->data.keyboard.Flags == RI_KEY_BREAK)
{
keys[buffer->data.keyboard.VKey] = false;
}
}
//if mouse
//Checks border stuff too
else if (buffer->header.dwType == RIM_TYPEMOUSE)
{
buffer->data.mouse.ulButtons;
deltaMouseX = buffer->data.mouse.lLastX;
deltaMouseY = buffer->data.mouse.lLastY;
POINT centrePos = { systemptr->displaySet.screenWidth / 2, systemptr->displaySet.screenHeight / 2 };
ClientToScreen(systemptr->hwnd(), ¢rePos);
SetCursorPos(centrePos.x, centrePos.y);
}
}
free(buffer);
}
bool Input::onKeyDown(WPARAM key)
{
return keys[key];
}
bool Input::onKeyUp(WPARAM key)
{
return !keys[key];
}
math::vec2 Input::getMousePos()
{
static POINT mousePos;
GetCursorPos(&mousePos);
ScreenToClient(systemptr->hwnd(), &mousePos);
return math::vec2(((float)mousePos.x / systemptr->displaySet.screenWidth-0.5f)*2.f,
((float)mousePos.y / systemptr->displaySet.screenHeight-0.5f)*2.f);
}
math::vec2 Input::getMouseMovement()
{
math::vec2 out((float)deltaMouseX, (float)deltaMouseY);
deltaMouseX = deltaMouseY = 0;
return out;
}