102 lines
2.3 KiB
C
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];
|
|
} |