44 |
44 |
45 #define ASC_RECTANGLE_SHADER_FLAG_FILL 1 |
45 #define ASC_RECTANGLE_SHADER_FLAG_FILL 1 |
46 #define ASC_RECTANGLE_SHADER_FLAG_ROUND 2 |
46 #define ASC_RECTANGLE_SHADER_FLAG_ROUND 2 |
47 #define ASC_RECTANGLE_SHADER_FLAG_BORDER 4 |
47 #define ASC_RECTANGLE_SHADER_FLAG_BORDER 4 |
48 |
48 |
|
49 static void asc_rectangle_shader_init(AscShaderProgram *shader, int flags) { |
|
50 asc_shader_init_uniform_loc_nice(shader, AscRectangleShader, size); |
|
51 if (asc_test_flag(flags, ASC_RECTANGLE_SHADER_FLAG_FILL)) { |
|
52 asc_shader_init_uniform_loc_nice(shader, AscRectangleShader, color); |
|
53 } |
|
54 if (asc_test_flag(flags, ASC_RECTANGLE_SHADER_FLAG_BORDER)) { |
|
55 asc_shader_init_uniform_loc_nice(shader, AscRectangleShader, border_color); |
|
56 asc_shader_init_uniform_loc_nice(shader, AscRectangleShader, thickness); |
|
57 } |
|
58 if (asc_test_flag(flags, ASC_RECTANGLE_SHADER_FLAG_ROUND)) { |
|
59 asc_shader_init_uniform_loc_nice(shader, AscRectangleShader, radius); |
|
60 } |
|
61 } |
|
62 |
49 static AscShaderProgram *asc_rectangle_shader_create(int flags) { |
63 static AscShaderProgram *asc_rectangle_shader_create(int flags) { |
50 AscShaderCodes codes; |
|
51 const char * const defines[] = { |
64 const char * const defines[] = { |
52 "#define FILL\n", |
65 "#define FILL\n", |
53 "#define ROUNDED_CORNERS\n", |
66 "#define ROUNDED_CORNERS\n", |
54 "#define BORDER\n" |
67 "#define BORDER\n" |
55 }; |
68 }; |
56 if (asc_shader_load_code_files((AscShaderCodeInfo){ |
69 return asc_shader_create((AscShaderCodeInfo){ |
57 .files.vtx = "sprite_vtx.glsl", |
70 .files.vtx = "sprite_vtx.glsl", |
58 .files.frag = "rectangle_frag.glsl", |
71 .files.frag = "rectangle_frag.glsl", |
59 .defines.frag_list = defines, |
72 .defines.frag_list = defines, |
60 .defines.frag_list_select = flags |
73 .defines.frag_list_select = flags |
61 }, &codes)) { |
74 }, sizeof(AscRectangleShader), asc_rectangle_shader_init, flags); |
62 asc_error("Loading rectangle shader failed."); |
|
63 return NULL; |
|
64 } |
|
65 AscShaderProgram *shader = asc_shader_create(codes, sizeof(AscRectangleShader)); |
|
66 if (asc_shader_invalid(shader)) { |
|
67 asc_shader_free_codes(codes); |
|
68 return shader; |
|
69 } |
|
70 asc_ptr_cast(AscRectangleShader, rect_shader, shader); |
|
71 rect_shader->size = asc_shader_get_uniform_loc(shader, "size"); |
|
72 if (asc_test_flag(flags, ASC_RECTANGLE_SHADER_FLAG_FILL)) { |
|
73 rect_shader->color = asc_shader_get_uniform_loc(shader, "color"); |
|
74 } else { |
|
75 rect_shader->color = -1; |
|
76 } |
|
77 if (asc_test_flag(flags, ASC_RECTANGLE_SHADER_FLAG_BORDER)) { |
|
78 rect_shader->thickness = asc_shader_get_uniform_loc(shader, "thickness"); |
|
79 rect_shader->border_color = asc_shader_get_uniform_loc(shader, "border_color"); |
|
80 } else { |
|
81 rect_shader->thickness = -1; |
|
82 rect_shader->border_color = -1; |
|
83 } |
|
84 if (asc_test_flag(flags, ASC_RECTANGLE_SHADER_FLAG_ROUND)) { |
|
85 rect_shader->radius = asc_shader_get_uniform_loc(shader, "radius"); |
|
86 } else { |
|
87 rect_shader->radius = -1; |
|
88 } |
|
89 asc_shader_free_codes(codes); |
|
90 |
|
91 if (asc_error_catch_gl("Creating rectangle shader")) { |
|
92 // TODO: error handling |
|
93 } |
|
94 |
|
95 return shader; |
|
96 } |
75 } |
97 |
76 |
98 static void asc_rectangle_destroy(AscSceneNode *node) { |
77 static void asc_rectangle_destroy(AscSceneNode *node) { |
99 asc_ptr_cast(AscRectangle, rectangle, node); |
78 asc_ptr_cast(AscRectangle, rectangle, node); |
100 asc_mesh_destroy(&rectangle->mesh); |
79 asc_mesh_destroy(&rectangle->mesh); |
222 } AscEllipsisShader; |
201 } AscEllipsisShader; |
223 |
202 |
224 #define ASC_ELLIPSIS_SHADER_FLAG_FILL 1 |
203 #define ASC_ELLIPSIS_SHADER_FLAG_FILL 1 |
225 #define ASC_ELLIPSIS_SHADER_FLAG_BORDER 2 |
204 #define ASC_ELLIPSIS_SHADER_FLAG_BORDER 2 |
226 |
205 |
|
206 static void asc_ellipsis_shader_init(AscShaderProgram *shader, int flags) { |
|
207 asc_shader_init_uniform_loc_nice(shader, AscEllipsisShader, radii); |
|
208 if (asc_test_flag(flags, ASC_ELLIPSIS_SHADER_FLAG_FILL)) { |
|
209 asc_shader_init_uniform_loc_nice(shader, AscEllipsisShader, color); |
|
210 } |
|
211 if (asc_test_flag(flags, ASC_ELLIPSIS_SHADER_FLAG_BORDER)) { |
|
212 asc_shader_init_uniform_loc_nice(shader, AscEllipsisShader, thickness); |
|
213 asc_shader_init_uniform_loc_nice(shader, AscEllipsisShader, border_color); |
|
214 } |
|
215 } |
|
216 |
227 static AscShaderProgram *asc_ellipsis_shader_create(int flags) { |
217 static AscShaderProgram *asc_ellipsis_shader_create(int flags) { |
228 AscShaderCodes codes; |
|
229 const char * const defines[] = { |
218 const char * const defines[] = { |
230 "#define FILL\n", |
219 "#define FILL\n", |
231 "#define BORDER\n" |
220 "#define BORDER\n" |
232 }; |
221 }; |
233 if (asc_shader_load_code_files((AscShaderCodeInfo){ |
222 return asc_shader_create((AscShaderCodeInfo){ |
234 .files.vtx = "sprite_vtx.glsl", |
223 .files.vtx = "sprite_vtx.glsl", |
235 .files.frag = "ellipsis_frag.glsl", |
224 .files.frag = "ellipsis_frag.glsl", |
236 .defines.frag_list = defines, |
225 .defines.frag_list = defines, |
237 .defines.frag_list_select = flags |
226 .defines.frag_list_select = flags |
238 }, &codes)) { |
227 }, sizeof(AscEllipsisShader), asc_ellipsis_shader_init, flags); |
239 asc_error("Loading ellipsis shader failed."); |
|
240 return NULL; |
|
241 } |
|
242 AscShaderProgram *shader = asc_shader_create(codes, sizeof(AscRectangleShader)); |
|
243 if (asc_shader_invalid(shader)) { |
|
244 asc_shader_free_codes(codes); |
|
245 return shader; |
|
246 } |
|
247 asc_ptr_cast(AscEllipsisShader, ellipsis_shader, shader); |
|
248 ellipsis_shader->radii = asc_shader_get_uniform_loc(shader, "radii"); |
|
249 if (asc_test_flag(flags, ASC_ELLIPSIS_SHADER_FLAG_FILL)) { |
|
250 ellipsis_shader->color = asc_shader_get_uniform_loc(shader, "color"); |
|
251 } else { |
|
252 ellipsis_shader->color = -1; |
|
253 } |
|
254 if (asc_test_flag(flags, ASC_ELLIPSIS_SHADER_FLAG_BORDER)) { |
|
255 ellipsis_shader->thickness = asc_shader_get_uniform_loc(shader, "thickness"); |
|
256 ellipsis_shader->border_color = asc_shader_get_uniform_loc(shader, "border_color"); |
|
257 } else { |
|
258 ellipsis_shader->thickness = -1; |
|
259 ellipsis_shader->border_color = -1; |
|
260 } |
|
261 asc_shader_free_codes(codes); |
|
262 |
|
263 if (asc_error_catch_gl("Creating ellipsis shader")) { |
|
264 // TODO: error handling |
|
265 } |
|
266 |
|
267 return shader; |
|
268 } |
228 } |
269 |
229 |
270 static void asc_ellipsis_draw(const AscCamera *camera, const AscSceneNode *node) { |
230 static void asc_ellipsis_draw(const AscCamera *camera, const AscSceneNode *node) { |
271 asc_cptr_cast(AscEllipsis, ellipsis, node); |
231 asc_cptr_cast(AscEllipsis, ellipsis, node); |
272 |
232 |