e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Initialize the given matrix to the identity.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Parse a string of 16 floats to initialize a matrix (row major order).
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * If there's a parsing error, initialize the matrix to the identity.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const char *fmt = "%f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f";
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const char *fmtb = "[ %f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f ]";
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (n != 16) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* insufficient parameters */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Initialize a matrix from an array of 16 values.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrMatrixInitFromDoubles(CRmatrix *m, const double *v)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync m->m00 = (float) v[0];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* useful for debugging */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync printf(" %f %f %f %f\n", m->m00, m->m10, m->m20, m->m30);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync printf(" %f %f %f %f\n", m->m01, m->m11, m->m21, m->m31);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync printf(" %f %f %f %f\n", m->m02, m->m12, m->m22, m->m32);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync printf(" %f %f %f %f\n", m->m03, m->m13, m->m23, m->m33);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* Return 1 if the matrices are equal, return 0 otherwise.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrMatrixIsEqual(const CRmatrix *m, const CRmatrix *n)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Test if matrix is identity
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return crMemcmp(m, &identity_matrix, sizeof(CRmatrix)) == 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Test if matrix is orthographic projection matrix.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Compute p = a * b
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrMatrixMultiply(CRmatrix *p, const CRmatrix *a, const CRmatrix *b)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRmatrix t; /* temporary result, in case p = a or p = b */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync t.m00 = a->m00 * b->m00 + a->m10 * b->m01 + a->m20 * b->m02 + a->m30 * b->m03;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync t.m01 = a->m01 * b->m00 + a->m11 * b->m01 + a->m21 * b->m02 + a->m31 * b->m03;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync t.m02 = a->m02 * b->m00 + a->m12 * b->m01 + a->m22 * b->m02 + a->m32 * b->m03;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync t.m03 = a->m03 * b->m00 + a->m13 * b->m01 + a->m23 * b->m02 + a->m33 * b->m03;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync t.m10 = a->m00 * b->m10 + a->m10 * b->m11 + a->m20 * b->m12 + a->m30 * b->m13;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync t.m11 = a->m01 * b->m10 + a->m11 * b->m11 + a->m21 * b->m12 + a->m31 * b->m13;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync t.m12 = a->m02 * b->m10 + a->m12 * b->m11 + a->m22 * b->m12 + a->m32 * b->m13;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync t.m13 = a->m03 * b->m10 + a->m13 * b->m11 + a->m23 * b->m12 + a->m33 * b->m13;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync t.m20 = a->m00 * b->m20 + a->m10 * b->m21 + a->m20 * b->m22 + a->m30 * b->m23;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync t.m21 = a->m01 * b->m20 + a->m11 * b->m21 + a->m21 * b->m22 + a->m31 * b->m23;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync t.m22 = a->m02 * b->m20 + a->m12 * b->m21 + a->m22 * b->m22 + a->m32 * b->m23;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync t.m23 = a->m03 * b->m20 + a->m13 * b->m21 + a->m23 * b->m22 + a->m33 * b->m23;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync t.m30 = a->m00 * b->m30 + a->m10 * b->m31 + a->m20 * b->m32 + a->m30 * b->m33;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync t.m31 = a->m01 * b->m30 + a->m11 * b->m31 + a->m21 * b->m32 + a->m31 * b->m33;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync t.m32 = a->m02 * b->m30 + a->m12 * b->m31 + a->m22 * b->m32 + a->m32 * b->m33;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync t.m33 = a->m03 * b->m30 + a->m13 * b->m31 + a->m23 * b->m32 + a->m33 * b->m33;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrMatrixTransformPointf(const CRmatrix *m, GLvectorf *p)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync float x = p->x;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync float y = p->y;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync float z = p->z;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync float w = p->w;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrMatrixTransformPointd(const CRmatrix *m, GLvectord *p)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync double x = p->x;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync double y = p->y;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync double z = p->z;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync double w = p->w;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->x = (double) (m->m00*x + m->m10*y + m->m20*z + m->m30*w);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->y = (double) (m->m01*x + m->m11*y + m->m21*z + m->m31*w);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->z = (double) (m->m02*x + m->m12*y + m->m22*z + m->m32*w);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->w = (double) (m->m03*x + m->m13*y + m->m23*z + m->m33*w);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrMatrixInvertTranspose(CRmatrix *inv, const CRmatrix *mat)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Taken from Pomegranate code, trans.c.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Note: We have our data structures reversed
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define det3x3(a1, a2, a3, b1, b2, b3, c1, c2, c3) \
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const float inv_det = 1.0f / ( m00 * cof00 + m01 * cof01 +
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Perform transpose in asignment */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync inv->m00 = cof00 * inv_det; inv->m10 = cof01 * inv_det;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync inv->m20 = cof02 * inv_det; inv->m30 = cof03 * inv_det;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync inv->m01 = cof10 * inv_det; inv->m11 = cof11 * inv_det;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync inv->m21 = cof12 * inv_det; inv->m31 = cof13 * inv_det;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync inv->m02 = cof20 * inv_det; inv->m12 = cof21 * inv_det;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync inv->m22 = cof22 * inv_det; inv->m32 = cof23 * inv_det;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync inv->m03 = cof30 * inv_det; inv->m13 = cof31 * inv_det;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync inv->m23 = cof32 * inv_det; inv->m33 = cof33 * inv_det;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync c.m00 = m->m00; c.m10 = m->m01; c.m20 = m->m02; c.m30 = m->m03;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync c.m01 = m->m10; c.m11 = m->m11; c.m21 = m->m12; c.m31 = m->m13;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync c.m02 = m->m20; c.m12 = m->m21; c.m22 = m->m22; c.m32 = m->m23;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync c.m03 = m->m30; c.m13 = m->m31; c.m23 = m->m32; c.m33 = m->m33;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Apply a translation to the given matrix.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrMatrixTranslate(CRmatrix *m, float x, float y, float z)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync m->m30 = m->m00 * x + m->m10 * y + m->m20 * z + m->m30;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync m->m31 = m->m01 * x + m->m11 * y + m->m21 * z + m->m31;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync m->m32 = m->m02 * x + m->m12 * y + m->m22 * z + m->m32;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync m->m33 = m->m03 * x + m->m13 * y + m->m23 * z + m->m33;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Apply a rotation to the given matrix.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrMatrixRotate(CRmatrix *m, float angle, float x, float y, float z)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const float c = (float) cos(angle * M_PI / 180.0f);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const float s = (float) sin(angle * M_PI / 180.0f);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const float v_len = (float) sqrt (x*x + y*y + z*z);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Begin/end Checking and flushing will be done by MultMatrix. */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Normalize the vector */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* compute some common values */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Generate the terms of the rotation matrix
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ** from pg 325 OGL 1.1 Blue Book.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Apply a scale to the given matrix.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrMatrixScale(CRmatrix *m, float x, float y, float z)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Make a projection matrix from frustum parameters.