diff options
Diffstat (limited to 'libs/common.h')
-rw-r--r-- | libs/common.h | 187 |
1 files changed, 86 insertions, 101 deletions
diff --git a/libs/common.h b/libs/common.h index b535c72..c373e9a 100644 --- a/libs/common.h +++ b/libs/common.h @@ -12,28 +12,24 @@ #include <sys/stat.h> #include <fcntl.h> -U8 *read_entire_file(const char *filename) +char *read_entire_file(const char *filename) { - U8 *result; - FILE *f; - long file_size; - - result = 0; + char *result = 0; if (!filename) return(result); - f = fopen(filename, "rb"); - if (!f) + FILE *file = fopen(filename, "rb"); + if (!file) return(result); - fseek(f, 0, SEEK_END); - file_size = ftell(f); - fseek(f, 0, SEEK_SET); + fseek(file, 0, SEEK_END); + long file_size = ftell(file); + fseek(file, 0, SEEK_SET); - result = malloc(file_size + 1); - fread(result, file_size, 1, f); - fclose(f); + result = malloc(file_size+1); + fread(result, file_size, 1, file); + fclose(file); result[file_size] = 0; @@ -42,16 +38,13 @@ U8 *read_entire_file(const char *filename) void *mmap_file(size_t *len, const char *filename) { - struct stat sb; - char* p; - int fd; - - fd = open(filename, O_RDONLY); + int fd = open(filename, O_RDONLY); if (fd == -1) { perror("open"); return NULL; } + struct stat sb; if (fstat(fd, &sb) == -1) { perror("fstat"); return NULL; @@ -62,7 +55,7 @@ void *mmap_file(size_t *len, const char *filename) return NULL; } - p = (char*)mmap(0, sb.st_size, PROT_READ, MAP_SHARED, fd, 0); + char *p = (char*)mmap(0, sb.st_size, PROT_READ, MAP_SHARED, fd, 0); if (p == MAP_FAILED) { perror("mmap"); @@ -97,28 +90,21 @@ void read_entire_file_mmap(void* ctx, const char* filename, const int is_mtl, Mesh *mesh_gen_quad(Arena *arena) { - Mesh *m; - Vertex verts[4]; - U32 ids[6]; - - m = 0; - - verts[0] = vertex(v3f( 1.0f, 1.0f, 0.0f), v3f_zero(), v2f(1.0f, 1.0f)); - verts[1] = vertex(v3f(-1.0f, 1.0f, 0.0f), v3f_zero(), v2f(0.0f, 1.0f)); - verts[2] = vertex(v3f(-1.0f, -1.0f, 0.0f), v3f_zero(), v2f(0.0f, 0.0f)); - verts[3] = vertex(v3f( 1.0f, -1.0f, 0.0f), v3f_zero(), v2f(1.0f, 0.0f)); + Vertex verts[4] = { + vertex(v3f( 1.0f, 1.0f, 0.0f), v3f_zero(), v2f(1.0f, 1.0f)), + vertex(v3f(-1.0f, 1.0f, 0.0f), v3f_zero(), v2f(0.0f, 1.0f)), + vertex(v3f(-1.0f, -1.0f, 0.0f), v3f_zero(), v2f(0.0f, 0.0f)), + vertex(v3f( 1.0f, -1.0f, 0.0f), v3f_zero(), v2f(1.0f, 0.0f)), + }; - ids[0] = 0; - ids[1] = 1; - ids[2] = 2; + U32 ids[6] = { + 0, 1, 2, + 0, 2, 3 + }; - ids[3] = 0; - ids[4] = 2; - ids[5] = 3; + Mesh *mesh = mesh_init(arena, verts, 4, ids, 6); - m = mesh_init(arena, verts, 4, ids, 6); - - return m; + return mesh; } Mesh *mesh_load_obj(Arena *arena, const char *filename) @@ -158,7 +144,7 @@ Mesh *mesh_load_obj(Arena *arena, const char *filename) Assert(attrib.face_num_verts[i]%3 == 0); - Assert(attrib.face_num_verts[i]/3 > 3); + Assert(attrib.face_num_verts[i]/3 > 0); Assert(attrib.num_texcoords); @@ -198,87 +184,80 @@ Mesh *mesh_load_obj(Arena *arena, const char *filename) U32 compile_shader(GLenum type, const char *filename) { - U32 shader; - S32 status; - char logs[512]; - const char *source = (const char *)read_entire_file(filename); if (!source) { fprintf(stderr, "[ERROR]: Failed to read the file \"%s\"\n", filename); return(0); } - shader = glCreateShader(type); + U32 shader = glCreateShader(type); glShaderSource(shader, 1, &source, 0); free((void *)source); glCompileShader(shader); + + S32 status; glGetShaderiv(shader, GL_COMPILE_STATUS, &status); if (status == GL_FALSE) { - glGetShaderInfoLog(shader, 512, 0, logs); - fprintf(stderr, "[ERROR]: Failed to compile: \"%s\"\n%s", filename, logs); + char log[512]; + glGetShaderInfoLog(shader, 512, 0, log); + fprintf(stderr, "error: failed to compile: \"%s\"\n%s", filename, log); } else { - fprintf(stdout, "[INFO]: \"%s\" compiled successfuly.\n", filename); + fprintf(stdout, "info: \"%s\" compiled successfuly.\n", filename); } return(shader); } -U32 create_shader_program(char *vertex_shader_filename, - char *fragment_shader_filename) +U32 load_shader(const char *vert_filename, const char *frag_filename) { - S32 success; - char logs[512]; + U32 vert = compile_shader(GL_VERTEX_SHADER, vert_filename); + U32 frag = compile_shader(GL_FRAGMENT_SHADER, frag_filename); - U32 vertex_shader = compile_shader(GL_VERTEX_SHADER, vertex_shader_filename); - U32 fragment_shader = compile_shader(GL_FRAGMENT_SHADER, fragment_shader_filename); + U32 program = glCreateProgram(); + glAttachShader(program, vert); + glAttachShader(program, frag); + glLinkProgram(program); - U32 shader_program; - shader_program = glCreateProgram(); - glAttachShader(shader_program, vertex_shader); - glAttachShader(shader_program, fragment_shader); - glLinkProgram(shader_program); - glGetProgramiv(shader_program, GL_LINK_STATUS, &success); + S32 success; + glGetProgramiv(program, GL_LINK_STATUS, &success); if (success == GL_FALSE) { - glGetProgramInfoLog(shader_program, 512, 0, logs); - fprintf(stderr, "[ERROR]: Failed to link shader program:\n%s", logs); + char log[512]; + glGetProgramInfoLog(program, 512, 0, log); + fprintf(stderr, "error: failed to link program:\n%s\n", log); } else { - fprintf(stdout, "[INFO]: Shader program linked successfuly.\n\n"); + fprintf(stdout, "info: compiled successully\n\n"); } - glDeleteShader(vertex_shader); - glDeleteShader(fragment_shader); + glDeleteShader(vert); + glDeleteShader(frag); - return(shader_program); + return(program); } -U32 create_shader_program_geom(char *vertex_shader_filename, - char *fragment_shader_filename, - char *geometry_shader_filename) +U32 load_shader_geom(const char *vert_filename, const char *frag_filename, const char *geom_filename) { + U32 vert = compile_shader(GL_VERTEX_SHADER, vert_filename); + U32 frag = compile_shader(GL_FRAGMENT_SHADER, frag_filename); + U32 geom = compile_shader(GL_GEOMETRY_SHADER, geom_filename); + + U32 program = glCreateProgram(); + glAttachShader(program, vert); + glAttachShader(program, frag); + glAttachShader(program, geom); + glLinkProgram(program); + S32 success; - char logs[512]; - - U32 vertex_shader = compile_shader(GL_VERTEX_SHADER, vertex_shader_filename); - U32 fragment_shader = compile_shader(GL_FRAGMENT_SHADER, fragment_shader_filename); - U32 geometry_shader = compile_shader(GL_GEOMETRY_SHADER, geometry_shader_filename); - - U32 shader_program; - shader_program = glCreateProgram(); - glAttachShader(shader_program, vertex_shader); - glAttachShader(shader_program, fragment_shader); - glAttachShader(shader_program, geometry_shader); - glLinkProgram(shader_program); - glGetProgramiv(shader_program, GL_LINK_STATUS, &success); + glGetProgramiv(program, GL_LINK_STATUS, &success); if (success == GL_FALSE) { - glGetProgramInfoLog(shader_program, 512, 0, logs); - fprintf(stderr, "[ERROR]: Failed to link shader program:\n%s", - logs); + char log[512]; + glGetProgramInfoLog(program, 512, 0, log); + fprintf(stderr, "error: failed to link shader program:\n%s\n", log); } else { - fprintf(stdout, "[INFO]: Shader program linked successfuly.\n\n"); + fprintf(stdout, "info: shader program linked successfuly.\n\n"); } - glDeleteShader(vertex_shader); - glDeleteShader(fragment_shader); - glDeleteShader(geometry_shader); + glDeleteShader(vert); + glDeleteShader(frag); + glDeleteShader(geom); - return(shader_program); + return(program); } void shader_set_3f(U32 shader_program, char *uniform_name, F32 x, F32 y, F32 z) @@ -319,12 +298,11 @@ void shader_set_1i(U32 shader_program, char *uniform_name, S32 value) U32 load_texture(char *texture_filename) { - S32 width, height, number_channels; U32 texture_id; - glGenTextures(1, &texture_id); stbi_set_flip_vertically_on_load(1); + S32 width, height, number_channels; U8 *data = stbi_load(texture_filename, &width, &height, &number_channels, 0); if (data) { GLenum format = 0; @@ -344,11 +322,9 @@ U32 load_texture(char *texture_filename) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glBindTexture(GL_TEXTURE_2D, 0); - fprintf(stdout, "[INFO]: Texture (\"%s\") is loaded successfully\n", - texture_filename); + fprintf(stdout, "info: texture (\"%s\") is loaded successfully\n", texture_filename); } else { - fprintf(stderr, "[ERROR]: Failed to load texture: \"%s\"\n", - texture_filename); + fprintf(stderr, "error: failed to load texture: \"%s\"\n", texture_filename); } stbi_image_free(data); @@ -461,9 +437,9 @@ typedef struct { Input input_init() { - Input r = {0}; - r.first_mouse = 1; - return(r); + Input input = {0}; + input.first_mouse = 1; + return(input); } void input_update_last_state(Input *input) @@ -765,8 +741,7 @@ void get_camera_vectors(Camera *camera, V3F *l, V3F *u, V3F *f) *f = v3f(-view.m0.z, -view.m1.z, -view.m2.z); } -V3F get_dv_camera_first_person(Input *input, Camera *camera, - F32 acceleration, F32 dt) +V3F get_dv_camera_first_person(Input *input, Camera *camera, F32 acceleration, F32 dt) { V3F f, l, u, dv; get_camera_vectors(camera, &l, &u, &f); @@ -801,6 +776,11 @@ MAT4 camera_persp(Camera camera, F32 ar) } typedef struct { + V3F position; + V3F color; +} light_t; + +typedef struct { Arena *arena; Input input; @@ -811,4 +791,9 @@ typedef struct { F32 dt; } State; +F32 lerp(F32 a, F32 b, F32 f) +{ + return a + f * (b - a); +} + #endif /* COMMON_H */ |