diff -r 14eddd43b3f7 -r 2cb9a71df7a6 src/2d.c --- a/src/2d.c Wed Jul 23 00:27:46 2025 +0200 +++ b/src/2d.c Thu Jul 24 20:58:00 2025 +0200 @@ -46,53 +46,32 @@ #define ASC_RECTANGLE_SHADER_FLAG_ROUND 2 #define ASC_RECTANGLE_SHADER_FLAG_BORDER 4 +static void asc_rectangle_shader_init(AscShaderProgram *shader, int flags) { + asc_shader_init_uniform_loc_nice(shader, AscRectangleShader, size); + if (asc_test_flag(flags, ASC_RECTANGLE_SHADER_FLAG_FILL)) { + asc_shader_init_uniform_loc_nice(shader, AscRectangleShader, color); + } + if (asc_test_flag(flags, ASC_RECTANGLE_SHADER_FLAG_BORDER)) { + asc_shader_init_uniform_loc_nice(shader, AscRectangleShader, border_color); + asc_shader_init_uniform_loc_nice(shader, AscRectangleShader, thickness); + } + if (asc_test_flag(flags, ASC_RECTANGLE_SHADER_FLAG_ROUND)) { + asc_shader_init_uniform_loc_nice(shader, AscRectangleShader, radius); + } +} + static AscShaderProgram *asc_rectangle_shader_create(int flags) { - AscShaderCodes codes; const char * const defines[] = { "#define FILL\n", "#define ROUNDED_CORNERS\n", "#define BORDER\n" }; - if (asc_shader_load_code_files((AscShaderCodeInfo){ + return asc_shader_create((AscShaderCodeInfo){ .files.vtx = "sprite_vtx.glsl", .files.frag = "rectangle_frag.glsl", .defines.frag_list = defines, .defines.frag_list_select = flags - }, &codes)) { - asc_error("Loading rectangle shader failed."); - return NULL; - } - AscShaderProgram *shader = asc_shader_create(codes, sizeof(AscRectangleShader)); - if (asc_shader_invalid(shader)) { - asc_shader_free_codes(codes); - return shader; - } - asc_ptr_cast(AscRectangleShader, rect_shader, shader); - rect_shader->size = asc_shader_get_uniform_loc(shader, "size"); - if (asc_test_flag(flags, ASC_RECTANGLE_SHADER_FLAG_FILL)) { - rect_shader->color = asc_shader_get_uniform_loc(shader, "color"); - } else { - rect_shader->color = -1; - } - if (asc_test_flag(flags, ASC_RECTANGLE_SHADER_FLAG_BORDER)) { - rect_shader->thickness = asc_shader_get_uniform_loc(shader, "thickness"); - rect_shader->border_color = asc_shader_get_uniform_loc(shader, "border_color"); - } else { - rect_shader->thickness = -1; - rect_shader->border_color = -1; - } - if (asc_test_flag(flags, ASC_RECTANGLE_SHADER_FLAG_ROUND)) { - rect_shader->radius = asc_shader_get_uniform_loc(shader, "radius"); - } else { - rect_shader->radius = -1; - } - asc_shader_free_codes(codes); - - if (asc_error_catch_gl("Creating rectangle shader")) { - // TODO: error handling - } - - return shader; + }, sizeof(AscRectangleShader), asc_rectangle_shader_init, flags); } static void asc_rectangle_destroy(AscSceneNode *node) { @@ -224,47 +203,28 @@ #define ASC_ELLIPSIS_SHADER_FLAG_FILL 1 #define ASC_ELLIPSIS_SHADER_FLAG_BORDER 2 +static void asc_ellipsis_shader_init(AscShaderProgram *shader, int flags) { + asc_shader_init_uniform_loc_nice(shader, AscEllipsisShader, radii); + if (asc_test_flag(flags, ASC_ELLIPSIS_SHADER_FLAG_FILL)) { + asc_shader_init_uniform_loc_nice(shader, AscEllipsisShader, color); + } + if (asc_test_flag(flags, ASC_ELLIPSIS_SHADER_FLAG_BORDER)) { + asc_shader_init_uniform_loc_nice(shader, AscEllipsisShader, thickness); + asc_shader_init_uniform_loc_nice(shader, AscEllipsisShader, border_color); + } +} + static AscShaderProgram *asc_ellipsis_shader_create(int flags) { - AscShaderCodes codes; const char * const defines[] = { "#define FILL\n", "#define BORDER\n" }; - if (asc_shader_load_code_files((AscShaderCodeInfo){ + return asc_shader_create((AscShaderCodeInfo){ .files.vtx = "sprite_vtx.glsl", .files.frag = "ellipsis_frag.glsl", .defines.frag_list = defines, .defines.frag_list_select = flags - }, &codes)) { - asc_error("Loading ellipsis shader failed."); - return NULL; - } - AscShaderProgram *shader = asc_shader_create(codes, sizeof(AscRectangleShader)); - if (asc_shader_invalid(shader)) { - asc_shader_free_codes(codes); - return shader; - } - asc_ptr_cast(AscEllipsisShader, ellipsis_shader, shader); - ellipsis_shader->radii = asc_shader_get_uniform_loc(shader, "radii"); - if (asc_test_flag(flags, ASC_ELLIPSIS_SHADER_FLAG_FILL)) { - ellipsis_shader->color = asc_shader_get_uniform_loc(shader, "color"); - } else { - ellipsis_shader->color = -1; - } - if (asc_test_flag(flags, ASC_ELLIPSIS_SHADER_FLAG_BORDER)) { - ellipsis_shader->thickness = asc_shader_get_uniform_loc(shader, "thickness"); - ellipsis_shader->border_color = asc_shader_get_uniform_loc(shader, "border_color"); - } else { - ellipsis_shader->thickness = -1; - ellipsis_shader->border_color = -1; - } - asc_shader_free_codes(codes); - - if (asc_error_catch_gl("Creating ellipsis shader")) { - // TODO: error handling - } - - return shader; + }, sizeof(AscEllipsisShader), asc_ellipsis_shader_init, flags); } static void asc_ellipsis_draw(const AscCamera *camera, const AscSceneNode *node) {