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); |