Here is the diver code:
camera.projection = CGL_mat4_perspective(((float)rx / ry), camera.fov, 0.01f, 100.0f);
camera.view = CGL_mat4_look_at(camera.pos, CGL_vec3_init(camera.pos.x, camera.pos.y,
camera.pos.z + 1.0f), CGL_vec3_init(0.0f, 1.0f, 0.0f));
CGL_shader_set_uniform_mat4(main_shader.shader, main_shader.u_projection, &camera.projection);
CGL_shader_set_uniform_mat4(main_shader.shader, main_shader.u_view, &camera.view);
The functions:
#define CGL_mat4_perspective(aspect, fov, znear, zfar) (CGL_mat4){1.0f / (aspect * tanf(fov / 2.0f)), 0.0f, 0.0f, 0.0f, 0.0f, 1.0f / tanf(fov / 2.0f), 0.0f, 0.0f, 0.0f, 0.0f, -1.0f * ( (zfar + znear) / (zfar - znear) ), -1.0f, 0.0f, 0.0f, -2.0f * znear * zfar / (zfar - znear), 1.0f}
CGL_mat4 CGL_mat4_look_at(CGL_vec3 eye, CGL_vec3 target, CGL_vec3 up)
{
CGL_vec3 z_axis = CGL_vec3_sub(target, eye);
CGL_vec3_normalize(z_axis);
CGL_vec3 x_axis = CGL_vec3_cross(up, z_axis);
CGL_vec3_normalize(x_axis);
CGL_vec3 y_axis = CGL_vec3_cross(z_axis, x_axis);
CGL_mat4 mat;
mat.m[0] = x_axis.x;
mat.m[1] = x_axis.y;
mat.m[2] = x_axis.z;
mat.m[3] = -1.0f * CGL_vec3_dot(x_axis, eye);
mat.m[4] = y_axis.x;
mat.m[5] = y_axis.y;
mat.m[6] = y_axis.z;
mat.m[7] = -1.0f * CGL_vec3_dot(y_axis, eye);
mat.m[8] = z_axis.x;
mat.m[9] = z_axis.y;
mat.m[10] = z_axis.z;
mat.m[11] = -1.0f * CGL_vec3_dot(z_axis, eye);
mat.m[12] = 0.0f;
mat.m[13] = 0.0f;
mat.m[14] = 0.0f;
mat.m[15] = 1.0f;
return mat;
}
The shader:
gl_Position = u_projection * u_view * vec4(position.xyz, 1.0f);
However when the camera.pos is changed the plane that is being rendered is being rotated rather than being translated.
