#include "CPASDatabase.hpp" #include "CPASAnimParmData.hpp" #include "CRandom16.hpp" namespace urde { void CPASDatabase::AddAnimState(CPASAnimState&& state) { auto it = std::lower_bound(x0_states.begin(), x0_states.end(), state, [](const CPASAnimState& item, const CPASAnimState& test) -> bool {return item.GetStateId() < test.GetStateId();}); x0_states.insert(it, std::move(state)); } CPASDatabase::CPASDatabase(CInputStream& in) { in.readUint32Big(); u32 animStateCount = in.readUint32Big(); u32 defaultState = in.readUint32Big(); x0_states.reserve(animStateCount); for (u32 i=0 ; i CPASDatabase::FindBestAnimation(const CPASAnimParmData& data, s32 ignoreAnim) const { CRandom16 rnd(4660); return FindBestAnimation(data, rnd, ignoreAnim); } std::pair CPASDatabase::FindBestAnimation(const CPASAnimParmData& data, CRandom16& rand, s32 ignoreAnim) const { CPASAnimState key(data.GetStateId()); auto it = std::lower_bound(x0_states.cbegin(), x0_states.cend(), key, [](const CPASAnimState& item, const CPASAnimState& test) -> bool {return item.GetStateId() < test.GetStateId();}); if (it->GetStateId() < key.GetStateId() || it == x0_states.cend()) return {0.f, -1}; return (*it).FindBestAnimation(data.GetAnimParmData(), rand, ignoreAnim); } }