{"version":3,"file":"reflectionFilter.cjs","sources":["../../../src/filters/reflectionFilter.ts"],"sourcesContent":["import { ReflectionFilter } from 'pixi-filters';\nimport { type ReflectionFilterConfig, type FilterResult } from './types';\nimport { ShaderResourceManager } from '../managers/ShaderResourceManager';\n\n/**\n * Creates a Reflection filter that applies a water-like reflection effect\n *\n * The ReflectionFilter simulates the reflection on water with waves,\n * with configurable wave properties and animation settings.\n * Uses shader pooling for better performance.\n *\n * @param config - Configuration for the Reflection filter\n * @returns FilterResult with the filter instance and control functions\n */\nexport function createReflectionFilter(config: ReflectionFilterConfig): 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.alpha !== undefined) options.alpha = config.alpha;\n    if (config.amplitude !== undefined) options.amplitude = config.amplitude;\n    if (config.boundary !== undefined) options.boundary = config.boundary;\n    if (config.mirror !== undefined) options.mirror = config.mirror;\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    // The mirror setting affects shader compilation\n    const mirrorStr = options.mirror === false ? 'nomirror' : 'mirror';\n    const shaderKey = `reflection-filter-${mirrorStr}`;\n\n    // Create the filter with options\n    const filter = new ReflectionFilter(options);\n\n    // Register filter with shader manager\n    try {\n        shaderManager.registerFilter(filter, shaderKey);\n    } catch (error) {\n        console.warn('Error registering reflection filter with shader manager:', error);\n    }\n\n    // Track animation state if we're using animation\n    let animationActive = false;\n    let animationFrameId: number | null = null;\n    let lastTime = 0;\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-30 for amplitude\n                    // Using amplitude as a Range object or direct value based on what's available\n                    if (typeof filter.amplitude === 'object') {\n                        // If amplitude is a Range object (array-like with start and end)\n                        filter.amplitude[0] = 0;\n                        filter.amplitude[1] = normalizedIntensity * 3; // 0-30 range\n                    } else {\n                        // Assume it's a direct value\n                        filter.amplitudeEnd = normalizedIntensity * 3; // 0-30 range\n                    }\n                    break;\n                case 'waveLength':\n                    // Map 0-10 to 30-100 for wavelength\n                    if (typeof filter.waveLength === 'object') {\n                        // If waveLength is a Range object\n                        const start = 30;\n                        const end = 30 + (normalizedIntensity * 7); // 30-100 range\n                        filter.waveLength[0] = start;\n                        filter.waveLength[1] = end;\n                    } else {\n                        filter.wavelengthEnd = 30 + (normalizedIntensity * 7); // 30-100 range\n                    }\n                    break;\n                case 'boundary':\n                    // Map 0-10 to 0-1 for boundary, which controls reflection height\n                    filter.boundary = 1 - (normalizedIntensity / 10); // Inverse mapping (higher intensity = larger reflection)\n                    break;\n                case 'alpha':\n                    // Map 0-10 to 0-1 for alpha\n                    if (typeof filter.alpha === 'object') {\n                        // If alpha is a Range object\n                        filter.alpha[0] = normalizedIntensity / 10;\n                        filter.alpha[1] = normalizedIntensity / 10;\n                    } else {\n                        // Assume separate alphaStart and alphaEnd properties\n                        filter.alphaStart = normalizedIntensity / 10;\n                        filter.alphaEnd = normalizedIntensity / 10;\n                    }\n                    break;\n                default:\n                    // Default to adjusting amplitude as it's the most visible effect\n                    if (typeof filter.amplitude === 'object') {\n                        filter.amplitude = [0, normalizedIntensity * 3]; // 0-30 range\n                    } else {\n                        filter.amplitudeEnd = normalizedIntensity * 3;\n                    }\n            }\n        } else {\n            // Default behavior - adjust amplitude (most visible effect)\n            if (typeof filter.amplitude === 'object') {\n                filter.amplitude[0] = 0;\n                filter.amplitude[1] = normalizedIntensity * 3; // 0-30 range\n            } else {\n                filter.amplitudeEnd = normalizedIntensity * 3;\n            }\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.1;\n            filter.time += delta * animationSpeed;\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\n    updateIntensity(config.intensity);\n\n    // Start animation if initial intensity > 0 and animation is enabled\n    if (config.animate && config.intensity > 0) {\n        startAnimation();\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 alpha using config values or defaults\n        if (typeof filter.alpha === 'object') {\n            // Use a direct array assignment to avoid type conflicts\n            if (config.alpha && Array.isArray(config.alpha)) {\n                filter.alpha[0] = config.alpha[0];\n                filter.alpha[1] = config.alpha[1];\n            } else {\n                filter.alpha[0] = 1;\n                filter.alpha[1] = 1;\n            }\n        } else {\n            filter.alphaStart = config.alphaStart ?? 1;\n            filter.alphaEnd = config.alphaEnd ?? 1;\n        }\n\n        // Reset amplitude using config values or defaults\n        if (typeof filter.amplitude === 'object') {\n            // Use a direct array assignment to avoid type conflicts\n            if (config.amplitude && Array.isArray(config.amplitude)) {\n                filter.amplitude[0] = config.amplitude[0];\n                filter.amplitude[1] = config.amplitude[1];\n            } else {\n                filter.amplitude[0] = 0;\n                filter.amplitude[1] = 20;\n            }\n        } else {\n            filter.amplitudeStart = config.amplitudeStart ?? 0;\n            filter.amplitudeEnd = config.amplitudeEnd ?? 20;\n        }\n\n        // Reset wavelength using config values or defaults\n        if (typeof filter.waveLength === 'object') {\n            // Use a direct array assignment to avoid type conflicts\n            if (config.waveLength && Array.isArray(config.waveLength)) {\n                filter.waveLength[0] = config.waveLength[0];\n                filter.waveLength[1] = config.waveLength[1];\n            } else {\n                filter.waveLength[0] = 30;\n                filter.waveLength[1] = 100;\n            }\n        } else {\n            filter.wavelengthStart = config.wavelengthStart ?? 30;\n            filter.wavelengthEnd = config.wavelengthEnd ?? 100;\n        }\n\n        // Reset boundary using config value or default\n        filter.boundary = config.boundary ?? 0.5;\n\n        // Reset mirror using config value or default\n        filter.mirror = config.mirror ?? true;\n\n        // Always reset time to 0 for consistent initial state\n        filter.time = 0;\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        // Release shader resources\n        try {\n            shaderManager.releaseFilter(filter, shaderKey);\n        } catch (error) {\n            console.warn('Error releasing reflection filter shader:', error);\n        }\n\n        // Destroy the filter\n        filter.destroy();\n    };\n\n    return { filter, updateIntensity, reset, dispose };\n}"],"names":["ShaderResourceManager","ReflectionFilter"],"mappings":"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"}