import type { Container, FederatedMouseEvent, FederatedPointerEvent, FederatedWheelEvent } from 'pixi.js'; import type { World } from '../runtime/World'; import { isInside, screenToWorld, type View, wheelNotches } from './view'; /** * Hands the mouse over `target` to a running world: position, left button and wheel. Shared by the * editor's game view and a released game (#266). Outside the camera frame counts as "not in view": * that region is letterbox, not game. */ export function routePointer(target: Container, world: () => World | null, view: () => View | null): void { const report = (e: FederatedMouseEvent): void => { const w = world(); const v = view(); if (!w || !v) return; const local = target.toLocal(e.global); const point = screenToWorld(v, local.x, local.y); w.movePointer(point.x, point.y, isInside(v, local.x, local.y)); }; target.on('pointerdown', (e: FederatedPointerEvent) => { if (e.button !== 0) return; report(e); world()?.setPointerDown(true); }); target.on('globalpointermove', (e: FederatedPointerEvent) => report(e)); target.on('pointerup', () => world()?.setPointerDown(false)); target.on('pointerupoutside', () => world()?.setPointerDown(false)); target.on('wheel', (e: FederatedWheelEvent) => { report(e); world()?.turnWheel(wheelNotches(e.deltaY, e.deltaMode)); }); }