All posts
Releases

Natiny 0.13.0

Games now reach older devices through GLES, ship compressed and encrypted asset packs, and play layered skeletal animation from glTF files.

Natiny 0.13.0

Natiny 0.13.0 is a substantial update for taking a project beyond its first build. Games can now fall back to GLES on older devices, arrange loose or packed assets in layers, and bring animated characters straight from glTF.

Older devices get a working fallback

Games can now render through OpenGL ES 3.0 on Android and iOS, and through the same API under its browser name, WebGL 2. On the web, natiny.backend.init("auto") selects WebGPU when it is available and falls back to WebGL 2 when it is not. A browser without WebGPU now gets the game instead of a black canvas.

Android and iOS continue to prefer Vulkan and Metal automatically. GLES is available there as an explicit fallback for older devices or troublesome drivers, while the Lua code, NSL shaders, and resulting picture stay the same.

Resources stay the same loose or packed

natiny.resource.mount adds a folder to a search stack. Later mounts take priority, so patches, downloadable content, and mods can override shipped files without inventing a separate system for each one. Mounting data/ makes data/textures/hero.png available simply as textures/hero.png, whether the folder is loose or packed.

natiny pack data now turns a folder into fixed-size compressed packs plus an index, ready to use from a build script. Packing does not change resource names, and --part-size=4M controls how the output is split. See the assets, packs, and mods guide for the complete workflow.

Packs can also be encrypted with a passphrase. This keeps filenames and asset contents out of reach of ordinary extraction tools, although it is protection against casual asset ripping rather than someone debugging the running game: the program must still contain the key it uses to read them.

Web builds cache packs loaded asynchronously in IndexedDB. Unchanged packs are reused on the next visit, while a changed content hash produces a new cache entry automatically. Deterministic packing means rebuilding an unchanged folder does not make returning players download it again.

Animated glTF characters are ready to play

A glTF file with a skeleton now arrives with its joints and animation clips. Create an animator for a model, play a clip, and Natiny supplies the skinned shader variant automatically, so existing materials and NSL shaders do not need an animation-specific version.

Multiple animators can blend on one model. Weights, ordering, bone masks, and cross-fades cover transitions as well as combinations such as waving with the upper body while running with the lower body. Bones are ordinary entities, so attaching a sword to a hand uses the same parenting API as the rest of the scene. The skeletal animation guide walks through the new workflow.

Projects without animated meshes pay no extra memory cost. The current limits are 64 joints per mesh and four joints per vertex; dynamic meshes are still transformed on the CPU and are not skinned.

Existing projects have two migration steps

The Lua wrapper now mounts its data/ folder and runs main.lua from it, so existing resource paths and require calls should drop the leading data/. Native applications choose and mount their own folders; projects that do not use mounts can still load paths relative to their working directory.

Colours are now packed 0xRRGGBBAA values. Use natiny.color.from_hex or natiny.color.from_rgba, and pass the resulting single value to colour-taking functions instead of four components.

Mondays are release days

With 0.13.0, Natiny is moving from rapid-fire releases to a predictable weekly schedule. A new update will be waiting every Monday, giving each release a steady cadence for development, testing, and documentation.

Natiny 0.13.0 bundles for every supported platform are on the download page.

More posts