summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKyle K <kylek389@gmail.com>2011-07-18 16:10:34 -0500
committerKamil Kaminski <kamilkss@gmail.com>2011-07-18 16:10:34 -0500
commit881ada4374bc0bd52ea3d99f989a16c5436ce65d (patch)
tree58fdf2beb38edfa034cd41d83a9e661d0ae73d2e
parent9053faa7cac1cf05a3659d1b5b24d456d96e4d22 (diff)
downloadGLPyramid-881ada4374bc0bd52ea3d99f989a16c5436ce65d.tar.gz
GLPyramid-881ada4374bc0bd52ea3d99f989a16c5436ce65d.tar.bz2
GLPyramid-881ada4374bc0bd52ea3d99f989a16c5436ce65d.zip
sdl: add a seperate file for event handling
-rw-r--r--sdl/Makefile7
-rw-r--r--sdl/client.h21
-rw-r--r--sdl/event.c128
-rw-r--r--sdl/event.h9
-rw-r--r--sdl/mingw322
-rw-r--r--sdl/platform.c2
-rw-r--r--sdl/pyramid.c113
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)