Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
Matrix.cs
Go to the documentation of this file.
1using System;
5using Microsoft.Xna.Framework.Design;
6
8
10[TypeConverter(typeof(MatrixConverter))]
11public struct Matrix : IEquatable<Matrix>
12{
13 private struct CanonicalBasis
14 {
15 public Vector3 Row0;
16
17 public Vector3 Row1;
18
19 public Vector3 Row2;
20 }
21
22 private struct VectorBasis
23 {
24 public unsafe Vector3* Element0;
25
26 public unsafe Vector3* Element1;
27
28 public unsafe Vector3* Element2;
29 }
30
31 [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields")]
32 public float M11;
33
34 [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields")]
35 public float M12;
36
37 [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields")]
38 public float M13;
39
40 [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields")]
41 public float M14;
42
43 [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields")]
44 public float M21;
45
46 [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields")]
47 public float M22;
48
49 [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields")]
50 public float M23;
51
52 [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields")]
53 public float M24;
54
55 [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields")]
56 public float M31;
57
58 [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields")]
59 public float M32;
60
61 [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields")]
62 public float M33;
63
64 [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields")]
65 public float M34;
66
67 [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields")]
68 public float M41;
69
70 [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields")]
71 public float M42;
72
73 [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields")]
74 public float M43;
75
76 [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields")]
77 public float M44;
78
79 private static Matrix _identity = new Matrix(1f, 0f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 0f, 1f);
80
81 public static Matrix Identity => _identity;
82
83 public Vector3 Up
84 {
85 get
86 {
87 Vector3 result = default(Vector3);
88 result.X = M21;
89 result.Y = M22;
90 result.Z = M23;
91 return result;
92 }
93 set
94 {
95 M21 = value.X;
96 M22 = value.Y;
97 M23 = value.Z;
98 }
99 }
100
102 {
103 get
104 {
105 Vector3 result = default(Vector3);
106 result.X = 0f - M21;
107 result.Y = 0f - M22;
108 result.Z = 0f - M23;
109 return result;
110 }
111 set
112 {
113 M21 = 0f - value.X;
114 M22 = 0f - value.Y;
115 M23 = 0f - value.Z;
116 }
117 }
118
120 {
121 get
122 {
123 Vector3 result = default(Vector3);
124 result.X = M11;
125 result.Y = M12;
126 result.Z = M13;
127 return result;
128 }
129 set
130 {
131 M11 = value.X;
132 M12 = value.Y;
133 M13 = value.Z;
134 }
135 }
136
138 {
139 get
140 {
141 Vector3 result = default(Vector3);
142 result.X = 0f - M11;
143 result.Y = 0f - M12;
144 result.Z = 0f - M13;
145 return result;
146 }
147 set
148 {
149 M11 = 0f - value.X;
150 M12 = 0f - value.Y;
151 M13 = 0f - value.Z;
152 }
153 }
154
156 {
157 get
158 {
159 Vector3 result = default(Vector3);
160 result.X = 0f - M31;
161 result.Y = 0f - M32;
162 result.Z = 0f - M33;
163 return result;
164 }
165 set
166 {
167 M31 = 0f - value.X;
168 M32 = 0f - value.Y;
169 M33 = 0f - value.Z;
170 }
171 }
172
174 {
175 get
176 {
177 Vector3 result = default(Vector3);
178 result.X = M31;
179 result.Y = M32;
180 result.Z = M33;
181 return result;
182 }
183 set
184 {
185 M31 = value.X;
186 M32 = value.Y;
187 M33 = value.Z;
188 }
189 }
190
192 {
193 get
194 {
195 Vector3 result = default(Vector3);
196 result.X = M41;
197 result.Y = M42;
198 result.Z = M43;
199 return result;
200 }
201 set
202 {
203 M41 = value.X;
204 M42 = value.Y;
205 M43 = value.Z;
206 }
207 }
208
209 [SuppressMessage("Microsoft.Design", "CA1025")]
210 public Matrix(float m11, float m12, float m13, float m14, float m21, float m22, float m23, float m24, float m31, float m32, float m33, float m34, float m41, float m42, float m43, float m44)
211 {
212 M11 = m11;
213 M12 = m12;
214 M13 = m13;
215 M14 = m14;
216 M21 = m21;
217 M22 = m22;
218 M23 = m23;
219 M24 = m24;
220 M31 = m31;
221 M32 = m32;
222 M33 = m33;
223 M34 = m34;
224 M41 = m41;
225 M42 = m42;
226 M43 = m43;
227 M44 = m44;
228 }
229
230 public static Matrix CreateBillboard(Vector3 objectPosition, Vector3 cameraPosition, Vector3 cameraUpVector, Vector3? cameraForwardVector)
231 {
232 Vector3 value = default(Vector3);
233 value.X = objectPosition.X - cameraPosition.X;
234 value.Y = objectPosition.Y - cameraPosition.Y;
235 value.Z = objectPosition.Z - cameraPosition.Z;
236 float num = value.LengthSquared();
237 if (num < 0.0001f)
238 {
239 value = (cameraForwardVector.HasValue ? (-cameraForwardVector.Value) : Vector3.Forward);
240 }
241 else
242 {
243 Vector3.Multiply(ref value, 1f / (float)Math.Sqrt(num), out value);
244 }
245 Vector3.Cross(ref cameraUpVector, ref value, out var result);
246 result.Normalize();
247 Vector3.Cross(ref value, ref result, out var result2);
248 Matrix result3 = default(Matrix);
249 result3.M11 = result.X;
250 result3.M12 = result.Y;
251 result3.M13 = result.Z;
252 result3.M14 = 0f;
253 result3.M21 = result2.X;
254 result3.M22 = result2.Y;
255 result3.M23 = result2.Z;
256 result3.M24 = 0f;
257 result3.M31 = value.X;
258 result3.M32 = value.Y;
259 result3.M33 = value.Z;
260 result3.M34 = 0f;
261 result3.M41 = objectPosition.X;
262 result3.M42 = objectPosition.Y;
263 result3.M43 = objectPosition.Z;
264 result3.M44 = 1f;
265 return result3;
266 }
267
268 public static void CreateBillboard(ref Vector3 objectPosition, ref Vector3 cameraPosition, ref Vector3 cameraUpVector, Vector3? cameraForwardVector, out Matrix result)
269 {
270 Vector3 value = default(Vector3);
271 value.X = objectPosition.X - cameraPosition.X;
272 value.Y = objectPosition.Y - cameraPosition.Y;
273 value.Z = objectPosition.Z - cameraPosition.Z;
274 float num = value.LengthSquared();
275 if (num < 0.0001f)
276 {
277 value = (cameraForwardVector.HasValue ? (-cameraForwardVector.Value) : Vector3.Forward);
278 }
279 else
280 {
281 Vector3.Multiply(ref value, 1f / (float)Math.Sqrt(num), out value);
282 }
283 Vector3.Cross(ref cameraUpVector, ref value, out var result2);
284 result2.Normalize();
285 Vector3.Cross(ref value, ref result2, out var result3);
286 result.M11 = result2.X;
287 result.M12 = result2.Y;
288 result.M13 = result2.Z;
289 result.M14 = 0f;
290 result.M21 = result3.X;
291 result.M22 = result3.Y;
292 result.M23 = result3.Z;
293 result.M24 = 0f;
294 result.M31 = value.X;
295 result.M32 = value.Y;
296 result.M33 = value.Z;
297 result.M34 = 0f;
298 result.M41 = objectPosition.X;
299 result.M42 = objectPosition.Y;
300 result.M43 = objectPosition.Z;
301 result.M44 = 1f;
302 }
303
304 public static Matrix CreateConstrainedBillboard(Vector3 objectPosition, Vector3 cameraPosition, Vector3 rotateAxis, Vector3? cameraForwardVector, Vector3? objectForwardVector)
305 {
306 Vector3 value = default(Vector3);
307 value.X = objectPosition.X - cameraPosition.X;
308 value.Y = objectPosition.Y - cameraPosition.Y;
309 value.Z = objectPosition.Z - cameraPosition.Z;
310 float num = value.LengthSquared();
311 if (num < 0.0001f)
312 {
313 value = (cameraForwardVector.HasValue ? (-cameraForwardVector.Value) : Vector3.Forward);
314 }
315 else
316 {
317 Vector3.Multiply(ref value, 1f / (float)Math.Sqrt(num), out value);
318 }
319 Vector3 vector = rotateAxis;
320 Vector3.Dot(ref rotateAxis, ref value, out var result);
321 Vector3 result2;
322 Vector3 result3;
323 if (Math.Abs(result) > 0.99825466f)
324 {
325 if (objectForwardVector.HasValue)
326 {
327 result2 = objectForwardVector.Value;
328 Vector3.Dot(ref rotateAxis, ref result2, out result);
329 if (Math.Abs(result) > 0.99825466f)
330 {
331 result = rotateAxis.X * Vector3.Forward.X + rotateAxis.Y * Vector3.Forward.Y + rotateAxis.Z * Vector3.Forward.Z;
332 result2 = ((Math.Abs(result) > 0.99825466f) ? Vector3.Right : Vector3.Forward);
333 }
334 }
335 else
336 {
337 result = rotateAxis.X * Vector3.Forward.X + rotateAxis.Y * Vector3.Forward.Y + rotateAxis.Z * Vector3.Forward.Z;
338 result2 = ((Math.Abs(result) > 0.99825466f) ? Vector3.Right : Vector3.Forward);
339 }
340 Vector3.Cross(ref rotateAxis, ref result2, out result3);
341 result3.Normalize();
342 Vector3.Cross(ref result3, ref rotateAxis, out result2);
343 result2.Normalize();
344 }
345 else
346 {
347 Vector3.Cross(ref rotateAxis, ref value, out result3);
348 result3.Normalize();
349 Vector3.Cross(ref result3, ref vector, out result2);
350 result2.Normalize();
351 }
352 Matrix result4 = default(Matrix);
353 result4.M11 = result3.X;
354 result4.M12 = result3.Y;
355 result4.M13 = result3.Z;
356 result4.M14 = 0f;
357 result4.M21 = vector.X;
358 result4.M22 = vector.Y;
359 result4.M23 = vector.Z;
360 result4.M24 = 0f;
361 result4.M31 = result2.X;
362 result4.M32 = result2.Y;
363 result4.M33 = result2.Z;
364 result4.M34 = 0f;
365 result4.M41 = objectPosition.X;
366 result4.M42 = objectPosition.Y;
367 result4.M43 = objectPosition.Z;
368 result4.M44 = 1f;
369 return result4;
370 }
371
372 public static void CreateConstrainedBillboard(ref Vector3 objectPosition, ref Vector3 cameraPosition, ref Vector3 rotateAxis, Vector3? cameraForwardVector, Vector3? objectForwardVector, out Matrix result)
373 {
374 Vector3 value = default(Vector3);
375 value.X = objectPosition.X - cameraPosition.X;
376 value.Y = objectPosition.Y - cameraPosition.Y;
377 value.Z = objectPosition.Z - cameraPosition.Z;
378 float num = value.LengthSquared();
379 if (num < 0.0001f)
380 {
381 value = (cameraForwardVector.HasValue ? (-cameraForwardVector.Value) : Vector3.Forward);
382 }
383 else
384 {
385 Vector3.Multiply(ref value, 1f / (float)Math.Sqrt(num), out value);
386 }
387 Vector3 vector = rotateAxis;
388 Vector3.Dot(ref rotateAxis, ref value, out var result2);
389 Vector3 result3;
390 Vector3 result4;
391 if (Math.Abs(result2) > 0.99825466f)
392 {
393 if (objectForwardVector.HasValue)
394 {
395 result3 = objectForwardVector.Value;
396 Vector3.Dot(ref rotateAxis, ref result3, out result2);
397 if (Math.Abs(result2) > 0.99825466f)
398 {
399 result2 = rotateAxis.X * Vector3.Forward.X + rotateAxis.Y * Vector3.Forward.Y + rotateAxis.Z * Vector3.Forward.Z;
400 result3 = ((Math.Abs(result2) > 0.99825466f) ? Vector3.Right : Vector3.Forward);
401 }
402 }
403 else
404 {
405 result2 = rotateAxis.X * Vector3.Forward.X + rotateAxis.Y * Vector3.Forward.Y + rotateAxis.Z * Vector3.Forward.Z;
406 result3 = ((Math.Abs(result2) > 0.99825466f) ? Vector3.Right : Vector3.Forward);
407 }
408 Vector3.Cross(ref rotateAxis, ref result3, out result4);
409 result4.Normalize();
410 Vector3.Cross(ref result4, ref rotateAxis, out result3);
411 result3.Normalize();
412 }
413 else
414 {
415 Vector3.Cross(ref rotateAxis, ref value, out result4);
416 result4.Normalize();
417 Vector3.Cross(ref result4, ref vector, out result3);
418 result3.Normalize();
419 }
420 result.M11 = result4.X;
421 result.M12 = result4.Y;
422 result.M13 = result4.Z;
423 result.M14 = 0f;
424 result.M21 = vector.X;
425 result.M22 = vector.Y;
426 result.M23 = vector.Z;
427 result.M24 = 0f;
428 result.M31 = result3.X;
429 result.M32 = result3.Y;
430 result.M33 = result3.Z;
431 result.M34 = 0f;
432 result.M41 = objectPosition.X;
433 result.M42 = objectPosition.Y;
434 result.M43 = objectPosition.Z;
435 result.M44 = 1f;
436 }
437
438 public static Matrix CreateTranslation(Vector3 position)
439 {
440 Matrix result = default(Matrix);
441 result.M11 = 1f;
442 result.M12 = 0f;
443 result.M13 = 0f;
444 result.M14 = 0f;
445 result.M21 = 0f;
446 result.M22 = 1f;
447 result.M23 = 0f;
448 result.M24 = 0f;
449 result.M31 = 0f;
450 result.M32 = 0f;
451 result.M33 = 1f;
452 result.M34 = 0f;
453 result.M41 = position.X;
454 result.M42 = position.Y;
455 result.M43 = position.Z;
456 result.M44 = 1f;
457 return result;
458 }
459
460 public static void CreateTranslation(ref Vector3 position, out Matrix result)
461 {
462 result.M11 = 1f;
463 result.M12 = 0f;
464 result.M13 = 0f;
465 result.M14 = 0f;
466 result.M21 = 0f;
467 result.M22 = 1f;
468 result.M23 = 0f;
469 result.M24 = 0f;
470 result.M31 = 0f;
471 result.M32 = 0f;
472 result.M33 = 1f;
473 result.M34 = 0f;
474 result.M41 = position.X;
475 result.M42 = position.Y;
476 result.M43 = position.Z;
477 result.M44 = 1f;
478 }
479
480 public static Matrix CreateTranslation(float xPosition, float yPosition, float zPosition)
481 {
482 Matrix result = default(Matrix);
483 result.M11 = 1f;
484 result.M12 = 0f;
485 result.M13 = 0f;
486 result.M14 = 0f;
487 result.M21 = 0f;
488 result.M22 = 1f;
489 result.M23 = 0f;
490 result.M24 = 0f;
491 result.M31 = 0f;
492 result.M32 = 0f;
493 result.M33 = 1f;
494 result.M34 = 0f;
495 result.M41 = xPosition;
496 result.M42 = yPosition;
497 result.M43 = zPosition;
498 result.M44 = 1f;
499 return result;
500 }
501
502 public static void CreateTranslation(float xPosition, float yPosition, float zPosition, out Matrix result)
503 {
504 result.M11 = 1f;
505 result.M12 = 0f;
506 result.M13 = 0f;
507 result.M14 = 0f;
508 result.M21 = 0f;
509 result.M22 = 1f;
510 result.M23 = 0f;
511 result.M24 = 0f;
512 result.M31 = 0f;
513 result.M32 = 0f;
514 result.M33 = 1f;
515 result.M34 = 0f;
516 result.M41 = xPosition;
517 result.M42 = yPosition;
518 result.M43 = zPosition;
519 result.M44 = 1f;
520 }
521
522 public static Matrix CreateScale(float xScale, float yScale, float zScale)
523 {
524 Matrix result = default(Matrix);
525 result.M11 = xScale;
526 result.M12 = 0f;
527 result.M13 = 0f;
528 result.M14 = 0f;
529 result.M21 = 0f;
530 result.M22 = yScale;
531 result.M23 = 0f;
532 result.M24 = 0f;
533 result.M31 = 0f;
534 result.M32 = 0f;
535 result.M33 = zScale;
536 result.M34 = 0f;
537 result.M41 = 0f;
538 result.M42 = 0f;
539 result.M43 = 0f;
540 result.M44 = 1f;
541 return result;
542 }
543
544 public static void CreateScale(float xScale, float yScale, float zScale, out Matrix result)
545 {
546 result.M11 = xScale;
547 result.M12 = 0f;
548 result.M13 = 0f;
549 result.M14 = 0f;
550 result.M21 = 0f;
551 result.M22 = yScale;
552 result.M23 = 0f;
553 result.M24 = 0f;
554 result.M31 = 0f;
555 result.M32 = 0f;
556 result.M33 = zScale;
557 result.M34 = 0f;
558 result.M41 = 0f;
559 result.M42 = 0f;
560 result.M43 = 0f;
561 result.M44 = 1f;
562 }
563
564 public static Matrix CreateScale(Vector3 scales)
565 {
566 float x = scales.X;
567 float y = scales.Y;
568 float z = scales.Z;
569 Matrix result = default(Matrix);
570 result.M11 = x;
571 result.M12 = 0f;
572 result.M13 = 0f;
573 result.M14 = 0f;
574 result.M21 = 0f;
575 result.M22 = y;
576 result.M23 = 0f;
577 result.M24 = 0f;
578 result.M31 = 0f;
579 result.M32 = 0f;
580 result.M33 = z;
581 result.M34 = 0f;
582 result.M41 = 0f;
583 result.M42 = 0f;
584 result.M43 = 0f;
585 result.M44 = 1f;
586 return result;
587 }
588
589 public static void CreateScale(ref Vector3 scales, out Matrix result)
590 {
591 float x = scales.X;
592 float y = scales.Y;
593 float z = scales.Z;
594 result.M11 = x;
595 result.M12 = 0f;
596 result.M13 = 0f;
597 result.M14 = 0f;
598 result.M21 = 0f;
599 result.M22 = y;
600 result.M23 = 0f;
601 result.M24 = 0f;
602 result.M31 = 0f;
603 result.M32 = 0f;
604 result.M33 = z;
605 result.M34 = 0f;
606 result.M41 = 0f;
607 result.M42 = 0f;
608 result.M43 = 0f;
609 result.M44 = 1f;
610 }
611
612 public static Matrix CreateScale(float scale)
613 {
614 Matrix result = default(Matrix);
615 float num = (result.M11 = scale);
616 result.M12 = 0f;
617 result.M13 = 0f;
618 result.M14 = 0f;
619 result.M21 = 0f;
620 result.M22 = num;
621 result.M23 = 0f;
622 result.M24 = 0f;
623 result.M31 = 0f;
624 result.M32 = 0f;
625 result.M33 = num;
626 result.M34 = 0f;
627 result.M41 = 0f;
628 result.M42 = 0f;
629 result.M43 = 0f;
630 result.M44 = 1f;
631 return result;
632 }
633
634 public static void CreateScale(float scale, out Matrix result)
635 {
636 float num = (result.M11 = scale);
637 result.M12 = 0f;
638 result.M13 = 0f;
639 result.M14 = 0f;
640 result.M21 = 0f;
641 result.M22 = num;
642 result.M23 = 0f;
643 result.M24 = 0f;
644 result.M31 = 0f;
645 result.M32 = 0f;
646 result.M33 = num;
647 result.M34 = 0f;
648 result.M41 = 0f;
649 result.M42 = 0f;
650 result.M43 = 0f;
651 result.M44 = 1f;
652 }
653
654 public static Matrix CreateRotationX(float radians)
655 {
656 float num = (float)Math.Cos(radians);
657 float num2 = (float)Math.Sin(radians);
658 Matrix result = default(Matrix);
659 result.M11 = 1f;
660 result.M12 = 0f;
661 result.M13 = 0f;
662 result.M14 = 0f;
663 result.M21 = 0f;
664 result.M22 = num;
665 result.M23 = num2;
666 result.M24 = 0f;
667 result.M31 = 0f;
668 result.M32 = 0f - num2;
669 result.M33 = num;
670 result.M34 = 0f;
671 result.M41 = 0f;
672 result.M42 = 0f;
673 result.M43 = 0f;
674 result.M44 = 1f;
675 return result;
676 }
677
678 public static void CreateRotationX(float radians, out Matrix result)
679 {
680 float num = (float)Math.Cos(radians);
681 float num2 = (float)Math.Sin(radians);
682 result.M11 = 1f;
683 result.M12 = 0f;
684 result.M13 = 0f;
685 result.M14 = 0f;
686 result.M21 = 0f;
687 result.M22 = num;
688 result.M23 = num2;
689 result.M24 = 0f;
690 result.M31 = 0f;
691 result.M32 = 0f - num2;
692 result.M33 = num;
693 result.M34 = 0f;
694 result.M41 = 0f;
695 result.M42 = 0f;
696 result.M43 = 0f;
697 result.M44 = 1f;
698 }
699
700 public static Matrix CreateRotationY(float radians)
701 {
702 float num = (float)Math.Cos(radians);
703 float num2 = (float)Math.Sin(radians);
704 Matrix result = default(Matrix);
705 result.M11 = num;
706 result.M12 = 0f;
707 result.M13 = 0f - num2;
708 result.M14 = 0f;
709 result.M21 = 0f;
710 result.M22 = 1f;
711 result.M23 = 0f;
712 result.M24 = 0f;
713 result.M31 = num2;
714 result.M32 = 0f;
715 result.M33 = num;
716 result.M34 = 0f;
717 result.M41 = 0f;
718 result.M42 = 0f;
719 result.M43 = 0f;
720 result.M44 = 1f;
721 return result;
722 }
723
724 public static void CreateRotationY(float radians, out Matrix result)
725 {
726 float num = (float)Math.Cos(radians);
727 float num2 = (float)Math.Sin(radians);
728 result.M11 = num;
729 result.M12 = 0f;
730 result.M13 = 0f - num2;
731 result.M14 = 0f;
732 result.M21 = 0f;
733 result.M22 = 1f;
734 result.M23 = 0f;
735 result.M24 = 0f;
736 result.M31 = num2;
737 result.M32 = 0f;
738 result.M33 = num;
739 result.M34 = 0f;
740 result.M41 = 0f;
741 result.M42 = 0f;
742 result.M43 = 0f;
743 result.M44 = 1f;
744 }
745
746 public static Matrix CreateRotationZ(float radians)
747 {
748 float num = (float)Math.Cos(radians);
749 float num2 = (float)Math.Sin(radians);
750 Matrix result = default(Matrix);
751 result.M11 = num;
752 result.M12 = num2;
753 result.M13 = 0f;
754 result.M14 = 0f;
755 result.M21 = 0f - num2;
756 result.M22 = num;
757 result.M23 = 0f;
758 result.M24 = 0f;
759 result.M31 = 0f;
760 result.M32 = 0f;
761 result.M33 = 1f;
762 result.M34 = 0f;
763 result.M41 = 0f;
764 result.M42 = 0f;
765 result.M43 = 0f;
766 result.M44 = 1f;
767 return result;
768 }
769
770 public static void CreateRotationZ(float radians, out Matrix result)
771 {
772 float num = (float)Math.Cos(radians);
773 float num2 = (float)Math.Sin(radians);
774 result.M11 = num;
775 result.M12 = num2;
776 result.M13 = 0f;
777 result.M14 = 0f;
778 result.M21 = 0f - num2;
779 result.M22 = num;
780 result.M23 = 0f;
781 result.M24 = 0f;
782 result.M31 = 0f;
783 result.M32 = 0f;
784 result.M33 = 1f;
785 result.M34 = 0f;
786 result.M41 = 0f;
787 result.M42 = 0f;
788 result.M43 = 0f;
789 result.M44 = 1f;
790 }
791
792 public static Matrix CreateFromAxisAngle(Vector3 axis, float angle)
793 {
794 float x = axis.X;
795 float y = axis.Y;
796 float z = axis.Z;
797 float num = (float)Math.Sin(angle);
798 float num2 = (float)Math.Cos(angle);
799 float num3 = x * x;
800 float num4 = y * y;
801 float num5 = z * z;
802 float num6 = x * y;
803 float num7 = x * z;
804 float num8 = y * z;
805 Matrix result = default(Matrix);
806 result.M11 = num3 + num2 * (1f - num3);
807 result.M12 = num6 - num2 * num6 + num * z;
808 result.M13 = num7 - num2 * num7 - num * y;
809 result.M14 = 0f;
810 result.M21 = num6 - num2 * num6 - num * z;
811 result.M22 = num4 + num2 * (1f - num4);
812 result.M23 = num8 - num2 * num8 + num * x;
813 result.M24 = 0f;
814 result.M31 = num7 - num2 * num7 + num * y;
815 result.M32 = num8 - num2 * num8 - num * x;
816 result.M33 = num5 + num2 * (1f - num5);
817 result.M34 = 0f;
818 result.M41 = 0f;
819 result.M42 = 0f;
820 result.M43 = 0f;
821 result.M44 = 1f;
822 return result;
823 }
824
825 public static void CreateFromAxisAngle(ref Vector3 axis, float angle, out Matrix result)
826 {
827 float x = axis.X;
828 float y = axis.Y;
829 float z = axis.Z;
830 float num = (float)Math.Sin(angle);
831 float num2 = (float)Math.Cos(angle);
832 float num3 = x * x;
833 float num4 = y * y;
834 float num5 = z * z;
835 float num6 = x * y;
836 float num7 = x * z;
837 float num8 = y * z;
838 result.M11 = num3 + num2 * (1f - num3);
839 result.M12 = num6 - num2 * num6 + num * z;
840 result.M13 = num7 - num2 * num7 - num * y;
841 result.M14 = 0f;
842 result.M21 = num6 - num2 * num6 - num * z;
843 result.M22 = num4 + num2 * (1f - num4);
844 result.M23 = num8 - num2 * num8 + num * x;
845 result.M24 = 0f;
846 result.M31 = num7 - num2 * num7 + num * y;
847 result.M32 = num8 - num2 * num8 - num * x;
848 result.M33 = num5 + num2 * (1f - num5);
849 result.M34 = 0f;
850 result.M41 = 0f;
851 result.M42 = 0f;
852 result.M43 = 0f;
853 result.M44 = 1f;
854 }
855
856 public static Matrix CreatePerspectiveFieldOfView(float fieldOfView, float aspectRatio, float nearPlaneDistance, float farPlaneDistance)
857 {
858 if (fieldOfView <= 0f || fieldOfView >= (float)Math.PI)
859 {
860 throw new ArgumentOutOfRangeException("fieldOfView", string.Format(CultureInfo.CurrentCulture, FrameworkResources.OutRangeFieldOfView, new object[1] { "fieldOfView" }));
861 }
862 if (nearPlaneDistance <= 0f)
863 {
864 throw new ArgumentOutOfRangeException("nearPlaneDistance", string.Format(CultureInfo.CurrentCulture, FrameworkResources.NegativePlaneDistance, new object[1] { "nearPlaneDistance" }));
865 }
866 if (farPlaneDistance <= 0f)
867 {
868 throw new ArgumentOutOfRangeException("farPlaneDistance", string.Format(CultureInfo.CurrentCulture, FrameworkResources.NegativePlaneDistance, new object[1] { "farPlaneDistance" }));
869 }
870 if (nearPlaneDistance >= farPlaneDistance)
871 {
872 throw new ArgumentOutOfRangeException("nearPlaneDistance", FrameworkResources.OppositePlanes);
873 }
874 float num = 1f / (float)Math.Tan(fieldOfView * 0.5f);
875 float m = num / aspectRatio;
876 Matrix result = default(Matrix);
877 result.M11 = m;
878 result.M12 = (result.M13 = (result.M14 = 0f));
879 result.M22 = num;
880 result.M21 = (result.M23 = (result.M24 = 0f));
881 result.M31 = (result.M32 = 0f);
882 result.M33 = farPlaneDistance / (nearPlaneDistance - farPlaneDistance);
883 result.M34 = -1f;
884 result.M41 = (result.M42 = (result.M44 = 0f));
885 result.M43 = nearPlaneDistance * farPlaneDistance / (nearPlaneDistance - farPlaneDistance);
886 return result;
887 }
888
889 public static void CreatePerspectiveFieldOfView(float fieldOfView, float aspectRatio, float nearPlaneDistance, float farPlaneDistance, out Matrix result)
890 {
891 if (fieldOfView <= 0f || fieldOfView >= (float)Math.PI)
892 {
893 throw new ArgumentOutOfRangeException("fieldOfView", string.Format(CultureInfo.CurrentCulture, FrameworkResources.OutRangeFieldOfView, new object[1] { "fieldOfView" }));
894 }
895 if (nearPlaneDistance <= 0f)
896 {
897 throw new ArgumentOutOfRangeException("nearPlaneDistance", string.Format(CultureInfo.CurrentCulture, FrameworkResources.NegativePlaneDistance, new object[1] { "nearPlaneDistance" }));
898 }
899 if (farPlaneDistance <= 0f)
900 {
901 throw new ArgumentOutOfRangeException("farPlaneDistance", string.Format(CultureInfo.CurrentCulture, FrameworkResources.NegativePlaneDistance, new object[1] { "farPlaneDistance" }));
902 }
903 if (nearPlaneDistance >= farPlaneDistance)
904 {
905 throw new ArgumentOutOfRangeException("nearPlaneDistance", FrameworkResources.OppositePlanes);
906 }
907 float num = 1f / (float)Math.Tan(fieldOfView * 0.5f);
908 float m = num / aspectRatio;
909 result.M11 = m;
910 result.M12 = (result.M13 = (result.M14 = 0f));
911 result.M22 = num;
912 result.M21 = (result.M23 = (result.M24 = 0f));
913 result.M31 = (result.M32 = 0f);
914 result.M33 = farPlaneDistance / (nearPlaneDistance - farPlaneDistance);
915 result.M34 = -1f;
916 result.M41 = (result.M42 = (result.M44 = 0f));
917 result.M43 = nearPlaneDistance * farPlaneDistance / (nearPlaneDistance - farPlaneDistance);
918 }
919
920 public static Matrix CreatePerspective(float width, float height, float nearPlaneDistance, float farPlaneDistance)
921 {
922 if (nearPlaneDistance <= 0f)
923 {
924 throw new ArgumentOutOfRangeException("nearPlaneDistance", string.Format(CultureInfo.CurrentCulture, FrameworkResources.NegativePlaneDistance, new object[1] { "nearPlaneDistance" }));
925 }
926 if (farPlaneDistance <= 0f)
927 {
928 throw new ArgumentOutOfRangeException("farPlaneDistance", string.Format(CultureInfo.CurrentCulture, FrameworkResources.NegativePlaneDistance, new object[1] { "farPlaneDistance" }));
929 }
930 if (nearPlaneDistance >= farPlaneDistance)
931 {
932 throw new ArgumentOutOfRangeException("nearPlaneDistance", FrameworkResources.OppositePlanes);
933 }
934 Matrix result = default(Matrix);
935 result.M11 = 2f * nearPlaneDistance / width;
936 result.M12 = (result.M13 = (result.M14 = 0f));
937 result.M22 = 2f * nearPlaneDistance / height;
938 result.M21 = (result.M23 = (result.M24 = 0f));
939 result.M33 = farPlaneDistance / (nearPlaneDistance - farPlaneDistance);
940 result.M31 = (result.M32 = 0f);
941 result.M34 = -1f;
942 result.M41 = (result.M42 = (result.M44 = 0f));
943 result.M43 = nearPlaneDistance * farPlaneDistance / (nearPlaneDistance - farPlaneDistance);
944 return result;
945 }
946
947 public static void CreatePerspective(float width, float height, float nearPlaneDistance, float farPlaneDistance, out Matrix result)
948 {
949 if (nearPlaneDistance <= 0f)
950 {
951 throw new ArgumentOutOfRangeException("nearPlaneDistance", string.Format(CultureInfo.CurrentCulture, FrameworkResources.NegativePlaneDistance, new object[1] { "nearPlaneDistance" }));
952 }
953 if (farPlaneDistance <= 0f)
954 {
955 throw new ArgumentOutOfRangeException("farPlaneDistance", string.Format(CultureInfo.CurrentCulture, FrameworkResources.NegativePlaneDistance, new object[1] { "farPlaneDistance" }));
956 }
957 if (nearPlaneDistance >= farPlaneDistance)
958 {
959 throw new ArgumentOutOfRangeException("nearPlaneDistance", FrameworkResources.OppositePlanes);
960 }
961 result.M11 = 2f * nearPlaneDistance / width;
962 result.M12 = (result.M13 = (result.M14 = 0f));
963 result.M22 = 2f * nearPlaneDistance / height;
964 result.M21 = (result.M23 = (result.M24 = 0f));
965 result.M33 = farPlaneDistance / (nearPlaneDistance - farPlaneDistance);
966 result.M31 = (result.M32 = 0f);
967 result.M34 = -1f;
968 result.M41 = (result.M42 = (result.M44 = 0f));
969 result.M43 = nearPlaneDistance * farPlaneDistance / (nearPlaneDistance - farPlaneDistance);
970 }
971
972 public static Matrix CreatePerspectiveOffCenter(float left, float right, float bottom, float top, float nearPlaneDistance, float farPlaneDistance)
973 {
974 if (nearPlaneDistance <= 0f)
975 {
976 throw new ArgumentOutOfRangeException("nearPlaneDistance", string.Format(CultureInfo.CurrentCulture, FrameworkResources.NegativePlaneDistance, new object[1] { "nearPlaneDistance" }));
977 }
978 if (farPlaneDistance <= 0f)
979 {
980 throw new ArgumentOutOfRangeException("farPlaneDistance", string.Format(CultureInfo.CurrentCulture, FrameworkResources.NegativePlaneDistance, new object[1] { "farPlaneDistance" }));
981 }
982 if (nearPlaneDistance >= farPlaneDistance)
983 {
984 throw new ArgumentOutOfRangeException("nearPlaneDistance", FrameworkResources.OppositePlanes);
985 }
986 Matrix result = default(Matrix);
987 result.M11 = 2f * nearPlaneDistance / (right - left);
988 result.M12 = (result.M13 = (result.M14 = 0f));
989 result.M22 = 2f * nearPlaneDistance / (top - bottom);
990 result.M21 = (result.M23 = (result.M24 = 0f));
991 result.M31 = (left + right) / (right - left);
992 result.M32 = (top + bottom) / (top - bottom);
993 result.M33 = farPlaneDistance / (nearPlaneDistance - farPlaneDistance);
994 result.M34 = -1f;
995 result.M43 = nearPlaneDistance * farPlaneDistance / (nearPlaneDistance - farPlaneDistance);
996 result.M41 = (result.M42 = (result.M44 = 0f));
997 return result;
998 }
999
1000 public static void CreatePerspectiveOffCenter(float left, float right, float bottom, float top, float nearPlaneDistance, float farPlaneDistance, out Matrix result)
1001 {
1002 if (nearPlaneDistance <= 0f)
1003 {
1004 throw new ArgumentOutOfRangeException("nearPlaneDistance", string.Format(CultureInfo.CurrentCulture, FrameworkResources.NegativePlaneDistance, new object[1] { "nearPlaneDistance" }));
1005 }
1006 if (farPlaneDistance <= 0f)
1007 {
1008 throw new ArgumentOutOfRangeException("farPlaneDistance", string.Format(CultureInfo.CurrentCulture, FrameworkResources.NegativePlaneDistance, new object[1] { "farPlaneDistance" }));
1009 }
1010 if (nearPlaneDistance >= farPlaneDistance)
1011 {
1012 throw new ArgumentOutOfRangeException("nearPlaneDistance", FrameworkResources.OppositePlanes);
1013 }
1014 result.M11 = 2f * nearPlaneDistance / (right - left);
1015 result.M12 = (result.M13 = (result.M14 = 0f));
1016 result.M22 = 2f * nearPlaneDistance / (top - bottom);
1017 result.M21 = (result.M23 = (result.M24 = 0f));
1018 result.M31 = (left + right) / (right - left);
1019 result.M32 = (top + bottom) / (top - bottom);
1020 result.M33 = farPlaneDistance / (nearPlaneDistance - farPlaneDistance);
1021 result.M34 = -1f;
1022 result.M43 = nearPlaneDistance * farPlaneDistance / (nearPlaneDistance - farPlaneDistance);
1023 result.M41 = (result.M42 = (result.M44 = 0f));
1024 }
1025
1026 public static Matrix CreateOrthographic(float width, float height, float zNearPlane, float zFarPlane)
1027 {
1028 Matrix result = default(Matrix);
1029 result.M11 = 2f / width;
1030 result.M12 = (result.M13 = (result.M14 = 0f));
1031 result.M22 = 2f / height;
1032 result.M21 = (result.M23 = (result.M24 = 0f));
1033 result.M33 = 1f / (zNearPlane - zFarPlane);
1034 result.M31 = (result.M32 = (result.M34 = 0f));
1035 result.M41 = (result.M42 = 0f);
1036 result.M43 = zNearPlane / (zNearPlane - zFarPlane);
1037 result.M44 = 1f;
1038 return result;
1039 }
1040
1041 public static void CreateOrthographic(float width, float height, float zNearPlane, float zFarPlane, out Matrix result)
1042 {
1043 result.M11 = 2f / width;
1044 result.M12 = (result.M13 = (result.M14 = 0f));
1045 result.M22 = 2f / height;
1046 result.M21 = (result.M23 = (result.M24 = 0f));
1047 result.M33 = 1f / (zNearPlane - zFarPlane);
1048 result.M31 = (result.M32 = (result.M34 = 0f));
1049 result.M41 = (result.M42 = 0f);
1050 result.M43 = zNearPlane / (zNearPlane - zFarPlane);
1051 result.M44 = 1f;
1052 }
1053
1054 public static Matrix CreateOrthographicOffCenter(float left, float right, float bottom, float top, float zNearPlane, float zFarPlane)
1055 {
1056 Matrix result = default(Matrix);
1057 result.M11 = 2f / (right - left);
1058 result.M12 = (result.M13 = (result.M14 = 0f));
1059 result.M22 = 2f / (top - bottom);
1060 result.M21 = (result.M23 = (result.M24 = 0f));
1061 result.M33 = 1f / (zNearPlane - zFarPlane);
1062 result.M31 = (result.M32 = (result.M34 = 0f));
1063 result.M41 = (left + right) / (left - right);
1064 result.M42 = (top + bottom) / (bottom - top);
1065 result.M43 = zNearPlane / (zNearPlane - zFarPlane);
1066 result.M44 = 1f;
1067 return result;
1068 }
1069
1070 public static void CreateOrthographicOffCenter(float left, float right, float bottom, float top, float zNearPlane, float zFarPlane, out Matrix result)
1071 {
1072 result.M11 = 2f / (right - left);
1073 result.M12 = (result.M13 = (result.M14 = 0f));
1074 result.M22 = 2f / (top - bottom);
1075 result.M21 = (result.M23 = (result.M24 = 0f));
1076 result.M33 = 1f / (zNearPlane - zFarPlane);
1077 result.M31 = (result.M32 = (result.M34 = 0f));
1078 result.M41 = (left + right) / (left - right);
1079 result.M42 = (top + bottom) / (bottom - top);
1080 result.M43 = zNearPlane / (zNearPlane - zFarPlane);
1081 result.M44 = 1f;
1082 }
1083
1084 public static Matrix CreateLookAt(Vector3 cameraPosition, Vector3 cameraTarget, Vector3 cameraUpVector)
1085 {
1086 Vector3 vector = Vector3.Normalize(cameraPosition - cameraTarget);
1087 Vector3 vector2 = Vector3.Normalize(Vector3.Cross(cameraUpVector, vector));
1088 Vector3 vector3 = Vector3.Cross(vector, vector2);
1089 Matrix result = default(Matrix);
1090 result.M11 = vector2.X;
1091 result.M12 = vector3.X;
1092 result.M13 = vector.X;
1093 result.M14 = 0f;
1094 result.M21 = vector2.Y;
1095 result.M22 = vector3.Y;
1096 result.M23 = vector.Y;
1097 result.M24 = 0f;
1098 result.M31 = vector2.Z;
1099 result.M32 = vector3.Z;
1100 result.M33 = vector.Z;
1101 result.M34 = 0f;
1102 result.M41 = 0f - Vector3.Dot(vector2, cameraPosition);
1103 result.M42 = 0f - Vector3.Dot(vector3, cameraPosition);
1104 result.M43 = 0f - Vector3.Dot(vector, cameraPosition);
1105 result.M44 = 1f;
1106 return result;
1107 }
1108
1109 public static void CreateLookAt(ref Vector3 cameraPosition, ref Vector3 cameraTarget, ref Vector3 cameraUpVector, out Matrix result)
1110 {
1111 Vector3 vector = Vector3.Normalize(cameraPosition - cameraTarget);
1112 Vector3 vector2 = Vector3.Normalize(Vector3.Cross(cameraUpVector, vector));
1113 Vector3 vector3 = Vector3.Cross(vector, vector2);
1114 result.M11 = vector2.X;
1115 result.M12 = vector3.X;
1116 result.M13 = vector.X;
1117 result.M14 = 0f;
1118 result.M21 = vector2.Y;
1119 result.M22 = vector3.Y;
1120 result.M23 = vector.Y;
1121 result.M24 = 0f;
1122 result.M31 = vector2.Z;
1123 result.M32 = vector3.Z;
1124 result.M33 = vector.Z;
1125 result.M34 = 0f;
1126 result.M41 = 0f - Vector3.Dot(vector2, cameraPosition);
1127 result.M42 = 0f - Vector3.Dot(vector3, cameraPosition);
1128 result.M43 = 0f - Vector3.Dot(vector, cameraPosition);
1129 result.M44 = 1f;
1130 }
1131
1132 public static Matrix CreateWorld(Vector3 position, Vector3 forward, Vector3 up)
1133 {
1134 Vector3 vector = Vector3.Normalize(-forward);
1135 Vector3 vector2 = Vector3.Normalize(Vector3.Cross(up, vector));
1136 Vector3 vector3 = Vector3.Cross(vector, vector2);
1137 Matrix result = default(Matrix);
1138 result.M11 = vector2.X;
1139 result.M12 = vector2.Y;
1140 result.M13 = vector2.Z;
1141 result.M14 = 0f;
1142 result.M21 = vector3.X;
1143 result.M22 = vector3.Y;
1144 result.M23 = vector3.Z;
1145 result.M24 = 0f;
1146 result.M31 = vector.X;
1147 result.M32 = vector.Y;
1148 result.M33 = vector.Z;
1149 result.M34 = 0f;
1150 result.M41 = position.X;
1151 result.M42 = position.Y;
1152 result.M43 = position.Z;
1153 result.M44 = 1f;
1154 return result;
1155 }
1156
1157 public static void CreateWorld(ref Vector3 position, ref Vector3 forward, ref Vector3 up, out Matrix result)
1158 {
1159 Vector3 vector = Vector3.Normalize(-forward);
1160 Vector3 vector2 = Vector3.Normalize(Vector3.Cross(up, vector));
1161 Vector3 vector3 = Vector3.Cross(vector, vector2);
1162 result.M11 = vector2.X;
1163 result.M12 = vector2.Y;
1164 result.M13 = vector2.Z;
1165 result.M14 = 0f;
1166 result.M21 = vector3.X;
1167 result.M22 = vector3.Y;
1168 result.M23 = vector3.Z;
1169 result.M24 = 0f;
1170 result.M31 = vector.X;
1171 result.M32 = vector.Y;
1172 result.M33 = vector.Z;
1173 result.M34 = 0f;
1174 result.M41 = position.X;
1175 result.M42 = position.Y;
1176 result.M43 = position.Z;
1177 result.M44 = 1f;
1178 }
1179
1180 public static Matrix CreateFromQuaternion(Quaternion quaternion)
1181 {
1182 float num = quaternion.X * quaternion.X;
1183 float num2 = quaternion.Y * quaternion.Y;
1184 float num3 = quaternion.Z * quaternion.Z;
1185 float num4 = quaternion.X * quaternion.Y;
1186 float num5 = quaternion.Z * quaternion.W;
1187 float num6 = quaternion.Z * quaternion.X;
1188 float num7 = quaternion.Y * quaternion.W;
1189 float num8 = quaternion.Y * quaternion.Z;
1190 float num9 = quaternion.X * quaternion.W;
1191 Matrix result = default(Matrix);
1192 result.M11 = 1f - 2f * (num2 + num3);
1193 result.M12 = 2f * (num4 + num5);
1194 result.M13 = 2f * (num6 - num7);
1195 result.M14 = 0f;
1196 result.M21 = 2f * (num4 - num5);
1197 result.M22 = 1f - 2f * (num3 + num);
1198 result.M23 = 2f * (num8 + num9);
1199 result.M24 = 0f;
1200 result.M31 = 2f * (num6 + num7);
1201 result.M32 = 2f * (num8 - num9);
1202 result.M33 = 1f - 2f * (num2 + num);
1203 result.M34 = 0f;
1204 result.M41 = 0f;
1205 result.M42 = 0f;
1206 result.M43 = 0f;
1207 result.M44 = 1f;
1208 return result;
1209 }
1210
1211 public static void CreateFromQuaternion(ref Quaternion quaternion, out Matrix result)
1212 {
1213 float num = quaternion.X * quaternion.X;
1214 float num2 = quaternion.Y * quaternion.Y;
1215 float num3 = quaternion.Z * quaternion.Z;
1216 float num4 = quaternion.X * quaternion.Y;
1217 float num5 = quaternion.Z * quaternion.W;
1218 float num6 = quaternion.Z * quaternion.X;
1219 float num7 = quaternion.Y * quaternion.W;
1220 float num8 = quaternion.Y * quaternion.Z;
1221 float num9 = quaternion.X * quaternion.W;
1222 result.M11 = 1f - 2f * (num2 + num3);
1223 result.M12 = 2f * (num4 + num5);
1224 result.M13 = 2f * (num6 - num7);
1225 result.M14 = 0f;
1226 result.M21 = 2f * (num4 - num5);
1227 result.M22 = 1f - 2f * (num3 + num);
1228 result.M23 = 2f * (num8 + num9);
1229 result.M24 = 0f;
1230 result.M31 = 2f * (num6 + num7);
1231 result.M32 = 2f * (num8 - num9);
1232 result.M33 = 1f - 2f * (num2 + num);
1233 result.M34 = 0f;
1234 result.M41 = 0f;
1235 result.M42 = 0f;
1236 result.M43 = 0f;
1237 result.M44 = 1f;
1238 }
1239
1240 public static Matrix CreateFromYawPitchRoll(float yaw, float pitch, float roll)
1241 {
1242 Quaternion.CreateFromYawPitchRoll(yaw, pitch, roll, out var result);
1243 CreateFromQuaternion(ref result, out var result2);
1244 return result2;
1245 }
1246
1247 public static void CreateFromYawPitchRoll(float yaw, float pitch, float roll, out Matrix result)
1248 {
1249 Quaternion.CreateFromYawPitchRoll(yaw, pitch, roll, out var result2);
1250 CreateFromQuaternion(ref result2, out result);
1251 }
1252
1253 public static Matrix CreateShadow(Vector3 lightDirection, Plane plane)
1254 {
1255 Plane.Normalize(ref plane, out var result);
1256 float num = result.Normal.X * lightDirection.X + result.Normal.Y * lightDirection.Y + result.Normal.Z * lightDirection.Z;
1257 float num2 = 0f - result.Normal.X;
1258 float num3 = 0f - result.Normal.Y;
1259 float num4 = 0f - result.Normal.Z;
1260 float num5 = 0f - result.D;
1261 Matrix result2 = default(Matrix);
1262 result2.M11 = num2 * lightDirection.X + num;
1263 result2.M21 = num3 * lightDirection.X;
1264 result2.M31 = num4 * lightDirection.X;
1265 result2.M41 = num5 * lightDirection.X;
1266 result2.M12 = num2 * lightDirection.Y;
1267 result2.M22 = num3 * lightDirection.Y + num;
1268 result2.M32 = num4 * lightDirection.Y;
1269 result2.M42 = num5 * lightDirection.Y;
1270 result2.M13 = num2 * lightDirection.Z;
1271 result2.M23 = num3 * lightDirection.Z;
1272 result2.M33 = num4 * lightDirection.Z + num;
1273 result2.M43 = num5 * lightDirection.Z;
1274 result2.M14 = 0f;
1275 result2.M24 = 0f;
1276 result2.M34 = 0f;
1277 result2.M44 = num;
1278 return result2;
1279 }
1280
1281 public static void CreateShadow(ref Vector3 lightDirection, ref Plane plane, out Matrix result)
1282 {
1283 Plane.Normalize(ref plane, out var result2);
1284 float num = result2.Normal.X * lightDirection.X + result2.Normal.Y * lightDirection.Y + result2.Normal.Z * lightDirection.Z;
1285 float num2 = 0f - result2.Normal.X;
1286 float num3 = 0f - result2.Normal.Y;
1287 float num4 = 0f - result2.Normal.Z;
1288 float num5 = 0f - result2.D;
1289 result.M11 = num2 * lightDirection.X + num;
1290 result.M21 = num3 * lightDirection.X;
1291 result.M31 = num4 * lightDirection.X;
1292 result.M41 = num5 * lightDirection.X;
1293 result.M12 = num2 * lightDirection.Y;
1294 result.M22 = num3 * lightDirection.Y + num;
1295 result.M32 = num4 * lightDirection.Y;
1296 result.M42 = num5 * lightDirection.Y;
1297 result.M13 = num2 * lightDirection.Z;
1298 result.M23 = num3 * lightDirection.Z;
1299 result.M33 = num4 * lightDirection.Z + num;
1300 result.M43 = num5 * lightDirection.Z;
1301 result.M14 = 0f;
1302 result.M24 = 0f;
1303 result.M34 = 0f;
1304 result.M44 = num;
1305 }
1306
1308 {
1309 value.Normalize();
1310 float x = value.Normal.X;
1311 float y = value.Normal.Y;
1312 float z = value.Normal.Z;
1313 float num = -2f * x;
1314 float num2 = -2f * y;
1315 float num3 = -2f * z;
1316 Matrix result = default(Matrix);
1317 result.M11 = num * x + 1f;
1318 result.M12 = num2 * x;
1319 result.M13 = num3 * x;
1320 result.M14 = 0f;
1321 result.M21 = num * y;
1322 result.M22 = num2 * y + 1f;
1323 result.M23 = num3 * y;
1324 result.M24 = 0f;
1325 result.M31 = num * z;
1326 result.M32 = num2 * z;
1327 result.M33 = num3 * z + 1f;
1328 result.M34 = 0f;
1329 result.M41 = num * value.D;
1330 result.M42 = num2 * value.D;
1331 result.M43 = num3 * value.D;
1332 result.M44 = 1f;
1333 return result;
1334 }
1335
1336 public static void CreateReflection(ref Plane value, out Matrix result)
1337 {
1338 Plane.Normalize(ref value, out var result2);
1339 value.Normalize();
1340 float x = result2.Normal.X;
1341 float y = result2.Normal.Y;
1342 float z = result2.Normal.Z;
1343 float num = -2f * x;
1344 float num2 = -2f * y;
1345 float num3 = -2f * z;
1346 result.M11 = num * x + 1f;
1347 result.M12 = num2 * x;
1348 result.M13 = num3 * x;
1349 result.M14 = 0f;
1350 result.M21 = num * y;
1351 result.M22 = num2 * y + 1f;
1352 result.M23 = num3 * y;
1353 result.M24 = 0f;
1354 result.M31 = num * z;
1355 result.M32 = num2 * z;
1356 result.M33 = num3 * z + 1f;
1357 result.M34 = 0f;
1358 result.M41 = num * result2.D;
1359 result.M42 = num2 * result2.D;
1360 result.M43 = num3 * result2.D;
1361 result.M44 = 1f;
1362 }
1363
1364 public unsafe bool Decompose(out Vector3 scale, out Quaternion rotation, out Vector3 translation)
1365 {
1366 bool result = true;
1367 fixed (float* ptr3 = &scale.X)
1368 {
1369 VectorBasis vectorBasis = default(VectorBasis);
1370 Vector3** ptr = (Vector3**)(&vectorBasis);
1371 Matrix matrix = Identity;
1372 CanonicalBasis canonicalBasis = default(CanonicalBasis);
1373 Vector3* ptr2 = &canonicalBasis.Row0;
1374 canonicalBasis.Row0 = new Vector3(1f, 0f, 0f);
1375 canonicalBasis.Row1 = new Vector3(0f, 1f, 0f);
1376 canonicalBasis.Row2 = new Vector3(0f, 0f, 1f);
1377 translation.X = M41;
1378 translation.Y = M42;
1379 translation.Z = M43;
1380 *ptr = (Vector3*)(&matrix.M11);
1381 ptr[1] = (Vector3*)(&matrix.M21);
1382 ptr[2] = (Vector3*)(&matrix.M31);
1383 *(*ptr) = new Vector3(M11, M12, M13);
1384 *ptr[1] = new Vector3(M21, M22, M23);
1385 *ptr[2] = new Vector3(M31, M32, M33);
1386 scale.X = (*ptr)->Length();
1387 scale.Y = ptr[1]->Length();
1388 scale.Z = ptr[2]->Length();
1389 float num = *ptr3;
1390 float num2 = ptr3[1];
1391 float num3 = ptr3[2];
1392 uint num4;
1393 uint num5;
1394 uint num6;
1395 if (num < num2)
1396 {
1397 if (num2 < num3)
1398 {
1399 num4 = 2u;
1400 num5 = 1u;
1401 num6 = 0u;
1402 }
1403 else
1404 {
1405 num4 = 1u;
1406 if (num < num3)
1407 {
1408 num5 = 2u;
1409 num6 = 0u;
1410 }
1411 else
1412 {
1413 num5 = 0u;
1414 num6 = 2u;
1415 }
1416 }
1417 }
1418 else if (num < num3)
1419 {
1420 num4 = 2u;
1421 num5 = 0u;
1422 num6 = 1u;
1423 }
1424 else
1425 {
1426 num4 = 0u;
1427 if (num2 < num3)
1428 {
1429 num5 = 2u;
1430 num6 = 1u;
1431 }
1432 else
1433 {
1434 num5 = 1u;
1435 num6 = 2u;
1436 }
1437 }
1438 if (ptr3[num4] < 0.0001f)
1439 {
1440 *ptr[num4] = ptr2[num4];
1441 }
1442 ptr[num4]->Normalize();
1443 if (ptr3[num5] < 0.0001f)
1444 {
1445 float num7 = Math.Abs(ptr[num4]->X);
1446 float num8 = Math.Abs(ptr[num4]->Y);
1447 float num9 = Math.Abs(ptr[num4]->Z);
1448 uint num10 = ((num7 < num8) ? ((!(num8 < num9)) ? ((!(num7 < num9)) ? 2u : 0u) : 0u) : ((num7 < num9) ? 1u : ((num8 < num9) ? 1u : 2u)));
1449 Vector3.Cross(ref *ptr[num5], ref *ptr[num4], out ptr2[num10]);
1450 }
1451 ptr[num5]->Normalize();
1452 if (ptr3[num6] < 0.0001f)
1453 {
1454 Vector3.Cross(ref *ptr[num6], ref *ptr[num4], out *ptr[num5]);
1455 }
1456 ptr[num6]->Normalize();
1457 float num11 = matrix.Determinant();
1458 if (num11 < 0f)
1459 {
1460 ptr3[num4] = 0f - ptr3[num4];
1461 *ptr[num4] = -(*ptr[num4]);
1462 num11 = 0f - num11;
1463 }
1464 num11 -= 1f;
1465 num11 *= num11;
1466 if (0.0001f < num11)
1467 {
1468 rotation = Quaternion.Identity;
1469 result = false;
1470 }
1471 else
1472 {
1473 Quaternion.CreateFromRotationMatrix(ref matrix, out rotation);
1474 }
1475 }
1476 return result;
1477 }
1478
1479 public static Matrix Transform(Matrix value, Quaternion rotation)
1480 {
1481 float num = rotation.X + rotation.X;
1482 float num2 = rotation.Y + rotation.Y;
1483 float num3 = rotation.Z + rotation.Z;
1484 float num4 = rotation.W * num;
1485 float num5 = rotation.W * num2;
1486 float num6 = rotation.W * num3;
1487 float num7 = rotation.X * num;
1488 float num8 = rotation.X * num2;
1489 float num9 = rotation.X * num3;
1490 float num10 = rotation.Y * num2;
1491 float num11 = rotation.Y * num3;
1492 float num12 = rotation.Z * num3;
1493 float num13 = 1f - num10 - num12;
1494 float num14 = num8 - num6;
1495 float num15 = num9 + num5;
1496 float num16 = num8 + num6;
1497 float num17 = 1f - num7 - num12;
1498 float num18 = num11 - num4;
1499 float num19 = num9 - num5;
1500 float num20 = num11 + num4;
1501 float num21 = 1f - num7 - num10;
1502 Matrix result = default(Matrix);
1503 result.M11 = value.M11 * num13 + value.M12 * num14 + value.M13 * num15;
1504 result.M12 = value.M11 * num16 + value.M12 * num17 + value.M13 * num18;
1505 result.M13 = value.M11 * num19 + value.M12 * num20 + value.M13 * num21;
1506 result.M14 = value.M14;
1507 result.M21 = value.M21 * num13 + value.M22 * num14 + value.M23 * num15;
1508 result.M22 = value.M21 * num16 + value.M22 * num17 + value.M23 * num18;
1509 result.M23 = value.M21 * num19 + value.M22 * num20 + value.M23 * num21;
1510 result.M24 = value.M24;
1511 result.M31 = value.M31 * num13 + value.M32 * num14 + value.M33 * num15;
1512 result.M32 = value.M31 * num16 + value.M32 * num17 + value.M33 * num18;
1513 result.M33 = value.M31 * num19 + value.M32 * num20 + value.M33 * num21;
1514 result.M34 = value.M34;
1515 result.M41 = value.M41 * num13 + value.M42 * num14 + value.M43 * num15;
1516 result.M42 = value.M41 * num16 + value.M42 * num17 + value.M43 * num18;
1517 result.M43 = value.M41 * num19 + value.M42 * num20 + value.M43 * num21;
1518 result.M44 = value.M44;
1519 return result;
1520 }
1521
1522 public static void Transform(ref Matrix value, ref Quaternion rotation, out Matrix result)
1523 {
1524 float num = rotation.X + rotation.X;
1525 float num2 = rotation.Y + rotation.Y;
1526 float num3 = rotation.Z + rotation.Z;
1527 float num4 = rotation.W * num;
1528 float num5 = rotation.W * num2;
1529 float num6 = rotation.W * num3;
1530 float num7 = rotation.X * num;
1531 float num8 = rotation.X * num2;
1532 float num9 = rotation.X * num3;
1533 float num10 = rotation.Y * num2;
1534 float num11 = rotation.Y * num3;
1535 float num12 = rotation.Z * num3;
1536 float num13 = 1f - num10 - num12;
1537 float num14 = num8 - num6;
1538 float num15 = num9 + num5;
1539 float num16 = num8 + num6;
1540 float num17 = 1f - num7 - num12;
1541 float num18 = num11 - num4;
1542 float num19 = num9 - num5;
1543 float num20 = num11 + num4;
1544 float num21 = 1f - num7 - num10;
1545 float m = value.M11 * num13 + value.M12 * num14 + value.M13 * num15;
1546 float m2 = value.M11 * num16 + value.M12 * num17 + value.M13 * num18;
1547 float m3 = value.M11 * num19 + value.M12 * num20 + value.M13 * num21;
1548 float m4 = value.M14;
1549 float m5 = value.M21 * num13 + value.M22 * num14 + value.M23 * num15;
1550 float m6 = value.M21 * num16 + value.M22 * num17 + value.M23 * num18;
1551 float m7 = value.M21 * num19 + value.M22 * num20 + value.M23 * num21;
1552 float m8 = value.M24;
1553 float m9 = value.M31 * num13 + value.M32 * num14 + value.M33 * num15;
1554 float m10 = value.M31 * num16 + value.M32 * num17 + value.M33 * num18;
1555 float m11 = value.M31 * num19 + value.M32 * num20 + value.M33 * num21;
1556 float m12 = value.M34;
1557 float m13 = value.M41 * num13 + value.M42 * num14 + value.M43 * num15;
1558 float m14 = value.M41 * num16 + value.M42 * num17 + value.M43 * num18;
1559 float m15 = value.M41 * num19 + value.M42 * num20 + value.M43 * num21;
1560 float m16 = value.M44;
1561 result.M11 = m;
1562 result.M12 = m2;
1563 result.M13 = m3;
1564 result.M14 = m4;
1565 result.M21 = m5;
1566 result.M22 = m6;
1567 result.M23 = m7;
1568 result.M24 = m8;
1569 result.M31 = m9;
1570 result.M32 = m10;
1571 result.M33 = m11;
1572 result.M34 = m12;
1573 result.M41 = m13;
1574 result.M42 = m14;
1575 result.M43 = m15;
1576 result.M44 = m16;
1577 }
1578
1579 public override string ToString()
1580 {
1581 CultureInfo currentCulture = CultureInfo.CurrentCulture;
1582 return "{ " + string.Format(currentCulture, "{{M11:{0} M12:{1} M13:{2} M14:{3}}} ", M11.ToString(currentCulture), M12.ToString(currentCulture), M13.ToString(currentCulture), M14.ToString(currentCulture)) + string.Format(currentCulture, "{{M21:{0} M22:{1} M23:{2} M24:{3}}} ", M21.ToString(currentCulture), M22.ToString(currentCulture), M23.ToString(currentCulture), M24.ToString(currentCulture)) + string.Format(currentCulture, "{{M31:{0} M32:{1} M33:{2} M34:{3}}} ", M31.ToString(currentCulture), M32.ToString(currentCulture), M33.ToString(currentCulture), M34.ToString(currentCulture)) + string.Format(currentCulture, "{{M41:{0} M42:{1} M43:{2} M44:{3}}} ", M41.ToString(currentCulture), M42.ToString(currentCulture), M43.ToString(currentCulture), M44.ToString(currentCulture)) + "}";
1583 }
1584
1585 public bool Equals(Matrix other)
1586 {
1587 if (M11 == other.M11 && M22 == other.M22 && M33 == other.M33 && M44 == other.M44 && M12 == other.M12 && M13 == other.M13 && M14 == other.M14 && M21 == other.M21 && M23 == other.M23 && M24 == other.M24 && M31 == other.M31 && M32 == other.M32 && M34 == other.M34 && M41 == other.M41 && M42 == other.M42)
1588 {
1589 return M43 == other.M43;
1590 }
1591 return false;
1592 }
1593
1594 public override bool Equals(object obj)
1595 {
1596 bool result = false;
1597 if (obj is Matrix)
1598 {
1599 result = Equals((Matrix)obj);
1600 }
1601 return result;
1602 }
1603
1604 public override int GetHashCode()
1605 {
1606 return M11.GetHashCode() + M12.GetHashCode() + M13.GetHashCode() + M14.GetHashCode() + M21.GetHashCode() + M22.GetHashCode() + M23.GetHashCode() + M24.GetHashCode() + M31.GetHashCode() + M32.GetHashCode() + M33.GetHashCode() + M34.GetHashCode() + M41.GetHashCode() + M42.GetHashCode() + M43.GetHashCode() + M44.GetHashCode();
1607 }
1608
1609 public static Matrix Transpose(Matrix matrix)
1610 {
1611 Matrix result = default(Matrix);
1612 result.M11 = matrix.M11;
1613 result.M12 = matrix.M21;
1614 result.M13 = matrix.M31;
1615 result.M14 = matrix.M41;
1616 result.M21 = matrix.M12;
1617 result.M22 = matrix.M22;
1618 result.M23 = matrix.M32;
1619 result.M24 = matrix.M42;
1620 result.M31 = matrix.M13;
1621 result.M32 = matrix.M23;
1622 result.M33 = matrix.M33;
1623 result.M34 = matrix.M43;
1624 result.M41 = matrix.M14;
1625 result.M42 = matrix.M24;
1626 result.M43 = matrix.M34;
1627 result.M44 = matrix.M44;
1628 return result;
1629 }
1630
1631 public static void Transpose(ref Matrix matrix, out Matrix result)
1632 {
1633 float m = matrix.M11;
1634 float m2 = matrix.M12;
1635 float m3 = matrix.M13;
1636 float m4 = matrix.M14;
1637 float m5 = matrix.M21;
1638 float m6 = matrix.M22;
1639 float m7 = matrix.M23;
1640 float m8 = matrix.M24;
1641 float m9 = matrix.M31;
1642 float m10 = matrix.M32;
1643 float m11 = matrix.M33;
1644 float m12 = matrix.M34;
1645 float m13 = matrix.M41;
1646 float m14 = matrix.M42;
1647 float m15 = matrix.M43;
1648 float m16 = matrix.M44;
1649 result.M11 = m;
1650 result.M12 = m5;
1651 result.M13 = m9;
1652 result.M14 = m13;
1653 result.M21 = m2;
1654 result.M22 = m6;
1655 result.M23 = m10;
1656 result.M24 = m14;
1657 result.M31 = m3;
1658 result.M32 = m7;
1659 result.M33 = m11;
1660 result.M34 = m15;
1661 result.M41 = m4;
1662 result.M42 = m8;
1663 result.M43 = m12;
1664 result.M44 = m16;
1665 }
1666
1667 public float Determinant()
1668 {
1669 float m = M11;
1670 float m2 = M12;
1671 float m3 = M13;
1672 float m4 = M14;
1673 float m5 = M21;
1674 float m6 = M22;
1675 float m7 = M23;
1676 float m8 = M24;
1677 float m9 = M31;
1678 float m10 = M32;
1679 float m11 = M33;
1680 float m12 = M34;
1681 float m13 = M41;
1682 float m14 = M42;
1683 float m15 = M43;
1684 float m16 = M44;
1685 float num = m11 * m16 - m12 * m15;
1686 float num2 = m10 * m16 - m12 * m14;
1687 float num3 = m10 * m15 - m11 * m14;
1688 float num4 = m9 * m16 - m12 * m13;
1689 float num5 = m9 * m15 - m11 * m13;
1690 float num6 = m9 * m14 - m10 * m13;
1691 return m * (m6 * num - m7 * num2 + m8 * num3) - m2 * (m5 * num - m7 * num4 + m8 * num5) + m3 * (m5 * num2 - m6 * num4 + m8 * num6) - m4 * (m5 * num3 - m6 * num5 + m7 * num6);
1692 }
1693
1694 public static Matrix Invert(Matrix matrix)
1695 {
1696 float m = matrix.M11;
1697 float m2 = matrix.M12;
1698 float m3 = matrix.M13;
1699 float m4 = matrix.M14;
1700 float m5 = matrix.M21;
1701 float m6 = matrix.M22;
1702 float m7 = matrix.M23;
1703 float m8 = matrix.M24;
1704 float m9 = matrix.M31;
1705 float m10 = matrix.M32;
1706 float m11 = matrix.M33;
1707 float m12 = matrix.M34;
1708 float m13 = matrix.M41;
1709 float m14 = matrix.M42;
1710 float m15 = matrix.M43;
1711 float m16 = matrix.M44;
1712 float num = m11 * m16 - m12 * m15;
1713 float num2 = m10 * m16 - m12 * m14;
1714 float num3 = m10 * m15 - m11 * m14;
1715 float num4 = m9 * m16 - m12 * m13;
1716 float num5 = m9 * m15 - m11 * m13;
1717 float num6 = m9 * m14 - m10 * m13;
1718 float num7 = m6 * num - m7 * num2 + m8 * num3;
1719 float num8 = 0f - (m5 * num - m7 * num4 + m8 * num5);
1720 float num9 = m5 * num2 - m6 * num4 + m8 * num6;
1721 float num10 = 0f - (m5 * num3 - m6 * num5 + m7 * num6);
1722 float num11 = 1f / (m * num7 + m2 * num8 + m3 * num9 + m4 * num10);
1723 Matrix result = default(Matrix);
1724 result.M11 = num7 * num11;
1725 result.M21 = num8 * num11;
1726 result.M31 = num9 * num11;
1727 result.M41 = num10 * num11;
1728 result.M12 = (0f - (m2 * num - m3 * num2 + m4 * num3)) * num11;
1729 result.M22 = (m * num - m3 * num4 + m4 * num5) * num11;
1730 result.M32 = (0f - (m * num2 - m2 * num4 + m4 * num6)) * num11;
1731 result.M42 = (m * num3 - m2 * num5 + m3 * num6) * num11;
1732 float num12 = m7 * m16 - m8 * m15;
1733 float num13 = m6 * m16 - m8 * m14;
1734 float num14 = m6 * m15 - m7 * m14;
1735 float num15 = m5 * m16 - m8 * m13;
1736 float num16 = m5 * m15 - m7 * m13;
1737 float num17 = m5 * m14 - m6 * m13;
1738 result.M13 = (m2 * num12 - m3 * num13 + m4 * num14) * num11;
1739 result.M23 = (0f - (m * num12 - m3 * num15 + m4 * num16)) * num11;
1740 result.M33 = (m * num13 - m2 * num15 + m4 * num17) * num11;
1741 result.M43 = (0f - (m * num14 - m2 * num16 + m3 * num17)) * num11;
1742 float num18 = m7 * m12 - m8 * m11;
1743 float num19 = m6 * m12 - m8 * m10;
1744 float num20 = m6 * m11 - m7 * m10;
1745 float num21 = m5 * m12 - m8 * m9;
1746 float num22 = m5 * m11 - m7 * m9;
1747 float num23 = m5 * m10 - m6 * m9;
1748 result.M14 = (0f - (m2 * num18 - m3 * num19 + m4 * num20)) * num11;
1749 result.M24 = (m * num18 - m3 * num21 + m4 * num22) * num11;
1750 result.M34 = (0f - (m * num19 - m2 * num21 + m4 * num23)) * num11;
1751 result.M44 = (m * num20 - m2 * num22 + m3 * num23) * num11;
1752 return result;
1753 }
1754
1755 public static void Invert(ref Matrix matrix, out Matrix result)
1756 {
1757 float m = matrix.M11;
1758 float m2 = matrix.M12;
1759 float m3 = matrix.M13;
1760 float m4 = matrix.M14;
1761 float m5 = matrix.M21;
1762 float m6 = matrix.M22;
1763 float m7 = matrix.M23;
1764 float m8 = matrix.M24;
1765 float m9 = matrix.M31;
1766 float m10 = matrix.M32;
1767 float m11 = matrix.M33;
1768 float m12 = matrix.M34;
1769 float m13 = matrix.M41;
1770 float m14 = matrix.M42;
1771 float m15 = matrix.M43;
1772 float m16 = matrix.M44;
1773 float num = m11 * m16 - m12 * m15;
1774 float num2 = m10 * m16 - m12 * m14;
1775 float num3 = m10 * m15 - m11 * m14;
1776 float num4 = m9 * m16 - m12 * m13;
1777 float num5 = m9 * m15 - m11 * m13;
1778 float num6 = m9 * m14 - m10 * m13;
1779 float num7 = m6 * num - m7 * num2 + m8 * num3;
1780 float num8 = 0f - (m5 * num - m7 * num4 + m8 * num5);
1781 float num9 = m5 * num2 - m6 * num4 + m8 * num6;
1782 float num10 = 0f - (m5 * num3 - m6 * num5 + m7 * num6);
1783 float num11 = 1f / (m * num7 + m2 * num8 + m3 * num9 + m4 * num10);
1784 result.M11 = num7 * num11;
1785 result.M21 = num8 * num11;
1786 result.M31 = num9 * num11;
1787 result.M41 = num10 * num11;
1788 result.M12 = (0f - (m2 * num - m3 * num2 + m4 * num3)) * num11;
1789 result.M22 = (m * num - m3 * num4 + m4 * num5) * num11;
1790 result.M32 = (0f - (m * num2 - m2 * num4 + m4 * num6)) * num11;
1791 result.M42 = (m * num3 - m2 * num5 + m3 * num6) * num11;
1792 float num12 = m7 * m16 - m8 * m15;
1793 float num13 = m6 * m16 - m8 * m14;
1794 float num14 = m6 * m15 - m7 * m14;
1795 float num15 = m5 * m16 - m8 * m13;
1796 float num16 = m5 * m15 - m7 * m13;
1797 float num17 = m5 * m14 - m6 * m13;
1798 result.M13 = (m2 * num12 - m3 * num13 + m4 * num14) * num11;
1799 result.M23 = (0f - (m * num12 - m3 * num15 + m4 * num16)) * num11;
1800 result.M33 = (m * num13 - m2 * num15 + m4 * num17) * num11;
1801 result.M43 = (0f - (m * num14 - m2 * num16 + m3 * num17)) * num11;
1802 float num18 = m7 * m12 - m8 * m11;
1803 float num19 = m6 * m12 - m8 * m10;
1804 float num20 = m6 * m11 - m7 * m10;
1805 float num21 = m5 * m12 - m8 * m9;
1806 float num22 = m5 * m11 - m7 * m9;
1807 float num23 = m5 * m10 - m6 * m9;
1808 result.M14 = (0f - (m2 * num18 - m3 * num19 + m4 * num20)) * num11;
1809 result.M24 = (m * num18 - m3 * num21 + m4 * num22) * num11;
1810 result.M34 = (0f - (m * num19 - m2 * num21 + m4 * num23)) * num11;
1811 result.M44 = (m * num20 - m2 * num22 + m3 * num23) * num11;
1812 }
1813
1814 public static Matrix Lerp(Matrix matrix1, Matrix matrix2, float amount)
1815 {
1816 Matrix result = default(Matrix);
1817 result.M11 = matrix1.M11 + (matrix2.M11 - matrix1.M11) * amount;
1818 result.M12 = matrix1.M12 + (matrix2.M12 - matrix1.M12) * amount;
1819 result.M13 = matrix1.M13 + (matrix2.M13 - matrix1.M13) * amount;
1820 result.M14 = matrix1.M14 + (matrix2.M14 - matrix1.M14) * amount;
1821 result.M21 = matrix1.M21 + (matrix2.M21 - matrix1.M21) * amount;
1822 result.M22 = matrix1.M22 + (matrix2.M22 - matrix1.M22) * amount;
1823 result.M23 = matrix1.M23 + (matrix2.M23 - matrix1.M23) * amount;
1824 result.M24 = matrix1.M24 + (matrix2.M24 - matrix1.M24) * amount;
1825 result.M31 = matrix1.M31 + (matrix2.M31 - matrix1.M31) * amount;
1826 result.M32 = matrix1.M32 + (matrix2.M32 - matrix1.M32) * amount;
1827 result.M33 = matrix1.M33 + (matrix2.M33 - matrix1.M33) * amount;
1828 result.M34 = matrix1.M34 + (matrix2.M34 - matrix1.M34) * amount;
1829 result.M41 = matrix1.M41 + (matrix2.M41 - matrix1.M41) * amount;
1830 result.M42 = matrix1.M42 + (matrix2.M42 - matrix1.M42) * amount;
1831 result.M43 = matrix1.M43 + (matrix2.M43 - matrix1.M43) * amount;
1832 result.M44 = matrix1.M44 + (matrix2.M44 - matrix1.M44) * amount;
1833 return result;
1834 }
1835
1836 public static void Lerp(ref Matrix matrix1, ref Matrix matrix2, float amount, out Matrix result)
1837 {
1838 result.M11 = matrix1.M11 + (matrix2.M11 - matrix1.M11) * amount;
1839 result.M12 = matrix1.M12 + (matrix2.M12 - matrix1.M12) * amount;
1840 result.M13 = matrix1.M13 + (matrix2.M13 - matrix1.M13) * amount;
1841 result.M14 = matrix1.M14 + (matrix2.M14 - matrix1.M14) * amount;
1842 result.M21 = matrix1.M21 + (matrix2.M21 - matrix1.M21) * amount;
1843 result.M22 = matrix1.M22 + (matrix2.M22 - matrix1.M22) * amount;
1844 result.M23 = matrix1.M23 + (matrix2.M23 - matrix1.M23) * amount;
1845 result.M24 = matrix1.M24 + (matrix2.M24 - matrix1.M24) * amount;
1846 result.M31 = matrix1.M31 + (matrix2.M31 - matrix1.M31) * amount;
1847 result.M32 = matrix1.M32 + (matrix2.M32 - matrix1.M32) * amount;
1848 result.M33 = matrix1.M33 + (matrix2.M33 - matrix1.M33) * amount;
1849 result.M34 = matrix1.M34 + (matrix2.M34 - matrix1.M34) * amount;
1850 result.M41 = matrix1.M41 + (matrix2.M41 - matrix1.M41) * amount;
1851 result.M42 = matrix1.M42 + (matrix2.M42 - matrix1.M42) * amount;
1852 result.M43 = matrix1.M43 + (matrix2.M43 - matrix1.M43) * amount;
1853 result.M44 = matrix1.M44 + (matrix2.M44 - matrix1.M44) * amount;
1854 }
1855
1856 public static Matrix Negate(Matrix matrix)
1857 {
1858 Matrix result = default(Matrix);
1859 result.M11 = 0f - matrix.M11;
1860 result.M12 = 0f - matrix.M12;
1861 result.M13 = 0f - matrix.M13;
1862 result.M14 = 0f - matrix.M14;
1863 result.M21 = 0f - matrix.M21;
1864 result.M22 = 0f - matrix.M22;
1865 result.M23 = 0f - matrix.M23;
1866 result.M24 = 0f - matrix.M24;
1867 result.M31 = 0f - matrix.M31;
1868 result.M32 = 0f - matrix.M32;
1869 result.M33 = 0f - matrix.M33;
1870 result.M34 = 0f - matrix.M34;
1871 result.M41 = 0f - matrix.M41;
1872 result.M42 = 0f - matrix.M42;
1873 result.M43 = 0f - matrix.M43;
1874 result.M44 = 0f - matrix.M44;
1875 return result;
1876 }
1877
1878 public static void Negate(ref Matrix matrix, out Matrix result)
1879 {
1880 result.M11 = 0f - matrix.M11;
1881 result.M12 = 0f - matrix.M12;
1882 result.M13 = 0f - matrix.M13;
1883 result.M14 = 0f - matrix.M14;
1884 result.M21 = 0f - matrix.M21;
1885 result.M22 = 0f - matrix.M22;
1886 result.M23 = 0f - matrix.M23;
1887 result.M24 = 0f - matrix.M24;
1888 result.M31 = 0f - matrix.M31;
1889 result.M32 = 0f - matrix.M32;
1890 result.M33 = 0f - matrix.M33;
1891 result.M34 = 0f - matrix.M34;
1892 result.M41 = 0f - matrix.M41;
1893 result.M42 = 0f - matrix.M42;
1894 result.M43 = 0f - matrix.M43;
1895 result.M44 = 0f - matrix.M44;
1896 }
1897
1898 public static Matrix Add(Matrix matrix1, Matrix matrix2)
1899 {
1900 Matrix result = default(Matrix);
1901 result.M11 = matrix1.M11 + matrix2.M11;
1902 result.M12 = matrix1.M12 + matrix2.M12;
1903 result.M13 = matrix1.M13 + matrix2.M13;
1904 result.M14 = matrix1.M14 + matrix2.M14;
1905 result.M21 = matrix1.M21 + matrix2.M21;
1906 result.M22 = matrix1.M22 + matrix2.M22;
1907 result.M23 = matrix1.M23 + matrix2.M23;
1908 result.M24 = matrix1.M24 + matrix2.M24;
1909 result.M31 = matrix1.M31 + matrix2.M31;
1910 result.M32 = matrix1.M32 + matrix2.M32;
1911 result.M33 = matrix1.M33 + matrix2.M33;
1912 result.M34 = matrix1.M34 + matrix2.M34;
1913 result.M41 = matrix1.M41 + matrix2.M41;
1914 result.M42 = matrix1.M42 + matrix2.M42;
1915 result.M43 = matrix1.M43 + matrix2.M43;
1916 result.M44 = matrix1.M44 + matrix2.M44;
1917 return result;
1918 }
1919
1920 public static void Add(ref Matrix matrix1, ref Matrix matrix2, out Matrix result)
1921 {
1922 result.M11 = matrix1.M11 + matrix2.M11;
1923 result.M12 = matrix1.M12 + matrix2.M12;
1924 result.M13 = matrix1.M13 + matrix2.M13;
1925 result.M14 = matrix1.M14 + matrix2.M14;
1926 result.M21 = matrix1.M21 + matrix2.M21;
1927 result.M22 = matrix1.M22 + matrix2.M22;
1928 result.M23 = matrix1.M23 + matrix2.M23;
1929 result.M24 = matrix1.M24 + matrix2.M24;
1930 result.M31 = matrix1.M31 + matrix2.M31;
1931 result.M32 = matrix1.M32 + matrix2.M32;
1932 result.M33 = matrix1.M33 + matrix2.M33;
1933 result.M34 = matrix1.M34 + matrix2.M34;
1934 result.M41 = matrix1.M41 + matrix2.M41;
1935 result.M42 = matrix1.M42 + matrix2.M42;
1936 result.M43 = matrix1.M43 + matrix2.M43;
1937 result.M44 = matrix1.M44 + matrix2.M44;
1938 }
1939
1940 public static Matrix Subtract(Matrix matrix1, Matrix matrix2)
1941 {
1942 Matrix result = default(Matrix);
1943 result.M11 = matrix1.M11 - matrix2.M11;
1944 result.M12 = matrix1.M12 - matrix2.M12;
1945 result.M13 = matrix1.M13 - matrix2.M13;
1946 result.M14 = matrix1.M14 - matrix2.M14;
1947 result.M21 = matrix1.M21 - matrix2.M21;
1948 result.M22 = matrix1.M22 - matrix2.M22;
1949 result.M23 = matrix1.M23 - matrix2.M23;
1950 result.M24 = matrix1.M24 - matrix2.M24;
1951 result.M31 = matrix1.M31 - matrix2.M31;
1952 result.M32 = matrix1.M32 - matrix2.M32;
1953 result.M33 = matrix1.M33 - matrix2.M33;
1954 result.M34 = matrix1.M34 - matrix2.M34;
1955 result.M41 = matrix1.M41 - matrix2.M41;
1956 result.M42 = matrix1.M42 - matrix2.M42;
1957 result.M43 = matrix1.M43 - matrix2.M43;
1958 result.M44 = matrix1.M44 - matrix2.M44;
1959 return result;
1960 }
1961
1962 public static void Subtract(ref Matrix matrix1, ref Matrix matrix2, out Matrix result)
1963 {
1964 result.M11 = matrix1.M11 - matrix2.M11;
1965 result.M12 = matrix1.M12 - matrix2.M12;
1966 result.M13 = matrix1.M13 - matrix2.M13;
1967 result.M14 = matrix1.M14 - matrix2.M14;
1968 result.M21 = matrix1.M21 - matrix2.M21;
1969 result.M22 = matrix1.M22 - matrix2.M22;
1970 result.M23 = matrix1.M23 - matrix2.M23;
1971 result.M24 = matrix1.M24 - matrix2.M24;
1972 result.M31 = matrix1.M31 - matrix2.M31;
1973 result.M32 = matrix1.M32 - matrix2.M32;
1974 result.M33 = matrix1.M33 - matrix2.M33;
1975 result.M34 = matrix1.M34 - matrix2.M34;
1976 result.M41 = matrix1.M41 - matrix2.M41;
1977 result.M42 = matrix1.M42 - matrix2.M42;
1978 result.M43 = matrix1.M43 - matrix2.M43;
1979 result.M44 = matrix1.M44 - matrix2.M44;
1980 }
1981
1982 public static Matrix Multiply(Matrix matrix1, Matrix matrix2)
1983 {
1984 Matrix result = default(Matrix);
1985 result.M11 = matrix1.M11 * matrix2.M11 + matrix1.M12 * matrix2.M21 + matrix1.M13 * matrix2.M31 + matrix1.M14 * matrix2.M41;
1986 result.M12 = matrix1.M11 * matrix2.M12 + matrix1.M12 * matrix2.M22 + matrix1.M13 * matrix2.M32 + matrix1.M14 * matrix2.M42;
1987 result.M13 = matrix1.M11 * matrix2.M13 + matrix1.M12 * matrix2.M23 + matrix1.M13 * matrix2.M33 + matrix1.M14 * matrix2.M43;
1988 result.M14 = matrix1.M11 * matrix2.M14 + matrix1.M12 * matrix2.M24 + matrix1.M13 * matrix2.M34 + matrix1.M14 * matrix2.M44;
1989 result.M21 = matrix1.M21 * matrix2.M11 + matrix1.M22 * matrix2.M21 + matrix1.M23 * matrix2.M31 + matrix1.M24 * matrix2.M41;
1990 result.M22 = matrix1.M21 * matrix2.M12 + matrix1.M22 * matrix2.M22 + matrix1.M23 * matrix2.M32 + matrix1.M24 * matrix2.M42;
1991 result.M23 = matrix1.M21 * matrix2.M13 + matrix1.M22 * matrix2.M23 + matrix1.M23 * matrix2.M33 + matrix1.M24 * matrix2.M43;
1992 result.M24 = matrix1.M21 * matrix2.M14 + matrix1.M22 * matrix2.M24 + matrix1.M23 * matrix2.M34 + matrix1.M24 * matrix2.M44;
1993 result.M31 = matrix1.M31 * matrix2.M11 + matrix1.M32 * matrix2.M21 + matrix1.M33 * matrix2.M31 + matrix1.M34 * matrix2.M41;
1994 result.M32 = matrix1.M31 * matrix2.M12 + matrix1.M32 * matrix2.M22 + matrix1.M33 * matrix2.M32 + matrix1.M34 * matrix2.M42;
1995 result.M33 = matrix1.M31 * matrix2.M13 + matrix1.M32 * matrix2.M23 + matrix1.M33 * matrix2.M33 + matrix1.M34 * matrix2.M43;
1996 result.M34 = matrix1.M31 * matrix2.M14 + matrix1.M32 * matrix2.M24 + matrix1.M33 * matrix2.M34 + matrix1.M34 * matrix2.M44;
1997 result.M41 = matrix1.M41 * matrix2.M11 + matrix1.M42 * matrix2.M21 + matrix1.M43 * matrix2.M31 + matrix1.M44 * matrix2.M41;
1998 result.M42 = matrix1.M41 * matrix2.M12 + matrix1.M42 * matrix2.M22 + matrix1.M43 * matrix2.M32 + matrix1.M44 * matrix2.M42;
1999 result.M43 = matrix1.M41 * matrix2.M13 + matrix1.M42 * matrix2.M23 + matrix1.M43 * matrix2.M33 + matrix1.M44 * matrix2.M43;
2000 result.M44 = matrix1.M41 * matrix2.M14 + matrix1.M42 * matrix2.M24 + matrix1.M43 * matrix2.M34 + matrix1.M44 * matrix2.M44;
2001 return result;
2002 }
2003
2004 public static void Multiply(ref Matrix matrix1, ref Matrix matrix2, out Matrix result)
2005 {
2006 float m = matrix1.M11 * matrix2.M11 + matrix1.M12 * matrix2.M21 + matrix1.M13 * matrix2.M31 + matrix1.M14 * matrix2.M41;
2007 float m2 = matrix1.M11 * matrix2.M12 + matrix1.M12 * matrix2.M22 + matrix1.M13 * matrix2.M32 + matrix1.M14 * matrix2.M42;
2008 float m3 = matrix1.M11 * matrix2.M13 + matrix1.M12 * matrix2.M23 + matrix1.M13 * matrix2.M33 + matrix1.M14 * matrix2.M43;
2009 float m4 = matrix1.M11 * matrix2.M14 + matrix1.M12 * matrix2.M24 + matrix1.M13 * matrix2.M34 + matrix1.M14 * matrix2.M44;
2010 float m5 = matrix1.M21 * matrix2.M11 + matrix1.M22 * matrix2.M21 + matrix1.M23 * matrix2.M31 + matrix1.M24 * matrix2.M41;
2011 float m6 = matrix1.M21 * matrix2.M12 + matrix1.M22 * matrix2.M22 + matrix1.M23 * matrix2.M32 + matrix1.M24 * matrix2.M42;
2012 float m7 = matrix1.M21 * matrix2.M13 + matrix1.M22 * matrix2.M23 + matrix1.M23 * matrix2.M33 + matrix1.M24 * matrix2.M43;
2013 float m8 = matrix1.M21 * matrix2.M14 + matrix1.M22 * matrix2.M24 + matrix1.M23 * matrix2.M34 + matrix1.M24 * matrix2.M44;
2014 float m9 = matrix1.M31 * matrix2.M11 + matrix1.M32 * matrix2.M21 + matrix1.M33 * matrix2.M31 + matrix1.M34 * matrix2.M41;
2015 float m10 = matrix1.M31 * matrix2.M12 + matrix1.M32 * matrix2.M22 + matrix1.M33 * matrix2.M32 + matrix1.M34 * matrix2.M42;
2016 float m11 = matrix1.M31 * matrix2.M13 + matrix1.M32 * matrix2.M23 + matrix1.M33 * matrix2.M33 + matrix1.M34 * matrix2.M43;
2017 float m12 = matrix1.M31 * matrix2.M14 + matrix1.M32 * matrix2.M24 + matrix1.M33 * matrix2.M34 + matrix1.M34 * matrix2.M44;
2018 float m13 = matrix1.M41 * matrix2.M11 + matrix1.M42 * matrix2.M21 + matrix1.M43 * matrix2.M31 + matrix1.M44 * matrix2.M41;
2019 float m14 = matrix1.M41 * matrix2.M12 + matrix1.M42 * matrix2.M22 + matrix1.M43 * matrix2.M32 + matrix1.M44 * matrix2.M42;
2020 float m15 = matrix1.M41 * matrix2.M13 + matrix1.M42 * matrix2.M23 + matrix1.M43 * matrix2.M33 + matrix1.M44 * matrix2.M43;
2021 float m16 = matrix1.M41 * matrix2.M14 + matrix1.M42 * matrix2.M24 + matrix1.M43 * matrix2.M34 + matrix1.M44 * matrix2.M44;
2022 result.M11 = m;
2023 result.M12 = m2;
2024 result.M13 = m3;
2025 result.M14 = m4;
2026 result.M21 = m5;
2027 result.M22 = m6;
2028 result.M23 = m7;
2029 result.M24 = m8;
2030 result.M31 = m9;
2031 result.M32 = m10;
2032 result.M33 = m11;
2033 result.M34 = m12;
2034 result.M41 = m13;
2035 result.M42 = m14;
2036 result.M43 = m15;
2037 result.M44 = m16;
2038 }
2039
2040 public static Matrix Multiply(Matrix matrix1, float scaleFactor)
2041 {
2042 Matrix result = default(Matrix);
2043 result.M11 = matrix1.M11 * scaleFactor;
2044 result.M12 = matrix1.M12 * scaleFactor;
2045 result.M13 = matrix1.M13 * scaleFactor;
2046 result.M14 = matrix1.M14 * scaleFactor;
2047 result.M21 = matrix1.M21 * scaleFactor;
2048 result.M22 = matrix1.M22 * scaleFactor;
2049 result.M23 = matrix1.M23 * scaleFactor;
2050 result.M24 = matrix1.M24 * scaleFactor;
2051 result.M31 = matrix1.M31 * scaleFactor;
2052 result.M32 = matrix1.M32 * scaleFactor;
2053 result.M33 = matrix1.M33 * scaleFactor;
2054 result.M34 = matrix1.M34 * scaleFactor;
2055 result.M41 = matrix1.M41 * scaleFactor;
2056 result.M42 = matrix1.M42 * scaleFactor;
2057 result.M43 = matrix1.M43 * scaleFactor;
2058 result.M44 = matrix1.M44 * scaleFactor;
2059 return result;
2060 }
2061
2062 public static void Multiply(ref Matrix matrix1, float scaleFactor, out Matrix result)
2063 {
2064 result.M11 = matrix1.M11 * scaleFactor;
2065 result.M12 = matrix1.M12 * scaleFactor;
2066 result.M13 = matrix1.M13 * scaleFactor;
2067 result.M14 = matrix1.M14 * scaleFactor;
2068 result.M21 = matrix1.M21 * scaleFactor;
2069 result.M22 = matrix1.M22 * scaleFactor;
2070 result.M23 = matrix1.M23 * scaleFactor;
2071 result.M24 = matrix1.M24 * scaleFactor;
2072 result.M31 = matrix1.M31 * scaleFactor;
2073 result.M32 = matrix1.M32 * scaleFactor;
2074 result.M33 = matrix1.M33 * scaleFactor;
2075 result.M34 = matrix1.M34 * scaleFactor;
2076 result.M41 = matrix1.M41 * scaleFactor;
2077 result.M42 = matrix1.M42 * scaleFactor;
2078 result.M43 = matrix1.M43 * scaleFactor;
2079 result.M44 = matrix1.M44 * scaleFactor;
2080 }
2081
2082 public static Matrix Divide(Matrix matrix1, Matrix matrix2)
2083 {
2084 Matrix result = default(Matrix);
2085 result.M11 = matrix1.M11 / matrix2.M11;
2086 result.M12 = matrix1.M12 / matrix2.M12;
2087 result.M13 = matrix1.M13 / matrix2.M13;
2088 result.M14 = matrix1.M14 / matrix2.M14;
2089 result.M21 = matrix1.M21 / matrix2.M21;
2090 result.M22 = matrix1.M22 / matrix2.M22;
2091 result.M23 = matrix1.M23 / matrix2.M23;
2092 result.M24 = matrix1.M24 / matrix2.M24;
2093 result.M31 = matrix1.M31 / matrix2.M31;
2094 result.M32 = matrix1.M32 / matrix2.M32;
2095 result.M33 = matrix1.M33 / matrix2.M33;
2096 result.M34 = matrix1.M34 / matrix2.M34;
2097 result.M41 = matrix1.M41 / matrix2.M41;
2098 result.M42 = matrix1.M42 / matrix2.M42;
2099 result.M43 = matrix1.M43 / matrix2.M43;
2100 result.M44 = matrix1.M44 / matrix2.M44;
2101 return result;
2102 }
2103
2104 public static void Divide(ref Matrix matrix1, ref Matrix matrix2, out Matrix result)
2105 {
2106 result.M11 = matrix1.M11 / matrix2.M11;
2107 result.M12 = matrix1.M12 / matrix2.M12;
2108 result.M13 = matrix1.M13 / matrix2.M13;
2109 result.M14 = matrix1.M14 / matrix2.M14;
2110 result.M21 = matrix1.M21 / matrix2.M21;
2111 result.M22 = matrix1.M22 / matrix2.M22;
2112 result.M23 = matrix1.M23 / matrix2.M23;
2113 result.M24 = matrix1.M24 / matrix2.M24;
2114 result.M31 = matrix1.M31 / matrix2.M31;
2115 result.M32 = matrix1.M32 / matrix2.M32;
2116 result.M33 = matrix1.M33 / matrix2.M33;
2117 result.M34 = matrix1.M34 / matrix2.M34;
2118 result.M41 = matrix1.M41 / matrix2.M41;
2119 result.M42 = matrix1.M42 / matrix2.M42;
2120 result.M43 = matrix1.M43 / matrix2.M43;
2121 result.M44 = matrix1.M44 / matrix2.M44;
2122 }
2123
2124 public static Matrix Divide(Matrix matrix1, float divider)
2125 {
2126 float num = 1f / divider;
2127 Matrix result = default(Matrix);
2128 result.M11 = matrix1.M11 * num;
2129 result.M12 = matrix1.M12 * num;
2130 result.M13 = matrix1.M13 * num;
2131 result.M14 = matrix1.M14 * num;
2132 result.M21 = matrix1.M21 * num;
2133 result.M22 = matrix1.M22 * num;
2134 result.M23 = matrix1.M23 * num;
2135 result.M24 = matrix1.M24 * num;
2136 result.M31 = matrix1.M31 * num;
2137 result.M32 = matrix1.M32 * num;
2138 result.M33 = matrix1.M33 * num;
2139 result.M34 = matrix1.M34 * num;
2140 result.M41 = matrix1.M41 * num;
2141 result.M42 = matrix1.M42 * num;
2142 result.M43 = matrix1.M43 * num;
2143 result.M44 = matrix1.M44 * num;
2144 return result;
2145 }
2146
2147 public static void Divide(ref Matrix matrix1, float divider, out Matrix result)
2148 {
2149 float num = 1f / divider;
2150 result.M11 = matrix1.M11 * num;
2151 result.M12 = matrix1.M12 * num;
2152 result.M13 = matrix1.M13 * num;
2153 result.M14 = matrix1.M14 * num;
2154 result.M21 = matrix1.M21 * num;
2155 result.M22 = matrix1.M22 * num;
2156 result.M23 = matrix1.M23 * num;
2157 result.M24 = matrix1.M24 * num;
2158 result.M31 = matrix1.M31 * num;
2159 result.M32 = matrix1.M32 * num;
2160 result.M33 = matrix1.M33 * num;
2161 result.M34 = matrix1.M34 * num;
2162 result.M41 = matrix1.M41 * num;
2163 result.M42 = matrix1.M42 * num;
2164 result.M43 = matrix1.M43 * num;
2165 result.M44 = matrix1.M44 * num;
2166 }
2167
2168 public static Matrix operator -(Matrix matrix1)
2169 {
2170 Matrix result = default(Matrix);
2171 result.M11 = 0f - matrix1.M11;
2172 result.M12 = 0f - matrix1.M12;
2173 result.M13 = 0f - matrix1.M13;
2174 result.M14 = 0f - matrix1.M14;
2175 result.M21 = 0f - matrix1.M21;
2176 result.M22 = 0f - matrix1.M22;
2177 result.M23 = 0f - matrix1.M23;
2178 result.M24 = 0f - matrix1.M24;
2179 result.M31 = 0f - matrix1.M31;
2180 result.M32 = 0f - matrix1.M32;
2181 result.M33 = 0f - matrix1.M33;
2182 result.M34 = 0f - matrix1.M34;
2183 result.M41 = 0f - matrix1.M41;
2184 result.M42 = 0f - matrix1.M42;
2185 result.M43 = 0f - matrix1.M43;
2186 result.M44 = 0f - matrix1.M44;
2187 return result;
2188 }
2189
2190 public static bool operator ==(Matrix matrix1, Matrix matrix2)
2191 {
2192 if (matrix1.M11 == matrix2.M11 && matrix1.M22 == matrix2.M22 && matrix1.M33 == matrix2.M33 && matrix1.M44 == matrix2.M44 && matrix1.M12 == matrix2.M12 && matrix1.M13 == matrix2.M13 && matrix1.M14 == matrix2.M14 && matrix1.M21 == matrix2.M21 && matrix1.M23 == matrix2.M23 && matrix1.M24 == matrix2.M24 && matrix1.M31 == matrix2.M31 && matrix1.M32 == matrix2.M32 && matrix1.M34 == matrix2.M34 && matrix1.M41 == matrix2.M41 && matrix1.M42 == matrix2.M42)
2193 {
2194 return matrix1.M43 == matrix2.M43;
2195 }
2196 return false;
2197 }
2198
2199 public static bool operator !=(Matrix matrix1, Matrix matrix2)
2200 {
2201 if (matrix1.M11 == matrix2.M11 && matrix1.M12 == matrix2.M12 && matrix1.M13 == matrix2.M13 && matrix1.M14 == matrix2.M14 && matrix1.M21 == matrix2.M21 && matrix1.M22 == matrix2.M22 && matrix1.M23 == matrix2.M23 && matrix1.M24 == matrix2.M24 && matrix1.M31 == matrix2.M31 && matrix1.M32 == matrix2.M32 && matrix1.M33 == matrix2.M33 && matrix1.M34 == matrix2.M34 && matrix1.M41 == matrix2.M41 && matrix1.M42 == matrix2.M42 && matrix1.M43 == matrix2.M43)
2202 {
2203 return matrix1.M44 != matrix2.M44;
2204 }
2205 return true;
2206 }
2207
2208 public static Matrix operator +(Matrix matrix1, Matrix matrix2)
2209 {
2210 Matrix result = default(Matrix);
2211 result.M11 = matrix1.M11 + matrix2.M11;
2212 result.M12 = matrix1.M12 + matrix2.M12;
2213 result.M13 = matrix1.M13 + matrix2.M13;
2214 result.M14 = matrix1.M14 + matrix2.M14;
2215 result.M21 = matrix1.M21 + matrix2.M21;
2216 result.M22 = matrix1.M22 + matrix2.M22;
2217 result.M23 = matrix1.M23 + matrix2.M23;
2218 result.M24 = matrix1.M24 + matrix2.M24;
2219 result.M31 = matrix1.M31 + matrix2.M31;
2220 result.M32 = matrix1.M32 + matrix2.M32;
2221 result.M33 = matrix1.M33 + matrix2.M33;
2222 result.M34 = matrix1.M34 + matrix2.M34;
2223 result.M41 = matrix1.M41 + matrix2.M41;
2224 result.M42 = matrix1.M42 + matrix2.M42;
2225 result.M43 = matrix1.M43 + matrix2.M43;
2226 result.M44 = matrix1.M44 + matrix2.M44;
2227 return result;
2228 }
2229
2230 public static Matrix operator -(Matrix matrix1, Matrix matrix2)
2231 {
2232 Matrix result = default(Matrix);
2233 result.M11 = matrix1.M11 - matrix2.M11;
2234 result.M12 = matrix1.M12 - matrix2.M12;
2235 result.M13 = matrix1.M13 - matrix2.M13;
2236 result.M14 = matrix1.M14 - matrix2.M14;
2237 result.M21 = matrix1.M21 - matrix2.M21;
2238 result.M22 = matrix1.M22 - matrix2.M22;
2239 result.M23 = matrix1.M23 - matrix2.M23;
2240 result.M24 = matrix1.M24 - matrix2.M24;
2241 result.M31 = matrix1.M31 - matrix2.M31;
2242 result.M32 = matrix1.M32 - matrix2.M32;
2243 result.M33 = matrix1.M33 - matrix2.M33;
2244 result.M34 = matrix1.M34 - matrix2.M34;
2245 result.M41 = matrix1.M41 - matrix2.M41;
2246 result.M42 = matrix1.M42 - matrix2.M42;
2247 result.M43 = matrix1.M43 - matrix2.M43;
2248 result.M44 = matrix1.M44 - matrix2.M44;
2249 return result;
2250 }
2251
2252 public static Matrix operator *(Matrix matrix1, Matrix matrix2)
2253 {
2254 Matrix result = default(Matrix);
2255 result.M11 = matrix1.M11 * matrix2.M11 + matrix1.M12 * matrix2.M21 + matrix1.M13 * matrix2.M31 + matrix1.M14 * matrix2.M41;
2256 result.M12 = matrix1.M11 * matrix2.M12 + matrix1.M12 * matrix2.M22 + matrix1.M13 * matrix2.M32 + matrix1.M14 * matrix2.M42;
2257 result.M13 = matrix1.M11 * matrix2.M13 + matrix1.M12 * matrix2.M23 + matrix1.M13 * matrix2.M33 + matrix1.M14 * matrix2.M43;
2258 result.M14 = matrix1.M11 * matrix2.M14 + matrix1.M12 * matrix2.M24 + matrix1.M13 * matrix2.M34 + matrix1.M14 * matrix2.M44;
2259 result.M21 = matrix1.M21 * matrix2.M11 + matrix1.M22 * matrix2.M21 + matrix1.M23 * matrix2.M31 + matrix1.M24 * matrix2.M41;
2260 result.M22 = matrix1.M21 * matrix2.M12 + matrix1.M22 * matrix2.M22 + matrix1.M23 * matrix2.M32 + matrix1.M24 * matrix2.M42;
2261 result.M23 = matrix1.M21 * matrix2.M13 + matrix1.M22 * matrix2.M23 + matrix1.M23 * matrix2.M33 + matrix1.M24 * matrix2.M43;
2262 result.M24 = matrix1.M21 * matrix2.M14 + matrix1.M22 * matrix2.M24 + matrix1.M23 * matrix2.M34 + matrix1.M24 * matrix2.M44;
2263 result.M31 = matrix1.M31 * matrix2.M11 + matrix1.M32 * matrix2.M21 + matrix1.M33 * matrix2.M31 + matrix1.M34 * matrix2.M41;
2264 result.M32 = matrix1.M31 * matrix2.M12 + matrix1.M32 * matrix2.M22 + matrix1.M33 * matrix2.M32 + matrix1.M34 * matrix2.M42;
2265 result.M33 = matrix1.M31 * matrix2.M13 + matrix1.M32 * matrix2.M23 + matrix1.M33 * matrix2.M33 + matrix1.M34 * matrix2.M43;
2266 result.M34 = matrix1.M31 * matrix2.M14 + matrix1.M32 * matrix2.M24 + matrix1.M33 * matrix2.M34 + matrix1.M34 * matrix2.M44;
2267 result.M41 = matrix1.M41 * matrix2.M11 + matrix1.M42 * matrix2.M21 + matrix1.M43 * matrix2.M31 + matrix1.M44 * matrix2.M41;
2268 result.M42 = matrix1.M41 * matrix2.M12 + matrix1.M42 * matrix2.M22 + matrix1.M43 * matrix2.M32 + matrix1.M44 * matrix2.M42;
2269 result.M43 = matrix1.M41 * matrix2.M13 + matrix1.M42 * matrix2.M23 + matrix1.M43 * matrix2.M33 + matrix1.M44 * matrix2.M43;
2270 result.M44 = matrix1.M41 * matrix2.M14 + matrix1.M42 * matrix2.M24 + matrix1.M43 * matrix2.M34 + matrix1.M44 * matrix2.M44;
2271 return result;
2272 }
2273
2274 public static Matrix operator *(Matrix matrix, float scaleFactor)
2275 {
2276 Matrix result = default(Matrix);
2277 result.M11 = matrix.M11 * scaleFactor;
2278 result.M12 = matrix.M12 * scaleFactor;
2279 result.M13 = matrix.M13 * scaleFactor;
2280 result.M14 = matrix.M14 * scaleFactor;
2281 result.M21 = matrix.M21 * scaleFactor;
2282 result.M22 = matrix.M22 * scaleFactor;
2283 result.M23 = matrix.M23 * scaleFactor;
2284 result.M24 = matrix.M24 * scaleFactor;
2285 result.M31 = matrix.M31 * scaleFactor;
2286 result.M32 = matrix.M32 * scaleFactor;
2287 result.M33 = matrix.M33 * scaleFactor;
2288 result.M34 = matrix.M34 * scaleFactor;
2289 result.M41 = matrix.M41 * scaleFactor;
2290 result.M42 = matrix.M42 * scaleFactor;
2291 result.M43 = matrix.M43 * scaleFactor;
2292 result.M44 = matrix.M44 * scaleFactor;
2293 return result;
2294 }
2295
2296 public static Matrix operator *(float scaleFactor, Matrix matrix)
2297 {
2298 Matrix result = default(Matrix);
2299 result.M11 = matrix.M11 * scaleFactor;
2300 result.M12 = matrix.M12 * scaleFactor;
2301 result.M13 = matrix.M13 * scaleFactor;
2302 result.M14 = matrix.M14 * scaleFactor;
2303 result.M21 = matrix.M21 * scaleFactor;
2304 result.M22 = matrix.M22 * scaleFactor;
2305 result.M23 = matrix.M23 * scaleFactor;
2306 result.M24 = matrix.M24 * scaleFactor;
2307 result.M31 = matrix.M31 * scaleFactor;
2308 result.M32 = matrix.M32 * scaleFactor;
2309 result.M33 = matrix.M33 * scaleFactor;
2310 result.M34 = matrix.M34 * scaleFactor;
2311 result.M41 = matrix.M41 * scaleFactor;
2312 result.M42 = matrix.M42 * scaleFactor;
2313 result.M43 = matrix.M43 * scaleFactor;
2314 result.M44 = matrix.M44 * scaleFactor;
2315 return result;
2316 }
2317
2318 public static Matrix operator /(Matrix matrix1, Matrix matrix2)
2319 {
2320 Matrix result = default(Matrix);
2321 result.M11 = matrix1.M11 / matrix2.M11;
2322 result.M12 = matrix1.M12 / matrix2.M12;
2323 result.M13 = matrix1.M13 / matrix2.M13;
2324 result.M14 = matrix1.M14 / matrix2.M14;
2325 result.M21 = matrix1.M21 / matrix2.M21;
2326 result.M22 = matrix1.M22 / matrix2.M22;
2327 result.M23 = matrix1.M23 / matrix2.M23;
2328 result.M24 = matrix1.M24 / matrix2.M24;
2329 result.M31 = matrix1.M31 / matrix2.M31;
2330 result.M32 = matrix1.M32 / matrix2.M32;
2331 result.M33 = matrix1.M33 / matrix2.M33;
2332 result.M34 = matrix1.M34 / matrix2.M34;
2333 result.M41 = matrix1.M41 / matrix2.M41;
2334 result.M42 = matrix1.M42 / matrix2.M42;
2335 result.M43 = matrix1.M43 / matrix2.M43;
2336 result.M44 = matrix1.M44 / matrix2.M44;
2337 return result;
2338 }
2339
2340 public static Matrix operator /(Matrix matrix1, float divider)
2341 {
2342 float num = 1f / divider;
2343 Matrix result = default(Matrix);
2344 result.M11 = matrix1.M11 * num;
2345 result.M12 = matrix1.M12 * num;
2346 result.M13 = matrix1.M13 * num;
2347 result.M14 = matrix1.M14 * num;
2348 result.M21 = matrix1.M21 * num;
2349 result.M22 = matrix1.M22 * num;
2350 result.M23 = matrix1.M23 * num;
2351 result.M24 = matrix1.M24 * num;
2352 result.M31 = matrix1.M31 * num;
2353 result.M32 = matrix1.M32 * num;
2354 result.M33 = matrix1.M33 * num;
2355 result.M34 = matrix1.M34 * num;
2356 result.M41 = matrix1.M41 * num;
2357 result.M42 = matrix1.M42 * num;
2358 result.M43 = matrix1.M43 * num;
2359 result.M44 = matrix1.M44 * num;
2360 return result;
2361 }
2362}
static CultureInfo CurrentCulture
static double Cos(double d)
static double Tan(double a)
static double Sqrt(double d)
static double Abs(double value)
static double Sin(double a)
const double PI
Definition Math.cs:16
static void CreateShadow(ref Vector3 lightDirection, ref Plane plane, out Matrix result)
Definition Matrix.cs:1281
static void Multiply(ref Matrix matrix1, float scaleFactor, out Matrix result)
Definition Matrix.cs:2062
static Matrix CreateShadow(Vector3 lightDirection, Plane plane)
Definition Matrix.cs:1253
static void CreateRotationX(float radians, out Matrix result)
Definition Matrix.cs:678
static void CreateScale(float xScale, float yScale, float zScale, out Matrix result)
Definition Matrix.cs:544
Matrix(float m11, float m12, float m13, float m14, float m21, float m22, float m23, float m24, float m31, float m32, float m33, float m34, float m41, float m42, float m43, float m44)
Definition Matrix.cs:210
unsafe bool Decompose(out Vector3 scale, out Quaternion rotation, out Vector3 translation)
Definition Matrix.cs:1364
static Matrix operator+(Matrix matrix1, Matrix matrix2)
Definition Matrix.cs:2208
static Matrix CreateOrthographic(float width, float height, float zNearPlane, float zFarPlane)
Definition Matrix.cs:1026
static Matrix Transform(Matrix value, Quaternion rotation)
Definition Matrix.cs:1479
static Matrix Multiply(Matrix matrix1, float scaleFactor)
Definition Matrix.cs:2040
static void Multiply(ref Matrix matrix1, ref Matrix matrix2, out Matrix result)
Definition Matrix.cs:2004
static void Add(ref Matrix matrix1, ref Matrix matrix2, out Matrix result)
Definition Matrix.cs:1920
static void CreateScale(float scale, out Matrix result)
Definition Matrix.cs:634
static void CreateOrthographic(float width, float height, float zNearPlane, float zFarPlane, out Matrix result)
Definition Matrix.cs:1041
static Matrix CreatePerspectiveFieldOfView(float fieldOfView, float aspectRatio, float nearPlaneDistance, float farPlaneDistance)
Definition Matrix.cs:856
static void Transpose(ref Matrix matrix, out Matrix result)
Definition Matrix.cs:1631
static void CreateFromYawPitchRoll(float yaw, float pitch, float roll, out Matrix result)
Definition Matrix.cs:1247
static Matrix CreateOrthographicOffCenter(float left, float right, float bottom, float top, float zNearPlane, float zFarPlane)
Definition Matrix.cs:1054
static void Divide(ref Matrix matrix1, float divider, out Matrix result)
Definition Matrix.cs:2147
static void Transform(ref Matrix value, ref Quaternion rotation, out Matrix result)
Definition Matrix.cs:1522
static void CreateConstrainedBillboard(ref Vector3 objectPosition, ref Vector3 cameraPosition, ref Vector3 rotateAxis, Vector3? cameraForwardVector, Vector3? objectForwardVector, out Matrix result)
Definition Matrix.cs:372
static Matrix CreateFromYawPitchRoll(float yaw, float pitch, float roll)
Definition Matrix.cs:1240
static Matrix CreateConstrainedBillboard(Vector3 objectPosition, Vector3 cameraPosition, Vector3 rotateAxis, Vector3? cameraForwardVector, Vector3? objectForwardVector)
Definition Matrix.cs:304
static Matrix CreateFromAxisAngle(Vector3 axis, float angle)
Definition Matrix.cs:792
static void CreateFromAxisAngle(ref Vector3 axis, float angle, out Matrix result)
Definition Matrix.cs:825
static Matrix Add(Matrix matrix1, Matrix matrix2)
Definition Matrix.cs:1898
static void CreateRotationY(float radians, out Matrix result)
Definition Matrix.cs:724
static Matrix CreatePerspective(float width, float height, float nearPlaneDistance, float farPlaneDistance)
Definition Matrix.cs:920
static bool operator!=(Matrix matrix1, Matrix matrix2)
Definition Matrix.cs:2199
static Matrix Divide(Matrix matrix1, float divider)
Definition Matrix.cs:2124
static Matrix CreateLookAt(Vector3 cameraPosition, Vector3 cameraTarget, Vector3 cameraUpVector)
Definition Matrix.cs:1084
static Matrix CreateBillboard(Vector3 objectPosition, Vector3 cameraPosition, Vector3 cameraUpVector, Vector3? cameraForwardVector)
Definition Matrix.cs:230
static void CreateTranslation(ref Vector3 position, out Matrix result)
Definition Matrix.cs:460
static Matrix operator*(Matrix matrix1, Matrix matrix2)
Definition Matrix.cs:2252
static Matrix operator-(Matrix matrix1)
Definition Matrix.cs:2168
static Matrix Invert(Matrix matrix)
Definition Matrix.cs:1694
static void CreateWorld(ref Vector3 position, ref Vector3 forward, ref Vector3 up, out Matrix result)
Definition Matrix.cs:1157
static void CreateLookAt(ref Vector3 cameraPosition, ref Vector3 cameraTarget, ref Vector3 cameraUpVector, out Matrix result)
Definition Matrix.cs:1109
static Matrix Multiply(Matrix matrix1, Matrix matrix2)
Definition Matrix.cs:1982
static Matrix CreateTranslation(Vector3 position)
Definition Matrix.cs:438
static Matrix operator/(Matrix matrix1, Matrix matrix2)
Definition Matrix.cs:2318
override string ToString()
Definition Matrix.cs:1579
static void Invert(ref Matrix matrix, out Matrix result)
Definition Matrix.cs:1755
static Matrix CreateFromQuaternion(Quaternion quaternion)
Definition Matrix.cs:1180
static void CreatePerspective(float width, float height, float nearPlaneDistance, float farPlaneDistance, out Matrix result)
Definition Matrix.cs:947
static void CreateReflection(ref Plane value, out Matrix result)
Definition Matrix.cs:1336
static Matrix Divide(Matrix matrix1, Matrix matrix2)
Definition Matrix.cs:2082
static Matrix CreateScale(Vector3 scales)
Definition Matrix.cs:564
static Matrix CreateScale(float scale)
Definition Matrix.cs:612
static void CreateFromQuaternion(ref Quaternion quaternion, out Matrix result)
Definition Matrix.cs:1211
static void Subtract(ref Matrix matrix1, ref Matrix matrix2, out Matrix result)
Definition Matrix.cs:1962
override bool Equals(object obj)
Definition Matrix.cs:1594
static void CreateScale(ref Vector3 scales, out Matrix result)
Definition Matrix.cs:589
static void CreateRotationZ(float radians, out Matrix result)
Definition Matrix.cs:770
static Matrix CreateRotationX(float radians)
Definition Matrix.cs:654
static Matrix Subtract(Matrix matrix1, Matrix matrix2)
Definition Matrix.cs:1940
static Matrix CreateTranslation(float xPosition, float yPosition, float zPosition)
Definition Matrix.cs:480
static Matrix CreateScale(float xScale, float yScale, float zScale)
Definition Matrix.cs:522
bool Equals(Matrix other)
Definition Matrix.cs:1585
static Matrix CreateReflection(Plane value)
Definition Matrix.cs:1307
static Matrix Lerp(Matrix matrix1, Matrix matrix2, float amount)
Definition Matrix.cs:1814
static void Lerp(ref Matrix matrix1, ref Matrix matrix2, float amount, out Matrix result)
Definition Matrix.cs:1836
static void CreateBillboard(ref Vector3 objectPosition, ref Vector3 cameraPosition, ref Vector3 cameraUpVector, Vector3? cameraForwardVector, out Matrix result)
Definition Matrix.cs:268
static Matrix CreatePerspectiveOffCenter(float left, float right, float bottom, float top, float nearPlaneDistance, float farPlaneDistance)
Definition Matrix.cs:972
static bool operator==(Matrix matrix1, Matrix matrix2)
Definition Matrix.cs:2190
static void Negate(ref Matrix matrix, out Matrix result)
Definition Matrix.cs:1878
static void CreatePerspectiveFieldOfView(float fieldOfView, float aspectRatio, float nearPlaneDistance, float farPlaneDistance, out Matrix result)
Definition Matrix.cs:889
static Matrix CreateWorld(Vector3 position, Vector3 forward, Vector3 up)
Definition Matrix.cs:1132
static void CreateOrthographicOffCenter(float left, float right, float bottom, float top, float zNearPlane, float zFarPlane, out Matrix result)
Definition Matrix.cs:1070
static Matrix CreateRotationY(float radians)
Definition Matrix.cs:700
static Matrix Negate(Matrix matrix)
Definition Matrix.cs:1856
static void CreateTranslation(float xPosition, float yPosition, float zPosition, out Matrix result)
Definition Matrix.cs:502
static void CreatePerspectiveOffCenter(float left, float right, float bottom, float top, float nearPlaneDistance, float farPlaneDistance, out Matrix result)
Definition Matrix.cs:1000
static Matrix CreateRotationZ(float radians)
Definition Matrix.cs:746
static void Divide(ref Matrix matrix1, ref Matrix matrix2, out Matrix result)
Definition Matrix.cs:2104
static Matrix Transpose(Matrix matrix)
Definition Matrix.cs:1609
static Quaternion CreateFromRotationMatrix(Matrix matrix)
static Quaternion CreateFromYawPitchRoll(float yaw, float pitch, float roll)
static Vector3 Multiply(Vector3 value1, Vector3 value2)
Definition Vector3.cs:761
static float Dot(Vector3 vector1, Vector3 vector2)
Definition Vector3.cs:165
static Vector3 Cross(Vector3 vector1, Vector3 vector2)
Definition Vector3.cs:204