BLI_math: fix parameter aliasing in mul_m3_series and mul_m4_series #104934

Merged
Chris Blackbourn merged 2 commits from Chris_Blackbourn/blender:matrix-multiply-series into main 2023-02-20 23:04:20 +01:00
2 changed files with 110 additions and 54 deletions

View File

@ -504,8 +504,9 @@ void _va_mul_m3_series_4(float r[3][3],
const float m2[3][3],
const float m3[3][3])
{
mul_m3_m3m3(r, m1, m2);
mul_m3_m3m3(r, r, m3);
float s[3][3];
mul_m3_m3m3(s, m1, m2);
mul_m3_m3m3(r, s, m3);
}
void _va_mul_m3_series_5(float r[3][3],
const float m1[3][3],
@ -513,9 +514,11 @@ void _va_mul_m3_series_5(float r[3][3],
const float m3[3][3],
const float m4[3][3])
{
mul_m3_m3m3(r, m1, m2);
mul_m3_m3m3(r, r, m3);
mul_m3_m3m3(r, r, m4);
float s[3][3];
float t[3][3];
mul_m3_m3m3(s, m1, m2);
mul_m3_m3m3(t, s, m3);
mul_m3_m3m3(r, t, m4);
}
void _va_mul_m3_series_6(float r[3][3],
const float m1[3][3],
@ -524,10 +527,12 @@ void _va_mul_m3_series_6(float r[3][3],
const float m4[3][3],
const float m5[3][3])
{
mul_m3_m3m3(r, m1, m2);
mul_m3_m3m3(r, r, m3);
mul_m3_m3m3(r, r, m4);
mul_m3_m3m3(r, r, m5);
float s[3][3];
float t[3][3];
mul_m3_m3m3(s, m1, m2);
mul_m3_m3m3(t, s, m3);
mul_m3_m3m3(s, t, m4);
mul_m3_m3m3(r, s, m5);
}
void _va_mul_m3_series_7(float r[3][3],
const float m1[3][3],
@ -537,11 +542,13 @@ void _va_mul_m3_series_7(float r[3][3],
const float m5[3][3],
const float m6[3][3])
{
mul_m3_m3m3(r, m1, m2);
mul_m3_m3m3(r, r, m3);
mul_m3_m3m3(r, r, m4);
mul_m3_m3m3(r, r, m5);
mul_m3_m3m3(r, r, m6);
float s[3][3];
float t[3][3];
mul_m3_m3m3(s, m1, m2);
mul_m3_m3m3(t, s, m3);
mul_m3_m3m3(s, t, m4);
mul_m3_m3m3(t, s, m5);
mul_m3_m3m3(r, t, m6);
}
void _va_mul_m3_series_8(float r[3][3],
const float m1[3][3],
@ -552,12 +559,14 @@ void _va_mul_m3_series_8(float r[3][3],
const float m6[3][3],
const float m7[3][3])
{
mul_m3_m3m3(r, m1, m2);
mul_m3_m3m3(r, r, m3);
mul_m3_m3m3(r, r, m4);
mul_m3_m3m3(r, r, m5);
mul_m3_m3m3(r, r, m6);
mul_m3_m3m3(r, r, m7);
float s[3][3];
float t[3][3];
mul_m3_m3m3(s, m1, m2);
mul_m3_m3m3(t, s, m3);
mul_m3_m3m3(s, t, m4);
mul_m3_m3m3(t, s, m5);
mul_m3_m3m3(s, t, m6);
mul_m3_m3m3(r, s, m7);
}
void _va_mul_m3_series_9(float r[3][3],
const float m1[3][3],
@ -569,13 +578,15 @@ void _va_mul_m3_series_9(float r[3][3],
const float m7[3][3],
const float m8[3][3])
{
mul_m3_m3m3(r, m1, m2);
mul_m3_m3m3(r, r, m3);
mul_m3_m3m3(r, r, m4);
mul_m3_m3m3(r, r, m5);
mul_m3_m3m3(r, r, m6);
mul_m3_m3m3(r, r, m7);
mul_m3_m3m3(r, r, m8);
float s[3][3];
float t[3][3];
mul_m3_m3m3(s, m1, m2);
mul_m3_m3m3(t, s, m3);
mul_m3_m3m3(s, t, m4);
mul_m3_m3m3(t, s, m5);
mul_m3_m3m3(s, t, m6);
mul_m3_m3m3(t, s, m7);
mul_m3_m3m3(r, t, m8);
}
/** \} */
@ -593,8 +604,9 @@ void _va_mul_m4_series_4(float r[4][4],
const float m2[4][4],
const float m3[4][4])
{
mul_m4_m4m4(r, m1, m2);
mul_m4_m4m4(r, r, m3);
float s[4][4];
mul_m4_m4m4(s, m1, m2);
mul_m4_m4m4(r, s, m3);
}
void _va_mul_m4_series_5(float r[4][4],
const float m1[4][4],
@ -602,9 +614,11 @@ void _va_mul_m4_series_5(float r[4][4],
const float m3[4][4],
const float m4[4][4])
{
mul_m4_m4m4(r, m1, m2);
mul_m4_m4m4(r, r, m3);
mul_m4_m4m4(r, r, m4);
float s[4][4];
float t[4][4];
mul_m4_m4m4(s, m1, m2);
mul_m4_m4m4(t, s, m3);
mul_m4_m4m4(r, t, m4);
}
void _va_mul_m4_series_6(float r[4][4],
const float m1[4][4],
@ -613,10 +627,12 @@ void _va_mul_m4_series_6(float r[4][4],
const float m4[4][4],
const float m5[4][4])
{
mul_m4_m4m4(r, m1, m2);
mul_m4_m4m4(r, r, m3);
mul_m4_m4m4(r, r, m4);
mul_m4_m4m4(r, r, m5);
float s[4][4];
float t[4][4];
mul_m4_m4m4(s, m1, m2);
mul_m4_m4m4(t, s, m3);
mul_m4_m4m4(s, t, m4);
mul_m4_m4m4(r, s, m5);
}
void _va_mul_m4_series_7(float r[4][4],
const float m1[4][4],
@ -626,11 +642,13 @@ void _va_mul_m4_series_7(float r[4][4],
const float m5[4][4],
const float m6[4][4])
{
mul_m4_m4m4(r, m1, m2);
mul_m4_m4m4(r, r, m3);
mul_m4_m4m4(r, r, m4);
mul_m4_m4m4(r, r, m5);
mul_m4_m4m4(r, r, m6);
float s[4][4];
float t[4][4];
mul_m4_m4m4(s, m1, m2);
mul_m4_m4m4(t, s, m3);
mul_m4_m4m4(s, t, m4);
mul_m4_m4m4(t, s, m5);
mul_m4_m4m4(r, t, m6);
}
void _va_mul_m4_series_8(float r[4][4],
const float m1[4][4],
@ -641,12 +659,14 @@ void _va_mul_m4_series_8(float r[4][4],
const float m6[4][4],
const float m7[4][4])
{
mul_m4_m4m4(r, m1, m2);
mul_m4_m4m4(r, r, m3);
mul_m4_m4m4(r, r, m4);
mul_m4_m4m4(r, r, m5);
mul_m4_m4m4(r, r, m6);
mul_m4_m4m4(r, r, m7);
float s[4][4];
float t[4][4];
mul_m4_m4m4(s, m1, m2);
mul_m4_m4m4(t, s, m3);
mul_m4_m4m4(s, t, m4);
mul_m4_m4m4(t, s, m5);
mul_m4_m4m4(s, t, m6);
mul_m4_m4m4(r, s, m7);
}
void _va_mul_m4_series_9(float r[4][4],
const float m1[4][4],
@ -658,13 +678,15 @@ void _va_mul_m4_series_9(float r[4][4],
const float m7[4][4],
const float m8[4][4])
{
mul_m4_m4m4(r, m1, m2);
mul_m4_m4m4(r, r, m3);
mul_m4_m4m4(r, r, m4);
mul_m4_m4m4(r, r, m5);
mul_m4_m4m4(r, r, m6);
mul_m4_m4m4(r, r, m7);
mul_m4_m4m4(r, r, m8);
float s[4][4];
float t[4][4];
mul_m4_m4m4(s, m1, m2);
mul_m4_m4m4(t, s, m3);
mul_m4_m4m4(s, t, m4);
mul_m4_m4m4(t, s, m5);
mul_m4_m4m4(s, t, m6);
mul_m4_m4m4(t, s, m7);
mul_m4_m4m4(r, t, m8);
}
/** \} */

View File

@ -100,6 +100,40 @@ TEST(math_matrix, interp_m3_m3m3_singularity)
EXPECT_M3_NEAR(result, expect, 1e-5);
}
TEST(math_matrix, mul_m3_series)
{
float matrix[3][3] = {
{2.0f, 0.0f, 0.0f},
{0.0f, 3.0f, 0.0f},
{0.0f, 0.0f, 5.0f},
};
mul_m3_series(matrix, matrix, matrix, matrix);
float expect[3][3] = {
{8.0f, 0.0f, 0.0f},
{0.0f, 27.0f, 0.0f},
{0.0f, 0.0f, 125.0f},
};
EXPECT_M3_NEAR(matrix, expect, 1e-5);
}
TEST(math_matrix, mul_m4_series)
{
float matrix[4][4] = {
{2.0f, 0.0f, 0.0f, 0.0f},
{0.0f, 3.0f, 0.0f, 0.0f},
{0.0f, 0.0f, 5.0f, 0.0f},
{0.0f, 0.0f, 0.0f, 7.0f},
};
mul_m4_series(matrix, matrix, matrix, matrix);
float expect[4][4] = {
{8.0f, 0.0f, 0.0f, 0.0f},
{0.0f, 27.0f, 0.0f, 0.0f},
{0.0f, 0.0f, 125.0f, 0.0f},
{0.0f, 0.0f, 0.0f, 343.0f},
};
EXPECT_M4_NEAR(matrix, expect, 1e-5);
deadpin marked this conversation as resolved
Review

Should be EXPECT_M4_NEAR

Should be `EXPECT_M4_NEAR`
Review

Nice spotting! Should be fixed now.

Nice spotting! Should be fixed now.
}
namespace blender::tests {
using namespace blender::math;