use crate::params_builder::FlameParamsBuilder;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FlameParams {
pub shape: Vec<f32>,
pub expression: Vec<f32>,
pub pose: Vec<f32>,
pub translation: [f32; 3],
}
impl FlameParams {
pub const NUM_JOINTS: usize = 5;
#[must_use]
pub fn neutral() -> Self {
Self {
shape: Vec::new(),
expression: Vec::new(),
pose: vec![0.0; Self::NUM_JOINTS * 3],
translation: [0.0; 3],
}
}
#[must_use]
pub fn builder() -> FlameParamsBuilder {
FlameParamsBuilder::default()
}
#[must_use]
pub fn joint_pose(&self, j: usize) -> [f32; 3] {
let off = j * 3;
if off + 2 < self.pose.len() {
[self.pose[off], self.pose[off + 1], self.pose[off + 2]]
} else {
[0.0; 3]
}
}
#[must_use]
pub fn validate(&self) -> bool {
use std::f32::consts::PI;
if self.shape.iter().any(|&s| s.abs() > 3.0) {
return false;
}
if self.expression.iter().any(|&e| e.abs() > 2.0) {
return false;
}
if self.pose.iter().any(|&p| p.abs() > PI) {
return false;
}
if self.translation.iter().any(|&t| t.abs() > 1.0) {
return false;
}
true
}
}
impl Default for FlameParams {
fn default() -> Self {
Self::neutral()
}
}