src/sprite.c

changeset 241
b53bd6ab2a47
parent 239
3b78ad115ccd
equal deleted inserted replaced
240:5ed38debd4a7 241:b53bd6ab2a47
27 27
28 #include "ascension/sprite.h" 28 #include "ascension/sprite.h"
29 29
30 #include "ascension/context.h" 30 #include "ascension/context.h"
31 #include "ascension/glcontext.h" 31 #include "ascension/glcontext.h"
32 #include "ascension/error.h"
33 #include "ascension/mesh.h" 32 #include "ascension/mesh.h"
34 #include "ascension/shader.h" 33 #include "ascension/shader.h"
35 #include "ascension/constants.h" 34 #include "ascension/constants.h"
36 35
36 #include <assert.h>
37 37
38 typedef struct asc_sprite_shader_s { 38 typedef struct asc_sprite_shader_s {
39 AscShaderProgram program; 39 AscShaderProgram program;
40 asc_uniform_loc tex; 40 asc_uniform_loc tex;
41 } AscSpriteShader; 41 } AscSpriteShader;
56 } 56 }
57 57
58 static void asc_sprite_destroy(AscSceneNode *node) { 58 static void asc_sprite_destroy(AscSceneNode *node) {
59 asc_ptr_cast(AscSprite, sprite, node); 59 asc_ptr_cast(AscSprite, sprite, node);
60 asc_mesh_destroy(&sprite->mesh); 60 asc_mesh_destroy(&sprite->mesh);
61 sprite->texture->refcount--; 61 if (sprite->texture != NULL) {
62 sprite->texture->refcount--;
63 }
62 } 64 }
63 65
64 static void asc_sprite_update(AscSceneNode *node) { 66 static void asc_sprite_update(AscSceneNode *node) {
65 asc_ptr_cast(AscSprite, sprite, node); 67 asc_ptr_cast(AscSprite, sprite, node);
66 68
67 // calculate texture parameters 69 // calculate texture parameters
68 asc_vec2f uv_scale; 70 asc_vec2f uv_scale;
69 if (sprite->texture_scale_mode == ASC_TEXTURE_SCALE_REPEAT) { 71 if (sprite->texture_scale_mode == ASC_TEXTURE_SCALE_REPEAT) {
72 assert(sprite->texture != NULL);
70 uv_scale = asc_texture_calculate_uv_scale(sprite->texture, 73 uv_scale = asc_texture_calculate_uv_scale(sprite->texture,
71 ASC_VEC2U(sprite->width, sprite->height), sprite->texture_scale); 74 ASC_VEC2U(sprite->width, sprite->height), sprite->texture_scale);
72 } else { 75 } else {
73 uv_scale = sprite->texture_scale; 76 uv_scale = sprite->texture_scale;
74 } 77 }
106 109
107 AscSceneNode *asc_sprite_create(struct asc_sprite_create_args args) { 110 AscSceneNode *asc_sprite_create(struct asc_sprite_create_args args) {
108 AscSprite *sprite = cxZallocDefault(sizeof(AscSprite)); 111 AscSprite *sprite = cxZallocDefault(sizeof(AscSprite));
109 112
110 // sprite parameters 113 // sprite parameters
111 args.texture->refcount++;
112 sprite->texture = args.texture; 114 sprite->texture = args.texture;
115 if (args.texture != NULL) {
116 args.texture->refcount++;
117 }
113 sprite->width = args.width; 118 sprite->width = args.width;
114 sprite->height = args.height; 119 sprite->height = args.height;
115 sprite->texture_scale_mode = args.texture_scale_mode; 120 sprite->texture_scale_mode = args.texture_scale_mode;
116 sprite->texture_scale.u = ASC_NONZERO_OR(1.f, args.texture_scale_x); 121 sprite->texture_scale.u = ASC_NONZERO_OR(1.f, args.texture_scale_x);
117 sprite->texture_scale.v = ASC_NONZERO_OR(1.f, args.texture_scale_y); 122 sprite->texture_scale.v = ASC_NONZERO_OR(1.f, args.texture_scale_y);

mercurial