feat(maps): v0.5.2 — set_vertex / get_vertex public APIs

Vertex-grid write/read for the autotile painting path. The map-editor
0.2.0a Auto-Tile mode is the primary consumer; painting a single
vertex causes up to 4 surrounding cells to flip to material via the
any-corner rule. Coordinate-checks reject OOB writes; grid is lazily
allocated on first paint.
This commit is contained in:
calic
2026-05-28 23:51:39 +02:00
parent d0f4d17b65
commit 714ec57010
2 changed files with 57 additions and 1 deletions

View File

@@ -1402,6 +1402,62 @@ function M.get_override(layer_name, x, y, map_id)
return normalize_override_entry(entry)
end
-- 0.5.2: vertex-grid write APIs for the autotile painting path.
-- Vertices live on a (W+1) x (H+1) grid; painting a single vertex
-- "fills in" the 4 cells around it per the any-corner rule (cell
-- becomes material). The map-editor's Auto-Tile mode is the
-- primary consumer.
local function check_vertex_coords(map, vx, vy, fn_name)
local vw = map.size.w + 1
local vh = map.size.h + 1
if vx < 0 or vy < 0 or vx >= vw or vy >= vh then
error(string.format("%s: vertex (%d,%d) out of bounds for vertex-grid %dx%d",
fn_name, vx, vy, vw, vh))
end
end
local function ensure_vertex_grid(layer, map)
if layer.vertices == nil then
local vw = map.size.w + 1
local vh = map.size.h + 1
local grid = {}
for i = 1, vw * vh do grid[i] = 0 end
layer.vertices = grid
end
return layer.vertices
end
function M.set_vertex(layer_name, vx, vy, painted, map_id)
local map = require_map(map_id)
check_vertex_coords(map, vx, vy, "maps.set_vertex")
local layer = require_v3_layer(map, layer_name, "maps.set_vertex")
local v = ensure_vertex_grid(layer, map)
local vw = map.size.w + 1
local idx = vy * vw + vx + 1
local new_val = (painted == true or painted == 1) and 1 or 0
if v[idx] ~= new_val then
v[idx] = new_val
map._dirty = true
map._opaque_ceiling = nil -- vertex change may affect opaque ceiling
-- _layer_has_content goes true on paint; never auto-cleared
-- on erase (stale-true is harmless).
if new_val == 1 and map._layer_has_content then
map._layer_has_content[layer_name] = true
end
end
end
function M.get_vertex(layer_name, vx, vy, map_id)
local map = require_map(map_id)
check_vertex_coords(map, vx, vy, "maps.get_vertex")
local layer = require_v3_layer(map, layer_name, "maps.get_vertex")
if layer.vertices == nil then return false end
local vw = map.size.w + 1
local v = layer.vertices[vy * vw + vx + 1]
return v == 1 or v == true
end
function M.set_roof(x, y, value, map_id)
local map = require_map(map_id)
if x < 0 or y < 0 or x >= map.size.w or y >= map.size.h then