107 |
107 |
108 // Upload uniforms |
108 // Upload uniforms |
109 asc_shader_upload_model_matrix(shader, node); |
109 asc_shader_upload_model_matrix(shader, node); |
110 |
110 |
111 if (filled) { |
111 if (filled) { |
112 asc_shader_upload_col4f(rect_shader->color, rectangle->color); |
112 asc_shader_upload_color(rect_shader->color, rectangle->color); |
113 } |
113 } |
114 asc_shader_upload_vec2f(rect_shader->size, rectangle->size); |
114 asc_shader_upload_vec2f(rect_shader->size, rectangle->size); |
115 |
115 |
116 if (border) { |
116 if (border) { |
117 asc_shader_upload_float(rect_shader->thickness, rectangle->thickness); |
117 asc_shader_upload_float(rect_shader->thickness, rectangle->thickness); |
118 asc_shader_upload_col4f(rect_shader->border_color, rectangle->border_color); |
118 asc_shader_upload_color(rect_shader->border_color, rectangle->border_color); |
119 } |
119 } |
120 if (round) { |
120 if (round) { |
121 asc_shader_upload_float(rect_shader->radius, rectangle->radius); |
121 asc_shader_upload_float(rect_shader->radius, rectangle->radius); |
122 } |
122 } |
123 |
123 |
146 // convenience fallback: |
146 // convenience fallback: |
147 // when we are drawing an outline but have no explicit border color, |
147 // when we are drawing an outline but have no explicit border color, |
148 // use the main color |
148 // use the main color |
149 args.border_color = args.color; |
149 args.border_color = args.color; |
150 } |
150 } |
151 rectangle->color = asc_col_itof(args.color); |
151 rectangle->color = args.color; |
152 rectangle->border_color = asc_col_itof(args.border_color); |
152 rectangle->border_color = args.border_color; |
153 |
153 |
154 asc_ptr_cast(AscSceneNode, node, rectangle); |
154 asc_ptr_cast(AscSceneNode, node, rectangle); |
155 asc_scene_node_init(node, |
155 asc_scene_node_init(node, |
156 ASC_SCENE_NODE_FUNCS(asc_rectangle), |
156 ASC_SCENE_NODE_FUNCS(asc_rectangle), |
157 .pos2d = ASC_VEC2I(pos_x, pos_y), |
157 .pos2d = ASC_VEC2I(pos_x, pos_y), |
158 .origin2d = ASC_VEC2I(args.origin_x, args.origin_y), |
158 .origin2d = ASC_VEC2I(args.origin_x, args.origin_y), |
159 .render_group = (args.filled && args.color.alpha < 255) || args.border_color.alpha < 255 |
159 .render_group = (args.filled && args.color.alpha < 1) || args.border_color.alpha < 1 |
160 ? ASC_RENDER_GROUP_2D_BLEND |
160 ? ASC_RENDER_GROUP_2D_BLEND |
161 : ASC_RENDER_GROUP_2D_OPAQUE |
161 : ASC_RENDER_GROUP_2D_OPAQUE |
162 ); |
162 ); |
163 return node; |
163 return node; |
164 } |
164 } |
252 |
252 |
253 // Upload uniforms |
253 // Upload uniforms |
254 asc_shader_upload_model_matrix(shader, node); |
254 asc_shader_upload_model_matrix(shader, node); |
255 |
255 |
256 if (filled) { |
256 if (filled) { |
257 asc_shader_upload_col4f(ellipsis_shader->color, ellipsis->color); |
257 asc_shader_upload_color(ellipsis_shader->color, ellipsis->color); |
258 } |
258 } |
259 asc_shader_upload_vec2f(ellipsis_shader->radii, ellipsis->radii); |
259 asc_shader_upload_vec2f(ellipsis_shader->radii, ellipsis->radii); |
260 |
260 |
261 if (border) { |
261 if (border) { |
262 asc_shader_upload_float(ellipsis_shader->thickness, ellipsis->thickness); |
262 asc_shader_upload_float(ellipsis_shader->thickness, ellipsis->thickness); |
263 asc_shader_upload_col4f(ellipsis_shader->border_color, ellipsis->border_color); |
263 asc_shader_upload_color(ellipsis_shader->border_color, ellipsis->border_color); |
264 } |
264 } |
265 |
265 |
266 // Draw mesh |
266 // Draw mesh |
267 asc_mesh_draw_triangle_strip(&ellipsis->mesh); |
267 asc_mesh_draw_triangle_strip(&ellipsis->mesh); |
268 } |
268 } |
293 ellipsis->thickness = 1; |
293 ellipsis->thickness = 1; |
294 } else { |
294 } else { |
295 ellipsis->thickness = args.thickness; |
295 ellipsis->thickness = args.thickness; |
296 } |
296 } |
297 |
297 |
298 if (!args.filled && asc_memcmpz(&args.border_color, sizeof(args.border_color))) { |
298 if (!args.filled && asc_memcmpz(&args.border_color, sizeof(asc_color))) { |
299 // convenience fallback: |
299 // convenience fallback: |
300 // when we are drawing an outline but have no explicit border color, |
300 // when we are drawing an outline but have no explicit border color, |
301 // use the main color |
301 // use the main color |
302 args.border_color = args.color; |
302 args.border_color = args.color; |
303 } |
303 } |
304 ellipsis->color = asc_col_itof(args.color); |
304 ellipsis->color = args.color; |
305 ellipsis->border_color = asc_col_itof(args.border_color); |
305 ellipsis->border_color = args.border_color; |
306 |
306 |
307 asc_ptr_cast(AscSceneNode, node, ellipsis); |
307 asc_ptr_cast(AscSceneNode, node, ellipsis); |
308 asc_scene_node_init(node, |
308 asc_scene_node_init(node, |
309 ASC_SCENE_NODE_FUNCS(asc_ellipsis), |
309 ASC_SCENE_NODE_FUNCS(asc_ellipsis), |
310 .pos2d = ASC_VEC2I(pos_x, pos_y), |
310 .pos2d = ASC_VEC2I(pos_x, pos_y), |
311 .origin3d = ASC_VEC3F(ellipsis->radii.x, ellipsis->radii.y, 0), // use float to avoid cast |
311 .origin3d = ASC_VEC3F(ellipsis->radii.x, ellipsis->radii.y, 0), // use float to avoid cast |
312 .render_group = (args.filled && args.color.alpha < 255) || args.border_color.alpha < 255 |
312 .render_group = (args.filled && args.color.alpha < 1) || args.border_color.alpha < 1 |
313 ? ASC_RENDER_GROUP_2D_BLEND |
313 ? ASC_RENDER_GROUP_2D_BLEND |
314 : ASC_RENDER_GROUP_2D_OPAQUE |
314 : ASC_RENDER_GROUP_2D_OPAQUE |
315 ); |
315 ); |
316 return node; |
316 return node; |
317 } |
317 } |