void Animation::getPose(float time, Pose& pose, Model& model) const { PROFILE_FUNCTION(); if(model.isReady()) { int frame = (int)(time * m_fps); frame = frame >= m_frame_count ? m_frame_count - 1 : frame; Vec3* pos = pose.getPositions(); Quat* rot = pose.getRotations(); int off = frame * m_bone_count; int off2 = off + m_bone_count; float t = (time - frame / (float)m_fps) / (1.0f / m_fps); if(frame < m_frame_count - 1) { for(int i = 0; i < m_bone_count; ++i) { Model::BoneMap::iterator iter = model.getBoneIndex(m_bones[i]); if (iter.isValid()) { int model_bone_index = iter.value(); lerp(m_positions[off + i], m_positions[off2 + i], &pos[model_bone_index], t); nlerp(m_rotations[off + i], m_rotations[off2 + i], &rot[model_bone_index], t); } } } else { for(int i = 0; i < m_bone_count; ++i) { Model::BoneMap::iterator iter = model.getBoneIndex(m_bones[i]); if (iter.isValid()) { int model_bone_index = iter.value(); pos[model_bone_index] = m_positions[off + i]; rot[model_bone_index] = m_rotations[off + i]; } } } pose.setIsRelative(); pose.computeAbsolute(model); } }