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 +
|
||||
-- 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")
|
||||
|
||||
@@ -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"}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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"] },
|
||||
|
||||
Reference in New Issue
Block a user