From 23ba151d95e4284ddb2d5f1c9810741061c293fd Mon Sep 17 00:00:00 2001 From: Charles Date: Thu, 14 May 2020 16:44:28 +0200 Subject: Refactoring to the point before started refactoring, without crash on texture binding --- Makefile | 3 +- inc/scop.h | 55 ++++++++++------ shader/fragment.glsl | 6 +- shader/vertex.glsl | 10 +-- src/color.c | 75 +++++++-------------- src/error.c | 20 +++--- src/graphic/event.c | 72 +++++++++++++++++++++ src/graphic/state.c | 82 +++++++++++++++++++++++ src/helper.c | 33 +++++++++- src/main.c | 72 ++++++--------------- src/parse.c | 15 +++-- src/scene.c | 56 +++++----------- src/shader.c | 13 ++-- src/state.c | 126 ------------------------------------ src/texture.c | 179 +++++++++++++++++++++++++-------------------------- 15 files changed, 408 insertions(+), 409 deletions(-) create mode 100644 src/graphic/event.c create mode 100644 src/graphic/state.c delete mode 100644 src/state.c diff --git a/Makefile b/Makefile index a2b9f2e..fb41877 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: charles +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2020/05/09 10:24:52 by charles #+# #+# # -# Updated: 2020/05/14 14:05:00 by charles ### ########.fr # +# Updated: 2020/05/14 15:30:27 by charles ### ########.fr # # # # **************************************************************************** # @@ -41,6 +41,7 @@ all: prebuild $(NAME) prebuild: @mkdir -p $(OBJ_DIR) + @mkdir -p $(OBJ_DIR)/graphic $(NAME): $(OBJ) libft_all libftm_all @echo "Linking $@" diff --git a/inc/scop.h b/inc/scop.h index 2136dce..50d433c 100644 --- a/inc/scop.h +++ b/inc/scop.h @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/05/09 10:41:44 by charles #+# #+# */ -/* Updated: 2020/05/14 14:58:23 by charles ### ########.fr */ +/* Updated: 2020/05/14 16:29:38 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -29,21 +29,29 @@ #define WINDOW_WIDTH 640 #define WINDOW_HEIGHT 480 +#define VERTEX_COUNT 10 +#define VERTEX_STRIDE (sizeof(float) * VERTEX_COUNT) + +#define VERTEX_POS_OFFSET 0 +#define VERTEX_COLOR_OFFSET 4 +#define VERTEX_TEX_COORD_OFFSET 8 typedef struct { float *vertices; unsigned int *indices; - size_t vertices_size; - size_t indices_size; + size_t vertices_num; + size_t indices_num; + char *texture_filepath; } t_model_data; typedef struct { unsigned int vertex_buf; unsigned int index_buf; - size_t index_buf_size; + size_t index_buf_num; unsigned int vertex_array; + unsigned int texture; struct { t_ftmmat4 center; @@ -61,6 +69,7 @@ typedef struct int model; int view; int proj; + int texture; } location; } t_shader; @@ -90,20 +99,27 @@ union u_color }; /* -** state.c +** graphic/state.c +*/ + +bool state_init(t_state *state, t_model_data *data); +void state_run(t_state *state); +void state_quit(t_state *state); + +/* +** graphic/event.c */ -bool state_init(t_state *state, t_model_data *data); -void state_run(t_state *state); -void state_quit(t_state *state); +void event_handle(t_state *state); /* ** scene.c */ -void scene_init(t_scene *scene, t_model_data *data); -void scene_update_proj(t_scene *scene, float fov, int width, int height); -void scene_update_model(t_scene *scene, float rotation_radian); -void scene_quit(t_scene *scene); + +void scene_init(t_scene *scene, t_model_data *data); +void scene_update_proj(t_scene *scene, float fov, int width, int height); +void scene_update_model(t_scene *scene, float rotation_radian); +void scene_quit(t_scene *scene); /* ** parse.c @@ -128,28 +144,27 @@ void error_check(char *code, char *filename, int line_num); */ bool shader_init(t_shader *shader); -void shader_update_mvp(t_shader *shader, t_scene *scene); +void shader_set_uniforms(t_shader *shader, t_scene *scene); /* ** texture.c */ -unsigned int texture_new(char *filepath); +unsigned int texture_create(char *filepath); +void texture_coord_init(float *vertices, size_t vertices_num); /* ** helper.c */ -bool has_extension(char *filepath, char *extension); +bool helper_check_extension(char *filepath, char *extension); +void helper_find_boundary( + float *vertices, size_t vertices_num, t_ftmvec3 *max, t_ftmvec3 *min); /* ** color.c */ -bool color_merge_vertices(t_model_data *object, float *coords); - - -float *texture_coord_create(float *vertices, size_t vertices_len); - +void color_init(float *vertices, size_t vertices_num); #endif diff --git a/shader/fragment.glsl b/shader/fragment.glsl index b864732..4ada539 100644 --- a/shader/fragment.glsl +++ b/shader/fragment.glsl @@ -1,13 +1,13 @@ #version 400 core in vec4 v_color; -/* in vec2 v_texture_coord; */ +in vec2 v_texture_coord; out vec4 out_color; -/* uniform sampler2D u_texture; */ +uniform sampler2D u_texture; void main() { - out_color = v_color; //+ texture(u_texture, v_texture_coord); + out_color = texture(u_texture, v_texture_coord); } diff --git a/shader/vertex.glsl b/shader/vertex.glsl index f7dd1b2..b26899e 100644 --- a/shader/vertex.glsl +++ b/shader/vertex.glsl @@ -1,19 +1,19 @@ #version 400 core layout (location = 0) in vec4 in_position; -/* layout (location = 1) in vec4 in_color; */ -/* layout (location = 2) in vec2 in_texture_coord; */ +layout (location = 1) in vec4 in_color; +layout (location = 2) in vec2 in_texture_coord; uniform mat4 u_model; uniform mat4 u_view; uniform mat4 u_proj; out vec4 v_color; -/* out vec2 v_texture_coord; */ +out vec2 v_texture_coord; void main() { - v_color = vec4(1.0, 1.0, 1.0, 1.0); //in_color; - /* v_texture_coord = in_texture_coord; */ + v_color = in_color; + v_texture_coord = in_texture_coord; gl_Position = u_proj * u_view * u_model * in_position; } diff --git a/src/color.c b/src/color.c index 166eaaf..6321e24 100644 --- a/src/color.c +++ b/src/color.c @@ -6,60 +6,31 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/05/13 11:53:53 by charles #+# #+# */ -/* Updated: 2020/05/14 13:58:15 by charles ### ########.fr */ +/* Updated: 2020/05/14 16:42:21 by charles ### ########.fr */ /* */ /* ************************************************************************** */ #include "scop.h" -/* float *color_new(size_t n) */ -/* { */ -/* size_t i; */ -/* float step; */ -/* float *colors; */ -/* union u_color c; */ -/* */ -/* if ((colors = malloc(sizeof(float) * (n * 4))) == NULL) */ -/* return (NULL); */ -/* step = 0.8 / (float)n; */ -/* i = 0; */ -/* c.r = 0.1; */ -/* c.g = 0.1; */ -/* c.b = 0.1; */ -/* c.a = 1.0; */ -/* while (i < n) */ -/* { */ -/* c.r += step; */ -/* c.g += step; */ -/* c.b += step; */ -/* ft_memcpy(&colors[i * 4], c.data, 4 * sizeof(float)); */ -/* i++; */ -/* } */ -/* return (colors); */ -/* } */ -/* */ -/* bool color_merge_vertices(t_model_data *data, float *coords) */ -/* { */ -/* size_t i; */ -/* float *colors; */ -/* float *new_vertices; */ -/* */ -/* if ((colors = color_new(data->vertices_len)) == NULL) */ -/* return (false); */ -/* if ((new_vertices = malloc(sizeof(float) * data->vertices_len * (4 + 4 + 2))) == NULL) */ -/* { */ -/* free(colors); */ -/* return (false); */ -/* } */ -/* i = 0; */ -/* while (i < data->vertices_size) */ -/* { */ -/* ft_memcpy(&new_vertices[i * (4 + 4 + 2)], &data->vertices[i * 4], 4 * sizeof(float)); */ -/* ft_memcpy(&new_vertices[i * (4 + 4 + 2) + 4], &colors[i * 4], 4 * sizeof(float)); */ -/* ft_memcpy(&new_vertices[i * (4 + 4 + 2) + 8], &coords[i * 2], 2 * sizeof(float)); */ -/* i++; */ -/* } */ -/* free(data->vertices); */ -/* data->vertices = new_vertices; */ -/* return (true); */ -/* } */ +void color_init(float *vertices, size_t vertices_num) +{ + size_t i; + float step; + union u_color color; + + step = 0.8 / (float)(vertices_num / VERTEX_COUNT); + i = 0; + color.r = 0.1; + color.g = 0.1; + color.b = 0.1; + color.a = 1.0; + while (i < vertices_num) + { + color.r += step; + color.g += step; + color.b += step; + ft_memcpy(&vertices[i + VERTEX_COLOR_OFFSET], + color.data, 4 * sizeof(float)); + i += VERTEX_COUNT; + } +} diff --git a/src/error.c b/src/error.c index 7f0a65e..a80b485 100644 --- a/src/error.c +++ b/src/error.c @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/05/11 01:43:45 by charles #+# #+# */ -/* Updated: 2020/05/11 10:42:05 by charles ### ########.fr */ +/* Updated: 2020/05/14 16:40:27 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,18 +14,18 @@ void error_clear(void) { - while (glGetError() != GL_NO_ERROR) - ; + while (glGetError() != GL_NO_ERROR) + ; } void error_check(char *code, char *filename, int line_num) { - GLenum err; + GLenum err; bool occured; - occured = false; - while ((err = glGetError()) != GL_NO_ERROR) - { + occured = false; + while ((err = glGetError()) != GL_NO_ERROR) + { ft_putstr("[ERROR opengl] ("); ft_putnbr(err); if (err == GL_INVALID_OPERATION) @@ -44,14 +44,14 @@ void error_check(char *code, char *filename, int line_num) ft_putstr("GL_INVALID_ENUM"); } ft_putstr(") "); - ft_putstr(code); + ft_putstr(code); ft_putstr(" at "); ft_putstr(filename); ft_putchar(':'); ft_putnbr(line_num); ft_putchar('\n'); - occured = true; - } + occured = true; + } if (occured) exit(EXIT_FAILURE); } diff --git a/src/graphic/event.c b/src/graphic/event.c new file mode 100644 index 0000000..c5986d4 --- /dev/null +++ b/src/graphic/event.c @@ -0,0 +1,72 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* event.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/05/14 15:25:52 by charles #+# #+# */ +/* Updated: 2020/05/14 16:39:13 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "scop.h" + +static void st_handle_keydown(t_state *state, SDL_Keycode sym) +{ + if (sym == SDLK_ESCAPE) + state->running = false; + else if (sym == SDLK_p) + { + if (state->polygon_mode == GL_FILL) + state->polygon_mode = GL_LINE; + else if (state->polygon_mode == GL_LINE) + state->polygon_mode = GL_POINT; + else if (state->polygon_mode == GL_POINT) + state->polygon_mode = GL_FILL; + GL_CALL(glPolygonMode(GL_FRONT_AND_BACK, state->polygon_mode)); + } +} + +static void st_handle_mousewheel(t_state *state, int y) +{ + if (y > 0) + { + state->fov -= M_PI / 70.0f; + if (state->fov <= M_PI_4 / 3) + state->fov = M_PI_4 / 3; + } + else if (y < 0) + { + state->fov += M_PI / 70.0f; + if (state->fov >= M_PI - M_PI_4 / 3) + state->fov = M_PI - M_PI_4 / 3; + } + scene_update_proj(&state->scene, state->fov, state->width, state->height); +} + +void event_handle(t_state *state) +{ + SDL_Event e; + + while (SDL_PollEvent(&e)) + { + if (e.type == SDL_QUIT) + state->running = false; + else if (e.type == SDL_KEYDOWN) + st_handle_keydown(state, e.key.keysym.sym); + else if (e.type == SDL_MOUSEWHEEL) + st_handle_mousewheel(state, e.wheel.y); + else if (e.type == SDL_WINDOWEVENT) + { + if (e.window.event == SDL_WINDOWEVENT_RESIZED) + { + SDL_GL_GetDrawableSize( + state->window, &state->width, &state->height); + scene_update_proj(&state->scene, state->fov, + state->width, state->height); + glViewport(0, 0, state->width, state->height); + } + } + } +} diff --git a/src/graphic/state.c b/src/graphic/state.c new file mode 100644 index 0000000..c3aaa8e --- /dev/null +++ b/src/graphic/state.c @@ -0,0 +1,82 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* state.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/05/11 01:31:10 by charles #+# #+# */ +/* Updated: 2020/05/14 16:39:59 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "scop.h" + +bool state_init(t_state *state, t_model_data *data) +{ + if (SDL_Init(SDL_INIT_VIDEO) < 0) + return (false); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); + SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); + state->window = SDL_CreateWindow( + "scop", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, + WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE); + if (state->window == NULL) + return (false); + state->context = SDL_GL_CreateContext(state->window); + if (glewInit() != GLEW_OK) + return (false); + SDL_GL_SetSwapInterval(1); + GL_CALL(glEnable(GL_DEPTH_TEST)); + + if (!shader_init(&state->shader) + || (state->scene.texture = texture_create(data->texture_filepath)) == 0) + return (false); + scene_init(&state->scene, data); + + state->fov = M_PI_4; + state->running = true; + state->polygon_mode = GL_FILL; + SDL_GL_GetDrawableSize(state->window, &state->width, &state->height); + GL_CALL(glViewport(0, 0, state->width, state->height)); + return (true); +} + +void state_run(t_state *state) +{ + float rotation; + + scene_update_model(&state->scene, M_PI_4); + scene_update_proj(&state->scene, M_PI_4, state->width, state->height); + rotation = M_PI_4; + while (state->running) + { + GL_CALL(glClearColor(0.1f, 0.1f, 0.1f, 1.0f)); + GL_CALL(glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); + + GL_CALL(glUseProgram(state->shader.id)); + GL_CALL(glActiveTexture(GL_TEXTURE0)); + GL_CALL(glBindTexture(GL_TEXTURE_2D, state->scene.texture)); + shader_set_uniforms(&state->shader, &state->scene); + + GL_CALL(glBindVertexArray(state->scene.vertex_array)); + GL_CALL(glDrawElements(GL_TRIANGLES, + state->scene.index_buf_num, GL_UNSIGNED_INT, (void*)0)); + + scene_update_model(&state->scene, rotation); + SDL_GL_SwapWindow(state->window); + event_handle(state); + rotation += M_PI / 250.0; + } +} + +void state_quit(t_state *state) +{ + scene_quit(&state->scene); + GL_CALL(glDeleteProgram(state->shader.id)); + SDL_GL_DeleteContext(state->context); + SDL_DestroyWindow(state->window); + SDL_Quit(); +} diff --git a/src/helper.c b/src/helper.c index 34fd560..8fd9dcc 100644 --- a/src/helper.c +++ b/src/helper.c @@ -6,16 +6,45 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/05/11 14:55:27 by charles #+# #+# */ -/* Updated: 2020/05/11 14:57:29 by charles ### ########.fr */ +/* Updated: 2020/05/14 16:42:13 by charles ### ########.fr */ /* */ /* ************************************************************************** */ #include "scop.h" -bool has_extension(char *filepath, char *extension) +bool helper_check_extension(char *filepath, char *extension) { char *match; match = ft_strstr(filepath, extension); return (match != NULL && ft_strlen(match) == ft_strlen(extension)); } + +void helper_find_boundary( + float *vertices, + size_t vertices_num, + t_ftmvec3 *max, + t_ftmvec3 *min) +{ + size_t i; + + ftm_vec3init(min, INFINITY, INFINITY, INFINITY); + ftm_vec3init(max, -INFINITY, -INFINITY, -INFINITY); + i = 0; + while (i < vertices_num) + { + if (vertices[i + 0] > max->x) + max->x = vertices[i + 0]; + if (vertices[i + 0] < min->x) + min->x = vertices[i + 0]; + if (vertices[i + 1] > max->y) + max->y = vertices[i + 1]; + if (vertices[i + 1] < min->y) + min->y = vertices[i + 1]; + if (vertices[i + 2] > max->z) + max->z = vertices[i + 2]; + if (vertices[i + 2] < min->z) + min->z = vertices[i + 2]; + i += VERTEX_COUNT; + } +} diff --git a/src/main.c b/src/main.c index c02bc2f..b712a5a 100644 --- a/src/main.c +++ b/src/main.c @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/05/09 10:20:09 by charles #+# #+# */ -/* Updated: 2020/05/14 14:49:02 by charles ### ########.fr */ +/* Updated: 2020/05/14 16:16:24 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,37 +21,6 @@ ** - cleaner code */ -/* void handle_event(GLFWwindow *window) */ -/* { */ -/* if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) */ -/* glfwSetWindowShouldClose(window, true); */ -/* else if (glfwGetKey(window, GLFW_KEY_P) == GLFW_PRESS) */ -/* { */ -/* if (state->polygon_mode_last_time + 0.1 > glfwGetTime()) */ -/* return ; */ -/* if (state->polygon_mode == GL_FILL) */ -/* state->polygon_mode = GL_LINE; */ -/* else if (state->polygon_mode == GL_LINE) */ -/* state->polygon_mode = GL_POINT; */ -/* else if (state->polygon_mode == GL_POINT) */ -/* state->polygon_mode = GL_FILL; */ -/* GL_CALL(glPolygonMode(GL_FRONT_AND_BACK, state->polygon_mode)); */ -/* state->polygon_mode_last_time = glfwGetTime(); */ -/* } */ -/* else if (glfwGetKey(window, GLFW_KEY_EQUAL) == GLFW_PRESS) */ -/* { */ -/* state->fov -= M_PI / 100.0f; */ -/* if (state->fov <= M_PI_4 / 2) */ -/* state->fov = M_PI_4 / 2; */ -/* } */ -/* else if (glfwGetKey(window, GLFW_KEY_MINUS) == GLFW_PRESS) */ -/* { */ -/* state->fov += M_PI / 100.0f; */ -/* if (state->fov >= M_PI - M_PI_4 / 2) */ -/* state->fov = M_PI - M_PI_4 / 2; */ -/* } */ -/* } */ - void debugmat(t_ftmmat4 *mat) { for (int i = 0; i < 4; i++) @@ -70,11 +39,11 @@ int main(int argc, char **argv) t_state state; t_model_data data; - if (argc != 2) + if (argc != 2 && argc != 3) { ft_putstr("Usage: "); ft_putstr(argv[0]); - ft_putendl(" [obj file]"); + ft_putendl(" OBJ_FILE [BMP_FILE]"); return (1); } if (parse(argv[1], &data) == -1) @@ -83,37 +52,34 @@ int main(int argc, char **argv) ft_putendl(argv[1]); return (1); } + color_init(data.vertices, data.vertices_num); + texture_coord_init(data.vertices, data.vertices_num); + if (argc == 3) + data.texture_filepath = argv[2]; + else + data.texture_filepath = "res/brick.bmp"; - /* unsigned int texture = texture_new("res/brick.bmp"); */ - /* float *coords = texture_coord_create(object.vertices, object.vertices_len); */ - /* */ - /* if (!color_merge_vertices(&object, coords)) */ - /* { */ - /* ft_putstr("Error: couldn't create colors"); */ - /* return (1); */ - /* } */ - - printf("size %lu\n", data.indices_size); - for (size_t i = 0; i < data.indices_size; i++) + printf("size %lu\n", data.indices_num); + for (size_t i = 0; i < data.indices_num; i++) { printf("%u, ", data.indices[i++]); printf("%u, ", data.indices[i++]); printf("%u\n", data.indices[i]); } - printf("size %lu\n", data.vertices_size); - for (size_t i = 0; i < data.vertices_size; i++) + printf("size %lu\n", data.vertices_num); + for (size_t i = 0; i < data.vertices_num; i++) { printf("% f, ", data.vertices[i++]); printf("% f, ", data.vertices[i++]); printf("% f, ", data.vertices[i++]); + printf("% f | ", data.vertices[i++]); + printf("% f, ", data.vertices[i++]); + printf("% f, ", data.vertices[i++]); + printf("% f, ", data.vertices[i++]); + printf("% f | ", data.vertices[i++]); + printf("% f ", data.vertices[i++]); printf("% f\n", data.vertices[i]); - /* printf("% f, ", object.vertices[i++]); */ - /* printf("% f, ", object.vertices[i++]); */ - /* printf("% f, ", object.vertices[i++]); */ - /* printf("% f\ttex: ", object.vertices[i]); */ - /* printf("% f", object.vertices[i++]); */ - /* printf("% f\n", object.vertices[i]); */ } /* GL_CALL(glUniform1i(glGetUniformLocation(state.shader, "u_texture"), 0)); */ diff --git a/src/parse.c b/src/parse.c index eb127e5..a179bcf 100644 --- a/src/parse.c +++ b/src/parse.c @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/05/09 11:02:00 by charles #+# #+# */ -/* Updated: 2020/05/14 14:01:26 by charles ### ########.fr */ +/* Updated: 2020/05/14 16:01:53 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -68,6 +68,13 @@ static int st_parse_vertex(char **positions_strs, t_ftvec *vertices) tmp = 1.0f; ft_vecpush(vertices, *((void**)&tmp)); } + tmp = 1.0f; + ft_vecpush(vertices, *((void**)&tmp)); + ft_vecpush(vertices, *((void**)&tmp)); + ft_vecpush(vertices, *((void**)&tmp)); + ft_vecpush(vertices, *((void**)&tmp)); + ft_vecpush(vertices, *((void**)&tmp)); + ft_vecpush(vertices, *((void**)&tmp)); return (0); } @@ -144,7 +151,7 @@ int parse(char *filepath, t_model_data *data) t_ftvec *vertices; t_ftvec *indices; - if (!has_extension(filepath, ".obj") + if (!helper_check_extension(filepath, ".obj") || (fd = open(filepath, O_RDONLY)) == -1) return (-1); if ((vertices = ft_vecnew(SCOP_VEC_DEFAULT_SIZE)) == NULL) @@ -155,8 +162,8 @@ int parse(char *filepath, t_model_data *data) ft_veciter_ret(indices, st_iter_func_decrement_uint); data->vertices = (float*)ft_vectobuf32(vertices); data->indices = (unsigned int*)ft_vectobuf32(indices); - data->vertices_size = vertices->size; - data->indices_size = indices->size; + data->vertices_num = vertices->size; + data->indices_num = indices->size; ft_vecdestroy(vertices, NULL); ft_vecdestroy(indices, NULL); return (0); diff --git a/src/scene.c b/src/scene.c index bfacb41..5c56bac 100644 --- a/src/scene.c +++ b/src/scene.c @@ -6,45 +6,24 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/05/14 12:28:57 by charles #+# #+# */ -/* Updated: 2020/05/14 14:52:00 by charles ### ########.fr */ +/* Updated: 2020/05/14 16:35:25 by charles ### ########.fr */ /* */ /* ************************************************************************** */ #include "scop.h" -#define VERTEX_STRIDE sizeof(float) * 4 - -void st_transform_center_init(t_ftmmat4 *dst, float *vertices, size_t vertices_size) +static void st_transform_center_init(t_ftmmat4 *dst, float *vertices, size_t vertices_num) { - size_t i; t_ftmvec3 min; t_ftmvec3 max; - ftm_vec3init(&min, INFINITY, INFINITY, INFINITY); - ftm_vec3init(&max, -INFINITY, -INFINITY, -INFINITY); - i = 0; - while (i < vertices_size) - { - if (vertices[i + 0] > max.x) - max.x = vertices[i + 0]; - if (vertices[i + 0] < min.x) - min.x = vertices[i + 0]; - if (vertices[i + 1] > max.y) - max.y = vertices[i + 1]; - if (vertices[i + 1] < min.y) - min.y = vertices[i + 1]; - if (vertices[i + 2] > max.z) - max.z = vertices[i + 2]; - if (vertices[i + 2] < min.z) - min.z = vertices[i + 2]; - i += VERTEX_STRIDE / sizeof(float); - } + helper_find_boundary(vertices, vertices_num, &min, &max); ftm_mat4init_eye(dst, 1.0); ftm_mat4translate(dst, -(max.x + min.x) / 2.0f, -(max.y + min.y) / 2.0f, -(max.z + min.z) / 2.0f); } -void scene_init(t_scene *scene, t_model_data *data) +void scene_init(t_scene *scene, t_model_data *data) { GL_CALL(glGenVertexArrays(1, &scene->vertex_array)); GL_CALL(glGenBuffers(1, &scene->vertex_buf)); @@ -53,33 +32,32 @@ void scene_init(t_scene *scene, t_model_data *data) GL_CALL(glBindVertexArray(scene->vertex_array)); GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, scene->vertex_buf)); - GL_CALL(glBufferData(GL_ARRAY_BUFFER, data->vertices_size * sizeof(float), data->vertices, GL_STATIC_DRAW)); + GL_CALL(glBufferData(GL_ARRAY_BUFFER, data->vertices_num * sizeof(float), + data->vertices, GL_STATIC_DRAW)); GL_CALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, scene->index_buf)); - GL_CALL(glBufferData(GL_ELEMENT_ARRAY_BUFFER, data->indices_size * sizeof(unsigned int), data->indices, GL_STATIC_DRAW)); - scene->index_buf_size = data->indices_size; + GL_CALL(glBufferData(GL_ELEMENT_ARRAY_BUFFER, data->indices_num * sizeof(unsigned int), + data->indices, GL_STATIC_DRAW)); + scene->index_buf_num = data->indices_num; GL_CALL(glEnableVertexAttribArray(0)); GL_CALL(glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, VERTEX_STRIDE, (void*)0)); - /* GL_CALL(glEnableVertexAttribArray(1)); */ - /* GL_CALL(glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, VERTEX_STRIDE, (void*)(4 * sizeof(float)))); */ - /* GL_CALL(glEnableVertexAttribArray(2)); */ - /* GL_CALL(glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, VERTEX_STRIDE, (void*)(8 * sizeof(float)))); */ + GL_CALL(glEnableVertexAttribArray(1)); + GL_CALL(glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, VERTEX_STRIDE, (void*)(4 * sizeof(float)))); + GL_CALL(glEnableVertexAttribArray(2)); + GL_CALL(glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, VERTEX_STRIDE, (void*)(8 * sizeof(float)))); ftm_mat4init_eye(&scene->transform.view, 1.0); - st_transform_center_init(&scene->transform.center, data->vertices, data->vertices_size); - debugmat(&scene->transform.center); - scene_update_model(scene, M_PI_4); - scene_update_proj(scene, M_PI_4, WINDOW_WIDTH, WINDOW_HEIGHT); + st_transform_center_init(&scene->transform.center, data->vertices, data->vertices_num); } -void scene_update_proj(t_scene *scene, float fov, int width, int height) +void scene_update_proj(t_scene *scene, float fov, int width, int height) { ftm_mat4init_eye(&scene->transform.proj, 1.0); ftm_mat4init_perspective(&scene->transform.proj, fov, (float)width / (float)height, 0.1, 100.0); } -void scene_update_model(t_scene *scene, float rotation_radian) +void scene_update_model(t_scene *scene, float rotation_radian) { t_ftmvec3 axis; @@ -89,7 +67,7 @@ void scene_update_model(t_scene *scene, float rotation_radian) ftm_mat4mul(&scene->transform.model, &scene->transform.center); } -void scene_quit(t_scene *scene) +void scene_quit(t_scene *scene) { GL_CALL(glDeleteVertexArrays(1, &scene->vertex_array)); GL_CALL(glDeleteBuffers(1, &scene->vertex_buf)); diff --git a/src/shader.c b/src/shader.c index a325f16..fb659ad 100644 --- a/src/shader.c +++ b/src/shader.c @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/05/11 09:35:54 by charles #+# #+# */ -/* Updated: 2020/05/14 14:02:56 by charles ### ########.fr */ +/* Updated: 2020/05/14 16:41:29 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -44,13 +44,16 @@ static unsigned int st_compile(char *filepath, unsigned int type) return (id); } -static bool st_get_uniform_location(unsigned int shader_id, int *location, char *name) +static bool st_get_uniform_location( + unsigned int shader_id, + int *location, + char *name) { GL_CALL(*location = glGetUniformLocation(shader_id, name)); return (*location != -1); } -bool shader_init(t_shader *shader) +bool shader_init(t_shader *shader) { unsigned int shader_vertex; unsigned int shader_fragment; @@ -68,13 +71,15 @@ bool shader_init(t_shader *shader) if (!st_get_uniform_location(shader->id, &shader->location.model, "u_model") || !st_get_uniform_location(shader->id, &shader->location.view, "u_view") || !st_get_uniform_location(shader->id, &shader->location.proj, "u_proj")) + /* || !st_get_uniform_location(shader->id, &shader->location.texture, "u_texture")) */ return (false); return (true); } -void shader_update_mvp(t_shader *shader, t_scene *scene) +void shader_set_uniforms(t_shader *shader, t_scene *scene) { GL_CALL(glUniformMatrix4fv(shader->location.model, 1, GL_TRUE, scene->transform.model.m)); GL_CALL(glUniformMatrix4fv(shader->location.view, 1, GL_TRUE, scene->transform.view.m)); GL_CALL(glUniformMatrix4fv(shader->location.proj, 1, GL_TRUE, scene->transform.proj.m)); + /* GL_CALL(glUniformMatrix4fv(shader->location.texture, 1, GL_TRUE, scene->transform.proj.m)); */ } diff --git a/src/state.c b/src/state.c deleted file mode 100644 index 8cd3cca..0000000 --- a/src/state.c +++ /dev/null @@ -1,126 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* state.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: charles +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2020/05/11 01:31:10 by charles #+# #+# */ -/* Updated: 2020/05/14 14:59:48 by charles ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "scop.h" - -/* static void st_resize_callback(GLFWwindow *window, int width, int height) */ -/* { */ -/* (void)window; */ -/* glViewport(0, 0, width, height); */ -/* ftm_mat4init_perspective(&g_state->proj, state.fov, (float)width / (float)height, 0.1, 100.0); */ -/* } */ - -static void st_handle_event(t_state *state) -{ - SDL_Event e; - - while (SDL_PollEvent(&e)) - { - if (e.type == SDL_QUIT) - state->running = false; - else if (e.type == SDL_KEYDOWN) - { - if (e.key.keysym.sym == SDLK_ESCAPE) - state->running = false; - else if (e.key.keysym.sym == SDLK_p) - { - if (state->polygon_mode == GL_FILL) - state->polygon_mode = GL_LINE; - else if (state->polygon_mode == GL_LINE) - state->polygon_mode = GL_POINT; - else if (state->polygon_mode == GL_POINT) - state->polygon_mode = GL_FILL; - GL_CALL(glPolygonMode(GL_FRONT_AND_BACK, state->polygon_mode)); - } - } - else if (e.type == SDL_MOUSEWHEEL) - { - if (e.wheel.y > 0) - { - state->fov -= M_PI / 70.0f; - if (state->fov <= M_PI_4 / 3) - state->fov = M_PI_4 / 3; - } - else if (e.wheel.y < 0) - { - state->fov += M_PI / 70.0f; - if (state->fov >= M_PI - M_PI_4 / 3) - state->fov = M_PI - M_PI_4 / 3; - } - scene_update_proj(&state->scene, state->fov, state->width, state->height); - } - } -} - -bool state_init(t_state *state, t_model_data *data) -{ - if (SDL_Init(SDL_INIT_VIDEO) < 0) - return (false); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); - SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); - state->window = SDL_CreateWindow( - "scop", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, - WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_OPENGL); - if (state->window == NULL) - return (false); - state->context = SDL_GL_CreateContext(state->window); - if (glewInit() != GLEW_OK) - return (false); - SDL_GL_SetSwapInterval(1); - GL_CALL(glViewport(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT)); - GL_CALL(glEnable(GL_DEPTH_TEST)); - GL_CALL(glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)); - - if (!shader_init(&state->shader)) - return (false); - scene_init(&state->scene, data); - - state->fov = M_PI_4; - state->running = true; - state->polygon_mode = GL_LINE; - state->width = WINDOW_WIDTH; - state->height = WINDOW_HEIGHT; - return (true); -} - -void state_run(t_state *state) -{ - float rotation; - - rotation = M_PI_4; - while (state->running) - { - GL_CALL(glClearColor(0.1f, 0.1f, 0.1f, 1.0f)); - GL_CALL(glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); - - GL_CALL(glUseProgram(state->shader.id)); - shader_update_mvp(&state->shader, &state->scene); - GL_CALL(glBindVertexArray(state->scene.vertex_array)); - GL_CALL(glDrawElements(GL_TRIANGLES, state->scene.index_buf_size, GL_UNSIGNED_INT, (void*)0)); - - scene_update_model(&state->scene, rotation); - SDL_GL_SwapWindow(state->window); - st_handle_event(state); - rotation += M_PI / 100.0; - } -} - -void state_quit(t_state *state) -{ - scene_quit(&state->scene); - GL_CALL(glDeleteProgram(state->shader.id)); - SDL_GL_DeleteContext(state->context); - SDL_DestroyWindow(state->window); - SDL_Quit(); -} diff --git a/src/texture.c b/src/texture.c index e74f6be..a91b355 100644 --- a/src/texture.c +++ b/src/texture.c @@ -6,98 +6,97 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/05/11 14:27:34 by charles #+# #+# */ -/* Updated: 2020/05/14 14:01:38 by charles ### ########.fr */ +/* Updated: 2020/05/14 16:37:42 by charles ### ########.fr */ /* */ /* ************************************************************************** */ #include "scop.h" -/* typedef struct __attribute__((__packed__)) */ -/* { */ -/* uint8_t signature[2]; */ -/* uint32_t file_size; */ -/* uint32_t reserved; */ -/* uint32_t img_data_offset; */ -/* } t_bmp_file_header; */ -/* */ -/* typedef struct __attribute__((__packed__)) */ -/* { */ -/* uint32_t header_size; */ -/* uint32_t width; */ -/* uint32_t height; */ -/* uint16_t color_planes; */ -/* uint16_t depth; */ -/* uint32_t compression; */ -/* uint32_t image_size; */ -/* uint32_t horizontal_res; */ -/* uint32_t vertical_res; */ -/* uint32_t color_table_len; */ -/* uint32_t color_count; */ -/* } t_bmp_info_header; */ -/* */ -/* uint8_t *st_read_bmp(char *filepath, size_t *width, size_t *height) */ -/* { */ -/* uint8_t *data; */ -/* t_bmp_file_header file_header; */ -/* t_bmp_info_header info_header; */ -/* int fd; */ -/* */ -/* fd = open(filepath, O_RDONLY); */ -/* read(fd, &file_header, sizeof(t_bmp_file_header)); */ -/* if (file_header.signature[0] != 'B' || file_header.signature[1] != 'M') */ -/* { */ -/* close(fd); */ -/* return (NULL); */ -/* } */ -/* read(fd, &info_header, sizeof(t_bmp_info_header)); */ -/* if ((data = malloc(info_header.image_size)) == NULL) */ -/* { */ -/* close(fd); */ -/* return (NULL); */ -/* } */ -/* *width = info_header.width; */ -/* *height = info_header.height; */ -/* read(fd, data, info_header.image_size); // padding */ -/* close(fd); */ -/* return (data); */ -/* } */ -/* */ -/* unsigned int texture_new(char *filepath) */ -/* { */ -/* uint8_t *data; */ -/* unsigned int texture; */ -/* size_t width; */ -/* size_t height; */ -/* */ -/* if ((data = st_read_bmp(filepath, &width, &height)) == NULL) */ -/* return (0); */ -/* GL_CALL(glGenTextures(1, &texture)); */ -/* GL_CALL(glBindTexture(GL_TEXTURE_2D, texture)); */ -/* GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); */ -/* GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); */ -/* GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); */ -/* GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); */ -/* GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data)); */ -/* free(data); */ -/* return (texture); */ -/* } */ -/* */ -/* float *texture_coord_create(float *vertices, size_t vertices_len) */ -/* { */ -/* t_ftmvec3 min; */ -/* t_ftmvec3 max; */ -/* float *coords; */ -/* size_t i; */ -/* */ -/* if ((coords = malloc(sizeof(float) * (vertices_len * 2))) == NULL) */ -/* return (NULL); */ -/* st_find_boundary(vertices, vertices_len, &min, &max); */ -/* i = 0; */ -/* while (i < vertices_len) */ -/* { */ -/* coords[i * 2 + 0] = (vertices[i * 4 + 0] - min.x) * (1.0 / (max.x - min.x)); */ -/* coords[i * 2 + 1] = (vertices[i * 4 + 1] - min.y) * (1.0 / (max.y - min.y)); */ -/* i++; */ -/* } */ -/* return (coords); */ -/* } */ +typedef struct __attribute__((__packed__)) +{ + uint8_t signature[2]; + uint32_t file_size; + uint32_t reserved; + uint32_t img_data_offset; +} t_bmp_file_header; + +typedef struct __attribute__((__packed__)) +{ + uint32_t header_size; + uint32_t width; + uint32_t height; + uint16_t color_planes; + uint16_t depth; + uint32_t compression; + uint32_t image_size; + uint32_t horizontal_res; + uint32_t vertical_res; + uint32_t color_table_len; + uint32_t color_count; +} t_bmp_info_header; + +uint8_t *st_read_bmp(char *filepath, size_t *width, size_t *height) +{ + uint8_t *data; + t_bmp_file_header file_header; + t_bmp_info_header info_header; + int fd; + + fd = open(filepath, O_RDONLY); + read(fd, &file_header, sizeof(t_bmp_file_header)); + if (file_header.signature[0] != 'B' || file_header.signature[1] != 'M') + { + close(fd); + return (NULL); + } + read(fd, &info_header, sizeof(t_bmp_info_header)); + if ((data = malloc(info_header.image_size)) == NULL) + { + close(fd); + return (NULL); + } + *width = info_header.width; + *height = info_header.height; + read(fd, data, info_header.image_size); // padding + close(fd); + return (data); +} + +unsigned int texture_create(char *filepath) +{ + uint8_t *data; + unsigned int texture; + size_t width; + size_t height; + + if ((data = st_read_bmp(filepath, &width, &height)) == NULL) + return (0); + GL_CALL(glGenTextures(1, &texture)); + GL_CALL(glBindTexture(GL_TEXTURE_2D, texture)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); + GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data)); + free(data); + return (texture); +} + +void texture_coord_init(float *vertices, size_t vertices_num) +{ + t_ftmvec3 min; + t_ftmvec3 max; + size_t i; + size_t index; + + helper_find_boundary(vertices, vertices_num, &min, &max); + i = 0; + while (i < vertices_num) + { + index = i + VERTEX_TEX_COORD_OFFSET; + vertices[index] = 0.0; //(vertices[index] - min.x) * (1.0 / (max.x - min.x)); + index++; + vertices[index] = 1.0; //(vertices[index] - min.y) * (1.0 / (max.y - min.y)); + i += VERTEX_COUNT; + } +} -- cgit