UNPKG

kinetic-slider

Version:

A WebGL-powered kinetic slider component using PIXI.js

1 lines 9.64 kB
{"version":3,"file":"asciiFilter.cjs","sources":["../../../src/filters/asciiFilter.ts"],"sourcesContent":["// src/components/KineticSlider/filters/asciiFilter.ts\n\nimport { AsciiFilter } from 'pixi-filters';\nimport { type AsciiFilterConfig, type FilterResult } from './types';\nimport type { ColorSource } from \"pixi.js\";\nimport { ShaderResourceManager } from '../managers/ShaderResourceManager';\n\n/**\n * Creates an AsciiFilter that renders the image as ASCII characters\n *\n * The AsciiFilter applies an ASCII art effect to the rendered object.\n * Uses shader pooling for better performance.\n *\n * @param config - Configuration for the ASCII filter\n * @returns FilterResult with the filter instance and control functions\n */\nexport function createAsciiFilter(config: AsciiFilterConfig): FilterResult {\n // Get shader manager instance\n const shaderManager = ShaderResourceManager.getInstance();\n\n // Create a unique key for this filter configuration\n const colorKey = config.color ? JSON.stringify(config.color) : 'default';\n const shaderKey = `ascii-filter-${config.size || 8}-${colorKey}-${config.replaceColor || false}`;\n\n // Create the filter with basic options\n const filter = new AsciiFilter();\n\n // Register filter with shader manager\n try {\n shaderManager.registerFilter(filter, shaderKey);\n } catch (error) {\n console.warn('Error registering ASCII filter with shader manager:', error);\n }\n\n // Store config values for consistent use\n const configSize = config.size !== undefined ? config.size : 8;\n const configColor: ColorSource | undefined = config.color;\n const configReplaceColor: boolean | undefined = config.replaceColor;\n\n // Initialize filter state\n let isFirstActivation = true;\n let pendingTimeout: number | null = null;\n\n // Initialize with minimal settings first\n filter.size = configSize;\n\n if (configColor !== undefined) {\n filter.color = configColor;\n }\n\n // Start with replaceColor set to false, ensuring proper initial rendering\n filter.replaceColor = false;\n\n console.log('AsciiFilter created with initial properties:', {\n size: filter.size,\n color: filter.color,\n replaceColor: filter.replaceColor\n });\n\n /**\n * Force a complete refresh of the filter to ensure proper state\n */\n const forceRefresh = (intensity: number): void => {\n // Clear any pending timeout to avoid race conditions\n if (pendingTimeout !== null) {\n clearTimeout(pendingTimeout);\n pendingTimeout = null;\n }\n\n // Ensure size is correct\n const normalizedIntensity = Math.max(0, Math.min(10, intensity));\n filter.size = Math.max(2, Math.round(2 + (normalizedIntensity * 1.8)));\n\n // Ensure color is correct\n if (configColor !== undefined) {\n filter.color = configColor;\n }\n\n // Temporarily set replaceColor to false (if it should be true)\n if (configReplaceColor === true) {\n filter.replaceColor = false;\n\n // Then set a timeout to set it to true after the next render\n pendingTimeout = window.setTimeout(() => {\n filter.replaceColor = true;\n pendingTimeout = null;\n console.log('AsciiFilter replaceColor applied after refresh');\n }, 50);\n } else if (configReplaceColor !== undefined) {\n filter.replaceColor = configReplaceColor;\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 // For first activation, force a complete refresh\n if (isFirstActivation) {\n console.log('First activation of AsciiFilter - forcing complete refresh');\n forceRefresh(intensity);\n isFirstActivation = false;\n } else {\n // Standard intensity update\n const normalizedIntensity = Math.max(0, Math.min(10, intensity));\n filter.size = Math.max(2, Math.round(2 + (normalizedIntensity * 1.8)));\n\n\n // Ensure color is maintained\n if (configColor !== undefined) {\n filter.color = configColor;\n }\n\n // Ensure replaceColor is maintained\n if (configReplaceColor !== undefined) {\n filter.replaceColor = configReplaceColor;\n }\n }\n\n //console.log(`AsciiFilter intensity updated: ${intensity} → size: ${size ?? filter.size} (larger = chunkier ASCII)`);\n };\n\n /**\n * Reset the filter to defaults or config values\n */\n const reset = (): void => {\n // Clear any pending timeout\n if (pendingTimeout !== null) {\n clearTimeout(pendingTimeout);\n pendingTimeout = null;\n }\n\n // Reset properties\n filter.size = configSize;\n\n if (configColor !== undefined) {\n filter.color = configColor;\n } else {\n filter.color = 0xffffff;\n }\n\n // For replaceColor, follow our special pattern\n if (configReplaceColor === true) {\n isFirstActivation = true; // Force the refresh process on next update\n filter.replaceColor = false; // Start with false\n } else if (configReplaceColor !== undefined) {\n filter.replaceColor = configReplaceColor;\n } else {\n filter.replaceColor = false;\n }\n\n console.log('AsciiFilter reset to initial state');\n };\n\n /**\n * Release any WebGL resources used by this filter\n */\n const dispose = (): void => {\n // Clear any pending timeout\n if (pendingTimeout !== null) {\n clearTimeout(pendingTimeout);\n pendingTimeout = null;\n }\n\n try {\n shaderManager.releaseFilter(filter, shaderKey);\n } catch (error) {\n console.warn('Error releasing ASCII filter shader:', error);\n }\n filter.destroy();\n };\n\n // No initial updateIntensity call here - wait for first active call\n\n return { filter, updateIntensity, reset, dispose };\n}"],"names":["ShaderResourceManager","AsciiFilter"],"mappings":"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"}