UNPKG

kinetic-slider

Version:

A WebGL-powered kinetic slider component using PIXI.js

1 lines 10.6 kB
{"version":3,"file":"godrayFilter.cjs","sources":["../../../src/filters/godrayFilter.ts"],"sourcesContent":["import { GodrayFilter } from 'pixi-filters';\nimport { type GodrayFilterConfig, type FilterResult } from './types';\nimport { ShaderResourceManager } from '../managers/ShaderResourceManager';\n\n/**\n * Creates a Godray filter that applies light ray effects\n *\n * The GodrayFilter creates crepuscular rays (light shafts) extending from a bright source\n * which can be animated and customized for intensity, direction, and density.\n * Uses shader pooling for better performance.\n *\n * @param config - Configuration for the Godray filter\n * @returns FilterResult with the filter instance and control functions\n */\nexport function createGodrayFilter(config: GodrayFilterConfig): 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.angle !== undefined) options.angle = config.angle;\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.gain !== undefined) options.gain = config.gain;\n if (config.lacunarity !== undefined) options.lacunarity = config.lacunarity;\n if (config.parallel !== undefined) options.parallel = config.parallel;\n if (config.time !== undefined) options.time = config.time;\n\n // Create a unique key for this filter configuration\n const angleStr = (options.angle || 30).toString();\n const parallelStr = options.parallel ? 'parallel' : 'radial';\n const shaderKey = `godray-filter-${angleStr}-${parallelStr}`;\n\n // Create the filter with options\n const filter = new GodrayFilter(options);\n\n // Register filter with shader manager\n try {\n shaderManager.registerFilter(filter, shaderKey);\n } catch (error) {\n console.warn('Error registering godray filter with shader manager:', error);\n }\n\n // Keep track of animation state\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 'gain':\n // Map 0-10 to 0-1 range for gain (intensity)\n filter.gain = normalizedIntensity / 10;\n break;\n case 'alpha':\n // Map 0-10 to 0-1 range for alpha (opacity)\n filter.alpha = normalizedIntensity / 10;\n break;\n case 'lacunarity':\n // Map 0-10 to 0.5-5 range for lacunarity (density)\n filter.lacunarity = 0.5 + (normalizedIntensity / 2);\n break;\n case 'angle':\n // Map 0-10 to 0-360 degrees for angle\n filter.angle = normalizedIntensity * 36;\n break;\n default:\n // Default to gain adjustment (most visible effect)\n filter.gain = normalizedIntensity / 10;\n }\n } else {\n // Default behavior - adjust gain (intensity)\n filter.gain = normalizedIntensity / 10;\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\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.01;\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 initial configuration values or defaults\n */\n const reset = (): void => {\n // Reset enabled property if it exists and was specified in config\n if ('enabled' in filter) {\n filter.enabled = config.enabled !== undefined ? config.enabled : true;\n }\n\n // Reset alpha if it exists on the filter and was specified in config\n if ('alpha' in filter) {\n (filter as any).alpha = config.alpha !== undefined ? config.alpha : 1;\n }\n\n // Even though GrayscaleFilter doesn't have many configurable properties,\n // if intensity was provided, apply it for consistency with other filters\n if (config.intensity !== undefined) {\n updateIntensity(config.intensity);\n }\n };\n\n /**\n * Release any WebGL resources used by this filter and stop animations\n */\n const dispose = (): void => {\n // Stop any ongoing animations\n stopAnimation();\n\n // Release shader resources\n try {\n shaderManager.releaseFilter(filter, shaderKey);\n } catch (error) {\n console.warn('Error releasing godray filter shader:', error);\n }\n\n // Destroy the filter\n filter.destroy();\n };\n\n return { filter, updateIntensity, reset, dispose };\n}"],"names":["ShaderResourceManager","GodrayFilter"],"mappings":"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"}