Dawn/src/input/input.c
2021-04-22 13:55:34 +10:00

102 lines
2.3 KiB
C

/**
* Copyright (c) 2021 Dominic Msters
*
* This software is released under the MIT License.
* https://opensource.org/licenses/MIT
*/
#include "input.h"
input_t INPUT_STATE;
void inputInit() {
int32_t i;
// Setup the bind lists
for(i = 0; i < INPUT_BIND_COUNT; i++) {
INPUT_STATE.bindMap[i] = listCreate();
}
INPUT_STATE.current = INPUT_STATE.inputsA;
INPUT_STATE.previous = INPUT_STATE.inputsB;
// Create the buffer, zero all the values out.
memset(&INPUT_STATE.buffer, 0, sizeof(inputval_t)*INPUT_SOURCE_COUNT);
}
void inputUpdate() {
int32_t i;
listentry_t *item;
inputval_t value;
// Flip the states to save memory.
inputval_t *currentCurrent = INPUT_STATE.current;
INPUT_STATE.current = INPUT_STATE.previous;
INPUT_STATE.previous = currentCurrent;
// Now look at each bind...
for(i = 0; i < INPUT_BIND_COUNT; i++) {
// Now get the list of input sources bound to this input
item = INPUT_STATE.bindMap[i]->start;
value = 0;
// For each input source, add the value from the buffer
while(item != NULL) {
value += INPUT_STATE.buffer[(inputsource_t)item->data];
item = item->next;
}
// Set to the current state.
INPUT_STATE.current[i] = value;
}
}
void inputDispose() {
int32_t i;
// Free up the bind lists
for(i = 0; i < INPUT_BIND_COUNT; i++) {
listDispose(INPUT_STATE.bindMap[i], false);
}
}
void inputBind(inputbind_t bind, inputsource_t source) {
listAdd(INPUT_STATE.bindMap[bind], (void *)source);
}
void inputUnbind(inputbind_t bind, inputsource_t source) {
listRemove(INPUT_STATE.bindMap[bind], (void *)source);
}
bool inputIsDown(inputbind_t binding) {
return INPUT_STATE.current[binding] != 0;
}
bool inputIsUp(inputbind_t binding) {
return INPUT_STATE.current[binding] == 0;
}
bool inputIsPressed(inputbind_t binding) {
return (
INPUT_STATE.previous[binding] == 0 &&
INPUT_STATE.current[binding] != 0
);
}
bool inputIsReleased(inputbind_t binding) {
return INPUT_STATE.current[binding]==0 && INPUT_STATE.previous[binding] != 0;
}
inputval_t inputGetAxis(inputbind_t binding) {
return INPUT_STATE.current[binding];
}
float inputGetFullAxis(inputbind_t positive,
inputbind_t negative
) {
return INPUT_STATE.current[negative] + INPUT_STATE.current[positive];
}
float inputGetAccuated(inputbind_t binding) {
return INPUT_STATE.times[binding];
}