94 CxIterator iter_blend_uv = cxListIterator(blend_uv); |
94 CxIterator iter_blend_uv = cxListIterator(blend_uv); |
95 |
95 |
96 // TODO: implement interleaving by depth |
96 // TODO: implement interleaving by depth |
97 if (cxIteratorValid(iter_opaque_rect)) { |
97 if (cxIteratorValid(iter_opaque_rect)) { |
98 glDisable(GL_BLEND); |
98 glDisable(GL_BLEND); |
99 AscShaderSprite *shader = ASC_SHADER_SPRITE_RECT; |
99 const AscShaderProgram *shader = asc_sprite_shader_rect(); |
100 asc_shader_program_use(&shader->program, &scene->camera); |
100 asc_shader_use(shader, &scene->camera); |
101 cx_foreach(const AscSprite*, node, iter_opaque_rect) { |
101 cx_foreach(const AscSprite*, node, iter_opaque_rect) { |
102 asc_sprite_draw(shader, node); |
102 asc_sprite_draw(shader, node); |
103 } |
103 } |
104 } |
104 } |
105 if (cxIteratorValid(iter_opaque_uv)) { |
105 if (cxIteratorValid(iter_opaque_uv)) { |
106 glDisable(GL_BLEND); |
106 glDisable(GL_BLEND); |
107 AscShaderSprite *shader = ASC_SHADER_SPRITE_UV; |
107 const AscShaderProgram *shader = asc_sprite_shader_uv(); |
108 asc_shader_program_use(&shader->program, &scene->camera); |
108 asc_shader_use(shader, &scene->camera); |
109 cx_foreach(const AscSprite*, node, iter_opaque_uv) { |
109 cx_foreach(const AscSprite*, node, iter_opaque_uv) { |
110 asc_sprite_draw(shader, node); |
110 asc_sprite_draw(shader, node); |
111 } |
111 } |
112 } |
112 } |
113 if (cxIteratorValid(iter_blend_rect)) { |
113 if (cxIteratorValid(iter_blend_rect)) { |
114 glEnable(GL_BLEND); |
114 glEnable(GL_BLEND); |
115 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |
115 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |
116 AscShaderSprite *shader = ASC_SHADER_SPRITE_RECT; |
116 const AscShaderProgram *shader = asc_sprite_shader_rect(); |
117 asc_shader_program_use(&shader->program, &scene->camera); |
117 asc_shader_use(shader, &scene->camera); |
118 cx_foreach(const AscSprite*, node, iter_blend_rect) { |
118 cx_foreach(const AscSprite*, node, iter_blend_rect) { |
119 asc_sprite_draw(shader, node); |
119 asc_sprite_draw(shader, node); |
120 } |
120 } |
121 } |
121 } |
122 if (cxIteratorValid(iter_blend_uv)) { |
122 if (cxIteratorValid(iter_blend_uv)) { |
123 glEnable(GL_BLEND); |
123 glEnable(GL_BLEND); |
124 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |
124 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |
125 AscShaderSprite *shader = ASC_SHADER_SPRITE_UV; |
125 const AscShaderProgram *shader = asc_sprite_shader_uv(); |
126 asc_shader_program_use(&shader->program, &scene->camera); |
126 asc_shader_use(shader, &scene->camera); |
127 cx_foreach(const AscSprite*, node, iter_blend_uv) { |
127 cx_foreach(const AscSprite*, node, iter_blend_uv) { |
128 asc_sprite_draw(shader, node); |
128 asc_sprite_draw(shader, node); |
129 } |
129 } |
130 } |
130 } |
131 } |
131 } |