{"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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"}