src/2d.c

changeset 161
4c8b9c6d241f
parent 160
80700db530ff
equal deleted inserted replaced
160:80700db530ff 161:4c8b9c6d241f
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,

mercurial