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; |
42 |
42 |
|
43 static void asc_sprite_shader_init(AscShaderProgram *p, cx_attr_unused int flags) { |
|
44 asc_shader_init_uniform_loc_nice(p, AscSpriteShader, tex); |
|
45 } |
|
46 |
43 static AscShaderProgram *asc_sprite_shader_create(int rect) { |
47 static AscShaderProgram *asc_sprite_shader_create(int rect) { |
44 AscShaderCodes codes; |
48 return asc_shader_create((AscShaderCodeInfo){ |
45 if (asc_shader_load_code_files((AscShaderCodeInfo){ |
|
46 .files.vtx = "sprite_vtx.glsl", |
49 .files.vtx = "sprite_vtx.glsl", |
47 .files.frag = "sprite_frag.glsl", |
50 .files.frag = "sprite_frag.glsl", |
48 .defines.frag = rect ? "#define USE_RECT" : NULL, |
51 .defines.frag = rect ? "#define USE_RECT" : NULL, |
49 }, &codes)) { |
52 }, sizeof(AscSpriteShader), asc_sprite_shader_init, 0); |
50 asc_error("Loading sprite shader failed."); |
|
51 return NULL; |
|
52 } |
|
53 AscShaderProgram *shader = asc_shader_create(codes, sizeof(AscSpriteShader)); |
|
54 if (asc_shader_invalid(shader)) { |
|
55 asc_shader_free_codes(codes); |
|
56 return shader; |
|
57 } |
|
58 asc_ptr_cast(AscSpriteShader, sprite_shader, shader); |
|
59 sprite_shader->tex = asc_shader_get_uniform_loc(shader, "tex"); |
|
60 asc_shader_free_codes(codes); |
|
61 |
|
62 if (asc_error_catch_gl("Creating sprite shader")) { |
|
63 // TODO: error handling |
|
64 } |
|
65 |
|
66 return shader; |
|
67 } |
53 } |
68 |
54 |
69 static void asc_sprite_destroy(AscSceneNode *node) { |
55 static void asc_sprite_destroy(AscSceneNode *node) { |
70 asc_ptr_cast(AscSprite, sprite, node); |
56 asc_ptr_cast(AscSprite, sprite, node); |
71 asc_mesh_destroy(&sprite->mesh); |
57 asc_mesh_destroy(&sprite->mesh); |