48 #define ASC_RECTANGLE_SHADER_FLAG_ROUND 2 |
48 #define ASC_RECTANGLE_SHADER_FLAG_ROUND 2 |
49 #define ASC_RECTANGLE_SHADER_FLAG_BORDER 4 |
49 #define ASC_RECTANGLE_SHADER_FLAG_BORDER 4 |
50 |
50 |
51 static AscShaderProgram *asc_rectangle_shader_create(int flags) { |
51 static AscShaderProgram *asc_rectangle_shader_create(int flags) { |
52 AscShaderCodes codes; |
52 AscShaderCodes codes; |
53 // TODO: create a utility that rolls out those defines |
|
54 const char * const defines[] = { |
53 const char * const defines[] = { |
55 "#define FILL\n", |
54 "#define FILL\n", |
56 "#define ROUNDED_CORNERS\n", |
55 "#define ROUNDED_CORNERS\n", |
57 "#define BORDER\n" |
56 "#define BORDER\n" |
58 }; |
57 }; |
60 .files.vtx = "sprite_vtx.glsl", |
59 .files.vtx = "sprite_vtx.glsl", |
61 .files.frag = "rectangle_frag.glsl", |
60 .files.frag = "rectangle_frag.glsl", |
62 .defines.frag_list = defines, |
61 .defines.frag_list = defines, |
63 .defines.frag_list_select = flags |
62 .defines.frag_list_select = flags |
64 }, &codes)) { |
63 }, &codes)) { |
65 asc_error("Loading sprite shader failed."); |
64 asc_error("Loading rectangle shader failed."); |
66 return NULL; |
65 return NULL; |
67 } |
66 } |
68 AscRectangleShader *shader = asc_shader_create(codes, sizeof(*shader)); |
67 AscRectangleShader *shader = asc_shader_create(codes, sizeof(*shader)); |
69 if (asc_has_error()) { |
68 if (asc_has_error()) { |
70 asc_shader_free_codes(codes); |
69 asc_shader_free_codes(codes); |
117 int shader_flags = 0; |
116 int shader_flags = 0; |
118 if (filled) shader_flags |= ASC_RECTANGLE_SHADER_FLAG_FILL; |
117 if (filled) shader_flags |= ASC_RECTANGLE_SHADER_FLAG_FILL; |
119 if (border) shader_flags |= ASC_RECTANGLE_SHADER_FLAG_BORDER; |
118 if (border) shader_flags |= ASC_RECTANGLE_SHADER_FLAG_BORDER; |
120 if (round) shader_flags |= ASC_RECTANGLE_SHADER_FLAG_ROUND; |
119 if (round) shader_flags |= ASC_RECTANGLE_SHADER_FLAG_ROUND; |
121 |
120 |
122 // Compute shader ID |
121 // Lookup table for the shader ID |
123 const int shader_ids[] = { |
122 const int shader_ids[] = { |
124 -1, // unused |
123 -1, // unused |
125 ASC_SHADER_RECTANGLE_FILL, |
124 ASC_SHADER_RECTANGLE_FILL, |
126 ASC_SHADER_RECTANGLE_DRAW_ROUND, |
125 ASC_SHADER_RECTANGLE_DRAW_ROUND, |
127 ASC_SHADER_RECTANGLE_FILL_ROUND, |
126 ASC_SHADER_RECTANGLE_FILL_ROUND, |
132 }; |
131 }; |
133 |
132 |
134 // Look up and activate shader |
133 // Look up and activate shader |
135 const AscRectangleShader *shader = asc_shader_lookup_or_create( |
134 const AscRectangleShader *shader = asc_shader_lookup_or_create( |
136 shader_ids[shader_flags], asc_rectangle_shader_create, shader_flags); |
135 shader_ids[shader_flags], asc_rectangle_shader_create, shader_flags); |
|
136 if (shader == NULL) return; |
137 asc_shader_use(&shader->program, camera); |
137 asc_shader_use(&shader->program, camera); |
138 |
138 |
139 // Upload uniforms |
139 // Upload uniforms |
140 // TODO: uploading model matrix could be a helper function |
140 // TODO: uploading model matrix could be a helper function |
141 glUniformMatrix4fv(shader->program.model, 1, |
141 glUniformMatrix4fv(shader->program.model, 1, |