MGL(Win32)
読み取り中…
検索中…
一致する文字列を見つけられません
mgl_gamepad_delegate_apple_gc.h
[詳解]
1// SPDX-License-Identifier: Zlib
2/* ------------------------------------------------------------------------- */
9/* ------------------------------------------------------------------------- */
10
11#ifndef INCGUARD_MGL_GAMEPAD_DELEGATE_APPLE_GC_H_1664004796
12#define INCGUARD_MGL_GAMEPAD_DELEGATE_APPLE_GC_H_1664004796
13
14#include <mgl/mgl_environment.h>
15#if defined(MGL_GAMEPAD_DELEGATE_ENABLE_APPLE_GC)
16
17#include <array>
18#include <mutex>
19
20#if defined(__OBJC__)
21#include <GameController/GameController.h>
22#endif
23
26
27namespace MGL::Input
28{
29// GameControllerフレームワークのクラスObj-Cのみ使用可能なので,C++では前方宣言しておく
30#if !defined(__OBJC__)
31namespace
32{
33class GCController;
34};
35#endif
36
38class AppleGCGamepadDelegate : public GamepadDelegate
39{
40public:
41 AppleGCGamepadDelegate(GamepadServer &server) noexcept;
42 ~AppleGCGamepadDelegate() noexcept;
43
44 virtual bool Initialize() noexcept override;
45 virtual void UpdateState() noexcept override;
46
47private:
48 void InitializeAvailableFlags() noexcept;
49
50 PadType GetPadType(GCController *controller) const noexcept;
51
52 void OnConnect(GCController *controller) noexcept;
53 void OnDisconnect(GCController *controller) noexcept;
54
55 void UpdateMFiExtendedPadState(PadState &state, GCController *controller, bool isRequestedPause) noexcept;
56 void UpdateMFiMicroPadState(PadState &state, GCController *controller, bool isRequestedPause) noexcept;
57 void UpdateXboxOnePadState(PadState &state, GCController *controller) noexcept;
58 void UpdateDualShock4PadState(PadState &state, GCController *controller) noexcept;
59 void UpdateDualSensePadState(PadState &state, GCController *controller) noexcept;
60
61#if !defined(__OBJC__)
62 using id = void *;
63#endif
64 id _connectObserver;
65 id _disconnectObserver;
66
67#if defined(MGL_TARGET_TVOS)
68 static constexpr size_t kGamepadMax = 3; // tvOSのMFiゲームパッドの最大認識数
69#else
70 static constexpr size_t kGamepadMax = 4; // macOS/iOSのMFiゲームパッドの最大認識数
71#endif
72
73 // ゲームパッドクラス
74 struct Gamepad
75 {
76 PadState *state; // パッドステート
77 GCController *controller; // GameControllerフレームワークが管理するコントローラクラス
78 std::atomic<bool> isRequestedPause; // ポーズ要求フラグ(古いバージョンのMFiゲームパッドのみで使用)
79 };
80 std::array<Gamepad, kGamepadMax> _gamepads;
81
82 // 各機能の対応フラグ
83 enum class AvailableFlag
84 {
85 MFiReadMenuButton, // MFiゲームパッドのメニューボタンの直接読み取り
86 MFiThumbstickButton, // MFiゲームパッドのサムスティックボタンの読み取り
87 MFiOptionsButton, // MFiゲームパッドのオプションボタンの読み取り
88 DualShock4Gamepad, // DualShock4
89 DualSenseGamepad, // DualSense
90 XboxOneGamepad, // XboxOneコントローラ
91 XboxShareButton, // XBoxOneのシェアボタンの読み取り
92 };
93 static constexpr size_t kAvailableFlagSize = static_cast<size_t>(AvailableFlag::XboxShareButton) + 1;
94 std::array<bool, kAvailableFlagSize> _availableFlags;
95
96 /* ------------------------------------------------------------------------- */
102 /* ------------------------------------------------------------------------- */
103 constexpr bool IsAvailable(AvailableFlag flag) const noexcept
104 {
105 return _availableFlags[static_cast<size_t>(flag)];
106 }
107
108 std::mutex _mutex;
109};
110} // namespace MGL::Input
111
112#endif // MGL_GAMEPAD_DELEGATE_ENABLE_APPLE_GC
113#endif // INCGUARD_MGL_GAMEPAD_DELEGATE_APPLE_GC_H_1664004796
114
115// vim: et ts=4 sw=4 sts=4
MGL 環境定義
MGL ゲームパッド用デリゲート基底クラス
constexpr size_t kGamepadMax
ゲームパッドの最大認識数
Definition mgl_gamepad_server.h:33
MGL ゲームパッドステート