summaryrefslogtreecommitdiff
path: root/src/scene01.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/scene01.c')
-rw-r--r--src/scene01.c80
1 files changed, 17 insertions, 63 deletions
diff --git a/src/scene01.c b/src/scene01.c
index a93aa3d..05457bc 100644
--- a/src/scene01.c
+++ b/src/scene01.c
@@ -18,55 +18,9 @@
* along with demoscene-eo. If not, see <http://www.gnu.org/licenses/>
*/
#include "scene01.h"
+#include "utils.h"
// Mostly inspired by CC0 https://gist.github.com/koute/7391344
-typedef float t_mat4x4[16];
-
-static inline void mat4x4_ortho(t_mat4x4 out, float left, float right, float bottom, float top, float znear, float zfar)
-{
- #define T(a, b) (a * 4 + b)
-
- out[T(0,0)] = 2.0f / (right - left);
- out[T(0,1)] = 0.0f;
- out[T(0,2)] = 0.0f;
- out[T(0,3)] = 0.0f;
-
- out[T(1,1)] = 2.0f / (top - bottom);
- out[T(1,0)] = 0.0f;
- out[T(1,2)] = 0.0f;
- out[T(1,3)] = 0.0f;
-
- out[T(2,2)] = -2.0f / (zfar - znear);
- out[T(2,0)] = 0.0f;
- out[T(2,1)] = 0.0f;
- out[T(2,3)] = 0.0f;
-
- out[T(3,0)] = -(right + left) / (right - left);
- out[T(3,1)] = -(top + bottom) / (top - bottom);
- out[T(3,2)] = -(zfar + znear) / (zfar - znear);
- out[T(3,3)] = 1.0f;
-
- #undef T
-}
-
-static const char * vertex_shader =
- "#version 130\n"
- "in vec2 i_position;\n"
- "in vec4 i_color;\n"
- "out vec4 v_color;\n"
- "uniform mat4 u_projection_matrix;\n"
- "void main() {\n"
- " v_color = i_color;\n"
- " gl_Position = u_projection_matrix * vec4(i_position, 0.0, 1.0);\n"
- "}\n";
-
-static const char * fragment_shader =
- "#version 130\n"
- "in vec4 v_color;\n"
- "out vec4 o_color;\n"
- "void main() {\n"
- " o_color = v_color;\n"
- "}\n";
typedef enum t_attrib_id
{
@@ -81,29 +35,29 @@ int scene01_init_gl(graphical_env_t *ge, scene01_env_t *se) {
TRACE("call");
vs = glCreateShader(GL_VERTEX_SHADER);
- fs = glCreateShader(GL_FRAGMENT_SHADER);
+ status = gl_compile_shader_from_file(vs, "res/scene01_vs_basic.glsl"); if (status) return 40+status;
- int length = strlen(vertex_shader);
- glShaderSource(vs, 1, (const GLchar **)&vertex_shader, &length);
- glCompileShader(vs);
-
- glGetShaderiv(vs, GL_COMPILE_STATUS, &status);
- if(status == GL_FALSE) return 40;
-
- length = strlen(fragment_shader);
- glShaderSource(fs, 1, (const GLchar **)&fragment_shader, &length);
- glCompileShader(fs);
-
- glGetShaderiv(fs, GL_COMPILE_STATUS, &status);
- if(status == GL_FALSE) return 41;
+ fs = glCreateShader(GL_FRAGMENT_SHADER);
+ status = gl_compile_shader_from_file(fs, "res/scene01_fs_colorfultest.glsl"); if (status) return 50+status;
program = glCreateProgram();
glAttachShader(program, vs);
glAttachShader(program, fs);
-
glBindAttribLocation(program, attrib_position, "i_position");
glBindAttribLocation(program, attrib_color, "i_color");
+
glLinkProgram(program);
+ glGetProgramiv(program, GL_LINK_STATUS, &status);
+
+ glDetachShader(program, vs);
+ glDetachShader(program, fs);
+ glDeleteShader(vs);
+ glDeleteShader(fs);
+
+ if(status == GL_FALSE) {
+ gl_trace_shader_or_program_log(program);
+ return 60;
+ }
glUseProgram(program);
@@ -171,7 +125,7 @@ int scene01_init_gl(graphical_env_t *ge, scene01_env_t *se) {
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);
t_mat4x4 projection_matrix;
- mat4x4_ortho(projection_matrix, 0.0f, (float)FBUF_W, (float)FBUF_H, 0.0f, 0.0f, 100.0f);
+ gl_mat4x4_ortho(projection_matrix, 0.0f, (float)FBUF_W, (float)FBUF_H, 0.0f, 0.0f, 100.0f);
glUniformMatrix4fv(glGetUniformLocation(program, "u_projection_matrix"), 1, GL_FALSE, projection_matrix);