src/2d.c

changeset 222
2cb9a71df7a6
parent 221
14eddd43b3f7
child 223
4f32c7755138
--- 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) {

mercurial