smpl_core/common/
metadata.rs

1use super::{
2    pose_hands::{HandPair, HandType},
3    pose_parts::PosePart,
4    types::SmplType,
5};
6use crate::{
7    smpl_h::{smpl_h, smpl_h_pose_parts},
8    smpl_x::{smpl_x, smpl_x_hands::SmplXHands, smpl_x_pose_parts},
9};
10use enum_map::EnumMap;
11use std::ops::Range;
12#[derive(Default)]
13pub struct SmplMetadata {
14    pub num_body_joints: usize,
15    pub num_hand_joints: usize,
16    pub num_face_joints: usize,
17    pub num_joints: usize,
18    pub num_pose_blend_shapes: usize,
19    pub expression_space_dim: usize,
20    pub num_verts: usize,
21    pub num_verts_uv_mesh: usize,
22    pub num_faces: usize,
23    pub shape_space_dim: usize,
24    pub hand_poses: EnumMap<HandType, HandPair>,
25    pub parts2jointranges: EnumMap<PosePart, Range<usize>>,
26    pub joint_parents: Vec<u32>,
27    pub joint_names: Vec<String>,
28    pub pose_dim: usize,
29}
30/// # Panics
31/// Will panic if the ``smpl_type`` is unknown
32pub fn smpl_metadata(smpl_type: &SmplType) -> SmplMetadata {
33    match smpl_type {
34        SmplType::SmplH => {
35            let parts = smpl_h_pose_parts::PosePartRanges::empty();
36            SmplMetadata {
37                num_body_joints: smpl_h::NUM_BODY_JOINTS,
38                num_hand_joints: smpl_h::NUM_HAND_JOINTS,
39                num_joints: smpl_h::NUM_JOINTS,
40                num_pose_blend_shapes: smpl_h::NUM_POSE_BLEND_SHAPES,
41                parts2jointranges: parts.parts2jointranges,
42                joint_parents: smpl_h::PARENT_ID_PER_JOINT.to_vec(),
43                joint_names: smpl_h::JOINT_NAMES.map(std::string::ToString::to_string).to_vec(),
44                ..Default::default()
45            }
46        }
47        SmplType::SmplX => {
48            let parts = smpl_x_pose_parts::PosePartRanges::empty();
49            SmplMetadata {
50                num_body_joints: smpl_x::NUM_BODY_JOINTS,
51                num_hand_joints: smpl_x::NUM_HAND_JOINTS,
52                num_face_joints: smpl_x::NUM_FACE_JOINTS,
53                num_joints: smpl_x::NUM_JOINTS,
54                num_pose_blend_shapes: smpl_x::NUM_POSE_BLEND_SHAPES,
55                expression_space_dim: smpl_x::EXPRESSION_SPACE_DIM,
56                num_verts: smpl_x::NUM_VERTS,
57                num_verts_uv_mesh: smpl_x::NUM_VERTS_UV_MESH,
58                num_faces: smpl_x::NUM_FACES,
59                shape_space_dim: smpl_x::SHAPE_SPACE_DIM,
60                hand_poses: SmplXHands::default().type2pose,
61                parts2jointranges: parts.parts2jointranges,
62                joint_parents: smpl_x::PARENT_ID_PER_JOINT.to_vec(),
63                joint_names: smpl_x::JOINT_NAMES.map(std::string::ToString::to_string).to_vec(),
64                ..Default::default()
65            }
66        }
67        _ => panic!("Unknown Smpl Model"),
68    }
69}