diff -r f70569c49c24 -r 6e6717d9c776 src/sprite.c --- a/src/sprite.c Wed Jun 25 21:58:44 2025 +0200 +++ b/src/sprite.c Thu Jun 26 21:43:22 2025 +0200 @@ -50,28 +50,28 @@ asc_error("Loading sprite shader failed."); return NULL; } - // TODO: find better way to deal with inheritance (&shader->program just looks bad) - AscSpriteShader *shader = asc_shader_create(codes, sizeof(*shader)); - if (asc_shader_invalid(&shader->program)) { + AscShaderProgram *shader = asc_shader_create(codes, sizeof(*shader)); + if (asc_shader_invalid(shader)) { asc_shader_free_codes(codes); - return (AscShaderProgram*) shader; + return shader; } - shader->tex = asc_shader_get_uniform_loc(&shader->program, "tex"); + asc_ptr_cast(AscSpriteShader, sprite_shader, shader); + sprite_shader->tex = asc_shader_get_uniform_loc(shader, "tex"); asc_shader_free_codes(codes); asc_error_catch_all_gl(); - return (AscShaderProgram*) shader; + return shader; } static void asc_sprite_destroy(AscSceneNode *node) { - AscSprite *sprite = (AscSprite *) node; + asc_ptr_cast(AscSprite, sprite, node); asc_mesh_destroy(&sprite->mesh); sprite->texture->refcount--; } static void asc_sprite_update(AscSceneNode *node) { - AscSprite *sprite = (AscSprite *) node; + asc_ptr_cast(AscSprite, sprite, node); // calculate texture parameters asc_vec2f uv_scale; @@ -90,23 +90,22 @@ } void asc_sprite_draw(const AscCamera *camera, const AscSceneNode *node) { - asc_ptr_cast(const AscSprite, sprite, node); + asc_cptr_cast(AscSprite, sprite, node); // Activate shader // TODO: scene should know which shader we are going to activate s.t. it can pre-sort nodes - const AscSpriteShader *shader = + const AscShaderProgram *shader = asc_texture_is_uv_normalized(sprite->texture) ? asc_shader_lookup_or_create(ASC_SHADER_SPRITE_UV, asc_sprite_shader_create, 0) : asc_shader_lookup_or_create(ASC_SHADER_SPRITE_RECT, asc_sprite_shader_create, 1); - // 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(AscSpriteShader, sprite_shader, shader); // Upload model matrix - asc_shader_upload_model_matrix(&shader->program, node); + asc_shader_upload_model_matrix(shader, node); // Bind texture - asc_texture_bind(sprite->texture, shader->tex, 0); + asc_texture_bind(sprite->texture, sprite_shader->tex, 0); // Draw mesh asc_mesh_draw_triangle_strip(&sprite->mesh);