aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--inc/scop.h13
-rw-r--r--shader/fragment.glsl8
-rw-r--r--shader/vertex.glsl8
-rw-r--r--src/error.c17
-rw-r--r--src/gl.c21
-rw-r--r--src/glfw.c14
-rw-r--r--src/main.c12
-rw-r--r--src/shader.c64
m---------vendor/libft0
9 files changed, 146 insertions, 11 deletions
diff --git a/inc/scop.h b/inc/scop.h
index 3d5c966..3c16af8 100644
--- a/inc/scop.h
+++ b/inc/scop.h
@@ -6,7 +6,7 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/05/09 10:41:44 by charles #+# #+# */
-/* Updated: 2020/05/11 02:10:09 by charles ### ########.fr */
+/* Updated: 2020/05/11 10:33:29 by charles ### ########.fr */
/* */
/* ************************************************************************** */
@@ -34,6 +34,8 @@ typedef struct
{
unsigned int vertex_buf;
unsigned int index_buf;
+ unsigned int vertex_array;
+ unsigned int shader;
} t_gl_state;
/*
@@ -46,7 +48,8 @@ int parse(char *filepath, t_object *object);
** gl.c
*/
-int gl_state_init(t_gl_state *state, t_object *object);
+int gl_state_init(t_gl_state *state, t_object *object);
+void gl_state_quit(t_gl_state *state, t_object *object);
/*
** error.c
@@ -65,4 +68,10 @@ void error_check(char *code, char *filename, int line_num);
GLFWwindow *glfw_init(int width, int height);
+/*
+** shader.c
+*/
+
+unsigned int shader_new(void);
+
#endif
diff --git a/shader/fragment.glsl b/shader/fragment.glsl
new file mode 100644
index 0000000..6c34349
--- /dev/null
+++ b/shader/fragment.glsl
@@ -0,0 +1,8 @@
+#version 400
+
+out vec4 out_color;
+
+void main()
+{
+ out_color = vec4(1.0, 1.0, 1.0, 1.0);
+}
diff --git a/shader/vertex.glsl b/shader/vertex.glsl
new file mode 100644
index 0000000..a71ad4e
--- /dev/null
+++ b/shader/vertex.glsl
@@ -0,0 +1,8 @@
+#version 400
+
+layout (location = 0) in vec3 v_position;
+
+void main()
+{
+ gl_Position = vec4(v_position, 1.0);
+}
diff --git a/src/error.c b/src/error.c
index 17e2611..7f0a65e 100644
--- a/src/error.c
+++ b/src/error.c
@@ -6,7 +6,7 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/05/11 01:43:45 by charles #+# #+# */
-/* Updated: 2020/05/11 01:55:03 by charles ### ########.fr */
+/* Updated: 2020/05/11 10:42:05 by charles ### ########.fr */
/* */
/* ************************************************************************** */
@@ -28,6 +28,21 @@ void error_check(char *code, char *filename, int line_num)
{
ft_putstr("[ERROR opengl] (");
ft_putnbr(err);
+ if (err == GL_INVALID_OPERATION)
+ {
+ ft_putchar(' ');
+ ft_putstr("GL_INVALID_OPERATION");
+ }
+ else if (err == GL_INVALID_VALUE)
+ {
+ ft_putchar(' ');
+ ft_putstr("GL_INVALID_VALUE");
+ }
+ else if (err == GL_INVALID_ENUM)
+ {
+ ft_putchar(' ');
+ ft_putstr("GL_INVALID_ENUM");
+ }
ft_putstr(") ");
ft_putstr(code);
ft_putstr(" at ");
diff --git a/src/gl.c b/src/gl.c
index c28bf9e..82e33a9 100644
--- a/src/gl.c
+++ b/src/gl.c
@@ -6,14 +6,16 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/05/11 01:31:10 by charles #+# #+# */
-/* Updated: 2020/05/11 02:17:16 by charles ### ########.fr */
+/* Updated: 2020/05/11 10:42:42 by charles ### ########.fr */
/* */
/* ************************************************************************** */
#include "scop.h"
-int gl_state_init(t_gl_state *state, t_object *object)
+int gl_state_init(t_gl_state *state, t_object *object)
{
+ if ((state->shader = shader_new()) == 0)
+ return (-1);
GL_CALL(glGenBuffers(1, &state->vertex_buf));
GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, state->vertex_buf));
GL_CALL(glBufferData(GL_ARRAY_BUFFER, sizeof(float) * object->vertices_len,
@@ -23,5 +25,20 @@ int gl_state_init(t_gl_state *state, t_object *object)
GL_CALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, state->index_buf));
GL_CALL(glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(float) * object->indices_len,
object->indices, GL_STATIC_DRAW));
+
+ GL_CALL(glGenVertexArrays(1, &state->vertex_array));
+ GL_CALL(glBindVertexArray(state->vertex_array));
+ GL_CALL(glEnableVertexAttribArray(0));
+ GL_CALL(glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 3, (const void*)0));
return (0);
}
+
+void gl_state_quit(t_gl_state *state, t_object *object)
+{
+ GL_CALL(glDeleteVertexArrays(1, &state->vertex_array));
+ GL_CALL(glDeleteBuffers(1, &state->vertex_buf));
+ GL_CALL(glDeleteBuffers(1, &state->index_buf));
+ GL_CALL(glDeleteProgram(state->shader));
+ free(object->vertices);
+ free(object->indices);
+}
diff --git a/src/glfw.c b/src/glfw.c
index 8afdfe4..a492c08 100644
--- a/src/glfw.c
+++ b/src/glfw.c
@@ -6,7 +6,7 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/05/11 01:58:00 by charles #+# #+# */
-/* Updated: 2020/05/11 02:16:58 by charles ### ########.fr */
+/* Updated: 2020/05/11 09:41:51 by charles ### ########.fr */
/* */
/* ************************************************************************** */
@@ -18,6 +18,9 @@ GLFWwindow *glfw_init(int width, int height)
if (!glfwInit())
return (NULL);
+ glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
+ glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
+ glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
window = glfwCreateWindow(width, height, "scop", NULL, NULL);
if (window == NULL)
{
@@ -25,6 +28,13 @@ GLFWwindow *glfw_init(int width, int height)
return (NULL);
}
glfwMakeContextCurrent(window);
- glewInit();
+ if (glewInit() != GLEW_OK)
+ {
+ glfwDestroyWindow(window);
+ glfwTerminate();
+ return (NULL);
+ }
+ glfwSwapInterval(1);
+ glViewport(0, 0, width, height);
return (window);
}
diff --git a/src/main.c b/src/main.c
index 4ac263a..1dcc36c 100644
--- a/src/main.c
+++ b/src/main.c
@@ -6,7 +6,7 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/05/09 10:20:09 by charles #+# #+# */
-/* Updated: 2020/05/11 02:14:14 by charles ### ########.fr */
+/* Updated: 2020/05/11 10:49:17 by charles ### ########.fr */
/* */
/* ************************************************************************** */
@@ -43,12 +43,16 @@ int main(int argc, char **argv)
return (1);
while (!glfwWindowShouldClose(window))
{
- glClear(GL_COLOR_BUFFER_BIT);
+ GL_CALL(glClear(GL_COLOR_BUFFER_BIT));
+ GL_CALL(glUseProgram(state.shader));
+ GL_CALL(glBindVertexArray(state.vertex_array));
+ GL_CALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, state.index_buf));
+ GL_CALL(glDrawElements(GL_TRIANGLES, object.vertices_len, GL_UNSIGNED_INT, (const void*)0));
glfwSwapBuffers(window);
glfwPollEvents();
}
+ gl_state_quit(&state, &object);
+ glfwDestroyWindow(window);
glfwTerminate();
- free(object.vertices);
- free(object.indices);
return 0;
}
diff --git a/src/shader.c b/src/shader.c
new file mode 100644
index 0000000..4934dcd
--- /dev/null
+++ b/src/shader.c
@@ -0,0 +1,64 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* shader.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/05/11 09:35:54 by charles #+# #+# */
+/* Updated: 2020/05/11 10:54:14 by charles ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "scop.h"
+
+#define SHADER_VERTEX_FILEPATH "shader/vertex.glsl"
+#define SHADER_FRAGMENT_FILEPATH "shader/fragment.glsl"
+
+static unsigned int st_compile(char *filepath, unsigned int type)
+{
+ char *src;
+ unsigned int id;
+ int result;
+ int len;
+ char *msg;
+
+ if ((src = ft_getfile(open(filepath, O_RDONLY))) == NULL)
+ return (0);
+ GL_CALL(id = glCreateShader(type));
+ GL_CALL(glShaderSource(id, 1, (const char**)&src, NULL));
+ free(src);
+ GL_CALL(glCompileShader(id));
+ GL_CALL(glGetShaderiv(id, GL_COMPILE_STATUS, &result));
+ if (result == GL_FALSE)
+ {
+ GL_CALL(glGetShaderiv(id, GL_INFO_LOG_LENGTH, &len));
+ if ((msg = malloc(sizeof(char) * (len + 1))) == NULL)
+ return (0);
+ GL_CALL(glGetShaderInfoLog(id, len, &len, msg));
+ ft_putendl(msg);
+ free(msg);
+ GL_CALL(glDeleteShader(id));
+ return (0);
+ }
+ return (id);
+}
+
+unsigned int shader_new(void)
+{
+ unsigned int shader_vertex;
+ unsigned int shader_fragment;
+ unsigned int program;
+
+ if ((shader_vertex = st_compile(SHADER_VERTEX_FILEPATH, GL_VERTEX_SHADER)) == 0
+ || (shader_fragment = st_compile(SHADER_FRAGMENT_FILEPATH, GL_FRAGMENT_SHADER)) == 0)
+ return (0);
+ GL_CALL(program = glCreateProgram());
+ GL_CALL(glAttachShader(program, shader_vertex));
+ GL_CALL(glAttachShader(program, shader_fragment));
+ GL_CALL(glLinkProgram(program));
+ GL_CALL(glValidateProgram(program));
+ GL_CALL(glDeleteShader(shader_vertex));
+ GL_CALL(glDeleteShader(shader_fragment));
+ return (program);
+}
diff --git a/vendor/libft b/vendor/libft
-Subproject d3fb362c2e0b83cc9754a05ae5bc4a68a5f9269
+Subproject a4b9cda7d6733f2b077f8586e3b3e69351e7dfb