# HG changeset patch # User Mike Becker # Date 1752409360 -7200 # Node ID 1883bdc4fb20835c344b95a07f2f051de8345579 # Parent d6fd0eabe56875cd3019f229f98f65de367179f5 add function to apply a matrix to a vector diff -r d6fd0eabe568 -r 1883bdc4fb20 src/ascension/datatypes.h --- a/src/ascension/datatypes.h Sun Jul 13 13:48:13 2025 +0200 +++ b/src/ascension/datatypes.h Sun Jul 13 14:22:40 2025 +0200 @@ -114,6 +114,14 @@ #define ASC_VEC3F_0 (asc_vec3f){{0.0f, 0.0f, 0.0f}} #define ASC_VEC3F_1 (asc_vec3f){{1.0f, 1.0f, 1.0f}} +typedef union asc_vec4f { + struct { float x, y, z, w; }; + float data[4]; +} asc_vec4f; +#define ASC_VEC4F(x, y, z, w) (asc_vec4f){{(float)x, (float)y, (float)(z), (float)(w)}} +#define ASC_VEC4F_0 (asc_vec4f){{0.0f, 0.0f, 0.0f, 0.0f}} +#define ASC_VEC4F_1 (asc_vec4f){{1.0f, 1.0f, 1.0f, 1.0f}} + typedef struct asc_col4i { asc_ubyte red, green, blue, alpha; } asc_col4i; @@ -387,7 +395,7 @@ for (unsigned i = 0; i < 4; i++) { for (unsigned j = 0; j < 4; j++) { dest[asc_mat4_index(i, j)] = 0; - for (int k = 0; k < 4; k++) { + for (unsigned k = 0; k < 4; k++) { dest[asc_mat4_index(i,j)] += left[asc_mat4_index(k,j)] * right[asc_mat4_index(i,k)]; } @@ -395,4 +403,17 @@ } } +static inline asc_vec3f asc_mat4f_apply( + asc_mat4f const mat, + asc_vec3f vec +) { + asc_vec4f dest = ASC_VEC4F_0; + for (unsigned j = 0; j < 4; j++) { + for (unsigned k = 0; k < 4; k++) { + dest.data[j] += mat[asc_mat4_index(k,j)] * vec.data[k]; + } + } + return ASC_VEC3F(dest.x, dest.y, dest.z); +} + #endif //ASCENSION_DATATYPES_H