Input: Improve setting of dpd_enable_fg (#1127)

This commit is contained in:
capitalistspz 2024-05-06 02:27:30 +01:00 committed by GitHub
parent bd13d4bdc3
commit 7d6d417354
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
11 changed files with 51 additions and 3 deletions

View File

@ -2,6 +2,7 @@
#include "input/InputManager.h" #include "input/InputManager.h"
#include "input/motion/MotionSample.h" #include "input/motion/MotionSample.h"
#include "input/api/ControllerState.h"
namespace pugi namespace pugi
{ {
@ -118,6 +119,7 @@ public:
virtual bool has_position() { return false; } virtual bool has_position() { return false; }
virtual glm::vec2 get_position() { return {}; } virtual glm::vec2 get_position() { return {}; }
virtual glm::vec2 get_prev_position() { return {}; } virtual glm::vec2 get_prev_position() { return {}; }
virtual PositionVisibility GetPositionVisibility() {return PositionVisibility::NONE;};
virtual bool has_rumble() { return false; } virtual bool has_rumble() { return false; }
virtual void start_rumble() {} virtual void start_rumble() {}

View File

@ -3,6 +3,12 @@
#include <glm/vec2.hpp> #include <glm/vec2.hpp>
#include "util/helpers/fspinlock.h" #include "util/helpers/fspinlock.h"
enum class PositionVisibility {
NONE = 0,
FULL = 1,
PARTIAL = 2
};
// helper class for storing and managing button press states in a thread-safe manner // helper class for storing and managing button press states in a thread-safe manner
struct ControllerButtonState struct ControllerButtonState
{ {

View File

@ -93,6 +93,13 @@ glm::vec2 DSUController::get_prev_position()
return {}; return {};
} }
PositionVisibility DSUController::GetPositionVisibility()
{
const auto state = m_provider->get_prev_state(m_index);
return (state.data.tpad1.active || state.data.tpad2.active) ? PositionVisibility::FULL : PositionVisibility::NONE;
}
std::string DSUController::get_button_name(uint64 button) const std::string DSUController::get_button_name(uint64 button) const
{ {
switch (button) switch (button)

View File

@ -32,6 +32,7 @@ public:
bool has_position() override; bool has_position() override;
glm::vec2 get_position() override; glm::vec2 get_position() override;
glm::vec2 get_prev_position() override; glm::vec2 get_prev_position() override;
PositionVisibility GetPositionVisibility() override;
std::string get_button_name(uint64 button) const override; std::string get_button_name(uint64 button) const override;

View File

@ -98,6 +98,11 @@ glm::vec2 NativeWiimoteController::get_prev_position()
const auto state = m_provider->get_state(m_index); const auto state = m_provider->get_state(m_index);
return state.ir_camera.m_prev_position; return state.ir_camera.m_prev_position;
} }
PositionVisibility NativeWiimoteController::GetPositionVisibility()
{
const auto state = m_provider->get_state(m_index);
return state.ir_camera.m_positionVisibility;
}
bool NativeWiimoteController::has_low_battery() bool NativeWiimoteController::has_low_battery()
{ {

View File

@ -40,6 +40,7 @@ public:
bool has_position() override; bool has_position() override;
glm::vec2 get_position() override; glm::vec2 get_position() override;
glm::vec2 get_prev_position() override; glm::vec2 get_prev_position() override;
PositionVisibility GetPositionVisibility() override;
bool has_motion() override { return true; } bool has_motion() override { return true; }
bool has_rumble() override { return true; } bool has_rumble() override { return true; }

View File

@ -766,14 +766,20 @@ void WiimoteControllerProvider::calculate_ir_position(WiimoteState& wiimote_stat
ir.middle = ir.position; ir.middle = ir.position;
ir.distance = glm::length(ir.dots[indices.first].pos - ir.dots[indices.second].pos); ir.distance = glm::length(ir.dots[indices.first].pos - ir.dots[indices.second].pos);
ir.indices = indices; ir.indices = indices;
ir.m_positionVisibility = PositionVisibility::FULL;
} }
else if (ir.dots[indices.first].visible) else if (ir.dots[indices.first].visible)
{ {
ir.position = ir.middle + (ir.dots[indices.first].pos - ir.prev_dots[indices.first].pos); ir.position = ir.middle + (ir.dots[indices.first].pos - ir.prev_dots[indices.first].pos);
ir.m_positionVisibility = PositionVisibility::PARTIAL;
} }
else if (ir.dots[indices.second].visible) else if (ir.dots[indices.second].visible)
{ {
ir.position = ir.middle + (ir.dots[indices.second].pos - ir.prev_dots[indices.second].pos); ir.position = ir.middle + (ir.dots[indices.second].pos - ir.prev_dots[indices.second].pos);
ir.m_positionVisibility = PositionVisibility::PARTIAL;
}
else {
ir.m_positionVisibility = PositionVisibility::NONE;
} }
} }

View File

@ -5,6 +5,7 @@
#include "input/api/Wiimote/WiimoteMessages.h" #include "input/api/Wiimote/WiimoteMessages.h"
#include "input/api/ControllerProvider.h" #include "input/api/ControllerProvider.h"
#include "input/api/ControllerState.h"
#include <list> #include <list>
#include <variant> #include <variant>
@ -61,6 +62,7 @@ public:
std::array<IRDot, 4> dots{}, prev_dots{}; std::array<IRDot, 4> dots{}, prev_dots{};
glm::vec2 position{}, m_prev_position{}; glm::vec2 position{}, m_prev_position{};
PositionVisibility m_positionVisibility;
glm::vec2 middle {}; glm::vec2 middle {};
float distance = 0; float distance = 0;
std::pair<sint32, sint32> indices{ 0,1 }; std::pair<sint32, sint32> indices{ 0,1 };

View File

@ -207,6 +207,17 @@ glm::vec2 EmulatedController::get_prev_position() const
return {}; return {};
} }
PositionVisibility EmulatedController::GetPositionVisibility() const
{
std::shared_lock lock(m_mutex);
for (const auto& controller : m_controllers)
{
if (controller->has_position())
return controller->GetPositionVisibility();
}
return PositionVisibility::NONE;
}
void EmulatedController::add_controller(std::shared_ptr<ControllerBase> controller) void EmulatedController::add_controller(std::shared_ptr<ControllerBase> controller)
{ {
controller->connect(); controller->connect();

View File

@ -67,6 +67,7 @@ public:
bool has_position() const; bool has_position() const;
glm::vec2 get_position() const; glm::vec2 get_position() const;
glm::vec2 get_prev_position() const; glm::vec2 get_prev_position() const;
PositionVisibility GetPositionVisibility() const;
void add_controller(std::shared_ptr<ControllerBase> controller); void add_controller(std::shared_ptr<ControllerBase> controller);
void remove_controller(const std::shared_ptr<ControllerBase>& controller); void remove_controller(const std::shared_ptr<ControllerBase>& controller);

View File

@ -1,3 +1,4 @@
#include <api/Controller.h>
#include "input/emulated/WPADController.h" #include "input/emulated/WPADController.h"
#include "input/emulated/ClassicController.h" #include "input/emulated/ClassicController.h"
@ -308,10 +309,13 @@ void WPADController::KPADRead(KPADStatus_t& status, const BtnRepeat& repeat)
status.mpls.dir.Z.z = attitude[8]; status.mpls.dir.Z.z = attitude[8];
} }
} }
auto visibility = GetPositionVisibility();
if (has_position()) if (has_position() && visibility != PositionVisibility::NONE)
{ {
status.dpd_valid_fg = 1; if (visibility == PositionVisibility::FULL)
status.dpd_valid_fg = 2;
else
status.dpd_valid_fg = -1;
const auto position = get_position(); const auto position = get_position();
@ -324,6 +328,8 @@ void WPADController::KPADRead(KPADStatus_t& status, const BtnRepeat& repeat)
status.vec.y = delta.y; status.vec.y = delta.y;
status.speed = glm::length(delta); status.speed = glm::length(delta);
} }
else
status.dpd_valid_fg = 0;
switch (type()) switch (type())
{ {