summaryrefslogtreecommitdiffstats
path: root/sdl/event.c
blob: e6c4c008c020b808ae1c2d2af1859761de2f37f2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
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);
}