Skip to content

Commit aa34b54

Browse files
committed
Moved scaleMul and mulScale to math class.
Also made svd class static.
1 parent 2ce73c7 commit aa34b54

File tree

6 files changed

+76
-70
lines changed

6 files changed

+76
-70
lines changed

src/Tests/Tests/Shared/TestMath.cs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4077,6 +4077,50 @@ static quaternion TestRefEulerToQuat(float3 angle, math.RotationOrder order)
40774077
default:
40784078
return quaternion(float4(1f));
40794079
}
4080+
}
4081+
4082+
[TestCompiler]
4083+
public static void mulScale()
4084+
{
4085+
var tolerance = 1e-5f;
4086+
4087+
// Random matrix.
4088+
var m = new float3x3(
4089+
0.891724169254302978516f, 0.156217902898788452148f, 0.492261469364166259766f,
4090+
0.562758803367614746094f, 0.00122839550022035837173f, 0.437942296266555786133f,
4091+
0.2576503753662109375f, 0.200372591614723205566f, 0.515525519847869873047f);
4092+
4093+
// Random scale.
4094+
var scale = new float3(0.235540181398391723633f, 0.215966641902923583984f, 0.533130943775177001953f);
4095+
var actual = math.mulScale(m, scale);
4096+
var expected = new float3x3(
4097+
0.210036873817443847656f, 0.0337378568947315216064f, 0.262439817190170288086f,
4098+
0.132552310824394226074f, 0.000265292444964870810509f, 0.233480587601661682129f,
4099+
0.0606870166957378387451f, 0.043273795396089553833f, 0.274842619895935058594f);
4100+
4101+
TestUtils.AreEqual(expected, actual, 1e-5);
4102+
}
4103+
4104+
[TestCompiler]
4105+
public static void scaleMul()
4106+
{
4107+
var tolerance = 1e-5f;
4108+
4109+
// Random matrix, same as in mulScale test.
4110+
var m = new float3x3(
4111+
0.891724169254302978516f, 0.156217902898788452148f, 0.492261469364166259766f,
4112+
0.562758803367614746094f, 0.00122839550022035837173f, 0.437942296266555786133f,
4113+
0.2576503753662109375f, 0.200372591614723205566f, 0.515525519847869873047f);
4114+
4115+
// Random scale, same as in mulScale test.
4116+
var scale = new float3(0.235540181398391723633f, 0.215966641902923583984f, 0.533130943775177001953f);
4117+
var actual = math.scaleMul(scale, m);
4118+
var expected = new float3x3(
4119+
0.210036873817443847656f, 0.0367955937981605529785f, 0.115947358310222625732f,
4120+
0.121537126600742340088f, 0.000265292444964870810509f, 0.0945809260010719299316f,
4121+
0.137361392378807067871f, 0.106824830174446105957f, 0.274842619895935058594f);
4122+
4123+
TestUtils.AreEqual(expected, actual, tolerance);
40804124
}
40814125
}
40824126
}

src/Tests/Tests/Shared/TestSvd.cs

Lines changed: 2 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ public static void CanSVDInverseFloat3x3With_LinearDependentRow()
147147
public static void CanSVDInverseFloat3x3With_RotatedZeroScale()
148148
{
149149
var m102030 = math.float3x3(quaternion.Euler(math.radians(10f), math.radians(20f), math.radians(30f)));
150-
var parent = svd.mulScale(m102030, math.float3(1f, 1f, 0f));
150+
var parent = math.mulScale(m102030, math.float3(1f, 1f, 0f));
151151
var mat = math.mul(parent, m102030);
152152

153153
ValidateSingular(mat);
@@ -175,55 +175,11 @@ public static void CanExtractSVDRotationFromFloat3x3With_ZeroScaleXY()
175175
{
176176
var q0 = quaternion.Euler(math.radians(10f), math.radians(20f), math.radians(30f));
177177
var m0 = math.float3x3(q0);
178-
var m0Scaled = svd.mulScale(m0, math.float3(1f, 0f, 0f));
178+
var m0Scaled = math.mulScale(m0, math.float3(1f, 0f, 0f));
179179
var q1 = svd.svdRotation(m0Scaled);
180180
var m1 = math.float3x3(q1);
181181

182182
TestUtils.AreEqual(0.0f, math.length(m0.c0 - m1.c0), k_SVDTolerance);
183183
}
184-
185-
[TestCompiler]
186-
public static void mulScale()
187-
{
188-
var tolerance = 1e-5f;
189-
190-
// Random matrix.
191-
var m = new float3x3(
192-
0.891724169254302978516f, 0.156217902898788452148f, 0.492261469364166259766f,
193-
0.562758803367614746094f, 0.00122839550022035837173f, 0.437942296266555786133f,
194-
0.2576503753662109375f, 0.200372591614723205566f, 0.515525519847869873047f);
195-
196-
// Random scale.
197-
var scale = new float3(0.235540181398391723633f, 0.215966641902923583984f, 0.533130943775177001953f);
198-
var actual = svd.mulScale(m, scale);
199-
var expected = new float3x3(
200-
0.210036873817443847656f, 0.0337378568947315216064f, 0.262439817190170288086f,
201-
0.132552310824394226074f, 0.000265292444964870810509f, 0.233480587601661682129f,
202-
0.0606870166957378387451f, 0.043273795396089553833f, 0.274842619895935058594f);
203-
204-
TestUtils.AreEqual(expected, actual, 1e-5);
205-
}
206-
207-
[TestCompiler]
208-
public static void scaleMul()
209-
{
210-
var tolerance = 1e-5f;
211-
212-
// Random matrix, same as in mulScale test.
213-
var m = new float3x3(
214-
0.891724169254302978516f, 0.156217902898788452148f, 0.492261469364166259766f,
215-
0.562758803367614746094f, 0.00122839550022035837173f, 0.437942296266555786133f,
216-
0.2576503753662109375f, 0.200372591614723205566f, 0.515525519847869873047f);
217-
218-
// Random scale, same as in mulScale test.
219-
var scale = new float3(0.235540181398391723633f, 0.215966641902923583984f, 0.533130943775177001953f);
220-
var actual = svd.scaleMul(scale, m);
221-
var expected = new float3x3(
222-
0.210036873817443847656f, 0.0367955937981605529785f, 0.115947358310222625732f,
223-
0.121537126600742340088f, 0.000265292444964870810509f, 0.0945809260010719299316f,
224-
0.137361392378807067871f, 0.106824830174446105957f, 0.274842619895935058594f);
225-
226-
TestUtils.AreEqual(expected, actual, tolerance);
227-
}
228184
}
229185
}

src/Unity.Mathematics/math.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7017,6 +7017,30 @@ public static float3 Euler(quaternion q, math.RotationOrder order = math.Rotatio
70177017
}
70187018
}
70197019

7020+
/// <summary>
7021+
/// Matrix columns multiplied by scale components
7022+
/// m.c0.x * s.x | m.c1.x * s.y | m.c2.x * s.z
7023+
/// m.c0.y * s.x | m.c1.y * s.y | m.c2.y * s.z
7024+
/// m.c0.z * s.x | m.c1.z * s.y | m.c2.z * s.z
7025+
/// </summary>
7026+
/// <param name="m">Matrix to scale.</param>
7027+
/// <param name="s">Scaling coefficients for each column.</param>
7028+
/// <returns>The scaled matrix.</returns>
7029+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
7030+
public static float3x3 mulScale(float3x3 m, float3 s) => new float3x3(m.c0 * s.x, m.c1 * s.y, m.c2 * s.z);
7031+
7032+
/// <summary>
7033+
/// Matrix rows multiplied by scale components
7034+
/// m.c0.x * s.x | m.c1.x * s.x | m.c2.x * s.x
7035+
/// m.c0.y * s.y | m.c1.y * s.y | m.c2.y * s.y
7036+
/// m.c0.z * s.z | m.c1.z * s.z | m.c2.z * s.z
7037+
/// </summary>
7038+
/// <param name="s">Scaling coefficients for each row.</param>
7039+
/// <param name="m">Matrix to scale.</param>
7040+
/// <returns>The scaled matrix.</returns>
7041+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
7042+
public static float3x3 scaleMul(float3 s, float3x3 m) => new float3x3(m.c0 * s, m.c1 * s, m.c2 * s);
7043+
70207044
// Internal
70217045

70227046
// SSE shuffles

src/Unity.Mathematics/matrix.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1103,13 +1103,13 @@ public static float3x3 pseudoinverse(float3x3 m)
11031103
return Mathematics.float3x3.zero;
11041104

11051105
float3 scaleInv = math.rsqrt(scaleSq);
1106-
float3x3 ms = svd.mulScale(m, scaleInv);
1106+
float3x3 ms = mulScale(m, scaleInv);
11071107
if (!adjInverse(ms, out float3x3 i, svd.k_EpsilonDeterminant))
11081108
{
11091109
i = svd.svdInverse(ms);
11101110
}
11111111

1112-
return svd.mulScale(i, scaleInv);
1112+
return mulScale(i, scaleInv);
11131113
}
11141114
}
11151115
}

src/Unity.Mathematics/quaternion.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -724,7 +724,7 @@ public static quaternion rotation(float3x3 m)
724724

725725
if (math.abs(det) > svd.k_EpsilonDeterminant)
726726
{
727-
float3x3 tmp = svd.mulScale(m, math.rsqrt(math.float3(math.lengthsq(m.c0), math.lengthsq(m.c1), math.lengthsq(m.c2))));
727+
float3x3 tmp = mulScale(m, math.rsqrt(math.float3(math.lengthsq(m.c0), math.lengthsq(m.c1), math.lengthsq(m.c2))));
728728
if (math.abs(1f - math.determinant(tmp)) < svd.k_EpsilonDeterminant)
729729
return math.quaternion(tmp);
730730
}
@@ -750,7 +750,7 @@ static bool adjInverse(float3x3 m, out float3x3 i, float epsilon = svd.k_Epsilon
750750
i = adj(m, out float det);
751751
bool c = math.abs(det) > epsilon;
752752
float3 detInv = math.select(math.float3(1f), math.rcp(det), c);
753-
i = svd.scaleMul(detInv, i);
753+
i = scaleMul(detInv, i);
754754
return c;
755755
}
756756

src/Unity.Mathematics/svd.cs

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ namespace Unity.Mathematics
77
// Computing the singular value decomposition of 3x3 matrices with minimal branching and elementary floating point operations,
88
// A.McAdams, A.Selle, R.Tamstorf, J.Teran and E.Sifakis, University of Wisconsin - Madison technical report TR1690, May 2011
99
[Il2CppEagerStaticClassConstruction]
10-
class svd
10+
static class svd
1111
{
1212
[MethodImpl(MethodImplOptions.AggressiveInlining)]
1313
static void condSwap(bool c, ref float x, ref float y)
@@ -146,24 +146,6 @@ static float3 singularValuesDecomposition(float3x3 a, out quaternion u, out quat
146146
public const float k_EpsilonNormalSqrt = 1e-15f;
147147
public const float k_EpsilonNormal = 1e-30f;
148148

149-
/// <summary>
150-
/// Matrix columns multiplied by scale components
151-
/// m.c0.x * s.x | m.c1.x * s.y | m.c2.x * s.z
152-
/// m.c0.y * s.x | m.c1.y * s.y | m.c2.y * s.z
153-
/// m.c0.z * s.x | m.c1.z * s.y | m.c2.z * s.z
154-
/// </summary>
155-
[MethodImpl(MethodImplOptions.AggressiveInlining)]
156-
public static float3x3 mulScale(float3x3 m, float3 s) => new float3x3(m.c0 * s.x, m.c1 * s.y, m.c2 * s.z);
157-
158-
/// <summary>
159-
/// Matrix rows multiplied by scale components
160-
/// m.c0.x * s.x | m.c1.x * s.x | m.c2.x * s.x
161-
/// m.c0.y * s.y | m.c1.y * s.y | m.c2.y * s.y
162-
/// m.c0.z * s.z | m.c1.z * s.z | m.c2.z * s.z
163-
/// </summary>
164-
[MethodImpl(MethodImplOptions.AggressiveInlining)]
165-
public static float3x3 scaleMul(float3 s, float3x3 m) => new float3x3(m.c0 * s, m.c1 * s, m.c2 * s);
166-
167149
[MethodImpl(MethodImplOptions.AggressiveInlining)]
168150
static float3 rcpsafe(float3 x, float epsilon = k_EpsilonRCP) =>
169151
math.select(math.rcp(x), float3.zero, math.abs(x) < epsilon);
@@ -175,7 +157,7 @@ internal static float3x3 svdInverse(float3x3 a)
175157
var um = math.float3x3(u);
176158
var vm = math.float3x3(v);
177159

178-
return math.mul(vm, scaleMul(rcpsafe(e, k_EpsilonDeterminant), math.transpose(um)));
160+
return math.mul(vm, math.scaleMul(rcpsafe(e, k_EpsilonDeterminant), math.transpose(um)));
179161
}
180162

181163
[MethodImpl(MethodImplOptions.AggressiveInlining)]

0 commit comments

Comments
 (0)