Source code for scfile.formats.efkmodel.decoder
from scfile import formats
from scfile.core import FileDecoder, ModelContent
from scfile.enums import ByteOrder, F, FileFormat
from scfile.enums import SafetyLimit as Limit
from scfile.formats.mcsa.decoder import MeshCounts
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._readcount(F.I32, Limit.MESHES)
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._readcount(F.U32, Limit.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._readcount(F.U32, Limit.POLYGONS)
mesh.polygons = self._readarray(F.I32, counts.polygons * 3).astype(F.I32).reshape(-1, 3)
self.data.scene.meshes.append(mesh)