Skip to content

Instantly share code, notes, and snippets.

@recp
Created November 25, 2017 14:34
Show Gist options
  • Save recp/8d9a3f65d3573bd2775b658ffab46212 to your computer and use it in GitHub Desktop.
Save recp/8d9a3f65d3573bd2775b658ffab46212 to your computer and use it in GitHub Desktop.
camera-vertices
void
gkPrepareCameraProp(GkCamera * __restrict cam) {
mat4 projViewInv;
vec4 *vert;
vec3 min, max;
int32_t i;
vert = cam->vertices;
glm_mat4_inv(cam->projView, projViewInv);
glm_mat4_mulv(projViewInv, (vec4){-1.0f, -1.0f, -1.0f, 1.0f}, vert[0]);
glm_mat4_mulv(projViewInv, (vec4){-1.0f, 1.0f, -1.0f, 1.0f}, vert[1]);
glm_mat4_mulv(projViewInv, (vec4){ 1.0f, -1.0f, -1.0f, 1.0f}, vert[2]);
glm_mat4_mulv(projViewInv, (vec4){ 1.0f, 1.0f, -1.0f, 1.0f}, vert[3]);
glm_mat4_mulv(projViewInv, (vec4){-1.0f, -1.0f, 1.0f, 1.0f}, vert[4]);
glm_mat4_mulv(projViewInv, (vec4){-1.0f, 1.0f, 1.0f, 1.0f}, vert[5]);
glm_mat4_mulv(projViewInv, (vec4){ 1.0f, -1.0f, 1.0f, 1.0f}, vert[6]);
glm_mat4_mulv(projViewInv, (vec4){ 1.0f, 1.0f, 1.0f, 1.0f}, vert[7]);
memset(min, 0, sizeof(vec3));
memset(max, 0, sizeof(vec3));
for (i = 0; i < 8; i++) {
glm_vec4_scale(vert[i], 1.0f / vert[i][3], vert[i]);
if (vert[i][0] < min[0])
min[0] = vert[i][0];
else if (vert[i][0] > max[0])
max[0] = vert[i][0];
if (vert[i][1] < min[1])
min[1] = vert[i][1];
else if (vert[i][1] > max[1])
max[1] = vert[i][1];
if (vert[i][2] < min[2])
min[2] = vert[i][2];
else if (vert[i][2] > max[2])
max[2] = vert[i][2];
}
glm_vec_copy(min, cam->bbox.min);
glm_vec_copy(max, cam->bbox.max);
glm_vec_center(min, max, cam->bbox.center);
cam->bbox.radius = glm_vec_distance(min, max) * 0.5f;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment