aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile3
-rw-r--r--inc/scop.h55
-rw-r--r--shader/fragment.glsl6
-rw-r--r--shader/vertex.glsl10
-rw-r--r--src/color.c75
-rw-r--r--src/error.c20
-rw-r--r--src/graphic/event.c72
-rw-r--r--src/graphic/state.c (renamed from src/state.c)82
-rw-r--r--src/helper.c33
-rw-r--r--src/main.c72
-rw-r--r--src/parse.c15
-rw-r--r--src/scene.c56
-rw-r--r--src/shader.c13
-rw-r--r--src/texture.c179
14 files changed, 345 insertions, 346 deletions
diff --git a/Makefile b/Makefile
index a2b9f2e..fb41877 100644
--- a/Makefile
+++ b/Makefile
@@ -6,7 +6,7 @@
# By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ #
# +#+#+#+#+#+ +#+ #
# 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 <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 <charles.cabergs@gmail.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* 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/state.c b/src/graphic/state.c
index 8cd3cca..c3aaa8e 100644
--- a/src/state.c
+++ b/src/graphic/state.c
@@ -6,61 +6,12 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/05/11 01:31:10 by charles #+# #+# */
-/* Updated: 2020/05/14 14:59:48 by charles ### ########.fr */
+/* Updated: 2020/05/14 16:39:59 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)
@@ -71,33 +22,34 @@ bool state_init(t_state *state, t_model_data *data)
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);
+ 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(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))
+ 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_LINE;
- state->width = WINDOW_WIDTH;
- state->height = WINDOW_HEIGHT;
+ 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)
+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)
{
@@ -105,18 +57,22 @@ void state_run(t_state *state)
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(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_size, GL_UNSIGNED_INT, (void*)0));
+ 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);
- st_handle_event(state);
- rotation += M_PI / 100.0;
+ event_handle(state);
+ rotation += M_PI / 250.0;
}
}
-void state_quit(t_state *state)
+void state_quit(t_state *state)
{
scene_quit(&state->scene);
GL_CALL(glDeleteProgram(state->shader.id));
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 <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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/texture.c b/src/texture.c
index e74f6be..a91b355 100644
--- a/src/texture.c
+++ b/src/texture.c
@@ -6,98 +6,97 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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;
+ }
+}