UNPKG

kinetic-slider

Version:

A WebGL-powered kinetic slider component using PIXI.js

1 lines 22.7 kB
{"version":3,"file":"glitchFilter.cjs","sources":["../../../src/filters/glitchFilter.ts"],"sourcesContent":["import { GlitchFilter } from 'pixi-filters';\nimport { type GlitchFilterConfig, type FilterResult } from './types';\nimport { gsap } from 'gsap';\nimport { ShaderResourceManager } from '../managers/ShaderResourceManager';\n\n/**\n * Creates a Glitch filter with mixed smooth and jumpy animations for a more realistic effect\n * Uses shader pooling for better performance.\n *\n * @param config - Configuration for the Glitch filter\n * @returns FilterResult with the filter instance and control functions\n */\nexport function createGlitchFilter(config: GlitchFilterConfig): FilterResult {\n // Get shader manager instance\n const shaderManager = ShaderResourceManager.getInstance();\n\n // Create options object for the filter\n const options: any = {};\n\n // Apply configuration values if provided, otherwise use defaults\n if (config.average !== undefined) options.average = config.average;\n if (config.direction !== undefined) options.direction = config.direction;\n if (config.red !== undefined) options.red = config.red;\n if (config.green !== undefined) options.green = config.green;\n if (config.blue !== undefined) options.blue = config.blue;\n if (config.slices !== undefined) options.slices = config.slices;\n if (config.offset !== undefined) options.offset = config.offset;\n if (config.minSize !== undefined) options.minSize = config.minSize;\n if (config.sampleSize !== undefined) options.sampleSize = config.sampleSize;\n if (config.seed !== undefined) options.seed = config.seed;\n if (config.fillMode !== undefined) options.fillMode = config.fillMode;\n\n // Create a unique key for this filter configuration\n const slicesStr = (options.slices || 5).toString();\n const fillModeStr = (options.fillMode || 0).toString();\n const shaderKey = `glitch-filter-${slicesStr}-${fillModeStr}`;\n\n // Create the filter with options\n const filter = new GlitchFilter(options);\n\n // Register filter with shader manager\n try {\n shaderManager.registerFilter(filter, shaderKey);\n } catch (error) {\n console.warn('Error registering glitch filter with shader manager:', error);\n }\n\n // For animation\n let animationInterval: number | null = null;\n let currentTweens: gsap.core.Tween[] = [];\n\n // Current target values - we'll store these to apply instant changes to non-tweened properties\n let currentTargets = {\n red: { ...filter.red },\n blue: { ...filter.blue },\n green: { ...filter.green },\n offset: filter.offset,\n direction: filter.direction\n };\n\n // Generate random target values for transitions\n // Generate random target values for transitions\n const generateTargetValues = (baseOffset: number) => {\n // Randomize the variation based on intensity\n const variation = baseOffset * 0.6; // 60% variation\n\n // Generate random offsets for each channel\n const redX = (Math.random() * variation * 2 - variation) + (config.red?.x || 0);\n const redY = (Math.random() * variation * 0.5 - variation * 0.25) + (config.red?.y || 0);\n\n const blueX = (Math.random() * variation * 2 - variation) + (config.blue?.x || 0);\n const blueY = (Math.random() * variation * 0.5 - variation * 0.25) + (config.blue?.y || 0);\n\n // For green channel, we typically want to keep it more stable\n // to avoid color overlay issues\n const greenX = config.green?.x || 0;\n const greenY = config.green?.y || 0;\n\n const offsetVariation = baseOffset * 0.4; // 40% variation in slice offset\n const newOffset = filter.offset + (Math.random() * offsetVariation * 2 - offsetVariation);\n\n // Generate random direction change if needed\n const directionChange = Math.random() > 0.7 ? (Math.random() * 30 - 15) : 0;\n const newDirection = ((filter.direction + directionChange) % 360 + 360) % 360;\n\n return {\n red: { x: redX, y: redY },\n blue: { x: blueX, y: blueY },\n green: { x: greenX, y: greenY }, // Add green channel\n offset: Math.max(0, newOffset),\n direction: newDirection\n };\n };\n\n // Helper to update animation with mixed tweening/jumping\n // Helper to update animation with mixed tweening/jumping\n const updateAnimationInterval = (frequency: number, baseIntensity: number) => {\n if (animationInterval !== null) {\n window.clearInterval(animationInterval);\n animationInterval = null;\n }\n\n // Clear any existing tweens\n for (const tween of currentTweens) {\n tween.kill();\n }\n currentTweens = [];\n\n if (frequency > 0 && config.animated) {\n // Convert frequency to milliseconds\n const interval = Math.floor(1000 / frequency);\n\n // Calculate transition duration - faster transitions for higher frequency\n // but never longer than the interval itself\n const transitionDuration = Math.min(interval * 0.8 / 1000, 0.5);\n\n animationInterval = window.setInterval(() => {\n // Generate new target values\n const targetValues = generateTargetValues(baseIntensity * 10);\n currentTargets = { ...targetValues }; // Store for reference\n\n // Decide which properties to tween and which to jump\n // We'll make these weighted random decisions for a dynamic effect\n const shouldTweenRed = Math.random() > 0.3; // 70% chance to tween red\n const shouldTweenBlue = Math.random() > 0.3; // 70% chance to tween blue\n const shouldTweenOffset = Math.random() > 0.5; // 50% chance to tween offset\n // NEVER tween direction - always jump rotations\n\n // Clear any existing tweens\n for (const tween of currentTweens) {\n tween.kill();\n }\n currentTweens = [];\n\n // Create a tweening object for each property we want to tween\n const tweenProps: any = {};\n\n // For properties we want to tween, add them to the tweenProps\n if (shouldTweenRed) {\n tweenProps.red = targetValues.red;\n } else {\n // Immediate jump for red channel\n filter.red = targetValues.red;\n }\n\n if (shouldTweenBlue) {\n tweenProps.blue = targetValues.blue;\n } else {\n // Immediate jump for blue channel\n filter.blue = targetValues.blue;\n }\n\n if (shouldTweenOffset) {\n tweenProps.offset = targetValues.offset;\n } else {\n // Immediate jump for offset\n filter.offset = targetValues.offset;\n }\n\n // Always apply direction immediately - never tween rotations\n filter.direction = targetValues.direction;\n\n // Only create a tween if we have properties to animate\n if (Object.keys(tweenProps).length > 0) {\n // Random ease for more variety\n const eases = [\"power1.inOut\", \"power2.inOut\", \"power3.in\", \"power2.out\", \"none\"];\n const ease = eases[Math.floor(Math.random() * eases.length)];\n\n // Random duration for more variety (within our max constraint)\n const duration = Math.max(0.05, Math.random() * transitionDuration);\n\n // Create the tween\n const tween = gsap.to(filter, {\n duration: duration,\n ...tweenProps,\n ease: ease,\n onComplete: () => {\n // Occasionally cause an abrupt refresh for even more variation\n if (Math.random() > 0.8) {\n filter.refresh();\n\n // Randomize seed occasionally\n if (Math.random() > 0.7) {\n filter.seed = Math.random() * 1000;\n }\n }\n }\n });\n\n // Store the tween\n currentTweens.push(tween);\n } else {\n // No tweening at all for this update - call refresh directly\n filter.refresh();\n }\n\n // Sometimes cause a mini-glitch during the main animation\n if (Math.random() > 0.85) { // 15% chance of mini-glitch\n setTimeout(() => {\n // Create a small random offset change\n const miniJump = Math.random() * baseIntensity * 15;\n\n // Jump immediately\n filter.offset = filter.offset + miniJump;\n\n // Maybe also jump direction for a sudden rotation\n if (Math.random() > 0.5) {\n filter.direction = (filter.direction + (Math.random() * 90 - 45)) % 360;\n }\n\n // And return after a very short time\n setTimeout(() => {\n filter.offset = currentTargets.offset;\n filter.direction = currentTargets.direction;\n }, Math.random() * 100 + 50); // 50-150ms\n }, Math.random() * (interval * 0.6)); // Random time during the interval\n }\n\n }, interval);\n }\n };\n\n /**\n * Update the filter's intensity based on the configuration\n *\n * @param intensity - New intensity value (0-10 scale)\n */\n const updateIntensity = (intensity: number): void => {\n // Normalize intensity to a 0-10 scale\n const normalizedIntensity = Math.max(0, Math.min(10, intensity));\n\n // Determine which property to adjust based on config\n if (config.primaryProperty) {\n switch (config.primaryProperty) {\n case 'slices':\n // Map 0-10 to 1-20 slices\n filter.slices = 1 + Math.floor(normalizedIntensity * 2);\n break;\n case 'offset':\n // Map 0-10 to 0-200 offset\n filter.offset = normalizedIntensity * 20;\n break;\n case 'direction':\n // Map 0-10 to 0-360 degrees\n filter.direction = normalizedIntensity * 36;\n break;\n case 'red':\n // Adjust red channel offset based on intensity\n filter.red = { x: normalizedIntensity * 2, y: 0 };\n break;\n case 'blue':\n // Adjust blue channel offset based on intensity\n filter.blue = { x: -normalizedIntensity * 2, y: 0 };\n break;\n default:\n // Default to offset adjustment\n filter.offset = normalizedIntensity * 20;\n }\n } else {\n // Default behavior - adjust offset (most visible effect)\n filter.offset = normalizedIntensity * 20;\n }\n\n // If specified, adjust animation timing based on intensity\n if (config.refreshFrequency !== undefined) {\n updateAnimationInterval(config.refreshFrequency, normalizedIntensity);\n }\n };\n\n // Set initial intensity\n updateIntensity(config.intensity);\n\n /**\n * Reset the filter to initial configuration\n */\n const reset = (): void => {\n // Clear any existing animation\n if (animationInterval !== null) {\n window.clearInterval(animationInterval);\n animationInterval = null;\n }\n\n // Clear any existing tweens\n for (const tween of currentTweens) {\n tween.kill();\n }\n currentTweens = [];\n\n // Reset all filter properties\n filter.average = config.average !== undefined ? config.average : false;\n filter.red = config.red || { x: 0, y: 0 };\n filter.green = config.green || { x: 0, y: 0 };\n filter.blue = config.blue || { x: 0, y: 0 };\n filter.offset = config.offset !== undefined ? config.offset : 0;\n filter.direction = config.direction !== undefined ? config.direction : 0;\n filter.fillMode = config.fillMode !== undefined ? config.fillMode : 0;\n filter.seed = config.seed !== undefined ? config.seed : 0;\n filter.slices = config.slices !== undefined ? config.slices : 5;\n filter.minSize = config.minSize !== undefined ? config.minSize : 8;\n filter.sampleSize = config.sampleSize !== undefined ? config.sampleSize : 512;\n\n // Re-apply intensity if provided\n if (config.intensity !== undefined) {\n updateIntensity(config.intensity);\n }\n };\n\n /**\n * Release any WebGL resources used by this filter and stop animations\n */\n const dispose = (): void => {\n // Stop animations and clear tweens\n if (animationInterval !== null) {\n window.clearInterval(animationInterval);\n animationInterval = null;\n }\n\n for (const tween of currentTweens) {\n tween.kill();\n }\n currentTweens = [];\n\n // Release shader resources\n try {\n shaderManager.releaseFilter(filter, shaderKey);\n } catch (error) {\n console.warn('Error releasing glitch filter shader:', error);\n }\n\n // Destroy the filter\n filter.destroy();\n };\n\n return { filter, updateIntensity, reset, dispose };\n}"],"names":["ShaderResourceManager","GlitchFilter","gsap"],"mappings":"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"}