@viji-dev/core 0.2.20 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +153 -32
- package/dist/artist-dts-p5.js +1 -1
- package/dist/artist-dts.js +1 -1
- package/dist/artist-global.d.ts +114 -13
- package/dist/artist-js-ambient.d.ts +43 -1
- package/dist/artist-jsdoc.d.ts +43 -1
- package/dist/assets/{viji.worker-BANvuSYW.js → viji.worker-Be0jZvYj.js} +709 -61
- package/dist/assets/viji.worker-Be0jZvYj.js.map +1 -0
- package/dist/assets/wasm/essentia-wasm.web.wasm +0 -0
- package/dist/essentia-wasm.web-D7gmeaO3.js +5696 -0
- package/dist/essentia-wasm.web-D7gmeaO3.js.map +1 -0
- package/dist/essentia.js-core.es-DnrJE0uR.js +3174 -0
- package/dist/essentia.js-core.es-DnrJE0uR.js.map +1 -0
- package/dist/index-BV1S8Ps-.js +16180 -0
- package/dist/index-BV1S8Ps-.js.map +1 -0
- package/dist/index.d.ts +1128 -36
- package/dist/index.js +5 -2613
- package/dist/index.js.map +1 -1
- package/dist/shader-uniforms.js +365 -0
- package/package.json +5 -2
- package/dist/assets/viji.worker-BANvuSYW.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viji.worker-Be0jZvYj.js","sources":["../src/worker/ParameterSystem.ts","../src/worker/InteractionSystem.ts","../src/worker/CVSystem.ts","../src/worker/VideoSystem.ts","../src/worker/renderers/P5WorkerAdapter.ts","../src/worker/renderers/ShaderParameterParser.ts","../src/worker/renderers/ShaderWorkerAdapter.ts","../src/worker/VijiWorkerRuntime.ts","../src/utils/SceneAnalyzer.ts","../src/worker/viji.worker.ts"],"sourcesContent":["import { \r\n ParameterGroup, \r\n ParameterDefinition, \r\n ParameterValue,\r\n SliderParameter,\r\n ColorParameter,\r\n ToggleParameter,\r\n SelectParameter,\r\n TextParameter,\r\n NumberParameter,\r\n ImageParameter,\r\n SliderConfig,\r\n ColorConfig,\r\n ToggleConfig,\r\n SelectConfig,\r\n TextConfig,\r\n NumberConfig,\r\n ImageConfig\r\n} from '../types/index.js';\r\n\r\nexport class ParameterSystem {\r\n // Parameter system for Phase 2 (new object-based approach)\r\n private parameterDefinitions = new Map<string, ParameterDefinition>();\r\n private parameterGroups = new Map<string, ParameterGroup>();\r\n private parameterValues = new Map<string, ParameterValue>();\r\n private parameterObjects = new Map<string, any>(); // Maps parameter names to their objects\r\n private parametersDefined = false;\r\n private initialValuesSynced = false; // Track if initial values have been synced from host\r\n \r\n // Debug logging control\r\n private debugMode = false;\r\n\r\n /**\r\n * Enable or disable debug logging\r\n */\r\n setDebugMode(enabled: boolean): void {\r\n this.debugMode = enabled;\r\n }\r\n\r\n /**\r\n * Debug logging helper\r\n */\r\n private debugLog(message: string, ...args: any[]): void {\r\n if (this.debugMode) {\r\n console.log(message, ...args);\r\n }\r\n }\r\n\r\n // Message posting callback\r\n private postMessageCallback: (type: string, data?: any) => void;\r\n\r\n constructor(postMessageCallback: (type: string, data?: any) => void) {\r\n this.postMessageCallback = postMessageCallback;\r\n }\r\n\r\n // Parameter helper function implementations (return parameter objects)\r\n public createSliderParameter(defaultValue: number, config: SliderConfig): SliderParameter {\r\n const paramName = config.label;\r\n const sliderObject = {\r\n value: defaultValue,\r\n min: config.min ?? 0,\r\n max: config.max ?? 100,\r\n step: config.step ?? 1,\r\n label: config.label,\r\n description: config.description ?? '',\r\n group: config.group ?? 'general',\r\n category: config.category ?? 'general',\r\n };\r\n\r\n const definition: ParameterDefinition = {\r\n type: 'slider',\r\n defaultValue,\r\n label: sliderObject.label,\r\n description: sliderObject.description,\r\n group: sliderObject.group,\r\n category: sliderObject.category,\r\n config: {\r\n min: sliderObject.min,\r\n max: sliderObject.max,\r\n step: sliderObject.step\r\n }\r\n };\r\n\r\n this.storeParameterDefinition(paramName, definition);\r\n this.parameterObjects.set(paramName, sliderObject);\r\n return sliderObject;\r\n }\r\n\r\n public createColorParameter(defaultValue: string, config: ColorConfig): ColorParameter {\r\n const paramName = config.label;\r\n const colorObject = {\r\n value: defaultValue,\r\n label: config.label,\r\n description: config.description ?? '',\r\n group: config.group ?? 'general',\r\n category: config.category ?? 'general',\r\n };\r\n\r\n const definition: ParameterDefinition = {\r\n type: 'color',\r\n defaultValue,\r\n label: colorObject.label,\r\n description: colorObject.description,\r\n group: colorObject.group,\r\n category: colorObject.category,\r\n };\r\n\r\n this.storeParameterDefinition(paramName, definition);\r\n this.parameterObjects.set(paramName, colorObject);\r\n return colorObject;\r\n }\r\n\r\n public createToggleParameter(defaultValue: boolean, config: ToggleConfig): ToggleParameter {\r\n const paramName = config.label;\r\n const toggleObject = {\r\n value: defaultValue,\r\n label: config.label,\r\n description: config.description ?? '',\r\n group: config.group ?? 'general',\r\n category: config.category ?? 'general'\r\n };\r\n\r\n const definition: ParameterDefinition = {\r\n type: 'toggle',\r\n defaultValue,\r\n label: toggleObject.label,\r\n description: toggleObject.description,\r\n group: toggleObject.group,\r\n category: toggleObject.category\r\n };\r\n\r\n this.storeParameterDefinition(paramName, definition);\r\n this.parameterObjects.set(paramName, toggleObject);\r\n return toggleObject;\r\n }\r\n\r\n public createSelectParameter(defaultValue: string | number, config: SelectConfig): SelectParameter {\r\n const paramName = config.label;\r\n const selectObject = {\r\n value: defaultValue,\r\n options: config.options,\r\n label: config.label,\r\n description: config.description ?? '',\r\n group: config.group ?? 'general',\r\n category: config.category ?? 'general'\r\n };\r\n\r\n const definition: ParameterDefinition = {\r\n type: 'select',\r\n defaultValue,\r\n label: selectObject.label,\r\n description: selectObject.description,\r\n group: selectObject.group,\r\n category: selectObject.category,\r\n config: {\r\n options: selectObject.options\r\n }\r\n };\r\n\r\n this.storeParameterDefinition(paramName, definition);\r\n this.parameterObjects.set(paramName, selectObject);\r\n return selectObject;\r\n }\r\n\r\n public createTextParameter(defaultValue: string, config: TextConfig): TextParameter {\r\n const paramName = config.label;\r\n const textObject = {\r\n value: defaultValue,\r\n maxLength: config.maxLength ?? 1000,\r\n label: config.label,\r\n description: config.description ?? '',\r\n group: config.group ?? 'general',\r\n category: config.category ?? 'general'\r\n };\r\n\r\n const definition: ParameterDefinition = {\r\n type: 'text',\r\n defaultValue,\r\n label: textObject.label,\r\n description: textObject.description,\r\n group: textObject.group,\r\n category: textObject.category,\r\n config: {\r\n maxLength: textObject.maxLength\r\n }\r\n };\r\n\r\n this.storeParameterDefinition(paramName, definition);\r\n this.parameterObjects.set(paramName, textObject);\r\n return textObject;\r\n }\r\n\r\n public createNumberParameter(defaultValue: number, config: NumberConfig): NumberParameter {\r\n const paramName = config.label;\r\n const numberObject = {\r\n value: defaultValue,\r\n min: config.min ?? 0,\r\n max: config.max ?? 100,\r\n step: config.step ?? 1,\r\n label: config.label,\r\n description: config.description ?? '',\r\n group: config.group ?? 'general',\r\n category: config.category ?? 'general'\r\n };\r\n\r\n const definition: ParameterDefinition = {\r\n type: 'number',\r\n defaultValue,\r\n label: numberObject.label,\r\n description: numberObject.description,\r\n group: numberObject.group,\r\n category: numberObject.category,\r\n config: {\r\n min: numberObject.min,\r\n max: numberObject.max,\r\n step: numberObject.step\r\n }\r\n };\r\n\r\n this.storeParameterDefinition(paramName, definition);\r\n this.parameterObjects.set(paramName, numberObject);\r\n return numberObject;\r\n }\r\n\r\n public createImageParameter(defaultValue: null, config: ImageConfig): ImageParameter {\r\n const paramName = config.label;\r\n const imageObject = {\r\n value: defaultValue,\r\n label: config.label,\r\n description: config.description ?? '',\r\n group: config.group ?? 'general',\r\n category: config.category ?? 'general'\r\n };\r\n\r\n const definition: ParameterDefinition = {\r\n type: 'image',\r\n defaultValue,\r\n label: imageObject.label,\r\n description: imageObject.description,\r\n group: imageObject.group,\r\n category: imageObject.category\r\n };\r\n\r\n this.storeParameterDefinition(paramName, definition);\r\n this.parameterObjects.set(paramName, imageObject);\r\n return imageObject;\r\n }\r\n\r\n private storeParameterDefinition(name: string, definition: ParameterDefinition): void {\r\n // This is called during scene initialization, not during define()\r\n // We'll collect these and send them when the scene is fully loaded\r\n this.parameterDefinitions.set(name, definition);\r\n this.parameterValues.set(name, definition.defaultValue);\r\n }\r\n\r\n public updateParameterValue(name: string, value: ParameterValue): boolean {\r\n const definition = this.parameterDefinitions.get(name);\r\n if (!definition) {\r\n console.warn(`Unknown parameter: ${name}. Available parameters:`, Array.from(this.parameterDefinitions.keys()));\r\n return false;\r\n }\r\n\r\n // Validation\r\n if (!this.validateParameterValue(name, value, definition)) {\r\n console.warn(`Validation failed for parameter ${name} = ${value}`);\r\n return false;\r\n }\r\n\r\n // Check if value actually changed (but always allow initial sync)\r\n const currentValue = this.parameterValues.get(name);\r\n const isInitialSync = !this.initialValuesSynced; // During initial parameter sync from host\r\n \r\n if (currentValue === value && !isInitialSync) {\r\n return false; // No change (but allow initial sync even if values match)\r\n }\r\n\r\n // Update value in both storage and parameter object\r\n this.parameterValues.set(name, value);\r\n \r\n // Update the parameter object's value property\r\n const parameterObject = this.parameterObjects.get(name);\r\n if (parameterObject) {\r\n parameterObject.value = value;\r\n }\r\n \r\n return true;\r\n }\r\n\r\n private validateParameterValue(name: string, value: ParameterValue, definition: ParameterDefinition): boolean {\r\n // Custom validation function\r\n if (definition.validate && !definition.validate(value)) {\r\n console.error(`Custom validation failed for parameter '${name}': ${value}`);\r\n return false;\r\n }\r\n\r\n // Type validation\r\n switch (definition.type) {\r\n case 'slider':\r\n case 'number':\r\n if (typeof value !== 'number' || isNaN(value)) {\r\n console.error(`Parameter '${name}' must be a number, got: ${value}`);\r\n return false;\r\n }\r\n if (definition.config?.min !== undefined && value < definition.config.min) {\r\n console.error(`Parameter '${name}' value ${value} is below minimum ${definition.config.min}`);\r\n return false;\r\n }\r\n if (definition.config?.max !== undefined && value > definition.config.max) {\r\n console.error(`Parameter '${name}' value ${value} is above maximum ${definition.config.max}`);\r\n return false;\r\n }\r\n break;\r\n case 'color':\r\n if (typeof value !== 'string' || !/^#[0-9A-Fa-f]{6}$/.test(value)) {\r\n console.error(`Parameter '${name}' must be a valid hex color, got: ${value}`);\r\n return false;\r\n }\r\n break;\r\n case 'toggle':\r\n if (typeof value !== 'boolean') {\r\n console.error(`Parameter '${name}' must be a boolean, got: ${value}`);\r\n return false;\r\n }\r\n break;\r\n case 'select':\r\n if (!definition.config?.options || !definition.config.options.includes(value as string & number)) {\r\n console.error(`Parameter '${name}' value ${value} is not in options: ${definition.config?.options}`);\r\n return false;\r\n }\r\n break;\r\n case 'text':\r\n if (typeof value !== 'string') {\r\n console.error(`Parameter '${name}' must be a string, got: ${value}`);\r\n return false;\r\n }\r\n if (definition.config?.maxLength && value.length > definition.config.maxLength) {\r\n console.error(`Parameter '${name}' text too long: ${value.length} > ${definition.config.maxLength}`);\r\n return false;\r\n }\r\n break;\r\n case 'image':\r\n // Image parameters can be null, ImageBitmap, or OffscreenCanvas\r\n if (value !== null && !(value instanceof ImageBitmap) && !(value instanceof OffscreenCanvas)) {\r\n console.error(`Parameter '${name}' must be null, ImageBitmap, or OffscreenCanvas, got: ${value}`);\r\n return false;\r\n }\r\n break;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n // Reset parameter state (called when loading new scene)\r\n public resetParameterState(): void {\r\n this.parametersDefined = false;\r\n this.initialValuesSynced = false;\r\n this.parameterDefinitions.clear();\r\n this.parameterGroups.clear();\r\n this.parameterValues.clear();\r\n this.parameterObjects.clear();\r\n }\r\n\r\n // Send all parameters (from helper functions) to host\r\n public sendAllParametersToHost(): void {\r\n // Don't send if already sent or if no parameters defined\r\n if (this.parametersDefined || this.parameterDefinitions.size === 0) {\r\n return;\r\n }\r\n\r\n try {\r\n // Group parameters by their group property\r\n const groups = new Map<string, ParameterGroup>();\r\n\r\n for (const [paramName, paramDef] of this.parameterDefinitions) {\r\n const groupName = paramDef.group || 'general';\r\n \r\n if (!groups.has(groupName)) {\r\n // Use the parameter's category if available, otherwise default to 'general'\r\n const category = paramDef.category || 'general';\r\n groups.set(groupName, {\r\n groupName,\r\n category,\r\n parameters: {}\r\n });\r\n }\r\n\r\n const group = groups.get(groupName)!;\r\n group.parameters[paramName] = paramDef;\r\n }\r\n\r\n this.parametersDefined = true;\r\n\r\n // Send parameter definitions to host for UI generation\r\n this.postMessageCallback('parameters-defined', {\r\n groups: Array.from(groups.values())\r\n });\r\n\r\n this.debugLog(`All parameters sent to host: ${this.parameterDefinitions.size} parameters in ${groups.size} groups`);\r\n } catch (error) {\r\n this.postMessageCallback('parameter-validation-error', {\r\n message: `Failed to send parameters to host: ${(error as Error).message}`,\r\n code: 'PARAMETER_SENDING_ERROR'\r\n });\r\n }\r\n }\r\n\r\n // Mark initial values as synced\r\n public markInitialValuesSynced(): void {\r\n this.initialValuesSynced = true;\r\n }\r\n\r\n // Get parameter count for performance reporting\r\n public getParameterCount(): number {\r\n return this.parameterDefinitions.size;\r\n }\r\n\r\n // Get all parameter objects (for P5 adapter to add .p5 properties)\r\n public getAllParameterObjects(): Map<string, any> {\r\n return this.parameterObjects;\r\n }\r\n} ","import { MouseAPI, KeyboardAPI, TouchAPI, TouchPoint } from '../types/index.js';\r\n\r\n/**\r\n * Manages user interaction state and APIs for the worker runtime.\r\n * Handles mouse, keyboard, and touch input processing for Phase 7.\r\n * \r\n * This system provides:\r\n * - Real-time interaction state management\r\n * - Frame-based event processing\r\n * - Clean API generation for artist code\r\n * - Message handling for interaction updates\r\n */\r\nexport class InteractionSystem {\r\n // Interaction enabled state\r\n private isEnabled: boolean = true;\r\n\r\n // Mouse interaction state\r\n private mouseState: MouseAPI = {\r\n x: 0, y: 0,\r\n isInCanvas: false,\r\n isPressed: false,\r\n leftButton: false,\r\n rightButton: false,\r\n middleButton: false,\r\n velocity: { x: 0, y: 0 },\r\n deltaX: 0,\r\n deltaY: 0,\r\n wheelDelta: 0,\r\n wheelX: 0,\r\n wheelY: 0,\r\n wasPressed: false,\r\n wasReleased: false,\r\n wasMoved: false\r\n };\r\n\r\n // Keyboard interaction state\r\n private keyboardState: KeyboardAPI = {\r\n isPressed: (key: string) => this.keyboardState.activeKeys.has(key.toLowerCase()),\r\n wasPressed: (key: string) => this.keyboardState.pressedThisFrame.has(key.toLowerCase()),\r\n wasReleased: (key: string) => this.keyboardState.releasedThisFrame.has(key.toLowerCase()),\r\n activeKeys: new Set<string>(),\r\n pressedThisFrame: new Set<string>(),\r\n releasedThisFrame: new Set<string>(),\r\n lastKeyPressed: '',\r\n lastKeyReleased: '',\r\n shift: false,\r\n ctrl: false,\r\n alt: false,\r\n meta: false\r\n };\r\n\r\n // Touch interaction state\r\n private touchState: TouchAPI = {\r\n points: [],\r\n count: 0,\r\n started: [],\r\n moved: [],\r\n ended: [],\r\n primary: null,\r\n gestures: {\r\n isPinching: false,\r\n isRotating: false,\r\n isPanning: false,\r\n isTapping: false,\r\n pinchScale: 1,\r\n pinchDelta: 0,\r\n rotationAngle: 0,\r\n rotationDelta: 0,\r\n panDelta: { x: 0, y: 0 },\r\n tapCount: 0,\r\n lastTapTime: 0,\r\n tapPosition: null\r\n }\r\n };\r\n\r\n constructor() {\r\n // Bind methods for proper context when used as callbacks\r\n this.handleMouseUpdate = this.handleMouseUpdate.bind(this);\r\n this.handleKeyboardUpdate = this.handleKeyboardUpdate.bind(this);\r\n this.handleTouchUpdate = this.handleTouchUpdate.bind(this);\r\n this.frameStart = this.frameStart.bind(this);\r\n }\r\n\r\n /**\r\n * Get the interaction APIs for inclusion in the viji object\r\n */\r\n public getInteractionAPIs() {\r\n return {\r\n mouse: this.mouseState,\r\n keyboard: this.keyboardState,\r\n touches: this.touchState\r\n };\r\n }\r\n\r\n /**\r\n * Called at the start of each frame to reset frame-based events\r\n */\r\n public frameStart(): void {\r\n // Reset mouse frame events\r\n this.mouseState.wasPressed = false;\r\n this.mouseState.wasReleased = false;\r\n this.mouseState.wasMoved = false;\r\n this.mouseState.wheelDelta = 0;\r\n this.mouseState.wheelX = 0;\r\n this.mouseState.wheelY = 0;\r\n\r\n // Reset keyboard frame events\r\n this.keyboardState.pressedThisFrame.clear();\r\n this.keyboardState.releasedThisFrame.clear();\r\n\r\n // Reset touch frame events\r\n this.touchState.started = [];\r\n this.touchState.moved = [];\r\n this.touchState.ended = [];\r\n this.touchState.gestures.isTapping = false;\r\n this.touchState.gestures.pinchDelta = 0;\r\n this.touchState.gestures.rotationDelta = 0;\r\n }\r\n\r\n /**\r\n * Handle mouse update messages from the host\r\n */\r\n public handleMouseUpdate(data: {\r\n x: number;\r\n y: number;\r\n buttons: number;\r\n deltaX: number;\r\n deltaY: number;\r\n wheelDeltaX: number;\r\n wheelDeltaY: number;\r\n isInCanvas?: boolean;\r\n timestamp: number;\r\n wasPressed?: boolean;\r\n wasReleased?: boolean;\r\n }): void {\r\n // Skip processing if interactions are disabled\r\n if (!this.isEnabled) return;\r\n // Update mouse position and button states\r\n this.mouseState.x = data.x;\r\n this.mouseState.y = data.y;\r\n this.mouseState.isInCanvas = data.isInCanvas !== undefined ? data.isInCanvas : true;\r\n this.mouseState.leftButton = (data.buttons & 1) !== 0;\r\n this.mouseState.rightButton = (data.buttons & 2) !== 0;\r\n this.mouseState.middleButton = (data.buttons & 4) !== 0;\r\n this.mouseState.isPressed = data.buttons > 0;\r\n \r\n // Update movement deltas and wheel\r\n this.mouseState.deltaX = data.deltaX || 0;\r\n this.mouseState.deltaY = data.deltaY || 0;\r\n this.mouseState.wheelDelta = data.wheelDeltaY || 0;\r\n this.mouseState.wheelX = data.wheelDeltaX || 0;\r\n this.mouseState.wheelY = data.wheelDeltaY || 0;\r\n \r\n // Update velocity (smoothed in InteractionManager)\r\n this.mouseState.velocity.x = data.deltaX || 0;\r\n this.mouseState.velocity.y = data.deltaY || 0;\r\n \r\n // Frame-based events (calculated in InteractionManager or provided by host)\r\n this.mouseState.wasPressed = data.wasPressed || false;\r\n this.mouseState.wasReleased = data.wasReleased || false;\r\n this.mouseState.wasMoved = (data.deltaX !== 0 || data.deltaY !== 0);\r\n }\r\n\r\n /**\r\n * Handle keyboard update messages from the host\r\n */\r\n public handleKeyboardUpdate(data: {\r\n type: 'keydown' | 'keyup';\r\n key: string;\r\n code: string;\r\n shiftKey: boolean;\r\n ctrlKey: boolean;\r\n altKey: boolean;\r\n metaKey: boolean;\r\n timestamp: number;\r\n }): void {\r\n // Skip processing if interactions are disabled\r\n if (!this.isEnabled) return;\r\n const key = data.key.toLowerCase();\r\n \r\n if (data.type === 'keydown') {\r\n if (!this.keyboardState.activeKeys.has(key)) {\r\n this.keyboardState.activeKeys.add(key);\r\n this.keyboardState.pressedThisFrame.add(key);\r\n this.keyboardState.lastKeyPressed = data.key;\r\n }\r\n } else if (data.type === 'keyup') {\r\n this.keyboardState.activeKeys.delete(key);\r\n this.keyboardState.releasedThisFrame.add(key);\r\n this.keyboardState.lastKeyReleased = data.key;\r\n }\r\n \r\n // Update modifier keys\r\n this.keyboardState.shift = data.shiftKey;\r\n this.keyboardState.ctrl = data.ctrlKey;\r\n this.keyboardState.alt = data.altKey;\r\n this.keyboardState.meta = data.metaKey;\r\n }\r\n\r\n /**\r\n * Handle touch update messages from the host\r\n */\r\n public handleTouchUpdate(data: {\r\n type: 'touchstart' | 'touchmove' | 'touchend' | 'touchcancel';\r\n touches: Array<{\r\n identifier: number;\r\n clientX: number;\r\n clientY: number;\r\n pressure: number;\r\n radiusX: number;\r\n radiusY: number;\r\n rotationAngle: number;\r\n force: number;\r\n }>;\r\n timestamp: number;\r\n }): void {\r\n // Skip processing if interactions are disabled\r\n if (!this.isEnabled) return;\r\n // Clear frame-based touch events\r\n this.touchState.started = [];\r\n this.touchState.moved = [];\r\n this.touchState.ended = [];\r\n \r\n // Convert touch data to our TouchPoint format\r\n const touches: TouchPoint[] = data.touches.map((touch) => ({\r\n id: touch.identifier,\r\n x: touch.clientX,\r\n y: touch.clientY,\r\n pressure: touch.pressure || 0,\r\n radius: Math.max(touch.radiusX || 0, touch.radiusY || 0),\r\n radiusX: touch.radiusX || 0,\r\n radiusY: touch.radiusY || 0,\r\n rotationAngle: touch.rotationAngle || 0,\r\n force: touch.force || touch.pressure || 0,\r\n deltaX: 0, // Could be calculated if we track previous positions\r\n deltaY: 0,\r\n velocity: { x: 0, y: 0 }, // Could be calculated if we track movement\r\n isNew: data.type === 'touchstart',\r\n isActive: true,\r\n isEnding: data.type === 'touchend' || data.type === 'touchcancel'\r\n }));\r\n \r\n // Update touch state\r\n this.touchState.points = touches;\r\n this.touchState.count = touches.length;\r\n this.touchState.primary = touches[0] || null;\r\n \r\n // Set frame-based events based on message type\r\n if (data.type === 'touchstart') {\r\n this.touchState.started = touches;\r\n } else if (data.type === 'touchmove') {\r\n this.touchState.moved = touches;\r\n } else if (data.type === 'touchend' || data.type === 'touchcancel') {\r\n this.touchState.ended = touches;\r\n }\r\n \r\n // Note: Advanced gesture recognition is handled in the InteractionManager\r\n // on the host side. For now, we provide basic gesture state structure.\r\n // In the future, we could move gesture recognition here or receive \r\n // gesture data from the host.\r\n this.touchState.gestures = {\r\n isPinching: false,\r\n isRotating: false,\r\n isPanning: false,\r\n isTapping: false,\r\n pinchScale: 1,\r\n pinchDelta: 0,\r\n rotationAngle: 0,\r\n rotationDelta: 0,\r\n panDelta: { x: 0, y: 0 },\r\n tapCount: 0,\r\n lastTapTime: 0,\r\n tapPosition: null\r\n };\r\n }\r\n\r\n /**\r\n * Reset all interaction state (called when loading new scene)\r\n */\r\n public resetInteractionState(): void {\r\n // Reset mouse state\r\n Object.assign(this.mouseState, {\r\n x: 0, y: 0,\r\n isInCanvas: false,\r\n isPressed: false,\r\n leftButton: false,\r\n rightButton: false,\r\n middleButton: false,\r\n velocity: { x: 0, y: 0 },\r\n deltaX: 0,\r\n deltaY: 0,\r\n wheelDelta: 0,\r\n wheelX: 0,\r\n wheelY: 0,\r\n wasPressed: false,\r\n wasReleased: false,\r\n wasMoved: false\r\n });\r\n\r\n // Reset keyboard state\r\n this.keyboardState.activeKeys.clear();\r\n this.keyboardState.pressedThisFrame.clear();\r\n this.keyboardState.releasedThisFrame.clear();\r\n this.keyboardState.lastKeyPressed = '';\r\n this.keyboardState.lastKeyReleased = '';\r\n this.keyboardState.shift = false;\r\n this.keyboardState.ctrl = false;\r\n this.keyboardState.alt = false;\r\n this.keyboardState.meta = false;\r\n\r\n // Reset touch state\r\n this.touchState.points = [];\r\n this.touchState.count = 0;\r\n this.touchState.started = [];\r\n this.touchState.moved = [];\r\n this.touchState.ended = [];\r\n this.touchState.primary = null;\r\n Object.assign(this.touchState.gestures, {\r\n isPinching: false,\r\n isRotating: false,\r\n isPanning: false,\r\n isTapping: false,\r\n pinchScale: 1,\r\n pinchDelta: 0,\r\n rotationAngle: 0,\r\n rotationDelta: 0,\r\n panDelta: { x: 0, y: 0 },\r\n tapCount: 0,\r\n lastTapTime: 0,\r\n tapPosition: null\r\n });\r\n }\r\n\r\n /**\r\n * Enable or disable interaction processing\r\n */\r\n public setInteractionEnabled(enabled: boolean): void {\r\n this.isEnabled = enabled;\r\n \r\n // If disabled, reset all interaction states to prevent stale data\r\n if (!enabled) {\r\n this.resetInteractionStates();\r\n }\r\n }\r\n\r\n /**\r\n * Get current interaction enabled state\r\n */\r\n public getInteractionEnabled(): boolean {\r\n return this.isEnabled;\r\n }\r\n\r\n /**\r\n * Reset all interaction states to default values\r\n */\r\n private resetInteractionStates(): void {\r\n // Reset mouse state\r\n this.mouseState.x = 0;\r\n this.mouseState.y = 0;\r\n this.mouseState.isInCanvas = false;\r\n this.mouseState.isPressed = false;\r\n this.mouseState.leftButton = false;\r\n this.mouseState.rightButton = false;\r\n this.mouseState.middleButton = false;\r\n this.mouseState.velocity.x = 0;\r\n this.mouseState.velocity.y = 0;\r\n this.mouseState.deltaX = 0;\r\n this.mouseState.deltaY = 0;\r\n this.mouseState.wheelDelta = 0;\r\n this.mouseState.wheelX = 0;\r\n this.mouseState.wheelY = 0;\r\n this.mouseState.wasPressed = false;\r\n this.mouseState.wasReleased = false;\r\n this.mouseState.wasMoved = false;\r\n\r\n // Reset keyboard state\r\n this.keyboardState.activeKeys.clear();\r\n this.keyboardState.pressedThisFrame.clear();\r\n this.keyboardState.releasedThisFrame.clear();\r\n this.keyboardState.lastKeyPressed = '';\r\n this.keyboardState.lastKeyReleased = '';\r\n this.keyboardState.shift = false;\r\n this.keyboardState.ctrl = false;\r\n this.keyboardState.alt = false;\r\n this.keyboardState.meta = false;\r\n\r\n // Reset touch state\r\n this.touchState.points = [];\r\n this.touchState.count = 0;\r\n this.touchState.started = [];\r\n this.touchState.moved = [];\r\n this.touchState.ended = [];\r\n this.touchState.primary = null;\r\n this.touchState.gestures.isPinching = false;\r\n this.touchState.gestures.isRotating = false;\r\n this.touchState.gestures.isPanning = false;\r\n this.touchState.gestures.isTapping = false;\r\n this.touchState.gestures.pinchScale = 1;\r\n this.touchState.gestures.pinchDelta = 0;\r\n this.touchState.gestures.rotationAngle = 0;\r\n this.touchState.gestures.rotationDelta = 0;\r\n this.touchState.gestures.panDelta = { x: 0, y: 0 };\r\n this.touchState.gestures.tapCount = 0;\r\n this.touchState.gestures.lastTapTime = 0;\r\n this.touchState.gestures.tapPosition = null;\r\n }\r\n} ","/**\n * Computer Vision System for Phase 11 - MediaPipe Tasks Vision Integration\n * \n * Handles face detection, hand tracking, pose detection, and body segmentation\n * using MediaPipe Tasks Vision with selective activation and automatic cleanup.\n * \n * Architecture:\n * - Selective loading: Only load MediaPipe models when features are activated\n * - Frame-rate tied: CV processing tied to scene processing rate with configurable divisors\n * - Non-blocking: CV processing with timeout prevents blocking scene rendering\n * - Automatic cleanup: Clear results when features are deactivated\n */\n\nimport type {\n CVFeature,\n CVFrameRateMode,\n FaceData,\n HandData,\n PoseData,\n SegmentationData,\n CVProcessingStats,\n CVWorkerInitMessage,\n CVWorkerConfigMessage,\n CVWorkerProcessMessage,\n CVWorkerResultMessage\n} from '../types/index.js';\n// Use classic worker for MediaPipe compatibility\n// import CVTasksWorker from './cv-tasks.worker.ts?worker&module';\n\nexport class CVSystem {\n // MediaPipe Tasks Vision worker\n private cvWorker: Worker | null = null;\n private workerRestartCount = 0;\n private maxWorkerRestarts = 3;\n private workerLastRestart = 0;\n private workerRestartCooldown = 5000; // 5 seconds\n \n // Feature activation state\n private activeFeatures: Set<CVFeature> = new Set();\n private pendingFeatures: Set<CVFeature> = new Set(); // Features to restore after restart\n \n // CV Results cache (for non-blocking processing)\n private results = {\n faces: [] as FaceData[],\n hands: [] as HandData[], \n pose: null as PoseData | null,\n segmentation: null as SegmentationData | null\n };\n \n // Processing state and performance tracking\n private processing = false;\n private cvFrameCounter = 0;\n private cvFrameRateMode: CVFrameRateMode = 'quarter'; // Default: 1/4 scene rate\n private sceneTargetFPS = 60; // Will be updated from scene processing rate\n private processingStartTime = 0;\n private processingTimes: number[] = [];\n \n // CV Frame Rate Tracking (similar to main core)\n private cvFrameTimes: number[] = [];\n private lastCVFrameTime = 0;\n private actualCVFPS = 0;\n \n private debugMode = false; // Debug mode disabled for production\n\n constructor() {\n this.debugLog('🔧 CVSystem initialized for MediaPipe Tasks Vision');\n }\n\n private debugLog(...args: any[]): void {\n if (this.debugMode) {\n console.log('🔧 [CVSystem]', ...args);\n }\n }\n\n setDebugMode(enabled: boolean): void {\n this.debugMode = enabled;\n this.debugLog(`Debug mode ${enabled ? 'enabled' : 'disabled'}`);\n }\n\n /**\n * Update CV frame rate configuration (called from worker)\n */\n updateCVFrameRate(mode: CVFrameRateMode, sceneTargetFPS: number): void {\n this.cvFrameRateMode = mode;\n this.sceneTargetFPS = sceneTargetFPS;\n \n this.debugLog(`CV frame rate updated: mode=${mode}, sceneTargetFPS=${sceneTargetFPS}`);\n }\n\n /**\n * Initialize MediaPipe Tasks Vision worker\n */\n private async ensureCVWorker(): Promise<void> {\n if (this.cvWorker) return;\n\n try {\n this.debugLog('🔧 Creating MediaPipe Tasks Vision worker...');\n // Use classic worker to support MediaPipe's importScripts usage\n const workerUrl = '/dist/assets/cv-tasks.worker.js';\n this.cvWorker = new Worker(workerUrl);\n \n this.cvWorker.addEventListener('message', (evt) => {\n const msg = evt.data as CVWorkerResultMessage;\n this.debugLog(`📨 [CV Worker -> CVSystem] ${msg.type}`, msg.success ? msg.data : msg.error);\n });\n \n this.cvWorker.onerror = (err) => {\n this.debugLog('❌ CV worker error event', err.message);\n this.handleWorkerFailure(`Worker error: ${err.message}`);\n };\n \n this.cvWorker.onmessageerror = (err) => {\n this.debugLog('❌ CV worker message error', err);\n this.handleWorkerFailure('Worker message error');\n };\n\n // Initialize the worker\n await this.postToCV('init', {});\n this.debugLog('✅ CV worker initialized');\n } catch (error) {\n this.debugLog('❌ Failed to initialize CV worker:', error);\n throw error;\n }\n }\n\n /**\n * Handle worker failure and attempt restart\n */\n private async handleWorkerFailure(reason: string): Promise<void> {\n this.debugLog(`⚠️ CV Worker failure: ${reason}`);\n \n // Terminate current worker\n if (this.cvWorker) {\n this.cvWorker.terminate();\n this.cvWorker = null;\n }\n \n // Check restart limits and cooldown\n const now = Date.now();\n if (this.workerRestartCount >= this.maxWorkerRestarts) {\n this.debugLog('❌ Max worker restarts exceeded, giving up');\n return;\n }\n \n if (now - this.workerLastRestart < this.workerRestartCooldown) {\n this.debugLog('⏱️ Worker restart cooldown active, skipping restart');\n return;\n }\n \n // Save current features for restoration\n this.pendingFeatures = new Set(this.activeFeatures);\n this.activeFeatures.clear();\n \n // Attempt restart\n try {\n this.workerRestartCount++;\n this.workerLastRestart = now;\n \n this.debugLog(`🔄 Restarting CV worker (attempt ${this.workerRestartCount}/${this.maxWorkerRestarts})`);\n \n // Recreate worker\n await this.ensureCVWorker();\n \n // Restore features\n if (this.pendingFeatures.size > 0) {\n const featuresToRestore = Array.from(this.pendingFeatures);\n this.debugLog(`🔄 Restoring features: [${featuresToRestore.join(', ')}]`);\n \n try {\n await this.postToCV('config', { features: featuresToRestore });\n this.activeFeatures = new Set(this.pendingFeatures);\n this.debugLog('✅ Features restored successfully');\n } catch (error) {\n this.debugLog('❌ Failed to restore features:', error);\n }\n \n this.pendingFeatures.clear();\n }\n \n this.debugLog('✅ CV worker restarted successfully');\n } catch (error) {\n this.debugLog('❌ Failed to restart CV worker:', error);\n }\n }\n\n /**\n * Send message to CV worker and wait for response\n */\n private postToCV(type: string, data?: any, transfer?: Transferable[]): Promise<any> {\n return new Promise((resolve, reject) => {\n if (!this.cvWorker) {\n return reject(new Error('CV worker not initialized'));\n }\n\n const timeout = setTimeout(() => {\n this.debugLog(`⏱️ [CV Worker] timeout for ${type}`);\n // On timeout, attempt worker restart for config messages\n if (type === 'config') {\n this.handleWorkerFailure(`Timeout for ${type} message`);\n }\n reject(new Error(`CV worker timeout for ${type}`));\n }, 5000);\n\n const onMessage = (ev: MessageEvent) => {\n const msg = ev.data as CVWorkerResultMessage & { restartRequired?: boolean };\n \n if (msg.type === 'result') {\n clearTimeout(timeout);\n this.cvWorker!.removeEventListener('message', onMessage);\n \n if (msg.success) {\n this.debugLog(`✅ [CV Worker] response for ${type}`, msg.data);\n resolve(msg.data);\n } else {\n this.debugLog(`❌ [CV Worker] error response for ${type}`, msg.error);\n \n // Check if worker restart is required\n if (msg.restartRequired) {\n this.handleWorkerFailure(`Worker reported restart required: ${msg.error}`);\n }\n \n reject(new Error(msg.error || 'CV worker error'));\n }\n }\n };\n\n this.cvWorker.addEventListener('message', onMessage);\n \n const message: CVWorkerInitMessage | CVWorkerConfigMessage | CVWorkerProcessMessage = {\n type: type as any,\n ...data\n };\n \n this.debugLog(`📤 [CVSystem -> CV Worker] ${type}`, data);\n this.cvWorker.postMessage(message, transfer || []);\n });\n }\n\n /**\n * Enable face detection feature (bounding boxes only)\n */\n async enableFaceDetection(): Promise<void> {\n if (this.activeFeatures.has('faceDetection')) return;\n \n try {\n this.debugLog('🔧 Enabling face detection...');\n \n // Check WebGL context availability before enabling\n if (this.activeFeatures.size >= 3 && !this.checkWebGLContextAvailability()) {\n this.debugLog('⚠️ Warning: WebGL contexts may be running low. Consider disabling unused CV features.');\n }\n \n await this.ensureCVWorker();\n \n const newFeatures = Array.from(this.activeFeatures).concat(['faceDetection']);\n await this.postToCV('config', { features: newFeatures });\n \n this.activeFeatures.add('faceDetection');\n this.debugLog('✅ Face detection enabled');\n } catch (error) {\n this.debugLog('❌ Failed to enable face detection:', error);\n throw error;\n }\n }\n\n /**\n * Disable face detection and cleanup\n */\n async disableFaceDetection(): Promise<void> {\n if (!this.activeFeatures.has('faceDetection')) return;\n \n try {\n this.debugLog('🔧 Disabling face detection...');\n \n this.activeFeatures.delete('faceDetection');\n // Clear faces results if no face-related features are active\n if (!this.activeFeatures.has('faceMesh')) {\n this.results.faces = [];\n }\n \n const newFeatures = Array.from(this.activeFeatures);\n await this.postToCV('config', { features: newFeatures });\n \n this.debugLog('✅ Face detection disabled and cleaned up');\n } catch (error) {\n this.debugLog('❌ Failed to disable face detection:', error);\n throw error;\n }\n }\n\n /**\n * Enable face mesh feature (468-point facial landmarks)\n */\n async enableFaceMesh(): Promise<void> {\n if (this.activeFeatures.has('faceMesh')) return;\n \n try {\n this.debugLog('🔧 Enabling face mesh...');\n \n // Check WebGL context availability before enabling\n if (this.activeFeatures.size >= 3 && !this.checkWebGLContextAvailability()) {\n this.debugLog('⚠️ Warning: WebGL contexts may be running low. Consider disabling unused CV features.');\n }\n \n await this.ensureCVWorker();\n \n const newFeatures = Array.from(this.activeFeatures).concat(['faceMesh']);\n await this.postToCV('config', { features: newFeatures });\n \n this.activeFeatures.add('faceMesh');\n this.debugLog('✅ Face mesh enabled');\n } catch (error) {\n this.debugLog('❌ Failed to enable face mesh:', error);\n throw error;\n }\n }\n\n /**\n * Disable face mesh and cleanup\n */\n async disableFaceMesh(): Promise<void> {\n if (!this.activeFeatures.has('faceMesh')) return;\n \n try {\n this.debugLog('🔧 Disabling face mesh...');\n \n this.activeFeatures.delete('faceMesh');\n // Clear faces results if no face-related features are active\n if (!this.activeFeatures.has('faceDetection')) {\n this.results.faces = [];\n }\n \n const newFeatures = Array.from(this.activeFeatures);\n await this.postToCV('config', { features: newFeatures });\n \n this.debugLog('✅ Face mesh disabled and cleaned up');\n } catch (error) {\n this.debugLog('❌ Failed to disable face mesh:', error);\n throw error;\n }\n }\n\n /**\n * Enable hand tracking feature\n */\n async enableHandTracking(): Promise<void> {\n if (this.activeFeatures.has('handTracking')) return;\n \n try {\n this.debugLog('🔧 Enabling hand tracking...');\n await this.ensureCVWorker();\n \n const newFeatures = Array.from(this.activeFeatures).concat(['handTracking']);\n await this.postToCV('config', { features: newFeatures });\n \n this.activeFeatures.add('handTracking');\n this.debugLog('✅ Hand tracking enabled');\n } catch (error) {\n this.debugLog('❌ Failed to enable hand tracking:', error);\n throw error;\n }\n }\n\n /**\n * Disable hand tracking and cleanup\n */\n async disableHandTracking(): Promise<void> {\n if (!this.activeFeatures.has('handTracking')) return;\n \n try {\n this.debugLog('🔧 Disabling hand tracking...');\n \n this.activeFeatures.delete('handTracking');\n this.results.hands = [];\n \n const newFeatures = Array.from(this.activeFeatures);\n await this.postToCV('config', { features: newFeatures });\n \n this.debugLog('✅ Hand tracking disabled and cleaned up');\n } catch (error) {\n this.debugLog('❌ Failed to disable hand tracking:', error);\n throw error;\n }\n }\n\n /**\n * Enable pose detection feature\n */\n async enablePoseDetection(): Promise<void> {\n if (this.activeFeatures.has('poseDetection')) return;\n \n try {\n this.debugLog('🔧 Enabling pose detection...');\n await this.ensureCVWorker();\n \n const newFeatures = Array.from(this.activeFeatures).concat(['poseDetection']);\n await this.postToCV('config', { features: newFeatures });\n \n this.activeFeatures.add('poseDetection');\n this.debugLog('✅ Pose detection enabled');\n } catch (error) {\n this.debugLog('❌ Failed to enable pose detection:', error);\n throw error;\n }\n }\n\n /**\n * Disable pose detection and cleanup\n */\n async disablePoseDetection(): Promise<void> {\n if (!this.activeFeatures.has('poseDetection')) return;\n \n try {\n this.debugLog('🔧 Disabling pose detection...');\n \n this.activeFeatures.delete('poseDetection');\n this.results.pose = null;\n \n const newFeatures = Array.from(this.activeFeatures);\n await this.postToCV('config', { features: newFeatures });\n \n this.debugLog('✅ Pose detection disabled and cleaned up');\n } catch (error) {\n this.debugLog('❌ Failed to disable pose detection:', error);\n throw error;\n }\n }\n\n /**\n * Enable body segmentation feature\n */\n async enableBodySegmentation(): Promise<void> {\n if (this.activeFeatures.has('bodySegmentation')) return;\n \n try {\n this.debugLog('🔧 Enabling body segmentation...');\n await this.ensureCVWorker();\n \n const newFeatures = Array.from(this.activeFeatures).concat(['bodySegmentation']);\n await this.postToCV('config', { features: newFeatures });\n \n this.activeFeatures.add('bodySegmentation');\n this.debugLog('✅ Body segmentation enabled');\n } catch (error) {\n this.debugLog('❌ Failed to enable body segmentation:', error);\n throw error;\n }\n }\n\n /**\n * Disable body segmentation and cleanup\n */\n async disableBodySegmentation(): Promise<void> {\n if (!this.activeFeatures.has('bodySegmentation')) return;\n \n try {\n this.debugLog('🔧 Disabling body segmentation...');\n \n this.activeFeatures.delete('bodySegmentation');\n this.results.segmentation = null;\n \n const newFeatures = Array.from(this.activeFeatures);\n await this.postToCV('config', { features: newFeatures });\n \n this.debugLog('✅ Body segmentation disabled and cleaned up');\n } catch (error) {\n this.debugLog('❌ Failed to disable body segmentation:', error);\n throw error;\n }\n }\n\n /**\n * Process video frame with active CV features\n */\n async processFrame(bitmap: ImageBitmap): Promise<void> {\n if (this.processing || this.activeFeatures.size === 0) {\n return; // Skip if already processing or no features active\n }\n\n // Check if we should process this frame based on CV frame rate\n this.cvFrameCounter++;\n const shouldProcess = this.shouldProcessFrame();\n \n if (!shouldProcess) {\n return;\n }\n\n this.processing = true;\n this.processingStartTime = performance.now();\n \n // Track CV frame rate (similar to main core)\n this.trackCVFrameRate();\n \n this.debugLog(`🎬 Processing frame ${this.cvFrameCounter} with features:`, Array.from(this.activeFeatures));\n\n try {\n const features = Array.from(this.activeFeatures);\n const timestamp = performance.now();\n \n // Process with timeout to prevent blocking\n const processPromise = this.postToCV('process', {\n bitmap: bitmap,\n timestamp: timestamp,\n features: features\n }, [bitmap]);\n\n const timeoutPromise = new Promise((_, reject) => {\n setTimeout(() => reject(new Error('CV processing timeout')), 500); // Increased timeout for MediaPipe\n });\n\n const results = await Promise.race([processPromise, timeoutPromise]);\n \n // Update results cache (only if features are still active to prevent race conditions)\n if (results.faces && (this.activeFeatures.has('faceDetection') || this.activeFeatures.has('faceMesh'))) {\n this.results.faces = results.faces;\n this.debugLog(`📥 Received ${results.faces.length} face results`);\n }\n if (results.hands && this.activeFeatures.has('handTracking')) {\n this.results.hands = results.hands;\n this.debugLog(`📥 Received ${results.hands.length} hand results`);\n }\n if (results.pose && this.activeFeatures.has('poseDetection')) {\n this.results.pose = results.pose;\n this.debugLog(`📥 Received pose results with ${results.pose.landmarks.length} landmarks`);\n }\n if (results.segmentation && this.activeFeatures.has('bodySegmentation')) {\n this.results.segmentation = results.segmentation;\n this.debugLog(`📥 Received segmentation results ${results.segmentation.width}x${results.segmentation.height}`);\n }\n\n // Track processing time\n const processingTime = performance.now() - this.processingStartTime;\n this.processingTimes.push(processingTime);\n if (this.processingTimes.length > 30) {\n this.processingTimes.shift();\n }\n\n } catch (error) {\n this.debugLog('⚠️ CV processing failed:', error);\n // Keep previous results, don't clear cache\n } finally {\n this.processing = false;\n }\n }\n\n /**\n * Check if current frame should be processed based on CV frame rate mode\n */\n private shouldProcessFrame(): boolean {\n const divisor = this.getFrameRateDivisor();\n return this.cvFrameCounter % divisor === 0;\n }\n\n /**\n * Track CV processing frame rate (similar to main core)\n */\n private trackCVFrameRate(): void {\n const now = performance.now();\n \n if (this.lastCVFrameTime > 0) {\n const deltaTime = now - this.lastCVFrameTime;\n this.cvFrameTimes.push(deltaTime);\n \n // Keep only last 30 frame times for averaging\n if (this.cvFrameTimes.length > 30) {\n this.cvFrameTimes.shift();\n }\n \n // Calculate actual CV FPS\n if (this.cvFrameTimes.length > 0) {\n const avgDeltaTime = this.cvFrameTimes.reduce((a, b) => a + b, 0) / this.cvFrameTimes.length;\n this.actualCVFPS = Math.round(1000 / avgDeltaTime);\n }\n }\n \n this.lastCVFrameTime = now;\n }\n\n /**\n * Get frame rate divisor based on current mode\n */\n private getFrameRateDivisor(): number {\n switch (this.cvFrameRateMode) {\n case 'full': return 1;\n case 'half': return 2;\n case 'quarter': return 4;\n case 'eighth': return 8;\n default: return 4;\n }\n }\n\n /**\n * Get current CV results\n */\n getResults(): {\n faces: FaceData[];\n hands: HandData[];\n pose: PoseData | null;\n segmentation: SegmentationData | null;\n } {\n return { ...this.results };\n }\n\n /**\n * Get processing statistics\n */\n getStats(): CVProcessingStats {\n const avgProcessingTime = this.processingTimes.length > 0 \n ? this.processingTimes.reduce((a, b) => a + b, 0) / this.processingTimes.length \n : 0;\n\n const targetFPS = this.sceneTargetFPS / this.getFrameRateDivisor();\n\n return {\n activeFeatures: Array.from(this.activeFeatures),\n processingTime: avgProcessingTime,\n effectiveFPS: targetFPS,\n actualFPS: this.actualCVFPS, // Add actual measured CV FPS\n isProcessing: this.processing\n };\n }\n\n /**\n * Check WebGL context availability before enabling features\n */\n private checkWebGLContextAvailability(): boolean {\n try {\n const canvas = new OffscreenCanvas(1, 1);\n const gl = canvas.getContext('webgl');\n \n if (!gl) {\n this.debugLog('⚠️ WebGL contexts may be exhausted');\n return false;\n }\n \n // Clean up test context\n const ext = gl.getExtension('WEBGL_lose_context');\n if (ext) ext.loseContext();\n \n return true;\n } catch (error) {\n this.debugLog('⚠️ WebGL context check failed:', error);\n return false;\n }\n }\n\n /**\n * Get CV control interface for artist API\n */\n getControlInterface() {\n return {\n enableFaceDetection: (enabled?: boolean) => {\n if (enabled === false) {\n return this.disableFaceDetection();\n } else {\n return this.enableFaceDetection();\n }\n },\n disableFaceDetection: () => this.disableFaceDetection(),\n enableFaceMesh: (enabled?: boolean) => {\n if (enabled === false) {\n return this.disableFaceMesh();\n } else {\n return this.enableFaceMesh();\n }\n },\n disableFaceMesh: () => this.disableFaceMesh(),\n enableHandTracking: (enabled?: boolean) => {\n if (enabled === false) {\n return this.disableHandTracking();\n } else {\n return this.enableHandTracking();\n }\n },\n disableHandTracking: () => this.disableHandTracking(),\n enablePoseDetection: (enabled?: boolean) => {\n if (enabled === false) {\n return this.disablePoseDetection();\n } else {\n return this.enablePoseDetection();\n }\n },\n disablePoseDetection: () => this.disablePoseDetection(),\n enableBodySegmentation: (enabled?: boolean) => {\n if (enabled === false) {\n return this.disableBodySegmentation();\n } else {\n return this.enableBodySegmentation();\n }\n },\n disableBodySegmentation: () => this.disableBodySegmentation(),\n getActiveFeatures: () => Array.from(this.activeFeatures),\n isProcessing: () => this.processing,\n getStats: () => this.getStats(),\n getWorkerStatus: () => ({\n healthy: !!this.cvWorker,\n restartCount: this.workerRestartCount,\n maxRestarts: this.maxWorkerRestarts\n }),\n restartWorker: () => this.handleWorkerFailure('Manual restart requested'),\n \n // WebGL context monitoring\n checkWebGLAvailability: () => this.checkWebGLContextAvailability(),\n getResourceUsage: () => ({\n activeFeatures: this.activeFeatures.size,\n estimatedWebGLContexts: this.activeFeatures.size * 2, // ~2 contexts per feature\n webglAvailable: this.checkWebGLContextAvailability()\n })\n };\n }\n\n /**\n * Cleanup all CV resources\n */\n async cleanup(): Promise<void> {\n this.debugLog('🔧 Cleaning up CVSystem...');\n \n // Disable all features (triggers cleanup)\n for (const feature of Array.from(this.activeFeatures)) {\n switch (feature) {\n case 'faceDetection':\n await this.disableFaceDetection();\n break;\n case 'handTracking':\n await this.disableHandTracking();\n break;\n case 'poseDetection':\n await this.disablePoseDetection();\n break;\n case 'bodySegmentation':\n await this.disableBodySegmentation();\n break;\n }\n }\n\n // Close worker\n if (this.cvWorker) {\n this.cvWorker.terminate();\n this.cvWorker = null;\n }\n\n // Clear state\n this.activeFeatures.clear();\n this.pendingFeatures.clear();\n this.workerRestartCount = 0;\n this.results.faces = [];\n this.results.hands = [];\n this.results.pose = null;\n this.results.segmentation = null;\n this.processing = false;\n this.processingTimes = [];\n\n this.debugLog('✅ CVSystem cleanup complete');\n }\n}","/**\n * Worker-side Video System for Phase 10 & 11 - CORRECT OffscreenCanvas Implementation + CV Integration\n * \n * CORRECT Approach:\n * 1. Host creates OffscreenCanvas (no context!)\n * 2. Host transfers OffscreenCanvas to worker\n * 3. Worker receives OffscreenCanvas and gets context\n * 4. Host sends ImageBitmap frames to worker\n * 5. Worker draws ImageBitmap frames to its OffscreenCanvas\n * 6. Worker performs all analysis and effects on OffscreenCanvas\n * 7. CVSystem processes frames for computer vision features\n * \n * This provides:\n * - True worker-side processing with full GPU access\n * - Zero-copy OffscreenCanvas ownership transfer\n * - Optimal performance for CV and artist effects\n * - Proper separation: host = coordination, worker = processing + CV\n */\n\nimport { CVSystem } from './CVSystem.js';\nimport type { CVFrameRateMode } from '../types/index.js';\n\nexport class VideoSystem {\n // ✅ CORRECT: Worker-owned OffscreenCanvas (transferred from host)\n private offscreenCanvas: OffscreenCanvas | null = null;\n private ctx: OffscreenCanvasRenderingContext2D | null = null;\n private gl: WebGLRenderingContext | WebGL2RenderingContext | null = null;\n \n // CV processing helpers\n private cvScratchCanvas: OffscreenCanvas | null = null;\n private cvScratchContext: OffscreenCanvasRenderingContext2D | null = null;\n \n // Debug logging control\n private debugMode = false;\n \n // GPU-only mode flag (for shader compositor only - P5/Canvas need OffscreenCanvas)\n private directGPUMode = false;\n\n /**\n * Enable or disable debug logging\n */\n setDebugMode(enabled: boolean): void {\n this.debugMode = enabled;\n // Propagate to CVSystem\n if (this.cvSystem) {\n this.cvSystem.setDebugMode(enabled);\n }\n }\n\n /**\n * Debug logging helper\n */\n private debugLog(message: string, ...args: any[]): void {\n if (this.debugMode) {\n console.log(message, ...args);\n }\n }\n \n // Frame processing configuration\n private targetFrameRate = 30; // Default target FPS for video processing\n private lastFrameTime = 0;\n private frameInterval = 1000 / this.targetFrameRate; // ms between frames\n \n // Processing state\n private hasLoggedFirstFrame = false;\n private frameCount = 0;\n \n // Video state for artist API\n private videoState = {\n isConnected: false,\n currentFrame: null as OffscreenCanvas | ImageBitmap | null,\n frameWidth: 0,\n frameHeight: 0,\n frameRate: 0,\n frameData: null as ImageData | null\n };\n \n // Phase 11 - CV System Integration\n private cvSystem: CVSystem;\n\n constructor() {\n // VideoSystem ready for OffscreenCanvas processing + CV\n this.cvSystem = new CVSystem();\n }\n\n /**\n * Get the video API for inclusion in the viji object\n */\n public getVideoAPI() {\n const cvResults = this.cvSystem.getResults();\n \n // Grab the current frame\n const currentFrame = this.videoState.currentFrame;\n \n // For direct GPU mode: consume ImageBitmap after first access\n // (it will be closed after GPU upload, so can't be reused)\n if (this.directGPUMode && currentFrame instanceof ImageBitmap) {\n this.videoState.currentFrame = null;\n }\n \n return {\n isConnected: this.videoState.isConnected,\n currentFrame: currentFrame,\n frameWidth: this.videoState.frameWidth,\n frameHeight: this.videoState.frameHeight,\n frameRate: this.videoState.frameRate,\n getFrameData: () => this.videoState.frameData,\n \n // CV Results from CVSystem\n faces: cvResults.faces,\n hands: cvResults.hands,\n pose: cvResults.pose,\n segmentation: cvResults.segmentation,\n \n // CV Control Interface\n cv: this.cvSystem.getControlInterface()\n };\n }\n\n /**\n * ✅ CORRECT: Receive OffscreenCanvas transfer from host\n */\n public handleCanvasSetup(data: {\n offscreenCanvas: OffscreenCanvas;\n width: number;\n height: number;\n timestamp: number;\n }): void {\n try {\n // Clean up existing canvas\n this.disconnectVideo();\n \n // ✅ CORRECT: Receive transferred OffscreenCanvas\n this.offscreenCanvas = data.offscreenCanvas;\n \n // ✅ CORRECT: Get context on WORKER side (not host!)\n this.ctx = this.offscreenCanvas.getContext('2d', {\n willReadFrequently: true // Optimize for frequent getImageData calls\n });\n \n if (!this.ctx) {\n throw new Error('Failed to get 2D context from transferred OffscreenCanvas');\n }\n \n // Optional: Get WebGL context for advanced effects\n // Note: We can have multiple contexts on the same canvas\n try {\n this.gl = this.offscreenCanvas.getContext('webgl2') || this.offscreenCanvas.getContext('webgl');\n } catch (e) {\n // WebGL not available, continue with 2D\n this.debugLog('WebGL not available, using 2D context only');\n }\n \n // Update state\n this.videoState.isConnected = true;\n this.videoState.currentFrame = this.offscreenCanvas;\n this.videoState.frameWidth = data.width;\n this.videoState.frameHeight = data.height;\n this.frameCount = 0;\n this.hasLoggedFirstFrame = false;\n \n this.debugLog('✅ OffscreenCanvas received and setup completed (worker-side)', {\n width: data.width,\n height: data.height,\n hasWebGL: !!this.gl,\n targetFrameRate: this.targetFrameRate\n });\n \n this.debugLog('🎬 CORRECT OffscreenCanvas approach - Worker has full GPU access!');\n \n } catch (error) {\n console.error('Failed to setup OffscreenCanvas in worker:', error);\n this.disconnectVideo();\n }\n }\n\n /**\n * ✅ CORRECT: Receive ImageBitmap frame and draw to worker's OffscreenCanvas\n */\n public handleFrameUpdate(data: {\n imageBitmap: ImageBitmap;\n timestamp: number;\n }): void {\n if (!this.offscreenCanvas || !this.ctx) {\n console.warn('🔴 Received frame but OffscreenCanvas not setup');\n return;\n }\n \n try {\n // Log occasionally to avoid spam (very rarely now that it's working)\n if (this.frameCount % 150 === 0) { // Log every 150th frame (~5 seconds at 30fps)\n this.debugLog('✅ Worker received ImageBitmap frame:', {\n bitmapSize: `${data.imageBitmap.width}x${data.imageBitmap.height}`,\n canvasSize: `${this.offscreenCanvas.width}x${this.offscreenCanvas.height}`,\n frameCount: this.frameCount,\n timestamp: data.timestamp\n });\n }\n \n // ✅ CORRECT: Worker draws ImageBitmap to its OffscreenCanvas\n this.ctx.drawImage(data.imageBitmap, 0, 0, this.offscreenCanvas.width, this.offscreenCanvas.height);\n \n // Update frame processing\n this.processCurrentFrame(data.timestamp);\n \n // Close the transferred ImageBitmap to free memory\n data.imageBitmap.close();\n \n this.frameCount++;\n \n } catch (error) {\n console.error('🔴 Error processing video frame (worker-side):', error);\n }\n }\n\n /**\n * Process current frame (called when new frame is drawn)\n */\n private async processCurrentFrame(timestamp: number): Promise<void> {\n if (!this.offscreenCanvas || !this.ctx) {\n return;\n }\n \n try {\n // Get current frame data for analysis\n this.videoState.frameData = this.ctx.getImageData(\n 0, 0, \n this.offscreenCanvas.width, \n this.offscreenCanvas.height\n );\n \n // Calculate frame rate based on frame arrival\n const deltaTime = timestamp - this.lastFrameTime;\n this.videoState.frameRate = deltaTime > 0 ? 1000 / deltaTime : 0;\n \n // Log first successful frame processing (once)\n if (!this.hasLoggedFirstFrame) {\n this.debugLog(`🎯 Worker-side OffscreenCanvas processing active: ${this.videoState.frameRate.toFixed(1)} FPS (${this.offscreenCanvas.width}x${this.offscreenCanvas.height})`);\n this.debugLog('✅ Full GPU access available for custom effects and CV analysis');\n this.hasLoggedFirstFrame = true;\n }\n \n // Phase 11 - Perform CV analysis using CVSystem \n // 🚀 OPTIMIZED: Use createImageBitmap(ImageData) to keep artist canvas intact\n if (this.videoState.frameData) {\n try {\n // Fast path: create ImageBitmap directly from ImageData (no extra canvas)\n const bitmap = await createImageBitmap(this.videoState.frameData);\n this.cvSystem.processFrame(bitmap);\n // Success - no need to log every frame\n } catch (bitmapError) {\n this.debugLog('⚠️ createImageBitmap failed – falling back to reusable CV canvas:', bitmapError);\n \n // Lazy-init reusable canvas/context for legacy browsers that lack createImageBitmap support\n if (!this.cvScratchCanvas || !this.cvScratchContext ||\n this.cvScratchCanvas.width !== this.videoState.frameData.width ||\n this.cvScratchCanvas.height !== this.videoState.frameData.height) {\n this.cvScratchCanvas = new OffscreenCanvas(\n this.videoState.frameData.width,\n this.videoState.frameData.height\n );\n this.cvScratchContext = this.cvScratchCanvas.getContext('2d');\n if (!this.cvScratchContext) {\n throw new Error('Failed to get 2D context for CV fallback canvas');\n }\n }\n \n this.cvScratchContext.putImageData(this.videoState.frameData, 0, 0);\n const fallbackBitmap = this.cvScratchCanvas.transferToImageBitmap();\n this.cvSystem.processFrame(fallbackBitmap);\n }\n }\n \n this.lastFrameTime = timestamp;\n } catch (error) {\n console.error('Error processing video frame (worker-side):', error);\n }\n }\n\n /**\n * Handle video configuration updates (including disconnection and resize)\n */\n public handleVideoConfigUpdate(data: {\n targetFrameRate?: number;\n cvFrameRate?: { mode: CVFrameRateMode; sceneTargetFPS: number };\n width?: number;\n height?: number;\n disconnect?: boolean;\n timestamp: number;\n }): void {\n try {\n // Handle disconnection\n if (data.disconnect) {\n this.disconnectVideo();\n return;\n }\n \n // Handle resize\n if (data.width && data.height && this.offscreenCanvas) {\n this.resizeCanvas(data.width, data.height);\n }\n \n // Update processing configuration if provided\n if (data.targetFrameRate) {\n this.updateProcessingConfig(data.targetFrameRate);\n }\n \n // Phase 11 - CV frame rate configuration\n if (data.cvFrameRate) {\n this.updateCVFrameRate(data.cvFrameRate);\n }\n } catch (error) {\n console.error('Error handling video config update:', error);\n }\n }\n\n /**\n * Resize the OffscreenCanvas (when video dimensions change)\n */\n private resizeCanvas(width: number, height: number): void {\n if (!this.offscreenCanvas) return;\n \n try {\n // Resize the OffscreenCanvas\n this.offscreenCanvas.width = width;\n this.offscreenCanvas.height = height;\n \n // Update state\n this.videoState.frameWidth = width;\n this.videoState.frameHeight = height;\n \n // Reset WebGL viewport if available\n if (this.gl) {\n this.gl.viewport(0, 0, width, height);\n }\n \n this.debugLog(`📐 OffscreenCanvas resized to ${width}x${height} (worker-side)`);\n \n } catch (error) {\n console.error('Error resizing OffscreenCanvas:', error);\n }\n }\n\n /**\n * Disconnect video and clean up resources\n */\n private disconnectVideo(): void {\n // ✅ Clear the OffscreenCanvas before disconnecting\n if (this.offscreenCanvas && this.ctx) {\n this.ctx.clearRect(0, 0, this.offscreenCanvas.width, this.offscreenCanvas.height);\n this.debugLog('🧹 Cleared OffscreenCanvas on disconnect');\n }\n \n // Clear canvas references\n this.offscreenCanvas = null;\n this.ctx = null;\n this.gl = null;\n \n // Update state\n this.videoState.isConnected = false;\n this.videoState.currentFrame = null;\n this.videoState.frameWidth = 0;\n this.videoState.frameHeight = 0;\n this.videoState.frameRate = 0;\n this.videoState.frameData = null;\n \n // Reset CV scratch resources\n this.cvScratchCanvas = null;\n this.cvScratchContext = null;\n \n // Note: Don't cleanup CVSystem here as it should persist across video stream changes\n this.hasLoggedFirstFrame = false;\n this.frameCount = 0;\n \n this.debugLog('Video disconnected (worker-side)');\n }\n\n /**\n * Update video processing configuration\n */\n private updateProcessingConfig(targetFrameRate: number): void {\n this.targetFrameRate = Math.max(1, Math.min(60, targetFrameRate)); // Clamp between 1-60 FPS\n this.frameInterval = 1000 / this.targetFrameRate;\n \n this.debugLog(`Video processing frame rate updated to ${this.targetFrameRate} FPS (worker-side)`);\n }\n\n /**\n * Phase 11 - Update CV frame rate configuration\n */\n private updateCVFrameRate(cvFrameRate: { mode: CVFrameRateMode; sceneTargetFPS: number }): void {\n this.cvSystem.updateCVFrameRate(cvFrameRate.mode, cvFrameRate.sceneTargetFPS);\n this.debugLog(`CV frame rate updated to ${cvFrameRate.mode} of ${cvFrameRate.sceneTargetFPS} FPS (worker-side)`);\n }\n\n /**\n * Reset all video state (called when loading new scene)\n */\n public resetVideoState(): void {\n this.disconnectVideo();\n // Cleanup CV system\n if (this.cvSystem) {\n this.cvSystem.cleanup();\n }\n }\n\n /**\n * Get current processing configuration\n */\n public getProcessingConfig(): { targetFrameRate: number; frameInterval: number; frameCount: number } {\n return {\n targetFrameRate: this.targetFrameRate,\n frameInterval: this.frameInterval,\n frameCount: this.frameCount\n };\n }\n\n /**\n * Get WebGL context for advanced effects (if available)\n */\n public getWebGLContext(): WebGLRenderingContext | WebGL2RenderingContext | null {\n return this.gl;\n }\n\n /**\n * ✅ WORKER API: Artists can access the OffscreenCanvas directly for custom effects\n */\n public getCanvasForArtistEffects(): OffscreenCanvas | null {\n return this.offscreenCanvas;\n }\n\n /**\n * Get CV processing statistics\n */\n public getCVStats() {\n return this.cvSystem.getStats();\n }\n\n /**\n * Initialize for direct frame injection (no MediaStream)\n * Enables GPU-only mode for zero-copy pipeline (ImageBitmaps are pre-flipped at capture)\n */\n public initializeForDirectFrames(consumerRendererType?: string): void {\n this.disconnectVideo();\n \n // Enable GPU-only mode for all shader consumers\n // ImageBitmaps are created with flipY at capture, so orientation is correct\n this.directGPUMode = consumerRendererType === 'shader';\n \n if (this.directGPUMode) {\n this.debugLog('VideoSystem initialized in direct GPU mode (zero-copy, pre-flipped ImageBitmaps)');\n } else {\n // P5/Canvas consumer - need OffscreenCanvas\n this.offscreenCanvas = new OffscreenCanvas(1920, 1080);\n this.ctx = this.offscreenCanvas.getContext('2d', { willReadFrequently: true });\n \n if (!this.ctx) {\n throw new Error('Failed to get 2D context for direct frames');\n }\n \n this.videoState.currentFrame = this.offscreenCanvas;\n this.debugLog('VideoSystem initialized with canvas (P5/Canvas consumer)');\n }\n \n this.videoState.isConnected = false;\n }\n\n /**\n * Handle directly injected frame (zero-copy)\n */\n public handleDirectFrame(data: {\n imageBitmap: ImageBitmap;\n streamIndex: number;\n timestamp: number;\n }): void {\n if (this.directGPUMode) {\n // 🚀 ZERO-COPY PATH: Store pre-flipped ImageBitmap directly for GPU-to-GPU transfer\n // ImageBitmaps are created with flipY at capture, so they're in correct WebGL Y-up orientation\n // No canvas, no CPU memory, no copies - just GPU texture handle ownership transfer\n this.videoState.currentFrame = data.imageBitmap;\n this.videoState.frameWidth = data.imageBitmap.width;\n this.videoState.frameHeight = data.imageBitmap.height;\n this.videoState.isConnected = true;\n \n // Don't close bitmap here - ShaderWorkerAdapter will close it after gl.texImage2D()\n // This ensures the GPU texture stays alive until WebGL upload is complete\n } else {\n // Original canvas path (for CV/P5 - requires CPU access)\n if (!this.offscreenCanvas || !this.ctx) {\n this.debugLog('[Compositor] Initializing canvas for direct frames');\n this.offscreenCanvas = new OffscreenCanvas(data.imageBitmap.width, data.imageBitmap.height);\n this.ctx = this.offscreenCanvas.getContext('2d', { willReadFrequently: true });\n }\n \n // Resize canvas if needed\n if (this.offscreenCanvas!.width !== data.imageBitmap.width ||\n this.offscreenCanvas!.height !== data.imageBitmap.height) {\n this.offscreenCanvas!.width = data.imageBitmap.width;\n this.offscreenCanvas!.height = data.imageBitmap.height;\n }\n \n // Draw bitmap to canvas for CPU processing\n this.ctx!.drawImage(data.imageBitmap, 0, 0);\n this.videoState.currentFrame = this.offscreenCanvas;\n this.videoState.frameWidth = data.imageBitmap.width;\n this.videoState.frameHeight = data.imageBitmap.height;\n this.videoState.isConnected = true;\n \n this.processCurrentFrame(data.timestamp);\n data.imageBitmap.close();\n }\n }\n} ","/**\n * P5.js Worker Adapter\n * \n * Integrates P5.js into Viji's worker-based rendering system.\n * Provides minimal DOM shimming and manages P5 instance lifecycle.\n */\n\n/**\n * Scene code structure for P5 mode\n */\ninterface P5SceneCode {\n setup?: ((viji: any, p5: any) => void) | null;\n render: (viji: any, p5: any) => void;\n}\n\nexport class P5WorkerAdapter {\n private p5Instance: any = null;\n private setupFn: ((viji: any, p5: any) => void) | null = null;\n private renderFn: ((viji: any, p5: any) => void) | null = null;\n private p5InternalSetupComplete = false;\n private artistSetupComplete = false;\n private p5Class: any = null;\n \n // Cache for converted P5.Image objects\n private imageParameterCache = new Map<string, { source: any, p5Image: any }>();\n \n // Track if P5.js's main canvas has been created\n private mainCanvasCreated = false;\n \n constructor(\n private offscreenCanvas: OffscreenCanvas,\n _vijiAPI: any,\n sceneCode: P5SceneCode\n ) {\n this.setupFn = sceneCode.setup || null;\n this.renderFn = sceneCode.render;\n \n // Install minimal DOM shims before loading P5\n this.installMinimalShims();\n \n // Note: P5 will be loaded dynamically when this adapter is created\n // We'll initialize it after P5 is imported\n }\n \n /**\n * Initialize P5 instance after P5.js library is loaded\n * This must be called after the P5 class is available\n */\n public async init(): Promise<void> {\n try {\n // Dynamically import P5.js from ESM-compatible CDN (lazy-loaded, not bundled)\n // esm.sh provides proper ES module versions of npm packages\n // @ts-expect-error - CDN URL import, types provided by @types/p5\n const p5Module = await import('https://esm.sh/p5@1.9.4');\n this.p5Class = p5Module.default || p5Module;\n \n // Create a promise that resolves when P5's setup completes\n const setupPromise = new Promise<void>((resolve) => {\n // Create P5 instance in instance mode\n new this.p5Class((p: any) => {\n // Capture the P5 instance from the callback parameter\n this.p5Instance = p;\n \n // P5 sketch setup\n p.setup = () => {\n // Initialize P5 renderer using our OffscreenCanvas via the shimmed document\n p.createCanvas(this.offscreenCanvas.width, this.offscreenCanvas.height);\n \n // Disable P5's automatic loop (Viji controls the render loop)\n p.noLoop();\n \n // Mark that P5's internal setup is complete\n this.p5InternalSetupComplete = true;\n \n // Resolve the promise\n resolve();\n };\n \n // Empty draw - we'll call the artist's render function manually\n p.draw = () => {};\n \n // IMPORTANT: In worker environment, P5 doesn't auto-call setup\n // We need to manually trigger it\n setTimeout(() => {\n if (p.setup && typeof p.setup === 'function') {\n try {\n p.setup();\n } catch (setupError) {\n console.error('P5 setup failed:', setupError);\n resolve(); // Resolve anyway to prevent hanging\n }\n }\n }, 0);\n });\n });\n \n // Wait for P5's setup to actually complete\n await setupPromise;\n } catch (error) {\n console.error('Failed to initialize P5.js:', error);\n throw error;\n }\n }\n \n /**\n * Install minimal DOM shims that P5.js needs for rendering\n */\n private installMinimalShims(): void {\n const self = globalThis as any;\n \n // Only install if not already present\n if (typeof self.document === 'undefined') {\n // Create flexible style proxy that accepts any property\n const createStyleProxy = () => new Proxy({}, {\n get: () => '',\n set: () => true\n });\n\n // Create body element first so canvas can reference it\n const bodyElement: any = {\n style: createStyleProxy(),\n appendChild: () => {},\n removeChild: () => {},\n children: [],\n childNodes: [],\n firstChild: null,\n lastChild: null,\n parentNode: null,\n ownerDocument: undefined, // Will be set after document is created\n setAttribute: () => {},\n getAttribute: () => null,\n addEventListener: () => {},\n removeEventListener: () => {},\n tagName: 'BODY'\n };\n\n // Minimal document shim\n self.document = {\n createElement: (tag: string) => {\n if (tag === 'canvas') {\n // For the FIRST canvas (P5.js's main canvas), return our provided OffscreenCanvas\n // For subsequent canvases (e.g., tint operations), create new ones\n let canvas: OffscreenCanvas;\n if (!this.mainCanvasCreated) {\n canvas = this.offscreenCanvas;\n this.mainCanvasCreated = true;\n } else {\n canvas = new OffscreenCanvas(300, 300); // Default size, P5.js will resize as needed\n }\n \n // Add DOM-like properties that P5.js may check for\n // @ts-ignore - Adding properties to OffscreenCanvas\n canvas.style = createStyleProxy();\n // @ts-ignore\n canvas.dataset = new Proxy({}, {\n get: () => undefined,\n set: () => true\n });\n // @ts-ignore\n canvas.classList = {\n add: () => {},\n remove: () => {},\n contains: () => false,\n toggle: () => false\n };\n // @ts-ignore\n canvas.getBoundingClientRect = () => ({ \n left: 0, \n top: 0, \n width: canvas.width, \n height: canvas.height \n });\n // Return the actual OffscreenCanvas (now with extra properties)\n // This allows it to be used directly with drawImage()\n return canvas;\n }\n // Return stub for other elements\n return {\n style: createStyleProxy(),\n appendChild: () => {},\n removeChild: () => {},\n setAttribute: () => {},\n getAttribute: () => null,\n tagName: tag.toUpperCase(),\n addEventListener: () => {},\n removeEventListener: () => {}\n };\n },\n createElementNS: (_ns: string, tag: string) => {\n return self.document.createElement(tag);\n },\n body: bodyElement,\n documentElement: {\n style: createStyleProxy(),\n children: [],\n childNodes: []\n },\n getElementById: () => null,\n querySelector: () => null,\n querySelectorAll: () => [],\n getElementsByTagName: (tagName: string) => {\n // P5.js looks for 'main' elements to append canvas\n if (tagName.toLowerCase() === 'main') {\n return [bodyElement]; // Return body as main container\n }\n return [];\n },\n addEventListener: () => {},\n removeEventListener: () => {},\n hasFocus: () => true // P5.js checks this for accessibility features\n };\n \n // Set bodyElement.ownerDocument now that document exists\n bodyElement.ownerDocument = self.document;\n }\n \n if (typeof self.window === 'undefined') {\n // Minimal window shim\n self.window = {\n devicePixelRatio: 1,\n innerWidth: this.offscreenCanvas.width,\n innerHeight: this.offscreenCanvas.height,\n addEventListener: () => {},\n removeEventListener: () => {},\n requestAnimationFrame: (_callback: Function) => {\n // We control the loop, so this should not be called\n return 0;\n },\n cancelAnimationFrame: () => {},\n setTimeout: self.setTimeout.bind(self),\n clearTimeout: self.clearTimeout.bind(self),\n setInterval: self.setInterval.bind(self),\n clearInterval: self.clearInterval.bind(self),\n performance: self.performance,\n console: self.console,\n Math: self.Math,\n Date: self.Date,\n Array: self.Array,\n Object: self.Object\n };\n }\n \n if (typeof self.navigator === 'undefined') {\n // Minimal navigator shim\n self.navigator = {\n userAgent: 'Viji-Worker-P5',\n platform: 'Worker',\n language: 'en-US'\n };\n }\n \n if (typeof self.screen === 'undefined') {\n // Minimal screen shim for P5.js display metrics\n self.screen = {\n width: this.offscreenCanvas.width,\n height: this.offscreenCanvas.height,\n availWidth: this.offscreenCanvas.width,\n availHeight: this.offscreenCanvas.height,\n colorDepth: 24,\n pixelDepth: 24\n };\n }\n \n if (typeof self.HTMLCanvasElement === 'undefined') {\n // P5.js checks instanceof HTMLCanvasElement\n // Create a minimal constructor that OffscreenCanvas \"instanceof\" will pass\n self.HTMLCanvasElement = function() {} as any;\n // Make OffscreenCanvas instances appear to be HTMLCanvasElement instances\n Object.setPrototypeOf(OffscreenCanvas.prototype, self.HTMLCanvasElement.prototype);\n }\n }\n \n /**\n * Convert ImageBitmap to a P5.js-compatible image object (with caching)\n * Returns an object that mimics P5.Image structure for P5.js's image() function\n */\n private getOrCreateP5Image(cacheKey: string, source: any): any {\n if (!this.p5Instance) return null;\n \n // Check cache first\n const cached = this.imageParameterCache.get(cacheKey);\n if (cached && cached.source === source) {\n return cached.p5Image;\n }\n \n try {\n // Create an OffscreenCanvas and draw the ImageBitmap to it\n const offscreenCanvas = new OffscreenCanvas(source.width, source.height);\n const ctx = offscreenCanvas.getContext('2d');\n if (!ctx) {\n throw new Error('Failed to get 2d context from OffscreenCanvas');\n }\n ctx.drawImage(source, 0, 0);\n \n // Wrap the OffscreenCanvas in a P5.Image-like object\n // P5.js expects: img.canvas or img.elt (the actual canvas), and img.width/img.height (logical dimensions)\n const p5ImageWrapper = {\n canvas: offscreenCanvas, // P5.js looks for img.canvas || img.elt\n elt: offscreenCanvas, // Fallback for compatibility\n width: source.width, // Logical width\n height: source.height // Logical height\n };\n \n // Cache the conversion\n this.imageParameterCache.set(cacheKey, { source, p5Image: p5ImageWrapper });\n \n return p5ImageWrapper;\n } catch (error) {\n console.warn('Failed to convert image to P5-compatible object:', error);\n return null;\n }\n }\n \n /**\n * Wrap video frames in P5.js-compatible format\n * P5.js expects images to have {canvas, elt, width, height} structure\n * This wrapping is done per-frame for P5 scenes only, keeping the artist API unchanged\n */\n private wrapVideoFramesForP5(vijiAPI: any): void {\n // Wrap main video stream if present\n if (vijiAPI.video?.currentFrame instanceof OffscreenCanvas) {\n const canvas = vijiAPI.video.currentFrame;\n vijiAPI.video.currentFrame = {\n canvas: canvas,\n elt: canvas,\n width: canvas.width,\n height: canvas.height\n };\n } else if (vijiAPI.video?.currentFrame instanceof ImageBitmap) {\n // P5.js can draw ImageBitmap directly with p5.image()\n const bitmap = vijiAPI.video.currentFrame;\n vijiAPI.video.currentFrame = {\n elt: bitmap,\n width: bitmap.width,\n height: bitmap.height\n };\n }\n \n // Wrap all streams\n if (Array.isArray(vijiAPI.streams)) {\n for (const stream of vijiAPI.streams) {\n if (stream?.currentFrame instanceof OffscreenCanvas) {\n const canvas = stream.currentFrame;\n stream.currentFrame = {\n canvas: canvas,\n elt: canvas,\n width: canvas.width,\n height: canvas.height\n };\n } else if (stream?.currentFrame instanceof ImageBitmap) {\n // P5.js can draw ImageBitmap directly with p5.image()\n const bitmap = stream.currentFrame;\n stream.currentFrame = {\n elt: bitmap,\n width: bitmap.width,\n height: bitmap.height\n };\n }\n }\n }\n }\n \n /**\n * Add .p5 property to image parameters for P5.js-specific rendering\n * This allows artists to use p5.image() while keeping .value for native canvas API\n * @param parameterObjects Map of parameter name to parameter object from ParameterSystem\n */\n private addP5PropertyToImageParameters(parameterObjects: Map<string, any>): void {\n if (!this.p5Instance) return;\n \n // Function to check if a value is an image-like object\n const isImageLike = (value: any): boolean => {\n return value instanceof ImageBitmap || \n value instanceof OffscreenCanvas ||\n (value && typeof value === 'object' && 'width' in value && 'height' in value);\n };\n \n // Iterate through parameter objects provided by ParameterSystem\n for (const [name, param] of parameterObjects) {\n try {\n // Check if this parameter has an image value\n if (param && typeof param === 'object' && 'value' in param) {\n const value = param.value;\n \n // If the value is an image-like object and doesn't have .p5 yet\n if (value && isImageLike(value) && !('p5' in param)) {\n // Add lazy .p5 getter that converts on-demand\n Object.defineProperty(param, 'p5', {\n get: () => this.getOrCreateP5Image(name, param.value),\n enumerable: true,\n configurable: true\n });\n }\n }\n } catch (error) {\n console.warn(`Failed to add .p5 property to parameter '${name}':`, error);\n continue;\n }\n }\n }\n \n /**\n * Execute one frame of the P5 scene\n * Called by Viji's render loop\n * @param vijiAPI The Viji API object passed to artist code\n * @param parameterObjects Map of parameter objects from ParameterSystem\n */\n public tick(vijiAPI: any, parameterObjects: Map<string, any>): void {\n if (!this.p5Instance || !this.p5InternalSetupComplete) {\n // P5 not ready yet, skip this frame\n return;\n }\n \n try {\n // Add .p5 property to image parameters (lazy, cached conversion)\n this.addP5PropertyToImageParameters(parameterObjects);\n \n // Wrap video frames for P5.js compatibility (per-frame, only for P5 scenes)\n this.wrapVideoFramesForP5(vijiAPI);\n \n // Run artist's setup once\n if (!this.artistSetupComplete && this.setupFn) {\n this.setupFn(vijiAPI, this.p5Instance);\n this.artistSetupComplete = true;\n }\n \n // Update P5's internal frame count\n if (this.p5Instance._setProperty) {\n this.p5Instance._setProperty('frameCount', this.p5Instance.frameCount + 1);\n }\n \n // Call artist's render function with both Viji and P5 APIs\n if (this.renderFn) {\n this.renderFn(vijiAPI, this.p5Instance);\n }\n } catch (error) {\n console.error('P5 render error:', error);\n throw error;\n }\n }\n \n /**\n * Handle canvas resize\n */\n public resize(width: number, height: number): void {\n if (!this.p5Instance) return;\n \n // Update P5's internal dimensions\n this.p5Instance._setProperty('width', width);\n this.p5Instance._setProperty('height', height);\n this.p5Instance._setProperty('_width', width);\n this.p5Instance._setProperty('_height', height);\n \n // Update renderer dimensions if available\n if (this.p5Instance._renderer) {\n this.p5Instance._renderer.width = width;\n this.p5Instance._renderer.height = height;\n }\n \n // Call P5's resizeCanvas if available\n if (typeof this.p5Instance.resizeCanvas === 'function') {\n try {\n this.p5Instance.resizeCanvas(width, height, true);\n } catch (error) {\n // Ignore resize errors, they're often not critical\n console.warn('P5 resize warning:', error);\n }\n }\n }\n \n /**\n * Cleanup P5 instance\n */\n public destroy(): void {\n if (this.p5Instance) {\n try {\n if (typeof this.p5Instance.remove === 'function') {\n this.p5Instance.remove();\n }\n } catch (error) {\n console.warn('P5 cleanup warning:', error);\n }\n this.p5Instance = null;\n }\n \n this.setupFn = null;\n this.renderFn = null;\n this.p5InternalSetupComplete = false;\n this.artistSetupComplete = false;\n }\n}\n\n","/**\r\n * Shader Parameter Parser\r\n * \r\n * Parses parameter declarations from GLSL shader code comments.\r\n * Supports syntax: // @viji-TYPE:uniformName key:value key:value ...\r\n */\r\n\r\nexport interface ShaderParameterDefinition {\r\n type: string;\r\n uniformName: string;\r\n label: string;\r\n default: any;\r\n config: Record<string, any>;\r\n}\r\n\r\n/**\r\n * Parses shader parameter declarations from GLSL comments\r\n */\r\nexport class ShaderParameterParser {\r\n /**\r\n * Parse all parameter declarations from shader code\r\n */\r\n static parseParameters(shaderCode: string): ShaderParameterDefinition[] {\r\n const parameters: ShaderParameterDefinition[] = [];\r\n const lines = shaderCode.split('\\n');\r\n \r\n for (const line of lines) {\r\n const trimmed = line.trim();\r\n \r\n // Match: // @viji-TYPE:uniformName key:value ...\r\n const match = trimmed.match(/\\/\\/\\s*@viji-(\\w+):(\\w+)\\s+(.+)/);\r\n \r\n if (match) {\r\n const [, type, uniformName, configStr] = match;\r\n \r\n try {\r\n const config = this.parseKeyValuePairs(configStr);\r\n \r\n const param: ShaderParameterDefinition = {\r\n type,\r\n uniformName,\r\n label: config.label || uniformName,\r\n default: config.default,\r\n config\r\n };\r\n \r\n this.validateParameter(param);\r\n parameters.push(param);\r\n } catch (error) {\r\n console.warn(`Failed to parse shader parameter: ${line}`, error);\r\n }\r\n }\r\n }\r\n \r\n return parameters;\r\n }\r\n \r\n /**\r\n * Parse key:value pairs from configuration string\r\n */\r\n static parseKeyValuePairs(configStr: string): Record<string, any> {\r\n const config: Record<string, any> = {};\r\n \r\n // Regex to match key:\"value\" or key:value or key:[\"a\",\"b\",\"c\"] or key:#hexcolor\r\n const keyValueRegex = /(\\w+):((?:\"[^\"]*\"|\\[[^\\]]*\\]|#[0-9a-fA-F]{6}|#[0-9a-fA-F]{3}|[^\\s]+))/g;\r\n \r\n let match;\r\n while ((match = keyValueRegex.exec(configStr)) !== null) {\r\n const [, key, value] = match;\r\n config[key] = this.parseValue(value);\r\n }\r\n \r\n return config;\r\n }\r\n \r\n /**\r\n * Parse individual value from string\r\n */\r\n private static parseValue(value: string): any {\r\n // Handle quoted strings: \"Hello World\"\r\n if (value.startsWith('\"') && value.endsWith('\"')) {\r\n return value.slice(1, -1);\r\n }\r\n \r\n // Handle arrays: [\"Option1\",\"Option2\"]\r\n if (value.startsWith('[') && value.endsWith(']')) {\r\n try {\r\n return JSON.parse(value);\r\n } catch {\r\n // If JSON parse fails, try manual parsing\r\n const items = value.slice(1, -1).split(',').map(s => s.trim());\r\n return items.map(item => {\r\n if (item.startsWith('\"') && item.endsWith('\"')) {\r\n return item.slice(1, -1);\r\n }\r\n const num = parseFloat(item);\r\n return isNaN(num) ? item : num;\r\n });\r\n }\r\n }\r\n \r\n // Handle hex colors: #ff0000 or #fff\r\n if (value.startsWith('#')) {\r\n return value;\r\n }\r\n \r\n // Handle booleans\r\n if (value === 'true') return true;\r\n if (value === 'false') return false;\r\n \r\n // Handle numbers\r\n const num = parseFloat(value);\r\n if (!isNaN(num)) return num;\r\n \r\n // Return as string\r\n return value;\r\n }\r\n \r\n /**\r\n * Validate parameter definition\r\n */\r\n static validateParameter(param: ShaderParameterDefinition): void {\r\n // Required fields\r\n if (!param.type) {\r\n throw new Error('Parameter type is required');\r\n }\r\n \r\n if (!param.uniformName) {\r\n throw new Error('Parameter uniformName is required');\r\n }\r\n \r\n if (!param.config.label) {\r\n throw new Error(`Parameter ${param.uniformName} missing required 'label' key`);\r\n }\r\n \r\n // Validate by type\r\n switch (param.type) {\r\n case 'slider':\r\n case 'number':\r\n if (param.config.default === undefined) {\r\n throw new Error(`Parameter ${param.uniformName} of type ${param.type} missing required 'default' key`);\r\n }\r\n break;\r\n \r\n case 'color':\r\n if (param.config.default === undefined) {\r\n throw new Error(`Parameter ${param.uniformName} of type 'color' missing required 'default' key`);\r\n }\r\n if (!param.config.default.startsWith('#')) {\r\n throw new Error(`Parameter ${param.uniformName} of type 'color' default must be hex color (e.g., #ff0000)`);\r\n }\r\n break;\r\n \r\n case 'toggle':\r\n if (param.config.default === undefined) {\r\n throw new Error(`Parameter ${param.uniformName} of type 'toggle' missing required 'default' key`);\r\n }\r\n if (typeof param.config.default !== 'boolean') {\r\n throw new Error(`Parameter ${param.uniformName} of type 'toggle' default must be boolean (true or false)`);\r\n }\r\n break;\r\n \r\n case 'select':\r\n if (param.config.default === undefined) {\r\n throw new Error(`Parameter ${param.uniformName} of type 'select' missing required 'default' key`);\r\n }\r\n if (!param.config.options || !Array.isArray(param.config.options)) {\r\n throw new Error(`Parameter ${param.uniformName} of type 'select' missing required 'options' key (array)`);\r\n }\r\n break;\r\n \r\n case 'image':\r\n // Image parameters don't require default (always starts as null)\r\n break;\r\n \r\n default:\r\n console.warn(`Unknown parameter type: ${param.type}`);\r\n }\r\n \r\n // Warn if using reserved u_ prefix\r\n if (param.uniformName.startsWith('u_')) {\r\n console.warn(`Parameter name \"${param.uniformName}\" uses reserved prefix \"u_\". Consider renaming to avoid conflicts with built-in uniforms.`);\r\n }\r\n }\r\n \r\n /**\r\n * Generate uniform declaration for a parameter\r\n */\r\n static generateUniformDeclaration(param: ShaderParameterDefinition): string {\r\n switch (param.type) {\r\n case 'slider':\r\n case 'number':\r\n return `uniform float ${param.uniformName};`;\r\n \r\n case 'color':\r\n return `uniform vec3 ${param.uniformName};`;\r\n \r\n case 'toggle':\r\n return `uniform bool ${param.uniformName};`;\r\n \r\n case 'select':\r\n return `uniform int ${param.uniformName};`;\r\n \r\n case 'image':\r\n return `uniform sampler2D ${param.uniformName};`;\r\n \r\n default:\r\n return `// Unknown parameter type: ${param.type}`;\r\n }\r\n }\r\n}\r\n\r\n","/**\n * Shader Worker Adapter\n * \n * Integrates GLSL shaders into Viji's worker-based rendering system.\n * Provides automatic uniform injection and parameter management.\n */\n\nimport { ShaderParameterParser, ShaderParameterDefinition } from './ShaderParameterParser.js';\n\nexport class ShaderWorkerAdapter {\n private static readonly MAX_STREAMS = 8; // Maximum number of compositor input streams\n private static readonly MAX_EXTERNAL_DEVICES = 8; // Maximum number of external devices\n \n private gl: WebGLRenderingContext | WebGL2RenderingContext;\n private program: WebGLProgram | null = null;\n private uniformLocations = new Map<string, WebGLUniformLocation | null>();\n private textureUnits = new Map<string, number>();\n private nextTextureUnit = 0;\n private textures = new Map<string, WebGLTexture>();\n \n // Fullscreen quad\n private quadBuffer: WebGLBuffer | null = null;\n \n // Parameter definitions\n private parameters: ShaderParameterDefinition[] = [];\n \n // GLSL version detection\n private glslVersion: 'glsl100' | 'glsl300' = 'glsl100';\n \n // Audio FFT texture\n private audioFFTTexture: WebGLTexture | null = null;\n private videoTexture: WebGLTexture | null = null;\n private segmentationTexture: WebGLTexture | null = null;\n \n // Multi-stream textures\n private streamTextures: (WebGLTexture | null)[] = [];\n \n // Backbuffer support (ping-pong framebuffers)\n private backbufferFramebuffer: WebGLFramebuffer | null = null;\n private backbufferTexture: WebGLTexture | null = null;\n private currentFramebuffer: WebGLFramebuffer | null = null;\n private currentTexture: WebGLTexture | null = null;\n private backbufferEnabled: boolean = false;\n \n constructor(\n offscreenCanvas: OffscreenCanvas,\n _vijiAPI: any,\n private shaderCode: string\n ) {\n // Detect GLSL version\n this.glslVersion = this.detectGLSLVersion(shaderCode);\n \n // Detect if shader uses backbuffer\n this.backbufferEnabled = shaderCode.includes('backbuffer');\n \n // Get appropriate WebGL context\n if (this.glslVersion === 'glsl300') {\n const gl = offscreenCanvas.getContext('webgl2');\n if (!gl) {\n throw new Error('WebGL 2 not supported. Use GLSL ES 1.00 syntax instead.');\n }\n this.gl = gl;\n } else {\n const gl = offscreenCanvas.getContext('webgl');\n if (!gl) {\n throw new Error('WebGL not supported');\n }\n this.gl = gl;\n }\n }\n \n /**\n * Initialize the shader adapter\n */\n public async init(): Promise<void> {\n try {\n // Parse parameters from shader code\n this.parameters = ShaderParameterParser.parseParameters(this.shaderCode);\n \n // Create fullscreen quad\n this.createFullscreenQuad();\n \n // Inject uniforms and compile shader\n const processedCode = this.injectUniforms(this.shaderCode);\n this.compileAndLinkShader(processedCode);\n \n // Get all uniform locations\n this.cacheUniformLocations();\n \n // Reserve texture units for special textures\n this.reserveTextureUnits();\n \n // Create backbuffer framebuffers if needed\n if (this.backbufferEnabled) {\n this.createBackbufferFramebuffers();\n }\n \n } catch (error) {\n console.error('Failed to initialize ShaderWorkerAdapter:', error);\n throw error;\n }\n }\n \n /**\n * Detect GLSL version from shader code\n */\n private detectGLSLVersion(code: string): 'glsl100' | 'glsl300' {\n return code.includes('#version 300') ? 'glsl300' : 'glsl100';\n }\n \n /**\n * Create fullscreen quad geometry\n */\n private createFullscreenQuad(): void {\n // Two triangles covering the full screen\n const vertices = new Float32Array([\n -1, -1, // Bottom-left\n 1, -1, // Bottom-right\n -1, 1, // Top-left\n 1, 1 // Top-right\n ]);\n \n this.quadBuffer = this.gl.createBuffer();\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.quadBuffer);\n this.gl.bufferData(this.gl.ARRAY_BUFFER, vertices, this.gl.STATIC_DRAW);\n }\n \n /**\n * Inject built-in and parameter uniforms into shader code\n */\n private injectUniforms(artistCode: string): string {\n // Extract #version directive if present (MUST be first line in GLSL ES 3.00)\n let versionLine = '';\n let codeWithoutVersion = artistCode;\n \n const lines = artistCode.split('\\n');\n for (let i = 0; i < lines.length; i++) {\n const trimmed = lines[i].trim();\n if (trimmed.startsWith('#version')) {\n versionLine = trimmed;\n // Remove this line from the code\n lines[i] = '';\n codeWithoutVersion = lines.join('\\n');\n break;\n }\n }\n \n // Find injection point in code (without #version)\n const injectionPoint = this.findInjectionPoint(codeWithoutVersion);\n \n // Build uniform declarations\n const builtInUniforms = this.getBuiltInUniforms();\n const parameterUniforms = this.parameters\n .map(p => ShaderParameterParser.generateUniformDeclaration(p))\n .join('\\n');\n \n // Check if shader uses fwidth (requires extension in WebGL 1)\n const usesFwidth = artistCode.includes('fwidth');\n \n // Check if extension is supported (for WebGL 1)\n if (usesFwidth && this.glslVersion === 'glsl100') {\n const ext = this.gl.getExtension('OES_standard_derivatives');\n if (!ext) {\n console.warn('Shader uses fwidth() but OES_standard_derivatives extension is not supported. Shader may not compile.');\n }\n }\n \n // Build injection parts\n const parts: string[] = [];\n \n // 1. Extensions MUST come first (before precision) - only for GLSL 1.00\n if (usesFwidth && this.glslVersion === 'glsl100') {\n parts.push('#extension GL_OES_standard_derivatives : enable');\n }\n \n // 2. Precision MUST come before uniforms (only for GLSL 1.00, ES 3.00 has it by default)\n if (this.glslVersion === 'glsl100') {\n parts.push('');\n parts.push('#ifdef GL_ES');\n parts.push('precision mediump float;');\n parts.push('#endif');\n } else {\n // For GLSL 3.00, just add precision\n parts.push('');\n parts.push('precision mediump float;');\n }\n \n // 3. Uniforms\n parts.push('');\n parts.push('// ===== VIJI AUTO-INJECTED UNIFORMS =====');\n parts.push('// Built-in uniforms (auto-provided)');\n parts.push(builtInUniforms);\n parts.push('');\n parts.push('// Parameter uniforms (from @viji-* declarations)');\n parts.push(parameterUniforms);\n parts.push('');\n parts.push('// ===== ARTIST CODE =====');\n \n const uniformBlock = parts.join('\\n');\n \n // Insert uniform block at injection point\n const codeWithUniforms = (\n codeWithoutVersion.slice(0, injectionPoint) +\n '\\n' + uniformBlock + '\\n' +\n codeWithoutVersion.slice(injectionPoint)\n );\n \n // Reconstruct: #version MUST be first line, then uniforms, then artist code\n const finalCode = versionLine\n ? versionLine + '\\n' + codeWithUniforms\n : codeWithUniforms;\n \n // Debug: Log the injected code (first 50 lines)\n console.log('=== INJECTED SHADER CODE (first 50 lines) ===');\n console.log(finalCode.split('\\n').slice(0, 50).join('\\n'));\n console.log('=== END INJECTED CODE ===');\n \n return finalCode;\n }\n \n /**\n * Find where to inject extensions and uniforms\n * Extensions must come after #version but before any code\n * \n * Strategy: \n * 1. If #version exists, inject right after it\n * 2. Otherwise, skip ALL comments (single and multi-line) and inject before first code\n */\n private findInjectionPoint(code: string): number {\n const lines = code.split('\\n');\n \n // Find #version line (if present) - inject right after\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trim();\n if (line.startsWith('#version')) {\n return this.getLineEndPosition(code, i);\n }\n }\n \n // No #version - skip ALL comments (single-line and multi-line blocks)\n let inMultiLineComment = false;\n let firstCodeLine = 0;\n \n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trim();\n \n // Track multi-line comment state\n if (line.includes('/*')) {\n inMultiLineComment = true;\n }\n if (line.includes('*/')) {\n inMultiLineComment = false;\n firstCodeLine = i + 1; // Next line after comment closes\n continue;\n }\n \n // Skip if in multi-line comment\n if (inMultiLineComment) {\n continue;\n }\n \n // Skip empty lines and single-line comments\n if (line === '' || line.startsWith('//')) {\n firstCodeLine = i + 1;\n continue;\n }\n \n // Found first non-comment line - inject before it\n break;\n }\n \n // Get position at start of first code line\n if (firstCodeLine > 0 && firstCodeLine < lines.length) {\n return this.getLineEndPosition(code, firstCodeLine - 1);\n }\n \n return 0;\n }\n \n /**\n * Get byte position of end of line N\n */\n private getLineEndPosition(code: string, lineNumber: number): number {\n const lines = code.split('\\n');\n let position = 0;\n \n for (let i = 0; i <= lineNumber && i < lines.length; i++) {\n position += lines[i].length + 1; // +1 for newline\n }\n \n return position;\n }\n \n /**\n * Get built-in uniform declarations\n */\n private getBuiltInUniforms(): string {\n return `// Core - Canvas & Timing\nuniform vec2 u_resolution; // Canvas width and height in pixels\nuniform float u_time; // Elapsed time in seconds since scene start\nuniform float u_deltaTime; // Time elapsed since last frame in seconds\nuniform int u_frame; // Current frame number\nuniform float u_pixelRatio; // Device pixel ratio for high-DPI displays\nuniform float u_fps; // Current frames per second\n\n// Mouse API\nuniform vec2 u_mouse; // Mouse position in pixels (WebGL coords: bottom-left origin)\nuniform bool u_mouseInCanvas; // True if mouse is inside canvas bounds\nuniform bool u_mousePressed; // True if any mouse button is pressed\nuniform bool u_mouseLeft; // True if left mouse button is pressed\nuniform bool u_mouseRight; // True if right mouse button is pressed\nuniform bool u_mouseMiddle; // True if middle mouse button is pressed\nuniform vec2 u_mouseVelocity; // Mouse movement velocity in pixels per second\n\n// Keyboard API - Common keys\nuniform bool u_keySpace; // True if spacebar is pressed\nuniform bool u_keyShift; // True if Shift key is pressed\nuniform bool u_keyCtrl; // True if Ctrl/Cmd key is pressed\nuniform bool u_keyAlt; // True if Alt/Option key is pressed\nuniform bool u_keyW; // True if W key is pressed\nuniform bool u_keyA; // True if A key is pressed\nuniform bool u_keyS; // True if S key is pressed\nuniform bool u_keyD; // True if D key is pressed\nuniform bool u_keyUp; // True if Up arrow key is pressed\nuniform bool u_keyDown; // True if Down arrow key is pressed\nuniform bool u_keyLeft; // True if Left arrow key is pressed\nuniform bool u_keyRight; // True if Right arrow key is pressed\n\n// Touch API\nuniform int u_touchCount; // Number of active touch points (0-5)\nuniform vec2 u_touch0; // First touch point position in pixels\nuniform vec2 u_touch1; // Second touch point position in pixels\nuniform vec2 u_touch2; // Third touch point position in pixels\nuniform vec2 u_touch3; // Fourth touch point position in pixels\nuniform vec2 u_touch4; // Fifth touch point position in pixels\n\n// Audio\nuniform float u_audioVolume; // RMS volume level (0-1)\nuniform float u_audioPeak; // Peak volume level (0-1)\nuniform float u_audioBass; // Bass frequency band level (0-1)\nuniform float u_audioMid; // Mid frequency band level (0-1)\nuniform float u_audioTreble; // Treble frequency band level (0-1)\nuniform float u_audioSubBass; // Sub-bass frequency band 20-60 Hz (0-1)\nuniform float u_audioLowMid; // Low-mid frequency band 250-500 Hz (0-1)\nuniform float u_audioHighMid; // High-mid frequency band 2-4 kHz (0-1)\nuniform float u_audioPresence; // Presence frequency band 4-6 kHz (0-1)\nuniform float u_audioBrilliance; // Brilliance frequency band 6-20 kHz (0-1)\nuniform sampler2D u_audioFFT; // FFT texture containing 512 frequency bins\n\n// Video\nuniform sampler2D u_video; // Current video frame as texture\nuniform vec2 u_videoResolution; // Video frame width and height in pixels\nuniform float u_videoFrameRate; // Video frame rate in frames per second\n\n// Multi-Stream Compositor Support (using individual uniforms due to WebGL 1.0 limitations)\nuniform int u_streamCount; // Number of available compositor input streams (0-8)\nuniform sampler2D u_stream0; // Stream 0 texture\nuniform sampler2D u_stream1; // Stream 1 texture\nuniform sampler2D u_stream2; // Stream 2 texture\nuniform sampler2D u_stream3; // Stream 3 texture\nuniform sampler2D u_stream4; // Stream 4 texture\nuniform sampler2D u_stream5; // Stream 5 texture\nuniform sampler2D u_stream6; // Stream 6 texture\nuniform sampler2D u_stream7; // Stream 7 texture\nuniform vec2 u_stream0Resolution; // Stream 0 resolution\nuniform vec2 u_stream1Resolution; // Stream 1 resolution\nuniform vec2 u_stream2Resolution; // Stream 2 resolution\nuniform vec2 u_stream3Resolution; // Stream 3 resolution\nuniform vec2 u_stream4Resolution; // Stream 4 resolution\nuniform vec2 u_stream5Resolution; // Stream 5 resolution\nuniform vec2 u_stream6Resolution; // Stream 6 resolution\nuniform vec2 u_stream7Resolution; // Stream 7 resolution\nuniform bool u_stream0Connected; // Stream 0 connection status\nuniform bool u_stream1Connected; // Stream 1 connection status\nuniform bool u_stream2Connected; // Stream 2 connection status\nuniform bool u_stream3Connected; // Stream 3 connection status\nuniform bool u_stream4Connected; // Stream 4 connection status\nuniform bool u_stream5Connected; // Stream 5 connection status\nuniform bool u_stream6Connected; // Stream 6 connection status\nuniform bool u_stream7Connected; // Stream 7 connection status\n\n// CV - Face Detection\nuniform int u_faceCount; // Number of detected faces (0-1)\nuniform vec4 u_face0Bounds; // First face bounding box (x, y, width, height)\nuniform vec3 u_face0HeadPose; // First face head rotation (pitch, yaw, roll) in radians\nuniform float u_face0Confidence; // First face detection confidence (0-1)\nuniform float u_face0Happy; // First face happy expression confidence (0-1)\nuniform float u_face0Sad; // First face sad expression confidence (0-1)\nuniform float u_face0Angry; // First face angry expression confidence (0-1)\nuniform float u_face0Surprised; // First face surprised expression confidence (0-1)\n\n// CV - Hand Tracking\nuniform int u_handCount; // Number of detected hands (0-2)\nuniform vec3 u_leftHandPalm; // Left hand palm position (x, y, z)\nuniform vec3 u_rightHandPalm; // Right hand palm position (x, y, z)\nuniform float u_leftHandFist; // Left hand fist gesture confidence (0-1)\nuniform float u_leftHandOpen; // Left hand open palm gesture confidence (0-1)\nuniform float u_rightHandFist; // Right hand fist gesture confidence (0-1)\nuniform float u_rightHandOpen; // Right hand open palm gesture confidence (0-1)\n\n// CV - Pose Detection\nuniform bool u_poseDetected; // True if a pose is currently detected\nuniform vec2 u_nosePosition; // Nose landmark position in pixels\nuniform vec2 u_leftWristPosition; // Left wrist landmark position in pixels\nuniform vec2 u_rightWristPosition; // Right wrist landmark position in pixels\nuniform vec2 u_leftAnklePosition; // Left ankle landmark position in pixels\nuniform vec2 u_rightAnklePosition; // Right ankle landmark position in pixels\n\n// CV - Segmentation\nuniform sampler2D u_segmentationMask; // Body segmentation mask texture (0=background, 1=person)\nuniform vec2 u_segmentationRes; // Segmentation mask resolution in pixels\n\n// Device Sensors - Internal Device (viji.device)\nuniform vec3 u_deviceAcceleration; // Acceleration without gravity (m/s²) - x, y, z\nuniform vec3 u_deviceAccelerationGravity; // Acceleration with gravity (m/s²) - x, y, z\nuniform vec3 u_deviceRotationRate; // Rotation rate (deg/s) - alpha, beta, gamma\nuniform vec3 u_deviceOrientation; // Device orientation (degrees) - alpha, beta, gamma\nuniform bool u_deviceOrientationAbsolute; // True if orientation uses magnetometer (compass)\nuniform vec2 u_deviceLocation; // Geolocation (degrees) - latitude, longitude\nuniform vec4 u_deviceLocationExt; // Extended geolocation - altitude(m), accuracy(m), heading(deg), speed(m/s)\n\n// Device Sensors - External Devices (viji.devices[0-7])\nuniform int u_externalDeviceCount; // Number of connected external devices (0-8)\nuniform vec3 u_device0Acceleration; // Device 0 acceleration without gravity (m/s²)\nuniform vec3 u_device0AccelerationGravity; // Device 0 acceleration with gravity (m/s²)\nuniform vec3 u_device0RotationRate; // Device 0 rotation rate (deg/s)\nuniform vec3 u_device0Orientation; // Device 0 orientation (degrees) - alpha, beta, gamma\nuniform vec2 u_device0Location; // Device 0 location - latitude, longitude\nuniform vec3 u_device1Acceleration; // Device 1 acceleration without gravity (m/s²)\nuniform vec3 u_device1AccelerationGravity; // Device 1 acceleration with gravity (m/s²)\nuniform vec3 u_device1RotationRate; // Device 1 rotation rate (deg/s)\nuniform vec3 u_device1Orientation; // Device 1 orientation (degrees) - alpha, beta, gamma\nuniform vec2 u_device1Location; // Device 1 location - latitude, longitude\nuniform vec3 u_device2Acceleration; // Device 2 acceleration without gravity (m/s²)\nuniform vec3 u_device2AccelerationGravity; // Device 2 acceleration with gravity (m/s²)\nuniform vec3 u_device2RotationRate; // Device 2 rotation rate (deg/s)\nuniform vec3 u_device2Orientation; // Device 2 orientation (degrees) - alpha, beta, gamma\nuniform vec2 u_device2Location; // Device 2 location - latitude, longitude\nuniform vec3 u_device3Acceleration; // Device 3 acceleration without gravity (m/s²)\nuniform vec3 u_device3AccelerationGravity; // Device 3 acceleration with gravity (m/s²)\nuniform vec3 u_device3RotationRate; // Device 3 rotation rate (deg/s)\nuniform vec3 u_device3Orientation; // Device 3 orientation (degrees) - alpha, beta, gamma\nuniform vec2 u_device3Location; // Device 3 location - latitude, longitude\nuniform vec3 u_device4Acceleration; // Device 4 acceleration without gravity (m/s²)\nuniform vec3 u_device4AccelerationGravity; // Device 4 acceleration with gravity (m/s²)\nuniform vec3 u_device4RotationRate; // Device 4 rotation rate (deg/s)\nuniform vec3 u_device4Orientation; // Device 4 orientation (degrees) - alpha, beta, gamma\nuniform vec2 u_device4Location; // Device 4 location - latitude, longitude\nuniform vec3 u_device5Acceleration; // Device 5 acceleration without gravity (m/s²)\nuniform vec3 u_device5AccelerationGravity; // Device 5 acceleration with gravity (m/s²)\nuniform vec3 u_device5RotationRate; // Device 5 rotation rate (deg/s)\nuniform vec3 u_device5Orientation; // Device 5 orientation (degrees) - alpha, beta, gamma\nuniform vec2 u_device5Location; // Device 5 location - latitude, longitude\nuniform vec3 u_device6Acceleration; // Device 6 acceleration without gravity (m/s²)\nuniform vec3 u_device6AccelerationGravity; // Device 6 acceleration with gravity (m/s²)\nuniform vec3 u_device6RotationRate; // Device 6 rotation rate (deg/s)\nuniform vec3 u_device6Orientation; // Device 6 orientation (degrees) - alpha, beta, gamma\nuniform vec2 u_device6Location; // Device 6 location - latitude, longitude\nuniform vec3 u_device7Acceleration; // Device 7 acceleration without gravity (m/s²)\nuniform vec3 u_device7AccelerationGravity; // Device 7 acceleration with gravity (m/s²)\nuniform vec3 u_device7RotationRate; // Device 7 rotation rate (deg/s)\nuniform vec3 u_device7Orientation; // Device 7 orientation (degrees) - alpha, beta, gamma\nuniform vec2 u_device7Location; // Device 7 location - latitude, longitude\n\n// Backbuffer (previous frame feedback)\n${this.backbufferEnabled ? 'uniform sampler2D backbuffer; // Previous frame texture for feedback effects' : '// backbuffer not enabled'}\n`;\n }\n \n /**\n * Compile and link shader program\n */\n private compileAndLinkShader(fragmentShaderCode: string): void {\n const gl = this.gl;\n \n // Generate vertex shader matching GLSL version\n const vertexShaderCode = this.glslVersion === 'glsl300'\n ? `#version 300 es\n precision mediump float;\n in vec2 a_position;\n void main() {\n gl_Position = vec4(a_position, 0.0, 1.0);\n }`\n : `attribute vec2 a_position;\n void main() {\n gl_Position = vec4(a_position, 0.0, 1.0);\n }`;\n \n // Compile vertex shader\n const vertexShader = this.compileShader(gl.VERTEX_SHADER, vertexShaderCode);\n \n // Compile fragment shader\n const fragmentShader = this.compileShader(gl.FRAGMENT_SHADER, fragmentShaderCode);\n \n // Link program\n const program = gl.createProgram();\n if (!program) {\n throw new Error('Failed to create WebGL program');\n }\n \n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n gl.linkProgram(program);\n \n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n const error = gl.getProgramInfoLog(program);\n throw new Error(`Shader program link failed: ${error}`);\n }\n \n this.program = program;\n gl.useProgram(program);\n \n // Clean up shaders (no longer needed after linking)\n gl.deleteShader(vertexShader);\n gl.deleteShader(fragmentShader);\n }\n \n /**\n * Compile a shader\n */\n private compileShader(type: number, source: string): WebGLShader {\n const gl = this.gl;\n const shader = gl.createShader(type);\n \n if (!shader) {\n throw new Error('Failed to create shader');\n }\n \n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n \n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n const error = gl.getShaderInfoLog(shader);\n const shaderType = type === gl.VERTEX_SHADER ? 'vertex' : 'fragment';\n throw new Error(`${shaderType} shader compilation failed:\\n${error}`);\n }\n \n return shader;\n }\n \n /**\n * Cache uniform locations for fast access\n */\n private cacheUniformLocations(): void {\n if (!this.program) return;\n \n const gl = this.gl;\n const numUniforms = gl.getProgramParameter(this.program, gl.ACTIVE_UNIFORMS);\n \n const streamUniforms: string[] = [];\n \n for (let i = 0; i < numUniforms; i++) {\n const info = gl.getActiveUniform(this.program, i);\n if (info) {\n const location = gl.getUniformLocation(this.program, info.name);\n this.uniformLocations.set(info.name, location);\n \n // Track stream-related uniforms for debugging\n if (info.name.includes('stream') || info.name.includes('u_stream')) {\n streamUniforms.push(info.name);\n }\n }\n }\n \n // Debug: Log all stream-related uniforms found\n if (streamUniforms.length > 0) {\n console.log('[ShaderAdapter] Stream-related uniforms found:', streamUniforms);\n } else {\n console.log('[ShaderAdapter] NO stream-related uniforms found in shader!');\n }\n }\n \n /**\n * Reserve texture units for special textures\n */\n private reserveTextureUnits(): void {\n // Reserve texture units for built-in textures\n this.textureUnits.set('u_audioFFT', this.nextTextureUnit++);\n this.textureUnits.set('u_video', this.nextTextureUnit++);\n this.textureUnits.set('u_segmentationMask', this.nextTextureUnit++);\n \n // Reserve texture units for multi-stream compositor (individual uniforms, not arrays)\n for (let i = 0; i < ShaderWorkerAdapter.MAX_STREAMS; i++) {\n this.textureUnits.set(`u_stream${i}`, this.nextTextureUnit++);\n }\n \n if (this.backbufferEnabled) {\n this.textureUnits.set('backbuffer', this.nextTextureUnit++);\n }\n }\n \n /**\n * Create ping-pong framebuffers for backbuffer support\n */\n private createBackbufferFramebuffers(): void {\n const gl = this.gl;\n const width = gl.canvas.width;\n const height = gl.canvas.height;\n \n // Create two framebuffer/texture pairs for ping-pong\n const createFBOTexture = () => {\n const texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n \n const framebuffer = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\n \n return { framebuffer, texture };\n };\n \n const fbo1 = createFBOTexture();\n const fbo2 = createFBOTexture();\n \n this.backbufferFramebuffer = fbo1.framebuffer;\n this.backbufferTexture = fbo1.texture;\n this.currentFramebuffer = fbo2.framebuffer;\n this.currentTexture = fbo2.texture;\n \n // Unbind\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.bindTexture(gl.TEXTURE_2D, null);\n }\n \n /**\n * Main render method\n */\n public render(viji: any, parameterObjects: Map<string, any>): void {\n const gl = this.gl;\n \n if (!this.program || !this.quadBuffer) {\n console.warn('Shader not initialized');\n return;\n }\n \n gl.useProgram(this.program);\n \n // Update all built-in uniforms\n this.updateBuiltInUniforms(viji);\n \n // Update parameter uniforms\n this.updateParameterUniforms(parameterObjects);\n \n // If backbuffer enabled, bind backbuffer texture and render to current framebuffer\n if (this.backbufferEnabled && this.backbufferTexture) {\n // Bind the backbuffer (previous frame) as a texture\n const backbufferUnit = this.textureUnits.get('backbuffer');\n if (backbufferUnit !== undefined) {\n gl.activeTexture(gl.TEXTURE0 + backbufferUnit);\n gl.bindTexture(gl.TEXTURE_2D, this.backbufferTexture);\n this.setUniform('backbuffer', 'sampler2D', backbufferUnit);\n }\n \n // Render to current framebuffer\n gl.bindFramebuffer(gl.FRAMEBUFFER, this.currentFramebuffer);\n }\n \n // Bind attribute\n const positionLocation = gl.getAttribLocation(this.program, 'a_position');\n gl.bindBuffer(gl.ARRAY_BUFFER, this.quadBuffer);\n gl.enableVertexAttribArray(positionLocation);\n gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0);\n \n // Draw fullscreen quad\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n \n // If backbuffer enabled, copy to screen and swap buffers\n if (this.backbufferEnabled) {\n // Unbind framebuffer (render to screen)\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n \n // Draw the current texture to screen\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, this.currentTexture);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n \n // Swap framebuffers for next frame\n const tempFB = this.backbufferFramebuffer;\n const tempTex = this.backbufferTexture;\n this.backbufferFramebuffer = this.currentFramebuffer;\n this.backbufferTexture = this.currentTexture;\n this.currentFramebuffer = tempFB;\n this.currentTexture = tempTex;\n }\n }\n \n /**\n * Update built-in uniforms from viji object\n */\n private updateBuiltInUniforms(viji: any): void {\n // Core\n this.setUniform('u_resolution', 'vec2', [viji.width, viji.height]);\n this.setUniform('u_time', 'float', viji.time);\n this.setUniform('u_deltaTime', 'float', viji.deltaTime);\n this.setUniform('u_frame', 'int', viji.frameCount);\n this.setUniform('u_pixelRatio', 'float', viji.pixelRatio);\n this.setUniform('u_fps', 'float', viji.fps);\n \n // Mouse (flip Y from DOM coords to WebGL coords)\n this.setUniform('u_mouse', 'vec2', [viji.mouse.x, viji.height - viji.mouse.y]);\n this.setUniform('u_mouseInCanvas', 'bool', viji.mouse.isInCanvas);\n this.setUniform('u_mousePressed', 'bool', viji.mouse.isPressed);\n this.setUniform('u_mouseLeft', 'bool', viji.mouse.leftButton);\n this.setUniform('u_mouseRight', 'bool', viji.mouse.rightButton);\n this.setUniform('u_mouseMiddle', 'bool', viji.mouse.middleButton);\n this.setUniform('u_mouseVelocity', 'vec2', [viji.mouse.velocity.x, -viji.mouse.velocity.y]);\n \n // Keyboard - Common keys\n this.setUniform('u_keySpace', 'bool', viji.keyboard.isPressed(' ') || viji.keyboard.isPressed('space'));\n this.setUniform('u_keyShift', 'bool', viji.keyboard.shift);\n this.setUniform('u_keyCtrl', 'bool', viji.keyboard.ctrl);\n this.setUniform('u_keyAlt', 'bool', viji.keyboard.alt);\n this.setUniform('u_keyW', 'bool', viji.keyboard.isPressed('w') || viji.keyboard.isPressed('W'));\n this.setUniform('u_keyA', 'bool', viji.keyboard.isPressed('a') || viji.keyboard.isPressed('A'));\n this.setUniform('u_keyS', 'bool', viji.keyboard.isPressed('s') || viji.keyboard.isPressed('S'));\n this.setUniform('u_keyD', 'bool', viji.keyboard.isPressed('d') || viji.keyboard.isPressed('D'));\n this.setUniform('u_keyUp', 'bool', viji.keyboard.isPressed('ArrowUp'));\n this.setUniform('u_keyDown', 'bool', viji.keyboard.isPressed('ArrowDown'));\n this.setUniform('u_keyLeft', 'bool', viji.keyboard.isPressed('ArrowLeft'));\n this.setUniform('u_keyRight', 'bool', viji.keyboard.isPressed('ArrowRight'));\n \n // Touch (flip Y from DOM coords to WebGL coords)\n this.setUniform('u_touchCount', 'int', viji.touches.count);\n for (let i = 0; i < 5; i++) {\n const touch = viji.touches.points[i];\n if (touch) {\n this.setUniform(`u_touch${i}`, 'vec2', [touch.x, viji.height - touch.y]);\n } else {\n this.setUniform(`u_touch${i}`, 'vec2', [0, 0]);\n }\n }\n \n // Audio\n const audio = viji.audio;\n this.setUniform('u_audioVolume', 'float', audio.volume?.current || 0);\n this.setUniform('u_audioPeak', 'float', audio.volume?.peak || 0);\n // Map new band names to shader uniforms\n this.setUniform('u_audioBass', 'float', audio.bands?.low || 0); // low = bass (20-150 Hz)\n this.setUniform('u_audioMid', 'float', audio.bands?.mid || 0);\n this.setUniform('u_audioTreble', 'float', audio.bands?.high || 0); // high = treble (8000-20000 Hz)\n this.setUniform('u_audioSubBass', 'float', audio.bands?.low || 0); // use low for sub-bass\n this.setUniform('u_audioLowMid', 'float', audio.bands?.lowMid || 0);\n this.setUniform('u_audioHighMid', 'float', audio.bands?.highMid || 0);\n this.setUniform('u_audioPresence', 'float', audio.bands?.highMid || 0); // use highMid for presence\n this.setUniform('u_audioBrilliance', 'float', audio.bands?.high || 0); // use high for brilliance\n \n // Audio FFT texture\n if (audio.isConnected) {\n this.updateAudioFFTTexture(audio.getFrequencyData());\n }\n \n // Video\n const video = viji.video;\n if (video.isConnected && video.currentFrame) {\n this.updateVideoTexture(video.currentFrame);\n this.setUniform('u_videoResolution', 'vec2', [video.frameWidth, video.frameHeight]);\n this.setUniform('u_videoFrameRate', 'float', video.frameRate);\n } else {\n this.setUniform('u_videoResolution', 'vec2', [0, 0]);\n this.setUniform('u_videoFrameRate', 'float', 0);\n }\n \n // Multi-Stream Compositor\n const streams = viji.streams || [];\n const streamCount = Math.min(streams.length, ShaderWorkerAdapter.MAX_STREAMS);\n this.setUniform('u_streamCount', 'int', streamCount);\n \n \n for (let i = 0; i < ShaderWorkerAdapter.MAX_STREAMS; i++) {\n // Use individual uniform names instead of array syntax\n const connectedUniform = `u_stream${i}Connected`;\n const resolutionUniform = `u_stream${i}Resolution`;\n \n if (i < streamCount && streams[i]?.isConnected && streams[i]?.currentFrame) {\n this.updateStreamTexture(i, streams[i].currentFrame);\n this.setUniform(resolutionUniform, 'vec2', \n [streams[i].frameWidth, streams[i].frameHeight]);\n this.setUniform(connectedUniform, 'bool', true);\n \n } else {\n this.setUniform(resolutionUniform, 'vec2', [0, 0]);\n this.setUniform(connectedUniform, 'bool', false);\n }\n }\n \n // CV - Faces\n const faces = video.faces || [];\n this.setUniform('u_faceCount', 'int', faces.length);\n if (faces.length > 0) {\n const face = faces[0];\n this.setUniform('u_face0Bounds', 'vec4', [face.bounds.x, face.bounds.y, face.bounds.width, face.bounds.height]);\n this.setUniform('u_face0HeadPose', 'vec3', [face.headPose.pitch, face.headPose.yaw, face.headPose.roll]);\n this.setUniform('u_face0Confidence', 'float', face.confidence);\n this.setUniform('u_face0Happy', 'float', face.expressions.happy);\n this.setUniform('u_face0Sad', 'float', face.expressions.sad);\n this.setUniform('u_face0Angry', 'float', face.expressions.angry);\n this.setUniform('u_face0Surprised', 'float', face.expressions.surprised);\n } else {\n this.setUniform('u_face0Bounds', 'vec4', [0, 0, 0, 0]);\n this.setUniform('u_face0HeadPose', 'vec3', [0, 0, 0]);\n this.setUniform('u_face0Confidence', 'float', 0);\n this.setUniform('u_face0Happy', 'float', 0);\n this.setUniform('u_face0Sad', 'float', 0);\n this.setUniform('u_face0Angry', 'float', 0);\n this.setUniform('u_face0Surprised', 'float', 0);\n }\n \n // CV - Hands\n const hands = video.hands || [];\n this.setUniform('u_handCount', 'int', hands.length);\n \n const leftHand = hands.find((h: any) => h.handedness === 'left');\n const rightHand = hands.find((h: any) => h.handedness === 'right');\n \n if (leftHand) {\n this.setUniform('u_leftHandPalm', 'vec3', [leftHand.palm.x, leftHand.palm.y, leftHand.palm.z]);\n this.setUniform('u_leftHandFist', 'float', leftHand.gestures?.fist || 0);\n this.setUniform('u_leftHandOpen', 'float', leftHand.gestures?.openPalm || 0);\n } else {\n this.setUniform('u_leftHandPalm', 'vec3', [0, 0, 0]);\n this.setUniform('u_leftHandFist', 'float', 0);\n this.setUniform('u_leftHandOpen', 'float', 0);\n }\n \n if (rightHand) {\n this.setUniform('u_rightHandPalm', 'vec3', [rightHand.palm.x, rightHand.palm.y, rightHand.palm.z]);\n this.setUniform('u_rightHandFist', 'float', rightHand.gestures?.fist || 0);\n this.setUniform('u_rightHandOpen', 'float', rightHand.gestures?.openPalm || 0);\n } else {\n this.setUniform('u_rightHandPalm', 'vec3', [0, 0, 0]);\n this.setUniform('u_rightHandFist', 'float', 0);\n this.setUniform('u_rightHandOpen', 'float', 0);\n }\n \n // CV - Pose\n const pose = video.pose;\n this.setUniform('u_poseDetected', 'bool', pose !== null);\n if (pose) {\n // Simplified - just provide key landmarks\n // Nose (landmark 0), wrists (landmarks 15, 16), ankles (landmarks 27, 28)\n const nose = pose.landmarks[0];\n const leftWrist = pose.landmarks[15];\n const rightWrist = pose.landmarks[16];\n const leftAnkle = pose.landmarks[27];\n const rightAnkle = pose.landmarks[28];\n \n this.setUniform('u_nosePosition', 'vec2', [nose?.x || 0, nose?.y || 0]);\n this.setUniform('u_leftWristPosition', 'vec2', [leftWrist?.x || 0, leftWrist?.y || 0]);\n this.setUniform('u_rightWristPosition', 'vec2', [rightWrist?.x || 0, rightWrist?.y || 0]);\n this.setUniform('u_leftAnklePosition', 'vec2', [leftAnkle?.x || 0, leftAnkle?.y || 0]);\n this.setUniform('u_rightAnklePosition', 'vec2', [rightAnkle?.x || 0, rightAnkle?.y || 0]);\n } else {\n this.setUniform('u_nosePosition', 'vec2', [0, 0]);\n this.setUniform('u_leftWristPosition', 'vec2', [0, 0]);\n this.setUniform('u_rightWristPosition', 'vec2', [0, 0]);\n this.setUniform('u_leftAnklePosition', 'vec2', [0, 0]);\n this.setUniform('u_rightAnklePosition', 'vec2', [0, 0]);\n }\n \n // CV - Segmentation\n const segmentation = video.segmentation;\n if (segmentation) {\n this.updateSegmentationTexture(segmentation.mask, segmentation.width, segmentation.height);\n this.setUniform('u_segmentationRes', 'vec2', [segmentation.width, segmentation.height]);\n } else {\n this.setUniform('u_segmentationRes', 'vec2', [0, 0]);\n }\n \n // Device Sensors - Internal Device (viji.device)\n const internalDevice = viji.device;\n if (internalDevice) {\n // Motion data\n const motion = internalDevice.motion;\n if (motion?.acceleration) {\n this.setUniform('u_deviceAcceleration', 'vec3', [\n motion.acceleration.x ?? 0,\n motion.acceleration.y ?? 0,\n motion.acceleration.z ?? 0\n ]);\n } else {\n this.setUniform('u_deviceAcceleration', 'vec3', [0, 0, 0]);\n }\n \n if (motion?.accelerationIncludingGravity) {\n this.setUniform('u_deviceAccelerationGravity', 'vec3', [\n motion.accelerationIncludingGravity.x ?? 0,\n motion.accelerationIncludingGravity.y ?? 0,\n motion.accelerationIncludingGravity.z ?? 0\n ]);\n } else {\n this.setUniform('u_deviceAccelerationGravity', 'vec3', [0, 0, 0]);\n }\n \n if (motion?.rotationRate) {\n this.setUniform('u_deviceRotationRate', 'vec3', [\n motion.rotationRate.alpha ?? 0,\n motion.rotationRate.beta ?? 0,\n motion.rotationRate.gamma ?? 0\n ]);\n } else {\n this.setUniform('u_deviceRotationRate', 'vec3', [0, 0, 0]);\n }\n \n // Orientation data\n const orientation = internalDevice.orientation;\n if (orientation) {\n this.setUniform('u_deviceOrientation', 'vec3', [\n orientation.alpha ?? 0,\n orientation.beta ?? 0,\n orientation.gamma ?? 0\n ]);\n this.setUniform('u_deviceOrientationAbsolute', 'bool', orientation.absolute);\n } else {\n this.setUniform('u_deviceOrientation', 'vec3', [0, 0, 0]);\n this.setUniform('u_deviceOrientationAbsolute', 'bool', false);\n }\n \n // Geolocation data\n const geolocation = internalDevice.geolocation;\n if (geolocation) {\n this.setUniform('u_deviceLocation', 'vec2', [\n geolocation.latitude ?? 0,\n geolocation.longitude ?? 0\n ]);\n this.setUniform('u_deviceLocationExt', 'vec4', [\n geolocation.altitude ?? 0,\n geolocation.accuracy ?? 0,\n geolocation.heading ?? 0,\n geolocation.speed ?? 0\n ]);\n } else {\n this.setUniform('u_deviceLocation', 'vec2', [0, 0]);\n this.setUniform('u_deviceLocationExt', 'vec4', [0, 0, 0, 0]);\n }\n } else {\n // No internal device data\n this.setUniform('u_deviceAcceleration', 'vec3', [0, 0, 0]);\n this.setUniform('u_deviceAccelerationGravity', 'vec3', [0, 0, 0]);\n this.setUniform('u_deviceRotationRate', 'vec3', [0, 0, 0]);\n this.setUniform('u_deviceOrientation', 'vec3', [0, 0, 0]);\n this.setUniform('u_deviceOrientationAbsolute', 'bool', false);\n this.setUniform('u_deviceLocation', 'vec2', [0, 0]);\n this.setUniform('u_deviceLocationExt', 'vec4', [0, 0, 0, 0]);\n }\n \n // Device Sensors - External Devices (viji.devices[])\n const externalDevices = viji.devices || [];\n const externalDeviceCount = Math.min(externalDevices.length, ShaderWorkerAdapter.MAX_EXTERNAL_DEVICES);\n this.setUniform('u_externalDeviceCount', 'int', externalDeviceCount);\n \n for (let i = 0; i < ShaderWorkerAdapter.MAX_EXTERNAL_DEVICES; i++) {\n if (i < externalDeviceCount) {\n const device = externalDevices[i];\n \n // Motion data\n const motion = device.motion;\n if (motion?.acceleration) {\n this.setUniform(`u_device${i}Acceleration`, 'vec3', [\n motion.acceleration.x ?? 0,\n motion.acceleration.y ?? 0,\n motion.acceleration.z ?? 0\n ]);\n } else {\n this.setUniform(`u_device${i}Acceleration`, 'vec3', [0, 0, 0]);\n }\n \n if (motion?.accelerationIncludingGravity) {\n this.setUniform(`u_device${i}AccelerationGravity`, 'vec3', [\n motion.accelerationIncludingGravity.x ?? 0,\n motion.accelerationIncludingGravity.y ?? 0,\n motion.accelerationIncludingGravity.z ?? 0\n ]);\n } else {\n this.setUniform(`u_device${i}AccelerationGravity`, 'vec3', [0, 0, 0]);\n }\n \n if (motion?.rotationRate) {\n this.setUniform(`u_device${i}RotationRate`, 'vec3', [\n motion.rotationRate.alpha ?? 0,\n motion.rotationRate.beta ?? 0,\n motion.rotationRate.gamma ?? 0\n ]);\n } else {\n this.setUniform(`u_device${i}RotationRate`, 'vec3', [0, 0, 0]);\n }\n \n // Orientation data\n const orientation = device.orientation;\n if (orientation) {\n this.setUniform(`u_device${i}Orientation`, 'vec3', [\n orientation.alpha ?? 0,\n orientation.beta ?? 0,\n orientation.gamma ?? 0\n ]);\n } else {\n this.setUniform(`u_device${i}Orientation`, 'vec3', [0, 0, 0]);\n }\n \n // Geolocation data\n const geolocation = device.geolocation;\n if (geolocation) {\n this.setUniform(`u_device${i}Location`, 'vec2', [\n geolocation.latitude ?? 0,\n geolocation.longitude ?? 0\n ]);\n } else {\n this.setUniform(`u_device${i}Location`, 'vec2', [0, 0]);\n }\n } else {\n // No device at this index - set to zero\n this.setUniform(`u_device${i}Acceleration`, 'vec3', [0, 0, 0]);\n this.setUniform(`u_device${i}AccelerationGravity`, 'vec3', [0, 0, 0]);\n this.setUniform(`u_device${i}RotationRate`, 'vec3', [0, 0, 0]);\n this.setUniform(`u_device${i}Orientation`, 'vec3', [0, 0, 0]);\n this.setUniform(`u_device${i}Location`, 'vec2', [0, 0]);\n }\n }\n }\n \n /**\n * Update parameter uniforms from parameter objects\n */\n private updateParameterUniforms(parameterObjects: Map<string, any>): void {\n for (const param of this.parameters) {\n const paramObj = parameterObjects.get(param.uniformName);\n if (!paramObj) {\n // Debug: Parameter not found\n if (Math.random() < 0.01) {\n console.log(`[ShaderAdapter] Parameter '${param.uniformName}' not found in parameterObjects`);\n }\n continue;\n }\n \n const value = paramObj.value;\n \n \n switch (param.type) {\n case 'slider':\n case 'number':\n this.setUniform(param.uniformName, 'float', value);\n break;\n \n case 'color':\n // Convert hex color to RGB vec3\n const rgb = this.hexToRgb(value);\n this.setUniform(param.uniformName, 'vec3', rgb);\n break;\n \n case 'toggle':\n this.setUniform(param.uniformName, 'bool', value);\n break;\n \n case 'select':\n // Select uses index\n const index = param.config.options?.indexOf(value) || 0;\n this.setUniform(param.uniformName, 'int', index);\n break;\n \n case 'image':\n // Image parameters are handled separately as textures\n if (value) {\n this.updateImageTexture(param.uniformName, value);\n }\n break;\n }\n }\n }\n \n /**\n * Set uniform value\n */\n private setUniform(name: string, type: string, value: any): void {\n const location = this.uniformLocations.get(name);\n if (location === null || location === undefined) {\n // Debug: Log missing array uniforms\n if (name.includes('[') && Math.random() < 0.01) {\n console.log(`[ShaderAdapter] Uniform '${name}' not found (location is ${location})`);\n }\n return; // Uniform not used in shader (optimized away)\n }\n \n const gl = this.gl;\n \n switch (type) {\n case 'float':\n gl.uniform1f(location, value);\n break;\n case 'int':\n gl.uniform1i(location, value);\n break;\n case 'bool':\n gl.uniform1i(location, value ? 1 : 0);\n break;\n case 'vec2':\n gl.uniform2f(location, value[0], value[1]);\n break;\n case 'vec3':\n gl.uniform3f(location, value[0], value[1], value[2]);\n break;\n case 'vec4':\n gl.uniform4f(location, value[0], value[1], value[2], value[3]);\n break;\n }\n }\n \n /**\n * Convert hex color to RGB [0-1]\n */\n private hexToRgb(hex: string): [number, number, number] {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n if (result) {\n return [\n parseInt(result[1], 16) / 255,\n parseInt(result[2], 16) / 255,\n parseInt(result[3], 16) / 255\n ];\n }\n return [0, 0, 0];\n }\n \n /**\n * Update audio FFT texture\n */\n private updateAudioFFTTexture(frequencyData: Uint8Array): void {\n const gl = this.gl;\n const unit = this.textureUnits.get('u_audioFFT')!;\n \n if (!this.audioFFTTexture) {\n this.audioFFTTexture = gl.createTexture();\n }\n \n gl.activeTexture(gl.TEXTURE0 + unit);\n gl.bindTexture(gl.TEXTURE_2D, this.audioFFTTexture);\n \n gl.texImage2D(\n gl.TEXTURE_2D, 0, gl.LUMINANCE,\n frequencyData.length, 1, 0,\n gl.LUMINANCE, gl.UNSIGNED_BYTE,\n frequencyData\n );\n \n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n \n const location = this.uniformLocations.get('u_audioFFT');\n if (location) {\n gl.uniform1i(location, unit);\n }\n }\n \n /**\n * Update video texture\n * Supports both OffscreenCanvas and ImageBitmap\n */\n private updateVideoTexture(videoFrame: OffscreenCanvas | ImageBitmap): void {\n const gl = this.gl;\n const unit = this.textureUnits.get('u_video')!;\n\n if (!this.videoTexture) {\n this.videoTexture = gl.createTexture();\n }\n\n gl.activeTexture(gl.TEXTURE0 + unit);\n gl.bindTexture(gl.TEXTURE_2D, this.videoTexture);\n\n // Only flip OffscreenCanvas (webcam/video with Y-down coordinates)\n // ImageBitmap sources would be pre-flipped (already Y-up)\n const shouldFlip = videoFrame instanceof OffscreenCanvas;\n \n if (shouldFlip) {\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);\n }\n\n gl.texImage2D(\n gl.TEXTURE_2D, 0, gl.RGBA,\n gl.RGBA, gl.UNSIGNED_BYTE,\n videoFrame\n );\n\n // Reset to default\n if (shouldFlip) {\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n }\n\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\n const location = this.uniformLocations.get('u_video');\n if (location) {\n gl.uniform1i(location, unit);\n }\n \n // Close ImageBitmap after GPU upload if applicable\n if (videoFrame instanceof ImageBitmap) {\n videoFrame.close();\n }\n }\n \n /**\n * Update compositor stream texture at specified index\n * Supports both OffscreenCanvas and ImageBitmap for zero-copy pipeline\n */\n private updateStreamTexture(index: number, streamFrame: OffscreenCanvas | ImageBitmap): void {\n const gl = this.gl;\n const uniformName = `u_stream${index}`; // Individual uniform, not array\n const unit = this.textureUnits.get(uniformName)!;\n\n // Create texture if needed\n if (!this.streamTextures[index]) {\n this.streamTextures[index] = gl.createTexture();\n }\n\n gl.activeTexture(gl.TEXTURE0 + unit);\n gl.bindTexture(gl.TEXTURE_2D, this.streamTextures[index]!);\n\n // Only flip OffscreenCanvas (webcam/video sources with Y-down coordinates)\n // ImageBitmap from compositor sources are pre-flipped at capture (already Y-up for WebGL)\n const shouldFlip = streamFrame instanceof OffscreenCanvas;\n if (shouldFlip) {\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);\n }\n\n // Upload texture (works with both Canvas and ImageBitmap - GPU-to-GPU!)\n gl.texImage2D(\n gl.TEXTURE_2D, 0, gl.RGBA,\n gl.RGBA, gl.UNSIGNED_BYTE,\n streamFrame\n );\n\n // Reset to default\n if (shouldFlip) {\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n }\n\n // Same texture parameters as video\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\n // Bind texture unit to uniform\n const location = this.uniformLocations.get(uniformName);\n if (location) {\n gl.uniform1i(location, unit);\n }\n \n // 🚀 ZERO-COPY: Close ImageBitmap after GPU upload to free GPU memory immediately\n // Canvas doesn't need closing (managed differently)\n if (streamFrame instanceof ImageBitmap) {\n streamFrame.close();\n }\n }\n \n /**\n * Update segmentation mask texture\n */\n private updateSegmentationTexture(mask: Uint8Array, width: number, height: number): void {\n const gl = this.gl;\n const unit = this.textureUnits.get('u_segmentationMask')!;\n \n if (!this.segmentationTexture) {\n this.segmentationTexture = gl.createTexture();\n }\n \n gl.activeTexture(gl.TEXTURE0 + unit);\n gl.bindTexture(gl.TEXTURE_2D, this.segmentationTexture);\n \n gl.texImage2D(\n gl.TEXTURE_2D, 0, gl.LUMINANCE,\n width, height, 0,\n gl.LUMINANCE, gl.UNSIGNED_BYTE,\n mask\n );\n \n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n \n const location = this.uniformLocations.get('u_segmentationMask');\n if (location) {\n gl.uniform1i(location, unit);\n }\n }\n \n /**\n * Update image parameter texture\n */\n private updateImageTexture(name: string, imageBitmap: ImageBitmap | OffscreenCanvas): void {\n const gl = this.gl;\n \n // Assign texture unit if not already assigned\n if (!this.textureUnits.has(name)) {\n this.textureUnits.set(name, this.nextTextureUnit++);\n }\n \n const unit = this.textureUnits.get(name)!;\n \n // Create texture if needed\n if (!this.textures.has(name)) {\n const texture = gl.createTexture();\n if (texture) {\n this.textures.set(name, texture);\n }\n }\n \n const texture = this.textures.get(name);\n if (!texture) return;\n \n gl.activeTexture(gl.TEXTURE0 + unit);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n \n gl.texImage2D(\n gl.TEXTURE_2D, 0, gl.RGBA,\n gl.RGBA, gl.UNSIGNED_BYTE,\n imageBitmap\n );\n \n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n \n const location = this.uniformLocations.get(name);\n if (location) {\n gl.uniform1i(location, unit);\n }\n }\n \n /**\n * Handle canvas resize\n */\n public resize(width: number, height: number): void {\n const gl = this.gl;\n gl.viewport(0, 0, width, height);\n \n // Recreate backbuffer framebuffers if enabled to match new canvas size\n if (this.backbufferEnabled) {\n this.createBackbufferFramebuffers();\n }\n }\n \n /**\n * Get parameter definitions for host\n */\n public getParameterDefinitions(): ShaderParameterDefinition[] {\n return this.parameters;\n }\n \n /**\n * Cleanup resources\n */\n public destroy(): void {\n const gl = this.gl;\n \n // Delete program\n if (this.program) {\n gl.deleteProgram(this.program);\n this.program = null;\n }\n \n // Delete textures\n if (this.audioFFTTexture) gl.deleteTexture(this.audioFFTTexture);\n if (this.videoTexture) gl.deleteTexture(this.videoTexture);\n if (this.segmentationTexture) gl.deleteTexture(this.segmentationTexture);\n \n // Delete stream textures\n for (const texture of this.streamTextures) {\n if (texture) gl.deleteTexture(texture);\n }\n this.streamTextures = [];\n \n // Delete parameter image textures\n for (const texture of this.textures.values()) {\n if (texture) gl.deleteTexture(texture);\n }\n this.textures.clear();\n \n // Delete backbuffer resources\n if (this.backbufferFramebuffer) gl.deleteFramebuffer(this.backbufferFramebuffer);\n if (this.backbufferTexture) gl.deleteTexture(this.backbufferTexture);\n if (this.currentFramebuffer) gl.deleteFramebuffer(this.currentFramebuffer);\n if (this.currentTexture) gl.deleteTexture(this.currentTexture);\n \n // Delete buffers\n if (this.quadBuffer) gl.deleteBuffer(this.quadBuffer);\n }\n}\n\n","import { \n WorkerMessage, \n WorkerInitMessage, \n WorkerFrameRateMessage, \n WorkerRefreshRateMessage, \n WorkerCVFrameRateMessage,\n WorkerResolutionMessage, \n WorkerParameterMessage, \n WorkerParameterBatchMessage, \n WorkerStreamMessage, \n WorkerAudioAnalysisMessage,\n WorkerVideoCanvasSetupMessage,\n WorkerVideoFrameUpdateMessage,\n WorkerVideoConfigUpdateMessage,\n WorkerPerformanceMessage, \n WorkerSetSceneCodeMessage,\n WorkerDeviceStateMessage\n} from './types.js';\nimport { \n SliderConfig, \n ColorConfig, \n ToggleConfig, \n SelectConfig, \n TextConfig, \n NumberConfig,\n DeviceSensorState,\n DeviceState\n} from '../types/index.js';\nimport { ParameterSystem } from './ParameterSystem.js';\nimport { InteractionSystem } from './InteractionSystem.js';\nimport { VideoSystem } from './VideoSystem.js';\nimport { P5WorkerAdapter } from './renderers/P5WorkerAdapter.js';\nimport { ShaderWorkerAdapter } from './renderers/ShaderWorkerAdapter.js';\n\n// Viji Worker Runtime Implementation\nexport class VijiWorkerRuntime {\n private canvas: OffscreenCanvas | null = null;\n private ctx: OffscreenCanvasRenderingContext2D | null = null;\n private gl: WebGLRenderingContext | WebGL2RenderingContext | null = null;\n private isRunning = false;\n private frameCount = 0;\n private lastTime = 0;\n private startTime = 0;\n private frameRateMode: 'full' | 'half' = 'full';\n private skipNextFrame = false;\n private screenRefreshRate = 60; // Will be detected\n \n // Debug logging control\n private debugMode = false;\n \n // P5.js adapter for P5 mode\n private p5Adapter: any = null;\n \n // Shader adapter for shader mode\n private shaderAdapter: any = null;\n \n private rendererType: 'native' | 'p5' | 'shader' = 'native';\n\n // Pending capture requests (queue to handle multiple simultaneous requests)\n private pendingCaptures: Array<{\n type: 'capture-frame';\n id: string;\n data: { \n format?: 'blob' | 'bitmap';\n type?: string; \n resolution?: number | { width: number; height: number };\n };\n }> = [];\n\n /**\n * Enable or disable debug logging\n */\n setDebugMode(enabled: boolean): void {\n this.debugMode = enabled;\n // Propagate to child systems\n this.videoSystems.forEach(vs => vs?.setDebugMode(enabled));\n if (this.parameterSystem && 'setDebugMode' in this.parameterSystem) {\n (this.parameterSystem as any).setDebugMode(enabled);\n }\n if (this.interactionSystem && 'setDebugMode' in this.interactionSystem) {\n (this.interactionSystem as any).setDebugMode(enabled);\n }\n }\n\n /**\n * Debug logging helper\n */\n private debugLog(message: string, ...args: any[]): void {\n if (this.debugMode) {\n console.log(message, ...args);\n }\n }\n \n // Effective refresh rate tracking\n private effectiveFrameTimes: number[] = [];\n private lastEffectiveRateReport = 0;\n private effectiveRateReportInterval = 1000; // Report every 1 second\n\n // Parameter system\n private parameterSystem: ParameterSystem;\n \n // Interaction system (Phase 7)\n private interactionSystem: InteractionSystem;\n \n // Video systems (multi-stream) - index 0 = main with CV, 1+ = additional without CV\n private videoSystems: VideoSystem[] = [];\n private hasMainVideoStream: boolean = false; // Track if videoSystems[0] is main stream\n\n // Auto-capture for frame sources\n private autoCaptureEnabled: boolean = false;\n private autoCaptureFormat: { flipY: boolean } = { flipY: true }; // Default: flip for WebGL compatibility\n \n // Audio state (Phase 5) - receives analysis results from host\n private audioState = {\n isConnected: false,\n volume: { current: 0, peak: 0, smoothed: 0 },\n bands: {\n low: 0, lowMid: 0, mid: 0, highMid: 0, high: 0,\n lowSmoothed: 0, lowMidSmoothed: 0, midSmoothed: 0, highMidSmoothed: 0, highSmoothed: 0\n },\n beat: {\n kick: 0,\n snare: 0,\n hat: 0,\n any: 0,\n kickSmoothed: 0,\n snareSmoothed: 0,\n anySmoothed: 0,\n triggers: { any: false, kick: false, snare: false, hat: false },\n bpm: 120,\n phase: 0,\n bar: 0,\n confidence: 0,\n isLocked: false\n },\n spectral: {\n brightness: 0,\n flatness: 0,\n flux: 0\n },\n frequencyData: new Uint8Array(0)\n };\n\n // Device sensor state (internal device + external devices)\n private deviceState: {\n device: DeviceSensorState;\n devices: DeviceState[];\n } = {\n device: {\n motion: null,\n orientation: null,\n geolocation: null\n },\n devices: []\n };\n\n // Video state is now managed by the worker-side VideoSystem\n \n // Artist API object\n public viji = {\n // Canvas (will be set during init)\n canvas: null as OffscreenCanvas | null,\n ctx: null as OffscreenCanvasRenderingContext2D | null,\n gl: null as WebGLRenderingContext | WebGL2RenderingContext | null,\n width: 0,\n height: 0,\n pixelRatio: 1,\n \n // Timing\n time: 0,\n deltaTime: 0,\n frameCount: 0,\n fps: 60,\n \n // Audio API (Phase 5) - will be set in constructor\n audio: {} as any,\n\n // Main video stream (index 0, CV enabled)\n video: {\n isConnected: false,\n currentFrame: null as OffscreenCanvas | null,\n frameWidth: 0,\n frameHeight: 0,\n frameRate: 0,\n getFrameData: () => null,\n faces: [] as any[],\n hands: [] as any[],\n pose: null,\n segmentation: null,\n cv: {} as any\n },\n\n // Additional video streams (index 1+, no CV)\n streams: [] as any[],\n \n // Interaction APIs will be added during construction\n mouse: {} as any,\n keyboard: {} as any,\n touches: {} as any,\n \n // Device sensor APIs (internal device + external devices)\n device: {\n motion: null,\n orientation: null,\n geolocation: null\n } as DeviceSensorState,\n devices: [] as DeviceState[],\n \n // Parameter helper functions (return parameter objects) - delegate to parameter system\n slider: (defaultValue: number, config: SliderConfig) => {\n return this.parameterSystem.createSliderParameter(defaultValue, config);\n },\n \n color: (defaultValue: string, config: ColorConfig) => {\n return this.parameterSystem.createColorParameter(defaultValue, config);\n },\n \n toggle: (defaultValue: boolean, config: ToggleConfig) => {\n return this.parameterSystem.createToggleParameter(defaultValue, config);\n },\n \n select: (defaultValue: string | number, config: SelectConfig) => {\n return this.parameterSystem.createSelectParameter(defaultValue, config);\n },\n \n text: (defaultValue: string, config: TextConfig) => {\n return this.parameterSystem.createTextParameter(defaultValue, config);\n },\n \n number: (defaultValue: number, config: NumberConfig) => {\n return this.parameterSystem.createNumberParameter(defaultValue, config);\n },\n \n image: (defaultValue: null, config: any) => {\n return this.parameterSystem.createImageParameter(defaultValue, config);\n },\n \n // Context selection\n useContext: (type: '2d' | 'webgl'): OffscreenCanvasRenderingContext2D | WebGLRenderingContext | WebGL2RenderingContext | null => {\n if (type === '2d') {\n if (!this.ctx && this.canvas) {\n this.ctx = this.canvas.getContext('2d');\n this.viji.ctx = this.ctx;\n }\n return this.ctx;\n } else if (type === 'webgl') {\n if (!this.gl && this.canvas) {\n this.gl = this.canvas.getContext('webgl2') || this.canvas.getContext('webgl');\n this.viji.gl = this.gl;\n \n // Set initial WebGL viewport\n if (this.gl) {\n this.gl.viewport(0, 0, this.viji.width, this.viji.height);\n }\n }\n return this.gl;\n }\n return null;\n }\n };\n \n constructor() {\n // Initialize parameter system with post message callback\n this.parameterSystem = new ParameterSystem((type: string, data?: any) => {\n this.postMessage(type, data);\n });\n\n // Initialize interaction system\n this.interactionSystem = new InteractionSystem();\n\n // Video systems initialized dynamically as needed\n\n // Integrate APIs into viji object\n Object.assign(this.viji, this.interactionSystem.getInteractionAPIs());\n // viji.video and viji.streams are updated when video systems are set up\n\n // Initialize audio API with getFrequencyData function\n this.viji.audio = {\n ...this.audioState,\n getFrequencyData: () => this.audioState.frequencyData\n };\n \n this.setupMessageHandling();\n }\n\n /**\n * Initialize P5.js mode\n * Sets up P5 rendering with P5WorkerAdapter\n */\n public async initP5Mode(setup: Function | null, render: Function): Promise<void> {\n try {\n this.rendererType = 'p5';\n this.debugLog('🎨 Initializing P5.js mode...');\n \n // Create adapter instance\n this.p5Adapter = new P5WorkerAdapter(\n this.canvas!,\n this.viji,\n { \n setup: setup as ((viji: any, p5: any) => void) | null, \n render: render as (viji: any, p5: any) => void \n }\n );\n \n // Initialize P5 (loads P5.js library from CDN)\n await this.p5Adapter.init();\n \n this.debugLog('✅ P5.js mode initialized successfully');\n } catch (error) {\n console.error('❌ Failed to initialize P5.js mode:', error);\n this.postMessage('error', {\n message: `P5.js initialization failed: ${(error as Error).message}`,\n code: 'P5_INIT_ERROR'\n });\n // Fall back to native mode on error\n this.rendererType = 'native';\n this.p5Adapter = null;\n }\n }\n \n /**\n * Initialize shader rendering mode\n * Used when artist code includes // @renderer shader\n */\n public async initShaderMode(shaderCode: string): Promise<void> {\n try {\n this.rendererType = 'shader';\n this.debugLog('🎨 Initializing Shader mode...');\n \n // Create adapter instance\n this.shaderAdapter = new ShaderWorkerAdapter(\n this.canvas!,\n this.viji,\n shaderCode\n );\n \n // Initialize (compile shader, setup WebGL)\n await this.shaderAdapter.init();\n \n // Get parameter definitions from shader and register them\n const parameterDefinitions = this.shaderAdapter.getParameterDefinitions();\n for (const param of parameterDefinitions) {\n // Register parameter using helper method based on type\n this.registerShaderParameter(param);\n }\n \n this.debugLog('✅ Shader mode initialized successfully');\n } catch (error) {\n console.error('❌ Failed to initialize Shader mode:', error);\n this.postMessage('error', {\n message: `Shader initialization failed: ${(error as Error).message}`,\n code: 'SHADER_INIT_ERROR'\n });\n // Fall back to native mode on error\n this.rendererType = 'native';\n this.shaderAdapter = null;\n }\n }\n \n /**\n * Register a shader parameter with the parameter system\n * In the parameter system, the 'label' serves as the parameter name/key\n */\n private registerShaderParameter(param: any): void {\n const config = param.config;\n \n // Use uniformName as the label (which becomes the parameter name)\n // and the config.label as the display label (we'll store it in description for now)\n const paramConfig = {\n ...config,\n label: param.uniformName, // uniformName becomes the parameter key\n description: config.label ? `${config.label}${config.description ? ': ' + config.description : ''}` : config.description\n };\n \n switch (param.type) {\n case 'slider':\n this.viji.slider(config.default, paramConfig);\n break;\n \n case 'number':\n this.viji.number(config.default, paramConfig);\n break;\n \n case 'color':\n this.viji.color(config.default, paramConfig);\n break;\n \n case 'toggle':\n this.viji.toggle(config.default, paramConfig);\n break;\n \n case 'select':\n this.viji.select(config.default, {\n ...paramConfig,\n options: config.options\n });\n break;\n \n case 'image':\n this.viji.image(null, paramConfig);\n break;\n }\n }\n\n // Reset parameter state (called when loading new scene)\n public resetParameterState(): void {\n this.parameterSystem.resetParameterState();\n this.interactionSystem.resetInteractionState();\n \n // Reset audio state\n this.audioState = {\n isConnected: false,\n volume: { current: 0, peak: 0, smoothed: 0 },\n bands: {\n low: 0, lowMid: 0, mid: 0, highMid: 0, high: 0,\n lowSmoothed: 0, lowMidSmoothed: 0, midSmoothed: 0, highMidSmoothed: 0, highSmoothed: 0\n },\n beat: {\n kick: 0,\n snare: 0,\n hat: 0,\n any: 0,\n kickSmoothed: 0,\n snareSmoothed: 0,\n anySmoothed: 0,\n triggers: { any: false, kick: false, snare: false, hat: false },\n bpm: 120,\n phase: 0,\n bar: 0,\n confidence: 0,\n isLocked: false\n },\n spectral: {\n brightness: 0,\n flatness: 0,\n flux: 0\n },\n frequencyData: new Uint8Array(0)\n };\n // Update viji.audio reference\n this.viji.audio = {\n ...this.audioState,\n getFrequencyData: () => this.audioState.frequencyData\n };\n\n // Reset all video systems\n this.videoSystems.forEach(vs => vs.resetVideoState());\n // Update viji.video reference (main stream)\n if (this.videoSystems[0]) {\n Object.assign(this.viji.video, this.videoSystems[0].getVideoAPI());\n }\n // Update viji.streams (additional streams)\n this.updateVijiStreams();\n }\n\n /**\n * Updates viji.streams from videoSystems array\n * Slices based on whether there's a main stream at index 0\n */\n private updateVijiStreams(): void {\n // If there's a main stream, viji.streams = videoSystems[1+]\n // If NO main stream, viji.streams = videoSystems[0+] (all systems)\n const startIndex = this.hasMainVideoStream ? 1 : 0;\n\n const freshStreams = this.videoSystems.slice(startIndex).map((vs) => {\n const api = vs?.getVideoAPI() || {\n isConnected: false,\n currentFrame: null,\n frameWidth: 0,\n frameHeight: 0,\n frameRate: 0,\n getFrameData: () => null\n };\n return api;\n });\n\n // Update array length to match\n this.viji.streams.length = freshStreams.length;\n\n // Update each element in place to maintain object references\n for (let i = 0; i < freshStreams.length; i++) {\n if (this.viji.streams[i]) {\n // Mutate existing object to preserve references\n Object.assign(this.viji.streams[i], freshStreams[i]);\n } else {\n // Add new element if needed\n this.viji.streams[i] = freshStreams[i];\n }\n }\n }\n\n // Send all parameters (from helper functions) to host\n public sendAllParametersToHost(): void {\n this.parameterSystem.sendAllParametersToHost();\n }\n \n private setupMessageHandling(): void {\n self.onmessage = (event: MessageEvent<WorkerMessage>) => {\n const message = event.data;\n \n switch (message.type) {\n case 'init':\n this.handleInit(message);\n break;\n case 'frame-rate-update':\n this.handleFrameRateUpdate(message);\n break;\n case 'refresh-rate-update':\n this.handleRefreshRateUpdate(message);\n break;\n case 'cv-frame-rate-update':\n this.handleCVFrameRateUpdate(message);\n break;\n case 'resolution-update':\n this.handleResolutionUpdate(message);\n break;\n case 'set-scene-code':\n this.handleSetSceneCode(message);\n break;\n case 'debug-mode':\n this.setDebugMode(message.data.enabled);\n break;\n case 'parameter-update':\n this.handleParameterUpdate(message);\n break;\n case 'parameter-batch-update':\n this.handleParameterBatchUpdate(message);\n break;\n case 'stream-update':\n this.handleStreamUpdate(message);\n break;\n case 'audio-analysis-update':\n this.handleAudioAnalysisUpdate(message);\n break;\n case 'video-canvas-setup':\n this.handleVideoCanvasSetup(message);\n break;\n case 'video-frame-update':\n this.handleVideoFrameUpdate(message);\n break;\n case 'video-config-update':\n this.handleVideoConfigUpdate(message);\n break;\n case 'video-streams-prepare':\n this.handleVideoStreamsPrepare(message);\n break;\n case 'video-frame-direct':\n this.handleVideoFrameDirect(message);\n break;\n case 'enable-auto-capture':\n this.autoCaptureEnabled = message.data.enabled;\n // Update format if provided (defaults to true if not specified)\n if (message.data.flipY !== undefined) {\n this.autoCaptureFormat.flipY = message.data.flipY;\n this.debugLog(`[AutoCapture] ${message.data.enabled ? 'ENABLED' : 'DISABLED'} with flipY=${message.data.flipY}`);\n } else {\n this.debugLog(`[AutoCapture] ${message.data.enabled ? 'ENABLED' : 'DISABLED'}`);\n }\n break;\n case 'mouse-update':\n this.handleMouseUpdate(message);\n break;\n case 'keyboard-update':\n this.handleKeyboardUpdate(message);\n break;\n case 'touch-update':\n this.handleTouchUpdate(message);\n break;\n case 'interaction-enabled':\n this.handleInteractionEnabled(message);\n break;\n case 'device-state-update':\n this.handleDeviceStateUpdate(message);\n break;\n case 'performance-update':\n this.handlePerformanceUpdate(message);\n break;\n case 'capture-frame':\n this.handleCaptureFrame(message as any);\n break;\n }\n };\n }\n \n private handleInit(message: WorkerInitMessage): void {\n try {\n this.canvas = message.data.canvas;\n this.viji.canvas = this.canvas;\n \n // Set initial effective resolution (same as canvas size initially)\n this.viji.width = this.canvas.width;\n this.viji.height = this.canvas.height;\n \n // Start render loop\n this.startRenderLoop();\n \n // Send response to init request (resolves the promise)\n this.postMessage('init-response', { \n id: message.id\n });\n \n // Send ready event (for event handlers, no ID)\n this.postMessage('ready', { \n rendererType: this.rendererType,\n canvasSize: { width: this.canvas.width, height: this.canvas.height }\n });\n } catch (error) {\n this.postMessage('error', {\n id: message.id,\n message: (error as Error).message,\n code: 'INIT_ERROR'\n });\n }\n }\n \n private handleFrameRateUpdate(message: WorkerFrameRateMessage): void {\n if (message.data && message.data.mode) {\n this.frameRateMode = message.data.mode;\n this.debugLog('Frame rate mode updated to:', message.data.mode);\n }\n }\n \n private handleRefreshRateUpdate(message: WorkerRefreshRateMessage): void {\n if (message.data && message.data.screenRefreshRate) {\n this.screenRefreshRate = message.data.screenRefreshRate;\n this.debugLog('Screen refresh rate updated to:', message.data.screenRefreshRate + 'Hz');\n }\n }\n\n private handleCVFrameRateUpdate(message: WorkerCVFrameRateMessage): void {\n if (message.data && message.data.mode) {\n // Calculate scene processing FPS based on current settings\n const sceneProcessingFPS = this.frameRateMode === 'full' ? this.screenRefreshRate : this.screenRefreshRate / 2;\n \n // Send CV frame rate configuration to main VideoSystem (index 0)\n if (this.videoSystems[0]) {\n this.videoSystems[0].handleVideoConfigUpdate({\n cvFrameRate: {\n mode: message.data.mode,\n sceneTargetFPS: sceneProcessingFPS\n },\n timestamp: performance.now()\n });\n }\n \n this.debugLog(`CV frame rate updated to: ${message.data.mode} of ${sceneProcessingFPS} FPS scene processing`);\n }\n }\n \n private trackEffectiveFrameTime(currentTime: number): void {\n // Keep track of actual render frame times\n this.effectiveFrameTimes.push(currentTime);\n \n // Keep only the last 60 frames for calculation (1 second at 60fps)\n if (this.effectiveFrameTimes.length > 60) {\n this.effectiveFrameTimes.shift();\n }\n }\n \n private reportPerformanceStats(currentTime: number): void {\n // Report performance stats every second\n if (currentTime - this.lastEffectiveRateReport >= this.effectiveRateReportInterval) {\n if (this.effectiveFrameTimes.length >= 2) {\n // Calculate effective refresh rate from actual frame times\n const totalTime = this.effectiveFrameTimes[this.effectiveFrameTimes.length - 1] - this.effectiveFrameTimes[0];\n const frameCount = this.effectiveFrameTimes.length - 1;\n const effectiveRefreshRate = Math.round((frameCount / totalTime) * 1000);\n \n // Get CV stats from main VideoSystem (index 0)\n const cvStats = this.videoSystems[0]?.getCVStats() || {\n activeFeatures: [],\n processingTime: 0,\n targetFPS: 0,\n actualFPS: 0,\n isProcessing: false\n };\n \n // Send comprehensive performance update to core\n this.postMessage('performance-update', {\n effectiveRefreshRate,\n frameRateMode: this.frameRateMode,\n screenRefreshRate: this.screenRefreshRate,\n rendererType: this.rendererType,\n parameterCount: this.parameterSystem.getParameterCount(),\n // Include CV stats if available\n cv: cvStats ? {\n activeFeatures: cvStats.activeFeatures,\n processingTime: cvStats.processingTime,\n targetFPS: cvStats.effectiveFPS,\n actualFPS: cvStats.actualFPS,\n isProcessing: cvStats.isProcessing\n } : undefined\n });\n }\n \n this.lastEffectiveRateReport = currentTime;\n }\n }\n \n private handleResolutionUpdate(message: WorkerResolutionMessage): void {\n if (message.data) {\n // Update canvas resolution directly (effective dimensions * scale)\n if (this.canvas) {\n this.canvas.width = Math.round(message.data.effectiveWidth);\n this.canvas.height = Math.round(message.data.effectiveHeight);\n }\n \n // Update viji dimensions to match actual canvas\n this.viji.width = Math.round(message.data.effectiveWidth);\n this.viji.height = Math.round(message.data.effectiveHeight);\n \n // Update WebGL viewport if context exists\n if (this.gl) {\n this.gl.viewport(0, 0, this.viji.width, this.viji.height);\n }\n \n // Update P5 canvas if in P5 mode\n if (this.p5Adapter && this.rendererType === 'p5') {\n this.p5Adapter.resize(this.viji.width, this.viji.height);\n }\n \n if (this.shaderAdapter && this.rendererType === 'shader') {\n this.shaderAdapter.resize(this.viji.width, this.viji.height);\n }\n \n this.debugLog('Canvas resolution updated to:', this.viji.width + 'x' + this.viji.height);\n }\n }\n \n private handleParameterUpdate(message: WorkerParameterMessage): void {\n if (message.data && message.data.name !== undefined && message.data.value !== undefined) {\n this.parameterSystem.updateParameterValue(message.data.name, message.data.value);\n }\n }\n\n private handleParameterBatchUpdate(message: WorkerParameterBatchMessage): void {\n if (message.data && message.data.updates) {\n for (const update of message.data.updates) {\n this.parameterSystem.updateParameterValue(update.name, update.value);\n }\n \n // Mark initial values as synced after first batch update\n this.parameterSystem.markInitialValuesSynced();\n this.debugLog('Parameter system initialized successfully');\n }\n }\n \n private handleStreamUpdate(message: WorkerStreamMessage): void {\n // TODO: Handle general stream updates (non-audio)\n this.debugLog('Stream update:', message.data);\n }\n \n private handleAudioAnalysisUpdate(message: WorkerAudioAnalysisMessage): void {\n // Convert events to boolean triggers for convenient artist API\n // This ensures triggers are reliable (never missed) even though we sample async\n const events = message.data.beat.events || [];\n const triggers = {\n kick: events.some(e => e.type === 'kick'),\n snare: events.some(e => e.type === 'snare'),\n hat: events.some(e => e.type === 'hat'),\n any: events.length > 0\n };\n \n // Handle audio analysis results from host\n this.audioState = {\n isConnected: message.data.isConnected,\n volume: message.data.volume,\n bands: message.data.bands,\n beat: {\n ...message.data.beat,\n triggers // Add derived triggers (reliable!)\n },\n spectral: message.data.spectral,\n frequencyData: new Uint8Array(message.data.frequencyData)\n };\n \n // Update viji.audio API (artists get both triggers and events)\n this.viji.audio = {\n ...this.audioState,\n getFrequencyData: () => this.audioState.frequencyData\n };\n }\n\n private handleVideoCanvasSetup(message: WorkerVideoCanvasSetupMessage): void {\n const { streamIndex, isMain } = message.data;\n const index = streamIndex || 0;\n \n const videoSystem = new VideoSystem();\n videoSystem.setDebugMode(this.debugMode);\n videoSystem.handleCanvasSetup({\n offscreenCanvas: message.data.offscreenCanvas,\n width: message.data.width,\n height: message.data.height,\n timestamp: message.data.timestamp\n });\n \n this.videoSystems[index] = videoSystem;\n this.debugLog(`Video system setup at index ${index}, isMain: ${isMain}`);\n \n // Update viji.video API if main stream\n if (index === 0) {\n Object.assign(this.viji.video, videoSystem.getVideoAPI());\n } else {\n // Update viji.streams for additional streams\n this.updateVijiStreams();\n }\n }\n\n private handleVideoFrameUpdate(message: WorkerVideoFrameUpdateMessage): void {\n const index = message.data.streamIndex || 0;\n if (this.videoSystems[index]) {\n this.videoSystems[index].handleFrameUpdate({\n imageBitmap: message.data.imageBitmap,\n timestamp: message.data.timestamp\n });\n \n // Update viji.video API if main stream\n if (index === 0) {\n Object.assign(this.viji.video, this.videoSystems[index].getVideoAPI());\n }\n }\n }\n\n private handleVideoConfigUpdate(message: WorkerVideoConfigUpdateMessage): void {\n const index = message.data.streamIndex || 0;\n if (this.videoSystems[index]) {\n this.videoSystems[index].handleVideoConfigUpdate({\n ...(message.data.targetFrameRate && { targetFrameRate: message.data.targetFrameRate }),\n ...(message.data.cvConfig && { cvConfig: message.data.cvConfig }),\n ...(message.data.width && { width: message.data.width }),\n ...(message.data.height && { height: message.data.height }),\n ...(message.data.disconnect && { disconnect: message.data.disconnect }),\n timestamp: message.data.timestamp\n });\n \n // Update viji.video API if main stream\n if (index === 0) {\n Object.assign(this.viji.video, this.videoSystems[index].getVideoAPI());\n }\n }\n }\n\n private handleVideoStreamsPrepare(message: any): void {\n const { mainStream, mediaStreamCount, directFrameCount } = message.data;\n const totalStreams = (mainStream ? 1 : 0) + mediaStreamCount + directFrameCount;\n \n // Store main stream presence for viji.streams slicing\n this.hasMainVideoStream = mainStream;\n\n this.debugLog(`[Compositor] Preparing video streams: main=${mainStream}, media=${mediaStreamCount}, direct=${directFrameCount}, total=${totalStreams}`);\n\n // Ensure array has enough slots\n while (this.videoSystems.length < totalStreams) {\n this.videoSystems.push(new VideoSystem());\n }\n\n // Initialize direct frame slots (pass renderer type for correct mode)\n const directFrameStartIndex = (mainStream ? 1 : 0) + mediaStreamCount;\n\n for (let i = 0; i < directFrameCount; i++) {\n const index = directFrameStartIndex + i;\n if (!this.videoSystems[index]) {\n this.videoSystems[index] = new VideoSystem();\n }\n this.videoSystems[index].setDebugMode(this.debugMode);\n this.videoSystems[index].initializeForDirectFrames(this.rendererType);\n }\n\n // Update viji.streams to include direct frame streams\n this.updateVijiStreams();\n \n this.debugLog(`Prepared ${totalStreams} video systems (${directFrameCount} direct frames)`);\n }\n\n private handleVideoFrameDirect(message: any): void {\n const index = message.data.streamIndex || 0;\n\n if (!this.videoSystems[index]) {\n this.debugLog(`[Compositor] Creating new VideoSystem at index ${index} for direct frames`);\n this.videoSystems[index] = new VideoSystem();\n this.videoSystems[index].setDebugMode(this.debugMode);\n this.videoSystems[index].initializeForDirectFrames(this.rendererType);\n }\n\n this.videoSystems[index].handleDirectFrame(message.data);\n\n // Note: updateVijiStreams() is called at start of each renderFrame(), no need to call here\n }\n \n private handlePerformanceUpdate(message: WorkerPerformanceMessage): void {\n // TODO: Handle performance updates in Phase 3\n this.debugLog('Performance update:', message.data);\n }\n\n /**\n * Handle capture-frame request from host.\n * Defers capture to immediately after the next render completes to avoid race conditions.\n */\n private async handleCaptureFrame(message: {\n type: 'capture-frame';\n id: string;\n data: { \n format?: 'blob' | 'bitmap';\n type?: string; \n resolution?: number | { width: number; height: number };\n };\n }): Promise<void> {\n // Queue the capture request - it will be executed immediately after next render\n this.pendingCaptures.push(message);\n this.debugLog(`Capture queued: ${message.data.format || 'blob'} (${this.pendingCaptures.length} pending)`);\n }\n\n /**\n * Execute a capture frame request immediately after render completes.\n * This ensures we capture a fully rendered frame, avoiding race conditions.\n */\n private async executeCaptureFrame(message: {\n type: 'capture-frame';\n id: string;\n data: { \n format?: 'blob' | 'bitmap';\n type?: string; \n resolution?: number | { width: number; height: number };\n };\n }): Promise<void> {\n try {\n if (!this.canvas) {\n throw new Error('Canvas not initialized');\n }\n\n const format = message.data.format || 'blob';\n\n // Bitmap format - use transferToImageBitmap (zero-copy!)\n if (format === 'bitmap') {\n const bitmap = this.canvas.transferToImageBitmap();\n \n (self as any).postMessage({\n type: 'capture-frame-result',\n id: message.id,\n timestamp: Date.now(),\n data: { bitmap }\n }, [bitmap]);\n \n return;\n }\n\n // Blob format (existing logic)\n const mimeType = message.data.type || 'image/jpeg';\n\n // Determine target width/height\n const srcWidth = this.canvas.width;\n const srcHeight = this.canvas.height;\n let targetWidth = srcWidth;\n let targetHeight = srcHeight;\n\n if (typeof message.data.resolution === 'number') {\n const scale = message.data.resolution > 0 ? message.data.resolution : 1;\n targetWidth = Math.max(1, Math.floor(srcWidth * scale));\n targetHeight = Math.max(1, Math.floor(srcHeight * scale));\n } else if (message.data.resolution && typeof message.data.resolution === 'object') {\n targetWidth = Math.max(1, Math.floor(message.data.resolution.width));\n targetHeight = Math.max(1, Math.floor(message.data.resolution.height));\n }\n\n // Compute source crop to match aspect ratio if needed\n const srcAspect = srcWidth / srcHeight;\n const dstAspect = targetWidth / targetHeight;\n let sx = 0;\n let sy = 0;\n let sWidth = srcWidth;\n let sHeight = srcHeight;\n\n if (Math.abs(srcAspect - dstAspect) > 1e-6) {\n if (dstAspect > srcAspect) {\n // Need to crop vertically (top/bottom)\n sHeight = Math.floor(srcWidth / dstAspect);\n sy = Math.floor((srcHeight - sHeight) / 2);\n } else {\n // Need to crop horizontally (left/right)\n sWidth = Math.floor(srcHeight * dstAspect);\n sx = Math.floor((srcWidth - sWidth) / 2);\n }\n }\n\n // Capture frame immediately after render completes\n // We're synchronized with the render loop, so the buffer contains fresh content\n let sourceCanvas: OffscreenCanvas;\n \n // Try to get WebGL context (returns existing context or null)\n // This works for all renderers because getContext returns the same instance\n const gl2 = this.canvas.getContext('webgl2') as WebGL2RenderingContext | null;\n const gl = gl2 || this.canvas.getContext('webgl') as WebGLRenderingContext | null;\n \n if (gl) {\n // WebGL path: Read pixels directly from framebuffer\n // No need for preserveDrawingBuffer: true since we're post-render\n gl.finish(); // Ensure all GPU operations are complete\n \n // Read pixels from the framebuffer\n const pixels = new Uint8Array(srcWidth * srcHeight * 4);\n gl.readPixels(0, 0, srcWidth, srcHeight, gl.RGBA, gl.UNSIGNED_BYTE, pixels);\n \n // WebGL uses bottom-left origin, need to flip vertically\n const flippedPixels = new Uint8ClampedArray(srcWidth * srcHeight * 4);\n for (let y = 0; y < srcHeight; y++) {\n const srcRow = (srcHeight - 1 - y) * srcWidth * 4;\n const dstRow = y * srcWidth * 4;\n flippedPixels.set(pixels.subarray(srcRow, srcRow + srcWidth * 4), dstRow);\n }\n \n // Create a temp canvas and put the flipped pixels on it\n sourceCanvas = new OffscreenCanvas(srcWidth, srcHeight);\n const sourceCtx = sourceCanvas.getContext('2d');\n if (!sourceCtx) throw new Error('Failed to create source context');\n \n const imageData = new ImageData(flippedPixels, srcWidth, srcHeight);\n sourceCtx.putImageData(imageData, 0, 0);\n \n this.debugLog('Captured frame from WebGL using readPixels (post-render)');\n } else {\n // 2D Canvas path: Use the canvas directly\n sourceCanvas = this.canvas;\n this.debugLog('Captured frame from 2D canvas (post-render)');\n }\n\n // Now apply crop and scale to target resolution\n const temp = new OffscreenCanvas(targetWidth, targetHeight);\n const tctx = temp.getContext('2d');\n if (!tctx) throw new Error('Failed to get 2D context');\n \n // Draw with crop & scale\n tctx.drawImage(sourceCanvas, sx, sy, sWidth, sHeight, 0, 0, targetWidth, targetHeight);\n\n const blob = await temp.convertToBlob({ type: mimeType });\n\n // Send blob directly using structured clone\n // For thumbnails, the encoding time (~50-100ms) dominates,\n // so blob serialization overhead (~1-2ms) is negligible\n (self as any).postMessage({\n type: 'capture-frame-result',\n id: message.id,\n timestamp: Date.now(),\n data: { blob }\n });\n } catch (error) {\n this.postMessage('error', {\n id: message.id,\n message: (error as Error).message,\n code: 'CAPTURE_FRAME_ERROR'\n });\n }\n }\n \n private handleSetSceneCode(message: WorkerSetSceneCodeMessage): void {\n if (message.data && message.data.sceneCode) {\n // Delegate to global scene code function\n (self as any).setSceneCode(message.data.sceneCode);\n }\n }\n \n private startRenderLoop(): void {\n this.isRunning = true;\n this.startTime = performance.now();\n this.lastTime = this.startTime;\n this.renderFrame();\n }\n \n public renderFrame(): void {\n if (!this.isRunning) return;\n \n const currentTime = performance.now();\n \n // Phase 7: Reset frame-based interaction events at start of frame\n this.interactionSystem.frameStart();\n \n // Update viji.streams snapshot before rendering to ensure artist code sees current state\n this.updateVijiStreams();\n \n // Update frame rate info\n this.viji.fps = this.frameRateMode === 'full' ? this.screenRefreshRate : this.screenRefreshRate / 2;\n \n // Check if we should render this frame\n let shouldRender = true;\n if (this.frameRateMode === 'half') {\n shouldRender = !this.skipNextFrame;\n this.skipNextFrame = !this.skipNextFrame;\n }\n \n if (shouldRender) {\n this.viji.deltaTime = (currentTime - this.lastTime) / 1000;\n this.viji.time = (currentTime - this.startTime) / 1000;\n this.viji.frameCount = ++this.frameCount;\n \n // Track effective frame times for performance calculation\n this.trackEffectiveFrameTime(currentTime);\n \n this.lastTime = currentTime;\n \n try {\n if (this.shaderAdapter && this.rendererType === 'shader') {\n // Shader mode: use shader adapter\n const parameterObjects = this.parameterSystem.getAllParameterObjects();\n this.shaderAdapter.render(this.viji, parameterObjects);\n } else if (this.p5Adapter && this.rendererType === 'p5') {\n // P5.js mode: use adapter and pass parameter objects\n const parameterObjects = this.parameterSystem.getAllParameterObjects();\n this.p5Adapter.tick(this.viji, parameterObjects);\n } else {\n // Native mode: call artist render function directly\n const renderFunction = (self as any).renderFunction;\n if (renderFunction && typeof renderFunction === 'function') {\n renderFunction(this.viji);\n }\n }\n } catch (error) {\n console.error('Render error:', error);\n this.postMessage('error', {\n message: (error as Error).message,\n code: 'RENDER_ERROR',\n stack: (error as Error).stack\n });\n }\n \n // Process any pending capture requests immediately after render completes\n // This ensures we capture a fully rendered frame without race conditions\n if (this.pendingCaptures.length > 0) {\n // Process all pending captures (FIFO)\n const captures = [...this.pendingCaptures];\n this.pendingCaptures = []; // Clear queue\n\n // Execute captures (don't await - let them run async)\n for (const captureMsg of captures) {\n this.executeCaptureFrame(captureMsg).catch((error) => {\n console.error('Capture execution error:', error);\n });\n }\n }\n\n // Auto-capture for frame sources\n if (this.autoCaptureEnabled && this.canvas) {\n try {\n // Check if canvas has a context (scene must be loaded and rendering)\n const ctx = (this.canvas as any).getContext('2d') || (this.canvas as any).getContext('webgl2') || (this.canvas as any).getContext('webgl');\n if (ctx) {\n // Use format specified by consumer (mixer determines if Y-flip is needed)\n // WebGL consumers need Y-flip, Canvas 2D consumers don't\n const options = this.autoCaptureFormat.flipY \n ? { imageOrientation: 'flipY' as ImageOrientation }\n : {};\n \n createImageBitmap(this.canvas, options).then(bitmap => {\n (self as any).postMessage({\n type: 'auto-capture-result',\n timestamp: Date.now(),\n data: { bitmap, timestamp: performance.now() }\n }, [bitmap]);\n }).catch(err => {\n console.warn('[AutoCapture] ImageBitmap creation failed:', err);\n });\n } else {\n // Log occasionally to track context availability\n if (this.debugMode && this.frameCount % 60 === 0) {\n this.debugLog('[AutoCapture] No context yet, skipping capture');\n }\n }\n } catch (error) {\n console.warn('[AutoCapture] Failed:', error);\n }\n }\n }\n\n // Report effective refresh rate periodically\n this.reportPerformanceStats(currentTime);\n \n // Schedule next frame check\n requestAnimationFrame(() => this.renderFrame());\n }\n \n private postMessage(type: string, data?: any): void {\n self.postMessage({\n type,\n id: data?.id || `${type}_${Date.now()}`,\n timestamp: Date.now(),\n data\n });\n }\n\n // Phase 7: Interaction Message Handlers (delegated to InteractionSystem)\n\n private handleMouseUpdate(message: any): void {\n this.interactionSystem.handleMouseUpdate(message.data);\n }\n\n private handleKeyboardUpdate(message: any): void {\n this.interactionSystem.handleKeyboardUpdate(message.data);\n }\n\n private handleTouchUpdate(message: any): void {\n this.interactionSystem.handleTouchUpdate(message.data);\n }\n\n private handleInteractionEnabled(message: any): void {\n this.interactionSystem.setInteractionEnabled(message.data.enabled);\n }\n\n private handleDeviceStateUpdate(message: WorkerDeviceStateMessage): void {\n // Update device sensor state\n this.deviceState = message.data;\n \n // Update viji object for artist access\n this.viji.device = this.deviceState.device;\n this.viji.devices = this.deviceState.devices;\n }\n\n} ","/**\r\n * Scene code analysis utilities\r\n * Provides static methods for analyzing artist scene code\r\n */\r\n\r\nexport type RendererType = 'native' | 'p5' | 'shader';\r\n\r\n/**\r\n * Analyzes scene code for metadata and configuration\r\n */\r\nexport class SceneAnalyzer {\r\n /**\r\n * Detects the renderer type from scene code comments\r\n * \r\n * Looks for:\r\n * - // @renderer shader\r\n * - /* @renderer shader *\\/\r\n * - // @renderer p5\r\n * - /* @renderer p5 *\\/\r\n * \r\n * @param sceneCode - The artist's scene code to analyze\r\n * @returns The detected renderer type ('shader', 'p5', or 'native')\r\n */\r\n static detectRendererType(sceneCode: string): RendererType {\r\n // Check for // @renderer shader or /* @renderer shader */\r\n if (/\\/\\/\\s*@renderer\\s+shader|\\/\\*\\s*@renderer\\s+shader\\s*\\*\\//.test(sceneCode)) {\r\n return 'shader';\r\n }\r\n \r\n // Check for // @renderer p5 or /* @renderer p5 */\r\n if (/\\/\\/\\s*@renderer\\s+p5|\\/\\*\\s*@renderer\\s+p5\\s*\\*\\//.test(sceneCode)) {\r\n return 'p5';\r\n }\r\n \r\n return 'native';\r\n }\r\n}\r\n\r\n","/**\n * Viji Worker Runtime - Secure WebWorker for artist scene execution\n * This worker provides the complete artist API and handles scene rendering\n */\n\nimport { VijiWorkerRuntime } from './VijiWorkerRuntime.js';\nimport { SceneAnalyzer } from '../utils/SceneAnalyzer.js';\n\n// Initialize runtime\nconst runtime = new VijiWorkerRuntime();\n\n// Dynamic scene code execution\nlet renderFunction: ((viji: typeof runtime.viji) => void) | null = null;\n\n// Function to set the scene code dynamically\nasync function setSceneCode(sceneCode: string): Promise<void> {\n try {\n // Reset parameter state for new scene\n runtime.resetParameterState();\n \n // Detect renderer type using shared utility\n const rendererType = SceneAnalyzer.detectRendererType(sceneCode);\n \n if (rendererType === 'shader') {\n // Shader mode: Pass entire shader code to adapter\n await runtime.initShaderMode(sceneCode);\n \n // Parameters are extracted by ShaderParameterParser inside adapter\n // and registered via registerShaderParameter\n // Send parameters to host\n runtime.sendAllParametersToHost();\n } else if (rendererType === 'p5') {\n // P5.js mode: Extract setup and render functions\n const functionBody = sceneCode + '\\n' +\n 'return { ' +\n ' setup: typeof setup !== \"undefined\" ? setup : null, ' +\n ' render: typeof render !== \"undefined\" ? render : null ' +\n '};';\n \n // Execute scene code to extract functions\n const sceneFunction = new Function('viji', 'p5', functionBody);\n const { setup, render } = sceneFunction(runtime.viji, null);\n \n if (!render) {\n throw new Error('P5 mode requires a render(viji, p5) function');\n }\n \n // Initialize P5 mode asynchronously\n await runtime.initP5Mode(setup, render);\n \n // After scene code execution, automatically send all parameters to host\n runtime.sendAllParametersToHost();\n } else {\n // Native mode: support for top-level await\n const functionBody = sceneCode + '\\n' +\n 'if (typeof render === \"function\") {\\n' +\n ' return render;\\n' +\n '}\\n' +\n 'throw new Error(\"Scene code must define a render function\");';\n \n // Use AsyncFunction to support top-level await\n const AsyncFunction = Object.getPrototypeOf(async function(){}).constructor;\n const sceneFunction = new (AsyncFunction as any)('viji', functionBody);\n renderFunction = await sceneFunction(runtime.viji);\n \n // Update global reference for the runtime to access\n (self as any).renderFunction = renderFunction;\n \n // After scene code execution, automatically send all parameters to host\n runtime.sendAllParametersToHost();\n }\n } catch (error) {\n console.error('Failed to load scene code:', error);\n self.postMessage({\n type: 'error',\n id: `scene_error_${Date.now()}`,\n timestamp: Date.now(),\n data: {\n message: `Scene code error: ${(error as Error).message}`,\n code: 'SCENE_CODE_ERROR'\n }\n });\n }\n}\n\n// Expose functions to global scope for the runtime to access\n(self as any).setSceneCode = setSceneCode; "],"names":["self","num","texture","renderFunction"],"mappings":"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"}
|