Wed, 02 Jul 2025 23:21:17 +0200
resolve TODOs regarding input.h
a) mouse position must be integer, because it can be negative (though rarely)
b) we should not trade "access complexity" for space in the scancodes array
3 | 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 | ||
106
895f92cff6b8
bring back error.h to reduce compile dependencies
Mike Becker <universe@uap-core.de>
parents:
105
diff
changeset
|
28 | #include "ascension/error.h" |
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
29 | #include "ascension/context.h" |
82
4e1e698f4b0d
add generic mesh draw function and move sprite draw function to separate unit
Mike Becker <universe@uap-core.de>
parents:
80
diff
changeset
|
30 | #include "ascension/ui/text.h" |
11 | 31 | |
89
e1f682a8a145
use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents:
82
diff
changeset
|
32 | #include <assert.h> |
58
26ebb2f1e6e6
improve ui/text.h interface a lot
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
33 | #include <cx/printf.h> |
26ebb2f1e6e6
improve ui/text.h interface a lot
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
34 | |
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
35 | #include <GL/glew.h> |
3 | 36 | |
71
baa73a0be3ce
centralize draw functions
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
37 | static void asc_text_update(AscSceneNode *node) { |
baa73a0be3ce
centralize draw functions
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
38 | AscSprite *sprite = (AscSprite*) node; |
baa73a0be3ce
centralize draw functions
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
39 | AscText *text = (AscText*) node; |
29
1d001eb694dc
bring first scene graph to live
Mike Becker <universe@uap-core.de>
parents:
26
diff
changeset
|
40 | |
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
41 | // Render text onto a surface |
71
baa73a0be3ce
centralize draw functions
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
42 | TTF_Font *font = asc_font_load(text->font); |
162
d3598c834f9b
improve NULL-safety - fixes #690
Mike Becker <universe@uap-core.de>
parents:
150
diff
changeset
|
43 | if (font == NULL) return; |
58
26ebb2f1e6e6
improve ui/text.h interface a lot
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
44 | static int alignments[] = { |
26ebb2f1e6e6
improve ui/text.h interface a lot
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
45 | TTF_WRAPPED_ALIGN_LEFT, |
26ebb2f1e6e6
improve ui/text.h interface a lot
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
46 | TTF_WRAPPED_ALIGN_CENTER, |
26ebb2f1e6e6
improve ui/text.h interface a lot
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
47 | TTF_WRAPPED_ALIGN_RIGHT |
26ebb2f1e6e6
improve ui/text.h interface a lot
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
48 | }; |
57
7daec2f067a9
implement centered wrapped text
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
49 | TTF_SetFontWrappedAlign( |
71
baa73a0be3ce
centralize draw functions
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
50 | font, alignments[text->base.data.flags & ASC_TEXT_ALIGNMENT_MASK]); |
18
00c0632f0f40
fix missing UTF8 support for text rendering
Mike Becker <universe@uap-core.de>
parents:
17
diff
changeset
|
51 | SDL_Surface *surface = TTF_RenderUTF8_Blended_Wrapped( |
71
baa73a0be3ce
centralize draw functions
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
52 | font, text->text.ptr, asc_col_sdl(text->color), text->max_width |
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
53 | ); |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
54 | if (surface == NULL) { |
92 | 55 | asc_error("Rendering TTF surface failed: %s", SDL_GetError()); |
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
56 | return; |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
57 | } |
71
baa73a0be3ce
centralize draw functions
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
58 | if (asc_test_flag(text->base.data.flags, ASC_TEXT_CENTERED_FLAG)) { |
58
26ebb2f1e6e6
improve ui/text.h interface a lot
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
59 | unsigned short newoffx = surface->w / 2; |
116
bfb2a7d62047
replace scaling with correct mesh sizes
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
60 | node->position.x = node->position.x + (float)(text->offx - newoffx); |
71
baa73a0be3ce
centralize draw functions
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
61 | text->offx = newoffx; |
58
26ebb2f1e6e6
improve ui/text.h interface a lot
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
62 | } |
4
b7acda6a4476
add simple color data types
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
63 | |
135
062703d3f5cc
remove the need for a second pair of texture coordinates
Mike Becker <universe@uap-core.de>
parents:
122
diff
changeset
|
64 | // Transfer Image Data |
062703d3f5cc
remove the need for a second pair of texture coordinates
Mike Becker <universe@uap-core.de>
parents:
122
diff
changeset
|
65 | asc_texture_from_surface(sprite->texture, surface); |
062703d3f5cc
remove the need for a second pair of texture coordinates
Mike Becker <universe@uap-core.de>
parents:
122
diff
changeset
|
66 | |
116
bfb2a7d62047
replace scaling with correct mesh sizes
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
67 | // If dimensions changed, update the mesh |
bfb2a7d62047
replace scaling with correct mesh sizes
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
68 | if (text->dimension.x != (unsigned)surface->w || text->dimension.y != (unsigned)surface->h) { |
bfb2a7d62047
replace scaling with correct mesh sizes
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
69 | text->dimension.x = surface->w; |
bfb2a7d62047
replace scaling with correct mesh sizes
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
70 | text->dimension.y = surface->h; |
135
062703d3f5cc
remove the need for a second pair of texture coordinates
Mike Becker <universe@uap-core.de>
parents:
122
diff
changeset
|
71 | const asc_vec2f uv_scale = asc_texture_calculate_uv_scale(sprite->texture, text->dimension, asc_vec2f_one); |
062703d3f5cc
remove the need for a second pair of texture coordinates
Mike Becker <universe@uap-core.de>
parents:
122
diff
changeset
|
72 | asc_mesh_plane_2d(&text->base.mesh, |
062703d3f5cc
remove the need for a second pair of texture coordinates
Mike Becker <universe@uap-core.de>
parents:
122
diff
changeset
|
73 | .size = asc_vec2f_new(surface->w, surface->h), |
062703d3f5cc
remove the need for a second pair of texture coordinates
Mike Becker <universe@uap-core.de>
parents:
122
diff
changeset
|
74 | .uv_scale = uv_scale |
062703d3f5cc
remove the need for a second pair of texture coordinates
Mike Becker <universe@uap-core.de>
parents:
122
diff
changeset
|
75 | ); |
116
bfb2a7d62047
replace scaling with correct mesh sizes
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
76 | } |
bfb2a7d62047
replace scaling with correct mesh sizes
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
77 | |
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
78 | // Free the surface |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
79 | SDL_FreeSurface(surface); |
116
bfb2a7d62047
replace scaling with correct mesh sizes
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
80 | |
bfb2a7d62047
replace scaling with correct mesh sizes
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
81 | // Schedule for transform update |
bfb2a7d62047
replace scaling with correct mesh sizes
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
82 | asc_node_update_transform(node); |
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
83 | } |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
84 | |
113
71ba88258ea0
change node's free function to a destroy function
Mike Becker <universe@uap-core.de>
parents:
106
diff
changeset
|
85 | static void asc_text_destroy(AscSceneNode *node) { |
71
baa73a0be3ce
centralize draw functions
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
86 | AscText *text = (AscText*) node; |
baa73a0be3ce
centralize draw functions
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
87 | AscSprite *sprite = (AscSprite*) node; |
115
e5f8c99b0987
refactor rendering 1/3 - create new mesh structs
Mike Becker <universe@uap-core.de>
parents:
114
diff
changeset
|
88 | asc_mesh_destroy(&sprite->mesh); |
89
e1f682a8a145
use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents:
82
diff
changeset
|
89 | asc_texture_destroy(sprite->texture, 1); |
e1f682a8a145
use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents:
82
diff
changeset
|
90 | assert(sprite->texture->refcount == 0); |
122
1b118cd3e369
replace all stdlib malloc/free with UCX allocator
Mike Becker <universe@uap-core.de>
parents:
116
diff
changeset
|
91 | cxFreeDefault(sprite->texture); |
71
baa73a0be3ce
centralize draw functions
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
92 | cx_strfree(&text->text); |
baa73a0be3ce
centralize draw functions
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
93 | } |
32
86468a71dd73
add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
29
diff
changeset
|
94 | |
71
baa73a0be3ce
centralize draw functions
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
95 | AscSceneNode *asc_text_create(struct asc_text_create_args args) { |
122
1b118cd3e369
replace all stdlib malloc/free with UCX allocator
Mike Becker <universe@uap-core.de>
parents:
116
diff
changeset
|
96 | AscText *text = cxZallocDefault(sizeof(AscText)); |
115
e5f8c99b0987
refactor rendering 1/3 - create new mesh structs
Mike Becker <universe@uap-core.de>
parents:
114
diff
changeset
|
97 | AscSceneNode *node = &text->base.data; |
32
86468a71dd73
add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
29
diff
changeset
|
98 | |
115
e5f8c99b0987
refactor rendering 1/3 - create new mesh structs
Mike Becker <universe@uap-core.de>
parents:
114
diff
changeset
|
99 | // node properties |
e5f8c99b0987
refactor rendering 1/3 - create new mesh structs
Mike Becker <universe@uap-core.de>
parents:
114
diff
changeset
|
100 | asc_scene_node_name(node, args.name); |
150
3045f61bc4eb
make draw function dynamic
Mike Becker <universe@uap-core.de>
parents:
149
diff
changeset
|
101 | node->render_group = ASC_RENDER_GROUP_2D_BLEND; |
113
71ba88258ea0
change node's free function to a destroy function
Mike Becker <universe@uap-core.de>
parents:
106
diff
changeset
|
102 | node->destroy_func = asc_text_destroy; |
71
baa73a0be3ce
centralize draw functions
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
103 | node->update_func = asc_text_update; |
150
3045f61bc4eb
make draw function dynamic
Mike Becker <universe@uap-core.de>
parents:
149
diff
changeset
|
104 | node->draw_func = asc_sprite_draw; |
105 | 105 | node->position = asc_vec3f_new(args.x, args.y, ASC_SCENE_2D_DEPTH_OFFSET); |
116
bfb2a7d62047
replace scaling with correct mesh sizes
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
106 | node->scale = asc_vec3f_one; |
115
e5f8c99b0987
refactor rendering 1/3 - create new mesh structs
Mike Becker <universe@uap-core.de>
parents:
114
diff
changeset
|
107 | |
e5f8c99b0987
refactor rendering 1/3 - create new mesh structs
Mike Becker <universe@uap-core.de>
parents:
114
diff
changeset
|
108 | // text properties |
e5f8c99b0987
refactor rendering 1/3 - create new mesh structs
Mike Becker <universe@uap-core.de>
parents:
114
diff
changeset
|
109 | node->flags = args.alignment; // use flags variable to save some space |
71
baa73a0be3ce
centralize draw functions
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
110 | text->max_width = args.max_width; |
baa73a0be3ce
centralize draw functions
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
111 | text->font = asc_active_font; |
baa73a0be3ce
centralize draw functions
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
112 | text->color = asc_context.ink; |
59
764fbb013252
use fancy named parameters for asc_text()
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
113 | if (args.text == NULL) { |
71
baa73a0be3ce
centralize draw functions
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
114 | text->text = cx_mutstr(strdup(" ")); |
58
26ebb2f1e6e6
improve ui/text.h interface a lot
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
115 | } else { |
71
baa73a0be3ce
centralize draw functions
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
116 | text->text = cx_mutstr(strdup(args.text)); |
32
86468a71dd73
add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
29
diff
changeset
|
117 | } |
86468a71dd73
add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
29
diff
changeset
|
118 | |
116
bfb2a7d62047
replace scaling with correct mesh sizes
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
119 | // initialize texture |
bfb2a7d62047
replace scaling with correct mesh sizes
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
120 | // mesh will be created in the update func |
122
1b118cd3e369
replace all stdlib malloc/free with UCX allocator
Mike Becker <universe@uap-core.de>
parents:
116
diff
changeset
|
121 | text->base.texture = cxMallocDefault(sizeof(AscTexture)); |
89
e1f682a8a145
use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents:
82
diff
changeset
|
122 | asc_texture_init_rectangle(text->base.texture, 1); |
37
8a8cc6725b48
add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
36
diff
changeset
|
123 | asc_text_update(node); |
8a8cc6725b48
add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
36
diff
changeset
|
124 | |
71
baa73a0be3ce
centralize draw functions
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
125 | return node; |
58
26ebb2f1e6e6
improve ui/text.h interface a lot
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
126 | } |
26ebb2f1e6e6
improve ui/text.h interface a lot
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
127 | |
26ebb2f1e6e6
improve ui/text.h interface a lot
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
128 | void asc_text_printf( |
26ebb2f1e6e6
improve ui/text.h interface a lot
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
129 | AscSceneNode *node, |
149
560772519ff9
resolve east-west conflict
Mike Becker <universe@uap-core.de>
parents:
144
diff
changeset
|
130 | const char *format, |
58
26ebb2f1e6e6
improve ui/text.h interface a lot
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
131 | ... |
26ebb2f1e6e6
improve ui/text.h interface a lot
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
132 | ) { |
80 | 133 | AscText *text_node = (AscText*) node; |
58
26ebb2f1e6e6
improve ui/text.h interface a lot
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
134 | va_list ap; |
26ebb2f1e6e6
improve ui/text.h interface a lot
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
135 | va_start(ap, format); |
74
25fb39f8863a
fix memory leak in asc_text_printf()
Mike Becker <universe@uap-core.de>
parents:
71
diff
changeset
|
136 | cx_vsprintf( |
80 | 137 | &text_node->text.ptr, |
138 | &text_node->text.length, | |
74
25fb39f8863a
fix memory leak in asc_text_printf()
Mike Becker <universe@uap-core.de>
parents:
71
diff
changeset
|
139 | format, |
25fb39f8863a
fix memory leak in asc_text_printf()
Mike Becker <universe@uap-core.de>
parents:
71
diff
changeset
|
140 | ap |
25fb39f8863a
fix memory leak in asc_text_printf()
Mike Becker <universe@uap-core.de>
parents:
71
diff
changeset
|
141 | ); |
58
26ebb2f1e6e6
improve ui/text.h interface a lot
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
142 | va_end(ap); |
26ebb2f1e6e6
improve ui/text.h interface a lot
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
143 | asc_node_update(node); |
26ebb2f1e6e6
improve ui/text.h interface a lot
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
144 | } |
76
eb16be99b0ad
update to newest versions of uwproj and ucx
Mike Becker <universe@uap-core.de>
parents:
74
diff
changeset
|
145 |