--- a/src/sprite.c Sat Jun 14 11:40:40 2025 +0200 +++ b/src/sprite.c Sat Jun 14 12:38:37 2025 +0200 @@ -106,6 +106,28 @@ ); } +void asc_sprite_draw(const AscCamera *camera, const AscSceneNode *node) { + asc_ptr_cast(const 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 = + sprite->texture->target == GL_TEXTURE_RECTANGLE + ? asc_sprite_shader_rect() + : asc_sprite_shader_uv(); + asc_shader_use(&shader->program, camera); + + // Upload model matrix + glUniformMatrix4fv(shader->program.model, 1, + GL_FALSE, node->world_transform); + + // Bind texture + asc_texture_bind(sprite->texture, shader->tex, 0); + + // Draw mesh + asc_mesh_draw_triangle_strip(&sprite->mesh); +} + AscSceneNode *asc_sprite_create(struct asc_sprite_create_args args) { AscSprite *sprite = cxZallocDefault(sizeof(AscSprite)); @@ -122,10 +144,11 @@ AscSceneNode *node = (AscSceneNode *) sprite; asc_scene_node_name(node, args.name); node->render_group = args.opaque - ? ASC_RENDER_GROUP_SPRITE_OPAQUE - : ASC_RENDER_GROUP_SPRITE_BLEND; + ? ASC_RENDER_GROUP_2D_OPAQUE + : ASC_RENDER_GROUP_2D_BLEND; node->update_func = asc_sprite_update; node->destroy_func = asc_sprite_destroy; + node->draw_func = asc_sprite_draw; node->position = asc_vec3f_new(args.x, args.y, ASC_SCENE_2D_DEPTH_OFFSET); node->scale = asc_vec3f_one; @@ -134,25 +157,6 @@ return node; } -void asc_sprite_draw(const AscCamera *camera, const AscSprite *node) { - // Activate shader - const AscSpriteShader *shader = - node->texture->target == GL_TEXTURE_RECTANGLE - ? asc_sprite_shader_rect() - : asc_sprite_shader_uv(); - asc_shader_use(&shader->program, camera); - - // Upload model matrix - glUniformMatrix4fv(shader->program.model, 1, - GL_FALSE, node->data.world_transform); - - // Bind texture - asc_texture_bind(node->texture, shader->tex, 0); - - // Draw mesh - asc_mesh_draw_triangle_strip(&node->mesh); -} - void asc_sprite_set_size(AscSceneNode *node, unsigned width, unsigned height) { AscSprite *sprite = (AscSprite*) node; sprite->width = width;