From b5b8318aa3ebd70b6a265d509c948999b2849249 Mon Sep 17 00:00:00 2001 From: Axel Meyer Date: Thu, 21 May 2026 23:28:24 +0200 Subject: [PATCH] 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 --- init.lua | 46 ++++++++++++++++++++++++-------------- manifest.module | 12 +++++----- maps/vagrant_test.map.json | 2 +- rigs/humanoid.rig.json | 24 ++++++++++---------- 4 files changed, 48 insertions(+), 36 deletions(-) diff --git a/init.lua b/init.lua index aa2fb01..32a196d 100644 --- a/init.lua +++ b/init.lua @@ -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") diff --git a/manifest.module b/manifest.module index 0d7bf78..4f1f2aa 100644 --- a/manifest.module +++ b/manifest.module @@ -6,17 +6,17 @@ "ci_frames": 60, "entry_point": "init.lua", "asset_aliases": { - "player": "lib-asset.prototype-subterrain", - "tiles": "lib-asset.prototype-subterrain", - "world": "lib-asset.prototype-subterrain" + "subterrain_player": "lib-asset.prototype-subterrain", + "subterrain_tiles": "lib-asset.prototype-subterrain", + "subterrain_world": "lib-asset.prototype-subterrain" }, "deps": [ {"id": "lib-core.input", "version": "0.4.0"}, {"id": "lib-core.camera", "version": "0.3.0"}, {"id": "lib-core.render", "version": "0.1.0"}, - {"id": "lib-core.maps", "version": "0.2.0"}, - {"id": "lib-core.puppet", "version": "0.4.4"}, + {"id": "lib-core.maps", "version": "0.3.0"}, + {"id": "lib-core.puppet", "version": "0.5.0"}, {"id": "lib-core.interaction", "version": "0.1.0"}, - {"id": "lib-asset.prototype-subterrain", "version": "0.1.1"} + {"id": "lib-asset.prototype-subterrain", "version": "0.2.0"} ] } diff --git a/maps/vagrant_test.map.json b/maps/vagrant_test.map.json index 77412af..4f43b32 100644 --- a/maps/vagrant_test.map.json +++ b/maps/vagrant_test.map.json @@ -1,6 +1,6 @@ { "id": "vagrant_test", - "tilemap": "vagrant_test", + "tilemap": "subterrain_tiles", "size": { "w": 20, "h": 20 }, "tiles": [ 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, diff --git a/rigs/humanoid.rig.json b/rigs/humanoid.rig.json index e182548..671367b 100644 --- a/rigs/humanoid.rig.json +++ b/rigs/humanoid.rig.json @@ -1,19 +1,19 @@ { "id": "humanoid", - "asset_pack": "player", + "asset_pack": "subterrain_player", "bones": [ { "id": "root", "parent": null, "rest": {"x": 0, "y": 0, "rot": 0}, "z_order": -1 }, - { "id": "body", "parent": "root", "rest": {"x": 0, "y": 0, "rot": 0}, "z_order": 2, "texture": "body_001", "look_at": "soft", "look_at_slerp": 6 }, - { "id": "head", "parent": "body", "rest": {"x": 0, "y": -3, "rot": 0, "rot_min": -60, "rot_max": 60}, "z_order": 6, "texture": "head_001", "look_at": "aim" }, - { "id": "shoulders", "parent": "body", "rest": {"x": 0, "y": 0, "rot": 0}, "z_order": 5, "texture": "shoulder_001" }, - { "id": "upper_arm_l", "parent": "shoulders", "rest": {"x": -19, "y": -3, "rot": 0, "scl": [-1, 1]}, "z_order": 3, "texture": "upper_arm_001" }, - { "id": "upper_arm_r", "parent": "shoulders", "rest": {"x": 20, "y": -4, "rot": 0}, "z_order": 3, "texture": "upper_arm_001" }, - { "id": "lower_arm_l", "parent": "upper_arm_l", "rest": {"x": 14, "y": -18, "rot": 0}, "z_order": 2, "texture": "lower_arm_001" }, - { "id": "lower_arm_r", "parent": "upper_arm_r", "rest": {"x": 13, "y": -17, "rot": 0}, "z_order": 2, "texture": "lower_arm_001" }, - { "id": "leg_l", "parent": "body", "rest": {"x": -9, "y": 1, "rot": 0, "scl": [-1, -1]}, "z_order": 1, "texture": "leg_001" }, - { "id": "leg_r", "parent": "body", "rest": {"x": 9, "y": 1, "rot": 0, "scl": [ 1, -1]}, "z_order": 1, "texture": "leg_001" }, - { "id": "foot_l", "parent": "leg_l", "rest": {"x": 0, "y": 25, "rot": 0, "scl": [ 1, 1]}, "z_order": 0, "texture": "foot_001", "inherit_scale": false }, - { "id": "foot_r", "parent": "leg_r", "rest": {"x": 0, "y": 26, "rot": 0, "scl": [ 1, 1]}, "z_order": 0, "texture": "foot_001", "inherit_scale": false } + { "id": "body", "parent": "root", "rest": {"x": 0, "y": 0, "rot": 0}, "z_order": 2, "texture": "body_001", "anchor": [31, 17], "look_at": "soft", "look_at_slerp": 6 }, + { "id": "head", "parent": "body", "rest": {"x": 0, "y": -3, "rot": 0, "rot_min": -60, "rot_max": 60}, "z_order": 6, "texture": "head_001", "anchor": [21, 30], "look_at": "aim" }, + { "id": "shoulders", "parent": "body", "rest": {"x": 0, "y": 0, "rot": 0}, "z_order": 5, "texture": "shoulder_001", "anchor": [29, 17] }, + { "id": "upper_arm_l", "parent": "shoulders", "rest": {"x": -19, "y": -3, "rot": 0, "scl": [-1, 1]}, "z_order": 3, "texture": "upper_arm_001", "anchor": [13, 26] }, + { "id": "upper_arm_r", "parent": "shoulders", "rest": {"x": 20, "y": -4, "rot": 0}, "z_order": 3, "texture": "upper_arm_001", "anchor": [13, 26] }, + { "id": "lower_arm_l", "parent": "upper_arm_l", "rest": {"x": 14, "y": -18, "rot": 0}, "z_order": 2, "texture": "lower_arm_001", "anchor": [ 9, 26] }, + { "id": "lower_arm_r", "parent": "upper_arm_r", "rest": {"x": 13, "y": -17, "rot": 0}, "z_order": 2, "texture": "lower_arm_001", "anchor": [ 9, 26] }, + { "id": "leg_l", "parent": "body", "rest": {"x": -9, "y": 1, "rot": 0, "scl": [-1, -1]}, "z_order": 1, "texture": "leg_001", "anchor": [10, 6] }, + { "id": "leg_r", "parent": "body", "rest": {"x": 9, "y": 1, "rot": 0, "scl": [ 1, -1]}, "z_order": 1, "texture": "leg_001", "anchor": [10, 6] }, + { "id": "foot_l", "parent": "leg_l", "rest": {"x": 0, "y": 25, "rot": 0, "scl": [ 1, 1]}, "z_order": 0, "texture": "foot_001", "anchor": [ 8, 26], "inherit_scale": false }, + { "id": "foot_r", "parent": "leg_r", "rest": {"x": 0, "y": 26, "rot": 0, "scl": [ 1, 1]}, "z_order": 0, "texture": "foot_001", "anchor": [ 8, 26], "inherit_scale": false } ], "tracks": [ { "id": "lower", "bones": ["leg_l", "leg_r", "foot_l", "foot_r"] },