src/sprite.c

changeset 150
3045f61bc4eb
parent 145
a3231310d66d
child 151
42960d0c879b
--- 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;

mercurial