diff -r f70569c49c24 -r 6e6717d9c776 src/2d.c --- 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