ui/phase-9: PixiJS map renderer with torus and no-wrap modes

Stand up the vector map renderer in ui/frontend/src/map/ on top of
PixiJS v8 + pixi-viewport@^6. Torus mode renders nine container
copies for seamless wrap; no-wrap mode pins the camera at world
bounds and centres on an axis when the viewport exceeds the world
along that axis. Hit-test is a brute-force pass with deterministic
[-priority, distSq, kindOrder, id] ordering and torus-shortest
distance, validated by hand-built unit cases.

The development playground at /__debug/map exposes a window
debug surface for the Playwright spec, which forces WebGPU on
chromium-desktop, WebGL on webkit-desktop, and accepts the
auto-picked backend on mobile projects.

Algorithm spec lives in ui/docs/renderer.md, which also pins the
new deprecation status of galaxy/client (the entire Fyne client
module, including client/world). client/world/README.md and the
Phase 9 stub in ui/PLAN.md gain matching deprecation banners.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Ilia Denisov
2026-05-08 14:06:23 +02:00
parent 9d2504c42d
commit db415f8aa4
17 changed files with 2064 additions and 41 deletions
+45
View File
@@ -0,0 +1,45 @@
// Public surface of the map renderer module.
export {
DEFAULT_HIT_SLOP_PX,
KIND_ORDER,
DARK_THEME,
World,
type Camera,
type CirclePrim,
type LinePrim,
type PointPrim,
type Primitive,
type PrimitiveBase,
type PrimitiveID,
type PrimitiveKind,
type Style,
type Theme,
type Viewport,
type WrapMode,
} from "./world";
export {
clamp,
distSqPointToSegment,
screenToWorld,
torusShortestDelta,
worldToScreen,
} from "./math";
export {
clampCameraNoWrap,
minScaleNoWrap,
pivotZoom,
} from "./no-wrap";
export { hitTest, type Hit } from "./hit-test";
export {
createRenderer,
type RendererHandle,
type RendererOptions,
type RendererPreference,
} from "./render";
export { sampleWorld } from "./fixtures";