Subversion Repositories AndroidProjects

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
835 chris 1
package com.gebauz.bauzoid.math;
2
 
3
public class Matrix3
4
{
5
/* OpenGL Colum Major:
6
 *   m[0] m[3] m[6]
7
 *   m[1] m[4] m[7]
8
 *   m[2] m[5] m[8]
9
 */
10
 
11
/*      public float m11;
12
        public float m21;
13
        public float m31;
14
        public float m12;
15
        public float m22;
16
        public float m32;
17
        public float m13;
18
        public float m23;
19
        public float m33;*/
20
 
21
        public static final int M11 = 0;
22
        public static final int M21 = 1;
23
        public static final int M31 = 2;
24
        public static final int M12 = 3;
25
        public static final int M22 = 4;
26
        public static final int M32 = 5;
27
        public static final int M13 = 6;
28
        public static final int M23 = 7;
29
        public static final int M33 = 8;
30
 
31
        public static final int MATRIX_SIZE = 3;
32
 
33
        public float values[] = new float[MATRIX_SIZE*MATRIX_SIZE];
34
 
35
        public Matrix3()
36
        {
37
        }
38
 
39
        public float get(int row, int col)
40
        {
41
                return values[col*MATRIX_SIZE + row];
42
/*              switch (row)
43
                {
44
                case 0:
45
                        switch (col)
46
                        {
47
                        case 0: return m11;
48
                        case 1: return m12;
49
                        case 2: return m13;
50
                        }
51
                        break;
52
                case 1:
53
                        switch (col)
54
                        {
55
                        case 0: return m21;
56
                        case 1: return m22;
57
                        case 2: return m23;
58
                        }
59
                        break;
60
                case 2:
61
                        switch (col)
62
                        {
63
                        case 0: return m31;
64
                        case 1: return m32;
65
                        case 2: return m33;
66
                        }
67
                        break;
68
                }
69
                // should never reach here -> TODO: assert
70
                return 0.0f;*/
71
        }
72
 
73
        public void set(int row, int col, float value)
74
        {
75
                values[col*MATRIX_SIZE+row] = value;
76
        /*      switch (row)
77
                {
78
                case 0:
79
                        switch (col)
80
                        {
81
                        case 0:
82
                                m11 = value;
83
                                break;
84
                        case 1:
85
                                m12 = value;
86
                                break;
87
                        case 2:
88
                                m13 = value;
89
                                break;
90
                        }
91
                        break;
92
                case 1:
93
                        switch (col)
94
                        {
95
                        case 0:
96
                                m21 = value;
97
                                break;
98
                        case 1:
99
                                m22 = value;
100
                                break;
101
                        case 2:
102
                                m23 = value;
103
                                break;
104
                        }
105
                        break;
106
                case 2:
107
                        switch (col)
108
                        {
109
                        case 0:
110
                                m31 = value;
111
                                break;
112
                        case 1:
113
                                m32 = value;
114
                                break;
115
                        case 2:
116
                                m33 = value;
117
                                break;
118
                        }
119
                        break;
120
                }*/
121
        }
122
 
123
        public void zero()
124
        {
125
                for (int i = 0; i < values.length; i++)
126
                        values[i] = 0.0f;
127
                /*m11 = 0.0f; m12 = 0.0f; m13 = 0.0f;
128
                m21 = 0.0f; m22 = 0.0f; m23 = 0.0f;
129
                m31 = 0.0f; m32 = 0.0f; m33 = 0.0f;*/
130
        }
131
 
132
        public void identity()
133
        {
134
                zero();
135
                //m11 = 1.0f; m22 = 1.0f; m33 = 1.0f;
136
                values[M11] = 1.0f; values[M22] = 1.0f;  values[M33] = 1.0f;  
137
        }
138
 
139
        public boolean equals(Matrix3 other)
140
        {
141
                for (int i = 0; i < values.length; i++)
142
                {
143
                        if (this.values[i] != other.values[i])
144
                                return false;
145
                }
146
                return true;           
147
/*              return ((m11 == other.m11) && (m12 == other.m12) && (m13 == other.m13) &&
148
                                (m21 == other.m21) && (m22 == other.m22) && (m23 == other.m23) &&
149
                                (m31 == other.m31) && (m32 == other.m32) && (m33 == other.m33));*/             
150
        }
151
 
152
        public boolean isSingular()
153
    {
154
        float determinant = getDeterminant();
155
        return ((float)Math.abs(determinant) < MathUtil.EPSILON);
156
    }
157
 
158
        public Matrix3 getTranspose()
159
        {
160
                Matrix3 result = new Matrix3();
161
                result.values[M11] = values[M11];
162
                result.values[M12] = values[M21];
163
                result.values[M13] = values[M31];
164
                result.values[M21] = values[M12];
165
                result.values[M22] = values[M22];
166
                result.values[M23] = values[M32];
167
                result.values[M31] = values[M13];
168
                result.values[M32] = values[M23];
169
                result.values[M33] = values[M33];
170
                return result;
171
        }
172
 
173
        public float getDeterminant()
174
        {
175
        float result =
176
            values[M11] * (values[M22] * values[M33] - values[M23] * values[M32]) -
177
            values[M21] * (values[M12] * values[M33] - values[M13] * values[M32]) +
178
            values[M31] * (values[M12] * values[M23] - values[M13] * values[M22]);
179
                return result;
180
        }
181
 
182
        public Matrix3 getInverse()
183
        {
184
                Matrix3 result = new Matrix3();
185
 
186
                float determinant = getDeterminant();
187
                if (determinant == 0.0f)
188
                {
189
                        // singular matrix cannot be inverted
190
                        return this;
191
                }
192
 
193
                result.values[M11] = values[M22] * values[M33] - values[M32] * values[M23];
194
                result.values[M21] = -(values[M21] * values[M33] - values[M23] * values[M31]);
195
                result.values[M31] = values[M21] * values[M32] - values[M22] * values[M31];
196
                result.values[M12] = -(values[M12] * values[M33] - values[M32] * values[M13]);
197
                result.values[M22] = values[M11] * values[M33] - values[M13] * values[M31];
198
                result.values[M32] = -(values[M11] * values[M32] - values[M12] * values[M31]);
199
                result.values[M13] = values[M12] * values[M23] - values[M13] * values[M22];
200
                result.values[M23] = -(values[M11] * values[M23] - values[M13] * values[M21]);
201
                result.values[M33] = values[M11] * values[M22] - values[M21] * values[M12];
202
 
203
                float multiply = 1.0f / determinant;
204
                result.values[M11] *= multiply;
205
                result.values[M21] *= multiply;
206
                result.values[M31] *= multiply;
207
                result.values[M12] *= multiply;
208
                result.values[M22] *= multiply;
209
                result.values[M32] *= multiply;
210
                result.values[M13] *= multiply;
211
                result.values[M23] *= multiply;
212
                result.values[M33] *= multiply;
213
 
214
                return result;
215
        }
216
 
217
        public void copyTo(Matrix3 target)
218
        {
219
                target.values[M11] = values[M11]; target.values[M12] = values[M12]; target.values[M13] = values[M13];
220
                target.values[M21] = values[M21]; target.values[M22] = values[M22]; target.values[M23] = values[M23];
221
                target.values[M31] = values[M31]; target.values[M32] = values[M32]; target.values[M33] = values[M33];
222
        }
223
 
224
        public void copyFrom(Matrix3 source)
225
        {
226
                values[M11] = source.values[M11]; values[M12] = source.values[M12]; values[M13] = source.values[M13];
227
                values[M21] = source.values[M21]; values[M22] = source.values[M22]; values[M23] = source.values[M23];
228
                values[M31] = source.values[M31]; values[M32] = source.values[M32]; values[M33] = source.values[M33];
229
        }
230
 
231
        public void postMultiply(Matrix3 v)
232
        {
233
                multiply(this, this, v);
234
        }
235
 
236
        public void preMultiply(Matrix3 v)
237
        {
238
                multiply(this, v, this);
239
        }
240
 
241
        static public void multiply(Matrix3 result, Matrix3 a, Matrix3 b)
242
        {
243
        float result11 = a.values[M11] * b.values[M11] + a.values[M21] * b.values[M12] + a.values[M31] * b.values[M13];
244
        float result21 = a.values[M11] * b.values[M21] + a.values[M21] * b.values[M22] + a.values[M31] * b.values[M23];
245
        float result31 = a.values[M11] * b.values[M31] + a.values[M21] * b.values[M32] + a.values[M31] * b.values[M33];
246
        float result12 = a.values[M12] * b.values[M11] + a.values[M22] * b.values[M12] + a.values[M32] * b.values[M13];
247
        float result22 = a.values[M12] * b.values[M21] + a.values[M22] * b.values[M22] + a.values[M32] * b.values[M23];
248
        float result32 = a.values[M12] * b.values[M31] + a.values[M22] * b.values[M32] + a.values[M32] * b.values[M33];
249
        float result13 = a.values[M13] * b.values[M11] + a.values[M23] * b.values[M12] + a.values[M33] * b.values[M13];
250
        float result23 = a.values[M13] * b.values[M21] + a.values[M23] * b.values[M22] + a.values[M33] * b.values[M23];
251
        float result33 = a.values[M13] * b.values[M31] + a.values[M23] * b.values[M32] + a.values[M33] * b.values[M33];
252
        result.values[M11] = result11;
253
        result.values[M21] = result21;
254
        result.values[M31] = result31;
255
        result.values[M12] = result12;
256
        result.values[M22] = result22;
257
        result.values[M32] = result32;
258
        result.values[M13] = result13;
259
        result.values[M23] = result23;
260
        result.values[M33] = result33;
261
        }
262
 
263
        static public Matrix3 multiply(Matrix3 a, Matrix3 b)
264
        {
265
                Matrix3 result = new Matrix3();
266
                multiply(result, a, b);
267
                return result;
268
        }
269
 
270
        static public Matrix3 createIdentity()
271
        {
272
                return createScale(1.0f, 1.0f, 1.0f);
273
        }
274
 
275
        static public Matrix3 createScale(float sx, float sy, float sz)
276
        {
277
                Matrix3 result = new Matrix3();
278
 
279
                result.values[M11] = sx;
280
                result.values[M22] = sy;
281
                result.values[M33] = sz;
282
 
283
                return result;         
284
        }
285
 
286
        static public Matrix3 createScale(Vector3 scale)
287
        {
288
                return createScale(scale.x, scale.y, scale.z);
289
        }
290
 
291
        static public Matrix3 createScale(float s)
292
        {
293
                return createScale(s, s, s);
294
        }
295
 
296
        static public Matrix3 createRotationX(float degrees)
297
        {
298
        float degreesrad = MathUtil.degToRad(degrees);
299
        float sinvalue = (float)Math.sin(degreesrad);
300
        float cosvalue = (float)Math.cos(degreesrad);
301
 
302
        Matrix3 matrix = createIdentity();
303
        matrix.values[M22] = cosvalue;
304
        matrix.values[M32] = -sinvalue;
305
        matrix.values[M23] = sinvalue;
306
        matrix.values[M33] = cosvalue;
307
        return matrix;
308
        }
309
 
310
        static public Matrix3 createRotationY(float degrees)
311
        {
312
        float degreesrad = MathUtil.degToRad(degrees);
313
        float sinvalue = (float)Math.sin(degreesrad);
314
        float cosvalue = (float)Math.cos(degreesrad);
315
 
316
        Matrix3 matrix = createIdentity();
317
        matrix.values[M11] = cosvalue;
318
        matrix.values[M31] = sinvalue;
319
        matrix.values[M13] = -sinvalue;
320
        matrix.values[M33] = cosvalue;
321
        return matrix;
322
        }
323
 
324
        static public Matrix3 createRotationZ(float degrees)
325
        {
326
        float degreesrad = MathUtil.degToRad(degrees);
327
        float sinvalue = (float)Math.sin(degreesrad);
328
        float cosvalue = (float)Math.cos(degreesrad);
329
 
330
        Matrix3 matrix = createIdentity();
331
        matrix.values[M11] = cosvalue;
332
        matrix.values[M21] = -sinvalue;
333
        matrix.values[M12] = sinvalue;
334
        matrix.values[M22] = cosvalue;
335
        return matrix;
336
        }
337
 
338
        static public Matrix3 createRotation(Vector3 axis, float degrees)
339
        {
340
        float radangle = MathUtil.degToRad(degrees);
341
        float radcos = (float)Math.cos(radangle);
342
        float radsin = (float)Math.sin(radangle);
343
 
344
        Matrix3 matrix = new Matrix3();
345
        matrix.values[M11] = radcos + axis.x * axis.x * (1 - radcos);
346
        matrix.values[M21] = axis.z * radsin + axis.y * axis.x * (1 - radcos);
347
        matrix.values[M31] = -axis.y * radsin + axis.z * axis.x * (1 - radcos);
348
        matrix.values[M12] = -axis.z * radsin + axis.x * axis.y * (1 - radcos);
349
        matrix.values[M22] = radcos + axis.y * axis.y * (1 - radcos);
350
        matrix.values[M32] = axis.x * radsin + axis.z * axis.y * (1 - radcos);
351
        matrix.values[M13] = axis.y * radsin + axis.x * axis.z * (1 - radcos);
352
        matrix.values[M23] = -axis.x * radsin + axis.y * axis.z * (1 - radcos);
353
        matrix.values[M33] = radcos + axis.z * axis.z * (1 - radcos);
354
        return matrix;
355
        }
356
 
357
        static public Matrix3 createFromVectors(Vector3 forward, Vector3 up, Vector3 right)
358
        {
359
        forward.normalize();
360
        up.normalize();
361
        right.normalize();
362
 
363
        Matrix3 result = createIdentity();
364
 
365
        result.values[M11] = right.x;
366
        result.values[M12] = right.y;
367
        result.values[M13] = right.z;
368
        result.values[M21] = up.x;
369
        result.values[M22] = up.y;
370
        result.values[M23] = up.z;
371
        result.values[M31] = -forward.x;
372
        result.values[M32] = -forward.y;
373
        result.values[M33] = -forward.z;
374
 
375
        return result;
376
        }
377
 
378
        public Vector3 transform(Vector3 vector)
379
        {
380
                return new Vector3(
381
                values[M11] * vector.x + values[M21] * vector.y + values[M31] * vector.z,
382
                values[M12] * vector.x + values[M22] * vector.y + values[M32] * vector.z,
383
                values[M13] * vector.x + values[M23] * vector.y + values[M33] * vector.z);
384
        }
385
 
386
        static public void interpolate(Matrix3 result, Matrix3 a, Matrix3 b, float ratio)
387
        {
388
        result.values[M11] = a.values[M11] + (b.values[M11] - a.values[M11]) * ratio;
389
        result.values[M21] = a.values[M21] + (b.values[M21] - a.values[M21]) * ratio;
390
        result.values[M31] = a.values[M31] + (b.values[M31] - a.values[M31]) * ratio;
391
        result.values[M12] = a.values[M12] + (b.values[M12] - a.values[M12]) * ratio;
392
        result.values[M22] = a.values[M22] + (b.values[M22] - a.values[M22]) * ratio;
393
        result.values[M32] = a.values[M32] + (b.values[M32] - a.values[M32]) * ratio;
394
        result.values[M13] = a.values[M13] + (b.values[M13] - a.values[M13]) * ratio;
395
        result.values[M23] = a.values[M23] + (b.values[M23] - a.values[M23]) * ratio;
396
        result.values[M33] = a.values[M33] + (b.values[M33] - a.values[M33]) * ratio;
397
        }
398
 
399
        static public Matrix3 interpolate(Matrix3 a, Matrix3 b, float ratio)
400
        {
401
                Matrix3 result = createIdentity();
402
                interpolate(result, a, b, ratio);
403
                return result;
404
        }
405
 
406
        public Vector3 getForwardVector()
407
        {
408
                Vector3 forward = new Vector3(-values[M31], -values[M32], -values[M33]);
409
        forward.normalize();
410
        return forward;
411
        }
412
 
413
        public Vector3 getUpVector()
414
        {
415
        Vector3 up = new Vector3(values[M21], values[M22], values[M23]);
416
        up.normalize();
417
        return up;
418
        }
419
 
420
        public Vector3 getRightVector()
421
        {
422
        Vector3 right = new Vector3(values[M11], values[M12], values[M13]);
423
        right.normalize();
424
        return right;
425
        }
426
 
427
        public float[] toGLMatrix()
428
        {
429
                return values;
430
 
431
                /*float[] m = new float[16];
432
 
433
                m[0] = m11; m[1] = m21; m[2] = m31; m[3] = 0.0f;
434
                m[4] = m12; m[5] = m22; m[6] = m32; m[7] = 0.0f;
435
                m[8] = m13; m[9] = m23; m[10] = m33; m[11] = 0.0f;
436
                m[12] = 0.0f; m[13] = 0.0f; m[14] = 0.0f; m[15] = 1.0f;
437
 
438
                return m;*/
439
        }      
440
 
441
}