From 457bc878e9f9b742b8cfd5d0b1c9e28163e7c204 Mon Sep 17 00:00:00 2001 From: Mr-Wiseguy Date: Sun, 14 Jan 2024 22:49:04 -0500 Subject: [PATCH] Refactored input mapping state --- assets/LICENSE.txt | 212 -------------------------------------- include/recomp_input.h | 3 + patches/input.h | 19 ---- patches/syms.ld | 14 ++- src/game/controls.cpp | 229 +++++++++++++++++------------------------ src/main/main.cpp | 1 + 6 files changed, 107 insertions(+), 371 deletions(-) delete mode 100644 assets/LICENSE.txt diff --git a/assets/LICENSE.txt b/assets/LICENSE.txt deleted file mode 100644 index 63ef813..0000000 --- a/assets/LICENSE.txt +++ /dev/null @@ -1,212 +0,0 @@ -The RmlUi samples include fonts that are separately licensed. They are listed -below along with their licenses. - ------------------------------------------------------------ ------------------------------------------------------------ ---- Lato --- ---- http://www.latofonts.com/ --- ---- --- ---- LatoLatin-Bold.ttf --- ---- LatoLatin-BoldItalic.ttf --- ---- LatoLatin-Italic.ttf --- ---- LatoLatin-Regular.ttf --- ------------------------------------------------------------ ------------------------------------------------------------ - -Copyright (c) 2010-2015, Ɓukasz Dziedzic (dziedzic@typoland.com), -with Reserved Font Name Lato. - -This Font Software is licensed under the SIL Open Font License, Version 1.1. -This license is copied below, and is also available with a FAQ at: -http://scripts.sil.org/OFL - - ------------------------------------------------------------ -SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ------------------------------------------------------------ - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font creation -efforts of academic and linguistic communities, and to provide a free and -open framework in which fonts may be shared and improved in partnership -with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that any reserved -names are not used by derivative works. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply -to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This may -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software components as -distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, -or substituting -- in part or in whole -- any of the components of the -Original Version, by changing formats or by porting the Font Software to a -new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, modify, -redistribute, and sell modified and unmodified copies of the Font -Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, -in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the corresponding -Copyright Holder. This restriction only applies to the primary font name as -presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and the Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created -using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. - - ------------------------------------------------------------ ------------------------------------------------------------ ---- Noto Emoji --- ---- https://www.google.com/get/noto/ --- ---- --- ---- NotoEmoji-Regular.ttf --- ------------------------------------------------------------ ------------------------------------------------------------ - -This Font Software is licensed under the SIL Open Font License, -Version 1.1. - -This license is copied below, and is also available with a FAQ at: -http://scripts.sil.org/OFL - ------------------------------------------------------------ -SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ------------------------------------------------------------ - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font -creation efforts of academic and linguistic communities, and to -provide a free and open framework in which fonts may be shared and -improved in partnership with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that any reserved -names are not used by derivative works. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply to -any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This may -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software -components as distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, -deleting, or substituting -- in part or in whole -- any of the -components of the Original Version, by changing formats or by porting -the Font Software to a new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, -modify, redistribute, and sell modified and unmodified copies of the -Font Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, in -Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the -corresponding Copyright Holder. This restriction only applies to the -primary font name as presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and the Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created using -the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/include/recomp_input.h b/include/recomp_input.h index 14734d0..d9d70e6 100644 --- a/include/recomp_input.h +++ b/include/recomp_input.h @@ -46,6 +46,9 @@ namespace recomp { extern const DefaultN64Mappings default_n64_keyboard_mappings; extern const DefaultN64Mappings default_n64_controller_mappings; + // Loads the user's saved controller mapping if one exists, loads the default mappings if no saved mapping exists. + void init_control_mappings(); + void get_n64_input(uint16_t* buttons_out, float* x_out, float* y_out); void handle_events(); diff --git a/patches/input.h b/patches/input.h index d6f0501..b9b88ed 100644 --- a/patches/input.h +++ b/patches/input.h @@ -26,25 +26,6 @@ extern "C" { void name(uint8_t* rdram, recomp_context* ctx); #endif -enum RecompDigitalInput { - RECOMP_DIGITAL_INPUT_ITEM1, - RECOMP_DIGITAL_INPUT_ITEM2, - RECOMP_DIGITAL_INPUT_ITEM3, - RECOMP_DIGITAL_INPUT_MAX -}; - -enum RecompAnalogInput { - RECOMP_ANALOG_INPUT_MOVEMENT_X, - RECOMP_ANALOG_INPUT_MOVEMENT_Y, - RECOMP_ANALOG_INPUT_CAMERA_X, - RECOMP_ANALOG_INPUT_CAMERA_Y, - RECOMP_ANALOG_INPUT_MAX, -}; - -DECLARE_FUNC(u32, recomp_get_digital_input, u32 which); -DECLARE_FUNC(float, recomp_get_analog_input, u32 which); -DECLARE_FUNC(void, recomp_get_item_inputs, u32* buttons); -DECLARE_FUNC(void, recomp_get_camera_inputs, float* x_out, float* y_out); // TODO move these DECLARE_FUNC(void, recomp_puts, const char* data, u32 size); DECLARE_FUNC(void, recomp_exit); diff --git a/patches/syms.ld b/patches/syms.ld index 771d9c7..eff8c57 100644 --- a/patches/syms.ld +++ b/patches/syms.ld @@ -1,11 +1,9 @@ __start = 0x80000000; /* Dummy addresses that get recompiled into function calls */ -recomp_get_item_inputs = 0x81000000; -recomp_puts = 0x81000004; -recomp_get_camera_inputs = 0x81000008; -recomp_exit = 0x8100000C; -recomp_handle_quicksave_actions = 0x81000010; -recomp_handle_quicksave_actions_main = 0x81000014; -osRecvMesg_recomp = 0x81000018; -osSendMesg_recomp = 0x8100001C; +recomp_puts = 0x81000000; +recomp_exit = 0x81000004; +recomp_handle_quicksave_actions = 0x81000008; +recomp_handle_quicksave_actions_main = 0x8100000C; +osRecvMesg_recomp = 0x81000010; +osSendMesg_recomp = 0x81000014; diff --git a/src/game/controls.cpp b/src/game/controls.cpp index 2380dbf..2f46374 100644 --- a/src/game/controls.cpp +++ b/src/game/controls.cpp @@ -1,159 +1,124 @@ +#include + #include "recomp_helpers.h" #include "recomp_input.h" #include "../ultramodern/ultramodern.hpp" #include "../patches/input.h" -namespace N64Inputs { - enum Input : uint16_t { - A = 0x8000, - B = 0x4000, - Z = 0x2000, - START = 0x1000, - DPAD_UP = 0x0800, - DPAD_DOWN = 0x0400, - DPAD_LEFT = 0x0200, - DPAD_RIGHT = 0x0100, - L = 0x0020, - R = 0x0010, - C_UP = 0x0008, - C_DOWN = 0x0004, - C_LEFT = 0x0002, - C_RIGHT = 0x0001, +// x-macros to build input enums and arrays. First parameter is the name, second parameter is the bit field for the input (or 0 if there is no associated one) +#define DEFINE_N64_BUTTON_INPUTS() \ + DEFINE_INPUT(A, 0x8000) \ + DEFINE_INPUT(B, 0x4000) \ + DEFINE_INPUT(Z, 0x2000) \ + DEFINE_INPUT(START, 0x1000) \ + DEFINE_INPUT(DPAD_UP, 0x0800) \ + DEFINE_INPUT(DPAD_DOWN, 0x0400) \ + DEFINE_INPUT(DPAD_LEFT, 0x0200) \ + DEFINE_INPUT(DPAD_RIGHT, 0x0100) \ + DEFINE_INPUT(L, 0x0020) \ + DEFINE_INPUT(R, 0x0010) \ + DEFINE_INPUT(C_UP, 0x0008) \ + DEFINE_INPUT(C_DOWN, 0x0004) \ + DEFINE_INPUT(C_LEFT, 0x0002) \ + DEFINE_INPUT(C_RIGHT, 0x0001) + +#define DEFINE_N64_AXIS_INPUTS() \ + DEFINE_INPUT(X_AXIS_NEG, 0) \ + DEFINE_INPUT(X_AXIS_POS, 0) \ + DEFINE_INPUT(Y_AXIS_NEG, 0) \ + DEFINE_INPUT(Y_AXIS_POS, 0) \ + +// Make the input enum. +#define DEFINE_INPUT(name, value) name, +enum class GameInput { + DEFINE_N64_BUTTON_INPUTS() + DEFINE_N64_AXIS_INPUTS() + + COUNT, + N64_BUTTON_START = A, + N64_BUTTON_COUNT = C_RIGHT - N64_BUTTON_START + 1, + N64_AXIS_START = X_AXIS_NEG, + N64_AXIS_COUNT = Y_AXIS_POS - N64_AXIS_START + 1, +}; +#undef DEFINE_INPUT + +// Arrays that hold the mappings for every input for keyboard and controller respectively. +using input_mapping_array = std::array, (size_t)GameInput::COUNT>; +static std::array, (size_t)GameInput::COUNT> keyboard_input_mappings{}; +static std::array, (size_t)GameInput::COUNT> controller_input_mappings{}; + +// Make the button value array, which maps a button index to its bit field. +#define DEFINE_INPUT(name, value) uint16_t(value##u), +static const std::array n64_button_values = { + DEFINE_N64_BUTTON_INPUTS() +}; +#undef DEFINE_INPUT + +void recomp::init_control_mappings() { + // TODO load from a file if one exists. + + auto assign_mapping = [](input_mapping_array& mapping, GameInput input, const std::vector& value) { + mapping[(size_t)input] = value; }; + + auto assign_all_mappings = [&](input_mapping_array& mapping, const recomp::DefaultN64Mappings& values) { + assign_mapping(mapping, GameInput::A, values.a); + assign_mapping(mapping, GameInput::A, values.a); + assign_mapping(mapping, GameInput::B, values.b); + assign_mapping(mapping, GameInput::Z, values.z); + assign_mapping(mapping, GameInput::START, values.start); + assign_mapping(mapping, GameInput::DPAD_UP, values.dpad_up); + assign_mapping(mapping, GameInput::DPAD_DOWN, values.dpad_down); + assign_mapping(mapping, GameInput::DPAD_LEFT, values.dpad_left); + assign_mapping(mapping, GameInput::DPAD_RIGHT, values.dpad_right); + assign_mapping(mapping, GameInput::L, values.l); + assign_mapping(mapping, GameInput::R, values.r); + assign_mapping(mapping, GameInput::C_UP, values.c_up); + assign_mapping(mapping, GameInput::C_DOWN, values.c_down); + assign_mapping(mapping, GameInput::C_LEFT, values.c_left); + assign_mapping(mapping, GameInput::C_RIGHT, values.c_right); + + assign_mapping(mapping, GameInput::X_AXIS_NEG, values.analog_left); + assign_mapping(mapping, GameInput::X_AXIS_POS, values.analog_right); + assign_mapping(mapping, GameInput::Y_AXIS_NEG, values.analog_down); + assign_mapping(mapping, GameInput::Y_AXIS_POS, values.analog_up); + }; + + assign_all_mappings(keyboard_input_mappings, recomp::default_n64_keyboard_mappings); + assign_all_mappings(controller_input_mappings, recomp::default_n64_controller_mappings); } -constexpr float controller_default_threshold = 0.7f; -struct GameControllerAxisMapping { - int32_t axis; - float threshold; // Positive or negative to indicate direction - uint32_t output_mask; -}; -using axis_map_t = std::vector; - -struct GameControllerButtonMapping { - uint32_t button; - uint32_t output_mask; -}; -using button_map_t = std::vector; - void recomp::get_n64_input(uint16_t* buttons_out, float* x_out, float* y_out) { - uint16_t cur_buttons = 0; float cur_x = 0.0f; float cur_y = 0.0f; if (!recomp::game_input_disabled()) { - cur_buttons |= recomp::get_input_digital(recomp::default_n64_keyboard_mappings.a) ? N64Inputs::A : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_keyboard_mappings.b) ? N64Inputs::B : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_keyboard_mappings.l) ? N64Inputs::L : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_keyboard_mappings.r) ? N64Inputs::R : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_keyboard_mappings.z) ? N64Inputs::Z : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_keyboard_mappings.start) ? N64Inputs::START : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_keyboard_mappings.c_left) ? N64Inputs::C_LEFT : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_keyboard_mappings.c_right) ? N64Inputs::C_RIGHT : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_keyboard_mappings.c_up) ? N64Inputs::C_UP : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_keyboard_mappings.c_down) ? N64Inputs::C_DOWN : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_keyboard_mappings.dpad_left) ? N64Inputs::DPAD_LEFT : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_keyboard_mappings.dpad_right) ? N64Inputs::DPAD_RIGHT : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_keyboard_mappings.dpad_up) ? N64Inputs::DPAD_UP : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_keyboard_mappings.dpad_down) ? N64Inputs::DPAD_DOWN : 0; + for (size_t i = 0; i < n64_button_values.size(); i++) { + size_t input_index = (size_t)GameInput::N64_BUTTON_START + i; + cur_buttons |= recomp::get_input_digital(keyboard_input_mappings[input_index]) ? n64_button_values[i] : 0; + cur_buttons |= recomp::get_input_digital(controller_input_mappings[input_index]) ? n64_button_values[i] : 0; + } - cur_buttons |= recomp::get_input_digital(recomp::default_n64_controller_mappings.a) ? N64Inputs::A : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_controller_mappings.b) ? N64Inputs::B : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_controller_mappings.l) ? N64Inputs::L : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_controller_mappings.r) ? N64Inputs::R : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_controller_mappings.z) ? N64Inputs::Z : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_controller_mappings.start) ? N64Inputs::START : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_controller_mappings.c_left) ? N64Inputs::C_LEFT : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_controller_mappings.c_right) ? N64Inputs::C_RIGHT : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_controller_mappings.c_up) ? N64Inputs::C_UP : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_controller_mappings.c_down) ? N64Inputs::C_DOWN : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_controller_mappings.dpad_left) ? N64Inputs::DPAD_LEFT : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_controller_mappings.dpad_right) ? N64Inputs::DPAD_RIGHT : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_controller_mappings.dpad_up) ? N64Inputs::DPAD_UP : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_controller_mappings.dpad_down) ? N64Inputs::DPAD_DOWN : 0; - - cur_x = recomp::get_input_analog(recomp::default_n64_keyboard_mappings.analog_right) - recomp::get_input_analog(recomp::default_n64_keyboard_mappings.analog_left); - cur_y = recomp::get_input_analog(recomp::default_n64_keyboard_mappings.analog_up) - recomp::get_input_analog(recomp::default_n64_keyboard_mappings.analog_down); - cur_x += recomp::get_input_analog(recomp::default_n64_controller_mappings.analog_right) - recomp::get_input_analog(recomp::default_n64_controller_mappings.analog_left); - cur_y += recomp::get_input_analog(recomp::default_n64_controller_mappings.analog_up) - recomp::get_input_analog(recomp::default_n64_controller_mappings.analog_down); + cur_x = recomp::get_input_analog(keyboard_input_mappings[(size_t)GameInput::X_AXIS_POS]) + - recomp::get_input_analog(keyboard_input_mappings[(size_t)GameInput::X_AXIS_NEG]) + + recomp::get_input_analog(controller_input_mappings[(size_t)GameInput::X_AXIS_POS]) + - recomp::get_input_analog(controller_input_mappings[(size_t)GameInput::X_AXIS_NEG]); + cur_y = recomp::get_input_analog(keyboard_input_mappings[(size_t)GameInput::Y_AXIS_POS]) + - recomp::get_input_analog(keyboard_input_mappings[(size_t)GameInput::Y_AXIS_NEG]) + + recomp::get_input_analog(controller_input_mappings[(size_t)GameInput::Y_AXIS_POS]) + - recomp::get_input_analog(controller_input_mappings[(size_t)GameInput::Y_AXIS_NEG]); } *buttons_out = cur_buttons; - *x_out = cur_x; - *y_out = cur_y; + *x_out = std::clamp(cur_x, -1.0f, 1.0f); + *y_out = std::clamp(cur_y, -1.0f, 1.0f); } -extern "C" void recomp_get_item_inputs(uint8_t* rdram, recomp_context* ctx) { - u32* buttons_out = _arg<0, u32*>(rdram, ctx); - - uint32_t cur_buttons = 0; - - if (!recomp::game_input_disabled()) { - cur_buttons |= recomp::get_input_digital(recomp::default_n64_keyboard_mappings.b) ? N64Inputs::B : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_keyboard_mappings.c_left) ? N64Inputs::C_LEFT : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_keyboard_mappings.c_right) ? N64Inputs::C_RIGHT : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_keyboard_mappings.c_down) ? N64Inputs::C_DOWN : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_keyboard_mappings.dpad_left) ? N64Inputs::DPAD_LEFT : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_keyboard_mappings.dpad_right) ? N64Inputs::DPAD_RIGHT : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_keyboard_mappings.dpad_up) ? N64Inputs::DPAD_UP : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_keyboard_mappings.dpad_down) ? N64Inputs::DPAD_DOWN : 0; - - cur_buttons |= recomp::get_input_digital(recomp::default_n64_controller_mappings.b) ? N64Inputs::B : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_controller_mappings.c_left) ? N64Inputs::C_LEFT : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_controller_mappings.c_right) ? N64Inputs::C_RIGHT : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_controller_mappings.c_down) ? N64Inputs::C_DOWN : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_controller_mappings.dpad_left) ? N64Inputs::DPAD_LEFT : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_controller_mappings.dpad_right) ? N64Inputs::DPAD_RIGHT : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_controller_mappings.dpad_up) ? N64Inputs::DPAD_UP : 0; - cur_buttons |= recomp::get_input_digital(recomp::default_n64_controller_mappings.dpad_down) ? N64Inputs::DPAD_DOWN : 0; - } - - *buttons_out = cur_buttons; -} - -bool recomp_digital_input_state[RECOMP_DIGITAL_INPUT_MAX]; -float recomp_analog_input_state[RECOMP_ANALOG_INPUT_MAX]; - extern "C" void recomp_update_inputs(uint8_t* rdram, recomp_context* ctx) { recomp::poll_inputs(); } -extern "C" void recomp_get_digital_input(uint8_t* rdram, recomp_context* ctx) { - u32 input_slot = _arg<0, u32>(rdram, ctx); - - // TODO implement this - - _return(ctx, 0); -} - -extern "C" void recomp_get_analog_input(uint8_t* rdram, recomp_context* ctx) { - u32 input_slot = _arg<0, u32>(rdram, ctx); - - // TODO implement this - - _return(ctx, 0); -} - -extern "C" void recomp_get_camera_inputs(uint8_t* rdram, recomp_context* ctx) { - float* x_out = _arg<0, float*>(rdram, ctx); - float* y_out = _arg<1, float*>(rdram, ctx); - - float x_val = 0; - float y_val = 0; - - if (!recomp::game_input_disabled()) { - x_val += recomp::get_input_analog(recomp::default_n64_keyboard_mappings.c_right) - recomp::get_input_analog(recomp::default_n64_keyboard_mappings.c_left); - y_val += recomp::get_input_analog(recomp::default_n64_keyboard_mappings.c_up) - recomp::get_input_analog(recomp::default_n64_keyboard_mappings.c_down); - - x_val += recomp::get_input_analog(recomp::default_n64_controller_mappings.c_right) - recomp::get_input_analog(recomp::default_n64_controller_mappings.c_left); - y_val += recomp::get_input_analog(recomp::default_n64_controller_mappings.c_up) - recomp::get_input_analog(recomp::default_n64_controller_mappings.c_down); - } - - *x_out = x_val; - *y_out = y_val; -} - // TODO move these extern "C" void recomp_puts(uint8_t* rdram, recomp_context* ctx) { PTR(char) cur_str = _arg<0, PTR(char)>(rdram, ctx); diff --git a/src/main/main.cpp b/src/main/main.cpp index b6c25a4..e867a22 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -234,6 +234,7 @@ int main(int argc, char** argv) { reset_audio(48000); init(); + recomp::init_control_mappings(); ultramodern::gfx_callbacks_t gfx_callbacks{ .create_gfx = create_gfx,