feat(puppet): v0.3.3 — sprite_rot per-bone render offset
Adds optional 'sprite_rot' field (degrees in JSON, radians stored) to bone schema. Applied at render: world.rot + sprite_rot. Substrate convention (puppet.c:295, 2101). Use case: head_001.png has face-right at rot=0 (asymmetric sprite); without sprite_rot=-90 the look-at result appears 90° off because math computes rotation assuming sprite-top= forward but the sprite's natural forward is sprite-right. Default sprite_rot=0 keeps body, shoulder, arm bones unchanged.
This commit is contained in:
10
init.lua
10
init.lua
@@ -88,6 +88,13 @@ function M.build_rig(rig_table)
|
|||||||
local look_at_speed = nil
|
local look_at_speed = nil
|
||||||
if b.look_at_speed ~= nil then look_at_speed = math.rad(b.look_at_speed) end
|
if b.look_at_speed ~= nil then look_at_speed = math.rad(b.look_at_speed) end
|
||||||
|
|
||||||
|
-- A.4: Parse sprite_rot (deg in JSON → radians stored). Render-time offset
|
||||||
|
-- applied as `world.rot + sprite_rot` to compensate for sprite assets
|
||||||
|
-- whose natural orientation at rot=0 is not the bone's "forward" (-Y).
|
||||||
|
-- Substrate convention (puppet.c:295, 2101).
|
||||||
|
local sprite_rot = 0
|
||||||
|
if b.sprite_rot ~= nil then sprite_rot = math.rad(b.sprite_rot) 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
|
||||||
@@ -100,6 +107,7 @@ function M.build_rig(rig_table)
|
|||||||
rest_rot_min = rest_rot_min,
|
rest_rot_min = rest_rot_min,
|
||||||
rest_rot_max = rest_rot_max,
|
rest_rot_max = rest_rot_max,
|
||||||
look_at_speed = look_at_speed,
|
look_at_speed = look_at_speed,
|
||||||
|
sprite_rot = sprite_rot,
|
||||||
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
|
||||||
@@ -987,7 +995,7 @@ function M.render(handle)
|
|||||||
local ay = b.anchor and b.anchor[2] or 0
|
local ay = b.anchor and b.anchor[2] or 0
|
||||||
engine.render.draw_sprite_transform(
|
engine.render.draw_sprite_transform(
|
||||||
b.texture_handle,
|
b.texture_handle,
|
||||||
ws.x, ws.y, ws.rot,
|
ws.x, ws.y, ws.rot + (b.sprite_rot or 0),
|
||||||
sx, sy, ax, ay,
|
sx, sy, ax, ay,
|
||||||
0xFFFFFFFF
|
0xFFFFFFFF
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"id": "lib-core.puppet",
|
"id": "lib-core.puppet",
|
||||||
"version": "0.3.2",
|
"version": "0.3.3",
|
||||||
"api_min": "0.1",
|
"api_min": "0.1",
|
||||||
"deps": []
|
"deps": []
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user