summaryrefslogtreecommitdiffstats
path: root/sdl/event.c
diff options
context:
space:
mode:
Diffstat (limited to 'sdl/event.c')
-rw-r--r--sdl/event.c128
1 files changed, 128 insertions, 0 deletions
diff --git a/sdl/event.c b/sdl/event.c
new file mode 100644
index 0000000..e6c4c00
--- /dev/null
+++ b/sdl/event.c
@@ -0,0 +1,128 @@
+/* event.c
+ *
+ * Event Handler
+ *
+ * notes: I would be useful to create a following function
+ * register_signal(SDL_HOLDDOWN, EVENT_ACTION_INCR, float *p, float val)
+ *
+ * struct platform is still passed globally
+ *
+ */
+
+#include <SDL/SDL.h>
+#include <SDL/SDL_image.h>
+#include "client.h"
+#include "glframe.h"
+#include "platform.h"
+#include "window.h"
+#include "event.h"
+
+extern struct platform p;
+extern int program_running;
+
+/* process SDL events */
+void sdl_process_events(void)
+{
+ SDL_Event event;
+ SDLKey sym;
+ static unsigned int keys_held[323];
+
+ /* helper flag for event_keydown() */
+ int flag = 0;
+
+ while (SDL_PollEvent(&event))
+ {
+ sym = event.key.keysym.sym;
+
+ switch (event.type)
+ {
+ /* keyboard event */
+ case SDL_KEYUP:
+ {
+ /* reset the key to 0 */
+ keys_held[sym] = 0;
+ break;
+ }
+ case SDL_KEYDOWN:
+ {
+ keys_held[sym] = 1;
+ event_keydown(&event.key.keysym, keys_held, flag);
+ break;
+ }
+ case SDL_VIDEORESIZE:
+ {
+ window_resize(event.resize.w, event.resize.h);
+ break;
+ }
+ case SDL_QUIT:
+ {
+ program_running = 0;
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+ /* below code has to be placed here, check for keys that are being constantly held */
+ if (keys_held[SDLK_w] || keys_held[SDLK_s] || keys_held[SDLK_a] || keys_held[SDLK_d] ||
+ keys_held[SDLK_UP] || keys_held[SDLK_DOWN] || keys_held[SDLK_LEFT] || keys_held[SDLK_RIGHT] ||
+ keys_held[SDLK_n] || keys_held[SDLK_m])
+ {
+ flag = !flag;
+ event_keydown(NULL, keys_held, flag);
+ }
+ else
+ flag = !flag;
+}
+
+void event_keydown(SDL_keysym *keysym, const unsigned int *keys_held, const int flag)
+{
+ if (!flag)
+ {
+ switch (keysym->sym)
+ {
+ case SDLK_ESCAPE: program_running = 0; break;
+ case SDLK_w: p.c->xrot -= 5.0f; break;
+ case SDLK_s: p.c->xrot += 5.0f; break;
+ case SDLK_a: p.c->yrot -= 5.0f; break;
+ case SDLK_d: p.c->yrot += 5.0f; break;
+ case SDLK_UP: glframe_move_forward(&p.camera, 0.5f); break;
+ case SDLK_DOWN: glframe_move_forward(&p.camera, -0.5f); break;
+ case SDLK_LEFT: glframe_rotate_local_y(&p.camera, 0.1f); break;
+ case SDLK_RIGHT: glframe_rotate_local_y(&p.camera, -0.1f); break;
+ case SDLK_n: glframe_rotate_local_x(&p.camera, 0.1f); break;
+ case SDLK_m: glframe_rotate_local_x(&p.camera, -0.1f); break;
+ default: break;
+ }
+ }
+ else
+ {
+ if (keys_held[SDLK_w])
+ p.c->xrot -= 5.0f;
+ if (keys_held[SDLK_s])
+ p.c->xrot += 5.0f;
+ if (keys_held[SDLK_a])
+ p.c->yrot -= 5.0f;
+ if (keys_held[SDLK_d])
+ p.c->yrot += 5.0f;
+
+ if (keys_held[SDLK_UP])
+ glframe_move_forward(&p.camera, 0.05f);
+ if (keys_held[SDLK_DOWN])
+ glframe_move_forward(&p.camera, -0.05f);
+ if (keys_held[SDLK_LEFT])
+ glframe_rotate_local_y(&p.camera, 0.02f);
+ if (keys_held[SDLK_RIGHT])
+ glframe_rotate_local_y(&p.camera, -0.02f);
+
+ if (keys_held[SDLK_n])
+ glframe_rotate_local_x(&p.camera, 0.02f);
+ if (keys_held[SDLK_m])
+ glframe_rotate_local_x(&p.camera, -0.02f);
+ }
+
+ p.c->xrot = (GLfloat) ((const int) p.c->xrot % 360);
+ p.c->yrot = (GLfloat) ((const int) p.c->yrot % 360);
+}
+