45 lines
1.2 KiB
C++
45 lines
1.2 KiB
C++
#include "character_anim_state.hpp"
|
|
#include "utils/math.hpp"
|
|
|
|
void game::CharacterAnimState::ApplyToSkeleton(SkeletonInstance& sk) const
|
|
{
|
|
const auto& skeleton = sk.GetSkeleton();
|
|
const assets::Animation* idle_anim = skeleton->GetAnimation(idle_anim_idx);
|
|
const assets::Animation* walk_anim = skeleton->GetAnimation(walk_anim_idx);
|
|
const assets::Animation* run_anim = skeleton->GetAnimation(run_anim_idx);
|
|
|
|
if (!idle_anim)
|
|
return;
|
|
|
|
if (!walk_anim)
|
|
walk_anim = idle_anim;
|
|
|
|
if (!run_anim)
|
|
run_anim = walk_anim;
|
|
|
|
if (loco_blend == 0.0f) // idle
|
|
{
|
|
sk.ApplySkelAnim(*idle_anim, loco_phase, 1.0f);
|
|
}
|
|
else if (loco_blend < 0.5f) // idle-walk
|
|
{
|
|
sk.ApplySkelAnim(*idle_anim, loco_phase, 1.0f);
|
|
sk.ApplySkelAnim(*walk_anim, loco_phase, UnMix(0.0f, 0.5f, loco_blend));
|
|
}
|
|
|
|
else if (loco_blend == 0.5f) // walk
|
|
{
|
|
sk.ApplySkelAnim(*walk_anim, loco_phase, 1.0f);
|
|
}
|
|
else if (loco_blend < 1.0f) // walk-run
|
|
{
|
|
sk.ApplySkelAnim(*walk_anim, loco_phase, 1.0f);
|
|
sk.ApplySkelAnim(*run_anim, loco_phase, UnMix(0.5f, 1.0f, loco_blend));
|
|
}
|
|
else // run
|
|
{
|
|
sk.ApplySkelAnim(*run_anim, loco_phase, 1.0f);
|
|
}
|
|
|
|
}
|