reworked most input listener types to use OS events instead of checking state on update
this allows for them to be more reliable with low frameratespull/8/head
parent
b30df338ac
commit
a93d09c96c
|
@ -70,21 +70,6 @@ void input_init() {
|
||||||
g_key_states = SDL_GetKeyboardState(NULL);
|
g_key_states = SDL_GetKeyboardState(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline
|
|
||||||
void _process_axis_listener(input_listener_t* listener) {
|
|
||||||
int val = 0;
|
|
||||||
if(g_key_states[listener->axis.negative]) {
|
|
||||||
val = -1;
|
|
||||||
}
|
|
||||||
if(g_key_states[listener->axis.positive]) {
|
|
||||||
val += 1;
|
|
||||||
}
|
|
||||||
if(val != listener->axis.last) {
|
|
||||||
listener->axis.last = val;
|
|
||||||
listener->axis.delegate(val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline
|
static inline
|
||||||
void _process_mouse_listener(input_listener_t* listener, float dx, float dy) {
|
void _process_mouse_listener(input_listener_t* listener, float dx, float dy) {
|
||||||
if(dx != 0.0 && dy != 0.0) {
|
if(dx != 0.0 && dy != 0.0) {
|
||||||
|
@ -92,23 +77,6 @@ void _process_mouse_listener(input_listener_t* listener, float dx, float dy) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline
|
|
||||||
void _process_button_listener(input_listener_t* listener) {
|
|
||||||
uint32_t state = SDL_GetMouseState(NULL, NULL);
|
|
||||||
int is_down = (state & (listener->button.button)) != 0;
|
|
||||||
if(is_down != listener->button.last) {
|
|
||||||
listener->button.delegate(is_down);
|
|
||||||
}
|
|
||||||
listener->button.last = is_down;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline
|
|
||||||
void _process_scroll_listener(input_listener_t* listener) {
|
|
||||||
if(_scroll_delta != 0) {
|
|
||||||
listener->scroll.delegate(_scroll_delta);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void update_input() {
|
void update_input() {
|
||||||
float dx, dy;
|
float dx, dy;
|
||||||
int px, py;
|
int px, py;
|
||||||
|
@ -118,19 +86,8 @@ void update_input() {
|
||||||
dx = (float)(px - _last_mouse_x)/width; dy = (float)(py - _last_mouse_y)/width;
|
dx = (float)(px - _last_mouse_x)/width; dy = (float)(py - _last_mouse_y)/width;
|
||||||
|
|
||||||
for(input_listener_t* listener = g_key_listeners; listener != g_key_listeners_endptr; ++listener) {
|
for(input_listener_t* listener = g_key_listeners; listener != g_key_listeners_endptr; ++listener) {
|
||||||
switch(listener->type) {
|
if(listener->type == INPUT_LISTENER_MOUSE) {
|
||||||
case INPUT_LISTENER_AXIS:
|
|
||||||
_process_axis_listener(listener);
|
|
||||||
break;
|
|
||||||
case INPUT_LISTENER_MOUSE:
|
|
||||||
_process_mouse_listener(listener, dx, dy);
|
_process_mouse_listener(listener, dx, dy);
|
||||||
break;
|
|
||||||
case INPUT_LISTENER_SCROLL:
|
|
||||||
_process_scroll_listener(listener);
|
|
||||||
break;
|
|
||||||
case INPUT_LISTENER_BUTTON:
|
|
||||||
_process_button_listener(listener);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -140,13 +97,57 @@ void update_input() {
|
||||||
_scroll_delta = 0;
|
_scroll_delta = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
void _handle_key_event(const SDL_Event event) {
|
||||||
|
for(input_listener_t* listener = g_key_listeners; listener < g_key_listeners_endptr; ++listener) {
|
||||||
|
if(listener->type == INPUT_LISTENER_AXIS) {
|
||||||
|
if(listener->axis.positive == event.key.keysym.scancode
|
||||||
|
|| listener->axis.negative == event.key.keysym.scancode) {
|
||||||
|
const SDL_Scancode scode = event.key.keysym.scancode;
|
||||||
|
const int value = (event.type == SDL_KEYDOWN ? 1 : -1) * (scode == listener->axis.negative ? -1 : 1);
|
||||||
|
listener->axis.last += value;
|
||||||
|
listener->axis.delegate(listener->axis.last);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
void _handle_scroll_event(const SDL_Event event) {
|
||||||
|
_scroll_delta = event.wheel.y;
|
||||||
|
for(input_listener_t* listener = g_key_listeners; listener < g_key_listeners_endptr; ++listener) {
|
||||||
|
if(listener->type == INPUT_LISTENER_SCROLL) {
|
||||||
|
listener->scroll.delegate(_scroll_delta);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
void _handle_mousebutton_event(const SDL_Event event) {
|
||||||
|
for(input_listener_t* listener = g_key_listeners; listener < g_key_listeners_endptr; ++listener) {
|
||||||
|
if(listener->type == INPUT_LISTENER_BUTTON
|
||||||
|
|| listener->button.button == event.button.button) {
|
||||||
|
listener->button.last = event.button.state == SDL_PRESSED;
|
||||||
|
listener->button.delegate(listener->button.last);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void input_notify_event(SDL_Event event) {
|
void input_notify_event(SDL_Event event) {
|
||||||
switch(event.type) {
|
switch(event.type) {
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
|
case SDL_KEYUP:
|
||||||
|
case SDL_KEYDOWN:
|
||||||
|
_handle_key_event(event);
|
||||||
|
return;
|
||||||
case SDL_MOUSEWHEEL:
|
case SDL_MOUSEWHEEL:
|
||||||
_scroll_delta = event.wheel.y;
|
_handle_scroll_event(event);
|
||||||
break;
|
return;
|
||||||
|
case SDL_MOUSEBUTTONUP:
|
||||||
|
case SDL_MOUSEBUTTONDOWN:
|
||||||
|
_handle_mousebutton_event(event);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue