{"version":3,"file":"shockwaveFilter.cjs","sources":["../../../src/filters/shockwaveFilter.ts"],"sourcesContent":["import { ShockwaveFilter } from 'pixi-filters';\nimport { type ShockwaveFilterConfig, type FilterResult } from './types';\nimport { gsap } from 'gsap';\nimport { ShaderResourceManager } from '../managers/ShaderResourceManager';\n\n/**\n * Creates a Shockwave filter that applies a ripple/wrinkle effect like a pond wave or blast\n *\n * The ShockwaveFilter creates a visual distortion that radiates from a center point,\n * simulating ripples on water or blast waves. It can be animated over time.\n * Uses shader pooling for better performance.\n *\n * @param config - Configuration for the Shockwave filter\n * @returns FilterResult with the filter instance and control functions\n */\nexport function createShockwaveFilter(config: ShockwaveFilterConfig): 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.amplitude !== undefined) options.amplitude = config.amplitude;\n    if (config.brightness !== undefined) options.brightness = config.brightness;\n    if (config.center !== undefined) options.center = config.center;\n    if (config.centerX !== undefined) options.centerX = config.centerX;\n    if (config.centerY !== undefined) options.centerY = config.centerY;\n    if (config.radius !== undefined) options.radius = config.radius;\n    if (config.speed !== undefined) options.speed = config.speed;\n    if (config.wavelength !== undefined) options.wavelength = config.wavelength;\n    if (config.time !== undefined) options.time = config.time;\n\n    // Create a unique key for this filter configuration\n    const shaderKey = 'shockwave-filter';\n\n    // Create the filter with options\n    const filter = new ShockwaveFilter(options);\n\n    // Register filter with shader manager\n    try {\n        shaderManager.registerFilter(filter, shaderKey);\n    } catch (error) {\n        console.warn('Error registering shockwave filter with shader manager:', error);\n    }\n\n    // Track animation state\n    let animationActive = false;\n    let animationFrameId: number | null = null;\n    let lastTime = 0;\n    let pulseTween: gsap.core.Tween | null = null;\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 'amplitude':\n                    // Map 0-10 to 0-60 for amplitude\n                    filter.amplitude = normalizedIntensity * 6;\n                    break;\n                case 'wavelength':\n                    // Map 0-10 to 80-240 for wavelength\n                    filter.wavelength = 80 + (normalizedIntensity * 16);\n                    break;\n                case 'radius':\n                    // Map 0-10 to 0-300 for radius (with -1 for infinite at max)\n                    filter.radius = normalizedIntensity === 10 ? -1 : normalizedIntensity * 30;\n                    break;\n                case 'brightness':\n                    // Map 0-10 to 0.5-1.5 for brightness\n                    filter.brightness = 0.5 + (normalizedIntensity / 10);\n                    break;\n                case 'speed':\n                    // Map 0-10 to 100-1000 for speed\n                    filter.speed = 100 + (normalizedIntensity * 90);\n                    break;\n                default:\n                    // Default to amplitude adjustment\n                    filter.amplitude = normalizedIntensity * 6;\n            }\n        } else {\n            // Default behavior - adjust amplitude and brightness together for more visible effect\n            filter.amplitude = normalizedIntensity * 6;\n            filter.brightness = 0.8 + (normalizedIntensity / 50); // Subtle brightness adjustment\n        }\n\n        // Start or stop animation if configured\n        if (config.animate) {\n            if (normalizedIntensity > 0 && !animationActive) {\n                // Start animation\n                startAnimation();\n            } else if (normalizedIntensity === 0 && animationActive) {\n                // Stop animation\n                stopAnimation();\n            }\n        }\n    };\n\n    /**\n     * Start the time-based animation for wave movement\n     */\n    const startAnimation = (): void => {\n        if (animationActive) return;\n\n        animationActive = true;\n        lastTime = Date.now();\n\n        const animate = () => {\n            const now = Date.now();\n            const delta = (now - lastTime) / 1000; // Convert to seconds\n            lastTime = now;\n\n            // Update time value for animation (speed controlled by config)\n            const animationSpeed = config.animationSpeed || 0.5;\n\n            // If the filter has a time property, increment it\n            if ('time' in filter) {\n                filter.time += delta * animationSpeed;\n            }\n\n            // Continue animation loop\n            animationFrameId = requestAnimationFrame(animate);\n        };\n\n        animate();\n    };\n\n    /**\n     * Stop the time-based animation\n     */\n    const stopAnimation = (): void => {\n        if (!animationActive) return;\n\n        animationActive = false;\n\n        if (animationFrameId !== null) {\n            cancelAnimationFrame(animationFrameId);\n            animationFrameId = null;\n        }\n    };\n\n    // Set initial intensity and start animation if configured\n    updateIntensity(config.intensity);\n\n    // If pulse effect is requested, create a GSAP animation\n    if (config.pulse) {\n        const pulseIntensity = config.pulseIntensity || 0.5;\n        const pulseDuration = config.pulseDuration || 1.5;\n\n        // Create a pulsing animation using GSAP\n        pulseTween = gsap.to(filter, {\n            amplitude: filter.amplitude * (1 + pulseIntensity),\n            duration: pulseDuration / 2,\n            repeat: -1,\n            yoyo: true,\n            ease: \"sine.inOut\"\n        });\n    }\n\n    /**\n     * Reset the filter to configured state or default values if not specified\n     */\n    const reset = (): void => {\n        // Stop any active animation\n        stopAnimation();\n\n        // Reset to configured values or defaults if not specified\n        filter.amplitude = config.amplitude !== undefined ? config.amplitude : 30;\n        filter.wavelength = config.wavelength !== undefined ? config.wavelength : 160;\n        filter.radius = config.radius !== undefined ? config.radius : -1;\n        filter.brightness = config.brightness !== undefined ? config.brightness : 1;\n        filter.speed = config.speed !== undefined ? config.speed : 500;\n\n        // Handle center coordinates\n        if (config.center !== undefined) {\n            // If center object was provided, use that\n            filter.center = config.center;\n        } else {\n            // Otherwise use individual centerX/centerY if provided\n            const centerX = config.centerX !== undefined ? config.centerX : 0.5;\n            const centerY = config.centerY !== undefined ? config.centerY : 0.5;\n            filter.center = { x: centerX, y: centerY };\n        }\n\n        // Reset time to 0 or configured value\n        if ('time' in filter) {\n            filter.time = config.time !== undefined ? config.time : 0;\n        }\n    };\n\n    /**\n     * Release any WebGL resources used by this filter and stop animations\n     */\n    const dispose = (): void => {\n        // Stop any active animation\n        stopAnimation();\n\n        // Kill any GSAP animations\n        if (pulseTween) {\n            pulseTween.kill();\n            pulseTween = null;\n        }\n\n        // Release shader resources\n        try {\n            shaderManager.releaseFilter(filter, shaderKey);\n        } catch (error) {\n            console.warn('Error releasing shockwave filter shader:', error);\n        }\n\n        // Destroy the filter\n        filter.destroy();\n    };\n\n    return { filter, updateIntensity, reset, dispose };\n}"],"names":["ShaderResourceManager","ShockwaveFilter","gsap"],"mappings":"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"}