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 } |