File size: 1,375 Bytes
c1e2af3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
"""Factory helpers for building predefined skeleton variants."""

from pathlib import Path

from ardy.assets import SKELETONS_ROOT

from .definitions import (
    CoreSkeleton27,
    G1Skeleton34,
    SOMASkeleton30,
    SOMASkeleton77,
)


def build_skeleton(nbjoints: int, assets_folder: str | Path = SKELETONS_ROOT):
    """Instantiate a known skeleton class from its joint count.

    Supported joint counts: 30 (SOMA compact), 34 (G1), 77 (SOMA full).

    Args:
        nbjoints: Number of joints expected in the skeleton representation.
        assets_folder: Base skeleton-assets directory containing per-skeleton subfolders.

    Returns:
        A configured `SkeletonBase` subclass instance.

    Raises:
        ValueError: If `nbjoints` does not match a registered skeleton.
    """
    assets_folder = Path(assets_folder)
    if nbjoints == 34:
        return G1Skeleton34(assets_folder / "g1skel34")
    elif nbjoints == 30:
        return SOMASkeleton30(assets_folder / "somaskel30")
    elif nbjoints == 77:
        return SOMASkeleton77(assets_folder / "somaskel77")
    elif nbjoints == 27:
        return CoreSkeleton27(assets_folder / "cskel27")
    else:
        raise ValueError("This skeleton is not recognized.")