early-access version 1682
This commit is contained in:
parent
e076db528d
commit
09767f333d
3 changed files with 52 additions and 27 deletions
|
@ -1,7 +1,7 @@
|
||||||
yuzu emulator early access
|
yuzu emulator early access
|
||||||
=============
|
=============
|
||||||
|
|
||||||
This is the source code for early-access 1681.
|
This is the source code for early-access 1682.
|
||||||
|
|
||||||
## Legal Notice
|
## Legal Notice
|
||||||
|
|
||||||
|
|
|
@ -321,8 +321,10 @@ void SDLState::CloseJoystick(SDL_Joystick* sdl_joystick) {
|
||||||
return joystick->GetSDLJoystick() == sdl_joystick;
|
return joystick->GetSDLJoystick() == sdl_joystick;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (joystick_it != std::end(joystick_guid_list)) {
|
||||||
(*joystick_it)->SetSDLJoystick(nullptr, nullptr);
|
(*joystick_it)->SetSDLJoystick(nullptr, nullptr);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void SDLState::HandleGameControllerEvent(const SDL_Event& event) {
|
void SDLState::HandleGameControllerEvent(const SDL_Event& event) {
|
||||||
switch (event.type) {
|
switch (event.type) {
|
||||||
|
@ -1313,51 +1315,51 @@ public:
|
||||||
void Start(const std::string& device_id) override {
|
void Start(const std::string& device_id) override {
|
||||||
SDLPoller::Start(device_id);
|
SDLPoller::Start(device_id);
|
||||||
// Reset stored axes
|
// Reset stored axes
|
||||||
analog_x_axis = -1;
|
first_axis = -1;
|
||||||
analog_y_axis = -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Common::ParamPackage GetNextInput() override {
|
Common::ParamPackage GetNextInput() override {
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
while (state.event_queue.Pop(event)) {
|
while (state.event_queue.Pop(event)) {
|
||||||
// Filter out axis events that are below a threshold
|
if (event.type != SDL_JOYAXISMOTION) {
|
||||||
if (event.type == SDL_JOYAXISMOTION && std::abs(event.jaxis.value / 32767.0) < 0.5) {
|
// Check for a button press
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (event.type == SDL_JOYAXISMOTION) {
|
|
||||||
const auto axis = event.jaxis.axis;
|
|
||||||
// In order to return a complete analog param, we need inputs for both axes.
|
|
||||||
// First we take the x-axis (horizontal) input, then the y-axis (vertical) input.
|
|
||||||
if (analog_x_axis == -1) {
|
|
||||||
analog_x_axis = axis;
|
|
||||||
} else if (analog_y_axis == -1 && analog_x_axis != axis) {
|
|
||||||
analog_y_axis = axis;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// If the press wasn't accepted as a joy axis, check for a button press
|
|
||||||
auto button_press = button_poller.FromEvent(event);
|
auto button_press = button_poller.FromEvent(event);
|
||||||
if (button_press) {
|
if (button_press) {
|
||||||
return *button_press;
|
return *button_press;
|
||||||
}
|
}
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
const auto axis = event.jaxis.axis;
|
||||||
|
|
||||||
|
// Filter out axis events that are below a threshold
|
||||||
|
if (std::abs(event.jaxis.value / 32767.0) < 0.5) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Filter out axis events that are the same
|
||||||
|
if (first_axis == axis) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// In order to return a complete analog param, we need inputs for both axes.
|
||||||
|
// If the first axis isn't set we set the value then wait till next event
|
||||||
|
if (first_axis == -1) {
|
||||||
|
first_axis = axis;
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (analog_x_axis != -1 && analog_y_axis != -1) {
|
|
||||||
if (const auto joystick = state.GetSDLJoystickBySDLID(event.jaxis.which)) {
|
if (const auto joystick = state.GetSDLJoystickBySDLID(event.jaxis.which)) {
|
||||||
auto params = BuildParamPackageForAnalog(joystick->GetPort(), joystick->GetGUID(),
|
auto params = BuildParamPackageForAnalog(joystick->GetPort(), joystick->GetGUID(),
|
||||||
analog_x_axis, analog_y_axis);
|
first_axis, axis);
|
||||||
analog_x_axis = -1;
|
first_axis = -1;
|
||||||
analog_y_axis = -1;
|
|
||||||
return params;
|
return params;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int analog_x_axis = -1;
|
int first_axis = -1;
|
||||||
int analog_y_axis = -1;
|
|
||||||
SDLButtonPoller button_poller;
|
SDLButtonPoller button_poller;
|
||||||
};
|
};
|
||||||
} // namespace Polling
|
} // namespace Polling
|
||||||
|
|
|
@ -86,6 +86,7 @@ private:
|
||||||
case Type::PadData: {
|
case Type::PadData: {
|
||||||
Response::PadData pad_data;
|
Response::PadData pad_data;
|
||||||
std::memcpy(&pad_data, &receive_buffer[sizeof(Header)], sizeof(Response::PadData));
|
std::memcpy(&pad_data, &receive_buffer[sizeof(Header)], sizeof(Response::PadData));
|
||||||
|
SanitizeMotion(pad_data);
|
||||||
callback.pad_data(std::move(pad_data));
|
callback.pad_data(std::move(pad_data));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -114,6 +115,28 @@ private:
|
||||||
StartSend(timer.expiry());
|
StartSend(timer.expiry());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SanitizeMotion(Response::PadData& data) {
|
||||||
|
// Zero out any non number value
|
||||||
|
if (!std::isnormal(data.gyro.pitch)) {
|
||||||
|
data.gyro.pitch = 0;
|
||||||
|
}
|
||||||
|
if (!std::isnormal(data.gyro.roll)) {
|
||||||
|
data.gyro.roll = 0;
|
||||||
|
}
|
||||||
|
if (!std::isnormal(data.gyro.yaw)) {
|
||||||
|
data.gyro.yaw = 0;
|
||||||
|
}
|
||||||
|
if (!std::isnormal(data.accel.x)) {
|
||||||
|
data.accel.x = 0;
|
||||||
|
}
|
||||||
|
if (!std::isnormal(data.accel.y)) {
|
||||||
|
data.accel.y = 0;
|
||||||
|
}
|
||||||
|
if (!std::isnormal(data.accel.z)) {
|
||||||
|
data.accel.z = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
SocketCallback callback;
|
SocketCallback callback;
|
||||||
boost::asio::io_service io_service;
|
boost::asio::io_service io_service;
|
||||||
boost::asio::basic_waitable_timer<clock> timer;
|
boost::asio::basic_waitable_timer<clock> timer;
|
||||||
|
|
Loading…
Reference in a new issue