Source code for scfile.structures.mesh

"""
Dataclasses for 3D model geometry.
"""

from dataclasses import dataclass, field
from typing import NewType, TypeAlias

import numpy as np

from .vectors import LinksIds, LinksWeights, Polygons, Vector2D, Vector3D


LocalBoneId = NewType("LocalBoneId", int)  # Bone id within local mesh scope
SkeletonBoneId = NewType("SkeletonBoneId", int)  # Bone id within skeleton hierarchy

BonesMapping: TypeAlias = dict[LocalBoneId, SkeletonBoneId]  # Mapping between local and skeleton ids


[docs] @dataclass class MeshCounts: """Quantifying of mesh elements.""" vertices: int = 0 polygons: int = 0 links: int = 0 bones: int = 0
[docs] @dataclass class MeshOrigin: position: Vector3D = field(default_factory=lambda: np.empty(3, dtype=np.float32)) rotation: Vector3D = field(default_factory=lambda: np.empty(3, dtype=np.float32)) scale: float = 0.0
[docs] @dataclass class ModelMesh: """3D mesh geometry container.""" name: str = "name" material: str = "material" count: MeshCounts = field(default_factory=MeshCounts) origin: MeshOrigin = field(default_factory=MeshOrigin) bones: BonesMapping = field(default_factory=dict) positions: Vector3D = field(default_factory=lambda: np.empty((0, 3), dtype=np.float32)) textures: Vector2D = field(default_factory=lambda: np.empty((0, 2), dtype=np.float32)) normals: Vector3D = field(default_factory=lambda: np.empty((0, 3), dtype=np.float32)) links_ids: LinksIds = field(default_factory=lambda: np.empty((0, 4), dtype=np.uint8)) links_weights: LinksWeights = field(default_factory=lambda: np.empty((0, 4), dtype=np.float32)) polygons: Polygons = field(default_factory=lambda: np.empty((0, 3), dtype=np.uint32))