Source code for scfile.formats.efkmodel.decoder
from scfile import formats
from scfile.consts import ModelDefaults
from scfile.core import FileDecoder, ModelContent
from scfile.enums import ByteOrder, F, FileFormat
from scfile.formats.mcsa.decoder import MeshCounts
from scfile.formats.mcsa.exceptions import McsaCountsLimit
from scfile.formats.mcsa.io import McsaFileIO
from scfile.structures import models as S
[docs]
class EfkmodelDecoder(FileDecoder[ModelContent], McsaFileIO):
format = FileFormat.EFKMODEL
order = ByteOrder.LITTLE
_content = ModelContent
[docs]
def as_obj(self):
return self.convert_to(formats.obj.ObjEncoder)
[docs]
def as_glb(self):
return self.convert_to(formats.glb.GlbEncoder)
[docs]
def as_fbx(self):
return self.convert_to(formats.fbx.FbxEncoder)
[docs]
def as_dae(self):
return self.convert_to(formats.dae.DaeEncoder)
[docs]
def as_ms3d(self):
return self.convert_to(formats.ms3d.Ms3dEncoder)
[docs]
def parse(self):
self.data.version = self._readb(F.U32)
self.ctx["SCALE"] = self._readb(F.F32)
self.ctx["COUNT_MESHES"] = self._readb(F.I32)
self.ctx["COUNT_UNKNOWN"] = self._readb(F.I32)
for _ in range(self.ctx["COUNT_MESHES"]):
mesh = S.ModelMesh()
counts = MeshCounts()
# Read vertex data
counts.vertices = self._parse_count("vertices")
data = self._readarray(F.F32, counts.vertices * 15).reshape((counts.vertices, 15))
mesh.vertices = data[:, 0:3]
mesh.normals = data[:, 3:6]
mesh.uv1 = data[:, 12:14]
# Read polygons data
counts.polygons = self._parse_count("polygons")
mesh.polygons = self._readarray(F.I32, counts.polygons * 3).astype(F.I32).reshape(-1, 3)
self.data.scene.meshes.append(mesh)
def _parse_count(self, type: str) -> int:
count = self._readb(F.U32)
# ? Prevent memory overflow
if count > ModelDefaults.GEOMETRY_LIMIT:
raise McsaCountsLimit(self.location, type, count)
return count