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
143
4db4f00493ad
prepare implementation of primitives
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1 | /* |
4db4f00493ad
prepare implementation of primitives
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
4db4f00493ad
prepare implementation of primitives
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
3 | * Copyright 2025 Mike Becker. All rights reserved. |
4db4f00493ad
prepare implementation of primitives
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
4 | * |
4db4f00493ad
prepare implementation of primitives
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
5 | * Redistribution and use in source and binary forms, with or without |
4db4f00493ad
prepare implementation of primitives
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
6 | * modification, are permitted provided that the following conditions are met: |
4db4f00493ad
prepare implementation of primitives
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
7 | * |
4db4f00493ad
prepare implementation of primitives
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
8 | * 1. Redistributions of source code must retain the above copyright |
4db4f00493ad
prepare implementation of primitives
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
9 | * notice, this list of conditions and the following disclaimer. |
4db4f00493ad
prepare implementation of primitives
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
10 | * |
4db4f00493ad
prepare implementation of primitives
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
11 | * 2. Redistributions in binary form must reproduce the above copyright |
4db4f00493ad
prepare implementation of primitives
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
12 | * notice, this list of conditions and the following disclaimer in the |
4db4f00493ad
prepare implementation of primitives
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
13 | * documentation and/or other materials provided with the distribution. |
4db4f00493ad
prepare implementation of primitives
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
14 | * |
4db4f00493ad
prepare implementation of primitives
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
15 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
4db4f00493ad
prepare implementation of primitives
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
16 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
4db4f00493ad
prepare implementation of primitives
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
17 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
4db4f00493ad
prepare implementation of primitives
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
18 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
4db4f00493ad
prepare implementation of primitives
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
19 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
4db4f00493ad
prepare implementation of primitives
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
20 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
4db4f00493ad
prepare implementation of primitives
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
21 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
4db4f00493ad
prepare implementation of primitives
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
22 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
4db4f00493ad
prepare implementation of primitives
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
23 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
4db4f00493ad
prepare implementation of primitives
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
24 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
4db4f00493ad
prepare implementation of primitives
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
25 | * POSSIBILITY OF SUCH DAMAGE. |
4db4f00493ad
prepare implementation of primitives
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
26 | */ |
4db4f00493ad
prepare implementation of primitives
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
27 | |
4db4f00493ad
prepare implementation of primitives
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
28 | #include "ascension/2d.h" |
4db4f00493ad
prepare implementation of primitives
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
29 | |
151
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
30 | #include "ascension/constants.h" |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
31 | #include "ascension/context.h" |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
32 | #include "ascension/error.h" |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
33 | #include "ascension/shader.h" |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
34 | |
160
80700db530ff
improve the combination of shader preprocessor flags
Mike Becker <universe@uap-core.de>
parents:
159
diff
changeset
|
35 | #include <assert.h> |
151
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
36 | |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
37 | typedef struct asc_rectangle_shader_s { |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
38 | AscShaderProgram program; |
168
f70569c49c24
add abstractions that allow removing dependencies to glew.h
Mike Becker <universe@uap-core.de>
parents:
167
diff
changeset
|
39 | asc_uniform_loc color; |
f70569c49c24
add abstractions that allow removing dependencies to glew.h
Mike Becker <universe@uap-core.de>
parents:
167
diff
changeset
|
40 | asc_uniform_loc border_color; |
f70569c49c24
add abstractions that allow removing dependencies to glew.h
Mike Becker <universe@uap-core.de>
parents:
167
diff
changeset
|
41 | asc_uniform_loc size; |
f70569c49c24
add abstractions that allow removing dependencies to glew.h
Mike Becker <universe@uap-core.de>
parents:
167
diff
changeset
|
42 | asc_uniform_loc thickness; |
f70569c49c24
add abstractions that allow removing dependencies to glew.h
Mike Becker <universe@uap-core.de>
parents:
167
diff
changeset
|
43 | asc_uniform_loc radius; |
151
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
44 | } AscRectangleShader; |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
45 | |
159
da7ebfcdd159
add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
46 | #define ASC_RECTANGLE_SHADER_FLAG_FILL 1 |
da7ebfcdd159
add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
47 | #define ASC_RECTANGLE_SHADER_FLAG_ROUND 2 |
da7ebfcdd159
add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
48 | #define ASC_RECTANGLE_SHADER_FLAG_BORDER 4 |
158
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
151
diff
changeset
|
49 | |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
151
diff
changeset
|
50 | static AscShaderProgram *asc_rectangle_shader_create(int flags) { |
151
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
51 | AscShaderCodes codes; |
158
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
151
diff
changeset
|
52 | const char * const defines[] = { |
160
80700db530ff
improve the combination of shader preprocessor flags
Mike Becker <universe@uap-core.de>
parents:
159
diff
changeset
|
53 | "#define FILL\n", |
80700db530ff
improve the combination of shader preprocessor flags
Mike Becker <universe@uap-core.de>
parents:
159
diff
changeset
|
54 | "#define ROUNDED_CORNERS\n", |
80700db530ff
improve the combination of shader preprocessor flags
Mike Becker <universe@uap-core.de>
parents:
159
diff
changeset
|
55 | "#define BORDER\n" |
158
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
151
diff
changeset
|
56 | }; |
151
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
57 | if (asc_shader_load_code_files((AscShaderCodeInfo){ |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
58 | .files.vtx = "sprite_vtx.glsl", |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
59 | .files.frag = "rectangle_frag.glsl", |
160
80700db530ff
improve the combination of shader preprocessor flags
Mike Becker <universe@uap-core.de>
parents:
159
diff
changeset
|
60 | .defines.frag_list = defines, |
80700db530ff
improve the combination of shader preprocessor flags
Mike Becker <universe@uap-core.de>
parents:
159
diff
changeset
|
61 | .defines.frag_list_select = flags |
151
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
62 | }, &codes)) { |
161
4c8b9c6d241f
fix segfault when a shader does not compile
Mike Becker <universe@uap-core.de>
parents:
160
diff
changeset
|
63 | asc_error("Loading rectangle shader failed."); |
151
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
64 | return NULL; |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
65 | } |
169
6e6717d9c776
improve "polymorphic" typing of shaders
Mike Becker <universe@uap-core.de>
parents:
168
diff
changeset
|
66 | AscShaderProgram *shader = asc_shader_create(codes, sizeof(AscRectangleShader)); |
6e6717d9c776
improve "polymorphic" typing of shaders
Mike Becker <universe@uap-core.de>
parents:
168
diff
changeset
|
67 | if (asc_shader_invalid(shader)) { |
151
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
68 | asc_shader_free_codes(codes); |
169
6e6717d9c776
improve "polymorphic" typing of shaders
Mike Becker <universe@uap-core.de>
parents:
168
diff
changeset
|
69 | return shader; |
151
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
70 | } |
169
6e6717d9c776
improve "polymorphic" typing of shaders
Mike Becker <universe@uap-core.de>
parents:
168
diff
changeset
|
71 | asc_ptr_cast(AscRectangleShader, rect_shader, shader); |
6e6717d9c776
improve "polymorphic" typing of shaders
Mike Becker <universe@uap-core.de>
parents:
168
diff
changeset
|
72 | rect_shader->size = asc_shader_get_uniform_loc(shader, "size"); |
158
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
151
diff
changeset
|
73 | if (asc_test_flag(flags, ASC_RECTANGLE_SHADER_FLAG_FILL)) { |
169
6e6717d9c776
improve "polymorphic" typing of shaders
Mike Becker <universe@uap-core.de>
parents:
168
diff
changeset
|
74 | rect_shader->color = asc_shader_get_uniform_loc(shader, "color"); |
151
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
75 | } else { |
169
6e6717d9c776
improve "polymorphic" typing of shaders
Mike Becker <universe@uap-core.de>
parents:
168
diff
changeset
|
76 | rect_shader->color = -1; |
159
da7ebfcdd159
add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
77 | } |
da7ebfcdd159
add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
78 | if (asc_test_flag(flags, ASC_RECTANGLE_SHADER_FLAG_BORDER)) { |
169
6e6717d9c776
improve "polymorphic" typing of shaders
Mike Becker <universe@uap-core.de>
parents:
168
diff
changeset
|
79 | rect_shader->thickness = asc_shader_get_uniform_loc(shader, "thickness"); |
6e6717d9c776
improve "polymorphic" typing of shaders
Mike Becker <universe@uap-core.de>
parents:
168
diff
changeset
|
80 | rect_shader->border_color = asc_shader_get_uniform_loc(shader, "border_color"); |
159
da7ebfcdd159
add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
81 | } else { |
169
6e6717d9c776
improve "polymorphic" typing of shaders
Mike Becker <universe@uap-core.de>
parents:
168
diff
changeset
|
82 | rect_shader->thickness = -1; |
6e6717d9c776
improve "polymorphic" typing of shaders
Mike Becker <universe@uap-core.de>
parents:
168
diff
changeset
|
83 | rect_shader->border_color = -1; |
151
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
84 | } |
158
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
151
diff
changeset
|
85 | if (asc_test_flag(flags, ASC_RECTANGLE_SHADER_FLAG_ROUND)) { |
169
6e6717d9c776
improve "polymorphic" typing of shaders
Mike Becker <universe@uap-core.de>
parents:
168
diff
changeset
|
86 | rect_shader->radius = asc_shader_get_uniform_loc(shader, "radius"); |
158
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
151
diff
changeset
|
87 | } else { |
169
6e6717d9c776
improve "polymorphic" typing of shaders
Mike Becker <universe@uap-core.de>
parents:
168
diff
changeset
|
88 | rect_shader->radius = -1; |
158
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
151
diff
changeset
|
89 | } |
151
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
90 | asc_shader_free_codes(codes); |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
91 | |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
92 | asc_error_catch_all_gl(); |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
93 | |
169
6e6717d9c776
improve "polymorphic" typing of shaders
Mike Becker <universe@uap-core.de>
parents:
168
diff
changeset
|
94 | return shader; |
151
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
95 | } |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
96 | |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
97 | static void asc_rectangle_destroy(AscSceneNode *node) { |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
98 | asc_ptr_cast(AscRectangle, rectangle, node); |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
99 | asc_mesh_destroy(&rectangle->mesh); |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
100 | } |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
101 | |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
102 | static void asc_rectangle_update(AscSceneNode *node) { |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
103 | asc_ptr_cast(AscRectangle, rectangle, node); |
167
8e6a661c87db
add functions to upload common uniforms
Mike Becker <universe@uap-core.de>
parents:
163
diff
changeset
|
104 | asc_mesh_plane_2d(&rectangle->mesh, .size = rectangle->size, .uv_scale = rectangle->size); |
151
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
105 | } |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
106 | |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
107 | static void asc_rectangle_draw(const AscCamera *camera, const AscSceneNode *node) { |
169
6e6717d9c776
improve "polymorphic" typing of shaders
Mike Becker <universe@uap-core.de>
parents:
168
diff
changeset
|
108 | asc_cptr_cast(AscRectangle, rectangle, node); |
159
da7ebfcdd159
add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
109 | const bool filled = rectangle->filled; |
158
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
151
diff
changeset
|
110 | const bool round = rectangle->radius > 0; |
159
da7ebfcdd159
add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
111 | const bool border = rectangle->thickness > 0; |
158
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
151
diff
changeset
|
112 | |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
151
diff
changeset
|
113 | // Compute shader flags |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
151
diff
changeset
|
114 | int shader_flags = 0; |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
151
diff
changeset
|
115 | if (filled) shader_flags |= ASC_RECTANGLE_SHADER_FLAG_FILL; |
159
da7ebfcdd159
add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
116 | if (border) shader_flags |= ASC_RECTANGLE_SHADER_FLAG_BORDER; |
158
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
151
diff
changeset
|
117 | if (round) shader_flags |= ASC_RECTANGLE_SHADER_FLAG_ROUND; |
151
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
118 | |
161
4c8b9c6d241f
fix segfault when a shader does not compile
Mike Becker <universe@uap-core.de>
parents:
160
diff
changeset
|
119 | // Lookup table for the shader ID |
158
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
151
diff
changeset
|
120 | const int shader_ids[] = { |
159
da7ebfcdd159
add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
121 | -1, // unused |
158
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
151
diff
changeset
|
122 | ASC_SHADER_RECTANGLE_FILL, |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
151
diff
changeset
|
123 | ASC_SHADER_RECTANGLE_DRAW_ROUND, |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
151
diff
changeset
|
124 | ASC_SHADER_RECTANGLE_FILL_ROUND, |
159
da7ebfcdd159
add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
125 | ASC_SHADER_RECTANGLE_DRAW, |
da7ebfcdd159
add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
126 | ASC_SHADER_RECTANGLE_FILL_BORDER, |
da7ebfcdd159
add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
127 | ASC_SHADER_RECTANGLE_DRAW_ROUND, |
da7ebfcdd159
add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
128 | ASC_SHADER_RECTANGLE_FILL_BORDER_ROUND, |
158
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
151
diff
changeset
|
129 | }; |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
151
diff
changeset
|
130 | |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
151
diff
changeset
|
131 | // Look up and activate shader |
169
6e6717d9c776
improve "polymorphic" typing of shaders
Mike Becker <universe@uap-core.de>
parents:
168
diff
changeset
|
132 | const AscShaderProgram *shader = asc_shader_lookup_or_create( |
158
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
151
diff
changeset
|
133 | shader_ids[shader_flags], asc_rectangle_shader_create, shader_flags); |
169
6e6717d9c776
improve "polymorphic" typing of shaders
Mike Becker <universe@uap-core.de>
parents:
168
diff
changeset
|
134 | if (asc_shader_use(shader, camera)) return; |
6e6717d9c776
improve "polymorphic" typing of shaders
Mike Becker <universe@uap-core.de>
parents:
168
diff
changeset
|
135 | asc_cptr_cast(AscRectangleShader, rect_shader, shader); |
151
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
136 | |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
137 | // Upload uniforms |
169
6e6717d9c776
improve "polymorphic" typing of shaders
Mike Becker <universe@uap-core.de>
parents:
168
diff
changeset
|
138 | asc_shader_upload_model_matrix(shader, node); |
151
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
139 | |
159
da7ebfcdd159
add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
140 | if (filled) { |
169
6e6717d9c776
improve "polymorphic" typing of shaders
Mike Becker <universe@uap-core.de>
parents:
168
diff
changeset
|
141 | asc_shader_upload_col4f(rect_shader->color, rectangle->color); |
159
da7ebfcdd159
add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
142 | } |
169
6e6717d9c776
improve "polymorphic" typing of shaders
Mike Becker <universe@uap-core.de>
parents:
168
diff
changeset
|
143 | asc_shader_upload_vec2f(rect_shader->size, rectangle->size); |
151
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
144 | |
159
da7ebfcdd159
add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
145 | if (border) { |
169
6e6717d9c776
improve "polymorphic" typing of shaders
Mike Becker <universe@uap-core.de>
parents:
168
diff
changeset
|
146 | asc_shader_upload_float(rect_shader->thickness, rectangle->thickness); |
6e6717d9c776
improve "polymorphic" typing of shaders
Mike Becker <universe@uap-core.de>
parents:
168
diff
changeset
|
147 | asc_shader_upload_col4f(rect_shader->border_color, rectangle->border_color); |
158
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
151
diff
changeset
|
148 | } |
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
151
diff
changeset
|
149 | if (round) { |
169
6e6717d9c776
improve "polymorphic" typing of shaders
Mike Becker <universe@uap-core.de>
parents:
168
diff
changeset
|
150 | asc_shader_upload_float(rect_shader->radius, rectangle->radius); |
151
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
151 | } |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
152 | |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
153 | // Draw mesh |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
154 | asc_mesh_draw_triangle_strip(&rectangle->mesh); |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
155 | } |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
156 | |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
157 | AscSceneNode *asc_rectangle_create(struct asc_rectangle_create_args args) { |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
158 | AscRectangle *rectangle = cxZallocDefault(sizeof(AscRectangle)); |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
159 | |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
160 | if (args.bounds.size.width + args.bounds.size.height > 0) { |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
161 | rectangle->node.position.x = (float) args.bounds.pos.x; |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
162 | rectangle->node.position.y = (float) args.bounds.pos.y; |
167
8e6a661c87db
add functions to upload common uniforms
Mike Becker <universe@uap-core.de>
parents:
163
diff
changeset
|
163 | rectangle->size.width = (float) args.bounds.size.width; |
8e6a661c87db
add functions to upload common uniforms
Mike Becker <universe@uap-core.de>
parents:
163
diff
changeset
|
164 | rectangle->size.height = (float) args.bounds.size.height; |
151
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
165 | } else { |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
166 | rectangle->node.position.x = (float) args.x; |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
167 | rectangle->node.position.y = (float) args.y; |
167
8e6a661c87db
add functions to upload common uniforms
Mike Becker <universe@uap-core.de>
parents:
163
diff
changeset
|
168 | rectangle->size.width = (float) args.width; |
8e6a661c87db
add functions to upload common uniforms
Mike Becker <universe@uap-core.de>
parents:
163
diff
changeset
|
169 | rectangle->size.height = (float) args.height; |
151
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
170 | } |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
171 | |
158
f650994ec543
implement rounded corners
Mike Becker <universe@uap-core.de>
parents:
151
diff
changeset
|
172 | rectangle->radius = (float)args.radius; |
151
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
173 | rectangle->color = asc_col_itof(asc_context.ink); |
159
da7ebfcdd159
add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
174 | rectangle->border_color = asc_col_itof(args.border_color); |
da7ebfcdd159
add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
175 | rectangle->filled = args.filled; |
da7ebfcdd159
add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
176 | if (!args.filled && args.thickness == 0) { |
da7ebfcdd159
add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
177 | // when we do not fill the rectangle, we need a border |
da7ebfcdd159
add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
178 | rectangle->thickness = 1; |
da7ebfcdd159
add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
179 | } else { |
da7ebfcdd159
add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
180 | rectangle->thickness = args.thickness; |
da7ebfcdd159
add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
181 | } |
da7ebfcdd159
add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
182 | if (!args.filled && asc_col4_test_zero(args.border_color)) { |
da7ebfcdd159
add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
183 | // convenience fallback: |
da7ebfcdd159
add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
184 | // when we are drawing an outline but have no explicit border color, |
da7ebfcdd159
add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
185 | // use the active ink |
da7ebfcdd159
add combination of filled rectangle with a border
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
186 | rectangle->border_color = rectangle->color; |
151
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
187 | } |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
188 | |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
189 | AscSceneNode *node = &rectangle->node; |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
190 | node->position.z = ASC_SCENE_2D_DEPTH_OFFSET; |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
191 | node->scale = asc_vec3f_one; |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
192 | node->render_group = asc_context.ink.alpha < 255 |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
193 | ? ASC_RENDER_GROUP_2D_BLEND |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
194 | : ASC_RENDER_GROUP_2D_OPAQUE; |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
195 | node->update_func = asc_rectangle_update; |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
196 | node->destroy_func = asc_rectangle_destroy; |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
197 | node->draw_func = asc_rectangle_draw; |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
198 | asc_node_update(node); |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
199 | return node; |
42960d0c879b
adds first basic rectangle shader
Mike Becker <universe@uap-core.de>
parents:
143
diff
changeset
|
200 | } |
173
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
201 | |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
202 | static void asc_ellipsis_destroy(AscSceneNode *node) { |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
203 | asc_ptr_cast(AscEllipsis, ellipsis, node); |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
204 | asc_mesh_destroy(&ellipsis->mesh); |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
205 | } |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
206 | |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
207 | static void asc_ellipsis_update(AscSceneNode *node) { |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
208 | asc_ptr_cast(AscEllipsis, ellipsis, node); |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
209 | asc_vec2f size = asc_vec2f_scale(ellipsis->radii, 2); |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
210 | asc_mesh_plane_2d(&ellipsis->mesh, .size = size, .uv_scale = size); |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
211 | } |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
212 | |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
213 | |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
214 | typedef struct asc_ellipsis_shader_s { |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
215 | AscShaderProgram program; |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
216 | asc_uniform_loc color; |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
217 | asc_uniform_loc border_color; |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
218 | asc_uniform_loc radii; |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
219 | asc_uniform_loc thickness; |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
220 | } AscEllipsisShader; |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
221 | |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
222 | #define ASC_ELLIPSIS_SHADER_FLAG_FILL 1 |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
223 | #define ASC_ELLIPSIS_SHADER_FLAG_BORDER 2 |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
224 | |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
225 | static AscShaderProgram *asc_ellipsis_shader_create(int flags) { |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
226 | AscShaderCodes codes; |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
227 | const char * const defines[] = { |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
228 | "#define FILL\n", |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
229 | "#define BORDER\n" |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
230 | }; |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
231 | if (asc_shader_load_code_files((AscShaderCodeInfo){ |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
232 | .files.vtx = "sprite_vtx.glsl", |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
233 | .files.frag = "ellipsis_frag.glsl", |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
234 | .defines.frag_list = defines, |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
235 | .defines.frag_list_select = flags |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
236 | }, &codes)) { |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
237 | asc_error("Loading ellipsis shader failed."); |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
238 | return NULL; |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
239 | } |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
240 | AscShaderProgram *shader = asc_shader_create(codes, sizeof(AscRectangleShader)); |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
241 | if (asc_shader_invalid(shader)) { |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
242 | asc_shader_free_codes(codes); |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
243 | return shader; |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
244 | } |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
245 | asc_ptr_cast(AscEllipsisShader, ellipsis_shader, shader); |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
246 | ellipsis_shader->radii = asc_shader_get_uniform_loc(shader, "radii"); |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
247 | if (asc_test_flag(flags, ASC_ELLIPSIS_SHADER_FLAG_FILL)) { |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
248 | ellipsis_shader->color = asc_shader_get_uniform_loc(shader, "color"); |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
249 | } else { |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
250 | ellipsis_shader->color = -1; |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
251 | } |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
252 | if (asc_test_flag(flags, ASC_ELLIPSIS_SHADER_FLAG_BORDER)) { |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
253 | ellipsis_shader->thickness = asc_shader_get_uniform_loc(shader, "thickness"); |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
254 | ellipsis_shader->border_color = asc_shader_get_uniform_loc(shader, "border_color"); |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
255 | } else { |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
256 | ellipsis_shader->thickness = -1; |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
257 | ellipsis_shader->border_color = -1; |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
258 | } |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
259 | asc_shader_free_codes(codes); |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
260 | |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
261 | asc_error_catch_all_gl(); |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
262 | |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
263 | return shader; |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
264 | } |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
265 | |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
266 | static void asc_ellipsis_draw(const AscCamera *camera, const AscSceneNode *node) { |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
267 | asc_cptr_cast(AscEllipsis, ellipsis, node); |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
268 | |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
269 | const bool filled = ellipsis->filled; |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
270 | const bool border = ellipsis->thickness > 0; |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
271 | |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
272 | // Compute shader flags |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
273 | int shader_flags = 0; |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
274 | if (filled) shader_flags |= ASC_ELLIPSIS_SHADER_FLAG_FILL; |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
275 | if (border) shader_flags |= ASC_ELLIPSIS_SHADER_FLAG_BORDER; |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
276 | |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
277 | // Lookup table for the shader ID |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
278 | const int shader_ids[] = { |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
279 | -1, // unused |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
280 | ASC_SHADER_ELLIPSIS_FILL, |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
281 | ASC_SHADER_ELLIPSIS_DRAW, |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
282 | ASC_SHADER_ELLIPSIS_FILL_BORDER, |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
283 | }; |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
284 | |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
285 | // Look up and activate shader |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
286 | const AscShaderProgram *shader = asc_shader_lookup_or_create( |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
287 | shader_ids[shader_flags], asc_ellipsis_shader_create, shader_flags); |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
288 | if (asc_shader_use(shader, camera)) return; |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
289 | asc_cptr_cast(AscEllipsisShader, ellipsis_shader, shader); |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
290 | |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
291 | // Upload uniforms |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
292 | asc_shader_upload_model_matrix(shader, node); |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
293 | |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
294 | if (filled) { |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
295 | asc_shader_upload_col4f(ellipsis_shader->color, ellipsis->color); |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
296 | } |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
297 | asc_shader_upload_vec2f(ellipsis_shader->radii, ellipsis->radii); |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
298 | |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
299 | if (border) { |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
300 | asc_shader_upload_float(ellipsis_shader->thickness, ellipsis->thickness); |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
301 | asc_shader_upload_col4f(ellipsis_shader->border_color, ellipsis->border_color); |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
302 | } |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
303 | |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
304 | // Draw mesh |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
305 | asc_mesh_draw_triangle_strip(&ellipsis->mesh); |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
306 | } |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
307 | |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
308 | AscSceneNode *asc_ellipsis_create(struct asc_ellipsis_create_args args) { |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
309 | AscEllipsis *ellipsis = cxZallocDefault(sizeof(AscEllipsis)); |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
310 | |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
311 | if (args.bounds.size.width + args.bounds.size.height > 0) { |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
312 | ellipsis->node.position.x = (float) args.bounds.pos.x; |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
313 | ellipsis->node.position.y = (float) args.bounds.pos.y; |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
314 | ellipsis->radii.x = (float) args.bounds.size.width / 2.f; |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
315 | ellipsis->radii.y = (float) args.bounds.size.height / 2.f; |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
316 | } else { |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
317 | const unsigned cx = ASC_NONZERO_OR(args.x, args.center.x); |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
318 | const unsigned cy = ASC_NONZERO_OR(args.y, args.center.y); |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
319 | const unsigned rx = ASC_NONZERO_OR(args.radius, args.radius_x); |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
320 | const unsigned ry = ASC_NONZERO_OR(args.radius, args.radius_y); |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
321 | ellipsis->node.position.x = (float) (cx-rx); |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
322 | ellipsis->node.position.y = (float) (cy-ry); |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
323 | ellipsis->radii.x = (float) rx; |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
324 | ellipsis->radii.y = (float) ry; |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
325 | } |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
326 | |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
327 | ellipsis->color = asc_col_itof(asc_context.ink); |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
328 | ellipsis->border_color = asc_col_itof(args.border_color); |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
329 | ellipsis->filled = args.filled; |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
330 | if (!args.filled && args.thickness == 0) { |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
331 | // when we do not fill the ellipsis, we need a border |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
332 | ellipsis->thickness = 1; |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
333 | } else { |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
334 | ellipsis->thickness = args.thickness; |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
335 | } |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
336 | if (!args.filled && asc_col4_test_zero(args.border_color)) { |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
337 | // convenience fallback: |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
338 | // when we are drawing an outline but have no explicit border color, |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
339 | // use the active ink |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
340 | ellipsis->border_color = ellipsis->color; |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
341 | } |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
342 | |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
343 | AscSceneNode *node = &ellipsis->node; |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
344 | node->position.z = ASC_SCENE_2D_DEPTH_OFFSET; |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
345 | node->scale = asc_vec3f_one; |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
346 | node->render_group = asc_context.ink.alpha < 255 |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
347 | ? ASC_RENDER_GROUP_2D_BLEND |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
348 | : ASC_RENDER_GROUP_2D_OPAQUE; |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
349 | node->update_func = asc_ellipsis_update; |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
350 | node->destroy_func = asc_ellipsis_destroy; |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
351 | node->draw_func = asc_ellipsis_draw; |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
352 | asc_node_update(node); |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
353 | return node; |
bd57fe3f6360
add ellipsis shader - resolves #385
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
354 | } |