void Matrix_shearZ(Matrix * matrix, float x, float y) { Matrix shearingMatrix; Matrix_loadIdentity(&shearingMatrix); shearingMatrix.m[8] = x; shearingMatrix.m[9] = y; Matrix_multiply(matrix, shearingMatrix); }
Matrix *Matrix_new () { Matrix *m = malloc(sizeof(Matrix)); memset(m->m_matrix, 0, sizeof(float) * 16); Matrix_loadIdentity(m); return m; }
void Matrix_shearY(Matrix * matrix, float x, float z) { Matrix shearingMatrix; Matrix_loadIdentity(&shearingMatrix); shearingMatrix.m[4] = x; shearingMatrix.m[6] = z; Matrix_multiply(matrix, shearingMatrix); }
void Matrix_shearX(Matrix * matrix, float y, float z) { Matrix shearingMatrix; Matrix_loadIdentity(&shearingMatrix); shearingMatrix.m[1] = y; shearingMatrix.m[2] = z; Matrix_multiply(matrix, shearingMatrix); }
void Matrix_scale(Matrix * matrix, float x, float y, float z) { Matrix scalingMatrix; Matrix_loadIdentity(&scalingMatrix); scalingMatrix.m[0] = x; scalingMatrix.m[5] = y; scalingMatrix.m[10] = z; Matrix_multiply(matrix, scalingMatrix); }
void Matrix_translate(Matrix * matrix, float x, float y, float z) { Matrix translationMatrix; Matrix_loadIdentity(&translationMatrix); translationMatrix.m[12] = x; translationMatrix.m[13] = y; translationMatrix.m[14] = z; Matrix_multiply(matrix, translationMatrix); }
void Matrix_applyOrtho(Matrix * matrix, float left, float right, float bottom, float top, float zNear, float zFar) { Matrix orthoMatrix; Matrix_loadIdentity(&orthoMatrix); orthoMatrix.m[0] = 2.0f / (right - left); orthoMatrix.m[5] = 2.0f / (top - bottom); orthoMatrix.m[10] = -2.0f / (zFar - zNear); orthoMatrix.m[12] = -((right + left) / (right - left)); orthoMatrix.m[13] = -((top + bottom) / (top - bottom)); orthoMatrix.m[14] = -((zFar + zNear) / (zFar - zNear)); Matrix_multiply(matrix, orthoMatrix); }
Matrix Matrix_fromDirectionVectors(Vector3 right, Vector3 up, Vector3 front) { Matrix matrix; Matrix_loadIdentity(&matrix); matrix.m[0] = right.x; matrix.m[1] = right.y; matrix.m[2] = right.z; matrix.m[4] = up.x; matrix.m[5] = up.y; matrix.m[6] = up.z; matrix.m[8] = front.x; matrix.m[9] = front.y; matrix.m[10] = front.z; return matrix; }
static void testIdentity() { Matrix matrix; matrix = Matrix_identity(); assertMatrixExact(matrix, 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); memset(matrix.m, sizeof(float) * 16, 0); Matrix_loadIdentity(&matrix); assertMatrixExact(matrix, 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); }
void Matrix_applyPerspective(Matrix * matrix, float fovY, float aspect, float zNear, float zFar) { Matrix perspectiveMatrix; float sine, cotangent, deltaZ; fovY = (degreesToRadians(fovY) / 2.0f); deltaZ = (zFar - zNear); sine = sin(fovY); if (deltaZ == 0.0f || sine == 0.0f || aspect == 0.0f) { return; } cotangent = (cos(fovY) / sine); Matrix_loadIdentity(&perspectiveMatrix); perspectiveMatrix.m[0] = (cotangent / aspect); perspectiveMatrix.m[5] = cotangent; perspectiveMatrix.m[10] = (-(zFar + zNear) / deltaZ); perspectiveMatrix.m[11] = -1.0f; perspectiveMatrix.m[14] = ((-2.0f * zNear * zFar) / deltaZ); perspectiveMatrix.m[15] = 0.0f; Matrix_multiply(matrix, perspectiveMatrix); }
void Matrix_applyPerspective(Matrix * matrix, float fovYDegrees, float aspect, float zNear, float zFar) { Matrix perspectiveMatrix; float sine, cotangent, deltaZ; fovYDegrees = fovYDegrees * M_PI / 360.0f; deltaZ = zFar - zNear; sine = sin(fovYDegrees); if (deltaZ == 0.0f || sine == 0.0f || aspect == 0.0f) { return; } cotangent = cos(fovYDegrees) / sine; Matrix_loadIdentity(&perspectiveMatrix); perspectiveMatrix.m[0] = cotangent / aspect; perspectiveMatrix.m[5] = cotangent; perspectiveMatrix.m[10] = -(zFar + zNear) / deltaZ; perspectiveMatrix.m[11] = -1.0f; perspectiveMatrix.m[14] = -2.0f * zNear * zFar / deltaZ; perspectiveMatrix.m[15] = 0.0f; Matrix_multiply(matrix, perspectiveMatrix); }
void Matrix_ortho(Matrix* result, float left, float right, float bottom, float top, float nearZ, float farZ) { float deltaX = right - left; float deltaY = top - bottom; float deltaZ = farZ - nearZ; Matrix ortho; if ((deltaX == 0.0f) || (deltaY == 0.0f) || (deltaZ == 0.0f)) { return; } Matrix_loadIdentity(&ortho); ortho.m[0][0] = 2.0f / deltaX; ortho.m[3][0] = -(right + left) / deltaX; ortho.m[1][1] = 2.0f / deltaY; ortho.m[3][1] = -(top + bottom) / deltaY; ortho.m[2][2] = -2.0f / deltaZ; ortho.m[3][2] = -(nearZ + farZ) / deltaZ; Matrix_multiply(result, &ortho, result); }
void Matrix_multiply(Matrix* result, Matrix* srcA, Matrix* srcB) { Matrix tmp; int i; Matrix_loadIdentity(result); for (i = 0; i < 4; i++) { tmp.m[i][0] = (srcA->m[i][0] * srcB->m[0][0]) + (srcA->m[i][1] * srcB->m[1][0]) + (srcA->m[i][2] * srcB->m[2][0]) + (srcA->m[i][3] * srcB->m[3][0]); tmp.m[i][1] = (srcA->m[i][0] * srcB->m[0][1]) + (srcA->m[i][1] * srcB->m[1][1]) + (srcA->m[i][2] * srcB->m[2][1]) + (srcA->m[i][3] * srcB->m[3][1]); tmp.m[i][2] = (srcA->m[i][0] * srcB->m[0][2]) + (srcA->m[i][1] * srcB->m[1][2]) + (srcA->m[i][2] * srcB->m[2][2]) + (srcA->m[i][3] * srcB->m[3][2]); tmp.m[i][3] = (srcA->m[i][0] * srcB->m[0][3]) + (srcA->m[i][1] * srcB->m[1][3]) + (srcA->m[i][2] * srcB->m[2][3]) + (srcA->m[i][3] * srcB->m[3][3]); } memcpy(result, &tmp, sizeof(Matrix)); }
Matrix Matrix_identity() { Matrix matrix; Matrix_loadIdentity(&matrix); return matrix; }