mirror of
https://github.com/isledecomp/isle.git
synced 2025-10-23 00:14:22 +00:00
Various matches with BETA functions (#1281)
* Match functions to BETA * Improve `Matrix4::FromQuaternion` * Improve `Matrix4::ToQuaternion` match * Fix bug that was fixed in retail * Match `Vector4::NormalizeQuaternion`
This commit is contained in:
committed by
GitHub
parent
70baf8cecc
commit
667ea3ff82
@@ -179,7 +179,7 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
inline int Unknown(Matrix4& p_mat);
|
||||
inline int BETA_1005a590(Matrix4& p_mat);
|
||||
|
||||
// FUNCTION: LEGO1 0x1006b500
|
||||
void Swap(int p_d1, int p_d2)
|
||||
@@ -202,9 +202,11 @@ protected:
|
||||
// FUNCTION: BETA10 0x100101c0
|
||||
inline void Matrix4::ToQuaternion(Vector4& p_outQuat)
|
||||
{
|
||||
float trace = m_data[0][0] + m_data[1][1] + m_data[2][2];
|
||||
if (trace > 0) {
|
||||
trace = (float) sqrt(trace + 1.0);
|
||||
float trace;
|
||||
float localc = m_data[0][0] + m_data[1][1] + m_data[2][2];
|
||||
|
||||
if (localc > 0) {
|
||||
trace = (float) sqrt(localc + 1.0);
|
||||
p_outQuat[3] = trace * 0.5f;
|
||||
trace = 0.5f / trace;
|
||||
p_outQuat[0] = (m_data[2][1] - m_data[1][2]) * trace;
|
||||
@@ -212,7 +214,6 @@ inline void Matrix4::ToQuaternion(Vector4& p_outQuat)
|
||||
p_outQuat[2] = (m_data[1][0] - m_data[0][1]) * trace;
|
||||
}
|
||||
else {
|
||||
|
||||
// GLOBAL: LEGO1 0x100d4090
|
||||
static int rotateIndex[] = {1, 2, 0};
|
||||
|
||||
@@ -228,8 +229,7 @@ inline void Matrix4::ToQuaternion(Vector4& p_outQuat)
|
||||
int next = rotateIndex[largest];
|
||||
int nextNext = rotateIndex[next];
|
||||
|
||||
float trace =
|
||||
(float) (sqrt(*Element(largest, largest) - (*Element(nextNext, nextNext) + *Element(next, next)) + 1.0));
|
||||
trace = (float) sqrt(*Element(largest, largest) - (*Element(nextNext, nextNext) + *Element(next, next)) + 1.0);
|
||||
|
||||
p_outQuat[largest] = trace * 0.5f;
|
||||
trace = 0.5f / trace;
|
||||
@@ -244,38 +244,38 @@ inline void Matrix4::ToQuaternion(Vector4& p_outQuat)
|
||||
// FUNCTION: BETA10 0x10010550
|
||||
inline int Matrix4::FromQuaternion(const Vector4& p_vec)
|
||||
{
|
||||
float len = p_vec.LenSquared();
|
||||
float local14 = p_vec.LenSquared();
|
||||
|
||||
if (len > 0.0f) {
|
||||
float v7 = 2.0f / len;
|
||||
if (local14 > 0.0f) {
|
||||
local14 = 2.0f / local14;
|
||||
|
||||
float v9 = p_vec[0] * v7;
|
||||
float v11 = p_vec[1] * v7;
|
||||
float v12 = p_vec[2] * v7;
|
||||
float local24 = p_vec[0] * local14;
|
||||
float local34 = p_vec[1] * local14;
|
||||
float local10 = p_vec[2] * local14;
|
||||
|
||||
float v13 = p_vec[3] * v9;
|
||||
float v14 = p_vec[3] * v11;
|
||||
float v16 = p_vec[3] * v12;
|
||||
float local28 = p_vec[3] * local24;
|
||||
float local2c = p_vec[3] * local34;
|
||||
float local30 = p_vec[3] * local10;
|
||||
|
||||
float v17 = p_vec[0] * v9;
|
||||
float v22 = p_vec[0] * v11;
|
||||
float v23 = p_vec[0] * v12;
|
||||
float local38 = p_vec[0] * local24;
|
||||
float local8 = p_vec[0] * local34;
|
||||
float localc = p_vec[0] * local10;
|
||||
|
||||
float v18 = p_vec[1] * v11;
|
||||
float v24 = p_vec[1] * v12;
|
||||
float v19 = p_vec[2] * v12;
|
||||
float local18 = p_vec[1] * local34;
|
||||
float local1c = p_vec[1] * local10;
|
||||
float local20 = p_vec[2] * local10;
|
||||
|
||||
m_data[0][0] = 1.0f - (v18 + v19);
|
||||
m_data[1][0] = v22 + v16;
|
||||
m_data[2][0] = v23 - v14;
|
||||
m_data[0][0] = 1.0f - (local18 + local20);
|
||||
m_data[1][0] = local8 + local30;
|
||||
m_data[2][0] = localc - local2c;
|
||||
|
||||
m_data[0][1] = v22 - v16;
|
||||
m_data[1][1] = 1.0f - (v17 + v19);
|
||||
m_data[2][1] = v24 + v13;
|
||||
m_data[0][1] = local8 - local30;
|
||||
m_data[1][1] = 1.0f - (local38 + local20);
|
||||
m_data[2][1] = local1c + local28;
|
||||
|
||||
m_data[0][2] = v14 + v23;
|
||||
m_data[1][2] = v24 - v13;
|
||||
m_data[2][2] = 1.0f - (v18 + v17);
|
||||
m_data[0][2] = local2c + localc;
|
||||
m_data[1][2] = local1c - local28;
|
||||
m_data[2][2] = 1.0f - (local18 + local38);
|
||||
|
||||
m_data[3][0] = 0.0f;
|
||||
m_data[3][1] = 0.0f;
|
||||
@@ -287,12 +287,13 @@ inline int Matrix4::FromQuaternion(const Vector4& p_vec)
|
||||
m_data[2][3] = 0.0f;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -1;
|
||||
else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
// FUNCTION: BETA10 0x1005a590
|
||||
inline int Matrix4::Unknown(Matrix4& p_mat)
|
||||
inline int Matrix4::BETA_1005a590(Matrix4& p_mat)
|
||||
{
|
||||
float local5c[4][4];
|
||||
Matrix4 localc(local5c);
|
||||
|
||||
@@ -467,38 +467,36 @@ public:
|
||||
// FUNCTION: BETA10 0x10048ad0
|
||||
inline int Vector4::NormalizeQuaternion()
|
||||
{
|
||||
float* v = m_data;
|
||||
float magnitude = v[0] * v[0] + v[2] * v[2] + v[1] * v[1];
|
||||
if (magnitude > 0.0f) {
|
||||
float theta = v[3] * 0.5f;
|
||||
v[3] = cos(theta);
|
||||
magnitude = sin(theta) / sqrt(magnitude);
|
||||
Vector3::MulImpl(magnitude);
|
||||
float length = m_data[0] * m_data[0] + m_data[1] * m_data[1] + m_data[2] * m_data[2];
|
||||
|
||||
if (length > 0.0f) {
|
||||
float theta = m_data[3] * 0.5f;
|
||||
float magnitude = sin((double) theta);
|
||||
m_data[3] = cos((double) theta);
|
||||
|
||||
magnitude = magnitude / (float) sqrt((double) length);
|
||||
m_data[0] *= magnitude;
|
||||
m_data[1] *= magnitude;
|
||||
m_data[2] *= magnitude;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
inline static float QuaternionProductScalarPart(const float* bDat, const float* aDat)
|
||||
{
|
||||
// We have no indication from the beta that this function exists,
|
||||
// but it helps with the stack layout of Vector4::EqualsHamiltonProduct()
|
||||
return aDat[3] * bDat[3] - (aDat[0] * bDat[0] + aDat[2] * bDat[2] + aDat[1] * bDat[1]);
|
||||
else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
// FUNCTION: LEGO1 0x10002bf0
|
||||
// FUNCTION: BETA10 0x10048c20
|
||||
inline int Vector4::EqualsHamiltonProduct(const Vector4& p_a, const Vector4& p_b)
|
||||
{
|
||||
m_data[3] = QuaternionProductScalarPart(p_a.m_data, p_b.m_data);
|
||||
m_data[3] = p_a.m_data[3] * p_b.m_data[3] -
|
||||
(p_a.m_data[0] * p_b.m_data[0] + p_a.m_data[2] * p_b.m_data[2] + p_a.m_data[1] * p_b.m_data[1]);
|
||||
|
||||
Vector3::EqualsCrossImpl(p_a.m_data, p_b.m_data);
|
||||
|
||||
m_data[0] = p_b.m_data[3] * p_a.m_data[0] + p_a.m_data[3] * p_b.m_data[0] + m_data[0];
|
||||
m_data[1] = p_b.m_data[1] * p_a.m_data[3] + p_a.m_data[1] * p_b.m_data[3] + m_data[1];
|
||||
m_data[2] = p_b.m_data[2] * p_a.m_data[3] + p_a.m_data[2] * p_b.m_data[3] + m_data[2];
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user