summaryrefslogtreecommitdiff
path: root/vcl/glyphy/demo/matrix4x4.c
diff options
context:
space:
mode:
Diffstat (limited to 'vcl/glyphy/demo/matrix4x4.c')
-rw-r--r--vcl/glyphy/demo/matrix4x4.c481
1 files changed, 0 insertions, 481 deletions
diff --git a/vcl/glyphy/demo/matrix4x4.c b/vcl/glyphy/demo/matrix4x4.c
deleted file mode 100644
index f103589e6593..000000000000
--- a/vcl/glyphy/demo/matrix4x4.c
+++ /dev/null
@@ -1,481 +0,0 @@
-/*
- * Copyright (c) 2009, Mozilla Corp
- * Copyright (c) 2012, Google, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * * Neither the name of the <organization> nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY <copyright holder> ''AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * Based on sample code from the OpenGL(R) ES 2.0 Programming Guide, which carriers
- * the following header:
- *
- * Book: OpenGL(R) ES 2.0 Programming Guide
- * Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner
- * ISBN-10: 0321502795
- * ISBN-13: 9780321502797
- * Publisher: Addison-Wesley Professional
- * URLs: http://safari.informit.com/9780321563835
- * http://www.opengles-book.com
- */
-
-/*
- * Ported from JavaScript to C by Behdad Esfahbod, 2012.
- * Added MultMatrix. Converting from fixed-function OpenGL matrix
- * operations to these functions should be as simple as renaming the
- * 'gl' prefix to 'm4' and adding the matrix argument to the call.
- *
- * The C version lives at http://code.google.com/p/matrix4x4-c/
- */
-
-#include "matrix4x4.h"
-#include <math.h>
-
-/*
- * A simple 4x4 matrix utility implementation
- */
-
-
-float *
-m4LoadIdentity (float *mat) {
- unsigned int i;
- for (i = 0; i < 16; i++)
- mat[i] = 0;
- mat[0*4+0] = 1.0;
- mat[1*4+1] = 1.0;
- mat[2*4+2] = 1.0;
- mat[3*4+3] = 1.0;
- return mat;
-}
-
-/* Copies other matrix into mat */
-float *
-m4Copy (float *mat, const float *other) {
- unsigned int i;
- for (i = 0; i < 16; i++) {
- mat[i] = other[i];
- }
- return mat;
-}
-
-float *
-m4Multiply (float *mat, const float *right) {
- float tmp[16];
- unsigned int i;
-
- for (i = 0; i < 4; i++) {
- tmp[i*4+0] =
- (mat[i*4+0] * right[0*4+0]) +
- (mat[i*4+1] * right[1*4+0]) +
- (mat[i*4+2] * right[2*4+0]) +
- (mat[i*4+3] * right[3*4+0]) ;
-
- tmp[i*4+1] =
- (mat[i*4+0] * right[0*4+1]) +
- (mat[i*4+1] * right[1*4+1]) +
- (mat[i*4+2] * right[2*4+1]) +
- (mat[i*4+3] * right[3*4+1]) ;
-
- tmp[i*4+2] =
- (mat[i*4+0] * right[0*4+2]) +
- (mat[i*4+1] * right[1*4+2]) +
- (mat[i*4+2] * right[2*4+2]) +
- (mat[i*4+3] * right[3*4+2]) ;
-
- tmp[i*4+3] =
- (mat[i*4+0] * right[0*4+3]) +
- (mat[i*4+1] * right[1*4+3]) +
- (mat[i*4+2] * right[2*4+3]) +
- (mat[i*4+3] * right[3*4+3]) ;
- }
-
- return m4Copy (mat, tmp);
-}
-
-float
-m4Get (float *mat, unsigned int row, unsigned int col) {
- return mat[4*row+col];
-}
-
-float *
-m4MultMatrix (float *mat, const float *left) {
- float tmp[16];
- return m4Copy (mat, m4Multiply (m4Copy (tmp, left), mat));
-}
-
-float *
-m4Scale (float *mat, float sx, float sy, float sz) {
- mat[0*4+0] *= sx;
- mat[0*4+1] *= sx;
- mat[0*4+2] *= sx;
- mat[0*4+3] *= sx;
-
- mat[1*4+0] *= sy;
- mat[1*4+1] *= sy;
- mat[1*4+2] *= sy;
- mat[1*4+3] *= sy;
-
- mat[2*4+0] *= sz;
- mat[2*4+1] *= sz;
- mat[2*4+2] *= sz;
- mat[2*4+3] *= sz;
-
- return mat;
-}
-
-float *
-m4Translate (float *mat, float tx, float ty, float tz) {
- mat[3*4+0] += mat[0*4+0] * tx + mat[1*4+0] * ty + mat[2*4+0] * tz;
- mat[3*4+1] += mat[0*4+1] * tx + mat[1*4+1] * ty + mat[2*4+1] * tz;
- mat[3*4+2] += mat[0*4+2] * tx + mat[1*4+2] * ty + mat[2*4+2] * tz;
- mat[3*4+3] += mat[0*4+3] * tx + mat[1*4+3] * ty + mat[2*4+3] * tz;
-
- return mat;
-}
-
-float *
-m4Rotate (float *mat, float angle, float x, float y, float z) {
- float mag = sqrt(x*x + y*y + z*z);
- float sinAngle = sin(angle * M_PI / 180.0);
- float cosAngle = cos(angle * M_PI / 180.0);
-
- float xx, yy, zz, xy, yz, zx, xs, ys, zs;
- float oneMinusCos;
-
- float rotMat[16];
-
- if (mag <= 0)
- return mat;
-
- m4LoadIdentity (rotMat);
-
- x /= mag;
- y /= mag;
- z /= mag;
-
- xx = x * x;
- yy = y * y;
- zz = z * z;
- xy = x * y;
- yz = y * z;
- zx = z * x;
- xs = x * sinAngle;
- ys = y * sinAngle;
- zs = z * sinAngle;
- oneMinusCos = 1.0 - cosAngle;
-
- rotMat[0*4+0] = (oneMinusCos * xx) + cosAngle;
- rotMat[0*4+1] = (oneMinusCos * xy) - zs;
- rotMat[0*4+2] = (oneMinusCos * zx) + ys;
- rotMat[0*4+3] = 0.0;
-
- rotMat[1*4+0] = (oneMinusCos * xy) + zs;
- rotMat[1*4+1] = (oneMinusCos * yy) + cosAngle;
- rotMat[1*4+2] = (oneMinusCos * yz) - xs;
- rotMat[1*4+3] = 0.0;
-
- rotMat[2*4+0] = (oneMinusCos * zx) - ys;
- rotMat[2*4+1] = (oneMinusCos * yz) + xs;
- rotMat[2*4+2] = (oneMinusCos * zz) + cosAngle;
- rotMat[2*4+3] = 0.0;
-
- rotMat[3*4+0] = 0.0;
- rotMat[3*4+1] = 0.0;
- rotMat[3*4+2] = 0.0;
- rotMat[3*4+3] = 1.0;
-
- return m4Copy (mat, m4Multiply (rotMat, mat));
-}
-
-float *
-m4Frustum (float *mat, float left, float right, float bottom, float top, float nearZ, float farZ) {
- float deltaX = right - left;
- float deltaY = top - bottom;
- float deltaZ = farZ - nearZ;
-
- float frust[16];
-
- if ( (nearZ <= 0.0) || (farZ <= 0.0) ||
- (deltaX <= 0.0) || (deltaY <= 0.0) || (deltaZ <= 0.0) )
- return mat;
-
- m4LoadIdentity (frust);
-
- frust[0*4+0] = 2.0 * nearZ / deltaX;
- frust[0*4+1] = frust[0*4+2] = frust[0*4+3] = 0.0;
-
- frust[1*4+1] = 2.0 * nearZ / deltaY;
- frust[1*4+0] = frust[1*4+2] = frust[1*4+3] = 0.0;
-
- frust[2*4+0] = (right + left) / deltaX;
- frust[2*4+1] = (top + bottom) / deltaY;
- frust[2*4+2] = -(nearZ + farZ) / deltaZ;
- frust[2*4+3] = -1.0;
-
- frust[3*4+2] = -2.0 * nearZ * farZ / deltaZ;
- frust[3*4+0] = frust[3*4+1] = frust[3*4+3] = 0.0;
-
- return m4Copy (mat, m4Multiply (frust, mat));
-}
-
-float *
-m4Perspective (float *mat, float fovy, float aspect, float nearZ, float farZ) {
- float frustumH = tan(fovy / 360.0 * M_PI) * nearZ;
- float frustumW = frustumH * aspect;
-
- return m4Frustum(mat, -frustumW, frustumW, -frustumH, frustumH, nearZ, farZ);
-}
-
-float *
-m4Ortho (float *mat, float left, float right, float bottom, float top, float nearZ, float farZ) {
- float deltaX = right - left;
- float deltaY = top - bottom;
- float deltaZ = farZ - nearZ;
-
- float ortho[16];
-
- if ( (deltaX == 0.0) || (deltaY == 0.0) || (deltaZ == 0.0) )
- return mat;
-
- m4LoadIdentity (ortho);
-
- ortho[0*4+0] = 2.0 / deltaX;
- ortho[3*4+0] = -(right + left) / deltaX;
- ortho[1*4+1] = 2.0 / deltaY;
- ortho[3*4+1] = -(top + bottom) / deltaY;
- ortho[2*4+2] = -2.0 / deltaZ;
- ortho[3*4+2] = -(nearZ + farZ) / deltaZ;
-
- return m4Copy (mat, m4Multiply (ortho, mat));
-}
-
-/* In-place inversion */
-float *
-m4Invert (float *mat) {
- float tmp_0 = m4Get(mat,2,2) * m4Get(mat,3,3);
- float tmp_1 = m4Get(mat,3,2) * m4Get(mat,2,3);
- float tmp_2 = m4Get(mat,1,2) * m4Get(mat,3,3);
- float tmp_3 = m4Get(mat,3,2) * m4Get(mat,1,3);
- float tmp_4 = m4Get(mat,1,2) * m4Get(mat,2,3);
- float tmp_5 = m4Get(mat,2,2) * m4Get(mat,1,3);
- float tmp_6 = m4Get(mat,0,2) * m4Get(mat,3,3);
- float tmp_7 = m4Get(mat,3,2) * m4Get(mat,0,3);
- float tmp_8 = m4Get(mat,0,2) * m4Get(mat,2,3);
- float tmp_9 = m4Get(mat,2,2) * m4Get(mat,0,3);
- float tmp_10 = m4Get(mat,0,2) * m4Get(mat,1,3);
- float tmp_11 = m4Get(mat,1,2) * m4Get(mat,0,3);
- float tmp_12 = m4Get(mat,2,0) * m4Get(mat,3,1);
- float tmp_13 = m4Get(mat,3,0) * m4Get(mat,2,1);
- float tmp_14 = m4Get(mat,1,0) * m4Get(mat,3,1);
- float tmp_15 = m4Get(mat,3,0) * m4Get(mat,1,1);
- float tmp_16 = m4Get(mat,1,0) * m4Get(mat,2,1);
- float tmp_17 = m4Get(mat,2,0) * m4Get(mat,1,1);
- float tmp_18 = m4Get(mat,0,0) * m4Get(mat,3,1);
- float tmp_19 = m4Get(mat,3,0) * m4Get(mat,0,1);
- float tmp_20 = m4Get(mat,0,0) * m4Get(mat,2,1);
- float tmp_21 = m4Get(mat,2,0) * m4Get(mat,0,1);
- float tmp_22 = m4Get(mat,0,0) * m4Get(mat,1,1);
- float tmp_23 = m4Get(mat,1,0) * m4Get(mat,0,1);
-
- float t0 = ((tmp_0 * m4Get(mat,1,1) + tmp_3 * m4Get(mat,2,1) + tmp_4 * m4Get(mat,3,1)) -
- (tmp_1 * m4Get(mat,1,1) + tmp_2 * m4Get(mat,2,1) + tmp_5 * m4Get(mat,3,1)));
- float t1 = ((tmp_1 * m4Get(mat,0,1) + tmp_6 * m4Get(mat,2,1) + tmp_9 * m4Get(mat,3,1)) -
- (tmp_0 * m4Get(mat,0,1) + tmp_7 * m4Get(mat,2,1) + tmp_8 * m4Get(mat,3,1)));
- float t2 = ((tmp_2 * m4Get(mat,0,1) + tmp_7 * m4Get(mat,1,1) + tmp_10 * m4Get(mat,3,1)) -
- (tmp_3 * m4Get(mat,0,1) + tmp_6 * m4Get(mat,1,1) + tmp_11 * m4Get(mat,3,1)));
- float t3 = ((tmp_5 * m4Get(mat,0,1) + tmp_8 * m4Get(mat,1,1) + tmp_11 * m4Get(mat,2,1)) -
- (tmp_4 * m4Get(mat,0,1) + tmp_9 * m4Get(mat,1,1) + tmp_10 * m4Get(mat,2,1)));
-
- float d = 1.0 / (m4Get(mat,0,0) * t0 + m4Get(mat,1,0) * t1 + m4Get(mat,2,0) * t2 + m4Get(mat,3,0) * t3);
-
- float out_00 = d * t0;
- float out_01 = d * t1;
- float out_02 = d * t2;
- float out_03 = d * t3;
-
- float out_10 = d * ((tmp_1 * m4Get(mat,1,0) + tmp_2 * m4Get(mat,2,0) + tmp_5 * m4Get(mat,3,0)) -
- (tmp_0 * m4Get(mat,1,0) + tmp_3 * m4Get(mat,2,0) + tmp_4 * m4Get(mat,3,0)));
- float out_11 = d * ((tmp_0 * m4Get(mat,0,0) + tmp_7 * m4Get(mat,2,0) + tmp_8 * m4Get(mat,3,0)) -
- (tmp_1 * m4Get(mat,0,0) + tmp_6 * m4Get(mat,2,0) + tmp_9 * m4Get(mat,3,0)));
- float out_12 = d * ((tmp_3 * m4Get(mat,0,0) + tmp_6 * m4Get(mat,1,0) + tmp_11 * m4Get(mat,3,0)) -
- (tmp_2 * m4Get(mat,0,0) + tmp_7 * m4Get(mat,1,0) + tmp_10 * m4Get(mat,3,0)));
- float out_13 = d * ((tmp_4 * m4Get(mat,0,0) + tmp_9 * m4Get(mat,1,0) + tmp_10 * m4Get(mat,2,0)) -
- (tmp_5 * m4Get(mat,0,0) + tmp_8 * m4Get(mat,1,0) + tmp_11 * m4Get(mat,2,0)));
-
- float out_20 = d * ((tmp_12 * m4Get(mat,1,3) + tmp_15 * m4Get(mat,2,3) + tmp_16 * m4Get(mat,3,3)) -
- (tmp_13 * m4Get(mat,1,3) + tmp_14 * m4Get(mat,2,3) + tmp_17 * m4Get(mat,3,3)));
- float out_21 = d * ((tmp_13 * m4Get(mat,0,3) + tmp_18 * m4Get(mat,2,3) + tmp_21 * m4Get(mat,3,3)) -
- (tmp_12 * m4Get(mat,0,3) + tmp_19 * m4Get(mat,2,3) + tmp_20 * m4Get(mat,3,3)));
- float out_22 = d * ((tmp_14 * m4Get(mat,0,3) + tmp_19 * m4Get(mat,1,3) + tmp_22 * m4Get(mat,3,3)) -
- (tmp_15 * m4Get(mat,0,3) + tmp_18 * m4Get(mat,1,3) + tmp_23 * m4Get(mat,3,3)));
- float out_23 = d * ((tmp_17 * m4Get(mat,0,3) + tmp_20 * m4Get(mat,1,3) + tmp_23 * m4Get(mat,2,3)) -
- (tmp_16 * m4Get(mat,0,3) + tmp_21 * m4Get(mat,1,3) + tmp_22 * m4Get(mat,2,3)));
-
- float out_30 = d * ((tmp_14 * m4Get(mat,2,2) + tmp_17 * m4Get(mat,3,2) + tmp_13 * m4Get(mat,1,2)) -
- (tmp_16 * m4Get(mat,3,2) + tmp_12 * m4Get(mat,1,2) + tmp_15 * m4Get(mat,2,2)));
- float out_31 = d * ((tmp_20 * m4Get(mat,3,2) + tmp_12 * m4Get(mat,0,2) + tmp_19 * m4Get(mat,2,2)) -
- (tmp_18 * m4Get(mat,2,2) + tmp_21 * m4Get(mat,3,2) + tmp_13 * m4Get(mat,0,2)));
- float out_32 = d * ((tmp_18 * m4Get(mat,1,2) + tmp_23 * m4Get(mat,3,2) + tmp_15 * m4Get(mat,0,2)) -
- (tmp_22 * m4Get(mat,3,2) + tmp_14 * m4Get(mat,0,2) + tmp_19 * m4Get(mat,1,2)));
- float out_33 = d * ((tmp_22 * m4Get(mat,2,2) + tmp_16 * m4Get(mat,0,2) + tmp_21 * m4Get(mat,1,2)) -
- (tmp_20 * m4Get(mat,1,2) + tmp_23 * m4Get(mat,2,2) + tmp_17 * m4Get(mat,0,2)));
-
- mat[0*4+0] = out_00;
- mat[0*4+1] = out_01;
- mat[0*4+2] = out_02;
- mat[0*4+3] = out_03;
- mat[1*4+0] = out_10;
- mat[1*4+1] = out_11;
- mat[1*4+2] = out_12;
- mat[1*4+3] = out_13;
- mat[2*4+0] = out_20;
- mat[2*4+1] = out_21;
- mat[2*4+2] = out_22;
- mat[2*4+3] = out_23;
- mat[3*4+0] = out_30;
- mat[3*4+1] = out_31;
- mat[3*4+2] = out_32;
- mat[3*4+3] = out_33;
- return mat;
-}
-
-/* Puts the inverse of other matrix into mat */
-float *
-m4Inverse (float *mat, const float *other) {
- m4Copy (mat, other);
- m4Invert (mat);
- return mat;
-}
-
-/* In-place transpose */
-float *
-m4Transpose (float *mat) {
- float tmp = mat[0*4+1];
- mat[0*4+1] = mat[1*4+0];
- mat[1*4+0] = tmp;
-
- tmp = mat[0*4+2];
- mat[0*4+2] = mat[2*4+0];
- mat[2*4+0] = tmp;
-
- tmp = mat[0*4+3];
- mat[0*4+3] = mat[3*4+0];
- mat[3*4+0] = tmp;
-
- tmp = mat[1*4+2];
- mat[1*4+2] = mat[2*4+1];
- mat[2*4+1] = tmp;
-
- tmp = mat[1*4+3];
- mat[1*4+3] = mat[3*4+1];
- mat[3*4+1] = tmp;
-
- tmp = mat[2*4+3];
- mat[2*4+3] = mat[3*4+2];
- mat[3*4+2] = tmp;
-
- return mat;
-}
-
-float *
-m4ApplyToVect (float *mat, float *vec)
-{
- float tmp[4] = {vec[0], vec[1], vec[2], vec[3]};
-
- vec[0] = mat[0]*tmp[0] + mat[4]*tmp[1] + mat[8]*tmp[2] + mat[12]*tmp[3];
- vec[1] = mat[1]*tmp[0] + mat[5]*tmp[1] + mat[9]*tmp[2] + mat[13]*tmp[3];
- vec[2] = mat[2]*tmp[0] + mat[6]*tmp[1] + mat[10]*tmp[2] + mat[14]*tmp[3];
- vec[3] = mat[3]*tmp[0] + mat[7]*tmp[1] + mat[11]*tmp[2] + mat[15]*tmp[3];
-
- return vec;
-}
-
-#ifdef TEST
-
-#include <stdio.h>
-
-static void setvec (float *vec, float x, float y, float z, float w)
-{
- vec[0] = x;
- vec[1] = y;
- vec[2] = z;
- vec[3] = w;
-}
-
-static void printmat (float *mat)
-{
- printf("(%f,%f,%f,%f,\n", mat[0], mat[1], mat[2], mat[3]);
- printf(" %f,%f,%f,%f,\n", mat[4], mat[5], mat[6], mat[7]);
- printf(" %f,%f,%f,%f,\n", mat[8], mat[9], mat[10], mat[11]);
- printf(" %f,%f,%f,%f)\n", mat[12], mat[13], mat[14], mat[15]);
-}
-
-static void printvec (float *vec)
-{
- printf("(%f,%f,%f,%f)\n", vec[0], vec[1], vec[2], vec[3]);
-}
-
-int main(int argc, char **argv)
-{
- float mat[16];
- float vec[4];
-
- setvec (vec, 1, 2, 3, 1);
- printf ("vec:\n");
- printvec (vec);
-
- m4LoadIdentity (mat);
- printf ("Identity matrix:\n");
- printmat (mat);
-
- m4Scale (mat, 2, 2, 2);
- printf ("Scale by 2:\n");
- printmat (mat);
-
- m4LoadIdentity (mat);
- m4Translate (mat, 2, 3, 0);
- printf ("Translate by (2,3,0):\n");
- printmat (mat);
-
- printf ("Apply that to vec:\n");
- m4ApplyToVect (mat, vec);
- printvec (vec);
-
- m4LoadIdentity (mat);
- m4Scale (mat, 2, 2, 2);
- m4ApplyToVect (mat, vec);
- printf ("Scale then by 2:\n");
- printvec (vec);
-
- setvec (vec, 1, 2, 3, 1);
- m4LoadIdentity (mat);
- m4Scale (mat, 2, 2, 2);
- m4Translate (mat, 2, 3, 0);
- m4ApplyToVect (mat, vec);
- printf ("Both in one step:\n");
- printvec (vec);
-
- return 0;
-}
-
-#endif