From 5d19b6afe3f554db470262231121d2a913a76c82 Mon Sep 17 00:00:00 2001 From: jonschz <17198703+jonschz@users.noreply.github.com> Date: Mon, 9 Sep 2024 21:45:48 +0200 Subject: [PATCH] Improve `UnknownMx4DPointFloat::FUN_100040a0` (#1102) Co-authored-by: jonschz --- LEGO1/library_msvc.h | 6 +++++ LEGO1/mxgeometry/mxgeometry3d.h | 40 ++++++++++++++++----------------- LEGO1/realtime/vector.h | 8 ++++++- 3 files changed, 33 insertions(+), 21 deletions(-) diff --git a/LEGO1/library_msvc.h b/LEGO1/library_msvc.h index a4c6cd0a..b81e2f0b 100644 --- a/LEGO1/library_msvc.h +++ b/LEGO1/library_msvc.h @@ -669,4 +669,10 @@ // LIBRARY: BETA10 0x100f9060 // _assert +// LIBRARY: BETA10 0x100fa2fa +// _acos + +// LIBRARY: BETA10 0x100f9a50 +// _sin + #endif diff --git a/LEGO1/mxgeometry/mxgeometry3d.h b/LEGO1/mxgeometry/mxgeometry3d.h index 289c201a..4a01d955 100644 --- a/LEGO1/mxgeometry/mxgeometry3d.h +++ b/LEGO1/mxgeometry/mxgeometry3d.h @@ -169,36 +169,36 @@ inline void UnknownMx4DPointFloat::Unknown7() // FUNCTION: BETA10 0x1004ab10 inline int UnknownMx4DPointFloat::FUN_100040a0(Vector4& p_v, float p_f) { - undefined4 state = m_unk0x30; - - if (state == 1) { + if (m_unk0x30 == 1) { p_v = m_unk0x00; - p_v[3] = (1.0 - p_f) * acos(p_v[3]) * 2.0; + p_v[3] = (1.0 - p_f) * acos((double) p_v[3]) * 2.0; return p_v.NormalizeQuaternion(); } - else if (state == 2) { + else if (m_unk0x30 == 2) { p_v = m_unk0x18; - p_v[3] = p_f * acos(p_v[3]) * 2.0; + p_v[3] = p_f * acos((double) p_v[3]) * 2.0; return p_v.NormalizeQuaternion(); } - else if (state == 3) { + else if (m_unk0x30 == 3) { + int i; double d1 = p_v.Dot(&m_unk0x00, &m_unk0x18); - double d2; + double a; + double b; if (d1 + 1.0 > 0.00001) { if (1.0 - d1 > 0.00001) { - double d = acos(d1); - double s = sin(d); - d1 = sin((1.0 - p_f) * d) / s; - d2 = sin(p_f * d) / s; + double d2 = acos(d1); + double denominator = sin(d2); + a = sin((1.0 - p_f) * d2) / denominator; + b = sin(p_f * d2) / denominator; } else { - d1 = 1.0 - p_f; - d2 = p_f; + a = 1.0 - p_f; + b = p_f; } - for (int i = 0; i < 4; i++) { - p_v[i] = m_unk0x18[i] * d2 + m_unk0x00[i] * d1; + for (i = 0; i < 4; i++) { + p_v[i] = m_unk0x00[i] * a + m_unk0x18[i] * b; } } else { @@ -206,11 +206,11 @@ inline int UnknownMx4DPointFloat::FUN_100040a0(Vector4& p_v, float p_f) p_v[1] = m_unk0x00[0]; p_v[2] = -m_unk0x00[3]; p_v[3] = m_unk0x00[2]; - d1 = sin((1.0 - p_f) * 1.570796326794895); - d2 = sin(p_f * 1.570796326794895); + a = sin((1.0 - p_f) * 1.570796326794895); + b = sin(p_f * 1.570796326794895); - for (int i = 0; i < 3; i++) { - p_v[i] = m_unk0x00[i] * d1 + p_v[i] * d2; + for (i = 0; i < 3; i++) { + p_v[i] = m_unk0x00[i] * a + p_v[i] * b; } } diff --git a/LEGO1/realtime/vector.h b/LEGO1/realtime/vector.h index 84d072c3..4c1e17c3 100644 --- a/LEGO1/realtime/vector.h +++ b/LEGO1/realtime/vector.h @@ -154,13 +154,19 @@ public: // SYNTHETIC: LEGO1 0x10010be0 // Vector3::operator= + // SYNTHETIC: BETA10 0x1004af40 + // Vector4::operator= + Vector2& operator=(const Vector2& p_other) { Vector2::SetVector(&p_other); return *this; } - // FUNCTION: BETA10 0x10013460 + // SYNTHETIC: BETA10 0x10013460 + // Vector3::operator[] + + // FUNCTION: BETA10 0x10010890 float& operator[](int idx) { return m_data[idx]; } // FUNCTION: BETA10 0x1001d140