Skip to content

Instantly share code, notes, and snippets.

@recp
Last active August 30, 2022 04:46
Show Gist options
  • Save recp/43c1f4a32f9fc251b2f57bb1a0e3a9bc to your computer and use it in GitHub Desktop.
Save recp/43c1f4a32f9fc251b2f57bb1a0e3a9bc to your computer and use it in GitHub Desktop.
aabb transform
CGLM_INLINE
void
glm_aabb_transform(vec3 box[2], mat4 m, vec3 dest[2]) {
vec3 v[2], xa, xb, ya, yb, za, zb, tmp;
glm_vec_scale(m[0], box[0][0], xa);
glm_vec_scale(m[0], box[1][0], xb);
glm_vec_scale(m[1], box[0][1], ya);
glm_vec_scale(m[1], box[1][1], yb);
glm_vec_scale(m[2], box[0][2], za);
glm_vec_scale(m[2], box[1][2], zb);
/* min(xa, xb) + min(ya, yb) + min(za, zb) + translation */
glm_vec_minv(xa, xb, v[0]);
glm_vec_minv(ya, yb, tmp);
glm_vec_add(v[0], tmp, v[0]);
glm_vec_minv(za, zb, tmp);
glm_vec_add(v[0], tmp, v[0]);
glm_vec_add(v[0], m[3], v[0]);
/* max(xa, xb) + max(ya, yb) + max(za, zb) + translation */
glm_vec_maxv(xa, xb, v[1]);
glm_vec_maxv(ya, yb, tmp);
glm_vec_add(v[1], tmp, v[1]);
glm_vec_maxv(za, zb, tmp);
glm_vec_add(v[1], tmp, v[1]);
glm_vec_add(v[1], m[3], v[1]);
glm_vec_copy(v[0], dest[0]);
glm_vec_copy(v[1], dest[1]);
}
CGLM_INLINE
void
glm_aabb_transform2(vec3 box[2], mat4 m, vec3 dest[2]) {
vec4 v;
vec4 c[8];
vec3 min, max, a, b;
int i;
glm_vec_copy(box[0], a);
glm_vec_copy(box[1], b);
c[0][0] = a[0]; c[1][0] = b[0]; c[2][0] = a[0]; c[3][0] = a[0];
c[0][1] = a[1]; c[1][1] = a[1]; c[2][1] = b[1]; c[3][1] = a[1];
c[0][2] = a[2]; c[1][2] = a[2]; c[2][2] = a[2]; c[3][2] = b[2];
c[0][3] = 1.0f; c[1][3] = 1.0f; c[2][3] = 1.0f; c[3][3] = 1.0f;
c[4][0] = b[0]; c[5][0] = a[0]; c[6][0] = b[0]; c[7][0] = b[0];
c[4][1] = b[1]; c[5][1] = b[1]; c[6][1] = a[1]; c[7][1] = b[1];
c[4][2] = b[2]; c[5][2] = b[2]; c[6][2] = b[2]; c[7][2] = a[2];
c[4][3] = 1.0f; c[5][3] = 1.0f; c[6][3] = 1.0f; c[7][3] = 1.0f;
glm_vec_broadcast(FLT_MAX, min);
glm_vec_broadcast(-FLT_MAX, max);
for (i = 0; i < 8; i++) {
glm_mat4_mulv(m, c[i], v);
min[0] = glm_min(min[0], v[0]);
min[1] = glm_min(min[1], v[1]);
min[2] = glm_min(min[2], v[2]);
max[0] = glm_max(max[0], v[0]);
max[1] = glm_max(max[1], v[1]);
max[2] = glm_max(max[2], v[2]);
}
glm_vec_copy(min, dest[0]);
glm_vec_copy(max, dest[1]);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment