v5.2.0
==================================================

✨ Added
----------------------------------------

* ``OlDecoder``: support for ``DXN_X`` (``ATI1`` / ``BC4``) textures.
* ``TextureKind``: OL texture kind identifiers.
* ``OlKindUnsupported``: error for unsupported OL texture kinds.
* ``decoders()``, ``encoders()``: access to registered decoder and encoder classes.
* ``converter()``: source format aliases.
* ``scfile.formats``: decoder and encoder class exports.
* ``detect.format()``: input format detection by file name.
* ``TextureContent.path_hash``: logical resource path hash.
* ``SafetyLimit``: shared limits for decoded sizes and counts.
* ``LimitError``: error for decoded values that exceed a safety limit.
* **Development:** public ``audit``, ``info`` and ``profile`` tools.

📝 Changed
----------------------------------------

* ``OlDecoder``: default and cubemap textures are now detected from the OL kind field.
* ``OlDecoder``: texture data is typed as ``DefaultTexture | CubemapTexture``.
* **Docs:** expanded format descriptions and library usage guide.
* **Templates:** updated binary format structures.

🐛 Fixed
----------------------------------------

* ``McsaDecoder``: facial bones and morph animation structure in model version 15.0.
* ``DaeEncoder``: ``float_array`` counts in generated documents.
* ``OlDecoder``: invalid compressed mipmaps now report ``InvalidStructureError``.

⚠️ Deprecated
----------------------------------------

* ``OlCubemapDecoder``: use ``OlDecoder`` instead.
* ``ol_cubemap_to_dds()``: use ``ol_to_dds()`` instead.

🗑️ Removed
----------------------------------------

* ``McsaCountsLimit``: replaced by ``LimitError``.

⚡ Optimized
----------------------------------------

* ``Ms3dEncoder``: numeric data serialization (1.2 s → 20 ms).
* ``DaeEncoder``, ``ObjEncoder``: numeric data serialization.
