1 | /**
|
---|
2 | * @author alteredq / http://alteredqualia.com/
|
---|
3 | * @author WestLangley / http://github.com/WestLangley
|
---|
4 | * @author bhouston / http://exocortex.com
|
---|
5 | */
|
---|
6 |
|
---|
7 | THREE.Matrix3 = function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {
|
---|
8 |
|
---|
9 | this.elements = new Float32Array(9);
|
---|
10 |
|
---|
11 | this.set(
|
---|
12 |
|
---|
13 | ( n11 !== undefined ) ? n11 : 1, n12 || 0, n13 || 0,
|
---|
14 | n21 || 0, ( n22 !== undefined ) ? n22 : 1, n23 || 0,
|
---|
15 | n31 || 0, n32 || 0, ( n33 !== undefined ) ? n33 : 1
|
---|
16 |
|
---|
17 | );
|
---|
18 | };
|
---|
19 |
|
---|
20 | THREE.Matrix3.prototype = {
|
---|
21 |
|
---|
22 | constructor: THREE.Matrix3,
|
---|
23 |
|
---|
24 | set: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {
|
---|
25 |
|
---|
26 | var te = this.elements;
|
---|
27 |
|
---|
28 | te[0] = n11; te[3] = n12; te[6] = n13;
|
---|
29 | te[1] = n21; te[4] = n22; te[7] = n23;
|
---|
30 | te[2] = n31; te[5] = n32; te[8] = n33;
|
---|
31 |
|
---|
32 | return this;
|
---|
33 |
|
---|
34 | },
|
---|
35 |
|
---|
36 | identity: function () {
|
---|
37 |
|
---|
38 | this.set(
|
---|
39 |
|
---|
40 | 1, 0, 0,
|
---|
41 | 0, 1, 0,
|
---|
42 | 0, 0, 1
|
---|
43 |
|
---|
44 | );
|
---|
45 |
|
---|
46 | return this;
|
---|
47 |
|
---|
48 | },
|
---|
49 |
|
---|
50 | copy: function ( m ) {
|
---|
51 |
|
---|
52 | var me = m.elements;
|
---|
53 |
|
---|
54 | this.set(
|
---|
55 |
|
---|
56 | me[0], me[3], me[6],
|
---|
57 | me[1], me[4], me[7],
|
---|
58 | me[2], me[5], me[8]
|
---|
59 |
|
---|
60 | );
|
---|
61 |
|
---|
62 | return this;
|
---|
63 |
|
---|
64 | },
|
---|
65 |
|
---|
66 | multiplyVector3: function ( vector ) {
|
---|
67 |
|
---|
68 | console.warn( 'DEPRECATED: Matrix3\'s .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' );
|
---|
69 | return vector.applyMatrix3( this );
|
---|
70 |
|
---|
71 | },
|
---|
72 |
|
---|
73 | multiplyVector3Array: function() {
|
---|
74 |
|
---|
75 | var v1 = new THREE.Vector3();
|
---|
76 |
|
---|
77 | return function ( a ) {
|
---|
78 |
|
---|
79 | for ( var i = 0, il = a.length; i < il; i += 3 ) {
|
---|
80 |
|
---|
81 | v1.x = a[ i ];
|
---|
82 | v1.y = a[ i + 1 ];
|
---|
83 | v1.z = a[ i + 2 ];
|
---|
84 |
|
---|
85 | v1.applyMatrix3(this);
|
---|
86 |
|
---|
87 | a[ i ] = v1.x;
|
---|
88 | a[ i + 1 ] = v1.y;
|
---|
89 | a[ i + 2 ] = v1.z;
|
---|
90 |
|
---|
91 | }
|
---|
92 |
|
---|
93 | return a;
|
---|
94 |
|
---|
95 | };
|
---|
96 |
|
---|
97 | }(),
|
---|
98 |
|
---|
99 | multiplyScalar: function ( s ) {
|
---|
100 |
|
---|
101 | var te = this.elements;
|
---|
102 |
|
---|
103 | te[0] *= s; te[3] *= s; te[6] *= s;
|
---|
104 | te[1] *= s; te[4] *= s; te[7] *= s;
|
---|
105 | te[2] *= s; te[5] *= s; te[8] *= s;
|
---|
106 |
|
---|
107 | return this;
|
---|
108 |
|
---|
109 | },
|
---|
110 |
|
---|
111 | determinant: function () {
|
---|
112 |
|
---|
113 | var te = this.elements;
|
---|
114 |
|
---|
115 | var a = te[0], b = te[1], c = te[2],
|
---|
116 | d = te[3], e = te[4], f = te[5],
|
---|
117 | g = te[6], h = te[7], i = te[8];
|
---|
118 |
|
---|
119 | return a*e*i - a*f*h - b*d*i + b*f*g + c*d*h - c*e*g;
|
---|
120 |
|
---|
121 | },
|
---|
122 |
|
---|
123 | getInverse: function ( matrix, throwOnInvertible ) {
|
---|
124 |
|
---|
125 | // input: THREE.Matrix4
|
---|
126 | // ( based on http://code.google.com/p/webgl-mjs/ )
|
---|
127 |
|
---|
128 | var me = matrix.elements;
|
---|
129 | var te = this.elements;
|
---|
130 |
|
---|
131 | te[ 0 ] = me[10] * me[5] - me[6] * me[9];
|
---|
132 | te[ 1 ] = - me[10] * me[1] + me[2] * me[9];
|
---|
133 | te[ 2 ] = me[6] * me[1] - me[2] * me[5];
|
---|
134 | te[ 3 ] = - me[10] * me[4] + me[6] * me[8];
|
---|
135 | te[ 4 ] = me[10] * me[0] - me[2] * me[8];
|
---|
136 | te[ 5 ] = - me[6] * me[0] + me[2] * me[4];
|
---|
137 | te[ 6 ] = me[9] * me[4] - me[5] * me[8];
|
---|
138 | te[ 7 ] = - me[9] * me[0] + me[1] * me[8];
|
---|
139 | te[ 8 ] = me[5] * me[0] - me[1] * me[4];
|
---|
140 |
|
---|
141 | var det = me[ 0 ] * te[ 0 ] + me[ 1 ] * te[ 3 ] + me[ 2 ] * te[ 6 ];
|
---|
142 |
|
---|
143 | // no inverse
|
---|
144 |
|
---|
145 | if ( det === 0 ) {
|
---|
146 |
|
---|
147 | var msg = "Matrix3.getInverse(): can't invert matrix, determinant is 0";
|
---|
148 |
|
---|
149 | if ( throwOnInvertible || false ) {
|
---|
150 |
|
---|
151 | throw new Error( msg );
|
---|
152 |
|
---|
153 | } else {
|
---|
154 |
|
---|
155 | console.warn( msg );
|
---|
156 |
|
---|
157 | }
|
---|
158 |
|
---|
159 | this.identity();
|
---|
160 |
|
---|
161 | return this;
|
---|
162 |
|
---|
163 | }
|
---|
164 |
|
---|
165 | this.multiplyScalar( 1.0 / det );
|
---|
166 |
|
---|
167 | return this;
|
---|
168 |
|
---|
169 | },
|
---|
170 |
|
---|
171 | transpose: function () {
|
---|
172 |
|
---|
173 | var tmp, m = this.elements;
|
---|
174 |
|
---|
175 | tmp = m[1]; m[1] = m[3]; m[3] = tmp;
|
---|
176 | tmp = m[2]; m[2] = m[6]; m[6] = tmp;
|
---|
177 | tmp = m[5]; m[5] = m[7]; m[7] = tmp;
|
---|
178 |
|
---|
179 | return this;
|
---|
180 |
|
---|
181 | },
|
---|
182 |
|
---|
183 | getNormalMatrix: function ( m ) {
|
---|
184 |
|
---|
185 | // input: THREE.Matrix4
|
---|
186 |
|
---|
187 | this.getInverse( m ).transpose();
|
---|
188 |
|
---|
189 | return this;
|
---|
190 |
|
---|
191 | },
|
---|
192 |
|
---|
193 | transposeIntoArray: function ( r ) {
|
---|
194 |
|
---|
195 | var m = this.elements;
|
---|
196 |
|
---|
197 | r[ 0 ] = m[ 0 ];
|
---|
198 | r[ 1 ] = m[ 3 ];
|
---|
199 | r[ 2 ] = m[ 6 ];
|
---|
200 | r[ 3 ] = m[ 1 ];
|
---|
201 | r[ 4 ] = m[ 4 ];
|
---|
202 | r[ 5 ] = m[ 7 ];
|
---|
203 | r[ 6 ] = m[ 2 ];
|
---|
204 | r[ 7 ] = m[ 5 ];
|
---|
205 | r[ 8 ] = m[ 8 ];
|
---|
206 |
|
---|
207 | return this;
|
---|
208 |
|
---|
209 | },
|
---|
210 |
|
---|
211 | fromArray: function ( array ) {
|
---|
212 |
|
---|
213 | this.elements.set( array );
|
---|
214 |
|
---|
215 | return this;
|
---|
216 |
|
---|
217 | },
|
---|
218 |
|
---|
219 | toArray: function () {
|
---|
220 |
|
---|
221 | var te = this.elements;
|
---|
222 |
|
---|
223 | return [
|
---|
224 | te[ 0 ], te[ 1 ], te[ 2 ],
|
---|
225 | te[ 3 ], te[ 4 ], te[ 5 ],
|
---|
226 | te[ 6 ], te[ 7 ], te[ 8 ]
|
---|
227 | ];
|
---|
228 |
|
---|
229 | },
|
---|
230 |
|
---|
231 | clone: function () {
|
---|
232 |
|
---|
233 | var te = this.elements;
|
---|
234 |
|
---|
235 | return new THREE.Matrix3(
|
---|
236 |
|
---|
237 | te[0], te[3], te[6],
|
---|
238 | te[1], te[4], te[7],
|
---|
239 | te[2], te[5], te[8]
|
---|
240 |
|
---|
241 | );
|
---|
242 |
|
---|
243 | }
|
---|
244 |
|
---|
245 | };
|
---|