Source code for scfile.core.context.content
"""
Shared content data between decoder and encoder.
"""
from abc import ABC
from collections import defaultdict
from dataclasses import MISSING, dataclass, field, fields
from typing import Generic, TypeAlias, cast
from scfile.enums import FileType
from scfile.structures.scene import ModelFlags, ModelScene
from scfile.structures.texture import CubemapTexture, DefaultTexture, TextureType
NbtValue: TypeAlias = None | int | float | bytes | str | list[int] | list["NbtValue"] | dict[str, "NbtValue"]
[docs]
@dataclass
class FileContent(ABC):
"""Base dataclass for file content storage."""
type: FileType = field(default=FileType.NONE)
[docs]
def reset(self):
for f in fields(self):
if f.default_factory is not MISSING:
setattr(self, f.name, f.default_factory())
elif f.default is not MISSING:
setattr(self, f.name, f.default)
else:
setattr(self, f.name, None)
[docs]
@dataclass
class ModelContent(FileContent):
"""Model content storage."""
type: FileType = field(default=FileType.MODEL)
version: float = 0.0
flags: ModelFlags = field(default_factory=lambda: defaultdict(bool))
scene: ModelScene = field(default_factory=ModelScene)
[docs]
@dataclass
class TextureContent(FileContent, Generic[TextureType]):
"""Texture content storage."""
type: FileType = field(default=FileType.TEXTURE)
width: int = 0
height: int = 0
mipmap_count: int = 0
format: bytes = field(default_factory=bytes)
texture: TextureType = field(default_factory=lambda: cast(TextureType, DefaultTexture()))
@property
def is_cubemap(self) -> bool:
return isinstance(self.texture, CubemapTexture)
@property
def is_compressed(self) -> bool:
return self.fourcc in (b"DXT1", b"DXT3", b"DXT5", b"ATI2", b"DX10")
@property
def fourcc(self) -> bytes:
match self.format:
case b"DXN_XY":
return b"ATI2"
case b"RGBA32F":
return b"DX10"
case _:
return self.format
[docs]
@dataclass
class ImageContent(FileContent):
"""Image content storage."""
type: FileType = field(default=FileType.IMAGE)
image: bytes = field(default_factory=bytes)
[docs]
@dataclass
class TextureArrayContent(FileContent):
"""Texture array storage."""
type: FileType = field(default=FileType.TEXARR)
count: int = 0
textures: list[tuple[str, bytes]] = field(default_factory=list)
[docs]
@dataclass
class NbtContent(FileContent):
type: FileType = field(default=FileType.NBT)
value: NbtValue = None