Tue, 28 Oct 2025 22:03:06 +0100
fix that dependencies for tools are always checked
| 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: 
143diff
changeset | 30 | #include "ascension/constants.h" | 
| 
42960d0c879b
adds first basic rectangle shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 31 | #include "ascension/shader.h" | 
| 244 
ceab8a9f0366
add a frame to the main scene + implement the necessary asc_rectangle_set_bounds() function
 Mike Becker <universe@uap-core.de> parents: 
239diff
changeset | 32 | #include "ascension/util.h" | 
| 151 
42960d0c879b
adds first basic rectangle shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 33 | |
| 160 
80700db530ff
improve the combination of shader preprocessor flags
 Mike Becker <universe@uap-core.de> parents: 
159diff
changeset | 34 | #include <assert.h> | 
| 151 
42960d0c879b
adds first basic rectangle shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 35 | |
| 
42960d0c879b
adds first basic rectangle shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 36 | typedef struct asc_rectangle_shader_s { | 
| 
42960d0c879b
adds first basic rectangle shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 37 | AscShaderProgram program; | 
| 168 
f70569c49c24
add abstractions that allow removing dependencies to glew.h
 Mike Becker <universe@uap-core.de> parents: 
167diff
changeset | 38 | asc_uniform_loc color; | 
| 
f70569c49c24
add abstractions that allow removing dependencies to glew.h
 Mike Becker <universe@uap-core.de> parents: 
167diff
changeset | 39 | asc_uniform_loc border_color; | 
| 
f70569c49c24
add abstractions that allow removing dependencies to glew.h
 Mike Becker <universe@uap-core.de> parents: 
167diff
changeset | 40 | asc_uniform_loc size; | 
| 
f70569c49c24
add abstractions that allow removing dependencies to glew.h
 Mike Becker <universe@uap-core.de> parents: 
167diff
changeset | 41 | asc_uniform_loc thickness; | 
| 
f70569c49c24
add abstractions that allow removing dependencies to glew.h
 Mike Becker <universe@uap-core.de> parents: 
167diff
changeset | 42 | asc_uniform_loc radius; | 
| 151 
42960d0c879b
adds first basic rectangle shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 43 | } AscRectangleShader; | 
| 
42960d0c879b
adds first basic rectangle shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 44 | |
| 159 
da7ebfcdd159
add combination of filled rectangle with a border
 Mike Becker <universe@uap-core.de> parents: 
158diff
changeset | 45 | #define ASC_RECTANGLE_SHADER_FLAG_FILL 1 | 
| 
da7ebfcdd159
add combination of filled rectangle with a border
 Mike Becker <universe@uap-core.de> parents: 
158diff
changeset | 46 | #define ASC_RECTANGLE_SHADER_FLAG_ROUND 2 | 
| 
da7ebfcdd159
add combination of filled rectangle with a border
 Mike Becker <universe@uap-core.de> parents: 
158diff
changeset | 47 | #define ASC_RECTANGLE_SHADER_FLAG_BORDER 4 | 
| 158 
f650994ec543
implement rounded corners
 Mike Becker <universe@uap-core.de> parents: 
151diff
changeset | 48 | |
| 222 
2cb9a71df7a6
vastly deduplicate shader creation code
 Mike Becker <universe@uap-core.de> parents: 
221diff
changeset | 49 | static void asc_rectangle_shader_init(AscShaderProgram *shader, int flags) { | 
| 270 
3031d1bb5957
further improve names and docu of the uniform location init functions
 Mike Becker <universe@uap-core.de> parents: 
269diff
changeset | 50 | asc_shader_set_uniform_loc_by_name(shader, AscRectangleShader, size); | 
| 222 
2cb9a71df7a6
vastly deduplicate shader creation code
 Mike Becker <universe@uap-core.de> parents: 
221diff
changeset | 51 | if (asc_test_flag(flags, ASC_RECTANGLE_SHADER_FLAG_FILL)) { | 
| 270 
3031d1bb5957
further improve names and docu of the uniform location init functions
 Mike Becker <universe@uap-core.de> parents: 
269diff
changeset | 52 | asc_shader_set_uniform_loc_by_name(shader, AscRectangleShader, color); | 
| 222 
2cb9a71df7a6
vastly deduplicate shader creation code
 Mike Becker <universe@uap-core.de> parents: 
221diff
changeset | 53 | } | 
| 
2cb9a71df7a6
vastly deduplicate shader creation code
 Mike Becker <universe@uap-core.de> parents: 
221diff
changeset | 54 | if (asc_test_flag(flags, ASC_RECTANGLE_SHADER_FLAG_BORDER)) { | 
| 270 
3031d1bb5957
further improve names and docu of the uniform location init functions
 Mike Becker <universe@uap-core.de> parents: 
269diff
changeset | 55 | asc_shader_set_uniform_loc_by_name(shader, AscRectangleShader, border_color); | 
| 
3031d1bb5957
further improve names and docu of the uniform location init functions
 Mike Becker <universe@uap-core.de> parents: 
269diff
changeset | 56 | asc_shader_set_uniform_loc_by_name(shader, AscRectangleShader, thickness); | 
| 222 
2cb9a71df7a6
vastly deduplicate shader creation code
 Mike Becker <universe@uap-core.de> parents: 
221diff
changeset | 57 | } | 
| 
2cb9a71df7a6
vastly deduplicate shader creation code
 Mike Becker <universe@uap-core.de> parents: 
221diff
changeset | 58 | if (asc_test_flag(flags, ASC_RECTANGLE_SHADER_FLAG_ROUND)) { | 
| 270 
3031d1bb5957
further improve names and docu of the uniform location init functions
 Mike Becker <universe@uap-core.de> parents: 
269diff
changeset | 59 | asc_shader_set_uniform_loc_by_name(shader, AscRectangleShader, radius); | 
| 222 
2cb9a71df7a6
vastly deduplicate shader creation code
 Mike Becker <universe@uap-core.de> parents: 
221diff
changeset | 60 | } | 
| 
2cb9a71df7a6
vastly deduplicate shader creation code
 Mike Becker <universe@uap-core.de> parents: 
221diff
changeset | 61 | } | 
| 
2cb9a71df7a6
vastly deduplicate shader creation code
 Mike Becker <universe@uap-core.de> parents: 
221diff
changeset | 62 | |
| 158 
f650994ec543
implement rounded corners
 Mike Becker <universe@uap-core.de> parents: 
151diff
changeset | 63 | static AscShaderProgram *asc_rectangle_shader_create(int flags) { | 
| 223 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 64 | return asc_shader_create((AscShaderCodes){ | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 65 | .vtx = {.source_file = "sprite_vtx.glsl"}, | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 66 | .frag = { | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 67 | .source_file = "rectangle_frag.glsl", | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 68 | .preamble_code = (const char *[]) { | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 69 | "#define FILL", | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 70 | "#define ROUNDED_CORNERS", | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 71 | "#define BORDER" | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 72 | }, | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 73 | .preamble_code_flags = flags, | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 74 | }, | 
| 222 
2cb9a71df7a6
vastly deduplicate shader creation code
 Mike Becker <universe@uap-core.de> parents: 
221diff
changeset | 75 | }, sizeof(AscRectangleShader), asc_rectangle_shader_init, flags); | 
| 151 
42960d0c879b
adds first basic rectangle shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 76 | } | 
| 
42960d0c879b
adds first basic rectangle shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 77 | |
| 
42960d0c879b
adds first basic rectangle shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 78 | static void asc_rectangle_destroy(AscSceneNode *node) { | 
| 
42960d0c879b
adds first basic rectangle shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 79 | asc_ptr_cast(AscRectangle, rectangle, node); | 
| 
42960d0c879b
adds first basic rectangle shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 80 | asc_mesh_destroy(&rectangle->mesh); | 
| 
42960d0c879b
adds first basic rectangle shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 81 | } | 
| 
42960d0c879b
adds first basic rectangle shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 82 | |
| 
42960d0c879b
adds first basic rectangle shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 83 | static void asc_rectangle_update(AscSceneNode *node) { | 
| 
42960d0c879b
adds first basic rectangle shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 84 | asc_ptr_cast(AscRectangle, rectangle, node); | 
| 167 
8e6a661c87db
add functions to upload common uniforms
 Mike Becker <universe@uap-core.de> parents: 
163diff
changeset | 85 | 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: 
143diff
changeset | 86 | } | 
| 
42960d0c879b
adds first basic rectangle shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 87 | |
| 
42960d0c879b
adds first basic rectangle shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 88 | 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: 
168diff
changeset | 89 | asc_cptr_cast(AscRectangle, rectangle, node); | 
| 159 
da7ebfcdd159
add combination of filled rectangle with a border
 Mike Becker <universe@uap-core.de> parents: 
158diff
changeset | 90 | const bool filled = rectangle->filled; | 
| 158 
f650994ec543
implement rounded corners
 Mike Becker <universe@uap-core.de> parents: 
151diff
changeset | 91 | const bool round = rectangle->radius > 0; | 
| 159 
da7ebfcdd159
add combination of filled rectangle with a border
 Mike Becker <universe@uap-core.de> parents: 
158diff
changeset | 92 | const bool border = rectangle->thickness > 0; | 
| 158 
f650994ec543
implement rounded corners
 Mike Becker <universe@uap-core.de> parents: 
151diff
changeset | 93 | |
| 
f650994ec543
implement rounded corners
 Mike Becker <universe@uap-core.de> parents: 
151diff
changeset | 94 | // Compute shader flags | 
| 232 
4c43b9de3294
improve the conditional setting of flags
 Mike Becker <universe@uap-core.de> parents: 
228diff
changeset | 95 | int flags = 0; | 
| 
4c43b9de3294
improve the conditional setting of flags
 Mike Becker <universe@uap-core.de> parents: 
228diff
changeset | 96 | asc_set_flag_if(flags, ASC_RECTANGLE_SHADER_FLAG_FILL, filled); | 
| 
4c43b9de3294
improve the conditional setting of flags
 Mike Becker <universe@uap-core.de> parents: 
228diff
changeset | 97 | asc_set_flag_if(flags, ASC_RECTANGLE_SHADER_FLAG_ROUND, round); | 
| 
4c43b9de3294
improve the conditional setting of flags
 Mike Becker <universe@uap-core.de> parents: 
228diff
changeset | 98 | asc_set_flag_if(flags, ASC_RECTANGLE_SHADER_FLAG_BORDER, border); | 
| 151 
42960d0c879b
adds first basic rectangle shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 99 | |
| 226 
18327d2df79d
simplify how pre-defined shader IDs work
 Mike Becker <universe@uap-core.de> parents: 
223diff
changeset | 100 | // Look up and activate the shader | 
| 239 
3b78ad115ccd
remove the possibility of non-lazy-initializable shader programs
 Mike Becker <universe@uap-core.de> parents: 
232diff
changeset | 101 | const AscShaderProgram *shader = asc_shader_lookup( | 
| 228 
ecda73508be6
add asc_create_flags() utility function
 Mike Becker <universe@uap-core.de> parents: 
226diff
changeset | 102 | ASC_SHADER_RECTANGLE(flags), | 
| 
ecda73508be6
add asc_create_flags() utility function
 Mike Becker <universe@uap-core.de> parents: 
226diff
changeset | 103 | asc_rectangle_shader_create, flags | 
| 226 
18327d2df79d
simplify how pre-defined shader IDs work
 Mike Becker <universe@uap-core.de> parents: 
223diff
changeset | 104 | ); | 
| 169 
6e6717d9c776
improve "polymorphic" typing of shaders
 Mike Becker <universe@uap-core.de> parents: 
168diff
changeset | 105 | if (asc_shader_use(shader, camera)) return; | 
| 
6e6717d9c776
improve "polymorphic" typing of shaders
 Mike Becker <universe@uap-core.de> parents: 
168diff
changeset | 106 | asc_cptr_cast(AscRectangleShader, rect_shader, shader); | 
| 151 
42960d0c879b
adds first basic rectangle shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 107 | |
| 
42960d0c879b
adds first basic rectangle shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 108 | // Upload uniforms | 
| 169 
6e6717d9c776
improve "polymorphic" typing of shaders
 Mike Becker <universe@uap-core.de> parents: 
168diff
changeset | 109 | asc_shader_upload_model_matrix(shader, node); | 
| 151 
42960d0c879b
adds first basic rectangle shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 110 | |
| 159 
da7ebfcdd159
add combination of filled rectangle with a border
 Mike Becker <universe@uap-core.de> parents: 
158diff
changeset | 111 | if (filled) { | 
| 256 
60014484121c
remove the asc_col4i datatype in favor of a unified asc_color type
 Mike Becker <universe@uap-core.de> parents: 
251diff
changeset | 112 | asc_shader_upload_color(rect_shader->color, rectangle->color); | 
| 159 
da7ebfcdd159
add combination of filled rectangle with a border
 Mike Becker <universe@uap-core.de> parents: 
158diff
changeset | 113 | } | 
| 169 
6e6717d9c776
improve "polymorphic" typing of shaders
 Mike Becker <universe@uap-core.de> parents: 
168diff
changeset | 114 | asc_shader_upload_vec2f(rect_shader->size, rectangle->size); | 
| 151 
42960d0c879b
adds first basic rectangle shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 115 | |
| 159 
da7ebfcdd159
add combination of filled rectangle with a border
 Mike Becker <universe@uap-core.de> parents: 
158diff
changeset | 116 | if (border) { | 
| 169 
6e6717d9c776
improve "polymorphic" typing of shaders
 Mike Becker <universe@uap-core.de> parents: 
168diff
changeset | 117 | asc_shader_upload_float(rect_shader->thickness, rectangle->thickness); | 
| 256 
60014484121c
remove the asc_col4i datatype in favor of a unified asc_color type
 Mike Becker <universe@uap-core.de> parents: 
251diff
changeset | 118 | asc_shader_upload_color(rect_shader->border_color, rectangle->border_color); | 
| 158 
f650994ec543
implement rounded corners
 Mike Becker <universe@uap-core.de> parents: 
151diff
changeset | 119 | } | 
| 
f650994ec543
implement rounded corners
 Mike Becker <universe@uap-core.de> parents: 
151diff
changeset | 120 | if (round) { | 
| 169 
6e6717d9c776
improve "polymorphic" typing of shaders
 Mike Becker <universe@uap-core.de> parents: 
168diff
changeset | 121 | asc_shader_upload_float(rect_shader->radius, rectangle->radius); | 
| 151 
42960d0c879b
adds first basic rectangle shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 122 | } | 
| 
42960d0c879b
adds first basic rectangle shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 123 | |
| 
42960d0c879b
adds first basic rectangle shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 124 | // Draw mesh | 
| 
42960d0c879b
adds first basic rectangle shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 125 | asc_mesh_draw_triangle_strip(&rectangle->mesh); | 
| 
42960d0c879b
adds first basic rectangle shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 126 | } | 
| 
42960d0c879b
adds first basic rectangle shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 127 | |
| 
42960d0c879b
adds first basic rectangle shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 128 | AscSceneNode *asc_rectangle_create(struct asc_rectangle_create_args args) { | 
| 
42960d0c879b
adds first basic rectangle shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 129 | AscRectangle *rectangle = cxZallocDefault(sizeof(AscRectangle)); | 
| 
42960d0c879b
adds first basic rectangle shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 130 | |
| 250 
d766b4f033d7
remove "bounds" creation argument for rectangles
 Mike Becker <universe@uap-core.de> parents: 
244diff
changeset | 131 | float pos_x = (float) args.x; | 
| 
d766b4f033d7
remove "bounds" creation argument for rectangles
 Mike Becker <universe@uap-core.de> parents: 
244diff
changeset | 132 | float pos_y = (float) args.y; | 
| 
d766b4f033d7
remove "bounds" creation argument for rectangles
 Mike Becker <universe@uap-core.de> parents: 
244diff
changeset | 133 | rectangle->size.width = (float) args.width; | 
| 
d766b4f033d7
remove "bounds" creation argument for rectangles
 Mike Becker <universe@uap-core.de> parents: 
244diff
changeset | 134 | rectangle->size.height = (float) args.height; | 
| 151 
42960d0c879b
adds first basic rectangle shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 135 | |
| 158 
f650994ec543
implement rounded corners
 Mike Becker <universe@uap-core.de> parents: 
151diff
changeset | 136 | rectangle->radius = (float)args.radius; | 
| 159 
da7ebfcdd159
add combination of filled rectangle with a border
 Mike Becker <universe@uap-core.de> parents: 
158diff
changeset | 137 | rectangle->filled = args.filled; | 
| 
da7ebfcdd159
add combination of filled rectangle with a border
 Mike Becker <universe@uap-core.de> parents: 
158diff
changeset | 138 | if (!args.filled && args.thickness == 0) { | 
| 
da7ebfcdd159
add combination of filled rectangle with a border
 Mike Becker <universe@uap-core.de> parents: 
158diff
changeset | 139 | // 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: 
158diff
changeset | 140 | rectangle->thickness = 1; | 
| 
da7ebfcdd159
add combination of filled rectangle with a border
 Mike Becker <universe@uap-core.de> parents: 
158diff
changeset | 141 | } else { | 
| 
da7ebfcdd159
add combination of filled rectangle with a border
 Mike Becker <universe@uap-core.de> parents: 
158diff
changeset | 142 | rectangle->thickness = args.thickness; | 
| 
da7ebfcdd159
add combination of filled rectangle with a border
 Mike Becker <universe@uap-core.de> parents: 
158diff
changeset | 143 | } | 
| 214 
9d460888a83e
remove global active font and color (also fixes #693)
 Mike Becker <universe@uap-core.de> parents: 
207diff
changeset | 144 | |
| 175 
e5544920377e
improve macros in datatypes.h - fixes #692
 Mike Becker <universe@uap-core.de> parents: 
173diff
changeset | 145 | if (!args.filled && asc_memcmpz(&args.border_color, sizeof(args.border_color))) { | 
| 159 
da7ebfcdd159
add combination of filled rectangle with a border
 Mike Becker <universe@uap-core.de> parents: 
158diff
changeset | 146 | // convenience fallback: | 
| 
da7ebfcdd159
add combination of filled rectangle with a border
 Mike Becker <universe@uap-core.de> parents: 
158diff
changeset | 147 | // when we are drawing an outline but have no explicit border color, | 
| 214 
9d460888a83e
remove global active font and color (also fixes #693)
 Mike Becker <universe@uap-core.de> parents: 
207diff
changeset | 148 | // use the main color | 
| 
9d460888a83e
remove global active font and color (also fixes #693)
 Mike Becker <universe@uap-core.de> parents: 
207diff
changeset | 149 | args.border_color = args.color; | 
| 151 
42960d0c879b
adds first basic rectangle shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 150 | } | 
| 256 
60014484121c
remove the asc_col4i datatype in favor of a unified asc_color type
 Mike Becker <universe@uap-core.de> parents: 
251diff
changeset | 151 | rectangle->color = args.color; | 
| 
60014484121c
remove the asc_col4i datatype in favor of a unified asc_color type
 Mike Becker <universe@uap-core.de> parents: 
251diff
changeset | 152 | rectangle->border_color = args.border_color; | 
| 151 
42960d0c879b
adds first basic rectangle shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 153 | |
| 207 
4d184a8706b1
add asc_scene_node_init() - fixes #695
 Mike Becker <universe@uap-core.de> parents: 
206diff
changeset | 154 | asc_ptr_cast(AscSceneNode, node, rectangle); | 
| 
4d184a8706b1
add asc_scene_node_init() - fixes #695
 Mike Becker <universe@uap-core.de> parents: 
206diff
changeset | 155 | asc_scene_node_init(node, | 
| 
4d184a8706b1
add asc_scene_node_init() - fixes #695
 Mike Becker <universe@uap-core.de> parents: 
206diff
changeset | 156 | ASC_SCENE_NODE_FUNCS(asc_rectangle), | 
| 
4d184a8706b1
add asc_scene_node_init() - fixes #695
 Mike Becker <universe@uap-core.de> parents: 
206diff
changeset | 157 | .pos2d = ASC_VEC2I(pos_x, pos_y), | 
| 215 
a7c8e1727971
use new point-of-origin for 2d primitives
 Mike Becker <universe@uap-core.de> parents: 
214diff
changeset | 158 | .origin2d = ASC_VEC2I(args.origin_x, args.origin_y), | 
| 256 
60014484121c
remove the asc_col4i datatype in favor of a unified asc_color type
 Mike Becker <universe@uap-core.de> parents: 
251diff
changeset | 159 | .render_group = (args.filled && args.color.alpha < 1) || args.border_color.alpha < 1 | 
| 151 
42960d0c879b
adds first basic rectangle shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 160 | ? ASC_RENDER_GROUP_2D_BLEND | 
| 207 
4d184a8706b1
add asc_scene_node_init() - fixes #695
 Mike Becker <universe@uap-core.de> parents: 
206diff
changeset | 161 | : ASC_RENDER_GROUP_2D_OPAQUE | 
| 
4d184a8706b1
add asc_scene_node_init() - fixes #695
 Mike Becker <universe@uap-core.de> parents: 
206diff
changeset | 162 | ); | 
| 151 
42960d0c879b
adds first basic rectangle shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 163 | return node; | 
| 
42960d0c879b
adds first basic rectangle shader
 Mike Becker <universe@uap-core.de> parents: 
143diff
changeset | 164 | } | 
| 173 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 165 | |
| 244 
ceab8a9f0366
add a frame to the main scene + implement the necessary asc_rectangle_set_bounds() function
 Mike Becker <universe@uap-core.de> parents: 
239diff
changeset | 166 | void asc_rectangle_set_bounds(AscRectangle *rect, asc_rect bounds) { | 
| 251 
2e2d4c3bf1cd
fix that the origin was not applied in asc_rectangle_set_bounds()
 Mike Becker <universe@uap-core.de> parents: 
250diff
changeset | 167 | float x = (float) bounds.pos.x + rect->node.origin.x; | 
| 
2e2d4c3bf1cd
fix that the origin was not applied in asc_rectangle_set_bounds()
 Mike Becker <universe@uap-core.de> parents: 
250diff
changeset | 168 | float y = (float) bounds.pos.y + rect->node.origin.y; | 
| 244 
ceab8a9f0366
add a frame to the main scene + implement the necessary asc_rectangle_set_bounds() function
 Mike Becker <universe@uap-core.de> parents: 
239diff
changeset | 169 | float width = (float) bounds.size.width; | 
| 
ceab8a9f0366
add a frame to the main scene + implement the necessary asc_rectangle_set_bounds() function
 Mike Becker <universe@uap-core.de> parents: 
239diff
changeset | 170 | float height = (float) bounds.size.height; | 
| 
ceab8a9f0366
add a frame to the main scene + implement the necessary asc_rectangle_set_bounds() function
 Mike Becker <universe@uap-core.de> parents: 
239diff
changeset | 171 | bool update_transform = false; | 
| 
ceab8a9f0366
add a frame to the main scene + implement the necessary asc_rectangle_set_bounds() function
 Mike Becker <universe@uap-core.de> parents: 
239diff
changeset | 172 | bool update_mesh = false; | 
| 
ceab8a9f0366
add a frame to the main scene + implement the necessary asc_rectangle_set_bounds() function
 Mike Becker <universe@uap-core.de> parents: 
239diff
changeset | 173 | update_transform |= asc_util_check_and_set(rect->node.position.x, x); | 
| 
ceab8a9f0366
add a frame to the main scene + implement the necessary asc_rectangle_set_bounds() function
 Mike Becker <universe@uap-core.de> parents: 
239diff
changeset | 174 | update_transform |= asc_util_check_and_set(rect->node.position.y, y); | 
| 
ceab8a9f0366
add a frame to the main scene + implement the necessary asc_rectangle_set_bounds() function
 Mike Becker <universe@uap-core.de> parents: 
239diff
changeset | 175 | update_mesh |= asc_util_check_and_set(rect->size.width, width); | 
| 
ceab8a9f0366
add a frame to the main scene + implement the necessary asc_rectangle_set_bounds() function
 Mike Becker <universe@uap-core.de> parents: 
239diff
changeset | 176 | update_mesh |= asc_util_check_and_set(rect->size.height, height); | 
| 
ceab8a9f0366
add a frame to the main scene + implement the necessary asc_rectangle_set_bounds() function
 Mike Becker <universe@uap-core.de> parents: 
239diff
changeset | 177 | if (update_mesh) { | 
| 
ceab8a9f0366
add a frame to the main scene + implement the necessary asc_rectangle_set_bounds() function
 Mike Becker <universe@uap-core.de> parents: 
239diff
changeset | 178 | asc_scene_node_update(&rect->node); | 
| 
ceab8a9f0366
add a frame to the main scene + implement the necessary asc_rectangle_set_bounds() function
 Mike Becker <universe@uap-core.de> parents: 
239diff
changeset | 179 | } | 
| 
ceab8a9f0366
add a frame to the main scene + implement the necessary asc_rectangle_set_bounds() function
 Mike Becker <universe@uap-core.de> parents: 
239diff
changeset | 180 | if (update_transform) { | 
| 
ceab8a9f0366
add a frame to the main scene + implement the necessary asc_rectangle_set_bounds() function
 Mike Becker <universe@uap-core.de> parents: 
239diff
changeset | 181 | asc_scene_node_update_transform(&rect->node); | 
| 
ceab8a9f0366
add a frame to the main scene + implement the necessary asc_rectangle_set_bounds() function
 Mike Becker <universe@uap-core.de> parents: 
239diff
changeset | 182 | } | 
| 
ceab8a9f0366
add a frame to the main scene + implement the necessary asc_rectangle_set_bounds() function
 Mike Becker <universe@uap-core.de> parents: 
239diff
changeset | 183 | } | 
| 
ceab8a9f0366
add a frame to the main scene + implement the necessary asc_rectangle_set_bounds() function
 Mike Becker <universe@uap-core.de> parents: 
239diff
changeset | 184 | |
| 
ceab8a9f0366
add a frame to the main scene + implement the necessary asc_rectangle_set_bounds() function
 Mike Becker <universe@uap-core.de> parents: 
239diff
changeset | 185 | |
| 173 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 186 | static void asc_ellipsis_destroy(AscSceneNode *node) { | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 187 | asc_ptr_cast(AscEllipsis, ellipsis, node); | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 188 | asc_mesh_destroy(&ellipsis->mesh); | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 189 | } | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 190 | |
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 191 | static void asc_ellipsis_update(AscSceneNode *node) { | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 192 | asc_ptr_cast(AscEllipsis, ellipsis, node); | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 193 | asc_vec2f size = asc_vec2f_scale(ellipsis->radii, 2); | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 194 | asc_mesh_plane_2d(&ellipsis->mesh, .size = size, .uv_scale = size); | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 195 | } | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 196 | |
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 197 | |
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 198 | typedef struct asc_ellipsis_shader_s { | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 199 | AscShaderProgram program; | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 200 | asc_uniform_loc color; | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 201 | asc_uniform_loc border_color; | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 202 | asc_uniform_loc radii; | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 203 | asc_uniform_loc thickness; | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 204 | } AscEllipsisShader; | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 205 | |
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 206 | #define ASC_ELLIPSIS_SHADER_FLAG_FILL 1 | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 207 | #define ASC_ELLIPSIS_SHADER_FLAG_BORDER 2 | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 208 | |
| 222 
2cb9a71df7a6
vastly deduplicate shader creation code
 Mike Becker <universe@uap-core.de> parents: 
221diff
changeset | 209 | static void asc_ellipsis_shader_init(AscShaderProgram *shader, int flags) { | 
| 270 
3031d1bb5957
further improve names and docu of the uniform location init functions
 Mike Becker <universe@uap-core.de> parents: 
269diff
changeset | 210 | asc_shader_set_uniform_loc_by_name(shader, AscEllipsisShader, radii); | 
| 222 
2cb9a71df7a6
vastly deduplicate shader creation code
 Mike Becker <universe@uap-core.de> parents: 
221diff
changeset | 211 | if (asc_test_flag(flags, ASC_ELLIPSIS_SHADER_FLAG_FILL)) { | 
| 270 
3031d1bb5957
further improve names and docu of the uniform location init functions
 Mike Becker <universe@uap-core.de> parents: 
269diff
changeset | 212 | asc_shader_set_uniform_loc_by_name(shader, AscEllipsisShader, color); | 
| 222 
2cb9a71df7a6
vastly deduplicate shader creation code
 Mike Becker <universe@uap-core.de> parents: 
221diff
changeset | 213 | } | 
| 
2cb9a71df7a6
vastly deduplicate shader creation code
 Mike Becker <universe@uap-core.de> parents: 
221diff
changeset | 214 | if (asc_test_flag(flags, ASC_ELLIPSIS_SHADER_FLAG_BORDER)) { | 
| 270 
3031d1bb5957
further improve names and docu of the uniform location init functions
 Mike Becker <universe@uap-core.de> parents: 
269diff
changeset | 215 | asc_shader_set_uniform_loc_by_name(shader, AscEllipsisShader, thickness); | 
| 
3031d1bb5957
further improve names and docu of the uniform location init functions
 Mike Becker <universe@uap-core.de> parents: 
269diff
changeset | 216 | asc_shader_set_uniform_loc_by_name(shader, AscEllipsisShader, border_color); | 
| 222 
2cb9a71df7a6
vastly deduplicate shader creation code
 Mike Becker <universe@uap-core.de> parents: 
221diff
changeset | 217 | } | 
| 
2cb9a71df7a6
vastly deduplicate shader creation code
 Mike Becker <universe@uap-core.de> parents: 
221diff
changeset | 218 | } | 
| 
2cb9a71df7a6
vastly deduplicate shader creation code
 Mike Becker <universe@uap-core.de> parents: 
221diff
changeset | 219 | |
| 173 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 220 | static AscShaderProgram *asc_ellipsis_shader_create(int flags) { | 
| 223 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 221 | return asc_shader_create((AscShaderCodes){ | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 222 | .vtx = {.source_file = "sprite_vtx.glsl"}, | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 223 | .frag = { | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 224 | .source_file = "ellipsis_frag.glsl", | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 225 | .preamble_code = (const char *[]) { | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 226 | "#define FILL", | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 227 | "#define BORDER" | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 228 | }, | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 229 | .preamble_code_flags = flags, | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 230 | }, | 
| 222 
2cb9a71df7a6
vastly deduplicate shader creation code
 Mike Becker <universe@uap-core.de> parents: 
221diff
changeset | 231 | }, sizeof(AscEllipsisShader), asc_ellipsis_shader_init, flags); | 
| 173 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 232 | } | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 233 | |
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 234 | static void asc_ellipsis_draw(const AscCamera *camera, const AscSceneNode *node) { | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 235 | asc_cptr_cast(AscEllipsis, ellipsis, node); | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 236 | |
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 237 | const bool filled = ellipsis->filled; | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 238 | const bool border = ellipsis->thickness > 0; | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 239 | |
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 240 | // Compute shader flags | 
| 232 
4c43b9de3294
improve the conditional setting of flags
 Mike Becker <universe@uap-core.de> parents: 
228diff
changeset | 241 | int flags = 0; | 
| 
4c43b9de3294
improve the conditional setting of flags
 Mike Becker <universe@uap-core.de> parents: 
228diff
changeset | 242 | asc_set_flag_if(flags, ASC_ELLIPSIS_SHADER_FLAG_FILL, filled); | 
| 
4c43b9de3294
improve the conditional setting of flags
 Mike Becker <universe@uap-core.de> parents: 
228diff
changeset | 243 | asc_set_flag_if(flags, ASC_ELLIPSIS_SHADER_FLAG_BORDER, border); | 
| 173 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 244 | |
| 226 
18327d2df79d
simplify how pre-defined shader IDs work
 Mike Becker <universe@uap-core.de> parents: 
223diff
changeset | 245 | // Look up and activate the shader | 
| 239 
3b78ad115ccd
remove the possibility of non-lazy-initializable shader programs
 Mike Becker <universe@uap-core.de> parents: 
232diff
changeset | 246 | const AscShaderProgram *shader = asc_shader_lookup( | 
| 232 
4c43b9de3294
improve the conditional setting of flags
 Mike Becker <universe@uap-core.de> parents: 
228diff
changeset | 247 | ASC_SHADER_ELLIPSIS(flags), | 
| 
4c43b9de3294
improve the conditional setting of flags
 Mike Becker <universe@uap-core.de> parents: 
228diff
changeset | 248 | asc_ellipsis_shader_create, flags | 
| 226 
18327d2df79d
simplify how pre-defined shader IDs work
 Mike Becker <universe@uap-core.de> parents: 
223diff
changeset | 249 | ); | 
| 173 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 250 | if (asc_shader_use(shader, camera)) return; | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 251 | asc_cptr_cast(AscEllipsisShader, ellipsis_shader, shader); | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 252 | |
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 253 | // Upload uniforms | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 254 | asc_shader_upload_model_matrix(shader, node); | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 255 | |
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 256 | if (filled) { | 
| 256 
60014484121c
remove the asc_col4i datatype in favor of a unified asc_color type
 Mike Becker <universe@uap-core.de> parents: 
251diff
changeset | 257 | asc_shader_upload_color(ellipsis_shader->color, ellipsis->color); | 
| 173 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 258 | } | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 259 | asc_shader_upload_vec2f(ellipsis_shader->radii, ellipsis->radii); | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 260 | |
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 261 | if (border) { | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 262 | asc_shader_upload_float(ellipsis_shader->thickness, ellipsis->thickness); | 
| 256 
60014484121c
remove the asc_col4i datatype in favor of a unified asc_color type
 Mike Becker <universe@uap-core.de> parents: 
251diff
changeset | 263 | asc_shader_upload_color(ellipsis_shader->border_color, ellipsis->border_color); | 
| 173 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 264 | } | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 265 | |
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 266 | // Draw mesh | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 267 | asc_mesh_draw_triangle_strip(&ellipsis->mesh); | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 268 | } | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 269 | |
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 270 | AscSceneNode *asc_ellipsis_create(struct asc_ellipsis_create_args args) { | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 271 | AscEllipsis *ellipsis = cxZallocDefault(sizeof(AscEllipsis)); | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 272 | |
| 189 
2c063b225183
remove separate vectors for position, rotation, scale from scene node
 Mike Becker <universe@uap-core.de> parents: 
175diff
changeset | 273 | float pos_x, pos_y; | 
| 173 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 274 | if (args.bounds.size.width + args.bounds.size.height > 0) { | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 275 | ellipsis->radii.x = (float) args.bounds.size.width / 2.f; | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 276 | ellipsis->radii.y = (float) args.bounds.size.height / 2.f; | 
| 215 
a7c8e1727971
use new point-of-origin for 2d primitives
 Mike Becker <universe@uap-core.de> parents: 
214diff
changeset | 277 | pos_x = (float) args.bounds.pos.x + ellipsis->radii.x; | 
| 
a7c8e1727971
use new point-of-origin for 2d primitives
 Mike Becker <universe@uap-core.de> parents: 
214diff
changeset | 278 | pos_y = (float) args.bounds.pos.y + ellipsis->radii.y; | 
| 173 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 279 | } else { | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 280 | const unsigned cx = ASC_NONZERO_OR(args.x, args.center.x); | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 281 | const unsigned cy = ASC_NONZERO_OR(args.y, args.center.y); | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 282 | const unsigned rx = ASC_NONZERO_OR(args.radius, args.radius_x); | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 283 | const unsigned ry = ASC_NONZERO_OR(args.radius, args.radius_y); | 
| 215 
a7c8e1727971
use new point-of-origin for 2d primitives
 Mike Becker <universe@uap-core.de> parents: 
214diff
changeset | 284 | pos_x = (float) cx; | 
| 
a7c8e1727971
use new point-of-origin for 2d primitives
 Mike Becker <universe@uap-core.de> parents: 
214diff
changeset | 285 | pos_y = (float) cy; | 
| 173 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 286 | ellipsis->radii.x = (float) rx; | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 287 | ellipsis->radii.y = (float) ry; | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 288 | } | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 289 | |
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 290 | ellipsis->filled = args.filled; | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 291 | if (!args.filled && args.thickness == 0) { | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 292 | // when we do not fill the ellipsis, we need a border | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 293 | ellipsis->thickness = 1; | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 294 | } else { | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 295 | ellipsis->thickness = args.thickness; | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 296 | } | 
| 214 
9d460888a83e
remove global active font and color (also fixes #693)
 Mike Becker <universe@uap-core.de> parents: 
207diff
changeset | 297 | |
| 256 
60014484121c
remove the asc_col4i datatype in favor of a unified asc_color type
 Mike Becker <universe@uap-core.de> parents: 
251diff
changeset | 298 | if (!args.filled && asc_memcmpz(&args.border_color, sizeof(asc_color))) { | 
| 173 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 299 | // convenience fallback: | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 300 | // when we are drawing an outline but have no explicit border color, | 
| 214 
9d460888a83e
remove global active font and color (also fixes #693)
 Mike Becker <universe@uap-core.de> parents: 
207diff
changeset | 301 | // use the main color | 
| 
9d460888a83e
remove global active font and color (also fixes #693)
 Mike Becker <universe@uap-core.de> parents: 
207diff
changeset | 302 | args.border_color = args.color; | 
| 173 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 303 | } | 
| 256 
60014484121c
remove the asc_col4i datatype in favor of a unified asc_color type
 Mike Becker <universe@uap-core.de> parents: 
251diff
changeset | 304 | ellipsis->color = args.color; | 
| 
60014484121c
remove the asc_col4i datatype in favor of a unified asc_color type
 Mike Becker <universe@uap-core.de> parents: 
251diff
changeset | 305 | ellipsis->border_color = args.border_color; | 
| 173 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 306 | |
| 207 
4d184a8706b1
add asc_scene_node_init() - fixes #695
 Mike Becker <universe@uap-core.de> parents: 
206diff
changeset | 307 | asc_ptr_cast(AscSceneNode, node, ellipsis); | 
| 
4d184a8706b1
add asc_scene_node_init() - fixes #695
 Mike Becker <universe@uap-core.de> parents: 
206diff
changeset | 308 | asc_scene_node_init(node, | 
| 
4d184a8706b1
add asc_scene_node_init() - fixes #695
 Mike Becker <universe@uap-core.de> parents: 
206diff
changeset | 309 | ASC_SCENE_NODE_FUNCS(asc_ellipsis), | 
| 
4d184a8706b1
add asc_scene_node_init() - fixes #695
 Mike Becker <universe@uap-core.de> parents: 
206diff
changeset | 310 | .pos2d = ASC_VEC2I(pos_x, pos_y), | 
| 215 
a7c8e1727971
use new point-of-origin for 2d primitives
 Mike Becker <universe@uap-core.de> parents: 
214diff
changeset | 311 | .origin3d = ASC_VEC3F(ellipsis->radii.x, ellipsis->radii.y, 0), // use float to avoid cast | 
| 256 
60014484121c
remove the asc_col4i datatype in favor of a unified asc_color type
 Mike Becker <universe@uap-core.de> parents: 
251diff
changeset | 312 | .render_group = (args.filled && args.color.alpha < 1) || args.border_color.alpha < 1 | 
| 173 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 313 | ? ASC_RENDER_GROUP_2D_BLEND | 
| 207 
4d184a8706b1
add asc_scene_node_init() - fixes #695
 Mike Becker <universe@uap-core.de> parents: 
206diff
changeset | 314 | : ASC_RENDER_GROUP_2D_OPAQUE | 
| 
4d184a8706b1
add asc_scene_node_init() - fixes #695
 Mike Becker <universe@uap-core.de> parents: 
206diff
changeset | 315 | ); | 
| 173 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 316 | return node; | 
| 
bd57fe3f6360
add ellipsis shader - resolves #385
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 317 | } |