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.
This commit is contained in:
Axel Meyer
2026-05-18 02:53:47 +02:00
parent 475f60da21
commit 8013516ce8
2 changed files with 16 additions and 2 deletions

View File

@@ -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