src/sprite.c

changeset 89
e1f682a8a145
parent 88
6234b7ea48f3
child 90
aa8e7a38905c
--- a/src/sprite.c	Sun Apr 20 15:41:16 2025 +0200
+++ b/src/sprite.c	Mon Apr 21 17:27:33 2025 +0200
@@ -33,6 +33,8 @@
 #include <GL/glew.h>
 
 static void asc_sprite_free(AscSceneNode *node) {
+    AscSprite *sprite = (AscSprite *) node;
+    sprite->texture->refcount--;
     free(node);
 }
 
@@ -40,7 +42,8 @@
     AscSprite *sprite = calloc(1, sizeof(AscSprite));
 
     // special sprite parameters
-    sprite->tex = args.texture;
+    args.texture->refcount++;
+    sprite->texture = args.texture;
 
     // basic node parameters
     AscSceneNode *node = (AscSceneNode *) sprite;
@@ -52,8 +55,8 @@
     node->position.x = (float) args.x;
     node->position.y = (float) args.y;
 
-    node->scale.x = (float) (args.width == 0 ? args.texture.width : args.width);
-    node->scale.y = (float) (args.height == 0 ? args.texture.height : args.height);
+    node->scale.x = (float) (args.width == 0 ? args.texture->width : args.width);
+    node->scale.y = (float) (args.height == 0 ? args.texture->height : args.height);
 
     return node;
 }
@@ -67,12 +70,12 @@
                        GL_FALSE, node->data.world_transform);
 
     // Bind texture
-    if (node->tex.target == GL_TEXTURE_RECTANGLE) {
-        asc_texture_bind(&node->tex, shader->rect_tex, 0);
+    if (node->texture->target == GL_TEXTURE_RECTANGLE) {
+        asc_texture_bind(node->texture, shader->rect_tex, 0);
         asc_texture_bind(&ASC_DEFAULT_TEXTURES.empty_1x1_2d, shader->uv_tex, 1);
     } else {
         asc_texture_bind(&ASC_DEFAULT_TEXTURES.empty_1x1_rect, shader->rect_tex, 0);
-        asc_texture_bind(&node->tex, shader->uv_tex, 1);
+        asc_texture_bind(node->texture, shader->uv_tex, 1);
     }
 
     // Apply depth

mercurial