UNPKG

kinetic-slider

Version:

A WebGL-powered kinetic slider component using PIXI.js

1 lines 12.4 kB
{"version":3,"file":"rgbSplitFilter.cjs","sources":["../../../src/filters/rgbSplitFilter.ts"],"sourcesContent":["import { RGBSplitFilter } from 'pixi-filters';\nimport { type RGBSplitFilterConfig, type FilterResult } from './types';\nimport { ShaderResourceManager } from '../managers/ShaderResourceManager';\n\n/**\n * Creates an RGBSplit filter that separates the RGB channels of an object\n *\n * The RGBSplitFilter offsets the red, green, and blue channels separately,\n * creating a chromatic aberration effect commonly used for glitch or retro effects.\n * Uses shader pooling for better performance.\n *\n * @param config - Configuration for the RGBSplit filter\n * @returns FilterResult with the filter instance and control functions\n */\nexport function createRGBSplitFilter(config: RGBSplitFilterConfig): 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.red) options.red = config.red;\n if (config.green) options.green = config.green;\n if (config.blue) options.blue = config.blue;\n\n // Alternative way to set specific coordinates\n if (config.redX !== undefined) options.redX = config.redX;\n if (config.redY !== undefined) options.redY = config.redY;\n if (config.greenX !== undefined) options.greenX = config.greenX;\n if (config.greenY !== undefined) options.greenY = config.greenY;\n if (config.blueX !== undefined) options.blueX = config.blueX;\n if (config.blueY !== undefined) options.blueY = config.blueY;\n\n // Create a unique key for this filter configuration\n // RGB split filter shader doesn't depend on the offset values\n // so we can use a static key\n const shaderKey = 'rgb-split-filter';\n\n // Create the filter with options\n const filter = new RGBSplitFilter(options);\n\n // Register filter with shader manager\n try {\n shaderManager.registerFilter(filter, shaderKey);\n } catch (error) {\n console.warn('Error registering RGB split 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 'red':\n // Map 0-10 to appropriate x/y offsets for red channel\n if (config.redDirection === 'horizontal' || !config.redDirection) {\n filter.red = { x: -normalizedIntensity, y: 0 };\n } else if (config.redDirection === 'vertical') {\n filter.red = { x: 0, y: -normalizedIntensity };\n } else if (config.redDirection === 'diagonal') {\n filter.red = { x: -normalizedIntensity, y: -normalizedIntensity };\n }\n break;\n case 'green':\n // Map 0-10 to appropriate x/y offsets for green channel\n if (config.greenDirection === 'horizontal') {\n filter.green = { x: normalizedIntensity, y: 0 };\n } else if (config.greenDirection === 'vertical' || !config.greenDirection) {\n filter.green = { x: 0, y: normalizedIntensity };\n } else if (config.greenDirection === 'diagonal') {\n filter.green = { x: normalizedIntensity, y: normalizedIntensity };\n }\n break;\n case 'blue':\n // Map 0-10 to appropriate x/y offsets for blue channel\n if (config.blueDirection === 'horizontal') {\n filter.blue = { x: normalizedIntensity, y: 0 };\n } else if (config.blueDirection === 'vertical') {\n filter.blue = { x: 0, y: normalizedIntensity };\n } else if (config.blueDirection === 'diagonal' || !config.blueDirection) {\n filter.blue = { x: normalizedIntensity, y: -normalizedIntensity };\n }\n break;\n default:\n // Default behavior - adjust all channels in classic configuration\n applyBalancedSplit(normalizedIntensity);\n }\n } else {\n // Default behavior - adjust all channels in classic configuration\n applyBalancedSplit(normalizedIntensity);\n }\n };\n\n /**\n * Apply a balanced RGB split with classic positioning\n * (red to left, green up, blue diagonally)\n *\n * @param intensity - Intensity value (0-10)\n */\n const applyBalancedSplit = (intensity: number): void => {\n // Scale intensity for visual effect (0-10 to appropriate pixel ranges)\n const scaledIntensity = intensity * 1.5;\n\n // Classic RGB split configuration:\n // Red channel to the left\n filter.red = { x: -scaledIntensity, y: 0 };\n\n // Green channel upward\n filter.green = { x: 0, y: scaledIntensity };\n\n // Blue channel down-right\n filter.blue = { x: scaledIntensity, y: 0 };\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 red channel to config values or default\n if (config.red) {\n filter.red = config.red;\n } else if (config.redX !== undefined || config.redY !== undefined) {\n filter.red = {\n x: config.redX !== undefined ? config.redX : -10, // Default redX is -10\n y: config.redY !== undefined ? config.redY : 0 // Default redY is 0\n };\n } else {\n filter.red = { x: -10, y: 0 }; // Default from RGBSplitFilter docs\n }\n\n // Reset green channel to config values or default\n if (config.green) {\n filter.green = config.green;\n } else if (config.greenX !== undefined || config.greenY !== undefined) {\n filter.green = {\n x: config.greenX !== undefined ? config.greenX : 0, // Default greenX is 0\n y: config.greenY !== undefined ? config.greenY : 10 // Default greenY is 10\n };\n } else {\n filter.green = { x: 0, y: 10 }; // Default from RGBSplitFilter docs\n }\n\n // Reset blue channel to config values or default\n if (config.blue) {\n filter.blue = config.blue;\n } else if (config.blueX !== undefined || config.blueY !== undefined) {\n filter.blue = {\n x: config.blueX !== undefined ? config.blueX : 0, // Default blueX is 0\n y: config.blueY !== undefined ? config.blueY : 0 // Default blueY is 0\n };\n } else {\n filter.blue = { x: 0, y: 0 }; // Default from RGBSplitFilter docs\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 RGB split filter shader:', error);\n }\n filter.destroy();\n };\n\n return { filter, updateIntensity, reset, dispose };\n}"],"names":["ShaderResourceManager","RGBSplitFilter"],"mappings":"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"}