mirror of
https://github.com/isledecomp/isle.git
synced 2025-10-23 08:24:16 +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
@@ -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