engine

game engine on C
git clone git://git.evenfri.pw/engine.git
Log | Files | Refs | README

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