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 static void asc_sprite_free(AscSceneNode *node) { |
35 static void asc_sprite_free(AscSceneNode *node) { |
|
36 AscSprite *sprite = (AscSprite *) node; |
|
37 sprite->texture->refcount--; |
36 free(node); |
38 free(node); |
37 } |
39 } |
38 |
40 |
39 AscSceneNode *asc_sprite_create(struct asc_sprite_create_args args) { |
41 AscSceneNode *asc_sprite_create(struct asc_sprite_create_args args) { |
40 AscSprite *sprite = calloc(1, sizeof(AscSprite)); |
42 AscSprite *sprite = calloc(1, sizeof(AscSprite)); |
41 |
43 |
42 // special sprite parameters |
44 // special sprite parameters |
43 sprite->tex = args.texture; |
45 args.texture->refcount++; |
|
46 sprite->texture = args.texture; |
44 |
47 |
45 // basic node parameters |
48 // basic node parameters |
46 AscSceneNode *node = (AscSceneNode *) sprite; |
49 AscSceneNode *node = (AscSceneNode *) sprite; |
47 node->render_group = args.opaque |
50 node->render_group = args.opaque |
48 ? ASC_RENDER_GROUP_SPRITE_OPAQUE |
51 ? ASC_RENDER_GROUP_SPRITE_OPAQUE |
50 node->free_func = asc_sprite_free; |
53 node->free_func = asc_sprite_free; |
51 |
54 |
52 node->position.x = (float) args.x; |
55 node->position.x = (float) args.x; |
53 node->position.y = (float) args.y; |
56 node->position.y = (float) args.y; |
54 |
57 |
55 node->scale.x = (float) (args.width == 0 ? args.texture.width : args.width); |
58 node->scale.x = (float) (args.width == 0 ? args.texture->width : args.width); |
56 node->scale.y = (float) (args.height == 0 ? args.texture.height : args.height); |
59 node->scale.y = (float) (args.height == 0 ? args.texture->height : args.height); |
57 |
60 |
58 return node; |
61 return node; |
59 } |
62 } |
60 |
63 |
61 void asc_sprite_draw(AscSprite const *node) { |
64 void asc_sprite_draw(AscSprite const *node) { |
65 // Upload model matrix |
68 // Upload model matrix |
66 glUniformMatrix4fv(shader->program.model, 1, |
69 glUniformMatrix4fv(shader->program.model, 1, |
67 GL_FALSE, node->data.world_transform); |
70 GL_FALSE, node->data.world_transform); |
68 |
71 |
69 // Bind texture |
72 // Bind texture |
70 if (node->tex.target == GL_TEXTURE_RECTANGLE) { |
73 if (node->texture->target == GL_TEXTURE_RECTANGLE) { |
71 asc_texture_bind(&node->tex, shader->rect_tex, 0); |
74 asc_texture_bind(node->texture, shader->rect_tex, 0); |
72 asc_texture_bind(&ASC_DEFAULT_TEXTURES.empty_1x1_2d, shader->uv_tex, 1); |
75 asc_texture_bind(&ASC_DEFAULT_TEXTURES.empty_1x1_2d, shader->uv_tex, 1); |
73 } else { |
76 } else { |
74 asc_texture_bind(&ASC_DEFAULT_TEXTURES.empty_1x1_rect, shader->rect_tex, 0); |
77 asc_texture_bind(&ASC_DEFAULT_TEXTURES.empty_1x1_rect, shader->rect_tex, 0); |
75 asc_texture_bind(&node->tex, shader->uv_tex, 1); |
78 asc_texture_bind(node->texture, shader->uv_tex, 1); |
76 } |
79 } |
77 |
80 |
78 // Apply depth |
81 // Apply depth |
79 glUniform1f(shader->depth, (float)(node->data.depth)); |
82 glUniform1f(shader->depth, (float)(node->data.depth)); |
80 |
83 |