diff --git a/backends/CMakeLists.txt b/backends/CMakeLists.txt index 533477d..f7a0387 100644 --- a/backends/CMakeLists.txt +++ b/backends/CMakeLists.txt @@ -9,6 +9,7 @@ option(PD_ENABLE_CITRO3D "Enable Citro3D Support (3DS)" OFF) option(PD_ENABLE_VULKAN "Not implemented yet" OFF) option(PD_ENABLE_HID_GLFW "Enable GLFW Input Driver" ON) option(PD_ENABLE_HID_NX "Enable NX Input Driver" OFF) +option(PD_ENABLE_HID3DS "Enable 3ds Input Driver" OFF) if(NOT WIN32) # cause we are not on windows... set(PD_ENABLE_DIRECTX9 OFF) @@ -21,6 +22,7 @@ if(${CMAKE_SYSTEM_NAME} STREQUAL "Nintendo3DS") set(PD_ENABLE_CITRO3D ON) set(PD_ENABLE_HID_GLFW OFF) set(PD_ENABLE_HID_NX OFF) + set(PD_ENABLE_HID3DS ON) elseif(${CMAKE_SYSTEM_NAME} STREQUAL "NintendoSwitch") set(PD_ENABLE_OPENGL2 OFF) set(PD_ENABLE_OPENGL3 ON) @@ -36,6 +38,7 @@ add_library(pd-system STATIC ${CMAKE_CURRENT_SOURCE_DIR}/source/gfx_opengl3.cpp ${CMAKE_CURRENT_SOURCE_DIR}/source/gfx_directx9.cpp ${CMAKE_CURRENT_SOURCE_DIR}/source/gfx_citro3d.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/source/hid_3ds.cpp ${CMAKE_CURRENT_SOURCE_DIR}/source/hid_glfw.cpp ${CMAKE_CURRENT_SOURCE_DIR}/source/hid_nx.cpp ) @@ -64,6 +67,7 @@ target_compile_definitions(pd-system $<$:PD_ENABLE_CITRO3D> $<$:PD_ENABLE_HID_GLFW> $<$:PD_ENABLE_HID_NX> + $<$:PD_ENABLE_HID3DS> ) # Palladium diff --git a/backends/include/pd_system/hid_3ds.hpp b/backends/include/pd_system/hid_3ds.hpp new file mode 100644 index 0000000..ba741cf --- /dev/null +++ b/backends/include/pd_system/hid_3ds.hpp @@ -0,0 +1,17 @@ +#pragma once + +#include + +namespace PD { +class Hid3DS : public HidDriver { + public: + Hid3DS(); + ~Hid3DS(); + + void Update() override; + + private: + struct Impl; + Impl* impl; +}; +} // namespace PD \ No newline at end of file diff --git a/backends/include/pdsystem b/backends/include/pdsystem index dcb97de..0a9a218 100644 --- a/backends/include/pdsystem +++ b/backends/include/pdsystem @@ -7,4 +7,5 @@ #include // Hid -#include \ No newline at end of file +#include +#include diff --git a/backends/source/hid_3ds.cpp b/backends/source/hid_3ds.cpp new file mode 100644 index 0000000..bb01fae --- /dev/null +++ b/backends/source/hid_3ds.cpp @@ -0,0 +1,82 @@ +#include +#if defined(PD_ENABLE_HID3DS) && defined(__3DS__) +#include <3ds.h> +namespace PD { +struct Hid3DS::Impl { + std::string* Text; + bool InTextMode = false; +}; + +Hid3DS::Hid3DS() : HidDriver("Hid3DS") { + impl = new Impl; + + pFlags |= PDHidBackendFlags_HasGamepad; + pFlags |= PDHidBackendFlags_HasTouch; + + pGamepad[KEY_A] = HidInternal::Gamepad::A; + pGamepad[KEY_B] = HidInternal::Gamepad::B; + pGamepad[KEY_X] = HidInternal::Gamepad::X; + pGamepad[KEY_Y] = HidInternal::Gamepad::Y; + pGamepad[KEY_START] = HidInternal::Gamepad::Start; + pGamepad[KEY_SELECT] = HidInternal::Gamepad::Select; + pGamepad[KEY_L] = HidInternal::Gamepad::L; + pGamepad[KEY_R] = HidInternal::Gamepad::R; + pGamepad[KEY_DUP] = HidInternal::Gamepad::DUp; + pGamepad[KEY_DDOWN] = HidInternal::Gamepad::DDown; + pGamepad[KEY_DLEFT] = HidInternal::Gamepad::DLeft; + pGamepad[KEY_DRIGHT] = HidInternal::Gamepad::DRight; + pGamepad[KEY_CPAD_UP] = HidInternal::Gamepad::CPUp; + pGamepad[KEY_CPAD_DOWN] = HidInternal::Gamepad::CPDown; + pGamepad[KEY_CPAD_LEFT] = HidInternal::Gamepad::CPLeft; + pGamepad[KEY_CPAD_RIGHT] = HidInternal::Gamepad::CPRight; + pGamepad[KEY_CSTICK_UP] = HidInternal::Gamepad::CSUp; + pGamepad[KEY_CSTICK_DOWN] = HidInternal::Gamepad::CSDown; + pGamepad[KEY_CSTICK_LEFT] = HidInternal::Gamepad::CSLeft; + pGamepad[KEY_CSTICK_RIGHT] = HidInternal::Gamepad::CSRight; + pGamepad[KEY_ZL] = HidInternal::Gamepad::ZL; + pGamepad[KEY_ZR] = HidInternal::Gamepad::ZR; + pGamepad[KEY_TOUCH] = HidInternal::Gamepad::Touch; +} + +Hid3DS::~Hid3DS() { delete impl; } + +void Hid3DS::Update() { + HidDriver::Update(); // clear stats + hidScanInput(); + u32 kd = hidKeysDown(); + u32 kh = hidKeysHeld(); + u32 ku = hidKeysUp(); + + for (const auto& b : pGamepad) { + if (b.first & kd) { + pGamepadEvents[0][Event::Down] |= b.second; + } + if (b.first & kh) { + pGamepadEvents[0][Event::Held] |= b.second; + } + if (b.first & ku) { + pGamepadEvents[0][Event::Up] |= b.second; + } + } + + /*if (pLocked) { + SwapTab(); + }*/ + touchPosition t; + hidTouchRead(&t); + pMouse[0] = fvec2(t.px, t.py); +} +} // namespace PD +#else +struct GLFWgamepadstate {}; +namespace PD { + +Hid3DS::Hid3DS() : HidDriver("Hid3DS") {} + +Hid3DS::~Hid3DS() {} + +void Hid3DS::Update() { + HidDriver::Update(); // clear stats +} +} // namespace PD +#endif \ No newline at end of file diff --git a/backends/source/hid_glfw.cpp b/backends/source/hid_glfw.cpp index 84ab8e0..d369880 100644 --- a/backends/source/hid_glfw.cpp +++ b/backends/source/hid_glfw.cpp @@ -65,7 +65,7 @@ HidGlfw::HidGlfw(GLFWwindow* win) : HidDriver("HidGlfw") { } } -HidGlfw::~HidGlfw() {} +HidGlfw::~HidGlfw() { delete impl; } void HidGlfw::Update() { HidDriver::Update(); // clear stats diff --git a/backends/source/hid_nx.cpp b/backends/source/hid_nx.cpp index 03dc2f7..e35b0ee 100644 --- a/backends/source/hid_nx.cpp +++ b/backends/source/hid_nx.cpp @@ -11,7 +11,7 @@ struct HidNX::Impl { HidNX::HidNX() : HidDriver("HidNX") { impl = new Impl; } -HidNX::~HidNX() {} +HidNX::~HidNX() { delete impl; } void HidNX::Update() { HidDriver::Update(); // clear stats diff --git a/tests/gfx/source/os/horizon-ctr.cpp b/tests/gfx/source/os/horizon-ctr.cpp index e869d7f..5cb7dd3 100644 --- a/tests/gfx/source/os/horizon-ctr.cpp +++ b/tests/gfx/source/os/horizon-ctr.cpp @@ -43,7 +43,7 @@ void HorizonCtr::Init() { C3D_RenderTargetSetOutput(impl->Bottom, GFX_BOTTOM, GFX_LEFT, DisplayTransferFlags); PD::Gfx::UseDriver(); - PD::Hid::UseDriver(); + PD::Hid::UseDriver(); } void HorizonCtr::Deinit() {