diff options
| -rw-r--r-- | inc/scop.h | 13 | ||||
| -rw-r--r-- | shader/fragment.glsl | 8 | ||||
| -rw-r--r-- | shader/vertex.glsl | 8 | ||||
| -rw-r--r-- | src/error.c | 17 | ||||
| -rw-r--r-- | src/gl.c | 21 | ||||
| -rw-r--r-- | src/glfw.c | 14 | ||||
| -rw-r--r-- | src/main.c | 12 | ||||
| -rw-r--r-- | src/shader.c | 64 | ||||
| m--------- | vendor/libft | 0 |
9 files changed, 146 insertions, 11 deletions
@@ -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 "); @@ -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); +} @@ -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); } @@ -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 |
