Thu, 24 Apr 2025 19:53:40 +0200
in preparation of more scenes, bring back AscScene struct
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" |
0 | 29 | |
6
302971e8599b
move window related stuff to its own unit
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
30 | #include <SDL2/SDL.h> |
302971e8599b
move window related stuff to its own unit
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
31 | #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
|
32 | #include <SDL2/SDL_image.h> |
0 | 33 | |
95
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
34 | #include <GL/gl.h> |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
35 | |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
36 | #include <cx/printf.h> |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
37 | |
46
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
38 | #include <time.h> |
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
39 | |
0 | 40 | AscContext asc_context; |
41 | ||
95
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
42 | void asc_error_impl(const char* file, unsigned line, char const* fmt, ...) { |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
43 | asc_set_flag(asc_context.flags, ASC_FLAG_HAS_ERROR); |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
44 | |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
45 | // write to error buffer |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
46 | va_list args; |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
47 | va_start(args, fmt); |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
48 | CxBuffer* buf = &asc_context.error_buffer; |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
49 | size_t bufpos = buf->pos; |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
50 | int written = cx_vfprintf(buf, cxBufferWriteFunc, fmt, args); |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
51 | cxBufferPut(buf, '\n'); |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
52 | va_end(args); |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
53 | |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
54 | // also print to stderr |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
55 | // avoid double-formatting, get it directly from the buffer |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
56 | fprintf(stderr, "[ERROR %s %u] %.*s\n", |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
57 | file, line, written, buf->space+bufpos); |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
58 | } |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
59 | |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
60 | bool asc_has_error(void) { |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
61 | return asc_test_flag(asc_context.flags, ASC_FLAG_HAS_ERROR); |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
62 | } |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
63 | |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
64 | char const* asc_get_error(void) { |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
65 | // we zero-terminate the current buffer contents before providing them |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
66 | cxBufferPut(&asc_context.error_buffer, 0); |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
67 | --asc_context.error_buffer.pos; |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
68 | --asc_context.error_buffer.size; |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
69 | return asc_context.error_buffer.space; |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
70 | } |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
71 | |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
72 | void asc_clear_error(void) { |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
73 | cxBufferClear(&asc_context.error_buffer); |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
74 | asc_clear_flag(asc_context.flags, ASC_FLAG_HAS_ERROR); |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
75 | } |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
76 | |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
77 | void asc_error_gl(unsigned code, const char *message) { |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
78 | const char *glerr; |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
79 | switch(code) { |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
80 | case GL_NO_ERROR: |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
81 | return; |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
82 | case GL_INVALID_ENUM: |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
83 | glerr = "invalid enum"; |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
84 | break; |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
85 | case GL_INVALID_VALUE: |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
86 | glerr = "invalid value"; |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
87 | break; |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
88 | case GL_INVALID_OPERATION: |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
89 | glerr = "invalid operation"; |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
90 | break; |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
91 | case GL_INVALID_FRAMEBUFFER_OPERATION: |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
92 | glerr = "invalid framebuffer operation"; |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
93 | break; |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
94 | case GL_OUT_OF_MEMORY: |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
95 | glerr = "out of memory"; |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
96 | break; |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
97 | case GL_STACK_UNDERFLOW: |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
98 | glerr = "stack underflow"; |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
99 | break; |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
100 | case GL_STACK_OVERFLOW: |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
101 | glerr = "stack overflow"; |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
102 | break; |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
103 | default: |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
104 | glerr = "unknown GL error"; |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
105 | } |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
106 | asc_error("%s\nGL Error: %s", message, glerr); |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
107 | } |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
108 | |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
109 | int asc_error_catch_all_gl(void) { |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
110 | GLenum error; |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
111 | int ret = 0; |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
112 | while ((error = glGetError()) != GL_NO_ERROR) { |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
113 | asc_error_gl(error, "Uncaught"); |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
114 | ret = 1; |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
115 | } |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
116 | return ret; |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
117 | } |
622887f7e954
in preparation of more scenes, bring back AscScene struct
Mike Becker <universe@uap-core.de>
parents:
92
diff
changeset
|
118 | |
46
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
119 | static uint64_t asc_nanos(void) { |
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
120 | struct timespec ts; |
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
121 | clock_gettime(CLOCK_MONOTONIC, &ts); |
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
122 | 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
|
123 | } |
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
124 | |
66
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
125 | // 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
|
126 | 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
|
127 | 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
|
128 | |
0 | 129 | void asc_context_initialize(void) { |
130 | if (asc_test_flag(asc_context.flags, ASC_FLAG_INITILIZED)) | |
131 | return; | |
11 | 132 | memset(&asc_context, 0, sizeof(AscContext)); |
0 | 133 | |
86
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
134 | // initialize default paths |
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
135 | asc_context.font_path = cx_strdup(CX_STR("./fonts")); |
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
136 | asc_context.shader_path = cx_strdup(CX_STR("./shader")); |
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
137 | asc_context.texture_path = cx_strdup(CX_STR("./textures")); |
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
138 | |
66
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
139 | // initialize the font cache |
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
140 | asc_font_cache_init(); |
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
141 | |
81
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
68
diff
changeset
|
142 | // 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
|
143 | 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
|
144 | 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
|
145 | |
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
146 | // no window, yet |
65
9c44c55d327a
consistently refer to windows by ID - fixes #381
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
147 | 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
|
148 | |
0 | 149 | // initialize error buffer |
150 | cxBufferInit( | |
151 | &asc_context.error_buffer, | |
152 | NULL, | |
153 | 256, | |
154 | NULL, | |
155 | CX_BUFFER_AUTO_EXTEND | |
156 | ); | |
157 | ||
158 | // initialize SDL | |
88
6234b7ea48f3
add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents:
86
diff
changeset
|
159 | const int supported_img_flags = IMG_INIT_PNG | IMG_INIT_JPG; |
0 | 160 | if (SDL_Init(SDL_INIT_VIDEO) < 0) { |
92 | 161 | 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
|
162 | } else if (TTF_Init() < 0) { |
92 | 163 | 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
|
164 | } else if (IMG_Init(supported_img_flags) != supported_img_flags) { |
92 | 165 | asc_error("Failed to initialize SDL_img: %s", IMG_GetError()); |
0 | 166 | } |
167 | SDL_ClearError(); | |
46
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
168 | 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
|
169 | asc_set_flag(asc_context.flags, ASC_FLAG_INITILIZED); |
0 | 170 | asc_dprintf("Ascension context initialized."); |
171 | } | |
172 | ||
173 | 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
|
174 | // destroy windows |
7 | 175 | 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
|
176 | asc_window_destroy(i); |
7 | 177 | } |
66
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
178 | |
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
179 | // destroy the font cache |
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
180 | asc_font_cache_destroy(); |
0 | 181 | |
182 | // quit SDL | |
88
6234b7ea48f3
add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents:
86
diff
changeset
|
183 | IMG_Quit(); |
6234b7ea48f3
add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents:
86
diff
changeset
|
184 | TTF_Quit(); |
0 | 185 | SDL_Quit(); |
186 | ||
187 | // destroy the error buffer | |
188 | cxBufferDestroy(&asc_context.error_buffer); | |
189 | asc_context.flags = 0; | |
190 | asc_dprintf("Ascension context destroyed."); | |
86
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
191 | |
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
192 | // destroy the path information |
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
193 | cx_strfree(&asc_context.font_path); |
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
194 | cx_strfree(&asc_context.shader_path); |
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
195 | cx_strfree(&asc_context.texture_path); |
0 | 196 | } |
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
197 | |
63
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
198 | void asc_context_quit(void) { |
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
199 | 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
|
200 | } |
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
201 | |
66
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
202 | 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
|
203 | 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
|
204 | 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
|
205 | } else { |
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
206 | 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
|
207 | abort(); |
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
208 | } |
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
209 | } |
8297afa1c29c
replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents:
65
diff
changeset
|
210 | |
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
211 | 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
|
212 | 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
|
213 | if (i < ASC_MAX_WINDOWS) { |
823c03733e42
add mouse and window focus - resolves #382
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
214 | asc_vec2i dimensions = (asc_vec2i) {width, height}; |
823c03733e42
add mouse and window focus - resolves #382
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
215 | asc_context.windows[i].resized = true; |
823c03733e42
add mouse and window focus - resolves #382
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
216 | asc_context.windows[i].dimensions = dimensions; |
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
217 | } |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
218 | } |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
219 | |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
220 | bool asc_loop_next(void) { |
63
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
221 | // reset mouse motion |
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
222 | asc_context.input.mouse_xrel = 0; |
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
223 | asc_context.input.mouse_yrel = 0; |
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
224 | |
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
225 | // dispatch SDL events |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
226 | SDL_Event event; |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
227 | while (SDL_PollEvent(&event)) { |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
228 | switch (event.type) { |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
229 | case SDL_QUIT: |
58
26ebb2f1e6e6
improve ui/text.h interface a lot
Mike Becker <universe@uap-core.de>
parents:
49
diff
changeset
|
230 | 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
|
231 | break; |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
232 | case SDL_WINDOWEVENT: { |
68
823c03733e42
add mouse and window focus - resolves #382
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
233 | 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
|
234 | asc_event_window_resized( |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
235 | event.window.windowID, |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
236 | event.window.data1, |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
237 | event.window.data2 |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
238 | ); |
68
823c03733e42
add mouse and window focus - resolves #382
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
239 | } 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
|
240 | 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
|
241 | asc_context.windows[idx].focused = true; |
823c03733e42
add mouse and window focus - resolves #382
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
242 | } 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
|
243 | 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
|
244 | asc_context.windows[idx].focused = false; |
823c03733e42
add mouse and window focus - resolves #382
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
245 | } |
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
246 | break; |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
247 | } |
63
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
248 | case SDL_MOUSEMOTION: { |
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
249 | // accumulate relative motion |
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
250 | 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
|
251 | 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
|
252 | // update absolute position |
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
253 | 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
|
254 | 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
|
255 | // 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
|
256 | asc_context.input.mouse_window = |
823c03733e42
add mouse and window focus - resolves #382
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
257 | 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
|
258 | break; |
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
259 | } |
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
260 | case SDL_KEYDOWN: |
63
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
261 | asc_context.input.keys[event.key.keysym.scancode] = true; |
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
262 | break; |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
263 | case SDL_KEYUP: |
63
e3cacdd636e4
implement mouse motion and key press events
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
264 | asc_context.input.keys[event.key.keysym.scancode] = false; |
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
265 | break; |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
266 | } |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
267 | } |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
268 | |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
269 | // sync the windows |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
270 | 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
|
271 | asc_window_sync(i); |
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
272 | } |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
273 | |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
274 | // compute frame time |
46
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
275 | uint64_t frame_nanos, ns; |
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
276 | do { |
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
277 | ns = asc_nanos(); |
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
278 | frame_nanos = ns - asc_context.total_nanos; |
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
279 | } while (frame_nanos == 0); |
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
280 | asc_context.frame_nanos = frame_nanos; |
d3285aed65b3
make the timer have nanoseconds precision
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
281 | asc_context.total_nanos = ns; |
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
282 | |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
283 | 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
|
284 | } |
86
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
285 | |
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
286 | void asc_set_font_path(const char *path) { |
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
287 | cx_strcpy(&asc_context.font_path, cx_str(path)); |
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
288 | } |
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
289 | |
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
290 | void asc_set_shader_path(const char *path) { |
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
291 | cx_strcpy(&asc_context.shader_path, cx_str(path)); |
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
292 | } |
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
293 | |
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
294 | void asc_set_texture_path(const char *path) { |
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
295 | cx_strcpy(&asc_context.texture_path, cx_str(path)); |
943bf9d7c6d6
make asset paths configurable
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
296 | } |