From 91d768d985cf5dd2eae18bc06b5f3941f015b99d Mon Sep 17 00:00:00 2001 From: SingleAccretion Date: Fri, 2 Dec 2022 21:36:46 +0300 Subject: [PATCH] Speed up Matrix4x4.CreateScale --- .../src/System/Numerics/Matrix4x4.cs | 46 +++++++++++-------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/Numerics/Matrix4x4.cs b/src/libraries/System.Private.CoreLib/src/System/Numerics/Matrix4x4.cs index d0738641a3e2ec..4cbe3d4a93ad7b 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Numerics/Matrix4x4.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Numerics/Matrix4x4.cs @@ -1202,10 +1202,13 @@ public static Matrix4x4 CreateRotationZ(float radians, Vector3 centerPoint) /// The scaling matrix. public static Matrix4x4 CreateScale(float xScale, float yScale, float zScale) { - Matrix4x4 result = Identity; + Matrix4x4 result = default; + result.M11 = xScale; result.M22 = yScale; result.M33 = zScale; + result.M44 = 1; + return result; } @@ -1217,7 +1220,7 @@ public static Matrix4x4 CreateScale(float xScale, float yScale, float zScale) /// The scaling matrix. public static Matrix4x4 CreateScale(float xScale, float yScale, float zScale, Vector3 centerPoint) { - Matrix4x4 result = Identity; + Matrix4x4 result = default; float tx = centerPoint.X * (1 - xScale); float ty = centerPoint.Y * (1 - yScale); @@ -1226,9 +1229,12 @@ public static Matrix4x4 CreateScale(float xScale, float yScale, float zScale, Ve result.M11 = xScale; result.M22 = yScale; result.M33 = zScale; + result.M44 = 1; + result.M41 = tx; result.M42 = ty; result.M43 = tz; + return result; } @@ -1237,10 +1243,13 @@ public static Matrix4x4 CreateScale(float xScale, float yScale, float zScale, Ve /// The scaling matrix. public static Matrix4x4 CreateScale(Vector3 scales) { - Matrix4x4 result = Identity; + Matrix4x4 result = default; + result.M11 = scales.X; result.M22 = scales.Y; result.M33 = scales.Z; + result.M44 = 1; + return result; } @@ -1250,18 +1259,19 @@ public static Matrix4x4 CreateScale(Vector3 scales) /// The scaling matrix. public static Matrix4x4 CreateScale(Vector3 scales, Vector3 centerPoint) { - Matrix4x4 result = Identity; + Matrix4x4 result = default; - float tx = centerPoint.X * (1 - scales.X); - float ty = centerPoint.Y * (1 - scales.Y); - float tz = centerPoint.Z * (1 - scales.Z); + Vector3 t = centerPoint * (Vector3.One - scales); result.M11 = scales.X; result.M22 = scales.Y; result.M33 = scales.Z; - result.M41 = tx; - result.M42 = ty; - result.M43 = tz; + result.M44 = 1; + + result.M41 = t.X; + result.M42 = t.Y; + result.M43 = t.Z; + return result; } @@ -1270,11 +1280,12 @@ public static Matrix4x4 CreateScale(Vector3 scales, Vector3 centerPoint) /// The scaling matrix. public static Matrix4x4 CreateScale(float scale) { - Matrix4x4 result = Identity; + Matrix4x4 result = default; result.M11 = scale; result.M22 = scale; result.M33 = scale; + result.M44 = 1; return result; } @@ -1285,19 +1296,18 @@ public static Matrix4x4 CreateScale(float scale) /// The scaling matrix. public static Matrix4x4 CreateScale(float scale, Vector3 centerPoint) { - Matrix4x4 result = Identity; + Matrix4x4 result = default; - float tx = centerPoint.X * (1 - scale); - float ty = centerPoint.Y * (1 - scale); - float tz = centerPoint.Z * (1 - scale); + Vector3 t = centerPoint * (Vector3.One - new Vector3(scale)); result.M11 = scale; result.M22 = scale; result.M33 = scale; + result.M44 = 1; - result.M41 = tx; - result.M42 = ty; - result.M43 = tz; + result.M41 = t.X; + result.M42 = t.Y; + result.M43 = t.Z; return result; }