v5.0.0#
✨ Added#
GUI#
Graphical interface: implemented with
PySide6and launched when no arguments are provided.ConverterTab: drag & drop, file type filters, output structure options.MapCacheTab:.mdatto.mcaconversion with threading.VersionWidget: update check popup with GitHub release lookup.
CLI#
Command structure:
scfile convertandscfile mapcache.scfile.__main__: automatically runsconvertwhen a file or directory is given as first argument.--updates: update check option.--on-conflict: output conflict option (overwrite,rename,skip).params: Click typesFiles,Output,MapCacheDir,FormatsandOnConflict.
Formats#
EfkmodelDecoder: new source format.efkmodel(geometry only).McalDecoder: new source format.mcal(animation library, no export).MdatDecoder: new source format.mdat(region cache).McaEncoder: new output format.mca(Anvil regions).FbxEncoder: new output format.fbx(geometry only).nbt.nbt: NBT encoding functions (encode(),compound(),list(), etc.).mca.mapping: block ID mapping table for the Anvil format.
Core#
StructIO: unified stream class replacingStructBytesIOandStructFileIO.BaseFile: unified binary stream adapter for file paths, bytes and IO streams.FileDecoder.convert_to():outputparameter (IOStream).FileEncoder.transform()hook and transforms pipeline.RegionContent: world chunk container.RegionChunk,ChunkHeader: world chunk structures.ModelContent:uv2,tangentsandcolorsfields.FileEncoder,FileDecoder:prelude()hooks.
Models#
transforms: scene transformation functions.ModelMeshfields:uv2,tangents,colors,link_space,uv_origin,uv_sign,max_influences.ModelSkeletonfields:space,hierarchy.AnimationClip: replacedtransformswithrotationsandtranslations.SkeletonBone:slugproperty.Enums:
UVOrigin,UVSign,LinkSpace,SkeletonSpace,SkeletonHierarchy,AnimationTranslationandAnimationRotation.Type aliases:
EulerAngles,TransformMatrix,BindPose, etc.
Convert#
Converter registry:
converters()andregistry()functions with the@converterdecorator for format pairs.
Utils#
scfile.utils: new package.files:resource(),resolve(),walk(),destination().versions:Versiondataclass with parsing and comparison.updates: update checking against GitHub API.regions: region merging from scattered map cache files.cli: callbacksversion_callback,updates_callback.
📝 Changed#
Core#
UserOptions: renamed toOptions.UserOptions.parse_skeleton: renamed toOptions.skeleton.UserOptions.parse_animation: renamed toOptions.animation.UserOptions.overwrite: replaced byOptions.on_conflict.FileEncoder.save_as(),FileEncoder.export_as(): now returnSelf.
Formats#
Model decoders:
to_XXX()methods replaced byas_XXX(). They return an empty encoder;encode()must be called explicitly.Model decoders:
prepare()replaced by a transforms list.GlbEncoder._add_meshes(): writesuv2andtangentswhen present.DaeEncoder._add_controller_sources(): checksmax_influences > 0.McsaFileIO._links(): normalizes bone weights.
Constants#
NBT_FILENAMES: renamed toSUPPORTED_NBT.
Tests#
Coverage: 100% excluding
scfile.gui.
🐛 Fixed#
McsaDecoder: UV2 and tangent parsing (exported only to.glb).GlbEncoder: binary data for meshes without skinning links when a skeleton is present.
🗑️ Removed#
CLI:
--uniqueoption (replaced by--on-conflict rename).FileFormat.ITEMNAMES(replaced byFileFormat.NBT).McsaBoneLinksError(replaced by a silent fallback).scfile.cli.commands.py,scfile.cli.types.py,scfile.cli.utils.py.SceneCounts,MeshCounts.structures.types.enums.FileMode.
♻️ Refactored#
Structure#
core.io: moved tocore.structio.core.context: split intocore.contentandcore.options.structures.models: now containsanimation,mesh,skeleton,scene,flagsandvectors.consts.McsaUnits: moved toformats.mcsa.consts.consts.OlString: moved toformats.ol.io.StructBytesIO,StructFileIO: merged intoStructIO.AnimationClip.transforms: split intorotationsandtranslations.convert.legacy: merged back intoconvert.formats.
Renamed#
ModelMesh.positions: renamed toModelMesh.vertices.ModelMesh.textures: renamed toModelMesh.uv1.TextureArrayContent: renamed toTexarrContent.TextureArrayDecoder: renamed toTexarrDecoder.TextureArrayEncoder: renamed toTexarrEncoder.NbtBytesIO: renamed toNbtBufferIO.McsaModel: renamed toModelDefaults.MeshOrigin: renamed toMeshBounds.