import type { PropertyBag } from '../model/Properties'; import { defaultsFor } from './PropertySchema'; const DEFAULTS = defaultsFor('camera'); /** Axis-aligned rectangle in world units. */ export interface WorldRect { left: number; top: number; right: number; bottom: number; } /** * The world region a camera shows: its view size divided by its zoom. Drawn as a frame in edit mode, * and the only region rendered in play mode. */ export function cameraFrame(props: PropertyBag): { w: number; h: number } { const zoom = Math.max(0.01, Number(props.zoom ?? DEFAULTS.zoom)); return { w: Number(props.width ?? DEFAULTS.width) / zoom, h: Number(props.height ?? DEFAULTS.height) / zoom, }; } export function rectAround(cx: number, cy: number, w: number, h: number): WorldRect { return { left: cx - w / 2, top: cy - h / 2, right: cx + w / 2, bottom: cy + h / 2 }; } export function rectsIntersect(a: WorldRect, b: WorldRect): boolean { return a.left < b.right && a.right > b.left && a.top < b.bottom && a.bottom > b.top; }