From 8013516ce80cc9e35818c34fde4750890fccde99 Mon Sep 17 00:00:00 2001 From: Axel Meyer Date: Mon, 18 May 2026 02:53:47 +0200 Subject: [PATCH] feat: extend rig-format with texture/z_order/scale/anchor fields Additive extension to build_rig output, preserving backward-compat with existing rigs that lack the new fields: - bone.texture: optional atlas-id (string) for sprite-mode rendering; resolved to a texture-handle by puppet.load_textures(). When absent the bone falls back to colored-rect render via draw_rect_rotated. - bone.z_order: render-sort key (lower = back, higher = front); default 0. - bone.scale: [sx, sy] pair; default [1, 1]; negative components mirror the sprite. - bone.anchor: optional [x, y] override of the atlas-supplied anchor. - rig.asset_pack: alias-key into the consumer module's asset_aliases manifest field; lets puppet.load_textures resolve atlas-ids to texture-handles via the asset-lib. - rig.bones_z_sorted: array of bones pre-sorted by z_order; render walks this once per frame. Version bumped to 0.2.0. Subsequent commits add multi-level parent- chain transform, sprite-mode render, and load_textures. --- init.lua | 16 +++++++++++++++- manifest.lib | 2 +- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/init.lua b/init.lua index 676186a..57597d8 100644 --- a/init.lua +++ b/init.lua @@ -1,4 +1,4 @@ --- lib-core.puppet v0.1.0 +-- lib-core.puppet v0.2.0 -- Skeletal animation: skeleton + bones + tracks + rest + keyframe -- + procedural + look-at constraint. No footplant in v0.1. @@ -67,6 +67,11 @@ function M.build_rig(rig_table) }, look_at = (b.look_at == true), color = b.color or { 200, 200, 200 }, + texture = b.texture, -- optional atlas-id (string) or nil + z_order = b.z_order or 0, -- render-sort key; default 0 + scale = b.scale or { 1.0, 1.0 }, -- [sx, sy]; negative = mirror + anchor = b.anchor, -- optional [x, y] override of atlas-anchor; resolved in load_textures + texture_handle = nil, -- populated by load_textures } end @@ -110,12 +115,21 @@ function M.build_rig(rig_table) tracks_by_id[t.id] = { id = t.id, bones = bones_in_track } end + -- Build z-sorted bone list (lower z_order first = back, higher = front). + local bones_z_sorted = {} + for _, b_src in ipairs(rig_table.bones) do + bones_z_sorted[#bones_z_sorted + 1] = bones_by_id[b_src.id] + end + table.sort(bones_z_sorted, function(a, b) return a.z_order < b.z_order end) + return { id = rig_table.id or "anonymous", + asset_pack = rig_table.asset_pack, -- optional alias-key into module's asset_aliases bones = rig_table.bones, -- keep original-order array bones_by_id = bones_by_id, tracks_by_id = tracks_by_id, bone_to_track = bone_to_track, + bones_z_sorted = bones_z_sorted, } end diff --git a/manifest.lib b/manifest.lib index 7ec5721..94685a6 100644 --- a/manifest.lib +++ b/manifest.lib @@ -1,6 +1,6 @@ { "id": "lib-core.puppet", - "version": "0.1.0", + "version": "0.2.0", "api_min": "0.1", "deps": [] }