@livepeer-frameworks/streamcrafter-core 0.0.2 → 0.1.0

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.
Files changed (43) hide show
  1. package/README.md +24 -1
  2. package/dist/cjs/IngestControllerV2-BSD6O8gz.cjs +5662 -0
  3. package/dist/cjs/IngestControllerV2-BSD6O8gz.cjs.map +1 -0
  4. package/dist/cjs/IngestControllerV2-DZFuxrNk.cjs +5768 -0
  5. package/dist/cjs/IngestControllerV2-DZFuxrNk.cjs.map +1 -0
  6. package/dist/cjs/IngestControllerV2-Mt6aX-DU.cjs +5768 -0
  7. package/dist/cjs/IngestControllerV2-Mt6aX-DU.cjs.map +1 -0
  8. package/dist/cjs/index.cjs +60 -5
  9. package/dist/cjs/index.cjs.map +1 -1
  10. package/dist/cjs/vanilla.cjs +1 -1
  11. package/dist/cjs/vanilla.cjs.map +1 -1
  12. package/dist/esm/IngestControllerV2-BaOxEiTq.js +5606 -0
  13. package/dist/esm/IngestControllerV2-BaOxEiTq.js.map +1 -0
  14. package/dist/esm/IngestControllerV2-DswB_ybx.js +5712 -0
  15. package/dist/esm/IngestControllerV2-DswB_ybx.js.map +1 -0
  16. package/dist/esm/IngestControllerV2-fiwB1xzE.js +5712 -0
  17. package/dist/esm/IngestControllerV2-fiwB1xzE.js.map +1 -0
  18. package/dist/esm/index.js +61 -6
  19. package/dist/esm/index.js.map +1 -1
  20. package/dist/esm/vanilla.js +1 -1
  21. package/dist/esm/vanilla.js.map +1 -1
  22. package/dist/types/core/EncoderManager.d.ts +6 -0
  23. package/dist/types/core/IngestControllerV2.d.ts +7 -0
  24. package/dist/types/core/SceneManager.d.ts +6 -0
  25. package/dist/types/core/WhipClient.d.ts +1 -0
  26. package/dist/types/core/renderers/Canvas2DRenderer.d.ts +1 -0
  27. package/dist/types/core/renderers/WebGLRenderer.d.ts +1 -0
  28. package/dist/types/core/renderers/WebGPURenderer.d.ts +3 -0
  29. package/dist/types/core/renderers/index.d.ts +5 -0
  30. package/dist/types/types.d.ts +5 -0
  31. package/dist/workers/compositor.worker.js +92 -5
  32. package/dist/workers/compositor.worker.js.map +1 -1
  33. package/dist/workers/encoder.worker.js +2 -2
  34. package/dist/workers/encoder.worker.js.map +1 -1
  35. package/package.json +1 -1
  36. package/src/core/EncoderManager.ts +63 -1
  37. package/src/core/IngestControllerV2.ts +114 -98
  38. package/src/core/SceneManager.ts +16 -3
  39. package/src/core/WhipClient.ts +26 -0
  40. package/src/core/renderers/WebGPURenderer.ts +1 -1
  41. package/src/vanilla/StreamCrafterV2.ts +0 -1
  42. package/src/workers/compositor.worker.ts +1 -2
  43. package/src/workers/encoder.worker.ts +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"compositor.worker.js","sources":["../../../src/core/renderers/index.ts","../../../src/core/renderers/Canvas2DRenderer.ts","../../../src/core/renderers/WebGLRenderer.ts","../../../src/core/renderers/WebGPURenderer.ts","../../../src/core/TransitionEngine.ts","../../../src/workers/compositor.worker.ts"],"sourcesContent":["/**\n * Compositor Renderer System\n *\n * Multi-renderer architecture with auto-fallback chain:\n * WebGPU (if supported) → WebGL/PixiJS → Canvas2D (always works)\n *\n * Usage:\n * ```typescript\n * const renderer = createRenderer('auto');\n * await renderer.init(canvas, config);\n * renderer.renderScene(scene, frames);\n * const frame = renderer.captureFrame();\n * ```\n */\n\nimport type {\n Scene,\n CompositorConfig,\n TransitionType,\n FilterConfig,\n RendererType,\n RendererStats,\n} from '../../types';\n\n// ============================================================================\n// Renderer Interface\n// ============================================================================\n\n/**\n * Common interface for all compositor renderers.\n * Implementations: Canvas2DRenderer, WebGLRenderer, WebGPURenderer\n */\nexport interface CompositorRenderer {\n /** Renderer type identifier */\n readonly type: RendererType;\n\n /** Whether this renderer is supported in the current environment */\n readonly isSupported: boolean;\n\n /**\n * Initialize the renderer with an OffscreenCanvas\n * @param canvas - OffscreenCanvas transferred to worker\n * @param config - Compositor configuration\n */\n init(canvas: OffscreenCanvas, config: CompositorConfig): Promise<void>;\n\n /**\n * Render a complete scene with all visible layers\n * @param scene - Scene to render\n * @param frames - Map of sourceId to VideoFrame or ImageBitmap\n */\n renderScene(scene: Scene, frames: Map<string, VideoFrame | ImageBitmap>): void;\n\n /**\n * Render a transition between two scene snapshots\n * @param from - ImageBitmap of the previous scene\n * @param to - ImageBitmap of the target scene\n * @param progress - Transition progress (0-1)\n * @param type - Type of transition effect\n */\n renderTransition(\n from: ImageBitmap,\n to: ImageBitmap,\n progress: number,\n type: TransitionType\n ): void;\n\n /**\n * Apply a filter effect to a specific layer\n * Note: Only WebGL and WebGPU renderers support filters\n * @param layerId - Target layer ID\n * @param filter - Filter configuration\n */\n applyFilter(layerId: string, filter: FilterConfig): void;\n\n /**\n * Capture the current canvas content as a VideoFrame\n * @returns VideoFrame of the rendered content\n */\n captureFrame(): VideoFrame;\n\n /**\n * Get current renderer statistics\n * @returns Current FPS, frame time, and optional GPU memory usage\n */\n getStats(): RendererStats;\n\n /**\n * Clean up renderer resources\n */\n destroy(): void;\n}\n\n// ============================================================================\n// Renderer Factory\n// ============================================================================\n\n// Forward declarations - actual implementations in separate files\nlet Canvas2DRenderer: new () => CompositorRenderer;\nlet WebGLRenderer: new () => CompositorRenderer;\nlet WebGPURenderer: new () => CompositorRenderer;\n\n/**\n * Check if renderer implementations are registered\n */\nlet renderersRegistered = false;\n\n/**\n * Register renderer implementations\n * Called automatically when renderer files are imported\n */\nexport function registerRenderer(\n type: 'canvas2d' | 'webgl' | 'webgpu',\n RendererClass: new () => CompositorRenderer\n): void {\n switch (type) {\n case 'canvas2d':\n Canvas2DRenderer = RendererClass;\n break;\n case 'webgl':\n WebGLRenderer = RendererClass;\n break;\n case 'webgpu':\n WebGPURenderer = RendererClass;\n break;\n }\n renderersRegistered = true;\n}\n\n/**\n * Create a renderer instance based on preference and browser support\n *\n * @param preferred - Preferred renderer type or 'auto' for best available\n * @returns Appropriate renderer instance based on support and preference\n *\n * Auto-fallback chain: WebGPU → WebGL → Canvas2D\n */\nexport function createRenderer(preferred: RendererType = 'auto'): CompositorRenderer {\n if (!renderersRegistered) {\n // If no renderers registered yet, try to import them dynamically\n throw new Error(\n 'No renderers registered. Import Canvas2DRenderer before calling createRenderer.'\n );\n }\n\n const fallbackChain: RendererType[] =\n preferred === 'auto'\n ? ['webgpu', 'webgl', 'canvas2d']\n : [preferred, 'webgl', 'canvas2d'];\n\n for (const type of fallbackChain) {\n const renderer = instantiateRenderer(type);\n if (renderer && renderer.isSupported) {\n return renderer;\n }\n }\n\n // Canvas2D should always work, but if it somehow doesn't...\n throw new Error('No supported renderer available');\n}\n\n/**\n * Instantiate a specific renderer type\n */\nfunction instantiateRenderer(type: RendererType): CompositorRenderer | null {\n switch (type) {\n case 'webgpu':\n return WebGPURenderer ? new WebGPURenderer() : null;\n case 'webgl':\n return WebGLRenderer ? new WebGLRenderer() : null;\n case 'canvas2d':\n return Canvas2DRenderer ? new Canvas2DRenderer() : null;\n default:\n return null;\n }\n}\n\n/**\n * Check which renderers are supported in the current environment\n */\nexport function getSupportedRenderers(): RendererType[] {\n const supported: RendererType[] = [];\n\n // Canvas2D is always supported\n supported.push('canvas2d');\n\n // Check WebGL2 support\n if (typeof WebGL2RenderingContext !== 'undefined') {\n supported.push('webgl');\n }\n\n // Check WebGPU support (not available in workers before Chrome 115)\n if (typeof navigator !== 'undefined' && 'gpu' in navigator) {\n supported.push('webgpu');\n }\n\n return supported;\n}\n\n/**\n * Get the recommended renderer for the current environment\n */\nexport function getRecommendedRenderer(): RendererType {\n const supported = getSupportedRenderers();\n\n // Prefer WebGL for now (WebGPU not ready for production)\n if (supported.includes('webgl')) {\n return 'webgl';\n }\n\n return 'canvas2d';\n}\n\n// ============================================================================\n// Re-exports\n// ============================================================================\n\nexport type { CompositorConfig, RendererStats, RendererType } from '../../types';\n","/**\n * Canvas2D Renderer\n *\n * Universal fallback renderer using the Canvas 2D API.\n * Works in all browsers that support OffscreenCanvas.\n *\n * Features:\n * - Layer compositing with z-order\n * - Transform: position, size, rotation, opacity\n * - Border radius (rounded corners)\n * - Cropping\n * - Transitions: fade, slide (left/right/up/down), cut\n *\n * Limitations:\n * - No real-time filters (blur, color correction)\n * - No GPU-accelerated effects\n *\n * Performance:\n * - GPU-accelerated via compositor (drawImage is fast)\n * - `desynchronized: true` reduces input latency\n */\n\nimport type {\n Scene,\n Layer,\n CompositorConfig,\n TransitionType,\n FilterConfig,\n RendererType,\n RendererStats,\n} from '../../types';\nimport { registerRenderer, type CompositorRenderer } from './index';\n\nexport class Canvas2DRenderer implements CompositorRenderer {\n readonly type: RendererType = 'canvas2d';\n readonly isSupported = true; // Always available\n\n private canvas!: OffscreenCanvas;\n private ctx!: OffscreenCanvasRenderingContext2D;\n private config!: CompositorConfig;\n\n // Stats tracking\n private frameCount = 0;\n private lastFrameTime = 0;\n private fps = 0;\n private lastRenderTime = 0;\n\n async init(canvas: OffscreenCanvas, config: CompositorConfig): Promise<void> {\n this.canvas = canvas;\n this.config = config;\n\n const ctx = canvas.getContext('2d', {\n desynchronized: true, // Lower latency (no vsync wait)\n alpha: false, // Opaque canvas (faster)\n willReadFrequently: false, // Optimize for write-only\n });\n\n if (!ctx) {\n throw new Error('Failed to get 2D context from OffscreenCanvas');\n }\n\n this.ctx = ctx;\n this.lastFrameTime = performance.now();\n\n // Set up image smoothing for quality\n this.ctx.imageSmoothingEnabled = true;\n this.ctx.imageSmoothingQuality = 'high';\n }\n\n renderScene(scene: Scene, frames: Map<string, VideoFrame | ImageBitmap>): void {\n const startTime = performance.now();\n\n // Clear with background color\n this.ctx.fillStyle = scene.backgroundColor || '#000000';\n this.ctx.fillRect(0, 0, this.config.width, this.config.height);\n\n // Sort layers by z-index and render\n const visibleLayers = scene.layers\n .filter((layer) => layer.visible)\n .sort((a, b) => a.zIndex - b.zIndex);\n\n for (const layer of visibleLayers) {\n const frame = frames.get(layer.sourceId);\n if (frame) {\n this.renderLayer(layer, frame);\n }\n }\n\n // Track stats\n this.lastRenderTime = performance.now() - startTime;\n this.updateStats();\n }\n\n private renderLayer(layer: Layer, frame: VideoFrame | ImageBitmap): void {\n const { x, y, width, height, opacity, rotation, borderRadius, crop } = layer.transform;\n const scalingMode = layer.scalingMode || 'letterbox';\n\n // Convert relative coordinates to pixels\n const px = x * this.config.width;\n const py = y * this.config.height;\n const pw = width * this.config.width;\n const ph = height * this.config.height;\n\n // Save context state\n this.ctx.save();\n\n // Apply opacity\n this.ctx.globalAlpha = Math.max(0, Math.min(1, opacity));\n\n // Apply rotation around center\n if (rotation !== 0) {\n const centerX = px + pw / 2;\n const centerY = py + ph / 2;\n this.ctx.translate(centerX, centerY);\n this.ctx.rotate((rotation * Math.PI) / 180);\n this.ctx.translate(-centerX, -centerY);\n }\n\n // Apply border radius clipping\n if (borderRadius > 0) {\n this.roundedRect(px, py, pw, ph, borderRadius);\n this.ctx.clip();\n }\n\n // Calculate source crop rectangle (user-defined crop)\n const frameWidth = this.getFrameWidth(frame);\n const frameHeight = this.getFrameHeight(frame);\n\n const sx = crop.left * frameWidth;\n const sy = crop.top * frameHeight;\n const sw = frameWidth * (1 - crop.left - crop.right);\n const sh = frameHeight * (1 - crop.top - crop.bottom);\n\n // Calculate destination based on scaling mode\n const { dx, dy, dw, dh, sxFinal, syFinal, swFinal, shFinal } = this.calculateScaling(\n scalingMode,\n sx, sy, sw, sh,\n px, py, pw, ph\n );\n\n // Draw the frame\n this.ctx.drawImage(frame, sxFinal, syFinal, swFinal, shFinal, dx, dy, dw, dh);\n\n // Restore context state\n this.ctx.restore();\n }\n\n /**\n * Calculate source and destination rectangles based on scaling mode\n */\n private calculateScaling(\n mode: 'stretch' | 'letterbox' | 'crop',\n sx: number, sy: number, sw: number, sh: number,\n dx: number, dy: number, dw: number, dh: number\n ): {\n sxFinal: number; syFinal: number; swFinal: number; shFinal: number;\n dx: number; dy: number; dw: number; dh: number;\n } {\n const sourceAspect = sw / sh;\n const destAspect = dw / dh;\n\n switch (mode) {\n case 'stretch':\n // Stretch source to fill destination (may distort)\n return {\n sxFinal: sx, syFinal: sy, swFinal: sw, shFinal: sh,\n dx, dy, dw, dh\n };\n\n case 'letterbox': {\n // Fit source within destination, preserving aspect ratio\n // Add black bars if needed (handled by layer background)\n let newDw: number, newDh: number;\n\n if (sourceAspect > destAspect) {\n // Source is wider - fit to width, add top/bottom bars\n newDw = dw;\n newDh = dw / sourceAspect;\n } else {\n // Source is taller - fit to height, add left/right bars\n newDh = dh;\n newDw = dh * sourceAspect;\n }\n\n const newDx = dx + (dw - newDw) / 2;\n const newDy = dy + (dh - newDh) / 2;\n\n return {\n sxFinal: sx, syFinal: sy, swFinal: sw, shFinal: sh,\n dx: newDx, dy: newDy, dw: newDw, dh: newDh\n };\n }\n\n case 'crop': {\n // Fill destination, preserving aspect ratio, crop overflow\n let cropSx = sx, cropSy = sy, cropSw = sw, cropSh = sh;\n\n if (sourceAspect > destAspect) {\n // Source is wider - crop sides\n const targetSw = sh * destAspect;\n const cropAmount = (sw - targetSw) / 2;\n cropSx = sx + cropAmount;\n cropSw = targetSw;\n } else {\n // Source is taller - crop top/bottom\n const targetSh = sw / destAspect;\n const cropAmount = (sh - targetSh) / 2;\n cropSy = sy + cropAmount;\n cropSh = targetSh;\n }\n\n return {\n sxFinal: cropSx, syFinal: cropSy, swFinal: cropSw, shFinal: cropSh,\n dx, dy, dw, dh\n };\n }\n\n default:\n return {\n sxFinal: sx, syFinal: sy, swFinal: sw, shFinal: sh,\n dx, dy, dw, dh\n };\n }\n }\n\n private getFrameWidth(frame: VideoFrame | ImageBitmap): number {\n return 'displayWidth' in frame ? frame.displayWidth : frame.width;\n }\n\n private getFrameHeight(frame: VideoFrame | ImageBitmap): number {\n return 'displayHeight' in frame ? frame.displayHeight : frame.height;\n }\n\n /**\n * Draw a rounded rectangle path\n */\n private roundedRect(x: number, y: number, w: number, h: number, r: number): void {\n // Clamp radius to half of shortest side\n const radius = Math.min(r, w / 2, h / 2);\n\n this.ctx.beginPath();\n this.ctx.moveTo(x + radius, y);\n this.ctx.lineTo(x + w - radius, y);\n this.ctx.quadraticCurveTo(x + w, y, x + w, y + radius);\n this.ctx.lineTo(x + w, y + h - radius);\n this.ctx.quadraticCurveTo(x + w, y + h, x + w - radius, y + h);\n this.ctx.lineTo(x + radius, y + h);\n this.ctx.quadraticCurveTo(x, y + h, x, y + h - radius);\n this.ctx.lineTo(x, y + radius);\n this.ctx.quadraticCurveTo(x, y, x + radius, y);\n this.ctx.closePath();\n }\n\n renderTransition(\n from: ImageBitmap,\n to: ImageBitmap,\n progress: number,\n type: TransitionType\n ): void {\n // Clamp progress\n const p = Math.max(0, Math.min(1, progress));\n\n switch (type) {\n case 'fade':\n this.renderFadeTransition(from, to, p);\n break;\n\n case 'slide-left':\n this.renderSlideTransition(from, to, p, 'left');\n break;\n\n case 'slide-right':\n this.renderSlideTransition(from, to, p, 'right');\n break;\n\n case 'slide-up':\n this.renderSlideTransition(from, to, p, 'up');\n break;\n\n case 'slide-down':\n this.renderSlideTransition(from, to, p, 'down');\n break;\n\n case 'cut':\n default:\n // Instant cut - just show the target\n this.ctx.drawImage(to, 0, 0, this.config.width, this.config.height);\n break;\n }\n }\n\n private renderFadeTransition(from: ImageBitmap, to: ImageBitmap, progress: number): void {\n // Draw \"from\" scene at full opacity\n this.ctx.globalAlpha = 1;\n this.ctx.drawImage(from, 0, 0, this.config.width, this.config.height);\n\n // Overlay \"to\" scene with increasing opacity\n this.ctx.globalAlpha = progress;\n this.ctx.drawImage(to, 0, 0, this.config.width, this.config.height);\n\n // Reset alpha\n this.ctx.globalAlpha = 1;\n }\n\n private renderSlideTransition(\n from: ImageBitmap,\n to: ImageBitmap,\n progress: number,\n direction: 'left' | 'right' | 'up' | 'down'\n ): void {\n const w = this.config.width;\n const h = this.config.height;\n\n switch (direction) {\n case 'left': {\n // \"from\" slides out to the left, \"to\" slides in from the right\n const offset = progress * w;\n this.ctx.drawImage(from, -offset, 0, w, h);\n this.ctx.drawImage(to, w - offset, 0, w, h);\n break;\n }\n\n case 'right': {\n // \"from\" slides out to the right, \"to\" slides in from the left\n const offset = progress * w;\n this.ctx.drawImage(from, offset, 0, w, h);\n this.ctx.drawImage(to, -w + offset, 0, w, h);\n break;\n }\n\n case 'up': {\n // \"from\" slides out to the top, \"to\" slides in from the bottom\n const offset = progress * h;\n this.ctx.drawImage(from, 0, -offset, w, h);\n this.ctx.drawImage(to, 0, h - offset, w, h);\n break;\n }\n\n case 'down': {\n // \"from\" slides out to the bottom, \"to\" slides in from the top\n const offset = progress * h;\n this.ctx.drawImage(from, 0, offset, w, h);\n this.ctx.drawImage(to, 0, -h + offset, w, h);\n break;\n }\n }\n }\n\n applyFilter(_layerId: string, _filter: FilterConfig): void {\n // Canvas2D doesn't support real-time filters efficiently\n // Filters would require reading pixels back, processing, and redrawing\n // This is too slow for real-time video compositing\n console.warn(\n '[Canvas2DRenderer] Filters not supported. Use WebGL or WebGPU renderer for filter effects.'\n );\n }\n\n captureFrame(): VideoFrame {\n // Create a VideoFrame from the canvas content\n return new VideoFrame(this.canvas, {\n timestamp: performance.now() * 1000, // microseconds\n });\n }\n\n private updateStats(): void {\n this.frameCount++;\n const now = performance.now();\n const elapsed = now - this.lastFrameTime;\n\n // Update FPS every second\n if (elapsed >= 1000) {\n this.fps = (this.frameCount * 1000) / elapsed;\n this.frameCount = 0;\n this.lastFrameTime = now;\n }\n }\n\n getStats(): RendererStats {\n return {\n fps: Math.round(this.fps),\n frameTimeMs: this.lastRenderTime,\n // Canvas2D doesn't have GPU memory tracking\n };\n }\n\n destroy(): void {\n // Canvas2D context doesn't need explicit cleanup\n // Just clear any references\n this.canvas = null as unknown as OffscreenCanvas;\n this.ctx = null as unknown as OffscreenCanvasRenderingContext2D;\n }\n}\n\n// Register this renderer with the factory\nregisterRenderer('canvas2d', Canvas2DRenderer);\n","/**\n * WebGL2 Renderer\n *\n * High-performance renderer using raw WebGL2 for GPU-accelerated compositing.\n * Replaces PixiJS for better Web Worker and OffscreenCanvas support.\n *\n * Features:\n * - Layer compositing with z-order\n * - Transform: position, size, rotation, opacity\n * - Border radius via fragment shader SDF\n * - Cropping\n * - Transitions: fade, slide (left/right/up/down), cut\n * - Real-time filters: blur, color matrix, grayscale, sepia\n *\n * Requirements:\n * - WebGL2 support (universal in modern browsers)\n * - OffscreenCanvas support for worker context\n */\n\nimport type {\n Scene,\n Layer,\n CompositorConfig,\n TransitionType,\n FilterConfig,\n RendererType,\n RendererStats,\n} from '../../types';\nimport { registerRenderer, type CompositorRenderer } from './index';\n\n// ============================================================================\n// Shader Sources\n// ============================================================================\n\nconst VERTEX_SHADER = `#version 300 es\nprecision highp float;\n\n// Quad vertices (2 triangles = 6 vertices)\nconst vec2 VERTICES[6] = vec2[6](\n vec2(0.0, 0.0),\n vec2(1.0, 0.0),\n vec2(0.0, 1.0),\n vec2(1.0, 0.0),\n vec2(1.0, 1.0),\n vec2(0.0, 1.0)\n);\n\n// Uniforms for layer transform\nuniform vec2 u_resolution; // Canvas size in pixels\nuniform vec2 u_position; // Layer position (0-1 relative)\nuniform vec2 u_size; // Layer size (0-1 relative)\nuniform float u_rotation; // Rotation in radians\nuniform vec4 u_crop; // Crop (left, top, right, bottom)\n\nout vec2 v_texCoord;\nout vec2 v_localPos; // Position within layer (0-1)\nout vec2 v_layerSize; // Layer size in pixels\n\nvoid main() {\n vec2 vertex = VERTICES[gl_VertexID];\n\n // Apply texture coordinate cropping\n float cropLeft = u_crop.x;\n float cropTop = u_crop.y;\n float cropRight = u_crop.z;\n float cropBottom = u_crop.w;\n\n v_texCoord = vec2(\n cropLeft + vertex.x * (1.0 - cropLeft - cropRight),\n cropTop + vertex.y * (1.0 - cropTop - cropBottom)\n );\n\n // Store local position for border radius calculation\n v_localPos = vertex;\n v_layerSize = u_size * u_resolution;\n\n // Calculate layer position in pixels\n vec2 layerPos = u_position * u_resolution;\n vec2 layerSize = u_size * u_resolution;\n\n // Transform vertex position\n vec2 pos = layerPos + vertex * layerSize;\n\n // Apply rotation around layer center\n if (u_rotation != 0.0) {\n vec2 center = layerPos + layerSize * 0.5;\n pos -= center;\n float c = cos(u_rotation);\n float s = sin(u_rotation);\n pos = vec2(pos.x * c - pos.y * s, pos.x * s + pos.y * c);\n pos += center;\n }\n\n // Convert to clip space (-1 to 1)\n vec2 clipPos = (pos / u_resolution) * 2.0 - 1.0;\n\n // Flip Y for WebGL coordinate system\n clipPos.y = -clipPos.y;\n\n gl_Position = vec4(clipPos, 0.0, 1.0);\n}\n`;\n\nconst FRAGMENT_SHADER = `#version 300 es\nprecision highp float;\n\nuniform sampler2D u_texture;\nuniform float u_opacity;\nuniform float u_borderRadius; // Border radius in pixels\n\n// Filter uniforms\nuniform int u_filterType; // 0=none, 1=blur, 2=colorMatrix, 3=grayscale, 4=sepia\nuniform float u_filterStrength;\nuniform mat4 u_colorMatrix;\n\nin vec2 v_texCoord;\nin vec2 v_localPos;\nin vec2 v_layerSize;\n\nout vec4 fragColor;\n\n// Signed distance function for rounded rectangle\nfloat roundedRectSDF(vec2 pos, vec2 size, float radius) {\n vec2 q = abs(pos - 0.5) * size - size * 0.5 + radius;\n return min(max(q.x, q.y), 0.0) + length(max(q, 0.0)) - radius;\n}\n\nvoid main() {\n vec4 color = texture(u_texture, v_texCoord);\n\n // Apply filter effects\n if (u_filterType == 2) {\n // Color matrix\n color = u_colorMatrix * color;\n } else if (u_filterType == 3) {\n // Grayscale\n float gray = dot(color.rgb, vec3(0.299, 0.587, 0.114));\n color.rgb = mix(color.rgb, vec3(gray), u_filterStrength);\n } else if (u_filterType == 4) {\n // Sepia\n vec3 sepia = vec3(\n dot(color.rgb, vec3(0.393, 0.769, 0.189)),\n dot(color.rgb, vec3(0.349, 0.686, 0.168)),\n dot(color.rgb, vec3(0.272, 0.534, 0.131))\n );\n color.rgb = mix(color.rgb, sepia, u_filterStrength);\n }\n\n // Apply border radius clipping\n if (u_borderRadius > 0.0) {\n float dist = roundedRectSDF(v_localPos, v_layerSize, u_borderRadius);\n // Smooth anti-aliased edge\n float alpha = 1.0 - smoothstep(-1.0, 1.0, dist);\n color.a *= alpha;\n }\n\n // Apply opacity\n color.a *= u_opacity;\n\n fragColor = color;\n}\n`;\n\n// Simpler shader for transitions (full-screen quads)\nconst TRANSITION_VERTEX_SHADER = `#version 300 es\nprecision highp float;\n\nconst vec2 VERTICES[6] = vec2[6](\n vec2(-1.0, -1.0),\n vec2(1.0, -1.0),\n vec2(-1.0, 1.0),\n vec2(1.0, -1.0),\n vec2(1.0, 1.0),\n vec2(-1.0, 1.0)\n);\n\nuniform vec2 u_offset; // Slide offset\n\nout vec2 v_texCoord;\n\nvoid main() {\n vec2 vertex = VERTICES[gl_VertexID];\n v_texCoord = (vertex + 1.0) * 0.5;\n v_texCoord.y = 1.0 - v_texCoord.y; // Flip Y\n gl_Position = vec4(vertex + u_offset * 2.0, 0.0, 1.0);\n}\n`;\n\nconst TRANSITION_FRAGMENT_SHADER = `#version 300 es\nprecision highp float;\n\nuniform sampler2D u_texture;\nuniform float u_opacity;\n\nin vec2 v_texCoord;\nout vec4 fragColor;\n\nvoid main() {\n vec4 color = texture(u_texture, v_texCoord);\n color.a *= u_opacity;\n fragColor = color;\n}\n`;\n\n// ============================================================================\n// WebGL2 Renderer Implementation\n// ============================================================================\n\nfunction checkWebGLSupport(): boolean {\n try {\n return typeof WebGL2RenderingContext !== 'undefined';\n } catch {\n return false;\n }\n}\n\nexport class WebGLRenderer implements CompositorRenderer {\n readonly type: RendererType = 'webgl';\n readonly isSupported = checkWebGLSupport();\n\n private gl!: WebGL2RenderingContext;\n private canvas!: OffscreenCanvas;\n private config!: CompositorConfig;\n\n // Shader programs\n private layerProgram!: WebGLProgram;\n private transitionProgram!: WebGLProgram;\n\n // Uniform locations for layer program\n private layerUniforms!: {\n resolution: WebGLUniformLocation;\n position: WebGLUniformLocation;\n size: WebGLUniformLocation;\n rotation: WebGLUniformLocation;\n crop: WebGLUniformLocation;\n texture: WebGLUniformLocation;\n opacity: WebGLUniformLocation;\n borderRadius: WebGLUniformLocation;\n filterType: WebGLUniformLocation;\n filterStrength: WebGLUniformLocation;\n colorMatrix: WebGLUniformLocation;\n };\n\n // Uniform locations for transition program\n private transitionUniforms!: {\n texture: WebGLUniformLocation;\n opacity: WebGLUniformLocation;\n offset: WebGLUniformLocation;\n };\n\n // Texture management\n private textures: Map<string, WebGLTexture> = new Map();\n private textureCache: Map<string, { width: number; height: number }> = new Map();\n\n // Filter configurations\n private filterConfigs: Map<string, FilterConfig> = new Map();\n\n // Stats tracking\n private frameCount = 0;\n private lastFrameTime = 0;\n private fps = 0;\n private lastRenderTime = 0;\n\n async init(canvas: OffscreenCanvas, config: CompositorConfig): Promise<void> {\n if (!this.isSupported) {\n throw new Error('WebGL2 is not supported in this environment');\n }\n\n this.canvas = canvas;\n this.config = config;\n\n // Create WebGL2 context\n const gl = canvas.getContext('webgl2', {\n alpha: false,\n antialias: false,\n depth: false,\n stencil: false,\n premultipliedAlpha: true,\n preserveDrawingBuffer: false,\n powerPreference: 'high-performance',\n desynchronized: true, // Lower latency\n });\n\n if (!gl) {\n throw new Error('Failed to create WebGL2 context');\n }\n\n this.gl = gl;\n\n // Enable blending for transparency\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n // Compile shaders and create programs\n this.layerProgram = this.createProgram(VERTEX_SHADER, FRAGMENT_SHADER);\n this.transitionProgram = this.createProgram(TRANSITION_VERTEX_SHADER, TRANSITION_FRAGMENT_SHADER);\n\n // Get uniform locations for layer program\n this.layerUniforms = {\n resolution: gl.getUniformLocation(this.layerProgram, 'u_resolution')!,\n position: gl.getUniformLocation(this.layerProgram, 'u_position')!,\n size: gl.getUniformLocation(this.layerProgram, 'u_size')!,\n rotation: gl.getUniformLocation(this.layerProgram, 'u_rotation')!,\n crop: gl.getUniformLocation(this.layerProgram, 'u_crop')!,\n texture: gl.getUniformLocation(this.layerProgram, 'u_texture')!,\n opacity: gl.getUniformLocation(this.layerProgram, 'u_opacity')!,\n borderRadius: gl.getUniformLocation(this.layerProgram, 'u_borderRadius')!,\n filterType: gl.getUniformLocation(this.layerProgram, 'u_filterType')!,\n filterStrength: gl.getUniformLocation(this.layerProgram, 'u_filterStrength')!,\n colorMatrix: gl.getUniformLocation(this.layerProgram, 'u_colorMatrix')!,\n };\n\n // Get uniform locations for transition program\n this.transitionUniforms = {\n texture: gl.getUniformLocation(this.transitionProgram, 'u_texture')!,\n opacity: gl.getUniformLocation(this.transitionProgram, 'u_opacity')!,\n offset: gl.getUniformLocation(this.transitionProgram, 'u_offset')!,\n };\n\n // Set viewport\n gl.viewport(0, 0, config.width, config.height);\n\n this.lastFrameTime = performance.now();\n console.log('[WebGLRenderer] Initialized with raw WebGL2');\n }\n\n private createProgram(vertexSource: string, fragmentSource: string): WebGLProgram {\n const gl = this.gl;\n\n // Compile vertex shader\n const vertexShader = gl.createShader(gl.VERTEX_SHADER)!;\n gl.shaderSource(vertexShader, vertexSource);\n gl.compileShader(vertexShader);\n\n if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n const log = gl.getShaderInfoLog(vertexShader);\n gl.deleteShader(vertexShader);\n throw new Error(`Vertex shader compilation failed: ${log}`);\n }\n\n // Compile fragment shader\n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER)!;\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n const log = gl.getShaderInfoLog(fragmentShader);\n gl.deleteShader(vertexShader);\n gl.deleteShader(fragmentShader);\n throw new Error(`Fragment shader compilation failed: ${log}`);\n }\n\n // Link program\n const program = gl.createProgram()!;\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 log = gl.getProgramInfoLog(program);\n gl.deleteProgram(program);\n gl.deleteShader(vertexShader);\n gl.deleteShader(fragmentShader);\n throw new Error(`Program linking failed: ${log}`);\n }\n\n // Clean up shaders (they're attached to the program now)\n gl.deleteShader(vertexShader);\n gl.deleteShader(fragmentShader);\n\n return program;\n }\n\n renderScene(scene: Scene, frames: Map<string, VideoFrame | ImageBitmap>): void {\n const startTime = performance.now();\n const gl = this.gl;\n\n // Update textures from frames\n this.updateTextures(frames);\n\n // Clear with background color\n const bgColor = this.parseColor(scene.backgroundColor || '#000000');\n gl.clearColor(bgColor.r, bgColor.g, bgColor.b, 1.0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n\n // Use layer program\n gl.useProgram(this.layerProgram);\n\n // Set resolution uniform\n gl.uniform2f(this.layerUniforms.resolution, this.config.width, this.config.height);\n\n // Sort layers by z-index and render\n const visibleLayers = scene.layers\n .filter((layer) => layer.visible)\n .sort((a, b) => a.zIndex - b.zIndex);\n\n for (const layer of visibleLayers) {\n const texture = this.textures.get(layer.sourceId);\n if (texture) {\n this.renderLayer(layer, texture);\n }\n }\n\n // Track stats\n this.lastRenderTime = performance.now() - startTime;\n this.updateStats();\n }\n\n private updateTextures(frames: Map<string, VideoFrame | ImageBitmap>): void {\n const gl = this.gl;\n\n for (const [sourceId, frame] of frames) {\n let texture = this.textures.get(sourceId);\n const width = 'displayWidth' in frame ? frame.displayWidth : frame.width;\n const height = 'displayHeight' in frame ? frame.displayHeight : frame.height;\n const cached = this.textureCache.get(sourceId);\n\n if (!texture) {\n // Create new texture\n texture = gl.createTexture()!;\n gl.bindTexture(gl.TEXTURE_2D, texture);\n\n // Set texture parameters\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 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n\n this.textures.set(sourceId, texture);\n } else {\n gl.bindTexture(gl.TEXTURE_2D, texture);\n }\n\n // Upload frame data to texture\n // texImage2D can accept VideoFrame and ImageBitmap directly\n if (cached && cached.width === width && cached.height === height) {\n // Same size - use texSubImage2D for better performance\n gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, frame);\n } else {\n // Different size or new - use texImage2D\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, frame);\n this.textureCache.set(sourceId, { width, height });\n }\n }\n }\n\n private renderLayer(layer: Layer, texture: WebGLTexture): void {\n const gl = this.gl;\n const { x, y, width, height, opacity, rotation, borderRadius, crop } = layer.transform;\n const scalingMode = layer.scalingMode || 'letterbox';\n\n // Get texture dimensions for aspect ratio calculation\n const textureInfo = this.textureCache.get(layer.sourceId);\n if (!textureInfo) return;\n\n // Calculate source dimensions after user-defined crop\n const srcWidth = textureInfo.width * (1 - crop.left - crop.right);\n const srcHeight = textureInfo.height * (1 - crop.top - crop.bottom);\n const srcAspect = srcWidth / srcHeight;\n\n // Convert layer bounds to pixels for aspect calculation\n const destWidth = width * this.config.width;\n const destHeight = height * this.config.height;\n const destAspect = destWidth / destHeight;\n\n // Calculate scaled position, size, and crop based on scaling mode\n let finalX = x;\n let finalY = y;\n let finalWidth = width;\n let finalHeight = height;\n let finalCropLeft = crop.left;\n let finalCropTop = crop.top;\n let finalCropRight = crop.right;\n let finalCropBottom = crop.bottom;\n\n switch (scalingMode) {\n case 'stretch':\n // No changes - stretch to fill\n break;\n\n case 'letterbox': {\n // Fit source within destination, preserving aspect ratio\n let newWidth: number, newHeight: number;\n\n if (srcAspect > destAspect) {\n // Source is wider - fit to width, add top/bottom bars\n newWidth = width;\n newHeight = (width * this.config.width) / srcAspect / this.config.height;\n } else {\n // Source is taller - fit to height, add left/right bars\n newHeight = height;\n newWidth = (height * this.config.height * srcAspect) / this.config.width;\n }\n\n // Center within original bounds\n finalX = x + (width - newWidth) / 2;\n finalY = y + (height - newHeight) / 2;\n finalWidth = newWidth;\n finalHeight = newHeight;\n break;\n }\n\n case 'crop': {\n // Fill destination, preserving aspect ratio, crop source overflow\n if (srcAspect > destAspect) {\n // Source is wider - crop sides\n const targetSrcWidth = srcHeight * destAspect;\n const cropAmount = (srcWidth - targetSrcWidth) / 2 / textureInfo.width;\n finalCropLeft = crop.left + cropAmount;\n finalCropRight = crop.right + cropAmount;\n } else {\n // Source is taller - crop top/bottom\n const targetSrcHeight = srcWidth / destAspect;\n const cropAmount = (srcHeight - targetSrcHeight) / 2 / textureInfo.height;\n finalCropTop = crop.top + cropAmount;\n finalCropBottom = crop.bottom + cropAmount;\n }\n break;\n }\n }\n\n // Bind texture\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.uniform1i(this.layerUniforms.texture, 0);\n\n // Set transform uniforms with scaled values\n gl.uniform2f(this.layerUniforms.position, finalX, finalY);\n gl.uniform2f(this.layerUniforms.size, finalWidth, finalHeight);\n gl.uniform1f(this.layerUniforms.rotation, (rotation * Math.PI) / 180);\n gl.uniform4f(this.layerUniforms.crop, finalCropLeft, finalCropTop, finalCropRight, finalCropBottom);\n gl.uniform1f(this.layerUniforms.opacity, Math.max(0, Math.min(1, opacity)));\n gl.uniform1f(this.layerUniforms.borderRadius, borderRadius);\n\n // Set filter uniforms\n const filter = this.filterConfigs.get(layer.id);\n if (filter) {\n this.applyFilterUniforms(filter);\n } else {\n gl.uniform1i(this.layerUniforms.filterType, 0);\n }\n\n // Draw the quad (6 vertices for 2 triangles)\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n }\n\n private applyFilterUniforms(filter: FilterConfig): void {\n const gl = this.gl;\n\n switch (filter.type) {\n case 'colorMatrix': {\n gl.uniform1i(this.layerUniforms.filterType, 2);\n // Build color matrix from filter settings\n const b = filter.brightness ?? 1;\n const c = filter.contrast ?? 1;\n const s = filter.saturation ?? 1;\n\n // Simplified color matrix combining brightness, contrast, saturation\n const sr = (1 - s) * 0.299;\n const sg = (1 - s) * 0.587;\n const sb = (1 - s) * 0.114;\n\n const matrix = new Float32Array([\n (sr + s) * c * b, sg * c * b, sb * c * b, 0,\n sr * c * b, (sg + s) * c * b, sb * c * b, 0,\n sr * c * b, sg * c * b, (sb + s) * c * b, 0,\n 0, 0, 0, 1,\n ]);\n gl.uniformMatrix4fv(this.layerUniforms.colorMatrix, false, matrix);\n break;\n }\n\n case 'grayscale':\n gl.uniform1i(this.layerUniforms.filterType, 3);\n gl.uniform1f(this.layerUniforms.filterStrength, filter.strength ?? 1);\n break;\n\n case 'sepia':\n gl.uniform1i(this.layerUniforms.filterType, 4);\n gl.uniform1f(this.layerUniforms.filterStrength, filter.strength ?? 1);\n break;\n\n case 'blur':\n // Blur would require multi-pass rendering with framebuffers\n // For now, just log a warning\n console.warn('[WebGLRenderer] Blur filter requires multi-pass rendering, not yet implemented');\n gl.uniform1i(this.layerUniforms.filterType, 0);\n break;\n\n default:\n gl.uniform1i(this.layerUniforms.filterType, 0);\n }\n }\n\n renderTransition(\n from: ImageBitmap,\n to: ImageBitmap,\n progress: number,\n type: TransitionType\n ): void {\n const gl = this.gl;\n const p = Math.max(0, Math.min(1, progress));\n\n // Clear\n gl.clearColor(0, 0, 0, 1);\n gl.clear(gl.COLOR_BUFFER_BIT);\n\n // Use transition program\n gl.useProgram(this.transitionProgram);\n\n // Create temporary textures\n const fromTexture = this.createTempTexture(from);\n const toTexture = this.createTempTexture(to);\n\n switch (type) {\n case 'fade':\n // Draw \"from\" at decreasing opacity\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, fromTexture);\n gl.uniform1i(this.transitionUniforms.texture, 0);\n gl.uniform1f(this.transitionUniforms.opacity, 1 - p);\n gl.uniform2f(this.transitionUniforms.offset, 0, 0);\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n\n // Draw \"to\" at increasing opacity\n gl.bindTexture(gl.TEXTURE_2D, toTexture);\n gl.uniform1f(this.transitionUniforms.opacity, p);\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n break;\n\n case 'slide-left': {\n const offset = p;\n // Draw \"from\" sliding out\n gl.bindTexture(gl.TEXTURE_2D, fromTexture);\n gl.uniform1f(this.transitionUniforms.opacity, 1);\n gl.uniform2f(this.transitionUniforms.offset, -offset, 0);\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n\n // Draw \"to\" sliding in\n gl.bindTexture(gl.TEXTURE_2D, toTexture);\n gl.uniform2f(this.transitionUniforms.offset, 1 - offset, 0);\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n break;\n }\n\n case 'slide-right': {\n const offset = p;\n gl.bindTexture(gl.TEXTURE_2D, fromTexture);\n gl.uniform1f(this.transitionUniforms.opacity, 1);\n gl.uniform2f(this.transitionUniforms.offset, offset, 0);\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n\n gl.bindTexture(gl.TEXTURE_2D, toTexture);\n gl.uniform2f(this.transitionUniforms.offset, -1 + offset, 0);\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n break;\n }\n\n case 'slide-up': {\n const offset = p;\n gl.bindTexture(gl.TEXTURE_2D, fromTexture);\n gl.uniform1f(this.transitionUniforms.opacity, 1);\n gl.uniform2f(this.transitionUniforms.offset, 0, offset);\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n\n gl.bindTexture(gl.TEXTURE_2D, toTexture);\n gl.uniform2f(this.transitionUniforms.offset, 0, -1 + offset);\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n break;\n }\n\n case 'slide-down': {\n const offset = p;\n gl.bindTexture(gl.TEXTURE_2D, fromTexture);\n gl.uniform1f(this.transitionUniforms.opacity, 1);\n gl.uniform2f(this.transitionUniforms.offset, 0, -offset);\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n\n gl.bindTexture(gl.TEXTURE_2D, toTexture);\n gl.uniform2f(this.transitionUniforms.offset, 0, 1 - offset);\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n break;\n }\n\n case 'cut':\n default:\n // Just draw the target\n gl.bindTexture(gl.TEXTURE_2D, toTexture);\n gl.uniform1f(this.transitionUniforms.opacity, 1);\n gl.uniform2f(this.transitionUniforms.offset, 0, 0);\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n break;\n }\n\n // Clean up temp textures\n gl.deleteTexture(fromTexture);\n gl.deleteTexture(toTexture);\n }\n\n private createTempTexture(image: ImageBitmap): WebGLTexture {\n const gl = this.gl;\n const texture = gl.createTexture()!;\n gl.bindTexture(gl.TEXTURE_2D, texture);\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 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.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n return texture;\n }\n\n applyFilter(layerId: string, filter: FilterConfig): void {\n this.filterConfigs.set(layerId, filter);\n }\n\n /**\n * Remove filters from a layer\n */\n clearFilter(layerId: string): void {\n this.filterConfigs.delete(layerId);\n }\n\n captureFrame(): VideoFrame {\n return new VideoFrame(this.canvas, {\n timestamp: performance.now() * 1000, // microseconds\n });\n }\n\n private parseColor(hex: string): { r: number; g: number; b: number } {\n // Parse hex color like '#000000' or '#000'\n let r = 0, g = 0, b = 0;\n\n if (hex.startsWith('#')) {\n hex = hex.slice(1);\n }\n\n if (hex.length === 3) {\n r = parseInt(hex[0] + hex[0], 16) / 255;\n g = parseInt(hex[1] + hex[1], 16) / 255;\n b = parseInt(hex[2] + hex[2], 16) / 255;\n } else if (hex.length === 6) {\n r = parseInt(hex.slice(0, 2), 16) / 255;\n g = parseInt(hex.slice(2, 4), 16) / 255;\n b = parseInt(hex.slice(4, 6), 16) / 255;\n }\n\n return { r, g, b };\n }\n\n private updateStats(): void {\n this.frameCount++;\n const now = performance.now();\n const elapsed = now - this.lastFrameTime;\n\n if (elapsed >= 1000) {\n this.fps = (this.frameCount * 1000) / elapsed;\n this.frameCount = 0;\n this.lastFrameTime = now;\n }\n }\n\n getStats(): RendererStats {\n return {\n fps: Math.round(this.fps),\n frameTimeMs: this.lastRenderTime,\n };\n }\n\n destroy(): void {\n const gl = this.gl;\n\n // Delete textures\n for (const texture of this.textures.values()) {\n gl.deleteTexture(texture);\n }\n this.textures.clear();\n this.textureCache.clear();\n\n // Delete programs\n if (this.layerProgram) {\n gl.deleteProgram(this.layerProgram);\n }\n if (this.transitionProgram) {\n gl.deleteProgram(this.transitionProgram);\n }\n\n // Clear filter configs\n this.filterConfigs.clear();\n\n // Lose context to free GPU resources\n const ext = gl.getExtension('WEBGL_lose_context');\n if (ext) {\n ext.loseContext();\n }\n }\n}\n\n// Register this renderer with the factory\nregisterRenderer('webgl', WebGLRenderer);\n","/**\n * WebGPU Renderer\n *\n * Highest-performance renderer using native WebGPU APIs.\n * Provides the best performance and enables compute shader effects.\n *\n * Features:\n * - Layer compositing with z-order\n * - Transform: position, size, rotation, opacity\n * - Border radius via stencil masking\n * - Cropping via UV coordinates\n * - Transitions: fade, slide (left/right/up/down), cut\n * - Future: Compute shader effects\n *\n * Requirements:\n * - WebGPU support (Chrome 113+, Edge 113+, Firefox behind flag)\n * - Note: Safari support coming, Firefox experimental\n *\n * Performance:\n * - Native GPU access with minimal overhead\n * - Efficient texture uploads from VideoFrame\n * - Batched rendering pipeline\n */\n\nimport type {\n Scene,\n Layer,\n CompositorConfig,\n TransitionType,\n FilterConfig,\n RendererType,\n RendererStats,\n} from '../../types';\nimport { registerRenderer, type CompositorRenderer } from './index';\n\n// ============================================================================\n// WGSL Shaders\n// ============================================================================\n\nconst VERTEX_SHADER = /* wgsl */ `\nstruct VertexInput {\n @location(0) position: vec2f,\n @location(1) texCoord: vec2f,\n}\n\nstruct VertexOutput {\n @builtin(position) position: vec4f,\n @location(0) texCoord: vec2f,\n}\n\nstruct Uniforms {\n transform: mat4x4f,\n opacity: f32,\n _padding1: f32,\n // Crop: x=left, y=top, z=right, w=bottom (0-1 from each edge)\n crop: vec4f,\n}\n\n@group(0) @binding(0) var<uniform> uniforms: Uniforms;\n\n@vertex\nfn main(input: VertexInput) -> VertexOutput {\n var output: VertexOutput;\n output.position = uniforms.transform * vec4f(input.position, 0.0, 1.0);\n\n // Apply UV crop: remap texCoord from [0,1] to [cropLeft, 1-cropRight] x [cropTop, 1-cropBottom]\n let cropLeft = uniforms.crop.x;\n let cropTop = uniforms.crop.y;\n let cropRight = uniforms.crop.z;\n let cropBottom = uniforms.crop.w;\n\n output.texCoord = vec2f(\n cropLeft + input.texCoord.x * (1.0 - cropLeft - cropRight),\n cropTop + input.texCoord.y * (1.0 - cropTop - cropBottom)\n );\n\n return output;\n}\n`;\n\nconst FRAGMENT_SHADER = /* wgsl */ `\nstruct Uniforms {\n transform: mat4x4f,\n opacity: f32,\n _padding1: f32,\n crop: vec4f,\n}\n\n@group(0) @binding(0) var<uniform> uniforms: Uniforms;\n@group(0) @binding(1) var textureSampler: sampler;\n@group(0) @binding(2) var textureData: texture_2d<f32>;\n\n@fragment\nfn main(@location(0) texCoord: vec2f) -> @location(0) vec4f {\n let color = textureSample(textureData, textureSampler, texCoord);\n return vec4f(color.rgb, color.a * uniforms.opacity);\n}\n`;\n\nconst TRANSITION_FRAGMENT_SHADER = /* wgsl */ `\nstruct TransitionUniforms {\n progress: f32,\n transitionType: u32, // 0=cut, 1=fade, 2-5=slide directions\n canvasSize: vec2f,\n}\n\n@group(0) @binding(0) var<uniform> uniforms: TransitionUniforms;\n@group(0) @binding(1) var textureSampler: sampler;\n@group(0) @binding(2) var fromTexture: texture_2d<f32>;\n@group(0) @binding(3) var toTexture: texture_2d<f32>;\n\n@fragment\nfn main(@location(0) texCoord: vec2f) -> @location(0) vec4f {\n let fromColor = textureSample(fromTexture, textureSampler, texCoord);\n let toColor = textureSample(toTexture, textureSampler, texCoord);\n\n switch uniforms.transitionType {\n case 0u: { // cut\n return toColor;\n }\n case 1u: { // fade\n return mix(fromColor, toColor, uniforms.progress);\n }\n case 2u: { // slide-left\n let offset = uniforms.progress;\n if texCoord.x < 1.0 - offset {\n return textureSample(fromTexture, textureSampler, vec2f(texCoord.x + offset, texCoord.y));\n } else {\n return textureSample(toTexture, textureSampler, vec2f(texCoord.x - (1.0 - offset), texCoord.y));\n }\n }\n case 3u: { // slide-right\n let offset = uniforms.progress;\n if texCoord.x > offset {\n return textureSample(fromTexture, textureSampler, vec2f(texCoord.x - offset, texCoord.y));\n } else {\n return textureSample(toTexture, textureSampler, vec2f(texCoord.x + (1.0 - offset), texCoord.y));\n }\n }\n case 4u: { // slide-up\n let offset = uniforms.progress;\n if texCoord.y < 1.0 - offset {\n return textureSample(fromTexture, textureSampler, vec2f(texCoord.x, texCoord.y + offset));\n } else {\n return textureSample(toTexture, textureSampler, vec2f(texCoord.x, texCoord.y - (1.0 - offset)));\n }\n }\n case 5u: { // slide-down\n let offset = uniforms.progress;\n if texCoord.y > offset {\n return textureSample(fromTexture, textureSampler, vec2f(texCoord.x, texCoord.y - offset));\n } else {\n return textureSample(toTexture, textureSampler, vec2f(texCoord.x, texCoord.y + (1.0 - offset)));\n }\n }\n default: {\n return toColor;\n }\n }\n}\n`;\n\n// ============================================================================\n// WebGPU Support Check\n// ============================================================================\n\nfunction checkWebGPUSupport(): boolean {\n // Check if we're in a context where navigator exists and has gpu\n if (typeof navigator === 'undefined') return false;\n return 'gpu' in navigator;\n}\n\n// ============================================================================\n// WebGPU Renderer\n// ============================================================================\n\nexport class WebGPURenderer implements CompositorRenderer {\n readonly type: RendererType = 'webgpu';\n readonly isSupported = checkWebGPUSupport();\n\n private device: GPUDevice | null = null;\n private context: GPUCanvasContext | null = null;\n private config!: CompositorConfig;\n private canvas!: OffscreenCanvas;\n\n // Pipelines\n private renderPipeline: GPURenderPipeline | null = null;\n private transitionPipeline: GPURenderPipeline | null = null;\n\n // Geometry\n private vertexBuffer: GPUBuffer | null = null;\n private indexBuffer: GPUBuffer | null = null;\n\n // Textures and bind groups per source\n private textures: Map<string, GPUTexture> = new Map();\n private bindGroups: Map<string, GPUBindGroup> = new Map();\n private uniformBuffers: Map<string, GPUBuffer> = new Map();\n\n // Sampler\n private sampler: GPUSampler | null = null;\n\n // Stats tracking\n private frameCount = 0;\n private lastFrameTime = 0;\n private fps = 0;\n private lastRenderTime = 0;\n\n async init(canvas: OffscreenCanvas, config: CompositorConfig): Promise<void> {\n if (!this.isSupported) {\n throw new Error('WebGPU is not supported in this environment');\n }\n\n this.canvas = canvas;\n this.config = config;\n\n // Request adapter and device\n const adapter = await navigator.gpu.requestAdapter({\n powerPreference: 'high-performance',\n });\n\n if (!adapter) {\n throw new Error('Failed to get WebGPU adapter');\n }\n\n this.device = await adapter.requestDevice();\n\n // Configure canvas context\n this.context = canvas.getContext('webgpu') as GPUCanvasContext;\n if (!this.context) {\n throw new Error('Failed to get WebGPU context');\n }\n\n const presentationFormat = navigator.gpu.getPreferredCanvasFormat();\n this.context.configure({\n device: this.device,\n format: presentationFormat,\n alphaMode: 'premultiplied',\n });\n\n // Create render pipeline\n await this.createRenderPipeline(presentationFormat);\n\n // Create geometry buffers (fullscreen quad)\n this.createGeometryBuffers();\n\n // Create sampler\n this.sampler = this.device.createSampler({\n magFilter: 'linear',\n minFilter: 'linear',\n mipmapFilter: 'linear',\n });\n\n this.lastFrameTime = performance.now();\n }\n\n private async createRenderPipeline(format: GPUTextureFormat): Promise<void> {\n if (!this.device) return;\n\n const vertexModule = this.device.createShaderModule({\n code: VERTEX_SHADER,\n });\n\n const fragmentModule = this.device.createShaderModule({\n code: FRAGMENT_SHADER,\n });\n\n // Bind group layout for uniforms + texture\n const bindGroupLayout = this.device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n buffer: { type: 'uniform' },\n },\n {\n binding: 1,\n visibility: GPUShaderStage.FRAGMENT,\n sampler: { type: 'filtering' },\n },\n {\n binding: 2,\n visibility: GPUShaderStage.FRAGMENT,\n texture: { sampleType: 'float' },\n },\n ],\n });\n\n const pipelineLayout = this.device.createPipelineLayout({\n bindGroupLayouts: [bindGroupLayout],\n });\n\n this.renderPipeline = this.device.createRenderPipeline({\n layout: pipelineLayout,\n vertex: {\n module: vertexModule,\n entryPoint: 'main',\n buffers: [\n {\n arrayStride: 16, // 2 floats position + 2 floats texCoord\n attributes: [\n { shaderLocation: 0, offset: 0, format: 'float32x2' },\n { shaderLocation: 1, offset: 8, format: 'float32x2' },\n ],\n },\n ],\n },\n fragment: {\n module: fragmentModule,\n entryPoint: 'main',\n targets: [\n {\n format,\n blend: {\n color: {\n srcFactor: 'src-alpha',\n dstFactor: 'one-minus-src-alpha',\n operation: 'add',\n },\n alpha: {\n srcFactor: 'one',\n dstFactor: 'one-minus-src-alpha',\n operation: 'add',\n },\n },\n },\n ],\n },\n primitive: {\n topology: 'triangle-list',\n },\n });\n }\n\n private createGeometryBuffers(): void {\n if (!this.device) return;\n\n // Fullscreen quad vertices (position + texCoord)\n // prettier-ignore\n const vertices = new Float32Array([\n // Position // TexCoord\n -1.0, -1.0, 0.0, 1.0, // bottom-left\n 1.0, -1.0, 1.0, 1.0, // bottom-right\n 1.0, 1.0, 1.0, 0.0, // top-right\n -1.0, 1.0, 0.0, 0.0, // top-left\n ]);\n\n this.vertexBuffer = this.device.createBuffer({\n size: vertices.byteLength,\n usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,\n });\n this.device.queue.writeBuffer(this.vertexBuffer, 0, vertices);\n\n // Index buffer for two triangles\n const indices = new Uint16Array([0, 1, 2, 0, 2, 3]);\n this.indexBuffer = this.device.createBuffer({\n size: indices.byteLength,\n usage: GPUBufferUsage.INDEX | GPUBufferUsage.COPY_DST,\n });\n this.device.queue.writeBuffer(this.indexBuffer, 0, indices);\n }\n\n renderScene(scene: Scene, frames: Map<string, VideoFrame | ImageBitmap>): void {\n if (!this.device || !this.context || !this.renderPipeline) return;\n\n const startTime = performance.now();\n\n // Update textures from frames\n this.updateTextures(frames);\n\n // Get current texture to render to\n const textureView = this.context.getCurrentTexture().createView();\n\n // Create command encoder\n const commandEncoder = this.device.createCommandEncoder();\n\n // Begin render pass\n const renderPass = commandEncoder.beginRenderPass({\n colorAttachments: [\n {\n view: textureView,\n clearValue: this.parseColor(scene.backgroundColor || '#000000'),\n loadOp: 'clear',\n storeOp: 'store',\n },\n ],\n });\n\n renderPass.setPipeline(this.renderPipeline);\n renderPass.setVertexBuffer(0, this.vertexBuffer!);\n renderPass.setIndexBuffer(this.indexBuffer!, 'uint16');\n\n // Sort and render layers\n const visibleLayers = scene.layers\n .filter((layer) => layer.visible)\n .sort((a, b) => a.zIndex - b.zIndex);\n\n for (const layer of visibleLayers) {\n const bindGroup = this.getOrCreateBindGroup(layer);\n if (bindGroup) {\n this.updateUniforms(layer);\n renderPass.setBindGroup(0, bindGroup);\n renderPass.drawIndexed(6);\n }\n }\n\n renderPass.end();\n\n // Submit commands\n this.device.queue.submit([commandEncoder.finish()]);\n\n // Track stats\n this.lastRenderTime = performance.now() - startTime;\n this.updateStats();\n }\n\n private updateTextures(frames: Map<string, VideoFrame | ImageBitmap>): void {\n if (!this.device) return;\n\n for (const [sourceId, frame] of frames) {\n const width = 'displayWidth' in frame ? frame.displayWidth : frame.width;\n const height = 'displayHeight' in frame ? frame.displayHeight : frame.height;\n\n let texture = this.textures.get(sourceId);\n\n // Create or recreate texture if size changed\n if (!texture || texture.width !== width || texture.height !== height) {\n if (texture) {\n texture.destroy();\n }\n\n texture = this.device.createTexture({\n size: { width, height },\n format: 'rgba8unorm',\n usage:\n GPUTextureUsage.TEXTURE_BINDING |\n GPUTextureUsage.COPY_DST |\n GPUTextureUsage.RENDER_ATTACHMENT,\n });\n this.textures.set(sourceId, texture);\n\n // Invalidate bind group since texture changed\n this.bindGroups.delete(sourceId);\n }\n\n // Copy frame to texture\n if (frame instanceof ImageBitmap) {\n this.device.queue.copyExternalImageToTexture(\n { source: frame },\n { texture },\n { width, height }\n );\n } else {\n // VideoFrame\n this.device.queue.copyExternalImageToTexture(\n { source: frame },\n { texture },\n { width, height }\n );\n }\n }\n }\n\n private getOrCreateBindGroup(layer: Layer): GPUBindGroup | null {\n if (!this.device || !this.sampler || !this.renderPipeline) return null;\n\n const texture = this.textures.get(layer.sourceId);\n if (!texture) return null;\n\n let bindGroup = this.bindGroups.get(layer.id);\n if (!bindGroup) {\n // Create uniform buffer for this layer\n let uniformBuffer = this.uniformBuffers.get(layer.id);\n if (!uniformBuffer) {\n uniformBuffer = this.device.createBuffer({\n size: 96, // mat4x4 (64) + f32 (4) + pad to 16 (12) + vec3f (12) + struct pad (4)\n usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n });\n this.uniformBuffers.set(layer.id, uniformBuffer);\n }\n\n bindGroup = this.device.createBindGroup({\n layout: this.renderPipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: { buffer: uniformBuffer } },\n { binding: 1, resource: this.sampler },\n { binding: 2, resource: texture.createView() },\n ],\n });\n this.bindGroups.set(layer.id, bindGroup);\n }\n\n return bindGroup;\n }\n\n private updateUniforms(layer: Layer): void {\n if (!this.device) return;\n\n const uniformBuffer = this.uniformBuffers.get(layer.id);\n if (!uniformBuffer) return;\n\n const { x, y, width, height, opacity, rotation, crop } = layer.transform;\n const scalingMode = layer.scalingMode || 'letterbox';\n\n // Get source texture dimensions for aspect ratio\n const texture = this.textures.get(layer.sourceId);\n if (!texture) return;\n\n // Manual crop from layer transform (user-specified crop)\n const manualCropLeft = crop?.left || 0;\n const manualCropTop = crop?.top || 0;\n const manualCropRight = crop?.right || 0;\n const manualCropBottom = crop?.bottom || 0;\n\n // Calculate source dimensions after manual crop\n const srcWidth = texture.width * (1 - manualCropLeft - manualCropRight);\n const srcHeight = texture.height * (1 - manualCropTop - manualCropBottom);\n const srcAspect = srcWidth / srcHeight;\n\n // Destination dimensions in canvas units\n const destWidth = width * this.config.width;\n const destHeight = height * this.config.height;\n const destAspect = destWidth / destHeight;\n\n // Calculate final dimensions and UV crop based on scaling mode\n let finalX = x;\n let finalY = y;\n let finalWidth = width;\n let finalHeight = height;\n\n // UV crop values for shader (additional crop from scaling mode)\n // These values are added on top of any manual crop\n let uvCropLeft = manualCropLeft;\n let uvCropTop = manualCropTop;\n let uvCropRight = manualCropRight;\n let uvCropBottom = manualCropBottom;\n\n switch (scalingMode) {\n case 'stretch':\n // No changes - stretch to fill, use only manual crop\n break;\n\n case 'letterbox': {\n // Fit source within destination, preserving aspect ratio\n // No additional UV crop needed - we just resize the quad\n let newWidth: number, newHeight: number;\n\n if (srcAspect > destAspect) {\n // Source is wider - fit to width\n newWidth = width;\n newHeight = (width * this.config.width) / srcAspect / this.config.height;\n } else {\n // Source is taller - fit to height\n newHeight = height;\n newWidth = (height * this.config.height * srcAspect) / this.config.width;\n }\n\n // Center within original bounds\n finalX = x + (width - newWidth) / 2;\n finalY = y + (height - newHeight) / 2;\n finalWidth = newWidth;\n finalHeight = newHeight;\n break;\n }\n\n case 'crop': {\n // Fill destination completely, crop source overflow via UV coordinates\n // Match WebGL's calculation exactly: work in pixel space, divide by full texture size\n\n if (srcAspect > destAspect) {\n // Source is wider than destination - crop left and right\n // Calculate target width that would match destination aspect ratio\n const targetSrcWidth = srcHeight * destAspect;\n // Calculate crop amount as fraction of FULL texture width\n const cropAmount = (srcWidth - targetSrcWidth) / 2 / texture.width;\n uvCropLeft = manualCropLeft + cropAmount;\n uvCropRight = manualCropRight + cropAmount;\n } else if (srcAspect < destAspect) {\n // Source is taller than destination - crop top and bottom\n // Calculate target height that would match destination aspect ratio\n const targetSrcHeight = srcWidth / destAspect;\n // Calculate crop amount as fraction of FULL texture height\n const cropAmount = (srcHeight - targetSrcHeight) / 2 / texture.height;\n uvCropTop = manualCropTop + cropAmount;\n uvCropBottom = manualCropBottom + cropAmount;\n }\n // If aspects match exactly, no additional crop needed\n break;\n }\n }\n\n // Calculate transform matrix\n // Convert from 0-1 coordinates to -1 to 1 clip space\n const scaleX = finalWidth;\n const scaleY = finalHeight;\n const translateX = finalX * 2 - 1 + finalWidth;\n const translateY = -(finalY * 2 - 1 + finalHeight); // Flip Y\n\n // Create transformation matrix (column-major for WebGPU)\n const cos = Math.cos((rotation * Math.PI) / 180);\n const sin = Math.sin((rotation * Math.PI) / 180);\n\n // prettier-ignore\n const transform = new Float32Array([\n scaleX * cos, scaleX * sin, 0, 0,\n -scaleY * sin, scaleY * cos, 0, 0,\n 0, 0, 1, 0,\n translateX, translateY, 0, 1,\n ]);\n\n // Write uniforms (96 bytes to match WGSL struct alignment)\n // WGSL alignment: vec4f requires 16-byte alignment\n // Layout:\n // mat4x4f transform: offset 0, size 64 (floats 0-15)\n // f32 opacity: offset 64, size 4 (float 16)\n // f32 _padding1: offset 68, size 4 (float 17)\n // [implicit padding]: offset 72-79 (floats 18-19) - align vec4f to 16 bytes\n // vec4f crop: offset 80, size 16 (floats 20-23)\n // Total: 96 bytes\n const uniforms = new ArrayBuffer(96);\n const floatView = new Float32Array(uniforms);\n floatView.set(transform, 0); // mat4x4 at offset 0 (floats 0-15, bytes 0-63)\n floatView[16] = opacity; // f32 at offset 64 (float 16, bytes 64-67)\n floatView[17] = 0; // _padding1 at offset 68 (float 17, bytes 68-71)\n // floats 18-19 are implicit padding for vec4f alignment (bytes 72-79)\n floatView[18] = 0;\n floatView[19] = 0;\n // vec4f crop at offset 80 (floats 20-23, bytes 80-95)\n floatView[20] = uvCropLeft;\n floatView[21] = uvCropTop;\n floatView[22] = uvCropRight;\n floatView[23] = uvCropBottom;\n\n this.device.queue.writeBuffer(uniformBuffer, 0, uniforms);\n }\n\n private parseColor(hex: string): GPUColor {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n if (result) {\n return {\n r: parseInt(result[1], 16) / 255,\n g: parseInt(result[2], 16) / 255,\n b: parseInt(result[3], 16) / 255,\n a: 1,\n };\n }\n return { r: 0, g: 0, b: 0, a: 1 };\n }\n\n renderTransition(\n from: ImageBitmap,\n to: ImageBitmap,\n progress: number,\n type: TransitionType\n ): void {\n if (!this.device || !this.context) return;\n\n // For now, use a simple approach: render both images and blend\n // A more sophisticated approach would use the transition shader\n const textureView = this.context.getCurrentTexture().createView();\n const commandEncoder = this.device.createCommandEncoder();\n\n const renderPass = commandEncoder.beginRenderPass({\n colorAttachments: [\n {\n view: textureView,\n clearValue: { r: 0, g: 0, b: 0, a: 1 },\n loadOp: 'clear',\n storeOp: 'store',\n },\n ],\n });\n\n // For simplicity, we'll implement transitions similarly to Canvas2D\n // Full shader-based transitions would require the transition pipeline\n renderPass.end();\n\n // Create temporary textures and render\n this.renderTransitionSimple(from, to, progress, type, commandEncoder);\n\n this.device.queue.submit([commandEncoder.finish()]);\n }\n\n private renderTransitionSimple(\n from: ImageBitmap,\n to: ImageBitmap,\n progress: number,\n type: TransitionType,\n _commandEncoder: GPUCommandEncoder\n ): void {\n // Simple fallback: just copy the appropriate image\n // Full implementation would use shader-based blending\n const p = Math.max(0, Math.min(1, progress));\n\n if (!this.device || !this.context) return;\n\n const texture = this.device.createTexture({\n size: { width: this.config.width, height: this.config.height },\n format: 'rgba8unorm',\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST,\n });\n\n // For cut/instant, just show target\n if (type === 'cut' || p >= 1) {\n this.device.queue.copyExternalImageToTexture(\n { source: to },\n { texture },\n { width: to.width, height: to.height }\n );\n } else if (p <= 0) {\n this.device.queue.copyExternalImageToTexture(\n { source: from },\n { texture },\n { width: from.width, height: from.height }\n );\n } else {\n // For fade, we'd need proper blending - show target for simplicity\n this.device.queue.copyExternalImageToTexture(\n { source: p > 0.5 ? to : from },\n { texture },\n { width: to.width, height: to.height }\n );\n }\n\n texture.destroy();\n }\n\n applyFilter(_layerId: string, _filter: FilterConfig): void {\n // WebGPU filters would require compute shaders\n // This is a future enhancement\n console.warn(\n '[WebGPURenderer] Filter effects not yet implemented. Use WebGL renderer for filters.'\n );\n }\n\n captureFrame(): VideoFrame {\n return new VideoFrame(this.canvas, {\n timestamp: performance.now() * 1000,\n });\n }\n\n private updateStats(): void {\n this.frameCount++;\n const now = performance.now();\n const elapsed = now - this.lastFrameTime;\n\n if (elapsed >= 1000) {\n this.fps = (this.frameCount * 1000) / elapsed;\n this.frameCount = 0;\n this.lastFrameTime = now;\n }\n }\n\n getStats(): RendererStats {\n return {\n fps: Math.round(this.fps),\n frameTimeMs: this.lastRenderTime,\n };\n }\n\n destroy(): void {\n // Destroy textures\n for (const texture of this.textures.values()) {\n texture.destroy();\n }\n this.textures.clear();\n\n // Destroy buffers\n for (const buffer of this.uniformBuffers.values()) {\n buffer.destroy();\n }\n this.uniformBuffers.clear();\n\n this.vertexBuffer?.destroy();\n this.indexBuffer?.destroy();\n\n // Clear bind groups (they reference destroyed resources)\n this.bindGroups.clear();\n\n // Device will be garbage collected\n this.device = null;\n this.context = null;\n this.renderPipeline = null;\n this.sampler = null;\n }\n}\n\n// Register this renderer with the factory\nregisterRenderer('webgpu', WebGPURenderer);\n","/**\n * Transition Engine\n *\n * Manages smooth transitions between scenes with configurable easing.\n *\n * Supported transition types:\n * - cut: Instant switch (no animation)\n * - fade: Cross-dissolve between scenes\n * - slide-left/right/up/down: Sliding panel transition\n *\n * Easing functions:\n * - linear: Constant speed\n * - ease-in: Start slow, end fast\n * - ease-out: Start fast, end slow\n * - ease-in-out: Start slow, accelerate, end slow\n */\n\nimport type {\n TransitionConfig,\n TransitionState,\n TransitionType,\n EasingType,\n} from '../types';\n\n// ============================================================================\n// Easing Functions\n// ============================================================================\n\ntype EasingFunction = (t: number) => number;\n\n/**\n * Standard easing functions based on Robert Penner's easing equations\n */\nconst EASING_FUNCTIONS: Record<EasingType, EasingFunction> = {\n linear: (t) => t,\n\n 'ease-in': (t) => t * t,\n\n 'ease-out': (t) => t * (2 - t),\n\n 'ease-in-out': (t) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t),\n};\n\n// ============================================================================\n// TransitionEngine Class\n// ============================================================================\n\n/**\n * Engine for managing scene transitions with timing and easing\n */\nexport class TransitionEngine {\n private state: TransitionState | null = null;\n private easing: EasingFunction = EASING_FUNCTIONS.linear;\n\n /**\n * Start a new transition between scenes\n *\n * @param fromSceneId - ID of the scene being transitioned from\n * @param toSceneId - ID of the scene being transitioned to\n * @param config - Transition configuration (type, duration, easing)\n */\n start(fromSceneId: string, toSceneId: string, config: TransitionConfig): void {\n this.state = {\n active: true,\n type: config.type,\n progress: 0,\n fromSceneId,\n toSceneId,\n startTime: performance.now(),\n durationMs: config.durationMs,\n };\n\n this.easing = EASING_FUNCTIONS[config.easing] || EASING_FUNCTIONS.linear;\n\n // For 'cut' transitions, immediately complete\n if (config.type === 'cut') {\n this.state.progress = 1;\n this.state.active = false;\n }\n }\n\n /**\n * Update transition progress based on elapsed time\n * Call this every frame during a transition\n *\n * @returns Current transition state, or null if no transition is active\n */\n update(): TransitionState | null {\n if (!this.state?.active) {\n return null;\n }\n\n const elapsed = performance.now() - this.state.startTime;\n const rawProgress = Math.min(1, elapsed / this.state.durationMs);\n\n // Apply easing to get smooth progress\n this.state.progress = this.easing(rawProgress);\n\n // Check if transition is complete\n if (rawProgress >= 1) {\n this.state.active = false;\n this.state.progress = 1; // Ensure we end at exactly 1\n }\n\n return this.state;\n }\n\n /**\n * Check if a transition is currently active\n */\n isActive(): boolean {\n return this.state?.active ?? false;\n }\n\n /**\n * Get the current transition progress (0-1, with easing applied)\n */\n getProgress(): number {\n return this.state?.progress ?? 0;\n }\n\n /**\n * Get the raw linear progress (0-1, without easing)\n */\n getRawProgress(): number {\n if (!this.state?.active) {\n return this.state?.progress ?? 0;\n }\n\n const elapsed = performance.now() - this.state.startTime;\n return Math.min(1, elapsed / this.state.durationMs);\n }\n\n /**\n * Get the current transition type\n */\n getType(): TransitionType {\n return this.state?.type ?? 'cut';\n }\n\n /**\n * Get the source scene ID (scene being transitioned from)\n */\n getFromSceneId(): string | null {\n return this.state?.fromSceneId ?? null;\n }\n\n /**\n * Get the target scene ID (scene being transitioned to)\n */\n getToSceneId(): string | null {\n return this.state?.toSceneId ?? null;\n }\n\n /**\n * Get remaining time in milliseconds\n */\n getRemainingTime(): number {\n if (!this.state?.active) {\n return 0;\n }\n\n const elapsed = performance.now() - this.state.startTime;\n return Math.max(0, this.state.durationMs - elapsed);\n }\n\n /**\n * Get the full transition state (for serialization/debugging)\n */\n getState(): TransitionState | null {\n return this.state ? { ...this.state } : null;\n }\n\n /**\n * Cancel the current transition\n * The transition will stop at its current progress\n */\n cancel(): void {\n if (this.state) {\n this.state.active = false;\n }\n }\n\n /**\n * Force-complete the current transition\n * Jumps to the end state immediately\n */\n complete(): void {\n if (this.state) {\n this.state.active = false;\n this.state.progress = 1;\n }\n }\n\n /**\n * Reset the engine, clearing any transition state\n */\n reset(): void {\n this.state = null;\n this.easing = EASING_FUNCTIONS.linear;\n }\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\n/**\n * Create a default transition configuration\n */\nexport function createDefaultTransitionConfig(): TransitionConfig {\n return {\n type: 'fade',\n durationMs: 500,\n easing: 'ease-in-out',\n };\n}\n\n/**\n * Create a cut (instant) transition configuration\n */\nexport function createCutTransition(): TransitionConfig {\n return {\n type: 'cut',\n durationMs: 0,\n easing: 'linear',\n };\n}\n\n/**\n * Create a fade transition configuration\n */\nexport function createFadeTransition(\n durationMs: number = 500,\n easing: EasingType = 'ease-in-out'\n): TransitionConfig {\n return {\n type: 'fade',\n durationMs,\n easing,\n };\n}\n\n/**\n * Create a slide transition configuration\n */\nexport function createSlideTransition(\n direction: 'left' | 'right' | 'up' | 'down' = 'left',\n durationMs: number = 500,\n easing: EasingType = 'ease-in-out'\n): TransitionConfig {\n return {\n type: `slide-${direction}` as TransitionType,\n durationMs,\n easing,\n };\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Get all available transition types\n */\nexport function getAvailableTransitionTypes(): TransitionType[] {\n return ['cut', 'fade', 'slide-left', 'slide-right', 'slide-up', 'slide-down'];\n}\n\n/**\n * Get all available easing types\n */\nexport function getAvailableEasingTypes(): EasingType[] {\n return ['linear', 'ease-in', 'ease-out', 'ease-in-out'];\n}\n\n/**\n * Validate a transition configuration\n */\nexport function validateTransitionConfig(config: Partial<TransitionConfig>): TransitionConfig {\n return {\n type: config.type || 'fade',\n durationMs: Math.max(0, config.durationMs ?? 500),\n easing: config.easing || 'ease-in-out',\n };\n}\n","/**\n * Compositor Worker\n *\n * Web Worker that handles real-time video composition.\n * Runs off the main thread to ensure smooth compositing even when\n * the main thread is busy or the tab is in the background.\n *\n * Features:\n * - Multi-layer rendering with z-order\n * - Scene-based composition\n * - Smooth transitions between scenes\n * - Frame rate control (30/60 FPS)\n * - Stats reporting\n *\n * Data Flow:\n * Main Thread → (VideoFrames via postMessage) → Compositor Worker\n * → (Render to OffscreenCanvas) → MediaStreamTrackGenerator → WebRTC\n */\n\nimport type {\n Scene,\n Layer,\n LayerTransform,\n CompositorConfig,\n CompositorMainToWorker,\n CompositorWorkerToMain,\n RendererStats,\n TransitionConfig,\n LayoutConfig,\n LayoutTransitionConfig,\n FilterConfig,\n RendererType,\n EasingType,\n} from '../types';\n\n// Import renderers (importing registers them with the factory)\nimport { Canvas2DRenderer } from '../core/renderers/Canvas2DRenderer';\nimport { WebGLRenderer } from '../core/renderers/WebGLRenderer';\nimport { WebGPURenderer } from '../core/renderers/WebGPURenderer';\nimport { createRenderer, type CompositorRenderer } from '../core/renderers';\nimport { TransitionEngine } from '../core/TransitionEngine';\n\n// Reference renderers to ensure they're bundled and registered\nvoid Canvas2DRenderer;\nvoid WebGLRenderer;\nvoid WebGPURenderer;\n\n// ============================================================================\n// Worker State\n// ============================================================================\n\nlet canvas: OffscreenCanvas | null = null;\nlet renderer: CompositorRenderer | null = null;\nlet config: CompositorConfig | null = null;\nlet transitionEngine: TransitionEngine = new TransitionEngine();\n\n// Current scene state\nlet currentScene: Scene | null = null;\nlet nextScene: Scene | null = null;\n\n// Frame storage (latest frame from each source)\nconst frames: Map<string, VideoFrame | ImageBitmap> = new Map();\n\n// Transition snapshots\nlet fromSceneSnapshot: ImageBitmap | null = null;\nlet toSceneSnapshot: ImageBitmap | null = null;\n\n// Layout animation state\ninterface LayoutAnimationState {\n active: boolean;\n startTime: number;\n durationMs: number;\n easing: EasingType;\n fromTransforms: Map<string, LayerTransform>;\n toTransforms: Map<string, LayerTransform>;\n targetScene: Scene;\n}\nlet layoutAnimation: LayoutAnimationState | null = null;\n\n// Composition loop state\nlet compositionLoopId: number | null = null;\nlet isRunning = false;\n\n// Stats tracking\nlet lastStatsTime = 0;\nconst STATS_INTERVAL = 1000; // Report stats every second\n\n// ============================================================================\n// Message Handlers\n// ============================================================================\n\nself.onmessage = async (e: MessageEvent<CompositorMainToWorker>) => {\n const message = e.data;\n\n try {\n switch (message.type) {\n case 'init':\n await handleInit(message.config, message.canvas);\n break;\n\n case 'updateScene':\n handleUpdateScene(message.scene);\n break;\n\n case 'sourceFrame':\n handleSourceFrame(message.sourceId, message.frame);\n break;\n\n case 'sourceImage':\n handleSourceImage(message.sourceId, message.bitmap);\n break;\n\n case 'startTransition':\n handleStartTransition(message.transition, message.toSceneId);\n break;\n\n case 'updateLayout':\n handleUpdateLayout(message.layout);\n break;\n\n case 'animateLayout':\n handleAnimateLayout(message.targetScene, message.transition);\n break;\n\n case 'setRenderer':\n handleSetRenderer(message.renderer);\n break;\n\n case 'applyFilter':\n handleApplyFilter(message.layerId, message.filter);\n break;\n\n case 'destroy':\n handleDestroy();\n break;\n\n default:\n console.warn('[CompositorWorker] Unknown message type:', (message as unknown as { type: string }).type);\n }\n } catch (error) {\n sendMessage({\n type: 'error',\n message: error instanceof Error ? error.message : String(error),\n });\n }\n};\n\n// ============================================================================\n// Initialization\n// ============================================================================\n\nasync function handleInit(cfg: CompositorConfig, offscreenCanvas: OffscreenCanvas): Promise<void> {\n config = cfg;\n canvas = offscreenCanvas;\n\n // Create the renderer using the factory with fallback chain\n // Try the requested renderer, then fall back through the chain\n const fallbackChain: RendererType[] =\n config.renderer === 'auto'\n ? ['webgpu', 'webgl', 'canvas2d']\n : [config.renderer, 'webgl', 'canvas2d'];\n\n let lastError: Error | null = null;\n\n for (const rendererType of fallbackChain) {\n try {\n console.log(`[CompositorWorker] Trying ${rendererType} renderer...`);\n renderer = createRenderer(rendererType);\n await renderer.init(canvas, config);\n console.log(`[CompositorWorker] ${rendererType} renderer initialized successfully`);\n break;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n console.warn(`[CompositorWorker] ${rendererType} renderer failed:`, lastError.message);\n renderer = null;\n\n // If this wasn't canvas2d, try the next one in the chain\n if (rendererType !== 'canvas2d') {\n continue;\n }\n }\n }\n\n if (!renderer) {\n throw new Error(`All renderers failed. Last error: ${lastError?.message ?? 'unknown'}`);\n }\n\n // Create default empty scene\n currentScene = {\n id: 'default',\n name: 'Default Scene',\n layers: [],\n backgroundColor: '#000000',\n };\n\n // Start the composition loop\n isRunning = true;\n startCompositionLoop();\n\n sendMessage({ type: 'ready' });\n sendMessage({ type: 'rendererChanged', renderer: renderer.type });\n}\n\n// ============================================================================\n// Scene Management\n// ============================================================================\n\nfunction handleUpdateScene(scene: Scene): void {\n // If no transition is active, update the current scene directly\n if (!transitionEngine.isActive()) {\n currentScene = scene;\n } else {\n // During transition, update the \"next\" scene\n nextScene = scene;\n }\n}\n\nfunction handleStartTransition(transition: TransitionConfig, toSceneId: string): void {\n if (!currentScene || !renderer) return;\n\n // Capture current scene as \"from\" snapshot\n captureSceneSnapshot('from');\n\n // The \"to\" scene should have been set via updateScene\n if (nextScene && nextScene.id === toSceneId) {\n // Render the next scene and capture it\n const tempScene = currentScene;\n currentScene = nextScene;\n renderCurrentScene();\n captureSceneSnapshot('to');\n currentScene = tempScene;\n\n // Start the transition\n transitionEngine.start(currentScene.id, toSceneId, transition);\n } else {\n console.warn('[CompositorWorker] Next scene not found for transition:', toSceneId);\n }\n}\n\nfunction captureSceneSnapshot(target: 'from' | 'to'): void {\n if (!canvas) return;\n\n // Use createImageBitmap to capture the current canvas state\n createImageBitmap(canvas).then((bitmap) => {\n if (target === 'from') {\n if (fromSceneSnapshot) fromSceneSnapshot.close();\n fromSceneSnapshot = bitmap;\n } else {\n if (toSceneSnapshot) toSceneSnapshot.close();\n toSceneSnapshot = bitmap;\n }\n });\n}\n\nfunction handleUpdateLayout(layout: LayoutConfig): void {\n // Layout is now handled entirely by SceneManager on the main thread.\n // SceneManager applies the layout, updates scene.layers, and sends updateScene.\n // This handler is kept for potential future use (e.g., storing layout metadata)\n // but should NOT recalculate layers here as that would overwrite the correct\n // layer data from SceneManager.\n console.log('[CompositorWorker] Layout updated:', layout.mode);\n}\n\n// ============================================================================\n// Layout Animation\n// ============================================================================\n\n/**\n * Apply easing function to progress value\n */\nfunction applyEasing(progress: number, easing: EasingType): number {\n const t = Math.max(0, Math.min(1, progress));\n\n switch (easing) {\n case 'linear':\n return t;\n case 'ease-in':\n return t * t;\n case 'ease-out':\n return 1 - (1 - t) * (1 - t);\n case 'ease-in-out':\n return t < 0.5\n ? 2 * t * t\n : 1 - Math.pow(-2 * t + 2, 2) / 2;\n default:\n return t;\n }\n}\n\n/**\n * Interpolate between two transforms\n */\nfunction interpolateTransform(\n from: LayerTransform,\n to: LayerTransform,\n progress: number\n): LayerTransform {\n const lerp = (a: number, b: number) => a + (b - a) * progress;\n\n return {\n x: lerp(from.x, to.x),\n y: lerp(from.y, to.y),\n width: lerp(from.width, to.width),\n height: lerp(from.height, to.height),\n opacity: lerp(from.opacity, to.opacity),\n rotation: lerp(from.rotation, to.rotation),\n borderRadius: lerp(from.borderRadius, to.borderRadius),\n crop: {\n top: lerp(from.crop.top, to.crop.top),\n right: lerp(from.crop.right, to.crop.right),\n bottom: lerp(from.crop.bottom, to.crop.bottom),\n left: lerp(from.crop.left, to.crop.left),\n },\n };\n}\n\nfunction handleAnimateLayout(targetScene: Scene, transition: LayoutTransitionConfig): void {\n if (!currentScene) {\n // No current scene, just set the target directly\n currentScene = targetScene;\n return;\n }\n\n // Build maps of old and new transforms by sourceId\n const fromTransforms = new Map<string, LayerTransform>();\n const toTransforms = new Map<string, LayerTransform>();\n\n // Get transforms from current scene\n for (const layer of currentScene.layers) {\n fromTransforms.set(layer.sourceId, { ...layer.transform });\n }\n\n // Get transforms from target scene\n for (const layer of targetScene.layers) {\n toTransforms.set(layer.sourceId, { ...layer.transform });\n\n // If layer didn't exist before, use target as starting point\n if (!fromTransforms.has(layer.sourceId)) {\n fromTransforms.set(layer.sourceId, { ...layer.transform });\n }\n }\n\n // Start the animation\n layoutAnimation = {\n active: true,\n startTime: performance.now(),\n durationMs: transition.durationMs,\n easing: transition.easing,\n fromTransforms,\n toTransforms,\n targetScene,\n };\n\n console.log('[CompositorWorker] Layout animation started', {\n durationMs: transition.durationMs,\n easing: transition.easing,\n layerCount: targetScene.layers.length,\n });\n}\n\n/**\n * Update layout animation and return interpolated scene\n * Returns null if no animation is active\n */\nfunction updateLayoutAnimation(): Scene | null {\n if (!layoutAnimation || !layoutAnimation.active || !currentScene) {\n return null;\n }\n\n const elapsed = performance.now() - layoutAnimation.startTime;\n const rawProgress = elapsed / layoutAnimation.durationMs;\n const progress = applyEasing(Math.min(rawProgress, 1), layoutAnimation.easing);\n\n // Create interpolated scene\n const interpolatedLayers: Layer[] = layoutAnimation.targetScene.layers.map((targetLayer) => {\n const fromTransform = layoutAnimation!.fromTransforms.get(targetLayer.sourceId);\n const toTransform = layoutAnimation!.toTransforms.get(targetLayer.sourceId);\n\n if (!fromTransform || !toTransform) {\n return targetLayer;\n }\n\n return {\n ...targetLayer,\n transform: interpolateTransform(fromTransform, toTransform, progress),\n };\n });\n\n const interpolatedScene: Scene = {\n ...layoutAnimation.targetScene,\n layers: interpolatedLayers,\n };\n\n // Check if animation is complete\n if (rawProgress >= 1) {\n // Animation complete - set final scene\n currentScene = layoutAnimation.targetScene;\n layoutAnimation = null;\n sendMessage({ type: 'layoutAnimationComplete' });\n return null; // Return null to indicate we should use currentScene now\n }\n\n return interpolatedScene;\n}\n\n// ============================================================================\n// Frame Handling\n// ============================================================================\n\nfunction handleSourceFrame(sourceId: string, frame: VideoFrame): void {\n // Close the old frame to prevent memory leaks\n const oldFrame = frames.get(sourceId);\n if (oldFrame && 'close' in oldFrame) {\n (oldFrame as VideoFrame).close();\n }\n\n frames.set(sourceId, frame);\n}\n\nfunction handleSourceImage(sourceId: string, bitmap: ImageBitmap): void {\n // Close the old bitmap if it exists\n const oldBitmap = frames.get(sourceId);\n if (oldBitmap && 'close' in oldBitmap) {\n oldBitmap.close();\n }\n\n frames.set(sourceId, bitmap);\n}\n\n// ============================================================================\n// Renderer Control\n// ============================================================================\n\nasync function handleSetRenderer(rendererType: RendererType): Promise<void> {\n if (!canvas || !config) {\n console.warn('[CompositorWorker] Cannot switch renderer - not initialized');\n return;\n }\n\n // If already using this renderer, do nothing\n if (renderer && renderer.type === rendererType) {\n return;\n }\n\n try {\n // Destroy old renderer\n if (renderer) {\n renderer.destroy();\n }\n\n // Create new renderer\n renderer = createRenderer(rendererType);\n await renderer.init(canvas, config);\n\n sendMessage({ type: 'rendererChanged', renderer: renderer.type });\n } catch (error) {\n // If requested renderer fails, fall back to Canvas2D\n console.warn(`[CompositorWorker] Failed to create ${rendererType} renderer, falling back to canvas2d`);\n renderer = createRenderer('canvas2d');\n await renderer.init(canvas, config);\n sendMessage({ type: 'rendererChanged', renderer: 'canvas2d' });\n }\n}\n\nfunction handleApplyFilter(layerId: string, filter: FilterConfig): void {\n if (!renderer) return;\n renderer.applyFilter(layerId, filter);\n}\n\n// ============================================================================\n// Composition Loop\n// ============================================================================\n\nfunction startCompositionLoop(): void {\n if (!config) return;\n\n const frameTime = 1000 / config.frameRate;\n let lastFrameTime = performance.now();\n\n function loop(): void {\n if (!isRunning) return;\n\n const now = performance.now();\n const elapsed = now - lastFrameTime;\n\n // Only render if enough time has passed for the target frame rate\n if (elapsed >= frameTime) {\n lastFrameTime = now - (elapsed % frameTime);\n\n if (transitionEngine.isActive()) {\n renderTransition();\n } else {\n renderCurrentScene();\n }\n\n // Send stats periodically\n if (now - lastStatsTime >= STATS_INTERVAL) {\n sendStats();\n lastStatsTime = now;\n }\n }\n\n // Use setTimeout for timing (more reliable in workers than requestAnimationFrame)\n compositionLoopId = self.setTimeout(loop, Math.max(1, frameTime - (performance.now() - lastFrameTime)));\n }\n\n loop();\n}\n\nfunction stopCompositionLoop(): void {\n if (compositionLoopId !== null) {\n clearTimeout(compositionLoopId);\n compositionLoopId = null;\n }\n}\n\nfunction renderCurrentScene(): void {\n if (!renderer || !currentScene) return;\n\n // Check for layout animation\n const interpolatedScene = updateLayoutAnimation();\n const sceneToRender = interpolatedScene || currentScene;\n\n renderer.renderScene(sceneToRender, frames);\n}\n\nfunction renderTransition(): void {\n if (!renderer || !fromSceneSnapshot || !toSceneSnapshot) return;\n\n // Update transition progress\n const state = transitionEngine.update();\n\n if (state) {\n renderer.renderTransition(\n fromSceneSnapshot,\n toSceneSnapshot,\n state.progress,\n state.type\n );\n\n // Check if transition completed\n if (!state.active) {\n completeTransition();\n }\n }\n}\n\nfunction completeTransition(): void {\n if (nextScene) {\n currentScene = nextScene;\n nextScene = null;\n }\n\n // Clean up snapshots\n if (fromSceneSnapshot) {\n fromSceneSnapshot.close();\n fromSceneSnapshot = null;\n }\n if (toSceneSnapshot) {\n toSceneSnapshot.close();\n toSceneSnapshot = null;\n }\n\n // Notify main thread\n sendMessage({\n type: 'transitionComplete',\n sceneId: currentScene?.id ?? '',\n });\n}\n\n// ============================================================================\n// Stats Reporting\n// ============================================================================\n\nfunction sendStats(): void {\n if (!renderer) return;\n\n const stats = renderer.getStats();\n sendMessage({ type: 'stats', stats });\n}\n\n// ============================================================================\n// Cleanup\n// ============================================================================\n\nfunction handleDestroy(): void {\n isRunning = false;\n stopCompositionLoop();\n\n // Close all frames\n for (const frame of frames.values()) {\n if ('close' in frame) {\n frame.close();\n }\n }\n frames.clear();\n\n // Clean up snapshots\n if (fromSceneSnapshot) {\n fromSceneSnapshot.close();\n fromSceneSnapshot = null;\n }\n if (toSceneSnapshot) {\n toSceneSnapshot.close();\n toSceneSnapshot = null;\n }\n\n // Destroy renderer\n if (renderer) {\n renderer.destroy();\n renderer = null;\n }\n\n canvas = null;\n config = null;\n currentScene = null;\n nextScene = null;\n}\n\n// ============================================================================\n// Communication Helpers\n// ============================================================================\n\nfunction sendMessage(message: CompositorWorkerToMain): void {\n self.postMessage(message);\n}\n"],"names":["Canvas2DRenderer","WebGLRenderer","WebGPURenderer","VERTEX_SHADER","FRAGMENT_SHADER"],"mappings":"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"}
1
+ {"version":3,"file":"compositor.worker.js","sources":["../../../src/core/renderers/index.ts","../../../src/core/renderers/Canvas2DRenderer.ts","../../../src/core/renderers/WebGLRenderer.ts","../../../src/core/renderers/WebGPURenderer.ts","../../../src/core/TransitionEngine.ts","../../../src/workers/compositor.worker.ts"],"sourcesContent":["/**\n * Compositor Renderer System\n *\n * Multi-renderer architecture with auto-fallback chain:\n * WebGPU (if supported) → WebGL/PixiJS → Canvas2D (always works)\n *\n * Usage:\n * ```typescript\n * const renderer = createRenderer('auto');\n * await renderer.init(canvas, config);\n * renderer.renderScene(scene, frames);\n * const frame = renderer.captureFrame();\n * ```\n */\n\nimport type {\n Scene,\n CompositorConfig,\n TransitionType,\n FilterConfig,\n RendererType,\n RendererStats,\n} from '../../types';\n\n// ============================================================================\n// Renderer Interface\n// ============================================================================\n\n/**\n * Common interface for all compositor renderers.\n * Implementations: Canvas2DRenderer, WebGLRenderer, WebGPURenderer\n */\nexport interface CompositorRenderer {\n /** Renderer type identifier */\n readonly type: RendererType;\n\n /** Whether this renderer is supported in the current environment */\n readonly isSupported: boolean;\n\n /**\n * Initialize the renderer with an OffscreenCanvas\n * @param canvas - OffscreenCanvas transferred to worker\n * @param config - Compositor configuration\n */\n init(canvas: OffscreenCanvas, config: CompositorConfig): Promise<void>;\n\n /**\n * Render a complete scene with all visible layers\n * @param scene - Scene to render\n * @param frames - Map of sourceId to VideoFrame or ImageBitmap\n */\n renderScene(scene: Scene, frames: Map<string, VideoFrame | ImageBitmap>): void;\n\n /**\n * Render a transition between two scene snapshots\n * @param from - ImageBitmap of the previous scene\n * @param to - ImageBitmap of the target scene\n * @param progress - Transition progress (0-1)\n * @param type - Type of transition effect\n */\n renderTransition(\n from: ImageBitmap,\n to: ImageBitmap,\n progress: number,\n type: TransitionType\n ): void;\n\n /**\n * Apply a filter effect to a specific layer\n * Note: Only WebGL and WebGPU renderers support filters\n * @param layerId - Target layer ID\n * @param filter - Filter configuration\n */\n applyFilter(layerId: string, filter: FilterConfig): void;\n\n /**\n * Capture the current canvas content as a VideoFrame\n * @returns VideoFrame of the rendered content\n */\n captureFrame(): VideoFrame;\n\n /**\n * Resize renderer after the canvas size changes.\n * @param config - Updated compositor config with new dimensions\n */\n resize(config: CompositorConfig): Promise<void> | void;\n\n /**\n * Get current renderer statistics\n * @returns Current FPS, frame time, and optional GPU memory usage\n */\n getStats(): RendererStats;\n\n /**\n * Clean up renderer resources\n */\n destroy(): void;\n}\n\n// ============================================================================\n// Renderer Factory\n// ============================================================================\n\n// Forward declarations - actual implementations in separate files\nlet Canvas2DRenderer: new () => CompositorRenderer;\nlet WebGLRenderer: new () => CompositorRenderer;\nlet WebGPURenderer: new () => CompositorRenderer;\n\n/**\n * Check if renderer implementations are registered\n */\nlet renderersRegistered = false;\n\n/**\n * Register renderer implementations\n * Called automatically when renderer files are imported\n */\nexport function registerRenderer(\n type: 'canvas2d' | 'webgl' | 'webgpu',\n RendererClass: new () => CompositorRenderer\n): void {\n switch (type) {\n case 'canvas2d':\n Canvas2DRenderer = RendererClass;\n break;\n case 'webgl':\n WebGLRenderer = RendererClass;\n break;\n case 'webgpu':\n WebGPURenderer = RendererClass;\n break;\n }\n renderersRegistered = true;\n}\n\n/**\n * Create a renderer instance based on preference and browser support\n *\n * @param preferred - Preferred renderer type or 'auto' for best available\n * @returns Appropriate renderer instance based on support and preference\n *\n * Auto-fallback chain: WebGPU → WebGL → Canvas2D\n */\nexport function createRenderer(preferred: RendererType = 'auto'): CompositorRenderer {\n if (!renderersRegistered) {\n // If no renderers registered yet, try to import them dynamically\n throw new Error(\n 'No renderers registered. Import Canvas2DRenderer before calling createRenderer.'\n );\n }\n\n const fallbackChain: RendererType[] =\n preferred === 'auto'\n ? ['webgpu', 'webgl', 'canvas2d']\n : [preferred, 'webgl', 'canvas2d'];\n\n for (const type of fallbackChain) {\n const renderer = instantiateRenderer(type);\n if (renderer && renderer.isSupported) {\n return renderer;\n }\n }\n\n // Canvas2D should always work, but if it somehow doesn't...\n throw new Error('No supported renderer available');\n}\n\n/**\n * Instantiate a specific renderer type\n */\nfunction instantiateRenderer(type: RendererType): CompositorRenderer | null {\n switch (type) {\n case 'webgpu':\n return WebGPURenderer ? new WebGPURenderer() : null;\n case 'webgl':\n return WebGLRenderer ? new WebGLRenderer() : null;\n case 'canvas2d':\n return Canvas2DRenderer ? new Canvas2DRenderer() : null;\n default:\n return null;\n }\n}\n\n/**\n * Check which renderers are supported in the current environment\n */\nexport function getSupportedRenderers(): RendererType[] {\n const supported: RendererType[] = [];\n\n // Canvas2D is always supported\n supported.push('canvas2d');\n\n // Check WebGL2 support\n if (typeof WebGL2RenderingContext !== 'undefined') {\n supported.push('webgl');\n }\n\n // Check WebGPU support (not available in workers before Chrome 115)\n if (typeof navigator !== 'undefined' && 'gpu' in navigator) {\n supported.push('webgpu');\n }\n\n return supported;\n}\n\n/**\n * Get the recommended renderer for the current environment\n */\nexport function getRecommendedRenderer(): RendererType {\n const supported = getSupportedRenderers();\n\n // Prefer WebGL for now (WebGPU not ready for production)\n if (supported.includes('webgl')) {\n return 'webgl';\n }\n\n return 'canvas2d';\n}\n\n// ============================================================================\n// Re-exports\n// ============================================================================\n\nexport type { CompositorConfig, RendererStats, RendererType } from '../../types';\n","/**\n * Canvas2D Renderer\n *\n * Universal fallback renderer using the Canvas 2D API.\n * Works in all browsers that support OffscreenCanvas.\n *\n * Features:\n * - Layer compositing with z-order\n * - Transform: position, size, rotation, opacity\n * - Border radius (rounded corners)\n * - Cropping\n * - Transitions: fade, slide (left/right/up/down), cut\n *\n * Limitations:\n * - No real-time filters (blur, color correction)\n * - No GPU-accelerated effects\n *\n * Performance:\n * - GPU-accelerated via compositor (drawImage is fast)\n * - `desynchronized: true` reduces input latency\n */\n\nimport type {\n Scene,\n Layer,\n CompositorConfig,\n TransitionType,\n FilterConfig,\n RendererType,\n RendererStats,\n} from '../../types';\nimport { registerRenderer, type CompositorRenderer } from './index';\n\nexport class Canvas2DRenderer implements CompositorRenderer {\n readonly type: RendererType = 'canvas2d';\n readonly isSupported = true; // Always available\n\n private canvas!: OffscreenCanvas;\n private ctx!: OffscreenCanvasRenderingContext2D;\n private config!: CompositorConfig;\n\n // Stats tracking\n private frameCount = 0;\n private lastFrameTime = 0;\n private fps = 0;\n private lastRenderTime = 0;\n\n async init(canvas: OffscreenCanvas, config: CompositorConfig): Promise<void> {\n this.canvas = canvas;\n this.config = config;\n\n const ctx = canvas.getContext('2d', {\n desynchronized: true, // Lower latency (no vsync wait)\n alpha: false, // Opaque canvas (faster)\n willReadFrequently: false, // Optimize for write-only\n });\n\n if (!ctx) {\n throw new Error('Failed to get 2D context from OffscreenCanvas');\n }\n\n this.ctx = ctx;\n this.lastFrameTime = performance.now();\n\n // Set up image smoothing for quality\n this.ctx.imageSmoothingEnabled = true;\n this.ctx.imageSmoothingQuality = 'high';\n }\n\n renderScene(scene: Scene, frames: Map<string, VideoFrame | ImageBitmap>): void {\n const startTime = performance.now();\n\n // Clear with background color\n this.ctx.fillStyle = scene.backgroundColor || '#000000';\n this.ctx.fillRect(0, 0, this.config.width, this.config.height);\n\n // Sort layers by z-index and render\n const visibleLayers = scene.layers\n .filter((layer) => layer.visible)\n .sort((a, b) => a.zIndex - b.zIndex);\n\n for (const layer of visibleLayers) {\n const frame = frames.get(layer.sourceId);\n if (frame) {\n this.renderLayer(layer, frame);\n }\n }\n\n // Track stats\n this.lastRenderTime = performance.now() - startTime;\n this.updateStats();\n }\n\n resize(config: CompositorConfig): void {\n this.config = config;\n\n const ctx = this.canvas.getContext('2d', {\n desynchronized: true,\n alpha: false,\n willReadFrequently: false,\n });\n\n if (!ctx) {\n throw new Error('Failed to get 2D context from OffscreenCanvas');\n }\n\n this.ctx = ctx;\n this.ctx.imageSmoothingEnabled = true;\n this.ctx.imageSmoothingQuality = 'high';\n }\n\n private renderLayer(layer: Layer, frame: VideoFrame | ImageBitmap): void {\n const { x, y, width, height, opacity, rotation, borderRadius, crop } = layer.transform;\n const scalingMode = layer.scalingMode || 'letterbox';\n\n // Convert relative coordinates to pixels\n const px = x * this.config.width;\n const py = y * this.config.height;\n const pw = width * this.config.width;\n const ph = height * this.config.height;\n\n // Save context state\n this.ctx.save();\n\n // Apply opacity\n this.ctx.globalAlpha = Math.max(0, Math.min(1, opacity));\n\n // Apply rotation around center\n if (rotation !== 0) {\n const centerX = px + pw / 2;\n const centerY = py + ph / 2;\n this.ctx.translate(centerX, centerY);\n this.ctx.rotate((rotation * Math.PI) / 180);\n this.ctx.translate(-centerX, -centerY);\n }\n\n // Apply border radius clipping\n if (borderRadius > 0) {\n this.roundedRect(px, py, pw, ph, borderRadius);\n this.ctx.clip();\n }\n\n // Calculate source crop rectangle (user-defined crop)\n const frameWidth = this.getFrameWidth(frame);\n const frameHeight = this.getFrameHeight(frame);\n\n const sx = crop.left * frameWidth;\n const sy = crop.top * frameHeight;\n const sw = frameWidth * (1 - crop.left - crop.right);\n const sh = frameHeight * (1 - crop.top - crop.bottom);\n\n // Calculate destination based on scaling mode\n const { dx, dy, dw, dh, sxFinal, syFinal, swFinal, shFinal } = this.calculateScaling(\n scalingMode,\n sx, sy, sw, sh,\n px, py, pw, ph\n );\n\n // Draw the frame\n this.ctx.drawImage(frame, sxFinal, syFinal, swFinal, shFinal, dx, dy, dw, dh);\n\n // Restore context state\n this.ctx.restore();\n }\n\n /**\n * Calculate source and destination rectangles based on scaling mode\n */\n private calculateScaling(\n mode: 'stretch' | 'letterbox' | 'crop',\n sx: number, sy: number, sw: number, sh: number,\n dx: number, dy: number, dw: number, dh: number\n ): {\n sxFinal: number; syFinal: number; swFinal: number; shFinal: number;\n dx: number; dy: number; dw: number; dh: number;\n } {\n const sourceAspect = sw / sh;\n const destAspect = dw / dh;\n\n switch (mode) {\n case 'stretch':\n // Stretch source to fill destination (may distort)\n return {\n sxFinal: sx, syFinal: sy, swFinal: sw, shFinal: sh,\n dx, dy, dw, dh\n };\n\n case 'letterbox': {\n // Fit source within destination, preserving aspect ratio\n // Add black bars if needed (handled by layer background)\n let newDw: number, newDh: number;\n\n if (sourceAspect > destAspect) {\n // Source is wider - fit to width, add top/bottom bars\n newDw = dw;\n newDh = dw / sourceAspect;\n } else {\n // Source is taller - fit to height, add left/right bars\n newDh = dh;\n newDw = dh * sourceAspect;\n }\n\n const newDx = dx + (dw - newDw) / 2;\n const newDy = dy + (dh - newDh) / 2;\n\n return {\n sxFinal: sx, syFinal: sy, swFinal: sw, shFinal: sh,\n dx: newDx, dy: newDy, dw: newDw, dh: newDh\n };\n }\n\n case 'crop': {\n // Fill destination, preserving aspect ratio, crop overflow\n let cropSx = sx, cropSy = sy, cropSw = sw, cropSh = sh;\n\n if (sourceAspect > destAspect) {\n // Source is wider - crop sides\n const targetSw = sh * destAspect;\n const cropAmount = (sw - targetSw) / 2;\n cropSx = sx + cropAmount;\n cropSw = targetSw;\n } else {\n // Source is taller - crop top/bottom\n const targetSh = sw / destAspect;\n const cropAmount = (sh - targetSh) / 2;\n cropSy = sy + cropAmount;\n cropSh = targetSh;\n }\n\n return {\n sxFinal: cropSx, syFinal: cropSy, swFinal: cropSw, shFinal: cropSh,\n dx, dy, dw, dh\n };\n }\n\n default:\n return {\n sxFinal: sx, syFinal: sy, swFinal: sw, shFinal: sh,\n dx, dy, dw, dh\n };\n }\n }\n\n private getFrameWidth(frame: VideoFrame | ImageBitmap): number {\n return 'displayWidth' in frame ? frame.displayWidth : frame.width;\n }\n\n private getFrameHeight(frame: VideoFrame | ImageBitmap): number {\n return 'displayHeight' in frame ? frame.displayHeight : frame.height;\n }\n\n /**\n * Draw a rounded rectangle path\n */\n private roundedRect(x: number, y: number, w: number, h: number, r: number): void {\n // Clamp radius to half of shortest side\n const radius = Math.min(r, w / 2, h / 2);\n\n this.ctx.beginPath();\n this.ctx.moveTo(x + radius, y);\n this.ctx.lineTo(x + w - radius, y);\n this.ctx.quadraticCurveTo(x + w, y, x + w, y + radius);\n this.ctx.lineTo(x + w, y + h - radius);\n this.ctx.quadraticCurveTo(x + w, y + h, x + w - radius, y + h);\n this.ctx.lineTo(x + radius, y + h);\n this.ctx.quadraticCurveTo(x, y + h, x, y + h - radius);\n this.ctx.lineTo(x, y + radius);\n this.ctx.quadraticCurveTo(x, y, x + radius, y);\n this.ctx.closePath();\n }\n\n renderTransition(\n from: ImageBitmap,\n to: ImageBitmap,\n progress: number,\n type: TransitionType\n ): void {\n // Clamp progress\n const p = Math.max(0, Math.min(1, progress));\n\n switch (type) {\n case 'fade':\n this.renderFadeTransition(from, to, p);\n break;\n\n case 'slide-left':\n this.renderSlideTransition(from, to, p, 'left');\n break;\n\n case 'slide-right':\n this.renderSlideTransition(from, to, p, 'right');\n break;\n\n case 'slide-up':\n this.renderSlideTransition(from, to, p, 'up');\n break;\n\n case 'slide-down':\n this.renderSlideTransition(from, to, p, 'down');\n break;\n\n case 'cut':\n default:\n // Instant cut - just show the target\n this.ctx.drawImage(to, 0, 0, this.config.width, this.config.height);\n break;\n }\n }\n\n private renderFadeTransition(from: ImageBitmap, to: ImageBitmap, progress: number): void {\n // Draw \"from\" scene at full opacity\n this.ctx.globalAlpha = 1;\n this.ctx.drawImage(from, 0, 0, this.config.width, this.config.height);\n\n // Overlay \"to\" scene with increasing opacity\n this.ctx.globalAlpha = progress;\n this.ctx.drawImage(to, 0, 0, this.config.width, this.config.height);\n\n // Reset alpha\n this.ctx.globalAlpha = 1;\n }\n\n private renderSlideTransition(\n from: ImageBitmap,\n to: ImageBitmap,\n progress: number,\n direction: 'left' | 'right' | 'up' | 'down'\n ): void {\n const w = this.config.width;\n const h = this.config.height;\n\n switch (direction) {\n case 'left': {\n // \"from\" slides out to the left, \"to\" slides in from the right\n const offset = progress * w;\n this.ctx.drawImage(from, -offset, 0, w, h);\n this.ctx.drawImage(to, w - offset, 0, w, h);\n break;\n }\n\n case 'right': {\n // \"from\" slides out to the right, \"to\" slides in from the left\n const offset = progress * w;\n this.ctx.drawImage(from, offset, 0, w, h);\n this.ctx.drawImage(to, -w + offset, 0, w, h);\n break;\n }\n\n case 'up': {\n // \"from\" slides out to the top, \"to\" slides in from the bottom\n const offset = progress * h;\n this.ctx.drawImage(from, 0, -offset, w, h);\n this.ctx.drawImage(to, 0, h - offset, w, h);\n break;\n }\n\n case 'down': {\n // \"from\" slides out to the bottom, \"to\" slides in from the top\n const offset = progress * h;\n this.ctx.drawImage(from, 0, offset, w, h);\n this.ctx.drawImage(to, 0, -h + offset, w, h);\n break;\n }\n }\n }\n\n applyFilter(_layerId: string, _filter: FilterConfig): void {\n // Canvas2D doesn't support real-time filters efficiently\n // Filters would require reading pixels back, processing, and redrawing\n // This is too slow for real-time video compositing\n console.warn(\n '[Canvas2DRenderer] Filters not supported. Use WebGL or WebGPU renderer for filter effects.'\n );\n }\n\n captureFrame(): VideoFrame {\n // Create a VideoFrame from the canvas content\n return new VideoFrame(this.canvas, {\n timestamp: performance.now() * 1000, // microseconds\n });\n }\n\n private updateStats(): void {\n this.frameCount++;\n const now = performance.now();\n const elapsed = now - this.lastFrameTime;\n\n // Update FPS every second\n if (elapsed >= 1000) {\n this.fps = (this.frameCount * 1000) / elapsed;\n this.frameCount = 0;\n this.lastFrameTime = now;\n }\n }\n\n getStats(): RendererStats {\n return {\n fps: Math.round(this.fps),\n frameTimeMs: this.lastRenderTime,\n // Canvas2D doesn't have GPU memory tracking\n };\n }\n\n destroy(): void {\n // Canvas2D context doesn't need explicit cleanup\n // Just clear any references\n this.canvas = null as unknown as OffscreenCanvas;\n this.ctx = null as unknown as OffscreenCanvasRenderingContext2D;\n }\n}\n\n// Register this renderer with the factory\nregisterRenderer('canvas2d', Canvas2DRenderer);\n","/**\n * WebGL2 Renderer\n *\n * High-performance renderer using raw WebGL2 for GPU-accelerated compositing.\n * Replaces PixiJS for better Web Worker and OffscreenCanvas support.\n *\n * Features:\n * - Layer compositing with z-order\n * - Transform: position, size, rotation, opacity\n * - Border radius via fragment shader SDF\n * - Cropping\n * - Transitions: fade, slide (left/right/up/down), cut\n * - Real-time filters: blur, color matrix, grayscale, sepia\n *\n * Requirements:\n * - WebGL2 support (universal in modern browsers)\n * - OffscreenCanvas support for worker context\n */\n\nimport type {\n Scene,\n Layer,\n CompositorConfig,\n TransitionType,\n FilterConfig,\n RendererType,\n RendererStats,\n} from '../../types';\nimport { registerRenderer, type CompositorRenderer } from './index';\n\n// ============================================================================\n// Shader Sources\n// ============================================================================\n\nconst VERTEX_SHADER = `#version 300 es\nprecision highp float;\n\n// Quad vertices (2 triangles = 6 vertices)\nconst vec2 VERTICES[6] = vec2[6](\n vec2(0.0, 0.0),\n vec2(1.0, 0.0),\n vec2(0.0, 1.0),\n vec2(1.0, 0.0),\n vec2(1.0, 1.0),\n vec2(0.0, 1.0)\n);\n\n// Uniforms for layer transform\nuniform vec2 u_resolution; // Canvas size in pixels\nuniform vec2 u_position; // Layer position (0-1 relative)\nuniform vec2 u_size; // Layer size (0-1 relative)\nuniform float u_rotation; // Rotation in radians\nuniform vec4 u_crop; // Crop (left, top, right, bottom)\n\nout vec2 v_texCoord;\nout vec2 v_localPos; // Position within layer (0-1)\nout vec2 v_layerSize; // Layer size in pixels\n\nvoid main() {\n vec2 vertex = VERTICES[gl_VertexID];\n\n // Apply texture coordinate cropping\n float cropLeft = u_crop.x;\n float cropTop = u_crop.y;\n float cropRight = u_crop.z;\n float cropBottom = u_crop.w;\n\n v_texCoord = vec2(\n cropLeft + vertex.x * (1.0 - cropLeft - cropRight),\n cropTop + vertex.y * (1.0 - cropTop - cropBottom)\n );\n\n // Store local position for border radius calculation\n v_localPos = vertex;\n v_layerSize = u_size * u_resolution;\n\n // Calculate layer position in pixels\n vec2 layerPos = u_position * u_resolution;\n vec2 layerSize = u_size * u_resolution;\n\n // Transform vertex position\n vec2 pos = layerPos + vertex * layerSize;\n\n // Apply rotation around layer center\n if (u_rotation != 0.0) {\n vec2 center = layerPos + layerSize * 0.5;\n pos -= center;\n float c = cos(u_rotation);\n float s = sin(u_rotation);\n pos = vec2(pos.x * c - pos.y * s, pos.x * s + pos.y * c);\n pos += center;\n }\n\n // Convert to clip space (-1 to 1)\n vec2 clipPos = (pos / u_resolution) * 2.0 - 1.0;\n\n // Flip Y for WebGL coordinate system\n clipPos.y = -clipPos.y;\n\n gl_Position = vec4(clipPos, 0.0, 1.0);\n}\n`;\n\nconst FRAGMENT_SHADER = `#version 300 es\nprecision highp float;\n\nuniform sampler2D u_texture;\nuniform float u_opacity;\nuniform float u_borderRadius; // Border radius in pixels\n\n// Filter uniforms\nuniform int u_filterType; // 0=none, 1=blur, 2=colorMatrix, 3=grayscale, 4=sepia\nuniform float u_filterStrength;\nuniform mat4 u_colorMatrix;\n\nin vec2 v_texCoord;\nin vec2 v_localPos;\nin vec2 v_layerSize;\n\nout vec4 fragColor;\n\n// Signed distance function for rounded rectangle\nfloat roundedRectSDF(vec2 pos, vec2 size, float radius) {\n vec2 q = abs(pos - 0.5) * size - size * 0.5 + radius;\n return min(max(q.x, q.y), 0.0) + length(max(q, 0.0)) - radius;\n}\n\nvoid main() {\n vec4 color = texture(u_texture, v_texCoord);\n\n // Apply filter effects\n if (u_filterType == 2) {\n // Color matrix\n color = u_colorMatrix * color;\n } else if (u_filterType == 3) {\n // Grayscale\n float gray = dot(color.rgb, vec3(0.299, 0.587, 0.114));\n color.rgb = mix(color.rgb, vec3(gray), u_filterStrength);\n } else if (u_filterType == 4) {\n // Sepia\n vec3 sepia = vec3(\n dot(color.rgb, vec3(0.393, 0.769, 0.189)),\n dot(color.rgb, vec3(0.349, 0.686, 0.168)),\n dot(color.rgb, vec3(0.272, 0.534, 0.131))\n );\n color.rgb = mix(color.rgb, sepia, u_filterStrength);\n }\n\n // Apply border radius clipping\n if (u_borderRadius > 0.0) {\n float dist = roundedRectSDF(v_localPos, v_layerSize, u_borderRadius);\n // Smooth anti-aliased edge\n float alpha = 1.0 - smoothstep(-1.0, 1.0, dist);\n color.a *= alpha;\n }\n\n // Apply opacity\n color.a *= u_opacity;\n\n fragColor = color;\n}\n`;\n\n// Simpler shader for transitions (full-screen quads)\nconst TRANSITION_VERTEX_SHADER = `#version 300 es\nprecision highp float;\n\nconst vec2 VERTICES[6] = vec2[6](\n vec2(-1.0, -1.0),\n vec2(1.0, -1.0),\n vec2(-1.0, 1.0),\n vec2(1.0, -1.0),\n vec2(1.0, 1.0),\n vec2(-1.0, 1.0)\n);\n\nuniform vec2 u_offset; // Slide offset\n\nout vec2 v_texCoord;\n\nvoid main() {\n vec2 vertex = VERTICES[gl_VertexID];\n v_texCoord = (vertex + 1.0) * 0.5;\n v_texCoord.y = 1.0 - v_texCoord.y; // Flip Y\n gl_Position = vec4(vertex + u_offset * 2.0, 0.0, 1.0);\n}\n`;\n\nconst TRANSITION_FRAGMENT_SHADER = `#version 300 es\nprecision highp float;\n\nuniform sampler2D u_texture;\nuniform float u_opacity;\n\nin vec2 v_texCoord;\nout vec4 fragColor;\n\nvoid main() {\n vec4 color = texture(u_texture, v_texCoord);\n color.a *= u_opacity;\n fragColor = color;\n}\n`;\n\n// ============================================================================\n// WebGL2 Renderer Implementation\n// ============================================================================\n\nfunction checkWebGLSupport(): boolean {\n try {\n return typeof WebGL2RenderingContext !== 'undefined';\n } catch {\n return false;\n }\n}\n\nexport class WebGLRenderer implements CompositorRenderer {\n readonly type: RendererType = 'webgl';\n readonly isSupported = checkWebGLSupport();\n\n private gl!: WebGL2RenderingContext;\n private canvas!: OffscreenCanvas;\n private config!: CompositorConfig;\n\n // Shader programs\n private layerProgram!: WebGLProgram;\n private transitionProgram!: WebGLProgram;\n\n // Uniform locations for layer program\n private layerUniforms!: {\n resolution: WebGLUniformLocation;\n position: WebGLUniformLocation;\n size: WebGLUniformLocation;\n rotation: WebGLUniformLocation;\n crop: WebGLUniformLocation;\n texture: WebGLUniformLocation;\n opacity: WebGLUniformLocation;\n borderRadius: WebGLUniformLocation;\n filterType: WebGLUniformLocation;\n filterStrength: WebGLUniformLocation;\n colorMatrix: WebGLUniformLocation;\n };\n\n // Uniform locations for transition program\n private transitionUniforms!: {\n texture: WebGLUniformLocation;\n opacity: WebGLUniformLocation;\n offset: WebGLUniformLocation;\n };\n\n // Texture management\n private textures: Map<string, WebGLTexture> = new Map();\n private textureCache: Map<string, { width: number; height: number }> = new Map();\n\n // Filter configurations\n private filterConfigs: Map<string, FilterConfig> = new Map();\n\n // Stats tracking\n private frameCount = 0;\n private lastFrameTime = 0;\n private fps = 0;\n private lastRenderTime = 0;\n\n async init(canvas: OffscreenCanvas, config: CompositorConfig): Promise<void> {\n if (!this.isSupported) {\n throw new Error('WebGL2 is not supported in this environment');\n }\n\n this.canvas = canvas;\n this.config = config;\n\n // Create WebGL2 context\n const gl = canvas.getContext('webgl2', {\n alpha: false,\n antialias: false,\n depth: false,\n stencil: false,\n premultipliedAlpha: true,\n preserveDrawingBuffer: false,\n powerPreference: 'high-performance',\n desynchronized: true, // Lower latency\n });\n\n if (!gl) {\n throw new Error('Failed to create WebGL2 context');\n }\n\n this.gl = gl;\n\n // Enable blending for transparency\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n // Compile shaders and create programs\n this.layerProgram = this.createProgram(VERTEX_SHADER, FRAGMENT_SHADER);\n this.transitionProgram = this.createProgram(TRANSITION_VERTEX_SHADER, TRANSITION_FRAGMENT_SHADER);\n\n // Get uniform locations for layer program\n this.layerUniforms = {\n resolution: gl.getUniformLocation(this.layerProgram, 'u_resolution')!,\n position: gl.getUniformLocation(this.layerProgram, 'u_position')!,\n size: gl.getUniformLocation(this.layerProgram, 'u_size')!,\n rotation: gl.getUniformLocation(this.layerProgram, 'u_rotation')!,\n crop: gl.getUniformLocation(this.layerProgram, 'u_crop')!,\n texture: gl.getUniformLocation(this.layerProgram, 'u_texture')!,\n opacity: gl.getUniformLocation(this.layerProgram, 'u_opacity')!,\n borderRadius: gl.getUniformLocation(this.layerProgram, 'u_borderRadius')!,\n filterType: gl.getUniformLocation(this.layerProgram, 'u_filterType')!,\n filterStrength: gl.getUniformLocation(this.layerProgram, 'u_filterStrength')!,\n colorMatrix: gl.getUniformLocation(this.layerProgram, 'u_colorMatrix')!,\n };\n\n // Get uniform locations for transition program\n this.transitionUniforms = {\n texture: gl.getUniformLocation(this.transitionProgram, 'u_texture')!,\n opacity: gl.getUniformLocation(this.transitionProgram, 'u_opacity')!,\n offset: gl.getUniformLocation(this.transitionProgram, 'u_offset')!,\n };\n\n // Set viewport\n gl.viewport(0, 0, config.width, config.height);\n\n this.lastFrameTime = performance.now();\n console.log('[WebGLRenderer] Initialized with raw WebGL2');\n }\n\n private createProgram(vertexSource: string, fragmentSource: string): WebGLProgram {\n const gl = this.gl;\n\n // Compile vertex shader\n const vertexShader = gl.createShader(gl.VERTEX_SHADER)!;\n gl.shaderSource(vertexShader, vertexSource);\n gl.compileShader(vertexShader);\n\n if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n const log = gl.getShaderInfoLog(vertexShader);\n gl.deleteShader(vertexShader);\n throw new Error(`Vertex shader compilation failed: ${log}`);\n }\n\n // Compile fragment shader\n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER)!;\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n const log = gl.getShaderInfoLog(fragmentShader);\n gl.deleteShader(vertexShader);\n gl.deleteShader(fragmentShader);\n throw new Error(`Fragment shader compilation failed: ${log}`);\n }\n\n // Link program\n const program = gl.createProgram()!;\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 log = gl.getProgramInfoLog(program);\n gl.deleteProgram(program);\n gl.deleteShader(vertexShader);\n gl.deleteShader(fragmentShader);\n throw new Error(`Program linking failed: ${log}`);\n }\n\n // Clean up shaders (they're attached to the program now)\n gl.deleteShader(vertexShader);\n gl.deleteShader(fragmentShader);\n\n return program;\n }\n\n renderScene(scene: Scene, frames: Map<string, VideoFrame | ImageBitmap>): void {\n const startTime = performance.now();\n const gl = this.gl;\n\n // Update textures from frames\n this.updateTextures(frames);\n\n // Clear with background color\n const bgColor = this.parseColor(scene.backgroundColor || '#000000');\n gl.clearColor(bgColor.r, bgColor.g, bgColor.b, 1.0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n\n // Use layer program\n gl.useProgram(this.layerProgram);\n\n // Set resolution uniform\n gl.uniform2f(this.layerUniforms.resolution, this.config.width, this.config.height);\n\n // Sort layers by z-index and render\n const visibleLayers = scene.layers\n .filter((layer) => layer.visible)\n .sort((a, b) => a.zIndex - b.zIndex);\n\n for (const layer of visibleLayers) {\n const texture = this.textures.get(layer.sourceId);\n if (texture) {\n this.renderLayer(layer, texture);\n }\n }\n\n // Track stats\n this.lastRenderTime = performance.now() - startTime;\n this.updateStats();\n }\n\n resize(config: CompositorConfig): void {\n this.config = config;\n if (this.gl) {\n this.gl.viewport(0, 0, config.width, config.height);\n }\n }\n\n private updateTextures(frames: Map<string, VideoFrame | ImageBitmap>): void {\n const gl = this.gl;\n\n for (const [sourceId, frame] of frames) {\n let texture = this.textures.get(sourceId);\n const width = 'displayWidth' in frame ? frame.displayWidth : frame.width;\n const height = 'displayHeight' in frame ? frame.displayHeight : frame.height;\n const cached = this.textureCache.get(sourceId);\n\n if (!texture) {\n // Create new texture\n texture = gl.createTexture()!;\n gl.bindTexture(gl.TEXTURE_2D, texture);\n\n // Set texture parameters\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 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n\n this.textures.set(sourceId, texture);\n } else {\n gl.bindTexture(gl.TEXTURE_2D, texture);\n }\n\n // Upload frame data to texture\n // texImage2D can accept VideoFrame and ImageBitmap directly\n if (cached && cached.width === width && cached.height === height) {\n // Same size - use texSubImage2D for better performance\n gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, frame);\n } else {\n // Different size or new - use texImage2D\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, frame);\n this.textureCache.set(sourceId, { width, height });\n }\n }\n }\n\n private renderLayer(layer: Layer, texture: WebGLTexture): void {\n const gl = this.gl;\n const { x, y, width, height, opacity, rotation, borderRadius, crop } = layer.transform;\n const scalingMode = layer.scalingMode || 'letterbox';\n\n // Get texture dimensions for aspect ratio calculation\n const textureInfo = this.textureCache.get(layer.sourceId);\n if (!textureInfo) return;\n\n // Calculate source dimensions after user-defined crop\n const srcWidth = textureInfo.width * (1 - crop.left - crop.right);\n const srcHeight = textureInfo.height * (1 - crop.top - crop.bottom);\n const srcAspect = srcWidth / srcHeight;\n\n // Convert layer bounds to pixels for aspect calculation\n const destWidth = width * this.config.width;\n const destHeight = height * this.config.height;\n const destAspect = destWidth / destHeight;\n\n // Calculate scaled position, size, and crop based on scaling mode\n let finalX = x;\n let finalY = y;\n let finalWidth = width;\n let finalHeight = height;\n let finalCropLeft = crop.left;\n let finalCropTop = crop.top;\n let finalCropRight = crop.right;\n let finalCropBottom = crop.bottom;\n\n switch (scalingMode) {\n case 'stretch':\n // No changes - stretch to fill\n break;\n\n case 'letterbox': {\n // Fit source within destination, preserving aspect ratio\n let newWidth: number, newHeight: number;\n\n if (srcAspect > destAspect) {\n // Source is wider - fit to width, add top/bottom bars\n newWidth = width;\n newHeight = (width * this.config.width) / srcAspect / this.config.height;\n } else {\n // Source is taller - fit to height, add left/right bars\n newHeight = height;\n newWidth = (height * this.config.height * srcAspect) / this.config.width;\n }\n\n // Center within original bounds\n finalX = x + (width - newWidth) / 2;\n finalY = y + (height - newHeight) / 2;\n finalWidth = newWidth;\n finalHeight = newHeight;\n break;\n }\n\n case 'crop': {\n // Fill destination, preserving aspect ratio, crop source overflow\n if (srcAspect > destAspect) {\n // Source is wider - crop sides\n const targetSrcWidth = srcHeight * destAspect;\n const cropAmount = (srcWidth - targetSrcWidth) / 2 / textureInfo.width;\n finalCropLeft = crop.left + cropAmount;\n finalCropRight = crop.right + cropAmount;\n } else {\n // Source is taller - crop top/bottom\n const targetSrcHeight = srcWidth / destAspect;\n const cropAmount = (srcHeight - targetSrcHeight) / 2 / textureInfo.height;\n finalCropTop = crop.top + cropAmount;\n finalCropBottom = crop.bottom + cropAmount;\n }\n break;\n }\n }\n\n // Bind texture\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.uniform1i(this.layerUniforms.texture, 0);\n\n // Set transform uniforms with scaled values\n gl.uniform2f(this.layerUniforms.position, finalX, finalY);\n gl.uniform2f(this.layerUniforms.size, finalWidth, finalHeight);\n gl.uniform1f(this.layerUniforms.rotation, (rotation * Math.PI) / 180);\n gl.uniform4f(this.layerUniforms.crop, finalCropLeft, finalCropTop, finalCropRight, finalCropBottom);\n gl.uniform1f(this.layerUniforms.opacity, Math.max(0, Math.min(1, opacity)));\n gl.uniform1f(this.layerUniforms.borderRadius, borderRadius);\n\n // Set filter uniforms\n const filter = this.filterConfigs.get(layer.id);\n if (filter) {\n this.applyFilterUniforms(filter);\n } else {\n gl.uniform1i(this.layerUniforms.filterType, 0);\n }\n\n // Draw the quad (6 vertices for 2 triangles)\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n }\n\n private applyFilterUniforms(filter: FilterConfig): void {\n const gl = this.gl;\n\n switch (filter.type) {\n case 'colorMatrix': {\n gl.uniform1i(this.layerUniforms.filterType, 2);\n // Build color matrix from filter settings\n const b = filter.brightness ?? 1;\n const c = filter.contrast ?? 1;\n const s = filter.saturation ?? 1;\n\n // Simplified color matrix combining brightness, contrast, saturation\n const sr = (1 - s) * 0.299;\n const sg = (1 - s) * 0.587;\n const sb = (1 - s) * 0.114;\n\n const matrix = new Float32Array([\n (sr + s) * c * b, sg * c * b, sb * c * b, 0,\n sr * c * b, (sg + s) * c * b, sb * c * b, 0,\n sr * c * b, sg * c * b, (sb + s) * c * b, 0,\n 0, 0, 0, 1,\n ]);\n gl.uniformMatrix4fv(this.layerUniforms.colorMatrix, false, matrix);\n break;\n }\n\n case 'grayscale':\n gl.uniform1i(this.layerUniforms.filterType, 3);\n gl.uniform1f(this.layerUniforms.filterStrength, filter.strength ?? 1);\n break;\n\n case 'sepia':\n gl.uniform1i(this.layerUniforms.filterType, 4);\n gl.uniform1f(this.layerUniforms.filterStrength, filter.strength ?? 1);\n break;\n\n case 'blur':\n // Blur would require multi-pass rendering with framebuffers\n // For now, just log a warning\n console.warn('[WebGLRenderer] Blur filter requires multi-pass rendering, not yet implemented');\n gl.uniform1i(this.layerUniforms.filterType, 0);\n break;\n\n default:\n gl.uniform1i(this.layerUniforms.filterType, 0);\n }\n }\n\n renderTransition(\n from: ImageBitmap,\n to: ImageBitmap,\n progress: number,\n type: TransitionType\n ): void {\n const gl = this.gl;\n const p = Math.max(0, Math.min(1, progress));\n\n // Clear\n gl.clearColor(0, 0, 0, 1);\n gl.clear(gl.COLOR_BUFFER_BIT);\n\n // Use transition program\n gl.useProgram(this.transitionProgram);\n\n // Create temporary textures\n const fromTexture = this.createTempTexture(from);\n const toTexture = this.createTempTexture(to);\n\n switch (type) {\n case 'fade':\n // Draw \"from\" at decreasing opacity\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, fromTexture);\n gl.uniform1i(this.transitionUniforms.texture, 0);\n gl.uniform1f(this.transitionUniforms.opacity, 1 - p);\n gl.uniform2f(this.transitionUniforms.offset, 0, 0);\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n\n // Draw \"to\" at increasing opacity\n gl.bindTexture(gl.TEXTURE_2D, toTexture);\n gl.uniform1f(this.transitionUniforms.opacity, p);\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n break;\n\n case 'slide-left': {\n const offset = p;\n // Draw \"from\" sliding out\n gl.bindTexture(gl.TEXTURE_2D, fromTexture);\n gl.uniform1f(this.transitionUniforms.opacity, 1);\n gl.uniform2f(this.transitionUniforms.offset, -offset, 0);\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n\n // Draw \"to\" sliding in\n gl.bindTexture(gl.TEXTURE_2D, toTexture);\n gl.uniform2f(this.transitionUniforms.offset, 1 - offset, 0);\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n break;\n }\n\n case 'slide-right': {\n const offset = p;\n gl.bindTexture(gl.TEXTURE_2D, fromTexture);\n gl.uniform1f(this.transitionUniforms.opacity, 1);\n gl.uniform2f(this.transitionUniforms.offset, offset, 0);\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n\n gl.bindTexture(gl.TEXTURE_2D, toTexture);\n gl.uniform2f(this.transitionUniforms.offset, -1 + offset, 0);\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n break;\n }\n\n case 'slide-up': {\n const offset = p;\n gl.bindTexture(gl.TEXTURE_2D, fromTexture);\n gl.uniform1f(this.transitionUniforms.opacity, 1);\n gl.uniform2f(this.transitionUniforms.offset, 0, offset);\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n\n gl.bindTexture(gl.TEXTURE_2D, toTexture);\n gl.uniform2f(this.transitionUniforms.offset, 0, -1 + offset);\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n break;\n }\n\n case 'slide-down': {\n const offset = p;\n gl.bindTexture(gl.TEXTURE_2D, fromTexture);\n gl.uniform1f(this.transitionUniforms.opacity, 1);\n gl.uniform2f(this.transitionUniforms.offset, 0, -offset);\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n\n gl.bindTexture(gl.TEXTURE_2D, toTexture);\n gl.uniform2f(this.transitionUniforms.offset, 0, 1 - offset);\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n break;\n }\n\n case 'cut':\n default:\n // Just draw the target\n gl.bindTexture(gl.TEXTURE_2D, toTexture);\n gl.uniform1f(this.transitionUniforms.opacity, 1);\n gl.uniform2f(this.transitionUniforms.offset, 0, 0);\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n break;\n }\n\n // Clean up temp textures\n gl.deleteTexture(fromTexture);\n gl.deleteTexture(toTexture);\n }\n\n private createTempTexture(image: ImageBitmap): WebGLTexture {\n const gl = this.gl;\n const texture = gl.createTexture()!;\n gl.bindTexture(gl.TEXTURE_2D, texture);\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 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.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n return texture;\n }\n\n applyFilter(layerId: string, filter: FilterConfig): void {\n this.filterConfigs.set(layerId, filter);\n }\n\n /**\n * Remove filters from a layer\n */\n clearFilter(layerId: string): void {\n this.filterConfigs.delete(layerId);\n }\n\n captureFrame(): VideoFrame {\n return new VideoFrame(this.canvas, {\n timestamp: performance.now() * 1000, // microseconds\n });\n }\n\n private parseColor(hex: string): { r: number; g: number; b: number } {\n // Parse hex color like '#000000' or '#000'\n let r = 0, g = 0, b = 0;\n\n if (hex.startsWith('#')) {\n hex = hex.slice(1);\n }\n\n if (hex.length === 3) {\n r = parseInt(hex[0] + hex[0], 16) / 255;\n g = parseInt(hex[1] + hex[1], 16) / 255;\n b = parseInt(hex[2] + hex[2], 16) / 255;\n } else if (hex.length === 6) {\n r = parseInt(hex.slice(0, 2), 16) / 255;\n g = parseInt(hex.slice(2, 4), 16) / 255;\n b = parseInt(hex.slice(4, 6), 16) / 255;\n }\n\n return { r, g, b };\n }\n\n private updateStats(): void {\n this.frameCount++;\n const now = performance.now();\n const elapsed = now - this.lastFrameTime;\n\n if (elapsed >= 1000) {\n this.fps = (this.frameCount * 1000) / elapsed;\n this.frameCount = 0;\n this.lastFrameTime = now;\n }\n }\n\n getStats(): RendererStats {\n return {\n fps: Math.round(this.fps),\n frameTimeMs: this.lastRenderTime,\n };\n }\n\n destroy(): void {\n const gl = this.gl;\n\n // Delete textures\n for (const texture of this.textures.values()) {\n gl.deleteTexture(texture);\n }\n this.textures.clear();\n this.textureCache.clear();\n\n // Delete programs\n if (this.layerProgram) {\n gl.deleteProgram(this.layerProgram);\n }\n if (this.transitionProgram) {\n gl.deleteProgram(this.transitionProgram);\n }\n\n // Clear filter configs\n this.filterConfigs.clear();\n\n // Lose context to free GPU resources\n const ext = gl.getExtension('WEBGL_lose_context');\n if (ext) {\n ext.loseContext();\n }\n }\n}\n\n// Register this renderer with the factory\nregisterRenderer('webgl', WebGLRenderer);\n","/**\n * WebGPU Renderer\n *\n * Highest-performance renderer using native WebGPU APIs.\n * Provides the best performance and enables compute shader effects.\n *\n * Features:\n * - Layer compositing with z-order\n * - Transform: position, size, rotation, opacity\n * - Border radius via stencil masking\n * - Cropping via UV coordinates\n * - Transitions: fade, slide (left/right/up/down), cut\n * - Future: Compute shader effects\n *\n * Requirements:\n * - WebGPU support (Chrome 113+, Edge 113+, Firefox behind flag)\n * - Note: Safari support coming, Firefox experimental\n *\n * Performance:\n * - Native GPU access with minimal overhead\n * - Efficient texture uploads from VideoFrame\n * - Batched rendering pipeline\n */\n\nimport type {\n Scene,\n Layer,\n CompositorConfig,\n TransitionType,\n FilterConfig,\n RendererType,\n RendererStats,\n} from '../../types';\nimport { registerRenderer, type CompositorRenderer } from './index';\n\n// ============================================================================\n// WGSL Shaders\n// ============================================================================\n\nconst VERTEX_SHADER = /* wgsl */ `\nstruct VertexInput {\n @location(0) position: vec2f,\n @location(1) texCoord: vec2f,\n}\n\nstruct VertexOutput {\n @builtin(position) position: vec4f,\n @location(0) texCoord: vec2f,\n}\n\nstruct Uniforms {\n transform: mat4x4f,\n opacity: f32,\n _padding1: f32,\n // Crop: x=left, y=top, z=right, w=bottom (0-1 from each edge)\n crop: vec4f,\n}\n\n@group(0) @binding(0) var<uniform> uniforms: Uniforms;\n\n@vertex\nfn main(input: VertexInput) -> VertexOutput {\n var output: VertexOutput;\n output.position = uniforms.transform * vec4f(input.position, 0.0, 1.0);\n\n // Apply UV crop: remap texCoord from [0,1] to [cropLeft, 1-cropRight] x [cropTop, 1-cropBottom]\n let cropLeft = uniforms.crop.x;\n let cropTop = uniforms.crop.y;\n let cropRight = uniforms.crop.z;\n let cropBottom = uniforms.crop.w;\n\n output.texCoord = vec2f(\n cropLeft + input.texCoord.x * (1.0 - cropLeft - cropRight),\n cropTop + input.texCoord.y * (1.0 - cropTop - cropBottom)\n );\n\n return output;\n}\n`;\n\nconst FRAGMENT_SHADER = /* wgsl */ `\nstruct Uniforms {\n transform: mat4x4f,\n opacity: f32,\n _padding1: f32,\n crop: vec4f,\n}\n\n@group(0) @binding(0) var<uniform> uniforms: Uniforms;\n@group(0) @binding(1) var textureSampler: sampler;\n@group(0) @binding(2) var textureData: texture_2d<f32>;\n\n@fragment\nfn main(@location(0) texCoord: vec2f) -> @location(0) vec4f {\n let color = textureSample(textureData, textureSampler, texCoord);\n return vec4f(color.rgb, color.a * uniforms.opacity);\n}\n`;\n\nconst _TRANSITION_FRAGMENT_SHADER = /* wgsl */ `\nstruct TransitionUniforms {\n progress: f32,\n transitionType: u32, // 0=cut, 1=fade, 2-5=slide directions\n canvasSize: vec2f,\n}\n\n@group(0) @binding(0) var<uniform> uniforms: TransitionUniforms;\n@group(0) @binding(1) var textureSampler: sampler;\n@group(0) @binding(2) var fromTexture: texture_2d<f32>;\n@group(0) @binding(3) var toTexture: texture_2d<f32>;\n\n@fragment\nfn main(@location(0) texCoord: vec2f) -> @location(0) vec4f {\n let fromColor = textureSample(fromTexture, textureSampler, texCoord);\n let toColor = textureSample(toTexture, textureSampler, texCoord);\n\n switch uniforms.transitionType {\n case 0u: { // cut\n return toColor;\n }\n case 1u: { // fade\n return mix(fromColor, toColor, uniforms.progress);\n }\n case 2u: { // slide-left\n let offset = uniforms.progress;\n if texCoord.x < 1.0 - offset {\n return textureSample(fromTexture, textureSampler, vec2f(texCoord.x + offset, texCoord.y));\n } else {\n return textureSample(toTexture, textureSampler, vec2f(texCoord.x - (1.0 - offset), texCoord.y));\n }\n }\n case 3u: { // slide-right\n let offset = uniforms.progress;\n if texCoord.x > offset {\n return textureSample(fromTexture, textureSampler, vec2f(texCoord.x - offset, texCoord.y));\n } else {\n return textureSample(toTexture, textureSampler, vec2f(texCoord.x + (1.0 - offset), texCoord.y));\n }\n }\n case 4u: { // slide-up\n let offset = uniforms.progress;\n if texCoord.y < 1.0 - offset {\n return textureSample(fromTexture, textureSampler, vec2f(texCoord.x, texCoord.y + offset));\n } else {\n return textureSample(toTexture, textureSampler, vec2f(texCoord.x, texCoord.y - (1.0 - offset)));\n }\n }\n case 5u: { // slide-down\n let offset = uniforms.progress;\n if texCoord.y > offset {\n return textureSample(fromTexture, textureSampler, vec2f(texCoord.x, texCoord.y - offset));\n } else {\n return textureSample(toTexture, textureSampler, vec2f(texCoord.x, texCoord.y + (1.0 - offset)));\n }\n }\n default: {\n return toColor;\n }\n }\n}\n`;\n\n// ============================================================================\n// WebGPU Support Check\n// ============================================================================\n\nfunction checkWebGPUSupport(): boolean {\n // Check if we're in a context where navigator exists and has gpu\n if (typeof navigator === 'undefined') return false;\n return 'gpu' in navigator;\n}\n\n// ============================================================================\n// WebGPU Renderer\n// ============================================================================\n\nexport class WebGPURenderer implements CompositorRenderer {\n readonly type: RendererType = 'webgpu';\n readonly isSupported = checkWebGPUSupport();\n\n private device: GPUDevice | null = null;\n private context: GPUCanvasContext | null = null;\n private config!: CompositorConfig;\n private canvas!: OffscreenCanvas;\n\n // Pipelines\n private renderPipeline: GPURenderPipeline | null = null;\n private transitionPipeline: GPURenderPipeline | null = null;\n\n // Geometry\n private vertexBuffer: GPUBuffer | null = null;\n private indexBuffer: GPUBuffer | null = null;\n\n // Textures and bind groups per source\n private textures: Map<string, GPUTexture> = new Map();\n private bindGroups: Map<string, GPUBindGroup> = new Map();\n private bindGroupTextures: Map<string, GPUTexture> = new Map();\n private uniformBuffers: Map<string, GPUBuffer> = new Map();\n\n // Sampler\n private sampler: GPUSampler | null = null;\n private presentationFormat: GPUTextureFormat | null = null;\n\n // Stats tracking\n private frameCount = 0;\n private lastFrameTime = 0;\n private fps = 0;\n private lastRenderTime = 0;\n\n async init(canvas: OffscreenCanvas, config: CompositorConfig): Promise<void> {\n if (!this.isSupported) {\n throw new Error('WebGPU is not supported in this environment');\n }\n\n this.canvas = canvas;\n this.config = config;\n\n // Request adapter and device\n const adapter = await navigator.gpu.requestAdapter({\n powerPreference: 'high-performance',\n });\n\n if (!adapter) {\n throw new Error('Failed to get WebGPU adapter');\n }\n\n this.device = await adapter.requestDevice();\n\n // Configure canvas context\n this.context = canvas.getContext('webgpu') as GPUCanvasContext;\n if (!this.context) {\n throw new Error('Failed to get WebGPU context');\n }\n\n const presentationFormat = navigator.gpu.getPreferredCanvasFormat();\n this.presentationFormat = presentationFormat;\n this.context.configure({\n device: this.device,\n format: presentationFormat,\n alphaMode: 'premultiplied',\n });\n\n // Create render pipeline\n await this.createRenderPipeline(presentationFormat);\n\n // Create geometry buffers (fullscreen quad)\n this.createGeometryBuffers();\n\n // Create sampler\n this.sampler = this.device.createSampler({\n magFilter: 'linear',\n minFilter: 'linear',\n mipmapFilter: 'linear',\n });\n\n this.lastFrameTime = performance.now();\n }\n\n private async createRenderPipeline(format: GPUTextureFormat): Promise<void> {\n if (!this.device) return;\n\n const vertexModule = this.device.createShaderModule({\n code: VERTEX_SHADER,\n });\n\n const fragmentModule = this.device.createShaderModule({\n code: FRAGMENT_SHADER,\n });\n\n // Bind group layout for uniforms + texture\n const bindGroupLayout = this.device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n buffer: { type: 'uniform' },\n },\n {\n binding: 1,\n visibility: GPUShaderStage.FRAGMENT,\n sampler: { type: 'filtering' },\n },\n {\n binding: 2,\n visibility: GPUShaderStage.FRAGMENT,\n texture: { sampleType: 'float' },\n },\n ],\n });\n\n const pipelineLayout = this.device.createPipelineLayout({\n bindGroupLayouts: [bindGroupLayout],\n });\n\n this.renderPipeline = this.device.createRenderPipeline({\n layout: pipelineLayout,\n vertex: {\n module: vertexModule,\n entryPoint: 'main',\n buffers: [\n {\n arrayStride: 16, // 2 floats position + 2 floats texCoord\n attributes: [\n { shaderLocation: 0, offset: 0, format: 'float32x2' },\n { shaderLocation: 1, offset: 8, format: 'float32x2' },\n ],\n },\n ],\n },\n fragment: {\n module: fragmentModule,\n entryPoint: 'main',\n targets: [\n {\n format,\n blend: {\n color: {\n srcFactor: 'src-alpha',\n dstFactor: 'one-minus-src-alpha',\n operation: 'add',\n },\n alpha: {\n srcFactor: 'one',\n dstFactor: 'one-minus-src-alpha',\n operation: 'add',\n },\n },\n },\n ],\n },\n primitive: {\n topology: 'triangle-list',\n },\n });\n }\n\n private createGeometryBuffers(): void {\n if (!this.device) return;\n\n // Fullscreen quad vertices (position + texCoord)\n // prettier-ignore\n const vertices = new Float32Array([\n // Position // TexCoord\n -1.0, -1.0, 0.0, 1.0, // bottom-left\n 1.0, -1.0, 1.0, 1.0, // bottom-right\n 1.0, 1.0, 1.0, 0.0, // top-right\n -1.0, 1.0, 0.0, 0.0, // top-left\n ]);\n\n this.vertexBuffer = this.device.createBuffer({\n size: vertices.byteLength,\n usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,\n });\n this.device.queue.writeBuffer(this.vertexBuffer, 0, vertices);\n\n // Index buffer for two triangles\n const indices = new Uint16Array([0, 1, 2, 0, 2, 3]);\n this.indexBuffer = this.device.createBuffer({\n size: indices.byteLength,\n usage: GPUBufferUsage.INDEX | GPUBufferUsage.COPY_DST,\n });\n this.device.queue.writeBuffer(this.indexBuffer, 0, indices);\n }\n\n renderScene(scene: Scene, frames: Map<string, VideoFrame | ImageBitmap>): void {\n if (!this.device || !this.context || !this.renderPipeline) return;\n\n const startTime = performance.now();\n\n // Update textures from frames\n this.updateTextures(frames);\n\n // Get current texture to render to\n const textureView = this.context.getCurrentTexture().createView();\n\n // Create command encoder\n const commandEncoder = this.device.createCommandEncoder();\n\n // Begin render pass\n const renderPass = commandEncoder.beginRenderPass({\n colorAttachments: [\n {\n view: textureView,\n clearValue: this.parseColor(scene.backgroundColor || '#000000'),\n loadOp: 'clear',\n storeOp: 'store',\n },\n ],\n });\n\n renderPass.setPipeline(this.renderPipeline);\n renderPass.setVertexBuffer(0, this.vertexBuffer!);\n renderPass.setIndexBuffer(this.indexBuffer!, 'uint16');\n\n // Sort and render layers\n const visibleLayers = scene.layers\n .filter((layer) => layer.visible)\n .sort((a, b) => a.zIndex - b.zIndex);\n\n for (const layer of visibleLayers) {\n const bindGroup = this.getOrCreateBindGroup(layer);\n if (bindGroup) {\n this.updateUniforms(layer);\n renderPass.setBindGroup(0, bindGroup);\n renderPass.drawIndexed(6);\n }\n }\n\n renderPass.end();\n\n // Submit commands\n this.device.queue.submit([commandEncoder.finish()]);\n\n // Track stats\n this.lastRenderTime = performance.now() - startTime;\n this.updateStats();\n }\n\n resize(config: CompositorConfig): void {\n this.config = config;\n\n if (this.context && this.device && this.presentationFormat) {\n this.context.configure({\n device: this.device,\n format: this.presentationFormat,\n alphaMode: 'premultiplied',\n });\n }\n }\n\n private updateTextures(frames: Map<string, VideoFrame | ImageBitmap>): void {\n if (!this.device) return;\n\n for (const [sourceId, frame] of frames) {\n const width = 'displayWidth' in frame ? frame.displayWidth : frame.width;\n const height = 'displayHeight' in frame ? frame.displayHeight : frame.height;\n\n let texture = this.textures.get(sourceId);\n\n // Create or recreate texture if size changed\n if (!texture || texture.width !== width || texture.height !== height) {\n if (texture) {\n const oldTexture = texture;\n // Defer destruction until GPU work is done to avoid validation errors.\n this.device.queue\n .onSubmittedWorkDone()\n .then(() => {\n try {\n oldTexture.destroy();\n } catch {\n // Ignore destroy errors\n }\n })\n .catch(() => {\n try {\n oldTexture.destroy();\n } catch {\n // Ignore destroy errors\n }\n });\n }\n\n texture = this.device.createTexture({\n size: { width, height },\n format: 'rgba8unorm',\n usage:\n GPUTextureUsage.TEXTURE_BINDING |\n GPUTextureUsage.COPY_DST |\n GPUTextureUsage.RENDER_ATTACHMENT,\n });\n this.textures.set(sourceId, texture);\n\n // Bind groups are keyed by layer id; rebind when a layer requests this source.\n // We keep cached bind groups and replace them on demand in getOrCreateBindGroup.\n }\n\n // Copy frame to texture\n if (frame instanceof ImageBitmap) {\n this.device.queue.copyExternalImageToTexture(\n { source: frame },\n { texture },\n { width, height }\n );\n } else {\n // VideoFrame\n this.device.queue.copyExternalImageToTexture(\n { source: frame },\n { texture },\n { width, height }\n );\n }\n }\n }\n\n private getOrCreateBindGroup(layer: Layer): GPUBindGroup | null {\n if (!this.device || !this.sampler || !this.renderPipeline) return null;\n\n const texture = this.textures.get(layer.sourceId);\n if (!texture) return null;\n\n const cachedTexture = this.bindGroupTextures.get(layer.id);\n let bindGroup = this.bindGroups.get(layer.id);\n if (!bindGroup || cachedTexture !== texture) {\n // Create uniform buffer for this layer\n let uniformBuffer = this.uniformBuffers.get(layer.id);\n if (!uniformBuffer) {\n uniformBuffer = this.device.createBuffer({\n size: 96, // mat4x4 (64) + f32 (4) + pad to 16 (12) + vec3f (12) + struct pad (4)\n usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n });\n this.uniformBuffers.set(layer.id, uniformBuffer);\n }\n\n bindGroup = this.device.createBindGroup({\n layout: this.renderPipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: { buffer: uniformBuffer } },\n { binding: 1, resource: this.sampler },\n { binding: 2, resource: texture.createView() },\n ],\n });\n this.bindGroups.set(layer.id, bindGroup);\n this.bindGroupTextures.set(layer.id, texture);\n }\n\n return bindGroup;\n }\n\n private updateUniforms(layer: Layer): void {\n if (!this.device) return;\n\n const uniformBuffer = this.uniformBuffers.get(layer.id);\n if (!uniformBuffer) return;\n\n const { x, y, width, height, opacity, rotation, crop } = layer.transform;\n const scalingMode = layer.scalingMode || 'letterbox';\n\n // Get source texture dimensions for aspect ratio\n const texture = this.textures.get(layer.sourceId);\n if (!texture) return;\n\n // Manual crop from layer transform (user-specified crop)\n const manualCropLeft = crop?.left || 0;\n const manualCropTop = crop?.top || 0;\n const manualCropRight = crop?.right || 0;\n const manualCropBottom = crop?.bottom || 0;\n\n // Calculate source dimensions after manual crop\n const srcWidth = texture.width * (1 - manualCropLeft - manualCropRight);\n const srcHeight = texture.height * (1 - manualCropTop - manualCropBottom);\n const srcAspect = srcWidth / srcHeight;\n\n // Destination dimensions in canvas units\n const destWidth = width * this.config.width;\n const destHeight = height * this.config.height;\n const destAspect = destWidth / destHeight;\n\n // Calculate final dimensions and UV crop based on scaling mode\n let finalX = x;\n let finalY = y;\n let finalWidth = width;\n let finalHeight = height;\n\n // UV crop values for shader (additional crop from scaling mode)\n // These values are added on top of any manual crop\n let uvCropLeft = manualCropLeft;\n let uvCropTop = manualCropTop;\n let uvCropRight = manualCropRight;\n let uvCropBottom = manualCropBottom;\n\n switch (scalingMode) {\n case 'stretch':\n // No changes - stretch to fill, use only manual crop\n break;\n\n case 'letterbox': {\n // Fit source within destination, preserving aspect ratio\n // No additional UV crop needed - we just resize the quad\n let newWidth: number, newHeight: number;\n\n if (srcAspect > destAspect) {\n // Source is wider - fit to width\n newWidth = width;\n newHeight = (width * this.config.width) / srcAspect / this.config.height;\n } else {\n // Source is taller - fit to height\n newHeight = height;\n newWidth = (height * this.config.height * srcAspect) / this.config.width;\n }\n\n // Center within original bounds\n finalX = x + (width - newWidth) / 2;\n finalY = y + (height - newHeight) / 2;\n finalWidth = newWidth;\n finalHeight = newHeight;\n break;\n }\n\n case 'crop': {\n // Fill destination completely, crop source overflow via UV coordinates\n // Match WebGL's calculation exactly: work in pixel space, divide by full texture size\n\n if (srcAspect > destAspect) {\n // Source is wider than destination - crop left and right\n // Calculate target width that would match destination aspect ratio\n const targetSrcWidth = srcHeight * destAspect;\n // Calculate crop amount as fraction of FULL texture width\n const cropAmount = (srcWidth - targetSrcWidth) / 2 / texture.width;\n uvCropLeft = manualCropLeft + cropAmount;\n uvCropRight = manualCropRight + cropAmount;\n } else if (srcAspect < destAspect) {\n // Source is taller than destination - crop top and bottom\n // Calculate target height that would match destination aspect ratio\n const targetSrcHeight = srcWidth / destAspect;\n // Calculate crop amount as fraction of FULL texture height\n const cropAmount = (srcHeight - targetSrcHeight) / 2 / texture.height;\n uvCropTop = manualCropTop + cropAmount;\n uvCropBottom = manualCropBottom + cropAmount;\n }\n // If aspects match exactly, no additional crop needed\n break;\n }\n }\n\n // Calculate transform matrix\n // Convert from 0-1 coordinates to -1 to 1 clip space\n const scaleX = finalWidth;\n const scaleY = finalHeight;\n const translateX = finalX * 2 - 1 + finalWidth;\n const translateY = -(finalY * 2 - 1 + finalHeight); // Flip Y\n\n // Create transformation matrix (column-major for WebGPU)\n const cos = Math.cos((rotation * Math.PI) / 180);\n const sin = Math.sin((rotation * Math.PI) / 180);\n\n // prettier-ignore\n const transform = new Float32Array([\n scaleX * cos, scaleX * sin, 0, 0,\n -scaleY * sin, scaleY * cos, 0, 0,\n 0, 0, 1, 0,\n translateX, translateY, 0, 1,\n ]);\n\n // Write uniforms (96 bytes to match WGSL struct alignment)\n // WGSL alignment: vec4f requires 16-byte alignment\n // Layout:\n // mat4x4f transform: offset 0, size 64 (floats 0-15)\n // f32 opacity: offset 64, size 4 (float 16)\n // f32 _padding1: offset 68, size 4 (float 17)\n // [implicit padding]: offset 72-79 (floats 18-19) - align vec4f to 16 bytes\n // vec4f crop: offset 80, size 16 (floats 20-23)\n // Total: 96 bytes\n const uniforms = new ArrayBuffer(96);\n const floatView = new Float32Array(uniforms);\n floatView.set(transform, 0); // mat4x4 at offset 0 (floats 0-15, bytes 0-63)\n floatView[16] = opacity; // f32 at offset 64 (float 16, bytes 64-67)\n floatView[17] = 0; // _padding1 at offset 68 (float 17, bytes 68-71)\n // floats 18-19 are implicit padding for vec4f alignment (bytes 72-79)\n floatView[18] = 0;\n floatView[19] = 0;\n // vec4f crop at offset 80 (floats 20-23, bytes 80-95)\n floatView[20] = uvCropLeft;\n floatView[21] = uvCropTop;\n floatView[22] = uvCropRight;\n floatView[23] = uvCropBottom;\n\n this.device.queue.writeBuffer(uniformBuffer, 0, uniforms);\n }\n\n private parseColor(hex: string): GPUColor {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n if (result) {\n return {\n r: parseInt(result[1], 16) / 255,\n g: parseInt(result[2], 16) / 255,\n b: parseInt(result[3], 16) / 255,\n a: 1,\n };\n }\n return { r: 0, g: 0, b: 0, a: 1 };\n }\n\n renderTransition(\n from: ImageBitmap,\n to: ImageBitmap,\n progress: number,\n type: TransitionType\n ): void {\n if (!this.device || !this.context) return;\n\n // For now, use a simple approach: render both images and blend\n // A more sophisticated approach would use the transition shader\n const textureView = this.context.getCurrentTexture().createView();\n const commandEncoder = this.device.createCommandEncoder();\n\n const renderPass = commandEncoder.beginRenderPass({\n colorAttachments: [\n {\n view: textureView,\n clearValue: { r: 0, g: 0, b: 0, a: 1 },\n loadOp: 'clear',\n storeOp: 'store',\n },\n ],\n });\n\n // For simplicity, we'll implement transitions similarly to Canvas2D\n // Full shader-based transitions would require the transition pipeline\n renderPass.end();\n\n // Create temporary textures and render\n this.renderTransitionSimple(from, to, progress, type, commandEncoder);\n\n this.device.queue.submit([commandEncoder.finish()]);\n }\n\n private renderTransitionSimple(\n from: ImageBitmap,\n to: ImageBitmap,\n progress: number,\n type: TransitionType,\n _commandEncoder: GPUCommandEncoder\n ): void {\n // Simple fallback: just copy the appropriate image\n // Full implementation would use shader-based blending\n const p = Math.max(0, Math.min(1, progress));\n\n if (!this.device || !this.context) return;\n\n const texture = this.device.createTexture({\n size: { width: this.config.width, height: this.config.height },\n format: 'rgba8unorm',\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST,\n });\n\n // For cut/instant, just show target\n if (type === 'cut' || p >= 1) {\n this.device.queue.copyExternalImageToTexture(\n { source: to },\n { texture },\n { width: to.width, height: to.height }\n );\n } else if (p <= 0) {\n this.device.queue.copyExternalImageToTexture(\n { source: from },\n { texture },\n { width: from.width, height: from.height }\n );\n } else {\n // For fade, we'd need proper blending - show target for simplicity\n this.device.queue.copyExternalImageToTexture(\n { source: p > 0.5 ? to : from },\n { texture },\n { width: to.width, height: to.height }\n );\n }\n\n texture.destroy();\n }\n\n applyFilter(_layerId: string, _filter: FilterConfig): void {\n // WebGPU filters would require compute shaders\n // This is a future enhancement\n console.warn(\n '[WebGPURenderer] Filter effects not yet implemented. Use WebGL renderer for filters.'\n );\n }\n\n captureFrame(): VideoFrame {\n return new VideoFrame(this.canvas, {\n timestamp: performance.now() * 1000,\n });\n }\n\n private updateStats(): void {\n this.frameCount++;\n const now = performance.now();\n const elapsed = now - this.lastFrameTime;\n\n if (elapsed >= 1000) {\n this.fps = (this.frameCount * 1000) / elapsed;\n this.frameCount = 0;\n this.lastFrameTime = now;\n }\n }\n\n getStats(): RendererStats {\n return {\n fps: Math.round(this.fps),\n frameTimeMs: this.lastRenderTime,\n };\n }\n\n destroy(): void {\n // Destroy textures\n for (const texture of this.textures.values()) {\n texture.destroy();\n }\n this.textures.clear();\n\n // Destroy buffers\n for (const buffer of this.uniformBuffers.values()) {\n buffer.destroy();\n }\n this.uniformBuffers.clear();\n\n this.vertexBuffer?.destroy();\n this.indexBuffer?.destroy();\n\n // Clear bind groups (they reference destroyed resources)\n this.bindGroups.clear();\n this.bindGroupTextures.clear();\n\n // Device will be garbage collected\n this.device = null;\n this.context = null;\n this.renderPipeline = null;\n this.sampler = null;\n }\n}\n\n// Register this renderer with the factory\nregisterRenderer('webgpu', WebGPURenderer);\n","/**\n * Transition Engine\n *\n * Manages smooth transitions between scenes with configurable easing.\n *\n * Supported transition types:\n * - cut: Instant switch (no animation)\n * - fade: Cross-dissolve between scenes\n * - slide-left/right/up/down: Sliding panel transition\n *\n * Easing functions:\n * - linear: Constant speed\n * - ease-in: Start slow, end fast\n * - ease-out: Start fast, end slow\n * - ease-in-out: Start slow, accelerate, end slow\n */\n\nimport type {\n TransitionConfig,\n TransitionState,\n TransitionType,\n EasingType,\n} from '../types';\n\n// ============================================================================\n// Easing Functions\n// ============================================================================\n\ntype EasingFunction = (t: number) => number;\n\n/**\n * Standard easing functions based on Robert Penner's easing equations\n */\nconst EASING_FUNCTIONS: Record<EasingType, EasingFunction> = {\n linear: (t) => t,\n\n 'ease-in': (t) => t * t,\n\n 'ease-out': (t) => t * (2 - t),\n\n 'ease-in-out': (t) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t),\n};\n\n// ============================================================================\n// TransitionEngine Class\n// ============================================================================\n\n/**\n * Engine for managing scene transitions with timing and easing\n */\nexport class TransitionEngine {\n private state: TransitionState | null = null;\n private easing: EasingFunction = EASING_FUNCTIONS.linear;\n\n /**\n * Start a new transition between scenes\n *\n * @param fromSceneId - ID of the scene being transitioned from\n * @param toSceneId - ID of the scene being transitioned to\n * @param config - Transition configuration (type, duration, easing)\n */\n start(fromSceneId: string, toSceneId: string, config: TransitionConfig): void {\n this.state = {\n active: true,\n type: config.type,\n progress: 0,\n fromSceneId,\n toSceneId,\n startTime: performance.now(),\n durationMs: config.durationMs,\n };\n\n this.easing = EASING_FUNCTIONS[config.easing] || EASING_FUNCTIONS.linear;\n\n // For 'cut' transitions, immediately complete\n if (config.type === 'cut') {\n this.state.progress = 1;\n this.state.active = false;\n }\n }\n\n /**\n * Update transition progress based on elapsed time\n * Call this every frame during a transition\n *\n * @returns Current transition state, or null if no transition is active\n */\n update(): TransitionState | null {\n if (!this.state?.active) {\n return null;\n }\n\n const elapsed = performance.now() - this.state.startTime;\n const rawProgress = Math.min(1, elapsed / this.state.durationMs);\n\n // Apply easing to get smooth progress\n this.state.progress = this.easing(rawProgress);\n\n // Check if transition is complete\n if (rawProgress >= 1) {\n this.state.active = false;\n this.state.progress = 1; // Ensure we end at exactly 1\n }\n\n return this.state;\n }\n\n /**\n * Check if a transition is currently active\n */\n isActive(): boolean {\n return this.state?.active ?? false;\n }\n\n /**\n * Get the current transition progress (0-1, with easing applied)\n */\n getProgress(): number {\n return this.state?.progress ?? 0;\n }\n\n /**\n * Get the raw linear progress (0-1, without easing)\n */\n getRawProgress(): number {\n if (!this.state?.active) {\n return this.state?.progress ?? 0;\n }\n\n const elapsed = performance.now() - this.state.startTime;\n return Math.min(1, elapsed / this.state.durationMs);\n }\n\n /**\n * Get the current transition type\n */\n getType(): TransitionType {\n return this.state?.type ?? 'cut';\n }\n\n /**\n * Get the source scene ID (scene being transitioned from)\n */\n getFromSceneId(): string | null {\n return this.state?.fromSceneId ?? null;\n }\n\n /**\n * Get the target scene ID (scene being transitioned to)\n */\n getToSceneId(): string | null {\n return this.state?.toSceneId ?? null;\n }\n\n /**\n * Get remaining time in milliseconds\n */\n getRemainingTime(): number {\n if (!this.state?.active) {\n return 0;\n }\n\n const elapsed = performance.now() - this.state.startTime;\n return Math.max(0, this.state.durationMs - elapsed);\n }\n\n /**\n * Get the full transition state (for serialization/debugging)\n */\n getState(): TransitionState | null {\n return this.state ? { ...this.state } : null;\n }\n\n /**\n * Cancel the current transition\n * The transition will stop at its current progress\n */\n cancel(): void {\n if (this.state) {\n this.state.active = false;\n }\n }\n\n /**\n * Force-complete the current transition\n * Jumps to the end state immediately\n */\n complete(): void {\n if (this.state) {\n this.state.active = false;\n this.state.progress = 1;\n }\n }\n\n /**\n * Reset the engine, clearing any transition state\n */\n reset(): void {\n this.state = null;\n this.easing = EASING_FUNCTIONS.linear;\n }\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\n/**\n * Create a default transition configuration\n */\nexport function createDefaultTransitionConfig(): TransitionConfig {\n return {\n type: 'fade',\n durationMs: 500,\n easing: 'ease-in-out',\n };\n}\n\n/**\n * Create a cut (instant) transition configuration\n */\nexport function createCutTransition(): TransitionConfig {\n return {\n type: 'cut',\n durationMs: 0,\n easing: 'linear',\n };\n}\n\n/**\n * Create a fade transition configuration\n */\nexport function createFadeTransition(\n durationMs: number = 500,\n easing: EasingType = 'ease-in-out'\n): TransitionConfig {\n return {\n type: 'fade',\n durationMs,\n easing,\n };\n}\n\n/**\n * Create a slide transition configuration\n */\nexport function createSlideTransition(\n direction: 'left' | 'right' | 'up' | 'down' = 'left',\n durationMs: number = 500,\n easing: EasingType = 'ease-in-out'\n): TransitionConfig {\n return {\n type: `slide-${direction}` as TransitionType,\n durationMs,\n easing,\n };\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Get all available transition types\n */\nexport function getAvailableTransitionTypes(): TransitionType[] {\n return ['cut', 'fade', 'slide-left', 'slide-right', 'slide-up', 'slide-down'];\n}\n\n/**\n * Get all available easing types\n */\nexport function getAvailableEasingTypes(): EasingType[] {\n return ['linear', 'ease-in', 'ease-out', 'ease-in-out'];\n}\n\n/**\n * Validate a transition configuration\n */\nexport function validateTransitionConfig(config: Partial<TransitionConfig>): TransitionConfig {\n return {\n type: config.type || 'fade',\n durationMs: Math.max(0, config.durationMs ?? 500),\n easing: config.easing || 'ease-in-out',\n };\n}\n","/**\n * Compositor Worker\n *\n * Web Worker that handles real-time video composition.\n * Runs off the main thread to ensure smooth compositing even when\n * the main thread is busy or the tab is in the background.\n *\n * Features:\n * - Multi-layer rendering with z-order\n * - Scene-based composition\n * - Smooth transitions between scenes\n * - Frame rate control (30/60 FPS)\n * - Stats reporting\n *\n * Data Flow:\n * Main Thread → (VideoFrames via postMessage) → Compositor Worker\n * → (Render to OffscreenCanvas) → MediaStreamTrackGenerator → WebRTC\n */\n\nimport type {\n Scene,\n Layer,\n LayerTransform,\n CompositorConfig,\n CompositorMainToWorker,\n CompositorWorkerToMain,\n TransitionConfig,\n LayoutConfig,\n LayoutTransitionConfig,\n FilterConfig,\n RendererType,\n EasingType,\n} from '../types';\n\n// Import renderers (importing registers them with the factory)\nimport { Canvas2DRenderer } from '../core/renderers/Canvas2DRenderer';\nimport { WebGLRenderer } from '../core/renderers/WebGLRenderer';\nimport { WebGPURenderer } from '../core/renderers/WebGPURenderer';\nimport { createRenderer, type CompositorRenderer } from '../core/renderers';\nimport { TransitionEngine } from '../core/TransitionEngine';\n\n// Reference renderers to ensure they're bundled and registered\nvoid Canvas2DRenderer;\nvoid WebGLRenderer;\nvoid WebGPURenderer;\n\n// ============================================================================\n// Worker State\n// ============================================================================\n\nlet canvas: OffscreenCanvas | null = null;\nlet renderer: CompositorRenderer | null = null;\nlet config: CompositorConfig | null = null;\nlet transitionEngine: TransitionEngine = new TransitionEngine();\n\n// Current scene state\nlet currentScene: Scene | null = null;\nlet nextScene: Scene | null = null;\n\n// Frame storage (latest frame from each source)\nconst frames: Map<string, VideoFrame | ImageBitmap> = new Map();\n\n// Transition snapshots\nlet fromSceneSnapshot: ImageBitmap | null = null;\nlet toSceneSnapshot: ImageBitmap | null = null;\n\n// Layout animation state\ninterface LayoutAnimationState {\n active: boolean;\n startTime: number;\n durationMs: number;\n easing: EasingType;\n fromTransforms: Map<string, LayerTransform>;\n toTransforms: Map<string, LayerTransform>;\n targetScene: Scene;\n}\nlet layoutAnimation: LayoutAnimationState | null = null;\n\n// Composition loop state\nlet compositionLoopId: number | null = null;\nlet isRunning = false;\n\n// Stats tracking\nlet lastStatsTime = 0;\nconst STATS_INTERVAL = 1000; // Report stats every second\n\n// ============================================================================\n// Message Handlers\n// ============================================================================\n\nself.onmessage = async (e: MessageEvent<CompositorMainToWorker>) => {\n const message = e.data;\n\n try {\n switch (message.type) {\n case 'init':\n await handleInit(message.config, message.canvas);\n break;\n\n case 'updateScene':\n handleUpdateScene(message.scene);\n break;\n\n case 'sourceFrame':\n handleSourceFrame(message.sourceId, message.frame);\n break;\n\n case 'sourceImage':\n handleSourceImage(message.sourceId, message.bitmap);\n break;\n\n case 'startTransition':\n handleStartTransition(message.transition, message.toSceneId);\n break;\n\n case 'updateLayout':\n handleUpdateLayout(message.layout);\n break;\n\n case 'animateLayout':\n handleAnimateLayout(message.targetScene, message.transition);\n break;\n\n case 'resize':\n await handleResize(message.width, message.height, message.frameRate);\n break;\n\n case 'setRenderer':\n handleSetRenderer(message.renderer);\n break;\n\n case 'applyFilter':\n handleApplyFilter(message.layerId, message.filter);\n break;\n\n case 'destroy':\n handleDestroy();\n break;\n\n default:\n console.warn('[CompositorWorker] Unknown message type:', (message as unknown as { type: string }).type);\n }\n } catch (error) {\n sendMessage({\n type: 'error',\n message: error instanceof Error ? error.message : String(error),\n });\n }\n};\n\n// ============================================================================\n// Initialization\n// ============================================================================\n\nasync function handleInit(cfg: CompositorConfig, offscreenCanvas: OffscreenCanvas): Promise<void> {\n config = cfg;\n canvas = offscreenCanvas;\n\n // Create the renderer using the factory with fallback chain\n // Try the requested renderer, then fall back through the chain\n const fallbackChain: RendererType[] =\n config.renderer === 'auto'\n ? ['webgpu', 'webgl', 'canvas2d']\n : [config.renderer, 'webgl', 'canvas2d'];\n\n let lastError: Error | null = null;\n\n for (const rendererType of fallbackChain) {\n try {\n console.log(`[CompositorWorker] Trying ${rendererType} renderer...`);\n renderer = createRenderer(rendererType);\n await renderer.init(canvas, config);\n console.log(`[CompositorWorker] ${rendererType} renderer initialized successfully`);\n break;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n console.warn(`[CompositorWorker] ${rendererType} renderer failed:`, lastError.message);\n renderer = null;\n\n // If this wasn't canvas2d, try the next one in the chain\n if (rendererType !== 'canvas2d') {\n continue;\n }\n }\n }\n\n if (!renderer) {\n throw new Error(`All renderers failed. Last error: ${lastError?.message ?? 'unknown'}`);\n }\n\n // Create default empty scene\n currentScene = {\n id: 'default',\n name: 'Default Scene',\n layers: [],\n backgroundColor: '#000000',\n };\n\n // Start the composition loop\n isRunning = true;\n startCompositionLoop();\n\n sendMessage({ type: 'ready' });\n sendMessage({ type: 'rendererChanged', renderer: renderer.type });\n}\n\n// ============================================================================\n// Scene Management\n// ============================================================================\n\nfunction handleUpdateScene(scene: Scene): void {\n // If no transition is active, update the current scene directly\n if (!transitionEngine.isActive()) {\n currentScene = scene;\n } else {\n // During transition, update the \"next\" scene\n nextScene = scene;\n }\n}\n\nfunction handleStartTransition(transition: TransitionConfig, toSceneId: string): void {\n if (!currentScene || !renderer) return;\n\n // Capture current scene as \"from\" snapshot\n captureSceneSnapshot('from');\n\n // The \"to\" scene should have been set via updateScene\n if (nextScene && nextScene.id === toSceneId) {\n // Render the next scene and capture it\n const tempScene = currentScene;\n currentScene = nextScene;\n renderCurrentScene();\n captureSceneSnapshot('to');\n currentScene = tempScene;\n\n // Start the transition\n transitionEngine.start(currentScene.id, toSceneId, transition);\n } else {\n console.warn('[CompositorWorker] Next scene not found for transition:', toSceneId);\n }\n}\n\nfunction captureSceneSnapshot(target: 'from' | 'to'): void {\n if (!canvas) return;\n\n // Use createImageBitmap to capture the current canvas state\n createImageBitmap(canvas).then((bitmap) => {\n if (target === 'from') {\n if (fromSceneSnapshot) fromSceneSnapshot.close();\n fromSceneSnapshot = bitmap;\n } else {\n if (toSceneSnapshot) toSceneSnapshot.close();\n toSceneSnapshot = bitmap;\n }\n });\n}\n\nfunction handleUpdateLayout(layout: LayoutConfig): void {\n // Layout is now handled entirely by SceneManager on the main thread.\n // SceneManager applies the layout, updates scene.layers, and sends updateScene.\n // This handler is kept for potential future use (e.g., storing layout metadata)\n // but should NOT recalculate layers here as that would overwrite the correct\n // layer data from SceneManager.\n console.log('[CompositorWorker] Layout updated:', layout.mode);\n}\n\n// ============================================================================\n// Layout Animation\n// ============================================================================\n\n/**\n * Apply easing function to progress value\n */\nfunction applyEasing(progress: number, easing: EasingType): number {\n const t = Math.max(0, Math.min(1, progress));\n\n switch (easing) {\n case 'linear':\n return t;\n case 'ease-in':\n return t * t;\n case 'ease-out':\n return 1 - (1 - t) * (1 - t);\n case 'ease-in-out':\n return t < 0.5\n ? 2 * t * t\n : 1 - Math.pow(-2 * t + 2, 2) / 2;\n default:\n return t;\n }\n}\n\n/**\n * Interpolate between two transforms\n */\nfunction interpolateTransform(\n from: LayerTransform,\n to: LayerTransform,\n progress: number\n): LayerTransform {\n const lerp = (a: number, b: number) => a + (b - a) * progress;\n\n return {\n x: lerp(from.x, to.x),\n y: lerp(from.y, to.y),\n width: lerp(from.width, to.width),\n height: lerp(from.height, to.height),\n opacity: lerp(from.opacity, to.opacity),\n rotation: lerp(from.rotation, to.rotation),\n borderRadius: lerp(from.borderRadius, to.borderRadius),\n crop: {\n top: lerp(from.crop.top, to.crop.top),\n right: lerp(from.crop.right, to.crop.right),\n bottom: lerp(from.crop.bottom, to.crop.bottom),\n left: lerp(from.crop.left, to.crop.left),\n },\n };\n}\n\nfunction handleAnimateLayout(targetScene: Scene, transition: LayoutTransitionConfig): void {\n if (!currentScene) {\n // No current scene, just set the target directly\n currentScene = targetScene;\n return;\n }\n\n // Build maps of old and new transforms by sourceId\n const fromTransforms = new Map<string, LayerTransform>();\n const toTransforms = new Map<string, LayerTransform>();\n\n // Get transforms from current scene\n for (const layer of currentScene.layers) {\n fromTransforms.set(layer.sourceId, { ...layer.transform });\n }\n\n // Get transforms from target scene\n for (const layer of targetScene.layers) {\n toTransforms.set(layer.sourceId, { ...layer.transform });\n\n // If layer didn't exist before, use target as starting point\n if (!fromTransforms.has(layer.sourceId)) {\n fromTransforms.set(layer.sourceId, { ...layer.transform });\n }\n }\n\n // Start the animation\n layoutAnimation = {\n active: true,\n startTime: performance.now(),\n durationMs: transition.durationMs,\n easing: transition.easing,\n fromTransforms,\n toTransforms,\n targetScene,\n };\n\n console.log('[CompositorWorker] Layout animation started', {\n durationMs: transition.durationMs,\n easing: transition.easing,\n layerCount: targetScene.layers.length,\n });\n}\n\n/**\n * Update layout animation and return interpolated scene\n * Returns null if no animation is active\n */\nfunction updateLayoutAnimation(): Scene | null {\n if (!layoutAnimation || !layoutAnimation.active || !currentScene) {\n return null;\n }\n\n const elapsed = performance.now() - layoutAnimation.startTime;\n const rawProgress = elapsed / layoutAnimation.durationMs;\n const progress = applyEasing(Math.min(rawProgress, 1), layoutAnimation.easing);\n\n // Create interpolated scene\n const interpolatedLayers: Layer[] = layoutAnimation.targetScene.layers.map((targetLayer) => {\n const fromTransform = layoutAnimation!.fromTransforms.get(targetLayer.sourceId);\n const toTransform = layoutAnimation!.toTransforms.get(targetLayer.sourceId);\n\n if (!fromTransform || !toTransform) {\n return targetLayer;\n }\n\n return {\n ...targetLayer,\n transform: interpolateTransform(fromTransform, toTransform, progress),\n };\n });\n\n const interpolatedScene: Scene = {\n ...layoutAnimation.targetScene,\n layers: interpolatedLayers,\n };\n\n // Check if animation is complete\n if (rawProgress >= 1) {\n // Animation complete - set final scene\n currentScene = layoutAnimation.targetScene;\n layoutAnimation = null;\n sendMessage({ type: 'layoutAnimationComplete' });\n return null; // Return null to indicate we should use currentScene now\n }\n\n return interpolatedScene;\n}\n\n// ============================================================================\n// Frame Handling\n// ============================================================================\n\nfunction handleSourceFrame(sourceId: string, frame: VideoFrame): void {\n // Close the old frame to prevent memory leaks\n const oldFrame = frames.get(sourceId);\n if (oldFrame && 'close' in oldFrame) {\n (oldFrame as VideoFrame).close();\n }\n\n frames.set(sourceId, frame);\n}\n\nfunction handleSourceImage(sourceId: string, bitmap: ImageBitmap): void {\n // Close the old bitmap if it exists\n const oldBitmap = frames.get(sourceId);\n if (oldBitmap && 'close' in oldBitmap) {\n oldBitmap.close();\n }\n\n frames.set(sourceId, bitmap);\n}\n\n// ============================================================================\n// Renderer Control\n// ============================================================================\n\nasync function handleSetRenderer(rendererType: RendererType): Promise<void> {\n if (!canvas || !config) {\n console.warn('[CompositorWorker] Cannot switch renderer - not initialized');\n return;\n }\n\n // If already using this renderer, do nothing\n if (renderer && renderer.type === rendererType) {\n return;\n }\n\n try {\n // Destroy old renderer\n if (renderer) {\n renderer.destroy();\n }\n\n // Create new renderer\n renderer = createRenderer(rendererType);\n await renderer.init(canvas, config);\n\n sendMessage({ type: 'rendererChanged', renderer: renderer.type });\n } catch {\n // If requested renderer fails, fall back to Canvas2D\n console.warn(`[CompositorWorker] Failed to create ${rendererType} renderer, falling back to canvas2d`);\n renderer = createRenderer('canvas2d');\n await renderer.init(canvas, config);\n sendMessage({ type: 'rendererChanged', renderer: 'canvas2d' });\n }\n}\n\nasync function handleResize(width: number, height: number, frameRate?: number): Promise<void> {\n if (!canvas || !config) {\n console.warn('[CompositorWorker] Cannot resize - not initialized');\n return;\n }\n\n config.width = width;\n config.height = height;\n if (frameRate !== undefined) {\n config.frameRate = frameRate;\n }\n\n canvas.width = width;\n canvas.height = height;\n\n const targetRenderer = renderer?.type ?? config.renderer;\n try {\n if (renderer) {\n await renderer.resize(config);\n return;\n }\n\n // If renderer wasn't initialized yet, create it now\n renderer = createRenderer(targetRenderer);\n await renderer.init(canvas, config);\n sendMessage({ type: 'rendererChanged', renderer: renderer.type });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`[CompositorWorker] Failed to resize with ${targetRenderer}: ${message}`);\n sendMessage({ type: 'error', message: `Failed to resize renderer (${targetRenderer}): ${message}` });\n }\n}\n\nfunction handleApplyFilter(layerId: string, filter: FilterConfig): void {\n if (!renderer) return;\n renderer.applyFilter(layerId, filter);\n}\n\n// ============================================================================\n// Composition Loop\n// ============================================================================\n\nfunction startCompositionLoop(): void {\n if (!config) return;\n\n const frameTime = 1000 / config.frameRate;\n let lastFrameTime = performance.now();\n\n function loop(): void {\n if (!isRunning) return;\n\n const now = performance.now();\n const elapsed = now - lastFrameTime;\n\n // Only render if enough time has passed for the target frame rate\n if (elapsed >= frameTime) {\n lastFrameTime = now - (elapsed % frameTime);\n\n if (transitionEngine.isActive()) {\n renderTransition();\n } else {\n renderCurrentScene();\n }\n\n // Send stats periodically\n if (now - lastStatsTime >= STATS_INTERVAL) {\n sendStats();\n lastStatsTime = now;\n }\n }\n\n // Use setTimeout for timing (more reliable in workers than requestAnimationFrame)\n compositionLoopId = self.setTimeout(loop, Math.max(1, frameTime - (performance.now() - lastFrameTime)));\n }\n\n loop();\n}\n\nfunction stopCompositionLoop(): void {\n if (compositionLoopId !== null) {\n clearTimeout(compositionLoopId);\n compositionLoopId = null;\n }\n}\n\nfunction renderCurrentScene(): void {\n if (!renderer || !currentScene) return;\n\n // Check for layout animation\n const interpolatedScene = updateLayoutAnimation();\n const sceneToRender = interpolatedScene || currentScene;\n\n renderer.renderScene(sceneToRender, frames);\n}\n\nfunction renderTransition(): void {\n if (!renderer || !fromSceneSnapshot || !toSceneSnapshot) return;\n\n // Update transition progress\n const state = transitionEngine.update();\n\n if (state) {\n renderer.renderTransition(\n fromSceneSnapshot,\n toSceneSnapshot,\n state.progress,\n state.type\n );\n\n // Check if transition completed\n if (!state.active) {\n completeTransition();\n }\n }\n}\n\nfunction completeTransition(): void {\n if (nextScene) {\n currentScene = nextScene;\n nextScene = null;\n }\n\n // Clean up snapshots\n if (fromSceneSnapshot) {\n fromSceneSnapshot.close();\n fromSceneSnapshot = null;\n }\n if (toSceneSnapshot) {\n toSceneSnapshot.close();\n toSceneSnapshot = null;\n }\n\n // Notify main thread\n sendMessage({\n type: 'transitionComplete',\n sceneId: currentScene?.id ?? '',\n });\n}\n\n// ============================================================================\n// Stats Reporting\n// ============================================================================\n\nfunction sendStats(): void {\n if (!renderer) return;\n\n const stats = renderer.getStats();\n sendMessage({ type: 'stats', stats });\n}\n\n// ============================================================================\n// Cleanup\n// ============================================================================\n\nfunction handleDestroy(): void {\n isRunning = false;\n stopCompositionLoop();\n\n // Close all frames\n for (const frame of frames.values()) {\n if ('close' in frame) {\n frame.close();\n }\n }\n frames.clear();\n\n // Clean up snapshots\n if (fromSceneSnapshot) {\n fromSceneSnapshot.close();\n fromSceneSnapshot = null;\n }\n if (toSceneSnapshot) {\n toSceneSnapshot.close();\n toSceneSnapshot = null;\n }\n\n // Destroy renderer\n if (renderer) {\n renderer.destroy();\n renderer = null;\n }\n\n canvas = null;\n config = null;\n currentScene = null;\n nextScene = null;\n}\n\n// ============================================================================\n// Communication Helpers\n// ============================================================================\n\nfunction sendMessage(message: CompositorWorkerToMain): void {\n self.postMessage(message);\n}\n"],"names":["Canvas2DRenderer","WebGLRenderer","WebGPURenderer","VERTEX_SHADER","FRAGMENT_SHADER"],"mappings":"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"}