// Mutable controller object shared across the PixiJS modules. // // IMPORTANT: this must NOT be wrapped in Svelte's `$state` — the deep proxy // breaks PixiJS's internal object identity checks. Keep it a plain object so // the interaction, node, and animation modules can read/write the same // mutable pan/zoom state by reference (the same single source of truth the // original onMount closure relied on). import type { Application, Container } from 'pixi.js'; import type { BackgroundLayers, LineObject, NodeObject } from './types'; export interface SkillTreeController { app: Application; treeContainer: Container; bg: BackgroundLayers; nodeObjects: NodeObject[]; lineObjects: LineObject[]; // Pan/zoom mutable state (was closure vars in onMount). isDragging: boolean; hasMoved: boolean; dragStartX: number; dragStartY: number; containerStartX: number; containerStartY: number; lastTouchDistance: number; isTouchZooming: boolean; // Parallax baseline (re-set on view reset) + final zoom scale. initialTreeX: number; initialTreeY: number; endScale: number; } export function createController( app: Application, treeContainer: Container, bg: BackgroundLayers, endScale: number ): SkillTreeController { return { app, treeContainer, bg, nodeObjects: [], lineObjects: [], isDragging: false, hasMoved: false, dragStartX: 0, dragStartY: 0, containerStartX: 0, containerStartY: 0, lastTouchDistance: 0, isTouchZooming: false, initialTreeX: treeContainer.x, initialTreeY: treeContainer.y, endScale }; }