src/sprite.c

changeset 169
6e6717d9c776
parent 168
f70569c49c24
--- 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);

mercurial