Files
sporel-lib-core.camera/init.lua

60 lines
1.7 KiB
Lua

-- =====================================================================
-- lib-core.camera — 2D Camera State (P.0)
-- See: meta/docs/superpowers/specs/2026-05-09-p0-lib-camera-design.md
--
-- Scope: target + zoom state + begin/finish wrapper.
-- Forward-compat stubs (DEPRECATED-MVP):
-- - follow(entity) -- lib-core.actor slice
-- - set_bounds(map_id) -- when map-bounds matter
-- - lerp_to(target, dt) -- smooth-follow / animation slice
-- - shake(intensity, dur) -- effects/juice slice
-- - set_rotation(deg) -- closed-topology slice
-- =====================================================================
local target_x = 0
local target_y = 0
local zoom_v = 1.0
local M = {}
function M.set_target(x, y)
if type(x) ~= "number" or type(y) ~= "number" then
error("camera.set_target: x and y must be numbers")
end
target_x = x
target_y = y
end
function M.set_zoom(z)
if type(z) ~= "number" or z <= 0 then
error(string.format("camera.set_zoom: zoom must be a positive number, got %s",
tostring(z)))
end
zoom_v = z
end
function M.target()
return { x = target_x, y = target_y }
end
function M.zoom()
return zoom_v
end
function M.begin()
engine.render.camera_2d_begin(target_x, target_y, zoom_v)
end
function M.finish()
engine.render.camera_2d_end()
end
-- DEPRECATED-MVP: forward-compat stubs for later slices
-- function M.follow(entity) -- lib-core.actor slice
-- function M.set_bounds(map_id) -- bounds-clamping slice
-- function M.lerp_to(target, dt) -- smooth-follow slice
-- function M.shake(intensity, dur) -- effects/juice slice
-- function M.set_rotation(deg) -- closed-topology slice
return M