1086 {
1087 bool result = true;
1088 fixed (Vector3* ptr = &scale)
1089 {
1090 float* ptr2 = (float*)ptr;
1094 CanonicalBasis canonicalBasis = default(CanonicalBasis);
1095 Vector3* ptr4 = &canonicalBasis.Row0;
1096 canonicalBasis.Row0 =
new Vector3(1f, 0f, 0f);
1097 canonicalBasis.Row1 =
new Vector3(0f, 1f, 0f);
1098 canonicalBasis.Row2 =
new Vector3(0f, 0f, 1f);
1099 translation =
new Vector3(matrix.M41, matrix.M42, matrix.M43);
1100 *ptr3 = (
Vector3*)(&identity.M11);
1101 ptr3[1] = (
Vector3*)(&identity.M21);
1102 ptr3[2] = (
Vector3*)(&identity.M31);
1103 *(*ptr3) =
new Vector3(matrix.M11, matrix.M12, matrix.M13);
1104 *ptr3[1] =
new Vector3(matrix.M21, matrix.M22, matrix.M23);
1105 *ptr3[2] =
new Vector3(matrix.M31, matrix.M32, matrix.M33);
1106 scale.X = (*ptr3)->Length();
1107 scale.Y = ptr3[1]->Length();
1108 scale.Z = ptr3[2]->Length();
1109 float num = *ptr2;
1110 float num2 = ptr2[1];
1111 float num3 = ptr2[2];
1112 uint num4;
1113 uint num5;
1114 uint num6;
1115 if (num < num2)
1116 {
1117 if (num2 < num3)
1118 {
1119 num4 = 2u;
1120 num5 = 1u;
1121 num6 = 0u;
1122 }
1123 else
1124 {
1125 num4 = 1u;
1126 if (num < num3)
1127 {
1128 num5 = 2u;
1129 num6 = 0u;
1130 }
1131 else
1132 {
1133 num5 = 0u;
1134 num6 = 2u;
1135 }
1136 }
1137 }
1138 else if (num < num3)
1139 {
1140 num4 = 2u;
1141 num5 = 0u;
1142 num6 = 1u;
1143 }
1144 else
1145 {
1146 num4 = 0u;
1147 if (num2 < num3)
1148 {
1149 num5 = 2u;
1150 num6 = 1u;
1151 }
1152 else
1153 {
1154 num5 = 1u;
1155 num6 = 2u;
1156 }
1157 }
1158 if (ptr2[num4] < 0.0001f)
1159 {
1160 *ptr3[num4] = ptr4[num4];
1161 }
1162 *ptr3[num4] =
Vector3.Normalize(*ptr3[num4]);
1163 if (ptr2[num5] < 0.0001f)
1164 {
1165 float num7 = MathF.Abs(ptr3[num4]->
X);
1166 float num8 = MathF.Abs(ptr3[num4]->
Y);
1167 float num9 = MathF.Abs(ptr3[num4]->
Z);
1168 uint num10 = ((num7 < num8) ? ((!(num8 < num9)) ? ((!(num7 < num9)) ? 2u : 0u) : 0u) : ((num7 < num9) ? 1u : ((num8 < num9) ? 1u : 2u)));
1169 *ptr3[num5] =
Vector3.Cross(*ptr3[num4], ptr4[num10]);
1170 }
1171 *ptr3[num5] =
Vector3.Normalize(*ptr3[num5]);
1172 if (ptr2[num6] < 0.0001f)
1173 {
1174 *ptr3[num6] =
Vector3.Cross(*ptr3[num4], *ptr3[num5]);
1175 }
1176 *ptr3[num6] =
Vector3.Normalize(*ptr3[num6]);
1177 float num11 = identity.GetDeterminant();
1178 if (num11 < 0f)
1179 {
1180 ptr2[num4] = 0f - ptr2[num4];
1181 *ptr3[num4] = -(*ptr3[num4]);
1182 num11 = 0f - num11;
1183 }
1184 num11 -= 1f;
1185 num11 *= num11;
1186 if (0.0001f < num11)
1187 {
1188 rotation = Quaternion.Identity;
1189 result = false;
1190 }
1191 else
1192 {
1193 rotation = Quaternion.CreateFromRotationMatrix(identity);
1194 }
1195 }
1196 return result;
1197 }
Matrix4x4(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)
static Matrix4x4 Identity