src/sprite.c

changeset 118
830608f7e7d9
parent 117
d1267f656a97
equal deleted inserted replaced
117:d1267f656a97 118:830608f7e7d9
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
95 } 105 }
96 106
97 // Draw mesh 107 // Draw mesh
98 asc_mesh_draw_triangle_strip(&node->mesh); 108 asc_mesh_draw_triangle_strip(&node->mesh);
99 } 109 }
110
111 void asc_sprite_set_size(AscSceneNode *node, unsigned width, unsigned height) {
112 AscSprite *sprite = (AscSprite*) node;
113 sprite->width = width;
114 sprite->height = height;
115 asc_node_update(node);
116 }

mercurial