{"version":3,"file":"motionBlurFilter.cjs","sources":["../../../src/filters/motionBlurFilter.ts"],"sourcesContent":["import { MotionBlurFilter } from 'pixi-filters';\nimport { type MotionBlurFilterConfig, type FilterResult } from './types';\nimport type { PointData } from 'pixi.js';\nimport { ShaderResourceManager } from '../managers/ShaderResourceManager';\n\n/**\n * Creates a MotionBlur filter that applies a motion blur effect to an object\n *\n * The MotionBlurFilter creates blur in a specific direction simulating movement.\n * It has controls for velocity (direction and intensity of the effect) as well as\n * kernel size and offset parameters.\n * Uses shader pooling for better performance.\n *\n * @param config - Configuration for the MotionBlur filter\n * @returns FilterResult with the filter instance and control functions\n */\nexport function createMotionBlurFilter(config: MotionBlurFilterConfig): 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.kernelSize !== undefined) options.kernelSize = config.kernelSize;\n    if (config.offset !== undefined) options.offset = config.offset;\n    if (config.velocity !== undefined) options.velocity = config.velocity;\n    if (config.velocityX !== undefined) options.velocityX = config.velocityX;\n    if (config.velocityY !== undefined) options.velocityY = config.velocityY;\n\n    // Create a unique key for this filter configuration\n    const kernelSizeStr = (options.kernelSize || 5).toString();\n    const shaderKey = `motion-blur-filter-${kernelSizeStr}`;\n\n    // Create the filter with options\n    const filter = new MotionBlurFilter(options);\n\n    // Register filter with shader manager\n    try {\n        shaderManager.registerFilter(filter, shaderKey);\n    } catch (error) {\n        console.warn('Error registering motion blur filter with shader manager:', error);\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 'velocity':\n                    // If velocity is an object with x and y properties\n                    if (config.direction) {\n                        // Calculate velocity based on intensity and direction\n                        const angle = config.direction * Math.PI / 180; // Convert degrees to radians\n                        const velocityMagnitude = normalizedIntensity * 2; // Scale intensity to reasonable velocity\n\n                        // Calculate x and y components\n                        filter.velocityX = Math.cos(angle) * velocityMagnitude;\n                        filter.velocityY = Math.sin(angle) * velocityMagnitude;\n                    } else {\n                        // Default to horizontal motion if no direction specified\n                        filter.velocityX = normalizedIntensity * 2;\n                        filter.velocityY = 0;\n                    }\n                    break;\n                case 'velocityX':\n                    // Map 0-10 to 0-20 range for a visible effect\n                    filter.velocityX = normalizedIntensity * 2;\n                    break;\n                case 'velocityY':\n                    // Map 0-10 to 0-20 range for a visible effect\n                    filter.velocityY = normalizedIntensity * 2;\n                    break;\n                case 'kernelSize':\n                    // Map 0-10 to 5-15 range (must be odd number >= 5)\n                    // First multiply by 1, then add 5, then ensure it's an odd number\n                    const rawSize = 5 + Math.floor(normalizedIntensity);\n                    filter.kernelSize = rawSize % 2 === 0 ? rawSize + 1 : rawSize;\n                    break;\n                case 'offset':\n                    // Map 0-10 to 0-10 range for offset\n                    filter.offset = normalizedIntensity;\n                    break;\n                default:\n                    // Default to adjusting velocityX\n                    filter.velocityX = normalizedIntensity * 2;\n            }\n        } else {\n            // Default behavior - use direction if specified or default to horizontal motion\n            if (config.direction !== undefined) {\n                // Calculate velocity based on intensity and direction\n                const angle = config.direction * Math.PI / 180; // Convert degrees to radians\n                const velocityMagnitude = normalizedIntensity * 2; // Scale intensity\n\n                // Calculate x and y components\n                filter.velocityX = Math.cos(angle) * velocityMagnitude;\n                filter.velocityY = Math.sin(angle) * velocityMagnitude;\n            } else {\n                // Default to horizontal motion\n                filter.velocityX = normalizedIntensity * 2;\n                filter.velocityY = 0;\n            }\n        }\n    };\n\n    // Set initial intensity\n    updateIntensity(config.intensity);\n\n    /**\n     * Reset the filter to configured state or default values if not specified\n     */\n    const reset = (): void => {\n        // Reset kernel size to config value or default\n        filter.kernelSize = config.kernelSize !== undefined ? config.kernelSize : 5;\n\n        // Reset offset to config value or default\n        filter.offset = config.offset !== undefined ? config.offset : 0;\n\n        // Reset velocity - prioritize direct velocityX/Y settings over velocity object\n        if (config.velocityX !== undefined) {\n            filter.velocityX = config.velocityX;\n        } else if (config.velocity?.x !== undefined) {\n            filter.velocityX = config.velocity.x;\n        } else {\n            filter.velocityX = 0;\n        }\n\n        if (config.velocityY !== undefined) {\n            filter.velocityY = config.velocityY;\n        } else if (config.velocity?.y !== undefined) {\n            filter.velocityY = config.velocity.y;\n        } else {\n            filter.velocityY = 0;\n        }\n\n        // If direction was specified but no velocities, calculate from direction\n        if (config.direction !== undefined &&\n            config.velocityX === undefined &&\n            config.velocityY === undefined &&\n            config.velocity === undefined) {\n            const angle = config.direction * Math.PI / 180; // Convert degrees to radians\n            const defaultVelocity = 0; // No velocity when reset\n            filter.velocityX = Math.cos(angle) * defaultVelocity;\n            filter.velocityY = Math.sin(angle) * defaultVelocity;\n        }\n    };\n\n    /**\n     * Release any WebGL resources used by this filter\n     */\n    const dispose = (): void => {\n        try {\n            shaderManager.releaseFilter(filter, shaderKey);\n        } catch (error) {\n            console.warn('Error releasing motion blur filter shader:', error);\n        }\n        filter.destroy();\n    };\n\n    return { filter, updateIntensity, reset, dispose };\n}"],"names":["ShaderResourceManager","MotionBlurFilter"],"mappings":"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"}