UNPKG

kinetic-slider

Version:

A WebGL-powered kinetic slider component using PIXI.js

1 lines 12.4 kB
{"version":3,"file":"convolutionFilter.cjs","sources":["../../../src/filters/convolutionFilter.ts"],"sourcesContent":["import {ConvolutionFilter, type ConvolutionMatrix} from 'pixi-filters';\nimport { type ConvolutionFilterConfig, type FilterResult } from './types';\nimport { ShaderResourceManager } from '../managers/ShaderResourceManager';\n\n/**\n * Helper function to create ConvolutionMatrix from number array\n * @param values - Array of 9 numbers for the 3x3 matrix\n * @returns A Float32Array that conforms to the ConvolutionMatrix type\n */\nfunction createMatrix(values: number[]): ConvolutionMatrix {\n return new Float32Array(values);\n}\n\n/**\n * Creates a Convolution filter that applies a matrix convolution effect\n *\n * A convolution combines pixels in the input image with neighboring pixels to produce\n * a new image. Using different matrices, a wide variety of effects can be achieved,\n * including blurring, edge detection, sharpening, embossing, and beveling.\n * Uses shader pooling for better performance.\n *\n * @param config - Configuration for the Convolution filter\n * @returns FilterResult with the filter instance and control functions\n */\nexport function createConvolutionFilter(config: ConvolutionFilterConfig): FilterResult {\n // Get shader manager instance\n const shaderManager = ShaderResourceManager.getInstance();\n\n // Create options object for the filter\n const options: any = {\n width: config.width ?? 200, // Default width\n height: config.height ?? 200, // Default height\n };\n\n // Use provided matrix or default to an identity matrix (no effect)\n const defaultMatrix = createMatrix([0, 0, 0, 0, 1, 0, 0, 0, 0]);\n if (config.matrix) {\n options.matrix = config.matrix;\n } else {\n options.matrix = defaultMatrix;\n }\n\n // Create a unique key for this filter configuration\n const presetKey = config.preset || 'custom';\n const shaderKey = `convolution-filter-${presetKey}-${config.width || 200}-${config.height || 200}`;\n\n // Create the filter with options\n const filter = new ConvolutionFilter(options);\n\n // Register filter with shader manager\n try {\n shaderManager.registerFilter(filter, shaderKey);\n } catch (error) {\n console.warn('Error registering convolution filter with shader manager:', error);\n }\n\n // Common convolution matrices for different effects\n type PresetMatrices = {\n [key: string]: ConvolutionMatrix;\n };\n\n const presetMatrices: PresetMatrices = {\n normal: createMatrix([0, 0, 0, 0, 1, 0, 0, 0, 0]), // Identity (no effect)\n gaussianBlur: createMatrix([1/16, 2/16, 1/16,\n 2/16, 4/16, 2/16,\n 1/16, 2/16, 1/16]), // Gaussian blur\n boxBlur: createMatrix([1/9, 1/9, 1/9,\n 1/9, 1/9, 1/9,\n 1/9, 1/9, 1/9]), // Box blur\n sharpen: createMatrix([0, -1, 0,\n -1, 5, -1,\n 0, -1, 0]), // Sharpen\n edgeDetection: createMatrix([-1, -1, -1,\n -1, 8, -1,\n -1, -1, -1]), // Edge detection\n emboss: createMatrix([-2, -1, 0,\n -1, 1, 1,\n 0, 1, 2]), // Emboss\n topSobel: createMatrix([1, 2, 1,\n 0, 0, 0,\n -1, -2, -1]), // Top Sobel edge detection\n rightSobel: createMatrix([-1, 0, 1,\n -2, 0, 2,\n -1, 0, 1]) // Right Sobel edge detection\n };\n\n /**\n * Apply a preset matrix effect\n *\n * @param presetName - Name of the preset effect to apply\n * @param intensity - Optional intensity factor to scale the effect (1.0 = normal)\n */\n const applyPreset = (presetName: string, intensity: number = 1.0): void => {\n if (presetMatrices[presetName]) {\n // If intensity is not 1.0, scale the matrix values\n if (intensity !== 1.0) {\n // Start with identity matrix (center pixel only)\n const baseMatrix = new Float32Array(presetMatrices.normal);\n const effectMatrix = presetMatrices[presetName];\n const scaledMatrix = new Float32Array(9);\n\n // For each position in the matrix\n for (let i = 0; i < 9; i++) {\n // Calculate the difference between effect and base (identity)\n const diff = effectMatrix[i] - baseMatrix[i];\n // Scale the difference by intensity and add to base\n scaledMatrix[i] = baseMatrix[i] + (diff * intensity);\n }\n\n // Apply the scaled matrix\n filter.matrix = scaledMatrix;\n } else {\n // Apply preset directly at full intensity\n filter.matrix = new Float32Array(presetMatrices[presetName]);\n }\n } else {\n console.warn(`Preset \"${presetName}\" not found, using default matrix`);\n filter.matrix = new Float32Array(defaultMatrix);\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 // Convert to 0-1 range for easier matrix manipulation\n const scaledIntensity = normalizedIntensity / 10;\n\n // Check if we have a preset to apply\n if (config.preset && presetMatrices[config.preset]) {\n applyPreset(config.preset, scaledIntensity);\n }\n // If we have a primary matrix property defined\n else if (config.primaryProperty === 'matrix' && config.matrix) {\n // Scale between identity (no effect) and the provided matrix\n const baseMatrix = new Float32Array(presetMatrices.normal);\n const scaledMatrix = new Float32Array(9);\n\n // For each position in the matrix\n for (let i = 0; i < 9; i++) {\n if (config.matrix) {\n // Calculate the difference between configured and base (identity)\n const diff = config.matrix[i] - baseMatrix[i];\n // Scale the difference by intensity and add to base\n scaledMatrix[i] = baseMatrix[i] + (diff * scaledIntensity);\n } else {\n scaledMatrix[i] = baseMatrix[i];\n }\n }\n\n // Apply the scaled matrix\n filter.matrix = scaledMatrix;\n }\n // If nothing else applies, use a default effect (sharpen)\n else {\n applyPreset('sharpen', scaledIntensity);\n }\n };\n\n // Set initial intensity\n updateIntensity(config.intensity);\n\n /**\n * Reset the filter to default state (identity matrix - no effect)\n */\n const reset = (): void => {\n filter.matrix = new Float32Array(presetMatrices.normal);\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 convolution filter shader:', error);\n }\n filter.destroy();\n };\n\n return { filter, updateIntensity, reset, dispose };\n}"],"names":["ShaderResourceManager","ConvolutionFilter"],"mappings":"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"}