From 91abcd32dcab9ef5de5cd4ba03f3e47fd6e314e9 Mon Sep 17 00:00:00 2001 From: Sanjay Govind Date: Sun, 22 Dec 2024 23:55:13 +1300 Subject: [PATCH] WiimoteEmu: Fix Drum Extension Velocity --- .../Core/HW/WiimoteEmu/Extension/Drums.cpp | 17 ++++++++------- .../Core/Core/HW/WiimoteEmu/Extension/Drums.h | 21 +++++++++++-------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/Source/Core/Core/HW/WiimoteEmu/Extension/Drums.cpp b/Source/Core/Core/HW/WiimoteEmu/Extension/Drums.cpp index 24ceda4029..fd0214fe51 100644 --- a/Source/Core/Core/HW/WiimoteEmu/Extension/Drums.cpp +++ b/Source/Core/Core/HW/WiimoteEmu/Extension/Drums.cpp @@ -101,7 +101,7 @@ void Drums::BuildDesiredExtensionState(DesiredExtensionState* target_state) state.drum_pads = 0; m_pads->GetState(&state.drum_pads, drum_pad_bitmasks.data(), m_input_override_function); - state.softness = u8(7 - std::lround(m_hit_strength_setting.GetValue() * 7 / 100)); + state.softness = u8(0x7F - std::lround(m_hit_strength_setting.GetValue() * 0x7F / 100)); } void Drums::Update(const DesiredExtensionState& target_state) @@ -118,23 +118,21 @@ void Drums::Update(const DesiredExtensionState& target_state) desired_state.stick_y = STICK_CENTER; desired_state.buttons = 0; desired_state.drum_pads = 0; - desired_state.softness = 7; + desired_state.softness = 0x7F; } DataFormat drum_data = {}; + u8 velocity = 0x7F; // The meaning of these bits are unknown but they are usually set. drum_data.unk1 = 0b11; drum_data.unk2 = 0b11; - drum_data.unk3 = 0b1; - drum_data.unk4 = 0b1; drum_data.unk5 = 0b11; // Send no velocity data by default. drum_data.velocity_id = u8(VelocityID::None); drum_data.no_velocity_data_1 = 1; drum_data.no_velocity_data_2 = 1; - drum_data.softness = 7; drum_data.stick_x = desired_state.stick_x; drum_data.stick_y = desired_state.stick_y; @@ -164,7 +162,7 @@ void Drums::Update(const DesiredExtensionState& target_state) drum_data.no_velocity_data_1 = 0; drum_data.no_velocity_data_2 = 0; - drum_data.softness = desired_state.softness; + velocity = desired_state.softness; // A drum-pad hit causes the relevent bit to be triggered for the next 10 frames. constexpr u8 HIT_FRAME_COUNT = 10; @@ -174,6 +172,11 @@ void Drums::Update(const DesiredExtensionState& target_state) break; } } + drum_data.velocity0 = velocity; + drum_data.velocity1 = velocity >> 1; + drum_data.velocity2 = velocity >> 2; + drum_data.velocity3 = velocity >> 3; + drum_data.velocity64 = velocity >> 4; // Figure out which drum-pad bits to send. // Note: Relevent bits are not set until after velocity data has been sent. @@ -190,7 +193,7 @@ void Drums::Update(const DesiredExtensionState& target_state) } // Flip button and drum-pad bits. (0 == pressed) - drum_data.buttons ^= 0xff; + drum_data.buttons ^= 0x7e; drum_data.drum_pads ^= 0xff; // Copy data to proper region in the "register". diff --git a/Source/Core/Core/HW/WiimoteEmu/Extension/Drums.h b/Source/Core/Core/HW/WiimoteEmu/Extension/Drums.h index ba65e48877..99288f958b 100644 --- a/Source/Core/Core/HW/WiimoteEmu/Extension/Drums.h +++ b/Source/Core/Core/HW/WiimoteEmu/Extension/Drums.h @@ -5,6 +5,7 @@ #include +#include "Common/BitField.h" #include "Core/HW/WiimoteEmu/Extension/Extension.h" #include "InputCommon/ControllerEmu/Setting/NumericSetting.h" @@ -47,24 +48,28 @@ public: // Seemingly random. u8 unk2 : 2; - // Always 1 with no velocity data and seemingly random otherwise. - u8 unk3 : 1; + u8 velocity3 : 1; + // For which "pad" the velocity data is for. u8 velocity_id : 7; - // Always 1 with no velocity data and seemingly random otherwise. - u8 unk4 : 1; + u8 velocity2 : 1; // 1 with no velocity data and 0 when velocity data is present. u8 no_velocity_data_1 : 1; // These two bits seem to always be set. (0b11) u8 unk5 : 2; // 1 with no velocity data and 0 when velocity data is present. u8 no_velocity_data_2 : 1; - // How "soft" a drum pad has been hit as a range from 0:very-hard to 7:very-soft. - u8 softness : 3; + + u8 velocity64 : 3; // Button bits. - u8 buttons; + union + { + u8 buttons; // buttons + BitField<0, 1, u8> velocity0; + BitField<7, 1, u8> velocity1; + }; // Drum-pad bits. u8 drum_pads; @@ -94,8 +99,6 @@ public: void DoState(PointerWrap& p) override; - // FYI: The low/high bits of the button byte are "random" when velocity data is present. - // static constexpr u8 HAVE_VELOCITY_DATA = 0b10000001; static constexpr u8 BUTTON_PLUS = 0x04; static constexpr u8 BUTTON_MINUS = 0x10;