diff --git a/Source/Core/Core/HW/WiimoteEmu/Extension/Classic.cpp b/Source/Core/Core/HW/WiimoteEmu/Extension/Classic.cpp index 24ab805a86..695963bd7c 100644 --- a/Source/Core/Core/HW/WiimoteEmu/Extension/Classic.cpp +++ b/Source/Core/Core/HW/WiimoteEmu/Extension/Classic.cpp @@ -86,7 +86,7 @@ Classic::Classic() : Extension1stParty("Classic", _trans("Classic Controller")) } // sticks - constexpr auto gate_radius = ControlState(STICK_GATE_RADIUS) / CAL_STICK_RANGE; + constexpr auto gate_radius = ControlState(STICK_GATE_RADIUS) / CAL_STICK_RADIUS; groups.emplace_back(m_left_stick = new ControllerEmu::OctagonAnalogStick(_trans("Left Stick"), gate_radius)); groups.emplace_back( @@ -116,8 +116,8 @@ void Classic::BuildDesiredExtensionState(DesiredExtensionState* target_state) const ControllerEmu::AnalogStick::StateData left_stick_state = m_left_stick->GetState(m_input_override_function); - const u8 x = static_cast(LEFT_STICK_CENTER + (left_stick_state.x * LEFT_STICK_RADIUS)); - const u8 y = static_cast(LEFT_STICK_CENTER + (left_stick_state.y * LEFT_STICK_RADIUS)); + const u8 x = MapFloat(left_stick_state.x, LEFT_STICK_CENTER, 0, LEFT_STICK_RANGE); + const u8 y = MapFloat(left_stick_state.y, LEFT_STICK_CENTER, 0, LEFT_STICK_RANGE); classic_data.SetLeftStick({x, y}); } @@ -127,8 +127,8 @@ void Classic::BuildDesiredExtensionState(DesiredExtensionState* target_state) const ControllerEmu::AnalogStick::StateData right_stick_data = m_right_stick->GetState(m_input_override_function); - const u8 x = static_cast(RIGHT_STICK_CENTER + (right_stick_data.x * RIGHT_STICK_RADIUS)); - const u8 y = static_cast(RIGHT_STICK_CENTER + (right_stick_data.y * RIGHT_STICK_RADIUS)); + const u8 x = MapFloat(right_stick_data.x, RIGHT_STICK_CENTER, 0, RIGHT_STICK_RANGE); + const u8 y = MapFloat(right_stick_data.y, RIGHT_STICK_CENTER, 0, RIGHT_STICK_RANGE); classic_data.SetRightStick({x, y}); } @@ -141,8 +141,8 @@ void Classic::BuildDesiredExtensionState(DesiredExtensionState* target_state) m_triggers->GetState(&buttons, classic_trigger_bitmasks.data(), triggers, m_input_override_function); - const u8 lt = static_cast(triggers[0] * TRIGGER_RANGE); - const u8 rt = static_cast(triggers[1] * TRIGGER_RANGE); + const u8 lt = MapFloat(triggers[0], 0, 0, TRIGGER_RANGE); + const u8 rt = MapFloat(triggers[1], 0, 0, TRIGGER_RANGE); classic_data.SetLeftTrigger(lt); classic_data.SetRightTrigger(rt); diff --git a/Source/Core/Core/HW/WiimoteEmu/Extension/Classic.h b/Source/Core/Core/HW/WiimoteEmu/Extension/Classic.h index 3ab0a94a38..dc094a7bd4 100644 --- a/Source/Core/Core/HW/WiimoteEmu/Extension/Classic.h +++ b/Source/Core/Core/HW/WiimoteEmu/Extension/Classic.h @@ -205,13 +205,14 @@ public: static constexpr u8 STICK_GATE_RADIUS = 0x61; static constexpr u8 CAL_STICK_CENTER = 0x80; - static constexpr u8 CAL_STICK_RANGE = 0x7f; + static constexpr u8 CAL_STICK_RADIUS = 0x7f; + static constexpr u8 CAL_STICK_RANGE = 0xff; static constexpr u8 LEFT_STICK_CENTER = CAL_STICK_CENTER >> (CAL_STICK_BITS - LEFT_STICK_BITS); - static constexpr u8 LEFT_STICK_RADIUS = CAL_STICK_RANGE >> (CAL_STICK_BITS - LEFT_STICK_BITS); + static constexpr u8 LEFT_STICK_RANGE = CAL_STICK_RANGE >> (CAL_STICK_BITS - LEFT_STICK_BITS); static constexpr u8 RIGHT_STICK_CENTER = CAL_STICK_CENTER >> (CAL_STICK_BITS - RIGHT_STICK_BITS); - static constexpr u8 RIGHT_STICK_RADIUS = CAL_STICK_RANGE >> (CAL_STICK_BITS - RIGHT_STICK_BITS); + static constexpr u8 RIGHT_STICK_RANGE = CAL_STICK_RANGE >> (CAL_STICK_BITS - RIGHT_STICK_BITS); static constexpr u8 TRIGGER_RANGE = 0x1F; diff --git a/Source/Core/Core/HW/WiimoteEmu/Extension/DrawsomeTablet.cpp b/Source/Core/Core/HW/WiimoteEmu/Extension/DrawsomeTablet.cpp index e093c9ac67..9b5c137b3e 100644 --- a/Source/Core/Core/HW/WiimoteEmu/Extension/DrawsomeTablet.cpp +++ b/Source/Core/Core/HW/WiimoteEmu/Extension/DrawsomeTablet.cpp @@ -44,12 +44,12 @@ void DrawsomeTablet::BuildDesiredExtensionState(DesiredExtensionState* target_st // the "Drawsome" game expects you to go "off screen" a bit to access some menu items. constexpr u16 MIN_Y = 0x15ff + 0x100; constexpr u16 MAX_Y = 0x00; - constexpr double CENTER_X = (MAX_X + MIN_X) / 2.0; - constexpr double CENTER_Y = (MAX_Y + MIN_Y) / 2.0; + constexpr u16 CENTER_X = (MAX_X + MIN_X + 1) / 2; + constexpr u16 CENTER_Y = (MAX_Y + MIN_Y + 1) / 2; const auto stylus_state = m_stylus->GetState(m_input_override_function); - const auto stylus_x = u16(std::lround(CENTER_X + stylus_state.x * (MAX_X - CENTER_X))); - const auto stylus_y = u16(std::lround(CENTER_Y + stylus_state.y * (MAX_Y - CENTER_Y))); + const u16 stylus_x = MapFloat(stylus_state.x, CENTER_X, MIN_X, MAX_X); + const u16 stylus_y = MapFloat(-stylus_state.y, CENTER_Y, MAX_Y, MIN_Y); tablet_data.stylus_x1 = u8(stylus_x); tablet_data.stylus_x2 = u8(stylus_x >> 8); @@ -75,7 +75,7 @@ void DrawsomeTablet::BuildDesiredExtensionState(DesiredExtensionState* target_st constexpr u16 MAX_PRESSURE = 0x7ff; const auto touch_state = m_touch->GetState(m_input_override_function); - const auto pressure = u16(std::lround(touch_state.data[0] * MAX_PRESSURE)); + const u16 pressure = MapFloat(touch_state.data[0], 0, 0, MAX_PRESSURE); tablet_data.pressure1 = u8(pressure); tablet_data.pressure2 = u8(pressure >> 8); diff --git a/Source/Core/Core/HW/WiimoteEmu/Extension/Drums.cpp b/Source/Core/Core/HW/WiimoteEmu/Extension/Drums.cpp index 01ca315843..1451acafbe 100644 --- a/Source/Core/Core/HW/WiimoteEmu/Extension/Drums.cpp +++ b/Source/Core/Core/HW/WiimoteEmu/Extension/Drums.cpp @@ -87,6 +87,8 @@ void Drums::BuildDesiredExtensionState(DesiredExtensionState* target_state) const ControllerEmu::AnalogStick::StateData stick_state = m_stick->GetState(m_input_override_function); + state.stick_x = MapFloat(stick_state.x, STICK_CENTER, STICK_MIN, STICK_MAX); + state.stick_y = MapFloat(stick_state.y, STICK_CENTER, STICK_MIN, STICK_MAX); state.stick_x = MapFloat(stick_state.x, STICK_CENTER, STICK_MIN, STICK_MAX); state.stick_y = MapFloat(stick_state.y, STICK_CENTER, STICK_MIN, STICK_MAX); } diff --git a/Source/Core/Core/HW/WiimoteEmu/Extension/Guitar.cpp b/Source/Core/Core/HW/WiimoteEmu/Extension/Guitar.cpp index 2776eaef87..bf90901203 100644 --- a/Source/Core/Core/HW/WiimoteEmu/Extension/Guitar.cpp +++ b/Source/Core/Core/HW/WiimoteEmu/Extension/Guitar.cpp @@ -104,8 +104,8 @@ void Guitar::BuildDesiredExtensionState(DesiredExtensionState* target_state) const ControllerEmu::AnalogStick::StateData stick_state = m_stick->GetState(m_input_override_function); - guitar_data.sx = static_cast((stick_state.x * STICK_RADIUS) + STICK_CENTER); - guitar_data.sy = static_cast((stick_state.y * STICK_RADIUS) + STICK_CENTER); + guitar_data.sx = MapFloat(stick_state.x, STICK_CENTER, 0, STICK_RANGE); + guitar_data.sy = MapFloat(stick_state.y, STICK_CENTER, 0, STICK_RANGE); } // slider bar @@ -126,7 +126,7 @@ void Guitar::BuildDesiredExtensionState(DesiredExtensionState* target_state) // whammy bar const ControllerEmu::Triggers::StateData whammy_state = m_whammy->GetState(m_input_override_function); - guitar_data.whammy = static_cast(whammy_state.data[0] * 0x1F); + guitar_data.whammy = MapFloat(whammy_state.data[0], 0, 0, 0x1F); // buttons m_buttons->GetState(&guitar_data.bt, guitar_button_bitmasks.data(), m_input_override_function); diff --git a/Source/Core/Core/HW/WiimoteEmu/Extension/Guitar.h b/Source/Core/Core/HW/WiimoteEmu/Extension/Guitar.h index c0d332d537..883d0bc2ed 100644 --- a/Source/Core/Core/HW/WiimoteEmu/Extension/Guitar.h +++ b/Source/Core/Core/HW/WiimoteEmu/Extension/Guitar.h @@ -69,6 +69,7 @@ public: static const u8 STICK_CENTER = 0x20; static const u8 STICK_RADIUS = 0x1f; + static const u8 STICK_RANGE = 0x3f; // TODO: Test real hardware. Is this accurate? static const u8 STICK_GATE_RADIUS = 0x16; diff --git a/Source/Core/Core/HW/WiimoteEmu/Extension/Nunchuk.cpp b/Source/Core/Core/HW/WiimoteEmu/Extension/Nunchuk.cpp index 18452641ac..768597c875 100644 --- a/Source/Core/Core/HW/WiimoteEmu/Extension/Nunchuk.cpp +++ b/Source/Core/Core/HW/WiimoteEmu/Extension/Nunchuk.cpp @@ -70,8 +70,8 @@ void Nunchuk::BuildDesiredExtensionState(DesiredExtensionState* target_state) bool override_occurred = false; const ControllerEmu::AnalogStick::StateData stick_state = m_stick->GetState(m_input_override_function, &override_occurred); - nc_data.jx = u8(STICK_CENTER + stick_state.x * STICK_RADIUS); - nc_data.jy = u8(STICK_CENTER + stick_state.y * STICK_RADIUS); + nc_data.jx = MapFloat(stick_state.x, STICK_CENTER, 0, STICK_RANGE); + nc_data.jy = MapFloat(stick_state.y, STICK_CENTER, 0, STICK_RANGE); if (!override_occurred) { diff --git a/Source/Core/Core/HW/WiimoteEmu/Extension/Nunchuk.h b/Source/Core/Core/HW/WiimoteEmu/Extension/Nunchuk.h index 678abd23d2..6eac0c378f 100644 --- a/Source/Core/Core/HW/WiimoteEmu/Extension/Nunchuk.h +++ b/Source/Core/Core/HW/WiimoteEmu/Extension/Nunchuk.h @@ -166,6 +166,7 @@ public: static constexpr u8 STICK_CENTER = 0x80; static constexpr u8 STICK_RADIUS = 0x7F; + static constexpr u8 STICK_RANGE = 0xFF; void LoadDefaults(const ControllerInterface& ciface) override; diff --git a/Source/Core/Core/HW/WiimoteEmu/Extension/Shinkansen.cpp b/Source/Core/Core/HW/WiimoteEmu/Extension/Shinkansen.cpp index 91bad8e995..d43f709c2f 100644 --- a/Source/Core/Core/HW/WiimoteEmu/Extension/Shinkansen.cpp +++ b/Source/Core/Core/HW/WiimoteEmu/Extension/Shinkansen.cpp @@ -64,8 +64,9 @@ void Shinkansen::BuildDesiredExtensionState(DesiredExtensionState* target_state) // guesses). const u8 brake_values[] = {0, 53, 79, 105, 132, 159, 187, 217, 250}; const u8 power_values[] = {255, 229, 208, 189, 170, 153, 135, 118, 101, 85, 68, 51, 35, 17}; - state.brake = brake_values[size_t(analog[0] * (sizeof(brake_values) - 1))]; - state.power = power_values[size_t(analog[1] * (sizeof(power_values) - 1))]; + // Not casting from size_t would trigger a static assert in MapFloat due to its use of llround + state.brake = brake_values[MapFloat(analog[0], 0, 0, static_cast(sizeof(brake_values) - 1))]; + state.power = power_values[MapFloat(analog[1], 0, 0, static_cast(sizeof(power_values) - 1))]; // Note: This currently assumes a little-endian host. const u16 button_bitmasks[] = { diff --git a/Source/Core/Core/HW/WiimoteEmu/Extension/Turntable.cpp b/Source/Core/Core/HW/WiimoteEmu/Extension/Turntable.cpp index 7c8c36f127..0b01b8dd7d 100644 --- a/Source/Core/Core/HW/WiimoteEmu/Extension/Turntable.cpp +++ b/Source/Core/Core/HW/WiimoteEmu/Extension/Turntable.cpp @@ -89,14 +89,14 @@ void Turntable::BuildDesiredExtensionState(DesiredExtensionState* target_state) const ControllerEmu::AnalogStick::StateData stick_state = m_stick->GetState(m_input_override_function); - tt_data.sx = static_cast((stick_state.x * STICK_RADIUS) + STICK_CENTER); - tt_data.sy = static_cast((stick_state.y * STICK_RADIUS) + STICK_CENTER); + tt_data.sx = MapFloat(stick_state.x, STICK_CENTER, 0, STICK_RANGE); + tt_data.sy = MapFloat(stick_state.y, STICK_CENTER, 0, STICK_RANGE); } // left table { const ControllerEmu::Slider::StateData lt = m_left_table->GetState(m_input_override_function); - const s8 tt = static_cast(lt.value * TABLE_RANGE); + const s8 tt = MapFloat(lt.value, 0, 0, TABLE_RANGE); tt_data.ltable1 = tt; tt_data.ltable2 = tt >> 5; @@ -105,7 +105,7 @@ void Turntable::BuildDesiredExtensionState(DesiredExtensionState* target_state) // right table { const ControllerEmu::Slider::StateData rt = m_right_table->GetState(m_input_override_function); - const s8 tt = static_cast(rt.value * TABLE_RANGE); + const s8 tt = MapFloat(rt.value, 0, 0, TABLE_RANGE); tt_data.rtable1 = tt; tt_data.rtable2 = tt >> 1; @@ -116,7 +116,7 @@ void Turntable::BuildDesiredExtensionState(DesiredExtensionState* target_state) // effect dial { const auto dial_state = m_effect_dial->GetState(m_input_override_function); - const u8 dial = static_cast(dial_state.value * EFFECT_DIAL_RANGE) + EFFECT_DIAL_CENTER; + const u8 dial = MapFloat(dial_state.value, EFFECT_DIAL_CENTER, 0, EFFECT_DIAL_RANGE); tt_data.dial1 = dial; tt_data.dial2 = dial >> 3; @@ -126,7 +126,7 @@ void Turntable::BuildDesiredExtensionState(DesiredExtensionState* target_state) { const ControllerEmu::Slider::StateData cfs = m_crossfade->GetState(m_input_override_function); - tt_data.slider = static_cast((cfs.value * CROSSFADE_RANGE) + CROSSFADE_CENTER); + tt_data.slider = MapFloat(cfs.value, CROSSFADE_CENTER, 0, CROSSFADE_RANGE); } // buttons diff --git a/Source/Core/Core/HW/WiimoteEmu/Extension/Turntable.h b/Source/Core/Core/HW/WiimoteEmu/Extension/Turntable.h index 451135d812..9f0548e69f 100644 --- a/Source/Core/Core/HW/WiimoteEmu/Extension/Turntable.h +++ b/Source/Core/Core/HW/WiimoteEmu/Extension/Turntable.h @@ -78,6 +78,7 @@ public: static constexpr int STICK_BIT_COUNT = 6; static constexpr u8 STICK_CENTER = (1 << STICK_BIT_COUNT) / 2; static constexpr u8 STICK_RADIUS = STICK_CENTER - 1; + static constexpr u8 STICK_RANGE = (1 << STICK_BIT_COUNT) - 1; // TODO: Test real hardware. Is this accurate? static constexpr u8 STICK_GATE_RADIUS = 0x16; @@ -86,11 +87,11 @@ public: static constexpr int EFFECT_DIAL_BIT_COUNT = 5; static constexpr u8 EFFECT_DIAL_CENTER = (1 << EFFECT_DIAL_BIT_COUNT) / 2; - static constexpr u8 EFFECT_DIAL_RANGE = EFFECT_DIAL_CENTER - 1; + static constexpr u8 EFFECT_DIAL_RANGE = (1 << EFFECT_DIAL_BIT_COUNT) - 1; static constexpr int CROSSFADE_BIT_COUNT = 4; static constexpr u8 CROSSFADE_CENTER = (1 << CROSSFADE_BIT_COUNT) / 2; - static constexpr u8 CROSSFADE_RANGE = CROSSFADE_CENTER - 1; + static constexpr u8 CROSSFADE_RANGE = (1 << CROSSFADE_BIT_COUNT) - 1; private: ControllerEmu::Buttons* m_buttons;