--- 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); +}