#ifndef MATRIX_MATH #define MATRIX_MATH #include typedef struct { GLfloat x; GLfloat y; GLfloat z; } vec3; typedef struct { GLfloat x; GLfloat y; GLfloat z; GLfloat w; } vec4; typedef struct { GLfloat x; GLfloat y; } vec2; typedef struct { GLfloat m00; GLfloat m10; GLfloat m20; GLfloat m30; GLfloat m01; GLfloat m11; GLfloat m21; GLfloat m31; GLfloat m02; GLfloat m12; GLfloat m22; GLfloat m32; GLfloat m03; GLfloat m13; GLfloat m23; GLfloat m33; } mat4; typedef struct { GLfloat m00; GLfloat m10; GLfloat m20; GLfloat m01; GLfloat m11; GLfloat m21; GLfloat m02; GLfloat m12; GLfloat m22; } mat3; extern void vec3Zero(vec3* out); extern void vec3Add(vec3* out, vec3* a, vec3* b); extern void vec3Multiply(vec3* out, vec3* a, GLfloat x); extern void vec3Subtract(vec3* out, vec3* a, vec3* b); extern void vec3Cross(vec3* out, vec3* a, vec3* b); extern void vec3Normalise(vec3* out, vec3* a); extern GLfloat vec3Length(vec3* a); extern GLfloat vec3Dot(vec3* a, vec3* b); extern void identity(mat4* out); extern void translation(mat4* out, vec3* v); extern void scaling(mat4* out, vec3* v); extern void rotationZ(mat4* out, GLfloat angle); extern void rotationY(mat4* out, GLfloat angle); extern void rotationX(mat4* out, GLfloat angle); extern void multiplyAny(GLfloat* out, GLfloat* A, GLfloat* B, int wA, int hA, int wB); extern void multiply(mat4* out, mat4* A, mat4* B); extern void translate(mat4* out, mat4* in, vec3* v); extern void scale(mat4* out, mat4* in, vec3* v); extern void rotateZ(mat4* out, mat4* in, GLfloat angle); extern void rotateY(mat4* out, mat4* in, GLfloat angle); extern void rotateX(mat4* out, mat4* in, GLfloat angle); extern void transposeAny(GLfloat* out, GLfloat* in, int w, int h); extern void transpose(mat4* out, mat4* in); extern void printAny(GLfloat* M, int w, int h); extern void vec3Print(vec3* a); extern void mat4Print(mat4* m); extern void mat3Print(mat3* m); extern void mat3From4(mat3* out, mat4* in); extern void mat3MultiplyScalar(mat3* out, mat3* in, GLfloat x); extern GLfloat mat3Determinant(mat3* m); extern void mat3Transpose(mat3* out, mat3* in); extern void mat3Minor(mat3* out, mat3* in); extern void mat3Cofactor(mat3* out, mat3* in); extern void mat3Adjoint(mat3* out, mat3* in); extern void mat3Inverse(mat3* out, mat3* in); extern GLfloat sumDiffAny(GLfloat* A, GLfloat* B, int w, int h); extern GLfloat mat3SumDiff(mat3* A, mat3* B); extern void vec2Subtract(vec2* out, vec2* a, vec2* b); #endif