30 #include "ascension/constants.h" |
30 #include "ascension/constants.h" |
31 #include "ascension/context.h" |
31 #include "ascension/context.h" |
32 #include "ascension/error.h" |
32 #include "ascension/error.h" |
33 #include "ascension/shader.h" |
33 #include "ascension/shader.h" |
34 |
34 |
35 // TODO: implement abstraction in shader.h to remove glew.h include here |
|
36 #include <GL/glew.h> |
|
37 #include <assert.h> |
35 #include <assert.h> |
38 |
36 |
39 typedef struct asc_rectangle_shader_s { |
37 typedef struct asc_rectangle_shader_s { |
40 AscShaderProgram program; |
38 AscShaderProgram program; |
41 GLint color; |
39 asc_uniform_loc color; |
42 GLint border_color; |
40 asc_uniform_loc border_color; |
43 GLint size; |
41 asc_uniform_loc size; |
44 GLint thickness; |
42 asc_uniform_loc thickness; |
45 GLint radius; |
43 asc_uniform_loc radius; |
46 } AscRectangleShader; |
44 } AscRectangleShader; |
47 |
45 |
48 #define ASC_RECTANGLE_SHADER_FLAG_FILL 1 |
46 #define ASC_RECTANGLE_SHADER_FLAG_FILL 1 |
49 #define ASC_RECTANGLE_SHADER_FLAG_ROUND 2 |
47 #define ASC_RECTANGLE_SHADER_FLAG_ROUND 2 |
50 #define ASC_RECTANGLE_SHADER_FLAG_BORDER 4 |
48 #define ASC_RECTANGLE_SHADER_FLAG_BORDER 4 |
69 AscRectangleShader *shader = asc_shader_create(codes, sizeof(*shader)); |
67 AscRectangleShader *shader = asc_shader_create(codes, sizeof(*shader)); |
70 if (asc_shader_invalid(&shader->program)) { |
68 if (asc_shader_invalid(&shader->program)) { |
71 asc_shader_free_codes(codes); |
69 asc_shader_free_codes(codes); |
72 return (AscShaderProgram*) shader; |
70 return (AscShaderProgram*) shader; |
73 } |
71 } |
74 shader->size = glGetUniformLocation(shader->program.gl_id, "size"); |
72 shader->size = asc_shader_get_uniform_loc(&shader->program, "size"); |
75 if (asc_test_flag(flags, ASC_RECTANGLE_SHADER_FLAG_FILL)) { |
73 if (asc_test_flag(flags, ASC_RECTANGLE_SHADER_FLAG_FILL)) { |
76 shader->color = glGetUniformLocation(shader->program.gl_id, "color"); |
74 shader->color = asc_shader_get_uniform_loc(&shader->program, "color"); |
77 } else { |
75 } else { |
78 shader->color = -1; |
76 shader->color = -1; |
79 } |
77 } |
80 if (asc_test_flag(flags, ASC_RECTANGLE_SHADER_FLAG_BORDER)) { |
78 if (asc_test_flag(flags, ASC_RECTANGLE_SHADER_FLAG_BORDER)) { |
81 shader->thickness = glGetUniformLocation(shader->program.gl_id, "thickness"); |
79 shader->thickness = asc_shader_get_uniform_loc(&shader->program, "thickness"); |
82 shader->border_color = glGetUniformLocation(shader->program.gl_id, "border_color"); |
80 shader->border_color = asc_shader_get_uniform_loc(&shader->program, "border_color"); |
83 } else { |
81 } else { |
84 shader->thickness = -1; |
82 shader->thickness = -1; |
85 shader->border_color = -1; |
83 shader->border_color = -1; |
86 } |
84 } |
87 if (asc_test_flag(flags, ASC_RECTANGLE_SHADER_FLAG_ROUND)) { |
85 if (asc_test_flag(flags, ASC_RECTANGLE_SHADER_FLAG_ROUND)) { |
88 shader->radius = glGetUniformLocation(shader->program.gl_id, "radius"); |
86 shader->radius = asc_shader_get_uniform_loc(&shader->program, "radius"); |
89 } else { |
87 } else { |
90 shader->radius = -1; |
88 shader->radius = -1; |
91 } |
89 } |
92 asc_shader_free_codes(codes); |
90 asc_shader_free_codes(codes); |
93 |
91 |