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:
56
init.lua
56
init.lua
@@ -1402,6 +1402,62 @@ function M.get_override(layer_name, x, y, map_id)
|
|||||||
return normalize_override_entry(entry)
|
return normalize_override_entry(entry)
|
||||||
end
|
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)
|
function M.set_roof(x, y, value, map_id)
|
||||||
local map = require_map(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
|
if x < 0 or y < 0 or x >= map.size.w or y >= map.size.h then
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
{"id":"lib-core.maps","version":"0.5.1","api_min":"0.1"}
|
{"id":"lib-core.maps","version":"0.5.2","api_min":"0.1"}
|
||||||
|
|||||||
Reference in New Issue
Block a user