#include "raster.h" Matrix identity(void) { Matrix m = {1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}; return m; } Matrix frustum(float l, float r, float b, float t, float n, float f) { Matrix m = identity(); m.cr[0][0] = (2.0f*n)/(r-l); m.cr[1][1] = (2.0f*n)/(t-b); m.cr[2][0] = (r+l)/(r-l); m.cr[2][1] = (t+b)/(t-b); m.cr[2][2] = -(f+n)/(f-n); m.cr[2][3] = -1.0f; m.cr[3][2] = -2.0f*f*n/(f-n); m.cr[3][3] = 0.0f; return m; } Matrix perspective(float fov, float aspect, float n, float f) { float r, t; r = n*tan(fov*3.14159f/360.0f); t = r/aspect; return frustum(-r, r, -t, t, n, f); } Matrix mulmat(Matrix a, Matrix b) { int i, j; Matrix out; for(i = 0; i < 4; i++) for(j = 0; j < 4; j++) out.cr[i][j] = a.cr[0][j]*b.cr[i][0] + a.cr[1][j]*b.cr[i][1] + a.cr[2][j]*b.cr[i][2] + a.cr[3][j]*b.cr[i][3]; return out; } Vector4 mulmatvec(Matrix m, Vector4 v) { int i; Vector4 out; for(i = 0; i < 4; i++) out.e[i] = m.cr[0][i]*v.x + m.cr[1][i]*v.y + m.cr[2][i]*v.z + m.cr[3][i]*v.w; return out; } Matrix translation(float x, float y, float z) { Matrix m = identity(); m.cr[3][0] = x; m.cr[3][1] = y; m.cr[3][2] = z; return m; } Matrix rotationX(float a) { Matrix m = identity(); m.cr[1][1] = cos(a); m.cr[1][2] = sin(a); m.cr[2][1] = -sin(a); m.cr[2][2] = cos(a); return m; } Matrix rotationY(float a) { Matrix m = identity(); m.cr[0][0] = cos(a); m.cr[2][0] = sin(a); m.cr[0][2] = -sin(a); m.cr[2][2] = cos(a); return m; } Matrix rotationZ(float a) { Matrix m = identity(); m.cr[0][0] = cos(a); m.cr[0][1] = sin(a); m.cr[1][0] = -sin(a); m.cr[1][1] = cos(a); return m; }