aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2020-05-11 10:56:19 +0200
committerCharles <sircharlesaze@gmail.com>2020-05-11 10:56:19 +0200
commit0700a8f567ab733a57fe688e45e5092d3fa1c1a0 (patch)
tree019beaec7d2228729877778a7798909a7db69254 /src
parent6623e7fbdb4307536d3f5920c267c74f8bc6a989 (diff)
downloadscop-0700a8f567ab733a57fe688e45e5092d3fa1c1a0.tar.gz
scop-0700a8f567ab733a57fe688e45e5092d3fa1c1a0.tar.bz2
scop-0700a8f567ab733a57fe688e45e5092d3fa1c1a0.zip
Shader, first drawing
Diffstat (limited to 'src')
-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
5 files changed, 119 insertions, 9 deletions
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);
+}