Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ Decompose()

unsafe bool Microsoft.Xna.Framework.Matrix.Decompose ( out Vector3 scale,
out Quaternion rotation,
out Vector3 translation )
inline

Definition at line 1364 of file Matrix.cs.

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 }
static double Abs(double value)
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

References System.Math.Abs(), Microsoft.Xna.Framework.Quaternion.CreateFromRotationMatrix(), Microsoft.Xna.Framework.Vector3.Cross(), Microsoft.Xna.Framework.Matrix.Determinant(), Microsoft.Xna.Framework.Matrix.Identity, Microsoft.Xna.Framework.Quaternion.Identity, Microsoft.Xna.Framework.Vector3.Length(), Microsoft.Xna.Framework.Matrix.M11, Microsoft.Xna.Framework.Matrix.M12, Microsoft.Xna.Framework.Matrix.M13, Microsoft.Xna.Framework.Matrix.M21, Microsoft.Xna.Framework.Matrix.M22, Microsoft.Xna.Framework.Matrix.M23, Microsoft.Xna.Framework.Matrix.M31, Microsoft.Xna.Framework.Matrix.M32, Microsoft.Xna.Framework.Matrix.M33, Microsoft.Xna.Framework.Matrix.M41, Microsoft.Xna.Framework.Matrix.M42, Microsoft.Xna.Framework.Matrix.M43, Microsoft.Xna.Framework.Vector3.Normalize(), Microsoft.Xna.Framework.Matrix.CanonicalBasis.Row0, System.X, System.Y, and System.Z.