src/sprite.c

changeset 115
e5f8c99b0987
parent 114
5b91bbab1ac0
child 116
bfb2a7d62047
equal deleted inserted replaced
114:5b91bbab1ac0 115:e5f8c99b0987
30 #include "ascension/context.h" 30 #include "ascension/context.h"
31 #include "ascension/glcontext.h" 31 #include "ascension/glcontext.h"
32 32
33 #include <GL/glew.h> 33 #include <GL/glew.h>
34 34
35 #include "ascension/mesh.h"
36
35 static void asc_sprite_destroy(AscSceneNode *node) { 37 static void asc_sprite_destroy(AscSceneNode *node) {
36 ((AscSprite *) node)->texture->refcount--; 38 AscSprite *sprite = (AscSprite *) node;
39 asc_mesh_destroy(&sprite->mesh);
40 sprite->texture->refcount--;
37 } 41 }
38 42
39 AscSceneNode *asc_sprite_create(struct asc_sprite_create_args args) { 43 AscSceneNode *asc_sprite_create(struct asc_sprite_create_args args) {
40 AscSprite *sprite = calloc(1, sizeof(AscSprite)); 44 AscSprite *sprite = calloc(1, sizeof(AscSprite));
41 45
50 ? ASC_RENDER_GROUP_SPRITE_OPAQUE 54 ? ASC_RENDER_GROUP_SPRITE_OPAQUE
51 : ASC_RENDER_GROUP_SPRITE_BLEND; 55 : ASC_RENDER_GROUP_SPRITE_BLEND;
52 node->destroy_func = asc_sprite_destroy; 56 node->destroy_func = asc_sprite_destroy;
53 57
54 node->position = asc_vec3f_new(args.x, args.y, ASC_SCENE_2D_DEPTH_OFFSET); 58 node->position = asc_vec3f_new(args.x, args.y, ASC_SCENE_2D_DEPTH_OFFSET);
59 // TODO: do not use scale, add mesh params instead
55 node->scale = asc_vec3f_new( 60 node->scale = asc_vec3f_new(
56 args.width == 0 ? args.texture->width : args.width, 61 args.width == 0 ? args.texture->width : args.width,
57 args.height == 0 ? args.texture->height : args.height, 62 args.height == 0 ? args.texture->height : args.height,
58 1 63 1
59 ); 64 );
60 asc_node_update_transform(node); 65 asc_node_update_transform(node);
66
67 // initialize mesh
68 asc_mesh_plane_2d(&sprite->mesh);
61 69
62 return node; 70 return node;
63 } 71 }
64 72
65 void asc_sprite_draw(AscSprite const *node) { 73 void asc_sprite_draw(AscSprite const *node) {
78 asc_texture_bind(ASC_TEXTURE_RECT_EMPTY_1X1, shader->rect_tex, 0); 86 asc_texture_bind(ASC_TEXTURE_RECT_EMPTY_1X1, shader->rect_tex, 0);
79 asc_texture_bind(node->texture, shader->uv_tex, 1); 87 asc_texture_bind(node->texture, shader->uv_tex, 1);
80 } 88 }
81 89
82 // Draw mesh 90 // Draw mesh
83 asc_mesh_draw_triangle_strip(ASC_PRIMITIVE_PLANE); 91 asc_mesh_draw_triangle_strip(&node->mesh);
84 } 92 }

mercurial