mat4.c (1347B)
1 #include <math.h> 2 #include "engine.h" 3 4 mat4 mat4_mul(mat4 a, mat4 b) { 5 mat4 r = {{0}}; 6 for (int c = 0; c < 4; c++) 7 for (int row = 0; row < 4; row++) { 8 float s = 0.0f; 9 for (int k = 0; k < 4; k++) 10 s += a.m[k*4 + row] * b.m[c*4 + k]; 11 r.m[c*4 + row] = s; 12 } 13 return r; 14 } 15 16 mat4 mat4_rotate_x(float a) { 17 mat4 r = mat4_identity(); 18 float c = cosf(a), s = sinf(a); 19 r.m[5] = c; r.m[6] = s; 20 r.m[9] = -s; r.m[10] = c; 21 return r; 22 } 23 24 mat4 mat4_rotate_y(float a) { 25 mat4 r = mat4_identity(); 26 float c = cosf(a), s = sinf(a); 27 r.m[0] = c; r.m[2] = -s; 28 r.m[8] = s; r.m[10] = c; 29 return r; 30 } 31 32 mat4 mat4_rotate_z(float a) { 33 mat4 r = mat4_identity(); 34 float c = cosf(a), s = sinf(a); 35 r.m[0] = c; r.m[1] = s; 36 r.m[4] = -s; r.m[5] = c; 37 return r; 38 } 39 40 mat4 mat4_identity(void) { 41 mat4 r = {{0}}; 42 r.m[0] = r.m[5] = r.m[10] = r.m[15] = 1.0f; 43 return r; 44 } 45 46 mat4 mat4_perspective(float fovy, float aspect, float znear, float zfar) { 47 mat4 r = {{0}}; 48 float f = 1.0f / tanf(0.5f * fovy * PI / 180.0f); 49 r.m[0] = f / aspect; 50 r.m[5] = f; 51 r.m[10] = (zfar + znear) / (znear - zfar); 52 r.m[11] = -1.0f; 53 r.m[14] = (2.0f * zfar * znear) / (znear - zfar); 54 return r; 55 } 56 57 mat4 mat4_translate(float x, float y, float z) { 58 mat4 r = mat4_identity(); 59 r.m[12] = x; 60 r.m[13] = y; 61 r.m[14] = z; 62 return r; 63 } 64