001/*
002Copyright 2006 Jerry Huxtable
003
004Licensed under the Apache License, Version 2.0 (the "License");
005you may not use this file except in compliance with the License.
006You may obtain a copy of the License at
007
008   http://www.apache.org/licenses/LICENSE-2.0
009
010Unless required by applicable law or agreed to in writing, software
011distributed under the License is distributed on an "AS IS" BASIS,
012WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013See the License for the specific language governing permissions and
014limitations under the License.
015*/
016
017package com.jhlabs.vecmath;
018
019/**
020 * Vector math package, converted to look similar to javax.vecmath.
021 */
022public class Matrix4f {
023        public float m00, m01, m02, m03;
024        public float m10, m11, m12, m13;
025        public float m20, m21, m22, m23;
026        public float m30, m31, m32, m33;
027
028        public Matrix4f() {
029                setIdentity();
030        }
031
032        public Matrix4f( Matrix4f m ) {
033                set( m );
034        }
035
036        public Matrix4f(float[] m) {
037                set( m );
038        }
039
040        public void set( Matrix4f m) {
041                m00 = m.m00;
042                m01 = m.m01;
043                m02 = m.m02;
044                m03 = m.m03;
045                m10 = m.m10;
046                m11 = m.m11;
047                m12 = m.m12;
048                m13 = m.m13;
049                m20 = m.m20;
050                m21 = m.m21;
051                m22 = m.m22;
052                m23 = m.m23;
053                m30 = m.m30;
054                m31 = m.m31;
055                m32 = m.m32;
056                m33 = m.m33;
057        }
058
059        public void set(float[] m) {
060                m00 = m[0];
061                m01 = m[1];
062                m02 = m[2];
063                m03 = m[3];
064                m10 = m[4];
065                m11 = m[5];
066                m12 = m[6];
067                m13 = m[7];
068                m20 = m[8];
069                m21 = m[9];
070                m22 = m[10];
071                m23 = m[11];
072                m30 = m[12];
073                m31 = m[13];
074                m32 = m[14];
075                m33 = m[15];
076        }
077
078        public void get( Matrix4f m) {
079                m.m00 = m00;
080                m.m01 = m01;
081                m.m02 = m02;
082                m.m03 = m03;
083                m.m10 = m10;
084                m.m11 = m11;
085                m.m12 = m12;
086                m.m13 = m13;
087                m.m20 = m20;
088                m.m21 = m21;
089                m.m22 = m22;
090                m.m23 = m23;
091                m.m30 = m30;
092                m.m31 = m31;
093                m.m32 = m32;
094                m.m33 = m33;
095        }
096
097        public void get(float[] m) {
098                m[0] = m00;
099                m[1] = m01;
100                m[2] = m02;
101                m[3] = m03;
102                m[4] = m10;
103                m[5] = m11;
104                m[6] = m12;
105                m[7] = m13;
106                m[8] = m20;
107                m[9] = m21;
108                m[10] = m22;
109                m[11] = m23;
110                m[12] = m30;
111                m[13] = m31;
112                m[14] = m32;
113                m[15] = m33;
114        }
115
116        public void setIdentity() {
117                m00 = 1.0f;
118                m01 = 0.0f;
119                m02 = 0.0f;
120                m03 = 0.0f;
121
122                m10 = 0.0f;
123                m11 = 1.0f;
124                m12 = 0.0f;
125                m13 = 0.0f;
126
127                m20 = 0.0f;
128                m21 = 0.0f;
129                m22 = 1.0f;
130                m23 = 0.0f;
131
132                m30 = 0.0f;
133                m31 = 0.0f;
134                m32 = 0.0f;
135                m33 = 1.0f;
136        }
137
138        public void mul( Matrix4f m ) {
139                float tm00 = m00;
140                float tm01 = m01;
141                float tm02 = m02;
142                float tm03 = m03;
143                float tm10 = m10;
144                float tm11 = m11;
145                float tm12 = m12;
146                float tm13 = m13;
147                float tm20 = m20;
148                float tm21 = m21;
149                float tm22 = m22;
150                float tm23 = m23;
151                float tm30 = m30;
152                float tm31 = m31;
153                float tm32 = m32;
154                float tm33 = m33;
155
156                m00 = tm00*m.m00 + tm10*m.m01 + tm20*m.m02 + tm30*m.m03;
157                m01 = tm01*m.m00 + tm11*m.m01 + tm21*m.m02 + tm31*m.m03;
158                m02 = tm02*m.m00 + tm12*m.m01 + tm22*m.m02 + tm32*m.m03;
159                m03 = tm03*m.m00 + tm13*m.m01 + tm23*m.m02 + tm33*m.m03;
160                m10 = tm00*m.m10 + tm10*m.m11 + tm20*m.m12 + tm30*m.m13;
161                m11 = tm01*m.m10 + tm11*m.m11 + tm21*m.m12 + tm31*m.m13;
162                m12 = tm02*m.m10 + tm12*m.m11 + tm22*m.m12 + tm32*m.m13;
163                m13 = tm03*m.m10 + tm13*m.m11 + tm23*m.m12 + tm33*m.m13;
164                m20 = tm00*m.m20 + tm10*m.m21 + tm20*m.m22 + tm30*m.m23;
165                m21 = tm01*m.m20 + tm11*m.m21 + tm21*m.m22 + tm31*m.m23;
166                m22 = tm02*m.m20 + tm12*m.m21 + tm22*m.m22 + tm32*m.m23;
167                m23 = tm03*m.m20 + tm13*m.m21 + tm23*m.m22 + tm33*m.m23;
168                m30 = tm00*m.m30 + tm10*m.m31 + tm20*m.m32 + tm30*m.m33;
169                m31 = tm01*m.m30 + tm11*m.m31 + tm21*m.m32 + tm31*m.m33;
170                m32 = tm02*m.m30 + tm12*m.m31 + tm22*m.m32 + tm32*m.m33;
171                m33 = tm03*m.m30 + tm13*m.m31 + tm23*m.m32 + tm33*m.m33;
172        }
173
174        public void invert() {
175                Matrix4f t = new Matrix4f( this );
176                invert( t );
177        }
178
179        public void invert( Matrix4f t ) {
180                m00 = t.m00;
181                m01 = t.m10;
182                m02 = t.m20;
183                m03 = t.m03;
184
185                m10 = t.m01;
186                m11 = t.m11;
187                m12 = t.m21;
188                m13 = t.m13;
189
190                m20 = t.m02;
191                m21 = t.m12;
192                m22 = t.m22;
193                m23 = t.m23;
194
195                m30 *= -1.0f;
196                m31 *= -1.0f;
197                m32 *= -1.0f;
198                m33 = t.m33;
199        }
200
201        public void set( AxisAngle4f a ) {
202                float halfTheta = a.angle * 0.5f;
203                float cosHalfTheta = (float)Math.cos(halfTheta);
204                float sinHalfTheta = (float)Math.sin(halfTheta);
205                set( new Quat4f( a.x * sinHalfTheta, a.y * sinHalfTheta, a.z * sinHalfTheta, cosHalfTheta ) );
206        }
207
208        public void set( Quat4f q ) {
209                float wx, wy, wz, xx, yy, yz, xy, xz, zz, x2, y2, z2;
210                x2 = q.x + q.x;
211                y2 = q.y + q.y;
212                z2 = q.z + q.z;
213                xx = q.x * x2;
214                xy = q.x * y2;
215                xz = q.x * z2;
216                yy = q.y * y2;
217                yz = q.y * z2;
218                zz = q.z * z2;
219                wx = q.w * x2;
220                wy = q.w * y2;
221                wz = q.w * z2;
222                m00 = 1.0f - (yy + zz);
223                m01 = xy - wz;
224                m02 = xz + wy;
225                m03 = 0.0f;
226                m10 = xy + wz;
227                m11 = 1.0f - (xx + zz);
228                m12 = yz - wx;
229                m13 = 0.0f;
230                m20 = xz - wy;
231                m21 = yz + wx;
232                m22 = 1.0f - (xx + yy);
233                m23 = 0.0f;
234                m30 = 0;
235                m31 = 0;
236                m32 = 0;
237                m33 = 1;
238        }
239
240        public void transform( Point3f v ) {
241                float x = v.x * m00 + v.y * m10 + v.z * m20 + m30;
242                float y = v.x * m01 + v.y * m11 + v.z * m21 + m31;
243                float z = v.x * m02 + v.y * m12 + v.z * m22 + m32;
244                v.x = x;
245                v.y = y;
246                v.z = z;
247        }
248
249        public void transform( Vector3f v ) {
250                float x = v.x * m00 + v.y * m10 + v.z * m20;
251                float y = v.x * m01 + v.y * m11 + v.z * m21;
252                float z = v.x * m02 + v.y * m12 + v.z * m22;
253                v.x = x;
254                v.y = y;
255                v.z = z;
256        }
257
258        public void setTranslation( Vector3f v ) {
259                m30 = v.x;
260                m31 = v.y;
261                m32 = v.z;
262        }
263
264        public void set( float scale ) {
265                m00 = scale;
266                m11 = scale;
267                m22 = scale;
268        }
269
270        public void rotX( float angle ) {
271                float s = (float)Math.sin( angle );
272                float c = (float)Math.cos( angle );
273                m00 = 1.0f;
274                m01 = 0.0f;
275                m02 = 0.0f;
276                m03 = 0.0f;
277
278                m10 = 0.0f;
279                m11 = c;
280                m12 = s;
281                m13 = 0.0f;
282
283                m20 = 0.0f;
284                m21 = -s;
285                m22 = c;
286                m23 = 0.0f;
287
288                m30 = 0.0f;
289                m31 = 0.0f;
290                m32 = 0.0f;
291                m33 = 1.0f;
292        }
293
294        public void rotY( float angle ) {
295                float s = (float)Math.sin( angle );
296                float c = (float)Math.cos( angle );
297                m00 = c;
298                m01 = 0.0f;
299                m02 = -s;
300                m03 = 0.0f;
301
302                m10 = 0.0f;
303                m11 = 1.0f;
304                m12 = 0.0f;
305                m13 = 0.0f;
306
307                m20 = s;
308                m21 = 0.0f;
309                m22 = c;
310                m23 = 0.0f;
311
312                m30 = 0.0f;
313                m31 = 0.0f;
314                m32 = 0.0f;
315                m33 = 1.0f;
316        }
317
318        public void rotZ( float angle ) {
319                float s = (float)Math.sin( angle );
320                float c = (float)Math.cos( angle );
321                m00 = c;
322                m01 = s;
323                m02 = 0.0f;
324                m03 = 0.0f;
325
326                m10 = -s;
327                m11 = c;
328                m12 = 0.0f;
329                m13 = 0.0f;
330
331                m20 = 0.0f;
332                m21 = 0.0f;
333                m22 = 1.0f;
334                m23 = 0.0f;
335
336                m30 = 0.0f;
337                m31 = 0.0f;
338                m32 = 0.0f;
339                m33 = 1.0f;
340        }
341/*
342        void rotate(float angle, float x, float y, float z) {
343                Matrix4f m = new Matrix4f();//FIXME
344                m.MatrixFromAxisAngle(Vector3f(x, y, z), angle);
345                Multiply(m);
346        }
347*/
348}