src/sprite.c

changeset 89
e1f682a8a145
parent 88
6234b7ea48f3
child 90
aa8e7a38905c
equal deleted inserted replaced
88:6234b7ea48f3 89:e1f682a8a145
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

mercurial