feat(puppet): v0.4.3 — inherit_scale=false flag (decouple world.scl)
New optional bone field 'inherit_scale' (default true). When set false, world.scl = local.scl (no parent.scl multiplier). Position cascade still uses parent.scl (so child follows parent's stretch positionally). Use case: feet that move with leg-end as leg.scl_y cycles +1/0/-1, but foot sprite stays at constant scale (no Y-flip when leg flips, no collapse when leg collapses).
This commit is contained in:
16
init.lua
16
init.lua
@@ -112,6 +112,11 @@ function M.build_rig(rig_table)
|
|||||||
-- v0.4.0: Parse virtual flag (virtual=true skips render; bone still participates in compute_world)
|
-- v0.4.0: Parse virtual flag (virtual=true skips render; bone still participates in compute_world)
|
||||||
local virtual = (b.virtual == true)
|
local virtual = (b.virtual == true)
|
||||||
|
|
||||||
|
-- v0.4.3: Parse inherit_scale flag (default true; false → world.scl = local.scl,
|
||||||
|
-- ignoring parent.world.scl. Position cascade still uses parent.scl).
|
||||||
|
local inherit_scale = true
|
||||||
|
if b.inherit_scale == false then inherit_scale = false end
|
||||||
|
|
||||||
bones_by_id[b.id] = {
|
bones_by_id[b.id] = {
|
||||||
id = b.id,
|
id = b.id,
|
||||||
parent = nil, -- resolved below
|
parent = nil, -- resolved below
|
||||||
@@ -128,6 +133,7 @@ function M.build_rig(rig_table)
|
|||||||
look_at_slerp = look_at_slerp, -- v0.4.0: slerp-rate (unitless float)
|
look_at_slerp = look_at_slerp, -- v0.4.0: slerp-rate (unitless float)
|
||||||
sprite_rot = sprite_rot,
|
sprite_rot = sprite_rot,
|
||||||
virtual = virtual, -- v0.4.0: skip render if true
|
virtual = virtual, -- v0.4.0: skip render if true
|
||||||
|
inherit_scale = inherit_scale, -- v0.4.3: false → world.scl decoupled from parent.scl
|
||||||
color = b.color or { 200, 200, 200 },
|
color = b.color or { 200, 200, 200 },
|
||||||
texture = b.texture, -- optional atlas-id (string) or nil
|
texture = b.texture, -- optional atlas-id (string) or nil
|
||||||
z_order = b.z_order or 0, -- render-sort key; default 0
|
z_order = b.z_order or 0, -- render-sort key; default 0
|
||||||
@@ -728,10 +734,20 @@ local function compute_world(p, b)
|
|||||||
bs.world.x = pw.x + (cos_r * bs.pos.x * sx - sin_r * bs.pos.y * sy)
|
bs.world.x = pw.x + (cos_r * bs.pos.x * sx - sin_r * bs.pos.y * sy)
|
||||||
bs.world.y = pw.y + (sin_r * bs.pos.x * sx + cos_r * bs.pos.y * sy)
|
bs.world.y = pw.y + (sin_r * bs.pos.x * sx + cos_r * bs.pos.y * sy)
|
||||||
bs.world.rot = pw.rot + bs.rot
|
bs.world.rot = pw.rot + bs.rot
|
||||||
|
if b.inherit_scale == false then
|
||||||
|
-- v0.4.3: inherit_scale=false → world.scl from local only,
|
||||||
|
-- ignoring parent.world.scl. POSITION cascade above still
|
||||||
|
-- uses parent.scl (so child follows parent's stretch
|
||||||
|
-- positionally without scaling its own sprite). Use case:
|
||||||
|
-- feet that track leg-end but don't Y-flip when leg flips.
|
||||||
|
bs.world.scl_x = bs.scl.x
|
||||||
|
bs.world.scl_y = bs.scl.y
|
||||||
|
else
|
||||||
bs.world.scl_x = pw.scl_x * bs.scl.x
|
bs.world.scl_x = pw.scl_x * bs.scl.x
|
||||||
bs.world.scl_y = pw.scl_y * bs.scl.y
|
bs.world.scl_y = pw.scl_y * bs.scl.y
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
-- ====================================================================
|
-- ====================================================================
|
||||||
-- Forward-declared recursive helper (forward decl required for child-recursion).
|
-- Forward-declared recursive helper (forward decl required for child-recursion).
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"id": "lib-core.puppet",
|
"id": "lib-core.puppet",
|
||||||
"version": "0.4.2",
|
"version": "0.4.3",
|
||||||
"api_min": "0.1",
|
"api_min": "0.1",
|
||||||
"deps": []
|
"deps": []
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user