/** * 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]; }