use crate::config::{ClipExpectations, Config};
use crate::evaluation::{Applicability, CheckOutput};
use crate::metrics::MetricGrids;
use crate::model::Document;
use crate::profile::ResolvedRoles;
use crate::sample::PoseGrid;
use std::rc::Rc;
#[derive(Debug)]
pub struct CheckCtx<'a> {
pub doc: &'a Document,
pub roles: &'a ResolvedRoles,
pub config: &'a Config,
grids: &'a MetricGrids<'a>,
expectations: Vec<ClipExpectations>,
}
impl<'a> CheckCtx<'a> {
pub fn new(grids: &'a MetricGrids<'a>, roles: &'a ResolvedRoles, config: &'a Config) -> Self {
let doc = grids.document();
let expectations = doc
.clips
.iter()
.map(|c| config.expectations_for(&c.name))
.collect();
Self {
doc,
roles,
config,
grids,
expectations,
}
}
pub fn grid(&self, clip_index: usize) -> Option<Rc<PoseGrid>> {
self.grids.grid(clip_index)
}
pub fn expectations(&self, clip_index: usize) -> &ClipExpectations {
&self.expectations[clip_index]
}
pub fn clip_expectations(&self) -> &[ClipExpectations] {
&self.expectations
}
}
pub trait Check {
fn id(&self) -> &'static str;
fn enabled_by_default(&self) -> bool {
true
}
fn applicability(&self, _ctx: &CheckCtx) -> Applicability {
Applicability::Applicable
}
fn evaluate(&self, ctx: &CheckCtx) -> CheckOutput;
}
pub fn mechanical_checks() -> Vec<Box<dyn Check>> {
vec![
Box::new(crate::checks::nan::Nan),
Box::new(crate::checks::time_monotonic::TimeMonotonic),
Box::new(crate::checks::quat_norm::QuatNorm),
Box::new(crate::checks::quat_flip::QuatFlip),
Box::new(crate::checks::duration_sanity::DurationSanity),
Box::new(crate::checks::scale_keys::ScaleKeys),
Box::new(crate::checks::non_uniform_scale::NonUniformScale),
Box::new(crate::checks::constant_nonunit_scale::ConstantNonunitScale),
Box::new(crate::checks::constant_track::ConstantTrack),
]
}
pub fn all_checks() -> Vec<Box<dyn Check>> {
let mut checks = mechanical_checks();
checks.push(Box::new(crate::checks::required_bones::RequiredBones));
checks.push(Box::new(crate::checks::rest_world_scale::RestWorldScale));
checks.push(Box::new(crate::checks::missing_bones::MissingBones));
checks.push(Box::new(crate::checks::frozen_bone::FrozenBone));
checks.push(Box::new(
crate::checks::duplicate_loop_endpoint::DuplicateLoopEndpoint,
));
checks.push(Box::new(crate::checks::loop_closure::LoopClosure));
checks.push(Box::new(crate::checks::loop_seam::LoopSeam));
checks.push(Box::new(crate::checks::loop_seam_vel::LoopSeamVelocity));
checks.push(Box::new(crate::checks::loop_seam_rot::LoopSeamRotation));
checks.push(Box::new(crate::checks::root_motion_speed::RootMotionSpeed));
checks.push(Box::new(crate::checks::gait_group::GaitGroup));
checks.push(Box::new(crate::checks::sync_group::SyncGroupCheck));
checks.push(Box::new(crate::checks::time_complement::TimeComplement));
checks.push(Box::new(crate::checks::in_place::InPlace));
checks.push(Box::new(crate::checks::fps::Fps));
checks.push(Box::new(crate::checks::bind_pose::BindPose));
checks.push(Box::new(crate::checks::foot_slide::FootSlide));
checks
}