Sun, 25 Jan 2026 15:37:23 +0100
recreate player sprite from scratch and remove all the interpolation noise
| 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 | |
| 253 | 31 | #include <SDL3/SDL.h> |
| 32 | #include <SDL3_ttf/SDL_ttf.h> | |
| 0 | 33 | |
|
106
895f92cff6b8
bring back error.h to reduce compile dependencies
Mike Becker <universe@uap-core.de>
parents:
105
diff
changeset
|
34 | #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
|
35 | |
|
46
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
36 | #include <time.h> |
|
294
4df350dac84f
add functions for centering a window on only one axis
Mike Becker <universe@uap-core.de>
parents:
290
diff
changeset
|
37 | #include <assert.h> |
|
46
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) { |
|
177
954512fc391f
fix typo in ASC_FLAG_INITIALIZED
Mike Becker <universe@uap-core.de>
parents:
176
diff
changeset
|
52 | if (asc_test_flag(asc_context.flags, ASC_FLAG_INITIALIZED)) |
| 0 | 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 |
| 290 | 57 | asc_context.font_path = cx_strdup("./fonts"); |
| 58 | asc_context.shader_path = cx_strdup("./shader"); | |
| 59 | asc_context.texture_path = cx_strdup("./textures"); | |
|
86
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 | |
|
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
64 | // no window, yet |
|
65
9c44c55d327a
consistently refer to windows by ID - fixes #381
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
65 | 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
|
66 | |
| 0 | 67 | // initialize error buffer |
| 68 | cxBufferInit( | |
| 69 | &asc_context.error_buffer, | |
| 290 | 70 | NULL, NULL, 256, |
| 0 | 71 | CX_BUFFER_AUTO_EXTEND |
| 72 | ); | |
| 73 | ||
| 74 | // initialize SDL | |
| 253 | 75 | if (!SDL_Init(SDL_INIT_VIDEO)) { |
| 92 | 76 | asc_error("Failed to initialize SDL: %s", SDL_GetError()); |
| 253 | 77 | } else if (!TTF_Init()) { |
| 78 | asc_error("Failed to initialize SDL_ttf: %s", SDL_GetError()); | |
| 0 | 79 | } |
| 80 | SDL_ClearError(); | |
|
46
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
81 | asc_context.total_nanos = asc_nanos(); |
|
177
954512fc391f
fix typo in ASC_FLAG_INITIALIZED
Mike Becker <universe@uap-core.de>
parents:
176
diff
changeset
|
82 | asc_set_flag(asc_context.flags, ASC_FLAG_INITIALIZED); |
| 0 | 83 | asc_dprintf("Ascension context initialized."); |
| 84 | } | |
| 85 | ||
| 86 | 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
|
87 | // destroy windows |
| 7 | 88 | 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
|
89 | asc_window_destroy(i); |
| 7 | 90 | } |
|
66
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
91 | |
|
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
92 | // destroy the font cache |
|
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
93 | asc_font_cache_destroy(); |
| 0 | 94 | |
| 95 | // quit SDL | |
|
88
6234b7ea48f3
add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents:
86
diff
changeset
|
96 | TTF_Quit(); |
| 0 | 97 | SDL_Quit(); |
| 98 | ||
| 99 | // destroy the error buffer | |
| 100 | cxBufferDestroy(&asc_context.error_buffer); | |
| 101 | asc_context.flags = 0; | |
| 102 | asc_dprintf("Ascension context destroyed."); | |
|
86
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
103 | |
|
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
104 | // destroy the path information |
|
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
105 | cx_strfree(&asc_context.font_path); |
|
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
106 | cx_strfree(&asc_context.shader_path); |
|
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
107 | cx_strfree(&asc_context.texture_path); |
| 0 | 108 | } |
|
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
109 | |
|
63
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
110 | void asc_context_quit(void) { |
|
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
111 | 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
|
112 | } |
|
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
113 | |
|
66
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
114 | 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
|
115 | 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
|
116 | 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
|
117 | } else { |
|
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
118 | 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
|
119 | abort(); |
|
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
120 | } |
|
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
121 | } |
|
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
122 | |
|
294
4df350dac84f
add functions for centering a window on only one axis
Mike Becker <universe@uap-core.de>
parents:
290
diff
changeset
|
123 | static AscWindow * asc_window_find(Uint32 sdl_id) { |
|
4df350dac84f
add functions for centering a window on only one axis
Mike Becker <universe@uap-core.de>
parents:
290
diff
changeset
|
124 | for (unsigned i = 0 ; i < ASC_MAX_WINDOWS ; i++) { |
|
4df350dac84f
add functions for centering a window on only one axis
Mike Becker <universe@uap-core.de>
parents:
290
diff
changeset
|
125 | if (asc_context.windows[i].id == sdl_id) { |
|
4df350dac84f
add functions for centering a window on only one axis
Mike Becker <universe@uap-core.de>
parents:
290
diff
changeset
|
126 | return asc_context.windows + i; |
|
4df350dac84f
add functions for centering a window on only one axis
Mike Becker <universe@uap-core.de>
parents:
290
diff
changeset
|
127 | } |
|
4df350dac84f
add functions for centering a window on only one axis
Mike Becker <universe@uap-core.de>
parents:
290
diff
changeset
|
128 | } |
|
4df350dac84f
add functions for centering a window on only one axis
Mike Becker <universe@uap-core.de>
parents:
290
diff
changeset
|
129 | return NULL; |
|
4df350dac84f
add functions for centering a window on only one axis
Mike Becker <universe@uap-core.de>
parents:
290
diff
changeset
|
130 | } |
|
4df350dac84f
add functions for centering a window on only one axis
Mike Becker <universe@uap-core.de>
parents:
290
diff
changeset
|
131 | |
|
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
132 | static void asc_event_window_resized(Uint32 id, Sint32 width, Sint32 height) { |
|
294
4df350dac84f
add functions for centering a window on only one axis
Mike Becker <universe@uap-core.de>
parents:
290
diff
changeset
|
133 | AscWindow *window = asc_window_find(id); |
|
4df350dac84f
add functions for centering a window on only one axis
Mike Becker <universe@uap-core.de>
parents:
290
diff
changeset
|
134 | assert(window != NULL); |
|
4df350dac84f
add functions for centering a window on only one axis
Mike Becker <universe@uap-core.de>
parents:
290
diff
changeset
|
135 | window->resized = true; |
|
4df350dac84f
add functions for centering a window on only one axis
Mike Becker <universe@uap-core.de>
parents:
290
diff
changeset
|
136 | window->rect.size.width = (unsigned) width; |
|
4df350dac84f
add functions for centering a window on only one axis
Mike Becker <universe@uap-core.de>
parents:
290
diff
changeset
|
137 | window->rect.size.height = (unsigned) height; |
|
4df350dac84f
add functions for centering a window on only one axis
Mike Becker <universe@uap-core.de>
parents:
290
diff
changeset
|
138 | } |
|
4df350dac84f
add functions for centering a window on only one axis
Mike Becker <universe@uap-core.de>
parents:
290
diff
changeset
|
139 | |
|
4df350dac84f
add functions for centering a window on only one axis
Mike Becker <universe@uap-core.de>
parents:
290
diff
changeset
|
140 | static void asc_event_window_moved(Uint32 id, Sint32 x, Sint32 y) { |
|
4df350dac84f
add functions for centering a window on only one axis
Mike Becker <universe@uap-core.de>
parents:
290
diff
changeset
|
141 | AscWindow *window = asc_window_find(id); |
|
4df350dac84f
add functions for centering a window on only one axis
Mike Becker <universe@uap-core.de>
parents:
290
diff
changeset
|
142 | assert(window != NULL); |
|
4df350dac84f
add functions for centering a window on only one axis
Mike Becker <universe@uap-core.de>
parents:
290
diff
changeset
|
143 | window->moved = true; |
|
4df350dac84f
add functions for centering a window on only one axis
Mike Becker <universe@uap-core.de>
parents:
290
diff
changeset
|
144 | window->rect.pos.x = x; |
|
4df350dac84f
add functions for centering a window on only one axis
Mike Becker <universe@uap-core.de>
parents:
290
diff
changeset
|
145 | window->rect.pos.y = y; |
|
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
146 | } |
|
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
147 | |
|
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
148 | bool asc_loop_next(void) { |
|
63
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
149 | // reset mouse motion |
|
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
150 | asc_context.input.mouse_xrel = 0; |
|
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
151 | asc_context.input.mouse_yrel = 0; |
|
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
152 | |
|
141
cd82643bb6d9
implement edge-triggered key press/release
Mike Becker <universe@uap-core.de>
parents:
128
diff
changeset
|
153 | // reset key flags |
| 253 | 154 | for (unsigned int i = 0 ; i < SDL_SCANCODE_COUNT ; i++) { |
|
141
cd82643bb6d9
implement edge-triggered key press/release
Mike Becker <universe@uap-core.de>
parents:
128
diff
changeset
|
155 | 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
|
156 | } |
|
cd82643bb6d9
implement edge-triggered key press/release
Mike Becker <universe@uap-core.de>
parents:
128
diff
changeset
|
157 | |
|
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
158 | // dispatch SDL events |
|
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
159 | SDL_Event event; |
|
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
160 | while (SDL_PollEvent(&event)) { |
|
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
161 | switch (event.type) { |
| 253 | 162 | case SDL_EVENT_QUIT: |
|
58
26ebb2f1e6e6
improve ui/text.h interface a lot
Mike Becker <universe@uap-core.de>
parents:
49
diff
changeset
|
163 | 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
|
164 | break; |
|
294
4df350dac84f
add functions for centering a window on only one axis
Mike Becker <universe@uap-core.de>
parents:
290
diff
changeset
|
165 | case SDL_EVENT_WINDOW_MOVED: { |
|
4df350dac84f
add functions for centering a window on only one axis
Mike Becker <universe@uap-core.de>
parents:
290
diff
changeset
|
166 | asc_event_window_moved( |
|
4df350dac84f
add functions for centering a window on only one axis
Mike Becker <universe@uap-core.de>
parents:
290
diff
changeset
|
167 | event.window.windowID, |
|
4df350dac84f
add functions for centering a window on only one axis
Mike Becker <universe@uap-core.de>
parents:
290
diff
changeset
|
168 | event.window.data1, |
|
4df350dac84f
add functions for centering a window on only one axis
Mike Becker <universe@uap-core.de>
parents:
290
diff
changeset
|
169 | event.window.data2 |
|
4df350dac84f
add functions for centering a window on only one axis
Mike Becker <universe@uap-core.de>
parents:
290
diff
changeset
|
170 | ); |
|
4df350dac84f
add functions for centering a window on only one axis
Mike Becker <universe@uap-core.de>
parents:
290
diff
changeset
|
171 | break; |
|
4df350dac84f
add functions for centering a window on only one axis
Mike Becker <universe@uap-core.de>
parents:
290
diff
changeset
|
172 | } |
| 253 | 173 | case SDL_EVENT_WINDOW_RESIZED: { |
| 174 | asc_event_window_resized( | |
| 175 | event.window.windowID, | |
| 176 | event.window.data1, | |
| 177 | event.window.data2 | |
| 178 | ); | |
|
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
179 | break; |
|
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
180 | } |
| 253 | 181 | case SDL_EVENT_WINDOW_FOCUS_GAINED: { |
|
294
4df350dac84f
add functions for centering a window on only one axis
Mike Becker <universe@uap-core.de>
parents:
290
diff
changeset
|
182 | asc_window_find(event.window.windowID)->focused = true; |
| 253 | 183 | break; |
| 184 | } | |
| 185 | case SDL_EVENT_WINDOW_FOCUS_LOST: { | |
|
294
4df350dac84f
add functions for centering a window on only one axis
Mike Becker <universe@uap-core.de>
parents:
290
diff
changeset
|
186 | asc_window_find(event.window.windowID)->focused = false; |
| 253 | 187 | break; |
| 188 | } | |
| 189 | case SDL_EVENT_MOUSE_MOTION: { | |
|
63
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
190 | // accumulate relative motion |
|
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
191 | 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
|
192 | 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
|
193 | // update absolute position |
|
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
194 | 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
|
195 | 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
|
196 | // 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
|
197 | asc_context.input.mouse_window = |
|
823c03733e42
add mouse and window focus - resolves #382
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
198 | 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
|
199 | break; |
|
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
200 | } |
| 253 | 201 | case SDL_EVENT_KEY_DOWN: |
|
141
cd82643bb6d9
implement edge-triggered key press/release
Mike Becker <universe@uap-core.de>
parents:
128
diff
changeset
|
202 | // we only set the down and press flags if the key is not already known to be down |
| 253 | 203 | if (asc_key_up(event.key.scancode)) { |
| 204 | asc_context.input.keys[event.key.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
|
205 | } |
|
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
206 | break; |
| 253 | 207 | case SDL_EVENT_KEY_UP: |
|
141
cd82643bb6d9
implement edge-triggered key press/release
Mike Becker <universe@uap-core.de>
parents:
128
diff
changeset
|
208 | // we can directly set the release flag - it will be cleared next round |
| 253 | 209 | asc_context.input.keys[event.key.scancode] = ASC_KEY_RELEASE_FLAG; |
|
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
210 | break; |
|
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
211 | } |
|
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
212 | } |
|
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
213 | |
|
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
214 | // compute frame time |
|
46
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
215 | uint64_t frame_nanos, ns; |
|
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
216 | do { |
|
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
217 | ns = asc_nanos(); |
|
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
218 | frame_nanos = ns - asc_context.total_nanos; |
|
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
219 | } while (frame_nanos == 0); |
|
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
220 | 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
|
221 | 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
|
222 | 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
|
223 | 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
|
224 | // 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
|
225 | asc_context.frame_factor = 0; |
|
590a9e822b6b
add frame_rate and frame_factor to context
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
226 | } else { |
|
590a9e822b6b
add frame_rate and frame_factor to context
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
227 | 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
|
228 | } |
|
46
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
229 | asc_context.total_nanos = ns; |
|
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
230 | |
|
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
|
231 | // 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
|
232 | 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
|
233 | 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
|
234 | } |
|
4908cc6c2e01
compute frame time before syncing to avoid div-by-zero in first frame
Mike Becker <universe@uap-core.de>
parents:
141
diff
changeset
|
235 | |
|
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
236 | 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
|
237 | } |
|
86
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
238 | |
|
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
239 | void asc_set_font_path(const char *path) { |
|
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
240 | cx_strcpy(&asc_context.font_path, cx_str(path)); |
|
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
241 | } |
|
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
242 | |
|
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
243 | void asc_set_shader_path(const char *path) { |
|
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
244 | cx_strcpy(&asc_context.shader_path, cx_str(path)); |
|
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
245 | } |
|
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
246 | |
|
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
247 | void asc_set_texture_path(const char *path) { |
|
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
248 | cx_strcpy(&asc_context.texture_path, cx_str(path)); |
|
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
249 | } |