Source code for scfile.formats.fbx.io

from typing import TypeAlias

import numpy as np
from numpy.typing import NDArray

from scfile.core import StructIO
from scfile.enums import F

from .enums import PropertyType as Prop


Scalar: TypeAlias = bool | int | float | str | bytes | np.integer | np.floating
Float32Array: TypeAlias = NDArray[np.float32]
Float64Array: TypeAlias = NDArray[np.float64]
Int32Array: TypeAlias = NDArray[np.int32]
Int64Array: TypeAlias = NDArray[np.int64]
Array: TypeAlias = Float32Array | Float64Array | Int32Array | Int64Array
Value: TypeAlias = Scalar | Array | list[Scalar]


[docs] class FbxFileIO(StructIO): def _write_property(self, value: Value) -> None: match value: case bool(): self._write_bool(value) case int(): self._write_int32(value) case np.integer(): self._write_int64(value) case float() | np.floating(): self._write_double(value) case str() | bytes(): self._write_string(value) case np.ndarray(): self._write_array(value) case list(): self._write_array(np.array(value, dtype=np.float64)) def _write_bool(self, value: bool) -> None: self._writeb(F.U8, Prop.BOOL) self._writeb(F.U8, 1 if value else 0) def _write_int32(self, value: int) -> None: self._writeb(F.U8, Prop.INT32) self._writeb(F.I32, value) def _write_int64(self, value: np.integer) -> None: self._writeb(F.U8, Prop.INT64) self._writeb(F.I64, int(value)) def _write_double(self, value: float | np.floating) -> None: self._writeb(F.U8, Prop.DOUBLE) self._writeb(F.F64, float(value)) def _write_string(self, value: str | bytes) -> None: if isinstance(value, str): value = value.encode("utf-8") self._writeb(F.U8, Prop.STRING) self._writeb(F.U32, len(value)) self.write(value) def _write_array(self, arr: Array) -> None: prop, size = 0, 0 match arr.dtype: case np.float32: prop, size = Prop.ARRAY_FLOAT, 4 case np.float64: prop, size = Prop.ARRAY_DOUBLE, 8 case np.int64: prop, size = Prop.ARRAY_INT64, 8 case np.int32: prop, size = Prop.ARRAY_INT32, 4 self._writeb(F.U8, prop) self._writeb(F.U32, len(arr)) self._writeb(F.U32, 0) self._writeb(F.U32, len(arr) * size) self.write(arr.tobytes())