@razorpay/blade 12.95.0 → 12.95.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/lib/native/components/Card/Card.js +1 -1
- package/build/lib/native/components/Card/Card.js.map +1 -1
- package/build/lib/native/components/Input/BaseInput/baseInputStyles.js +1 -1
- package/build/lib/native/components/Input/BaseInput/baseInputStyles.js.map +1 -1
- package/build/lib/native/components/Spark/RazorSenseGradient/shader.js +10 -3
- package/build/lib/native/components/Spark/RazorSenseGradient/shader.js.map +1 -1
- package/build/lib/native/components/Spark/RzpGlass/RzpGlass.js +5 -4
- package/build/lib/native/components/Spark/RzpGlass/RzpGlass.js.map +1 -1
- package/build/lib/native/components/Spark/RzpGlass/RzpGlassMount.js +2 -1
- package/build/lib/native/components/Spark/RzpGlass/RzpGlassMount.js.map +1 -1
- package/build/lib/native/components/Spark/RzpGlass/rzpGlassShader.js +8 -5
- package/build/lib/native/components/Spark/RzpGlass/rzpGlassShader.js.map +1 -1
- package/build/lib/native/components/Spark/RzpGlass/utils.js +4 -2
- package/build/lib/native/components/Spark/RzpGlass/utils.js.map +1 -1
- package/build/lib/web/development/components/Card/Card.js +7 -1
- package/build/lib/web/development/components/Card/Card.js.map +1 -1
- package/build/lib/web/development/components/Dropdown/DropdownOverlay.web.js +0 -1
- package/build/lib/web/development/components/Dropdown/DropdownOverlay.web.js.map +1 -1
- package/build/lib/web/development/components/Input/BaseInput/baseInputStyles.js +1 -0
- package/build/lib/web/development/components/Input/BaseInput/baseInputStyles.js.map +1 -1
- package/build/lib/web/development/components/Modal/Modal.web.js +31 -28
- package/build/lib/web/development/components/Modal/Modal.web.js.map +1 -1
- package/build/lib/web/development/components/SideNav/SideNavItems/SideNavItem.web.js +1 -1
- package/build/lib/web/development/components/SideNav/SideNavItems/SideNavItem.web.js.map +1 -1
- package/build/lib/web/development/components/Spark/RazorSenseGradient/shader.js +1 -1
- package/build/lib/web/development/components/Spark/RazorSenseGradient/shader.js.map +1 -1
- package/build/lib/web/development/components/Spark/RzpGlass/RzpGlass.js +14 -103
- package/build/lib/web/development/components/Spark/RzpGlass/RzpGlass.js.map +1 -1
- package/build/lib/web/development/components/Spark/RzpGlass/RzpGlassMount.js +8 -6
- package/build/lib/web/development/components/Spark/RzpGlass/RzpGlassMount.js.map +1 -1
- package/build/lib/web/development/components/Spark/RzpGlass/rzpGlassShader.js +1 -1
- package/build/lib/web/development/components/Spark/RzpGlass/rzpGlassShader.js.map +1 -1
- package/build/lib/web/development/components/Spark/RzpGlass/utils.js +68 -1
- package/build/lib/web/development/components/Spark/RzpGlass/utils.js.map +1 -1
- package/build/lib/web/development/components/TopNav/TabNav/TabNavItem.web.js +3 -2
- package/build/lib/web/development/components/TopNav/TabNav/TabNavItem.web.js.map +1 -1
- package/build/lib/web/production/_virtual/flatten.js +1 -1
- package/build/lib/web/production/_virtual/flatten3.js +1 -1
- package/build/lib/web/production/components/Card/Card.js +7 -1
- package/build/lib/web/production/components/Card/Card.js.map +1 -1
- package/build/lib/web/production/components/Dropdown/DropdownOverlay.web.js +0 -1
- package/build/lib/web/production/components/Dropdown/DropdownOverlay.web.js.map +1 -1
- package/build/lib/web/production/components/Input/BaseInput/baseInputStyles.js +1 -0
- package/build/lib/web/production/components/Input/BaseInput/baseInputStyles.js.map +1 -1
- package/build/lib/web/production/components/Modal/Modal.web.js +31 -28
- package/build/lib/web/production/components/Modal/Modal.web.js.map +1 -1
- package/build/lib/web/production/components/SideNav/SideNavItems/SideNavItem.web.js +1 -1
- package/build/lib/web/production/components/SideNav/SideNavItems/SideNavItem.web.js.map +1 -1
- package/build/lib/web/production/components/Spark/RazorSenseGradient/shader.js +1 -1
- package/build/lib/web/production/components/Spark/RazorSenseGradient/shader.js.map +1 -1
- package/build/lib/web/production/components/Spark/RzpGlass/RzpGlass.js +14 -103
- package/build/lib/web/production/components/Spark/RzpGlass/RzpGlass.js.map +1 -1
- package/build/lib/web/production/components/Spark/RzpGlass/RzpGlassMount.js +8 -6
- package/build/lib/web/production/components/Spark/RzpGlass/RzpGlassMount.js.map +1 -1
- package/build/lib/web/production/components/Spark/RzpGlass/rzpGlassShader.js +1 -1
- package/build/lib/web/production/components/Spark/RzpGlass/rzpGlassShader.js.map +1 -1
- package/build/lib/web/production/components/Spark/RzpGlass/utils.js +68 -1
- package/build/lib/web/production/components/Spark/RzpGlass/utils.js.map +1 -1
- package/build/lib/web/production/components/TopNav/TabNav/TabNavItem.web.js +3 -2
- package/build/lib/web/production/components/TopNav/TabNav/TabNavItem.web.js.map +1 -1
- package/build/lib/web/production/node_modules/es-toolkit/dist/array/flatten.js +1 -1
- package/build/lib/web/production/node_modules/es-toolkit/dist/compat/array/flatten.js +1 -1
- package/build/lib/web/production/node_modules/es-toolkit/dist/compat/array/sortBy.js +2 -2
- package/build/lib/web/production/node_modules/es-toolkit/dist/compat/object/omit.js +2 -2
- package/build/types/components/index.d.ts +40 -0
- package/build/types/components/index.native.d.ts +39 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RzpGlassMount.js","sources":["../../../../../../../src/components/Spark/RzpGlass/RzpGlassMount.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unnecessary-type-assertion */\n/* eslint-disable @typescript-eslint/no-implicit-any-catch */\n/* eslint-disable @typescript-eslint/explicit-function-return-type */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable one-var */\n/* eslint-disable @typescript-eslint/no-empty-function */\n/* eslint-disable default-case */\n/* eslint-disable @typescript-eslint/no-inferrable-types */\n\n/**\n * RzpGlassMount\n *\n * Core vanilla class for the RzpGlass WebGL shader effect.\n * Modeled after paper-shaders' ShaderMount with extensions for video textures.\n *\n * @see https://github.com/paper-design/shaders/blob/main/packages/shaders/src/shader-mount.ts\n */\nimport { rzpGlassVertexShader, rzpGlassFragmentShader } from './rzpGlassShader';\nimport type { RzpGlassConfig, RzpGlassAssets } from './types';\nimport { DEFAULT_CONFIG } from './presets';\nimport { loadImage, loadVideo, isSafari, bestGuessBrowserZoom } from './utils';\nimport { createProgram, setupFullscreenQuad, Texture } from './webgl-utils';\nimport { WebGLPerformanceController, LEVEL_RENDER_SETTINGS } from './PerformanceManager';\nimport type { PerformanceLevel } from './PerformanceManager';\n\n// Reference resolution for zoom-independent displacement\nconst REF_RESOLUTION = { width: 3000, height: 2000 };\n\n// Default max pixel count (1920 * 1080 * 4 = 8,294,400 pixels)\nconst DEFAULT_MAX_PIXEL_COUNT = 1920 * 1080 * 4;\n\n// Default styles for the shader container\nconst defaultStyle = `@layer rzp-glass {\n :where([data-rzp-glass]) {\n isolation: isolate;\n position: relative;\n overflow: hidden;\n\n & canvas {\n contain: strict;\n display: block;\n position: absolute;\n z-index: -1;\n border-radius: inherit;\n }\n }\n}`;\n\n/** Map of config keys to uniform names */\nconst CONFIG_TO_UNIFORM: Record<string, string> = {\n enableDisplacement: 'uEnableDisplacement',\n enableColorama: 'uEnableColorama',\n enableBloom: 'uEnableBloom',\n enableLightSweep: 'uEnableLightSweep',\n inputMin: 'uInputMin',\n inputMax: 'uInputMax',\n modifyGamma: 'uModifyGamma',\n posterizeLevels: 'uPosterizeLevels',\n cycleRepetitions: 'uCycleRepetitions',\n phaseShift: 'uPhaseShift',\n cycleSpeed: 'uCycleSpeed',\n wrapMode: 'uWrapMode',\n reverse: 'uReverse',\n blendWithOriginal: 'uBlendWithOriginal',\n lightIntensity: 'uLightIntensity',\n lightStartFrame: 'uLightStartFrame',\n numSegments: 'uNumSegments',\n slitAngle: 'uSlitAngle',\n displacementX: 'uDisplacementX',\n displacementY: 'uDisplacementY',\n enableCenterElement: 'uEnableCenterElement',\n centerAnimDuration: 'uCenterAnimDuration',\n ccBlackPoint: 'uCCBlackPoint',\n ccWhitePoint: 'uCCWhitePoint',\n ccMidtoneGamma: 'uCCMidtoneGamma',\n ccGamma: 'uCCGamma',\n ccContrast: 'uCCContrast',\n zoom: 'uZoom',\n // panX and panY are combined into uPan (vec2) in setUniformValues\n // backgroundColor is handled separately (needs clear color update)\n edgeFeather: 'uEdgeFeather',\n};\n\nexport class RzpGlassMount {\n public parentElement: HTMLElement;\n public canvasElement: HTMLCanvasElement;\n\n private gl: WebGLRenderingContext;\n private program: WebGLProgram | null = null;\n private uniformLocations: Record<string, WebGLUniformLocation | null> = {};\n private uniformCache: Record<string, unknown> = {};\n\n // Textures\n private videoTexture: Texture | null = null;\n private gradientMapTexture: Texture | null = null;\n private gradientMap2Texture: Texture | null = null;\n private centerGradientMapTexture: Texture | null = null;\n\n // Gradient map blend animation state\n private currentGradientMapBlend = 0;\n\n // Video element\n private video: HTMLVideoElement | null = null;\n private videoFrameCallbackId: number | null = null;\n\n // Animation state (paper-shader style)\n private rafId: number | null = null;\n /** Last render time in seconds */\n private lastRenderTime = 0;\n /** Frame count (increments every frame) */\n private currentFrame = 0;\n\n // Video-specific animation state\n /** Time for independent light animation (accumulates deltaTime) */\n private independentLightTime = 0;\n /** Last video animation time (for detecting jumps) */\n private lastVideoTime = 0;\n\n // Configuration\n private config: Required<RzpGlassConfig>;\n private assets: RzpGlassAssets;\n\n // State flags\n private hasBeenDisposed = false;\n private isInitialized = false;\n private resolutionChanged = true;\n\n // Visible UV bounds (where container clips the canvas)\n // vec4(minX, minY, maxX, maxY) - portion of canvas UV that's visible\n private visibleUvBounds: [number, number, number, number] = [0, 0, 1, 1];\n\n // Resize handling\n private resizeObserver: ResizeObserver | null = null;\n private renderScale = 1;\n private parentWidth = 0;\n private parentHeight = 0;\n private parentDevicePixelWidth = 0;\n private parentDevicePixelHeight = 0;\n private devicePixelsSupported = false;\n private minPixelRatio: number;\n private maxPixelCount: number;\n private isSafariBrowser = isSafari();\n\n // Performance monitoring\n private performanceController: WebGLPerformanceController | null = null;\n\n constructor(\n parentElement: HTMLElement,\n assets: RzpGlassAssets,\n config: Partial<RzpGlassConfig> = {},\n /** Starting frame offset in ms for deterministic results */\n frame = 0,\n /** Minimum pixel ratio to render at (default: 2) */\n minPixelRatio = 1,\n /** Maximum pixel count to render (default: ~8.3M) */\n maxPixelCount = DEFAULT_MAX_PIXEL_COUNT,\n ) {\n this.parentElement = parentElement;\n this.assets = assets;\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.currentFrame = frame;\n this.minPixelRatio = minPixelRatio;\n this.maxPixelCount = maxPixelCount;\n\n // Inject default styles if not already present\n if (!document.querySelector('style[data-rzp-glass-style]')) {\n const styleElement = document.createElement('style');\n styleElement.innerHTML = defaultStyle;\n styleElement.setAttribute('data-rzp-glass-style', '');\n document.head.prepend(styleElement);\n }\n\n // Create canvas element\n this.canvasElement = document.createElement('canvas');\n this.parentElement.prepend(this.canvasElement);\n this.parentElement.setAttribute('data-rzp-glass', '');\n\n // Get WebGL context with alpha for transparency during loading\n const gl = this.canvasElement.getContext('webgl', {\n antialias: false,\n premultipliedAlpha: false,\n depth: false,\n alpha: true,\n powerPreference: 'high-performance',\n })!;\n this.gl = gl;\n\n this.performanceController = new WebGLPerformanceController({\n gl: this.gl,\n onLevelChange: this.handlePerformanceLevelChange,\n });\n\n this.stopIfPotato();\n\n // Flip Y axis when uploading textures (video/images have Y=0 at top, WebGL has Y=0 at bottom)\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);\n\n // WebGL state setup (matching OGL defaults for 2D rendering)\n gl.disable(gl.DEPTH_TEST);\n gl.disable(gl.CULL_FACE);\n\n // Set clear color to transparent (for alpha blending during loading)\n gl.clearColor(0, 0, 0, 0);\n\n // Initialize program\n this.initProgram();\n this.setupPositionAttribute();\n this.setupUniformLocations();\n this.setupResizeObserver();\n\n // Visual viewport listener for zoom changes\n visualViewport?.addEventListener('resize', this.handleVisualViewportChange);\n\n // Listen for visibility changes to pause when tab is hidden\n document.addEventListener('visibilitychange', this.handleDocumentVisibilityChange);\n }\n\n private stopIfPotato(): asserts this is this {\n if (!this.performanceController?.isPotato()) {\n return;\n }\n this.stopRenderLoop();\n throw new Error('RzpGlass: WebGL is not supported in this browser');\n }\n\n /**\n * Load all assets (video or static image + gradient maps) and start rendering.\n * When `assets.imageSrc` is provided it is used as a static base texture and\n * no video element is created.\n */\n async loadAssets(): Promise<void> {\n this.stopIfPotato();\n try {\n const useStaticImage = Boolean(this.assets.imageSrc);\n\n const gradientMap2Src = this.assets.gradientMap2Src ?? this.assets.gradientMapSrc!;\n\n const [baseAsset, gradientMap, gradientMap2, centerGradientMap] = await Promise.all([\n useStaticImage ? loadImage(this.assets.imageSrc!) : loadVideo(this.assets.videoSrc!),\n loadImage(this.assets.gradientMapSrc!),\n loadImage(gradientMap2Src),\n loadImage(this.assets.centerGradientMapSrc!),\n ]);\n\n if (useStaticImage) {\n // Static image path — upload once to texture unit 0, no video loop needed\n this.setupImageTexture('uVideoTexture', baseAsset as HTMLImageElement, 0);\n } else {\n this.video = baseAsset as HTMLVideoElement;\n this.setupVideoTexture();\n // Set video to start time and apply playback rate before playback\n this.video.currentTime = this.config.startTime;\n this.video.playbackRate = this.config.playbackRate;\n if (!this.config.paused) {\n await this.video.play().catch((e) => {\n console.warn('Video autoplay failed:', e);\n });\n }\n }\n\n this.setupImageTexture('uGradientMap', gradientMap as HTMLImageElement, 1);\n this.setupImageTexture('uCenterGradientMap', centerGradientMap as HTMLImageElement, 2);\n this.setupImageTexture('uGradientMap2', gradientMap2 as HTMLImageElement, 3);\n\n // Set initial uniform values\n this.setAllUniforms();\n\n this.isInitialized = true;\n\n // Initial resize\n this.handleResize();\n\n // Start the render loop (runs continuously)\n this.startRenderLoop();\n } catch (error) {\n console.error('RzpGlass: Failed to load assets', error);\n throw error;\n }\n }\n\n private initProgram(): void {\n const program = createProgram(this.gl, rzpGlassVertexShader, rzpGlassFragmentShader);\n if (!program) {\n throw new Error('RzpGlass: Failed to create WebGL program');\n }\n this.program = program;\n }\n\n private setupPositionAttribute(): void {\n const buffers = setupFullscreenQuad(this.gl, this.program!);\n if (!buffers) {\n throw new Error('RzpGlass: Failed to setup fullscreen quad');\n }\n }\n\n private setupUniformLocations(): void {\n const gl = this.gl;\n const program = this.program!;\n\n // All uniform names from the shader\n const uniformNames = [\n 'uTime',\n 'iResolution',\n 'uDpr',\n 'uVideoTexture',\n 'uGradientMap',\n 'uGradientMap2',\n 'uGradientMapBlend',\n 'uCenterGradientMap',\n 'uEnableDisplacement',\n 'uEnableColorama',\n 'uEnableBloom',\n 'uEnableLightSweep',\n 'uInputMin',\n 'uInputMax',\n 'uModifyGamma',\n 'uPosterizeLevels',\n 'uCycleRepetitions',\n 'uPhaseShift',\n 'uCycleSpeed',\n 'uWrapMode',\n 'uReverse',\n 'uBlendWithOriginal',\n 'uLightIntensity',\n 'uFrameCount',\n 'uLightStartFrame',\n 'uNumSegments',\n 'uSlitAngle',\n 'uDisplacementX',\n 'uDisplacementY',\n 'uEnableCenterElement',\n 'uCenterAnimDuration',\n 'uCenterAnimTime',\n 'uCCBlackPoint',\n 'uCCWhitePoint',\n 'uCCMidtoneGamma',\n 'uCCGamma',\n 'uCCContrast',\n 'uZoom',\n 'uPan', // vec2(panX, panY) - set in vertex shader\n 'uEdgeFeather',\n 'uRefResolution',\n 'uVisibleUvBounds', // vec4(minX, minY, maxX, maxY) - visible portion of canvas in UV space\n 'uBackgroundColor', // vec3(r, g, b) - background color to blend with\n // Ripple wave\n 'uEnableRippleWave',\n 'uRippleSpeed',\n 'uRippleBlend',\n 'uRippleAngularPower',\n 'uRippleRadialFalloff',\n 'uRippleWaitTime',\n ];\n\n for (const name of uniformNames) {\n this.uniformLocations[name] = gl.getUniformLocation(program, name);\n }\n }\n\n private setupVideoTexture(): void {\n this.videoTexture = new Texture(this.gl, { textureUnit: 0 });\n\n // Use requestVideoFrameCallback for efficient video texture updates\n if (this.video && 'requestVideoFrameCallback' in this.video) {\n const updateVideoFrame = () => {\n if (this.hasBeenDisposed || !this.video || !this.videoTexture) return;\n\n this.videoTexture.update(this.video);\n\n this.videoFrameCallbackId = (this.video as any).requestVideoFrameCallback(updateVideoFrame);\n };\n this.videoFrameCallbackId = (this.video as any).requestVideoFrameCallback(updateVideoFrame);\n }\n }\n\n private setupImageTexture(\n uniformName: string,\n image: HTMLImageElement,\n textureUnit: number,\n ): void {\n const texture = new Texture(this.gl, { textureUnit });\n texture.image(image);\n\n if (uniformName === 'uVideoTexture') {\n this.videoTexture = texture;\n } else if (uniformName === 'uGradientMap') {\n this.gradientMapTexture = texture;\n } else if (uniformName === 'uGradientMap2') {\n this.gradientMap2Texture = texture;\n } else if (uniformName === 'uCenterGradientMap') {\n this.centerGradientMapTexture = texture;\n }\n }\n\n /**\n * Hot-swap the gradient map texture at runtime.\n * Accepts an HTMLCanvasElement (generated by generateGradientCanvas) or an HTMLImageElement.\n * No reinitialization required — the next frame will pick up the new texture.\n */\n public updateGradientMapTexture(source: HTMLCanvasElement | HTMLImageElement): void {\n if (!this.isInitialized || !this.gradientMapTexture) return;\n this.gradientMapTexture.image(source);\n }\n\n private setupResizeObserver(): void {\n this.resizeObserver = new ResizeObserver(([entry]) => {\n if (entry?.borderBoxSize[0]) {\n const physicalPixelSize = entry.devicePixelContentBoxSize?.[0];\n\n if (physicalPixelSize !== undefined) {\n this.devicePixelsSupported = true;\n this.parentDevicePixelWidth = physicalPixelSize.inlineSize;\n this.parentDevicePixelHeight = physicalPixelSize.blockSize;\n }\n\n this.parentWidth = entry.borderBoxSize[0].inlineSize;\n this.parentHeight = entry.borderBoxSize[0].blockSize;\n }\n\n this.handleResize();\n });\n\n this.resizeObserver.observe(this.parentElement);\n }\n\n private handleVisualViewportChange = (): void => {\n // Restart resize observer to get fresh callback on zoom change\n this.resizeObserver?.disconnect();\n this.setupResizeObserver();\n };\n\n private handleResize = (): void => {\n // Container dimensions (use stored values or fallback to clientWidth/Height)\n const containerWidth = this.parentWidth || this.parentElement.clientWidth;\n const containerHeight = this.parentHeight || this.parentElement.clientHeight;\n const containerAspect = containerWidth / containerHeight;\n\n // \"Cover\" behavior: fill container while maintaining aspect ratio (crop overflow)\n let canvasWidth: number;\n let canvasHeight: number;\n\n const targetAspectRatio = this.config.aspectRatio;\n if (containerAspect > targetAspectRatio) {\n // Container is wider than target - fit to width, crop top/bottom\n canvasWidth = containerWidth;\n canvasHeight = containerWidth / targetAspectRatio;\n } else {\n // Container is taller than target - fit to height, crop left/right\n canvasHeight = containerHeight;\n canvasWidth = containerHeight * targetAspectRatio;\n }\n\n // Center the canvas (overflow will be hidden by parent)\n const offsetX = (containerWidth - canvasWidth) / 2;\n const offsetY = (containerHeight - canvasHeight) / 2;\n\n // Calculate visible UV bounds (where container clips the canvas)\n // When canvas overflows container, we need to know which portion is visible\n const visibleMinX = -offsetX / canvasWidth;\n const visibleMaxX = (containerWidth - offsetX) / canvasWidth;\n const visibleMinY = -offsetY / canvasHeight;\n const visibleMaxY = (containerHeight - offsetY) / canvasHeight;\n this.visibleUvBounds = [visibleMinX, visibleMinY, visibleMaxX, visibleMaxY];\n\n // Set display size (CSS pixels)\n this.canvasElement.style.width = `${canvasWidth}px`;\n this.canvasElement.style.height = `${canvasHeight}px`;\n this.canvasElement.style.left = `${offsetX}px`;\n this.canvasElement.style.top = `${offsetY}px`;\n\n // Calculate target pixel dimensions for rendering\n let targetPixelWidth = 0;\n let targetPixelHeight = 0;\n\n const dpr = Math.max(1, window.devicePixelRatio);\n const pinchZoom = visualViewport?.scale ?? 1;\n\n if (this.devicePixelsSupported) {\n // Use real pixel size if we know it, but maintain aspect ratio\n // Calculate the scale ratio from parent to canvas (for aspect ratio correction)\n const canvasToParentRatioX = canvasWidth / containerWidth;\n const canvasToParentRatioY = canvasHeight / containerHeight;\n\n const scaleToMeetMinPixelRatio = Math.max(1, this.minPixelRatio / dpr);\n // Apply aspect ratio correction to device pixel dimensions\n targetPixelWidth =\n this.parentDevicePixelWidth * canvasToParentRatioX * scaleToMeetMinPixelRatio * pinchZoom;\n targetPixelHeight =\n this.parentDevicePixelHeight * canvasToParentRatioY * scaleToMeetMinPixelRatio * pinchZoom;\n } else {\n // Approximate using devicePixelRatio\n let targetRenderScale = Math.max(dpr, this.minPixelRatio) * pinchZoom;\n\n if (this.isSafariBrowser) {\n // Safari reports physical devicePixelRatio, need to factor in zoom manually\n const zoomLevel = bestGuessBrowserZoom();\n targetRenderScale *= Math.max(1, zoomLevel);\n }\n\n targetPixelWidth = Math.round(canvasWidth) * targetRenderScale;\n targetPixelHeight = Math.round(canvasHeight) * targetRenderScale;\n }\n\n // Prevent total rendered pixels from exceeding maxPixelCount\n const maxPixelCountHeadroom =\n Math.sqrt(this.maxPixelCount) / Math.sqrt(targetPixelWidth * targetPixelHeight);\n const scaleToMeetMaxPixelCount = Math.min(1, maxPixelCountHeadroom);\n const newWidth = Math.round(targetPixelWidth * scaleToMeetMaxPixelCount);\n const newHeight = Math.round(targetPixelHeight * scaleToMeetMaxPixelCount);\n const newRenderScale = newWidth / Math.round(canvasWidth);\n\n if (\n this.canvasElement.width !== newWidth ||\n this.canvasElement.height !== newHeight ||\n this.renderScale !== newRenderScale\n ) {\n this.renderScale = newRenderScale;\n this.canvasElement.width = newWidth;\n this.canvasElement.height = newHeight;\n this.resolutionChanged = true;\n this.gl.viewport(0, 0, newWidth, newHeight);\n\n // Only render immediately when the loop isn't running — if it is,\n // resolutionChanged=true is enough and the next RAF picks it up.\n // Calling render() while the loop is active spawns a duplicate RAF chain.\n if (this.rafId === null) {\n this.render(performance.now());\n }\n }\n };\n\n private handleDocumentVisibilityChange = (): void => {\n if (document.hidden) {\n // Pause render loop when tab is hidden\n this.stopRenderLoop();\n this.video?.pause();\n } else {\n // Resume render loop when tab is visible\n this.startRenderLoop();\n // Only resume video if not paused\n if (!this.config.paused) {\n this.video?.play().catch(() => {});\n }\n }\n };\n\n private setAllUniforms(): void {\n const gl = this.gl;\n gl.useProgram(this.program);\n\n // Texture units\n gl.uniform1i(this.uniformLocations.uVideoTexture, 0);\n gl.uniform1i(this.uniformLocations.uGradientMap, 1);\n gl.uniform1i(this.uniformLocations.uCenterGradientMap, 2);\n gl.uniform1i(this.uniformLocations.uGradientMap2, 3);\n gl.uniform1f(this.uniformLocations.uGradientMapBlend, this.currentGradientMapBlend);\n\n // Set all config-based uniforms\n this.setUniformValues(this.config);\n\n // Explicitly set pan uniform (vertex shader uniform)\n gl.uniform2f(this.uniformLocations.uPan, this.config.panX, this.config.panY);\n\n // Reference resolution (constant)\n gl.uniform2f(this.uniformLocations.uRefResolution, REF_RESOLUTION.width, REF_RESOLUTION.height);\n\n // Background color (or set to -1 if not provided)\n if (this.config.backgroundColor) {\n const [r, g, b] = this.config.backgroundColor;\n gl.uniform3f(this.uniformLocations.uBackgroundColor, r, g, b);\n // Also set clear color to match\n gl.clearColor(r, g, b, 1.0);\n } else {\n // Set to -1 to indicate no background color blending\n gl.uniform3f(this.uniformLocations.uBackgroundColor, -1.0, -1.0, -1.0);\n // Use transparent clear color\n gl.clearColor(0, 0, 0, 0);\n }\n\n // Visible UV bounds (where container clips the canvas)\n gl.uniform4f(\n this.uniformLocations.uVisibleUvBounds,\n this.visibleUvBounds[0],\n this.visibleUvBounds[1],\n this.visibleUvBounds[2],\n this.visibleUvBounds[3],\n );\n }\n\n /** Check if uniform values are equal (handles arrays) */\n private areUniformValuesEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (Array.isArray(a) && Array.isArray(b) && a.length === b.length) {\n return a.every((val, i) => this.areUniformValuesEqual(val, b[i]));\n }\n return false;\n }\n\n /** Set uniform values with caching to avoid redundant updates */\n private setUniformValues(config: Partial<RzpGlassConfig>): void {\n const gl = this.gl;\n gl.useProgram(this.program);\n\n Object.entries(config).forEach(([key, value]) => {\n if (value === undefined) return;\n\n // Check if value has changed\n if (this.areUniformValuesEqual(this.uniformCache[key], value)) return;\n this.uniformCache[key] = value;\n\n // Get uniform name from config key\n const uniformName = CONFIG_TO_UNIFORM[key];\n if (!uniformName) return; // Skip non-uniform config values\n\n const location = this.uniformLocations[uniformName];\n if (!location) return;\n\n if (typeof value === 'boolean') {\n gl.uniform1f(location, value ? 1 : 0);\n } else if (typeof value === 'number') {\n gl.uniform1f(location, value);\n } else if (Array.isArray(value)) {\n // Handle array uniforms (cast to number[] since config values are all numbers/booleans)\n const flatArray = (value as number[]).flat() as number[];\n switch (flatArray.length) {\n case 2:\n gl.uniform2fv(location, flatArray);\n break;\n case 3:\n gl.uniform3fv(location, flatArray);\n break;\n case 4:\n gl.uniform4fv(location, flatArray);\n break;\n }\n }\n });\n\n // Handle special pan uniform (vec2 in vertex shader)\n if (config.panX !== undefined || config.panY !== undefined) {\n const panCacheKey = 'pan';\n const panValue = [this.config.panX, this.config.panY];\n if (!this.areUniformValuesEqual(this.uniformCache[panCacheKey], panValue)) {\n this.uniformCache[panCacheKey] = panValue;\n gl.uniform2f(this.uniformLocations.uPan, panValue[0], panValue[1]);\n }\n }\n\n // Handle special backgroundColor uniform (vec3 in fragment shader)\n if (config.backgroundColor !== undefined) {\n const bgCacheKey = 'backgroundColor';\n if (!this.areUniformValuesEqual(this.uniformCache[bgCacheKey], config.backgroundColor)) {\n this.uniformCache[bgCacheKey] = config.backgroundColor;\n if (config.backgroundColor) {\n const [r, g, b] = config.backgroundColor;\n gl.uniform3f(this.uniformLocations.uBackgroundColor, r, g, b);\n // Also update clear color to match\n gl.clearColor(r, g, b, 1.0);\n } else {\n // Set to -1 to indicate no background color blending\n gl.uniform3f(this.uniformLocations.uBackgroundColor, -1.0, -1.0, -1.0);\n // Use transparent clear color\n gl.clearColor(0, 0, 0, 0);\n }\n }\n }\n }\n\n /**\n * Update uniforms from config (partial update supported)\n */\n public setUniforms(newConfig: Partial<RzpGlassConfig>): void {\n this.config = { ...this.config, ...newConfig };\n\n if (!this.isInitialized) return;\n\n // Use the new caching-based uniform setter\n this.setUniformValues(newConfig);\n\n // Handle paused state changes - control video play/pause\n if (newConfig.paused !== undefined) {\n if (newConfig.paused) {\n this.video?.pause();\n } else {\n this.video?.play().catch(() => {});\n }\n }\n\n if (newConfig.playbackRate !== undefined && this.video) {\n this.video.playbackRate = newConfig.playbackRate;\n }\n\n if (newConfig.aspectRatio !== undefined) {\n this.handleResize();\n }\n }\n\n private startRenderLoop(): void {\n if (this.rafId !== null) return; // Already running\n this.lastRenderTime = performance.now() * 0.001; // Initialize in seconds\n this.rafId = requestAnimationFrame(this.render);\n }\n\n private stopRenderLoop(): void {\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n }\n\n private render = (currentTime: number): void => {\n if (this.hasBeenDisposed) return;\n\n // ALWAYS schedule next frame first (like the original loop)\n this.rafId = requestAnimationFrame(this.render);\n\n if (this.program === null) {\n console.warn('Tried to render before program was initialized');\n return;\n }\n\n const gl = this.gl;\n const video = this.video;\n\n // Calculate delta time in seconds (framerate independent)\n const currentTimeSeconds = currentTime * 0.001; // Convert ms to seconds\n const deltaTime = currentTimeSeconds - this.lastRenderTime;\n this.lastRenderTime = currentTimeSeconds;\n this.currentFrame++; // Increment frame count every frame\n\n const usingStaticImage = !video && this.videoTexture !== null;\n\n // Skip rendering if video isn't ready — do NOT clear the canvas here so the\n // last rendered frame stays visible instead of flashing transparent/black.\n // This prevents flickering during video native loop boundary frames.\n if (!usingStaticImage) {\n if (!video || video.readyState < video.HAVE_CURRENT_DATA) {\n return;\n }\n\n // Update video texture (fallback for browsers without requestVideoFrameCallback)\n if (!('requestVideoFrameCallback' in video) && this.videoTexture) {\n this.videoTexture.update(video);\n }\n\n // Handle video looping within start/end time range (only when not paused)\n if (!this.config.paused) {\n if (video.currentTime < this.config.startTime || video.currentTime >= this.config.endTime) {\n video.currentTime = this.config.startTime;\n }\n }\n }\n\n // Clear canvas now that we know we have data to draw.\n // Doing this after the readyState guard means we keep the last frame\n // during any brief gaps (e.g. native video loop boundary).\n gl.clear(gl.COLOR_BUFFER_BIT);\n\n // Animation time: driven by video position for video mode, real elapsed time for static image\n const videoAnimTime = usingStaticImage\n ? currentTimeSeconds\n : video!.currentTime - this.config.startTime;\n\n // Update center animation time (always accumulate real time for smooth animation)\n if (this.config.animateLightIndependently || usingStaticImage) {\n this.independentLightTime += deltaTime;\n } else {\n const videoTimeDelta = videoAnimTime - this.lastVideoTime;\n const isVideoJump = Math.abs(videoTimeDelta) > 0.1 || videoTimeDelta < -0.01;\n\n if (isVideoJump) {\n this.independentLightTime = videoAnimTime;\n } else {\n this.independentLightTime += deltaTime;\n }\n }\n this.lastVideoTime = videoAnimTime;\n\n // Use program and set per-frame uniforms\n gl.useProgram(this.program);\n\n // Time uniforms\n gl.uniform1f(this.uniformLocations.uTime, currentTimeSeconds);\n // When animateLightIndependently is true, use real elapsed time for frame count\n // so light effects aren't tied to video playback\n const frameCount = this.config.animateLightIndependently\n ? this.independentLightTime * 30 // Use independent time (in seconds * 30fps)\n : videoAnimTime * 30; // Use video time (in seconds * 30fps)\n gl.uniform1f(this.uniformLocations.uFrameCount, frameCount);\n gl.uniform1f(this.uniformLocations.uCenterAnimTime, this.independentLightTime);\n\n // Resolution uniforms (only when changed)\n if (this.resolutionChanged) {\n gl.uniform2f(\n this.uniformLocations.iResolution,\n this.canvasElement.width,\n this.canvasElement.height,\n );\n gl.uniform1f(this.uniformLocations.uDpr, this.renderScale);\n // Update visible UV bounds (where container clips the canvas)\n gl.uniform4f(\n this.uniformLocations.uVisibleUvBounds,\n this.visibleUvBounds[0],\n this.visibleUvBounds[1],\n this.visibleUvBounds[2],\n this.visibleUvBounds[3],\n );\n this.resolutionChanged = false;\n }\n\n // Animate cycleRepetitions if enabled\n if (\n this.config.animateCycleReps &&\n this.currentFrame > this.config.cycleRepetitionsStartFrame\n ) {\n const elapsed = this.currentFrame - this.config.cycleRepetitionsStartFrame;\n const cycleProgress =\n (elapsed % (this.config.cycleRepetitionsDuration * 2)) /\n this.config.cycleRepetitionsDuration;\n const pingPong = cycleProgress <= 1 ? cycleProgress : 2 - cycleProgress;\n const eased = pingPong * pingPong * (3 - 2 * pingPong); // smoothstep\n const delta = this.config.cycleRepetitionsEnd - this.config.cycleRepetitionsStart;\n gl.uniform1f(\n this.uniformLocations.uCycleRepetitions,\n this.config.cycleRepetitionsStart + eased * delta,\n );\n } else {\n gl.uniform1f(this.uniformLocations.uCycleRepetitions, this.config.cycleRepetitions);\n }\n\n // Animate gradientMapBlend smoothly towards target\n const targetBlend = this.config.gradientMapBlend;\n if (this.currentGradientMapBlend !== targetBlend) {\n const speed = 1.0 / this.config.gradientMapBlendDuration;\n const diff = targetBlend - this.currentGradientMapBlend;\n const step = Math.sign(diff) * Math.min(Math.abs(diff), speed * deltaTime);\n this.currentGradientMapBlend += step;\n gl.uniform1f(this.uniformLocations.uGradientMapBlend, this.currentGradientMapBlend);\n }\n\n // Draw\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n };\n\n // ===== Public API (paper-shader style) =====\n\n /** Get the current animation frame (in ms) */\n public getCurrentFrame(): number {\n return this.currentFrame;\n }\n\n /** Set a specific frame for deterministic results */\n public setFrame(newFrame: number): void {\n this.currentFrame = newFrame;\n }\n\n /** Set the maximum pixel count for performance tuning */\n public setMaxPixelCount(newMaxPixelCount: number = DEFAULT_MAX_PIXEL_COUNT): void {\n this.maxPixelCount = newMaxPixelCount;\n this.handleResize();\n }\n\n /** Set the minimum pixel ratio for quality tuning */\n public setMinPixelRatio(newMinPixelRatio: number = 2): void {\n this.minPixelRatio = newMinPixelRatio;\n this.handleResize();\n }\n\n /** Play video */\n public play(): void {\n this.config.paused = false;\n this.video?.play().catch(() => {});\n }\n\n /** Pause video */\n public pause(): void {\n this.config.paused = true;\n this.video?.pause();\n }\n\n /** Seek to specific time in video */\n public setTime(time: number): void {\n if (this.video) {\n this.video.currentTime = time;\n }\n }\n\n private handlePerformanceLevelChange = (level: PerformanceLevel): void => {\n if (level === 0) {\n this.stopRenderLoop();\n this.canvasElement.style.display = 'none';\n return;\n }\n\n const { maxPixelCount, minPixelRatio } = LEVEL_RENDER_SETTINGS[level];\n this.maxPixelCount = maxPixelCount;\n this.minPixelRatio = minPixelRatio;\n\n // Restore canvas + render loop if they were previously hidden/stopped\n if (this.canvasElement.style.display === 'none') {\n this.canvasElement.style.display = '';\n }\n if (this.isInitialized) {\n this.startRenderLoop();\n }\n\n this.handleResize();\n };\n\n /** Clean up all WebGL resources */\n public dispose(): void {\n // Immediately mark as disposed to prevent future renders\n this.hasBeenDisposed = true;\n\n // Cancel any pending RAF\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n\n // Cancel video frame callback\n if (\n this.videoFrameCallbackId !== null &&\n this.video &&\n 'cancelVideoFrameCallback' in this.video\n ) {\n (this.video as any).cancelVideoFrameCallback(this.videoFrameCallbackId);\n }\n\n // Pause and remove video\n if (this.video) {\n this.video.pause();\n this.video.src = '';\n this.video.load();\n this.video = null;\n }\n\n // Clean up WebGL resources\n if (this.gl && this.program) {\n this.videoTexture?.destroy();\n this.gradientMapTexture?.destroy();\n this.gradientMap2Texture?.destroy();\n this.centerGradientMapTexture?.destroy();\n this.gl.deleteProgram(this.program);\n this.program = null;\n\n // Reset WebGL state\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, null);\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, null);\n this.gl.bindRenderbuffer(this.gl.RENDERBUFFER, null);\n this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, null);\n\n // Clear any errors\n this.gl.getError();\n }\n\n // Clean up performance controller\n this.performanceController?.dispose();\n this.performanceController = null;\n\n // Clean up observers and listeners\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n this.resizeObserver = null;\n }\n\n visualViewport?.removeEventListener('resize', this.handleVisualViewportChange);\n document.removeEventListener('visibilitychange', this.handleDocumentVisibilityChange);\n\n this.uniformLocations = {};\n this.uniformCache = {};\n\n // Remove canvas\n this.canvasElement.remove();\n this.parentElement.removeAttribute('data-rzp-glass');\n }\n}\n"],"names":["REF_RESOLUTION","width","height","DEFAULT_MAX_PIXEL_COUNT","defaultStyle","CONFIG_TO_UNIFORM","enableDisplacement","enableColorama","enableBloom","enableLightSweep","inputMin","inputMax","modifyGamma","posterizeLevels","cycleRepetitions","phaseShift","cycleSpeed","wrapMode","reverse","blendWithOriginal","lightIntensity","lightStartFrame","numSegments","slitAngle","displacementX","displacementY","enableCenterElement","centerAnimDuration","ccBlackPoint","ccWhitePoint","ccMidtoneGamma","ccGamma","ccContrast","zoom","edgeFeather","RzpGlassMount","parentElement","assets","_this","_visualViewport2","config","arguments","length","undefined","frame","minPixelRatio","maxPixelCount","_classCallCheck","_defineProperty","isSafari","_this$resizeObserver","resizeObserver","disconnect","setupResizeObserver","_visualViewport$scale","_visualViewport","containerWidth","parentWidth","clientWidth","containerHeight","parentHeight","clientHeight","containerAspect","canvasWidth","canvasHeight","targetAspectRatio","aspectRatio","offsetX","offsetY","visibleMinX","visibleMaxX","visibleMinY","visibleMaxY","visibleUvBounds","canvasElement","style","concat","left","top","targetPixelWidth","targetPixelHeight","dpr","Math","max","window","devicePixelRatio","pinchZoom","visualViewport","scale","devicePixelsSupported","canvasToParentRatioX","canvasToParentRatioY","scaleToMeetMinPixelRatio","parentDevicePixelWidth","parentDevicePixelHeight","targetRenderScale","isSafariBrowser","zoomLevel","bestGuessBrowserZoom","round","maxPixelCountHeadroom","sqrt","scaleToMeetMaxPixelCount","min","newWidth","newHeight","newRenderScale","renderScale","resolutionChanged","gl","viewport","rafId","render","performance","now","document","hidden","_this$video","stopRenderLoop","video","pause","startRenderLoop","paused","_this$video2","play","currentTime","hasBeenDisposed","requestAnimationFrame","program","console","warn","currentTimeSeconds","deltaTime","lastRenderTime","currentFrame","usingStaticImage","videoTexture","readyState","HAVE_CURRENT_DATA","update","startTime","endTime","clear","COLOR_BUFFER_BIT","videoAnimTime","animateLightIndependently","independentLightTime","videoTimeDelta","lastVideoTime","isVideoJump","abs","useProgram","uniform1f","uniformLocations","uTime","frameCount","uFrameCount","uCenterAnimTime","uniform2f","iResolution","uDpr","uniform4f","uVisibleUvBounds","animateCycleReps","cycleRepetitionsStartFrame","elapsed","cycleProgress","cycleRepetitionsDuration","pingPong","eased","delta","cycleRepetitionsEnd","cycleRepetitionsStart","uCycleRepetitions","targetBlend","gradientMapBlend","currentGradientMapBlend","speed","gradientMapBlendDuration","diff","step","sign","uGradientMapBlend","drawArrays","TRIANGLES","level","display","_LEVEL_RENDER_SETTING","LEVEL_RENDER_SETTINGS","isInitialized","handleResize","_objectSpread","DEFAULT_CONFIG","querySelector","styleElement","createElement","innerHTML","setAttribute","head","prepend","getContext","antialias","premultipliedAlpha","depth","alpha","powerPreference","performanceController","WebGLPerformanceController","onLevelChange","handlePerformanceLevelChange","stopIfPotato","pixelStorei","UNPACK_FLIP_Y_WEBGL","disable","DEPTH_TEST","CULL_FACE","clearColor","initProgram","setupPositionAttribute","setupUniformLocations","addEventListener","handleVisualViewportChange","handleDocumentVisibilityChange","_createClass","key","value","_this$performanceCont","isPotato","Error","_loadAssets","_asyncToGenerator","_regeneratorRuntime","mark","_callee","_this$assets$gradient","useStaticImage","gradientMap2Src","_yield$Promise$all","_yield$Promise$all2","baseAsset","gradientMap","gradientMap2","centerGradientMap","_t","wrap","_context","prev","next","Boolean","imageSrc","gradientMapSrc","Promise","all","loadImage","loadVideo","videoSrc","centerGradientMapSrc","sent","_slicedToArray","setupImageTexture","setupVideoTexture","playbackRate","e","setAllUniforms","error","stop","loadAssets","apply","createProgram","rzpGlassVertexShader","rzpGlassFragmentShader","buffers","setupFullscreenQuad","uniformNames","_i","_uniformNames","name","getUniformLocation","_this2","Texture","textureUnit","updateVideoFrame","videoFrameCallbackId","requestVideoFrameCallback","uniformName","image","texture","gradientMapTexture","gradientMap2Texture","centerGradientMapTexture","updateGradientMapTexture","source","_this3","ResizeObserver","_ref","_ref2","entry","borderBoxSize","_entry$devicePixelCon","physicalPixelSize","devicePixelContentBoxSize","inlineSize","blockSize","observe","uniform1i","uVideoTexture","uGradientMap","uCenterGradientMap","uGradientMap2","setUniformValues","uPan","panX","panY","uRefResolution","backgroundColor","_this$config$backgrou","r","g","b","uniform3f","uBackgroundColor","areUniformValuesEqual","a","_this4","Array","isArray","every","val","i","_this5","Object","entries","forEach","_ref3","_ref4","uniformCache","location","flatArray","flat","uniform2fv","uniform3fv","uniform4fv","panCacheKey","panValue","bgCacheKey","_config$backgroundCol","setUniforms","newConfig","_this$video3","_this$video4","cancelAnimationFrame","getCurrentFrame","setFrame","newFrame","setMaxPixelCount","newMaxPixelCount","setMinPixelRatio","newMinPixelRatio","_this$video5","_this$video6","setTime","time","dispose","_this$performanceCont2","_visualViewport3","cancelVideoFrameCallback","src","load","_this$videoTexture","_this$gradientMapText","_this$gradientMap2Tex","_this$centerGradientM","destroy","deleteProgram","bindBuffer","ARRAY_BUFFER","ELEMENT_ARRAY_BUFFER","bindRenderbuffer","RENDERBUFFER","bindFramebuffer","FRAMEBUFFER","getError","removeEventListener","remove","removeAttribute"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RzpGlassMount.js","sources":["../../../../../../../src/components/Spark/RzpGlass/RzpGlassMount.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unnecessary-type-assertion */\n/* eslint-disable @typescript-eslint/no-implicit-any-catch */\n/* eslint-disable @typescript-eslint/explicit-function-return-type */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable one-var */\n/* eslint-disable @typescript-eslint/no-empty-function */\n/* eslint-disable default-case */\n/* eslint-disable @typescript-eslint/no-inferrable-types */\n\n/**\n * RzpGlassMount\n *\n * Core vanilla class for the RzpGlass WebGL shader effect.\n * Modeled after paper-shaders' ShaderMount with extensions for video textures.\n *\n * @see https://github.com/paper-design/shaders/blob/main/packages/shaders/src/shader-mount.ts\n */\nimport { rzpGlassVertexShader, rzpGlassFragmentShader } from './rzpGlassShader';\nimport type { RzpGlassConfig, RzpGlassAssets } from './types';\nimport { DEFAULT_CONFIG } from './presets';\nimport { loadImage, loadVideo, isSafari, bestGuessBrowserZoom } from './utils';\nimport { createProgram, setupFullscreenQuad, Texture } from './webgl-utils';\nimport { WebGLPerformanceController, LEVEL_RENDER_SETTINGS } from './PerformanceManager';\nimport type { PerformanceLevel } from './PerformanceManager';\n\n// Reference resolution for zoom-independent displacement\nconst REF_RESOLUTION = { width: 3000, height: 2000 };\n\n// Default max pixel count (1920 * 1080 * 4 = 8,294,400 pixels)\nconst DEFAULT_MAX_PIXEL_COUNT = 1920 * 1080 * 4;\n\n// Default styles for the shader container\nconst defaultStyle = `@layer rzp-glass {\n :where([data-rzp-glass]) {\n isolation: isolate;\n position: relative;\n overflow: hidden;\n\n & canvas {\n contain: strict;\n display: block;\n position: absolute;\n z-index: -1;\n border-radius: inherit;\n pointer-events: none;\n }\n }\n}`;\n\n/** Map of config keys to uniform names */\nconst CONFIG_TO_UNIFORM: Record<string, string> = {\n enableDisplacement: 'uEnableDisplacement',\n enableColorama: 'uEnableColorama',\n enableBloom: 'uEnableBloom',\n enableLightSweep: 'uEnableLightSweep',\n inputMin: 'uInputMin',\n inputMax: 'uInputMax',\n modifyGamma: 'uModifyGamma',\n posterizeLevels: 'uPosterizeLevels',\n cycleRepetitions: 'uCycleRepetitions',\n phaseShift: 'uPhaseShift',\n cycleSpeed: 'uCycleSpeed',\n wrapMode: 'uWrapMode',\n reverse: 'uReverse',\n blendWithOriginal: 'uBlendWithOriginal',\n lightIntensity: 'uLightIntensity',\n lightStartFrame: 'uLightStartFrame',\n numSegments: 'uNumSegments',\n slitAngle: 'uSlitAngle',\n displacementX: 'uDisplacementX',\n displacementY: 'uDisplacementY',\n enableCenterElement: 'uEnableCenterElement',\n centerAnimDuration: 'uCenterAnimDuration',\n ccBlackPoint: 'uCCBlackPoint',\n ccWhitePoint: 'uCCWhitePoint',\n ccMidtoneGamma: 'uCCMidtoneGamma',\n ccGamma: 'uCCGamma',\n ccContrast: 'uCCContrast',\n zoom: 'uZoom',\n // panX and panY are combined into uPan (vec2) in setUniformValues\n // backgroundColor is handled separately (needs clear color update)\n edgeFeather: 'uEdgeFeather',\n};\n\nexport class RzpGlassMount {\n public parentElement: HTMLElement;\n public canvasElement: HTMLCanvasElement;\n\n private gl: WebGLRenderingContext;\n private program: WebGLProgram | null = null;\n private uniformLocations: Record<string, WebGLUniformLocation | null> = {};\n private uniformCache: Record<string, unknown> = {};\n\n // Textures\n private videoTexture: Texture | null = null;\n private gradientMapTexture: Texture | null = null;\n private gradientMap2Texture: Texture | null = null;\n private centerGradientMapTexture: Texture | null = null;\n\n // Gradient map blend animation state\n private currentGradientMapBlend = 0;\n\n // Video element\n private video: HTMLVideoElement | null = null;\n private videoFrameCallbackId: number | null = null;\n\n // Animation state (paper-shader style)\n private rafId: number | null = null;\n /** Last render time in seconds */\n private lastRenderTime = 0;\n /** Frame count (increments every frame) */\n private currentFrame = 0;\n\n // Video-specific animation state\n /** Time for independent light animation (accumulates deltaTime) */\n private independentLightTime = 0;\n /** Last video animation time (for detecting jumps) */\n private lastVideoTime = 0;\n\n // Configuration\n private config: Required<RzpGlassConfig>;\n private assets: RzpGlassAssets;\n\n // State flags\n private hasBeenDisposed = false;\n private isInitialized = false;\n private resolutionChanged = true;\n\n // Visible UV bounds (where container clips the canvas)\n // vec4(minX, minY, maxX, maxY) - portion of canvas UV that's visible\n private visibleUvBounds: [number, number, number, number] = [0, 0, 1, 1];\n\n // Resize handling\n private resizeObserver: ResizeObserver | null = null;\n private renderScale = 1;\n private parentWidth = 0;\n private parentHeight = 0;\n private parentDevicePixelWidth = 0;\n private parentDevicePixelHeight = 0;\n private devicePixelsSupported = false;\n private minPixelRatio: number;\n private maxPixelCount: number;\n private isSafariBrowser = isSafari();\n\n // Performance monitoring\n private performanceController: WebGLPerformanceController | null = null;\n\n constructor(\n parentElement: HTMLElement,\n assets: RzpGlassAssets,\n config: Partial<RzpGlassConfig> = {},\n /** Starting frame offset in ms for deterministic results */\n frame = 0,\n /** Minimum pixel ratio to render at (default: 2) */\n minPixelRatio = 1,\n /** Maximum pixel count to render (default: ~8.3M) */\n maxPixelCount = DEFAULT_MAX_PIXEL_COUNT,\n ) {\n this.parentElement = parentElement;\n this.assets = assets;\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.currentFrame = frame;\n this.minPixelRatio = minPixelRatio;\n this.maxPixelCount = maxPixelCount;\n\n // Inject default styles if not already present\n if (!document.querySelector('style[data-rzp-glass-style]')) {\n const styleElement = document.createElement('style');\n styleElement.innerHTML = defaultStyle;\n styleElement.setAttribute('data-rzp-glass-style', '');\n document.head.prepend(styleElement);\n }\n\n // Create canvas element\n this.canvasElement = document.createElement('canvas');\n this.parentElement.prepend(this.canvasElement);\n this.parentElement.setAttribute('data-rzp-glass', '');\n\n // Get WebGL context with alpha for transparency during loading\n const gl = this.canvasElement.getContext('webgl', {\n antialias: false,\n premultipliedAlpha: false,\n depth: false,\n alpha: true,\n powerPreference: 'high-performance',\n })!;\n this.gl = gl;\n\n // Flip Y axis when uploading textures (video/images have Y=0 at top, WebGL has Y=0 at bottom)\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);\n\n // WebGL state setup (matching OGL defaults for 2D rendering)\n gl.disable(gl.DEPTH_TEST);\n gl.disable(gl.CULL_FACE);\n\n // Set clear color to transparent (for alpha blending during loading)\n gl.clearColor(0, 0, 0, 0);\n\n // Initialize program\n this.initProgram();\n\n // Initialize performance controller after the initProgram so we don't get a crash when the program is not initialized yet.\n this.performanceController = new WebGLPerformanceController({\n gl: this.gl,\n onLevelChange: this.handlePerformanceLevelChange,\n });\n\n this.stopIfPotato();\n\n this.setupPositionAttribute();\n this.setupUniformLocations();\n this.setupResizeObserver();\n\n // Visual viewport listener for zoom changes\n visualViewport?.addEventListener('resize', this.handleVisualViewportChange);\n\n // Listen for visibility changes to pause when tab is hidden\n document.addEventListener('visibilitychange', this.handleDocumentVisibilityChange);\n }\n\n private stopIfPotato(): asserts this is this {\n if (!this.performanceController?.isPotato()) {\n return;\n }\n this.stopRenderLoop();\n throw new Error('RzpGlass: WebGL is not supported in this browser');\n }\n\n /**\n * Load all assets (video or static image + gradient maps) and start rendering.\n * When `assets.imageSrc` is provided it is used as a static base texture and\n * no video element is created.\n */\n async loadAssets(): Promise<void> {\n this.stopIfPotato();\n try {\n const useStaticImage = Boolean(this.assets.imageSrc);\n\n const gradientMap2Src = this.assets.gradientMap2Src ?? this.assets.gradientMapSrc!;\n\n const [baseAsset, gradientMap, gradientMap2, centerGradientMap] = await Promise.all([\n useStaticImage ? loadImage(this.assets.imageSrc!) : loadVideo(this.assets.videoSrc!),\n loadImage(this.assets.gradientMapSrc!),\n loadImage(gradientMap2Src),\n loadImage(this.assets.centerGradientMapSrc!),\n ]);\n\n if (useStaticImage) {\n // Static image path — upload once to texture unit 0, no video loop needed\n this.setupImageTexture('uVideoTexture', baseAsset as HTMLImageElement, 0);\n } else {\n this.video = baseAsset as HTMLVideoElement;\n this.setupVideoTexture();\n // Set video to start time and apply playback rate before playback\n this.video.currentTime = this.config.startTime;\n this.video.playbackRate = this.config.playbackRate;\n if (!this.config.paused) {\n await this.video.play().catch((e) => {\n console.warn('Video autoplay failed:', e);\n });\n }\n }\n\n this.setupImageTexture('uGradientMap', gradientMap as HTMLImageElement, 1);\n this.setupImageTexture('uCenterGradientMap', centerGradientMap as HTMLImageElement, 2);\n this.setupImageTexture('uGradientMap2', gradientMap2 as HTMLImageElement, 3);\n\n // Set initial uniform values\n this.setAllUniforms();\n\n this.isInitialized = true;\n\n // Initial resize\n this.handleResize();\n\n // Start the render loop (runs continuously)\n this.startRenderLoop();\n } catch (error) {\n console.error('RzpGlass: Failed to load assets', error);\n throw error;\n }\n }\n\n private initProgram(): void {\n const program = createProgram(this.gl, rzpGlassVertexShader, rzpGlassFragmentShader);\n if (!program) {\n throw new Error('RzpGlass: Failed to create WebGL program');\n }\n this.program = program;\n }\n\n private setupPositionAttribute(): void {\n const buffers = setupFullscreenQuad(this.gl, this.program!);\n if (!buffers) {\n throw new Error('RzpGlass: Failed to setup fullscreen quad');\n }\n }\n\n private setupUniformLocations(): void {\n const gl = this.gl;\n const program = this.program!;\n\n // All uniform names from the shader\n const uniformNames = [\n 'uTime',\n 'iResolution',\n 'uDpr',\n 'uVideoTexture',\n 'uGradientMap',\n 'uGradientMap2',\n 'uGradientMapBlend',\n 'uCenterGradientMap',\n 'uEnableDisplacement',\n 'uEnableColorama',\n 'uEnableBloom',\n 'uEnableLightSweep',\n 'uInputMin',\n 'uInputMax',\n 'uModifyGamma',\n 'uPosterizeLevels',\n 'uCycleRepetitions',\n 'uPhaseShift',\n 'uCycleSpeed',\n 'uWrapMode',\n 'uReverse',\n 'uBlendWithOriginal',\n 'uLightIntensity',\n 'uFrameCount',\n 'uLightStartFrame',\n 'uNumSegments',\n 'uSlitAngle',\n 'uDisplacementX',\n 'uDisplacementY',\n 'uEnableCenterElement',\n 'uCenterAnimDuration',\n 'uCenterAnimTime',\n 'uCCBlackPoint',\n 'uCCWhitePoint',\n 'uCCMidtoneGamma',\n 'uCCGamma',\n 'uCCContrast',\n 'uZoom',\n 'uPan', // vec2(panX, panY) - set in vertex shader\n 'uEdgeFeather',\n 'uRefResolution',\n 'uVisibleUvBounds', // vec4(minX, minY, maxX, maxY) - visible portion of canvas in UV space\n 'uBackgroundColor', // vec3(r, g, b) - background color to blend with\n // Ripple wave\n 'uEnableRippleWave',\n 'uRippleSpeed',\n 'uRippleBlend',\n 'uRippleAngularPower',\n 'uRippleRadialFalloff',\n 'uRippleWaitTime',\n ];\n\n for (const name of uniformNames) {\n this.uniformLocations[name] = gl.getUniformLocation(program, name);\n }\n }\n\n private setupVideoTexture(): void {\n this.videoTexture = new Texture(this.gl, { textureUnit: 0 });\n\n // Use requestVideoFrameCallback for efficient video texture updates\n if (this.video && 'requestVideoFrameCallback' in this.video) {\n const updateVideoFrame = () => {\n if (this.hasBeenDisposed || !this.video || !this.videoTexture) return;\n\n this.videoTexture.update(this.video);\n\n this.videoFrameCallbackId = (this.video as any).requestVideoFrameCallback(updateVideoFrame);\n };\n this.videoFrameCallbackId = (this.video as any).requestVideoFrameCallback(updateVideoFrame);\n }\n }\n\n private setupImageTexture(\n uniformName: string,\n image: HTMLImageElement,\n textureUnit: number,\n ): void {\n const texture = new Texture(this.gl, { textureUnit });\n texture.image(image);\n\n if (uniformName === 'uVideoTexture') {\n this.videoTexture = texture;\n } else if (uniformName === 'uGradientMap') {\n this.gradientMapTexture = texture;\n } else if (uniformName === 'uGradientMap2') {\n this.gradientMap2Texture = texture;\n } else if (uniformName === 'uCenterGradientMap') {\n this.centerGradientMapTexture = texture;\n }\n }\n\n /**\n * Hot-swap the gradient map texture at runtime.\n * Accepts an HTMLCanvasElement (generated by generateGradientCanvas) or an HTMLImageElement.\n * No reinitialization required — the next frame will pick up the new texture.\n */\n public updateGradientMapTexture(source: HTMLCanvasElement | HTMLImageElement): void {\n if (!this.isInitialized || !this.gradientMapTexture) return;\n this.gradientMapTexture.image(source);\n }\n\n private setupResizeObserver(): void {\n this.resizeObserver = new ResizeObserver(([entry]) => {\n if (entry?.borderBoxSize[0]) {\n const physicalPixelSize = entry.devicePixelContentBoxSize?.[0];\n\n if (physicalPixelSize !== undefined) {\n this.devicePixelsSupported = true;\n this.parentDevicePixelWidth = physicalPixelSize.inlineSize;\n this.parentDevicePixelHeight = physicalPixelSize.blockSize;\n }\n\n this.parentWidth = entry.borderBoxSize[0].inlineSize;\n this.parentHeight = entry.borderBoxSize[0].blockSize;\n }\n\n this.handleResize();\n });\n\n this.resizeObserver.observe(this.parentElement);\n }\n\n private handleVisualViewportChange = (): void => {\n // Restart resize observer to get fresh callback on zoom change\n this.resizeObserver?.disconnect();\n this.setupResizeObserver();\n };\n\n private handleResize = (): void => {\n // Container dimensions (use stored values or fallback to clientWidth/Height)\n const containerWidth = this.parentWidth || this.parentElement.clientWidth;\n const containerHeight = this.parentHeight || this.parentElement.clientHeight;\n const containerAspect = containerWidth / containerHeight;\n\n // \"Cover\" behavior: fill container while maintaining aspect ratio (crop overflow)\n let canvasWidth: number;\n let canvasHeight: number;\n\n const targetAspectRatio = this.config.aspectRatio;\n if (containerAspect > targetAspectRatio) {\n // Container is wider than target - fit to width, crop top/bottom\n canvasWidth = containerWidth;\n canvasHeight = containerWidth / targetAspectRatio;\n } else {\n // Container is taller than target - fit to height, crop left/right\n canvasHeight = containerHeight;\n canvasWidth = containerHeight * targetAspectRatio;\n }\n\n // Center the canvas (overflow will be hidden by parent)\n const offsetX = (containerWidth - canvasWidth) / 2;\n const offsetY = (containerHeight - canvasHeight) / 2;\n\n // Calculate visible UV bounds (where container clips the canvas)\n // When canvas overflows container, we need to know which portion is visible\n const visibleMinX = -offsetX / canvasWidth;\n const visibleMaxX = (containerWidth - offsetX) / canvasWidth;\n const visibleMinY = -offsetY / canvasHeight;\n const visibleMaxY = (containerHeight - offsetY) / canvasHeight;\n this.visibleUvBounds = [visibleMinX, visibleMinY, visibleMaxX, visibleMaxY];\n\n // Set display size (CSS pixels)\n this.canvasElement.style.width = `${canvasWidth}px`;\n this.canvasElement.style.height = `${canvasHeight}px`;\n this.canvasElement.style.left = `${offsetX}px`;\n this.canvasElement.style.top = `${offsetY}px`;\n\n // Calculate target pixel dimensions for rendering\n let targetPixelWidth = 0;\n let targetPixelHeight = 0;\n\n const dpr = Math.max(1, window.devicePixelRatio);\n const pinchZoom = visualViewport?.scale ?? 1;\n\n if (this.devicePixelsSupported) {\n // Use real pixel size if we know it, but maintain aspect ratio\n // Calculate the scale ratio from parent to canvas (for aspect ratio correction)\n const canvasToParentRatioX = canvasWidth / containerWidth;\n const canvasToParentRatioY = canvasHeight / containerHeight;\n\n const scaleToMeetMinPixelRatio = Math.max(1, this.minPixelRatio / dpr);\n // Apply aspect ratio correction to device pixel dimensions\n targetPixelWidth =\n this.parentDevicePixelWidth * canvasToParentRatioX * scaleToMeetMinPixelRatio * pinchZoom;\n targetPixelHeight =\n this.parentDevicePixelHeight * canvasToParentRatioY * scaleToMeetMinPixelRatio * pinchZoom;\n } else {\n // Approximate using devicePixelRatio\n let targetRenderScale = Math.max(dpr, this.minPixelRatio) * pinchZoom;\n\n if (this.isSafariBrowser) {\n // Safari reports physical devicePixelRatio, need to factor in zoom manually\n const zoomLevel = bestGuessBrowserZoom();\n targetRenderScale *= Math.max(1, zoomLevel);\n }\n\n targetPixelWidth = Math.round(canvasWidth) * targetRenderScale;\n targetPixelHeight = Math.round(canvasHeight) * targetRenderScale;\n }\n\n // Prevent total rendered pixels from exceeding maxPixelCount\n const maxPixelCountHeadroom =\n Math.sqrt(this.maxPixelCount) / Math.sqrt(targetPixelWidth * targetPixelHeight);\n const scaleToMeetMaxPixelCount = Math.min(1, maxPixelCountHeadroom);\n const newWidth = Math.round(targetPixelWidth * scaleToMeetMaxPixelCount);\n const newHeight = Math.round(targetPixelHeight * scaleToMeetMaxPixelCount);\n const newRenderScale = newWidth / Math.round(canvasWidth);\n\n if (\n this.canvasElement.width !== newWidth ||\n this.canvasElement.height !== newHeight ||\n this.renderScale !== newRenderScale\n ) {\n this.renderScale = newRenderScale;\n this.canvasElement.width = newWidth;\n this.canvasElement.height = newHeight;\n this.resolutionChanged = true;\n this.gl.viewport(0, 0, newWidth, newHeight);\n\n // Only render immediately when the loop isn't running — if it is,\n // resolutionChanged=true is enough and the next RAF picks it up.\n // Calling render() while the loop is active spawns a duplicate RAF chain.\n if (this.rafId === null) {\n this.render(performance.now());\n }\n }\n };\n\n private handleDocumentVisibilityChange = (): void => {\n if (document.hidden) {\n // Pause render loop when tab is hidden\n this.stopRenderLoop();\n this.video?.pause();\n } else {\n // Resume render loop when tab is visible\n this.startRenderLoop();\n // Only resume video if not paused\n if (!this.config.paused) {\n this.video?.play().catch(() => {});\n }\n }\n };\n\n private setAllUniforms(): void {\n const gl = this.gl;\n gl.useProgram(this.program);\n\n // Texture units\n gl.uniform1i(this.uniformLocations.uVideoTexture, 0);\n gl.uniform1i(this.uniformLocations.uGradientMap, 1);\n gl.uniform1i(this.uniformLocations.uCenterGradientMap, 2);\n gl.uniform1i(this.uniformLocations.uGradientMap2, 3);\n gl.uniform1f(this.uniformLocations.uGradientMapBlend, this.currentGradientMapBlend);\n\n // Set all config-based uniforms\n this.setUniformValues(this.config);\n\n // Explicitly set pan uniform (vertex shader uniform)\n gl.uniform2f(this.uniformLocations.uPan, this.config.panX, this.config.panY);\n\n // Reference resolution (constant)\n gl.uniform2f(this.uniformLocations.uRefResolution, REF_RESOLUTION.width, REF_RESOLUTION.height);\n\n // Background color (or set to -1 if not provided)\n if (this.config.backgroundColor) {\n const [r, g, b] = this.config.backgroundColor;\n gl.uniform3f(this.uniformLocations.uBackgroundColor, r, g, b);\n // Also set clear color to match\n gl.clearColor(r, g, b, 1.0);\n } else {\n // Set to -1 to indicate no background color blending\n gl.uniform3f(this.uniformLocations.uBackgroundColor, -1.0, -1.0, -1.0);\n // Use transparent clear color\n gl.clearColor(0, 0, 0, 0);\n }\n\n // Visible UV bounds (where container clips the canvas)\n gl.uniform4f(\n this.uniformLocations.uVisibleUvBounds,\n this.visibleUvBounds[0],\n this.visibleUvBounds[1],\n this.visibleUvBounds[2],\n this.visibleUvBounds[3],\n );\n }\n\n /** Check if uniform values are equal (handles arrays) */\n private areUniformValuesEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (Array.isArray(a) && Array.isArray(b) && a.length === b.length) {\n return a.every((val, i) => this.areUniformValuesEqual(val, b[i]));\n }\n return false;\n }\n\n /** Set uniform values with caching to avoid redundant updates */\n private setUniformValues(config: Partial<RzpGlassConfig>): void {\n const gl = this.gl;\n gl.useProgram(this.program);\n\n Object.entries(config).forEach(([key, value]) => {\n if (value === undefined) return;\n\n // Check if value has changed\n if (this.areUniformValuesEqual(this.uniformCache[key], value)) return;\n this.uniformCache[key] = value;\n\n // Get uniform name from config key\n const uniformName = CONFIG_TO_UNIFORM[key];\n if (!uniformName) return; // Skip non-uniform config values\n\n const location = this.uniformLocations[uniformName];\n if (!location) return;\n\n if (typeof value === 'boolean') {\n gl.uniform1f(location, value ? 1 : 0);\n } else if (typeof value === 'number') {\n gl.uniform1f(location, value);\n } else if (Array.isArray(value)) {\n // Handle array uniforms (cast to number[] since config values are all numbers/booleans)\n const flatArray = (value as number[]).flat() as number[];\n switch (flatArray.length) {\n case 2:\n gl.uniform2fv(location, flatArray);\n break;\n case 3:\n gl.uniform3fv(location, flatArray);\n break;\n case 4:\n gl.uniform4fv(location, flatArray);\n break;\n }\n }\n });\n\n // Handle special pan uniform (vec2 in vertex shader)\n if (config.panX !== undefined || config.panY !== undefined) {\n const panCacheKey = 'pan';\n const panValue = [this.config.panX, this.config.panY];\n if (!this.areUniformValuesEqual(this.uniformCache[panCacheKey], panValue)) {\n this.uniformCache[panCacheKey] = panValue;\n gl.uniform2f(this.uniformLocations.uPan, panValue[0], panValue[1]);\n }\n }\n\n // Handle special backgroundColor uniform (vec3 in fragment shader)\n if (config.backgroundColor !== undefined) {\n const bgCacheKey = 'backgroundColor';\n if (!this.areUniformValuesEqual(this.uniformCache[bgCacheKey], config.backgroundColor)) {\n this.uniformCache[bgCacheKey] = config.backgroundColor;\n if (config.backgroundColor) {\n const [r, g, b] = config.backgroundColor;\n gl.uniform3f(this.uniformLocations.uBackgroundColor, r, g, b);\n // Also update clear color to match\n gl.clearColor(r, g, b, 1.0);\n } else {\n // Set to -1 to indicate no background color blending\n gl.uniform3f(this.uniformLocations.uBackgroundColor, -1.0, -1.0, -1.0);\n // Use transparent clear color\n gl.clearColor(0, 0, 0, 0);\n }\n }\n }\n }\n\n /**\n * Update uniforms from config (partial update supported)\n */\n public setUniforms(newConfig: Partial<RzpGlassConfig>): void {\n this.config = { ...this.config, ...newConfig };\n\n if (!this.isInitialized) return;\n\n // Use the new caching-based uniform setter\n this.setUniformValues(newConfig);\n\n // Handle paused state changes - control video play/pause\n if (newConfig.paused !== undefined) {\n if (newConfig.paused) {\n this.video?.pause();\n } else {\n this.video?.play().catch(() => {});\n }\n }\n\n if (newConfig.playbackRate !== undefined && this.video) {\n this.video.playbackRate = newConfig.playbackRate;\n }\n\n if (newConfig.aspectRatio !== undefined) {\n this.handleResize();\n }\n }\n\n private startRenderLoop(): void {\n if (this.rafId !== null) return; // Already running\n this.lastRenderTime = performance.now() * 0.001; // Initialize in seconds\n this.rafId = requestAnimationFrame(this.render);\n }\n\n private stopRenderLoop(): void {\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n }\n\n private render = (currentTime: number): void => {\n if (this.hasBeenDisposed) return;\n\n // ALWAYS schedule next frame first (like the original loop)\n this.rafId = requestAnimationFrame(this.render);\n\n if (this.program === null) {\n console.warn('Tried to render before program was initialized');\n return;\n }\n\n const gl = this.gl;\n const video = this.video;\n\n // Calculate delta time in seconds (framerate independent)\n const currentTimeSeconds = currentTime * 0.001; // Convert ms to seconds\n const deltaTime = currentTimeSeconds - this.lastRenderTime;\n this.lastRenderTime = currentTimeSeconds;\n this.currentFrame++; // Increment frame count every frame\n\n const usingStaticImage = !video && this.videoTexture !== null;\n\n // Skip rendering if video isn't ready — do NOT clear the canvas here so the\n // last rendered frame stays visible instead of flashing transparent/black.\n // This prevents flickering during video native loop boundary frames.\n if (!usingStaticImage) {\n if (!video || video.readyState < video.HAVE_CURRENT_DATA) {\n return;\n }\n\n // Update video texture (fallback for browsers without requestVideoFrameCallback)\n if (!('requestVideoFrameCallback' in video) && this.videoTexture) {\n this.videoTexture.update(video);\n }\n\n // Handle video looping within start/end time range (only when not paused)\n if (!this.config.paused) {\n if (video.currentTime < this.config.startTime || video.currentTime >= this.config.endTime) {\n video.currentTime = this.config.startTime;\n }\n }\n }\n\n // Clear canvas now that we know we have data to draw.\n // Doing this after the readyState guard means we keep the last frame\n // during any brief gaps (e.g. native video loop boundary).\n gl.clear(gl.COLOR_BUFFER_BIT);\n\n // Animation time: driven by video position for video mode, real elapsed time for static image\n const videoAnimTime = usingStaticImage\n ? currentTimeSeconds\n : video!.currentTime - this.config.startTime;\n\n // Update center animation time (always accumulate real time for smooth animation)\n if (this.config.animateLightIndependently || usingStaticImage) {\n this.independentLightTime += deltaTime;\n } else {\n const videoTimeDelta = videoAnimTime - this.lastVideoTime;\n const isVideoJump = Math.abs(videoTimeDelta) > 0.1 || videoTimeDelta < -0.01;\n\n if (isVideoJump) {\n this.independentLightTime = videoAnimTime;\n } else {\n this.independentLightTime += deltaTime;\n }\n }\n this.lastVideoTime = videoAnimTime;\n\n // Use program and set per-frame uniforms\n gl.useProgram(this.program);\n\n // Time uniforms\n gl.uniform1f(this.uniformLocations.uTime, currentTimeSeconds);\n // When animateLightIndependently is true, use real elapsed time for frame count\n // so light effects aren't tied to video playback\n const frameCount = this.config.animateLightIndependently\n ? this.independentLightTime * 30 // Use independent time (in seconds * 30fps)\n : videoAnimTime * 30; // Use video time (in seconds * 30fps)\n gl.uniform1f(this.uniformLocations.uFrameCount, frameCount);\n gl.uniform1f(this.uniformLocations.uCenterAnimTime, this.independentLightTime);\n\n // Resolution uniforms (only when changed)\n if (this.resolutionChanged) {\n gl.uniform2f(\n this.uniformLocations.iResolution,\n this.canvasElement.width,\n this.canvasElement.height,\n );\n gl.uniform1f(this.uniformLocations.uDpr, this.renderScale);\n // Update visible UV bounds (where container clips the canvas)\n gl.uniform4f(\n this.uniformLocations.uVisibleUvBounds,\n this.visibleUvBounds[0],\n this.visibleUvBounds[1],\n this.visibleUvBounds[2],\n this.visibleUvBounds[3],\n );\n this.resolutionChanged = false;\n }\n\n // Animate cycleRepetitions if enabled\n if (\n this.config.animateCycleReps &&\n this.currentFrame > this.config.cycleRepetitionsStartFrame\n ) {\n const elapsed = this.currentFrame - this.config.cycleRepetitionsStartFrame;\n const cycleProgress =\n (elapsed % (this.config.cycleRepetitionsDuration * 2)) /\n this.config.cycleRepetitionsDuration;\n const pingPong = cycleProgress <= 1 ? cycleProgress : 2 - cycleProgress;\n const eased = pingPong * pingPong * (3 - 2 * pingPong); // smoothstep\n const delta = this.config.cycleRepetitionsEnd - this.config.cycleRepetitionsStart;\n gl.uniform1f(\n this.uniformLocations.uCycleRepetitions,\n this.config.cycleRepetitionsStart + eased * delta,\n );\n } else {\n gl.uniform1f(this.uniformLocations.uCycleRepetitions, this.config.cycleRepetitions);\n }\n\n // Animate gradientMapBlend smoothly towards target\n const targetBlend = this.config.gradientMapBlend;\n if (this.currentGradientMapBlend !== targetBlend) {\n const speed = 1.0 / this.config.gradientMapBlendDuration;\n const diff = targetBlend - this.currentGradientMapBlend;\n const step = Math.sign(diff) * Math.min(Math.abs(diff), speed * deltaTime);\n this.currentGradientMapBlend += step;\n gl.uniform1f(this.uniformLocations.uGradientMapBlend, this.currentGradientMapBlend);\n }\n\n // Draw\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n };\n\n // ===== Public API (paper-shader style) =====\n\n /** Get the current animation frame (in ms) */\n public getCurrentFrame(): number {\n return this.currentFrame;\n }\n\n /** Set a specific frame for deterministic results */\n public setFrame(newFrame: number): void {\n this.currentFrame = newFrame;\n }\n\n /** Set the maximum pixel count for performance tuning */\n public setMaxPixelCount(newMaxPixelCount: number = DEFAULT_MAX_PIXEL_COUNT): void {\n this.maxPixelCount = newMaxPixelCount;\n this.handleResize();\n }\n\n /** Set the minimum pixel ratio for quality tuning */\n public setMinPixelRatio(newMinPixelRatio: number = 2): void {\n this.minPixelRatio = newMinPixelRatio;\n this.handleResize();\n }\n\n /** Play video */\n public play(): void {\n this.config.paused = false;\n this.video?.play().catch(() => {});\n }\n\n /** Pause video */\n public pause(): void {\n this.config.paused = true;\n this.video?.pause();\n }\n\n /** Seek to specific time in video */\n public setTime(time: number): void {\n if (this.video) {\n this.video.currentTime = time;\n }\n }\n\n private handlePerformanceLevelChange = (level: PerformanceLevel): void => {\n if (level === 0) {\n this.stopRenderLoop();\n this.canvasElement.style.display = 'none';\n return;\n }\n\n const { maxPixelCount, minPixelRatio } = LEVEL_RENDER_SETTINGS[level];\n this.maxPixelCount = maxPixelCount;\n this.minPixelRatio = minPixelRatio;\n\n // Restore canvas + render loop if they were previously hidden/stopped\n if (this.canvasElement.style.display === 'none') {\n this.canvasElement.style.display = '';\n }\n if (this.isInitialized) {\n this.startRenderLoop();\n }\n\n this.handleResize();\n };\n\n /** Clean up all WebGL resources */\n public dispose(): void {\n // Immediately mark as disposed to prevent future renders\n this.hasBeenDisposed = true;\n\n // Cancel any pending RAF\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n\n // Cancel video frame callback\n if (\n this.videoFrameCallbackId !== null &&\n this.video &&\n 'cancelVideoFrameCallback' in this.video\n ) {\n (this.video as any).cancelVideoFrameCallback(this.videoFrameCallbackId);\n }\n\n // Pause and remove video\n if (this.video) {\n this.video.pause();\n this.video.src = '';\n this.video.load();\n this.video = null;\n }\n\n // Clean up WebGL resources\n if (this.gl && this.program) {\n this.videoTexture?.destroy();\n this.gradientMapTexture?.destroy();\n this.gradientMap2Texture?.destroy();\n this.centerGradientMapTexture?.destroy();\n this.gl.deleteProgram(this.program);\n this.program = null;\n\n // Reset WebGL state\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, null);\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, null);\n this.gl.bindRenderbuffer(this.gl.RENDERBUFFER, null);\n this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, null);\n\n // Clear any errors\n this.gl.getError();\n }\n\n // Clean up performance controller\n this.performanceController?.dispose();\n this.performanceController = null;\n\n // Clean up observers and listeners\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n this.resizeObserver = null;\n }\n\n visualViewport?.removeEventListener('resize', this.handleVisualViewportChange);\n document.removeEventListener('visibilitychange', this.handleDocumentVisibilityChange);\n\n this.uniformLocations = {};\n this.uniformCache = {};\n\n // Remove canvas\n this.canvasElement.remove();\n this.parentElement.removeAttribute('data-rzp-glass');\n }\n}\n"],"names":["REF_RESOLUTION","width","height","DEFAULT_MAX_PIXEL_COUNT","defaultStyle","CONFIG_TO_UNIFORM","enableDisplacement","enableColorama","enableBloom","enableLightSweep","inputMin","inputMax","modifyGamma","posterizeLevels","cycleRepetitions","phaseShift","cycleSpeed","wrapMode","reverse","blendWithOriginal","lightIntensity","lightStartFrame","numSegments","slitAngle","displacementX","displacementY","enableCenterElement","centerAnimDuration","ccBlackPoint","ccWhitePoint","ccMidtoneGamma","ccGamma","ccContrast","zoom","edgeFeather","RzpGlassMount","parentElement","assets","_this","_visualViewport2","config","arguments","length","undefined","frame","minPixelRatio","maxPixelCount","_classCallCheck","_defineProperty","isSafari","_this$resizeObserver","resizeObserver","disconnect","setupResizeObserver","_visualViewport$scale","_visualViewport","containerWidth","parentWidth","clientWidth","containerHeight","parentHeight","clientHeight","containerAspect","canvasWidth","canvasHeight","targetAspectRatio","aspectRatio","offsetX","offsetY","visibleMinX","visibleMaxX","visibleMinY","visibleMaxY","visibleUvBounds","canvasElement","style","concat","left","top","targetPixelWidth","targetPixelHeight","dpr","Math","max","window","devicePixelRatio","pinchZoom","visualViewport","scale","devicePixelsSupported","canvasToParentRatioX","canvasToParentRatioY","scaleToMeetMinPixelRatio","parentDevicePixelWidth","parentDevicePixelHeight","targetRenderScale","isSafariBrowser","zoomLevel","bestGuessBrowserZoom","round","maxPixelCountHeadroom","sqrt","scaleToMeetMaxPixelCount","min","newWidth","newHeight","newRenderScale","renderScale","resolutionChanged","gl","viewport","rafId","render","performance","now","document","hidden","_this$video","stopRenderLoop","video","pause","startRenderLoop","paused","_this$video2","play","currentTime","hasBeenDisposed","requestAnimationFrame","program","console","warn","currentTimeSeconds","deltaTime","lastRenderTime","currentFrame","usingStaticImage","videoTexture","readyState","HAVE_CURRENT_DATA","update","startTime","endTime","clear","COLOR_BUFFER_BIT","videoAnimTime","animateLightIndependently","independentLightTime","videoTimeDelta","lastVideoTime","isVideoJump","abs","useProgram","uniform1f","uniformLocations","uTime","frameCount","uFrameCount","uCenterAnimTime","uniform2f","iResolution","uDpr","uniform4f","uVisibleUvBounds","animateCycleReps","cycleRepetitionsStartFrame","elapsed","cycleProgress","cycleRepetitionsDuration","pingPong","eased","delta","cycleRepetitionsEnd","cycleRepetitionsStart","uCycleRepetitions","targetBlend","gradientMapBlend","currentGradientMapBlend","speed","gradientMapBlendDuration","diff","step","sign","uGradientMapBlend","drawArrays","TRIANGLES","level","display","_LEVEL_RENDER_SETTING","LEVEL_RENDER_SETTINGS","isInitialized","handleResize","_objectSpread","DEFAULT_CONFIG","querySelector","styleElement","createElement","innerHTML","setAttribute","head","prepend","getContext","antialias","premultipliedAlpha","depth","alpha","powerPreference","pixelStorei","UNPACK_FLIP_Y_WEBGL","disable","DEPTH_TEST","CULL_FACE","clearColor","initProgram","performanceController","WebGLPerformanceController","onLevelChange","handlePerformanceLevelChange","stopIfPotato","setupPositionAttribute","setupUniformLocations","addEventListener","handleVisualViewportChange","handleDocumentVisibilityChange","_createClass","key","value","_this$performanceCont","isPotato","Error","_loadAssets","_asyncToGenerator","_regeneratorRuntime","mark","_callee","_this$assets$gradient","useStaticImage","gradientMap2Src","_yield$Promise$all","_yield$Promise$all2","baseAsset","gradientMap","gradientMap2","centerGradientMap","_t","wrap","_context","prev","next","Boolean","imageSrc","gradientMapSrc","Promise","all","loadImage","loadVideo","videoSrc","centerGradientMapSrc","sent","_slicedToArray","setupImageTexture","setupVideoTexture","playbackRate","e","setAllUniforms","error","stop","loadAssets","apply","createProgram","rzpGlassVertexShader","rzpGlassFragmentShader","buffers","setupFullscreenQuad","uniformNames","_i","_uniformNames","name","getUniformLocation","_this2","Texture","textureUnit","updateVideoFrame","videoFrameCallbackId","requestVideoFrameCallback","uniformName","image","texture","gradientMapTexture","gradientMap2Texture","centerGradientMapTexture","updateGradientMapTexture","source","_this3","ResizeObserver","_ref","_ref2","entry","borderBoxSize","_entry$devicePixelCon","physicalPixelSize","devicePixelContentBoxSize","inlineSize","blockSize","observe","uniform1i","uVideoTexture","uGradientMap","uCenterGradientMap","uGradientMap2","setUniformValues","uPan","panX","panY","uRefResolution","backgroundColor","_this$config$backgrou","r","g","b","uniform3f","uBackgroundColor","areUniformValuesEqual","a","_this4","Array","isArray","every","val","i","_this5","Object","entries","forEach","_ref3","_ref4","uniformCache","location","flatArray","flat","uniform2fv","uniform3fv","uniform4fv","panCacheKey","panValue","bgCacheKey","_config$backgroundCol","setUniforms","newConfig","_this$video3","_this$video4","cancelAnimationFrame","getCurrentFrame","setFrame","newFrame","setMaxPixelCount","newMaxPixelCount","setMinPixelRatio","newMinPixelRatio","_this$video5","_this$video6","setTime","time","dispose","_this$performanceCont2","_visualViewport3","cancelVideoFrameCallback","src","load","_this$videoTexture","_this$gradientMapText","_this$gradientMap2Tex","_this$centerGradientM","destroy","deleteProgram","bindBuffer","ARRAY_BUFFER","ELEMENT_ARRAY_BUFFER","bindRenderbuffer","RENDERBUFFER","bindFramebuffer","FRAMEBUFFER","getError","removeEventListener","remove","removeAttribute"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
var rzpGlassVertexShader = /* glsl */"\nprecision mediump float;\n\nattribute vec2 position;\nattribute vec2 uv;\n\n// Zoom & Pan uniforms (computed in vertex shader for efficiency)\nuniform float uZoom;\nuniform vec2 uPan; // vec2(uPanX, uPanY)\n\n// Output varyings\nvarying vec2 vUv; // Raw screen UV (for screen-space effects like feathering)\nvarying vec2 vContentUv; // Transformed UV for video/content sampling (zoom + pan applied)\n\nvoid main() {\n // Raw screen UV for screen-space effects\n vUv = uv;\n \n // Compute zoomed/panned UV for content sampling\n // Zoom: scale around center (0.5, 0.5)\n // Pan: offset the view\n vContentUv = (uv - 0.5) / uZoom + 0.5;\n vContentUv += uPan;\n \n gl_Position = vec4(position, 0, 1);\n}\n";
|
|
2
|
-
var rzpGlassFragmentShader = /* glsl */"\nprecision mediump float;\n\nuniform float uTime;\nuniform vec2 iResolution;\nuniform float uDpr;\nuniform sampler2D uVideoTexture;\nuniform sampler2D uGradientMap;\nuniform sampler2D uGradientMap2; // Second gradient map for cross-fade blending\nuniform sampler2D uCenterGradientMap; // Separate gradient map for center ellipse\n\n// Layer toggles (enable/disable actual effects)\nuniform float uEnableDisplacement;\nuniform float uEnableColorama;\nuniform float uEnableBloom;\nuniform float uEnableLightSweep;\n\n// ============================================\n// COLORAMA UNIFORMS (Adobe AE v5 Pipeline)\n// Pipeline: Scalar \u2192 Remap \u2192 Warp \u2192 Wrap \u2192 Lookup \u2192 Blend\n// ============================================\n\n// --- 1. INPUT PHASE (Scalar Index Generation) ---\nuniform float uInputMin; // Input range min (default 0.0)\nuniform float uInputMax; // Input range max (default 1.0)\n\n// --- 2. MODIFY PHASE (Index Space Warping) ---\nuniform float uModifyGamma; // Gamma curve: <1 = brights, >1 = darks (default 1.0)\nuniform float uPosterizeLevels; // 0 = off, >0 = number of discrete steps\nuniform float uCycleRepetitions; // Stretch/compress the index (default 1.0)\nuniform float uPhaseShift; // Static offset (default 0.0)\nuniform float uCycleSpeed; // Cycling animation speed (default 0.0)\n\n// --- 3. OUTPUT CYCLE (Wrap & Lookup) ---\nuniform float uWrapMode; // 0 = clamp, 1 = wrap/fract (default 1.0)\nuniform float uReverse; // 0 = normal, 1 = reverse gradient (default 0.0)\n\n// --- 4. COMPOSITE ---\nuniform float uBlendWithOriginal; // 0 = full effect, 1 = original (default 0.0)\nuniform float uGradientMapBlend; // 0 = uGradientMap, 1 = uGradientMap2 (default 0.0)\n\n// --- 5. LIGHT EFFECT ---\nuniform float uLightIntensity; // Strength of light sweep effect\nuniform float uFrameCount; // Current frame number\nuniform float uLightStartFrame; // Frame when light effect starts\n\n// --- 6. DISPLACEMENT ---\nuniform float uNumSegments; // Number of glass slits (default 45.0)\nuniform float uSlitAngle; // Angle of slits in radians (default 0.13)\nuniform float uDisplacementX; // X displacement amount (default -12.0)\nuniform float uDisplacementY; // Y displacement amount (default -20.0)\n\n// --- 7. CENTER ELEMENT ---\nuniform float uEnableCenterElement; // Toggle center element (0 = off, 1 = on)\nuniform float uCenterAnimDuration; // Duration of one animation cycle in seconds\nuniform float uCenterAnimTime; // Current animation time in seconds (resets with video loop)\n\n// --- 8. COLOR CORRECTION ---\nuniform float uCCBlackPoint; // Levels black point (default 0.0)\nuniform float uCCWhitePoint; // Levels white point (default 1.0)\nuniform float uCCMidtoneGamma; // Midtone gamma (default 1.2)\nuniform float uCCGamma; // Output gamma (default 1.2)\nuniform float uCCContrast; // Contrast boost (default 0.0)\n\n// --- 9. ZOOM & PAN ---\nuniform float uZoom; // Zoom level (1.0 = normal, 2.0 = 2x zoom) - still needed for edge feather check\nuniform vec4 uEdgeFeather; // Per-side feathering: vec4(top, right, bottom, left) clockwise, 0 = none, 1 = max\nuniform vec2 uRefResolution; // Reference resolution for zoom-independent displacement\nuniform vec4 uVisibleUvBounds; // vec4(minX, minY, maxX, maxY) - visible portion of canvas in container\n\n// --- 10. BACKGROUND COLOR ---\nuniform vec3 uBackgroundColor; // Background color to blend with (RGB 0-1)\n\n// UV coordinates from the vertex shader\nvarying vec2 vUv; // Raw screen UV (for screen-space effects)\nvarying vec2 vContentUv; // Transformed UV with zoom/pan applied (for content sampling)\n\n// ============================================\n// UTILITY FUNCTIONS\n// ============================================\n// Rec. 709 luminance calculation\nfloat luminance(vec3 color) {\n return dot(color, vec3(0.2126, 0.7152, 0.0722));\n}\n\n// ============================================\n// COLORAMA EFFECT (Adobe After Effects v5 Pipeline)\n// ============================================\n//\n// Pipeline:\n// Image \u2192 Scalar Field (0-1) \u2192 Warp/Animate \u2192 Gradient Lookup \u2192 Composite\n//\n// This matches AE's indexed gradient remapping with time-domain cycling.\nvec3 applyColoramaWithGradient(\n sampler2D gradientMap, // Gradient map texture to sample from\n float rawIntensity, // Raw luminance from pixel\n float inputMin, // Input range min\n float inputMax, // Input range max\n float gamma, // Gamma curve (pow)\n float posterizeLevels, // 0 = off, else discrete steps\n float cycleReps, // Cycle repetitions (stretch)\n float phaseShift, // Static offset\n float cycleSpeed, // Time-based cycling\n float wrapMode, // 0 = clamp, 1 = wrap\n float reverse // 0 = normal, 1 = flip\n) {\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // STEP 1: INPUT PHASE - Scalar Index Generation\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Normalize intensity to input range\n float t = clamp((rawIntensity - inputMin) / (inputMax - inputMin), 0.0, 1.0);\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // STEP 2: MODIFY PHASE - Index Space Warping\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n // a) Gamma / Curves - reshape the intensity distribution\n t = pow(t, gamma);\n\n // b) Posterize - quantize to discrete levels (branchless)\n // When posterizeLevels <= 0, keeps t unchanged\n float posterized = floor(t * posterizeLevels + 0.0001) / max(posterizeLevels, 0.0001);\n t = mix(t, posterized, step(0.001, posterizeLevels));\n\n // c) Cycle Repetitions - stretch/compress across gradient\n t = t * cycleReps;\n\n // d) Phase Shift - static offset\n t = t + phaseShift;\n\n // e) Cycling Animation - time-based offset\n t = t + cycleSpeed * uTime;\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // STEP 3: OUTPUT CYCLE - Wrap & Lookup (branchless)\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n // Wrap (fract) vs Clamp - branchless selection\n t = mix(clamp(t, 0.0, 1.0), fract(t), step(0.5, wrapMode));\n\n // Reverse direction - branchless\n t = mix(t, 1.0 - t, step(0.5, reverse));\n\n // Gradient lookup (1D texture sample)\n return texture2D(gradientMap, vec2(t, 0.5)).rgb;\n}\n\n// ============================================\n// DISPLACEMENT FUNCTIONS\n// ============================================\n// Create striped displacement map for glass refraction effect\n// Returns: x = signed displacement (-1 to 1), y = local UV x position within segment\n// gradientStart: gradient value at left edge (typically 1.0 for white)\n// gradientEnd: gradient value at right edge (typically 0.0 for black)\n// gradientPower: power curve for falloff (1.0 = linear, <1.0 = steeper, >1.0 = gentler)\n// centerPoint: center value for signed conversion (typically 0.5)\n// aspect: screen aspect ratio (width/height) for consistent slit angle\nvec2 createStripedDisplacement(\n vec2 uv,\n float numSegments,\n float angle,\n float gradientStart,\n float gradientEnd,\n float gradientPower,\n float centerPoint,\n float aspect\n) {\n // Work in aspect-corrected UV space where x and y have equal visual scale\n // This ensures consistent slit angle regardless of viewport dimensions\n vec2 aspectUV = uv * vec2(aspect, 1.0);\n \n // Apply slant in aspect-corrected space\n float slantedX = aspectUV.x - aspectUV.y * tan(angle);\n\n // Calculate segment properties (account for aspect-scaled x range)\n float segmentWidth = aspect / numSegments;\n float localUVx = fract(slantedX / segmentWidth); // 0-1 within each segment\n\n // Create the displacement map gradient\n // Use smoothstep for smoother interpolation\n float smoothUVx = smoothstep(0.0, 1.0, localUVx);\n // Interpolate from gradientEnd (left) to gradientStart (right)\n float rawGradient = mix(gradientEnd, gradientStart, smoothUVx);\n\n // Apply power curve for falloff control\n rawGradient = pow(rawGradient, gradientPower);\n\n // Convert to signed displacement (-1 to 1) using centerPoint\n // centerPoint is the neutral value (typically 0.5)\n float signedDisplacement = (rawGradient - centerPoint) / centerPoint;\n\n return vec2(signedDisplacement, localUVx);\n}\n\n// Apply displacement offset to UV coordinates\nvec2 applyDisplacement(vec2 uv, float signedDisplacement, vec2 maxDisplacement, vec2 resolution) {\n vec2 displaceOffset = vec2(\n signedDisplacement * maxDisplacement.x / resolution.x,\n signedDisplacement * maxDisplacement.y / resolution.y\n );\n return uv + displaceOffset;\n}\n\n// Create thin slanted stripes with multi-stop gradient color\n// Returns RGB color: gradient stripes with 3 color stops\n// Stop 1 (0%): colorStart, Stop 2 (stopPosition): colorMid, Stop 3 (100%): transparent\nvec4 createStripes(\n vec2 uv,\n float numSegments,\n float angle,\n float stopPosition, // Position of middle stop (0.0 to 1.0)\n vec4 colorStart, // Color at 0% (left edge)\n vec4 colorMid, // Color at stopPosition\n float aspect // Screen aspect ratio for consistent angle\n) {\n // Work in aspect-corrected UV space where x and y have equal visual scale\n vec2 aspectUV = uv * vec2(aspect, 1.0);\n \n // Apply slant in aspect-corrected space\n float slantedX = aspectUV.x - aspectUV.y * tan(angle);\n\n // Calculate segment properties (account for aspect-scaled x range)\n float segmentWidth = aspect / numSegments;\n float localUVx = 1.0 - fract(slantedX / segmentWidth); // 0-1 within each segment, reversed\n\n // Multi-stop gradient:\n // 0% -> colorStart (green)\n // stopPosition -> colorMid (white)\n // 100% -> transparent (black with 0 opacity)\n\n vec4 gradientColor;\n float opacity;\n\n if (localUVx < stopPosition) {\n float t = localUVx / stopPosition;\n gradientColor = mix(colorMid, colorStart, t);\n opacity = 0.5;\n } else {\n float t = (localUVx - stopPosition) / (1.0 - stopPosition);\n gradientColor = mix(vec4(0.0), colorMid, t);\n opacity = 0.5 - t * 0.5;\n }\n\n return gradientColor * opacity;\n}\n\n// Sample texture with displacement applied\nvec4 sampleWithDisplacement(\n sampler2D tex,\n vec2 uv,\n float signedDisplacement,\n vec2 maxDisplacement,\n vec2 resolution\n) {\n vec2 displacedUV = applyDisplacement(uv, signedDisplacement, maxDisplacement, resolution);\n return texture2D(tex, displacedUV);\n}\n\n// ============================================\n// POST-PROCESSING EFFECTS\n// ============================================\nvec3 applyBloom(vec3 color, float intensity, float innerMask) {\n const float whiteCoreThresholdMin = 0.5; // Start of white core mask\n const float whiteCoreThresholdMax = 0.85; // End of white core mask\n const float whiteCoreBlendStrength = 0.85; // How much to blend towards pure white\n\n const float bloomThresholdMin = 0.3; // Start of bloom glow\n const float bloomThresholdMax = 0.7; // End of bloom glow\n const vec3 bloomColor = vec3(1.0, 0.99, 0.97); // Warm white bloom tint\n const float bloomStrength = 0.10; // Intensity of bloom glow\n // -------------------------------\n\n // Calculate how much we're in the \"center\" bright area\n // Use a tighter threshold for the white core\n float whiteCoreMask = smoothstep(whiteCoreThresholdMin, whiteCoreThresholdMax, intensity) * innerMask;\n\n // Pure white target\n vec3 pureWhite = vec3(1.0);\n\n // Blend the center towards pure white (not additive, but replacement blend)\n // This ensures the very center goes to white, not gray\n color = mix(color, pureWhite, whiteCoreMask * whiteCoreBlendStrength);\n\n // Additional soft bloom glow around the white core\n float bloomBase = smoothstep(bloomThresholdMin, bloomThresholdMax, intensity);\n float bloomAmount = bloomBase * innerMask;\n color += bloomColor * bloomAmount * bloomStrength;\n\n return color;\n}\n\n// ============================================\n// ANIMATED POLYGON SHAPE\n// ============================================\n// Struct to return shape data\nstruct ShapeData {\n float shape; // The shape value (0 = outside, 1 = center)\n float gradient; // Gradient from gray (edge) to white (center)\n};\n\n// Signed distance function for a regular polygon\n// p: point to test, r: radius, n: number of sides\nfloat sdPolygon(vec2 p, float r, float n) {\n // Angle and radius\n float an = 3.141593 / n;\n vec2 acs = vec2(cos(an), sin(an));\n\n // Reduce to first sector\n float bn = mod(atan(p.x, p.y), 2.0 * an) - an;\n p = length(p) * vec2(cos(bn), abs(sin(bn)));\n\n // Line sdf\n p -= r * acs;\n p.y += clamp(-p.y, 0.0, r * acs.y);\n\n return length(p) * sign(p.x);\n}\n\n// Fast signed distance function for an ellipse\n// Approximation that avoids expensive acos(), cube roots, and branching\n// Accurate enough for visual effects, ~5x faster than exact version\nfloat sdEllipse(vec2 p, vec2 ab) {\n // Normalize point by ellipse radii\n vec2 q = p / ab;\n float k1 = length(q);\n \n // Early out for points very close to center (avoid division issues)\n if (k1 < 0.0001) return -min(ab.x, ab.y);\n \n // Gradient-based distance approximation\n vec2 q2 = q / ab; // Second normalization for gradient\n float k2 = length(q2);\n \n return k1 * (k1 - 1.0) / k2;\n}\n\n// Helper: Calculate a single shape instance at a given animation phase\nShapeData calculateSingleShape(\n vec2 uv,\n float linearT, // Animation phase 0-1\n float solidCoreMask,\n vec2 resolution,\n // Shape parameters\n float shapeType,\n float shapeWidth,\n float shapeHeight,\n float centerY,\n float animRange,\n float edgeSoftness,\n float grayLevel,\n float shapeAngleStart,\n float shapeAngleEnd,\n float shapeSize\n) {\n // Map 0-1 to position range (left to right)\n float posOffset = (linearT * 2.0 - 1.0) * animRange;\n float centerX = 0.5 + posOffset;\n\n // Animate rotation\n float animatedAngle = mix(shapeAngleStart, shapeAngleEnd, linearT);\n\n // Correct for aspect ratio\n float aspect = resolution.x / resolution.y;\n\n // Calculate position relative to center\n vec2 shapeCenter = vec2(centerX, centerY);\n vec2 delta = uv - shapeCenter;\n\n // Rotate delta by animated angle FIRST\n float cosA = cos(animatedAngle);\n float sinA = sin(animatedAngle);\n vec2 rotatedDelta = vec2(\n delta.x * cosA - delta.y * sinA,\n delta.x * sinA + delta.y * cosA\n );\n\n // Apply aspect correction AFTER rotation\n rotatedDelta.x *= aspect;\n\n // Calculate distance based on shape type\n float dist;\n if (shapeType < 0.5) {\n dist = sdEllipse(rotatedDelta, vec2(shapeWidth, shapeHeight));\n } else {\n vec2 scaledDelta = rotatedDelta / vec2(shapeWidth, shapeHeight);\n dist = sdPolygon(scaledDelta, shapeSize / min(shapeWidth, shapeHeight), shapeType);\n dist *= min(shapeWidth, shapeHeight);\n }\n\n // Normalize distance for gradient\n float normalizedDist;\n if (shapeType < 0.5) {\n normalizedDist = dist / max(shapeWidth, shapeHeight) + 1.0;\n } else {\n normalizedDist = (dist / shapeSize) + 1.0;\n }\n normalizedDist = clamp(normalizedDist, 0.0, 1.0);\n\n // Create soft shape mask\n float shapeMask = 1.0 - smoothstep(-edgeSoftness * 0.1, edgeSoftness * 0.05, dist);\n\n // Create gradient\n float gradient = mix(1.0, grayLevel, smoothstep(0.0, 1.0, normalizedDist));\n\n // Apply solid core mask\n shapeMask *= solidCoreMask;\n\n ShapeData result;\n result.shape = shapeMask;\n result.gradient = gradient;\n return result;\n}\n\n// Creates two staggered animated shapes that move left-to-right\n// When one reaches the far edge, another appears from the left\nShapeData calculateAnimatedShape(\n vec2 uv,\n float time, // Current animation time in seconds\n float solidCoreMask,\n vec2 resolution\n) {\n // --- Configurable parameters ---\n const float shapeType = 3.0; // 0 = ellipse, 3 = triangle, 4 = square, 5 = pentagon, etc.\n const float shapeWidth = 0.1; // Width/horizontal scale (wide)\n const float shapeHeight = 0.8; // Height/vertical scale (short)\n const float centerY = 0.4; // Vertical center position\n float cycleDuration = uCenterAnimDuration; // Seconds per animation cycle (from uniform)\n const float animRange = 0.7; // How far left/right it travels\n const float edgeSoftness = 0.5; // Softness of shape edge\n const float grayLevel = 0.5; // Gray color at shape edge\n const float shapeAngleStart = 0.6; // Rotation angle at start (slight tilt)\n const float shapeAngleEnd = 0.1; // Rotation angle at end (opposite tilt)\n const float shapeSize = 0.4; // Overall size for polygon mode\n const float staggerOffset = 0.4; // Offset between the two shapes (0.5 = half cycle apart)\n const float shape2Scale = 1.3; // Scale multiplier for 2nd shape (1.0 = same size)\n // -------------------------------\n\n // Time-based animation: time / cycleDuration gives progress through cycle\n float linearT1 = fract(time / cycleDuration); // Shape 1: 0->1 repeating\n float linearT2 = fract(time / cycleDuration + staggerOffset); // Shape 2: offset by staggerOffset\n\n // Calculate both shapes (shape 2 is slightly larger)\n ShapeData shape1 = calculateSingleShape(\n uv, linearT1, solidCoreMask, resolution,\n shapeType, shapeWidth, shapeHeight, centerY, animRange,\n edgeSoftness, grayLevel, shapeAngleStart, shapeAngleEnd, shapeSize\n );\n\n ShapeData shape2 = calculateSingleShape(\n uv, linearT2, solidCoreMask, resolution,\n shapeType, shapeWidth * shape2Scale, shapeHeight * shape2Scale, centerY, animRange,\n edgeSoftness, grayLevel, shapeAngleStart, shapeAngleEnd, shapeSize * shape2Scale\n );\n\n // Combine both shapes (take max of masks, blend gradients)\n ShapeData result;\n result.shape = max(shape1.shape, shape2.shape);\n // Weighted average of gradients based on shape masks\n float totalMask = shape1.shape + shape2.shape;\n if (totalMask > 0.001) {\n result.gradient = (shape1.gradient * shape1.shape + shape2.gradient * shape2.shape) / totalMask;\n } else {\n result.gradient = 0.5;\n }\n\n return result;\n}\n\n// Apply shape effect to intensity (for colorama/displacement pipeline)\nfloat applyShapeToIntensity(\n float baseIntensity,\n ShapeData shapeData,\n float effectStrength\n) {\n // Blend the shape gradient into the base intensity\n // This makes the shape area brighter/differently colored through colorama\n float shapeContribution = shapeData.gradient * shapeData.shape;\n return mix(baseIntensity, shapeContribution, shapeData.shape * effectStrength);\n}\n\n\n// AE-style color processing (levels, gamma, contrast). Used in both ripple and normal mode.\nvec3 applyColorCorrection(vec3 color) {\n color = (color - uCCBlackPoint) / (uCCWhitePoint - uCCBlackPoint);\n color = pow(max(color, vec3(0.0)), vec3(1.0 / (uCCMidtoneGamma * uCCGamma)));\n color = color * (1.0 + uCCContrast) - uCCContrast * 0.5;\n return clamp(color, 0.0, 1.0);\n}\n\n// Feather at container edges (visible bounds). Used in both ripple and normal mode.\nvec3 applyEdgeFeathering(vec3 color) {\n // Apply edge feathering when zoomed in\n // Feathering is applied at the container edges (visible bounds), not canvas edges\n // uEdgeFeather = vec4(top, right, bottom, left) \u2014 clockwise like CSS\n if (any(greaterThan(uEdgeFeather, vec4(0.0)))) {\n vec2 screenUV = vUv;\n\n // Get visible UV bounds (where container clips the canvas)\n float visMinX = uVisibleUvBounds.x;\n float visMinY = uVisibleUvBounds.y;\n float visMaxX = uVisibleUvBounds.z;\n float visMaxY = uVisibleUvBounds.w;\n\n // Calculate visible dimensions in UV space for aspect-correct feathering on X axis\n float visibleWidth = visMaxX - visMinX;\n float visibleHeight = visMaxY - visMinY;\n float visibleAspect = visibleWidth / visibleHeight;\n\n // Per-side feather amounts (X sides get aspect correction for pixel-equal width)\n float featherTop = uEdgeFeather.x * 0.15 / visibleAspect;\n float featherRight = uEdgeFeather.y * 0.15 / visibleAspect;\n float featherBottom = uEdgeFeather.z * 0.15 / visibleAspect;\n float featherLeft = uEdgeFeather.w * 0.15 / visibleAspect;\n\n // Apply feathering at container edges (visible bounds)\n float left = smoothstep(visMinX, visMinX + featherLeft, screenUV.x);\n float right = smoothstep(visMaxX, visMaxX - featherRight, screenUV.x);\n float bottom = smoothstep(visMinY, visMinY + featherBottom, screenUV.y);\n float top = smoothstep(visMaxY, visMaxY - featherTop, screenUV.y);\n\n float edgeMask = left * right * bottom * top;\n color = mix(vec3(1.0), color, edgeMask);\n }\n return color;\n}\n\nvoid main() {\n // ============================================\n // LAYER 1: Base glass effect (fine slits, whole image)\n // ============================================\n float numSegments = uNumSegments;\n float angle = uSlitAngle;\n const float blurRadius = 9.0;\n const float sigma = 4.0;\n\n // Calculate aspect ratio for consistent slit angles\n float aspect = iResolution.x / iResolution.y;\n\n // Displacement parameters (in pixels, scaled by DPR)\n // Scale displacement by reference resolution ratio to maintain consistency across browser zoom levels\n float resolutionScale = iResolution.x / uRefResolution.x;\n vec2 maxDisplacement = vec2(uDisplacementX, uDisplacementY) * uDpr * resolutionScale;\n\n // Use pre-computed UV from vertex shader (zoom + pan already applied)\n vec2 uv = vContentUv;\n\n // Base displacement (fine slits)\n // Use raw screen UV (vUv) so slit positions stay fixed on screen regardless of pan/zoom\n float gradientStart = 1.0;\n float gradientEnd = 0.0;\n float gradientPower = 1.0;\n float centerPoint = 0.5;\n vec2 displacementData = createStripedDisplacement(\n vUv,\n numSegments,\n angle,\n gradientStart,\n gradientEnd,\n gradientPower,\n centerPoint,\n aspect\n );\n float signedDisplacement = displacementData.x;\n float localUVx = displacementData.y;\n\n // ============================================\n // LAYER 2: Inner glass effect (larger slits, center only, STATIC)\n // ============================================\n // Inner segments are a divisor of outer segments for perfect alignment\n // 45 / 5 = 9 segments (5x larger slits that align with outer grid)\n float innerNumSegments = numSegments;\n float innerAngle = angle; // Same angle as outer\n\n // Inner slits are STATIC - use raw screen UV so slits stay fixed on screen\n vec2 innerDisplacementData = createStripedDisplacement(\n vUv,\n innerNumSegments,\n innerAngle,\n gradientStart,\n gradientEnd,\n gradientPower,\n centerPoint,\n aspect\n );\n float innerSignedDisplacement = innerDisplacementData.x;\n float innerLocalUVx = innerDisplacementData.y;\n\n // ============================================\n // COMPUTE SOLID CORE MASK EARLY (needed for light & displacement masking)\n // ============================================\n vec4 videoFrameSample = texture2D(uVideoTexture, uv);\n float maskIntensity = luminance(videoFrameSample.rgb);\n float solidCoreMask = smoothstep(0.4, 0.7, maskIntensity);\n\n // Store original displacement for shape refraction (before masking)\n float originalInnerDisplacement = innerSignedDisplacement;\n\n // Mask inner displacement by solidCoreMask - no inner displacement in center\n innerSignedDisplacement *= (1.0 - solidCoreMask);\n\n // Inner layer displacement uses same values (scaled by resolutionScale for zoom independence)\n vec2 innerMaxDisplacement = vec2(30.0, 0.0) * uDpr * resolutionScale;\n\n // ============================================\n // CENTER ELEMENT (Static Ellipse + Animated Shapes)\n // ============================================\n float staticEllipseMask = 0.0;\n float staticEllipseGradient = 0.0;\n ShapeData shapeData;\n shapeData.shape = 0.0;\n shapeData.gradient = 0.0;\n\n float centerFadeInDuration = 10.0;\n float centerFramesSinceStart = uFrameCount - uLightStartFrame;\n float centerEffectActivation = clamp(centerFramesSinceStart / centerFadeInDuration, 0.0, 1.0);\n\n if (uEnableCenterElement > 0.5) {\n // Calculate static ellipse mask\n {\n const float ellipseCenterX = 0.3;\n const float ellipseCenterY = -0.15;\n const float ellipseWidth = 0.5;\n const float ellipseHeight = 0.8;\n const float ellipseAngle = 0.3;\n const float ellipseSoftness = 1.0;\n const float ellipseGrayLevel = 0.5;\n\n float aspect = iResolution.x / iResolution.y;\n\n // Use RAW UV (no displacement) for the mask calculation\n vec2 delta = uv - vec2(ellipseCenterX, ellipseCenterY);\n\n // Rotate\n float cosA = cos(ellipseAngle);\n float sinA = sin(ellipseAngle);\n vec2 rotatedDelta = vec2(\n delta.x * cosA - delta.y * sinA,\n delta.x * sinA + delta.y * cosA\n );\n rotatedDelta.x *= aspect;\n\n // Calculate ellipse distance\n float ellipseDist = sdEllipse(rotatedDelta, vec2(ellipseWidth, ellipseHeight));\n\n // Soft shape mask\n staticEllipseMask = 1.0 - smoothstep(-ellipseSoftness * 0.1, ellipseSoftness * 0.05, ellipseDist);\n\n // Gradient\n float normalizedDist = ellipseDist / max(ellipseWidth, ellipseHeight) + 1.0;\n normalizedDist = clamp(normalizedDist, 0.0, 1.0);\n staticEllipseGradient = mix(1.0, ellipseGrayLevel, smoothstep(0.0, 1.0, normalizedDist));\n\n // Apply solid core mask\n staticEllipseMask *= solidCoreMask;\n }\n\n // Block displacement inside the static ellipse\n originalInnerDisplacement *= (1.0 - staticEllipseMask);\n innerSignedDisplacement *= (1.0 - staticEllipseMask);\n signedDisplacement *= (1.0 - staticEllipseMask);\n\n\n\n // Calculate displaced UV for shape - use inner displacement for the shape refraction\n vec2 shapeDisplacedUV = applyDisplacement(uv, originalInnerDisplacement, innerMaxDisplacement, iResolution);\n\n // Calculate animated shape using DISPLACED UVs so glass slits refract through it\n shapeData = calculateAnimatedShape(\n shapeDisplacedUV, // Use displaced UVs!\n uCenterAnimTime, // Time-based animation in seconds (resets with video loop)\n solidCoreMask,\n iResolution\n );\n\n // Combine static ellipse with animated shapes\n {\n float combinedShape = max(shapeData.shape, staticEllipseMask) * centerEffectActivation;\n float totalMask = shapeData.shape + staticEllipseMask;\n float combinedGradient = shapeData.gradient;\n if (totalMask > 0.001) {\n combinedGradient = (shapeData.gradient * shapeData.shape + staticEllipseGradient * staticEllipseMask) / totalMask;\n }\n shapeData.shape = combinedShape;\n shapeData.gradient = combinedGradient;\n }\n }\n\n // ============================================\n // INNER EFFECT ACTIVATION - starts after uLightStartFrame\n // ============================================\n float innerFadeInDuration = 10.0; // Slower fade-in for inner effect\n float innerFramesSinceStart = uFrameCount - uLightStartFrame;\n float innerEffectActivation = clamp(innerFramesSinceStart / innerFadeInDuration, 0.0, 1.0);\n\n // Create edge mask (solidCoreMask already computed earlier for light masking)\n float edgeMask = smoothstep(0.3, 0.6, maskIntensity); // Where shape starts\n\n // Blend outer and inner slits on the edges\n // Inner contribution is multiplied by activation (fades in after frame 200)\n float outerContribution = 1.0 - edgeMask * 0.5 * innerEffectActivation;\n float innerContribution = edgeMask * innerEffectActivation;\n\n // Combined displacement: inner effect fades in over time\n float combinedDisplacement = signedDisplacement * outerContribution +\n innerSignedDisplacement * innerContribution;\n\n // Blend max displacement smoothly\n vec2 combinedMaxDisplacement = maxDisplacement * outerContribution +\n innerMaxDisplacement * innerContribution;\n\n // For the CENTER area (solidCoreMask): use 100% inner (larger) slits displacement\n // For the EDGES: use the combined displacement (blended outer + inner)\n // This ensures the logo center always has the larger slits\n combinedDisplacement = mix(combinedDisplacement, originalInnerDisplacement, solidCoreMask);\n combinedMaxDisplacement = mix(combinedMaxDisplacement, innerMaxDisplacement, solidCoreMask);\n\n // ============================================\n // LAYER 1: DISPLACEMENT (toggleable)\n // ============================================\n vec4 textureSample;\n if (uEnableDisplacement > 0.5) {\n textureSample = sampleWithDisplacement(\n uVideoTexture, uv,\n combinedDisplacement, combinedMaxDisplacement,\n iResolution\n );\n } else {\n // No displacement - sample directly\n textureSample = texture2D(uVideoTexture, uv);\n }\n\n // Blend localUVx for highlights - also fades in with activation\n float combinedLocalUVx = localUVx * outerContribution + innerLocalUVx * innerContribution;\n localUVx = combinedLocalUVx;\n\n // Store innerMask for later use (bloom, etc.) - also tied to activation\n float innerMask = edgeMask * innerEffectActivation;\n\n // Get Phase From: Intensity (Rec. 709 luminance)\n float baseIntensity = luminance(textureSample.rgb);\n\n // Boost intensity in center areas to push them more towards white\n float centerWhiteBoost = 0.1;\n baseIntensity = baseIntensity + innerMask * centerWhiteBoost;\n baseIntensity = clamp(baseIntensity, 0.0, 1.0);\n\n // Keep base intensity for outer colorama (using uGradientMap)\n float outerIntensity = baseIntensity;\n\n // ============================================\n // CENTER GREEN STRIPES OVERLAY (before colorama)\n // ============================================\n float stripeFadeOutDuration = 10.0;\n float stripeFramesSinceStart = uFrameCount - uLightStartFrame;\n // Effect is active UNTIL uLightStartFrame, then fades out\n float stripeEffectActivation = 1.0 - clamp(stripeFramesSinceStart / stripeFadeOutDuration, 0.0, 1.0);\n\n // Animated vertical height mask - grows from 0 to full height\n // Height animation: starts at center (0.5) and expands outward\n float stripeHeightDelay = 15.0; // frames to wait before starting\n float stripeHeightGrowDuration = 80.0; // frames to reach full height\n float stripeHeightProgress = clamp((uFrameCount - stripeHeightDelay) / stripeHeightGrowDuration, 0.0, 1.0);\n // Ease the progress for smoother animation\n float easedHeightProgress = 1.0 - pow(1.0 - stripeHeightProgress, 2.0);\n \n // Calculate animated bounds - expand from center (0.5) outward\n float heightHalfSpan = 0.2 * easedHeightProgress; // 0.06 = half of the 0.12 total height (0.44 to 0.56)\n float softEdge = 0.1 * easedHeightProgress; // Soft edge also scales with progress\n float bottomEdge = 0.5 - heightHalfSpan - softEdge;\n float bottomFull = 0.5 - heightHalfSpan;\n float topFull = 0.5 + heightHalfSpan;\n float topEdge = 0.5 + heightHalfSpan + softEdge;\n \n // When progress is 0, force mask to 0 to avoid glitchy edge at y=0.5\n float stripeHeightMask = easedHeightProgress > 0.001 \n ? smoothstep(bottomEdge, bottomFull, uv.y) * smoothstep(topEdge, topFull, uv.y)\n : 0.0;\n\n vec4 centerGreenSlantedLines = createStripes(\n vUv + vec2(-0.0035, 0.0), // slight offset to avoid moir\xE9\n numSegments,\n uSlitAngle,\n 0.15, // stopPosition (20%)\n vec4(20.0/255.0, 200.0/255.0, 20.0/255.0, 0.2), // colorStart (green at 0%)\n vec4(0.0, 0.0, 0.0, 0.0), // colorMid (white at 20%)\n aspect // aspect ratio for consistent angle\n ) * solidCoreMask * stripeHeightMask;\n\n // Overlay green stripes on center element area\n float stripeOverlayMask = solidCoreMask * stripeEffectActivation;\n // Modify baseIntensity/outerIntensity with stripes before colorama\n vec4 stripedTexture = vec4(textureSample.rgb, 1.0) - centerGreenSlantedLines*0.7 * stripeOverlayMask;\n stripedTexture = clamp(stripedTexture, 0.0, 1.0);\n\n // Update intensity for colorama input\n float stripedIntensity = luminance(stripedTexture.rgb);\n outerIntensity = mix(baseIntensity, stripedIntensity, stripeOverlayMask);\n\n // ============================================\n // LAYER 2: COLORAMA (toggleable)\n // ============================================\n vec3 color;\n if (uEnableColorama > 0.5) {\n // OUTER colorama: uses base intensity, cross-fades between uGradientMap and uGradientMap2\n vec3 outerColoramaResult1 = applyColoramaWithGradient(\n uGradientMap, outerIntensity,\n uInputMin, uInputMax, uModifyGamma, uPosterizeLevels,\n uCycleRepetitions, uPhaseShift, uCycleSpeed,\n uWrapMode, uReverse\n );\n vec3 outerColoramaResult2 = applyColoramaWithGradient(\n uGradientMap2, outerIntensity,\n uInputMin, uInputMax, uModifyGamma, uPosterizeLevels,\n uCycleRepetitions, uPhaseShift, uCycleSpeed,\n uWrapMode, uReverse\n );\n vec3 outerColoramaResult = mix(outerColoramaResult1, outerColoramaResult2, uGradientMapBlend);\n\n // Start with outer colorama as base\n vec3 blendedColorama = outerColoramaResult;\n\n // CENTER colorama: only compute when inside shape (skip texture sample otherwise)\n // This saves a texture lookup + specular pow() for ~90% of pixels\n if (shapeData.shape > 0.001) {\n vec3 centerColoramaResult = applyColoramaWithGradient(\n uCenterGradientMap, shapeData.gradient,\n uInputMin, uInputMax, uModifyGamma, uPosterizeLevels,\n uCycleRepetitions, uPhaseShift, uCycleSpeed,\n uWrapMode, uReverse\n );\n\n // Add specular highlight to center (shiny reflection effect)\n float specularPower = 8.0; // Higher = tighter/smaller highlight\n float specularIntensity = 1.9; // Brightness of the specular\n float specular = pow(shapeData.gradient, specularPower) * specularIntensity;\n centerColoramaResult += vec3(specular); // Add bright highlight\n\n // Blend between outer and center colorama based on shape\n blendedColorama = mix(outerColoramaResult, centerColoramaResult, shapeData.shape);\n }\n\n color = mix(blendedColorama, textureSample.rgb, uBlendWithOriginal);\n } else {\n color = textureSample.rgb;\n }\n\n // Store intensity for bloom (use the blended value)\n float intensity = mix(outerIntensity, shapeData.gradient, shapeData.shape);\n\n // ============================================\n // LAYER 3: BLOOM (toggleable)\n // ============================================\n if (uEnableBloom > 0.5) {\n color = applyBloom(color, intensity, innerMask);\n }\n\n // ============================================\n // LAYER 4: SHAPE HIGHLIGHT (toggleable via light sweep toggle)\n // ============================================\n if (uEnableLightSweep > 0.5) {\n float lightFadeInDuration = 30.0;\n float framesSinceStart = uFrameCount - uLightStartFrame;\n float lightActivation = clamp(framesSinceStart / lightFadeInDuration, 0.0, 1.0);\n\n // Add subtle brightness boost at shape center\n float shapeHighlight = pow(shapeData.gradient, 2.0) * shapeData.shape;\n color += vec3(1.0) * shapeHighlight * 0.15 * uLightIntensity * lightActivation;\n }\n\n // Color correction and edge feathering (shared with ripple mode)\n color = applyColorCorrection(color);\n color = applyEdgeFeathering(color);\n\n // Blend with background color if provided (uBackgroundColor.r < 0 means not set)\n if (uBackgroundColor.r >= 0.0) {\n // Calculate luminance to determine how bright the pixel is\n float brightness = luminance(color);\n \n // Blend white/bright areas with background color\n // Bright areas (close to white) become the background color\n float blendStart = 0.98; // Start blending at this brightness\n float blendEnd = 1.0; // Fully background color at this brightness\n float blendAmount = smoothstep(blendStart, blendEnd, brightness);\n \n // Mix the shader color with background color\n color = mix(color, uBackgroundColor, blendAmount);\n }\n\n gl_FragColor = vec4(color, 1.0);\n}\n";
|
|
2
|
+
var rzpGlassFragmentShader = /* glsl */"\nprecision mediump float;\n\nuniform float uTime;\nuniform vec2 iResolution;\nuniform float uDpr;\nuniform sampler2D uVideoTexture;\nuniform sampler2D uGradientMap;\nuniform sampler2D uGradientMap2; // Second gradient map for cross-fade blending\nuniform sampler2D uCenterGradientMap; // Separate gradient map for center ellipse\n\n// Layer toggles (enable/disable actual effects)\nuniform float uEnableDisplacement;\nuniform float uEnableColorama;\nuniform float uEnableBloom;\nuniform float uEnableLightSweep;\n\n// ============================================\n// COLORAMA UNIFORMS (Adobe AE v5 Pipeline)\n// Pipeline: Scalar \u2192 Remap \u2192 Warp \u2192 Wrap \u2192 Lookup \u2192 Blend\n// ============================================\n\n// --- 1. INPUT PHASE (Scalar Index Generation) ---\nuniform float uInputMin; // Input range min (default 0.0)\nuniform float uInputMax; // Input range max (default 1.0)\n\n// --- 2. MODIFY PHASE (Index Space Warping) ---\nuniform float uModifyGamma; // Gamma curve: <1 = brights, >1 = darks (default 1.0)\nuniform float uPosterizeLevels; // 0 = off, >0 = number of discrete steps\nuniform float uCycleRepetitions; // Stretch/compress the index (default 1.0)\nuniform float uPhaseShift; // Static offset (default 0.0)\nuniform float uCycleSpeed; // Cycling animation speed (default 0.0)\n\n// --- 3. OUTPUT CYCLE (Wrap & Lookup) ---\nuniform float uWrapMode; // 0 = clamp, 1 = wrap/fract (default 1.0)\nuniform float uReverse; // 0 = normal, 1 = reverse gradient (default 0.0)\n\n// --- 4. COMPOSITE ---\nuniform float uBlendWithOriginal; // 0 = full effect, 1 = original (default 0.0)\nuniform float uGradientMapBlend; // 0 = uGradientMap, 1 = uGradientMap2 (default 0.0)\n\n// --- 5. LIGHT EFFECT ---\nuniform float uLightIntensity; // Strength of light sweep effect\nuniform float uFrameCount; // Current frame number\nuniform float uLightStartFrame; // Frame when light effect starts\n\n// --- 6. DISPLACEMENT ---\nuniform float uNumSegments; // Number of glass slits (default 45.0)\nuniform float uSlitAngle; // Angle of slits in radians (default 0.13)\nuniform float uDisplacementX; // X displacement amount (default -12.0)\nuniform float uDisplacementY; // Y displacement amount (default -20.0)\n\n// --- 7. CENTER ELEMENT ---\nuniform float uEnableCenterElement; // Toggle center element (0 = off, 1 = on)\nuniform float uCenterAnimDuration; // Duration of one animation cycle in seconds\nuniform float uCenterAnimTime; // Current animation time in seconds (resets with video loop)\n\n// --- 8. COLOR CORRECTION ---\nuniform float uCCBlackPoint; // Levels black point (default 0.0)\nuniform float uCCWhitePoint; // Levels white point (default 1.0)\nuniform float uCCMidtoneGamma; // Midtone gamma (default 1.2)\nuniform float uCCGamma; // Output gamma (default 1.2)\nuniform float uCCContrast; // Contrast boost (default 0.0)\n\n// --- 9. ZOOM & PAN ---\nuniform float uZoom; // Zoom level (1.0 = normal, 2.0 = 2x zoom) - still needed for edge feather check\nuniform vec4 uEdgeFeather; // Per-side feathering: vec4(top, right, bottom, left) clockwise, 0 = none, 1 = max\nuniform vec2 uRefResolution; // Reference resolution for zoom-independent displacement\nuniform vec4 uVisibleUvBounds; // vec4(minX, minY, maxX, maxY) - visible portion of canvas in container\n\n// --- 10. BACKGROUND COLOR ---\nuniform vec3 uBackgroundColor; // Background color to blend with (RGB 0-1)\n\n// UV coordinates from the vertex shader\nvarying vec2 vUv; // Raw screen UV (for screen-space effects)\nvarying vec2 vContentUv; // Transformed UV with zoom/pan applied (for content sampling)\n\n// ============================================\n// UTILITY FUNCTIONS\n// ============================================\n// Rec. 709 luminance calculation\nfloat luminance(vec3 color) {\n return dot(color, vec3(0.2126, 0.7152, 0.0722));\n}\n\n// ============================================\n// COLORAMA EFFECT (Adobe After Effects v5 Pipeline)\n// ============================================\n//\n// Pipeline:\n// Image \u2192 Scalar Field (0-1) \u2192 Warp/Animate \u2192 Gradient Lookup \u2192 Composite\n//\n// This matches AE's indexed gradient remapping with time-domain cycling.\nvec3 applyColoramaWithGradient(\n sampler2D gradientMap, // Gradient map texture to sample from\n float rawIntensity, // Raw luminance from pixel\n float inputMin, // Input range min\n float inputMax, // Input range max\n float gamma, // Gamma curve (pow)\n float posterizeLevels, // 0 = off, else discrete steps\n float cycleReps, // Cycle repetitions (stretch)\n float phaseShift, // Static offset\n float cycleSpeed, // Time-based cycling\n float wrapMode, // 0 = clamp, 1 = wrap\n float reverse // 0 = normal, 1 = flip\n) {\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // STEP 1: INPUT PHASE - Scalar Index Generation\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Normalize intensity to input range\n float t = clamp((rawIntensity - inputMin) / (inputMax - inputMin), 0.0, 1.0);\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // STEP 2: MODIFY PHASE - Index Space Warping\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n // a) Gamma / Curves - reshape the intensity distribution\n t = pow(t, gamma);\n\n // b) Posterize - quantize to discrete levels (branchless)\n // When posterizeLevels <= 0, keeps t unchanged\n float posterized = floor(t * posterizeLevels + 0.0001) / max(posterizeLevels, 0.0001);\n t = mix(t, posterized, step(0.001, posterizeLevels));\n\n // c) Cycle Repetitions - stretch/compress across gradient\n t = t * cycleReps;\n\n // d) Phase Shift - static offset\n t = t + phaseShift;\n\n // e) Cycling Animation - time-based offset\n t = t + cycleSpeed * uTime;\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // STEP 3: OUTPUT CYCLE - Wrap & Lookup (branchless)\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n // Wrap (fract) vs Clamp - branchless selection\n t = mix(clamp(t, 0.0, 1.0), fract(t), step(0.5, wrapMode));\n\n // Reverse direction - branchless\n t = mix(t, 1.0 - t, step(0.5, reverse));\n\n // Gradient lookup (1D texture sample)\n return texture2D(gradientMap, vec2(t, 0.5)).rgb;\n}\n\n// ============================================\n// DISPLACEMENT FUNCTIONS\n// ============================================\n// Create striped displacement map for glass refraction effect\n// Returns: x = signed displacement (-1 to 1), y = local UV x position within segment\n// gradientStart: gradient value at left edge (typically 1.0 for white)\n// gradientEnd: gradient value at right edge (typically 0.0 for black)\n// gradientPower: power curve for falloff (1.0 = linear, <1.0 = steeper, >1.0 = gentler)\n// centerPoint: center value for signed conversion (typically 0.5)\n// aspect: screen aspect ratio (width/height) for consistent slit angle\nvec2 createStripedDisplacement(\n vec2 uv,\n float numSegments,\n float angle,\n float gradientStart,\n float gradientEnd,\n float gradientPower,\n float centerPoint,\n float aspect\n) {\n // Work in aspect-corrected UV space where x and y have equal visual scale\n // This ensures consistent slit angle regardless of viewport dimensions\n vec2 aspectUV = uv * vec2(aspect, 1.0);\n \n // Apply slant in aspect-corrected space\n float slantedX = aspectUV.x - aspectUV.y * tan(angle);\n\n // Calculate segment properties (account for aspect-scaled x range)\n float segmentWidth = aspect / numSegments;\n float localUVx = fract(slantedX / segmentWidth); // 0-1 within each segment\n\n // Create the displacement map gradient\n // Use smoothstep for smoother interpolation\n float smoothUVx = smoothstep(0.0, 1.0, localUVx);\n // Interpolate from gradientEnd (left) to gradientStart (right)\n float rawGradient = mix(gradientEnd, gradientStart, smoothUVx);\n\n // Apply power curve for falloff control\n rawGradient = pow(rawGradient, gradientPower);\n\n // Convert to signed displacement (-1 to 1) using centerPoint\n // centerPoint is the neutral value (typically 0.5)\n float signedDisplacement = (rawGradient - centerPoint) / centerPoint;\n\n return vec2(signedDisplacement, localUVx);\n}\n\n// Apply displacement offset to UV coordinates\nvec2 applyDisplacement(vec2 uv, float signedDisplacement, vec2 maxDisplacement, vec2 resolution) {\n vec2 displaceOffset = vec2(\n signedDisplacement * maxDisplacement.x / resolution.x,\n signedDisplacement * maxDisplacement.y / resolution.y\n );\n return uv + displaceOffset;\n}\n\n// Create thin slanted stripes with multi-stop gradient color\n// Returns RGB color: gradient stripes with 3 color stops\n// Stop 1 (0%): colorStart, Stop 2 (stopPosition): colorMid, Stop 3 (100%): transparent\nvec4 createStripes(\n vec2 uv,\n float numSegments,\n float angle,\n float stopPosition, // Position of middle stop (0.0 to 1.0)\n vec4 colorStart, // Color at 0% (left edge)\n vec4 colorMid, // Color at stopPosition\n float aspect // Screen aspect ratio for consistent angle\n) {\n // Work in aspect-corrected UV space where x and y have equal visual scale\n vec2 aspectUV = uv * vec2(aspect, 1.0);\n \n // Apply slant in aspect-corrected space\n float slantedX = aspectUV.x - aspectUV.y * tan(angle);\n\n // Calculate segment properties (account for aspect-scaled x range)\n float segmentWidth = aspect / numSegments;\n float localUVx = 1.0 - fract(slantedX / segmentWidth); // 0-1 within each segment, reversed\n\n // Multi-stop gradient:\n // 0% -> colorStart (green)\n // stopPosition -> colorMid (white)\n // 100% -> transparent (black with 0 opacity)\n\n vec4 gradientColor;\n float opacity;\n\n if (localUVx < stopPosition) {\n float t = localUVx / stopPosition;\n gradientColor = mix(colorMid, colorStart, t);\n opacity = 0.5;\n } else {\n float t = (localUVx - stopPosition) / (1.0 - stopPosition);\n gradientColor = mix(vec4(0.0), colorMid, t);\n opacity = 0.5 - t * 0.5;\n }\n\n return gradientColor * opacity;\n}\n\n// Sample texture with displacement applied\nvec4 sampleWithDisplacement(\n sampler2D tex,\n vec2 uv,\n float signedDisplacement,\n vec2 maxDisplacement,\n vec2 resolution\n) {\n vec2 displacedUV = applyDisplacement(uv, signedDisplacement, maxDisplacement, resolution);\n return texture2D(tex, displacedUV);\n}\n\n// ============================================\n// POST-PROCESSING EFFECTS\n// ============================================\nvec3 applyBloom(vec3 color, float intensity, float innerMask) {\n const float whiteCoreThresholdMin = 0.5; // Start of white core mask\n const float whiteCoreThresholdMax = 0.85; // End of white core mask\n const float whiteCoreBlendStrength = 0.85; // How much to blend towards pure white\n\n const float bloomThresholdMin = 0.3; // Start of bloom glow\n const float bloomThresholdMax = 0.7; // End of bloom glow\n const vec3 bloomColor = vec3(1.0, 0.99, 0.97); // Warm white bloom tint\n const float bloomStrength = 0.10; // Intensity of bloom glow\n // -------------------------------\n\n // Calculate how much we're in the \"center\" bright area\n // Use a tighter threshold for the white core\n float whiteCoreMask = smoothstep(whiteCoreThresholdMin, whiteCoreThresholdMax, intensity) * innerMask;\n\n // Pure white target\n vec3 pureWhite = vec3(1.0);\n\n // Blend the center towards pure white (not additive, but replacement blend)\n // This ensures the very center goes to white, not gray\n color = mix(color, pureWhite, whiteCoreMask * whiteCoreBlendStrength);\n\n // Additional soft bloom glow around the white core\n float bloomBase = smoothstep(bloomThresholdMin, bloomThresholdMax, intensity);\n float bloomAmount = bloomBase * innerMask;\n color += bloomColor * bloomAmount * bloomStrength;\n\n return color;\n}\n\n// ============================================\n// ANIMATED POLYGON SHAPE\n// ============================================\n// Struct to return shape data\nstruct ShapeData {\n float shape; // The shape value (0 = outside, 1 = center)\n float gradient; // Gradient from gray (edge) to white (center)\n};\n\n// Signed distance function for a regular polygon\n// p: point to test, r: radius, n: number of sides\nfloat sdPolygon(vec2 p, float r, float n) {\n // Angle and radius\n float an = 3.141593 / n;\n vec2 acs = vec2(cos(an), sin(an));\n\n // Reduce to first sector\n float bn = mod(atan(p.x, p.y), 2.0 * an) - an;\n p = length(p) * vec2(cos(bn), abs(sin(bn)));\n\n // Line sdf\n p -= r * acs;\n p.y += clamp(-p.y, 0.0, r * acs.y);\n\n return length(p) * sign(p.x);\n}\n\n// Fast signed distance function for an ellipse\n// Approximation that avoids expensive acos(), cube roots, and branching\n// Accurate enough for visual effects, ~5x faster than exact version\nfloat sdEllipse(vec2 p, vec2 ab) {\n // Normalize point by ellipse radii\n vec2 q = p / ab;\n float k1 = length(q);\n \n // Early out for points very close to center (avoid division issues)\n if (k1 < 0.0001) return -min(ab.x, ab.y);\n \n // Gradient-based distance approximation\n vec2 q2 = q / ab; // Second normalization for gradient\n float k2 = length(q2);\n \n return k1 * (k1 - 1.0) / k2;\n}\n\n// Helper: Calculate a single shape instance at a given animation phase\nShapeData calculateSingleShape(\n vec2 uv,\n float linearT, // Animation phase 0-1\n float solidCoreMask,\n vec2 resolution,\n // Shape parameters\n float shapeType,\n float shapeWidth,\n float shapeHeight,\n float centerY,\n float animRange,\n float edgeSoftness,\n float grayLevel,\n float shapeAngleStart,\n float shapeAngleEnd,\n float shapeSize\n) {\n // Map 0-1 to position range (left to right)\n float posOffset = (linearT * 2.0 - 1.0) * animRange;\n float centerX = 0.5 + posOffset;\n\n // Animate rotation\n float animatedAngle = mix(shapeAngleStart, shapeAngleEnd, linearT);\n\n // Correct for aspect ratio\n float aspect = resolution.x / resolution.y;\n\n // Calculate position relative to center\n vec2 shapeCenter = vec2(centerX, centerY);\n vec2 delta = uv - shapeCenter;\n\n // Rotate delta by animated angle FIRST\n float cosA = cos(animatedAngle);\n float sinA = sin(animatedAngle);\n vec2 rotatedDelta = vec2(\n delta.x * cosA - delta.y * sinA,\n delta.x * sinA + delta.y * cosA\n );\n\n // Apply aspect correction AFTER rotation\n rotatedDelta.x *= aspect;\n\n // Calculate distance based on shape type\n float dist;\n if (shapeType < 0.5) {\n dist = sdEllipse(rotatedDelta, vec2(shapeWidth, shapeHeight));\n } else {\n vec2 scaledDelta = rotatedDelta / vec2(shapeWidth, shapeHeight);\n dist = sdPolygon(scaledDelta, shapeSize / min(shapeWidth, shapeHeight), shapeType);\n dist *= min(shapeWidth, shapeHeight);\n }\n\n // Normalize distance for gradient\n float normalizedDist;\n if (shapeType < 0.5) {\n normalizedDist = dist / max(shapeWidth, shapeHeight) + 1.0;\n } else {\n normalizedDist = (dist / shapeSize) + 1.0;\n }\n normalizedDist = clamp(normalizedDist, 0.0, 1.0);\n\n // Create soft shape mask\n float shapeMask = 1.0 - smoothstep(-edgeSoftness * 0.1, edgeSoftness * 0.05, dist);\n\n // Create gradient\n float gradient = mix(1.0, grayLevel, smoothstep(0.0, 1.0, normalizedDist));\n\n // Apply solid core mask\n shapeMask *= solidCoreMask;\n\n ShapeData result;\n result.shape = shapeMask;\n result.gradient = gradient;\n return result;\n}\n\n// Creates two staggered animated shapes that move left-to-right\n// When one reaches the far edge, another appears from the left\nShapeData calculateAnimatedShape(\n vec2 uv,\n float time, // Current animation time in seconds\n float solidCoreMask,\n vec2 resolution\n) {\n // --- Configurable parameters ---\n const float shapeType = 3.0; // 0 = ellipse, 3 = triangle, 4 = square, 5 = pentagon, etc.\n const float shapeWidth = 0.1; // Width/horizontal scale (wide)\n const float shapeHeight = 0.8; // Height/vertical scale (short)\n const float centerY = 0.4; // Vertical center position\n float cycleDuration = uCenterAnimDuration; // Seconds per animation cycle (from uniform)\n const float animRange = 0.7; // How far left/right it travels\n const float edgeSoftness = 0.5; // Softness of shape edge\n const float grayLevel = 0.5; // Gray color at shape edge\n const float shapeAngleStart = 0.6; // Rotation angle at start (slight tilt)\n const float shapeAngleEnd = 0.1; // Rotation angle at end (opposite tilt)\n const float shapeSize = 0.4; // Overall size for polygon mode\n const float staggerOffset = 0.4; // Offset between the two shapes (0.5 = half cycle apart)\n const float shape2Scale = 1.3; // Scale multiplier for 2nd shape (1.0 = same size)\n // -------------------------------\n\n // Time-based animation: time / cycleDuration gives progress through cycle\n float linearT1 = fract(time / cycleDuration); // Shape 1: 0->1 repeating\n float linearT2 = fract(time / cycleDuration + staggerOffset); // Shape 2: offset by staggerOffset\n\n // Calculate both shapes (shape 2 is slightly larger)\n ShapeData shape1 = calculateSingleShape(\n uv, linearT1, solidCoreMask, resolution,\n shapeType, shapeWidth, shapeHeight, centerY, animRange,\n edgeSoftness, grayLevel, shapeAngleStart, shapeAngleEnd, shapeSize\n );\n\n ShapeData shape2 = calculateSingleShape(\n uv, linearT2, solidCoreMask, resolution,\n shapeType, shapeWidth * shape2Scale, shapeHeight * shape2Scale, centerY, animRange,\n edgeSoftness, grayLevel, shapeAngleStart, shapeAngleEnd, shapeSize * shape2Scale\n );\n\n // Combine both shapes (take max of masks, blend gradients)\n ShapeData result;\n result.shape = max(shape1.shape, shape2.shape);\n // Weighted average of gradients based on shape masks\n float totalMask = shape1.shape + shape2.shape;\n if (totalMask > 0.001) {\n result.gradient = (shape1.gradient * shape1.shape + shape2.gradient * shape2.shape) / totalMask;\n } else {\n result.gradient = 0.5;\n }\n\n return result;\n}\n\n// Apply shape effect to intensity (for colorama/displacement pipeline)\nfloat applyShapeToIntensity(\n float baseIntensity,\n ShapeData shapeData,\n float effectStrength\n) {\n // Blend the shape gradient into the base intensity\n // This makes the shape area brighter/differently colored through colorama\n float shapeContribution = shapeData.gradient * shapeData.shape;\n return mix(baseIntensity, shapeContribution, shapeData.shape * effectStrength);\n}\n\n\n// AE-style color processing (levels, gamma, contrast). Used in both ripple and normal mode.\nvec3 applyColorCorrection(vec3 color) {\n color = (color - uCCBlackPoint) / (uCCWhitePoint - uCCBlackPoint);\n color = pow(max(color, vec3(0.0)), vec3(1.0 / (uCCMidtoneGamma * uCCGamma)));\n color = color * (1.0 + uCCContrast) - uCCContrast * 0.5;\n return clamp(color, 0.0, 1.0);\n}\n\n// Feather at container edges (visible bounds). Used in both ripple and normal mode.\nvec3 applyEdgeFeathering(vec3 color, vec3 bgColor) {\n // Apply edge feathering when zoomed in\n // Feathering is applied at the container edges (visible bounds), not canvas edges\n // uEdgeFeather = vec4(top, right, bottom, left) \u2014 clockwise like CSS\n if (any(greaterThan(uEdgeFeather, vec4(0.0)))) {\n vec2 screenUV = vUv;\n\n // Get visible UV bounds (where container clips the canvas)\n float visMinX = uVisibleUvBounds.x;\n float visMinY = uVisibleUvBounds.y;\n float visMaxX = uVisibleUvBounds.z;\n float visMaxY = uVisibleUvBounds.w;\n\n // Calculate visible dimensions in UV space for aspect-correct feathering on X axis\n float visibleWidth = visMaxX - visMinX;\n float visibleHeight = visMaxY - visMinY;\n float visibleAspect = visibleWidth / visibleHeight;\n\n // Per-side feather amounts (X sides get aspect correction for pixel-equal width)\n float featherTop = uEdgeFeather.x * 0.15 / visibleAspect;\n float featherRight = uEdgeFeather.y * 0.15 / visibleAspect;\n float featherBottom = uEdgeFeather.z * 0.15 / visibleAspect;\n float featherLeft = uEdgeFeather.w * 0.15 / visibleAspect;\n\n // Apply feathering at container edges (visible bounds)\n float left = smoothstep(visMinX, visMinX + featherLeft, screenUV.x);\n float right = smoothstep(visMaxX, visMaxX - featherRight, screenUV.x);\n float bottom = smoothstep(visMinY, visMinY + featherBottom, screenUV.y);\n float top = smoothstep(visMaxY, visMaxY - featherTop, screenUV.y);\n\n float edgeMask = left * right * bottom * top;\n // Blend towards background color instead of white to avoid visible edges\n color = mix(bgColor, color, edgeMask);\n }\n return color;\n}\n\nvoid main() {\n // ============================================\n // LAYER 1: Base glass effect (fine slits, whole image)\n // ============================================\n float numSegments = uNumSegments;\n float angle = uSlitAngle;\n const float blurRadius = 9.0;\n const float sigma = 4.0;\n\n // Calculate aspect ratio for consistent slit angles\n float aspect = iResolution.x / iResolution.y;\n\n // Displacement parameters (in pixels, scaled by DPR)\n // Scale displacement by reference resolution ratio to maintain consistency across browser zoom levels\n float resolutionScale = iResolution.x / uRefResolution.x;\n vec2 maxDisplacement = vec2(uDisplacementX, uDisplacementY) * uDpr * resolutionScale;\n\n // Use pre-computed UV from vertex shader (zoom + pan already applied)\n vec2 uv = vContentUv;\n\n // Base displacement (fine slits)\n // Use raw screen UV (vUv) so slit positions stay fixed on screen regardless of pan/zoom\n float gradientStart = 1.0;\n float gradientEnd = 0.0;\n float gradientPower = 1.0;\n float centerPoint = 0.5;\n vec2 displacementData = createStripedDisplacement(\n vUv,\n numSegments,\n angle,\n gradientStart,\n gradientEnd,\n gradientPower,\n centerPoint,\n aspect\n );\n float signedDisplacement = displacementData.x;\n float localUVx = displacementData.y;\n\n // ============================================\n // LAYER 2: Inner glass effect (larger slits, center only, STATIC)\n // ============================================\n // Inner segments are a divisor of outer segments for perfect alignment\n // 45 / 5 = 9 segments (5x larger slits that align with outer grid)\n float innerNumSegments = numSegments;\n float innerAngle = angle; // Same angle as outer\n\n // Inner slits are STATIC - use raw screen UV so slits stay fixed on screen\n vec2 innerDisplacementData = createStripedDisplacement(\n vUv,\n innerNumSegments,\n innerAngle,\n gradientStart,\n gradientEnd,\n gradientPower,\n centerPoint,\n aspect\n );\n float innerSignedDisplacement = innerDisplacementData.x;\n float innerLocalUVx = innerDisplacementData.y;\n\n // ============================================\n // COMPUTE SOLID CORE MASK EARLY (needed for light & displacement masking)\n // ============================================\n vec4 videoFrameSample = texture2D(uVideoTexture, uv);\n float maskIntensity = luminance(videoFrameSample.rgb);\n float solidCoreMask = smoothstep(0.4, 0.7, maskIntensity);\n\n // Store original displacement for shape refraction (before masking)\n float originalInnerDisplacement = innerSignedDisplacement;\n\n // Mask inner displacement by solidCoreMask - no inner displacement in center\n innerSignedDisplacement *= (1.0 - solidCoreMask);\n\n // Inner layer displacement uses same values (scaled by resolutionScale for zoom independence)\n vec2 innerMaxDisplacement = vec2(30.0, 0.0) * uDpr * resolutionScale;\n\n // ============================================\n // CENTER ELEMENT (Static Ellipse + Animated Shapes)\n // ============================================\n float staticEllipseMask = 0.0;\n float staticEllipseGradient = 0.0;\n ShapeData shapeData;\n shapeData.shape = 0.0;\n shapeData.gradient = 0.0;\n\n float centerFadeInDuration = 10.0;\n float centerFramesSinceStart = uFrameCount - uLightStartFrame;\n float centerEffectActivation = clamp(centerFramesSinceStart / centerFadeInDuration, 0.0, 1.0);\n\n if (uEnableCenterElement > 0.5) {\n // Calculate static ellipse mask\n {\n const float ellipseCenterX = 0.3;\n const float ellipseCenterY = -0.15;\n const float ellipseWidth = 0.5;\n const float ellipseHeight = 0.8;\n const float ellipseAngle = 0.3;\n const float ellipseSoftness = 1.0;\n const float ellipseGrayLevel = 0.5;\n\n float aspect = iResolution.x / iResolution.y;\n\n // Use RAW UV (no displacement) for the mask calculation\n vec2 delta = uv - vec2(ellipseCenterX, ellipseCenterY);\n\n // Rotate\n float cosA = cos(ellipseAngle);\n float sinA = sin(ellipseAngle);\n vec2 rotatedDelta = vec2(\n delta.x * cosA - delta.y * sinA,\n delta.x * sinA + delta.y * cosA\n );\n rotatedDelta.x *= aspect;\n\n // Calculate ellipse distance\n float ellipseDist = sdEllipse(rotatedDelta, vec2(ellipseWidth, ellipseHeight));\n\n // Soft shape mask\n staticEllipseMask = 1.0 - smoothstep(-ellipseSoftness * 0.1, ellipseSoftness * 0.05, ellipseDist);\n\n // Gradient\n float normalizedDist = ellipseDist / max(ellipseWidth, ellipseHeight) + 1.0;\n normalizedDist = clamp(normalizedDist, 0.0, 1.0);\n staticEllipseGradient = mix(1.0, ellipseGrayLevel, smoothstep(0.0, 1.0, normalizedDist));\n\n // Apply solid core mask\n staticEllipseMask *= solidCoreMask;\n }\n\n // Block displacement inside the static ellipse\n originalInnerDisplacement *= (1.0 - staticEllipseMask);\n innerSignedDisplacement *= (1.0 - staticEllipseMask);\n signedDisplacement *= (1.0 - staticEllipseMask);\n\n\n\n // Calculate displaced UV for shape - use inner displacement for the shape refraction\n vec2 shapeDisplacedUV = applyDisplacement(uv, originalInnerDisplacement, innerMaxDisplacement, iResolution);\n\n // Calculate animated shape using DISPLACED UVs so glass slits refract through it\n shapeData = calculateAnimatedShape(\n shapeDisplacedUV, // Use displaced UVs!\n uCenterAnimTime, // Time-based animation in seconds (resets with video loop)\n solidCoreMask,\n iResolution\n );\n\n // Combine static ellipse with animated shapes\n {\n float combinedShape = max(shapeData.shape, staticEllipseMask) * centerEffectActivation;\n float totalMask = shapeData.shape + staticEllipseMask;\n float combinedGradient = shapeData.gradient;\n if (totalMask > 0.001) {\n combinedGradient = (shapeData.gradient * shapeData.shape + staticEllipseGradient * staticEllipseMask) / totalMask;\n }\n shapeData.shape = combinedShape;\n shapeData.gradient = combinedGradient;\n }\n }\n\n // ============================================\n // INNER EFFECT ACTIVATION - starts after uLightStartFrame\n // ============================================\n float innerFadeInDuration = 10.0; // Slower fade-in for inner effect\n float innerFramesSinceStart = uFrameCount - uLightStartFrame;\n float innerEffectActivation = clamp(innerFramesSinceStart / innerFadeInDuration, 0.0, 1.0);\n\n // Create edge mask (solidCoreMask already computed earlier for light masking)\n float edgeMask = smoothstep(0.3, 0.6, maskIntensity); // Where shape starts\n\n // Blend outer and inner slits on the edges\n // Inner contribution is multiplied by activation (fades in after frame 200)\n float outerContribution = 1.0 - edgeMask * 0.5 * innerEffectActivation;\n float innerContribution = edgeMask * innerEffectActivation;\n\n // Combined displacement: inner effect fades in over time\n float combinedDisplacement = signedDisplacement * outerContribution +\n innerSignedDisplacement * innerContribution;\n\n // Blend max displacement smoothly\n vec2 combinedMaxDisplacement = maxDisplacement * outerContribution +\n innerMaxDisplacement * innerContribution;\n\n // For the CENTER area (solidCoreMask): use 100% inner (larger) slits displacement\n // For the EDGES: use the combined displacement (blended outer + inner)\n // This ensures the logo center always has the larger slits\n combinedDisplacement = mix(combinedDisplacement, originalInnerDisplacement, solidCoreMask);\n combinedMaxDisplacement = mix(combinedMaxDisplacement, innerMaxDisplacement, solidCoreMask);\n\n // ============================================\n // LAYER 1: DISPLACEMENT (toggleable)\n // ============================================\n vec4 textureSample;\n if (uEnableDisplacement > 0.5) {\n textureSample = sampleWithDisplacement(\n uVideoTexture, uv,\n combinedDisplacement, combinedMaxDisplacement,\n iResolution\n );\n } else {\n // No displacement - sample directly\n textureSample = texture2D(uVideoTexture, uv);\n }\n\n // Blend localUVx for highlights - also fades in with activation\n float combinedLocalUVx = localUVx * outerContribution + innerLocalUVx * innerContribution;\n localUVx = combinedLocalUVx;\n\n // Store innerMask for later use (bloom, etc.) - also tied to activation\n float innerMask = edgeMask * innerEffectActivation;\n\n // Get Phase From: Intensity (Rec. 709 luminance)\n float baseIntensity = luminance(textureSample.rgb);\n\n // Boost intensity in center areas to push them more towards white\n float centerWhiteBoost = 0.1;\n baseIntensity = baseIntensity + innerMask * centerWhiteBoost;\n baseIntensity = clamp(baseIntensity, 0.0, 1.0);\n\n // Keep base intensity for outer colorama (using uGradientMap)\n float outerIntensity = baseIntensity;\n\n // ============================================\n // CENTER GREEN STRIPES OVERLAY (before colorama)\n // ============================================\n float stripeFadeOutDuration = 10.0;\n float stripeFramesSinceStart = uFrameCount - uLightStartFrame;\n // Effect is active UNTIL uLightStartFrame, then fades out\n float stripeEffectActivation = 1.0 - clamp(stripeFramesSinceStart / stripeFadeOutDuration, 0.0, 1.0);\n\n // Animated vertical height mask - grows from 0 to full height\n // Height animation: starts at center (0.5) and expands outward\n float stripeHeightDelay = 15.0; // frames to wait before starting\n float stripeHeightGrowDuration = 80.0; // frames to reach full height\n float stripeHeightProgress = clamp((uFrameCount - stripeHeightDelay) / stripeHeightGrowDuration, 0.0, 1.0);\n // Ease the progress for smoother animation\n float easedHeightProgress = 1.0 - pow(1.0 - stripeHeightProgress, 2.0);\n \n // Calculate animated bounds - expand from center (0.5) outward\n float heightHalfSpan = 0.2 * easedHeightProgress; // 0.06 = half of the 0.12 total height (0.44 to 0.56)\n float softEdge = 0.1 * easedHeightProgress; // Soft edge also scales with progress\n float bottomEdge = 0.5 - heightHalfSpan - softEdge;\n float bottomFull = 0.5 - heightHalfSpan;\n float topFull = 0.5 + heightHalfSpan;\n float topEdge = 0.5 + heightHalfSpan + softEdge;\n \n // When progress is 0, force mask to 0 to avoid glitchy edge at y=0.5\n float stripeHeightMask = easedHeightProgress > 0.001 \n ? smoothstep(bottomEdge, bottomFull, uv.y) * smoothstep(topEdge, topFull, uv.y)\n : 0.0;\n\n vec4 centerGreenSlantedLines = createStripes(\n vUv + vec2(-0.0035, 0.0), // slight offset to avoid moir\xE9\n numSegments,\n uSlitAngle,\n 0.15, // stopPosition (20%)\n vec4(20.0/255.0, 200.0/255.0, 20.0/255.0, 0.2), // colorStart (green at 0%)\n vec4(0.0, 0.0, 0.0, 0.0), // colorMid (white at 20%)\n aspect // aspect ratio for consistent angle\n ) * solidCoreMask * stripeHeightMask;\n\n // Overlay green stripes on center element area\n float stripeOverlayMask = solidCoreMask * stripeEffectActivation;\n // Modify baseIntensity/outerIntensity with stripes before colorama\n vec4 stripedTexture = vec4(textureSample.rgb, 1.0) - centerGreenSlantedLines*0.7 * stripeOverlayMask;\n stripedTexture = clamp(stripedTexture, 0.0, 1.0);\n\n // Update intensity for colorama input\n float stripedIntensity = luminance(stripedTexture.rgb);\n outerIntensity = mix(baseIntensity, stripedIntensity, stripeOverlayMask);\n\n // ============================================\n // LAYER 2: COLORAMA (toggleable)\n // ============================================\n vec3 color;\n if (uEnableColorama > 0.5) {\n // OUTER colorama: uses base intensity, cross-fades between uGradientMap and uGradientMap2\n vec3 outerColoramaResult1 = applyColoramaWithGradient(\n uGradientMap, outerIntensity,\n uInputMin, uInputMax, uModifyGamma, uPosterizeLevels,\n uCycleRepetitions, uPhaseShift, uCycleSpeed,\n uWrapMode, uReverse\n );\n vec3 outerColoramaResult2 = applyColoramaWithGradient(\n uGradientMap2, outerIntensity,\n uInputMin, uInputMax, uModifyGamma, uPosterizeLevels,\n uCycleRepetitions, uPhaseShift, uCycleSpeed,\n uWrapMode, uReverse\n );\n vec3 outerColoramaResult = mix(outerColoramaResult1, outerColoramaResult2, uGradientMapBlend);\n\n // Start with outer colorama as base\n vec3 blendedColorama = outerColoramaResult;\n\n // CENTER colorama: only compute when inside shape (skip texture sample otherwise)\n // This saves a texture lookup + specular pow() for ~90% of pixels\n if (shapeData.shape > 0.001) {\n vec3 centerColoramaResult = applyColoramaWithGradient(\n uCenterGradientMap, shapeData.gradient,\n uInputMin, uInputMax, uModifyGamma, uPosterizeLevels,\n uCycleRepetitions, uPhaseShift, uCycleSpeed,\n uWrapMode, uReverse\n );\n\n // Add specular highlight to center (shiny reflection effect)\n float specularPower = 8.0; // Higher = tighter/smaller highlight\n float specularIntensity = 1.9; // Brightness of the specular\n float specular = pow(shapeData.gradient, specularPower) * specularIntensity;\n centerColoramaResult += vec3(specular); // Add bright highlight\n\n // Blend between outer and center colorama based on shape\n blendedColorama = mix(outerColoramaResult, centerColoramaResult, shapeData.shape);\n }\n\n color = mix(blendedColorama, textureSample.rgb, uBlendWithOriginal);\n } else {\n color = textureSample.rgb;\n }\n\n // Store intensity for bloom (use the blended value)\n float intensity = mix(outerIntensity, shapeData.gradient, shapeData.shape);\n\n // ============================================\n // LAYER 3: BLOOM (toggleable)\n // ============================================\n if (uEnableBloom > 0.5) {\n color = applyBloom(color, intensity, innerMask);\n }\n\n // ============================================\n // LAYER 4: SHAPE HIGHLIGHT (toggleable via light sweep toggle)\n // ============================================\n if (uEnableLightSweep > 0.5) {\n float lightFadeInDuration = 30.0;\n float framesSinceStart = uFrameCount - uLightStartFrame;\n float lightActivation = clamp(framesSinceStart / lightFadeInDuration, 0.0, 1.0);\n\n // Add subtle brightness boost at shape center\n float shapeHighlight = pow(shapeData.gradient, 2.0) * shapeData.shape;\n color += vec3(1.0) * shapeHighlight * 0.15 * uLightIntensity * lightActivation;\n }\n\n // Color correction and edge feathering (shared with ripple mode)\n color = applyColorCorrection(color);\n // Blend with background color if provided (uBackgroundColor.r < 0 means not set)\n if (uBackgroundColor.r >= 0.0) {\n // Calculate luminance to determine how bright the pixel is\n float brightness = luminance(color);\n \n // Blend white/bright areas with background color\n // Bright areas (close to white) become the background color\n float blendStart = 0.94; // Start blending at this brightness\n float blendEnd = 1.0; // Fully background color at this brightness\n float blendAmount = smoothstep(blendStart, blendEnd, brightness);\n \n // Mix the shader color with background color\n color = mix(color, uBackgroundColor, blendAmount);\n }\n\n // Use background color for feathering if set, otherwise default to white\n vec3 featherColor = uBackgroundColor.r >= 0.0 ? uBackgroundColor : vec3(1.0);\n color = applyEdgeFeathering(color, featherColor);\n\n gl_FragColor = vec4(color, 1.0);\n}\n";
|
|
3
3
|
|
|
4
4
|
export { rzpGlassFragmentShader, rzpGlassVertexShader };
|
|
5
5
|
//# sourceMappingURL=rzpGlassShader.js.map
|