@firecms/neat 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -29
- package/dist/NeatGradient.d.ts +29 -43
- package/dist/NeatGradient.js +346 -897
- package/dist/NeatGradient.js.map +1 -1
- package/dist/index.es.js +757 -731
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +103 -120
- package/dist/index.umd.js.map +1 -1
- package/dist/math.d.ts +26 -0
- package/dist/math.js +148 -0
- package/dist/math.js.map +1 -0
- package/dist/shaders.d.ts +6 -0
- package/dist/shaders.js +407 -0
- package/dist/shaders.js.map +1 -0
- package/dist/types.d.ts +52 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +3 -7
- package/src/NeatGradient.ts +410 -967
- package/src/math.ts +162 -0
- package/src/shaders.ts +411 -0
- package/src/types.ts +54 -0
package/dist/index.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.js","sources":["../src/NeatGradient.ts"],"sourcesContent":["import * as THREE from \"three\";\n\nconsole.info(\n \"%c🌈 Neat Gradients%c\\n\\nLicensed under MIT + The Commons Clause.\\nFree for personal and commercial use.\\nSelling this software or its derivatives is strictly prohibited.\\nhttps://neat.firecms.co\",\n \"font-weight: bold; font-size: 14px; color: #FF5772;\", \"color: inherit;\"\n);\n\nconst PLANE_WIDTH = 50;\nconst PLANE_HEIGHT = 80;\n\nconst WIREFRAME = true;\nconst COLORS_COUNT = 6;\n\nconst clock = new THREE.Clock();\n\nconst LINK_ID = generateRandomString();\n\ntype SceneState = {\n renderer: THREE.WebGLRenderer,\n camera: THREE.Camera,\n scene: THREE.Scene,\n meshes: THREE.Mesh[],\n resolution: number\n}\n\n// Interface for the Uniforms to avoid @ts-ignore and improve access speed\ninterface NeatUniforms {\n [key: string]: THREE.IUniform;\n u_time: { value: number };\n u_resolution: { value: THREE.Vector2 };\n u_color_pressure: { value: THREE.Vector2 };\n u_colors: { value: { is_active: number; color: THREE.Color; influence: number }[] };\n u_mouse_texture: { value: THREE.Texture | null };\n}\n\nexport type NeatConfig = {\n resolution?: number;\n speed?: number;\n horizontalPressure?: number;\n verticalPressure?: number;\n waveFrequencyX?: number;\n waveFrequencyY?: number;\n waveAmplitude?: number;\n highlights?: number;\n shadows?: number;\n colorSaturation?: number;\n colorBrightness?: number;\n colors: NeatColor[];\n colorBlending?: number;\n grainScale?: number;\n grainIntensity?: number;\n grainSparsity?: number;\n grainSpeed?: number;\n wireframe?: boolean;\n backgroundColor?: string;\n backgroundAlpha?: number;\n yOffset?: number;\n yOffsetWaveMultiplier?: number;\n yOffsetColorMultiplier?: number;\n yOffsetFlowMultiplier?: number;\n // Flow field parameters\n flowDistortionA?: number;\n flowDistortionB?: number;\n flowScale?: number;\n flowEase?: number;\n flowEnabled?: boolean;\n // Mouse interaction\n /** Strength of mouse-driven distortion */\n mouseDistortionStrength?: number;\n /** Radius / area of mouse-driven distortion in UV space (0–1-ish) */\n mouseDistortionRadius?: number;\n /** How quickly mouse trails decay/fade (0.9=slow/wobbly, 0.99=fast/sharp) */\n mouseDecayRate?: number;\n mouseDarken?: number;\n // Texture generation\n enableProceduralTexture?: boolean;\n textureVoidLikelihood?: number;\n textureVoidWidthMin?: number;\n textureVoidWidthMax?: number;\n textureBandDensity?: number;\n textureColorBlending?: number;\n textureSeed?: number;\n textureEase?: number;\n proceduralBackgroundColor?: string;\n textureShapeTriangles?: number;\n textureShapeCircles?: number;\n textureShapeBars?: number;\n textureShapeSquiggles?: number;\n};\n\nexport type NeatColor = {\n color: string;\n enabled: boolean;\n /**\n * Value from 0 to 1\n */\n influence?: number;\n}\n\nexport type NeatController = {\n destroy: () => void;\n}\n\nexport class NeatGradient implements NeatController {\n\n private _ref: HTMLCanvasElement;\n\n private _speed: number = -1;\n\n private _horizontalPressure: number = -1;\n private _verticalPressure: number = -1;\n\n private _waveFrequencyX: number = -1;\n private _waveFrequencyY: number = -1;\n private _waveAmplitude: number = -1;\n\n private _shadows: number = -1;\n private _highlights: number = -1;\n private _saturation: number = -1;\n private _brightness: number = -1;\n\n private _grainScale: number = -1;\n private _grainIntensity: number = -1;\n private _grainSparsity: number = -1;\n private _grainSpeed: number = -1;\n\n private _colorBlending: number = -1;\n\n private _colors: NeatColor[] = [];\n private _wireframe: boolean = false;\n\n private _backgroundColor: string = \"#FFFFFF\";\n private _backgroundAlpha: number = 1.0;\n\n // Flow field properties\n private _flowDistortionA: number = 0;\n private _flowDistortionB: number = 0;\n private _flowScale: number = 1.0;\n private _flowEase: number = 0.0;\n private _flowEnabled: boolean = true;\n\n // Mouse interaction properties\n private _mouseDistortionStrength: number = 0.0;\n private _mouseDistortionRadius: number = 0.25;\n private _mouseDecayRate: number = 0.96;\n private _mouseDarken: number = 0.0;\n private _mouse: THREE.Vector2 = new THREE.Vector2(-1000, -1000);\n private _mouseFBO: THREE.WebGLRenderTarget | null = null;\n private _sceneMouse: THREE.Scene | null = null;\n private _cameraMouse: THREE.OrthographicCamera | null = null;\n private _mouseObjects: Array<{ mesh: THREE.Mesh, active: boolean }> = [];\n private _currentBrush: number = 0;\n private _mouseBrushBaseScale: number = 1;\n\n // Texture generation properties\n private _enableProceduralTexture: boolean = false;\n private _textureVoidLikelihood: number = 0.45;\n private _textureVoidWidthMin: number = 200;\n private _textureVoidWidthMax: number = 486;\n private _textureBandDensity: number = 2.15;\n private _textureColorBlending: number = 0.01;\n private _textureSeed: number = 333;\n private _textureEase: number = 0.5;\n private _proceduralTexture: THREE.Texture | null = null;\n private _proceduralBackgroundColor: string = \"#000000\";\n\n private _textureShapeTriangles: number = 20;\n private _textureShapeCircles: number = 15;\n private _textureShapeBars: number = 15;\n private _textureShapeSquiggles: number = 10;\n\n private requestRef: number = -1;\n private sizeObserver: ResizeObserver;\n private sceneState: SceneState;\n\n // Optimization: Cache uniforms to avoid lookups and object creation in render loop\n private _cachedUniforms: NeatUniforms | null = null;\n private _linkElement: HTMLAnchorElement | null = null;\n\n private _yOffset: number = 0;\n private _yOffsetWaveMultiplier: number = 0.004;\n private _yOffsetColorMultiplier: number = 0.004;\n private _yOffsetFlowMultiplier: number = 0.004;\n\n // For saving/restoring clear color\n private _tempClearColor = new THREE.Color();\n\n // Performance optimizations\n private _resizeTimeoutId: number | null = null;\n private _textureNeedsUpdate: boolean = false;\n private _lastColorUpdate: number = 0;\n private _linkCheckCounter: number = 0;\n private _mouseUpdateScheduled: boolean = false;\n private _pendingMousePosition: { x: number; y: number } | null = null;\n private _colorsChanged: boolean = true; // Track if colors need update\n\n constructor(config: NeatConfig & { ref: HTMLCanvasElement, resolution?: number, seed?: number }) {\n\n const {\n ref,\n speed = 4,\n horizontalPressure = 3,\n verticalPressure = 3,\n waveFrequencyX = 5,\n waveFrequencyY = 5,\n waveAmplitude = 3,\n colors,\n highlights = 4,\n shadows = 4,\n colorSaturation = 0,\n colorBrightness = 1,\n colorBlending = 5,\n grainScale = 2,\n grainIntensity = 0.55,\n grainSparsity = 0.0,\n grainSpeed = 0.1,\n wireframe = false,\n backgroundColor = \"#FFFFFF\",\n backgroundAlpha = 1.0,\n resolution = 1,\n seed,\n yOffset = 0,\n yOffsetWaveMultiplier = 4,\n yOffsetColorMultiplier = 4,\n yOffsetFlowMultiplier = 4,\n // Flow field parameters\n flowDistortionA = 0,\n flowDistortionB = 0,\n flowScale = 1.0,\n flowEase = 0.0,\n flowEnabled = true,\n // Mouse interaction\n mouseDistortionStrength = 0.0,\n mouseDistortionRadius = 0.25,\n mouseDecayRate = 0.96,\n mouseDarken = 0.0,\n // Texture generation\n enableProceduralTexture = false,\n textureVoidLikelihood = 0.45,\n textureVoidWidthMin = 200,\n textureVoidWidthMax = 486,\n textureBandDensity = 2.15,\n textureColorBlending = 0.01,\n textureSeed = 333,\n textureEase = 0.5,\n proceduralBackgroundColor = \"#000000\",\n textureShapeTriangles = 20,\n textureShapeCircles = 15,\n textureShapeBars = 15,\n textureShapeSquiggles = 10,\n } = config;\n\n\n this._ref = ref;\n\n this.destroy = this.destroy.bind(this);\n this._initScene = this._initScene.bind(this);\n this._buildMaterial = this._buildMaterial.bind(this);\n\n this.speed = speed;\n this.horizontalPressure = horizontalPressure;\n this.verticalPressure = verticalPressure;\n this.waveFrequencyX = waveFrequencyX;\n this.waveFrequencyY = waveFrequencyY;\n this.waveAmplitude = waveAmplitude;\n this.colorBlending = colorBlending;\n this.grainScale = grainScale;\n this.grainIntensity = grainIntensity;\n this.grainSparsity = grainSparsity;\n this.grainSpeed = grainSpeed;\n this.colors = colors;\n this.shadows = shadows;\n this.highlights = highlights;\n this.colorSaturation = colorSaturation;\n this.colorBrightness = colorBrightness;\n this.wireframe = wireframe;\n this.backgroundColor = backgroundColor;\n this.backgroundAlpha = backgroundAlpha;\n this.yOffset = yOffset;\n this.yOffsetWaveMultiplier = yOffsetWaveMultiplier;\n this.yOffsetColorMultiplier = yOffsetColorMultiplier;\n this.yOffsetFlowMultiplier = yOffsetFlowMultiplier;\n\n // Flow field\n this.flowDistortionA = flowDistortionA;\n this.flowDistortionB = flowDistortionB;\n this.flowScale = flowScale;\n this.flowEase = flowEase;\n this.flowEnabled = flowEnabled;\n\n // Mouse interaction\n this.mouseDistortionStrength = mouseDistortionStrength;\n this.mouseDistortionRadius = mouseDistortionRadius;\n this.mouseDecayRate = mouseDecayRate;\n this.mouseDarken = mouseDarken;\n\n // Texture generation\n this.enableProceduralTexture = enableProceduralTexture;\n this.textureVoidLikelihood = textureVoidLikelihood;\n this.textureVoidWidthMin = textureVoidWidthMin;\n this.textureVoidWidthMax = textureVoidWidthMax;\n this.textureBandDensity = textureBandDensity;\n this.textureColorBlending = textureColorBlending;\n this.textureSeed = textureSeed;\n this.textureEase = textureEase;\n this._proceduralBackgroundColor = proceduralBackgroundColor;\n\n this._textureShapeTriangles = textureShapeTriangles;\n this._textureShapeCircles = textureShapeCircles;\n this._textureShapeBars = textureShapeBars;\n this._textureShapeSquiggles = textureShapeSquiggles;\n\n // FIX 1: Setup mouse resources BEFORE building the material/scene\n // This ensures u_mouse_texture isn't null during material compilation\n this._setupMouseInteraction();\n this.sceneState = this._initScene(resolution);\n\n injectSEO();\n\n let tick = seed !== undefined ? seed : getElapsedSecondsInLastHour();\n\n const render = () => {\n\n const { renderer, camera, scene } = this.sceneState;\n\n // Optimization: check if cached link is still valid in DOM less frequently\n this._linkCheckCounter++;\n if (this._linkCheckCounter >= 300) { // Check every ~5 seconds at 60fps\n this._linkCheckCounter = 0;\n if (!this._linkElement || !document.contains(this._linkElement)) {\n this._linkElement = addNeatLink(ref);\n }\n }\n\n // Update Uniforms efficiently without creating new objects\n if (this._cachedUniforms) {\n const u = this._cachedUniforms;\n\n tick += clock.getDelta() * this._speed;\n\n u.u_time.value = tick;\n u.u_resolution.value.set(this._ref.width, this._ref.height);\n u.u_color_pressure.value.set(this._horizontalPressure, this._verticalPressure);\n\n // Directly assign simple values\n u.u_wave_frequency_x.value = this._waveFrequencyX;\n u.u_wave_frequency_y.value = this._waveFrequencyY;\n u.u_wave_amplitude.value = this._waveAmplitude;\n u.u_color_blending.value = this._colorBlending;\n u.u_shadows.value = this._shadows;\n u.u_highlights.value = this._highlights;\n u.u_saturation.value = this._saturation;\n u.u_brightness.value = this._brightness;\n u.u_grain_intensity.value = this._grainIntensity;\n u.u_grain_sparsity.value = this._grainSparsity;\n u.u_grain_speed.value = this._grainSpeed;\n u.u_grain_scale.value = this._grainScale;\n u.u_y_offset.value = this._yOffset;\n u.u_y_offset_wave_multiplier.value = this._yOffsetWaveMultiplier;\n u.u_y_offset_color_multiplier.value = this._yOffsetColorMultiplier;\n u.u_y_offset_flow_multiplier.value = this._yOffsetFlowMultiplier;\n u.u_flow_distortion_a.value = this._flowDistortionA;\n u.u_flow_distortion_b.value = this._flowDistortionB;\n u.u_flow_scale.value = this._flowScale;\n u.u_flow_ease.value = this._flowEase;\n u.u_flow_enabled.value = this._flowEnabled ? 1.0 : 0.0;\n u.u_mouse_distortion_strength.value = this._mouseDistortionStrength;\n u.u_mouse_distortion_radius.value = this._mouseDistortionRadius;\n u.u_mouse_darken.value = this._mouseDarken;\n u.u_enable_procedural_texture.value = this._enableProceduralTexture ? 1.0 : 0.0;\n\n // Only regenerate procedural texture when needed\n if (this._textureNeedsUpdate && this._enableProceduralTexture) {\n if (this._proceduralTexture) {\n this._proceduralTexture.dispose();\n }\n this._proceduralTexture = this._createProceduralTexture();\n this._textureNeedsUpdate = false;\n }\n\n u.u_procedural_texture.value = this._proceduralTexture;\n u.u_texture_ease.value = this._textureEase;\n\n // Wireframe is a material property and must update every frame to avoid artifacts\n // @ts-ignore - access material safely\n this.sceneState.meshes[0].material.wireframe = this._wireframe;\n\n // Optimized Color Update: Update immediately on change, or throttle to 10 times per second\n const now = Date.now();\n const shouldUpdate = this._colorsChanged || (now - this._lastColorUpdate > 100);\n\n if (shouldUpdate) {\n this._lastColorUpdate = now;\n this._colorsChanged = false;\n\n const shaderColors = u.u_colors.value;\n for (let i = 0; i < COLORS_COUNT; i++) {\n if (i < this._colors.length) {\n const c = this._colors[i];\n shaderColors[i].is_active = c.enabled ? 1.0 : 0.0;\n shaderColors[i].color.setStyle(c.color, \"\");\n shaderColors[i].influence = c.influence || 0;\n } else {\n shaderColors[i].is_active = 0.0;\n }\n }\n\n u.u_colors_count.value = COLORS_COUNT;\n }\n }\n\n // Render mouse interaction to FBO - optimize by only rendering when needed\n if (this._mouseFBO && this._sceneMouse && this._cameraMouse && this._mouseDistortionStrength > 0) {\n let hasActiveBrushes = false;\n\n // Update mouse objects - decay rate controls how fast trails fade\n for (let i = 0; i < this._mouseObjects.length; i++) {\n const obj = this._mouseObjects[i];\n if (obj.mesh.visible) {\n hasActiveBrushes = true;\n obj.mesh.rotation.z += 0.01;\n if (obj.mesh.material instanceof THREE.MeshBasicMaterial) {\n // Decay only affects opacity\n obj.mesh.material.opacity *= this._mouseDecayRate;\n\n if (obj.mesh.material.opacity < 0.01) {\n obj.mesh.visible = false;\n }\n }\n }\n }\n\n // Only render FBO if there are active brushes\n if (hasActiveBrushes) {\n // Store current clear color (likely the main background color)\n renderer.getClearColor(this._tempClearColor);\n const oldClearAlpha = renderer.getClearAlpha();\n\n // Set clear color to Black/Transparent for the FBO.\n renderer.setClearColor(0x000000, 0.0);\n\n renderer.setRenderTarget(this._mouseFBO);\n renderer.clear();\n renderer.render(this._sceneMouse, this._cameraMouse);\n renderer.setRenderTarget(null);\n\n // Restore main background color for the actual scene render\n renderer.setClearColor(this._tempClearColor, oldClearAlpha);\n\n // Update mouse texture uniform\n if (this._cachedUniforms) {\n this._cachedUniforms.u_mouse_texture.value = this._mouseFBO.texture;\n }\n }\n }\n\n // Ensure we set the clear color for the main scene explicitly before rendering\n renderer.setClearColor(this._backgroundColor, this._backgroundAlpha);\n renderer.render(scene, camera);\n this.requestRef = requestAnimationFrame(render);\n };\n\n const setSize = () => {\n\n const { renderer } = this.sceneState;\n const canvas = renderer.domElement;\n const width = canvas.clientWidth;\n const height = canvas.clientHeight;\n\n this.sceneState.renderer.setSize(width, height, false);\n updateCamera(this.sceneState.camera, width, height);\n\n // FIX 3: Update Mouse FBO and Camera on resize\n // If we don't do this, mouse coordinates map incorrectly after a resize\n if (this._mouseFBO && this._cameraMouse) {\n const fSize = height / 2;\n const aspect = width / height;\n this._mouseFBO.setSize(width / 2, height / 2);\n this._cameraMouse.left = -fSize * aspect;\n this._cameraMouse.right = fSize * aspect;\n this._cameraMouse.top = fSize;\n this._cameraMouse.bottom = -fSize;\n this._cameraMouse.updateProjectionMatrix();\n }\n };\n\n // Debounce resize to prevent excessive operations\n this.sizeObserver = new ResizeObserver(() => {\n if (this._resizeTimeoutId !== null) {\n clearTimeout(this._resizeTimeoutId);\n }\n this._resizeTimeoutId = window.setTimeout(() => {\n setSize();\n this._resizeTimeoutId = null;\n }, 100); // Wait 100ms after last resize event\n });\n\n this.sizeObserver.observe(ref);\n\n\n render();\n }\n\n destroy() {\n if (this) {\n cancelAnimationFrame(this.requestRef);\n this.sizeObserver.disconnect();\n\n // Clear resize timeout\n if (this._resizeTimeoutId !== null) {\n clearTimeout(this._resizeTimeoutId);\n this._resizeTimeoutId = null;\n }\n\n // Cleanup WebGL resources\n if (this.sceneState) {\n this.sceneState.renderer.dispose();\n this.sceneState.meshes.forEach(m => {\n m.geometry.dispose();\n if (Array.isArray(m.material)) m.material.forEach(mat => mat.dispose());\n else m.material.dispose();\n });\n }\n if (this._mouseFBO) this._mouseFBO.dispose();\n if (this._proceduralTexture) this._proceduralTexture.dispose();\n }\n }\n\n downloadAsPNG(filename = \"neat.png\") {\n console.log(\"Downloading as PNG\", this._ref);\n const dataURL = this._ref.toDataURL(\"image/png\");\n console.log(\"data\", dataURL);\n downloadURI(dataURL, filename);\n }\n\n set speed(speed: number) {\n this._speed = speed / 20;\n }\n\n set horizontalPressure(horizontalPressure: number) {\n this._horizontalPressure = horizontalPressure / 4;\n }\n\n set verticalPressure(verticalPressure: number) {\n this._verticalPressure = verticalPressure / 4;\n }\n\n set waveFrequencyX(waveFrequencyX: number) {\n this._waveFrequencyX = waveFrequencyX * 0.04;\n }\n\n set waveFrequencyY(waveFrequencyY: number) {\n this._waveFrequencyY = waveFrequencyY * 0.04;\n }\n\n set waveAmplitude(waveAmplitude: number) {\n this._waveAmplitude = waveAmplitude * .75;\n }\n\n set colors(colors: NeatColor[]) {\n this._colors = colors;\n this._colorsChanged = true; // Flag for immediate update\n }\n\n set highlights(highlights: number) {\n this._highlights = highlights / 100;\n }\n\n set shadows(shadows: number) {\n this._shadows = shadows / 100;\n }\n\n set colorSaturation(colorSaturation: number) {\n this._saturation = colorSaturation / 10;\n }\n\n set colorBrightness(colorBrightness: number) {\n this._brightness = colorBrightness;\n }\n\n set colorBlending(colorBlending: number) {\n this._colorBlending = colorBlending / 10;\n }\n\n set grainScale(grainScale: number) {\n this._grainScale = grainScale == 0 ? 1 : grainScale;\n }\n\n set grainIntensity(grainIntensity: number) {\n this._grainIntensity = grainIntensity;\n }\n\n set grainSparsity(grainSparsity: number) {\n this._grainSparsity = grainSparsity;\n }\n\n set grainSpeed(grainSpeed: number) {\n this._grainSpeed = grainSpeed;\n }\n\n set wireframe(wireframe: boolean) {\n this._wireframe = wireframe;\n }\n\n set resolution(resolution: number) {\n this.sceneState = this._initScene(resolution);\n }\n\n set backgroundColor(backgroundColor: string) {\n this._backgroundColor = backgroundColor;\n }\n\n set backgroundAlpha(backgroundAlpha: number) {\n this._backgroundAlpha = backgroundAlpha;\n }\n\n set yOffset(yOffset: number) {\n this._yOffset = yOffset;\n }\n\n get yOffsetWaveMultiplier(): number {\n return this._yOffsetWaveMultiplier * 1000;\n }\n\n set yOffsetWaveMultiplier(value: number) {\n this._yOffsetWaveMultiplier = value / 1000;\n }\n\n get yOffsetColorMultiplier(): number {\n return this._yOffsetColorMultiplier * 1000;\n }\n\n set yOffsetColorMultiplier(value: number) {\n this._yOffsetColorMultiplier = value / 1000;\n }\n\n get yOffsetFlowMultiplier(): number {\n return this._yOffsetFlowMultiplier * 1000;\n }\n\n set yOffsetFlowMultiplier(value: number) {\n this._yOffsetFlowMultiplier = value / 1000;\n }\n\n set flowDistortionA(value: number) {\n this._flowDistortionA = value;\n }\n\n set flowDistortionB(value: number) {\n this._flowDistortionB = value;\n }\n\n set flowScale(value: number) {\n this._flowScale = value;\n }\n\n set flowEase(value: number) {\n this._flowEase = value;\n }\n\n set flowEnabled(value: boolean) {\n this._flowEnabled = value;\n }\n\n get flowEnabled(): boolean {\n return this._flowEnabled;\n }\n\n\n set mouseDistortionStrength(value: number) {\n this._mouseDistortionStrength = Math.max(0, value);\n }\n\n set mouseDistortionRadius(value: number) {\n // Clamp to a sane range in UV space\n this._mouseDistortionRadius = Math.max(0.01, Math.min(value, 1.0));\n // Update brush scale when radius changes\n this._updateBrushScale();\n }\n\n _updateBrushScale() {\n if (!this._mouseObjects || this._mouseObjects.length === 0) return;\n // Radius directly controls the brush scale\n // Base geometry is 200px, so radius 0.25 = 50px, radius 1.0 = 200px\n this._mouseBrushBaseScale = this._mouseDistortionRadius;\n }\n\n set mouseDecayRate(value: number) {\n // Clamp between 0.9 (slow decay, more wobble) and 0.99 (fast decay, less wobble)\n this._mouseDecayRate = Math.max(0.9, Math.min(value, 0.99));\n }\n\n set mouseDarken(value: number) {\n this._mouseDarken = value;\n }\n\n set enableProceduralTexture(value: boolean) {\n this._enableProceduralTexture = value;\n if (value && !this._proceduralTexture) {\n this._textureNeedsUpdate = true;\n }\n }\n\n set textureVoidLikelihood(value: number) {\n this._textureVoidLikelihood = value;\n if (this._enableProceduralTexture) {\n this._textureNeedsUpdate = true;\n }\n }\n\n set textureVoidWidthMin(value: number) {\n this._textureVoidWidthMin = value;\n if (this._enableProceduralTexture) {\n this._textureNeedsUpdate = true;\n }\n }\n\n set textureVoidWidthMax(value: number) {\n this._textureVoidWidthMax = value;\n if (this._enableProceduralTexture) {\n this._textureNeedsUpdate = true;\n }\n }\n\n set textureBandDensity(value: number) {\n this._textureBandDensity = value;\n if (this._enableProceduralTexture) {\n this._textureNeedsUpdate = true;\n }\n }\n\n set textureColorBlending(value: number) {\n this._textureColorBlending = value;\n if (this._enableProceduralTexture) {\n this._textureNeedsUpdate = true;\n }\n }\n\n set textureSeed(value: number) {\n this._textureSeed = value;\n if (this._enableProceduralTexture) {\n this._textureNeedsUpdate = true;\n }\n }\n\n get textureEase(): number {\n return this._textureEase;\n }\n\n set textureEase(value: number) {\n this._textureEase = value;\n }\n\n set proceduralBackgroundColor(value: string) {\n this._proceduralBackgroundColor = value;\n if (this._enableProceduralTexture) {\n this._textureNeedsUpdate = true;\n }\n }\n\n set textureShapeTriangles(value: number) {\n this._textureShapeTriangles = value;\n if (this._enableProceduralTexture) this._textureNeedsUpdate = true;\n }\n set textureShapeCircles(value: number) {\n this._textureShapeCircles = value;\n if (this._enableProceduralTexture) this._textureNeedsUpdate = true;\n }\n set textureShapeBars(value: number) {\n this._textureShapeBars = value;\n if (this._enableProceduralTexture) this._textureNeedsUpdate = true;\n }\n set textureShapeSquiggles(value: number) {\n this._textureShapeSquiggles = value;\n if (this._enableProceduralTexture) this._textureNeedsUpdate = true;\n }\n\n _initScene(resolution: number): SceneState {\n\n const width = this._ref.width,\n height = this._ref.height;\n\n // Cleanup existing renderer if needed\n if (this.sceneState && this.sceneState.renderer) {\n this.sceneState.renderer.dispose();\n this.sceneState.meshes.forEach(m => {\n m.geometry.dispose();\n if (Array.isArray(m.material)) m.material.forEach(mat => mat.dispose());\n else m.material.dispose();\n });\n }\n\n const renderer = new THREE.WebGLRenderer({\n // antialias: true,\n alpha: true,\n preserveDrawingBuffer: true,\n canvas: this._ref\n });\n\n renderer.setClearColor(0xFF0000, .5);\n renderer.setSize(width, height, false);\n\n const meshes: THREE.Mesh[] = [];\n\n const scene = new THREE.Scene();\n\n const material = this._buildMaterial(width, height);\n\n const geo = new THREE.PlaneGeometry(PLANE_WIDTH, PLANE_HEIGHT, 240 * resolution, 240 * resolution);\n const plane = new THREE.Mesh(geo, material);\n plane.rotation.x = -Math.PI / 3.5;\n plane.position.z = -1;\n meshes.push(plane);\n scene.add(plane);\n\n const camera = new THREE.OrthographicCamera(0.0, 0.0, 0.0, 0.0, 0.0, 0.0);\n // const camera = new THREE.PerspectiveCamera( 1000, window.innerWidth / window.innerHeight, 1, 1000000 );\n camera.position.z = 5;\n updateCamera(camera, width, height);\n\n return {\n renderer,\n camera,\n scene,\n meshes,\n resolution\n };\n }\n\n _buildMaterial(width: number, height: number) {\n\n // Initialize stable array structure for colors\n // We create 6 objects and just update them in the render loop to avoid GC\n const colors = Array.from({ length: COLORS_COUNT }).map((_, i) => ({\n is_active: i < this._colors.length ? (this._colors[i].enabled ? 1.0 : 0.0) : 0.0,\n color: new THREE.Color(i < this._colors.length ? this._colors[i].color : 0x000000),\n influence: i < this._colors.length ? (this._colors[i].influence || 0) : 0\n }));\n\n const uniforms = {\n u_time: { value: 0 },\n u_color_pressure: { value: new THREE.Vector2(this._horizontalPressure, this._verticalPressure) },\n u_wave_frequency_x: { value: this._waveFrequencyX },\n u_wave_frequency_y: { value: this._waveFrequencyY },\n u_wave_amplitude: { value: this._waveAmplitude },\n u_resolution: { value: new THREE.Vector2(width, height) },\n u_colors: { value: colors },\n u_colors_count: { value: this._colors.length },\n u_plane_width: { value: PLANE_WIDTH },\n u_plane_height: { value: PLANE_HEIGHT },\n u_shadows: { value: this._shadows },\n u_highlights: { value: this._highlights },\n u_grain_intensity: { value: this._grainIntensity },\n u_grain_sparsity: { value: this._grainSparsity },\n u_grain_scale: { value: this._grainScale },\n u_grain_speed: { value: this._grainSpeed },\n // Flow field\n u_flow_distortion_a: { value: this._flowDistortionA },\n u_flow_distortion_b: { value: this._flowDistortionB },\n u_flow_scale: { value: this._flowScale },\n u_flow_ease: { value: this._flowEase },\n u_flow_enabled: { value: this._flowEnabled ? 1.0 : 0.0 },\n // Y offset multipliers\n u_y_offset: { value: this._yOffset },\n u_y_offset_wave_multiplier: { value: this._yOffsetWaveMultiplier },\n u_y_offset_color_multiplier: { value: this._yOffsetColorMultiplier },\n u_y_offset_flow_multiplier: { value: this._yOffsetFlowMultiplier },\n // Mouse interaction\n u_mouse_distortion_strength: { value: this._mouseDistortionStrength },\n u_mouse_distortion_radius: { value: this._mouseDistortionRadius },\n u_mouse_darken: { value: this._mouseDarken },\n u_mouse_texture: { value: this._mouseFBO ? this._mouseFBO.texture : null },\n // Procedural texture\n u_procedural_texture: { value: this._proceduralTexture },\n u_enable_procedural_texture: { value: this._enableProceduralTexture ? 1.0 : 0.0 },\n u_texture_ease: { value: this._textureEase },\n u_saturation: { value: this._saturation },\n u_brightness: { value: this._brightness },\n u_color_blending: { value: this._colorBlending }\n };\n\n const material = new THREE.ShaderMaterial({\n uniforms: uniforms,\n vertexShader: buildUniforms() + buildNoise() + buildColorFunctions() + buildVertexShader(),\n fragmentShader: buildUniforms() + buildColorFunctions() + buildNoise() + buildFragmentShader()\n });\n\n // Cache the uniforms object for direct access in render loop\n this._cachedUniforms = uniforms as unknown as NeatUniforms;\n\n material.wireframe = WIREFRAME;\n return material;\n }\n\n _setupMouseInteraction() {\n if (!this._ref) return;\n\n const width = this._ref.width;\n const height = this._ref.height;\n\n // Create mouse FBO\n this._mouseFBO = new THREE.WebGLRenderTarget(width / 2, height / 2);\n\n // Create mouse scene and camera\n this._sceneMouse = new THREE.Scene();\n const fSize = height / 2;\n const aspect = width / height;\n\n // FIX 4: Ensure near plane allows viewing objects at Z=0\n // Near -100 is safer for objects at 0\n this._cameraMouse = new THREE.OrthographicCamera(\n -fSize * aspect, fSize * aspect,\n fSize, -fSize,\n 0, 10000\n );\n this._cameraMouse.position.set(0, 0, 100);\n\n // Create brush texture - More visible and impactful\n const brushCanvas = document.createElement('canvas');\n brushCanvas.width = 128;\n brushCanvas.height = 128;\n const bCtx = brushCanvas.getContext('2d');\n if (bCtx) {\n const grd = bCtx.createRadialGradient(64, 64, 0, 64, 64, 64);\n // Match reference implementation's stronger gradient\n grd.addColorStop(0, 'rgba(255,255,255,0.8)');\n grd.addColorStop(0.5, 'rgba(255,255,255,0.4)');\n grd.addColorStop(1, 'rgba(255,255,255,0)');\n bCtx.fillStyle = grd;\n bCtx.fillRect(0, 0, 128, 128);\n }\n const brushTex = new THREE.CanvasTexture(brushCanvas);\n const brushMat = new THREE.MeshBasicMaterial({\n map: brushTex,\n transparent: true,\n opacity: 1.0,\n depthTest: false,\n blending: THREE.AdditiveBlending // Additive blending for better accumulation\n });\n // Brush geometry size - will be scaled by radius parameter\n const brushGeo = new THREE.PlaneGeometry(200, 200);\n\n // Create brush pool\n const brushPoolSize = 50;\n for (let i = 0; i < brushPoolSize; i++) {\n const m = new THREE.Mesh(brushGeo, brushMat.clone());\n m.visible = false;\n this._sceneMouse!.add(m);\n this._mouseObjects.push({ mesh: m, active: false });\n }\n\n // Initialize brush scale based on current radius\n this._updateBrushScale();\n\n // Add mouse move listener\n this._ref.addEventListener('mousemove', this._onMouseMove.bind(this));\n }\n\n _onMouseMove(e: MouseEvent) {\n if (!this._ref || !this._sceneMouse) return;\n\n const rect = this._ref.getBoundingClientRect();\n const width = this._ref.width;\n const height = this._ref.height;\n\n // Store pending mouse position\n this._pendingMousePosition = {\n x: e.clientX - rect.left - width / 2,\n y: -(e.clientY - rect.top - height / 2)\n };\n\n // Batch mouse updates using requestAnimationFrame\n if (!this._mouseUpdateScheduled) {\n this._mouseUpdateScheduled = true;\n requestAnimationFrame(() => {\n this._mouseUpdateScheduled = false;\n\n if (!this._pendingMousePosition) return;\n\n this._mouse.x = this._pendingMousePosition.x;\n this._mouse.y = this._pendingMousePosition.y;\n\n const brush = this._mouseObjects[this._currentBrush];\n brush.mesh.scale.set(this._mouseBrushBaseScale, this._mouseBrushBaseScale, 1.0);\n brush.active = true;\n brush.mesh.visible = true;\n brush.mesh.position.set(this._mouse.x, this._mouse.y, 0);\n brush.mesh.rotation.z = Math.random() * Math.PI * 2;\n if (brush.mesh.material instanceof THREE.MeshBasicMaterial) {\n brush.mesh.material.opacity = 1.0;\n }\n this._currentBrush = (this._currentBrush + 1) % this._mouseObjects.length;\n\n this._pendingMousePosition = null;\n });\n }\n }\n\n _createProceduralTexture(): THREE.Texture {\n // Texture size - 1024 provides good balance between quality and performance\n // Reduced from 2048 for better performance\n const texSize = 1024;\n const sourceCanvas = document.createElement('canvas');\n sourceCanvas.width = texSize;\n sourceCanvas.height = texSize;\n const sCtx = sourceCanvas.getContext('2d', { willReadFrequently: true });\n if (!sCtx) return new THREE.Texture();\n\n let seed = this._textureSeed;\n const baseSeed = this._textureSeed;\n\n function random() {\n const x = Math.sin(seed++) * 10000;\n return x - Math.floor(x);\n }\n\n // Helper to reset seed for isolated shape generation\n const setSeed = (offset: number) => {\n seed = baseSeed + offset;\n };\n\n const colors = this._colors.filter(c => c.enabled).map(c => c.color);\n if (colors.length === 0) return new THREE.Texture();\n\n // Helper functions\n function hexToRgb(hex: string) {\n const bigint = parseInt(hex.replace('#', ''), 16);\n return {\n r: (bigint >> 16) & 255,\n g: (bigint >> 8) & 255,\n b: bigint & 255\n };\n }\n\n function rgbToHex(r: number, g: number, b: number) {\n return \"#\" + ((1 << 24) + (Math.round(r) << 16) + (Math.round(g) << 8) + Math.round(b)).toString(16).slice(1);\n }\n\n const getInterColor = () => {\n const c1 = colors[Math.floor(random() * colors.length)];\n const c2 = colors[Math.floor(random() * colors.length)];\n const mix = random() * this._textureColorBlending;\n const rgb1 = hexToRgb(c1);\n const rgb2 = hexToRgb(c2);\n const r = rgb1.r + (rgb2.r - rgb1.r) * mix;\n const g = rgb1.g + (rgb2.g - rgb1.g) * mix;\n const b = rgb1.b + (rgb2.b - rgb1.b) * mix;\n return rgbToHex(r, g, b);\n };\n\n // === SOURCE CANVAS ===\n // Base with procedural background color so even sparse areas pick it up\n const baseColor = this._proceduralBackgroundColor || \"#000000\";\n sCtx.fillStyle = baseColor;\n sCtx.fillRect(0, 0, texSize, texSize);\n\n // Then lay a vertical gradient of mixed colors on top for richness\n const bgGrad = sCtx.createLinearGradient(0, 0, 0, texSize);\n bgGrad.addColorStop(0, getInterColor());\n bgGrad.addColorStop(1, getInterColor());\n sCtx.fillStyle = bgGrad;\n sCtx.fillRect(0, 0, texSize, texSize);\n\n // Triangles: use configurable count\n for (let i = 0; i < this._textureShapeTriangles; i++) {\n sCtx.fillStyle = getInterColor();\n sCtx.beginPath();\n const x = random() * texSize;\n const y = random() * texSize;\n const s = 100 + random() * 300;\n sCtx.moveTo(x, y);\n sCtx.lineTo(x + (random() - 0.5) * s, y + (random() - 0.5) * s);\n sCtx.lineTo(x + (random() - 0.5) * s, y + (random() - 0.5) * s);\n sCtx.fill();\n }\n\n // Circles / rings: use configurable count\n for (let i = 0; i < this._textureShapeCircles; i++) {\n sCtx.strokeStyle = getInterColor();\n sCtx.lineWidth = 10 + random() * 50;\n sCtx.beginPath();\n const x = random() * texSize;\n const y = random() * texSize;\n const r = 50 + random() * 150;\n sCtx.arc(x, y, r, 0, Math.PI * 2);\n sCtx.stroke();\n }\n\n // Bars: use configurable count\n for (let i = 0; i < this._textureShapeBars; i++) {\n sCtx.fillStyle = getInterColor();\n sCtx.save();\n sCtx.translate(random() * texSize, random() * texSize);\n sCtx.rotate(random() * Math.PI);\n sCtx.fillRect(-150, -25, 300, 50);\n sCtx.restore();\n }\n\n // Squiggles: use configurable count\n sCtx.lineWidth = 15;\n sCtx.lineCap = 'round';\n for (let i = 0; i < this._textureShapeSquiggles; i++) {\n sCtx.strokeStyle = getInterColor();\n sCtx.beginPath();\n let x = random() * texSize;\n let y = random() * texSize;\n sCtx.moveTo(x, y);\n for (let j = 0; j < 4; j++) {\n sCtx.bezierCurveTo(\n x + (random() - 0.5) * 300, y + (random() - 0.5) * 300,\n x + (random() - 0.5) * 300, y + (random() - 0.5) * 300,\n x + (random() - 0.5) * 300, y + (random() - 0.5) * 300\n );\n x += (random() - 0.5) * 300;\n y += (random() - 0.5) * 300;\n }\n sCtx.stroke();\n }\n\n // === MASKED CANVAS ===\n // Masking: Seed isolation\n setSeed(50000);\n const canvas = document.createElement('canvas');\n canvas.width = texSize;\n canvas.height = texSize;\n const ctx = canvas.getContext('2d', { willReadFrequently: true });\n if (!ctx) return new THREE.Texture();\n\n // Start filled with the chosen void color so gaps show that color\n ctx.fillStyle = baseColor;\n ctx.fillRect(0, 0, texSize, texSize);\n\n // Determine layout segments (matter vs void)\n let layoutHead = 0;\n const segments: Array<{ type: 'void' | 'matter', x: number, width: number }> = [];\n\n while (layoutHead < texSize) {\n const isVoid = random() < this._textureVoidLikelihood;\n if (isVoid) {\n const w = this._textureVoidWidthMin + random() * (this._textureVoidWidthMax - this._textureVoidWidthMin);\n segments.push({ type: 'void', x: layoutHead, width: w });\n layoutHead += w;\n } else {\n const w = 50 + random() * 200;\n segments.push({ type: 'matter', x: layoutHead, width: w });\n layoutHead += w;\n }\n }\n\n // Render only matter bands from the source into the masked canvas\n for (const seg of segments) {\n if (seg.type === 'matter') {\n const startX = seg.x;\n const endX = Math.min(seg.x + seg.width, texSize);\n let currentX = startX;\n\n while (currentX < endX) {\n const stripeWidth = (2 + random() * 20) / this._textureBandDensity;\n const sourceX = Math.floor(random() * texSize);\n ctx.drawImage(\n sourceCanvas,\n sourceX, 0, stripeWidth, texSize,\n currentX, 0, stripeWidth, texSize\n );\n currentX += stripeWidth;\n }\n }\n // void segments: leave as baseColor\n }\n\n const tex = new THREE.CanvasTexture(canvas);\n // Use mipmapping for better quality when texture is scaled\n tex.minFilter = THREE.LinearMipmapLinearFilter;\n tex.magFilter = THREE.LinearFilter;\n tex.wrapS = THREE.RepeatWrapping;\n tex.wrapT = THREE.RepeatWrapping;\n\n // Enable anisotropic filtering for much better quality when texture is stretched\n // 16 is a commonly supported value that dramatically improves quality\n tex.anisotropy = 16;\n\n // Ensure mipmaps are generated\n tex.needsUpdate = true;\n\n return tex;\n }\n\n\n}\n\nfunction updateCamera(camera: THREE.Camera, width: number, height: number) {\n\n const viewPortAreaRatio = 1000000;\n const areaViewPort = width * height;\n const targetPlaneArea =\n areaViewPort / viewPortAreaRatio *\n PLANE_WIDTH * PLANE_HEIGHT / 1.5;\n\n const ratio = width / height;\n\n const targetWidth = Math.sqrt(targetPlaneArea * ratio);\n const targetHeight = targetPlaneArea / targetWidth;\n\n let left = -PLANE_WIDTH / 2;\n let right = Math.min((left + targetWidth) / 1.5, PLANE_WIDTH / 2);\n\n let top = PLANE_HEIGHT / 4;\n let bottom = Math.max((top - targetHeight) / 2, -PLANE_HEIGHT / 4);\n\n // Fix for mobile portrait: adjust bounds for proper aspect ratio AND zoom out slightly\n if (ratio < 1) {\n // Portrait mode - scale horizontal bounds by aspect ratio to prevent stretching\n const horizontalScale = ratio;\n left = left * horizontalScale;\n right = right * horizontalScale;\n\n // Zoom out slightly on mobile (1.1 = 10% zoom out)\n const mobileZoomFactor = 1.05;\n left = left * mobileZoomFactor;\n right = right * mobileZoomFactor;\n top = top * mobileZoomFactor;\n bottom = bottom * mobileZoomFactor;\n }\n\n const near = -100;\n const far = 1000;\n if (camera instanceof THREE.OrthographicCamera) {\n camera.left = left;\n camera.right = right;\n camera.top = top;\n camera.bottom = bottom;\n camera.near = near;\n camera.far = far;\n camera.updateProjectionMatrix();\n } else if (camera instanceof THREE.PerspectiveCamera) {\n camera.aspect = width / height;\n camera.updateProjectionMatrix();\n }\n\n}\n\n\n// Cache shader strings to avoid repeated concatenation\nlet cachedVertexShader: string | null = null;\nlet cachedFragmentShader: string | null = null;\n\nfunction buildVertexShader() {\n if (cachedVertexShader) return cachedVertexShader;\n cachedVertexShader = `\nvoid main() {\n vUv = uv;\n\n // SCROLLING LOGIC\n // Separate multipliers for wave, color, and flow offsets\n float waveOffset = -u_y_offset * u_y_offset_wave_multiplier;\n float colorOffset = -u_y_offset * u_y_offset_color_multiplier;\n float flowOffset = -u_y_offset * u_y_offset_flow_multiplier;\n\n // 1. DISPLACEMENT (WAVES)\n // We add waveOffset to Y to scroll the wave pattern\n v_displacement_amount = cnoise( vec3(\n u_wave_frequency_x * position.x + u_time,\n u_wave_frequency_y * (position.y + waveOffset) + u_time,\n u_time\n ));\n\n // 2. FLOW FIELD\n // Apply flow offset to scroll the flow field mask\n vec2 baseUv = vUv;\n baseUv.y += flowOffset / u_plane_height; // Scale to match wave speed\n vec2 flowUv = baseUv;\n\n if (u_flow_enabled > 0.5) {\n if (u_flow_ease > 0.0 || u_flow_distortion_a > 0.0) {\n vec2 ppp = -1.0 + 2.0 * baseUv;\n ppp += 0.1 * cos((1.5 * u_flow_scale) * ppp.yx + 1.1 * u_time + vec2(0.1, 1.1));\n ppp += 0.1 * cos((2.3 * u_flow_scale) * ppp.yx + 1.3 * u_time + vec2(3.2, 3.4));\n ppp += 0.1 * cos((2.2 * u_flow_scale) * ppp.yx + 1.7 * u_time + vec2(1.8, 5.2));\n ppp += u_flow_distortion_a * cos((u_flow_distortion_b * u_flow_scale) * ppp.yx + 1.4 * u_time + vec2(6.3, 3.9));\n\n float r = length(ppp);\n flowUv = mix(baseUv, vec2(baseUv.x * (1.0 - u_flow_ease) + r * u_flow_ease, baseUv.y), u_flow_ease);\n }\n }\n\n // Pass the standard flow UV to fragment shader (for mouse/texture)\n vFlowUv = flowUv;\n\n // 3. COLOR MIXING\n // We take the computed flow UVs and apply the color offset\n // Scale by plane height to match wave offset speed (world space vs UV space)\n vec3 color = u_colors[0].color;\n vec2 adjustedUv = flowUv;\n adjustedUv.y += colorOffset / u_plane_height; // Scroll the color mixing pattern\n\n vec2 noise_cord = adjustedUv * u_color_pressure;\n const float minNoise = .0;\n const float maxNoise = .9;\n\n for (int i = 1; i < u_colors_count; i++) {\n if(u_colors[i].is_active > 0.5){\n float noiseFlow = (1. + float(i)) / 30.;\n float noiseSpeed = (1. + float(i)) * 0.11;\n float noiseSeed = 13. + float(i) * 7.;\n\n float noise = snoise(\n vec3(\n noise_cord.x * u_color_pressure.x + u_time * noiseFlow * 2.,\n noise_cord.y * u_color_pressure.y,\n u_time * noiseSpeed\n ) + noiseSeed\n ) - (.1 * float(i)) + (.5 * u_color_blending);\n\n noise = clamp(minNoise, maxNoise + float(i) * 0.02, noise);\n color = mix(color, u_colors[i].color, smoothstep(0.0, u_color_blending, noise));\n }\n }\n\n v_color = color;\n\n // 4. VERTEX POSITION\n vec3 newPosition = position + normal * v_displacement_amount * u_wave_amplitude;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(newPosition, 1.0);\n v_new_position = gl_Position;\n}\n`;\n return cachedVertexShader;\n}\n\nfunction buildFragmentShader() {\n if (cachedFragmentShader) return cachedFragmentShader;\n cachedFragmentShader = `\nfloat random(vec2 p) {\n return fract(sin(dot(p, vec2(12.9898,78.233))) * 43758.5453);\n}\n\nfloat fbm(vec3 x) {\n float value = 0.0;\n float amplitude = 0.5;\n float frequency = 1.0;\n for (int i = 0; i < 4; i++) {\n value += amplitude * snoise(x * frequency);\n frequency *= 2.0;\n amplitude *= 0.5;\n }\n return value;\n}\n\nvoid main() {\n // MOUSE DISTORTION\n vec2 finalUv = vFlowUv;\n \n if (u_mouse_distortion_strength > 0.0) {\n vec4 mouseColor = texture2D(u_mouse_texture, vUv);\n float mouseValue = mouseColor.r;\n \n if (mouseValue > 0.001) {\n float distortionAmount = mouseValue * u_mouse_distortion_strength;\n vec2 mouseDisp = vec2(distortionAmount, distortionAmount);\n finalUv -= mouseDisp;\n }\n }\n \n vec3 baseColor;\n\n if (u_enable_procedural_texture > 0.5) {\n // Calculate flow field distance for ease effect\n vec2 ppp = -1.0 + 2.0 * finalUv;\n ppp += 0.1 * cos((1.5 * u_flow_scale) * ppp.yx + 1.1 * u_time + vec2(0.1, 1.1));\n ppp += 0.1 * cos((2.3 * u_flow_scale) * ppp.yx + 1.3 * u_time + vec2(3.2, 3.4));\n ppp += 0.1 * cos((2.2 * u_flow_scale) * ppp.yx + 1.7 * u_time + vec2(1.8, 5.2));\n ppp += u_flow_distortion_a * cos((u_flow_distortion_b * u_flow_scale) * ppp.yx + 1.4 * u_time + vec2(6.3, 3.9));\n float r = length(ppp); // Flow distance\n \n // Ease blending: 0 = topographic (flow), 1 = image (UV)\n float vx = (finalUv.x * u_texture_ease) + (r * (1.0 - u_texture_ease));\n float vy = (finalUv.y * u_texture_ease) + (0.0 * (1.0 - u_texture_ease));\n vec2 texUv = vec2(vx, vy);\n\n // PARALLAX SCROLLING\n // We manually apply a smaller offset here to make the texture lag behind\n float parallaxFactor = 0.25; // 25% speed of the color mixing\n texUv.y -= (u_y_offset * u_y_offset_color_multiplier / u_plane_height) * parallaxFactor;\n\n texUv *= 1.5; // Tiling scale\n\n vec4 texSample = texture2D(u_procedural_texture, texUv);\n baseColor = texSample.rgb;\n } else {\n baseColor = v_color;\n }\n\n vec3 color = baseColor;\n\n // Post-processing\n color += pow(v_displacement_amount, 1.0) * u_highlights;\n color -= pow(1.0 - v_displacement_amount, 2.0) * u_shadows;\n color = saturation(color, 1.0 + u_saturation);\n color = color * u_brightness;\n\n // Grain\n vec2 noiseCoords = gl_FragCoord.xy / u_grain_scale;\n float grain = (u_grain_speed != 0.0) ? fbm(vec3(noiseCoords, u_time * u_grain_speed)) : fbm(vec3(noiseCoords, 0.0));\n\n grain = grain * 0.5 + 0.5;\n grain -= 0.5;\n grain = (grain > u_grain_sparsity) ? grain : 0.0;\n grain *= u_grain_intensity;\n\n color += vec3(grain);\n\n gl_FragColor = vec4(color, 1.0);\n}\n `;\n return cachedFragmentShader;\n}\n\n// Cache uniforms string as well\nlet cachedUniformsShader: string | null = null;\n\nconst buildUniforms = () => {\n if (cachedUniformsShader) return cachedUniformsShader;\n cachedUniformsShader = `\nprecision highp float;\n\nstruct Color {\n float is_active;\n vec3 color;\n float value;\n};\n\nuniform float u_grain_intensity; \nuniform float u_grain_sparsity; \nuniform float u_grain_scale; \nuniform float u_grain_speed; \nuniform float u_time;\n\nuniform float u_wave_amplitude;\nuniform float u_wave_frequency_x;\nuniform float u_wave_frequency_y;\n\nuniform vec2 u_color_pressure;\n\nuniform float u_plane_width;\nuniform float u_plane_height;\n\nuniform float u_shadows;\nuniform float u_highlights;\nuniform float u_saturation;\nuniform float u_brightness;\n\nuniform float u_color_blending;\n\nuniform int u_colors_count;\nuniform Color u_colors[6];\nuniform vec2 u_resolution;\n\nuniform float u_y_offset;\nuniform float u_y_offset_wave_multiplier;\nuniform float u_y_offset_color_multiplier;\nuniform float u_y_offset_flow_multiplier;\n\n// Flow field uniforms\nuniform float u_flow_distortion_a;\nuniform float u_flow_distortion_b;\nuniform float u_flow_scale;\nuniform float u_flow_ease;\nuniform float u_flow_enabled;\n\n// Mouse interaction uniforms\nuniform float u_mouse_distortion_strength;\nuniform float u_mouse_distortion_radius;\nuniform float u_mouse_darken;\nuniform sampler2D u_mouse_texture;\n\n// Procedural texture uniforms\nuniform sampler2D u_procedural_texture;\nuniform float u_enable_procedural_texture;\nuniform float u_texture_ease;\n\nvarying vec2 vUv;\nvarying vec2 vFlowUv;\nvarying vec4 v_new_position;\nvarying vec3 v_color;\nvarying float v_displacement_amount;\n\n `;\n return cachedUniformsShader;\n};\n\n// Cache noise functions as well\nlet cachedNoiseShader: string | null = null;\n\nconst buildNoise = () => {\n if (cachedNoiseShader) return cachedNoiseShader;\n cachedNoiseShader = `\n\n// 1. REPLACEMENT PERMUTE: \n// Uses a hash function (fract/sin) instead of a modular lookup table.\nvec4 permute(vec4 x) {\n return floor(fract(sin(x) * 43758.5453123) * 289.0);\n}\n\n// Taylor Inverse Sqrt\nvec4 taylorInvSqrt(vec4 r) {\n return 1.79284291400159 - 0.85373472095314 * r;\n}\n\n// Fade function\nvec3 fade(vec3 t) {\n return t*t*t*(t*(t*6.0-15.0)+10.0);\n}\n\n// 3D Simplex Noise\nfloat snoise(vec3 v) {\n const vec2 C = vec2(1.0/6.0, 1.0/3.0) ;\n const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);\n\n // First corner\n vec3 i = floor(v + dot(v, C.yyy) );\n vec3 x0 = v - i + dot(i, C.xxx) ;\n\n // Other corners\n vec3 g = step(x0.yzx, x0.xyz);\n vec3 l = 1.0 - g;\n vec3 i1 = min( g.xyz, l.zxy );\n vec3 i2 = max( g.xyz, l.zxy );\n\n vec3 x1 = x0 - i1 + C.xxx;\n vec3 x2 = x0 - i2 + C.yyy;\n vec3 x3 = x0 - D.yyy;\n\n // Permutations\n vec4 p = permute( permute( permute(\n i.z + vec4(0.0, i1.z, i2.z, 1.0 ))\n + i.y + vec4(0.0, i1.y, i2.y, 1.0 ))\n + i.x + vec4(0.0, i1.x, i2.x, 1.0 ));\n\n // Gradients\n float n_ = 0.142857142857; // 1.0/7.0\n vec3 ns = n_ * D.wyz - D.xzx;\n\n vec4 j = p - 49.0 * floor(p * ns.z * ns.z);\n\n vec4 x_ = floor(j * ns.z);\n vec4 y_ = floor(j - 7.0 * x_ );\n\n vec4 x = x_ *ns.x + ns.yyyy;\n vec4 y = y_ *ns.x + ns.yyyy;\n vec4 h = 1.0 - abs(x) - abs(y);\n\n vec4 b0 = vec4( x.xy, y.xy );\n vec4 b1 = vec4( x.zw, y.zw );\n\n vec4 s0 = floor(b0)*2.0 + 1.0;\n vec4 s1 = floor(b1)*2.0 + 1.0;\n vec4 sh = -step(h, vec4(0.0));\n\n vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ;\n vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ;\n\n vec3 p0 = vec3(a0.xy,h.x);\n vec3 p1 = vec3(a0.zw,h.y);\n vec3 p2 = vec3(a1.xy,h.z);\n vec3 p3 = vec3(a1.zw,h.w);\n\n // Normalise gradients\n vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));\n p0 *= norm.x;\n p1 *= norm.y;\n p2 *= norm.z;\n p3 *= norm.w;\n\n // Mix final noise value\n vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);\n m = m * m;\n return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1),\n dot(p2,x2), dot(p3,x3) ) );\n}\n\n// Classic Perlin noise\nfloat cnoise(vec3 P)\n{\n vec3 Pi0 = floor(P); \n vec3 Pi1 = Pi0 + vec3(1.0); \n \n vec3 Pf0 = fract(P); \n vec3 Pf1 = Pf0 - vec3(1.0); \n vec4 ix = vec4(Pi0.x, Pi1.x, Pi0.x, Pi1.x);\n vec4 iy = vec4(Pi0.yy, Pi1.yy);\n vec4 iz0 = Pi0.zzzz;\n vec4 iz1 = Pi1.zzzz;\n\n vec4 ixy = permute(permute(ix) + iy);\n vec4 ixy0 = permute(ixy + iz0);\n vec4 ixy1 = permute(ixy + iz1);\n\n vec4 gx0 = ixy0 * (1.0 / 7.0);\n vec4 gy0 = fract(floor(gx0) * (1.0 / 7.0)) - 0.5;\n gx0 = fract(gx0);\n vec4 gz0 = vec4(0.5) - abs(gx0) - abs(gy0);\n vec4 sz0 = step(gz0, vec4(0.0));\n gx0 -= sz0 * (step(0.0, gx0) - 0.5);\n gy0 -= sz0 * (step(0.0, gy0) - 0.5);\n\n vec4 gx1 = ixy1 * (1.0 / 7.0);\n vec4 gy1 = fract(floor(gx1) * (1.0 / 7.0)) - 0.5;\n gx1 = fract(gx1);\n vec4 gz1 = vec4(0.5) - abs(gx1) - abs(gy1);\n vec4 sz1 = step(gz1, vec4(0.0));\n gx1 -= sz1 * (step(0.0, gx1) - 0.5);\n gy1 -= sz1 * (step(0.0, gy1) - 0.5);\n\n vec3 g000 = vec3(gx0.x,gy0.x,gz0.x);\n vec3 g100 = vec3(gx0.y,gy0.y,gz0.y);\n vec3 g010 = vec3(gx0.z,gy0.z,gz0.z);\n vec3 g110 = vec3(gx0.w,gy0.w,gz0.w);\n vec3 g001 = vec3(gx1.x,gy1.x,gz1.x);\n vec3 g101 = vec3(gx1.y,gy1.y,gz1.y);\n vec3 g011 = vec3(gx1.z,gy1.z,gz1.z);\n vec3 g111 = vec3(gx1.w,gy1.w,gz1.w);\n\n vec4 norm0 = taylorInvSqrt(vec4(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110)));\n g000 *= norm0.x;\n g010 *= norm0.y;\n g100 *= norm0.z;\n g110 *= norm0.w;\n vec4 norm1 = taylorInvSqrt(vec4(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111)));\n g001 *= norm1.x;\n g011 *= norm1.y;\n g101 *= norm1.z;\n g111 *= norm1.w;\n\n float n000 = dot(g000, Pf0);\n float n100 = dot(g100, vec3(Pf1.x, Pf0.yz));\n float n010 = dot(g010, vec3(Pf0.x, Pf1.y, Pf0.z));\n float n110 = dot(g110, vec3(Pf1.xy, Pf0.z));\n float n001 = dot(g001, vec3(Pf0.xy, Pf1.z));\n float n101 = dot(g101, vec3(Pf1.x, Pf0.y, Pf1.z));\n float n011 = dot(g011, vec3(Pf0.x, Pf1.yz));\n float n111 = dot(g111, Pf1);\n\n vec3 fade_xyz = fade(Pf0);\n vec4 n_z = mix(vec4(n000, n100, n010, n110), vec4(n001, n101, n011, n111), fade_xyz.z);\n vec2 n_yz = mix(n_z.xy, n_z.zw, fade_xyz.y);\n float n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x);\n return 2.2 * n_xyz;\n}\n`;\n return cachedNoiseShader;\n};\n\n// Cache color functions as well\nlet cachedColorFunctionsShader: string | null = null;\n\nconst buildColorFunctions = () => {\n if (cachedColorFunctionsShader) return cachedColorFunctionsShader;\n cachedColorFunctionsShader = `\n\nvec3 saturation(vec3 rgb, float adjustment) {\n const vec3 W = vec3(0.2125, 0.7154, 0.0721);\n vec3 intensity = vec3(dot(rgb, W));\n return mix(intensity, rgb, adjustment);\n}\n\nfloat saturation(vec3 rgb)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(rgb.bg, K.wz), vec4(rgb.gb, K.xy), step(rgb.b, rgb.g));\n vec4 q = mix(vec4(p.xyw, rgb.r), vec4(rgb.r, p.yzx), step(p.x, rgb.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return abs(6.0 * d + e);\n}\n\n// get saturation of a color in values between 0 and 1\nfloat getSaturation(vec3 color) {\n float max = max(color.r, max(color.g, color.b));\n float min = min(color.r, min(color.g, color.b));\n return (max - min) / max;\n}\n \nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n`;\n return cachedColorFunctionsShader;\n};\n\nconst setLinkStyles = (link: HTMLAnchorElement) => {\n link.id = LINK_ID;\n link.href = \"https://neat.firecms.co\";\n link.target = \"_blank\";\n link.style.position = \"absolute\";\n link.style.display = \"block\";\n link.style.bottom = \"0\";\n link.style.right = \"0\";\n link.style.padding = \"10px\";\n link.style.color = \"#dcdcdc\";\n link.style.opacity = \"0.8\";\n link.style.fontFamily = \"sans-serif\";\n link.style.fontSize = \"16px\";\n link.style.fontWeight = \"bold\";\n link.style.textDecoration = \"none\";\n link.style.zIndex = \"10000\";\n link.innerHTML = \"NEAT\";\n}\n\nconst addNeatLink = (ref: HTMLCanvasElement): HTMLAnchorElement => {\n const existingLinks = ref.parentElement?.getElementsByTagName(\"a\");\n if (existingLinks) {\n for (let i = 0; i < existingLinks.length; i++) {\n if (existingLinks[i].id === LINK_ID) {\n setLinkStyles(existingLinks[i]);\n return existingLinks[i];\n }\n }\n }\n const link = document.createElement(\"a\");\n setLinkStyles(link);\n ref.parentElement?.appendChild(link);\n return link;\n}\n\nfunction getElapsedSecondsInLastHour() {\n const now = new Date();\n const minutes = now.getMinutes();\n const seconds = now.getSeconds();\n return (minutes * 60) + seconds;\n}\n\nfunction generateRandomString(length: number = 6): string {\n const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let result = '';\n for (let i = 0; i < length; i++) {\n const randomIndex = Math.floor(Math.random() * characters.length);\n result += characters.charAt(randomIndex);\n }\n return result;\n}\n\nfunction downloadURI(uri: string, name: string) {\n const link = document.createElement(\"a\");\n link.download = name;\n link.href = uri;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n}\n\nfunction injectSEO() {\n if (document.getElementById(\"neat-seo-schema\")) return;\n\n // 1. JSON-LD Schema\n const script = document.createElement('script');\n script.id = \"neat-seo-schema\";\n script.type = 'application/ld+json';\n script.text = JSON.stringify({\n \"@context\": \"https://schema.org\",\n \"@type\": \"WebSite\",\n \"name\": \"NEAT Gradient\",\n \"url\": \"https://neat.firecms.co\",\n \"author\": {\n \"@type\": \"Organization\",\n \"name\": \"FireCMS\",\n \"url\": \"https://firecms.co\"\n },\n \"description\": \"Beautiful, fast, heavily customizable, WebGL based gradients.\"\n });\n document.head.appendChild(script);\n\n // 2. Hidden Backlink via Shadow DOM\n const hiddenContainer = document.createElement('div');\n hiddenContainer.style.position = 'absolute';\n hiddenContainer.style.width = '1px';\n hiddenContainer.style.height = '1px';\n hiddenContainer.style.padding = '0';\n hiddenContainer.style.margin = '-1px';\n hiddenContainer.style.overflow = 'hidden';\n hiddenContainer.style.clip = 'rect(0, 0, 0, 0)';\n hiddenContainer.style.whiteSpace = 'nowrap';\n hiddenContainer.style.borderWidth = '0';\n\n try {\n const shadow = hiddenContainer.attachShadow({ mode: 'closed' });\n const link = document.createElement('a');\n link.href = \"https://firecms.co\";\n link.textContent = \"FireCMS\";\n shadow.appendChild(link);\n } catch (e) {\n const link = document.createElement('a');\n link.href = \"https://firecms.co\";\n link.textContent = \"FireCMS\";\n hiddenContainer.appendChild(link);\n }\n\n document.body.appendChild(hiddenContainer);\n}\n"],"names":["PLANE_WIDTH","PLANE_HEIGHT","WIREFRAME","COLORS_COUNT","clock","THREE","LINK_ID","generateRandomString","NeatGradient","config","ref","speed","horizontalPressure","verticalPressure","waveFrequencyX","waveFrequencyY","waveAmplitude","colors","highlights","shadows","colorSaturation","colorBrightness","colorBlending","grainScale","grainIntensity","grainSparsity","grainSpeed","wireframe","backgroundColor","backgroundAlpha","resolution","seed","yOffset","yOffsetWaveMultiplier","yOffsetColorMultiplier","yOffsetFlowMultiplier","flowDistortionA","flowDistortionB","flowScale","flowEase","flowEnabled","mouseDistortionStrength","mouseDistortionRadius","mouseDecayRate","mouseDarken","enableProceduralTexture","textureVoidLikelihood","textureVoidWidthMin","textureVoidWidthMax","textureBandDensity","textureColorBlending","textureSeed","textureEase","proceduralBackgroundColor","textureShapeTriangles","textureShapeCircles","textureShapeBars","textureShapeSquiggles","injectSEO","tick","getElapsedSecondsInLastHour","render","renderer","camera","scene","addNeatLink","u","now","shaderColors","i","c","hasActiveBrushes","obj","oldClearAlpha","setSize","canvas","width","height","updateCamera","fSize","aspect","m","mat","filename","dataURL","downloadURI","value","meshes","material","geo","plane","_","uniforms","buildUniforms","buildNoise","buildColorFunctions","buildVertexShader","buildFragmentShader","brushCanvas","bCtx","grd","brushTex","brushMat","brushGeo","brushPoolSize","rect","brush","sourceCanvas","sCtx","baseSeed","random","x","setSeed","offset","hexToRgb","hex","bigint","rgbToHex","r","g","b","getInterColor","c1","c2","mix","rgb1","rgb2","baseColor","bgGrad","y","s","j","ctx","layoutHead","segments","w","seg","startX","endX","currentX","stripeWidth","sourceX","tex","targetPlaneArea","ratio","targetWidth","targetHeight","left","right","top","bottom","horizontalScale","mobileZoomFactor","near","far","cachedVertexShader","cachedFragmentShader","cachedUniformsShader","cachedNoiseShader","cachedColorFunctionsShader","setLinkStyles","link","existingLinks","minutes","seconds","length","characters","result","randomIndex","uri","name","script","hiddenContainer","shadow"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.umd.js","sources":["../src/shaders.ts","../src/math.ts","../src/NeatGradient.ts"],"sourcesContent":["export const vertexShaderSource = `void main() {\n vUv = uv;\n\n // SCROLLING LOGIC\n // Separate multipliers for wave, color, and flow offsets\n float waveOffset = -u_y_offset * u_y_offset_wave_multiplier;\n float colorOffset = -u_y_offset * u_y_offset_color_multiplier;\n float flowOffset = -u_y_offset * u_y_offset_flow_multiplier;\n\n // 1. DISPLACEMENT (WAVES)\n // We add waveOffset to Y to scroll the wave pattern\n v_displacement_amount = cnoise( vec3(\n u_wave_frequency_x * position.x + u_time,\n u_wave_frequency_y * (position.y + waveOffset) + u_time,\n u_time\n ));\n\n // 2. FLOW FIELD\n // Apply flow offset to scroll the flow field mask\n vec2 baseUv = vUv;\n baseUv.y += flowOffset / u_plane_height; // Scale to match wave speed\n vec2 flowUv = baseUv;\n\n if (u_flow_enabled > 0.5) {\n if (u_flow_ease > 0.0 || u_flow_distortion_a > 0.0) {\n vec2 ppp = -1.0 + 2.0 * baseUv;\n ppp += 0.1 * cos((1.5 * u_flow_scale) * ppp.yx + 1.1 * u_time + vec2(0.1, 1.1));\n ppp += 0.1 * cos((2.3 * u_flow_scale) * ppp.yx + 1.3 * u_time + vec2(3.2, 3.4));\n ppp += 0.1 * cos((2.2 * u_flow_scale) * ppp.yx + 1.7 * u_time + vec2(1.8, 5.2));\n ppp += u_flow_distortion_a * cos((u_flow_distortion_b * u_flow_scale) * ppp.yx + 1.4 * u_time + vec2(6.3, 3.9));\n\n float r = length(ppp);\n flowUv = mix(baseUv, vec2(baseUv.x * (1.0 - u_flow_ease) + r * u_flow_ease, baseUv.y), u_flow_ease);\n }\n }\n\n // Pass the standard flow UV to fragment shader (for texture)\n vFlowUv = flowUv;\n\n // 3. COLOR MIXING\n // We take the computed flow UVs and apply the color offset\n // Scale by plane height to match wave offset speed (world space vs UV space)\n vec3 color = u_colors[0].color;\n // ...\n vec2 adjustedUv = flowUv;\n adjustedUv.y += colorOffset / u_plane_height; // Scroll the color mixing pattern\n\n vec2 noise_cord = adjustedUv * u_color_pressure;\n const float minNoise = .0;\n const float maxNoise = .9;\n\n for (int i = 1; i < 6; i++) {\n if (i < u_colors_count) {\n if (u_colors[i].is_active > 0.5) {\n float noiseFlow = (1. + float(i)) / 30.;\n float noiseSpeed = (1. + float(i)) * 0.11;\n float noiseSeed = 13. + float(i) * 7.;\n\n float noise = snoise(\n vec3(\n noise_cord.x * u_color_pressure.x + u_time * noiseFlow * 2.,\n noise_cord.y * u_color_pressure.y,\n u_time * noiseSpeed\n ) + noiseSeed\n ) - (.1 * float(i)) + (.5 * u_color_blending);\n\n noise = clamp(noise, minNoise, maxNoise + float(i) * 0.02);\n color = mix(color, u_colors[i].color, smoothstep(0.0, u_color_blending, noise));\n }\n }\n }\n\n v_color = color;\n\n // 4. VERTEX POSITION\n vec3 newPosition = position + normal * v_displacement_amount * u_wave_amplitude;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(newPosition, 1.0);\n v_new_position = gl_Position;\n}\n`;\n\nexport const fragmentShaderSource = `float random(vec2 p) {\n return fract(sin(dot(p, vec2(12.9898,78.233))) * 43758.5453);\n}\n\nfloat fbm(vec3 x) {\n float value = 0.0;\n float amplitude = 0.5;\n float frequency = 1.0;\n for (int i = 0; i < 4; i++) {\n value += amplitude * snoise(x * frequency);\n frequency *= 2.0;\n amplitude *= 0.5;\n }\n return value;\n}\n\nvoid main() {\n vec2 finalUv = vFlowUv;\n \n vec3 baseColor;\n\n if (u_enable_procedural_texture > 0.5) {\n // Calculate flow field distance for ease effect\n vec2 ppp = -1.0 + 2.0 * finalUv;\n ppp += 0.1 * cos((1.5 * u_flow_scale) * ppp.yx + 1.1 * u_time + vec2(0.1, 1.1));\n ppp += 0.1 * cos((2.3 * u_flow_scale) * ppp.yx + 1.3 * u_time + vec2(3.2, 3.4));\n ppp += 0.1 * cos((2.2 * u_flow_scale) * ppp.yx + 1.7 * u_time + vec2(1.8, 5.2));\n ppp += u_flow_distortion_a * cos((u_flow_distortion_b * u_flow_scale) * ppp.yx + 1.4 * u_time + vec2(6.3, 3.9));\n float r = length(ppp); // Flow distance\n \n // Ease blending: 0 = topographic (flow), 1 = image (UV)\n float vx = (finalUv.x * u_texture_ease) + (r * (1.0 - u_texture_ease));\n float vy = (finalUv.y * u_texture_ease) + (0.0 * (1.0 - u_texture_ease));\n vec2 texUv = vec2(vx, vy);\n\n // PARALLAX SCROLLING\n // We manually apply a smaller offset here to make the texture lag behind\n float parallaxFactor = 0.25; // 25% speed of the color mixing\n texUv.y -= (u_y_offset * u_y_offset_color_multiplier / u_plane_height) * parallaxFactor;\n\n texUv *= 1.5; // Tiling scale\n\n vec4 texSample = texture2D(u_procedural_texture, texUv);\n baseColor = texSample.rgb;\n } else {\n baseColor = v_color;\n }\n\n vec3 color = baseColor;\n\n // Post-processing\n color += v_displacement_amount * u_highlights;\n // Replace pow() with direct multiplication to avoid negative base undefined behavior in GLSL\n float shadowFactor = 1.0 - v_displacement_amount;\n color -= shadowFactor * shadowFactor * u_shadows;\n color = saturation(color, 1.0 + u_saturation);\n color = color * u_brightness;\n\n // Grain\n vec2 noiseCoords = gl_FragCoord.xy / u_grain_scale;\n float grain = 0.0;\n \n // Completely bypass expensive noise generation if grain is disabled\n if (u_grain_intensity > 0.0) {\n if (u_grain_speed != 0.0) {\n grain = fbm(vec3(noiseCoords, u_time * u_grain_speed));\n } else {\n grain = fbm(vec3(noiseCoords, 0.0));\n }\n\n grain = grain * 0.5 + 0.5;\n grain -= 0.5;\n grain = (grain > u_grain_sparsity) ? grain : 0.0;\n grain *= u_grain_intensity;\n }\n\n color += vec3(grain);\n\n gl_FragColor = vec4(color, 1.0);\n}\n`;\n\nexport function buildVertUniforms(): string {\n return `precision highp float;\n\nattribute vec3 position;\nattribute vec3 normal;\nattribute vec2 uv;\n\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\n\nvarying vec2 vUv;\nvarying vec2 vFlowUv;\nvarying vec4 v_new_position;\nvarying vec3 v_color;\nvarying float v_displacement_amount;\n\nuniform float u_time;\nuniform vec2 u_resolution;\nuniform vec2 u_color_pressure;\nuniform float u_wave_frequency_x;\nuniform float u_wave_frequency_y;\nuniform float u_wave_amplitude;\nuniform float u_plane_width;\nuniform float u_plane_height;\nuniform float u_color_blending;\n\nuniform int u_colors_count;\nstruct ColorStop {\n float is_active;\n vec3 color;\n float influence;\n};\nuniform ColorStop u_colors[6];\n\nuniform float u_y_offset;\nuniform float u_y_offset_wave_multiplier;\nuniform float u_y_offset_color_multiplier;\nuniform float u_y_offset_flow_multiplier;\n\n// Flow field uniforms\nuniform float u_flow_distortion_a;\nuniform float u_flow_distortion_b;\nuniform float u_flow_scale;\nuniform float u_flow_ease;\nuniform float u_flow_enabled;\n`;\n}\n\nexport function buildFragUniforms(): string {\n return `precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vFlowUv;\nvarying vec3 v_color;\nvarying float v_displacement_amount;\n\nuniform float u_time;\nuniform float u_plane_height;\n\nuniform float u_shadows;\nuniform float u_highlights;\nuniform float u_saturation;\nuniform float u_brightness;\nuniform float u_grain_intensity; \nuniform float u_grain_sparsity; \nuniform float u_grain_scale; \nuniform float u_grain_speed; \n\nuniform float u_y_offset;\nuniform float u_y_offset_color_multiplier;\n\n// Flow field uniforms\nuniform float u_flow_distortion_a;\nuniform float u_flow_distortion_b;\nuniform float u_flow_scale;\n\n// Procedural texture uniforms\nuniform sampler2D u_procedural_texture;\nuniform float u_enable_procedural_texture;\nuniform float u_texture_ease;\n`;\n}\n\nexport function buildNoise(): string {\n return `\n// 1. REPLACEMENT PERMUTE: \n// Uses a hash function (fract/sin) instead of a modular lookup table.\nvec4 permute(vec4 x) {\n return floor(fract(sin(x) * 43758.5453123) * 289.0);\n}\n\n// Taylor Inverse Sqrt\nvec4 taylorInvSqrt(vec4 r) {\n return 1.79284291400159 - 0.85373472095314 * r;\n}\n\n// Fade function\nvec3 fade(vec3 t) {\n return t*t*t*(t*(t*6.0-15.0)+10.0);\n}\n\n// 3D Simplex Noise\nfloat snoise(vec3 v) {\n const vec2 C = vec2(1.0/6.0, 1.0/3.0) ;\n const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);\n\n // First corner\n vec3 i = floor(v + dot(v, C.yyy) );\n vec3 x0 = v - i + dot(i, C.xxx) ;\n\n // Other corners\n vec3 g = step(x0.yzx, x0.xyz);\n vec3 l = 1.0 - g;\n vec3 i1 = min( g.xyz, l.zxy );\n vec3 i2 = max( g.xyz, l.zxy );\n\n vec3 x1 = x0 - i1 + C.xxx;\n vec3 x2 = x0 - i2 + C.yyy;\n vec3 x3 = x0 - D.yyy;\n\n // Permutations\n vec4 p = permute( permute( permute(\n i.z + vec4(0.0, i1.z, i2.z, 1.0 ))\n + i.y + vec4(0.0, i1.y, i2.y, 1.0 ))\n + i.x + vec4(0.0, i1.x, i2.x, 1.0 ));\n\n // Gradients\n float n_ = 0.142857142857; // 1.0/7.0\n vec3 ns = n_ * D.wyz - D.xzx;\n\n vec4 j = p - 49.0 * floor(p * ns.z * ns.z);\n\n vec4 x_ = floor(j * ns.z);\n vec4 y_ = floor(j - 7.0 * x_ );\n\n vec4 x = x_ *ns.x + ns.yyyy;\n vec4 y = y_ *ns.x + ns.yyyy;\n vec4 h = 1.0 - abs(x) - abs(y);\n\n vec4 b0 = vec4( x.xy, y.xy );\n vec4 b1 = vec4( x.zw, y.zw );\n\n vec4 s0 = floor(b0)*2.0 + 1.0;\n vec4 s1 = floor(b1)*2.0 + 1.0;\n vec4 sh = -step(h, vec4(0.0));\n\n vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ;\n vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ;\n\n vec3 p0 = vec3(a0.xy,h.x);\n vec3 p1 = vec3(a0.zw,h.y);\n vec3 p2 = vec3(a1.xy,h.z);\n vec3 p3 = vec3(a1.zw,h.w);\n\n // Normalise gradients\n vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));\n p0 *= norm.x;\n p1 *= norm.y;\n p2 *= norm.z;\n p3 *= norm.w;\n\n // Mix final noise value\n vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);\n m = m * m;\n return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1),\n dot(p2,x2), dot(p3,x3) ) );\n}\n\n// Classic Perlin noise\nfloat cnoise(vec3 P)\n{\n vec3 Pi0 = floor(P); \n vec3 Pi1 = Pi0 + vec3(1.0); \n \n vec3 Pf0 = fract(P); \n vec3 Pf1 = Pf0 - vec3(1.0); \n vec4 ix = vec4(Pi0.x, Pi1.x, Pi0.x, Pi1.x);\n vec4 iy = vec4(Pi0.yy, Pi1.yy);\n vec4 iz0 = Pi0.zzzz;\n vec4 iz1 = Pi1.zzzz;\n\n vec4 ixy = permute(permute(ix) + iy);\n vec4 ixy0 = permute(ixy + iz0);\n vec4 ixy1 = permute(ixy + iz1);\n\n vec4 gx0 = ixy0 * (1.0 / 7.0);\n vec4 gy0 = fract(floor(gx0) * (1.0 / 7.0)) - 0.5;\n gx0 = fract(gx0);\n vec4 gz0 = vec4(0.5) - abs(gx0) - abs(gy0);\n vec4 sz0 = step(gz0, vec4(0.0));\n gx0 -= sz0 * (step(0.0, gx0) - 0.5);\n gy0 -= sz0 * (step(0.0, gy0) - 0.5);\n\n vec4 gx1 = ixy1 * (1.0 / 7.0);\n vec4 gy1 = fract(floor(gx1) * (1.0 / 7.0)) - 0.5;\n gx1 = fract(gx1);\n vec4 gz1 = vec4(0.5) - abs(gx1) - abs(gy1);\n vec4 sz1 = step(gz1, vec4(0.0));\n gx1 -= sz1 * (step(0.0, gx1) - 0.5);\n gy1 -= sz1 * (step(0.0, gy1) - 0.5);\n\n vec3 g000 = vec3(gx0.x,gy0.x,gz0.x);\n vec3 g100 = vec3(gx0.y,gy0.y,gz0.y);\n vec3 g010 = vec3(gx0.z,gy0.z,gz0.z);\n vec3 g110 = vec3(gx0.w,gy0.w,gz0.w);\n vec3 g001 = vec3(gx1.x,gy1.x,gz1.x);\n vec3 g101 = vec3(gx1.y,gy1.y,gz1.y);\n vec3 g011 = vec3(gx1.z,gy1.z,gz1.z);\n vec3 g111 = vec3(gx1.w,gy1.w,gz1.w);\n\n vec4 norm0 = taylorInvSqrt(vec4(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110)));\n g000 *= norm0.x;\n g010 *= norm0.y;\n g100 *= norm0.z;\n g110 *= norm0.w;\n vec4 norm1 = taylorInvSqrt(vec4(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111)));\n g001 *= norm1.x;\n g011 *= norm1.y;\n g101 *= norm1.z;\n g111 *= norm1.w;\n\n float n000 = dot(g000, Pf0);\n float n100 = dot(g100, vec3(Pf1.x, Pf0.yz));\n float n010 = dot(g010, vec3(Pf0.x, Pf1.y, Pf0.z));\n float n110 = dot(g110, vec3(Pf1.xy, Pf0.z));\n float n001 = dot(g001, vec3(Pf0.xy, Pf1.z));\n float n101 = dot(g101, vec3(Pf1.x, Pf0.y, Pf1.z));\n float n011 = dot(g011, vec3(Pf0.x, Pf1.yz));\n float n111 = dot(g111, Pf1);\n\n vec3 fade_xyz = fade(Pf0);\n vec4 n_z = mix(vec4(n000, n100, n010, n110), vec4(n001, n101, n011, n111), fade_xyz.z);\n vec2 n_yz = mix(n_z.xy, n_z.zw, fade_xyz.y);\n float n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x);\n return 2.2 * n_xyz;\n}\n`;\n}\n\nexport function buildColorFunctions(): string {\n return `\nvec3 saturation(vec3 rgb, float adjustment) {\n const vec3 W = vec3(0.2125, 0.7154, 0.0721);\n vec3 intensity = vec3(dot(rgb, W));\n return mix(intensity, rgb, adjustment);\n}\n`;\n}\n","export class Matrix4 {\n elements: Float32Array;\n constructor() {\n this.elements = new Float32Array([\n 1, 0, 0, 0,\n 0, 1, 0, 0,\n 0, 0, 1, 0,\n 0, 0, 0, 1\n ]);\n }\n translate(tx: number, ty: number, tz: number) {\n this.elements[12] += this.elements[0] * tx + this.elements[4] * ty + this.elements[8] * tz;\n this.elements[13] += this.elements[1] * tx + this.elements[5] * ty + this.elements[9] * tz;\n this.elements[14] += this.elements[2] * tx + this.elements[6] * ty + this.elements[10] * tz;\n this.elements[15] += this.elements[3] * tx + this.elements[7] * ty + this.elements[11] * tz;\n return this;\n }\n rotateX(angle: number) {\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n const m12 = this.elements[4], m22 = this.elements[5], m32 = this.elements[6], m42 = this.elements[7];\n const m13 = this.elements[8], m23 = this.elements[9], m33 = this.elements[10], m43 = this.elements[11];\n this.elements[4] = c * m12 + s * m13;\n this.elements[5] = c * m22 + s * m23;\n this.elements[6] = c * m32 + s * m33;\n this.elements[7] = c * m42 + s * m43;\n this.elements[8] = c * m13 - s * m12;\n this.elements[9] = c * m23 - s * m22;\n this.elements[10] = c * m33 - s * m32;\n this.elements[11] = c * m43 - s * m42;\n return this;\n }\n}\n\nexport class OrthographicCamera {\n left: number;\n right: number;\n top: number;\n bottom: number;\n near: number;\n far: number;\n position: [number, number, number];\n projectionMatrix: Matrix4;\n\n constructor(left: number, right: number, top: number, bottom: number, near: number, far: number) {\n this.left = left;\n this.right = right;\n this.top = top;\n this.bottom = bottom;\n this.near = near;\n this.far = far;\n this.position = [0, 0, 0];\n this.projectionMatrix = new Matrix4();\n this.updateProjectionMatrix();\n }\n\n updateProjectionMatrix() {\n const w = 1.0 / (this.right - this.left);\n const h = 1.0 / (this.top - this.bottom);\n const p = 1.0 / (this.far - this.near);\n const x = (this.right + this.left) * w;\n const y = (this.top + this.bottom) * h;\n const z = (this.far + this.near) * p;\n this.projectionMatrix.elements = new Float32Array([\n 2 * w, 0, 0, 0,\n 0, 2 * h, 0, 0,\n 0, 0, -2 * p, 0,\n -x, -y, -z, 1\n ]);\n }\n}\n\nexport function updateCamera(camera: OrthographicCamera, width: number, height: number, planeWidth: number = 50, planeHeight: number = 50) {\n const viewPortAreaRatio = 1000000;\n const areaViewPort = width * height;\n const targetPlaneArea = areaViewPort / viewPortAreaRatio * planeWidth * planeHeight / 1.5;\n\n const ratio = width / height;\n const targetWidth = Math.sqrt(targetPlaneArea * ratio);\n const targetHeight = targetPlaneArea / targetWidth;\n\n let left = -planeWidth / 2;\n let right = Math.min((left + targetWidth) / 1.5, planeWidth / 2);\n let top = planeHeight / 4;\n let bottom = Math.max((top - targetHeight) / 2, -planeHeight / 4);\n\n if (ratio < 1) {\n const horizontalScale = ratio;\n left = left * horizontalScale;\n right = right * horizontalScale;\n const mobileZoomFactor = 1.05;\n left = left * mobileZoomFactor;\n right = right * mobileZoomFactor;\n top = top * mobileZoomFactor;\n bottom = bottom * mobileZoomFactor;\n }\n\n camera.left = left;\n camera.right = right;\n camera.top = top;\n camera.bottom = bottom;\n camera.near = -100;\n camera.far = 1000;\n camera.updateProjectionMatrix();\n}\n\nexport function generatePlaneGeometry(width: number, height: number, widthSegments: number, heightSegments: number) {\n const width_half = width / 2;\n const height_half = height / 2;\n const gridX = Math.floor(widthSegments);\n const gridY = Math.floor(heightSegments);\n const gridX1 = gridX + 1;\n const gridY1 = gridY + 1;\n const segment_width = width / gridX;\n const segment_height = height / gridY;\n\n const indices = [];\n const vertices = [];\n const normals = [];\n const uvs = [];\n\n for (let iy = 0; iy < gridY1; iy++) {\n const y = iy * segment_height - height_half;\n for (let ix = 0; ix < gridX1; ix++) {\n const x = ix * segment_width - width_half;\n vertices.push(x, -y, 0);\n normals.push(0, 0, 1);\n uvs.push(ix / gridX);\n uvs.push(1 - (iy / gridY));\n }\n }\n\n for (let iy = 0; iy < gridY; iy++) {\n for (let ix = 0; ix < gridX; ix++) {\n const a = ix + gridX1 * iy;\n const b = ix + gridX1 * (iy + 1);\n const c = (ix + 1) + gridX1 * (iy + 1);\n const d = (ix + 1) + gridX1 * iy;\n indices.push(a, b, d);\n indices.push(b, c, d);\n }\n }\n\n const isLarge = vertices.length / 3 > 65535;\n\n // Generate wireframe indices: for each triangle (a,b,c), emit lines a→b, b→c, c→a\n const wireframeIndices = [];\n for (let i = 0; i < indices.length; i += 3) {\n const a = indices[i];\n const b = indices[i + 1];\n const c = indices[i + 2];\n wireframeIndices.push(a, b, b, c, c, a);\n }\n\n return {\n position: new Float32Array(vertices),\n normal: new Float32Array(normals),\n uv: new Float32Array(uvs),\n index: isLarge ? new Uint32Array(indices) : new Uint16Array(indices),\n wireframeIndex: isLarge ? new Uint32Array(wireframeIndices) : new Uint16Array(wireframeIndices)\n };\n}\n","import { buildColorFunctions, buildNoise, buildVertUniforms, buildFragUniforms, fragmentShaderSource, vertexShaderSource } from \"./shaders\";\nimport { generatePlaneGeometry, OrthographicCamera, updateCamera, Matrix4 } from \"./math\";\n\nconsole.info(\n \"%c🌈 Neat Gradients%c\\n\\nLicensed under MIT + The Commons Clause.\\nFree for personal and commercial use.\\nSelling this software or its derivatives is strictly prohibited.\\nhttps://neat.firecms.co\",\n \"font-weight: bold; font-size: 14px; color: #FF5772;\", \"color: inherit;\"\n);\n\nconst PLANE_WIDTH = 50;\nconst PLANE_HEIGHT = 80;\n\n\nconst COLORS_COUNT = 6;\n\nconst LINK_ID = generateRandomString();\n\nexport interface WebGLState {\n gl: WebGLRenderingContext | WebGL2RenderingContext;\n program: WebGLProgram;\n buffers: {\n position: WebGLBuffer;\n normal: WebGLBuffer;\n uv: WebGLBuffer;\n index: WebGLBuffer;\n wireframeIndex: WebGLBuffer;\n };\n locations: {\n attributes: Record<string, number>;\n uniforms: Record<string, WebGLUniformLocation | null>;\n };\n camera: OrthographicCamera;\n indexCount: number;\n wireframeIndexCount: number;\n indexType: number;\n}\n\n\n\nexport type NeatConfig = {\n resolution?: number;\n speed?: number;\n horizontalPressure?: number;\n verticalPressure?: number;\n waveFrequencyX?: number;\n waveFrequencyY?: number;\n waveAmplitude?: number;\n highlights?: number;\n shadows?: number;\n colorSaturation?: number;\n colorBrightness?: number;\n colors: NeatColor[];\n colorBlending?: number;\n grainScale?: number;\n grainIntensity?: number;\n grainSparsity?: number;\n grainSpeed?: number;\n wireframe?: boolean;\n backgroundColor?: string;\n backgroundAlpha?: number;\n yOffset?: number;\n yOffsetWaveMultiplier?: number;\n yOffsetColorMultiplier?: number;\n yOffsetFlowMultiplier?: number;\n // Flow field parameters\n flowDistortionA?: number;\n flowDistortionB?: number;\n flowScale?: number;\n flowEase?: number;\n flowEnabled?: boolean;\n\n // Texture generation\n enableProceduralTexture?: boolean;\n textureVoidLikelihood?: number;\n textureVoidWidthMin?: number;\n textureVoidWidthMax?: number;\n textureBandDensity?: number;\n textureColorBlending?: number;\n textureSeed?: number;\n textureEase?: number;\n proceduralBackgroundColor?: string;\n textureShapeTriangles?: number;\n textureShapeCircles?: number;\n textureShapeBars?: number;\n textureShapeSquiggles?: number;\n};\n\nexport type NeatColor = {\n color: string;\n enabled: boolean;\n /**\n * Value from 0 to 1\n */\n influence?: number;\n}\n\nexport type NeatController = {\n destroy: () => void;\n}\n\nexport class NeatGradient implements NeatController {\n\n private _ref: HTMLCanvasElement;\n\n private _speed: number = -1;\n\n private _horizontalPressure: number = -1;\n private _verticalPressure: number = -1;\n\n private _waveFrequencyX: number = -1;\n private _waveFrequencyY: number = -1;\n private _waveAmplitude: number = -1;\n\n private _shadows: number = -1;\n private _highlights: number = -1;\n private _saturation: number = -1;\n private _brightness: number = -1;\n\n private _grainScale: number = -1;\n private _grainIntensity: number = -1;\n private _grainSparsity: number = -1;\n private _grainSpeed: number = -1;\n\n private _colorBlending: number = -1;\n\n private _colors: NeatColor[] = [];\n private _wireframe: boolean = false;\n\n private _backgroundColor: string = \"#FFFFFF\";\n private _backgroundColorRgb: [number, number, number] = [1, 1, 1];\n private _backgroundAlpha: number = 1.0;\n\n // Flow field properties\n private _flowDistortionA: number = 0;\n private _flowDistortionB: number = 0;\n private _flowScale: number = 1.0;\n private _flowEase: number = 0.0;\n private _flowEnabled: boolean = true;\n\n private glState!: WebGLState;\n\n // Texture generation properties\n private _enableProceduralTexture: boolean = false;\n private _textureVoidLikelihood: number = 0.45;\n private _textureVoidWidthMin: number = 200;\n private _textureVoidWidthMax: number = 486;\n private _textureBandDensity: number = 2.15;\n private _textureColorBlending: number = 0.01;\n private _textureSeed: number = 333;\n private _textureEase: number = 0.5;\n private _proceduralTexture: WebGLTexture | null = null;\n private _proceduralBackgroundColor: string = \"#000000\";\n\n private _textureShapeTriangles: number = 20;\n private _textureShapeCircles: number = 15;\n private _textureShapeBars: number = 15;\n private _textureShapeSquiggles: number = 10;\n\n private requestRef: number = -1;\n private sizeObserver: ResizeObserver;\n\n private _initialized: boolean = false;\n private _linkElement: HTMLAnchorElement | null = null;\n private _cachedColorRgb: [number, number, number][] = [];\n\n private _yOffset: number = 0;\n private _yOffsetWaveMultiplier: number = 0.004;\n private _yOffsetColorMultiplier: number = 0.004;\n private _yOffsetFlowMultiplier: number = 0.004;\n\n // Performance optimizations\n private _resizeTimeoutId: number | null = null;\n private _textureNeedsUpdate: boolean = false;\n private _linkCheckCounter: number = 0;\n private _colorsChanged: boolean = true;\n private _uniformsDirty: boolean = true;\n private _textureDirty: boolean = true;\n\n constructor(config: NeatConfig & { ref: HTMLCanvasElement, resolution?: number, seed?: number }) {\n\n const {\n ref,\n speed = 4,\n horizontalPressure = 3,\n verticalPressure = 3,\n waveFrequencyX = 5,\n waveFrequencyY = 5,\n waveAmplitude = 3,\n colors,\n highlights = 4,\n shadows = 4,\n colorSaturation = 0,\n colorBrightness = 1,\n colorBlending = 5,\n grainScale = 2,\n grainIntensity = 0.55,\n grainSparsity = 0.0,\n grainSpeed = 0.1,\n wireframe = false,\n backgroundColor = \"#FFFFFF\",\n backgroundAlpha = 1.0,\n resolution = 1,\n seed,\n yOffset = 0,\n yOffsetWaveMultiplier = 4,\n yOffsetColorMultiplier = 4,\n yOffsetFlowMultiplier = 4,\n // Flow field parameters\n flowDistortionA = 0,\n flowDistortionB = 0,\n flowScale = 1.0,\n flowEase = 0.0,\n flowEnabled = true,\n\n // Texture generation\n enableProceduralTexture = false,\n textureVoidLikelihood = 0.45,\n textureVoidWidthMin = 200,\n textureVoidWidthMax = 486,\n textureBandDensity = 2.15,\n textureColorBlending = 0.01,\n textureSeed = 333,\n textureEase = 0.5,\n proceduralBackgroundColor = \"#000000\",\n textureShapeTriangles = 20,\n textureShapeCircles = 15,\n textureShapeBars = 15,\n textureShapeSquiggles = 10,\n } = config;\n\n\n this._ref = ref;\n\n this.destroy = this.destroy.bind(this);\n this._initScene = this._initScene.bind(this);\n\n this.speed = speed;\n this.horizontalPressure = horizontalPressure;\n this.verticalPressure = verticalPressure;\n this.waveFrequencyX = waveFrequencyX;\n this.waveFrequencyY = waveFrequencyY;\n this.waveAmplitude = waveAmplitude;\n this.colorBlending = colorBlending;\n this.grainScale = grainScale;\n this.grainIntensity = grainIntensity;\n this.grainSparsity = grainSparsity;\n this.grainSpeed = grainSpeed;\n this.colors = colors;\n this.shadows = shadows;\n this.highlights = highlights;\n this.colorSaturation = colorSaturation;\n this.colorBrightness = colorBrightness;\n this.wireframe = wireframe;\n this.backgroundColor = backgroundColor;\n this.backgroundAlpha = backgroundAlpha;\n this.yOffset = yOffset;\n this.yOffsetWaveMultiplier = yOffsetWaveMultiplier;\n this.yOffsetColorMultiplier = yOffsetColorMultiplier;\n this.yOffsetFlowMultiplier = yOffsetFlowMultiplier;\n\n // Flow field\n this.flowDistortionA = flowDistortionA;\n this.flowDistortionB = flowDistortionB;\n this.flowScale = flowScale;\n this.flowEase = flowEase;\n this.flowEnabled = flowEnabled;\n\n\n\n // Texture generation\n this.enableProceduralTexture = enableProceduralTexture;\n this.textureVoidLikelihood = textureVoidLikelihood;\n this.textureVoidWidthMin = textureVoidWidthMin;\n this.textureVoidWidthMax = textureVoidWidthMax;\n this.textureBandDensity = textureBandDensity;\n this.textureColorBlending = textureColorBlending;\n this.textureSeed = textureSeed;\n this.textureEase = textureEase;\n this._proceduralBackgroundColor = proceduralBackgroundColor;\n\n this._textureShapeTriangles = textureShapeTriangles;\n this._textureShapeCircles = textureShapeCircles;\n this._textureShapeBars = textureShapeBars;\n this._textureShapeSquiggles = textureShapeSquiggles;\n\n\n this.glState = this._initScene(resolution);\n\n injectSEO();\n\n let tick = seed !== undefined ? seed : getElapsedSecondsInLastHour();\n let lastTime = performance.now();\n\n const render = () => {\n\n const { gl, program, locations, indexCount, indexType } = this.glState;\n\n // Optimization: check if cached link is still valid in DOM less frequently\n this._linkCheckCounter++;\n if (this._linkCheckCounter >= 300) { // Check every ~5 seconds at 60fps\n this._linkCheckCounter = 0;\n if (!this._linkElement || !document.contains(this._linkElement)) {\n this._linkElement = addNeatLink(ref);\n }\n }\n\n if (this._initialized) {\n const timeNow = performance.now();\n tick += ((timeNow - lastTime) / 1000) * this._speed;\n lastTime = timeNow;\n\n gl.useProgram(program);\n\n gl.uniform1f(locations.uniforms['u_time'], tick);\n\n // Only upload static uniforms when they've been modified\n if (this._uniformsDirty) {\n gl.uniform2f(locations.uniforms['u_resolution'], this._ref.clientWidth, this._ref.clientHeight);\n gl.uniform2f(locations.uniforms['u_color_pressure'], this._horizontalPressure, this._verticalPressure);\n\n gl.uniform1f(locations.uniforms['u_wave_frequency_x'], this._waveFrequencyX);\n gl.uniform1f(locations.uniforms['u_wave_frequency_y'], this._waveFrequencyY);\n gl.uniform1f(locations.uniforms['u_wave_amplitude'], this._waveAmplitude);\n gl.uniform1f(locations.uniforms['u_color_blending'], this._colorBlending);\n gl.uniform1f(locations.uniforms['u_shadows'], this._shadows);\n gl.uniform1f(locations.uniforms['u_highlights'], this._highlights);\n gl.uniform1f(locations.uniforms['u_saturation'], this._saturation);\n gl.uniform1f(locations.uniforms['u_brightness'], this._brightness);\n gl.uniform1f(locations.uniforms['u_grain_intensity'], this._grainIntensity);\n gl.uniform1f(locations.uniforms['u_grain_sparsity'], this._grainSparsity);\n gl.uniform1f(locations.uniforms['u_grain_speed'], this._grainSpeed);\n gl.uniform1f(locations.uniforms['u_grain_scale'], this._grainScale);\n gl.uniform1f(locations.uniforms['u_y_offset'], this._yOffset);\n gl.uniform1f(locations.uniforms['u_y_offset_wave_multiplier'], this._yOffsetWaveMultiplier);\n gl.uniform1f(locations.uniforms['u_y_offset_color_multiplier'], this._yOffsetColorMultiplier);\n gl.uniform1f(locations.uniforms['u_y_offset_flow_multiplier'], this._yOffsetFlowMultiplier);\n gl.uniform1f(locations.uniforms['u_flow_distortion_a'], this._flowDistortionA);\n gl.uniform1f(locations.uniforms['u_flow_distortion_b'], this._flowDistortionB);\n gl.uniform1f(locations.uniforms['u_flow_scale'], this._flowScale);\n gl.uniform1f(locations.uniforms['u_flow_ease'], this._flowEase);\n gl.uniform1f(locations.uniforms['u_flow_enabled'], this._flowEnabled ? 1.0 : 0.0);\n\n gl.uniform1f(locations.uniforms['u_enable_procedural_texture'], this._enableProceduralTexture ? 1.0 : 0.0);\n gl.uniform1f(locations.uniforms['u_texture_ease'], this._textureEase);\n\n this._uniformsDirty = false;\n }\n\n // Only regenerate procedural texture when needed\n if (this._textureNeedsUpdate && this._enableProceduralTexture) {\n if (this._proceduralTexture) {\n gl.deleteTexture(this._proceduralTexture);\n }\n this._proceduralTexture = this._createProceduralTexture(gl);\n this._textureNeedsUpdate = false;\n this._textureDirty = true;\n }\n\n // Procedural texture binding — only when texture changes\n if (this._textureDirty && this._proceduralTexture) {\n gl.activeTexture(gl.TEXTURE1);\n gl.bindTexture(gl.TEXTURE_2D, this._proceduralTexture);\n gl.uniform1i(locations.uniforms['u_procedural_texture'], 1);\n this._textureDirty = false;\n }\n\n // Color update — only when colors have changed\n if (this._colorsChanged) {\n this._colorsChanged = false;\n\n for (let i = 0; i < COLORS_COUNT; i++) {\n if (i < this._colors.length) {\n const c = this._colors[i];\n const rgb = this._cachedColorRgb[i] || [0, 0, 0];\n gl.uniform1f(locations.uniforms[`u_colors[${i}].is_active`], c.enabled ? 1.0 : 0.0);\n gl.uniform3fv(locations.uniforms[`u_colors[${i}].color`], rgb);\n gl.uniform1f(locations.uniforms[`u_colors[${i}].influence`], c.influence || 0);\n } else {\n gl.uniform1f(locations.uniforms[`u_colors[${i}].is_active`], 0.0);\n }\n }\n\n gl.uniform1i(locations.uniforms['u_colors_count'], COLORS_COUNT);\n }\n }\n\n\n // Draw scene\n gl.clearColor(\n this._backgroundColorRgb[0],\n this._backgroundColorRgb[1],\n this._backgroundColorRgb[2],\n this._backgroundAlpha\n );\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n\n if (this._wireframe) {\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.glState.buffers.wireframeIndex);\n gl.drawElements(gl.LINES, this.glState.wireframeIndexCount, indexType, 0);\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.glState.buffers.index);\n } else {\n gl.drawElements(gl.TRIANGLES, indexCount, indexType, 0);\n }\n\n this.requestRef = requestAnimationFrame(render);\n };\n\n const setSize = () => {\n\n const { gl, camera } = this.glState;\n const width = this._ref.clientWidth;\n const height = this._ref.clientHeight;\n\n // Handle high DPI displays properly without scaling buffer resolution, matching client width\n this._ref.width = width;\n this._ref.height = height;\n\n gl.viewport(0, 0, width, height);\n\n updateCamera(camera, width, height);\n\n\n\n // Recompute projection matrix on resize\n const projLoc = gl.getUniformLocation(this.glState.program, \"projectionMatrix\");\n gl.useProgram(this.glState.program);\n gl.uniformMatrix4fv(projLoc, false, camera.projectionMatrix.elements);\n };\n\n // Debounce resize to prevent excessive operations\n this.sizeObserver = new ResizeObserver(() => {\n if (this._resizeTimeoutId !== null) {\n clearTimeout(this._resizeTimeoutId);\n }\n this._resizeTimeoutId = window.setTimeout(() => {\n setSize();\n this._resizeTimeoutId = null;\n }, 100); // Wait 100ms after last resize event\n });\n\n this.sizeObserver.observe(ref);\n\n\n render();\n }\n\n destroy() {\n cancelAnimationFrame(this.requestRef);\n this.sizeObserver.disconnect();\n\n // Clear resize timeout\n if (this._resizeTimeoutId !== null) {\n clearTimeout(this._resizeTimeoutId);\n this._resizeTimeoutId = null;\n }\n\n // Remove NEAT link\n if (this._linkElement && this._linkElement.parentElement) {\n this._linkElement.parentElement.removeChild(this._linkElement);\n this._linkElement = null;\n }\n\n // Cleanup WebGL resources\n if (this.glState) {\n const gl = this.glState.gl;\n gl.deleteProgram(this.glState.program);\n gl.deleteBuffer(this.glState.buffers.position);\n gl.deleteBuffer(this.glState.buffers.normal);\n gl.deleteBuffer(this.glState.buffers.uv);\n gl.deleteBuffer(this.glState.buffers.index);\n gl.deleteBuffer(this.glState.buffers.wireframeIndex);\n }\n if (this._proceduralTexture && this.glState) {\n this.glState.gl.deleteTexture(this._proceduralTexture);\n }\n }\n\n downloadAsPNG(filename = \"neat.png\") {\n const dataURL = this._ref.toDataURL(\"image/png\");\n downloadURI(dataURL, filename);\n }\n\n set speed(speed: number) {\n this._uniformsDirty = true;\n this._speed = speed / 20;\n }\n\n set horizontalPressure(horizontalPressure: number) {\n this._uniformsDirty = true;\n this._horizontalPressure = horizontalPressure / 4;\n }\n\n set verticalPressure(verticalPressure: number) {\n this._uniformsDirty = true;\n this._verticalPressure = verticalPressure / 4;\n }\n\n set waveFrequencyX(waveFrequencyX: number) {\n this._uniformsDirty = true;\n this._waveFrequencyX = waveFrequencyX * 0.04;\n }\n\n set waveFrequencyY(waveFrequencyY: number) {\n this._uniformsDirty = true;\n this._waveFrequencyY = waveFrequencyY * 0.04;\n }\n\n set waveAmplitude(waveAmplitude: number) {\n this._uniformsDirty = true;\n this._waveAmplitude = waveAmplitude * .75;\n }\n\n set colors(colors: NeatColor[]) {\n this._uniformsDirty = true;\n this._colors = colors;\n this._cachedColorRgb = colors.map(c => this._hexToRgb(c.color));\n this._colorsChanged = true;\n }\n\n set highlights(highlights: number) {\n this._uniformsDirty = true;\n this._highlights = highlights / 100;\n }\n\n set shadows(shadows: number) {\n this._uniformsDirty = true;\n this._shadows = shadows / 100;\n }\n\n set colorSaturation(colorSaturation: number) {\n this._uniformsDirty = true;\n this._saturation = colorSaturation / 10;\n }\n\n set colorBrightness(colorBrightness: number) {\n this._uniformsDirty = true;\n this._brightness = colorBrightness;\n }\n\n set colorBlending(colorBlending: number) {\n this._uniformsDirty = true;\n this._colorBlending = colorBlending / 10;\n }\n\n set grainScale(grainScale: number) {\n this._uniformsDirty = true;\n this._grainScale = grainScale == 0 ? 1 : grainScale;\n }\n\n set grainIntensity(grainIntensity: number) {\n this._uniformsDirty = true;\n this._grainIntensity = grainIntensity;\n }\n\n set grainSparsity(grainSparsity: number) {\n this._uniformsDirty = true;\n this._grainSparsity = grainSparsity;\n }\n\n set grainSpeed(grainSpeed: number) {\n this._uniformsDirty = true;\n this._grainSpeed = grainSpeed;\n }\n\n set wireframe(wireframe: boolean) {\n this._uniformsDirty = true;\n this._wireframe = wireframe;\n }\n\n set resolution(resolution: number) {\n this._uniformsDirty = true;\n if (this.glState) {\n const gl = this.glState.gl;\n gl.deleteProgram(this.glState.program);\n gl.deleteBuffer(this.glState.buffers.position);\n gl.deleteBuffer(this.glState.buffers.normal);\n gl.deleteBuffer(this.glState.buffers.uv);\n gl.deleteBuffer(this.glState.buffers.index);\n gl.deleteBuffer(this.glState.buffers.wireframeIndex);\n }\n this.glState = this._initScene(resolution);\n }\n\n set backgroundColor(backgroundColor: string) {\n this._uniformsDirty = true;\n this._backgroundColor = backgroundColor;\n this._backgroundColorRgb = this._hexToRgb(backgroundColor);\n }\n\n set backgroundAlpha(backgroundAlpha: number) {\n this._uniformsDirty = true;\n this._backgroundAlpha = backgroundAlpha;\n }\n\n set yOffset(yOffset: number) {\n this._uniformsDirty = true;\n this._yOffset = yOffset;\n }\n\n get yOffsetWaveMultiplier(): number {\n return this._yOffsetWaveMultiplier * 1000;\n }\n\n set yOffsetWaveMultiplier(value: number) {\n this._uniformsDirty = true;\n this._yOffsetWaveMultiplier = value / 1000;\n }\n\n get yOffsetColorMultiplier(): number {\n return this._yOffsetColorMultiplier * 1000;\n }\n\n set yOffsetColorMultiplier(value: number) {\n this._uniformsDirty = true;\n this._yOffsetColorMultiplier = value / 1000;\n }\n\n get yOffsetFlowMultiplier(): number {\n return this._yOffsetFlowMultiplier * 1000;\n }\n\n set yOffsetFlowMultiplier(value: number) {\n this._uniformsDirty = true;\n this._yOffsetFlowMultiplier = value / 1000;\n }\n\n set flowDistortionA(value: number) {\n this._uniformsDirty = true;\n this._flowDistortionA = value;\n }\n\n set flowDistortionB(value: number) {\n this._uniformsDirty = true;\n this._flowDistortionB = value;\n }\n\n set flowScale(value: number) {\n this._uniformsDirty = true;\n this._flowScale = value;\n }\n\n set flowEase(value: number) {\n this._uniformsDirty = true;\n this._flowEase = value;\n }\n\n set flowEnabled(value: boolean) {\n this._uniformsDirty = true;\n this._flowEnabled = value;\n }\n\n get flowEnabled(): boolean {\n return this._flowEnabled;\n }\n\n\n\n set enableProceduralTexture(value: boolean) {\n this._uniformsDirty = true;\n this._enableProceduralTexture = value;\n if (value && !this._proceduralTexture) {\n this._textureNeedsUpdate = true;\n }\n }\n\n set textureVoidLikelihood(value: number) {\n this._uniformsDirty = true;\n this._textureVoidLikelihood = value;\n if (this._enableProceduralTexture) {\n this._textureNeedsUpdate = true;\n }\n }\n\n set textureVoidWidthMin(value: number) {\n this._uniformsDirty = true;\n this._textureVoidWidthMin = value;\n if (this._enableProceduralTexture) {\n this._textureNeedsUpdate = true;\n }\n }\n\n set textureVoidWidthMax(value: number) {\n this._uniformsDirty = true;\n this._textureVoidWidthMax = value;\n if (this._enableProceduralTexture) {\n this._textureNeedsUpdate = true;\n }\n }\n\n set textureBandDensity(value: number) {\n this._uniformsDirty = true;\n this._textureBandDensity = value;\n if (this._enableProceduralTexture) {\n this._textureNeedsUpdate = true;\n }\n }\n\n set textureColorBlending(value: number) {\n this._uniformsDirty = true;\n this._textureColorBlending = value;\n if (this._enableProceduralTexture) {\n this._textureNeedsUpdate = true;\n }\n }\n\n set textureSeed(value: number) {\n this._uniformsDirty = true;\n this._textureSeed = value;\n if (this._enableProceduralTexture) {\n this._textureNeedsUpdate = true;\n }\n }\n\n get textureEase(): number {\n return this._textureEase;\n }\n\n set textureEase(value: number) {\n this._uniformsDirty = true;\n this._textureEase = value;\n }\n\n set proceduralBackgroundColor(value: string) {\n this._uniformsDirty = true;\n this._proceduralBackgroundColor = value;\n if (this._enableProceduralTexture) {\n this._textureNeedsUpdate = true;\n }\n }\n\n set textureShapeTriangles(value: number) {\n this._uniformsDirty = true;\n this._textureShapeTriangles = value;\n if (this._enableProceduralTexture) this._textureNeedsUpdate = true;\n }\n set textureShapeCircles(value: number) {\n this._uniformsDirty = true;\n this._textureShapeCircles = value;\n if (this._enableProceduralTexture) this._textureNeedsUpdate = true;\n }\n set textureShapeBars(value: number) {\n this._uniformsDirty = true;\n this._textureShapeBars = value;\n if (this._enableProceduralTexture) this._textureNeedsUpdate = true;\n }\n set textureShapeSquiggles(value: number) {\n this._uniformsDirty = true;\n this._textureShapeSquiggles = value;\n if (this._enableProceduralTexture) this._textureNeedsUpdate = true;\n }\n\n _hexToRgb(hex: string): [number, number, number] {\n const bigint = parseInt(hex.replace('#', ''), 16);\n return [\n ((bigint >> 16) & 255) / 255.0,\n ((bigint >> 8) & 255) / 255.0,\n (bigint & 255) / 255.0\n ];\n }\n\n _initScene(resolution: number): WebGLState {\n\n const width = this._ref.clientWidth;\n const height = this._ref.clientHeight;\n\n const gl = this._ref.getContext(\"webgl2\", { alpha: true, preserveDrawingBuffer: true, antialias: true }) ||\n this._ref.getContext(\"webgl\", { alpha: true, preserveDrawingBuffer: true, antialias: true });\n\n if (!gl) {\n throw new Error(\"WebGL not supported\");\n }\n\n const ext = gl.getExtension(\"OES_standard_derivatives\");\n gl.getExtension(\"OES_element_index_uint\");\n\n gl.viewport(0, 0, width, height);\n\n // Generate plane geometry with Uint32Array for large meshes\n const { position, normal, uv, index, wireframeIndex } = generatePlaneGeometry(PLANE_WIDTH, PLANE_HEIGHT, 240 * resolution, 240 * resolution);\n\n const positionBuffer = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, position, gl.STATIC_DRAW);\n\n const normalBuffer = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, normalBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, normal, gl.STATIC_DRAW);\n\n const uvBuffer = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, uvBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, uv, gl.STATIC_DRAW);\n\n const indexBuffer = gl.createBuffer()!;\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, index, gl.STATIC_DRAW);\n\n const wireframeIndexBuffer = gl.createBuffer()!;\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, wireframeIndexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, wireframeIndex, gl.STATIC_DRAW);\n\n // Rebind the triangle index buffer as default\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);\n\n const vertShaderSourceCombined = buildVertUniforms() + \"\\n\" + buildNoise() + \"\\n\" + buildColorFunctions() + \"\\n\" + vertexShaderSource;\n const vertShader = gl.createShader(gl.VERTEX_SHADER)!;\n gl.shaderSource(vertShader, vertShaderSourceCombined);\n gl.compileShader(vertShader);\n if (!gl.getShaderParameter(vertShader, gl.COMPILE_STATUS)) {\n console.log(\"VERTEX_SHADER_ERROR_START\");\n console.log(\"Vertex shader error: \", gl.getShaderInfoLog(vertShader));\n console.log(\"GL Error Code:\", gl.getError());\n console.log(\"Vertex Shader Source Dump:\");\n console.log(vertShaderSourceCombined.split('\\n').map((line, i) => `${i + 1}: ${line}`).join('\\n'));\n console.log(\"VERTEX_SHADER_ERROR_END\");\n }\n\n const fragShaderSourceCombined = buildFragUniforms() + \"\\n\" + buildColorFunctions() + \"\\n\" + buildNoise() + \"\\n\" + fragmentShaderSource;\n const fragShader = gl.createShader(gl.FRAGMENT_SHADER)!;\n gl.shaderSource(fragShader, fragShaderSourceCombined);\n gl.compileShader(fragShader);\n if (!gl.getShaderParameter(fragShader, gl.COMPILE_STATUS)) {\n console.log(\"FRAGMENT_SHADER_ERROR_START\");\n console.log(\"Fragment shader error: \", gl.getShaderInfoLog(fragShader));\n console.log(\"GL Error Code:\", gl.getError());\n console.log(\"Fragment Shader Source Dump:\");\n console.log(fragShaderSourceCombined.split('\\n').map((line, i) => `${i + 1}: ${line}`).join('\\n'));\n console.log(\"FRAGMENT_SHADER_ERROR_END\");\n }\n\n const program = gl.createProgram()!;\n gl.attachShader(program, vertShader);\n gl.attachShader(program, fragShader);\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n console.log(\"PROGRAM_LINK_ERROR_START\");\n console.log(\"Program linking error: \", gl.getProgramInfoLog(program));\n console.log(\"GL Error Code:\", gl.getError());\n console.log(\"PROGRAM_LINK_ERROR_END\");\n }\n\n gl.useProgram(program);\n\n const camera = new OrthographicCamera(0, 0, 0, 0, 0, 1000);\n camera.position = [0, 0, 5];\n updateCamera(camera, width, height);\n\n // Define attributes\n const aPosition = gl.getAttribLocation(program, \"position\");\n const aNormal = gl.getAttribLocation(program, \"normal\");\n const aUv = gl.getAttribLocation(program, \"uv\");\n\n gl.enableVertexAttribArray(aPosition);\n gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);\n gl.vertexAttribPointer(aPosition, 3, gl.FLOAT, false, 0, 0);\n\n gl.enableVertexAttribArray(aNormal);\n gl.bindBuffer(gl.ARRAY_BUFFER, normalBuffer);\n gl.vertexAttribPointer(aNormal, 3, gl.FLOAT, false, 0, 0);\n\n gl.enableVertexAttribArray(aUv);\n gl.bindBuffer(gl.ARRAY_BUFFER, uvBuffer);\n gl.vertexAttribPointer(aUv, 2, gl.FLOAT, false, 0, 0);\n\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);\n\n const modelViewMatrix = new Matrix4();\n // The View Matrix is the inverse of the Camera's position\n // Camera is at [0, 0, 5], so view matrix translates by [0, 0, -5]\n modelViewMatrix.translate(-camera.position[0], -camera.position[1], -camera.position[2]);\n\n // The Model Matrix mimicking: plane.rotation.x = -Math.PI / 3.5; plane.position.z = -1;\n modelViewMatrix.translate(0, 0, -1);\n modelViewMatrix.rotateX(-Math.PI / 3.5);\n\n const mvLoc = gl.getUniformLocation(program, \"modelViewMatrix\");\n gl.uniformMatrix4fv(mvLoc, false, modelViewMatrix.elements);\n\n const projLoc = gl.getUniformLocation(program, \"projectionMatrix\");\n gl.uniformMatrix4fv(projLoc, false, camera.projectionMatrix.elements);\n\n const planeWidthLoc = gl.getUniformLocation(program, \"u_plane_width\");\n gl.uniform1f(planeWidthLoc, PLANE_WIDTH);\n\n const planeHeightLoc = gl.getUniformLocation(program, \"u_plane_height\");\n gl.uniform1f(planeHeightLoc, PLANE_HEIGHT);\n\n const colorsCountLoc = gl.getUniformLocation(program, \"u_colors_count\");\n gl.uniform1i(colorsCountLoc, COLORS_COUNT);\n\n const uniformsList = [\n \"u_time\", \"u_resolution\", \"u_color_pressure\", \"u_wave_frequency_x\", \"u_wave_frequency_y\",\n \"u_wave_amplitude\", \"u_colors_count\", \"u_plane_width\", \"u_plane_height\", \"u_shadows\",\n \"u_highlights\", \"u_grain_intensity\", \"u_grain_sparsity\", \"u_grain_scale\", \"u_grain_speed\",\n \"u_flow_distortion_a\", \"u_flow_distortion_b\", \"u_flow_scale\", \"u_flow_ease\", \"u_flow_enabled\",\n \"u_y_offset\", \"u_y_offset_wave_multiplier\", \"u_y_offset_color_multiplier\", \"u_y_offset_flow_multiplier\",\n\n \"u_procedural_texture\", \"u_enable_procedural_texture\", \"u_texture_ease\", \"u_saturation\", \"u_brightness\", \"u_color_blending\"\n ];\n\n const locations: WebGLState[\"locations\"] = {\n attributes: { position: aPosition, normal: aNormal, uv: aUv },\n uniforms: {}\n };\n\n uniformsList.forEach(name => {\n locations.uniforms[name] = gl.getUniformLocation(program, name);\n });\n\n // Add colors uniforms manually\n for (let i = 0; i < COLORS_COUNT; i++) {\n locations.uniforms[`u_colors[${i}].is_active`] = gl.getUniformLocation(program, `u_colors[${i}].is_active`);\n locations.uniforms[`u_colors[${i}].color`] = gl.getUniformLocation(program, `u_colors[${i}].color`);\n locations.uniforms[`u_colors[${i}].influence`] = gl.getUniformLocation(program, `u_colors[${i}].influence`);\n }\n\n this._initialized = true;\n // New program needs all uniforms re-uploaded on first frame\n this._uniformsDirty = true;\n this._colorsChanged = true;\n this._textureDirty = true;\n\n // Enable alpha blending\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n gl.enable(gl.DEPTH_TEST);\n\n return {\n gl,\n program,\n buffers: {\n position: positionBuffer,\n normal: normalBuffer,\n uv: uvBuffer,\n index: indexBuffer,\n wireframeIndex: wireframeIndexBuffer\n },\n locations,\n camera,\n indexCount: index.length,\n wireframeIndexCount: wireframeIndex.length,\n indexType: (index instanceof Uint32Array) ? gl.UNSIGNED_INT : gl.UNSIGNED_SHORT\n };\n }\n\n\n\n _createProceduralTexture(gl: WebGLRenderingContext | WebGL2RenderingContext): WebGLTexture | null {\n // Texture size - 1024 provides good balance between quality and performance\n // Reduced from 2048 for better performance\n const texSize = 1024;\n const sourceCanvas = document.createElement('canvas');\n sourceCanvas.width = texSize;\n sourceCanvas.height = texSize;\n const sCtx = sourceCanvas.getContext('2d', { willReadFrequently: true });\n if (!sCtx) return null;\n\n let seed = this._textureSeed;\n const baseSeed = this._textureSeed;\n\n function random() {\n const x = Math.sin(seed++) * 10000;\n return x - Math.floor(x);\n }\n\n // Helper to reset seed for isolated shape generation\n const setSeed = (offset: number) => {\n seed = baseSeed + offset;\n };\n\n const colors = this._colors.filter(c => c.enabled).map(c => c.color);\n if (colors.length === 0) return null;\n\n // Helper functions\n function hexToRgb(hex: string) {\n const bigint = parseInt(hex.replace('#', ''), 16);\n return {\n r: (bigint >> 16) & 255,\n g: (bigint >> 8) & 255,\n b: bigint & 255\n };\n }\n\n function rgbToHex(r: number, g: number, b: number) {\n return \"#\" + ((1 << 24) + (Math.round(r) << 16) + (Math.round(g) << 8) + Math.round(b)).toString(16).slice(1).padStart(6, '0');\n }\n\n const getInterColor = () => {\n const c1 = colors[Math.floor(random() * colors.length)];\n const c2 = colors[Math.floor(random() * colors.length)];\n const mix = random() * this._textureColorBlending;\n const rgb1 = hexToRgb(c1);\n const rgb2 = hexToRgb(c2);\n const r = rgb1.r + (rgb2.r - rgb1.r) * mix;\n const g = rgb1.g + (rgb2.g - rgb1.g) * mix;\n const b = rgb1.b + (rgb2.b - rgb1.b) * mix;\n return rgbToHex(r, g, b);\n };\n\n // === SOURCE CANVAS ===\n // Base with procedural background color so even sparse areas pick it up\n const baseColor = this._proceduralBackgroundColor || \"#000000\";\n sCtx.fillStyle = baseColor;\n sCtx.fillRect(0, 0, texSize, texSize);\n\n // Then lay a vertical gradient of mixed colors on top for richness\n const bgGrad = sCtx.createLinearGradient(0, 0, 0, texSize);\n bgGrad.addColorStop(0, getInterColor());\n bgGrad.addColorStop(1, getInterColor());\n sCtx.fillStyle = bgGrad;\n sCtx.fillRect(0, 0, texSize, texSize);\n\n // Triangles: use configurable count\n for (let i = 0; i < this._textureShapeTriangles; i++) {\n sCtx.fillStyle = getInterColor();\n sCtx.beginPath();\n const x = random() * texSize;\n const y = random() * texSize;\n const s = 100 + random() * 300;\n sCtx.moveTo(x, y);\n sCtx.lineTo(x + (random() - 0.5) * s, y + (random() - 0.5) * s);\n sCtx.lineTo(x + (random() - 0.5) * s, y + (random() - 0.5) * s);\n sCtx.fill();\n }\n\n // Circles / rings: use configurable count\n for (let i = 0; i < this._textureShapeCircles; i++) {\n sCtx.strokeStyle = getInterColor();\n sCtx.lineWidth = 10 + random() * 50;\n sCtx.beginPath();\n const x = random() * texSize;\n const y = random() * texSize;\n const r = 50 + random() * 150;\n sCtx.arc(x, y, r, 0, Math.PI * 2);\n sCtx.stroke();\n }\n\n // Bars: use configurable count\n for (let i = 0; i < this._textureShapeBars; i++) {\n sCtx.fillStyle = getInterColor();\n sCtx.save();\n sCtx.translate(random() * texSize, random() * texSize);\n sCtx.rotate(random() * Math.PI);\n sCtx.fillRect(-150, -25, 300, 50);\n sCtx.restore();\n }\n\n // Squiggles: use configurable count\n sCtx.lineWidth = 15;\n sCtx.lineCap = 'round';\n for (let i = 0; i < this._textureShapeSquiggles; i++) {\n sCtx.strokeStyle = getInterColor();\n sCtx.beginPath();\n let x = random() * texSize;\n let y = random() * texSize;\n sCtx.moveTo(x, y);\n for (let j = 0; j < 4; j++) {\n sCtx.bezierCurveTo(\n x + (random() - 0.5) * 300, y + (random() - 0.5) * 300,\n x + (random() - 0.5) * 300, y + (random() - 0.5) * 300,\n x + (random() - 0.5) * 300, y + (random() - 0.5) * 300\n );\n x += (random() - 0.5) * 300;\n y += (random() - 0.5) * 300;\n }\n sCtx.stroke();\n }\n\n // === MASKED CANVAS ===\n // Masking: Seed isolation\n setSeed(50000);\n const canvas = document.createElement('canvas');\n canvas.width = texSize;\n canvas.height = texSize;\n const ctx = canvas.getContext('2d', { willReadFrequently: true });\n if (!ctx) return null;\n\n // Start filled with the chosen void color so gaps show that color\n ctx.fillStyle = baseColor;\n ctx.fillRect(0, 0, texSize, texSize);\n\n // Determine layout segments (matter vs void)\n let layoutHead = 0;\n const segments: Array<{ type: 'void' | 'matter', x: number, width: number }> = [];\n\n while (layoutHead < texSize) {\n const isVoid = random() < this._textureVoidLikelihood;\n if (isVoid) {\n const w = this._textureVoidWidthMin + random() * (this._textureVoidWidthMax - this._textureVoidWidthMin);\n segments.push({ type: 'void', x: layoutHead, width: w });\n layoutHead += w;\n } else {\n const w = 50 + random() * 200;\n segments.push({ type: 'matter', x: layoutHead, width: w });\n layoutHead += w;\n }\n }\n\n // Render only matter bands from the source into the masked canvas\n for (const seg of segments) {\n if (seg.type === 'matter') {\n const startX = seg.x;\n const endX = Math.min(seg.x + seg.width, texSize);\n let currentX = startX;\n\n while (currentX < endX) {\n const stripeWidth = (2 + random() * 20) / this._textureBandDensity;\n const sourceX = Math.floor(random() * texSize);\n ctx.drawImage(\n sourceCanvas,\n sourceX, 0, stripeWidth, texSize,\n currentX, 0, stripeWidth, texSize\n );\n currentX += stripeWidth;\n }\n }\n // void segments: leave as baseColor\n }\n\n const tex = gl.createTexture()!;\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, canvas);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.generateMipmap(gl.TEXTURE_2D);\n\n const ext = gl.getExtension('EXT_texture_filter_anisotropic') ||\n gl.getExtension('MOZ_EXT_texture_filter_anisotropic') ||\n gl.getExtension('WEBKIT_EXT_texture_filter_anisotropic');\n if (ext) {\n const max = gl.getParameter(ext.MAX_TEXTURE_MAX_ANISOTROPY_EXT);\n gl.texParameterf(gl.TEXTURE_2D, ext.TEXTURE_MAX_ANISOTROPY_EXT, Math.min(16, max));\n }\n\n return tex;\n }\n\n\n}\n\n\nconst setLinkStyles = (link: HTMLAnchorElement) => {\n link.id = LINK_ID;\n link.href = \"https://neat.firecms.co\";\n link.target = \"_blank\";\n link.style.position = \"absolute\";\n link.style.display = \"block\";\n link.style.bottom = \"0\";\n link.style.right = \"0\";\n link.style.padding = \"10px\";\n link.style.color = \"#dcdcdc\";\n link.style.opacity = \"0.8\";\n link.style.fontFamily = \"sans-serif\";\n link.style.fontSize = \"16px\";\n link.style.fontWeight = \"bold\";\n link.style.textDecoration = \"none\";\n link.style.zIndex = \"10000\";\n link.style.pointerEvents = \"auto\";\n link.setAttribute(\"data-n\", \"1\");\n link.innerHTML = \"NEAT\";\n}\n\nconst addNeatLink = (ref: HTMLCanvasElement): HTMLAnchorElement => {\n const parent = ref.parentElement;\n // Ensure parent has position so absolute link is positioned relative to it\n if (parent && getComputedStyle(parent).position === \"static\") {\n parent.style.position = \"relative\";\n }\n // Search parent for existing neat link (survives HMR where LINK_ID changes)\n if (parent) {\n const existing = parent.querySelector('a[data-n]') as HTMLAnchorElement;\n if (existing) {\n setLinkStyles(existing);\n return existing;\n }\n }\n const link = document.createElement(\"a\");\n setLinkStyles(link);\n parent?.appendChild(link);\n return link;\n}\n\nfunction getElapsedSecondsInLastHour() {\n const now = new Date();\n const minutes = now.getMinutes();\n const seconds = now.getSeconds();\n return (minutes * 60) + seconds;\n}\n\nfunction generateRandomString(length: number = 6): string {\n const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let result = '';\n for (let i = 0; i < length; i++) {\n const randomIndex = Math.floor(Math.random() * characters.length);\n result += characters.charAt(randomIndex);\n }\n return result;\n}\n\nfunction downloadURI(uri: string, name: string) {\n const link = document.createElement(\"a\");\n link.download = name;\n link.href = uri;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n}\n\nfunction injectSEO() {\n if (document.getElementById(\"neat-seo-schema\")) return;\n\n // 1. JSON-LD Schema\n const script = document.createElement('script');\n script.id = \"neat-seo-schema\";\n script.type = 'application/ld+json';\n script.text = JSON.stringify({\n \"@context\": \"https://schema.org\",\n \"@type\": \"WebSite\",\n \"name\": \"NEAT Gradient\",\n \"url\": \"https://neat.firecms.co\",\n \"author\": {\n \"@type\": \"Organization\",\n \"name\": \"FireCMS\",\n \"url\": \"https://firecms.co\"\n },\n \"description\": \"Beautiful, fast, heavily customizable, WebGL based gradients.\"\n });\n document.head.appendChild(script);\n\n // 2. Hidden Backlink via Shadow DOM\n const hiddenContainer = document.createElement('div');\n hiddenContainer.style.position = 'absolute';\n hiddenContainer.style.width = '1px';\n hiddenContainer.style.height = '1px';\n hiddenContainer.style.padding = '0';\n hiddenContainer.style.margin = '-1px';\n hiddenContainer.style.overflow = 'hidden';\n hiddenContainer.style.clip = 'rect(0, 0, 0, 0)';\n hiddenContainer.style.whiteSpace = 'nowrap';\n hiddenContainer.style.borderWidth = '0';\n\n try {\n const shadow = hiddenContainer.attachShadow({ mode: 'closed' });\n const link = document.createElement('a');\n link.href = \"https://firecms.co\";\n link.textContent = \"FireCMS\";\n shadow.appendChild(link);\n } catch (e) {\n const link = document.createElement('a');\n link.href = \"https://firecms.co\";\n link.textContent = \"FireCMS\";\n hiddenContainer.appendChild(link);\n }\n\n document.body.appendChild(hiddenContainer);\n}\n"],"names":["vertexShaderSource","fragmentShaderSource","buildVertUniforms","buildFragUniforms","buildNoise","buildColorFunctions","Matrix4","tx","ty","tz","angle","c","s","m12","m22","m32","m42","m13","m23","m33","m43","OrthographicCamera","left","right","top","bottom","near","far","w","h","p","x","y","z","updateCamera","camera","width","height","planeWidth","planeHeight","targetPlaneArea","ratio","targetWidth","targetHeight","horizontalScale","mobileZoomFactor","generatePlaneGeometry","widthSegments","heightSegments","width_half","height_half","gridX","gridY","gridX1","gridY1","segment_width","segment_height","indices","vertices","normals","uvs","iy","ix","a","b","d","isLarge","wireframeIndices","i","PLANE_WIDTH","PLANE_HEIGHT","COLORS_COUNT","LINK_ID","generateRandomString","NeatGradient","config","ref","speed","horizontalPressure","verticalPressure","waveFrequencyX","waveFrequencyY","waveAmplitude","colors","highlights","shadows","colorSaturation","colorBrightness","colorBlending","grainScale","grainIntensity","grainSparsity","grainSpeed","wireframe","backgroundColor","backgroundAlpha","resolution","seed","yOffset","yOffsetWaveMultiplier","yOffsetColorMultiplier","yOffsetFlowMultiplier","flowDistortionA","flowDistortionB","flowScale","flowEase","flowEnabled","enableProceduralTexture","textureVoidLikelihood","textureVoidWidthMin","textureVoidWidthMax","textureBandDensity","textureColorBlending","textureSeed","textureEase","proceduralBackgroundColor","textureShapeTriangles","textureShapeCircles","textureShapeBars","textureShapeSquiggles","injectSEO","tick","getElapsedSecondsInLastHour","lastTime","render","gl","program","locations","indexCount","indexType","addNeatLink","timeNow","rgb","setSize","projLoc","filename","dataURL","downloadURI","value","hex","bigint","position","normal","uv","index","wireframeIndex","positionBuffer","normalBuffer","uvBuffer","indexBuffer","wireframeIndexBuffer","vertShaderSourceCombined","vertShader","line","fragShaderSourceCombined","fragShader","aPosition","aNormal","aUv","modelViewMatrix","mvLoc","planeWidthLoc","planeHeightLoc","colorsCountLoc","uniformsList","name","sourceCanvas","sCtx","baseSeed","random","setSeed","offset","hexToRgb","rgbToHex","r","g","getInterColor","c1","c2","mix","rgb1","rgb2","baseColor","bgGrad","j","canvas","ctx","layoutHead","segments","seg","startX","endX","currentX","stripeWidth","sourceX","tex","ext","max","setLinkStyles","link","parent","existing","now","minutes","seconds","length","characters","result","randomIndex","uri","script","hiddenContainer","shadow"],"mappings":"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"}
|
package/dist/math.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export declare class Matrix4 {
|
|
2
|
+
elements: Float32Array;
|
|
3
|
+
constructor();
|
|
4
|
+
translate(tx: number, ty: number, tz: number): this;
|
|
5
|
+
rotateX(angle: number): this;
|
|
6
|
+
}
|
|
7
|
+
export declare class OrthographicCamera {
|
|
8
|
+
left: number;
|
|
9
|
+
right: number;
|
|
10
|
+
top: number;
|
|
11
|
+
bottom: number;
|
|
12
|
+
near: number;
|
|
13
|
+
far: number;
|
|
14
|
+
position: [number, number, number];
|
|
15
|
+
projectionMatrix: Matrix4;
|
|
16
|
+
constructor(left: number, right: number, top: number, bottom: number, near: number, far: number);
|
|
17
|
+
updateProjectionMatrix(): void;
|
|
18
|
+
}
|
|
19
|
+
export declare function updateCamera(camera: OrthographicCamera, width: number, height: number, planeWidth?: number, planeHeight?: number): void;
|
|
20
|
+
export declare function generatePlaneGeometry(width: number, height: number, widthSegments: number, heightSegments: number): {
|
|
21
|
+
position: Float32Array;
|
|
22
|
+
normal: Float32Array;
|
|
23
|
+
uv: Float32Array;
|
|
24
|
+
index: Uint32Array | Uint16Array;
|
|
25
|
+
wireframeIndex: Uint32Array | Uint16Array;
|
|
26
|
+
};
|