OSDN Git Service

Merge branch 'feature/#36529_SlimDXからSharpDXへの移行' into develop
[dtxmania/dtxmania.git] / SlimDXc_Jun2010(VC++2008) / source / math / Matrix.cpp
diff --git a/SlimDXc_Jun2010(VC++2008)/source/math/Matrix.cpp b/SlimDXc_Jun2010(VC++2008)/source/math/Matrix.cpp
deleted file mode 100644 (file)
index 5a8a568..0000000
+++ /dev/null
@@ -1,1810 +0,0 @@
-#include "stdafx.h"\r
-/*\r
-* Copyright (c) 2007-2010 SlimDX Group\r
-* \r
-* Permission is hereby granted, free of charge, to any person obtaining a copy\r
-* of this software and associated documentation files (the "Software"), to deal\r
-* in the Software without restriction, including without limitation the rights\r
-* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r
-* copies of the Software, and to permit persons to whom the Software is\r
-* furnished to do so, subject to the following conditions:\r
-* \r
-* The above copyright notice and this permission notice shall be included in\r
-* all copies or substantial portions of the Software.\r
-* \r
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
-* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
-* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
-* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
-* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r
-* THE SOFTWARE.\r
-*/\r
-\r
-#include <d3dx9.h>\r
-#include "../Utilities.h"\r
-\r
-#include "Matrix.h"\r
-#include "Plane.h"\r
-#include "Quaternion.h"\r
-#include "Vector2.h"\r
-#include "Vector3.h"\r
-\r
-using namespace System;\r
-using namespace System::Globalization;\r
-\r
-namespace SlimDX\r
-{\r
-       D3DXMATRIX Matrix::ToD3DXMATRIX( Matrix matrix )\r
-       {\r
-               D3DXMATRIX result;\r
-               result._11 = matrix.M11;\r
-               result._12 = matrix.M12;\r
-               result._13 = matrix.M13;\r
-               result._14 = matrix.M14;\r
-               result._21 = matrix.M21;\r
-               result._22 = matrix.M22;\r
-               result._23 = matrix.M23;\r
-               result._24 = matrix.M24;\r
-               result._31 = matrix.M31;\r
-               result._32 = matrix.M32;\r
-               result._33 = matrix.M33;\r
-               result._34 = matrix.M34;\r
-               result._41 = matrix.M41;\r
-               result._42 = matrix.M42;\r
-               result._43 = matrix.M43;\r
-               result._44 = matrix.M44;\r
-\r
-               return result;\r
-       }\r
-\r
-       Matrix Matrix::FromD3DXMATRIX( const D3DXMATRIX &matrix )\r
-       {\r
-               Matrix result;\r
-               result.M11 = matrix._11;\r
-               result.M12 = matrix._12;\r
-               result.M13 = matrix._13;\r
-               result.M14 = matrix._14;\r
-               result.M21 = matrix._21;\r
-               result.M22 = matrix._22;\r
-               result.M23 = matrix._23;\r
-               result.M24 = matrix._24;\r
-               result.M31 = matrix._31;\r
-               result.M32 = matrix._32;\r
-               result.M33 = matrix._33;\r
-               result.M34 = matrix._34;\r
-               result.M41 = matrix._41;\r
-               result.M42 = matrix._42;\r
-               result.M43 = matrix._43;\r
-               result.M44 = matrix._44;\r
-\r
-               return result;\r
-       }\r
-\r
-       float Matrix::default::get( int row, int column )\r
-       {\r
-               if( row < 0 || row > 3 )\r
-                       throw gcnew ArgumentOutOfRangeException( "row", "Rows and columns for matrices run from 0 to 3, inclusive." );\r
-\r
-               if( column < 0 || column > 3 )\r
-                       throw gcnew ArgumentOutOfRangeException( "column", "Rows and columns for matrices run from 0 to 3, inclusive." );\r
-\r
-               int index = row * 4 + column;\r
-               switch( index )\r
-               {\r
-               case 0:  return M11;\r
-               case 1:  return M12;\r
-               case 2:  return M13;\r
-               case 3:  return M14;\r
-               case 4:  return M21;\r
-               case 5:  return M22;\r
-               case 6:  return M23;\r
-               case 7:  return M24;\r
-               case 8:  return M31;\r
-               case 9:  return M32;\r
-               case 10: return M33;\r
-               case 11: return M34;\r
-               case 12: return M41;\r
-               case 13: return M42;\r
-               case 14: return M43;\r
-               case 15: return M44;\r
-               }\r
-\r
-               return 0.0f;\r
-       }\r
-       \r
-       void Matrix::default::set( int row, int column, float value ) \r
-       {\r
-               if( row < 0 || row > 3 )\r
-                       throw gcnew ArgumentOutOfRangeException( "row", "Rows and columns for matrices run from 0 to 3, inclusive." );\r
-\r
-               if( column < 0 || column > 3 )\r
-                       throw gcnew ArgumentOutOfRangeException( "column", "Rows and columns for matrices run from 0 to 3, inclusive." );\r
-\r
-               int index = row * 4 + column;\r
-               switch( index )\r
-               {\r
-               case 0:  M11 = value; break;\r
-               case 1:  M12 = value; break;\r
-               case 2:  M13 = value; break;\r
-               case 3:  M14 = value; break;\r
-               case 4:  M21 = value; break;\r
-               case 5:  M22 = value; break;\r
-               case 6:  M23 = value; break;\r
-               case 7:  M24 = value; break;\r
-               case 8:  M31 = value; break;\r
-               case 9:  M32 = value; break;\r
-               case 10: M33 = value; break;\r
-               case 11: M34 = value; break;\r
-               case 12: M41 = value; break;\r
-               case 13: M42 = value; break;\r
-               case 14: M43 = value; break;\r
-               case 15: M44 = value; break;\r
-               }\r
-       }\r
-\r
-       Vector4 Matrix::Rows::get( int row )\r
-       {\r
-               return Vector4( default[row, 0], default[row, 1], default[row, 2], default[row, 3] );\r
-       }\r
-\r
-       void Matrix::Rows::set( int row, Vector4 value )\r
-       {\r
-               default[row, 0] = value.X;\r
-               default[row, 1] = value.Y;\r
-               default[row, 2] = value.Z;\r
-               default[row, 3] = value.W;\r
-       }\r
-\r
-       Vector4 Matrix::Columns::get( int column )\r
-       {\r
-               return Vector4( default[0, column], default[1, column], default[2, column], default[3, column] );\r
-       }\r
-\r
-       void Matrix::Columns::set( int column, Vector4 value )\r
-       {\r
-               default[0, column] = value.X;\r
-               default[1, column] = value.Y;\r
-               default[2, column] = value.Z;\r
-               default[3, column] = value.W;\r
-       }\r
-\r
-       Matrix Matrix::Identity::get()\r
-       {\r
-               Matrix result;\r
-               result.M11 = 1.0f;\r
-               result.M22 = 1.0f;\r
-               result.M33 = 1.0f;\r
-               result.M44 = 1.0f;\r
-\r
-               return result;\r
-       }\r
-\r
-       bool Matrix::IsIdentity::get()\r
-       {\r
-               if( M11 != 1.0f|| M22 != 1.0f || M33 != 1.0f || M44 != 1.0f )\r
-                       return false;\r
-\r
-               if( M12 != 0.0f || M13 != 0.0f || M14 != 0.0f ||\r
-                       M21 != 0.0f || M23 != 0.0f || M24 != 0.0f ||\r
-                       M31 != 0.0f || M32 != 0.0f || M34 != 0.0f ||\r
-                       M41 != 0.0f || M42 != 0.0f || M43 != 0.0f )\r
-                       return false;\r
-\r
-               return true;\r
-       }\r
-\r
-       array<float>^ Matrix::ToArray()\r
-       {\r
-               array<float>^ result = gcnew array<float>( 16 );\r
-               result[0] = M11;\r
-               result[1] = M12;\r
-               result[2] = M13;\r
-               result[3] = M14;\r
-               result[4] = M21;\r
-               result[5] = M22;\r
-               result[6] = M23;\r
-               result[7] = M24;\r
-               result[8] = M31;\r
-               result[9] = M32;\r
-               result[10] = M33;\r
-               result[11] = M34;\r
-               result[12] = M41;\r
-               result[13] = M42;\r
-               result[14] = M43;\r
-               result[15] = M44;\r
-\r
-               return result;\r
-       }\r
-\r
-       void Matrix::Invert()\r
-       {\r
-               pin_ptr<Matrix> pinnedThis = this;\r
-               D3DXMatrixInverse( (D3DXMATRIX*) pinnedThis, NULL, (D3DXMATRIX*) pinnedThis );\r
-       }\r
-\r
-       bool Matrix::Decompose( [Out] Vector3% scale, [Out] Quaternion% rotation, [Out] Vector3% translation )\r
-       {\r
-               Vector3 localScale, localTrans;\r
-               Quaternion localRot;\r
-               pin_ptr<Matrix> pinnedThis = this;\r
-\r
-               HRESULT hr = D3DXMatrixDecompose( (D3DXVECTOR3*) &localScale, (D3DXQUATERNION*) &localRot,\r
-                       (D3DXVECTOR3*) &localTrans, (D3DXMATRIX*) pinnedThis );\r
-\r
-               scale = localScale;\r
-               rotation = localRot;\r
-               translation = localTrans;\r
-\r
-               return hr == S_OK;\r
-       }\r
-       \r
-       float Matrix::Determinant()\r
-       {\r
-               float temp1 = (M33 * M44) - (M34 * M43);\r
-               float temp2 = (M32 * M44) - (M34 * M42);\r
-               float temp3 = (M32 * M43) - (M33 * M42);\r
-               float temp4 = (M31 * M44) - (M34 * M41);\r
-               float temp5 = (M31 * M43) - (M33 * M41);\r
-               float temp6 = (M31 * M42) - (M32 * M41);\r
-               \r
-               return ((((M11 * (((M22 * temp1) - (M23 * temp2)) + (M24 * temp3))) - (M12 * (((M21 * temp1) - \r
-                       (M23 * temp4)) + (M24 * temp5)))) + (M13 * (((M21 * temp2) - (M22 * temp4)) + (M24 * temp6)))) - \r
-                       (M14 * (((M21 * temp3) - (M22 * temp5)) + (M23 * temp6))));\r
-       }\r
-\r
-       Matrix Matrix::Add( Matrix left, Matrix right )\r
-       {\r
-               Matrix result;\r
-               result.M11 = left.M11 + right.M11;\r
-               result.M12 = left.M12 + right.M12;\r
-               result.M13 = left.M13 + right.M13;\r
-               result.M14 = left.M14 + right.M14;\r
-               result.M21 = left.M21 + right.M21;\r
-               result.M22 = left.M22 + right.M22;\r
-               result.M23 = left.M23 + right.M23;\r
-               result.M24 = left.M24 + right.M24;\r
-               result.M31 = left.M31 + right.M31;\r
-               result.M32 = left.M32 + right.M32;\r
-               result.M33 = left.M33 + right.M33;\r
-               result.M34 = left.M34 + right.M34;\r
-               result.M41 = left.M41 + right.M41;\r
-               result.M42 = left.M42 + right.M42;\r
-               result.M43 = left.M43 + right.M43;\r
-               result.M44 = left.M44 + right.M44;\r
-               return result;\r
-       }\r
-\r
-       void Matrix::Add( Matrix% left, Matrix% right, [Out] Matrix% result )\r
-       {\r
-               Matrix r;\r
-               r.M11 = left.M11 + right.M11;\r
-               r.M12 = left.M12 + right.M12;\r
-               r.M13 = left.M13 + right.M13;\r
-               r.M14 = left.M14 + right.M14;\r
-               r.M21 = left.M21 + right.M21;\r
-               r.M22 = left.M22 + right.M22;\r
-               r.M23 = left.M23 + right.M23;\r
-               r.M24 = left.M24 + right.M24;\r
-               r.M31 = left.M31 + right.M31;\r
-               r.M32 = left.M32 + right.M32;\r
-               r.M33 = left.M33 + right.M33;\r
-               r.M34 = left.M34 + right.M34;\r
-               r.M41 = left.M41 + right.M41;\r
-               r.M42 = left.M42 + right.M42;\r
-               r.M43 = left.M43 + right.M43;\r
-               r.M44 = left.M44 + right.M44;\r
-\r
-               result = r;\r
-       }\r
-\r
-       Matrix Matrix::Subtract( Matrix left, Matrix right )\r
-       {\r
-               Matrix result;\r
-               result.M11 = left.M11 - right.M11;\r
-               result.M12 = left.M12 - right.M12;\r
-               result.M13 = left.M13 - right.M13;\r
-               result.M14 = left.M14 - right.M14;\r
-               result.M21 = left.M21 - right.M21;\r
-               result.M22 = left.M22 - right.M22;\r
-               result.M23 = left.M23 - right.M23;\r
-               result.M24 = left.M24 - right.M24;\r
-               result.M31 = left.M31 - right.M31;\r
-               result.M32 = left.M32 - right.M32;\r
-               result.M33 = left.M33 - right.M33;\r
-               result.M34 = left.M34 - right.M34;\r
-               result.M41 = left.M41 - right.M41;\r
-               result.M42 = left.M42 - right.M42;\r
-               result.M43 = left.M43 - right.M43;\r
-               result.M44 = left.M44 - right.M44;\r
-               return result;\r
-       }\r
-\r
-       void Matrix::Subtract( Matrix% left, Matrix% right, [Out] Matrix% result )\r
-       {\r
-               Matrix r;\r
-               r.M11 = left.M11 - right.M11;\r
-               r.M12 = left.M12 - right.M12;\r
-               r.M13 = left.M13 - right.M13;\r
-               r.M14 = left.M14 - right.M14;\r
-               r.M21 = left.M21 - right.M21;\r
-               r.M22 = left.M22 - right.M22;\r
-               r.M23 = left.M23 - right.M23;\r
-               r.M24 = left.M24 - right.M24;\r
-               r.M31 = left.M31 - right.M31;\r
-               r.M32 = left.M32 - right.M32;\r
-               r.M33 = left.M33 - right.M33;\r
-               r.M34 = left.M34 - right.M34;\r
-               r.M41 = left.M41 - right.M41;\r
-               r.M42 = left.M42 - right.M42;\r
-               r.M43 = left.M43 - right.M43;\r
-               r.M44 = left.M44 - right.M44;\r
-\r
-               result = r;\r
-       }\r
-\r
-       Matrix Matrix::Negate( Matrix matrix )\r
-       {\r
-               Matrix result;\r
-               result.M11 = -matrix.M11;\r
-               result.M12 = -matrix.M12;\r
-               result.M13 = -matrix.M13;\r
-               result.M14 = -matrix.M14;\r
-               result.M21 = -matrix.M21;\r
-               result.M22 = -matrix.M22;\r
-               result.M23 = -matrix.M23;\r
-               result.M24 = -matrix.M24;\r
-               result.M31 = -matrix.M31;\r
-               result.M32 = -matrix.M32;\r
-               result.M33 = -matrix.M33;\r
-               result.M34 = -matrix.M34;\r
-               result.M41 = -matrix.M41;\r
-               result.M42 = -matrix.M42;\r
-               result.M43 = -matrix.M43;\r
-               result.M44 = -matrix.M44;\r
-               return result;\r
-       }\r
-\r
-       void Matrix::Negate( Matrix% matrix, [Out] Matrix% result )\r
-       {\r
-               Matrix r;\r
-               r.M11 = -matrix.M11;\r
-               r.M12 = -matrix.M12;\r
-               r.M13 = -matrix.M13;\r
-               r.M14 = -matrix.M14;\r
-               r.M21 = -matrix.M21;\r
-               r.M22 = -matrix.M22;\r
-               r.M23 = -matrix.M23;\r
-               r.M24 = -matrix.M24;\r
-               r.M31 = -matrix.M31;\r
-               r.M32 = -matrix.M32;\r
-               r.M33 = -matrix.M33;\r
-               r.M34 = -matrix.M34;\r
-               r.M41 = -matrix.M41;\r
-               r.M42 = -matrix.M42;\r
-               r.M43 = -matrix.M43;\r
-               r.M44 = -matrix.M44;\r
-\r
-               result = r;\r
-       }\r
-\r
-       Matrix Matrix::Multiply( Matrix left, Matrix right )\r
-       {\r
-               Matrix result;\r
-               result.M11 = (left.M11 * right.M11) + (left.M12 * right.M21) + (left.M13 * right.M31) + (left.M14 * right.M41);\r
-               result.M12 = (left.M11 * right.M12) + (left.M12 * right.M22) + (left.M13 * right.M32) + (left.M14 * right.M42);\r
-               result.M13 = (left.M11 * right.M13) + (left.M12 * right.M23) + (left.M13 * right.M33) + (left.M14 * right.M43);\r
-               result.M14 = (left.M11 * right.M14) + (left.M12 * right.M24) + (left.M13 * right.M34) + (left.M14 * right.M44);\r
-               result.M21 = (left.M21 * right.M11) + (left.M22 * right.M21) + (left.M23 * right.M31) + (left.M24 * right.M41);\r
-               result.M22 = (left.M21 * right.M12) + (left.M22 * right.M22) + (left.M23 * right.M32) + (left.M24 * right.M42);\r
-               result.M23 = (left.M21 * right.M13) + (left.M22 * right.M23) + (left.M23 * right.M33) + (left.M24 * right.M43);\r
-               result.M24 = (left.M21 * right.M14) + (left.M22 * right.M24) + (left.M23 * right.M34) + (left.M24 * right.M44);\r
-               result.M31 = (left.M31 * right.M11) + (left.M32 * right.M21) + (left.M33 * right.M31) + (left.M34 * right.M41);\r
-               result.M32 = (left.M31 * right.M12) + (left.M32 * right.M22) + (left.M33 * right.M32) + (left.M34 * right.M42);\r
-               result.M33 = (left.M31 * right.M13) + (left.M32 * right.M23) + (left.M33 * right.M33) + (left.M34 * right.M43);\r
-               result.M34 = (left.M31 * right.M14) + (left.M32 * right.M24) + (left.M33 * right.M34) + (left.M34 * right.M44);\r
-               result.M41 = (left.M41 * right.M11) + (left.M42 * right.M21) + (left.M43 * right.M31) + (left.M44 * right.M41);\r
-               result.M42 = (left.M41 * right.M12) + (left.M42 * right.M22) + (left.M43 * right.M32) + (left.M44 * right.M42);\r
-               result.M43 = (left.M41 * right.M13) + (left.M42 * right.M23) + (left.M43 * right.M33) + (left.M44 * right.M43);\r
-               result.M44 = (left.M41 * right.M14) + (left.M42 * right.M24) + (left.M43 * right.M34) + (left.M44 * right.M44);\r
-               return result;\r
-       }\r
-\r
-       void Matrix::Multiply( Matrix% left, Matrix% right, [Out] Matrix% result )\r
-       {\r
-               Matrix r;\r
-               r.M11 = (left.M11 * right.M11) + (left.M12 * right.M21) + (left.M13 * right.M31) + (left.M14 * right.M41);\r
-               r.M12 = (left.M11 * right.M12) + (left.M12 * right.M22) + (left.M13 * right.M32) + (left.M14 * right.M42);\r
-               r.M13 = (left.M11 * right.M13) + (left.M12 * right.M23) + (left.M13 * right.M33) + (left.M14 * right.M43);\r
-               r.M14 = (left.M11 * right.M14) + (left.M12 * right.M24) + (left.M13 * right.M34) + (left.M14 * right.M44);\r
-               r.M21 = (left.M21 * right.M11) + (left.M22 * right.M21) + (left.M23 * right.M31) + (left.M24 * right.M41);\r
-               r.M22 = (left.M21 * right.M12) + (left.M22 * right.M22) + (left.M23 * right.M32) + (left.M24 * right.M42);\r
-               r.M23 = (left.M21 * right.M13) + (left.M22 * right.M23) + (left.M23 * right.M33) + (left.M24 * right.M43);\r
-               r.M24 = (left.M21 * right.M14) + (left.M22 * right.M24) + (left.M23 * right.M34) + (left.M24 * right.M44);\r
-               r.M31 = (left.M31 * right.M11) + (left.M32 * right.M21) + (left.M33 * right.M31) + (left.M34 * right.M41);\r
-               r.M32 = (left.M31 * right.M12) + (left.M32 * right.M22) + (left.M33 * right.M32) + (left.M34 * right.M42);\r
-               r.M33 = (left.M31 * right.M13) + (left.M32 * right.M23) + (left.M33 * right.M33) + (left.M34 * right.M43);\r
-               r.M34 = (left.M31 * right.M14) + (left.M32 * right.M24) + (left.M33 * right.M34) + (left.M34 * right.M44);\r
-               r.M41 = (left.M41 * right.M11) + (left.M42 * right.M21) + (left.M43 * right.M31) + (left.M44 * right.M41);\r
-               r.M42 = (left.M41 * right.M12) + (left.M42 * right.M22) + (left.M43 * right.M32) + (left.M44 * right.M42);\r
-               r.M43 = (left.M41 * right.M13) + (left.M42 * right.M23) + (left.M43 * right.M33) + (left.M44 * right.M43);\r
-               r.M44 = (left.M41 * right.M14) + (left.M42 * right.M24) + (left.M43 * right.M34) + (left.M44 * right.M44);\r
-       \r
-               result = r;\r
-       }\r
-\r
-       void Matrix::Multiply( Matrix* left, Matrix* right, Matrix* result, int count )\r
-       {\r
-               for( int i = 0; i < count; ++i )\r
-               {\r
-                       D3DXMatrixMultiply( reinterpret_cast<D3DXMATRIX*>( &left[i] ),\r
-                               reinterpret_cast<const D3DXMATRIX*>( &right[i] ),\r
-                               reinterpret_cast<const D3DXMATRIX*>( &result[i] ) );\r
-               }\r
-       }\r
-\r
-       void Matrix::Multiply( array<Matrix>^ left, array<Matrix>^ right, array<Matrix>^ result, int offset, int count )\r
-       {\r
-               if( left->Length != right->Length )\r
-                       throw gcnew ArgumentException( "Left and right arrays must be the same size.", "right" );\r
-               if( right->Length != result->Length )\r
-                       throw gcnew ArgumentException( "Result array must be the same size as input arrays.", "result" );\r
-               Utilities::CheckArrayBounds( left, offset, count );\r
-\r
-               pin_ptr<Matrix> pinnedLeft = &left[offset];\r
-               pin_ptr<Matrix> pinnedRight = &right[offset];\r
-               pin_ptr<Matrix> pinnedResult = &result[offset];\r
-\r
-               Multiply( pinnedLeft, pinnedRight, pinnedResult, count );\r
-       }\r
-\r
-       void Matrix::Multiply( array<Matrix>^ left, Matrix right, array<Matrix>^ result, int offset, int count )\r
-       {\r
-               if( left->Length != result->Length )\r
-                       throw gcnew ArgumentException( "Result array must be the same size as the input array.", "result" );\r
-               Utilities::CheckArrayBounds( left, offset, count );\r
-\r
-               pin_ptr<Matrix> pinnedLeft = &left[offset];\r
-               pin_ptr<Matrix> pinnedResult = &result[offset];\r
-               for( int i = 0; i < count; ++i )\r
-               {\r
-                       D3DXMatrixMultiply( reinterpret_cast<D3DXMATRIX*>( &pinnedLeft[i] ),\r
-                               reinterpret_cast<const D3DXMATRIX*>( &right ),\r
-                               reinterpret_cast<const D3DXMATRIX*>( &pinnedResult[i] ) );\r
-               }\r
-       }\r
-\r
-       Matrix Matrix::Multiply( Matrix left, float right )\r
-       {\r
-               Matrix result;\r
-               result.M11 = left.M11 * right;\r
-               result.M12 = left.M12 * right;\r
-               result.M13 = left.M13 * right;\r
-               result.M14 = left.M14 * right;\r
-               result.M21 = left.M21 * right;\r
-               result.M22 = left.M22 * right;\r
-               result.M23 = left.M23 * right;\r
-               result.M24 = left.M24 * right;\r
-               result.M31 = left.M31 * right;\r
-               result.M32 = left.M32 * right;\r
-               result.M33 = left.M33 * right;\r
-               result.M34 = left.M34 * right;\r
-               result.M41 = left.M41 * right;\r
-               result.M42 = left.M42 * right;\r
-               result.M43 = left.M43 * right;\r
-               result.M44 = left.M44 * right;\r
-               return result;\r
-       }\r
-\r
-       void Matrix::Multiply( Matrix% left, float right, [Out] Matrix% result )\r
-       {\r
-               Matrix r;\r
-               r.M11 = left.M11 * right;\r
-               r.M12 = left.M12 * right;\r
-               r.M13 = left.M13 * right;\r
-               r.M14 = left.M14 * right;\r
-               r.M21 = left.M21 * right;\r
-               r.M22 = left.M22 * right;\r
-               r.M23 = left.M23 * right;\r
-               r.M24 = left.M24 * right;\r
-               r.M31 = left.M31 * right;\r
-               r.M32 = left.M32 * right;\r
-               r.M33 = left.M33 * right;\r
-               r.M34 = left.M34 * right;\r
-               r.M41 = left.M41 * right;\r
-               r.M42 = left.M42 * right;\r
-               r.M43 = left.M43 * right;\r
-               r.M44 = left.M44 * right;\r
-\r
-               result = r;\r
-       }\r
-\r
-       Matrix Matrix::Divide( Matrix left, Matrix right )\r
-       {\r
-               Matrix result;\r
-               result.M11 = left.M11 / right.M11;\r
-               result.M12 = left.M12 / right.M12;\r
-               result.M13 = left.M13 / right.M13;\r
-               result.M14 = left.M14 / right.M14;\r
-               result.M21 = left.M21 / right.M21;\r
-               result.M22 = left.M22 / right.M22;\r
-               result.M23 = left.M23 / right.M23;\r
-               result.M24 = left.M24 / right.M24;\r
-               result.M31 = left.M31 / right.M31;\r
-               result.M32 = left.M32 / right.M32;\r
-               result.M33 = left.M33 / right.M33;\r
-               result.M34 = left.M34 / right.M34;\r
-               result.M41 = left.M41 / right.M41;\r
-               result.M42 = left.M42 / right.M42;\r
-               result.M43 = left.M43 / right.M43;\r
-               result.M44 = left.M44 / right.M44;\r
-               return result;\r
-       }\r
-\r
-       void Matrix::Divide( Matrix% left, Matrix% right, [Out] Matrix% result )\r
-       {\r
-               Matrix r;\r
-               r.M11 = left.M11 / right.M11;\r
-               r.M12 = left.M12 / right.M12;\r
-               r.M13 = left.M13 / right.M13;\r
-               r.M14 = left.M14 / right.M14;\r
-               r.M21 = left.M21 / right.M21;\r
-               r.M22 = left.M22 / right.M22;\r
-               r.M23 = left.M23 / right.M23;\r
-               r.M24 = left.M24 / right.M24;\r
-               r.M31 = left.M31 / right.M31;\r
-               r.M32 = left.M32 / right.M32;\r
-               r.M33 = left.M33 / right.M33;\r
-               r.M34 = left.M34 / right.M34;\r
-               r.M41 = left.M41 / right.M41;\r
-               r.M42 = left.M42 / right.M42;\r
-               r.M43 = left.M43 / right.M43;\r
-               r.M44 = left.M44 / right.M44;\r
-\r
-               result = r;\r
-       }\r
-\r
-       Matrix Matrix::Divide( Matrix left, float right )\r
-       {\r
-               Matrix result;\r
-               float inv = 1.0f / right;\r
-\r
-               result.M11 = left.M11 * inv;\r
-               result.M12 = left.M12 * inv;\r
-               result.M13 = left.M13 * inv;\r
-               result.M14 = left.M14 * inv;\r
-               result.M21 = left.M21 * inv;\r
-               result.M22 = left.M22 * inv;\r
-               result.M23 = left.M23 * inv;\r
-               result.M24 = left.M24 * inv;\r
-               result.M31 = left.M31 * inv;\r
-               result.M32 = left.M32 * inv;\r
-               result.M33 = left.M33 * inv;\r
-               result.M34 = left.M34 * inv;\r
-               result.M41 = left.M41 * inv;\r
-               result.M42 = left.M42 * inv;\r
-               result.M43 = left.M43 * inv;\r
-               result.M44 = left.M44 * inv;\r
-               return result;\r
-       }\r
-\r
-       void Matrix::Divide( Matrix% left, float right, [Out] Matrix% result )\r
-       {\r
-               float inv = 1.0f / right;\r
-\r
-               Matrix r;\r
-               r.M11 = left.M11 * inv;\r
-               r.M12 = left.M12 * inv;\r
-               r.M13 = left.M13 * inv;\r
-               r.M14 = left.M14 * inv;\r
-               r.M21 = left.M21 * inv;\r
-               r.M22 = left.M22 * inv;\r
-               r.M23 = left.M23 * inv;\r
-               r.M24 = left.M24 * inv;\r
-               r.M31 = left.M31 * inv;\r
-               r.M32 = left.M32 * inv;\r
-               r.M33 = left.M33 * inv;\r
-               r.M34 = left.M34 * inv;\r
-               r.M41 = left.M41 * inv;\r
-               r.M42 = left.M42 * inv;\r
-               r.M43 = left.M43 * inv;\r
-               r.M44 = left.M44 * inv;\r
-\r
-               result = r;\r
-       }\r
-\r
-       Matrix Matrix::Lerp( Matrix value1, Matrix value2, float amount )\r
-       {\r
-               Matrix result;\r
-               result.M11 = value1.M11 + ((value2.M11 - value1.M11) * amount);\r
-               result.M12 = value1.M12 + ((value2.M12 - value1.M12) * amount);\r
-               result.M13 = value1.M13 + ((value2.M13 - value1.M13) * amount);\r
-               result.M14 = value1.M14 + ((value2.M14 - value1.M14) * amount);\r
-               result.M21 = value1.M21 + ((value2.M21 - value1.M21) * amount);\r
-               result.M22 = value1.M22 + ((value2.M22 - value1.M22) * amount);\r
-               result.M23 = value1.M23 + ((value2.M23 - value1.M23) * amount);\r
-               result.M24 = value1.M24 + ((value2.M24 - value1.M24) * amount);\r
-               result.M31 = value1.M31 + ((value2.M31 - value1.M31) * amount);\r
-               result.M32 = value1.M32 + ((value2.M32 - value1.M32) * amount);\r
-               result.M33 = value1.M33 + ((value2.M33 - value1.M33) * amount);\r
-               result.M34 = value1.M34 + ((value2.M34 - value1.M34) * amount);\r
-               result.M41 = value1.M41 + ((value2.M41 - value1.M41) * amount);\r
-               result.M42 = value1.M42 + ((value2.M42 - value1.M42) * amount);\r
-               result.M43 = value1.M43 + ((value2.M43 - value1.M43) * amount);\r
-               result.M44 = value1.M44 + ((value2.M44 - value1.M44) * amount);\r
-               return result;\r
-       }\r
-\r
-       void Matrix::Lerp( Matrix% value1, Matrix% value2, float amount, [Out] Matrix% result )\r
-       {\r
-               Matrix r;\r
-               r.M11 = value1.M11 + ((value2.M11 - value1.M11) * amount);\r
-               r.M12 = value1.M12 + ((value2.M12 - value1.M12) * amount);\r
-               r.M13 = value1.M13 + ((value2.M13 - value1.M13) * amount);\r
-               r.M14 = value1.M14 + ((value2.M14 - value1.M14) * amount);\r
-               r.M21 = value1.M21 + ((value2.M21 - value1.M21) * amount);\r
-               r.M22 = value1.M22 + ((value2.M22 - value1.M22) * amount);\r
-               r.M23 = value1.M23 + ((value2.M23 - value1.M23) * amount);\r
-               r.M24 = value1.M24 + ((value2.M24 - value1.M24) * amount);\r
-               r.M31 = value1.M31 + ((value2.M31 - value1.M31) * amount);\r
-               r.M32 = value1.M32 + ((value2.M32 - value1.M32) * amount);\r
-               r.M33 = value1.M33 + ((value2.M33 - value1.M33) * amount);\r
-               r.M34 = value1.M34 + ((value2.M34 - value1.M34) * amount);\r
-               r.M41 = value1.M41 + ((value2.M41 - value1.M41) * amount);\r
-               r.M42 = value1.M42 + ((value2.M42 - value1.M42) * amount);\r
-               r.M43 = value1.M43 + ((value2.M43 - value1.M43) * amount);\r
-               r.M44 = value1.M44 + ((value2.M44 - value1.M44) * amount);\r
-\r
-               result = r;\r
-       }\r
-\r
-       Matrix Matrix::Billboard( Vector3 objectPosition, Vector3 cameraPosition, Vector3 cameraUpVector, Vector3 cameraForwardVector )\r
-       {\r
-               Matrix result;\r
-               Vector3 difference = objectPosition - cameraPosition;\r
-               Vector3 crossed;\r
-               Vector3 final;\r
-\r
-               float lengthSq = difference.LengthSquared();\r
-               if (lengthSq < 0.0001f)\r
-                       difference = -cameraForwardVector;\r
-               else\r
-                       difference *= static_cast<float>( 1.0f / Math::Sqrt( lengthSq ) );\r
-\r
-               Vector3::Cross( cameraUpVector, difference, crossed );\r
-               crossed.Normalize();\r
-               Vector3::Cross( difference, crossed, final );\r
-\r
-               result.M11 = final.X;\r
-               result.M12 = final.Y;\r
-               result.M13 = final.Z;\r
-               result.M14 = 0.0f;\r
-               result.M21 = crossed.X;\r
-               result.M22 = crossed.Y;\r
-               result.M23 = crossed.Z;\r
-               result.M24 = 0.0f;\r
-               result.M31 = difference.X;\r
-               result.M32 = difference.Y;\r
-               result.M33 = difference.Z;\r
-               result.M34 = 0.0f;\r
-               result.M41 = objectPosition.X;\r
-               result.M42 = objectPosition.Y;\r
-               result.M43 = objectPosition.Z;\r
-               result.M44 = 1.0f;\r
-\r
-               return result;\r
-       }\r
-\r
-       void Matrix::Billboard( Vector3% objectPosition, Vector3% cameraPosition, Vector3% cameraUpVector, Vector3% cameraForwardVector, [Out] Matrix% result )\r
-       {\r
-               Vector3 difference = objectPosition - cameraPosition;\r
-               Vector3 crossed;\r
-               Vector3 final;\r
-\r
-               float lengthSq = difference.LengthSquared();\r
-               if (lengthSq < 0.0001f)\r
-                       difference = -cameraForwardVector;\r
-               else\r
-                       difference *= static_cast<float>( 1.0f / Math::Sqrt( lengthSq ) );\r
-\r
-               Vector3::Cross( cameraUpVector, difference, crossed );\r
-               crossed.Normalize();\r
-               Vector3::Cross( difference, crossed, final );\r
-\r
-               result.M11 = final.X;\r
-               result.M12 = final.Y;\r
-               result.M13 = final.Z;\r
-               result.M14 = 0.0f;\r
-               result.M21 = crossed.X;\r
-               result.M22 = crossed.Y;\r
-               result.M23 = crossed.Z;\r
-               result.M24 = 0.0f;\r
-               result.M31 = difference.X;\r
-               result.M32 = difference.Y;\r
-               result.M33 = difference.Z;\r
-               result.M34 = 0.0f;\r
-               result.M41 = objectPosition.X;\r
-               result.M42 = objectPosition.Y;\r
-               result.M43 = objectPosition.Z;\r
-               result.M44 = 1.0f;\r
-       }\r
-\r
-       Matrix Matrix::RotationX( float angle )\r
-       {\r
-               Matrix result;\r
-               float cos = static_cast<float>( Math::Cos( static_cast<double>( angle ) ) );\r
-               float sin = static_cast<float>( Math::Sin( static_cast<double>( angle ) ) );\r
-\r
-               result.M11 = 1.0f;\r
-               result.M12 = 0.0f;\r
-               result.M13 = 0.0f;\r
-               result.M14 = 0.0f;\r
-               result.M21 = 0.0f;\r
-               result.M22 = cos;\r
-               result.M23 = sin;\r
-               result.M24 = 0.0f;\r
-               result.M31 = 0.0f;\r
-               result.M32 = -sin;\r
-               result.M33 = cos;\r
-               result.M34 = 0.0f;\r
-               result.M41 = 0.0f;\r
-               result.M42 = 0.0f;\r
-               result.M43 = 0.0f;\r
-               result.M44 = 1.0f;\r
-\r
-               return result;\r
-       }\r
-\r
-       void Matrix::RotationX( float angle, [Out] Matrix% result )\r
-       {\r
-               float cos = static_cast<float>( Math::Cos( static_cast<double>( angle ) ) );\r
-               float sin = static_cast<float>( Math::Sin( static_cast<double>( angle ) ) );\r
-\r
-               result.M11 = 1.0f;\r
-               result.M12 = 0.0f;\r
-               result.M13 = 0.0f;\r
-               result.M14 = 0.0f;\r
-               result.M21 = 0.0f;\r
-               result.M22 = cos;\r
-               result.M23 = sin;\r
-               result.M24 = 0.0f;\r
-               result.M31 = 0.0f;\r
-               result.M32 = -sin;\r
-               result.M33 = cos;\r
-               result.M34 = 0.0f;\r
-               result.M41 = 0.0f;\r
-               result.M42 = 0.0f;\r
-               result.M43 = 0.0f;\r
-               result.M44 = 1.0f;\r
-       }\r
-       \r
-       Matrix Matrix::RotationY( float angle )\r
-       {\r
-               Matrix result;\r
-               float cos = static_cast<float>( Math::Cos( static_cast<double>( angle ) ) );\r
-               float sin = static_cast<float>( Math::Sin( static_cast<double>( angle ) ) );\r
-\r
-               result.M11 = cos;\r
-               result.M12 = 0.0f;\r
-               result.M13 = -sin;\r
-               result.M14 = 0.0f;\r
-               result.M21 = 0.0f;\r
-               result.M22 = 1.0f;\r
-               result.M23 = 0.0f;\r
-               result.M24 = 0.0f;\r
-               result.M31 = sin;\r
-               result.M32 = 0.0f;\r
-               result.M33 = cos;\r
-               result.M34 = 0.0f;\r
-               result.M41 = 0.0f;\r
-               result.M42 = 0.0f;\r
-               result.M43 = 0.0f;\r
-               result.M44 = 1.0f;\r
-\r
-               return result;\r
-       }\r
-\r
-       void Matrix::RotationY( float angle, [Out] Matrix% result )\r
-       {\r
-               float cos = static_cast<float>( Math::Cos( static_cast<double>( angle ) ) );\r
-               float sin = static_cast<float>( Math::Sin( static_cast<double>( angle ) ) );\r
-\r
-               result.M11 = cos;\r
-               result.M12 = 0.0f;\r
-               result.M13 = -sin;\r
-               result.M14 = 0.0f;\r
-               result.M21 = 0.0f;\r
-               result.M22 = 1.0f;\r
-               result.M23 = 0.0f;\r
-               result.M24 = 0.0f;\r
-               result.M31 = sin;\r
-               result.M32 = 0.0f;\r
-               result.M33 = cos;\r
-               result.M34 = 0.0f;\r
-               result.M41 = 0.0f;\r
-               result.M42 = 0.0f;\r
-               result.M43 = 0.0f;\r
-               result.M44 = 1.0f;\r
-       }\r
-       \r
-       Matrix Matrix::RotationZ( float angle )\r
-       {\r
-               Matrix result;\r
-               float cos = static_cast<float>( Math::Cos( static_cast<double>( angle ) ) );\r
-               float sin = static_cast<float>( Math::Sin( static_cast<double>( angle ) ) );\r
-\r
-               result.M11 = cos;\r
-               result.M12 = sin;\r
-               result.M13 = 0.0f;\r
-               result.M14 = 0.0f;\r
-               result.M21 = -sin;\r
-               result.M22 = cos;\r
-               result.M23 = 0.0f;\r
-               result.M24 = 0.0f;\r
-               result.M31 = 0.0f;\r
-               result.M32 = 0.0f;\r
-               result.M33 = 1.0f;\r
-               result.M34 = 0.0f;\r
-               result.M41 = 0.0f;\r
-               result.M42 = 0.0f;\r
-               result.M43 = 0.0f;\r
-               result.M44 = 1.0f;\r
-\r
-               return result;\r
-       }\r
-\r
-       void Matrix::RotationZ( float angle, [Out] Matrix% result )\r
-       {\r
-               float cos = static_cast<float>( Math::Cos( static_cast<double>( angle ) ) );\r
-               float sin = static_cast<float>( Math::Sin( static_cast<double>( angle ) ) );\r
-\r
-               result.M11 = cos;\r
-               result.M12 = sin;\r
-               result.M13 = 0.0f;\r
-               result.M14 = 0.0f;\r
-               result.M21 = -sin;\r
-               result.M22 = cos;\r
-               result.M23 = 0.0f;\r
-               result.M24 = 0.0f;\r
-               result.M31 = 0.0f;\r
-               result.M32 = 0.0f;\r
-               result.M33 = 1.0f;\r
-               result.M34 = 0.0f;\r
-               result.M41 = 0.0f;\r
-               result.M42 = 0.0f;\r
-               result.M43 = 0.0f;\r
-               result.M44 = 1.0f;\r
-       }\r
-\r
-       Matrix Matrix::RotationQuaternion( Quaternion quaternion )\r
-       {\r
-               Matrix result;\r
-\r
-               float xx = quaternion.X * quaternion.X;\r
-               float yy = quaternion.Y * quaternion.Y;\r
-               float zz = quaternion.Z * quaternion.Z;\r
-               float xy = quaternion.X * quaternion.Y;\r
-               float zw = quaternion.Z * quaternion.W;\r
-               float zx = quaternion.Z * quaternion.X;\r
-               float yw = quaternion.Y * quaternion.W;\r
-               float yz = quaternion.Y * quaternion.Z;\r
-               float xw = quaternion.X * quaternion.W;\r
-               result.M11 = 1.0f - (2.0f * (yy + zz));\r
-               result.M12 = 2.0f * (xy + zw);\r
-               result.M13 = 2.0f * (zx - yw);\r
-               result.M14 = 0.0f;\r
-               result.M21 = 2.0f * (xy - zw);\r
-               result.M22 = 1.0f - (2.0f * (zz + xx));\r
-               result.M23 = 2.0f * (yz + xw);\r
-               result.M24 = 0.0f;\r
-               result.M31 = 2.0f * (zx + yw);\r
-               result.M32 = 2.0f * (yz - xw);\r
-               result.M33 = 1.0f - (2.0f * (yy + xx));\r
-               result.M34 = 0.0f;\r
-               result.M41 = 0.0f;\r
-               result.M42 = 0.0f;\r
-               result.M43 = 0.0f;\r
-               result.M44 = 1.0f;\r
-\r
-               return result;\r
-       }\r
-\r
-       void Matrix::RotationQuaternion( Quaternion% rotation, [Out] Matrix% result )\r
-       {\r
-               float xx = rotation.X * rotation.X;\r
-               float yy = rotation.Y * rotation.Y;\r
-               float zz = rotation.Z * rotation.Z;\r
-               float xy = rotation.X * rotation.Y;\r
-               float zw = rotation.Z * rotation.W;\r
-               float zx = rotation.Z * rotation.X;\r
-               float yw = rotation.Y * rotation.W;\r
-               float yz = rotation.Y * rotation.Z;\r
-               float xw = rotation.X * rotation.W;\r
-               result.M11 = 1.0f - (2.0f * (yy + zz));\r
-               result.M12 = 2.0f * (xy + zw);\r
-               result.M13 = 2.0f * (zx - yw);\r
-               result.M14 = 0.0f;\r
-               result.M21 = 2.0f * (xy - zw);\r
-               result.M22 = 1.0f - (2.0f * (zz + xx));\r
-               result.M23 = 2.0f * (yz + xw);\r
-               result.M24 = 0.0f;\r
-               result.M31 = 2.0f * (zx + yw);\r
-               result.M32 = 2.0f * (yz - xw);\r
-               result.M33 = 1.0f - (2.0f * (yy + xx));\r
-               result.M34 = 0.0f;\r
-               result.M41 = 0.0f;\r
-               result.M42 = 0.0f;\r
-               result.M43 = 0.0f;\r
-               result.M44 = 1.0f;\r
-       }\r
-\r
-       Matrix Matrix::RotationAxis( Vector3 axis, float angle )\r
-       {\r
-               if( axis.LengthSquared() != 1.0f )\r
-                       axis.Normalize();\r
-\r
-               Matrix result;\r
-               float x = axis.X;\r
-               float y = axis.Y;\r
-               float z = axis.Z;\r
-               float cos = static_cast<float>( Math::Cos( static_cast<double>( angle ) ) );\r
-               float sin = static_cast<float>( Math::Sin( static_cast<double>( angle ) ) );\r
-               float xx = x * x;\r
-               float yy = y * y;\r
-               float zz = z * z;\r
-               float xy = x * y;\r
-               float xz = x * z;\r
-               float yz = y * z;\r
-\r
-               result.M11 = xx + (cos * (1.0f - xx));\r
-               result.M12 = (xy - (cos * xy)) + (sin * z);\r
-               result.M13 = (xz - (cos * xz)) - (sin * y);\r
-               result.M14 = 0.0f;\r
-               result.M21 = (xy - (cos * xy)) - (sin * z);\r
-               result.M22 = yy + (cos * (1.0f - yy));\r
-               result.M23 = (yz - (cos * yz)) + (sin * x);\r
-               result.M24 = 0.0f;\r
-               result.M31 = (xz - (cos * xz)) + (sin * y);\r
-               result.M32 = (yz - (cos * yz)) - (sin * x);\r
-               result.M33 = zz + (cos * (1.0f - zz));\r
-               result.M34 = 0.0f;\r
-               result.M41 = 0.0f;\r
-               result.M42 = 0.0f;\r
-               result.M43 = 0.0f;\r
-               result.M44 = 1.0f;\r
-\r
-               return result;\r
-       }\r
-\r
-       void Matrix::RotationAxis( Vector3% axis, float angle, [Out] Matrix% result )\r
-       {\r
-               if( axis.LengthSquared() != 1.0f )\r
-                       axis.Normalize();\r
-\r
-               float x = axis.X;\r
-               float y = axis.Y;\r
-               float z = axis.Z;\r
-               float cos = static_cast<float>( Math::Cos( static_cast<double>( angle ) ) );\r
-               float sin = static_cast<float>( Math::Sin( static_cast<double>( angle ) ) );\r
-               float xx = x * x;\r
-               float yy = y * y;\r
-               float zz = z * z;\r
-               float xy = x * y;\r
-               float xz = x * z;\r
-               float yz = y * z;\r
-\r
-               result.M11 = xx + (cos * (1.0f - xx));\r
-               result.M12 = (xy - (cos * xy)) + (sin * z);\r
-               result.M13 = (xz - (cos * xz)) - (sin * y);\r
-               result.M14 = 0.0f;\r
-               result.M21 = (xy - (cos * xy)) - (sin * z);\r
-               result.M22 = yy + (cos * (1.0f - yy));\r
-               result.M23 = (yz - (cos * yz)) + (sin * x);\r
-               result.M24 = 0.0f;\r
-               result.M31 = (xz - (cos * xz)) + (sin * y);\r
-               result.M32 = (yz - (cos * yz)) - (sin * x);\r
-               result.M33 = zz + (cos * (1.0f - zz));\r
-               result.M34 = 0.0f;\r
-               result.M41 = 0.0f;\r
-               result.M42 = 0.0f;\r
-               result.M43 = 0.0f;\r
-               result.M44 = 1.0f;\r
-       }\r
-\r
-       Matrix Matrix::RotationYawPitchRoll( float yaw, float pitch, float roll )\r
-       {\r
-               Matrix result;\r
-               Quaternion quaternion;\r
-               Quaternion::RotationYawPitchRoll( yaw, pitch, roll, quaternion );\r
-               RotationQuaternion( quaternion, result );\r
-               return result;\r
-       }\r
-\r
-       void Matrix::RotationYawPitchRoll( float yaw, float pitch, float roll, [Out] Matrix% result )\r
-       {\r
-               Quaternion quaternion;\r
-               Quaternion::RotationYawPitchRoll( yaw, pitch, roll, quaternion );\r
-               RotationQuaternion( quaternion, result );\r
-       }\r
-\r
-       Matrix Matrix::Translation( float x, float y, float z )\r
-       {\r
-               Matrix result;\r
-               result.M11 = 1.0f;\r
-               result.M12 = 0.0f;\r
-               result.M13 = 0.0f;\r
-               result.M14 = 0.0f;\r
-               result.M21 = 0.0f;\r
-               result.M22 = 1.0f;\r
-               result.M23 = 0.0f;\r
-               result.M24 = 0.0f;\r
-               result.M31 = 0.0f;\r
-               result.M32 = 0.0f;\r
-               result.M33 = 1.0f;\r
-               result.M34 = 0.0f;\r
-               result.M41 = x;\r
-               result.M42 = y;\r
-               result.M43 = z;\r
-               result.M44 = 1.0f;\r
-               return result;\r
-       }\r
-\r
-       void Matrix::Translation( float x, float y, float z, [Out] Matrix% result )\r
-       {\r
-               result.M11 = 1.0f;\r
-               result.M12 = 0.0f;\r
-               result.M13 = 0.0f;\r
-               result.M14 = 0.0f;\r
-               result.M21 = 0.0f;\r
-               result.M22 = 1.0f;\r
-               result.M23 = 0.0f;\r
-               result.M24 = 0.0f;\r
-               result.M31 = 0.0f;\r
-               result.M32 = 0.0f;\r
-               result.M33 = 1.0f;\r
-               result.M34 = 0.0f;\r
-               result.M41 = x;\r
-               result.M42 = y;\r
-               result.M43 = z;\r
-               result.M44 = 1.0f;\r
-       }\r
-\r
-       Matrix Matrix::Translation( Vector3 translation )\r
-       {\r
-               Matrix result;\r
-               result.M11 = 1.0f;\r
-               result.M12 = 0.0f;\r
-               result.M13 = 0.0f;\r
-               result.M14 = 0.0f;\r
-               result.M21 = 0.0f;\r
-               result.M22 = 1.0f;\r
-               result.M23 = 0.0f;\r
-               result.M24 = 0.0f;\r
-               result.M31 = 0.0f;\r
-               result.M32 = 0.0f;\r
-               result.M33 = 1.0f;\r
-               result.M34 = 0.0f;\r
-               result.M41 = translation.X;\r
-               result.M42 = translation.Y;\r
-               result.M43 = translation.Z;\r
-               result.M44 = 1.0f;\r
-               return result;\r
-       }\r
-\r
-       void Matrix::Translation( Vector3% translation, [Out] Matrix% result )\r
-       {\r
-               result.M11 = 1.0f;\r
-               result.M12 = 0.0f;\r
-               result.M13 = 0.0f;\r
-               result.M14 = 0.0f;\r
-               result.M21 = 0.0f;\r
-               result.M22 = 1.0f;\r
-               result.M23 = 0.0f;\r
-               result.M24 = 0.0f;\r
-               result.M31 = 0.0f;\r
-               result.M32 = 0.0f;\r
-               result.M33 = 1.0f;\r
-               result.M34 = 0.0f;\r
-               result.M41 = translation.X;\r
-               result.M42 = translation.Y;\r
-               result.M43 = translation.Z;\r
-               result.M44 = 1.0f;\r
-       }\r
-\r
-       Matrix Matrix::Scaling ( float x, float y, float z )\r
-       {\r
-               Matrix result;\r
-               result.M11 = x;\r
-               result.M12 = 0.0f;\r
-               result.M13 = 0.0f;\r
-               result.M14 = 0.0f;\r
-               result.M21 = 0.0f;\r
-               result.M22 = y;\r
-               result.M23 = 0.0f;\r
-               result.M24 = 0.0f;\r
-               result.M31 = 0.0f;\r
-               result.M32 = 0.0f;\r
-               result.M33 = z;\r
-               result.M34 = 0.0f;\r
-               result.M41 = 0.0f;\r
-               result.M42 = 0.0f;\r
-               result.M43 = 0.0f;\r
-               result.M44 = 1.0f;\r
-               return result;\r
-       }\r
-\r
-       void Matrix::Scaling( float x, float y, float z, [Out] Matrix% result )\r
-       {\r
-               result.M11 = x;\r
-               result.M12 = 0.0f;\r
-               result.M13 = 0.0f;\r
-               result.M14 = 0.0f;\r
-               result.M21 = 0.0f;\r
-               result.M22 = y;\r
-               result.M23 = 0.0f;\r
-               result.M24 = 0.0f;\r
-               result.M31 = 0.0f;\r
-               result.M32 = 0.0f;\r
-               result.M33 = z;\r
-               result.M34 = 0.0f;\r
-               result.M41 = 0.0f;\r
-               result.M42 = 0.0f;\r
-               result.M43 = 0.0f;\r
-               result.M44 = 1.0f;\r
-       }\r
-\r
-       Matrix Matrix::Scaling ( Vector3 scaling )\r
-       {\r
-               Matrix result;\r
-               result.M11 = scaling.X;\r
-               result.M12 = 0.0f;\r
-               result.M13 = 0.0f;\r
-               result.M14 = 0.0f;\r
-               result.M21 = 0.0f;\r
-               result.M22 = scaling.Y;\r
-               result.M23 = 0.0f;\r
-               result.M24 = 0.0f;\r
-               result.M31 = 0.0f;\r
-               result.M32 = 0.0f;\r
-               result.M33 = scaling.Z;\r
-               result.M34 = 0.0f;\r
-               result.M41 = 0.0f;\r
-               result.M42 = 0.0f;\r
-               result.M43 = 0.0f;\r
-               result.M44 = 1.0f;\r
-               return result;\r
-       }\r
-\r
-       void Matrix::Scaling( Vector3% scaling, [Out] Matrix% result )\r
-       {\r
-               result.M11 = scaling.X;\r
-               result.M12 = 0.0f;\r
-               result.M13 = 0.0f;\r
-               result.M14 = 0.0f;\r
-               result.M21 = 0.0f;\r
-               result.M22 = scaling.Y;\r
-               result.M23 = 0.0f;\r
-               result.M24 = 0.0f;\r
-               result.M31 = 0.0f;\r
-               result.M32 = 0.0f;\r
-               result.M33 = scaling.Z;\r
-               result.M34 = 0.0f;\r
-               result.M41 = 0.0f;\r
-               result.M42 = 0.0f;\r
-               result.M43 = 0.0f;\r
-               result.M44 = 1.0f;\r
-       }\r
-\r
-       Matrix Matrix::AffineTransformation( float scaling, Vector3 rotationCenter, Quaternion rotation, Vector3 translation )\r
-       {\r
-               Matrix result;\r
-               D3DXMatrixAffineTransformation( (D3DXMATRIX*) &result, scaling, (D3DXVECTOR3*) &rotationCenter, (D3DXQUATERNION*) &rotation, (D3DXVECTOR3*) &translation );\r
-               return result;\r
-       }\r
-\r
-       void Matrix::AffineTransformation( float scaling, Vector3% rotationCenter, Quaternion% rotation, Vector3% translation, [Out] Matrix% result )\r
-       {\r
-               pin_ptr<Vector3> pinRotationCenter = &rotationCenter;\r
-               pin_ptr<Quaternion> pinRotation = &rotation;\r
-               pin_ptr<Vector3> pinTranslation = &translation;\r
-               pin_ptr<Matrix> pinResult = &result;\r
-               D3DXMatrixAffineTransformation( (D3DXMATRIX*) pinResult, scaling, (D3DXVECTOR3*) pinRotationCenter, (D3DXQUATERNION*) pinRotation, (D3DXVECTOR3*) pinTranslation );\r
-       }\r
-       \r
-       Matrix Matrix::AffineTransformation2D( float scaling, Vector2 rotationCenter, float rotation, Vector2 translation )\r
-       {\r
-               Matrix result;\r
-               D3DXMatrixAffineTransformation2D( (D3DXMATRIX*) &result, scaling, (D3DXVECTOR2*) &rotationCenter, rotation, (D3DXVECTOR2*) &translation );\r
-               return result;\r
-       }\r
-\r
-       void Matrix::AffineTransformation2D( float scaling, Vector2% rotationCenter, float rotation, Vector2% translation, [Out] Matrix% result )\r
-       {\r
-               pin_ptr<Vector2> pinRotationCenter = &rotationCenter;\r
-               pin_ptr<Vector2> pinTranslation = &translation;\r
-               pin_ptr<Matrix> pinResult = &result;\r
-               D3DXMatrixAffineTransformation2D( (D3DXMATRIX*) pinResult, scaling, (D3DXVECTOR2*) pinRotationCenter, rotation, (D3DXVECTOR2*) pinTranslation );\r
-       }\r
-       \r
-       Matrix Matrix::Transformation( Vector3 scalingCenter, Quaternion scalingRotation, Vector3 scaling, Vector3 rotationCenter, Quaternion rotation, Vector3 translation )\r
-       {\r
-               Matrix result;\r
-               D3DXMatrixTransformation( (D3DXMATRIX*) &result, (D3DXVECTOR3*) &scalingCenter, (D3DXQUATERNION*) &scalingRotation, (D3DXVECTOR3*) &scaling, (D3DXVECTOR3*) &rotationCenter, (D3DXQUATERNION*) &rotation, (D3DXVECTOR3*) &translation );\r
-               return result;\r
-       }\r
-\r
-       void Matrix::Transformation( Vector3% scalingCenter, Quaternion% scalingRotation, Vector3% scaling, Vector3% rotationCenter, Quaternion% rotation, Vector3% translation, [Out] Matrix% result )\r
-       {\r
-               pin_ptr<Vector3> pinScalingCenter = &scalingCenter;\r
-               pin_ptr<Quaternion> pinScalingRotation = &scalingRotation;\r
-               pin_ptr<Vector3> pinScaling = &scaling;\r
-               pin_ptr<Vector3> pinRotationCenter = &rotationCenter;\r
-               pin_ptr<Quaternion> pinRotation = &rotation;\r
-               pin_ptr<Vector3> pinTranslation = &translation;\r
-               pin_ptr<Matrix> pinResult = &result;\r
-               D3DXMatrixTransformation( (D3DXMATRIX*) pinResult, (D3DXVECTOR3*) pinScalingCenter, (D3DXQUATERNION*) pinScalingRotation, \r
-                       (D3DXVECTOR3*) pinScaling, (D3DXVECTOR3*) pinRotationCenter, (D3DXQUATERNION*) pinRotation, (D3DXVECTOR3*) pinTranslation );\r
-       }\r
-       \r
-       Matrix Matrix::Transformation2D( Vector2 scalingCenter, float scalingRotation, Vector2 scaling, Vector2 rotationCenter, float rotation, Vector2 translation )\r
-       {\r
-               Matrix result;\r
-               D3DXMatrixTransformation2D( (D3DXMATRIX*) &result, (D3DXVECTOR2*) &scalingCenter, scalingRotation, (D3DXVECTOR2*) &scaling, (D3DXVECTOR2*) &rotationCenter, rotation, (D3DXVECTOR2*) &translation );\r
-               return result;\r
-       }\r
-\r
-       void Matrix::Transformation2D( Vector2% scalingCenter, float scalingRotation, Vector2% scaling, Vector2% rotationCenter, float rotation, Vector2% translation, [Out] Matrix% result )\r
-       {\r
-               pin_ptr<Vector2> pinScalingCenter = &scalingCenter;\r
-               pin_ptr<Vector2> pinScaling = &scaling;\r
-               pin_ptr<Vector2> pinRotationCenter = &rotationCenter;\r
-               pin_ptr<Vector2> pinTranslation = &translation;\r
-               pin_ptr<Matrix> pinResult = &result;\r
-               D3DXMatrixTransformation2D( (D3DXMATRIX*) pinResult, (D3DXVECTOR2*) pinScalingCenter, scalingRotation, \r
-                       (D3DXVECTOR2*) pinScaling, (D3DXVECTOR2*) pinRotationCenter, rotation, (D3DXVECTOR2*) pinTranslation );\r
-       }\r
-       \r
-       Matrix Matrix::LookAtLH(Vector3 eye, Vector3 target, Vector3 up )\r
-       {\r
-               Matrix result;\r
-               D3DXMatrixLookAtLH( (D3DXMATRIX*) &result, (D3DXVECTOR3*) &eye, (D3DXVECTOR3*) &target, (D3DXVECTOR3*) &up );\r
-               return result;\r
-       }\r
-\r
-       void Matrix::LookAtLH(Vector3% eye, Vector3% target, Vector3% up, [Out] Matrix% result )\r
-       {\r
-               pin_ptr<Vector3> pinEye = &eye;\r
-               pin_ptr<Vector3> pinTarget = &target;\r
-               pin_ptr<Vector3> pinUp = &up;\r
-               pin_ptr<Matrix> pinResult = &result;\r
-               D3DXMatrixLookAtLH( (D3DXMATRIX*) pinResult, (D3DXVECTOR3*) pinEye, (D3DXVECTOR3*) pinTarget, (D3DXVECTOR3*) pinUp );\r
-       }\r
-       \r
-       Matrix Matrix::LookAtRH(Vector3 eye, Vector3 target, Vector3 up )\r
-       {\r
-               Matrix result;\r
-               D3DXMatrixLookAtRH( (D3DXMATRIX*) &result, (D3DXVECTOR3*) &eye, (D3DXVECTOR3*) &target, (D3DXVECTOR3*) &up );\r
-               return result;\r
-       }\r
-\r
-       void Matrix::LookAtRH(Vector3% eye, Vector3% target, Vector3% up, [Out] Matrix% result )\r
-       {\r
-               pin_ptr<Vector3> pinEye = &eye;\r
-               pin_ptr<Vector3> pinTarget = &target;\r
-               pin_ptr<Vector3> pinUp = &up;\r
-               pin_ptr<Matrix> pinResult = &result;\r
-               D3DXMatrixLookAtRH( (D3DXMATRIX*) pinResult, (D3DXVECTOR3*) pinEye, (D3DXVECTOR3*) pinTarget, (D3DXVECTOR3*) pinUp );\r
-       }\r
-       \r
-       Matrix Matrix::OrthoLH( float width, float height, float znear, float zfar )\r
-       {\r
-               Matrix result;\r
-               D3DXMatrixOrthoLH( (D3DXMATRIX*) &result, width, height, znear, zfar );\r
-               return result;\r
-       }\r
-\r
-       void Matrix::OrthoLH( float width, float height, float znear, float zfar, [Out] Matrix% result )\r
-       {\r
-               pin_ptr<Matrix> pinResult = &result;\r
-               D3DXMatrixOrthoLH( (D3DXMATRIX*) pinResult, width, height, znear, zfar );\r
-       }\r
-       \r
-       Matrix Matrix::OrthoRH( float width, float height, float znear, float zfar )\r
-       {\r
-               Matrix result;\r
-               D3DXMatrixOrthoRH( (D3DXMATRIX*) &result, width, height, znear, zfar );\r
-               return result;\r
-       }\r
-\r
-       void Matrix::OrthoRH( float width, float height, float znear, float zfar, [Out] Matrix% result )\r
-       {\r
-               pin_ptr<Matrix> pinResult = &result;\r
-               D3DXMatrixOrthoRH( (D3DXMATRIX*) pinResult, width, height, znear, zfar );\r
-       }\r
-       \r
-       Matrix Matrix::OrthoOffCenterLH( float left, float right, float bottom, float top, float znear, float zfar )\r
-       {\r
-               Matrix result;\r
-               D3DXMatrixOrthoOffCenterLH( (D3DXMATRIX*) &result, left, right, bottom, top, znear, zfar );\r
-               return result;\r
-       }\r
-\r
-       void Matrix::OrthoOffCenterLH( float left, float right, float bottom, float top, float znear, float zfar, [Out] Matrix% result )\r
-       {\r
-               pin_ptr<Matrix> pinResult = &result;\r
-               D3DXMatrixOrthoOffCenterLH( (D3DXMATRIX*) pinResult, left, right, bottom, top, znear, zfar );\r
-       }\r
-       \r
-       Matrix Matrix::OrthoOffCenterRH( float left, float right, float bottom, float top, float znear, float zfar )\r
-       {\r
-               Matrix result;\r
-               D3DXMatrixOrthoOffCenterRH( (D3DXMATRIX*) &result, left, right, bottom, top, znear, zfar );\r
-               return result;\r
-       }\r
-\r
-       void Matrix::OrthoOffCenterRH( float left, float right, float bottom, float top, float znear, float zfar, [Out] Matrix% result )\r
-       {\r
-               pin_ptr<Matrix> pinResult = &result;\r
-               D3DXMatrixOrthoOffCenterRH( (D3DXMATRIX*) pinResult, left, right, bottom, top, znear, zfar );\r
-       }\r
-       \r
-       Matrix Matrix::PerspectiveLH( float width, float height, float znear, float zfar )\r
-       {\r
-               Matrix result;\r
-               D3DXMatrixPerspectiveLH( (D3DXMATRIX*) &result, width, height, znear, zfar );\r
-               return result;\r
-       }\r
-\r
-       void Matrix::PerspectiveLH( float width, float height, float znear, float zfar, [Out] Matrix% result )\r
-       {\r
-               pin_ptr<Matrix> pinResult = &result;\r
-               D3DXMatrixPerspectiveLH( (D3DXMATRIX*) pinResult, width, height, znear, zfar );\r
-       }\r
-       \r
-       Matrix Matrix::PerspectiveRH( float width, float height, float znear, float zfar )\r
-       {\r
-               Matrix result;\r
-               D3DXMatrixPerspectiveRH( (D3DXMATRIX*) &result, width, height, znear, zfar );\r
-               return result;\r
-       }\r
-\r
-       void Matrix::PerspectiveRH( float width, float height, float znear, float zfar, [Out] Matrix% result )\r
-       {\r
-               pin_ptr<Matrix> pinResult = &result;\r
-               D3DXMatrixPerspectiveRH( (D3DXMATRIX*) pinResult, width, height, znear, zfar );\r
-       }\r
-\r
-       Matrix Matrix::PerspectiveFovLH( float fov, float aspect, float znear, float zfar )\r
-       {\r
-               Matrix result;\r
-               D3DXMatrixPerspectiveFovLH( (D3DXMATRIX*) &result, fov, aspect, znear, zfar );\r
-               return result;\r
-       }\r
-\r
-       void Matrix::PerspectiveFovLH( float fov, float aspect, float znear, float zfar, [Out] Matrix% result )\r
-       {\r
-               pin_ptr<Matrix> pinResult = &result;\r
-               D3DXMatrixPerspectiveFovLH( (D3DXMATRIX*) pinResult, fov, aspect, znear, zfar );\r
-       }\r
-       \r
-       Matrix Matrix::PerspectiveFovRH( float fov, float aspect, float znear, float zfar )\r
-       {\r
-               Matrix result;\r
-               D3DXMatrixPerspectiveFovRH( (D3DXMATRIX*) &result, fov, aspect, znear, zfar );\r
-               return result;\r
-       }\r
-\r
-       void Matrix::PerspectiveFovRH( float fov, float aspect, float znear, float zfar, [Out] Matrix% result )\r
-       {\r
-               pin_ptr<Matrix> pinResult = &result;\r
-               D3DXMatrixPerspectiveFovRH( (D3DXMATRIX*) pinResult, fov, aspect, znear, zfar );\r
-       }\r
-       \r
-       Matrix Matrix::PerspectiveOffCenterLH( float left, float right, float bottom, float top, float znear, float zfar )\r
-       {\r
-               Matrix result;\r
-               D3DXMatrixPerspectiveOffCenterLH( (D3DXMATRIX*) &result, left, right, bottom, top, znear, zfar );\r
-               return result;\r
-       }\r
-\r
-       void Matrix::PerspectiveOffCenterLH( float left, float right, float bottom, float top, float znear, float zfar, [Out] Matrix% result )\r
-       {\r
-               pin_ptr<Matrix> pinResult = &result;\r
-               D3DXMatrixPerspectiveOffCenterLH( (D3DXMATRIX*) pinResult, left, right, bottom, top, znear, zfar );\r
-       }\r
-       \r
-       Matrix Matrix::PerspectiveOffCenterRH( float left, float right, float bottom, float top, float znear, float zfar )\r
-       {\r
-               Matrix result;\r
-               D3DXMatrixPerspectiveOffCenterRH( (D3DXMATRIX*) &result, left, right, bottom, top, znear, zfar );\r
-               return result;\r
-       }\r
-\r
-       void Matrix::PerspectiveOffCenterRH( float left, float right, float bottom, float top, float znear, float zfar, [Out] Matrix% result )\r
-       {\r
-               pin_ptr<Matrix> pinResult = &result;\r
-               D3DXMatrixPerspectiveOffCenterRH( (D3DXMATRIX*) pinResult, left, right, bottom, top, znear, zfar );\r
-       }\r
-\r
-       Matrix Matrix::Reflection( Plane plane )\r
-       {\r
-               Matrix result;\r
-               plane.Normalize();\r
-               float x = plane.Normal.X;\r
-               float y = plane.Normal.Y;\r
-               float z = plane.Normal.Z;\r
-               float x2 = -2.0f * x;\r
-               float y2 = -2.0f * y;\r
-               float z2 = -2.0f * z;\r
-               result.M11 = (x2 * x) + 1.0f;\r
-               result.M12 = y2 * x;\r
-               result.M13 = z2 * x;\r
-               result.M14 = 0.0f;\r
-               result.M21 = x2 * y;\r
-               result.M22 = (y2 * y) + 1.0f;\r
-               result.M23 = z2 * y;\r
-               result.M24 = 0.0f;\r
-               result.M31 = x2 * z;\r
-               result.M32 = y2 * z;\r
-               result.M33 = (z2 * z) + 1.0f;\r
-               result.M34 = 0.0f;\r
-               result.M41 = x2 * plane.D;\r
-               result.M42 = y2 * plane.D;\r
-               result.M43 = z2 * plane.D;\r
-               result.M44 = 1.0f;\r
-               return result;\r
-       }\r
-\r
-       void Matrix::Reflection( Plane% plane, [Out] Matrix% result )\r
-       {\r
-               plane.Normalize();\r
-               float x = plane.Normal.X;\r
-               float y = plane.Normal.Y;\r
-               float z = plane.Normal.Z;\r
-               float x2 = -2.0f * x;\r
-               float y2 = -2.0f * y;\r
-               float z2 = -2.0f * z;\r
-               result.M11 = (x2 * x) + 1.0f;\r
-               result.M12 = y2 * x;\r
-               result.M13 = z2 * x;\r
-               result.M14 = 0.0f;\r
-               result.M21 = x2 * y;\r
-               result.M22 = (y2 * y) + 1.0f;\r
-               result.M23 = z2 * y;\r
-               result.M24 = 0.0f;\r
-               result.M31 = x2 * z;\r
-               result.M32 = y2 * z;\r
-               result.M33 = (z2 * z) + 1.0f;\r
-               result.M34 = 0.0f;\r
-               result.M41 = x2 * plane.D;\r
-               result.M42 = y2 * plane.D;\r
-               result.M43 = z2 * plane.D;\r
-               result.M44 = 1.0f;\r
-       }\r
-       \r
-       Matrix Matrix::Shadow( Vector4 light, Plane plane )\r
-       {\r
-               Matrix result;\r
-               plane.Normalize();\r
-               float dot = ((plane.Normal.X * light.X) + (plane.Normal.Y * light.Y)) + (plane.Normal.Z * light.Z);\r
-               float x = -plane.Normal.X;\r
-               float y = -plane.Normal.Y;\r
-               float z = -plane.Normal.Z;\r
-               float d = -plane.D;\r
-               result.M11 = (x * light.X) + dot;\r
-               result.M21 = y * light.X;\r
-               result.M31 = z * light.X;\r
-               result.M41 = d * light.X;\r
-               result.M12 = x * light.Y;\r
-               result.M22 = (y * light.Y) + dot;\r
-               result.M32 = z * light.Y;\r
-               result.M42 = d * light.Y;\r
-               result.M13 = x * light.Z;\r
-               result.M23 = y * light.Z;\r
-               result.M33 = (z * light.Z) + dot;\r
-               result.M43 = d * light.Z;\r
-               result.M14 = 0.0f;\r
-               result.M24 = 0.0f;\r
-               result.M34 = 0.0f;\r
-               result.M44 = dot;\r
-               return result;\r
-       }\r
-\r
-       void Matrix::Shadow( Vector4% light, Plane% plane, [Out] Matrix% result )\r
-       {\r
-               plane.Normalize();\r
-               float dot = ((plane.Normal.X * light.X) + (plane.Normal.Y * light.Y)) + (plane.Normal.Z * light.Z);\r
-               float x = -plane.Normal.X;\r
-               float y = -plane.Normal.Y;\r
-               float z = -plane.Normal.Z;\r
-               float d = -plane.D;\r
-               result.M11 = (x * light.X) + dot;\r
-               result.M21 = y * light.X;\r
-               result.M31 = z * light.X;\r
-               result.M41 = d * light.X;\r
-               result.M12 = x * light.Y;\r
-               result.M22 = (y * light.Y) + dot;\r
-               result.M32 = z * light.Y;\r
-               result.M42 = d * light.Y;\r
-               result.M13 = x * light.Z;\r
-               result.M23 = y * light.Z;\r
-               result.M33 = (z * light.Z) + dot;\r
-               result.M43 = d * light.Z;\r
-               result.M14 = 0.0f;\r
-               result.M24 = 0.0f;\r
-               result.M34 = 0.0f;\r
-               result.M44 = dot;\r
-       }\r
-\r
-       Matrix Matrix::Invert( Matrix mat )\r
-       {\r
-               Matrix result;\r
-               D3DXMatrixInverse( (D3DXMATRIX*) &result, NULL, (D3DXMATRIX*) &mat );\r
-               return result;\r
-       }\r
-\r
-       void Matrix::Invert( Matrix% mat, [Out] Matrix% result )\r
-       {\r
-               pin_ptr<Matrix> pinMatrix = &mat;\r
-               pin_ptr<Matrix> pinResult = &result;\r
-               D3DXMatrixInverse( (D3DXMATRIX*) pinResult, NULL, (D3DXMATRIX*) pinMatrix );\r
-       }\r
-\r
-       Matrix Matrix::Transpose( Matrix mat )\r
-       {\r
-               Matrix result;\r
-               result.M11 = mat.M11;\r
-               result.M12 = mat.M21;\r
-               result.M13 = mat.M31;\r
-               result.M14 = mat.M41;\r
-               result.M21 = mat.M12;\r
-               result.M22 = mat.M22;\r
-               result.M23 = mat.M32;\r
-               result.M24 = mat.M42;\r
-               result.M31 = mat.M13;\r
-               result.M32 = mat.M23;\r
-               result.M33 = mat.M33;\r
-               result.M34 = mat.M43;\r
-               result.M41 = mat.M14;\r
-               result.M42 = mat.M24;\r
-               result.M43 = mat.M34;\r
-               result.M44 = mat.M44;\r
-               return result;\r
-       }\r
-\r
-       void Matrix::Transpose( Matrix% mat, [Out] Matrix% result )\r
-       {\r
-               Matrix r;\r
-               r.M11 = mat.M11;\r
-               r.M12 = mat.M21;\r
-               r.M13 = mat.M31;\r
-               r.M14 = mat.M41;\r
-               r.M21 = mat.M12;\r
-               r.M22 = mat.M22;\r
-               r.M23 = mat.M32;\r
-               r.M24 = mat.M42;\r
-               r.M31 = mat.M13;\r
-               r.M32 = mat.M23;\r
-               r.M33 = mat.M33;\r
-               r.M34 = mat.M43;\r
-               r.M41 = mat.M14;\r
-               r.M42 = mat.M24;\r
-               r.M43 = mat.M34;\r
-               r.M44 = mat.M44;\r
-\r
-               result = r;\r
-       }\r
-\r
-       Matrix Matrix::operator * ( Matrix left, Matrix right )\r
-       {\r
-               Matrix result;\r
-               result.M11 = (left.M11 * right.M11) + (left.M12 * right.M21) + (left.M13 * right.M31) + (left.M14 * right.M41);\r
-               result.M12 = (left.M11 * right.M12) + (left.M12 * right.M22) + (left.M13 * right.M32) + (left.M14 * right.M42);\r
-               result.M13 = (left.M11 * right.M13) + (left.M12 * right.M23) + (left.M13 * right.M33) + (left.M14 * right.M43);\r
-               result.M14 = (left.M11 * right.M14) + (left.M12 * right.M24) + (left.M13 * right.M34) + (left.M14 * right.M44);\r
-               result.M21 = (left.M21 * right.M11) + (left.M22 * right.M21) + (left.M23 * right.M31) + (left.M24 * right.M41);\r
-               result.M22 = (left.M21 * right.M12) + (left.M22 * right.M22) + (left.M23 * right.M32) + (left.M24 * right.M42);\r
-               result.M23 = (left.M21 * right.M13) + (left.M22 * right.M23) + (left.M23 * right.M33) + (left.M24 * right.M43);\r
-               result.M24 = (left.M21 * right.M14) + (left.M22 * right.M24) + (left.M23 * right.M34) + (left.M24 * right.M44);\r
-               result.M31 = (left.M31 * right.M11) + (left.M32 * right.M21) + (left.M33 * right.M31) + (left.M34 * right.M41);\r
-               result.M32 = (left.M31 * right.M12) + (left.M32 * right.M22) + (left.M33 * right.M32) + (left.M34 * right.M42);\r
-               result.M33 = (left.M31 * right.M13) + (left.M32 * right.M23) + (left.M33 * right.M33) + (left.M34 * right.M43);\r
-               result.M34 = (left.M31 * right.M14) + (left.M32 * right.M24) + (left.M33 * right.M34) + (left.M34 * right.M44);\r
-               result.M41 = (left.M41 * right.M11) + (left.M42 * right.M21) + (left.M43 * right.M31) + (left.M44 * right.M41);\r
-               result.M42 = (left.M41 * right.M12) + (left.M42 * right.M22) + (left.M43 * right.M32) + (left.M44 * right.M42);\r
-               result.M43 = (left.M41 * right.M13) + (left.M42 * right.M23) + (left.M43 * right.M33) + (left.M44 * right.M43);\r
-               result.M44 = (left.M41 * right.M14) + (left.M42 * right.M24) + (left.M43 * right.M34) + (left.M44 * right.M44);\r
-               return result;\r
-       }\r
-\r
-       Matrix Matrix::operator * ( Matrix left, float right )\r
-       {\r
-               Matrix result;\r
-               result.M11 = left.M11 * right;\r
-               result.M12 = left.M12 * right;\r
-               result.M13 = left.M13 * right;\r
-               result.M14 = left.M14 * right;\r
-               result.M21 = left.M21 * right;\r
-               result.M22 = left.M22 * right;\r
-               result.M23 = left.M23 * right;\r
-               result.M24 = left.M24 * right;\r
-               result.M31 = left.M31 * right;\r
-               result.M32 = left.M32 * right;\r
-               result.M33 = left.M33 * right;\r
-               result.M34 = left.M34 * right;\r
-               result.M41 = left.M41 * right;\r
-               result.M42 = left.M42 * right;\r
-               result.M43 = left.M43 * right;\r
-               result.M44 = left.M44 * right;\r
-               return result;\r
-       }\r
-\r
-       Matrix Matrix::operator * ( float right, Matrix left )\r
-       {\r
-               return left * right;\r
-       }\r
-\r
-       Matrix Matrix::operator / ( Matrix left, Matrix right )\r
-       {\r
-               Matrix result;\r
-               result.M11 = left.M11 / right.M11;\r
-               result.M12 = left.M12 / right.M12;\r
-               result.M13 = left.M13 / right.M13;\r
-               result.M14 = left.M14 / right.M14;\r
-               result.M21 = left.M21 / right.M21;\r
-               result.M22 = left.M22 / right.M22;\r
-               result.M23 = left.M23 / right.M23;\r
-               result.M24 = left.M24 / right.M24;\r
-               result.M31 = left.M31 / right.M31;\r
-               result.M32 = left.M32 / right.M32;\r
-               result.M33 = left.M33 / right.M33;\r
-               result.M34 = left.M34 / right.M34;\r
-               result.M41 = left.M41 / right.M41;\r
-               result.M42 = left.M42 / right.M42;\r
-               result.M43 = left.M43 / right.M43;\r
-               result.M44 = left.M44 / right.M44;\r
-               return result;\r
-       }\r
-\r
-       Matrix Matrix::operator / ( Matrix left, float right )\r
-       {\r
-               Matrix result;\r
-               result.M11 = left.M11 / right;\r
-               result.M12 = left.M12 / right;\r
-               result.M13 = left.M13 / right;\r
-               result.M14 = left.M14 / right;\r
-               result.M21 = left.M21 / right;\r
-               result.M22 = left.M22 / right;\r
-               result.M23 = left.M23 / right;\r
-               result.M24 = left.M24 / right;\r
-               result.M31 = left.M31 / right;\r
-               result.M32 = left.M32 / right;\r
-               result.M33 = left.M33 / right;\r
-               result.M34 = left.M34 / right;\r
-               result.M41 = left.M41 / right;\r
-               result.M42 = left.M42 / right;\r
-               result.M43 = left.M43 / right;\r
-               result.M44 = left.M44 / right;\r
-               return result;\r
-       }\r
-\r
-       Matrix Matrix::operator + ( Matrix left, Matrix right )\r
-       {\r
-               Matrix result;\r
-               result.M11 = left.M11 + right.M11;\r
-               result.M12 = left.M12 + right.M12;\r
-               result.M13 = left.M13 + right.M13;\r
-               result.M14 = left.M14 + right.M14;\r
-               result.M21 = left.M21 + right.M21;\r
-               result.M22 = left.M22 + right.M22;\r
-               result.M23 = left.M23 + right.M23;\r
-               result.M24 = left.M24 + right.M24;\r
-               result.M31 = left.M31 + right.M31;\r
-               result.M32 = left.M32 + right.M32;\r
-               result.M33 = left.M33 + right.M33;\r
-               result.M34 = left.M34 + right.M34;\r
-               result.M41 = left.M41 + right.M41;\r
-               result.M42 = left.M42 + right.M42;\r
-               result.M43 = left.M43 + right.M43;\r
-               result.M44 = left.M44 + right.M44;\r
-               return result;\r
-       }\r
-\r
-       Matrix Matrix::operator - ( Matrix left, Matrix right )\r
-       {\r
-               Matrix result;\r
-               result.M11 = left.M11 - right.M11;\r
-               result.M12 = left.M12 - right.M12;\r
-               result.M13 = left.M13 - right.M13;\r
-               result.M14 = left.M14 - right.M14;\r
-               result.M21 = left.M21 - right.M21;\r
-               result.M22 = left.M22 - right.M22;\r
-               result.M23 = left.M23 - right.M23;\r
-               result.M24 = left.M24 - right.M24;\r
-               result.M31 = left.M31 - right.M31;\r
-               result.M32 = left.M32 - right.M32;\r
-               result.M33 = left.M33 - right.M33;\r
-               result.M34 = left.M34 - right.M34;\r
-               result.M41 = left.M41 - right.M41;\r
-               result.M42 = left.M42 - right.M42;\r
-               result.M43 = left.M43 - right.M43;\r
-               result.M44 = left.M44 - right.M44;\r
-               return result;\r
-       }\r
-\r
-       Matrix Matrix::operator - ( Matrix matrix )\r
-       {\r
-               Matrix result;\r
-               result.M11 = -matrix.M11;\r
-               result.M12 = -matrix.M12;\r
-               result.M13 = -matrix.M13;\r
-               result.M14 = -matrix.M14;\r
-               result.M21 = -matrix.M21;\r
-               result.M22 = -matrix.M22;\r
-               result.M23 = -matrix.M23;\r
-               result.M24 = -matrix.M24;\r
-               result.M31 = -matrix.M31;\r
-               result.M32 = -matrix.M32;\r
-               result.M33 = -matrix.M33;\r
-               result.M34 = -matrix.M34;\r
-               result.M41 = -matrix.M41;\r
-               result.M42 = -matrix.M42;\r
-               result.M43 = -matrix.M43;\r
-               result.M44 = -matrix.M44;\r
-               return result;\r
-       }\r
-\r
-       bool Matrix::operator == ( Matrix left, Matrix right )\r
-       {\r
-               return Matrix::Equals( left, right );\r
-       }\r
-\r
-       bool Matrix::operator != ( Matrix left, Matrix right )\r
-       {\r
-               return !Matrix::Equals( left, right );\r
-       }\r
-\r
-       String^ Matrix::ToString()\r
-       {\r
-               return String::Format( CultureInfo::CurrentCulture, "[[M11:{0} M12:{1} M13:{2} M14:{3}] [M21:{4} M22:{5} M23:{6} M24:{7}] [M31:{8} M32:{9} M33:{10} M34:{11}] [M41:{12} M42:{13} M43:{14} M44:{15}]]",\r
-                       M11.ToString(CultureInfo::CurrentCulture), M12.ToString(CultureInfo::CurrentCulture), M13.ToString(CultureInfo::CurrentCulture), M14.ToString(CultureInfo::CurrentCulture),\r
-                       M21.ToString(CultureInfo::CurrentCulture), M22.ToString(CultureInfo::CurrentCulture), M23.ToString(CultureInfo::CurrentCulture), M24.ToString(CultureInfo::CurrentCulture),\r
-                       M31.ToString(CultureInfo::CurrentCulture), M32.ToString(CultureInfo::CurrentCulture), M33.ToString(CultureInfo::CurrentCulture), M34.ToString(CultureInfo::CurrentCulture),\r
-                       M41.ToString(CultureInfo::CurrentCulture), M42.ToString(CultureInfo::CurrentCulture), M43.ToString(CultureInfo::CurrentCulture), M44.ToString(CultureInfo::CurrentCulture) );\r
-       }\r
-\r
-       int Matrix::GetHashCode()\r
-       {\r
-               return M11.GetHashCode() + M12.GetHashCode() + M13.GetHashCode() + M14.GetHashCode() +\r
-                          M21.GetHashCode() + M22.GetHashCode() + M23.GetHashCode() + M24.GetHashCode() +\r
-                          M31.GetHashCode() + M32.GetHashCode() + M33.GetHashCode() + M34.GetHashCode() +\r
-                          M41.GetHashCode() + M42.GetHashCode() + M43.GetHashCode() + M44.GetHashCode();\r
-       }\r
-\r
-       bool Matrix::Equals( Object^ value )\r
-       {\r
-               if( value == nullptr )\r
-                       return false;\r
-\r
-               if( value->GetType() != GetType() )\r
-                       return false;\r
-\r
-               return Equals( safe_cast<Matrix>( value ) );\r
-       }\r
-\r
-       bool Matrix::Equals( Matrix value )\r
-       {\r
-               return ( M11 == value.M11 && M12 == value.M12 && M13 == value.M13 && M14 == value.M14 &&\r
-                                M21 == value.M21 && M22 == value.M22 && M23 == value.M23 && M24 == value.M24 &&\r
-                                M31 == value.M31 && M32 == value.M32 && M33 == value.M33 && M34 == value.M34 &&\r
-                                M41 == value.M41 && M42 == value.M42 && M43 == value.M43 && M44 == value.M44 );\r
-       }\r
-\r
-       bool Matrix::Equals( Matrix% value1, Matrix% value2 )\r
-       {\r
-               return ( value1.M11 == value2.M11 && value1.M12 == value2.M12 && value1.M13 == value2.M13 && value1.M14 == value2.M14 &&\r
-                                value1.M21 == value2.M21 && value1.M22 == value2.M22 && value1.M23 == value2.M23 && value1.M24 == value2.M24 &&\r
-                                value1.M31 == value2.M31 && value1.M32 == value2.M32 && value1.M33 == value2.M33 && value1.M34 == value2.M34 &&\r
-                                value1.M41 == value2.M41 && value1.M42 == value2.M42 && value1.M43 == value2.M43 && value1.M44 == value2.M44 );\r
-       }\r
-}\r