diff --git a/include/cglm/structs/affine.h b/include/cglm/structs/affine.h index 6f8be48..72cab13 100644 --- a/include/cglm/structs/affine.h +++ b/include/cglm/structs/affine.h @@ -286,15 +286,9 @@ glms_rotate_atm(mat4s m, vec3s pivot, float angle, vec3s axis) { CGLM_INLINE vec3s glms_decompose_scalev(mat4s m) { - mat3s m3x3; - vec3s s; - - m3x3 = glms_mat4_pick3(m); - - s.x = glms_vec3_norm(m3x3.col[0]); - s.y = glms_vec3_norm(m3x3.col[1]); - s.z = glms_vec3_norm(m3x3.col[2]); - return s; + vec3s r; + glm_decompose_scalev(m.raw, r.raw); + return r; } /*! @@ -322,6 +316,8 @@ glms_uniscaled(mat4s m) { CGLM_INLINE void glms_decompose_rs(mat4s m, mat4s r, vec3s s) { + // FIX: Modify param + // glm_decompose_rs(m.raw, r.raw, s.raw); } @@ -337,6 +333,8 @@ glms_decompose_rs(mat4s m, mat4s r, vec3s s) { CGLM_INLINE void glms_decompose(mat4s m, vec4s t, mat4s r, vec3s s) { + // FIX: Modify param + // glm_decompose(m.raw, t.raw, r.raw, s.raw); } diff --git a/include/cglm/structs/box.h b/include/cglm/structs/box.h index e9c813f..ca7c3a6 100644 --- a/include/cglm/structs/box.h +++ b/include/cglm/structs/box.h @@ -25,34 +25,12 @@ CGLM_INLINE void glms_aabb_transform(vec3s box[2], mat4s m, vec3s dest[2]) { - vec3s v[2], xa, xb, ya, yb, za, zb; - mat3s m3x3; + vec3 rawBox[2]; + vec3 rawDest[2]; - m3x3 = glms_mat4_pick3(m); - - xa = glms_vec3_scale(m3x3.col[0], box[0].x); - xb = glms_vec3_scale(m3x3.col[0], box[1].x); - - ya = glms_vec3_scale(m3x3.col[1], box[0].y); - yb = glms_vec3_scale(m3x3.col[1], box[1].y); - - za = glms_vec3_scale(m3x3.col[2], box[0].z); - zb = glms_vec3_scale(m3x3.col[2], box[1].z); - - /* translation + min(xa, xb) + min(ya, yb) + min(za, zb) */ - v[0] = m3x3.col[3]; - v[0] = glms_vec3_minadd(xa, xb); - v[0] = glms_vec3_minadd(ya, yb); - v[0] = glms_vec3_minadd(za, zb); - - /* translation + max(xa, xb) + max(ya, yb) + max(za, zb) */ - v[1] = m3x3.col[3]; - v[1] = glms_vec3_maxadd(xa, xb); - v[1] = glms_vec3_maxadd(ya, yb); - v[1] = glms_vec3_maxadd(za, zb); - - dest[0] = glms_vec3_copy(v[0]); - dest[1] = glms_vec3_copy(v[1]); + glms_vec3_unpack(rawBox, box, 2); + glm_aabb_transform(rawBox, m.raw, rawDest); + glms_vec3_pack(dest, rawDest, 2); } /*! @@ -68,13 +46,14 @@ glms_aabb_transform(vec3s box[2], mat4s m, vec3s dest[2]) { CGLM_INLINE void glms_aabb_merge(vec3s box1[2], vec3s box2[2], vec3s dest[2]) { - dest[0].x = glm_min(box1[0].x, box2[0].x); - dest[0].y = glm_min(box1[0].y, box2[0].y); - dest[0].z = glm_min(box1[0].z, box2[0].z); + vec3 rawBox1[2]; + vec3 rawBox2[2]; + vec3 rawDest[2]; - dest[1].x = glm_max(box1[1].x, box2[1].x); - dest[1].y = glm_max(box1[1].y, box2[1].y); - dest[1].z = glm_max(box1[1].z, box2[1].z); + glms_vec3_unpack(rawBox1, box1, 2); + glms_vec3_unpack(rawBox2, box2, 2); + glm_aabb_merge(rawBox1, rawBox2, rawDest); + glms_vec3_pack(dest, rawDest, 2); } /*! @@ -91,13 +70,14 @@ glms_aabb_merge(vec3s box1[2], vec3s box2[2], vec3s dest[2]) { CGLM_INLINE void glms_aabb_crop(vec3s box[2], vec3s cropBox[2], vec3s dest[2]) { - dest[0].x = glm_max(box[0].x, cropBox[0].x); - dest[0].y = glm_max(box[0].y, cropBox[0].y); - dest[0].z = glm_max(box[0].z, cropBox[0].z); + vec3 rawBox[2]; + vec3 rawCropBox[2]; + vec3 rawDest[2]; - dest[1].x = glm_min(box[1].x, cropBox[1].x); - dest[1].y = glm_min(box[1].y, cropBox[1].y); - dest[1].z = glm_min(box[1].z, cropBox[1].z); + glms_vec3_unpack(rawBox, box, 2); + glms_vec3_unpack(rawCropBox, cropBox, 2); + glm_aabb_crop(rawBox, rawCropBox, rawDest); + glms_vec3_pack(dest, rawDest, 2); } /*! @@ -139,21 +119,12 @@ glms_aabb_crop_until(vec3s box[2], CGLM_INLINE bool glms_aabb_frustum(vec3s box[2], vec4s planes[6]) { - vec4s p; - float dp; - int i; + vec3 rawBox[2]; + vec4 rawPlanes[6]; - for (i = 0; i < 6; i++) { - p = planes[i]; - dp = p.x * box[p.x > 0.0f].x - + p.y * box[p.y > 0.0f].y - + p.z * box[p.z > 0.0f].z; - - if (dp < -p.w) - return false; - } - - return true; + glms_vec3_unpack(rawBox, box, 2); + glms_vec4_unpack(rawPlanes, planes, 6); + return glm_aabb_frustum(rawBox, rawPlanes); } /*! @@ -164,6 +135,8 @@ glms_aabb_frustum(vec3s box[2], vec4s planes[6]) { CGLM_INLINE void glms_aabb_invalidate(vec3s box[2]) { + // FIX: Modify param + // box[0] = glms_vec3_broadcast(FLT_MAX); box[1] = glms_vec3_broadcast(-FLT_MAX); } @@ -176,8 +149,9 @@ glms_aabb_invalidate(vec3s box[2]) { CGLM_INLINE bool glms_aabb_isvalid(vec3s box[2]) { - return glms_vec3_max(box[0]) != FLT_MAX && - glms_vec3_min(box[1]) != -FLT_MAX; + vec3 rawBox[2]; + glms_vec3_unpack(rawBox, box, 2); + return glm_aabb_isvalid(rawBox); } /*! diff --git a/include/cglm/structs/frustum.h b/include/cglm/structs/frustum.h index 07340c8..56bd165 100644 --- a/include/cglm/structs/frustum.h +++ b/include/cglm/structs/frustum.h @@ -55,23 +55,9 @@ CGLM_INLINE void glms_frustum_planes(mat4s m, vec4s dest[6]) { - mat4s t; - - t = glms_mat4_transpose(m); - - dest[0] = glms_vec4_add(t.col[3], t.col[0]); /* left */ - dest[1] = glms_vec4_sub(t.col[3], t.col[0]); /* right */ - dest[2] = glms_vec4_add(t.col[3], t.col[1]); /* bottom */ - dest[3] = glms_vec4_sub(t.col[3], t.col[1]); /* top */ - dest[4] = glms_vec4_add(t.col[3], t.col[2]); /* near */ - dest[5] = glms_vec4_sub(t.col[3], t.col[2]); /* far */ - - dest[0] = glms_plane_normalize(dest[0]); - dest[1] = glms_plane_normalize(dest[1]); - dest[2] = glms_plane_normalize(dest[2]); - dest[3] = glms_plane_normalize(dest[3]); - dest[4] = glms_plane_normalize(dest[4]); - dest[5] = glms_plane_normalize(dest[5]); + vec4 rawDest[6]; + glm_frustum_planes(m.raw, rawDest); + glms_vec4_pack(dest, rawDest, 6); } /*! @@ -100,38 +86,9 @@ glms_frustum_planes(mat4s m, vec4s dest[6]) { CGLM_INLINE void glms_frustum_corners(mat4s invMat, vec4s dest[8]) { - vec4s c[8]; - - /* indexOf(nearCoord) = indexOf(farCoord) + 4 */ - vec4s csCoords[8] = { - GLMS_CSCOORD_LBN, - GLMS_CSCOORD_LTN, - GLMS_CSCOORD_RTN, - GLMS_CSCOORD_RBN, - - GLMS_CSCOORD_LBF, - GLMS_CSCOORD_LTF, - GLMS_CSCOORD_RTF, - GLMS_CSCOORD_RBF - }; - - c[0] = glms_mat4_mulv(invMat, csCoords[0]); - c[1] = glms_mat4_mulv(invMat, csCoords[1]); - c[2] = glms_mat4_mulv(invMat, csCoords[2]); - c[3] = glms_mat4_mulv(invMat, csCoords[3]); - c[4] = glms_mat4_mulv(invMat, csCoords[4]); - c[5] = glms_mat4_mulv(invMat, csCoords[5]); - c[6] = glms_mat4_mulv(invMat, csCoords[6]); - c[7] = glms_mat4_mulv(invMat, csCoords[7]); - - dest[0] = glms_vec4_scale(c[0], 1.0f / c[0].z); - dest[1] = glms_vec4_scale(c[1], 1.0f / c[1].z); - dest[2] = glms_vec4_scale(c[2], 1.0f / c[2].z); - dest[3] = glms_vec4_scale(c[3], 1.0f / c[3].z); - dest[4] = glms_vec4_scale(c[4], 1.0f / c[4].z); - dest[5] = glms_vec4_scale(c[5], 1.0f / c[5].z); - dest[6] = glms_vec4_scale(c[6], 1.0f / c[6].z); - dest[7] = glms_vec4_scale(c[7], 1.0f / c[7].z); + vec4 rawDest[8]; + glm_frustum_corners(invMat.raw, rawDest); + glms_vec4_pack(dest, rawDest, 8); } /*! @@ -143,19 +100,12 @@ glms_frustum_corners(mat4s invMat, vec4s dest[8]) { CGLM_INLINE vec4s glms_frustum_center(vec4s corners[8]) { - vec4s center; + vec4 rawCorners[8]; + vec4s r; - center = glms_vec4_copy(corners[0]); - - center = glms_vec4_add(corners[1], center); - center = glms_vec4_add(corners[2], center); - center = glms_vec4_add(corners[3], center); - center = glms_vec4_add(corners[4], center); - center = glms_vec4_add(corners[5], center); - center = glms_vec4_add(corners[6], center); - center = glms_vec4_add(corners[7], center); - - return glms_vec4_scale(center, 0.125f); + glms_vec4_unpack(rawCorners, corners, 8); + glm_frustum_center(rawCorners, r.raw); + return r; } /*! @@ -168,27 +118,12 @@ glms_frustum_center(vec4s corners[8]) { CGLM_INLINE void glms_frustum_box(vec4s corners[8], mat4s m, vec3s box[2]) { - vec4s v; - vec3s min, max; - int i; + vec4 rawCorners[8]; + vec3 rawBox[2]; - min = glms_vec3_broadcast(FLT_MAX); - max = glms_vec3_broadcast(-FLT_MAX); - - for (i = 0; i < 8; i++) { - v = glms_mat4_mulv(m, corners[i]); - - min.x = glm_min(min.x, v.x); - min.y = glm_min(min.y, v.y); - min.z = glm_min(min.z, v.z); - - max.x = glm_max(max.x, v.x); - max.y = glm_max(max.y, v.y); - max.z = glm_max(max.z, v.z); - } - - box[0] = glms_vec3_copy(min); - box[1] = glms_vec3_copy(max); + glms_vec4_unpack(rawCorners, corners, 8); + glm_frustum_box(rawCorners, m.raw, rawBox); + glms_vec3_pack(box, rawBox, 2); } /*! @@ -205,36 +140,16 @@ glms_frustum_box(vec4s corners[8], mat4s m, vec3s box[2]) { */ CGLM_INLINE void -glms_frustum_corners_at(vec4s corners[8], +glms_frustum_corners_at(vec4s corners[8], float splitDist, float farDist, - vec4s planeCorners[4]) { - vec4s corner; - float dist, sc; + vec4s planeCorners[4]) { + vec4 rawCorners[8]; + vec4 rawPlaneCorners[4]; - /* because distance and scale is same for all */ - dist = glms_vec4_distance(corners[GLM_RTF], corners[GLM_RTN]); - sc = dist * (splitDist / farDist); - - /* left bottom */ - corner = glms_vec4_sub(corners[GLM_LBF], corners[GLM_LBN]); - corner = glms_vec4_scale_as(corner, sc); - planeCorners[0] = glms_vec4_add(corners[GLM_LBN], corner); - - /* left top */ - corner = glms_vec4_sub(corners[GLM_LTF], corners[GLM_LTN]); - corner = glms_vec4_scale_as(corner, sc); - planeCorners[1] = glms_vec4_add(corners[GLM_LTN], corner); - - /* right top */ - corner = glms_vec4_sub(corners[GLM_RTF], corners[GLM_RTN]); - corner = glms_vec4_scale_as(corner, sc); - planeCorners[2] = glms_vec4_add(corners[GLM_RTN], corner); - - /* right bottom */ - corner = glms_vec4_sub(corners[GLM_RBF], corners[GLM_RBN]); - corner = glms_vec4_scale_as(corner, sc); - planeCorners[3] = glms_vec4_add(corners[GLM_RBN], corner); + glms_vec4_unpack(rawCorners, corners, 8); + glm_frustum_corners_at(rawCorners, splitDist, farDist, rawPlaneCorners); + glms_vec4_pack(planeCorners, rawPlaneCorners, 8); } #endif /* cglm_frustums_h */ diff --git a/include/cglm/structs/io.h b/include/cglm/structs/io.h index c209a47..2467d20 100644 --- a/include/cglm/structs/io.h +++ b/include/cglm/structs/io.h @@ -73,28 +73,10 @@ void glms_aabb_print(vec3s bbox[2], const char * __restrict tag, FILE * __restrict ostream) { - int i, j; + vec3 rawBbox[2]; -#define m 3 - - fprintf(ostream, "AABB (%s):\n", tag ? tag : "float"); - - for (i = 0; i < 2; i++) { - fprintf(ostream, "\t|"); - - for (j = 0; j < m; j++) { - fprintf(ostream, "%0.4f", bbox[i].raw[j]); - - if (j != m - 1) - fprintf(ostream, "\t"); - } - - fprintf(ostream, "|\n"); - } - - fprintf(ostream, "\n"); - -#undef m + glms_vec3_unpack(rawBbox, bbox, 2); + glm_aabb_print(rawBbox, tag, ostream); } #endif /* cglm_ios_h */ diff --git a/include/cglm/structs/mat4.h b/include/cglm/structs/mat4.h index 72686cd..40c7291 100644 --- a/include/cglm/structs/mat4.h +++ b/include/cglm/structs/mat4.h @@ -241,7 +241,7 @@ CGLM_INLINE mat4s glms_mat4_mulN(mat4s * __restrict matrices[], uint32_t len) { CGLM_ALIGN_MAT mat4s r = GLMS_MAT4_IDENTITY_INIT; - uint32_t i; + size_t i; for (i = 0; i < len; i++) { r = glms_mat4_mul(r, *matrices[i]); diff --git a/include/cglm/structs/vec3.h b/include/cglm/structs/vec3.h index ed77c4a..312d59a 100644 --- a/include/cglm/structs/vec3.h +++ b/include/cglm/structs/vec3.h @@ -40,6 +40,30 @@ glms_vec3_copy(vec3s v) { return r; } +CGLM_INLINE +void +glms_vec3_pack(vec3s dst[], vec3 src[], size_t len) { + size_t i; + + for (i = 0; i < len; i++) { + dst[i].x = src[i][0]; + dst[i].y = src[i][1]; + dst[i].z = src[i][2]; + } +} + +CGLM_INLINE +void +glms_vec3_unpack(vec3 dst[], vec3s src[], size_t len) { + size_t i; + + for (i = 0; i < len; i++) { + dst[i][0] = src[i].x; + dst[i][1] = src[i].y; + dst[i][2] = src[i].z; + } +} + CGLM_INLINE vec3s glms_vec3_zero() { @@ -65,13 +89,13 @@ glms_vec3_dot(vec3s a, vec3s b) { CGLM_INLINE float glms_vec3_norm2(vec3s v) { - glm_vec3_norm2(v.raw); + return glm_vec3_norm2(v.raw); } CGLM_INLINE float glms_vec3_norm(vec3s v) { - glm_vec3_norm(v.raw); + return glm_vec3_norm(v.raw); } CGLM_INLINE @@ -148,50 +172,44 @@ glms_vec3_divs(vec3s a, float s) { CGLM_INLINE vec3s -glms_vec3_addadd(vec3s a, vec3s b) { - vec3s r; - glm_vec3_addadd(a.raw, b.raw, r.raw); - return r; +glms_vec3_addadd(vec3s a, vec3s b, vec3s dest) { + glm_vec3_addadd(a.raw, b.raw, dest.raw); + return dest; } CGLM_INLINE vec3s -glms_vec3_subadd(vec3s a, vec3s b) { - vec3s r; - glm_vec3_subadd(a.raw, b.raw, r.raw); - return r; +glms_vec3_subadd(vec3s a, vec3s b, vec3s dest) { + glm_vec3_subadd(a.raw, b.raw, dest.raw); + return dest; } CGLM_INLINE vec3s -glms_vec3_muladd(vec3s a, vec3s b) { - vec3s r; - glm_vec3_muladd(a.raw, b.raw, r.raw); - return r; +glms_vec3_muladd(vec3s a, vec3s b, vec3s dest) { + glm_vec3_muladd(a.raw, b.raw, dest.raw); + return dest; } CGLM_INLINE vec3s -glms_vec3_muladds(vec3s a, float s) { - vec3s r; - glm_vec3_muladds(a.raw, s, r.raw); - return r; +glms_vec3_muladds(vec3s a, float s, vec3s dest) { + glm_vec3_muladds(a.raw, s, dest.raw); + return dest; } CGLM_INLINE vec3s -glms_vec3_maxadd(vec3s a, vec3s b) { - vec3s r; - glm_vec3_maxadd(a.raw, b.raw, r.raw); - return r; +glms_vec3_maxadd(vec3s a, vec3s b, vec3s dest) { + glm_vec3_maxadd(a.raw, b.raw, dest.raw); + return dest; } CGLM_INLINE vec3s -glms_vec3_minadd(vec3s a, vec3s b) { - vec3s r; - glm_vec3_minadd(a.raw, b.raw, r.raw); - return r; +glms_vec3_minadd(vec3s a, vec3s b, vec3s dest) { + glm_vec3_minadd(a.raw, b.raw, dest.raw); + return dest; } CGLM_INLINE @@ -201,22 +219,6 @@ glms_vec3_flipsign(vec3s v) { return v; } -CGLM_INLINE -vec3s -glms_vec3_flipsign_to(vec3s v) { - vec3s r; - glm_vec3_flipsign_to(v.raw, r.raw); - return r; -} - -CGLM_INLINE -vec3s -glms_vec3_negate_to(vec3s v) { - vec3s r; - glm_vec3_negate_to(v.raw, r.raw); - return r; -} - CGLM_INLINE vec3s glms_vec3_negate(vec3s v) { @@ -231,14 +233,6 @@ glms_vec3_inv(vec3s v) { return v; } -CGLM_INLINE -vec3s -glms_vec3_inv_to(vec3s v) { - vec3s r; - glm_vec3_inv_to(v.raw, r.raw); - return r; -} - CGLM_INLINE vec3s glms_vec3_normalize(vec3s v) { @@ -246,14 +240,6 @@ glms_vec3_normalize(vec3s v) { return v; } -CGLM_INLINE -vec3s -glms_vec3_normalize_to(vec3s v) { - vec3s r; - glm_vec3_normalize_to(v.raw, r.raw); - return r; -} - CGLM_INLINE vec3s glms_vec3_cross(vec3s a, vec3s b) { @@ -291,17 +277,17 @@ glms_vec3_rotate(vec3s v, float angle, vec3s axis) { CGLM_INLINE vec3s -glms_vec3_rotate_m4(mat4 m, vec3s v) { +glms_vec3_rotate_m4(mat4s m, vec3s v) { vec3s r; - glm_vec3_rotate_m4(m, v.raw, r.raw); + glm_vec3_rotate_m4(m.raw, v.raw, r.raw); return r; } CGLM_INLINE vec3s -glms_vec3_rotate_m3(mat3 m, vec3s v) { +glms_vec3_rotate_m3(mat3s m, vec3s v) { vec3s r; - glm_vec3_rotate_m3(m, v.raw, r.raw); + glm_vec3_rotate_m3(m.raw, v.raw, r.raw); return r; } @@ -387,12 +373,4 @@ glms_normalize(vec3s v) { return v; } -CGLM_INLINE -vec3s -glms_normalize_to(vec3s v) { - vec3s r; - glm_normalize_to(v.raw, r.raw); - return r; -} - #endif /* cglm_vec3s_h */ diff --git a/include/cglm/structs/vec4.h b/include/cglm/structs/vec4.h index c8ec509..956fee1 100644 --- a/include/cglm/structs/vec4.h +++ b/include/cglm/structs/vec4.h @@ -54,6 +54,29 @@ glms_vec4_ucopy(vec4s v) { return r; } +CGLM_INLINE +void +glms_vec4_pack(vec4s dst[], vec4 src[], size_t len) { + size_t i; + + for (i = 0; i < len; i++) { + dst[i].x = src[i][0]; + dst[i].y = src[i][1]; + dst[i].z = src[i][2]; + } +} + +CGLM_INLINE +void +glms_vec4_unpack(vec4 dst[], vec4s src[], size_t len) { + size_t i; + + for (i = 0; i < len; i++) { + dst[i][0] = src[i].x; + dst[i][1] = src[i].y; + dst[i][2] = src[i].z; + } +} CGLM_INLINE float @@ -147,50 +170,44 @@ glms_vec4_divs(vec4s v, float s) { CGLM_INLINE vec4s -glms_vec4_addadd(vec4s a, vec4s b) { - vec4s r; - glm_vec4_addadd(a.raw, b.raw, r.raw); - return r; +glms_vec4_addadd(vec4s a, vec4s b, vec4s dest) { + glm_vec4_addadd(a.raw, b.raw, dest.raw); + return dest; } CGLM_INLINE vec4s -glms_vec4_subadd(vec4s a, vec4s b) { - vec4s r; - glm_vec4_subadd(a.raw, b.raw, r.raw); - return r; +glms_vec4_subadd(vec4s a, vec4s b, vec4s dest) { + glm_vec4_subadd(a.raw, b.raw, dest.raw); + return dest; } CGLM_INLINE vec4s -glms_vec4_muladd(vec4s a, vec4s b) { - vec4s r; - glm_vec4_muladd(a.raw, b.raw, r.raw); - return r; +glms_vec4_muladd(vec4s a, vec4s b, vec4s dest) { + glm_vec4_muladd(a.raw, b.raw, dest.raw); + return dest; } CGLM_INLINE vec4s -glms_vec4_muladds(vec4s a, float s) { - vec4s r; - glm_vec4_muladds(a.raw, s, r.raw); - return r; +glms_vec4_muladds(vec4s a, float s, vec4s dest) { + glm_vec4_muladds(a.raw, s, dest.raw); + return dest; } CGLM_INLINE vec4s -glms_vec4_maxadd(vec4s a, vec4s b) { - vec4s r; - glm_vec4_maxadd(a.raw, b.raw, r.raw); - return r; +glms_vec4_maxadd(vec4s a, vec4s b, vec4s dest) { + glm_vec4_maxadd(a.raw, b.raw, dest.raw); + return dest; } CGLM_INLINE vec4s -glms_vec4_minadd(vec4s a, vec4s b) { - vec4s r; - glm_vec4_minadd(a.raw, b.raw, r.raw); - return r; +glms_vec4_minadd(vec4s a, vec4s b, vec4s dest) { + glm_vec4_minadd(a.raw, b.raw, dest.raw); + return dest; } CGLM_INLINE @@ -251,4 +268,12 @@ glms_vec4_lerp(vec4s from, vec4s to, float t) { return r; } +CGLM_INLINE +vec4s +glms_vec4_cubic(float s) { + vec4s r; + glm_vec4_cubic(s, r.raw); + return r; +} + #endif /* cglm_vec4s_h */