summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/rodeo/input.h12
-rw-r--r--src/input/rodeo_input.c87
-rw-r--r--src/rodeo.c3
3 files changed, 99 insertions, 3 deletions
diff --git a/include/rodeo/input.h b/include/rodeo/input.h
index e589c90..9f94119 100644
--- a/include/rodeo/input.h
+++ b/include/rodeo/input.h
@@ -52,6 +52,12 @@ rodeo_input_command_register_positional_mouse(
);
bool
+rodeo_input_command_register_boundedRange_controllerAxis(
+ rodeo_input_command_t *input_command,
+ rodeo_input_boundedRange_controllerAxis_t controller_axis
+);
+
+bool
rodeo_input_command_register_unboundedRange_mouse(
rodeo_input_command_t *input_command,
rodeo_input_unboundedRange_mouse_t mouse_axis
@@ -61,7 +67,6 @@ rodeo_input_command_register_unboundedRange_mouse(
//rodeo_input_command_register_binary(cmd, rodeo_input_binary_Scancode, rodeo_input_binary_scancode_Q );
//rodeo_input_command_register_any(cmd, rodeo_input_type_Binary, rodeo_input_binary_Scancode, rodeo_input_binary_scancode_Q );
-
void
rodeo_input_scene_register_command(
rodeo_input_scene_t *scene,
@@ -84,3 +89,8 @@ rodeo_input_scene_deactivate(
rodeo_input_scene_t *scene
);
+void
+irodeo_input_controller_register(int32_t id);
+
+void
+irodeo_input_controller_unregister(int32_t id);
diff --git a/src/input/rodeo_input.c b/src/input/rodeo_input.c
index ceb2d85..ac7f5e2 100644
--- a/src/input/rodeo_input.c
+++ b/src/input/rodeo_input.c
@@ -192,6 +192,24 @@ rodeo_input_events_poll(void)
}
}
break;
+ case SDL_CONTROLLERDEVICEADDED:
+ {
+ irodeo_input_controller_register(event.cdevice.which);
+ }
+ break;
+ case SDL_CONTROLLERDEVICEREMOVED:
+ {
+ irodeo_input_controller_unregister(event.cdevice.which);
+ }
+ break;
+ case SDL_CONTROLLERDEVICEREMAPPED:
+ {
+ rodeo_log(
+ rodeo_logLevel_warning,
+ "SDL Controller device was remapped"
+ );
+ }
+ break;
case SDL_CONTROLLERAXISMOTION:
{
c_foreach(i, cset_input_scene, istate.active_scenes)
@@ -203,7 +221,8 @@ rodeo_input_events_poll(void)
if(cset_input_boundedRange_controllerAxis_contains(&command->bounded_range.controller_axes, event.caxis.axis))
{
rodeo_input_any_state_t input_state = {
- .data.bounded_range_state = (float)event.caxis.value,
+ .data.bounded_range_state =
+ (float)event.caxis.value/(float)UINT16_MAX,
.type = rodeo_input_type_BoundedRange
};
c_foreach(
@@ -220,6 +239,16 @@ rodeo_input_events_poll(void)
}
}
break;
+ case SDL_CONTROLLERBUTTONDOWN:
+ case SDL_CONTROLLERBUTTONUP:
+ case SDL_JOYBUTTONDOWN:
+ case SDL_JOYBUTTONUP:
+ case SDL_JOYAXISMOTION:
+ //rodeo_log(
+ // rodeo_logLevel_info,
+ // "controller event"
+ //);
+ break;
}
}
return false;
@@ -379,6 +408,30 @@ rodeo_input_command_register_positional_mouse(
}
bool
+rodeo_input_command_register_boundedRange_controllerAxis(
+ rodeo_input_command_t *input_command,
+ rodeo_input_boundedRange_controllerAxis_t controller_axis
+)
+{
+ if((rodeo_input_type_BoundedRange & input_command->valid_types) == 0)
+ {
+ rodeo_log(
+ rodeo_logLevel_error,
+ "Attempting to register input type which is invalid for this input command, failed to do so"
+ );
+ return false;
+ }
+ else
+ {
+ cset_input_boundedRange_controllerAxis_insert(
+ &input_command->bounded_range.controller_axes,
+ controller_axis
+ );
+ return true;
+ }
+}
+
+bool
rodeo_input_command_register_unboundedRange_mouse(
rodeo_input_command_t *input_command,
rodeo_input_unboundedRange_mouse_t mouse_axis
@@ -437,3 +490,35 @@ rodeo_input_scene_deactivate(rodeo_input_scene_t *scene)
{
cset_input_scene_erase(&istate.active_scenes, scene);
}
+
+#define i_key int32_t
+#define i_val SDL_GameController*
+#define i_tag SDL_GameController
+#include "stc/cmap.h"
+
+static cmap_SDL_GameController icontrollers = {0};
+
+void
+irodeo_input_controller_register(int32_t id)
+{
+ if(SDL_IsGameController(id))
+ {
+ SDL_GameController *controller = SDL_GameControllerOpen(id);
+ cmap_SDL_GameController_insert(&icontrollers, id, controller);
+ }
+ else
+ {
+ rodeo_log(
+ rodeo_logLevel_error,
+ "Invalid controller id, cannot register"
+ );
+ }
+}
+
+void
+irodeo_input_controller_unregister(int32_t id)
+{
+ SDL_GameController *controller = cmap_SDL_GameController_get(&icontrollers, id)->second;
+ SDL_GameControllerClose(controller);
+ cmap_SDL_GameController_erase(&icontrollers, id);
+}
diff --git a/src/rodeo.c b/src/rodeo.c
index 91ce4f8..71c4666 100644
--- a/src/rodeo.c
+++ b/src/rodeo.c
@@ -43,7 +43,8 @@ rodeo_window_init(
rodeo_logLevel_info,
"Initializing SDL..."
);
- if(SDL_Init(SDL_INIT_VIDEO) < 0)
+
+ if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_GAMECONTROLLER) < 0)
{
rodeo_log(
rodeo_logLevel_error,