annotate webGL/dandy/resources/CanvasMatrix.js @ 3:10344afb38a6

upload dandy
author NOBUYASU Oshiro
date Mon, 07 Jun 2010 17:58:31 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
1 /*
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
2 * Copyright (C) 2009 Apple Inc. All Rights Reserved.
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
3 *
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
4 * Redistribution and use in source and binary forms, with or without
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
5 * modification, are permitted provided that the following conditions
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
6 * are met:
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
7 * 1. Redistributions of source code must retain the above copyright
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
8 * notice, this list of conditions and the following disclaimer.
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
9 * 2. Redistributions in binary form must reproduce the above copyright
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer in the
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
11 * documentation and/or other materials provided with the distribution.
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
12 *
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
24 */
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
25 /*
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
26 CanvasMatrix4 class
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
27
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
28 This class implements a 4x4 matrix. It has functions which
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
29 duplicate the functionality of the OpenGL matrix stack and
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
30 glut functions.
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
31
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
32 IDL:
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
33
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
34 [
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
35 Constructor(in CanvasMatrix4 matrix), // copy passed matrix into new CanvasMatrix4
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
36 Constructor(in sequence<float> array) // create new CanvasMatrix4 with 16 floats (row major)
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
37 Constructor() // create new CanvasMatrix4 with identity matrix
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
38 ]
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
39 interface CanvasMatrix4 {
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
40 attribute float m11;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
41 attribute float m12;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
42 attribute float m13;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
43 attribute float m14;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
44 attribute float m21;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
45 attribute float m22;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
46 attribute float m23;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
47 attribute float m24;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
48 attribute float m31;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
49 attribute float m32;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
50 attribute float m33;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
51 attribute float m34;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
52 attribute float m41;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
53 attribute float m42;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
54 attribute float m43;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
55 attribute float m44;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
56
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
57 void load(in CanvasMatrix4 matrix); // copy the values from the passed matrix
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
58 void load(in sequence<float> array); // copy 16 floats into the matrix
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
59 sequence<float> getAsArray(); // return the matrix as an array of 16 floats
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
60 WebGLFloatArray getAsCanvasFloatArray(); // return the matrix as a WebGLFloatArray with 16 values
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
61 void makeIdentity(); // replace the matrix with identity
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
62 void transpose(); // replace the matrix with its transpose
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
63 void invert(); // replace the matrix with its inverse
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
64
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
65 void translate(in float x, in float y, in float z); // multiply the matrix by passed translation values on the right
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
66 void scale(in float x, in float y, in float z); // multiply the matrix by passed scale values on the right
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
67 void rotate(in float angle, // multiply the matrix by passed rotation values on the right
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
68 in float x, in float y, in float z); // (angle is in degrees)
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
69 void multRight(in CanvasMatrix matrix); // multiply the matrix by the passed matrix on the right
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
70 void multLeft(in CanvasMatrix matrix); // multiply the matrix by the passed matrix on the left
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
71 void ortho(in float left, in float right, // multiply the matrix by the passed ortho values on the right
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
72 in float bottom, in float top,
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
73 in float near, in float far);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
74 void frustum(in float left, in float right, // multiply the matrix by the passed frustum values on the right
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
75 in float bottom, in float top,
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
76 in float near, in float far);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
77 void perspective(in float fovy, in float aspect, // multiply the matrix by the passed perspective values on the right
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
78 in float zNear, in float zFar);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
79 void lookat(in float eyex, in float eyey, in float eyez, // multiply the matrix by the passed lookat
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
80 in float ctrx, in float ctry, in float ctrz, // values on the right
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
81 in float upx, in float upy, in float upz);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
82 }
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
83 */
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
84
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
85 CanvasMatrix4 = function(m)
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
86 {
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
87 if (typeof m == 'object') {
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
88 if ("length" in m && m.length >= 16) {
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
89 this.load(m[0], m[1], m[2], m[3], m[4], m[5], m[6], m[7], m[8], m[9], m[10], m[11], m[12], m[13], m[14], m[15]);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
90 return;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
91 }
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
92 else if (m instanceof CanvasMatrix4) {
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
93 this.load(m);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
94 return;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
95 }
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
96 }
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
97 this.makeIdentity();
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
98 }
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
99
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
100 CanvasMatrix4.prototype.load = function()
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
101 {
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
102 if (arguments.length == 1 && typeof arguments[0] == 'object') {
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
103 var matrix = arguments[0];
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
104
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
105 if ("length" in matrix && matrix.length == 16) {
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
106 this.m11 = matrix[0];
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
107 this.m12 = matrix[1];
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
108 this.m13 = matrix[2];
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
109 this.m14 = matrix[3];
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
110
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
111 this.m21 = matrix[4];
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
112 this.m22 = matrix[5];
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
113 this.m23 = matrix[6];
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
114 this.m24 = matrix[7];
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
115
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
116 this.m31 = matrix[8];
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
117 this.m32 = matrix[9];
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
118 this.m33 = matrix[10];
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
119 this.m34 = matrix[11];
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
120
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
121 this.m41 = matrix[12];
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
122 this.m42 = matrix[13];
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
123 this.m43 = matrix[14];
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
124 this.m44 = matrix[15];
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
125 return;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
126 }
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
127
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
128 if (arguments[0] instanceof CanvasMatrix4) {
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
129
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
130 this.m11 = matrix.m11;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
131 this.m12 = matrix.m12;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
132 this.m13 = matrix.m13;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
133 this.m14 = matrix.m14;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
134
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
135 this.m21 = matrix.m21;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
136 this.m22 = matrix.m22;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
137 this.m23 = matrix.m23;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
138 this.m24 = matrix.m24;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
139
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
140 this.m31 = matrix.m31;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
141 this.m32 = matrix.m32;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
142 this.m33 = matrix.m33;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
143 this.m34 = matrix.m34;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
144
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
145 this.m41 = matrix.m41;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
146 this.m42 = matrix.m42;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
147 this.m43 = matrix.m43;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
148 this.m44 = matrix.m44;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
149 return;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
150 }
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
151 }
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
152
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
153 this.makeIdentity();
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
154 }
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
155
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
156 CanvasMatrix4.prototype.getAsArray = function()
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
157 {
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
158 return [
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
159 this.m11, this.m12, this.m13, this.m14,
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
160 this.m21, this.m22, this.m23, this.m24,
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
161 this.m31, this.m32, this.m33, this.m34,
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
162 this.m41, this.m42, this.m43, this.m44
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
163 ];
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
164 }
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
165
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
166 CanvasMatrix4.prototype.getAsWebGLFloatArray = function()
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
167 {
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
168 return new WebGLFloatArray(this.getAsArray());
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
169 }
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
170
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
171 CanvasMatrix4.prototype.makeIdentity = function()
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
172 {
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
173 this.m11 = 1;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
174 this.m12 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
175 this.m13 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
176 this.m14 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
177
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
178 this.m21 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
179 this.m22 = 1;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
180 this.m23 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
181 this.m24 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
182
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
183 this.m31 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
184 this.m32 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
185 this.m33 = 1;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
186 this.m34 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
187
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
188 this.m41 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
189 this.m42 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
190 this.m43 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
191 this.m44 = 1;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
192 }
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
193
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
194 CanvasMatrix4.prototype.transpose = function()
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
195 {
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
196 var tmp = this.m12;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
197 this.m12 = this.m21;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
198 this.m21 = tmp;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
199
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
200 tmp = this.m13;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
201 this.m13 = this.m31;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
202 this.m31 = tmp;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
203
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
204 tmp = this.m14;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
205 this.m14 = this.m41;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
206 this.m41 = tmp;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
207
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
208 tmp = this.m23;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
209 this.m23 = this.m32;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
210 this.m32 = tmp;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
211
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
212 tmp = this.m24;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
213 this.m24 = this.m42;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
214 this.m42 = tmp;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
215
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
216 tmp = this.m34;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
217 this.m34 = this.m43;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
218 this.m43 = tmp;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
219 }
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
220
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
221 CanvasMatrix4.prototype.invert = function()
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
222 {
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
223 // Calculate the 4x4 determinant
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
224 // If the determinant is zero,
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
225 // then the inverse matrix is not unique.
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
226 var det = this._determinant4x4();
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
227
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
228 if (Math.abs(det) < 1e-8)
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
229 return null;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
230
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
231 this._makeAdjoint();
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
232
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
233 // Scale the adjoint matrix to get the inverse
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
234 this.m11 /= det;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
235 this.m12 /= det;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
236 this.m13 /= det;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
237 this.m14 /= det;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
238
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
239 this.m21 /= det;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
240 this.m22 /= det;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
241 this.m23 /= det;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
242 this.m24 /= det;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
243
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
244 this.m31 /= det;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
245 this.m32 /= det;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
246 this.m33 /= det;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
247 this.m34 /= det;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
248
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
249 this.m41 /= det;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
250 this.m42 /= det;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
251 this.m43 /= det;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
252 this.m44 /= det;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
253 }
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
254
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
255 CanvasMatrix4.prototype.translate = function(x,y,z)
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
256 {
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
257 if (x == undefined)
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
258 x = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
259 if (y == undefined)
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
260 y = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
261 if (z == undefined)
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
262 z = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
263
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
264 var matrix = new CanvasMatrix4();
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
265 matrix.m41 = x;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
266 matrix.m42 = y;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
267 matrix.m43 = z;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
268
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
269 this.multRight(matrix);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
270 }
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
271
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
272 CanvasMatrix4.prototype.scale = function(x,y,z)
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
273 {
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
274 if (x == undefined)
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
275 x = 1;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
276 if (z == undefined) {
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
277 if (y == undefined) {
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
278 y = x;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
279 z = x;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
280 }
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
281 else
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
282 z = 1;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
283 }
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
284 else if (y == undefined)
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
285 y = x;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
286
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
287 var matrix = new CanvasMatrix4();
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
288 matrix.m11 = x;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
289 matrix.m22 = y;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
290 matrix.m33 = z;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
291
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
292 this.multRight(matrix);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
293 }
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
294
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
295 CanvasMatrix4.prototype.rotate = function(angle,x,y,z)
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
296 {
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
297 // angles are in degrees. Switch to radians
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
298 angle = angle / 180 * Math.PI;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
299
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
300 angle /= 2;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
301 var sinA = Math.sin(angle);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
302 var cosA = Math.cos(angle);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
303 var sinA2 = sinA * sinA;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
304
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
305 // normalize
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
306 var length = Math.sqrt(x * x + y * y + z * z);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
307 if (length == 0) {
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
308 // bad vector, just use something reasonable
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
309 x = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
310 y = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
311 z = 1;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
312 } else if (length != 1) {
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
313 x /= length;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
314 y /= length;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
315 z /= length;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
316 }
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
317
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
318 var mat = new CanvasMatrix4();
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
319
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
320 // optimize case where axis is along major axis
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
321 if (x == 1 && y == 0 && z == 0) {
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
322 mat.m11 = 1;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
323 mat.m12 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
324 mat.m13 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
325 mat.m21 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
326 mat.m22 = 1 - 2 * sinA2;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
327 mat.m23 = 2 * sinA * cosA;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
328 mat.m31 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
329 mat.m32 = -2 * sinA * cosA;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
330 mat.m33 = 1 - 2 * sinA2;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
331 mat.m14 = mat.m24 = mat.m34 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
332 mat.m41 = mat.m42 = mat.m43 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
333 mat.m44 = 1;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
334 } else if (x == 0 && y == 1 && z == 0) {
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
335 mat.m11 = 1 - 2 * sinA2;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
336 mat.m12 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
337 mat.m13 = -2 * sinA * cosA;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
338 mat.m21 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
339 mat.m22 = 1;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
340 mat.m23 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
341 mat.m31 = 2 * sinA * cosA;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
342 mat.m32 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
343 mat.m33 = 1 - 2 * sinA2;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
344 mat.m14 = mat.m24 = mat.m34 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
345 mat.m41 = mat.m42 = mat.m43 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
346 mat.m44 = 1;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
347 } else if (x == 0 && y == 0 && z == 1) {
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
348 mat.m11 = 1 - 2 * sinA2;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
349 mat.m12 = 2 * sinA * cosA;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
350 mat.m13 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
351 mat.m21 = -2 * sinA * cosA;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
352 mat.m22 = 1 - 2 * sinA2;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
353 mat.m23 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
354 mat.m31 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
355 mat.m32 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
356 mat.m33 = 1;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
357 mat.m14 = mat.m24 = mat.m34 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
358 mat.m41 = mat.m42 = mat.m43 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
359 mat.m44 = 1;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
360 } else {
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
361 var x2 = x*x;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
362 var y2 = y*y;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
363 var z2 = z*z;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
364
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
365 mat.m11 = 1 - 2 * (y2 + z2) * sinA2;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
366 mat.m12 = 2 * (x * y * sinA2 + z * sinA * cosA);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
367 mat.m13 = 2 * (x * z * sinA2 - y * sinA * cosA);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
368 mat.m21 = 2 * (y * x * sinA2 - z * sinA * cosA);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
369 mat.m22 = 1 - 2 * (z2 + x2) * sinA2;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
370 mat.m23 = 2 * (y * z * sinA2 + x * sinA * cosA);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
371 mat.m31 = 2 * (z * x * sinA2 + y * sinA * cosA);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
372 mat.m32 = 2 * (z * y * sinA2 - x * sinA * cosA);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
373 mat.m33 = 1 - 2 * (x2 + y2) * sinA2;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
374 mat.m14 = mat.m24 = mat.m34 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
375 mat.m41 = mat.m42 = mat.m43 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
376 mat.m44 = 1;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
377 }
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
378 this.multRight(mat);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
379 }
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
380
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
381 CanvasMatrix4.prototype.multRight = function(mat)
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
382 {
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
383 var m11 = (this.m11 * mat.m11 + this.m12 * mat.m21
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
384 + this.m13 * mat.m31 + this.m14 * mat.m41);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
385 var m12 = (this.m11 * mat.m12 + this.m12 * mat.m22
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
386 + this.m13 * mat.m32 + this.m14 * mat.m42);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
387 var m13 = (this.m11 * mat.m13 + this.m12 * mat.m23
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
388 + this.m13 * mat.m33 + this.m14 * mat.m43);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
389 var m14 = (this.m11 * mat.m14 + this.m12 * mat.m24
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
390 + this.m13 * mat.m34 + this.m14 * mat.m44);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
391
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
392 var m21 = (this.m21 * mat.m11 + this.m22 * mat.m21
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
393 + this.m23 * mat.m31 + this.m24 * mat.m41);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
394 var m22 = (this.m21 * mat.m12 + this.m22 * mat.m22
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
395 + this.m23 * mat.m32 + this.m24 * mat.m42);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
396 var m23 = (this.m21 * mat.m13 + this.m22 * mat.m23
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
397 + this.m23 * mat.m33 + this.m24 * mat.m43);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
398 var m24 = (this.m21 * mat.m14 + this.m22 * mat.m24
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
399 + this.m23 * mat.m34 + this.m24 * mat.m44);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
400
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
401 var m31 = (this.m31 * mat.m11 + this.m32 * mat.m21
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
402 + this.m33 * mat.m31 + this.m34 * mat.m41);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
403 var m32 = (this.m31 * mat.m12 + this.m32 * mat.m22
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
404 + this.m33 * mat.m32 + this.m34 * mat.m42);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
405 var m33 = (this.m31 * mat.m13 + this.m32 * mat.m23
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
406 + this.m33 * mat.m33 + this.m34 * mat.m43);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
407 var m34 = (this.m31 * mat.m14 + this.m32 * mat.m24
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
408 + this.m33 * mat.m34 + this.m34 * mat.m44);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
409
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
410 var m41 = (this.m41 * mat.m11 + this.m42 * mat.m21
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
411 + this.m43 * mat.m31 + this.m44 * mat.m41);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
412 var m42 = (this.m41 * mat.m12 + this.m42 * mat.m22
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
413 + this.m43 * mat.m32 + this.m44 * mat.m42);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
414 var m43 = (this.m41 * mat.m13 + this.m42 * mat.m23
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
415 + this.m43 * mat.m33 + this.m44 * mat.m43);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
416 var m44 = (this.m41 * mat.m14 + this.m42 * mat.m24
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
417 + this.m43 * mat.m34 + this.m44 * mat.m44);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
418
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
419 this.m11 = m11;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
420 this.m12 = m12;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
421 this.m13 = m13;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
422 this.m14 = m14;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
423
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
424 this.m21 = m21;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
425 this.m22 = m22;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
426 this.m23 = m23;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
427 this.m24 = m24;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
428
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
429 this.m31 = m31;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
430 this.m32 = m32;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
431 this.m33 = m33;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
432 this.m34 = m34;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
433
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
434 this.m41 = m41;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
435 this.m42 = m42;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
436 this.m43 = m43;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
437 this.m44 = m44;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
438 }
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
439
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
440 CanvasMatrix4.prototype.multLeft = function(mat)
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
441 {
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
442 var m11 = (mat.m11 * this.m11 + mat.m12 * this.m21
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
443 + mat.m13 * this.m31 + mat.m14 * this.m41);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
444 var m12 = (mat.m11 * this.m12 + mat.m12 * this.m22
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
445 + mat.m13 * this.m32 + mat.m14 * this.m42);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
446 var m13 = (mat.m11 * this.m13 + mat.m12 * this.m23
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
447 + mat.m13 * this.m33 + mat.m14 * this.m43);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
448 var m14 = (mat.m11 * this.m14 + mat.m12 * this.m24
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
449 + mat.m13 * this.m34 + mat.m14 * this.m44);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
450
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
451 var m21 = (mat.m21 * this.m11 + mat.m22 * this.m21
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
452 + mat.m23 * this.m31 + mat.m24 * this.m41);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
453 var m22 = (mat.m21 * this.m12 + mat.m22 * this.m22
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
454 + mat.m23 * this.m32 + mat.m24 * this.m42);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
455 var m23 = (mat.m21 * this.m13 + mat.m22 * this.m23
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
456 + mat.m23 * this.m33 + mat.m24 * this.m43);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
457 var m24 = (mat.m21 * this.m14 + mat.m22 * this.m24
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
458 + mat.m23 * this.m34 + mat.m24 * this.m44);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
459
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
460 var m31 = (mat.m31 * this.m11 + mat.m32 * this.m21
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
461 + mat.m33 * this.m31 + mat.m34 * this.m41);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
462 var m32 = (mat.m31 * this.m12 + mat.m32 * this.m22
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
463 + mat.m33 * this.m32 + mat.m34 * this.m42);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
464 var m33 = (mat.m31 * this.m13 + mat.m32 * this.m23
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
465 + mat.m33 * this.m33 + mat.m34 * this.m43);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
466 var m34 = (mat.m31 * this.m14 + mat.m32 * this.m24
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
467 + mat.m33 * this.m34 + mat.m34 * this.m44);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
468
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
469 var m41 = (mat.m41 * this.m11 + mat.m42 * this.m21
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
470 + mat.m43 * this.m31 + mat.m44 * this.m41);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
471 var m42 = (mat.m41 * this.m12 + mat.m42 * this.m22
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
472 + mat.m43 * this.m32 + mat.m44 * this.m42);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
473 var m43 = (mat.m41 * this.m13 + mat.m42 * this.m23
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
474 + mat.m43 * this.m33 + mat.m44 * this.m43);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
475 var m44 = (mat.m41 * this.m14 + mat.m42 * this.m24
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
476 + mat.m43 * this.m34 + mat.m44 * this.m44);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
477
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
478 this.m11 = m11;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
479 this.m12 = m12;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
480 this.m13 = m13;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
481 this.m14 = m14;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
482
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
483 this.m21 = m21;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
484 this.m22 = m22;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
485 this.m23 = m23;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
486 this.m24 = m24;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
487
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
488 this.m31 = m31;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
489 this.m32 = m32;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
490 this.m33 = m33;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
491 this.m34 = m34;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
492
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
493 this.m41 = m41;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
494 this.m42 = m42;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
495 this.m43 = m43;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
496 this.m44 = m44;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
497 }
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
498
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
499 CanvasMatrix4.prototype.ortho = function(left, right, bottom, top, near, far)
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
500 {
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
501 var tx = (left + right) / (left - right);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
502 var ty = (top + bottom) / (top - bottom);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
503 var tz = (far + near) / (far - near);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
504
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
505 var matrix = new CanvasMatrix4();
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
506 matrix.m11 = 2 / (left - right);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
507 matrix.m12 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
508 matrix.m13 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
509 matrix.m14 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
510 matrix.m21 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
511 matrix.m22 = 2 / (top - bottom);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
512 matrix.m23 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
513 matrix.m24 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
514 matrix.m31 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
515 matrix.m32 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
516 matrix.m33 = -2 / (far - near);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
517 matrix.m34 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
518 matrix.m41 = tx;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
519 matrix.m42 = ty;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
520 matrix.m43 = tz;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
521 matrix.m44 = 1;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
522
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
523 this.multRight(matrix);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
524 }
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
525
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
526 CanvasMatrix4.prototype.frustum = function(left, right, bottom, top, near, far)
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
527 {
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
528 var matrix = new CanvasMatrix4();
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
529 var A = (right + left) / (right - left);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
530 var B = (top + bottom) / (top - bottom);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
531 var C = -(far + near) / (far - near);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
532 var D = -(2 * far * near) / (far - near);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
533
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
534 matrix.m11 = (2 * near) / (right - left);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
535 matrix.m12 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
536 matrix.m13 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
537 matrix.m14 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
538
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
539 matrix.m21 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
540 matrix.m22 = 2 * near / (top - bottom);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
541 matrix.m23 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
542 matrix.m24 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
543
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
544 matrix.m31 = A;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
545 matrix.m32 = B;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
546 matrix.m33 = C;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
547 matrix.m34 = -1;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
548
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
549 matrix.m41 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
550 matrix.m42 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
551 matrix.m43 = D;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
552 matrix.m44 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
553
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
554 this.multRight(matrix);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
555 }
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
556
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
557 CanvasMatrix4.prototype.perspective = function(fovy, aspect, zNear, zFar)
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
558 {
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
559 var top = Math.tan(fovy * Math.PI / 360) * zNear;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
560 var bottom = -top;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
561 var left = aspect * bottom;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
562 var right = aspect * top;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
563 this.frustum(left, right, bottom, top, zNear, zFar);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
564 }
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
565
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
566 CanvasMatrix4.prototype.lookat = function(eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz)
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
567 {
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
568 var matrix = new CanvasMatrix4();
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
569
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
570 // Make rotation matrix
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
571
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
572 // Z vector
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
573 var zx = eyex - centerx;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
574 var zy = eyey - centery;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
575 var zz = eyez - centerz;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
576 var mag = Math.sqrt(zx * zx + zy * zy + zz * zz);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
577 if (mag) {
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
578 zx /= mag;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
579 zy /= mag;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
580 zz /= mag;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
581 }
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
582
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
583 // Y vector
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
584 var yx = upx;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
585 var yy = upy;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
586 var yz = upz;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
587
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
588 // X vector = Y cross Z
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
589 xx = yy * zz - yz * zy;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
590 xy = -yx * zz + yz * zx;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
591 xz = yx * zy - yy * zx;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
592
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
593 // Recompute Y = Z cross X
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
594 yx = zy * xz - zz * xy;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
595 yy = -zx * xz + zz * xx;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
596 yx = zx * xy - zy * xx;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
597
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
598 // cross product gives area of parallelogram, which is < 1.0 for
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
599 // non-perpendicular unit-length vectors; so normalize x, y here
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
600
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
601 mag = Math.sqrt(xx * xx + xy * xy + xz * xz);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
602 if (mag) {
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
603 xx /= mag;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
604 xy /= mag;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
605 xz /= mag;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
606 }
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
607
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
608 mag = Math.sqrt(yx * yx + yy * yy + yz * yz);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
609 if (mag) {
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
610 yx /= mag;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
611 yy /= mag;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
612 yz /= mag;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
613 }
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
614
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
615 matrix.m11 = xx;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
616 matrix.m12 = xy;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
617 matrix.m13 = xz;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
618 matrix.m14 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
619
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
620 matrix.m21 = yx;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
621 matrix.m22 = yy;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
622 matrix.m23 = yz;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
623 matrix.m24 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
624
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
625 matrix.m31 = zx;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
626 matrix.m32 = zy;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
627 matrix.m33 = zz;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
628 matrix.m34 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
629
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
630 matrix.m41 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
631 matrix.m42 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
632 matrix.m43 = 0;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
633 matrix.m44 = 1;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
634 matrix.translate(-eyex, -eyey, -eyez);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
635
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
636 this.multRight(matrix);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
637 }
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
638
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
639 // Support functions
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
640 CanvasMatrix4.prototype._determinant2x2 = function(a, b, c, d)
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
641 {
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
642 return a * d - b * c;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
643 }
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
644
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
645 CanvasMatrix4.prototype._determinant3x3 = function(a1, a2, a3, b1, b2, b3, c1, c2, c3)
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
646 {
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
647 return a1 * this._determinant2x2(b2, b3, c2, c3)
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
648 - b1 * this._determinant2x2(a2, a3, c2, c3)
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
649 + c1 * this._determinant2x2(a2, a3, b2, b3);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
650 }
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
651
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
652 CanvasMatrix4.prototype._determinant4x4 = function()
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
653 {
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
654 var a1 = this.m11;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
655 var b1 = this.m12;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
656 var c1 = this.m13;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
657 var d1 = this.m14;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
658
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
659 var a2 = this.m21;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
660 var b2 = this.m22;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
661 var c2 = this.m23;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
662 var d2 = this.m24;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
663
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
664 var a3 = this.m31;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
665 var b3 = this.m32;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
666 var c3 = this.m33;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
667 var d3 = this.m34;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
668
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
669 var a4 = this.m41;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
670 var b4 = this.m42;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
671 var c4 = this.m43;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
672 var d4 = this.m44;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
673
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
674 return a1 * this._determinant3x3(b2, b3, b4, c2, c3, c4, d2, d3, d4)
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
675 - b1 * this._determinant3x3(a2, a3, a4, c2, c3, c4, d2, d3, d4)
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
676 + c1 * this._determinant3x3(a2, a3, a4, b2, b3, b4, d2, d3, d4)
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
677 - d1 * this._determinant3x3(a2, a3, a4, b2, b3, b4, c2, c3, c4);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
678 }
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
679
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
680 CanvasMatrix4.prototype._makeAdjoint = function()
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
681 {
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
682 var a1 = this.m11;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
683 var b1 = this.m12;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
684 var c1 = this.m13;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
685 var d1 = this.m14;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
686
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
687 var a2 = this.m21;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
688 var b2 = this.m22;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
689 var c2 = this.m23;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
690 var d2 = this.m24;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
691
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
692 var a3 = this.m31;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
693 var b3 = this.m32;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
694 var c3 = this.m33;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
695 var d3 = this.m34;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
696
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
697 var a4 = this.m41;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
698 var b4 = this.m42;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
699 var c4 = this.m43;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
700 var d4 = this.m44;
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
701
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
702 // Row column labeling reversed since we transpose rows & columns
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
703 this.m11 = this._determinant3x3(b2, b3, b4, c2, c3, c4, d2, d3, d4);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
704 this.m21 = - this._determinant3x3(a2, a3, a4, c2, c3, c4, d2, d3, d4);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
705 this.m31 = this._determinant3x3(a2, a3, a4, b2, b3, b4, d2, d3, d4);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
706 this.m41 = - this._determinant3x3(a2, a3, a4, b2, b3, b4, c2, c3, c4);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
707
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
708 this.m12 = - this._determinant3x3(b1, b3, b4, c1, c3, c4, d1, d3, d4);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
709 this.m22 = this._determinant3x3(a1, a3, a4, c1, c3, c4, d1, d3, d4);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
710 this.m32 = - this._determinant3x3(a1, a3, a4, b1, b3, b4, d1, d3, d4);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
711 this.m42 = this._determinant3x3(a1, a3, a4, b1, b3, b4, c1, c3, c4);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
712
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
713 this.m13 = this._determinant3x3(b1, b2, b4, c1, c2, c4, d1, d2, d4);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
714 this.m23 = - this._determinant3x3(a1, a2, a4, c1, c2, c4, d1, d2, d4);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
715 this.m33 = this._determinant3x3(a1, a2, a4, b1, b2, b4, d1, d2, d4);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
716 this.m43 = - this._determinant3x3(a1, a2, a4, b1, b2, b4, c1, c2, c4);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
717
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
718 this.m14 = - this._determinant3x3(b1, b2, b3, c1, c2, c3, d1, d2, d3);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
719 this.m24 = this._determinant3x3(a1, a2, a3, c1, c2, c3, d1, d2, d3);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
720 this.m34 = - this._determinant3x3(a1, a2, a3, b1, b2, b3, d1, d2, d3);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
721 this.m44 = this._determinant3x3(a1, a2, a3, b1, b2, b3, c1, c2, c3);
10344afb38a6 upload dandy
NOBUYASU Oshiro
parents:
diff changeset
722 }