summaryrefslogtreecommitdiff
path: root/libs/common.h
diff options
context:
space:
mode:
Diffstat (limited to 'libs/common.h')
-rw-r--r--libs/common.h187
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 */