src/2d.c

changeset 169
6e6717d9c776
parent 168
f70569c49c24
child 173
bd57fe3f6360
--- a/src/2d.c	Wed Jun 25 21:58:44 2025 +0200
+++ b/src/2d.c	Thu Jun 26 21:43:22 2025 +0200
@@ -63,35 +63,35 @@
         asc_error("Loading rectangle shader failed.");
         return NULL;
     }
-    // TODO: find better way to deal with inheritance (&shader->program just looks bad)
-    AscRectangleShader *shader = asc_shader_create(codes, sizeof(*shader));
-    if (asc_shader_invalid(&shader->program)) {
+    AscShaderProgram *shader = asc_shader_create(codes, sizeof(AscRectangleShader));
+    if (asc_shader_invalid(shader)) {
         asc_shader_free_codes(codes);
-        return (AscShaderProgram*) shader;
+        return shader;
     }
-    shader->size = asc_shader_get_uniform_loc(&shader->program, "size");
+    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)) {
-        shader->color = asc_shader_get_uniform_loc(&shader->program, "color");
+        rect_shader->color = asc_shader_get_uniform_loc(shader, "color");
     } else {
-        shader->color = -1;
+        rect_shader->color = -1;
     }
     if (asc_test_flag(flags, ASC_RECTANGLE_SHADER_FLAG_BORDER)) {
-        shader->thickness = asc_shader_get_uniform_loc(&shader->program, "thickness");
-        shader->border_color = asc_shader_get_uniform_loc(&shader->program, "border_color");
+        rect_shader->thickness = asc_shader_get_uniform_loc(shader, "thickness");
+        rect_shader->border_color = asc_shader_get_uniform_loc(shader, "border_color");
     } else {
-        shader->thickness = -1;
-        shader->border_color = -1;
+        rect_shader->thickness = -1;
+        rect_shader->border_color = -1;
     }
     if (asc_test_flag(flags, ASC_RECTANGLE_SHADER_FLAG_ROUND)) {
-        shader->radius = asc_shader_get_uniform_loc(&shader->program, "radius");
+        rect_shader->radius = asc_shader_get_uniform_loc(shader, "radius");
     } else {
-        shader->radius = -1;
+        rect_shader->radius = -1;
     }
     asc_shader_free_codes(codes);
 
     asc_error_catch_all_gl();
 
-    return (AscShaderProgram*) shader;
+    return shader;
 }
 
 static void asc_rectangle_destroy(AscSceneNode *node) {
@@ -105,7 +105,7 @@
 }
 
 static void asc_rectangle_draw(const AscCamera *camera, const AscSceneNode *node) {
-    asc_ptr_cast(AscRectangle, rectangle, node);
+    asc_cptr_cast(AscRectangle, rectangle, node);
     const bool filled = rectangle->filled;
     const bool round = rectangle->radius > 0;
     const bool border = rectangle->thickness > 0;
@@ -129,26 +129,25 @@
     };
 
     // Look up and activate shader
-    const AscRectangleShader *shader = asc_shader_lookup_or_create(
+    const AscShaderProgram *shader = asc_shader_lookup_or_create(
         shader_ids[shader_flags], asc_rectangle_shader_create, shader_flags);
-    // TODO: how to remove the following cast?
-    if (asc_shader_invalid((AscShaderProgram*)shader)) return;
-    asc_shader_use(&shader->program, camera);
+    if (asc_shader_use(shader, camera)) return;
+    asc_cptr_cast(AscRectangleShader, rect_shader, shader);
 
     // Upload uniforms
-    asc_shader_upload_model_matrix(&shader->program, node);
+    asc_shader_upload_model_matrix(shader, node);
 
     if (filled) {
-        asc_shader_upload_col4f(shader->color, rectangle->color);
+        asc_shader_upload_col4f(rect_shader->color, rectangle->color);
     }
-    asc_shader_upload_vec2f(shader->size, rectangle->size);
+    asc_shader_upload_vec2f(rect_shader->size, rectangle->size);
 
     if (border) {
-        asc_shader_upload_float(shader->thickness, rectangle->thickness);
-        asc_shader_upload_col4f(shader->border_color, rectangle->border_color);
+        asc_shader_upload_float(rect_shader->thickness, rectangle->thickness);
+        asc_shader_upload_col4f(rect_shader->border_color, rectangle->border_color);
     }
     if (round) {
-        asc_shader_upload_float(shader->radius, rectangle->radius);
+        asc_shader_upload_float(rect_shader->radius, rectangle->radius);
     }
 
     // Draw mesh

mercurial