diff options
author | Kyle K <kylek389@gmail.com> | 2011-07-18 16:10:34 -0500 |
---|---|---|
committer | Kamil Kaminski <kamilkss@gmail.com> | 2011-07-18 16:10:34 -0500 |
commit | 881ada4374bc0bd52ea3d99f989a16c5436ce65d (patch) | |
tree | 58fdf2beb38edfa034cd41d83a9e661d0ae73d2e /sdl | |
parent | 9053faa7cac1cf05a3659d1b5b24d456d96e4d22 (diff) | |
download | GLPyramid-881ada4374bc0bd52ea3d99f989a16c5436ce65d.tar.gz GLPyramid-881ada4374bc0bd52ea3d99f989a16c5436ce65d.tar.bz2 GLPyramid-881ada4374bc0bd52ea3d99f989a16c5436ce65d.zip |
sdl: add a seperate file for event handling
Diffstat (limited to 'sdl')
-rw-r--r-- | sdl/Makefile | 7 | ||||
-rw-r--r-- | sdl/client.h | 21 | ||||
-rw-r--r-- | sdl/event.c | 128 | ||||
-rw-r--r-- | sdl/event.h | 9 | ||||
-rw-r--r-- | sdl/mingw32 | 2 | ||||
-rw-r--r-- | sdl/platform.c | 2 | ||||
-rw-r--r-- | sdl/pyramid.c | 113 |
7 files changed, 170 insertions, 112 deletions
diff --git a/sdl/Makefile b/sdl/Makefile index d6df1f7..66e2d84 100644 --- a/sdl/Makefile +++ b/sdl/Makefile @@ -1,6 +1,6 @@ BIN = pyramid SRC = pyramid.c math3d.c gltools.c glframe.c shader.c platform.c window.c \ - gldraw.c sdltools.c luatools.c + gldraw.c sdltools.c luatools.c event.c CC = gcc CFLAGS = -Wall -std=gnu99 DBGFLAGS = -g -O0 @@ -21,7 +21,7 @@ OBJ_FILES = $(addprefix $(OBJ_DIR)/, $(addsuffix .o, $(subst .c,,$(SRC)))) $(BIN): $(OBJ_DIR) $(OBJ_FILES) $(CC) $(LDFLAGS) $(SDL_LDFLAGS) $(SDL_image_LDFLAGS) $(OBJ_FILES) -o $@ -$(OBJ_DIR)/pyramid.o: $(OBJ_DIR)/%.o: %.c gldraw.h glframe.h gltools.h luatools.h math3d.h platform.h sdltools.h window.h +$(OBJ_DIR)/pyramid.o: $(OBJ_DIR)/%.o: %.c gldraw.h glframe.h gltools.h luatools.h math3d.h platform.h sdltools.h window.h client.h $(CC) -c $(CFLAGS) $(SDL_CFLAGS) $(SDL_image_CFLAGS) $< -o $@ $(OBJ_DIR)/math3d.o: $(OBJ_DIR)/%.o: %.c %.h @@ -51,6 +51,9 @@ $(OBJ_DIR)/sdltools.o: $(OBJ_DIR)/%.o: %.c %.h math3d.h glframe.h $(OBJ_DIR)/luatools.o: $(OBJ_DIR)/%.o: %.c %.h math3d.h $(CC) -c $(CFLAGS) $< -o $@ +$(OBJ_DIR)/event.o: $(OBJ_DIR)/%.o: %.c %.h math3d.h client.h glframe.h platform.h window.h + $(CC) -c $(CFLAGS) $< -o $@ + $(OBJ_DIR): mkdir -p $(OBJ_DIR) diff --git a/sdl/client.h b/sdl/client.h new file mode 100644 index 0000000..b576a83 --- /dev/null +++ b/sdl/client.h @@ -0,0 +1,21 @@ +#ifndef _CLIENT_H_ +#define _CLIENT_H_ + +#include <GL/glew.h> + +/* client extends functionality of the host platform */ +struct client +{ + /* display lists identifiers */ + GLuint ground_list; + GLuint triangle_list; + + /* pyramid texture handle */ + GLuint textures[2]; + + GLfloat xrot; + GLfloat yrot; +}; + +#endif + 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); +} + diff --git a/sdl/event.h b/sdl/event.h new file mode 100644 index 0000000..8b4d81b --- /dev/null +++ b/sdl/event.h @@ -0,0 +1,9 @@ +#ifndef _EVENT_H_ +#define _EVENT_H_ + +/* function prototypes */ +void sdl_process_events(void); +void event_keydown(SDL_keysym *, const unsigned int *, const int); + +#endif + diff --git a/sdl/mingw32 b/sdl/mingw32 index 1607875..3b77287 100644 --- a/sdl/mingw32 +++ b/sdl/mingw32 @@ -1,6 +1,6 @@ BIN = pyramid SRC = pyramid.c math3d.c gltools.c glframe.c shader.c platform.c window.c \ - gldraw.c sdltools.c luatools.c + gldraw.c sdltools.c luatools.c event.c CC = gcc CFLAGS = -Wall -std=c99 -MD DBGFLAGS = -g -O0 diff --git a/sdl/platform.c b/sdl/platform.c index 2d770a8..ea9dce6 100644 --- a/sdl/platform.c +++ b/sdl/platform.c @@ -2,7 +2,7 @@ * * Platform * - * Notes: Assumes multisampling is always enabled + * Notes: assumes multisampling is always enabled * */ diff --git a/sdl/pyramid.c b/sdl/pyramid.c index 94c3946..ff40dff 100644 --- a/sdl/pyramid.c +++ b/sdl/pyramid.c @@ -23,6 +23,8 @@ #include <GL/glew.h> #include <GL/freeglut.h> #include <sys/time.h> +#include "client.h" +#include "event.h" #include "gldraw.h" #include "glframe.h" #include "gltools.h" @@ -45,25 +47,10 @@ const char *window_icon_path = "tux.png"; const unsigned int sdl_video_flags = SDL_OPENGL | SDL_RESIZABLE; unsigned int maxfps_w = 60; -/* client extends functionality of the host platform */ -struct client -{ - /* display lists identifiers */ - GLuint ground_list; - GLuint triangle_list; - - /* pyramid texture handle */ - GLuint textures[2]; - - GLfloat xrot; - GLfloat yrot; -}; - /* function prototypes */ static int client_init(struct client *); static int client_destroy(struct client *); -static void keys(SDL_keysym *, const unsigned int *, const int); -static void process_events(void); +static inline void process_events(void); static void render(void); static int client_init(struct client *p) @@ -100,99 +87,9 @@ static int client_destroy(struct client *p) return 0; } -static void keys(SDL_keysym *keysym, const unsigned int *keys_held, const int flag) +static inline void process_events(void) { - 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); -} - -static void process_events(void) -{ - /* process SDL events */ - SDL_Event event; - unsigned static int keys_held[323]; - SDLKey sym; - /* helper flag for keys() */ - int flag = 0; - - while (SDL_PollEvent(&event)) - { - sym = event.key.keysym.sym; - - switch (event.type) - { - case SDL_KEYUP: - { - /* reset the key to 0 */ - keys_held[sym] = 0; - break; - } - case SDL_KEYDOWN: - { - keys_held[sym] = 1; - keys(&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; - keys(NULL, keys_held, flag); - } - else - flag = !flag; + sdl_process_events(); } static void render(void) |