Tue, 28 Oct 2025 22:03:06 +0100
fix that dependencies for tools are always checked
| 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: 
105diff
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: 
105diff
changeset | 34 | #include <GL/glew.h> | 
| 95 
622887f7e954
in preparation of more scenes, bring back AscScene struct
 Mike Becker <universe@uap-core.de> parents: 
92diff
changeset | 35 | |
| 46 
d3285aed65b3
make the timer have nanoseconds precision
 Mike Becker <universe@uap-core.de> parents: 
44diff
changeset | 36 | #include <time.h> | 
| 
d3285aed65b3
make the timer have nanoseconds precision
 Mike Becker <universe@uap-core.de> parents: 
44diff
changeset | 37 | |
| 0 | 38 | AscContext asc_context; | 
| 39 | ||
| 46 
d3285aed65b3
make the timer have nanoseconds precision
 Mike Becker <universe@uap-core.de> parents: 
44diff
changeset | 40 | static uint64_t asc_nanos(void) { | 
| 
d3285aed65b3
make the timer have nanoseconds precision
 Mike Becker <universe@uap-core.de> parents: 
44diff
changeset | 41 | struct timespec ts; | 
| 
d3285aed65b3
make the timer have nanoseconds precision
 Mike Becker <universe@uap-core.de> parents: 
44diff
changeset | 42 | clock_gettime(CLOCK_MONOTONIC, &ts); | 
| 
d3285aed65b3
make the timer have nanoseconds precision
 Mike Becker <universe@uap-core.de> parents: 
44diff
changeset | 43 | 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: 
44diff
changeset | 44 | } | 
| 
d3285aed65b3
make the timer have nanoseconds precision
 Mike Becker <universe@uap-core.de> parents: 
44diff
changeset | 45 | |
| 66 
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
 Mike Becker <universe@uap-core.de> parents: 
65diff
changeset | 46 | // forward declare non-public font cache functions | 
| 
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
 Mike Becker <universe@uap-core.de> parents: 
65diff
changeset | 47 | void asc_font_cache_init(void); | 
| 
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
 Mike Becker <universe@uap-core.de> parents: 
65diff
changeset | 48 | void asc_font_cache_destroy(void); | 
| 
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
 Mike Becker <universe@uap-core.de> parents: 
65diff
changeset | 49 | |
| 0 | 50 | void asc_context_initialize(void) { | 
| 177 
954512fc391f
fix typo in ASC_FLAG_INITIALIZED
 Mike Becker <universe@uap-core.de> parents: 
176diff
changeset | 51 | if (asc_test_flag(asc_context.flags, ASC_FLAG_INITIALIZED)) | 
| 0 | 52 | return; | 
| 11 | 53 | memset(&asc_context, 0, sizeof(AscContext)); | 
| 0 | 54 | |
| 86 
943bf9d7c6d6
make asset paths configurable
 Mike Becker <universe@uap-core.de> parents: 
81diff
changeset | 55 | // initialize default paths | 
| 
943bf9d7c6d6
make asset paths configurable
 Mike Becker <universe@uap-core.de> parents: 
81diff
changeset | 56 | asc_context.font_path = cx_strdup(CX_STR("./fonts")); | 
| 
943bf9d7c6d6
make asset paths configurable
 Mike Becker <universe@uap-core.de> parents: 
81diff
changeset | 57 | asc_context.shader_path = cx_strdup(CX_STR("./shader")); | 
| 
943bf9d7c6d6
make asset paths configurable
 Mike Becker <universe@uap-core.de> parents: 
81diff
changeset | 58 | asc_context.texture_path = cx_strdup(CX_STR("./textures")); | 
| 
943bf9d7c6d6
make asset paths configurable
 Mike Becker <universe@uap-core.de> parents: 
81diff
changeset | 59 | |
| 66 
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
 Mike Becker <universe@uap-core.de> parents: 
65diff
changeset | 60 | // initialize the font cache | 
| 
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
 Mike Becker <universe@uap-core.de> parents: 
65diff
changeset | 61 | asc_font_cache_init(); | 
| 
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
 Mike Becker <universe@uap-core.de> parents: 
65diff
changeset | 62 | |
| 
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
 Mike Becker <universe@uap-core.de> parents: 
65diff
changeset | 63 | // no window, yet | 
| 65 
9c44c55d327a
consistently refer to windows by ID - fixes #381
 Mike Becker <universe@uap-core.de> parents: 
63diff
changeset | 64 | asc_context.active_window = ASC_MAX_WINDOWS; | 
| 
9c44c55d327a
consistently refer to windows by ID - fixes #381
 Mike Becker <universe@uap-core.de> parents: 
63diff
changeset | 65 | |
| 0 | 66 | // initialize error buffer | 
| 67 | cxBufferInit( | |
| 68 | &asc_context.error_buffer, | |
| 69 | NULL, | |
| 70 | 256, | |
| 71 | NULL, | |
| 72 | CX_BUFFER_AUTO_EXTEND | |
| 73 | ); | |
| 74 | ||
| 75 | // initialize SDL | |
| 253 | 76 | if (!SDL_Init(SDL_INIT_VIDEO)) { | 
| 92 | 77 | asc_error("Failed to initialize SDL: %s", SDL_GetError()); | 
| 253 | 78 | } else if (!TTF_Init()) { | 
| 79 | asc_error("Failed to initialize SDL_ttf: %s", SDL_GetError()); | |
| 0 | 80 | } | 
| 81 | SDL_ClearError(); | |
| 46 
d3285aed65b3
make the timer have nanoseconds precision
 Mike Becker <universe@uap-core.de> parents: 
44diff
changeset | 82 | asc_context.total_nanos = asc_nanos(); | 
| 177 
954512fc391f
fix typo in ASC_FLAG_INITIALIZED
 Mike Becker <universe@uap-core.de> parents: 
176diff
changeset | 83 | asc_set_flag(asc_context.flags, ASC_FLAG_INITIALIZED); | 
| 0 | 84 | asc_dprintf("Ascension context initialized."); | 
| 85 | } | |
| 86 | ||
| 87 | void asc_context_destroy(void) { | |
| 66 
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
 Mike Becker <universe@uap-core.de> parents: 
65diff
changeset | 88 | // destroy windows | 
| 7 | 89 | 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: 
63diff
changeset | 90 | asc_window_destroy(i); | 
| 7 | 91 | } | 
| 66 
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
 Mike Becker <universe@uap-core.de> parents: 
65diff
changeset | 92 | |
| 
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
 Mike Becker <universe@uap-core.de> parents: 
65diff
changeset | 93 | // destroy the font cache | 
| 
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
 Mike Becker <universe@uap-core.de> parents: 
65diff
changeset | 94 | asc_font_cache_destroy(); | 
| 0 | 95 | |
| 96 | // quit SDL | |
| 88 
6234b7ea48f3
add support for 2d textures in sprite shader - fixes #386
 Mike Becker <universe@uap-core.de> parents: 
86diff
changeset | 97 | TTF_Quit(); | 
| 0 | 98 | SDL_Quit(); | 
| 99 | ||
| 100 | // destroy the error buffer | |
| 101 | cxBufferDestroy(&asc_context.error_buffer); | |
| 102 | asc_context.flags = 0; | |
| 103 | asc_dprintf("Ascension context destroyed."); | |
| 86 
943bf9d7c6d6
make asset paths configurable
 Mike Becker <universe@uap-core.de> parents: 
81diff
changeset | 104 | |
| 
943bf9d7c6d6
make asset paths configurable
 Mike Becker <universe@uap-core.de> parents: 
81diff
changeset | 105 | // destroy the path information | 
| 
943bf9d7c6d6
make asset paths configurable
 Mike Becker <universe@uap-core.de> parents: 
81diff
changeset | 106 | cx_strfree(&asc_context.font_path); | 
| 
943bf9d7c6d6
make asset paths configurable
 Mike Becker <universe@uap-core.de> parents: 
81diff
changeset | 107 | cx_strfree(&asc_context.shader_path); | 
| 
943bf9d7c6d6
make asset paths configurable
 Mike Becker <universe@uap-core.de> parents: 
81diff
changeset | 108 | cx_strfree(&asc_context.texture_path); | 
| 0 | 109 | } | 
| 16 
c5dde81b6fb2
add text rendering and demo FPS counter
 Mike Becker <universe@uap-core.de> parents: 
15diff
changeset | 110 | |
| 63 
e3cacdd636e4
implement mouse motion and key press events
 Mike Becker <universe@uap-core.de> parents: 
58diff
changeset | 111 | void asc_context_quit(void) { | 
| 
e3cacdd636e4
implement mouse motion and key press events
 Mike Becker <universe@uap-core.de> parents: 
58diff
changeset | 112 | asc_set_flag(asc_context.flags, ASC_FLAG_QUIT); | 
| 
e3cacdd636e4
implement mouse motion and key press events
 Mike Becker <universe@uap-core.de> parents: 
58diff
changeset | 113 | } | 
| 
e3cacdd636e4
implement mouse motion and key press events
 Mike Becker <universe@uap-core.de> parents: 
58diff
changeset | 114 | |
| 66 
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
 Mike Becker <universe@uap-core.de> parents: 
65diff
changeset | 115 | AscWindow *asc_active_window_assert() { | 
| 
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
 Mike Becker <universe@uap-core.de> parents: 
65diff
changeset | 116 | 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: 
65diff
changeset | 117 | 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: 
65diff
changeset | 118 | } else { | 
| 
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
 Mike Becker <universe@uap-core.de> parents: 
65diff
changeset | 119 | 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: 
65diff
changeset | 120 | abort(); | 
| 
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
 Mike Becker <universe@uap-core.de> parents: 
65diff
changeset | 121 | } | 
| 
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
 Mike Becker <universe@uap-core.de> parents: 
65diff
changeset | 122 | } | 
| 
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
 Mike Becker <universe@uap-core.de> parents: 
65diff
changeset | 123 | |
| 16 
c5dde81b6fb2
add text rendering and demo FPS counter
 Mike Becker <universe@uap-core.de> parents: 
15diff
changeset | 124 | 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: 
66diff
changeset | 125 | unsigned int i = asc_window_index(id); | 
| 
823c03733e42
add mouse and window focus - resolves #382
 Mike Becker <universe@uap-core.de> parents: 
66diff
changeset | 126 | if (i < ASC_MAX_WINDOWS) { | 
| 
823c03733e42
add mouse and window focus - resolves #382
 Mike Becker <universe@uap-core.de> parents: 
66diff
changeset | 127 | asc_context.windows[i].resized = true; | 
| 105 | 128 | asc_context.windows[i].dimensions.width = (unsigned) width; | 
| 129 | asc_context.windows[i].dimensions.height = (unsigned) height; | |
| 16 
c5dde81b6fb2
add text rendering and demo FPS counter
 Mike Becker <universe@uap-core.de> parents: 
15diff
changeset | 130 | } | 
| 
c5dde81b6fb2
add text rendering and demo FPS counter
 Mike Becker <universe@uap-core.de> parents: 
15diff
changeset | 131 | } | 
| 
c5dde81b6fb2
add text rendering and demo FPS counter
 Mike Becker <universe@uap-core.de> parents: 
15diff
changeset | 132 | |
| 
c5dde81b6fb2
add text rendering and demo FPS counter
 Mike Becker <universe@uap-core.de> parents: 
15diff
changeset | 133 | bool asc_loop_next(void) { | 
| 63 
e3cacdd636e4
implement mouse motion and key press events
 Mike Becker <universe@uap-core.de> parents: 
58diff
changeset | 134 | // reset mouse motion | 
| 
e3cacdd636e4
implement mouse motion and key press events
 Mike Becker <universe@uap-core.de> parents: 
58diff
changeset | 135 | asc_context.input.mouse_xrel = 0; | 
| 
e3cacdd636e4
implement mouse motion and key press events
 Mike Becker <universe@uap-core.de> parents: 
58diff
changeset | 136 | asc_context.input.mouse_yrel = 0; | 
| 
e3cacdd636e4
implement mouse motion and key press events
 Mike Becker <universe@uap-core.de> parents: 
58diff
changeset | 137 | |
| 141 
cd82643bb6d9
implement edge-triggered key press/release
 Mike Becker <universe@uap-core.de> parents: 
128diff
changeset | 138 | // reset key flags | 
| 253 | 139 | 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: 
128diff
changeset | 140 | 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: 
128diff
changeset | 141 | } | 
| 
cd82643bb6d9
implement edge-triggered key press/release
 Mike Becker <universe@uap-core.de> parents: 
128diff
changeset | 142 | |
| 16 
c5dde81b6fb2
add text rendering and demo FPS counter
 Mike Becker <universe@uap-core.de> parents: 
15diff
changeset | 143 | // dispatch SDL events | 
| 
c5dde81b6fb2
add text rendering and demo FPS counter
 Mike Becker <universe@uap-core.de> parents: 
15diff
changeset | 144 | SDL_Event event; | 
| 
c5dde81b6fb2
add text rendering and demo FPS counter
 Mike Becker <universe@uap-core.de> parents: 
15diff
changeset | 145 | while (SDL_PollEvent(&event)) { | 
| 
c5dde81b6fb2
add text rendering and demo FPS counter
 Mike Becker <universe@uap-core.de> parents: 
15diff
changeset | 146 | switch (event.type) { | 
| 253 | 147 | case SDL_EVENT_QUIT: | 
| 58 
26ebb2f1e6e6
improve ui/text.h interface a lot
 Mike Becker <universe@uap-core.de> parents: 
49diff
changeset | 148 | 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: 
15diff
changeset | 149 | break; | 
| 253 | 150 | case SDL_EVENT_WINDOW_RESIZED: { | 
| 151 | asc_event_window_resized( | |
| 152 | event.window.windowID, | |
| 153 | event.window.data1, | |
| 154 | event.window.data2 | |
| 155 | ); | |
| 16 
c5dde81b6fb2
add text rendering and demo FPS counter
 Mike Becker <universe@uap-core.de> parents: 
15diff
changeset | 156 | break; | 
| 
c5dde81b6fb2
add text rendering and demo FPS counter
 Mike Becker <universe@uap-core.de> parents: 
15diff
changeset | 157 | } | 
| 253 | 158 | case SDL_EVENT_WINDOW_FOCUS_GAINED: { | 
| 159 | unsigned int idx = asc_window_index(event.window.windowID); | |
| 160 | asc_context.windows[idx].focused = true; | |
| 161 | break; | |
| 162 | } | |
| 163 | case SDL_EVENT_WINDOW_FOCUS_LOST: { | |
| 164 | unsigned int idx = asc_window_index(event.window.windowID); | |
| 165 | asc_context.windows[idx].focused = false; | |
| 166 | break; | |
| 167 | } | |
| 168 | case SDL_EVENT_MOUSE_MOTION: { | |
| 63 
e3cacdd636e4
implement mouse motion and key press events
 Mike Becker <universe@uap-core.de> parents: 
58diff
changeset | 169 | // accumulate relative motion | 
| 
e3cacdd636e4
implement mouse motion and key press events
 Mike Becker <universe@uap-core.de> parents: 
58diff
changeset | 170 | asc_context.input.mouse_xrel += event.motion.xrel; | 
| 
e3cacdd636e4
implement mouse motion and key press events
 Mike Becker <universe@uap-core.de> parents: 
58diff
changeset | 171 | asc_context.input.mouse_yrel += event.motion.yrel; | 
| 
e3cacdd636e4
implement mouse motion and key press events
 Mike Becker <universe@uap-core.de> parents: 
58diff
changeset | 172 | // update absolute position | 
| 
e3cacdd636e4
implement mouse motion and key press events
 Mike Becker <universe@uap-core.de> parents: 
58diff
changeset | 173 | asc_context.input.mouse_x = event.motion.x; | 
| 
e3cacdd636e4
implement mouse motion and key press events
 Mike Becker <universe@uap-core.de> parents: 
58diff
changeset | 174 | asc_context.input.mouse_y = event.motion.y; | 
| 68 
823c03733e42
add mouse and window focus - resolves #382
 Mike Becker <universe@uap-core.de> parents: 
66diff
changeset | 175 | // update which window the mouse was seen in | 
| 
823c03733e42
add mouse and window focus - resolves #382
 Mike Becker <universe@uap-core.de> parents: 
66diff
changeset | 176 | asc_context.input.mouse_window = | 
| 
823c03733e42
add mouse and window focus - resolves #382
 Mike Becker <universe@uap-core.de> parents: 
66diff
changeset | 177 | asc_window_index(event.motion.windowID); | 
| 63 
e3cacdd636e4
implement mouse motion and key press events
 Mike Becker <universe@uap-core.de> parents: 
58diff
changeset | 178 | break; | 
| 
e3cacdd636e4
implement mouse motion and key press events
 Mike Becker <universe@uap-core.de> parents: 
58diff
changeset | 179 | } | 
| 253 | 180 | case SDL_EVENT_KEY_DOWN: | 
| 141 
cd82643bb6d9
implement edge-triggered key press/release
 Mike Becker <universe@uap-core.de> parents: 
128diff
changeset | 181 | // we only set the down and press flags if the key is not already known to be down | 
| 253 | 182 | if (asc_key_up(event.key.scancode)) { | 
| 183 | 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: 
128diff
changeset | 184 | } | 
| 16 
c5dde81b6fb2
add text rendering and demo FPS counter
 Mike Becker <universe@uap-core.de> parents: 
15diff
changeset | 185 | break; | 
| 253 | 186 | case SDL_EVENT_KEY_UP: | 
| 141 
cd82643bb6d9
implement edge-triggered key press/release
 Mike Becker <universe@uap-core.de> parents: 
128diff
changeset | 187 | // we can directly set the release flag - it will be cleared next round | 
| 253 | 188 | 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: 
15diff
changeset | 189 | break; | 
| 
c5dde81b6fb2
add text rendering and demo FPS counter
 Mike Becker <universe@uap-core.de> parents: 
15diff
changeset | 190 | } | 
| 
c5dde81b6fb2
add text rendering and demo FPS counter
 Mike Becker <universe@uap-core.de> parents: 
15diff
changeset | 191 | } | 
| 
c5dde81b6fb2
add text rendering and demo FPS counter
 Mike Becker <universe@uap-core.de> parents: 
15diff
changeset | 192 | |
| 
c5dde81b6fb2
add text rendering and demo FPS counter
 Mike Becker <universe@uap-core.de> parents: 
15diff
changeset | 193 | // compute frame time | 
| 46 
d3285aed65b3
make the timer have nanoseconds precision
 Mike Becker <universe@uap-core.de> parents: 
44diff
changeset | 194 | uint64_t frame_nanos, ns; | 
| 
d3285aed65b3
make the timer have nanoseconds precision
 Mike Becker <universe@uap-core.de> parents: 
44diff
changeset | 195 | do { | 
| 
d3285aed65b3
make the timer have nanoseconds precision
 Mike Becker <universe@uap-core.de> parents: 
44diff
changeset | 196 | ns = asc_nanos(); | 
| 
d3285aed65b3
make the timer have nanoseconds precision
 Mike Becker <universe@uap-core.de> parents: 
44diff
changeset | 197 | frame_nanos = ns - asc_context.total_nanos; | 
| 
d3285aed65b3
make the timer have nanoseconds precision
 Mike Becker <universe@uap-core.de> parents: 
44diff
changeset | 198 | } while (frame_nanos == 0); | 
| 
d3285aed65b3
make the timer have nanoseconds precision
 Mike Becker <universe@uap-core.de> parents: 
44diff
changeset | 199 | asc_context.frame_nanos = frame_nanos; | 
| 165 
590a9e822b6b
add frame_rate and frame_factor to context
 Mike Becker <universe@uap-core.de> parents: 
154diff
changeset | 200 | 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: 
154diff
changeset | 201 | 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: 
154diff
changeset | 202 | if (asc_context.frame_rate < 5) { | 
| 
590a9e822b6b
add frame_rate and frame_factor to context
 Mike Becker <universe@uap-core.de> parents: 
154diff
changeset | 203 | // 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: 
154diff
changeset | 204 | asc_context.frame_factor = 0; | 
| 
590a9e822b6b
add frame_rate and frame_factor to context
 Mike Becker <universe@uap-core.de> parents: 
154diff
changeset | 205 | } else { | 
| 
590a9e822b6b
add frame_rate and frame_factor to context
 Mike Becker <universe@uap-core.de> parents: 
154diff
changeset | 206 | 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: 
154diff
changeset | 207 | } | 
| 46 
d3285aed65b3
make the timer have nanoseconds precision
 Mike Becker <universe@uap-core.de> parents: 
44diff
changeset | 208 | asc_context.total_nanos = ns; | 
| 16 
c5dde81b6fb2
add text rendering and demo FPS counter
 Mike Becker <universe@uap-core.de> parents: 
15diff
changeset | 209 | |
| 147 
4908cc6c2e01
compute frame time before syncing to avoid div-by-zero in first frame
 Mike Becker <universe@uap-core.de> parents: 
141diff
changeset | 210 | // sync the windows | 
| 
4908cc6c2e01
compute frame time before syncing to avoid div-by-zero in first frame
 Mike Becker <universe@uap-core.de> parents: 
141diff
changeset | 211 | 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: 
141diff
changeset | 212 | 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: 
141diff
changeset | 213 | } | 
| 
4908cc6c2e01
compute frame time before syncing to avoid div-by-zero in first frame
 Mike Becker <universe@uap-core.de> parents: 
141diff
changeset | 214 | |
| 16 
c5dde81b6fb2
add text rendering and demo FPS counter
 Mike Becker <universe@uap-core.de> parents: 
15diff
changeset | 215 | 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: 
15diff
changeset | 216 | } | 
| 86 
943bf9d7c6d6
make asset paths configurable
 Mike Becker <universe@uap-core.de> parents: 
81diff
changeset | 217 | |
| 
943bf9d7c6d6
make asset paths configurable
 Mike Becker <universe@uap-core.de> parents: 
81diff
changeset | 218 | void asc_set_font_path(const char *path) { | 
| 
943bf9d7c6d6
make asset paths configurable
 Mike Becker <universe@uap-core.de> parents: 
81diff
changeset | 219 | cx_strcpy(&asc_context.font_path, cx_str(path)); | 
| 
943bf9d7c6d6
make asset paths configurable
 Mike Becker <universe@uap-core.de> parents: 
81diff
changeset | 220 | } | 
| 
943bf9d7c6d6
make asset paths configurable
 Mike Becker <universe@uap-core.de> parents: 
81diff
changeset | 221 | |
| 
943bf9d7c6d6
make asset paths configurable
 Mike Becker <universe@uap-core.de> parents: 
81diff
changeset | 222 | void asc_set_shader_path(const char *path) { | 
| 
943bf9d7c6d6
make asset paths configurable
 Mike Becker <universe@uap-core.de> parents: 
81diff
changeset | 223 | cx_strcpy(&asc_context.shader_path, cx_str(path)); | 
| 
943bf9d7c6d6
make asset paths configurable
 Mike Becker <universe@uap-core.de> parents: 
81diff
changeset | 224 | } | 
| 
943bf9d7c6d6
make asset paths configurable
 Mike Becker <universe@uap-core.de> parents: 
81diff
changeset | 225 | |
| 
943bf9d7c6d6
make asset paths configurable
 Mike Becker <universe@uap-core.de> parents: 
81diff
changeset | 226 | void asc_set_texture_path(const char *path) { | 
| 
943bf9d7c6d6
make asset paths configurable
 Mike Becker <universe@uap-core.de> parents: 
81diff
changeset | 227 | cx_strcpy(&asc_context.texture_path, cx_str(path)); | 
| 
943bf9d7c6d6
make asset paths configurable
 Mike Becker <universe@uap-core.de> parents: 
81diff
changeset | 228 | } |