From 6188c7e94c757e35a00640940979d6d475fd95c1 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Sun, 14 Apr 2024 14:11:43 -0400 Subject: [PATCH] Match --- LEGO1/lego/sources/anim/legoanim.cpp | 84 +++++++++++++--------------- LEGO1/lego/sources/anim/legoanim.h | 3 +- 2 files changed, 42 insertions(+), 45 deletions(-) diff --git a/LEGO1/lego/sources/anim/legoanim.cpp b/LEGO1/lego/sources/anim/legoanim.cpp index 4b2f5176..1b742c8b 100644 --- a/LEGO1/lego/sources/anim/legoanim.cpp +++ b/LEGO1/lego/sources/anim/legoanim.cpp @@ -468,7 +468,7 @@ inline void LegoAnimNodeData::GetTranslation( n = FindKeys( p_time, p_numTranslationKeys & USHRT_MAX, - (LegoU8*) p_translationKeys, + p_translationKeys, sizeof(*p_translationKeys), i, p_old_index @@ -528,14 +528,7 @@ inline void LegoAnimNodeData::GetTranslation( ) { LegoU32 i, n; - n = FindKeys( - p_time, - p_numRotationKeys & USHRT_MAX, - (LegoU8*) p_rotationKeys, - sizeof(*p_rotationKeys), - i, - p_old_index - ); + n = FindKeys(p_time, p_numRotationKeys & USHRT_MAX, p_rotationKeys, sizeof(*p_rotationKeys), i, p_old_index); switch (n) { case 0: @@ -599,7 +592,7 @@ inline void LegoAnimNodeData::GetScale( { LegoU32 i, n; LegoFloat x, y, z; - n = FindKeys(p_time, p_numScaleKeys & USHRT_MAX, (LegoU8*) p_scaleKeys, sizeof(*p_scaleKeys), i, p_old_index); + n = FindKeys(p_time, p_numScaleKeys & USHRT_MAX, p_scaleKeys, sizeof(*p_scaleKeys), i, p_old_index); switch (n) { case 0: @@ -626,7 +619,7 @@ LegoBool LegoAnimNodeData::FUN_100a0990(LegoFloat p_time) LegoU32 index = GetMorphIndex(); LegoBool result; - n = FindKeys(p_time, m_numMorphKeys, (LegoU8*) m_morphKeys, sizeof(*m_morphKeys), i, index); + n = FindKeys(p_time, m_numMorphKeys, m_morphKeys, sizeof(*m_morphKeys), i, index); SetMorphIndex(index); switch (n) { @@ -646,52 +639,50 @@ LegoBool LegoAnimNodeData::FUN_100a0990(LegoFloat p_time) LegoU32 LegoAnimNodeData::FindKeys( LegoFloat p_time, LegoU32 p_numKeys, - LegoU8* p_keys, + LegoAnimKey* p_keys, LegoU32 p_size, LegoU32& p_new_index, LegoU32& p_old_index ) { + LegoU32 numKeys; if (p_numKeys == 0) { - return 0; + numKeys = 0; } - - if (((LegoAnimKey*) p_keys)->GetTime() > p_time) { - return 0; + else if (p_time < GetKey(0, p_keys, p_size).GetTime()) { + numKeys = 0; } - - LegoS32 index = p_numKeys - 1; - if (((LegoAnimKey*) (p_keys + (p_size * index)))->GetTime() < p_time) { - p_new_index = index; - return 1; - } - - if (p_time > ((LegoAnimKey*) (p_keys + (p_size * p_old_index)))->GetTime()) { - LegoU8* ptr = (LegoU8*) (p_keys + (p_old_index + 1) * p_size); - for (p_new_index = p_old_index; p_new_index < index; p_new_index++) { - if (p_time < ((LegoAnimKey*) ptr)->GetTime()) { - break; - } - ptr = ptr + p_size; - } + else if (p_time > GetKey(p_numKeys - 1, p_keys, p_size).GetTime()) { + p_new_index = p_numKeys - 1; + numKeys = 1; } else { - LegoU8* ptr = p_keys; - for (p_new_index = 0; p_new_index < index; p_new_index++) { - ptr = ptr + p_size; - if (p_time < ((LegoAnimKey*) ptr)->GetTime()) { - break; - } + if (!(GetKey(p_old_index, p_keys, p_size).GetTime() > p_time)) { + for (p_new_index = p_old_index; + p_new_index < p_numKeys - 1 && p_time >= GetKey(p_new_index + 1, p_keys, p_size).GetTime(); + p_new_index++) + ; + } + else { + for (p_new_index = 0; + p_new_index < p_numKeys - 1 && p_time >= GetKey(p_new_index + 1, p_keys, p_size).GetTime(); + p_new_index++) + ; + } + + p_old_index = p_new_index; + if (p_time == GetKey(p_new_index, p_keys, p_size).GetTime()) { + numKeys = 1; + } + else if (p_new_index < p_numKeys - 1) { + numKeys = 2; + } + else { + numKeys = 0; } } - p_old_index = p_new_index; - if (((LegoAnimKey*) (p_keys + (p_new_index * p_size)))->GetTime() == p_time) { - return 1; - } - else { - return (p_new_index < index) ? 2 : 0; - } + return numKeys; } // FUNCTION: LEGO1 0x100a0b00 @@ -706,6 +697,11 @@ inline LegoFloat LegoAnimNodeData::Interpolate( return p_value1 + (p_value2 - p_value1) * (p_time - p_key1.GetTime()) / (p_key2.GetTime() - p_key1.GetTime()); } +inline LegoAnimKey& LegoAnimNodeData::GetKey(LegoU32 p_i, LegoAnimKey* p_keys, LegoU32 p_size) +{ + return *((LegoAnimKey*) (((LegoU8*) p_keys) + (p_i * p_size))); +} + // FUNCTION: LEGO1 0x100a0b30 LegoAnim::LegoAnim() { diff --git a/LEGO1/lego/sources/anim/legoanim.h b/LEGO1/lego/sources/anim/legoanim.h index 70367572..7ba9cc04 100644 --- a/LEGO1/lego/sources/anim/legoanim.h +++ b/LEGO1/lego/sources/anim/legoanim.h @@ -165,11 +165,12 @@ class LegoAnimNodeData : public LegoTreeNodeData { LegoAnimKey& p_key2, LegoFloat p_value2 ); + inline static LegoAnimKey& GetKey(LegoU32 p_i, LegoAnimKey* p_keys, LegoU32 p_size); static LegoU32 FindKeys( LegoFloat p_time, LegoU32 p_numKeys, - LegoU8* p_keys, + LegoAnimKey* p_keys, LegoU32 p_size, LegoU32& p_new_index, LegoU32& p_old_index