@@ -37,8 +37,50 @@ namespace host
3737 register_button_action (btn_action, input_button, callback);
3838 }
3939
40- // TODO:
41- // void register_analog_action(const std::string_view& action, ... axis);
40+ // Register an analog action which corresponds to an input
41+ void pad_handler::register_analog_action (const analog_action ana_action, analog analog_axis, std::function<void (f32 axis)> callback)
42+ {
43+ axis axis_xy;
44+ f32 axis_val;
45+
46+ // Poll the current analog value
47+ switch (analog_axis)
48+ {
49+ case analog::left_x:
50+ case analog::left_y:
51+ axis_xy = left_stick_axis ();
52+ if (analog_axis == analog::left_x)
53+ {
54+ axis_val = axis_xy.x ;
55+ }
56+ else
57+ {
58+ axis_val = axis_xy.y ;
59+ }
60+ break ;
61+ case analog::right_x:
62+ case analog::right_y:
63+ axis_xy = right_stick_axis ();
64+ if (analog_axis == analog::right_x)
65+ {
66+ axis_val = axis_xy.x ;
67+ }
68+ else
69+ {
70+ axis_val = axis_xy.y ;
71+ }
72+ break ;
73+ default :
74+ panicf (" Unrecognized analog value {}" , common::to_underlying (analog_axis));
75+ return ;
76+ }
77+
78+ m_analog_actions[ana_action] = {
79+ .m_value = axis_val,
80+ .m_input_key = analog_axis,
81+ .m_callback = callback
82+ };
83+ }
4284
4385 // Set a callback for a button action
4486 void pad_handler::set_button_action_callback (const button_action btn_action, std::function<void (bool pressed)> callback)
@@ -118,7 +160,39 @@ namespace host
118160 action.m_value = pressed;
119161 }
120162
121- // TODO: Update analog
163+ // Update analog
164+ auto left_axis = left_stick_axis ();
165+ auto right_axis = right_stick_axis ();
166+
167+ for (auto & kv : m_analog_actions)
168+ {
169+ auto & action = kv.second ;
170+
171+ switch (action.m_input_key )
172+ {
173+ case analog::left_x:
174+ action.m_value = left_axis.x ;
175+ break ;
176+ case analog::left_y:
177+ action.m_value = left_axis.y ;
178+ break ;
179+ case analog::right_x:
180+ action.m_value = right_axis.x ;
181+ break ;
182+ case analog::right_y:
183+ action.m_value = right_axis.y ;
184+ }
185+
186+ // Currently we defer a callback to execute every frame for analog actions
187+ if (action.m_callback != nullptr )
188+ {
189+ m_analog_action_callbacks.push_back (
190+ {
191+ .m_value = action.m_value ,
192+ .m_callback = action.m_callback
193+ });
194+ }
195+ }
122196 }
123197
124198 void pad_handler::do_action_callbacks ()
0 commit comments