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:
46
init.lua
46
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 +
|
-- Sprite-mode test-chamber: 13-bone humanoid puppet + sprite-tilemap +
|
||||||
-- hardcoded furniture. Subterrain-style puppet control model:
|
-- hardcoded furniture. Subterrain-style puppet control model:
|
||||||
-- multi-look-target (aim/soft), slerp body rotation, hip-static legs,
|
-- multi-look-target (aim/soft), slerp body rotation, hip-static legs,
|
||||||
@@ -27,9 +27,8 @@ local INTERACTION_RANGE = 40 -- pixels
|
|||||||
local state = {
|
local state = {
|
||||||
player = nil,
|
player = nil,
|
||||||
map = nil,
|
map = nil,
|
||||||
bed_tex = nil,
|
world_tex = nil, -- subterrain_world atlas diffuse handle
|
||||||
bench_tex = nil,
|
furniture_uvs = nil, -- name -> { x, y, w, h } from atlas JSON
|
||||||
backpack_tex = nil,
|
|
||||||
-- Subterrain-style controller state:
|
-- Subterrain-style controller state:
|
||||||
walk_anim_current = nil, -- "walk_fwd_lower" / "walk_back_lower" / etc. (nil = idle_lower)
|
walk_anim_current = nil, -- "walk_fwd_lower" / "walk_back_lower" / etc. (nil = idle_lower)
|
||||||
lower_control_rot_deg = 0,
|
lower_control_rot_deg = 0,
|
||||||
@@ -189,11 +188,15 @@ function M.init(ctx)
|
|||||||
puppet.write_bone(handle, "foot_r", { rot = foot_local_deg })
|
puppet.write_bone(handle, "foot_r", { rot = foot_local_deg })
|
||||||
end)
|
end)
|
||||||
|
|
||||||
-- Furniture textures.
|
-- Furniture atlas (subterrain_world): load JSON + diffuse texture once.
|
||||||
local world_lib = aliases.world
|
local world_lib = aliases.subterrain_world
|
||||||
state.bed_tex = engine.asset.load_texture(world_lib .. "/assets/world/bed_001.png")
|
local world_base = world_lib .. "/assets/atlases/subterrain_world"
|
||||||
state.bench_tex = engine.asset.load_texture(world_lib .. "/assets/world/bench_001.png")
|
local world_meta = engine.asset.load_json(world_base .. "/tiles.atlas.json")
|
||||||
state.backpack_tex = engine.asset.load_texture(world_lib .. "/assets/world/backpack_001.png")
|
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 bindings.
|
||||||
input.bind("walk_left", { "a" })
|
input.bind("walk_left", { "a" })
|
||||||
@@ -212,10 +215,9 @@ function M.init(ctx)
|
|||||||
ctx.distance))
|
ctx.distance))
|
||||||
end)
|
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
|
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=3")
|
||||||
engine.print("vagrant: assets_loaded=14")
|
|
||||||
ci_assets_traced = true
|
ci_assets_traced = true
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -318,14 +320,24 @@ end
|
|||||||
|
|
||||||
function M.draw(ctx)
|
function M.draw(ctx)
|
||||||
camera.begin()
|
camera.begin()
|
||||||
-- Sprite-tilemap.
|
maps.draw_map_pre_entities()
|
||||||
r_lib.draw_map()
|
|
||||||
-- Hardcoded furniture placements (test-chamber spirit).
|
-- Hardcoded furniture placements (test-chamber spirit).
|
||||||
engine.render.draw_sprite_transform(state.bed_tex, 200, 150, 0, 1, 1, 32, 32, 0xFFFFFFFF)
|
-- Render via source-rect primitive using subterrain_world atlas UVs.
|
||||||
engine.render.draw_sprite_transform(state.bench_tex, 400, 300, 0, 1, 1, 32, 32, 0xFFFFFFFF)
|
local bed_uv = state.furniture_uvs["bed_001"]
|
||||||
engine.render.draw_sprite_transform(state.backpack_tex, 350, 400, 0, 1, 1, 16, 16, 0xFFFFFFFF)
|
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 (sprite-mode via texture_handles populated by load_rig+load_textures).
|
||||||
puppet.render(state.player)
|
puppet.render(state.player)
|
||||||
|
maps.draw_map_post_entities()
|
||||||
camera.finish()
|
camera.finish()
|
||||||
if CI_FRAME_PERF then
|
if CI_FRAME_PERF then
|
||||||
engine.print("vagrant: render_frame_ok")
|
engine.print("vagrant: render_frame_ok")
|
||||||
|
|||||||
@@ -6,17 +6,17 @@
|
|||||||
"ci_frames": 60,
|
"ci_frames": 60,
|
||||||
"entry_point": "init.lua",
|
"entry_point": "init.lua",
|
||||||
"asset_aliases": {
|
"asset_aliases": {
|
||||||
"player": "lib-asset.prototype-subterrain",
|
"subterrain_player": "lib-asset.prototype-subterrain",
|
||||||
"tiles": "lib-asset.prototype-subterrain",
|
"subterrain_tiles": "lib-asset.prototype-subterrain",
|
||||||
"world": "lib-asset.prototype-subterrain"
|
"subterrain_world": "lib-asset.prototype-subterrain"
|
||||||
},
|
},
|
||||||
"deps": [
|
"deps": [
|
||||||
{"id": "lib-core.input", "version": "0.4.0"},
|
{"id": "lib-core.input", "version": "0.4.0"},
|
||||||
{"id": "lib-core.camera", "version": "0.3.0"},
|
{"id": "lib-core.camera", "version": "0.3.0"},
|
||||||
{"id": "lib-core.render", "version": "0.1.0"},
|
{"id": "lib-core.render", "version": "0.1.0"},
|
||||||
{"id": "lib-core.maps", "version": "0.2.0"},
|
{"id": "lib-core.maps", "version": "0.3.0"},
|
||||||
{"id": "lib-core.puppet", "version": "0.4.4"},
|
{"id": "lib-core.puppet", "version": "0.5.0"},
|
||||||
{"id": "lib-core.interaction", "version": "0.1.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"}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"id": "vagrant_test",
|
"id": "vagrant_test",
|
||||||
"tilemap": "vagrant_test",
|
"tilemap": "subterrain_tiles",
|
||||||
"size": { "w": 20, "h": 20 },
|
"size": { "w": 20, "h": 20 },
|
||||||
"tiles": [
|
"tiles": [
|
||||||
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
|
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
|
||||||
|
|||||||
@@ -1,19 +1,19 @@
|
|||||||
{
|
{
|
||||||
"id": "humanoid",
|
"id": "humanoid",
|
||||||
"asset_pack": "player",
|
"asset_pack": "subterrain_player",
|
||||||
"bones": [
|
"bones": [
|
||||||
{ "id": "root", "parent": null, "rest": {"x": 0, "y": 0, "rot": 0}, "z_order": -1 },
|
{ "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": "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", "look_at": "aim" },
|
{ "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" },
|
{ "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" },
|
{ "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" },
|
{ "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" },
|
{ "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" },
|
{ "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" },
|
{ "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" },
|
{ "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", "inherit_scale": false },
|
{ "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", "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": [
|
"tracks": [
|
||||||
{ "id": "lower", "bones": ["leg_l", "leg_r", "foot_l", "foot_r"] },
|
{ "id": "lower", "bones": ["leg_l", "leg_r", "foot_l", "foot_r"] },
|
||||||
|
|||||||
Reference in New Issue
Block a user