Migrate vagrant-skeleton to atlas-uv consumers

Asset-aliases now reference the three baked subterrain atlas-sets
(subterrain_player, subterrain_tiles, subterrain_world) rather than
the legacy indexed pack labels. The rig asset_pack updates to
subterrain_player and each bone gains a calibrated anchor offset.
Furniture-draw loads the subterrain_world atlas once and renders
via source-rect draw_sprite_transform. The map tilemap field updates
to subterrain_tiles to match the new atlas-id. Dep-bumps for
lib-core.maps 0.3.0, lib-core.puppet 0.5.0, and
lib-asset.prototype-subterrain 0.2.0. Replace r_lib.draw_map with
draw_map_pre/post_entities.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Axel Meyer
2026-05-21 23:28:24 +02:00
parent 7c4b147608
commit b5b8318aa3
4 changed files with 48 additions and 36 deletions

View File

@@ -1,4 +1,4 @@
-- sporel-module-vagrant-skeleton v0.4.4
-- sporel-module-vagrant-skeleton v0.5.0
-- Sprite-mode test-chamber: 13-bone humanoid puppet + sprite-tilemap +
-- hardcoded furniture. Subterrain-style puppet control model:
-- multi-look-target (aim/soft), slerp body rotation, hip-static legs,
@@ -27,9 +27,8 @@ local INTERACTION_RANGE = 40 -- pixels
local state = {
player = nil,
map = nil,
bed_tex = nil,
bench_tex = nil,
backpack_tex = nil,
world_tex = nil, -- subterrain_world atlas diffuse handle
furniture_uvs = nil, -- name -> { x, y, w, h } from atlas JSON
-- Subterrain-style controller state:
walk_anim_current = nil, -- "walk_fwd_lower" / "walk_back_lower" / etc. (nil = idle_lower)
lower_control_rot_deg = 0,
@@ -189,11 +188,15 @@ function M.init(ctx)
puppet.write_bone(handle, "foot_r", { rot = foot_local_deg })
end)
-- Furniture textures.
local world_lib = aliases.world
state.bed_tex = engine.asset.load_texture(world_lib .. "/assets/world/bed_001.png")
state.bench_tex = engine.asset.load_texture(world_lib .. "/assets/world/bench_001.png")
state.backpack_tex = engine.asset.load_texture(world_lib .. "/assets/world/backpack_001.png")
-- Furniture atlas (subterrain_world): load JSON + diffuse texture once.
local world_lib = aliases.subterrain_world
local world_base = world_lib .. "/assets/atlases/subterrain_world"
local world_meta = engine.asset.load_json(world_base .. "/tiles.atlas.json")
state.world_tex = engine.asset.load_texture(world_base .. "/tiles.diffuse.atlas.png")
state.furniture_uvs = {}
for _, t in ipairs(world_meta.tiles) do
state.furniture_uvs[t.name] = { x = t.uv[1], y = t.uv[2], w = t.uv[3], h = t.uv[4] }
end
-- Input bindings.
input.bind("walk_left", { "a" })
@@ -212,10 +215,9 @@ function M.init(ctx)
ctx.distance))
end)
-- CI trace: assets loaded count (puppet+tilemap+furniture textures).
-- CI trace: assets loaded count (3 atlas textures: player + tiles + world).
if CI_FRAME_PERF and not ci_assets_traced then
-- 7 puppet textures + 4 tile textures + 3 furniture textures = 14
engine.print("vagrant: assets_loaded=14")
engine.print("vagrant: assets_loaded=3")
ci_assets_traced = true
end
@@ -318,14 +320,24 @@ end
function M.draw(ctx)
camera.begin()
-- Sprite-tilemap.
r_lib.draw_map()
maps.draw_map_pre_entities()
-- Hardcoded furniture placements (test-chamber spirit).
engine.render.draw_sprite_transform(state.bed_tex, 200, 150, 0, 1, 1, 32, 32, 0xFFFFFFFF)
engine.render.draw_sprite_transform(state.bench_tex, 400, 300, 0, 1, 1, 32, 32, 0xFFFFFFFF)
engine.render.draw_sprite_transform(state.backpack_tex, 350, 400, 0, 1, 1, 16, 16, 0xFFFFFFFF)
-- Render via source-rect primitive using subterrain_world atlas UVs.
local bed_uv = state.furniture_uvs["bed_001"]
local bench_uv = state.furniture_uvs["bench_001"]
local backpack_uv = state.furniture_uvs["backpack_001"]
engine.render.draw_sprite_transform(state.world_tex, 200, 150, 0, 1, 1,
bed_uv.w / 2, bed_uv.h / 2, 0xFFFFFFFF,
bed_uv.x, bed_uv.y, bed_uv.w, bed_uv.h)
engine.render.draw_sprite_transform(state.world_tex, 400, 300, 0, 1, 1,
bench_uv.w / 2, bench_uv.h / 2, 0xFFFFFFFF,
bench_uv.x, bench_uv.y, bench_uv.w, bench_uv.h)
engine.render.draw_sprite_transform(state.world_tex, 350, 400, 0, 1, 1,
backpack_uv.w / 2, backpack_uv.h / 2, 0xFFFFFFFF,
backpack_uv.x, backpack_uv.y, backpack_uv.w, backpack_uv.h)
-- Puppet (sprite-mode via texture_handles populated by load_rig+load_textures).
puppet.render(state.player)
maps.draw_map_post_entities()
camera.finish()
if CI_FRAME_PERF then
engine.print("vagrant: render_frame_ok")