ControlGroup/Force: Return state data by value

Ensures that an array of sufficient size is always used and doesn't put
the responsibility on the caller. It also allows for direct assignment.
This commit is contained in:
Lioncash 2018-07-13 10:35:35 -04:00
parent ef1240b0c7
commit 4c30b9e14d
3 changed files with 34 additions and 27 deletions

View file

@ -5,8 +5,10 @@
#include "Core/HW/WiimoteEmu/WiimoteEmu.h" #include "Core/HW/WiimoteEmu/WiimoteEmu.h"
#include <algorithm> #include <algorithm>
#include <array>
#include <cassert> #include <cassert>
#include <cmath> #include <cmath>
#include <cstddef>
#include <cstring> #include <cstring>
#include <mutex> #include <mutex>
@ -210,25 +212,24 @@ void EmulateTilt(AccelData* const accel, ControllerEmu::Tilt* const tilt_group,
void EmulateSwing(AccelData* const accel, ControllerEmu::Force* const swing_group, void EmulateSwing(AccelData* const accel, ControllerEmu::Force* const swing_group,
const double intensity, const bool sideways, const bool upright) const double intensity, const bool sideways, const bool upright)
{ {
ControlState swing[3]; const ControllerEmu::Force::StateData swing = swing_group->GetState();
swing_group->GetState(swing);
s8 g_dir[3] = {-1, -1, -1}; // Determine which axis is which direction
u8 axis_map[3]; const std::array<int, 3> axis_map{{
upright ? (sideways ? 0 : 1) : 2, // up/down
sideways, // left/right
upright ? 2 : (sideways ? 0 : 1), // forward/backward
}};
// determine which axis is which direction // Some orientations have up as positive, some as negative
axis_map[0] = upright ? (sideways ? 0 : 1) : 2; // up/down
axis_map[1] = sideways; // left|right
axis_map[2] = upright ? 2 : (sideways ? 0 : 1); // forward/backward
// some orientations have up as positive, some as negative
// same with forward // same with forward
std::array<s8, 3> g_dir{{-1, -1, -1}};
if (sideways && !upright) if (sideways && !upright)
g_dir[axis_map[2]] *= -1; g_dir[axis_map[2]] *= -1;
if (!sideways && upright) if (!sideways && upright)
g_dir[axis_map[0]] *= -1; g_dir[axis_map[0]] *= -1;
for (unsigned int i = 0; i < 3; ++i) for (std::size_t i = 0; i < swing.size(); ++i)
(&accel->x)[axis_map[i]] += swing[i] * g_dir[i] * intensity; (&accel->x)[axis_map[i]] += swing[i] * g_dir[i] * intensity;
} }
@ -237,25 +238,24 @@ void EmulateDynamicSwing(AccelData* const accel, DynamicData& dynamic_data,
const DynamicConfiguration& config, const bool sideways, const DynamicConfiguration& config, const bool sideways,
const bool upright) const bool upright)
{ {
ControlState swing[3]; const ControllerEmu::Force::StateData swing = swing_group->GetState();
swing_group->GetState(swing);
s8 g_dir[3] = {-1, -1, -1}; // Determine which axis is which direction
u8 axis_map[3]; const std::array<int, 3> axis_map{{
upright ? (sideways ? 0 : 1) : 2, // up/down
sideways, // left/right
upright ? 2 : (sideways ? 0 : 1), // forward/backward
}};
// determine which axis is which direction // Some orientations have up as positive, some as negative
axis_map[0] = upright ? (sideways ? 0 : 1) : 2; // up/down
axis_map[1] = sideways; // left|right
axis_map[2] = upright ? 2 : (sideways ? 0 : 1); // forward/backward
// some orientations have up as positive, some as negative
// same with forward // same with forward
std::array<s8, 3> g_dir{{-1, -1, -1}};
if (sideways && !upright) if (sideways && !upright)
g_dir[axis_map[2]] *= -1; g_dir[axis_map[2]] *= -1;
if (!sideways && upright) if (!sideways && upright)
g_dir[axis_map[0]] *= -1; g_dir[axis_map[0]] *= -1;
for (unsigned int i = 0; i < 3; ++i) for (std::size_t i = 0; i < swing.size(); ++i)
{ {
if (swing[i] > 0 && dynamic_data.executing_frames_left[i] == 0) if (swing[i] > 0 && dynamic_data.executing_frames_left[i] == 0)
{ {

View file

@ -29,18 +29,23 @@ Force::Force(const std::string& name_) : ControlGroup(name_, GroupType::Force)
numeric_settings.emplace_back(std::make_unique<NumericSetting>(_trans("Dead Zone"), 0, 0, 50)); numeric_settings.emplace_back(std::make_unique<NumericSetting>(_trans("Dead Zone"), 0, 0, 50));
} }
void Force::GetState(ControlState* axis) Force::StateData Force::GetState()
{ {
StateData state_data;
const ControlState deadzone = numeric_settings[0]->GetValue(); const ControlState deadzone = numeric_settings[0]->GetValue();
for (u32 i = 0; i < 6; i += 2) for (u32 i = 0; i < 6; i += 2)
{ {
ControlState tmpf = 0;
const ControlState state = const ControlState state =
controls[i + 1]->control_ref->State() - controls[i]->control_ref->State(); controls[i + 1]->control_ref->State() - controls[i]->control_ref->State();
ControlState tmpf = 0;
if (fabs(state) > deadzone) if (fabs(state) > deadzone)
tmpf = ((state - (deadzone * sign(state))) / (1 - deadzone)); tmpf = ((state - (deadzone * sign(state))) / (1 - deadzone));
*axis++ = tmpf;
state_data[i / 2] = tmpf;
} }
return state_data;
} }
} // namespace ControllerEmu } // namespace ControllerEmu

View file

@ -14,11 +14,13 @@ namespace ControllerEmu
class Force : public ControlGroup class Force : public ControlGroup
{ {
public: public:
using StateData = std::array<ControlState, 3>;
explicit Force(const std::string& name); explicit Force(const std::string& name);
void GetState(ControlState* axis); StateData GetState();
private: private:
std::array<ControlState, 3> m_swing{}; StateData m_swing{};
}; };
} // namespace ControllerEmu } // namespace ControllerEmu