| |
| |
|
|
| #include "common/settings.h" |
| #include "input_common/input_engine.h" |
| #include "input_common/input_mapping.h" |
|
|
| namespace InputCommon { |
|
|
| MappingFactory::MappingFactory() = default; |
|
|
| void MappingFactory::BeginMapping(Polling::InputType type) { |
| is_enabled = true; |
| input_type = type; |
| input_queue.Clear(); |
| first_axis = -1; |
| second_axis = -1; |
| } |
|
|
| Common::ParamPackage MappingFactory::GetNextInput() { |
| Common::ParamPackage input; |
| input_queue.Pop(input); |
| return input; |
| } |
|
|
| void MappingFactory::RegisterInput(const MappingData& data) { |
| if (!is_enabled) { |
| return; |
| } |
| if (!IsDriverValid(data)) { |
| return; |
| } |
|
|
| switch (input_type) { |
| case Polling::InputType::Button: |
| RegisterButton(data); |
| return; |
| case Polling::InputType::Stick: |
| RegisterStick(data); |
| return; |
| case Polling::InputType::Motion: |
| RegisterMotion(data); |
| return; |
| default: |
| return; |
| } |
| } |
|
|
| void MappingFactory::StopMapping() { |
| is_enabled = false; |
| input_type = Polling::InputType::None; |
| input_queue.Clear(); |
| } |
|
|
| void MappingFactory::RegisterButton(const MappingData& data) { |
| Common::ParamPackage new_input; |
| new_input.Set("engine", data.engine); |
| if (data.pad.guid.IsValid()) { |
| new_input.Set("guid", data.pad.guid.RawString()); |
| } |
| new_input.Set("port", static_cast<int>(data.pad.port)); |
| new_input.Set("pad", static_cast<int>(data.pad.pad)); |
|
|
| switch (data.type) { |
| case EngineInputType::Button: |
| |
| if (data.engine == "keyboard") { |
| new_input.Set("code", data.index); |
| break; |
| } |
| new_input.Set("button", data.index); |
| break; |
| case EngineInputType::HatButton: |
| new_input.Set("hat", data.index); |
| new_input.Set("direction", data.hat_name); |
| break; |
| case EngineInputType::Analog: |
| |
| if (data.engine == "mouse" && data.index != 4) { |
| return; |
| } |
| new_input.Set("axis", data.index); |
| new_input.Set("threshold", 0.5f); |
| break; |
| case EngineInputType::Motion: |
| new_input.Set("motion", data.index); |
| break; |
| default: |
| return; |
| } |
| input_queue.Push(new_input); |
| } |
|
|
| void MappingFactory::RegisterStick(const MappingData& data) { |
| Common::ParamPackage new_input; |
| new_input.Set("engine", data.engine); |
| if (data.pad.guid.IsValid()) { |
| new_input.Set("guid", data.pad.guid.RawString()); |
| } |
| new_input.Set("port", static_cast<int>(data.pad.port)); |
| new_input.Set("pad", static_cast<int>(data.pad.pad)); |
|
|
| |
| if (data.engine == "mouse") { |
| new_input.Set("axis_x", 0); |
| new_input.Set("axis_y", 1); |
| new_input.Set("threshold", 0.5f); |
| new_input.Set("range", 1.0f); |
| new_input.Set("deadzone", 0.0f); |
| input_queue.Push(new_input); |
| return; |
| } |
|
|
| switch (data.type) { |
| case EngineInputType::Button: |
| case EngineInputType::HatButton: |
| RegisterButton(data); |
| return; |
| case EngineInputType::Analog: |
| if (first_axis == data.index) { |
| return; |
| } |
| if (first_axis == -1) { |
| first_axis = data.index; |
| return; |
| } |
| new_input.Set("axis_x", first_axis); |
| new_input.Set("axis_y", data.index); |
| new_input.Set("threshold", 0.5f); |
| new_input.Set("range", 0.95f); |
| new_input.Set("deadzone", 0.15f); |
| break; |
| default: |
| return; |
| } |
| input_queue.Push(new_input); |
| } |
|
|
| void MappingFactory::RegisterMotion(const MappingData& data) { |
| Common::ParamPackage new_input; |
| new_input.Set("engine", data.engine); |
| if (data.pad.guid.IsValid()) { |
| new_input.Set("guid", data.pad.guid.RawString()); |
| } |
| new_input.Set("port", static_cast<int>(data.pad.port)); |
| new_input.Set("pad", static_cast<int>(data.pad.pad)); |
|
|
| |
| if (data.engine == "mouse") { |
| new_input.Set("motion", 0); |
| new_input.Set("pad", 1); |
| new_input.Set("threshold", 0.001f); |
| input_queue.Push(new_input); |
| return; |
| } |
|
|
| switch (data.type) { |
| case EngineInputType::Button: |
| case EngineInputType::HatButton: |
| RegisterButton(data); |
| return; |
| case EngineInputType::Analog: |
| if (first_axis == data.index) { |
| return; |
| } |
| if (second_axis == data.index) { |
| return; |
| } |
| if (first_axis == -1) { |
| first_axis = data.index; |
| return; |
| } |
| if (second_axis == -1) { |
| second_axis = data.index; |
| return; |
| } |
| new_input.Set("axis_x", first_axis); |
| new_input.Set("axis_y", second_axis); |
| new_input.Set("axis_z", data.index); |
| new_input.Set("range", 1.0f); |
| new_input.Set("deadzone", 0.20f); |
| break; |
| case EngineInputType::Motion: |
| new_input.Set("motion", data.index); |
| break; |
| default: |
| return; |
| } |
| input_queue.Push(new_input); |
| } |
|
|
| bool MappingFactory::IsDriverValid(const MappingData& data) const { |
| |
| if (data.engine == "keyboard" && data.pad.port != 0) { |
| return false; |
| } |
| |
| if (data.engine == "mouse" && data.pad.port != 0) { |
| return false; |
| } |
| |
| if (!Settings::values.enable_udp_controller && data.engine == "cemuhookudp" && |
| data.type != EngineInputType::Motion) { |
| return false; |
| } |
| |
| if (data.engine == "touch_from_button") { |
| return false; |
| } |
| if (data.engine == "analog_from_button") { |
| return false; |
| } |
| if (data.engine == "virtual_gamepad") { |
| return false; |
| } |
| return true; |
| } |
|
|
| } |
|
|