@viji-dev/core 0.2.11 → 0.2.13
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/dist/artist-dts.js +1 -1
- package/dist/artist-global.d.ts +1 -1
- package/dist/assets/{viji.worker-C48_bOBV.js → viji.worker-DHpeQQ14.js} +1276 -4
- package/dist/assets/viji.worker-DHpeQQ14.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/assets/renderers/P5WorkerAdapter.js +0 -343
- package/dist/assets/renderers/P5WorkerAdapter.js.map +0 -1
- package/dist/assets/renderers/ShaderWorkerAdapter.js +0 -939
- package/dist/assets/renderers/ShaderWorkerAdapter.js.map +0 -1
- package/dist/assets/viji.worker-C48_bOBV.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ShaderWorkerAdapter.js","sources":["../../../src/worker/renderers/ShaderParameterParser.ts","../../../src/worker/renderers/ShaderWorkerAdapter.ts"],"sourcesContent":["/**\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 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 // 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;\nuniform float u_time;\nuniform float u_deltaTime;\nuniform int u_frame;\nuniform float u_pixelRatio;\nuniform float u_fps;\n\n// Mouse API\nuniform vec2 u_mouse;\nuniform bool u_mouseInCanvas;\nuniform bool u_mousePressed;\nuniform bool u_mouseLeft;\nuniform bool u_mouseRight;\nuniform bool u_mouseMiddle;\nuniform vec2 u_mouseVelocity;\n\n// Keyboard API - Common keys\nuniform bool u_keySpace;\nuniform bool u_keyShift;\nuniform bool u_keyCtrl;\nuniform bool u_keyAlt;\nuniform bool u_keyW;\nuniform bool u_keyA;\nuniform bool u_keyS;\nuniform bool u_keyD;\nuniform bool u_keyUp;\nuniform bool u_keyDown;\nuniform bool u_keyLeft;\nuniform bool u_keyRight;\n\n// Touch API\nuniform int u_touchCount;\nuniform vec2 u_touch0;\nuniform vec2 u_touch1;\nuniform vec2 u_touch2;\nuniform vec2 u_touch3;\nuniform vec2 u_touch4;\n\n// Audio\nuniform float u_audioVolume;\nuniform float u_audioPeak;\nuniform float u_audioBass;\nuniform float u_audioMid;\nuniform float u_audioTreble;\nuniform float u_audioSubBass;\nuniform float u_audioLowMid;\nuniform float u_audioHighMid;\nuniform float u_audioPresence;\nuniform float u_audioBrilliance;\nuniform sampler2D u_audioFFT;\n\n// Video\nuniform sampler2D u_video;\nuniform vec2 u_videoResolution;\nuniform float u_videoFrameRate;\n\n// CV - Face Detection\nuniform int u_faceCount;\nuniform vec4 u_face0Bounds;\nuniform vec3 u_face0HeadPose;\nuniform float u_face0Confidence;\nuniform float u_face0Happy;\nuniform float u_face0Sad;\nuniform float u_face0Angry;\nuniform float u_face0Surprised;\n\n// CV - Hand Tracking\nuniform int u_handCount;\nuniform vec3 u_leftHandPalm;\nuniform vec3 u_rightHandPalm;\nuniform float u_leftHandFist;\nuniform float u_leftHandOpen;\nuniform float u_rightHandFist;\nuniform float u_rightHandOpen;\n\n// CV - Pose Detection\nuniform bool u_poseDetected;\nuniform vec2 u_nosePosition;\nuniform vec2 u_leftWristPosition;\nuniform vec2 u_rightWristPosition;\nuniform vec2 u_leftAnklePosition;\nuniform vec2 u_rightAnklePosition;\n\n// CV - Segmentation\nuniform sampler2D u_segmentationMask;\nuniform vec2 u_segmentationRes;\n\n// Backbuffer (previous frame feedback)\n${this.backbufferEnabled ? 'uniform sampler2D backbuffer;' : '// 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 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 }\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 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?.rms || 0);\n this.setUniform('u_audioPeak', 'float', audio.volume?.peak || 0);\n this.setUniform('u_audioBass', 'float', audio.bands?.bass || 0);\n this.setUniform('u_audioMid', 'float', audio.bands?.mid || 0);\n this.setUniform('u_audioTreble', 'float', audio.bands?.treble || 0);\n this.setUniform('u_audioSubBass', 'float', audio.bands?.subBass || 0);\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?.presence || 0);\n this.setUniform('u_audioBrilliance', 'float', audio.bands?.brilliance || 0);\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 // 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 \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) continue;\n \n const value = paramObj.value;\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 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 */\n private updateVideoTexture(videoFrame: OffscreenCanvas): 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 gl.texImage2D(\n gl.TEXTURE_2D, 0, gl.RGBA,\n gl.RGBA, gl.UNSIGNED_BYTE,\n videoFrame\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 \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"],"names":["num","texture"],"mappings":"AAkBO,MAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA,EAIjC,OAAO,gBAAgB,YAAiD;AACtE,UAAM,aAA0C,CAAA;AAChD,UAAM,QAAQ,WAAW,MAAM,IAAI;AAEnC,eAAW,QAAQ,OAAO;AACxB,YAAM,UAAU,KAAK,KAAA;AAGrB,YAAM,QAAQ,QAAQ,MAAM,iCAAiC;AAE7D,UAAI,OAAO;AACT,cAAM,GAAG,MAAM,aAAa,SAAS,IAAI;AAEzC,YAAI;AACF,gBAAM,SAAS,KAAK,mBAAmB,SAAS;AAEhD,gBAAM,QAAmC;AAAA,YACvC;AAAA,YACA;AAAA,YACA,OAAO,OAAO,SAAS;AAAA,YACvB,SAAS,OAAO;AAAA,YAChB;AAAA,UAAA;AAGF,eAAK,kBAAkB,KAAK;AAC5B,qBAAW,KAAK,KAAK;AAAA,QACvB,SAAS,OAAO;AACd,kBAAQ,KAAK,qCAAqC,IAAI,IAAI,KAAK;AAAA,QACjE;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,mBAAmB,WAAwC;AAChE,UAAM,SAA8B,CAAA;AAGpC,UAAM,gBAAgB;AAEtB,QAAI;AACJ,YAAQ,QAAQ,cAAc,KAAK,SAAS,OAAO,MAAM;AACvD,YAAM,CAAA,EAAG,KAAK,KAAK,IAAI;AACvB,aAAO,GAAG,IAAI,KAAK,WAAW,KAAK;AAAA,IACrC;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,WAAW,OAAoB;AAE5C,QAAI,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,GAAG;AAChD,aAAO,MAAM,MAAM,GAAG,EAAE;AAAA,IAC1B;AAGA,QAAI,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,GAAG;AAChD,UAAI;AACF,eAAO,KAAK,MAAM,KAAK;AAAA,MACzB,QAAQ;AAEN,cAAM,QAAQ,MAAM,MAAM,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,IAAI,CAAA,MAAK,EAAE,MAAM;AAC7D,eAAO,MAAM,IAAI,CAAA,SAAQ;AACvB,cAAI,KAAK,WAAW,GAAG,KAAK,KAAK,SAAS,GAAG,GAAG;AAC9C,mBAAO,KAAK,MAAM,GAAG,EAAE;AAAA,UACzB;AACA,gBAAMA,OAAM,WAAW,IAAI;AAC3B,iBAAO,MAAMA,IAAG,IAAI,OAAOA;AAAAA,QAC7B,CAAC;AAAA,MACH;AAAA,IACF;AAGA,QAAI,MAAM,WAAW,GAAG,GAAG;AACzB,aAAO;AAAA,IACT;AAGA,QAAI,UAAU,OAAQ,QAAO;AAC7B,QAAI,UAAU,QAAS,QAAO;AAG9B,UAAM,MAAM,WAAW,KAAK;AAC5B,QAAI,CAAC,MAAM,GAAG,EAAG,QAAO;AAGxB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,kBAAkB,OAAwC;AAE/D,QAAI,CAAC,MAAM,MAAM;AACf,YAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AAEA,QAAI,CAAC,MAAM,aAAa;AACtB,YAAM,IAAI,MAAM,mCAAmC;AAAA,IACrD;AAEA,QAAI,CAAC,MAAM,OAAO,OAAO;AACvB,YAAM,IAAI,MAAM,aAAa,MAAM,WAAW,+BAA+B;AAAA,IAC/E;AAGA,YAAQ,MAAM,MAAA;AAAA,MACZ,KAAK;AAAA,MACL,KAAK;AACH,YAAI,MAAM,OAAO,YAAY,QAAW;AACtC,gBAAM,IAAI,MAAM,aAAa,MAAM,WAAW,YAAY,MAAM,IAAI,iCAAiC;AAAA,QACvG;AACA;AAAA,MAEF,KAAK;AACH,YAAI,MAAM,OAAO,YAAY,QAAW;AACtC,gBAAM,IAAI,MAAM,aAAa,MAAM,WAAW,iDAAiD;AAAA,QACjG;AACA,YAAI,CAAC,MAAM,OAAO,QAAQ,WAAW,GAAG,GAAG;AACzC,gBAAM,IAAI,MAAM,aAAa,MAAM,WAAW,4DAA4D;AAAA,QAC5G;AACA;AAAA,MAEF,KAAK;AACH,YAAI,MAAM,OAAO,YAAY,QAAW;AACtC,gBAAM,IAAI,MAAM,aAAa,MAAM,WAAW,kDAAkD;AAAA,QAClG;AACA,YAAI,OAAO,MAAM,OAAO,YAAY,WAAW;AAC7C,gBAAM,IAAI,MAAM,aAAa,MAAM,WAAW,2DAA2D;AAAA,QAC3G;AACA;AAAA,MAEF,KAAK;AACH,YAAI,MAAM,OAAO,YAAY,QAAW;AACtC,gBAAM,IAAI,MAAM,aAAa,MAAM,WAAW,kDAAkD;AAAA,QAClG;AACA,YAAI,CAAC,MAAM,OAAO,WAAW,CAAC,MAAM,QAAQ,MAAM,OAAO,OAAO,GAAG;AACjE,gBAAM,IAAI,MAAM,aAAa,MAAM,WAAW,0DAA0D;AAAA,QAC1G;AACA;AAAA,MAEF,KAAK;AAEH;AAAA,MAEF;AACE,gBAAQ,KAAK,2BAA2B,MAAM,IAAI,EAAE;AAAA,IAAA;AAIxD,QAAI,MAAM,YAAY,WAAW,IAAI,GAAG;AACtC,cAAQ,KAAK,mBAAmB,MAAM,WAAW,2FAA2F;AAAA,IAC9I;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,2BAA2B,OAA0C;AAC1E,YAAQ,MAAM,MAAA;AAAA,MACZ,KAAK;AAAA,MACL,KAAK;AACH,eAAO,iBAAiB,MAAM,WAAW;AAAA,MAE3C,KAAK;AACH,eAAO,gBAAgB,MAAM,WAAW;AAAA,MAE1C,KAAK;AACH,eAAO,gBAAgB,MAAM,WAAW;AAAA,MAE1C,KAAK;AACH,eAAO,eAAe,MAAM,WAAW;AAAA,MAEzC,KAAK;AACH,eAAO,qBAAqB,MAAM,WAAW;AAAA,MAE/C;AACE,eAAO,8BAA8B,MAAM,IAAI;AAAA,IAAA;AAAA,EAErD;AACF;ACzMO,MAAM,oBAAoB;AAAA,EA6B/B,YACE,iBACA,UACQ,YACR;AADQ,SAAA,aAAA;AAGR,SAAK,cAAc,KAAK,kBAAkB,UAAU;AAGpD,SAAK,oBAAoB,WAAW,SAAS,YAAY;AAGzD,QAAI,KAAK,gBAAgB,WAAW;AAClC,YAAM,KAAK,gBAAgB,WAAW,QAAQ;AAC9C,UAAI,CAAC,IAAI;AACP,cAAM,IAAI,MAAM,yDAAyD;AAAA,MAC3E;AACA,WAAK,KAAK;AAAA,IACZ,OAAO;AACL,YAAM,KAAK,gBAAgB,WAAW,OAAO;AAC7C,UAAI,CAAC,IAAI;AACP,cAAM,IAAI,MAAM,qBAAqB;AAAA,MACvC;AACA,WAAK,KAAK;AAAA,IACZ;AAAA,EACF;AAAA,EArDQ;AAAA,EACA,UAA+B;AAAA,EAC/B,uCAAuB,IAAA;AAAA,EACvB,mCAAmB,IAAA;AAAA,EACnB,kBAAkB;AAAA,EAClB,+BAAe,IAAA;AAAA;AAAA,EAGf,aAAiC;AAAA;AAAA,EAGjC,aAA0C,CAAA;AAAA;AAAA,EAG1C,cAAqC;AAAA;AAAA,EAGrC,kBAAuC;AAAA,EACvC,eAAoC;AAAA,EACpC,sBAA2C;AAAA;AAAA,EAG3C,wBAAiD;AAAA,EACjD,oBAAyC;AAAA,EACzC,qBAA8C;AAAA,EAC9C,iBAAsC;AAAA,EACtC,oBAA6B;AAAA;AAAA;AAAA;AAAA,EAgCrC,MAAa,OAAsB;AACjC,QAAI;AAEF,WAAK,aAAa,sBAAsB,gBAAgB,KAAK,UAAU;AAGvE,WAAK,qBAAA;AAGL,YAAM,gBAAgB,KAAK,eAAe,KAAK,UAAU;AACzD,WAAK,qBAAqB,aAAa;AAGvC,WAAK,sBAAA;AAGL,WAAK,oBAAA;AAGL,UAAI,KAAK,mBAAmB;AAC1B,aAAK,6BAAA;AAAA,MACP;AAAA,IAEF,SAAS,OAAO;AACd,cAAQ,MAAM,6CAA6C,KAAK;AAChE,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,MAAqC;AAC7D,WAAO,KAAK,SAAS,cAAc,IAAI,YAAY;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAA6B;AAEnC,UAAM,WAAW,IAAI,aAAa;AAAA,MAChC;AAAA,MAAI;AAAA;AAAA,MACH;AAAA,MAAG;AAAA;AAAA,MACJ;AAAA,MAAK;AAAA;AAAA,MACJ;AAAA,MAAI;AAAA;AAAA,IAAA,CACN;AAED,SAAK,aAAa,KAAK,GAAG,aAAA;AAC1B,SAAK,GAAG,WAAW,KAAK,GAAG,cAAc,KAAK,UAAU;AACxD,SAAK,GAAG,WAAW,KAAK,GAAG,cAAc,UAAU,KAAK,GAAG,WAAW;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,YAA4B;AAEjD,QAAI,cAAc;AAClB,QAAI,qBAAqB;AAEzB,UAAM,QAAQ,WAAW,MAAM,IAAI;AACnC,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAM,UAAU,MAAM,CAAC,EAAE,KAAA;AACzB,UAAI,QAAQ,WAAW,UAAU,GAAG;AAClC,sBAAc;AAEd,cAAM,CAAC,IAAI;AACX,6BAAqB,MAAM,KAAK,IAAI;AACpC;AAAA,MACF;AAAA,IACF;AAGA,UAAM,iBAAiB,KAAK,mBAAmB,kBAAkB;AAGjE,UAAM,kBAAkB,KAAK,mBAAA;AAC7B,UAAM,oBAAoB,KAAK,WAC5B,IAAI,CAAA,MAAK,sBAAsB,2BAA2B,CAAC,CAAC,EAC5D,KAAK,IAAI;AAGZ,UAAM,aAAa,WAAW,SAAS,QAAQ;AAG/C,QAAI,cAAc,KAAK,gBAAgB,WAAW;AAChD,YAAM,MAAM,KAAK,GAAG,aAAa,0BAA0B;AAC3D,UAAI,CAAC,KAAK;AACR,gBAAQ,KAAK,uGAAuG;AAAA,MACtH;AAAA,IACF;AAGA,UAAM,QAAkB,CAAA;AAGxB,QAAI,cAAc,KAAK,gBAAgB,WAAW;AAChD,YAAM,KAAK,iDAAiD;AAAA,IAC9D;AAGA,QAAI,KAAK,gBAAgB,WAAW;AAClC,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,cAAc;AACzB,YAAM,KAAK,0BAA0B;AACrC,YAAM,KAAK,QAAQ;AAAA,IACrB,OAAO;AAEL,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,0BAA0B;AAAA,IACvC;AAGA,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,4CAA4C;AACvD,UAAM,KAAK,sCAAsC;AACjD,UAAM,KAAK,eAAe;AAC1B,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,mDAAmD;AAC9D,UAAM,KAAK,iBAAiB;AAC5B,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,4BAA4B;AAEvC,UAAM,eAAe,MAAM,KAAK,IAAI;AAGpC,UAAM,mBACJ,mBAAmB,MAAM,GAAG,cAAc,IAC1C,OAAO,eAAe,OACtB,mBAAmB,MAAM,cAAc;AAIzC,UAAM,YAAY,cACd,cAAc,OAAO,mBACrB;AAGJ,YAAQ,IAAI,+CAA+C;AAC3D,YAAQ,IAAI,UAAU,MAAM,IAAI,EAAE,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,CAAC;AACzD,YAAQ,IAAI,2BAA2B;AAEvC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,mBAAmB,MAAsB;AAC/C,UAAM,QAAQ,KAAK,MAAM,IAAI;AAG7B,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAM,OAAO,MAAM,CAAC,EAAE,KAAA;AACtB,UAAI,KAAK,WAAW,UAAU,GAAG;AAC/B,eAAO,KAAK,mBAAmB,MAAM,CAAC;AAAA,MACxC;AAAA,IACF;AAGA,QAAI,qBAAqB;AACzB,QAAI,gBAAgB;AAEpB,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAM,OAAO,MAAM,CAAC,EAAE,KAAA;AAGtB,UAAI,KAAK,SAAS,IAAI,GAAG;AACvB,6BAAqB;AAAA,MACvB;AACA,UAAI,KAAK,SAAS,IAAI,GAAG;AACvB,6BAAqB;AACrB,wBAAgB,IAAI;AACpB;AAAA,MACF;AAGA,UAAI,oBAAoB;AACtB;AAAA,MACF;AAGA,UAAI,SAAS,MAAM,KAAK,WAAW,IAAI,GAAG;AACxC,wBAAgB,IAAI;AACpB;AAAA,MACF;AAGA;AAAA,IACF;AAGA,QAAI,gBAAgB,KAAK,gBAAgB,MAAM,QAAQ;AACrD,aAAO,KAAK,mBAAmB,MAAM,gBAAgB,CAAC;AAAA,IACxD;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,MAAc,YAA4B;AACnE,UAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,QAAI,WAAW;AAEf,aAAS,IAAI,GAAG,KAAK,cAAc,IAAI,MAAM,QAAQ,KAAK;AACxD,kBAAY,MAAM,CAAC,EAAE,SAAS;AAAA,IAChC;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAA6B;AACnC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyFT,KAAK,oBAAoB,kCAAkC,2BAA2B;AAAA;AAAA,EAEtF;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,oBAAkC;AAC7D,UAAM,KAAK,KAAK;AAGhB,UAAM,mBAAmB,KAAK,gBAAgB,YAC1C;AAAA;AAAA;AAAA;AAAA;AAAA,cAMA;AAAA;AAAA;AAAA;AAMJ,UAAM,eAAe,KAAK,cAAc,GAAG,eAAe,gBAAgB;AAG1E,UAAM,iBAAiB,KAAK,cAAc,GAAG,iBAAiB,kBAAkB;AAGhF,UAAM,UAAU,GAAG,cAAA;AACnB,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AAEA,OAAG,aAAa,SAAS,YAAY;AACrC,OAAG,aAAa,SAAS,cAAc;AACvC,OAAG,YAAY,OAAO;AAEtB,QAAI,CAAC,GAAG,oBAAoB,SAAS,GAAG,WAAW,GAAG;AACpD,YAAM,QAAQ,GAAG,kBAAkB,OAAO;AAC1C,YAAM,IAAI,MAAM,+BAA+B,KAAK,EAAE;AAAA,IACxD;AAEA,SAAK,UAAU;AACf,OAAG,WAAW,OAAO;AAGrB,OAAG,aAAa,YAAY;AAC5B,OAAG,aAAa,cAAc;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,MAAc,QAA6B;AAC/D,UAAM,KAAK,KAAK;AAChB,UAAM,SAAS,GAAG,aAAa,IAAI;AAEnC,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,yBAAyB;AAAA,IAC3C;AAEA,OAAG,aAAa,QAAQ,MAAM;AAC9B,OAAG,cAAc,MAAM;AAEvB,QAAI,CAAC,GAAG,mBAAmB,QAAQ,GAAG,cAAc,GAAG;AACrD,YAAM,QAAQ,GAAG,iBAAiB,MAAM;AACxC,YAAM,aAAa,SAAS,GAAG,gBAAgB,WAAW;AAC1D,YAAM,IAAI,MAAM,GAAG,UAAU;AAAA,EAAgC,KAAK,EAAE;AAAA,IACtE;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,wBAA8B;AACpC,QAAI,CAAC,KAAK,QAAS;AAEnB,UAAM,KAAK,KAAK;AAChB,UAAM,cAAc,GAAG,oBAAoB,KAAK,SAAS,GAAG,eAAe;AAE3E,aAAS,IAAI,GAAG,IAAI,aAAa,KAAK;AACpC,YAAM,OAAO,GAAG,iBAAiB,KAAK,SAAS,CAAC;AAChD,UAAI,MAAM;AACR,cAAM,WAAW,GAAG,mBAAmB,KAAK,SAAS,KAAK,IAAI;AAC9D,aAAK,iBAAiB,IAAI,KAAK,MAAM,QAAQ;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAA4B;AAElC,SAAK,aAAa,IAAI,cAAc,KAAK,iBAAiB;AAC1D,SAAK,aAAa,IAAI,WAAW,KAAK,iBAAiB;AACvD,SAAK,aAAa,IAAI,sBAAsB,KAAK,iBAAiB;AAClE,QAAI,KAAK,mBAAmB;AAC1B,WAAK,aAAa,IAAI,cAAc,KAAK,iBAAiB;AAAA,IAC5D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,+BAAqC;AAC3C,UAAM,KAAK,KAAK;AAChB,UAAM,QAAQ,GAAG,OAAO;AACxB,UAAM,SAAS,GAAG,OAAO;AAGzB,UAAM,mBAAmB,MAAM;AAC7B,YAAM,UAAU,GAAG,cAAA;AACnB,SAAG,YAAY,GAAG,YAAY,OAAO;AACrC,SAAG,WAAW,GAAG,YAAY,GAAG,GAAG,MAAM,OAAO,QAAQ,GAAG,GAAG,MAAM,GAAG,eAAe,IAAI;AAC1F,SAAG,cAAc,GAAG,YAAY,GAAG,oBAAoB,GAAG,MAAM;AAChE,SAAG,cAAc,GAAG,YAAY,GAAG,oBAAoB,GAAG,MAAM;AAChE,SAAG,cAAc,GAAG,YAAY,GAAG,gBAAgB,GAAG,aAAa;AACnE,SAAG,cAAc,GAAG,YAAY,GAAG,gBAAgB,GAAG,aAAa;AAEnE,YAAM,cAAc,GAAG,kBAAA;AACvB,SAAG,gBAAgB,GAAG,aAAa,WAAW;AAC9C,SAAG,qBAAqB,GAAG,aAAa,GAAG,mBAAmB,GAAG,YAAY,SAAS,CAAC;AAEvF,aAAO,EAAE,aAAa,QAAA;AAAA,IACxB;AAEA,UAAM,OAAO,iBAAA;AACb,UAAM,OAAO,iBAAA;AAEb,SAAK,wBAAwB,KAAK;AAClC,SAAK,oBAAoB,KAAK;AAC9B,SAAK,qBAAqB,KAAK;AAC/B,SAAK,iBAAiB,KAAK;AAG3B,OAAG,gBAAgB,GAAG,aAAa,IAAI;AACvC,OAAG,YAAY,GAAG,YAAY,IAAI;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKO,OAAO,MAAW,kBAA0C;AACjE,UAAM,KAAK,KAAK;AAEhB,QAAI,CAAC,KAAK,WAAW,CAAC,KAAK,YAAY;AACrC,cAAQ,KAAK,wBAAwB;AACrC;AAAA,IACF;AAEA,OAAG,WAAW,KAAK,OAAO;AAG1B,SAAK,sBAAsB,IAAI;AAG/B,SAAK,wBAAwB,gBAAgB;AAG7C,QAAI,KAAK,qBAAqB,KAAK,mBAAmB;AAEpD,YAAM,iBAAiB,KAAK,aAAa,IAAI,YAAY;AACzD,UAAI,mBAAmB,QAAW;AAChC,WAAG,cAAc,GAAG,WAAW,cAAc;AAC7C,WAAG,YAAY,GAAG,YAAY,KAAK,iBAAiB;AACpD,aAAK,WAAW,cAAc,aAAa,cAAc;AAAA,MAC3D;AAGA,SAAG,gBAAgB,GAAG,aAAa,KAAK,kBAAkB;AAAA,IAC5D;AAGA,UAAM,mBAAmB,GAAG,kBAAkB,KAAK,SAAS,YAAY;AACxE,OAAG,WAAW,GAAG,cAAc,KAAK,UAAU;AAC9C,OAAG,wBAAwB,gBAAgB;AAC3C,OAAG,oBAAoB,kBAAkB,GAAG,GAAG,OAAO,OAAO,GAAG,CAAC;AAGjE,OAAG,WAAW,GAAG,gBAAgB,GAAG,CAAC;AAGrC,QAAI,KAAK,mBAAmB;AAE1B,SAAG,gBAAgB,GAAG,aAAa,IAAI;AAGvC,SAAG,cAAc,GAAG,QAAQ;AAC5B,SAAG,YAAY,GAAG,YAAY,KAAK,cAAc;AACjD,SAAG,WAAW,GAAG,gBAAgB,GAAG,CAAC;AAGrC,YAAM,SAAS,KAAK;AACpB,YAAM,UAAU,KAAK;AACrB,WAAK,wBAAwB,KAAK;AAClC,WAAK,oBAAoB,KAAK;AAC9B,WAAK,qBAAqB;AAC1B,WAAK,iBAAiB;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAsB,MAAiB;AAE7C,SAAK,WAAW,gBAAgB,QAAQ,CAAC,KAAK,OAAO,KAAK,MAAM,CAAC;AACjE,SAAK,WAAW,UAAU,SAAS,KAAK,IAAI;AAC5C,SAAK,WAAW,eAAe,SAAS,KAAK,SAAS;AACtD,SAAK,WAAW,WAAW,OAAO,KAAK,UAAU;AACjD,SAAK,WAAW,gBAAgB,SAAS,KAAK,UAAU;AACxD,SAAK,WAAW,SAAS,SAAS,KAAK,GAAG;AAG1C,SAAK,WAAW,WAAW,QAAQ,CAAC,KAAK,MAAM,GAAG,KAAK,SAAS,KAAK,MAAM,CAAC,CAAC;AAC7E,SAAK,WAAW,mBAAmB,QAAQ,KAAK,MAAM,UAAU;AAChE,SAAK,WAAW,kBAAkB,QAAQ,KAAK,MAAM,SAAS;AAC9D,SAAK,WAAW,eAAe,QAAQ,KAAK,MAAM,UAAU;AAC5D,SAAK,WAAW,gBAAgB,QAAQ,KAAK,MAAM,WAAW;AAC9D,SAAK,WAAW,iBAAiB,QAAQ,KAAK,MAAM,YAAY;AAChE,SAAK,WAAW,mBAAmB,QAAQ,CAAC,KAAK,MAAM,SAAS,GAAG,CAAC,KAAK,MAAM,SAAS,CAAC,CAAC;AAG1F,SAAK,WAAW,cAAc,QAAQ,KAAK,SAAS,UAAU,GAAG,KAAK,KAAK,SAAS,UAAU,OAAO,CAAC;AACtG,SAAK,WAAW,cAAc,QAAQ,KAAK,SAAS,KAAK;AACzD,SAAK,WAAW,aAAa,QAAQ,KAAK,SAAS,IAAI;AACvD,SAAK,WAAW,YAAY,QAAQ,KAAK,SAAS,GAAG;AACrD,SAAK,WAAW,UAAU,QAAQ,KAAK,SAAS,UAAU,GAAG,KAAK,KAAK,SAAS,UAAU,GAAG,CAAC;AAC9F,SAAK,WAAW,UAAU,QAAQ,KAAK,SAAS,UAAU,GAAG,KAAK,KAAK,SAAS,UAAU,GAAG,CAAC;AAC9F,SAAK,WAAW,UAAU,QAAQ,KAAK,SAAS,UAAU,GAAG,KAAK,KAAK,SAAS,UAAU,GAAG,CAAC;AAC9F,SAAK,WAAW,UAAU,QAAQ,KAAK,SAAS,UAAU,GAAG,KAAK,KAAK,SAAS,UAAU,GAAG,CAAC;AAC9F,SAAK,WAAW,WAAW,QAAQ,KAAK,SAAS,UAAU,SAAS,CAAC;AACrE,SAAK,WAAW,aAAa,QAAQ,KAAK,SAAS,UAAU,WAAW,CAAC;AACzE,SAAK,WAAW,aAAa,QAAQ,KAAK,SAAS,UAAU,WAAW,CAAC;AACzE,SAAK,WAAW,cAAc,QAAQ,KAAK,SAAS,UAAU,YAAY,CAAC;AAG3E,SAAK,WAAW,gBAAgB,OAAO,KAAK,QAAQ,KAAK;AACzD,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,YAAM,QAAQ,KAAK,QAAQ,OAAO,CAAC;AACnC,UAAI,OAAO;AACT,aAAK,WAAW,UAAU,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,KAAK,SAAS,MAAM,CAAC,CAAC;AAAA,MACzE,OAAO;AACL,aAAK,WAAW,UAAU,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC;AAAA,MAC/C;AAAA,IACF;AAGA,UAAM,QAAQ,KAAK;AACnB,SAAK,WAAW,iBAAiB,SAAS,MAAM,QAAQ,OAAO,CAAC;AAChE,SAAK,WAAW,eAAe,SAAS,MAAM,QAAQ,QAAQ,CAAC;AAC/D,SAAK,WAAW,eAAe,SAAS,MAAM,OAAO,QAAQ,CAAC;AAC9D,SAAK,WAAW,cAAc,SAAS,MAAM,OAAO,OAAO,CAAC;AAC5D,SAAK,WAAW,iBAAiB,SAAS,MAAM,OAAO,UAAU,CAAC;AAClE,SAAK,WAAW,kBAAkB,SAAS,MAAM,OAAO,WAAW,CAAC;AACpE,SAAK,WAAW,iBAAiB,SAAS,MAAM,OAAO,UAAU,CAAC;AAClE,SAAK,WAAW,kBAAkB,SAAS,MAAM,OAAO,WAAW,CAAC;AACpE,SAAK,WAAW,mBAAmB,SAAS,MAAM,OAAO,YAAY,CAAC;AACtE,SAAK,WAAW,qBAAqB,SAAS,MAAM,OAAO,cAAc,CAAC;AAG1E,QAAI,MAAM,aAAa;AACrB,WAAK,sBAAsB,MAAM,kBAAkB;AAAA,IACrD;AAGA,UAAM,QAAQ,KAAK;AACnB,QAAI,MAAM,eAAe,MAAM,cAAc;AAC3C,WAAK,mBAAmB,MAAM,YAAY;AAC1C,WAAK,WAAW,qBAAqB,QAAQ,CAAC,MAAM,YAAY,MAAM,WAAW,CAAC;AAClF,WAAK,WAAW,oBAAoB,SAAS,MAAM,SAAS;AAAA,IAC9D,OAAO;AACL,WAAK,WAAW,qBAAqB,QAAQ,CAAC,GAAG,CAAC,CAAC;AACnD,WAAK,WAAW,oBAAoB,SAAS,CAAC;AAAA,IAChD;AAGA,UAAM,QAAQ,MAAM,SAAS,CAAA;AAC7B,SAAK,WAAW,eAAe,OAAO,MAAM,MAAM;AAClD,QAAI,MAAM,SAAS,GAAG;AACpB,YAAM,OAAO,MAAM,CAAC;AACpB,WAAK,WAAW,iBAAiB,QAAQ,CAAC,KAAK,OAAO,GAAG,KAAK,OAAO,GAAG,KAAK,OAAO,OAAO,KAAK,OAAO,MAAM,CAAC;AAC9G,WAAK,WAAW,mBAAmB,QAAQ,CAAC,KAAK,SAAS,OAAO,KAAK,SAAS,KAAK,KAAK,SAAS,IAAI,CAAC;AACvG,WAAK,WAAW,qBAAqB,SAAS,KAAK,UAAU;AAC7D,WAAK,WAAW,gBAAgB,SAAS,KAAK,YAAY,KAAK;AAC/D,WAAK,WAAW,cAAc,SAAS,KAAK,YAAY,GAAG;AAC3D,WAAK,WAAW,gBAAgB,SAAS,KAAK,YAAY,KAAK;AAC/D,WAAK,WAAW,oBAAoB,SAAS,KAAK,YAAY,SAAS;AAAA,IACzE,OAAO;AACL,WAAK,WAAW,iBAAiB,QAAQ,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;AACrD,WAAK,WAAW,mBAAmB,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC;AACpD,WAAK,WAAW,qBAAqB,SAAS,CAAC;AAC/C,WAAK,WAAW,gBAAgB,SAAS,CAAC;AAC1C,WAAK,WAAW,cAAc,SAAS,CAAC;AACxC,WAAK,WAAW,gBAAgB,SAAS,CAAC;AAC1C,WAAK,WAAW,oBAAoB,SAAS,CAAC;AAAA,IAChD;AAGA,UAAM,QAAQ,MAAM,SAAS,CAAA;AAC7B,SAAK,WAAW,eAAe,OAAO,MAAM,MAAM;AAElD,UAAM,WAAW,MAAM,KAAK,CAAC,MAAW,EAAE,eAAe,MAAM;AAC/D,UAAM,YAAY,MAAM,KAAK,CAAC,MAAW,EAAE,eAAe,OAAO;AAEjE,QAAI,UAAU;AACZ,WAAK,WAAW,kBAAkB,QAAQ,CAAC,SAAS,KAAK,GAAG,SAAS,KAAK,GAAG,SAAS,KAAK,CAAC,CAAC;AAC7F,WAAK,WAAW,kBAAkB,SAAS,SAAS,UAAU,QAAQ,CAAC;AACvE,WAAK,WAAW,kBAAkB,SAAS,SAAS,UAAU,YAAY,CAAC;AAAA,IAC7E,OAAO;AACL,WAAK,WAAW,kBAAkB,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC;AACnD,WAAK,WAAW,kBAAkB,SAAS,CAAC;AAC5C,WAAK,WAAW,kBAAkB,SAAS,CAAC;AAAA,IAC9C;AAEA,QAAI,WAAW;AACb,WAAK,WAAW,mBAAmB,QAAQ,CAAC,UAAU,KAAK,GAAG,UAAU,KAAK,GAAG,UAAU,KAAK,CAAC,CAAC;AACjG,WAAK,WAAW,mBAAmB,SAAS,UAAU,UAAU,QAAQ,CAAC;AACzE,WAAK,WAAW,mBAAmB,SAAS,UAAU,UAAU,YAAY,CAAC;AAAA,IAC/E,OAAO;AACL,WAAK,WAAW,mBAAmB,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC;AACpD,WAAK,WAAW,mBAAmB,SAAS,CAAC;AAC7C,WAAK,WAAW,mBAAmB,SAAS,CAAC;AAAA,IAC/C;AAGA,UAAM,OAAO,MAAM;AACnB,SAAK,WAAW,kBAAkB,QAAQ,SAAS,IAAI;AACvD,QAAI,MAAM;AAGR,YAAM,OAAO,KAAK,UAAU,CAAC;AAC7B,YAAM,YAAY,KAAK,UAAU,EAAE;AACnC,YAAM,aAAa,KAAK,UAAU,EAAE;AACpC,YAAM,YAAY,KAAK,UAAU,EAAE;AACnC,YAAM,aAAa,KAAK,UAAU,EAAE;AAEpC,WAAK,WAAW,kBAAkB,QAAQ,CAAC,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,CAAC;AACtE,WAAK,WAAW,uBAAuB,QAAQ,CAAC,WAAW,KAAK,GAAG,WAAW,KAAK,CAAC,CAAC;AACrF,WAAK,WAAW,wBAAwB,QAAQ,CAAC,YAAY,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC;AACxF,WAAK,WAAW,uBAAuB,QAAQ,CAAC,WAAW,KAAK,GAAG,WAAW,KAAK,CAAC,CAAC;AACrF,WAAK,WAAW,wBAAwB,QAAQ,CAAC,YAAY,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC;AAAA,IAC1F,OAAO;AACL,WAAK,WAAW,kBAAkB,QAAQ,CAAC,GAAG,CAAC,CAAC;AAChD,WAAK,WAAW,uBAAuB,QAAQ,CAAC,GAAG,CAAC,CAAC;AACrD,WAAK,WAAW,wBAAwB,QAAQ,CAAC,GAAG,CAAC,CAAC;AACtD,WAAK,WAAW,uBAAuB,QAAQ,CAAC,GAAG,CAAC,CAAC;AACrD,WAAK,WAAW,wBAAwB,QAAQ,CAAC,GAAG,CAAC,CAAC;AAAA,IACxD;AAGA,UAAM,eAAe,MAAM;AAC3B,QAAI,cAAc;AAChB,WAAK,0BAA0B,aAAa,MAAM,aAAa,OAAO,aAAa,MAAM;AACzF,WAAK,WAAW,qBAAqB,QAAQ,CAAC,aAAa,OAAO,aAAa,MAAM,CAAC;AAAA,IACxF,OAAO;AACL,WAAK,WAAW,qBAAqB,QAAQ,CAAC,GAAG,CAAC,CAAC;AAAA,IACrD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,wBAAwB,kBAA0C;AACxE,eAAW,SAAS,KAAK,YAAY;AACnC,YAAM,WAAW,iBAAiB,IAAI,MAAM,WAAW;AACvD,UAAI,CAAC,SAAU;AAEf,YAAM,QAAQ,SAAS;AAEvB,cAAQ,MAAM,MAAA;AAAA,QACZ,KAAK;AAAA,QACL,KAAK;AACH,eAAK,WAAW,MAAM,aAAa,SAAS,KAAK;AACjD;AAAA,QAEF,KAAK;AAEH,gBAAM,MAAM,KAAK,SAAS,KAAK;AAC/B,eAAK,WAAW,MAAM,aAAa,QAAQ,GAAG;AAC9C;AAAA,QAEF,KAAK;AACH,eAAK,WAAW,MAAM,aAAa,QAAQ,KAAK;AAChD;AAAA,QAEF,KAAK;AAEH,gBAAM,QAAQ,MAAM,OAAO,SAAS,QAAQ,KAAK,KAAK;AACtD,eAAK,WAAW,MAAM,aAAa,OAAO,KAAK;AAC/C;AAAA,QAEF,KAAK;AAEH,cAAI,OAAO;AACT,iBAAK,mBAAmB,MAAM,aAAa,KAAK;AAAA,UAClD;AACA;AAAA,MAAA;AAAA,IAEN;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAW,MAAc,MAAc,OAAkB;AAC/D,UAAM,WAAW,KAAK,iBAAiB,IAAI,IAAI;AAC/C,QAAI,aAAa,QAAQ,aAAa,QAAW;AAC/C;AAAA,IACF;AAEA,UAAM,KAAK,KAAK;AAEhB,YAAQ,MAAA;AAAA,MACN,KAAK;AACH,WAAG,UAAU,UAAU,KAAK;AAC5B;AAAA,MACF,KAAK;AACH,WAAG,UAAU,UAAU,KAAK;AAC5B;AAAA,MACF,KAAK;AACH,WAAG,UAAU,UAAU,QAAQ,IAAI,CAAC;AACpC;AAAA,MACF,KAAK;AACH,WAAG,UAAU,UAAU,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;AACzC;AAAA,MACF,KAAK;AACH,WAAG,UAAU,UAAU,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;AACnD;AAAA,MACF,KAAK;AACH,WAAG,UAAU,UAAU,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;AAC7D;AAAA,IAAA;AAAA,EAEN;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAS,KAAuC;AACtD,UAAM,SAAS,4CAA4C,KAAK,GAAG;AACnE,QAAI,QAAQ;AACV,aAAO;AAAA,QACL,SAAS,OAAO,CAAC,GAAG,EAAE,IAAI;AAAA,QAC1B,SAAS,OAAO,CAAC,GAAG,EAAE,IAAI;AAAA,QAC1B,SAAS,OAAO,CAAC,GAAG,EAAE,IAAI;AAAA,MAAA;AAAA,IAE9B;AACA,WAAO,CAAC,GAAG,GAAG,CAAC;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAsB,eAAiC;AAC7D,UAAM,KAAK,KAAK;AAChB,UAAM,OAAO,KAAK,aAAa,IAAI,YAAY;AAE/C,QAAI,CAAC,KAAK,iBAAiB;AACzB,WAAK,kBAAkB,GAAG,cAAA;AAAA,IAC5B;AAEA,OAAG,cAAc,GAAG,WAAW,IAAI;AACnC,OAAG,YAAY,GAAG,YAAY,KAAK,eAAe;AAElD,OAAG;AAAA,MACD,GAAG;AAAA,MAAY;AAAA,MAAG,GAAG;AAAA,MACrB,cAAc;AAAA,MAAQ;AAAA,MAAG;AAAA,MACzB,GAAG;AAAA,MAAW,GAAG;AAAA,MACjB;AAAA,IAAA;AAGF,OAAG,cAAc,GAAG,YAAY,GAAG,oBAAoB,GAAG,OAAO;AACjE,OAAG,cAAc,GAAG,YAAY,GAAG,oBAAoB,GAAG,OAAO;AACjE,OAAG,cAAc,GAAG,YAAY,GAAG,gBAAgB,GAAG,aAAa;AACnE,OAAG,cAAc,GAAG,YAAY,GAAG,gBAAgB,GAAG,aAAa;AAEnE,UAAM,WAAW,KAAK,iBAAiB,IAAI,YAAY;AACvD,QAAI,UAAU;AACZ,SAAG,UAAU,UAAU,IAAI;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,YAAmC;AAC5D,UAAM,KAAK,KAAK;AAChB,UAAM,OAAO,KAAK,aAAa,IAAI,SAAS;AAE5C,QAAI,CAAC,KAAK,cAAc;AACtB,WAAK,eAAe,GAAG,cAAA;AAAA,IACzB;AAEA,OAAG,cAAc,GAAG,WAAW,IAAI;AACnC,OAAG,YAAY,GAAG,YAAY,KAAK,YAAY;AAE/C,OAAG;AAAA,MACD,GAAG;AAAA,MAAY;AAAA,MAAG,GAAG;AAAA,MACrB,GAAG;AAAA,MAAM,GAAG;AAAA,MACZ;AAAA,IAAA;AAGF,OAAG,cAAc,GAAG,YAAY,GAAG,oBAAoB,GAAG,MAAM;AAChE,OAAG,cAAc,GAAG,YAAY,GAAG,oBAAoB,GAAG,MAAM;AAChE,OAAG,cAAc,GAAG,YAAY,GAAG,gBAAgB,GAAG,aAAa;AACnE,OAAG,cAAc,GAAG,YAAY,GAAG,gBAAgB,GAAG,aAAa;AAEnE,UAAM,WAAW,KAAK,iBAAiB,IAAI,SAAS;AACpD,QAAI,UAAU;AACZ,SAAG,UAAU,UAAU,IAAI;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,0BAA0B,MAAkB,OAAe,QAAsB;AACvF,UAAM,KAAK,KAAK;AAChB,UAAM,OAAO,KAAK,aAAa,IAAI,oBAAoB;AAEvD,QAAI,CAAC,KAAK,qBAAqB;AAC7B,WAAK,sBAAsB,GAAG,cAAA;AAAA,IAChC;AAEA,OAAG,cAAc,GAAG,WAAW,IAAI;AACnC,OAAG,YAAY,GAAG,YAAY,KAAK,mBAAmB;AAEtD,OAAG;AAAA,MACD,GAAG;AAAA,MAAY;AAAA,MAAG,GAAG;AAAA,MACrB;AAAA,MAAO;AAAA,MAAQ;AAAA,MACf,GAAG;AAAA,MAAW,GAAG;AAAA,MACjB;AAAA,IAAA;AAGF,OAAG,cAAc,GAAG,YAAY,GAAG,oBAAoB,GAAG,OAAO;AACjE,OAAG,cAAc,GAAG,YAAY,GAAG,oBAAoB,GAAG,OAAO;AACjE,OAAG,cAAc,GAAG,YAAY,GAAG,gBAAgB,GAAG,aAAa;AACnE,OAAG,cAAc,GAAG,YAAY,GAAG,gBAAgB,GAAG,aAAa;AAEnE,UAAM,WAAW,KAAK,iBAAiB,IAAI,oBAAoB;AAC/D,QAAI,UAAU;AACZ,SAAG,UAAU,UAAU,IAAI;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,MAAc,aAAkD;AACzF,UAAM,KAAK,KAAK;AAGhB,QAAI,CAAC,KAAK,aAAa,IAAI,IAAI,GAAG;AAChC,WAAK,aAAa,IAAI,MAAM,KAAK,iBAAiB;AAAA,IACpD;AAEA,UAAM,OAAO,KAAK,aAAa,IAAI,IAAI;AAGvC,QAAI,CAAC,KAAK,SAAS,IAAI,IAAI,GAAG;AAC5B,YAAMC,WAAU,GAAG,cAAA;AACnB,UAAIA,UAAS;AACX,aAAK,SAAS,IAAI,MAAMA,QAAO;AAAA,MACjC;AAAA,IACF;AAEA,UAAM,UAAU,KAAK,SAAS,IAAI,IAAI;AACtC,QAAI,CAAC,QAAS;AAEd,OAAG,cAAc,GAAG,WAAW,IAAI;AACnC,OAAG,YAAY,GAAG,YAAY,OAAO;AAErC,OAAG;AAAA,MACD,GAAG;AAAA,MAAY;AAAA,MAAG,GAAG;AAAA,MACrB,GAAG;AAAA,MAAM,GAAG;AAAA,MACZ;AAAA,IAAA;AAGF,OAAG,cAAc,GAAG,YAAY,GAAG,oBAAoB,GAAG,MAAM;AAChE,OAAG,cAAc,GAAG,YAAY,GAAG,oBAAoB,GAAG,MAAM;AAChE,OAAG,cAAc,GAAG,YAAY,GAAG,gBAAgB,GAAG,aAAa;AACnE,OAAG,cAAc,GAAG,YAAY,GAAG,gBAAgB,GAAG,aAAa;AAEnE,UAAM,WAAW,KAAK,iBAAiB,IAAI,IAAI;AAC/C,QAAI,UAAU;AACZ,SAAG,UAAU,UAAU,IAAI;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKO,OAAO,OAAe,QAAsB;AACjD,UAAM,KAAK,KAAK;AAChB,OAAG,SAAS,GAAG,GAAG,OAAO,MAAM;AAG/B,QAAI,KAAK,mBAAmB;AAC1B,WAAK,6BAAA;AAAA,IACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKO,0BAAuD;AAC5D,WAAO,KAAK;AAAA,EACd;AACF;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"viji.worker-C48_bOBV.js","sources":["../src/worker/ParameterSystem.ts","../src/worker/InteractionSystem.ts","../src/worker/CVSystem.ts","../src/worker/VideoSystem.ts","../src/worker/VijiWorkerRuntime.ts","../src/utils/SceneAnalyzer.ts","../src/worker/viji.worker.ts"],"sourcesContent":["import { \n ParameterGroup, \n ParameterDefinition, \n ParameterValue,\n SliderParameter,\n ColorParameter,\n ToggleParameter,\n SelectParameter,\n TextParameter,\n NumberParameter,\n ImageParameter,\n SliderConfig,\n ColorConfig,\n ToggleConfig,\n SelectConfig,\n TextConfig,\n NumberConfig,\n ImageConfig\n} from '../types/index.js';\n\nexport class ParameterSystem {\n // Parameter system for Phase 2 (new object-based approach)\n private parameterDefinitions = new Map<string, ParameterDefinition>();\n private parameterGroups = new Map<string, ParameterGroup>();\n private parameterValues = new Map<string, ParameterValue>();\n private parameterObjects = new Map<string, any>(); // Maps parameter names to their objects\n private parametersDefined = false;\n private initialValuesSynced = false; // Track if initial values have been synced from host\n \n // Debug logging control\n private debugMode = false;\n\n /**\n * Enable or disable debug logging\n */\n setDebugMode(enabled: boolean): void {\n this.debugMode = enabled;\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 // Message posting callback\n private postMessageCallback: (type: string, data?: any) => void;\n\n constructor(postMessageCallback: (type: string, data?: any) => void) {\n this.postMessageCallback = postMessageCallback;\n }\n\n // Parameter helper function implementations (return parameter objects)\n public createSliderParameter(defaultValue: number, config: SliderConfig): SliderParameter {\n const paramName = config.label;\n const sliderObject = {\n value: defaultValue,\n min: config.min ?? 0,\n max: config.max ?? 100,\n step: config.step ?? 1,\n label: config.label,\n description: config.description ?? '',\n group: config.group ?? 'general',\n category: config.category ?? 'general',\n };\n\n const definition: ParameterDefinition = {\n type: 'slider',\n defaultValue,\n label: sliderObject.label,\n description: sliderObject.description,\n group: sliderObject.group,\n category: sliderObject.category,\n config: {\n min: sliderObject.min,\n max: sliderObject.max,\n step: sliderObject.step\n }\n };\n\n this.storeParameterDefinition(paramName, definition);\n this.parameterObjects.set(paramName, sliderObject);\n return sliderObject;\n }\n\n public createColorParameter(defaultValue: string, config: ColorConfig): ColorParameter {\n const paramName = config.label;\n const colorObject = {\n value: defaultValue,\n label: config.label,\n description: config.description ?? '',\n group: config.group ?? 'general',\n category: config.category ?? 'general',\n };\n\n const definition: ParameterDefinition = {\n type: 'color',\n defaultValue,\n label: colorObject.label,\n description: colorObject.description,\n group: colorObject.group,\n category: colorObject.category,\n };\n\n this.storeParameterDefinition(paramName, definition);\n this.parameterObjects.set(paramName, colorObject);\n return colorObject;\n }\n\n public createToggleParameter(defaultValue: boolean, config: ToggleConfig): ToggleParameter {\n const paramName = config.label;\n const toggleObject = {\n value: defaultValue,\n label: config.label,\n description: config.description ?? '',\n group: config.group ?? 'general',\n category: config.category ?? 'general'\n };\n\n const definition: ParameterDefinition = {\n type: 'toggle',\n defaultValue,\n label: toggleObject.label,\n description: toggleObject.description,\n group: toggleObject.group,\n category: toggleObject.category\n };\n\n this.storeParameterDefinition(paramName, definition);\n this.parameterObjects.set(paramName, toggleObject);\n return toggleObject;\n }\n\n public createSelectParameter(defaultValue: string | number, config: SelectConfig): SelectParameter {\n const paramName = config.label;\n const selectObject = {\n value: defaultValue,\n options: config.options,\n label: config.label,\n description: config.description ?? '',\n group: config.group ?? 'general',\n category: config.category ?? 'general'\n };\n\n const definition: ParameterDefinition = {\n type: 'select',\n defaultValue,\n label: selectObject.label,\n description: selectObject.description,\n group: selectObject.group,\n category: selectObject.category,\n config: {\n options: selectObject.options\n }\n };\n\n this.storeParameterDefinition(paramName, definition);\n this.parameterObjects.set(paramName, selectObject);\n return selectObject;\n }\n\n public createTextParameter(defaultValue: string, config: TextConfig): TextParameter {\n const paramName = config.label;\n const textObject = {\n value: defaultValue,\n maxLength: config.maxLength ?? 1000,\n label: config.label,\n description: config.description ?? '',\n group: config.group ?? 'general',\n category: config.category ?? 'general'\n };\n\n const definition: ParameterDefinition = {\n type: 'text',\n defaultValue,\n label: textObject.label,\n description: textObject.description,\n group: textObject.group,\n category: textObject.category,\n config: {\n maxLength: textObject.maxLength\n }\n };\n\n this.storeParameterDefinition(paramName, definition);\n this.parameterObjects.set(paramName, textObject);\n return textObject;\n }\n\n public createNumberParameter(defaultValue: number, config: NumberConfig): NumberParameter {\n const paramName = config.label;\n const numberObject = {\n value: defaultValue,\n min: config.min ?? 0,\n max: config.max ?? 100,\n step: config.step ?? 1,\n label: config.label,\n description: config.description ?? '',\n group: config.group ?? 'general',\n category: config.category ?? 'general'\n };\n\n const definition: ParameterDefinition = {\n type: 'number',\n defaultValue,\n label: numberObject.label,\n description: numberObject.description,\n group: numberObject.group,\n category: numberObject.category,\n config: {\n min: numberObject.min,\n max: numberObject.max,\n step: numberObject.step\n }\n };\n\n this.storeParameterDefinition(paramName, definition);\n this.parameterObjects.set(paramName, numberObject);\n return numberObject;\n }\n\n public createImageParameter(defaultValue: null, config: ImageConfig): ImageParameter {\n const paramName = config.label;\n const imageObject = {\n value: defaultValue,\n label: config.label,\n description: config.description ?? '',\n group: config.group ?? 'general',\n category: config.category ?? 'general'\n };\n\n const definition: ParameterDefinition = {\n type: 'image',\n defaultValue,\n label: imageObject.label,\n description: imageObject.description,\n group: imageObject.group,\n category: imageObject.category\n };\n\n this.storeParameterDefinition(paramName, definition);\n this.parameterObjects.set(paramName, imageObject);\n return imageObject;\n }\n\n private storeParameterDefinition(name: string, definition: ParameterDefinition): void {\n // This is called during scene initialization, not during define()\n // We'll collect these and send them when the scene is fully loaded\n this.parameterDefinitions.set(name, definition);\n this.parameterValues.set(name, definition.defaultValue);\n }\n\n public updateParameterValue(name: string, value: ParameterValue): boolean {\n const definition = this.parameterDefinitions.get(name);\n if (!definition) {\n console.warn(`Unknown parameter: ${name}. Available parameters:`, Array.from(this.parameterDefinitions.keys()));\n return false;\n }\n\n // Validation\n if (!this.validateParameterValue(name, value, definition)) {\n console.warn(`Validation failed for parameter ${name} = ${value}`);\n return false;\n }\n\n // Check if value actually changed (but always allow initial sync)\n const currentValue = this.parameterValues.get(name);\n const isInitialSync = !this.initialValuesSynced; // During initial parameter sync from host\n \n if (currentValue === value && !isInitialSync) {\n return false; // No change (but allow initial sync even if values match)\n }\n\n // Update value in both storage and parameter object\n this.parameterValues.set(name, value);\n \n // Update the parameter object's value property\n const parameterObject = this.parameterObjects.get(name);\n if (parameterObject) {\n parameterObject.value = value;\n }\n \n return true;\n }\n\n private validateParameterValue(name: string, value: ParameterValue, definition: ParameterDefinition): boolean {\n // Custom validation function\n if (definition.validate && !definition.validate(value)) {\n console.error(`Custom validation failed for parameter '${name}': ${value}`);\n return false;\n }\n\n // Type validation\n switch (definition.type) {\n case 'slider':\n case 'number':\n if (typeof value !== 'number' || isNaN(value)) {\n console.error(`Parameter '${name}' must be a number, got: ${value}`);\n return false;\n }\n if (definition.config?.min !== undefined && value < definition.config.min) {\n console.error(`Parameter '${name}' value ${value} is below minimum ${definition.config.min}`);\n return false;\n }\n if (definition.config?.max !== undefined && value > definition.config.max) {\n console.error(`Parameter '${name}' value ${value} is above maximum ${definition.config.max}`);\n return false;\n }\n break;\n case 'color':\n if (typeof value !== 'string' || !/^#[0-9A-Fa-f]{6}$/.test(value)) {\n console.error(`Parameter '${name}' must be a valid hex color, got: ${value}`);\n return false;\n }\n break;\n case 'toggle':\n if (typeof value !== 'boolean') {\n console.error(`Parameter '${name}' must be a boolean, got: ${value}`);\n return false;\n }\n break;\n case 'select':\n if (!definition.config?.options || !definition.config.options.includes(value as string & number)) {\n console.error(`Parameter '${name}' value ${value} is not in options: ${definition.config?.options}`);\n return false;\n }\n break;\n case 'text':\n if (typeof value !== 'string') {\n console.error(`Parameter '${name}' must be a string, got: ${value}`);\n return false;\n }\n if (definition.config?.maxLength && value.length > definition.config.maxLength) {\n console.error(`Parameter '${name}' text too long: ${value.length} > ${definition.config.maxLength}`);\n return false;\n }\n break;\n case 'image':\n // Image parameters can be null, ImageBitmap, or OffscreenCanvas\n if (value !== null && !(value instanceof ImageBitmap) && !(value instanceof OffscreenCanvas)) {\n console.error(`Parameter '${name}' must be null, ImageBitmap, or OffscreenCanvas, got: ${value}`);\n return false;\n }\n break;\n }\n\n return true;\n }\n\n // Reset parameter state (called when loading new scene)\n public resetParameterState(): void {\n this.parametersDefined = false;\n this.initialValuesSynced = false;\n this.parameterDefinitions.clear();\n this.parameterGroups.clear();\n this.parameterValues.clear();\n this.parameterObjects.clear();\n }\n\n // Send all parameters (from helper functions) to host\n public sendAllParametersToHost(): void {\n // Don't send if already sent or if no parameters defined\n if (this.parametersDefined || this.parameterDefinitions.size === 0) {\n return;\n }\n\n try {\n // Group parameters by their group property\n const groups = new Map<string, ParameterGroup>();\n\n for (const [paramName, paramDef] of this.parameterDefinitions) {\n const groupName = paramDef.group || 'general';\n \n if (!groups.has(groupName)) {\n // Use the parameter's category if available, otherwise default to 'general'\n const category = paramDef.category || 'general';\n groups.set(groupName, {\n groupName,\n category,\n parameters: {}\n });\n }\n\n const group = groups.get(groupName)!;\n group.parameters[paramName] = paramDef;\n }\n\n this.parametersDefined = true;\n\n // Send parameter definitions to host for UI generation\n this.postMessageCallback('parameters-defined', {\n groups: Array.from(groups.values())\n });\n\n this.debugLog(`All parameters sent to host: ${this.parameterDefinitions.size} parameters in ${groups.size} groups`);\n } catch (error) {\n this.postMessageCallback('parameter-validation-error', {\n message: `Failed to send parameters to host: ${(error as Error).message}`,\n code: 'PARAMETER_SENDING_ERROR'\n });\n }\n }\n\n // Mark initial values as synced\n public markInitialValuesSynced(): void {\n this.initialValuesSynced = true;\n }\n\n // Get parameter count for performance reporting\n public getParameterCount(): number {\n return this.parameterDefinitions.size;\n }\n\n // Get all parameter objects (for P5 adapter to add .p5 properties)\n public getAllParameterObjects(): Map<string, any> {\n return this.parameterObjects;\n }\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 /**\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 | 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 return {\n isConnected: this.videoState.isConnected,\n currentFrame: this.videoState.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} ","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} from './types.js';\nimport { \n SliderConfig, \n ColorConfig, \n ToggleConfig, \n SelectConfig, \n TextConfig, \n NumberConfig \n} from '../types/index.js';\nimport { ParameterSystem } from './ParameterSystem.js';\nimport { InteractionSystem } from './InteractionSystem.js';\nimport { VideoSystem } from './VideoSystem.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 /**\n * Enable or disable debug logging\n */\n setDebugMode(enabled: boolean): void {\n this.debugMode = enabled;\n // Propagate to child systems\n if (this.videoSystem) this.videoSystem.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 system (Phase 10) - worker-side video processing\n private videoSystem: VideoSystem;\n \n // Audio state (Phase 5) - receives analysis results from host\n private audioState = {\n isConnected: false,\n volume: { rms: 0, peak: 0 },\n bands: {\n bass: 0, mid: 0, treble: 0, subBass: 0, \n lowMid: 0, highMid: 0, presence: 0, brilliance: 0\n },\n frequencyData: new Uint8Array(0)\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 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 },\n \n // Interaction APIs will be added during construction\n mouse: {} as any,\n keyboard: {} as any,\n touches: {} as any,\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 // Initialize video system (Phase 10)\n this.videoSystem = new VideoSystem();\n \n // Integrate APIs into viji object\n Object.assign(this.viji, this.interactionSystem.getInteractionAPIs());\n Object.assign(this.viji.video, this.videoSystem.getVideoAPI());\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 * Lazy-loads P5WorkerAdapter and sets up P5 rendering\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 // Dynamically import P5WorkerAdapter (use import.meta.url for correct path resolution)\n const { P5WorkerAdapter } = await import(\n new URL('./renderers/P5WorkerAdapter.js', import.meta.url).href\n );\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)\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 // Dynamically import ShaderWorkerAdapter (use import.meta.url for correct path resolution)\n const { ShaderWorkerAdapter } = await import(\n new URL('./renderers/ShaderWorkerAdapter.js', import.meta.url).href\n );\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: { rms: 0, peak: 0 },\n bands: {\n bass: 0, mid: 0, treble: 0, subBass: 0, \n lowMid: 0, highMid: 0, presence: 0, brilliance: 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 video system\n this.videoSystem.resetVideoState();\n // Update viji.video reference\n Object.assign(this.viji.video, this.videoSystem.getVideoAPI());\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 '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 '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 VideoSystem\n if (this.videoSystem) {\n this.videoSystem.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 VideoSystem\n const cvStats = this.videoSystem.getCVStats();\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 // Phase 5: 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 frequencyData: new Uint8Array(message.data.frequencyData)\n };\n \n // Update viji.audio API\n this.viji.audio = {\n ...this.audioState,\n getFrequencyData: () => this.audioState.frequencyData\n };\n }\n\n private handleVideoCanvasSetup(message: WorkerVideoCanvasSetupMessage): void {\n // Phase 10: Handle OffscreenCanvas transfer from host to worker-side VideoSystem\n this.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 // Update viji.video API with current VideoSystem state\n Object.assign(this.viji.video, this.videoSystem.getVideoAPI());\n }\n\n private handleVideoFrameUpdate(message: WorkerVideoFrameUpdateMessage): void {\n // Phase 10: Handle ImageBitmap frame from host to worker-side VideoSystem\n this.videoSystem.handleFrameUpdate({\n imageBitmap: message.data.imageBitmap,\n timestamp: message.data.timestamp\n });\n \n // Update viji.video API with current VideoSystem state\n Object.assign(this.viji.video, this.videoSystem.getVideoAPI());\n }\n\n private handleVideoConfigUpdate(message: WorkerVideoConfigUpdateMessage): void {\n // Phase 10: Handle video configuration updates\n this.videoSystem.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 // ✅ FIX: Update viji.video API with current VideoSystem state after config changes\n // This ensures that disconnection events properly update the scene's video API\n Object.assign(this.viji.video, this.videoSystem.getVideoAPI());\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 * Produces an ArrayBuffer (image bytes) to send back as transferable.\n */\n private async handleCaptureFrame(message: {\n type: 'capture-frame';\n id: string;\n data: { type?: string; resolution?: number | { width: number; height: number } };\n }): Promise<void> {\n try {\n if (!this.canvas) {\n throw new Error('Canvas not initialized');\n }\n\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 // Draw to a temp OffscreenCanvas at target size\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 // Draw current frame from the main canvas onto temp with crop & scale\n tctx.drawImage(this.canvas as OffscreenCanvas, sx, sy, sWidth, sHeight, 0, 0, targetWidth, targetHeight);\n\n const blob = await temp.convertToBlob({ type: mimeType });\n const arrayBuffer = await blob.arrayBuffer();\n\n // Send back as transferable ArrayBuffer to avoid cloning overhead\n (self as any).postMessage({\n type: 'capture-frame-result',\n id: message.id,\n timestamp: Date.now(),\n data: {\n mimeType,\n buffer: arrayBuffer,\n width: targetWidth,\n height: targetHeight\n }\n }, [arrayBuffer]);\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 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 \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} ","/**\n * Scene code analysis utilities\n * Provides static methods for analyzing artist scene code\n */\n\nexport type RendererType = 'native' | 'p5' | 'shader';\n\n/**\n * Analyzes scene code for metadata and configuration\n */\nexport class SceneAnalyzer {\n /**\n * Detects the renderer type from scene code comments\n * \n * Looks for:\n * - // @renderer shader\n * - /* @renderer shader *\\/\n * - // @renderer p5\n * - /* @renderer p5 *\\/\n * \n * @param sceneCode - The artist's scene code to analyze\n * @returns The detected renderer type ('shader', 'p5', or 'native')\n */\n static detectRendererType(sceneCode: string): RendererType {\n // Check for // @renderer shader or /* @renderer shader */\n if (/\\/\\/\\s*@renderer\\s+shader|\\/\\*\\s*@renderer\\s+shader\\s*\\*\\//.test(sceneCode)) {\n return 'shader';\n }\n \n // Check for // @renderer p5 or /* @renderer p5 */\n if (/\\/\\/\\s*@renderer\\s+p5|\\/\\*\\s*@renderer\\s+p5\\s*\\*\\//.test(sceneCode)) {\n return 'p5';\n }\n \n return 'native';\n }\n}\n\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: existing logic\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 const sceneFunction = new Function('viji', functionBody);\n renderFunction = 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":["renderFunction"],"mappings":"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"}
|