38 AscSprite *sprite = (AscSprite *) node; |
38 AscSprite *sprite = (AscSprite *) node; |
39 asc_mesh_destroy(&sprite->mesh); |
39 asc_mesh_destroy(&sprite->mesh); |
40 sprite->texture->refcount--; |
40 sprite->texture->refcount--; |
41 } |
41 } |
42 |
42 |
|
43 static void asc_sprite_update(AscSceneNode *node) { |
|
44 AscSprite *sprite = (AscSprite *) node; |
|
45 |
|
46 // calculate texture parameters |
|
47 asc_vec2f uv_scale; |
|
48 if (sprite->texture_scale_mode == ASC_TEXTURE_SCALE_REPEAT) { |
|
49 uv_scale = asc_texture_calculate_uv_scale(sprite->texture, |
|
50 asc_vec2u_new(sprite->width, sprite->height), sprite->texture_scale); |
|
51 } else { |
|
52 uv_scale = sprite->texture_scale; |
|
53 } |
|
54 |
|
55 // update mesh |
|
56 asc_mesh_plane_2d(&sprite->mesh, |
|
57 .size = asc_vec2f_new(sprite->width, sprite->height), |
|
58 .uv_scale = uv_scale |
|
59 ); |
|
60 } |
|
61 |
43 AscSceneNode *asc_sprite_create(struct asc_sprite_create_args args) { |
62 AscSceneNode *asc_sprite_create(struct asc_sprite_create_args args) { |
44 AscSprite *sprite = calloc(1, sizeof(AscSprite)); |
63 AscSprite *sprite = calloc(1, sizeof(AscSprite)); |
45 |
64 |
46 // special sprite parameters |
65 // sprite parameters |
47 args.texture->refcount++; |
66 args.texture->refcount++; |
48 sprite->texture = args.texture; |
67 sprite->texture = args.texture; |
|
68 sprite->width = args.width; |
|
69 sprite->height = args.height; |
|
70 sprite->texture_scale_mode = args.texture_scale_mode; |
|
71 sprite->texture_scale.u = ASC_NONZERO_OR(1.f, args.texture_scale_x); |
|
72 sprite->texture_scale.v = ASC_NONZERO_OR(1.f, args.texture_scale_y); |
49 |
73 |
50 // basic node parameters |
74 // basic node parameters |
51 AscSceneNode *node = (AscSceneNode *) sprite; |
75 AscSceneNode *node = (AscSceneNode *) sprite; |
52 asc_scene_node_name(node, args.name); |
76 asc_scene_node_name(node, args.name); |
53 node->render_group = args.opaque |
77 node->render_group = args.opaque |
54 ? ASC_RENDER_GROUP_SPRITE_OPAQUE |
78 ? ASC_RENDER_GROUP_SPRITE_OPAQUE |
55 : ASC_RENDER_GROUP_SPRITE_BLEND; |
79 : ASC_RENDER_GROUP_SPRITE_BLEND; |
|
80 node->update_func = asc_sprite_update; |
56 node->destroy_func = asc_sprite_destroy; |
81 node->destroy_func = asc_sprite_destroy; |
57 |
82 |
58 node->position = asc_vec3f_new(args.x, args.y, ASC_SCENE_2D_DEPTH_OFFSET); |
83 node->position = asc_vec3f_new(args.x, args.y, ASC_SCENE_2D_DEPTH_OFFSET); |
59 node->scale = asc_vec3f_one; |
84 node->scale = asc_vec3f_one; |
60 asc_node_update_transform(node); |
|
61 |
85 |
62 // calculate texture parameters |
86 asc_node_update(node); |
63 asc_vec2f uv_scale; |
|
64 uv_scale.u = ASC_NONZERO_OR(1.f, args.texture_scale_x); |
|
65 uv_scale.v = ASC_NONZERO_OR(1.f, args.texture_scale_y); |
|
66 if (args.texture_scale_mode == ASC_TEXTURE_SCALE_REPEAT) { |
|
67 uv_scale = asc_texture_calculate_uv_scale(args.texture, |
|
68 asc_vec2u_new(args.width, args.height), uv_scale); |
|
69 } |
|
70 |
|
71 // initialize mesh |
|
72 asc_mesh_plane_2d(&sprite->mesh, |
|
73 .size = asc_vec2f_new(args.width, args.height), |
|
74 .uv_scale = uv_scale |
|
75 ); |
|
76 |
|
77 return node; |
87 return node; |
78 } |
88 } |
79 |
89 |
80 void asc_sprite_draw(AscSprite const *node) { |
90 void asc_sprite_draw(AscSprite const *node) { |
81 // Obtain shader |
91 // Obtain shader |