src/sprite.c

changeset 118
830608f7e7d9
parent 117
d1267f656a97
--- a/src/sprite.c	Mon May 12 20:51:57 2025 +0200
+++ b/src/sprite.c	Mon May 12 21:13:24 2025 +0200
@@ -40,12 +40,36 @@
     sprite->texture->refcount--;
 }
 
+static void asc_sprite_update(AscSceneNode *node) {
+    AscSprite *sprite = (AscSprite *) node;
+
+    // calculate texture parameters
+    asc_vec2f uv_scale;
+    if (sprite->texture_scale_mode == ASC_TEXTURE_SCALE_REPEAT) {
+        uv_scale = asc_texture_calculate_uv_scale(sprite->texture,
+            asc_vec2u_new(sprite->width, sprite->height), sprite->texture_scale);
+    } else {
+        uv_scale = sprite->texture_scale;
+    }
+
+    // update mesh
+    asc_mesh_plane_2d(&sprite->mesh,
+        .size = asc_vec2f_new(sprite->width, sprite->height),
+        .uv_scale = uv_scale
+    );
+}
+
 AscSceneNode *asc_sprite_create(struct asc_sprite_create_args args) {
     AscSprite *sprite = calloc(1, sizeof(AscSprite));
 
-    // special sprite parameters
+    // sprite parameters
     args.texture->refcount++;
     sprite->texture = args.texture;
+    sprite->width = args.width;
+    sprite->height = args.height;
+    sprite->texture_scale_mode = args.texture_scale_mode;
+    sprite->texture_scale.u = ASC_NONZERO_OR(1.f, args.texture_scale_x);
+    sprite->texture_scale.v = ASC_NONZERO_OR(1.f, args.texture_scale_y);
 
     // basic node parameters
     AscSceneNode *node = (AscSceneNode *) sprite;
@@ -53,27 +77,13 @@
     node->render_group = args.opaque
                              ? ASC_RENDER_GROUP_SPRITE_OPAQUE
                              : ASC_RENDER_GROUP_SPRITE_BLEND;
+    node->update_func = asc_sprite_update;
     node->destroy_func = asc_sprite_destroy;
 
     node->position = asc_vec3f_new(args.x, args.y, ASC_SCENE_2D_DEPTH_OFFSET);
     node->scale = asc_vec3f_one;
-    asc_node_update_transform(node);
 
-    // calculate texture parameters
-    asc_vec2f uv_scale;
-    uv_scale.u = ASC_NONZERO_OR(1.f, args.texture_scale_x);
-    uv_scale.v = ASC_NONZERO_OR(1.f, args.texture_scale_y);
-    if (args.texture_scale_mode == ASC_TEXTURE_SCALE_REPEAT) {
-        uv_scale = asc_texture_calculate_uv_scale(args.texture,
-            asc_vec2u_new(args.width, args.height), uv_scale);
-    }
-
-    // initialize mesh
-    asc_mesh_plane_2d(&sprite->mesh,
-        .size = asc_vec2f_new(args.width, args.height),
-        .uv_scale = uv_scale
-    );
-
+    asc_node_update(node);
     return node;
 }
 
@@ -97,3 +107,10 @@
     // 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;
+    sprite->height = height;
+    asc_node_update(node);
+}

mercurial