Source code for scfile.structures.models.mesh
"""
Data structures for meshes.
"""
from dataclasses import dataclass, field
import numpy as np
from .enums import LinkSpace, UVOrigin, UVSign
from .types import BonesMapping, Colors, LinksIds, LinksWeights, Polygons, Vector2D, Vector3D, Vector4D
[docs]
@dataclass
class MeshBounds:
"""Mesh bounding box."""
min: Vector3D = field(default_factory=lambda: np.zeros(3, dtype=np.float32))
max: Vector3D = field(default_factory=lambda: np.zeros(3, dtype=np.float32))
radius: float = 0.0
[docs]
@dataclass
class ModelMesh:
"""Mesh geometry container."""
name: str = "name"
material: str = "material"
bounds: MeshBounds = field(default_factory=MeshBounds)
quads: bool = False
bones: BonesMapping = field(default_factory=dict)
vertices: Vector3D = field(default_factory=lambda: np.zeros((0, 3), dtype=np.float32))
uv1: Vector2D = field(default_factory=lambda: np.zeros((0, 2), dtype=np.float32))
uv2: Vector2D = field(default_factory=lambda: np.zeros((0, 2), dtype=np.float32))
normals: Vector3D = field(default_factory=lambda: np.zeros((0, 3), dtype=np.float32))
tangents: Vector4D = field(default_factory=lambda: np.zeros((0, 4), dtype=np.float32))
colors: Colors = field(default_factory=lambda: np.zeros((0, 4), dtype=np.uint8))
links_ids: LinksIds = field(default_factory=lambda: np.zeros((0, 4), dtype=np.uint8))
links_weights: LinksWeights = field(default_factory=lambda: np.zeros((0, 4), dtype=np.float32))
polygons: Polygons = field(default_factory=lambda: np.zeros((0, 3), dtype=np.uint32))
link_space: LinkSpace = LinkSpace.GLOBAL
uv_origin: UVOrigin = UVOrigin.TOP_LEFT
uv_sign: UVSign = UVSign.POSITIVE
@property
def max_influences(self) -> int:
if self.links_weights.size == 0:
return 0
return int((self.links_weights > 0).sum(axis=1).max())