src/2d.c

changeset 222
2cb9a71df7a6
parent 221
14eddd43b3f7
child 223
4f32c7755138
equal deleted inserted replaced
221:14eddd43b3f7 222:2cb9a71df7a6
44 44
45 #define ASC_RECTANGLE_SHADER_FLAG_FILL 1 45 #define ASC_RECTANGLE_SHADER_FLAG_FILL 1
46 #define ASC_RECTANGLE_SHADER_FLAG_ROUND 2 46 #define ASC_RECTANGLE_SHADER_FLAG_ROUND 2
47 #define ASC_RECTANGLE_SHADER_FLAG_BORDER 4 47 #define ASC_RECTANGLE_SHADER_FLAG_BORDER 4
48 48
49 static void asc_rectangle_shader_init(AscShaderProgram *shader, int flags) {
50 asc_shader_init_uniform_loc_nice(shader, AscRectangleShader, size);
51 if (asc_test_flag(flags, ASC_RECTANGLE_SHADER_FLAG_FILL)) {
52 asc_shader_init_uniform_loc_nice(shader, AscRectangleShader, color);
53 }
54 if (asc_test_flag(flags, ASC_RECTANGLE_SHADER_FLAG_BORDER)) {
55 asc_shader_init_uniform_loc_nice(shader, AscRectangleShader, border_color);
56 asc_shader_init_uniform_loc_nice(shader, AscRectangleShader, thickness);
57 }
58 if (asc_test_flag(flags, ASC_RECTANGLE_SHADER_FLAG_ROUND)) {
59 asc_shader_init_uniform_loc_nice(shader, AscRectangleShader, radius);
60 }
61 }
62
49 static AscShaderProgram *asc_rectangle_shader_create(int flags) { 63 static AscShaderProgram *asc_rectangle_shader_create(int flags) {
50 AscShaderCodes codes;
51 const char * const defines[] = { 64 const char * const defines[] = {
52 "#define FILL\n", 65 "#define FILL\n",
53 "#define ROUNDED_CORNERS\n", 66 "#define ROUNDED_CORNERS\n",
54 "#define BORDER\n" 67 "#define BORDER\n"
55 }; 68 };
56 if (asc_shader_load_code_files((AscShaderCodeInfo){ 69 return asc_shader_create((AscShaderCodeInfo){
57 .files.vtx = "sprite_vtx.glsl", 70 .files.vtx = "sprite_vtx.glsl",
58 .files.frag = "rectangle_frag.glsl", 71 .files.frag = "rectangle_frag.glsl",
59 .defines.frag_list = defines, 72 .defines.frag_list = defines,
60 .defines.frag_list_select = flags 73 .defines.frag_list_select = flags
61 }, &codes)) { 74 }, sizeof(AscRectangleShader), asc_rectangle_shader_init, flags);
62 asc_error("Loading rectangle shader failed.");
63 return NULL;
64 }
65 AscShaderProgram *shader = asc_shader_create(codes, sizeof(AscRectangleShader));
66 if (asc_shader_invalid(shader)) {
67 asc_shader_free_codes(codes);
68 return shader;
69 }
70 asc_ptr_cast(AscRectangleShader, rect_shader, shader);
71 rect_shader->size = asc_shader_get_uniform_loc(shader, "size");
72 if (asc_test_flag(flags, ASC_RECTANGLE_SHADER_FLAG_FILL)) {
73 rect_shader->color = asc_shader_get_uniform_loc(shader, "color");
74 } else {
75 rect_shader->color = -1;
76 }
77 if (asc_test_flag(flags, ASC_RECTANGLE_SHADER_FLAG_BORDER)) {
78 rect_shader->thickness = asc_shader_get_uniform_loc(shader, "thickness");
79 rect_shader->border_color = asc_shader_get_uniform_loc(shader, "border_color");
80 } else {
81 rect_shader->thickness = -1;
82 rect_shader->border_color = -1;
83 }
84 if (asc_test_flag(flags, ASC_RECTANGLE_SHADER_FLAG_ROUND)) {
85 rect_shader->radius = asc_shader_get_uniform_loc(shader, "radius");
86 } else {
87 rect_shader->radius = -1;
88 }
89 asc_shader_free_codes(codes);
90
91 if (asc_error_catch_gl("Creating rectangle shader")) {
92 // TODO: error handling
93 }
94
95 return shader;
96 } 75 }
97 76
98 static void asc_rectangle_destroy(AscSceneNode *node) { 77 static void asc_rectangle_destroy(AscSceneNode *node) {
99 asc_ptr_cast(AscRectangle, rectangle, node); 78 asc_ptr_cast(AscRectangle, rectangle, node);
100 asc_mesh_destroy(&rectangle->mesh); 79 asc_mesh_destroy(&rectangle->mesh);
222 } AscEllipsisShader; 201 } AscEllipsisShader;
223 202
224 #define ASC_ELLIPSIS_SHADER_FLAG_FILL 1 203 #define ASC_ELLIPSIS_SHADER_FLAG_FILL 1
225 #define ASC_ELLIPSIS_SHADER_FLAG_BORDER 2 204 #define ASC_ELLIPSIS_SHADER_FLAG_BORDER 2
226 205
206 static void asc_ellipsis_shader_init(AscShaderProgram *shader, int flags) {
207 asc_shader_init_uniform_loc_nice(shader, AscEllipsisShader, radii);
208 if (asc_test_flag(flags, ASC_ELLIPSIS_SHADER_FLAG_FILL)) {
209 asc_shader_init_uniform_loc_nice(shader, AscEllipsisShader, color);
210 }
211 if (asc_test_flag(flags, ASC_ELLIPSIS_SHADER_FLAG_BORDER)) {
212 asc_shader_init_uniform_loc_nice(shader, AscEllipsisShader, thickness);
213 asc_shader_init_uniform_loc_nice(shader, AscEllipsisShader, border_color);
214 }
215 }
216
227 static AscShaderProgram *asc_ellipsis_shader_create(int flags) { 217 static AscShaderProgram *asc_ellipsis_shader_create(int flags) {
228 AscShaderCodes codes;
229 const char * const defines[] = { 218 const char * const defines[] = {
230 "#define FILL\n", 219 "#define FILL\n",
231 "#define BORDER\n" 220 "#define BORDER\n"
232 }; 221 };
233 if (asc_shader_load_code_files((AscShaderCodeInfo){ 222 return asc_shader_create((AscShaderCodeInfo){
234 .files.vtx = "sprite_vtx.glsl", 223 .files.vtx = "sprite_vtx.glsl",
235 .files.frag = "ellipsis_frag.glsl", 224 .files.frag = "ellipsis_frag.glsl",
236 .defines.frag_list = defines, 225 .defines.frag_list = defines,
237 .defines.frag_list_select = flags 226 .defines.frag_list_select = flags
238 }, &codes)) { 227 }, sizeof(AscEllipsisShader), asc_ellipsis_shader_init, flags);
239 asc_error("Loading ellipsis shader failed.");
240 return NULL;
241 }
242 AscShaderProgram *shader = asc_shader_create(codes, sizeof(AscRectangleShader));
243 if (asc_shader_invalid(shader)) {
244 asc_shader_free_codes(codes);
245 return shader;
246 }
247 asc_ptr_cast(AscEllipsisShader, ellipsis_shader, shader);
248 ellipsis_shader->radii = asc_shader_get_uniform_loc(shader, "radii");
249 if (asc_test_flag(flags, ASC_ELLIPSIS_SHADER_FLAG_FILL)) {
250 ellipsis_shader->color = asc_shader_get_uniform_loc(shader, "color");
251 } else {
252 ellipsis_shader->color = -1;
253 }
254 if (asc_test_flag(flags, ASC_ELLIPSIS_SHADER_FLAG_BORDER)) {
255 ellipsis_shader->thickness = asc_shader_get_uniform_loc(shader, "thickness");
256 ellipsis_shader->border_color = asc_shader_get_uniform_loc(shader, "border_color");
257 } else {
258 ellipsis_shader->thickness = -1;
259 ellipsis_shader->border_color = -1;
260 }
261 asc_shader_free_codes(codes);
262
263 if (asc_error_catch_gl("Creating ellipsis shader")) {
264 // TODO: error handling
265 }
266
267 return shader;
268 } 228 }
269 229
270 static void asc_ellipsis_draw(const AscCamera *camera, const AscSceneNode *node) { 230 static void asc_ellipsis_draw(const AscCamera *camera, const AscSceneNode *node) {
271 asc_cptr_cast(AscEllipsis, ellipsis, node); 231 asc_cptr_cast(AscEllipsis, ellipsis, node);
272 232

mercurial