Wed, 02 Jul 2025 23:21:17 +0200
resolve TODOs regarding input.h
a) mouse position must be integer, because it can be negative (though rarely)
b) we should not trade "access complexity" for space in the scancodes array
0 | 1 | /* |
2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. | |
3 | * Copyright 2023 Mike Becker. All rights reserved. | |
4 | * | |
5 | * Redistribution and use in source and binary forms, with or without | |
6 | * modification, are permitted provided that the following conditions are met: | |
7 | * | |
8 | * 1. Redistributions of source code must retain the above copyright | |
9 | * notice, this list of conditions and the following disclaimer. | |
10 | * | |
11 | * 2. Redistributions in binary form must reproduce the above copyright | |
12 | * notice, this list of conditions and the following disclaimer in the | |
13 | * documentation and/or other materials provided with the distribution. | |
14 | * | |
15 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
16 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
17 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
18 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | |
19 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |
20 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |
21 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |
22 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |
23 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |
24 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |
25 | * POSSIBILITY OF SUCH DAMAGE. | |
26 | */ | |
27 | ||
7 | 28 | #include "ascension/context.h" |
106
895f92cff6b8
bring back error.h to reduce compile dependencies
Mike Becker <universe@uap-core.de>
parents:
105
diff
changeset
|
29 | #include "ascension/error.h" |
0 | 30 | |
6
302971e8599b
move window related stuff to its own unit
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
31 | #include <SDL2/SDL.h> |
302971e8599b
move window related stuff to its own unit
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
32 | #include <SDL2/SDL_ttf.h> |
88
6234b7ea48f3
add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents:
86
diff
changeset
|
33 | #include <SDL2/SDL_image.h> |
0 | 34 | |
106
895f92cff6b8
bring back error.h to reduce compile dependencies
Mike Becker <universe@uap-core.de>
parents:
105
diff
changeset
|
35 | #include <GL/glew.h> |
95
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
36 | |
46
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
37 | #include <time.h> |
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
38 | |
0 | 39 | AscContext asc_context; |
40 | ||
46
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
41 | static uint64_t asc_nanos(void) { |
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
42 | struct timespec ts; |
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
43 | clock_gettime(CLOCK_MONOTONIC, &ts); |
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
44 | return 1000000000ull*(uint64_t)ts.tv_sec + (uint64_t)ts.tv_nsec; |
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
45 | } |
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
46 | |
66
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
47 | // forward declare non-public font cache functions |
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
48 | void asc_font_cache_init(void); |
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
49 | void asc_font_cache_destroy(void); |
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
50 | |
0 | 51 | void asc_context_initialize(void) { |
52 | if (asc_test_flag(asc_context.flags, ASC_FLAG_INITILIZED)) | |
53 | return; | |
11 | 54 | memset(&asc_context, 0, sizeof(AscContext)); |
0 | 55 | |
86
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
56 | // initialize default paths |
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
57 | asc_context.font_path = cx_strdup(CX_STR("./fonts")); |
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
58 | asc_context.shader_path = cx_strdup(CX_STR("./shader")); |
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
59 | asc_context.texture_path = cx_strdup(CX_STR("./textures")); |
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
60 | |
66
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
61 | // initialize the font cache |
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
62 | asc_font_cache_init(); |
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
63 | |
81
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
68
diff
changeset
|
64 | // set a default font but do not load it |
66
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
65 | asc_context.active_font.style = ASC_FONT_REGULAR; |
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
66 | asc_context.active_font.size = 14; |
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
67 | |
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
68 | // no window, yet |
65
9c44c55d327a
consistently refer to windows by ID - fixes #381
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
69 | asc_context.active_window = ASC_MAX_WINDOWS; |
9c44c55d327a
consistently refer to windows by ID - fixes #381
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
70 | |
0 | 71 | // initialize error buffer |
72 | cxBufferInit( | |
73 | &asc_context.error_buffer, | |
74 | NULL, | |
75 | 256, | |
76 | NULL, | |
77 | CX_BUFFER_AUTO_EXTEND | |
78 | ); | |
79 | ||
80 | // initialize SDL | |
88
6234b7ea48f3
add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents:
86
diff
changeset
|
81 | const int supported_img_flags = IMG_INIT_PNG | IMG_INIT_JPG; |
0 | 82 | if (SDL_Init(SDL_INIT_VIDEO) < 0) { |
92 | 83 | asc_error("Failed to initialize SDL: %s", SDL_GetError()); |
88
6234b7ea48f3
add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents:
86
diff
changeset
|
84 | } else if (TTF_Init() < 0) { |
92 | 85 | asc_error("Failed to initialize SDL_ttf: %s", TTF_GetError()); |
88
6234b7ea48f3
add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents:
86
diff
changeset
|
86 | } else if (IMG_Init(supported_img_flags) != supported_img_flags) { |
92 | 87 | asc_error("Failed to initialize SDL_img: %s", IMG_GetError()); |
0 | 88 | } |
89 | SDL_ClearError(); | |
46
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
90 | asc_context.total_nanos = asc_nanos(); |
58
26ebb2f1e6e6
improve ui/text.h interface a lot
Mike Becker <universe@uap-core.de>
parents:
49
diff
changeset
|
91 | asc_set_flag(asc_context.flags, ASC_FLAG_INITILIZED); |
0 | 92 | asc_dprintf("Ascension context initialized."); |
93 | } | |
94 | ||
95 | void asc_context_destroy(void) { | |
66
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
96 | // destroy windows |
7 | 97 | for (unsigned int i = 0 ; i < ASC_MAX_WINDOWS ; i++) { |
65
9c44c55d327a
consistently refer to windows by ID - fixes #381
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
98 | asc_window_destroy(i); |
7 | 99 | } |
66
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
100 | |
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
101 | // destroy the font cache |
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
102 | asc_font_cache_destroy(); |
0 | 103 | |
104 | // quit SDL | |
88
6234b7ea48f3
add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents:
86
diff
changeset
|
105 | IMG_Quit(); |
6234b7ea48f3
add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents:
86
diff
changeset
|
106 | TTF_Quit(); |
0 | 107 | SDL_Quit(); |
108 | ||
109 | // destroy the error buffer | |
110 | cxBufferDestroy(&asc_context.error_buffer); | |
111 | asc_context.flags = 0; | |
112 | asc_dprintf("Ascension context destroyed."); | |
86
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
113 | |
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
114 | // destroy the path information |
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
115 | cx_strfree(&asc_context.font_path); |
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
116 | cx_strfree(&asc_context.shader_path); |
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
117 | cx_strfree(&asc_context.texture_path); |
0 | 118 | } |
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
119 | |
63
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
120 | void asc_context_quit(void) { |
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
121 | asc_set_flag(asc_context.flags, ASC_FLAG_QUIT); |
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
122 | } |
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
123 | |
66
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
124 | AscWindow *asc_active_window_assert() { |
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
125 | if (asc_context.active_window < ASC_MAX_WINDOWS) { |
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
126 | return &asc_context.windows[asc_context.active_window]; |
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
127 | } else { |
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
128 | asc_dprintf("Window access attempted without active window"); |
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
129 | abort(); |
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
130 | } |
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
131 | } |
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
132 | |
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
133 | static void asc_event_window_resized(Uint32 id, Sint32 width, Sint32 height) { |
68
823c03733e42
add mouse and window focus - resolves #382
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
134 | unsigned int i = asc_window_index(id); |
823c03733e42
add mouse and window focus - resolves #382
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
135 | if (i < ASC_MAX_WINDOWS) { |
823c03733e42
add mouse and window focus - resolves #382
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
136 | asc_context.windows[i].resized = true; |
105 | 137 | asc_context.windows[i].dimensions.width = (unsigned) width; |
138 | asc_context.windows[i].dimensions.height = (unsigned) height; | |
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
139 | } |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
140 | } |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
141 | |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
142 | bool asc_loop_next(void) { |
63
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
143 | // reset mouse motion |
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
144 | asc_context.input.mouse_xrel = 0; |
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
145 | asc_context.input.mouse_yrel = 0; |
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
146 | |
141
cd82643bb6d9
implement edge-triggered key press/release
Mike Becker <universe@uap-core.de>
parents:
128
diff
changeset
|
147 | // reset key flags |
cd82643bb6d9
implement edge-triggered key press/release
Mike Becker <universe@uap-core.de>
parents:
128
diff
changeset
|
148 | for (unsigned int i = 0 ; i < SDL_NUM_SCANCODES ; i++) { |
cd82643bb6d9
implement edge-triggered key press/release
Mike Becker <universe@uap-core.de>
parents:
128
diff
changeset
|
149 | asc_clear_flag(asc_context.input.keys[i], ASC_KEY_RELEASE_FLAG|ASC_KEY_PRESS_FLAG); |
cd82643bb6d9
implement edge-triggered key press/release
Mike Becker <universe@uap-core.de>
parents:
128
diff
changeset
|
150 | } |
cd82643bb6d9
implement edge-triggered key press/release
Mike Becker <universe@uap-core.de>
parents:
128
diff
changeset
|
151 | |
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
152 | // dispatch SDL events |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
153 | SDL_Event event; |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
154 | while (SDL_PollEvent(&event)) { |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
155 | switch (event.type) { |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
156 | case SDL_QUIT: |
58
26ebb2f1e6e6
improve ui/text.h interface a lot
Mike Becker <universe@uap-core.de>
parents:
49
diff
changeset
|
157 | asc_set_flag(asc_context.flags, ASC_FLAG_QUIT); |
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
158 | break; |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
159 | case SDL_WINDOWEVENT: { |
68
823c03733e42
add mouse and window focus - resolves #382
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
160 | if (event.window.event == SDL_WINDOWEVENT_RESIZED) { |
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
161 | asc_event_window_resized( |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
162 | event.window.windowID, |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
163 | event.window.data1, |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
164 | event.window.data2 |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
165 | ); |
68
823c03733e42
add mouse and window focus - resolves #382
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
166 | } else if (event.window.event == SDL_WINDOWEVENT_FOCUS_GAINED) { |
823c03733e42
add mouse and window focus - resolves #382
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
167 | unsigned int idx = asc_window_index(event.window.windowID); |
823c03733e42
add mouse and window focus - resolves #382
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
168 | asc_context.windows[idx].focused = true; |
823c03733e42
add mouse and window focus - resolves #382
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
169 | } else if (event.window.event == SDL_WINDOWEVENT_FOCUS_LOST) { |
823c03733e42
add mouse and window focus - resolves #382
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
170 | unsigned int idx = asc_window_index(event.window.windowID); |
823c03733e42
add mouse and window focus - resolves #382
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
171 | asc_context.windows[idx].focused = false; |
823c03733e42
add mouse and window focus - resolves #382
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
172 | } |
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
173 | break; |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
174 | } |
63
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
175 | case SDL_MOUSEMOTION: { |
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
176 | // accumulate relative motion |
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
177 | asc_context.input.mouse_xrel += event.motion.xrel; |
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
178 | asc_context.input.mouse_yrel += event.motion.yrel; |
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
179 | // update absolute position |
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
180 | asc_context.input.mouse_x = event.motion.x; |
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
181 | asc_context.input.mouse_y = event.motion.y; |
68
823c03733e42
add mouse and window focus - resolves #382
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
182 | // update which window the mouse was seen in |
823c03733e42
add mouse and window focus - resolves #382
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
183 | asc_context.input.mouse_window = |
823c03733e42
add mouse and window focus - resolves #382
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
184 | asc_window_index(event.motion.windowID); |
63
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
185 | break; |
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
186 | } |
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
187 | case SDL_KEYDOWN: |
141
cd82643bb6d9
implement edge-triggered key press/release
Mike Becker <universe@uap-core.de>
parents:
128
diff
changeset
|
188 | // we only set the down and press flags if the key is not already known to be down |
cd82643bb6d9
implement edge-triggered key press/release
Mike Becker <universe@uap-core.de>
parents:
128
diff
changeset
|
189 | if (asc_key_up(event.key.keysym.scancode)) { |
174
0009b982bc7d
resolve TODOs regarding input.h
Mike Becker <universe@uap-core.de>
parents:
165
diff
changeset
|
190 | asc_context.input.keys[event.key.keysym.scancode] = ASC_KEY_DOWN_FLAG|ASC_KEY_PRESS_FLAG; |
141
cd82643bb6d9
implement edge-triggered key press/release
Mike Becker <universe@uap-core.de>
parents:
128
diff
changeset
|
191 | } |
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
192 | break; |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
193 | case SDL_KEYUP: |
141
cd82643bb6d9
implement edge-triggered key press/release
Mike Becker <universe@uap-core.de>
parents:
128
diff
changeset
|
194 | // we can directly set the release flag - it will be cleared next round |
cd82643bb6d9
implement edge-triggered key press/release
Mike Becker <universe@uap-core.de>
parents:
128
diff
changeset
|
195 | asc_context.input.keys[event.key.keysym.scancode] = ASC_KEY_RELEASE_FLAG; |
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
196 | break; |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
197 | } |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
198 | } |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
199 | |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
200 | // compute frame time |
165
590a9e822b6b
add frame_rate and frame_factor to context
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
201 | // TODO: think about whether frame rate is actually a per-window thing |
590a9e822b6b
add frame_rate and frame_factor to context
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
202 | // the answer is hopefully NO, because that would mean behaviors are also a per-window thing |
46
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
203 | uint64_t frame_nanos, ns; |
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
204 | do { |
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
205 | ns = asc_nanos(); |
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
206 | frame_nanos = ns - asc_context.total_nanos; |
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
207 | } while (frame_nanos == 0); |
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
208 | asc_context.frame_nanos = frame_nanos; |
165
590a9e822b6b
add frame_rate and frame_factor to context
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
209 | unsigned long long fps_1k = asc_seconds(1000) / frame_nanos; |
590a9e822b6b
add frame_rate and frame_factor to context
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
210 | asc_context.frame_rate = (float)fps_1k / 1000.f; |
590a9e822b6b
add frame_rate and frame_factor to context
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
211 | if (asc_context.frame_rate < 5) { |
590a9e822b6b
add frame_rate and frame_factor to context
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
212 | // effectively stop the world when the frame rate drops too low |
590a9e822b6b
add frame_rate and frame_factor to context
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
213 | asc_context.frame_factor = 0; |
590a9e822b6b
add frame_rate and frame_factor to context
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
214 | } else { |
590a9e822b6b
add frame_rate and frame_factor to context
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
215 | asc_context.frame_factor = 1.f / asc_context.frame_rate; |
590a9e822b6b
add frame_rate and frame_factor to context
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
216 | } |
46
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
217 | asc_context.total_nanos = ns; |
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
218 | |
147
4908cc6c2e01
compute frame time before syncing to avoid div-by-zero in first frame
Mike Becker <universe@uap-core.de>
parents:
141
diff
changeset
|
219 | // sync the windows |
4908cc6c2e01
compute frame time before syncing to avoid div-by-zero in first frame
Mike Becker <universe@uap-core.de>
parents:
141
diff
changeset
|
220 | for (unsigned int i = 0 ; i < ASC_MAX_WINDOWS ; i++) { |
4908cc6c2e01
compute frame time before syncing to avoid div-by-zero in first frame
Mike Becker <universe@uap-core.de>
parents:
141
diff
changeset
|
221 | asc_window_sync(i); |
4908cc6c2e01
compute frame time before syncing to avoid div-by-zero in first frame
Mike Becker <universe@uap-core.de>
parents:
141
diff
changeset
|
222 | } |
4908cc6c2e01
compute frame time before syncing to avoid div-by-zero in first frame
Mike Becker <universe@uap-core.de>
parents:
141
diff
changeset
|
223 | |
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
224 | return !asc_test_flag(asc_context.flags, ASC_FLAG_QUIT); |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
225 | } |
86
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
226 | |
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
227 | void asc_set_font_path(const char *path) { |
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
228 | cx_strcpy(&asc_context.font_path, cx_str(path)); |
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
229 | } |
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
230 | |
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
231 | void asc_set_shader_path(const char *path) { |
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
232 | cx_strcpy(&asc_context.shader_path, cx_str(path)); |
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
233 | } |
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
234 | |
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
235 | void asc_set_texture_path(const char *path) { |
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
236 | cx_strcpy(&asc_context.texture_path, cx_str(path)); |
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
237 | } |