source: 2013/30/MiskaK/MW2(My Warfare 2)/Paranneltu Jypeli/AdvanceMath/Matrix4x4.cs @ 4507

Revision 4507, 101.0 KB checked in by anlakane, 6 years ago (diff)

Talletus.

Line 
1#region MIT License
2/*
3 * Copyright (c) 2005-2008 Jonathan Mark Porter. http://physics2d.googlepages.com/
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a copy
6 * of this software and associated documentation files (the "Software"), to deal
7 * in the Software without restriction, including without limitation the rights to
8 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9 * the Software, and to permit persons to whom the Software is furnished to do so,
10 * subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice shall be
13 * included in all copies or substantial portions of the Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
16 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
17 * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
19 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 */
22#endregion
23
24
25
26#if UseDouble
27using Scalar = System.Double;
28#else
29using Scalar = System.Single;
30#endif
31using System;
32
33using System.Runtime.InteropServices;
34using AdvanceMath.Design;
35using System.Xml.Serialization;
36
37namespace AdvanceMath
38{
39    [StructLayout(LayoutKind.Sequential, Size = Matrix4x4.Size)]
40    [AdvBrowsableOrder("Rx,Ry,Rz,Rw")]
41#if !CompactFramework && !WindowsCE && !PocketPC && !XBOX360 && !SILVERLIGHT && !WINDOWS_PHONE
42    [Serializable]
43    [System.ComponentModel.TypeConverter(typeof(AdvTypeConverter<Matrix4x4>))]
44#endif
45    public struct Matrix4x4 : IMatrix<Matrix4x4, Vector4D, Vector4D>
46    {
47        #region const fields
48        /// <summary>
49        /// The number of rows.
50        /// </summary>
51        public const int RowCount = 4;
52        /// <summary>
53        /// The number of columns.
54        /// </summary>
55        public const int ColumnCount = 4;
56        /// <summary>
57        /// The number of Scalar values in the class.
58        /// </summary>
59        public const int Count = RowCount * ColumnCount;
60        /// <summary>
61        /// The Size of the class in bytes;
62        /// </summary>
63        public const int Size = sizeof(Scalar) * Count;
64        #endregion
65        #region static fields
66        public readonly static Matrix4x4 Zero = new Matrix4x4(
67        0, 0, 0, 0,
68        0, 0, 0, 0,
69        0, 0, 0, 0,
70        0, 0, 0, 0);
71
72        public readonly static Matrix4x4 Identity = new Matrix4x4(
73        1, 0, 0, 0,
74        0, 1, 0, 0,
75        0, 0, 1, 0,
76        0, 0, 0, 1);
77
78        private readonly static string FormatString = MatrixHelper.CreateMatrixFormatString(RowCount, ColumnCount);
79        private readonly static string FormatableString = MatrixHelper.CreateMatrixFormatableString(RowCount, ColumnCount);
80        #endregion
81        #region static methods
82
83        public static void Copy(ref Matrix4x4 matrix, Scalar[] destArray)
84        {
85            Copy(ref matrix, destArray, 0);
86        }
87        public static void Copy(ref Matrix4x4 matrix, Scalar[] destArray, int index)
88        {
89            ThrowHelper.CheckCopy(destArray, index, Count);
90
91            destArray[index] = matrix.m00;
92            destArray[++index] = matrix.m01;
93            destArray[++index] = matrix.m02;
94            destArray[++index] = matrix.m03;
95
96            destArray[++index] = matrix.m10;
97            destArray[++index] = matrix.m11;
98            destArray[++index] = matrix.m12;
99            destArray[++index] = matrix.m13;
100
101            destArray[++index] = matrix.m20;
102            destArray[++index] = matrix.m21;
103            destArray[++index] = matrix.m22;
104            destArray[++index] = matrix.m23;
105
106            destArray[++index] = matrix.m30;
107            destArray[++index] = matrix.m31;
108            destArray[++index] = matrix.m32;
109            destArray[++index] = matrix.m33;
110        }
111        public static void Copy(Scalar[] sourceArray, out Matrix4x4 result)
112        {
113            Copy(sourceArray, 0, out result);
114        }
115        public static void Copy(Scalar[] sourceArray, int index, out Matrix4x4 result)
116        {
117            ThrowHelper.CheckCopy(sourceArray, index, Count);
118
119            result.m00 = sourceArray[index];
120            result.m01 = sourceArray[++index];
121            result.m02 = sourceArray[++index];
122            result.m03 = sourceArray[++index];
123
124            result.m10 = sourceArray[++index];
125            result.m11 = sourceArray[++index];
126            result.m12 = sourceArray[++index];
127            result.m13 = sourceArray[++index];
128
129            result.m20 = sourceArray[++index];
130            result.m21 = sourceArray[++index];
131            result.m22 = sourceArray[++index];
132            result.m23 = sourceArray[++index];
133
134            result.m30 = sourceArray[++index];
135            result.m31 = sourceArray[++index];
136            result.m32 = sourceArray[++index];
137            result.m33 = sourceArray[++index];
138        }
139        public static void CopyTranspose(ref Matrix4x4 matrix, Scalar[] destArray)
140        {
141            CopyTranspose(ref matrix, destArray, 0);
142        }
143        public static void CopyTranspose(ref Matrix4x4 matrix, Scalar[] destArray, int index)
144        {
145            ThrowHelper.CheckCopy(destArray, index, Count);
146
147            destArray[index] = matrix.m00;
148            destArray[++index] = matrix.m10;
149            destArray[++index] = matrix.m20;
150            destArray[++index] = matrix.m30;
151
152            destArray[++index] = matrix.m01;
153            destArray[++index] = matrix.m11;
154            destArray[++index] = matrix.m21;
155            destArray[++index] = matrix.m31;
156
157            destArray[++index] = matrix.m02;
158            destArray[++index] = matrix.m12;
159            destArray[++index] = matrix.m22;
160            destArray[++index] = matrix.m32;
161
162            destArray[++index] = matrix.m03;
163            destArray[++index] = matrix.m13;
164            destArray[++index] = matrix.m23;
165            destArray[++index] = matrix.m33;
166        }
167        public static void CopyTranspose(Scalar[] sourceArray, out Matrix4x4 result)
168        {
169            CopyTranspose(sourceArray, 0, out result);
170        }
171        public static void CopyTranspose(Scalar[] sourceArray, int index, out Matrix4x4 result)
172        {
173            ThrowHelper.CheckCopy(sourceArray, index, Count);
174
175            result.m00 = sourceArray[index];
176            result.m10 = sourceArray[++index];
177            result.m20 = sourceArray[++index];
178            result.m30 = sourceArray[++index];
179
180            result.m01 = sourceArray[++index];
181            result.m11 = sourceArray[++index];
182            result.m21 = sourceArray[++index];
183            result.m31 = sourceArray[++index];
184
185            result.m02 = sourceArray[++index];
186            result.m12 = sourceArray[++index];
187            result.m22 = sourceArray[++index];
188            result.m32 = sourceArray[++index];
189
190            result.m03 = sourceArray[++index];
191            result.m13 = sourceArray[++index];
192            result.m23 = sourceArray[++index];
193            result.m33 = sourceArray[++index];
194        }
195        public static void Copy(ref Matrix3x3 source, ref Matrix4x4 dest)
196        {
197            dest.m00 = source.m00;
198            dest.m01 = source.m01;
199            dest.m02 = source.m02;
200
201            dest.m10 = source.m10;
202            dest.m11 = source.m11;
203            dest.m12 = source.m12;
204
205            dest.m20 = source.m20;
206            dest.m21 = source.m21;
207            dest.m22 = source.m22;
208        }
209        public static void Copy(ref Matrix2x2 source, ref Matrix4x4 dest)
210        {
211            dest.m00 = source.m00;
212            dest.m01 = source.m01;
213
214            dest.m10 = source.m10;
215            dest.m11 = source.m11;
216        }
217
218        public static Matrix4x4 Lerp(Matrix4x4 left, Matrix4x4 right, Scalar amount)
219        {
220            Matrix4x4 result;
221            Lerp(ref left, ref right, ref amount, out result);
222            return result;
223        }
224        public static void Lerp(ref Matrix4x4 left, ref  Matrix4x4 right, ref  Scalar amount, out Matrix4x4 result)
225        {
226            result.m00 = (right.m00 - left.m00) * amount + left.m00;
227            result.m01 = (right.m01 - left.m01) * amount + left.m01;
228            result.m02 = (right.m02 - left.m02) * amount + left.m02;
229            result.m03 = (right.m03 - left.m03) * amount + left.m03;
230
231            result.m10 = (right.m10 - left.m10) * amount + left.m10;
232            result.m11 = (right.m11 - left.m11) * amount + left.m11;
233            result.m12 = (right.m12 - left.m12) * amount + left.m12;
234            result.m13 = (right.m13 - left.m13) * amount + left.m13;
235
236            result.m20 = (right.m20 - left.m20) * amount + left.m20;
237            result.m21 = (right.m21 - left.m21) * amount + left.m21;
238            result.m22 = (right.m22 - left.m22) * amount + left.m22;
239            result.m23 = (right.m23 - left.m23) * amount + left.m23;
240
241            result.m30 = (right.m30 - left.m30) * amount + left.m30;
242            result.m31 = (right.m31 - left.m31) * amount + left.m31;
243            result.m32 = (right.m32 - left.m32) * amount + left.m32;
244            result.m33 = (right.m33 - left.m33) * amount + left.m33;
245
246        }
247
248
249        public static Matrix4x4 FromArray(Scalar[] array)
250        {
251            Matrix4x4 result;
252            Copy(array, 0, out result);
253            return result;
254        }
255        public static Matrix4x4 FromTransposedArray(Scalar[] array)
256        {
257            Matrix4x4 result;
258            CopyTranspose(array, 0, out result);
259            return result;
260        }
261
262        public static Matrix4x4 FromTranslation(Vector3D translation)
263        {
264            Matrix4x4 result;
265
266            result.m00 = 1;
267            result.m01 = 0;
268            result.m02 = 0;
269            result.m03 = translation.X;
270
271            result.m10 = 0;
272            result.m11 = 1;
273            result.m12 = 0;
274            result.m13 = translation.Y;
275
276            result.m20 = 0;
277            result.m21 = 0;
278            result.m22 = 1;
279            result.m23 = translation.Z;
280
281            result.m30 = 0;
282            result.m31 = 0;
283            result.m32 = 0;
284            result.m33 = 1;
285
286            return result;
287        }
288        public static void FromTranslation(ref Vector3D translation, out Matrix4x4 result)
289        {
290            result.m00 = 1;
291            result.m01 = 0;
292            result.m02 = 0;
293            result.m03 = translation.X;
294
295            result.m10 = 0;
296            result.m11 = 1;
297            result.m12 = 0;
298            result.m13 = translation.Y;
299
300            result.m20 = 0;
301            result.m21 = 0;
302            result.m22 = 1;
303            result.m23 = translation.Z;
304
305            result.m30 = 0;
306            result.m31 = 0;
307            result.m32 = 0;
308            result.m33 = 1;
309        }
310        public static Matrix4x4 FromScale(Vector3D scale)
311        {
312            Matrix4x4 result;
313            result.m00 = scale.X;
314            result.m01 = 0;
315            result.m02 = 0;
316            result.m03 = 0;
317
318            result.m10 = 0;
319            result.m11 = scale.Y;
320            result.m12 = 0;
321            result.m13 = 0;
322
323            result.m20 = 0;
324            result.m21 = 0;
325            result.m22 = scale.Z;
326            result.m23 = 0;
327
328            result.m30 = 0;
329            result.m31 = 0;
330            result.m32 = 0;
331            result.m33 = 1;
332            return result;
333        }
334        public static void FromScale(ref Vector3D scale, out Matrix4x4 result)
335        {
336            result.m00 = scale.X;
337            result.m01 = 0;
338            result.m02 = 0;
339            result.m03 = 0;
340
341            result.m10 = 0;
342            result.m11 = scale.Y;
343            result.m12 = 0;
344            result.m13 = 0;
345
346            result.m20 = 0;
347            result.m21 = 0;
348            result.m22 = scale.Z;
349            result.m23 = 0;
350
351            result.m30 = 0;
352            result.m31 = 0;
353            result.m32 = 0;
354            result.m33 = 1;
355        }
356        public static Matrix4x4 FromLookAt(Vector3D origin, Vector3D positiveZAxis, Vector3D onPositiveY)
357        {
358            return Matrix3x3.FromLookAt(origin, positiveZAxis, onPositiveY) * FromTranslation(-origin);
359        }
360
361        public static Matrix4x4 FromOrthographic(
362                Scalar left, Scalar right,
363                Scalar bottom, Scalar top,
364                Scalar near, Scalar far)
365        {
366
367            Matrix4x4 result;
368            result.m00 = 2 / (right - left);
369            result.m01 = 0;
370            result.m02 = 0;
371            result.m03 = -(right + left) / (right - left);
372
373            result.m10 = 0;
374            result.m11 = 2 / (top - bottom);
375            result.m12 = 0;
376            result.m13 = -(top + bottom) / (top - bottom);
377
378            result.m20 = 0;
379            result.m21 = 0;
380            result.m22 = -2 / (far - near);
381            result.m23 = (far + near) / (far - near);
382
383            result.m30 = 0;
384            result.m31 = 0;
385            result.m32 = 0;
386            result.m33 = 1;
387            return result;
388        }
389
390        public static Matrix4x4 From2DMatrix(Matrix3x3 source)
391        {
392            Matrix4x4 result;
393            From2DMatrix(ref source, out result);
394            return result;
395        }
396        public static void From2DMatrix(ref Matrix3x3 source, out Matrix4x4 result)
397        {
398            result.m00 = source.m00;
399            result.m01 = source.m01;
400            result.m02 = 0;
401            result.m03 = source.m02;
402
403            result.m10 = source.m10;
404            result.m11 = source.m11;
405            result.m12 = 0;
406            result.m13 = source.m12;
407
408            result.m20 = 0;
409            result.m21 = 0;
410            result.m22 = 1;
411            result.m23 = 0;
412
413            result.m30 = source.m20;
414            result.m31 = source.m21;
415            result.m32 = 0;
416            result.m33 = source.m22;
417        }
418
419        public static Matrix4x4 From2DMatrix(Matrix2x3 source)
420        {
421            Matrix4x4 result;
422            From2DMatrix(ref source, out result);
423            return result;
424        }
425        public static void From2DMatrix(ref Matrix2x3 source, out Matrix4x4 result)
426        {
427            result.m00 = source.m00;
428            result.m01 = source.m01;
429            result.m02 = 0;
430            result.m03 = source.m02;
431
432            result.m10 = source.m10;
433            result.m11 = source.m11;
434            result.m12 = 0;
435            result.m13 = source.m12;
436
437            result.m20 = 0;
438            result.m21 = 0;
439            result.m22 = 1;
440            result.m23 = 0;
441
442            result.m30 = 0;
443            result.m31 = 0;
444            result.m32 = 0;
445            result.m33 = 1;
446        }
447
448        public static Matrix4x4 Multiply(Matrix4x4 left, Matrix4x4 right)
449        {
450            Matrix4x4 result;
451
452            result.m00 = left.m00 * right.m00 + left.m01 * right.m10 + left.m02 * right.m20 + left.m03 * right.m30;
453            result.m01 = left.m00 * right.m01 + left.m01 * right.m11 + left.m02 * right.m21 + left.m03 * right.m31;
454            result.m02 = left.m00 * right.m02 + left.m01 * right.m12 + left.m02 * right.m22 + left.m03 * right.m32;
455            result.m03 = left.m00 * right.m03 + left.m01 * right.m13 + left.m02 * right.m23 + left.m03 * right.m33;
456
457            result.m10 = left.m10 * right.m00 + left.m11 * right.m10 + left.m12 * right.m20 + left.m13 * right.m30;
458            result.m11 = left.m10 * right.m01 + left.m11 * right.m11 + left.m12 * right.m21 + left.m13 * right.m31;
459            result.m12 = left.m10 * right.m02 + left.m11 * right.m12 + left.m12 * right.m22 + left.m13 * right.m32;
460            result.m13 = left.m10 * right.m03 + left.m11 * right.m13 + left.m12 * right.m23 + left.m13 * right.m33;
461
462            result.m20 = left.m20 * right.m00 + left.m21 * right.m10 + left.m22 * right.m20 + left.m23 * right.m30;
463            result.m21 = left.m20 * right.m01 + left.m21 * right.m11 + left.m22 * right.m21 + left.m23 * right.m31;
464            result.m22 = left.m20 * right.m02 + left.m21 * right.m12 + left.m22 * right.m22 + left.m23 * right.m32;
465            result.m23 = left.m20 * right.m03 + left.m21 * right.m13 + left.m22 * right.m23 + left.m23 * right.m33;
466
467            result.m30 = left.m30 * right.m00 + left.m31 * right.m10 + left.m32 * right.m20 + left.m33 * right.m30;
468            result.m31 = left.m30 * right.m01 + left.m31 * right.m11 + left.m32 * right.m21 + left.m33 * right.m31;
469            result.m32 = left.m30 * right.m02 + left.m31 * right.m12 + left.m32 * right.m22 + left.m33 * right.m32;
470            result.m33 = left.m30 * right.m03 + left.m31 * right.m13 + left.m32 * right.m23 + left.m33 * right.m33;
471
472            return result;
473        }
474        public static void Multiply(ref Matrix4x4 left, ref Matrix4x4 right, out Matrix4x4 result)
475        {
476
477
478            Scalar m00 = left.m00 * right.m00 + left.m01 * right.m10 + left.m02 * right.m20 + left.m03 * right.m30;
479            Scalar m01 = left.m00 * right.m01 + left.m01 * right.m11 + left.m02 * right.m21 + left.m03 * right.m31;
480            Scalar m02 = left.m00 * right.m02 + left.m01 * right.m12 + left.m02 * right.m22 + left.m03 * right.m32;
481            Scalar m03 = left.m00 * right.m03 + left.m01 * right.m13 + left.m02 * right.m23 + left.m03 * right.m33;
482
483            Scalar m10 = left.m10 * right.m00 + left.m11 * right.m10 + left.m12 * right.m20 + left.m13 * right.m30;
484            Scalar m11 = left.m10 * right.m01 + left.m11 * right.m11 + left.m12 * right.m21 + left.m13 * right.m31;
485            Scalar m12 = left.m10 * right.m02 + left.m11 * right.m12 + left.m12 * right.m22 + left.m13 * right.m32;
486            Scalar m13 = left.m10 * right.m03 + left.m11 * right.m13 + left.m12 * right.m23 + left.m13 * right.m33;
487
488            Scalar m20 = left.m20 * right.m00 + left.m21 * right.m10 + left.m22 * right.m20 + left.m23 * right.m30;
489            Scalar m21 = left.m20 * right.m01 + left.m21 * right.m11 + left.m22 * right.m21 + left.m23 * right.m31;
490            Scalar m22 = left.m20 * right.m02 + left.m21 * right.m12 + left.m22 * right.m22 + left.m23 * right.m32;
491            Scalar m23 = left.m20 * right.m03 + left.m21 * right.m13 + left.m22 * right.m23 + left.m23 * right.m33;
492
493            Scalar m30 = left.m30 * right.m00 + left.m31 * right.m10 + left.m32 * right.m20 + left.m33 * right.m30;
494            Scalar m31 = left.m30 * right.m01 + left.m31 * right.m11 + left.m32 * right.m21 + left.m33 * right.m31;
495            Scalar m32 = left.m30 * right.m02 + left.m31 * right.m12 + left.m32 * right.m22 + left.m33 * right.m32;
496            Scalar m33 = left.m30 * right.m03 + left.m31 * right.m13 + left.m32 * right.m23 + left.m33 * right.m33;
497
498            result.m00 = m00;
499            result.m01 = m01;
500            result.m02 = m02;
501            result.m03 = m03;
502
503            result.m10 = m10;
504            result.m11 = m11;
505            result.m12 = m12;
506            result.m13 = m13;
507
508            result.m20 = m20;
509            result.m21 = m21;
510            result.m22 = m22;
511            result.m23 = m23;
512
513            result.m30 = m30;
514            result.m31 = m31;
515            result.m32 = m32;
516            result.m33 = m33;
517
518
519
520        }
521
522        public static Matrix4x4 Multiply(Matrix4x4 left, Scalar scalar)
523        {
524            Matrix4x4 result;
525
526            result.m00 = left.m00 * scalar;
527            result.m01 = left.m01 * scalar;
528            result.m02 = left.m02 * scalar;
529            result.m03 = left.m03 * scalar;
530
531            result.m10 = left.m10 * scalar;
532            result.m11 = left.m11 * scalar;
533            result.m12 = left.m12 * scalar;
534            result.m13 = left.m13 * scalar;
535
536            result.m20 = left.m20 * scalar;
537            result.m21 = left.m21 * scalar;
538            result.m22 = left.m22 * scalar;
539            result.m23 = left.m23 * scalar;
540
541            result.m30 = left.m30 * scalar;
542            result.m31 = left.m31 * scalar;
543            result.m32 = left.m32 * scalar;
544            result.m33 = left.m33 * scalar;
545
546            return result;
547        }
548        public static void Multiply(ref Matrix4x4 left, ref Scalar scalar, out Matrix4x4 result)
549        {
550
551            result.m00 = left.m00 * scalar;
552            result.m01 = left.m01 * scalar;
553            result.m02 = left.m02 * scalar;
554            result.m03 = left.m03 * scalar;
555
556            result.m10 = left.m10 * scalar;
557            result.m11 = left.m11 * scalar;
558            result.m12 = left.m12 * scalar;
559            result.m13 = left.m13 * scalar;
560
561            result.m20 = left.m20 * scalar;
562            result.m21 = left.m21 * scalar;
563            result.m22 = left.m22 * scalar;
564            result.m23 = left.m23 * scalar;
565
566            result.m30 = left.m30 * scalar;
567            result.m31 = left.m31 * scalar;
568            result.m32 = left.m32 * scalar;
569            result.m33 = left.m33 * scalar;
570        }
571
572        public static Matrix4x4 Multiply(Matrix4x4 left, Matrix3x3 right)
573        {
574            Matrix4x4 result;
575
576            result.m00 = left.m00 * right.m00 + left.m01 * right.m10 + left.m02 * right.m20;
577            result.m01 = left.m00 * right.m01 + left.m01 * right.m11 + left.m02 * right.m21;
578            result.m02 = left.m00 * right.m02 + left.m01 * right.m12 + left.m02 * right.m22;
579            result.m03 = left.m03;
580
581            result.m10 = left.m10 * right.m00 + left.m11 * right.m10 + left.m12 * right.m20;
582            result.m11 = left.m10 * right.m01 + left.m11 * right.m11 + left.m12 * right.m21;
583            result.m12 = left.m10 * right.m02 + left.m11 * right.m12 + left.m12 * right.m22;
584            result.m13 = left.m13;
585
586            result.m20 = left.m20 * right.m00 + left.m21 * right.m10 + left.m22 * right.m20;
587            result.m21 = left.m20 * right.m01 + left.m21 * right.m11 + left.m22 * right.m21;
588            result.m22 = left.m20 * right.m02 + left.m21 * right.m12 + left.m22 * right.m22;
589            result.m23 = left.m23;
590
591            result.m30 = left.m30 * right.m00 + left.m31 * right.m10 + left.m32 * right.m20;
592            result.m31 = left.m30 * right.m01 + left.m31 * right.m11 + left.m32 * right.m21;
593            result.m32 = left.m30 * right.m02 + left.m31 * right.m12 + left.m32 * right.m22;
594            result.m33 = left.m33;
595
596            return result;
597        }
598        public static void Multiply(ref Matrix4x4 left, ref Matrix3x3 right, out Matrix4x4 result)
599        {
600            Scalar m00 = left.m00 * right.m00 + left.m01 * right.m10 + left.m02 * right.m20;
601            Scalar m01 = left.m00 * right.m01 + left.m01 * right.m11 + left.m02 * right.m21;
602            Scalar m02 = left.m00 * right.m02 + left.m01 * right.m12 + left.m02 * right.m22;
603
604            Scalar m10 = left.m10 * right.m00 + left.m11 * right.m10 + left.m12 * right.m20;
605            Scalar m11 = left.m10 * right.m01 + left.m11 * right.m11 + left.m12 * right.m21;
606            Scalar m12 = left.m10 * right.m02 + left.m11 * right.m12 + left.m12 * right.m22;
607
608            Scalar m20 = left.m20 * right.m00 + left.m21 * right.m10 + left.m22 * right.m20;
609            Scalar m21 = left.m20 * right.m01 + left.m21 * right.m11 + left.m22 * right.m21;
610            Scalar m22 = left.m20 * right.m02 + left.m21 * right.m12 + left.m22 * right.m22;
611
612            Scalar m30 = left.m30 * right.m00 + left.m31 * right.m10 + left.m32 * right.m20;
613            Scalar m31 = left.m30 * right.m01 + left.m31 * right.m11 + left.m32 * right.m21;
614            Scalar m32 = left.m30 * right.m02 + left.m31 * right.m12 + left.m32 * right.m22;
615
616
617            result.m00 = m00;
618            result.m01 = m01;
619            result.m02 = m02;
620            result.m03 = left.m03;
621
622            result.m10 = m10;
623            result.m11 = m11;
624            result.m12 = m12;
625            result.m13 = left.m13;
626
627            result.m20 = m20;
628            result.m21 = m21;
629            result.m22 = m22;
630            result.m23 = left.m23;
631
632            result.m30 = m30;
633            result.m31 = m31;
634            result.m32 = m32;
635            result.m33 = left.m33;
636        }
637
638        public static Matrix4x4 Multiply(Matrix3x3 left, Matrix4x4 right)
639        {
640            Matrix4x4 result;
641
642            result.m00 = left.m00 * right.m00 + left.m01 * right.m10 + left.m02 * right.m20;
643            result.m01 = left.m00 * right.m01 + left.m01 * right.m11 + left.m02 * right.m21;
644            result.m02 = left.m00 * right.m02 + left.m01 * right.m12 + left.m02 * right.m22;
645            result.m03 = left.m00 * right.m03 + left.m01 * right.m13 + left.m02 * right.m23;
646
647            result.m10 = left.m10 * right.m00 + left.m11 * right.m10 + left.m12 * right.m20;
648            result.m11 = left.m10 * right.m01 + left.m11 * right.m11 + left.m12 * right.m21;
649            result.m12 = left.m10 * right.m02 + left.m11 * right.m12 + left.m12 * right.m22;
650            result.m13 = left.m10 * right.m03 + left.m11 * right.m13 + left.m12 * right.m23;
651
652            result.m20 = left.m20 * right.m00 + left.m21 * right.m10 + left.m22 * right.m20;
653            result.m21 = left.m20 * right.m01 + left.m21 * right.m11 + left.m22 * right.m21;
654            result.m22 = left.m20 * right.m02 + left.m21 * right.m12 + left.m22 * right.m22;
655            result.m23 = left.m20 * right.m03 + left.m21 * right.m13 + left.m22 * right.m23;
656
657            result.m30 = right.m30;
658            result.m31 = right.m31;
659            result.m32 = right.m32;
660            result.m33 = right.m33;
661
662            return result;
663        }
664        public static void Multiply(ref Matrix3x3 left, ref Matrix4x4 right, out Matrix4x4 result)
665        {
666            Scalar m00 = left.m00 * right.m00 + left.m01 * right.m10 + left.m02 * right.m20;
667            Scalar m01 = left.m00 * right.m01 + left.m01 * right.m11 + left.m02 * right.m21;
668            Scalar m02 = left.m00 * right.m02 + left.m01 * right.m12 + left.m02 * right.m22;
669            Scalar m03 = left.m00 * right.m03 + left.m01 * right.m13 + left.m02 * right.m23;
670
671            Scalar m10 = left.m10 * right.m00 + left.m11 * right.m10 + left.m12 * right.m20;
672            Scalar m11 = left.m10 * right.m01 + left.m11 * right.m11 + left.m12 * right.m21;
673            Scalar m12 = left.m10 * right.m02 + left.m11 * right.m12 + left.m12 * right.m22;
674            Scalar m13 = left.m10 * right.m03 + left.m11 * right.m13 + left.m12 * right.m23;
675
676            Scalar m20 = left.m20 * right.m00 + left.m21 * right.m10 + left.m22 * right.m20;
677            Scalar m21 = left.m20 * right.m01 + left.m21 * right.m11 + left.m22 * right.m21;
678            Scalar m22 = left.m20 * right.m02 + left.m21 * right.m12 + left.m22 * right.m22;
679            Scalar m23 = left.m20 * right.m03 + left.m21 * right.m13 + left.m22 * right.m23;
680
681            result.m00 = m00;
682            result.m01 = m01;
683            result.m02 = m02;
684            result.m03 = m03;
685
686            result.m10 = m10;
687            result.m11 = m11;
688            result.m12 = m12;
689            result.m13 = m13;
690
691            result.m20 = m20;
692            result.m21 = m21;
693            result.m22 = m22;
694            result.m23 = m23;
695
696            result.m30 = right.m30;
697            result.m31 = right.m31;
698            result.m32 = right.m32;
699            result.m33 = right.m33;
700        }
701
702        public static Matrix4x4 Multiply(Matrix4x4 left, Matrix2x3 right)
703        {
704            Matrix4x4 result;
705
706            result.m00 = left.m00 * right.m00 + left.m01 * right.m10;
707            result.m01 = left.m00 * right.m01 + left.m01 * right.m11;
708            result.m02 = left.m00 * right.m02 + left.m01 * right.m12 + left.m02;
709            result.m03 = left.m03;
710
711            result.m10 = left.m10 * right.m00 + left.m11 * right.m10;
712            result.m11 = left.m10 * right.m01 + left.m11 * right.m11;
713            result.m12 = left.m10 * right.m02 + left.m11 * right.m12 + left.m12;
714            result.m13 = left.m13;
715
716            result.m20 = left.m20 * right.m00 + left.m21 * right.m10;
717            result.m21 = left.m20 * right.m01 + left.m21 * right.m11;
718            result.m22 = left.m20 * right.m02 + left.m21 * right.m12 + left.m22;
719            result.m23 = left.m23;
720
721            result.m30 = left.m30 * right.m00 + left.m31 * right.m10;
722            result.m31 = left.m30 * right.m01 + left.m31 * right.m11;
723            result.m32 = left.m30 * right.m02 + left.m31 * right.m12 + left.m32;
724            result.m33 = left.m33;
725
726            return result;
727        }
728        public static void Multiply(ref Matrix4x4 left, ref Matrix2x3 right, out Matrix4x4 result)
729        {
730            Scalar m00 = left.m00 * right.m00 + left.m01 * right.m10;
731            Scalar m01 = left.m00 * right.m01 + left.m01 * right.m11;
732            Scalar m02 = left.m00 * right.m02 + left.m01 * right.m12 + left.m02;
733
734            Scalar m10 = left.m10 * right.m00 + left.m11 * right.m10;
735            Scalar m11 = left.m10 * right.m01 + left.m11 * right.m11;
736            Scalar m12 = left.m10 * right.m02 + left.m11 * right.m12 + left.m12;
737
738            Scalar m20 = left.m20 * right.m00 + left.m21 * right.m10;
739            Scalar m21 = left.m20 * right.m01 + left.m21 * right.m11;
740            Scalar m22 = left.m20 * right.m02 + left.m21 * right.m12 + left.m22;
741
742            Scalar m30 = left.m30 * right.m00 + left.m31 * right.m10;
743            Scalar m31 = left.m30 * right.m01 + left.m31 * right.m11;
744            Scalar m32 = left.m30 * right.m02 + left.m31 * right.m12 + left.m32;
745
746
747            result.m00 = m00;
748            result.m01 = m01;
749            result.m02 = m02;
750            result.m03 = left.m03;
751
752            result.m10 = m10;
753            result.m11 = m11;
754            result.m12 = m12;
755            result.m13 = left.m13;
756
757            result.m20 = m20;
758            result.m21 = m21;
759            result.m22 = m22;
760            result.m23 = left.m23;
761
762            result.m30 = m30;
763            result.m31 = m31;
764            result.m32 = m32;
765            result.m33 = left.m33;
766        }
767
768        public static Matrix4x4 Multiply(Matrix2x3 left, Matrix4x4 right)
769        {
770            Matrix4x4 result;
771
772            result.m00 = left.m00 * right.m00 + left.m01 * right.m10 + left.m02 * right.m20;
773            result.m01 = left.m00 * right.m01 + left.m01 * right.m11 + left.m02 * right.m21;
774            result.m02 = left.m00 * right.m02 + left.m01 * right.m12 + left.m02 * right.m22;
775            result.m03 = left.m00 * right.m03 + left.m01 * right.m13 + left.m02 * right.m23;
776
777            result.m10 = left.m10 * right.m00 + left.m11 * right.m10 + left.m12 * right.m20;
778            result.m11 = left.m10 * right.m01 + left.m11 * right.m11 + left.m12 * right.m21;
779            result.m12 = left.m10 * right.m02 + left.m11 * right.m12 + left.m12 * right.m22;
780            result.m13 = left.m10 * right.m03 + left.m11 * right.m13 + left.m12 * right.m23;
781
782            result.m20 =  right.m20;
783            result.m21 =  right.m21;
784            result.m22 =  right.m22;
785            result.m23 =  right.m23;
786
787            result.m30 = right.m30;
788            result.m31 = right.m31;
789            result.m32 = right.m32;
790            result.m33 = right.m33;
791
792            return result;
793        }
794        public static void Multiply(ref Matrix2x3 left, ref Matrix4x4 right, out Matrix4x4 result)
795        {
796            Scalar m00 = left.m00 * right.m00 + left.m01 * right.m10 + left.m02 * right.m20;
797            Scalar m01 = left.m00 * right.m01 + left.m01 * right.m11 + left.m02 * right.m21;
798            Scalar m02 = left.m00 * right.m02 + left.m01 * right.m12 + left.m02 * right.m22;
799            Scalar m03 = left.m00 * right.m03 + left.m01 * right.m13 + left.m02 * right.m23;
800
801            Scalar m10 = left.m10 * right.m00 + left.m11 * right.m10 + left.m12 * right.m20;
802            Scalar m11 = left.m10 * right.m01 + left.m11 * right.m11 + left.m12 * right.m21;
803            Scalar m12 = left.m10 * right.m02 + left.m11 * right.m12 + left.m12 * right.m22;
804            Scalar m13 = left.m10 * right.m03 + left.m11 * right.m13 + left.m12 * right.m23;
805
806            result.m00 = m00;
807            result.m01 = m01;
808            result.m02 = m02;
809            result.m03 = m03;
810
811            result.m10 = m10;
812            result.m11 = m11;
813            result.m12 = m12;
814            result.m13 = m13;
815
816            result.m20 = right.m20;
817            result.m21 = right.m21;
818            result.m22 = right.m22;
819            result.m23 = right.m23;
820
821            result.m30 = right.m30;
822            result.m31 = right.m31;
823            result.m32 = right.m32;
824            result.m33 = right.m33;
825        }
826
827        public static Matrix4x4 Multiply(Matrix4x4 left, Matrix2x2 right)
828        {
829            Matrix4x4 result;
830
831            result.m00 = left.m00 * right.m00 + left.m01 * right.m10;
832            result.m01 = left.m00 * right.m01 + left.m01 * right.m11;
833            result.m02 = left.m02;
834            result.m03 = left.m03;
835
836            result.m10 = left.m10 * right.m00 + left.m11 * right.m10;
837            result.m11 = left.m10 * right.m01 + left.m11 * right.m11;
838            result.m12 = left.m12;
839            result.m13 = left.m13;
840
841            result.m20 = left.m20 * right.m00 + left.m21 * right.m10;
842            result.m21 = left.m20 * right.m01 + left.m21 * right.m11;
843            result.m22 = left.m22;
844            result.m23 = left.m23;
845
846            result.m30 = left.m30 * right.m00 + left.m31 * right.m10;
847            result.m31 = left.m30 * right.m01 + left.m31 * right.m11;
848            result.m32 = left.m32;
849            result.m33 = left.m33;
850
851            return result;
852        }
853        public static void Multiply(ref Matrix4x4 left, ref Matrix2x2 right, out Matrix4x4 result)
854        {
855            Scalar m00 = left.m00 * right.m00 + left.m01 * right.m10;
856            Scalar m01 = left.m00 * right.m01 + left.m01 * right.m11;
857
858
859            Scalar m10 = left.m10 * right.m00 + left.m11 * right.m10;
860            Scalar m11 = left.m10 * right.m01 + left.m11 * right.m11;
861
862
863            Scalar m20 = left.m20 * right.m00 + left.m21 * right.m10;
864            Scalar m21 = left.m20 * right.m01 + left.m21 * right.m11;
865
866
867            Scalar m30 = left.m30 * right.m00 + left.m31 * right.m10;
868            Scalar m31 = left.m30 * right.m01 + left.m31 * right.m11;
869
870
871            result.m00 = m00;
872            result.m01 = m01;
873            result.m02 = left.m02;
874            result.m03 = left.m03;
875
876            result.m10 = m10;
877            result.m11 = m11;
878            result.m12 = left.m12;
879            result.m13 = left.m13;
880
881            result.m20 = m20;
882            result.m21 = m21;
883            result.m22 = left.m22;
884            result.m23 = left.m23;
885
886            result.m30 = m30;
887            result.m31 = m31;
888            result.m32 = left.m32;
889            result.m33 = left.m33;
890
891
892        }
893
894        public static Matrix4x4 Multiply(Matrix2x2 left, Matrix4x4 right)
895        {
896            Matrix4x4 result;
897
898            result.m00 = left.m00 * right.m00 + left.m01 * right.m10;
899            result.m01 = left.m00 * right.m01 + left.m01 * right.m11;
900            result.m02 = left.m00 * right.m02 + left.m01 * right.m12;
901            result.m03 = left.m00 * right.m03 + left.m01 * right.m13;
902
903            result.m10 = left.m10 * right.m00 + left.m11 * right.m10;
904            result.m11 = left.m10 * right.m01 + left.m11 * right.m11;
905            result.m12 = left.m10 * right.m02 + left.m11 * right.m12;
906            result.m13 = left.m10 * right.m03 + left.m11 * right.m13;
907
908            result.m20 = right.m20;
909            result.m21 = right.m21;
910            result.m22 = right.m22;
911            result.m23 = right.m23;
912
913            result.m30 = right.m30;
914            result.m31 = right.m31;
915            result.m32 = right.m32;
916            result.m33 = right.m33;
917
918            return result;
919        }
920        public static void Multiply(ref Matrix2x2 left, ref Matrix4x4 right, out Matrix4x4 result)
921        {
922            Scalar m00 = left.m00 * right.m00 + left.m01 * right.m10;
923            Scalar m01 = left.m00 * right.m01 + left.m01 * right.m11;
924            Scalar m02 = left.m00 * right.m02 + left.m01 * right.m12;
925            Scalar m03 = left.m00 * right.m03 + left.m01 * right.m13;
926
927            Scalar m10 = left.m10 * right.m00 + left.m11 * right.m10;
928            Scalar m11 = left.m10 * right.m01 + left.m11 * right.m11;
929            Scalar m12 = left.m10 * right.m02 + left.m11 * right.m12;
930            Scalar m13 = left.m10 * right.m03 + left.m11 * right.m13;
931
932            result.m00 = m00;
933            result.m01 = m01;
934            result.m02 = m02;
935            result.m03 = m03;
936
937            result.m10 = m10;
938            result.m11 = m11;
939            result.m12 = m12;
940            result.m13 = m13;
941
942            result.m20 = right.m20;
943            result.m21 = right.m21;
944            result.m22 = right.m22;
945            result.m23 = right.m23;
946
947            result.m30 = right.m30;
948            result.m31 = right.m31;
949            result.m32 = right.m32;
950            result.m33 = right.m33;
951        }
952
953
954        public static Matrix4x4 Add(Matrix4x4 left, Matrix4x4 right)
955        {
956            Matrix4x4 result;
957
958            result.m00 = left.m00 + right.m00;
959            result.m01 = left.m01 + right.m01;
960            result.m02 = left.m02 + right.m02;
961            result.m03 = left.m03 + right.m03;
962
963            result.m10 = left.m10 + right.m10;
964            result.m11 = left.m11 + right.m11;
965            result.m12 = left.m12 + right.m12;
966            result.m13 = left.m13 + right.m13;
967
968            result.m20 = left.m20 + right.m20;
969            result.m21 = left.m21 + right.m21;
970            result.m22 = left.m22 + right.m22;
971            result.m23 = left.m23 + right.m23;
972
973            result.m30 = left.m30 + right.m30;
974            result.m31 = left.m31 + right.m31;
975            result.m32 = left.m32 + right.m32;
976            result.m33 = left.m33 + right.m33;
977
978            return result;
979        }
980        public static void Add(ref Matrix4x4 left, ref Matrix4x4 right, out Matrix4x4 result)
981        {
982            result.m00 = left.m00 + right.m00;
983            result.m01 = left.m01 + right.m01;
984            result.m02 = left.m02 + right.m02;
985            result.m03 = left.m03 + right.m03;
986
987            result.m10 = left.m10 + right.m10;
988            result.m11 = left.m11 + right.m11;
989            result.m12 = left.m12 + right.m12;
990            result.m13 = left.m13 + right.m13;
991
992            result.m20 = left.m20 + right.m20;
993            result.m21 = left.m21 + right.m21;
994            result.m22 = left.m22 + right.m22;
995            result.m23 = left.m23 + right.m23;
996
997            result.m30 = left.m30 + right.m30;
998            result.m31 = left.m31 + right.m31;
999            result.m32 = left.m32 + right.m32;
1000            result.m33 = left.m33 + right.m33;
1001        }
1002
1003        public static Matrix4x4 Add(Matrix3x3 left, Matrix4x4 right)
1004        {
1005            Matrix4x4 result;
1006            Add(ref left, ref right, out result);
1007            return result;
1008        }
1009        public static void Add(ref Matrix3x3 left, ref Matrix4x4 right, out Matrix4x4 result)
1010        {
1011            result.m00 = left.m00 + right.m00;
1012            result.m01 = left.m01 + right.m01;
1013            result.m02 = left.m02 + right.m02;
1014            result.m03 = right.m03;
1015
1016            result.m10 = left.m10 + right.m10;
1017            result.m11 = left.m11 + right.m11;
1018            result.m12 = left.m12 + right.m12;
1019            result.m13 = right.m13;
1020
1021            result.m20 = left.m20 + right.m20;
1022            result.m21 = left.m21 + right.m21;
1023            result.m22 = left.m22 + right.m22;
1024            result.m23 = right.m23;
1025
1026            result.m30 = right.m30;
1027            result.m31 = right.m31;
1028            result.m32 = right.m32;
1029            result.m33 = 1 + right.m33;
1030        }
1031        public static Matrix4x4 Add(Matrix4x4 left, Matrix3x3 right)
1032        {
1033            Matrix4x4 result;
1034            Add(ref left, ref right, out result);
1035            return result;
1036        }
1037        public static void Add(ref Matrix4x4 left, ref Matrix3x3 right, out Matrix4x4 result)
1038        {
1039            result.m00 = left.m00 + right.m00;
1040            result.m01 = left.m01 + right.m01;
1041            result.m02 = left.m02 + right.m02;
1042            result.m03 = left.m03;
1043
1044            result.m10 = left.m10 + right.m10;
1045            result.m11 = left.m11 + right.m11;
1046            result.m12 = left.m12 + right.m12;
1047            result.m13 = left.m13;
1048
1049            result.m20 = left.m20 + right.m20;
1050            result.m21 = left.m21 + right.m21;
1051            result.m22 = left.m22 + right.m22;
1052            result.m23 = left.m23;
1053
1054            result.m30 = left.m30;
1055            result.m31 = left.m31;
1056            result.m32 = left.m32;
1057            result.m33 = left.m33 + 1;
1058        }
1059
1060        public static Matrix4x4 Add(Matrix2x3 left, Matrix4x4 right)
1061        {
1062            Matrix4x4 result;
1063            Add(ref left, ref right, out result);
1064            return result;
1065        }
1066        public static void Add(ref Matrix2x3 left, ref Matrix4x4 right, out Matrix4x4 result)
1067        {
1068            result.m00 = left.m00 + right.m00;
1069            result.m01 = left.m01 + right.m01;
1070            result.m02 = left.m02 + right.m02;
1071            result.m03 = right.m03;
1072
1073            result.m10 = left.m10 + right.m10;
1074            result.m11 = left.m11 + right.m11;
1075            result.m12 = left.m12 + right.m12;
1076            result.m13 = right.m13;
1077
1078            result.m20 = right.m20;
1079            result.m21 = right.m21;
1080            result.m22 = 1 + right.m22;
1081            result.m23 = right.m23;
1082
1083            result.m30 = right.m30;
1084            result.m31 = right.m31;
1085            result.m32 = right.m32;
1086            result.m33 = 1 + right.m33;
1087        }
1088        public static Matrix4x4 Add(Matrix4x4 left, Matrix2x3 right)
1089        {
1090            Matrix4x4 result;
1091            Add(ref left, ref right, out result);
1092            return result;
1093        }
1094        public static void Add(ref Matrix4x4 left, ref Matrix2x3 right, out Matrix4x4 result)
1095        {
1096            result.m00 = left.m00 + right.m00;
1097            result.m01 = left.m01 + right.m01;
1098            result.m02 = left.m02 + right.m02;
1099            result.m03 = left.m03;
1100
1101            result.m10 = left.m10 + right.m10;
1102            result.m11 = left.m11 + right.m11;
1103            result.m12 = left.m12 + right.m12;
1104            result.m13 = left.m13;
1105
1106            result.m20 = left.m20;
1107            result.m21 = left.m21;
1108            result.m22 = left.m22 + 1;
1109            result.m23 = left.m23;
1110
1111            result.m30 = left.m30;
1112            result.m31 = left.m31;
1113            result.m32 = left.m32;
1114            result.m33 = left.m33 + 1;
1115        }
1116
1117        public static Matrix4x4 Add(Matrix2x2 left, Matrix4x4 right)
1118        {
1119            Matrix4x4 result;
1120            Add(ref left, ref right, out result);
1121            return result;
1122        }
1123        public static void Add(ref Matrix2x2 left, ref Matrix4x4 right, out Matrix4x4 result)
1124        {
1125            result.m00 = left.m00 + right.m00;
1126            result.m01 = left.m01 + right.m01;
1127            result.m02 = right.m02;
1128            result.m03 = right.m03;
1129
1130            result.m10 = left.m10 + right.m10;
1131            result.m11 = left.m11 + right.m11;
1132            result.m12 = right.m12;
1133            result.m13 = right.m13;
1134
1135            result.m20 = right.m20;
1136            result.m21 = right.m21;
1137            result.m22 = 1 + right.m22;
1138            result.m23 = right.m23;
1139
1140            result.m30 = right.m30;
1141            result.m31 = right.m31;
1142            result.m32 = right.m32;
1143            result.m33 = 1 + right.m33;
1144        }
1145        public static Matrix4x4 Add(Matrix4x4 left, Matrix2x2 right)
1146        {
1147            Matrix4x4 result;
1148            Add(ref left, ref right, out result);
1149            return result;
1150        }
1151        public static void Add(ref Matrix4x4 left, ref Matrix2x2 right, out Matrix4x4 result)
1152        {
1153            result.m00 = left.m00 + right.m00;
1154            result.m01 = left.m01 + right.m01;
1155            result.m02 = left.m02;
1156            result.m03 = left.m03;
1157
1158            result.m10 = left.m10 + right.m10;
1159            result.m11 = left.m11 + right.m11;
1160            result.m12 = left.m12;
1161            result.m13 = left.m13;
1162
1163            result.m20 = left.m20;
1164            result.m21 = left.m21;
1165            result.m22 = left.m22 + 1;
1166            result.m23 = left.m23;
1167
1168            result.m30 = left.m30;
1169            result.m31 = left.m31;
1170            result.m32 = left.m32;
1171            result.m33 = left.m33 + 1;
1172        }
1173
1174
1175        public static Matrix4x4 Subtract(Matrix4x4 left, Matrix4x4 right)
1176        {
1177            Matrix4x4 result;
1178
1179            result.m00 = left.m00 - right.m00;
1180            result.m01 = left.m01 - right.m01;
1181            result.m02 = left.m02 - right.m02;
1182            result.m03 = left.m03 - right.m03;
1183
1184            result.m10 = left.m10 - right.m10;
1185            result.m11 = left.m11 - right.m11;
1186            result.m12 = left.m12 - right.m12;
1187            result.m13 = left.m13 - right.m13;
1188
1189            result.m20 = left.m20 - right.m20;
1190            result.m21 = left.m21 - right.m21;
1191            result.m22 = left.m22 - right.m22;
1192            result.m23 = left.m23 - right.m23;
1193
1194            result.m30 = left.m30 - right.m30;
1195            result.m31 = left.m31 - right.m31;
1196            result.m32 = left.m32 - right.m32;
1197            result.m33 = left.m33 - right.m33;
1198
1199            return result;
1200        }
1201        public static void Subtract(ref Matrix4x4 left, ref Matrix4x4 right, out Matrix4x4 result)
1202        {
1203            result.m00 = left.m00 - right.m00;
1204            result.m01 = left.m01 - right.m01;
1205            result.m02 = left.m02 - right.m02;
1206            result.m03 = left.m03 - right.m03;
1207
1208            result.m10 = left.m10 - right.m10;
1209            result.m11 = left.m11 - right.m11;
1210            result.m12 = left.m12 - right.m12;
1211            result.m13 = left.m13 - right.m13;
1212
1213            result.m20 = left.m20 - right.m20;
1214            result.m21 = left.m21 - right.m21;
1215            result.m22 = left.m22 - right.m22;
1216            result.m23 = left.m23 - right.m23;
1217
1218            result.m30 = left.m30 - right.m30;
1219            result.m31 = left.m31 - right.m31;
1220            result.m32 = left.m32 - right.m32;
1221            result.m33 = left.m33 - right.m33;
1222        }
1223
1224        public static Matrix4x4 Subtract(Matrix3x3 left, Matrix4x4 right)
1225        {
1226            Matrix4x4 result;
1227            Subtract(ref left, ref right, out result);
1228            return result;
1229        }
1230        public static void Subtract(ref Matrix3x3 left, ref Matrix4x4 right, out Matrix4x4 result)
1231        {
1232            result.m00 = left.m00 - right.m00;
1233            result.m01 = left.m01 - right.m01;
1234            result.m02 = left.m02 - right.m02;
1235            result.m03 = -right.m03;
1236
1237            result.m10 = left.m10 - right.m10;
1238            result.m11 = left.m11 - right.m11;
1239            result.m12 = left.m12 - right.m12;
1240            result.m13 = -right.m13;
1241
1242            result.m20 = left.m20 - right.m20;
1243            result.m21 = left.m21 - right.m21;
1244            result.m22 = left.m22 - right.m22;
1245            result.m23 = -right.m23;
1246
1247            result.m30 = -right.m30;
1248            result.m31 = -right.m31;
1249            result.m32 = -right.m32;
1250            result.m33 = 1 - right.m33;
1251        }
1252        public static Matrix4x4 Subtract(Matrix4x4 left, Matrix3x3 right)
1253        {
1254            Matrix4x4 result;
1255            Subtract(ref left, ref right, out result);
1256            return result;
1257        }
1258        public static void Subtract(ref Matrix4x4 left, ref Matrix3x3 right, out Matrix4x4 result)
1259        {
1260            result.m00 = left.m00 - right.m00;
1261            result.m01 = left.m01 - right.m01;
1262            result.m02 = left.m02 - right.m02;
1263            result.m03 = left.m03;
1264
1265            result.m10 = left.m10 - right.m10;
1266            result.m11 = left.m11 - right.m11;
1267            result.m12 = left.m12 - right.m12;
1268            result.m13 = left.m13;
1269
1270            result.m20 = left.m20 - right.m20;
1271            result.m21 = left.m21 - right.m21;
1272            result.m22 = left.m22 - right.m22;
1273            result.m23 = left.m23;
1274
1275            result.m30 = left.m30;
1276            result.m31 = left.m31;
1277            result.m32 = left.m32;
1278            result.m33 = left.m33 - 1;
1279        }
1280
1281        public static Matrix4x4 Subtract(Matrix2x3 left, Matrix4x4 right)
1282        {
1283            Matrix4x4 result;
1284            Subtract(ref left, ref right, out result);
1285            return result;
1286        }
1287        public static void Subtract(ref Matrix2x3 left, ref Matrix4x4 right, out Matrix4x4 result)
1288        {
1289            result.m00 = left.m00 - right.m00;
1290            result.m01 = left.m01 - right.m01;
1291            result.m02 = left.m02 - right.m02;
1292            result.m03 = -right.m03;
1293
1294            result.m10 = left.m10 - right.m10;
1295            result.m11 = left.m11 - right.m11;
1296            result.m12 = left.m12 - right.m12;
1297            result.m13 = -right.m13;
1298
1299            result.m20 = -right.m20;
1300            result.m21 = -right.m21;
1301            result.m22 = 1 - right.m22;
1302            result.m23 = -right.m23;
1303
1304            result.m30 = -right.m30;
1305            result.m31 = -right.m31;
1306            result.m32 = -right.m32;
1307            result.m33 = 1 - right.m33;
1308        }
1309        public static Matrix4x4 Subtract(Matrix4x4 left, Matrix2x3 right)
1310        {
1311            Matrix4x4 result;
1312            Subtract(ref left, ref right, out result);
1313            return result;
1314        }
1315        public static void Subtract(ref Matrix4x4 left, ref Matrix2x3 right, out Matrix4x4 result)
1316        {
1317            result.m00 = left.m00 - right.m00;
1318            result.m01 = left.m01 - right.m01;
1319            result.m02 = left.m02 - right.m02;
1320            result.m03 = left.m03;
1321
1322            result.m10 = left.m10 - right.m10;
1323            result.m11 = left.m11 - right.m11;
1324            result.m12 = left.m12 - right.m12;
1325            result.m13 = left.m13;
1326
1327            result.m20 = left.m20;
1328            result.m21 = left.m21;
1329            result.m22 = left.m22 - 1;
1330            result.m23 = left.m23;
1331
1332            result.m30 = left.m30;
1333            result.m31 = left.m31;
1334            result.m32 = left.m32;
1335            result.m33 = left.m33 - 1;
1336        }
1337
1338        public static Matrix4x4 Subtract(Matrix2x2 left, Matrix4x4 right)
1339        {
1340            Matrix4x4 result;
1341            Subtract(ref left, ref right, out result);
1342            return result;
1343        }
1344        public static void Subtract(ref Matrix2x2 left, ref Matrix4x4 right, out Matrix4x4 result)
1345        {
1346            result.m00 = left.m00 - right.m00;
1347            result.m01 = left.m01 - right.m01;
1348            result.m02 = -right.m02;
1349            result.m03 = -right.m03;
1350
1351            result.m10 = left.m10 - right.m10;
1352            result.m11 = left.m11 - right.m11;
1353            result.m12 = -right.m12;
1354            result.m13 = -right.m13;
1355
1356            result.m20 = -right.m20;
1357            result.m21 = -right.m21;
1358            result.m22 = 1 - right.m22;
1359            result.m23 = -right.m23;
1360
1361            result.m30 = -right.m30;
1362            result.m31 = -right.m31;
1363            result.m32 = -right.m32;
1364            result.m33 = 1 - right.m33;
1365        }
1366        public static Matrix4x4 Subtract(Matrix4x4 left, Matrix2x2 right)
1367        {
1368            Matrix4x4 result;
1369            Subtract(ref left, ref right, out result);
1370            return result;
1371        }
1372        public static void Subtract(ref Matrix4x4 left, ref Matrix2x2 right, out Matrix4x4 result)
1373        {
1374            result.m00 = left.m00 - right.m00;
1375            result.m01 = left.m01 - right.m01;
1376            result.m02 = left.m02;
1377            result.m03 = left.m03;
1378
1379            result.m10 = left.m10 - right.m10;
1380            result.m11 = left.m11 - right.m11;
1381            result.m12 = left.m12;
1382            result.m13 = left.m13;
1383
1384            result.m20 = left.m20;
1385            result.m21 = left.m21;
1386            result.m22 = left.m22 - 1;
1387            result.m23 = left.m23;
1388
1389            result.m30 = left.m30;
1390            result.m31 = left.m31;
1391            result.m32 = left.m32;
1392            result.m33 = left.m33 - 1;
1393        }
1394
1395        public static Matrix4x4 Negate(Matrix4x4 source)
1396        {
1397            Matrix4x4 result;
1398
1399            result.m00 = -source.m00;
1400            result.m01 = -source.m01;
1401            result.m02 = -source.m02;
1402            result.m03 = -source.m03;
1403
1404            result.m10 = -source.m10;
1405            result.m11 = -source.m11;
1406            result.m12 = -source.m12;
1407            result.m13 = -source.m13;
1408
1409            result.m20 = -source.m20;
1410            result.m21 = -source.m21;
1411            result.m22 = -source.m22;
1412            result.m23 = -source.m23;
1413
1414            result.m30 = -source.m30;
1415            result.m31 = -source.m31;
1416            result.m32 = -source.m32;
1417            result.m33 = -source.m33;
1418
1419            return result;
1420        }
1421        [CLSCompliant(false)]
1422        public static void Negate(ref Matrix4x4 source)
1423        {
1424            Negate(ref source, out source);
1425        }
1426        public static void Negate(ref Matrix4x4 source, out Matrix4x4 result)
1427        {
1428            result.m00 = -source.m00;
1429            result.m01 = -source.m01;
1430            result.m02 = -source.m02;
1431            result.m03 = -source.m03;
1432
1433            result.m10 = -source.m10;
1434            result.m11 = -source.m11;
1435            result.m12 = -source.m12;
1436            result.m13 = -source.m13;
1437
1438            result.m20 = -source.m20;
1439            result.m21 = -source.m21;
1440            result.m22 = -source.m22;
1441            result.m23 = -source.m23;
1442
1443            result.m30 = -source.m30;
1444            result.m31 = -source.m31;
1445            result.m32 = -source.m32;
1446            result.m33 = -source.m33;
1447        }
1448
1449        public static Matrix4x4 Invert(Matrix4x4 source)
1450        {
1451            Matrix4x4 result;
1452            Invert(ref source, out result);
1453            return result;
1454        }
1455        public static void Invert(ref Matrix4x4 source, out Matrix4x4 result)
1456        {
1457            Scalar m00 = source.m00;
1458            Scalar m01 = source.m01;
1459            Scalar m02 = source.m02;
1460            Scalar m03 = source.m03;
1461
1462            Scalar m10 = source.m10;
1463            Scalar m11 = source.m11;
1464            Scalar m12 = source.m12;
1465            Scalar m13 = source.m13;
1466
1467            Scalar m22m33m32m23 = (source.m22 * source.m33 - source.m32 * source.m23);
1468            Scalar m21m33m31m23 = (source.m21 * source.m33 - source.m31 * source.m23);
1469            Scalar m21m32m31m22 = (source.m21 * source.m32 - source.m31 * source.m22);
1470
1471            Scalar m12m33m32m13 = (m12 * source.m33 - source.m32 * m13);
1472            Scalar m11m33m31m13 = (m11 * source.m33 - source.m31 * m13);
1473            Scalar m11m32m31m12 = (m11 * source.m32 - source.m31 * m12);
1474
1475            Scalar m12m23m22m13 = (m12 * source.m23 - source.m22 * m13);
1476            Scalar m11m23m21m13 = (m11 * source.m23 - source.m21 * m13);
1477            Scalar m11m22m21m12 = (m11 * source.m22 - source.m21 * m12);
1478
1479            Scalar m20m33m30m23 = (source.m20 * source.m33 - source.m30 * source.m23);
1480            Scalar m20m32m30m22 = (source.m20 * source.m32 - source.m30 * source.m22);
1481            Scalar m10m33m30m13 = (m10 * source.m33 - source.m30 * m13);
1482
1483            Scalar m10m32m30m12 = (m10 * source.m32 - source.m30 * m12);
1484            Scalar m10m23m20m13 = (m10 * source.m23 - source.m20 * m13);
1485            Scalar m10m22m20m12 = (m10 * source.m22 - source.m20 * m12);
1486
1487            Scalar m20m31m30m21 = (source.m20 * source.m31 - source.m30 * source.m21);
1488            Scalar m10m31m30m11 = (m10 * source.m31 - source.m30 * m11);
1489            Scalar m10m21m20m11 = (m10 * source.m21 - source.m20 * m11);
1490
1491
1492            Scalar detInv = 1 /
1493            (m00 * (m11 * m22m33m32m23 - m12 * m21m33m31m23 + m13 * m21m32m31m22) -
1494            m01 * (m10 * m22m33m32m23 - m12 * m20m33m30m23 + m13 * m20m32m30m22) +
1495            m02 * (m10 * m21m33m31m23 - m11 * m20m33m30m23 + m13 * m20m31m30m21) -
1496            m03 * (m10 * m21m32m31m22 - m11 * m20m32m30m22 + m12 * m20m31m30m21));
1497
1498
1499            result.m00 = detInv * (m11 * m22m33m32m23 - m12 * m21m33m31m23 + m13 * m21m32m31m22);
1500            result.m01 = detInv * (-(m01 * m22m33m32m23 - m02 * m21m33m31m23 + m03 * m21m32m31m22));
1501            result.m02 = detInv * (m01 * m12m33m32m13 - m02 * m11m33m31m13 + m03 * m11m32m31m12);
1502            result.m03 = detInv * (-(m01 * m12m23m22m13 - m02 * m11m23m21m13 + m03 * m11m22m21m12));
1503
1504            result.m10 = detInv * (-(m10 * m22m33m32m23 - m12 * m20m33m30m23 + m13 * m20m32m30m22));
1505            result.m11 = detInv * (m00 * m22m33m32m23 - m02 * m20m33m30m23 + m03 * m20m32m30m22);
1506            result.m12 = detInv * (-(m00 * m12m33m32m13 - m02 * m10m33m30m13 + m03 * m10m32m30m12));
1507            result.m13 = detInv * (m00 * m12m23m22m13 - m02 * m10m23m20m13 + m03 * m10m22m20m12);
1508
1509            result.m20 = detInv * (m10 * m21m33m31m23 - m11 * m20m33m30m23 + m13 * m20m31m30m21);
1510            result.m21 = detInv * (-(m00 * m21m33m31m23 - m01 * m20m33m30m23 + m03 * m20m31m30m21));
1511            result.m22 = detInv * (m00 * m11m33m31m13 - m01 * m10m33m30m13 + m03 * m20m31m30m21);
1512            result.m23 = detInv * (-(m00 * m11m23m21m13 - m01 * m10m23m20m13 + m03 * m10m21m20m11));
1513
1514            result.m30 = detInv * (-(m10 * m21m32m31m22 - m11 * m20m32m30m22 + m12 * m20m31m30m21));
1515            result.m31 = detInv * (m00 * m21m32m31m22 - m01 * m20m32m30m22 + m02 * m20m31m30m21);
1516            result.m32 = detInv * (-(m00 * m11m32m31m12 - m01 * m10m32m30m12 + m02 * m10m31m30m11));
1517            result.m33 = detInv * (m00 * m11m22m21m12 - m01 * m10m22m20m12 + m02 * m10m21m20m11);
1518
1519        }
1520
1521        public static Scalar GetDeterminant(Matrix4x4 source)
1522        {
1523            Scalar result;
1524            GetDeterminant(ref source, out result);
1525            return result;
1526        }
1527        public static void GetDeterminant(ref Matrix4x4 source, out Scalar result)
1528        {
1529            Scalar m22m33m32m23 = (source.m22 * source.m33 - source.m32 * source.m23);
1530            Scalar m21m33m31m23 = (source.m21 * source.m33 - source.m31 * source.m23);
1531            Scalar m21m32m31m22 = (source.m21 * source.m32 - source.m31 * source.m22);
1532
1533            Scalar m20m33m30m23 = (source.m20 * source.m33 - source.m30 * source.m23);
1534            Scalar m20m32m30m22 = (source.m20 * source.m32 - source.m30 * source.m22);
1535            Scalar m20m31m30m21 = (source.m20 * source.m31 - source.m30 * source.m21);
1536
1537            result =
1538                source.m00 * (source.m11 * m22m33m32m23 - source.m12 * m21m33m31m23 + source.m13 * m21m32m31m22) -
1539                source.m01 * (source.m10 * m22m33m32m23 - source.m12 * m20m33m30m23 + source.m13 * m20m32m30m22) +
1540                source.m02 * (source.m10 * m21m33m31m23 - source.m11 * m20m33m30m23 + source.m13 * m20m31m30m21) -
1541                source.m03 * (source.m10 * m21m32m31m22 - source.m11 * m20m32m30m22 + source.m12 * m20m31m30m21);
1542        }
1543
1544        public static Matrix4x4 Transpose(Matrix4x4 source)
1545        {
1546            Matrix4x4 result;
1547            Transpose(ref source, out result);
1548            return result;
1549        }
1550        public static void Transpose(ref Matrix4x4 source, out Matrix4x4 result)
1551        {
1552            Scalar m01 = source.m01;
1553            Scalar m02 = source.m02;
1554            Scalar m03 = source.m03;
1555
1556            Scalar m12 = source.m12;
1557            Scalar m13 = source.m13;
1558            Scalar m23 = source.m23;
1559
1560            result.m00 = source.m00;
1561            result.m01 = source.m10;
1562            result.m02 = source.m20;
1563            result.m03 = source.m30;
1564
1565            result.m10 = m01;
1566            result.m11 = source.m11;
1567            result.m12 = source.m21;
1568            result.m13 = source.m31;
1569
1570            result.m20 = m02;
1571            result.m21 = m12;
1572            result.m22 = source.m22;
1573            result.m23 = source.m32;
1574
1575            result.m30 = m03;
1576            result.m31 = m13;
1577            result.m32 = m23;
1578            result.m33 = source.m33;
1579
1580        }
1581
1582        public static Matrix4x4 GetAdjoint(Matrix4x4 source)
1583        {
1584            Matrix4x4 result;
1585            GetAdjoint(ref source, out result);
1586            return result;
1587        }
1588        public static void GetAdjoint(ref Matrix4x4 source, out Matrix4x4 result)
1589        {
1590            Scalar m00 = source.m00;
1591            Scalar m01 = source.m01;
1592            Scalar m02 = source.m02;
1593            Scalar m03 = source.m03;
1594
1595            Scalar m10 = source.m10;
1596            Scalar m11 = source.m11;
1597            Scalar m12 = source.m12;
1598            Scalar m13 = source.m13;
1599
1600            //even further expanded to give even better performance. Generated using a keyboard and mouse
1601            Scalar m22m33m32m23 = (source.m22 * source.m33 - source.m32 * source.m23);
1602            Scalar m21m33m31m23 = (source.m21 * source.m33 - source.m31 * source.m23);
1603            Scalar m21m32m31m22 = (source.m21 * source.m32 - source.m31 * source.m22);
1604
1605            Scalar m12m33m32m13 = (m12 * source.m33 - source.m32 * m13);
1606            Scalar m11m33m31m13 = (m11 * source.m33 - source.m31 * m13);
1607            Scalar m11m32m31m12 = (m11 * source.m32 - source.m31 * m12);
1608
1609            Scalar m12m23m22m13 = (m12 * source.m23 - source.m22 * m13);
1610            Scalar m11m23m21m13 = (m11 * source.m23 - source.m21 * m13);
1611            Scalar m11m22m21m12 = (m11 * source.m22 - source.m21 * m12);
1612
1613            Scalar m20m33m30m23 = (source.m20 * source.m33 - source.m30 * source.m23);
1614            Scalar m20m32m30m22 = (source.m20 * source.m32 - source.m30 * source.m22);
1615            Scalar m10m33m30m13 = (m10 * source.m33 - source.m30 * m13);
1616
1617            Scalar m10m32m30m12 = (m10 * source.m32 - source.m30 * m12);
1618            Scalar m10m23m20m13 = (m10 * source.m23 - source.m20 * m13);
1619            Scalar m10m22m20m12 = (m10 * source.m22 - source.m20 * m12);
1620
1621            Scalar m20m31m30m21 = (source.m20 * source.m31 - source.m30 * source.m21);
1622            Scalar m10m31m30m11 = (m10 * source.m31 - source.m30 * m11);
1623            Scalar m10m21m20m11 = (m10 * source.m21 - source.m20 * m11);
1624
1625
1626
1627
1628            // note: this is an expanded version of the Ogre adjoint() method, to give better performance in C#. Generated using a script
1629
1630            result.m00 = (m11 * m22m33m32m23 - m12 * m21m33m31m23 + m13 * m21m32m31m22);
1631            result.m01 = (-(m01 * m22m33m32m23 - m02 * m21m33m31m23 + m03 * m21m32m31m22));
1632            result.m02 = (m01 * m12m33m32m13 - m02 * m11m33m31m13 + m03 * m11m32m31m12);
1633            result.m03 = (-(m01 * m12m23m22m13 - m02 * m11m23m21m13 + m03 * m11m22m21m12));
1634
1635            result.m10 = (-(m10 * m22m33m32m23 - m12 * m20m33m30m23 + m13 * m20m32m30m22));
1636            result.m11 = (m00 * m22m33m32m23 - m02 * m20m33m30m23 + m03 * m20m32m30m22);
1637            result.m12 = (-(m00 * m12m33m32m13 - m02 * m10m33m30m13 + m03 * m10m32m30m12));
1638            result.m13 = (m00 * m12m23m22m13 - m02 * m10m23m20m13 + m03 * m10m22m20m12);
1639
1640            result.m20 = (m10 * m21m33m31m23 - m11 * m20m33m30m23 + m13 * m20m31m30m21);
1641            result.m21 = (-(m00 * m21m33m31m23 - m01 * m20m33m30m23 + m03 * m20m31m30m21));
1642            result.m22 = (m00 * m11m33m31m13 - m01 * m10m33m30m13 + m03 * m20m31m30m21);
1643            result.m23 = (-(m00 * m11m23m21m13 - m01 * m10m23m20m13 + m03 * m10m21m20m11));
1644
1645            result.m30 = (-(m10 * m21m32m31m22 - m11 * m20m32m30m22 + m12 * m20m31m30m21));
1646            result.m31 = (m00 * m21m32m31m22 - m01 * m20m32m30m22 + m02 * m20m31m30m21);
1647            result.m32 = (-(m00 * m11m32m31m12 - m01 * m10m32m30m12 + m02 * m10m31m30m11));
1648            result.m33 = (m00 * m11m22m21m12 - m01 * m10m22m20m12 + m02 * m10m21m20m11);
1649
1650        }
1651
1652        public static Matrix4x4 GetCofactor(Matrix4x4 source)
1653        {
1654            Matrix4x4 result;
1655            GetCofactor(ref source, out result);
1656            return result;
1657        }
1658        public static void GetCofactor(ref Matrix4x4 source, out Matrix4x4 result)
1659        {
1660            Scalar m00 = source.m00;
1661            Scalar m01 = source.m01;
1662            Scalar m02 = source.m02;
1663            Scalar m03 = source.m03;
1664
1665            Scalar m10 = source.m10;
1666            Scalar m11 = source.m11;
1667            Scalar m12 = source.m12;
1668            Scalar m13 = source.m13;
1669
1670            //even further expanded to give even better performance. Generated using a keyboard and mouse
1671            Scalar m22m33m32m23 = (source.m22 * source.m33 - source.m32 * source.m23);
1672            Scalar m21m33m31m23 = (source.m21 * source.m33 - source.m31 * source.m23);
1673            Scalar m21m32m31m22 = (source.m21 * source.m32 - source.m31 * source.m22);
1674            Scalar m12m33m32m13 = (m12 * source.m33 - source.m32 * m13);
1675
1676            Scalar m11m33m31m13 = (m11 * source.m33 - source.m31 * m13);
1677            Scalar m11m32m31m12 = (m11 * source.m32 - source.m31 * m12);
1678            Scalar m12m23m22m13 = (m12 * source.m23 - source.m22 * m13);
1679            Scalar m11m23m21m13 = (m11 * source.m23 - source.m21 * m13);
1680
1681            Scalar m11m22m21m12 = (m11 * source.m22 - source.m21 * m12);
1682            Scalar m20m33m30m23 = (source.m20 * source.m33 - source.m30 * source.m23);
1683            Scalar m20m32m30m22 = (source.m20 * source.m32 - source.m30 * source.m22);
1684            Scalar m10m33m30m13 = (m10 * source.m33 - source.m30 * m13);
1685
1686            Scalar m10m32m30m12 = (m10 * source.m32 - source.m30 * m12);
1687            Scalar m10m23m20m13 = (m10 * source.m23 - source.m20 * m13);
1688            Scalar m10m22m20m12 = (m10 * source.m22 - source.m20 * m12);
1689            Scalar m20m31m30m21 = (source.m20 * source.m31 - source.m30 * source.m21);
1690
1691            Scalar m10m31m30m11 = (m10 * source.m31 - source.m30 * m11);
1692            Scalar m10m21m20m11 = (m10 * source.m21 - source.m20 * m11);
1693
1694
1695
1696
1697
1698            result.m00 = (-(m11 * m22m33m32m23 - m12 * m21m33m31m23 + m13 * m21m32m31m22));
1699            result.m01 = ((m01 * m22m33m32m23 - m02 * m21m33m31m23 + m03 * m21m32m31m22));
1700            result.m02 = (-(m01 * m12m33m32m13 - m02 * m11m33m31m13 + m03 * m11m32m31m12));
1701            result.m03 = ((m01 * m12m23m22m13 - m02 * m11m23m21m13 + m03 * m11m22m21m12));
1702
1703            result.m10 = ((m10 * m22m33m32m23 - m12 * m20m33m30m23 + m13 * m20m32m30m22));
1704            result.m11 = (-(m00 * m22m33m32m23 - m02 * m20m33m30m23 + m03 * m20m32m30m22));
1705            result.m12 = ((m00 * m12m33m32m13 - m02 * m10m33m30m13 + m03 * m10m32m30m12));
1706            result.m13 = (-(m00 * m12m23m22m13 - m02 * m10m23m20m13 + m03 * m10m22m20m12));
1707
1708            result.m20 = (-(m10 * m21m33m31m23 - m11 * m20m33m30m23 + m13 * m20m31m30m21));
1709            result.m21 = ((m00 * m21m33m31m23 - m01 * m20m33m30m23 + m03 * m20m31m30m21));
1710            result.m22 = (-(m00 * m11m33m31m13 - m01 * m10m33m30m13 + m03 * m20m31m30m21));
1711            result.m23 = ((m00 * m11m23m21m13 - m01 * m10m23m20m13 + m03 * m10m21m20m11));
1712
1713            result.m30 = ((m10 * m21m32m31m22 - m11 * m20m32m30m22 + m12 * m20m31m30m21));
1714            result.m31 = (-(m00 * m21m32m31m22 - m01 * m20m32m30m22 + m02 * m20m31m30m21));
1715            result.m32 = ((m00 * m11m32m31m12 - m01 * m10m32m30m12 + m02 * m10m31m30m11));
1716            result.m33 = (-(m00 * m11m22m21m12 - m01 * m10m22m20m12 + m02 * m10m21m20m11));
1717
1718        }
1719
1720
1721        [ParseMethod]
1722        public static Matrix4x4 Parse(string s)
1723        {
1724            Matrix4x4 rv = Zero;
1725            ParseHelper.ParseMatrix<Matrix4x4>(s, ref rv);
1726            return rv;
1727        }
1728#if !CompactFramework && !WindowsCE && !PocketPC && !XBOX360 && !SILVERLIGHT
1729        public static bool TryParse(string s, out Matrix4x4 result)
1730        {
1731            result = Zero;
1732            return ParseHelper.TryParseMatrix<Matrix4x4>(s, ref result);
1733        }
1734#endif
1735
1736        public static bool Equals(Matrix4x4 left, Matrix4x4 right)
1737        {
1738            return
1739                left.m00 == right.m00 && left.m01 == right.m01 && left.m02 == right.m02 && left.m03 == right.m03 &&
1740                left.m10 == right.m10 && left.m11 == right.m11 && left.m12 == right.m12 && left.m13 == right.m13 &&
1741                left.m20 == right.m20 && left.m21 == right.m21 && left.m22 == right.m22 && left.m23 == right.m23 &&
1742                left.m30 == right.m30 && left.m31 == right.m31 && left.m32 == right.m32 && left.m33 == right.m33;
1743        }
1744        [CLSCompliant(false)]
1745        public static bool Equals(ref Matrix4x4 left, ref Matrix4x4 right)
1746        {
1747            return
1748                left.m00 == right.m00 && left.m01 == right.m01 && left.m02 == right.m02 && left.m03 == right.m03 &&
1749                left.m10 == right.m10 && left.m11 == right.m11 && left.m12 == right.m12 && left.m13 == right.m13 &&
1750                left.m20 == right.m20 && left.m21 == right.m21 && left.m22 == right.m22 && left.m23 == right.m23 &&
1751                left.m30 == right.m30 && left.m31 == right.m31 && left.m32 == right.m32 && left.m33 == right.m33;
1752        }
1753        #endregion
1754        #region fields
1755
1756        [XmlIgnore]
1757        public Scalar m00, m01, m02, m03;
1758        [XmlIgnore]
1759        public Scalar m10, m11, m12, m13;
1760        [XmlIgnore]
1761        public Scalar m20, m21, m22, m23;
1762        [XmlIgnore]
1763        public Scalar m30, m31, m32, m33;
1764
1765        #endregion
1766        #region Constructors
1767
1768        public Matrix4x4(
1769            Scalar m00, Scalar m01, Scalar m02, Scalar m03,
1770            Scalar m10, Scalar m11, Scalar m12, Scalar m13,
1771            Scalar m20, Scalar m21, Scalar m22, Scalar m23,
1772            Scalar m30, Scalar m31, Scalar m32, Scalar m33)
1773        {
1774            this.m00 = m00; this.m01 = m01; this.m02 = m02; this.m03 = m03;
1775            this.m10 = m10; this.m11 = m11; this.m12 = m12; this.m13 = m13;
1776            this.m20 = m20; this.m21 = m21; this.m22 = m22; this.m23 = m23;
1777            this.m30 = m30; this.m31 = m31; this.m32 = m32; this.m33 = m33;
1778        }
1779        [InstanceConstructor("Rx,Ry,Rz,Rw")]
1780        public Matrix4x4(Vector4D xAxis, Vector4D yAxis, Vector4D zAxis, Vector4D wAxis)
1781        {
1782            m00 = xAxis.X; m01 = xAxis.Y; m02 = xAxis.Z; m03 = xAxis.W;
1783            m10 = yAxis.X; m11 = yAxis.Y; m12 = yAxis.Z; m13 = yAxis.W;
1784            m20 = zAxis.X; m21 = zAxis.Y; m22 = zAxis.Z; m23 = zAxis.W;
1785            m30 = wAxis.X; m31 = wAxis.Y; m32 = wAxis.Z; m33 = wAxis.W;
1786        }
1787        public Matrix4x4(Scalar[] values) : this(values, 0) { }
1788        public Matrix4x4(Scalar[] values, int index) { Copy(values, index, out this); }
1789        #endregion
1790        #region Properties
1791        [AdvBrowsable]
1792        [System.ComponentModel.Description("The First row of the Matrix4x4")]
1793        public Vector4D Rx
1794        {
1795            get
1796            {
1797                Vector4D value;
1798                value.X = m00;
1799                value.Y = m01;
1800                value.Z = m02;
1801                value.W = m03;
1802                return value;
1803            }
1804            set
1805            {
1806                m00 = value.X;
1807                m01 = value.Y;
1808                m02 = value.Z;
1809                m03 = value.W;
1810            }
1811        }
1812        [AdvBrowsable]
1813        [System.ComponentModel.Description("The Second row of the Matrix4x4")]
1814        public Vector4D Ry
1815        {
1816            get
1817            {
1818                Vector4D value;
1819                value.X = m10;
1820                value.Y = m11;
1821                value.Z = m12;
1822                value.W = m13;
1823                return value;
1824            }
1825            set
1826            {
1827                m10 = value.X;
1828                m11 = value.Y;
1829                m12 = value.Z;
1830                m13 = value.W;
1831            }
1832        }
1833        [AdvBrowsable]
1834        [System.ComponentModel.Description("The Third row of the Matrix4x4")]
1835        public Vector4D Rz
1836        {
1837            get
1838            {
1839                Vector4D value;
1840                value.X = m20;
1841                value.Y = m21;
1842                value.Z = m22;
1843                value.W = m23;
1844                return value;
1845            }
1846            set
1847            {
1848                m20 = value.X;
1849                m21 = value.Y;
1850                m22 = value.Z;
1851                m23 = value.W;
1852            }
1853        }
1854        [AdvBrowsable]
1855        [System.ComponentModel.Description("The Forth row of the Matrix4x4")]
1856        public Vector4D Rw
1857        {
1858            get
1859            {
1860                Vector4D value;
1861                value.X = m30;
1862                value.Y = m31;
1863                value.Z = m32;
1864                value.W = m33;
1865                return value;
1866            }
1867            set
1868            {
1869                m30 = value.X;
1870                m31 = value.Y;
1871                m32 = value.Z;
1872                m33 = value.W;
1873            }
1874        }
1875        [XmlIgnore]
1876        public Vector4D Cx
1877        {
1878            get
1879            {
1880                Vector4D rv;
1881                rv.X = m00;
1882                rv.Y = m10;
1883                rv.Z = m20;
1884                rv.W = m30;
1885                return rv;
1886            }
1887            set
1888            {
1889                this.m00 = value.X;
1890                this.m10 = value.Y;
1891                this.m20 = value.Z;
1892                this.m30 = value.W;
1893            }
1894        }
1895        [XmlIgnore]
1896        public Vector4D Cy
1897        {
1898            get
1899            {
1900                Vector4D rv;
1901                rv.X = m01;
1902                rv.Y = m11;
1903                rv.Z = m21;
1904                rv.W = m31;
1905                return rv;
1906            }
1907            set
1908            {
1909                this.m01 = value.X;
1910                this.m11 = value.Y;
1911                this.m21 = value.Z;
1912                this.m31 = value.W;
1913            }
1914        }
1915        [XmlIgnore]
1916        public Vector4D Cz
1917        {
1918            get
1919            {
1920                Vector4D rv;
1921                rv.X = m02;
1922                rv.Y = m12;
1923                rv.Z = m22;
1924                rv.W = m32;
1925                return rv;
1926            }
1927            set
1928            {
1929                this.m02 = value.X;
1930                this.m12 = value.Y;
1931                this.m22 = value.Z;
1932                this.m32 = value.W;
1933            }
1934        }
1935        [XmlIgnore]
1936        public Vector4D Cw
1937        {
1938            get
1939            {
1940                Vector4D rv;
1941                rv.X = m03;
1942                rv.Y = m13;
1943                rv.Z = m23;
1944                rv.W = m33;
1945                return rv;
1946            }
1947            set
1948            {
1949                this.m03 = value.X;
1950                this.m13 = value.Y;
1951                this.m23 = value.Z;
1952                this.m33 = value.W;
1953            }
1954        }
1955
1956
1957        /// <summary>
1958        /// Gets the determinant of this matrix.
1959        /// </summary>
1960        public Scalar Determinant
1961        {
1962            get
1963            {
1964                Scalar result;
1965                GetDeterminant(ref this, out result);
1966
1967                return result;
1968            }
1969        }
1970        /// <summary>
1971        /// Swap the rows of the matrix with the columns.
1972        /// </summary>
1973        /// <returns>A transposed Matrix.</returns>
1974        public Matrix4x4 Transposed
1975        {
1976            get
1977            {
1978                return new Matrix4x4(this.m00, this.m10, this.m20, this.m30,
1979                this.m01, this.m11, this.m21, this.m31,
1980                this.m02, this.m12, this.m22, this.m32,
1981                this.m03, this.m13, this.m23, this.m33);
1982            }
1983        }
1984        /// <summary>
1985        /// Used to generate the Cofactor of this matrix.
1986        /// </summary>
1987        /// <returns>The Cofactor matrix of the current instance.</returns>
1988        public Matrix4x4 Cofactor
1989        {
1990            get
1991            {
1992                Matrix4x4 result;
1993                GetCofactor(ref this, out result);
1994                return result;
1995            }
1996        }
1997        /// <summary>
1998        /// Used to generate the adjoint of this matrix..
1999        /// </summary>
2000        /// <returns>The adjoint matrix of the current instance.</returns>
2001        public Matrix4x4 Adjoint
2002        {
2003            get
2004            {
2005                Matrix4x4 result;
2006                GetAdjoint(ref this, out result);
2007                return result;
2008            }
2009        }
2010        /// <summary>
2011        /// written to test out a theory. a very wasteful implimentation. but works.
2012        /// </summary>
2013
2014        /// <summary>
2015        /// Returns an inverted 4d matrix.
2016        /// </summary>
2017        /// <returns></returns>
2018        public Matrix4x4 Inverted
2019        {
2020            get
2021            {
2022                Matrix4x4 result;
2023                Invert(ref this, out result);
2024                return result;
2025            }
2026        }
2027
2028
2029        int IAdvanceValueType.Count { get { return Count; } }
2030        int IMatrix.RowCount { get { return RowCount; } }
2031        int IMatrix.ColumnCount { get { return ColumnCount; } }
2032        #endregion
2033        #region Methods
2034
2035        public Vector4D GetColumn(int columnIndex)
2036        {
2037            switch (columnIndex)
2038            {
2039                case 0:
2040                    return Cx;
2041                case 1:
2042                    return Cy;
2043                case 2:
2044                    return Cz;
2045                case 3:
2046                    return Cw;
2047            }
2048            throw ThrowHelper.GetThrowIndex("columnIndex", ColumnCount);
2049        }
2050        public void SetColumn(int columnIndex, Vector4D value)
2051        {
2052
2053            switch (columnIndex)
2054            {
2055                case 0:
2056                    Cx = value;
2057                    return;
2058                case 1:
2059                    Cy = value;
2060                    return;
2061                case 2:
2062                    Cz = value;
2063                    return;
2064                case 3:
2065                    Cw = value;
2066                    return;
2067            }
2068            throw ThrowHelper.GetThrowIndex("columnIndex", ColumnCount);
2069        }
2070        public Vector4D GetRow(int rowIndex)
2071        {
2072            switch (rowIndex)
2073            {
2074                case 0:
2075                    return Rx;
2076                case 1:
2077                    return Ry;
2078                case 2:
2079                    return Rz;
2080                case 3:
2081                    return Rw;
2082            }
2083            throw ThrowHelper.GetThrowIndex("rowIndex", RowCount);
2084        }
2085        public void SetRow(int rowIndex, Vector4D value)
2086        {
2087            switch (rowIndex)
2088            {
2089                case 0:
2090                    Rx = value;
2091                    return;
2092                case 1:
2093                    Ry = value;
2094                    return;
2095                case 2:
2096                    Rz = value;
2097                    return;
2098                case 3:
2099                    Rw = value;
2100                    return;
2101            }
2102            throw ThrowHelper.GetThrowIndex("rowIndex", RowCount);
2103        }
2104
2105
2106        public Scalar[,] ToMatrixArray()
2107        {
2108            return new Scalar[RowCount, ColumnCount]
2109{
2110{ m00, m01, m02, m03 },
2111{ m10, m11, m12, m13 },
2112{ m20, m21, m22, m23 },
2113{ m30, m31, m32, m33 }
2114};
2115        }
2116        public Scalar[] ToArray()
2117        {
2118            return new Scalar[Count] { m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33 };
2119        }
2120        public Scalar[] ToTransposedArray()
2121        {
2122            return new Scalar[Count] { m00, m10, m20, m30, m01, m11, m21, m31, m02, m12, m22, m32, m03, m13, m23, m33 };
2123        }
2124
2125
2126
2127
2128        public void CopyTo(Scalar[] array, int index)
2129        {
2130            Copy(ref this, array, index);
2131        }
2132        public void CopyTransposedTo(Scalar[] array, int index)
2133        {
2134            CopyTranspose(ref this, array, index);
2135        }
2136        public void CopyFrom(Scalar[] array, int index)
2137        {
2138            Copy(array, index, out this);
2139        }
2140        public void CopyTransposedFrom(Scalar[] array, int index)
2141        {
2142            CopyTranspose(array, index, out this);
2143        }
2144
2145
2146        private string ToStringInternal(string FormatString)
2147        {
2148            return string.Format(FormatString,
2149            m00, m01, m02, m03,
2150            m10, m11, m12, m13,
2151            m20, m21, m22, m23,
2152            m30, m31, m32, m33);
2153        }
2154        public string ToString(string format)
2155        {
2156            return ToStringInternal(string.Format(FormatableString, format));
2157        }
2158        public override string ToString()
2159        {
2160            return ToStringInternal(FormatString);
2161        }
2162
2163        public override int GetHashCode()
2164        {
2165            return
2166            m00.GetHashCode() ^ m01.GetHashCode() ^ m02.GetHashCode() ^ m03.GetHashCode() ^
2167            m10.GetHashCode() ^ m11.GetHashCode() ^ m12.GetHashCode() ^ m13.GetHashCode() ^
2168            m20.GetHashCode() ^ m21.GetHashCode() ^ m22.GetHashCode() ^ m23.GetHashCode() ^
2169            m30.GetHashCode() ^ m31.GetHashCode() ^ m32.GetHashCode() ^ m33.GetHashCode();
2170        }
2171
2172        public override bool Equals(object obj)
2173        {
2174            return
2175                (obj is Matrix4x4) &&
2176                Equals((Matrix4x4)obj);
2177        }
2178        public bool Equals(Matrix4x4 other)
2179        {
2180            return Equals(ref this, ref other);
2181        }
2182
2183        #endregion
2184        #region indexers
2185#if UNSAFE
2186        /// <summary>
2187        /// Allows the Matrix to be accessed like a 2d array (i.e. matrix[2,3])
2188        /// </summary>
2189        /// <remarks>
2190        /// This indexer is only provided as a convenience, and is <b>not</b> recommended for use in
2191        /// intensive applications.
2192        /// </remarks>
2193        public Scalar this[int rowIndex, int columnIndex]
2194        {
2195            get
2196            {
2197                ThrowHelper.CheckIndex("rowIndex", rowIndex, RowCount);
2198                ThrowHelper.CheckIndex("columnIndex", columnIndex, ColumnCount);
2199                unsafe
2200                {
2201                    fixed (Scalar* pM = &m00)
2202                    {
2203                        return pM[(ColumnCount * rowIndex) + columnIndex];
2204                    }
2205                }
2206            }
2207            set
2208            {
2209                ThrowHelper.CheckIndex("rowIndex", rowIndex, RowCount);
2210                ThrowHelper.CheckIndex("columnIndex", columnIndex, ColumnCount);
2211                unsafe
2212                {
2213                    fixed (Scalar* pM = &m00)
2214                    {
2215                        pM[(ColumnCount * rowIndex) + columnIndex] = value;
2216                    }
2217                }
2218            }
2219        }
2220        /// <summary>
2221        /// Allows the Matrix to be accessed linearly (m[0] -> m[ColumnCount*RowCount-1]).
2222        /// </summary>
2223        /// <remarks>
2224        /// This indexer is only provided as a convenience, and is <b>not</b> recommended for use in
2225        /// intensive applications.
2226        /// </remarks>
2227        public Scalar this[int index]
2228        {
2229            get
2230            {
2231                ThrowHelper.CheckIndex("index", index, Count);
2232                unsafe
2233                {
2234                    fixed (Scalar* pMatrix = &this.m00)
2235                    {
2236                        return pMatrix[index];
2237                    }
2238                }
2239            }
2240            set
2241            {
2242                ThrowHelper.CheckIndex("index", index, Count);
2243                unsafe
2244                {
2245                    fixed (Scalar* pMatrix = &this.m00)
2246                    {
2247                        pMatrix[index] = value;
2248                    }
2249                }
2250            }
2251        }
2252#endif
2253        #endregion
2254        #region Operators
2255
2256        public static Matrix4x4 operator *(Matrix4x4 left, Matrix4x4 right)
2257        {
2258            Matrix4x4 result;
2259
2260            result.m00 = left.m00 * right.m00 + left.m01 * right.m10 + left.m02 * right.m20 + left.m03 * right.m30;
2261            result.m01 = left.m00 * right.m01 + left.m01 * right.m11 + left.m02 * right.m21 + left.m03 * right.m31;
2262            result.m02 = left.m00 * right.m02 + left.m01 * right.m12 + left.m02 * right.m22 + left.m03 * right.m32;
2263            result.m03 = left.m00 * right.m03 + left.m01 * right.m13 + left.m02 * right.m23 + left.m03 * right.m33;
2264
2265            result.m10 = left.m10 * right.m00 + left.m11 * right.m10 + left.m12 * right.m20 + left.m13 * right.m30;
2266            result.m11 = left.m10 * right.m01 + left.m11 * right.m11 + left.m12 * right.m21 + left.m13 * right.m31;
2267            result.m12 = left.m10 * right.m02 + left.m11 * right.m12 + left.m12 * right.m22 + left.m13 * right.m32;
2268            result.m13 = left.m10 * right.m03 + left.m11 * right.m13 + left.m12 * right.m23 + left.m13 * right.m33;
2269
2270            result.m20 = left.m20 * right.m00 + left.m21 * right.m10 + left.m22 * right.m20 + left.m23 * right.m30;
2271            result.m21 = left.m20 * right.m01 + left.m21 * right.m11 + left.m22 * right.m21 + left.m23 * right.m31;
2272            result.m22 = left.m20 * right.m02 + left.m21 * right.m12 + left.m22 * right.m22 + left.m23 * right.m32;
2273            result.m23 = left.m20 * right.m03 + left.m21 * right.m13 + left.m22 * right.m23 + left.m23 * right.m33;
2274
2275            result.m30 = left.m30 * right.m00 + left.m31 * right.m10 + left.m32 * right.m20 + left.m33 * right.m30;
2276            result.m31 = left.m30 * right.m01 + left.m31 * right.m11 + left.m32 * right.m21 + left.m33 * right.m31;
2277            result.m32 = left.m30 * right.m02 + left.m31 * right.m12 + left.m32 * right.m22 + left.m33 * right.m32;
2278            result.m33 = left.m30 * right.m03 + left.m31 * right.m13 + left.m32 * right.m23 + left.m33 * right.m33;
2279
2280            return result;
2281        }
2282
2283        public static Matrix4x4 operator *(Matrix4x4 left, Scalar scalar)
2284        {
2285            Matrix4x4 result;
2286
2287            result.m00 = left.m00 * scalar;
2288            result.m01 = left.m01 * scalar;
2289            result.m02 = left.m02 * scalar;
2290            result.m03 = left.m03 * scalar;
2291
2292            result.m10 = left.m10 * scalar;
2293            result.m11 = left.m11 * scalar;
2294            result.m12 = left.m12 * scalar;
2295            result.m13 = left.m13 * scalar;
2296
2297            result.m20 = left.m20 * scalar;
2298            result.m21 = left.m21 * scalar;
2299            result.m22 = left.m22 * scalar;
2300            result.m23 = left.m23 * scalar;
2301
2302            result.m30 = left.m30 * scalar;
2303            result.m31 = left.m31 * scalar;
2304            result.m32 = left.m32 * scalar;
2305            result.m33 = left.m33 * scalar;
2306
2307            return result;
2308        }
2309
2310        public static Matrix4x4 operator *(Matrix4x4 left, Matrix3x3 right)
2311        {
2312            Matrix4x4 result;
2313
2314            result.m00 = left.m00 * right.m00 + left.m01 * right.m10 + left.m02 * right.m20;
2315            result.m01 = left.m00 * right.m01 + left.m01 * right.m11 + left.m02 * right.m21;
2316            result.m02 = left.m00 * right.m02 + left.m01 * right.m12 + left.m02 * right.m22;
2317            result.m03 = left.m03;
2318
2319            result.m10 = left.m10 * right.m00 + left.m11 * right.m10 + left.m12 * right.m20;
2320            result.m11 = left.m10 * right.m01 + left.m11 * right.m11 + left.m12 * right.m21;
2321            result.m12 = left.m10 * right.m02 + left.m11 * right.m12 + left.m12 * right.m22;
2322            result.m13 = left.m13;
2323
2324            result.m20 = left.m20 * right.m00 + left.m21 * right.m10 + left.m22 * right.m20;
2325            result.m21 = left.m20 * right.m01 + left.m21 * right.m11 + left.m22 * right.m21;
2326            result.m22 = left.m20 * right.m02 + left.m21 * right.m12 + left.m22 * right.m22;
2327            result.m23 = left.m23;
2328
2329            result.m30 = left.m30 * right.m00 + left.m31 * right.m10 + left.m32 * right.m20;
2330            result.m31 = left.m30 * right.m01 + left.m31 * right.m11 + left.m32 * right.m21;
2331            result.m32 = left.m30 * right.m02 + left.m31 * right.m12 + left.m32 * right.m22;
2332            result.m33 = left.m33;
2333
2334            return result;
2335        }
2336
2337        public static Matrix4x4 operator *(Matrix3x3 left, Matrix4x4 right)
2338        {
2339            Matrix4x4 result;
2340
2341            result.m00 = left.m00 * right.m00 + left.m01 * right.m10 + left.m02 * right.m20;
2342            result.m01 = left.m00 * right.m01 + left.m01 * right.m11 + left.m02 * right.m21;
2343            result.m02 = left.m00 * right.m02 + left.m01 * right.m12 + left.m02 * right.m22;
2344            result.m03 = left.m00 * right.m03 + left.m01 * right.m13 + left.m02 * right.m23;
2345
2346            result.m10 = left.m10 * right.m00 + left.m11 * right.m10 + left.m12 * right.m20;
2347            result.m11 = left.m10 * right.m01 + left.m11 * right.m11 + left.m12 * right.m21;
2348            result.m12 = left.m10 * right.m02 + left.m11 * right.m12 + left.m12 * right.m22;
2349            result.m13 = left.m10 * right.m03 + left.m11 * right.m13 + left.m12 * right.m23;
2350
2351            result.m20 = left.m20 * right.m00 + left.m21 * right.m10 + left.m22 * right.m20;
2352            result.m21 = left.m20 * right.m01 + left.m21 * right.m11 + left.m22 * right.m21;
2353            result.m22 = left.m20 * right.m02 + left.m21 * right.m12 + left.m22 * right.m22;
2354            result.m23 = left.m20 * right.m03 + left.m21 * right.m13 + left.m22 * right.m23;
2355
2356            result.m30 = right.m30;
2357            result.m31 = right.m31;
2358            result.m32 = right.m32;
2359            result.m33 = right.m33;
2360
2361            return result;
2362        }
2363
2364        public static Matrix4x4 operator *(Matrix4x4 left, Matrix2x3 right)
2365        {
2366            Matrix4x4 result;
2367
2368            result.m00 = left.m00 * right.m00 + left.m01 * right.m10;
2369            result.m01 = left.m00 * right.m01 + left.m01 * right.m11;
2370            result.m02 = left.m00 * right.m02 + left.m01 * right.m12 + left.m02;
2371            result.m03 = left.m03;
2372
2373            result.m10 = left.m10 * right.m00 + left.m11 * right.m10;
2374            result.m11 = left.m10 * right.m01 + left.m11 * right.m11;
2375            result.m12 = left.m10 * right.m02 + left.m11 * right.m12 + left.m12;
2376            result.m13 = left.m13;
2377
2378            result.m20 = left.m20 * right.m00 + left.m21 * right.m10;
2379            result.m21 = left.m20 * right.m01 + left.m21 * right.m11;
2380            result.m22 = left.m20 * right.m02 + left.m21 * right.m12 + left.m22;
2381            result.m23 = left.m23;
2382
2383            result.m30 = left.m30 * right.m00 + left.m31 * right.m10;
2384            result.m31 = left.m30 * right.m01 + left.m31 * right.m11;
2385            result.m32 = left.m30 * right.m02 + left.m31 * right.m12 + left.m32;
2386            result.m33 = left.m33;
2387
2388            return result;
2389        }
2390
2391        public static Matrix4x4 operator *(Matrix2x3 left, Matrix4x4 right)
2392        {
2393            Matrix4x4 result;
2394
2395            result.m00 = left.m00 * right.m00 + left.m01 * right.m10 + left.m02 * right.m20;
2396            result.m01 = left.m00 * right.m01 + left.m01 * right.m11 + left.m02 * right.m21;
2397            result.m02 = left.m00 * right.m02 + left.m01 * right.m12 + left.m02 * right.m22;
2398            result.m03 = left.m00 * right.m03 + left.m01 * right.m13 + left.m02 * right.m23;
2399
2400            result.m10 = left.m10 * right.m00 + left.m11 * right.m10 + left.m12 * right.m20;
2401            result.m11 = left.m10 * right.m01 + left.m11 * right.m11 + left.m12 * right.m21;
2402            result.m12 = left.m10 * right.m02 + left.m11 * right.m12 + left.m12 * right.m22;
2403            result.m13 = left.m10 * right.m03 + left.m11 * right.m13 + left.m12 * right.m23;
2404
2405            result.m20 = right.m20;
2406            result.m21 = right.m21;
2407            result.m22 = right.m22;
2408            result.m23 = right.m23;
2409
2410            result.m30 = right.m30;
2411            result.m31 = right.m31;
2412            result.m32 = right.m32;
2413            result.m33 = right.m33;
2414
2415            return result;
2416        }
2417
2418        public static Matrix4x4 operator *(Matrix4x4 left, Matrix2x2 right)
2419        {
2420            Matrix4x4 result;
2421
2422            result.m00 = left.m00 * right.m00 + left.m01 * right.m10;
2423            result.m01 = left.m00 * right.m01 + left.m01 * right.m11;
2424            result.m02 = left.m02;
2425            result.m03 = left.m03;
2426
2427            result.m10 = left.m10 * right.m00 + left.m11 * right.m10;
2428            result.m11 = left.m10 * right.m01 + left.m11 * right.m11;
2429            result.m12 = left.m12;
2430            result.m13 = left.m13;
2431
2432            result.m20 = left.m20 * right.m00 + left.m21 * right.m10;
2433            result.m21 = left.m20 * right.m01 + left.m21 * right.m11;
2434            result.m22 = left.m22;
2435            result.m23 = left.m23;
2436
2437            result.m30 = left.m30 * right.m00 + left.m31 * right.m10;
2438            result.m31 = left.m30 * right.m01 + left.m31 * right.m11;
2439            result.m32 = left.m32;
2440            result.m33 = left.m33;
2441
2442            return result;
2443        }
2444
2445        public static Matrix4x4 operator *(Matrix2x2 left, Matrix4x4 right)
2446        {
2447            Matrix4x4 result;
2448
2449            result.m00 = left.m00 * right.m00 + left.m01 * right.m10;
2450            result.m01 = left.m00 * right.m01 + left.m01 * right.m11;
2451            result.m02 = left.m00 * right.m02 + left.m01 * right.m12;
2452            result.m03 = left.m00 * right.m03 + left.m01 * right.m13;
2453
2454            result.m10 = left.m10 * right.m00 + left.m11 * right.m10;
2455            result.m11 = left.m10 * right.m01 + left.m11 * right.m11;
2456            result.m12 = left.m10 * right.m02 + left.m11 * right.m12;
2457            result.m13 = left.m10 * right.m03 + left.m11 * right.m13;
2458
2459            result.m20 = right.m20;
2460            result.m21 = right.m21;
2461            result.m22 = right.m22;
2462            result.m23 = right.m23;
2463
2464            result.m30 = right.m30;
2465            result.m31 = right.m31;
2466            result.m32 = right.m32;
2467            result.m33 = right.m33;
2468
2469            return result;
2470        }
2471
2472        public static Matrix4x4 operator +(Matrix4x4 left, Matrix4x4 right)
2473        {
2474            Matrix4x4 result;
2475
2476            result.m00 = left.m00 + right.m00;
2477            result.m01 = left.m01 + right.m01;
2478            result.m02 = left.m02 + right.m02;
2479            result.m03 = left.m03 + right.m03;
2480
2481            result.m10 = left.m10 + right.m10;
2482            result.m11 = left.m11 + right.m11;
2483            result.m12 = left.m12 + right.m12;
2484            result.m13 = left.m13 + right.m13;
2485
2486            result.m20 = left.m20 + right.m20;
2487            result.m21 = left.m21 + right.m21;
2488            result.m22 = left.m22 + right.m22;
2489            result.m23 = left.m23 + right.m23;
2490
2491            result.m30 = left.m30 + right.m30;
2492            result.m31 = left.m31 + right.m31;
2493            result.m32 = left.m32 + right.m32;
2494            result.m33 = left.m33 + right.m33;
2495
2496            return result;
2497        }
2498        public static Matrix4x4 operator +(Matrix3x3 left, Matrix4x4 right)
2499        {
2500            Matrix4x4 result;
2501            Add(ref left, ref right, out result);
2502            return result;
2503        }
2504        public static Matrix4x4 operator +(Matrix4x4 left, Matrix3x3 right)
2505        {
2506            Matrix4x4 result;
2507            Add(ref left, ref right, out result);
2508            return result;
2509        }
2510        public static Matrix4x4 operator +(Matrix2x3 left, Matrix4x4 right)
2511        {
2512            Matrix4x4 result;
2513            Add(ref left, ref right, out result);
2514            return result;
2515        }
2516        public static Matrix4x4 operator +(Matrix4x4 left, Matrix2x3 right)
2517        {
2518            Matrix4x4 result;
2519            Add(ref left, ref right, out result);
2520            return result;
2521        }
2522        public static Matrix4x4 operator +(Matrix2x2 left, Matrix4x4 right)
2523        {
2524            Matrix4x4 result;
2525            Add(ref left, ref right, out result);
2526            return result;
2527        }
2528        public static Matrix4x4 operator +(Matrix4x4 left, Matrix2x2 right)
2529        {
2530            Matrix4x4 result;
2531            Add(ref left, ref right, out result);
2532            return result;
2533        }
2534
2535        public static Matrix4x4 operator -(Matrix4x4 left, Matrix4x4 right)
2536        {
2537            Matrix4x4 result;
2538
2539            result.m00 = left.m00 - right.m00;
2540            result.m01 = left.m01 - right.m01;
2541            result.m02 = left.m02 - right.m02;
2542            result.m03 = left.m03 - right.m03;
2543
2544            result.m10 = left.m10 - right.m10;
2545            result.m11 = left.m11 - right.m11;
2546            result.m12 = left.m12 - right.m12;
2547            result.m13 = left.m13 - right.m13;
2548
2549            result.m20 = left.m20 - right.m20;
2550            result.m21 = left.m21 - right.m21;
2551            result.m22 = left.m22 - right.m22;
2552            result.m23 = left.m23 - right.m23;
2553
2554            result.m30 = left.m30 - right.m30;
2555            result.m31 = left.m31 - right.m31;
2556            result.m32 = left.m32 - right.m32;
2557            result.m33 = left.m33 - right.m33;
2558
2559            return result;
2560        }
2561        public static Matrix4x4 operator -(Matrix3x3 left, Matrix4x4 right)
2562        {
2563            Matrix4x4 result;
2564            Subtract(ref left, ref right, out result);
2565            return result;
2566        }
2567        public static Matrix4x4 operator -(Matrix4x4 left, Matrix3x3 right)
2568        {
2569            Matrix4x4 result;
2570            Subtract(ref left, ref right, out result);
2571            return result;
2572        }
2573        public static Matrix4x4 operator -(Matrix2x3 left, Matrix4x4 right)
2574        {
2575            Matrix4x4 result;
2576            Subtract(ref left, ref right, out result);
2577            return result;
2578        }
2579        public static Matrix4x4 operator -(Matrix4x4 left, Matrix2x3 right)
2580        {
2581            Matrix4x4 result;
2582            Subtract(ref left, ref right, out result);
2583            return result;
2584        }
2585        public static Matrix4x4 operator -(Matrix2x2 left, Matrix4x4 right)
2586        {
2587            Matrix4x4 result;
2588            Subtract(ref left, ref right, out result);
2589            return result;
2590        }
2591        public static Matrix4x4 operator -(Matrix4x4 left, Matrix2x2 right)
2592        {
2593            Matrix4x4 result;
2594            Subtract(ref left, ref right, out result);
2595            return result;
2596        }
2597
2598
2599        public static Matrix4x4 operator -(Matrix4x4 source)
2600        {
2601            Matrix4x4 result;
2602
2603            result.m00 = -source.m00;
2604            result.m01 = -source.m01;
2605            result.m02 = -source.m02;
2606            result.m03 = -source.m03;
2607
2608            result.m10 = -source.m10;
2609            result.m11 = -source.m11;
2610            result.m12 = -source.m12;
2611            result.m13 = -source.m13;
2612
2613            result.m20 = -source.m20;
2614            result.m21 = -source.m21;
2615            result.m22 = -source.m22;
2616            result.m23 = -source.m23;
2617
2618            result.m30 = -source.m30;
2619            result.m31 = -source.m31;
2620            result.m32 = -source.m32;
2621            result.m33 = -source.m33;
2622
2623            return result;
2624        }
2625
2626        public static bool operator ==(Matrix4x4 left, Matrix4x4 right)
2627        {
2628            return
2629                left.m00 == right.m00 && left.m01 == right.m01 && left.m02 == right.m02 && left.m03 == right.m03 &&
2630                left.m10 == right.m10 && left.m11 == right.m11 && left.m12 == right.m12 && left.m13 == right.m13 &&
2631                left.m20 == right.m20 && left.m21 == right.m21 && left.m22 == right.m22 && left.m23 == right.m23 &&
2632                left.m30 == right.m30 && left.m31 == right.m31 && left.m32 == right.m32 && left.m33 == right.m33;
2633        }
2634
2635        public static bool operator !=(Matrix4x4 left, Matrix4x4 right)
2636        {
2637            return !(left == right);
2638        }
2639
2640        public static explicit operator Matrix4x4(Matrix3x3 source)
2641        {
2642            Matrix4x4 result;
2643
2644            result.m00 = source.m00;
2645            result.m01 = source.m01;
2646            result.m02 = source.m02;
2647            result.m03 = 0;
2648
2649            result.m10 = source.m10;
2650            result.m11 = source.m11;
2651            result.m12 = source.m12;
2652            result.m13 = 0;
2653
2654            result.m20 = source.m20;
2655            result.m21 = source.m21;
2656            result.m22 = source.m22;
2657            result.m23 = 0;
2658
2659            result.m30 = 0;
2660            result.m31 = 0;
2661            result.m32 = 0;
2662            result.m33 = 1;
2663
2664            return result;
2665        }
2666        public static explicit operator Matrix4x4(Matrix2x2 source)
2667        {
2668            Matrix4x4 result;
2669
2670            result.m00 = source.m00;
2671            result.m01 = source.m01;
2672            result.m02 = 0;
2673            result.m03 = 0;
2674
2675            result.m10 = source.m10;
2676            result.m11 = source.m11;
2677            result.m12 = 0;
2678            result.m13 = 0;
2679
2680            result.m20 = 0;
2681            result.m21 = 0;
2682            result.m22 = 1;
2683            result.m23 = 0;
2684
2685            result.m30 = 0;
2686            result.m31 = 0;
2687            result.m32 = 0;
2688            result.m33 = 1;
2689
2690            return result;
2691        }
2692        #endregion
2693    }
2694}
Note: See TracBrowser for help on using the repository browser.