@firecms/neat 0.2.2 → 0.3.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/dist/NeatGradient.d.ts +9 -0
- package/dist/NeatGradient.js +77 -12
- package/dist/NeatGradient.js.map +1 -1
- package/dist/index.es.js +137 -79
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +47 -10
- package/dist/index.umd.js.map +1 -1
- package/package.json +3 -3
- package/src/NeatGradient.ts +86 -11
package/dist/index.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../src/NeatGradient.ts"],"sourcesContent":["import * as THREE from \"three\";\n\nconst PLANE_WIDTH = 50;\nconst PLANE_HEIGHT = 80;\n\nconst WIREFRAME = true;\nconst COLORS_COUNT = 5;\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\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 wireframe?: boolean;\n backgroundColor?: string;\n backgroundAlpha?: 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 _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 private requestRef: number = -1;\n private sizeObserver: ResizeObserver;\n private sceneState: SceneState;\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 wireframe = false,\n backgroundColor = \"#FFFFFF\",\n backgroundAlpha = 1.0,\n resolution = 1,\n seed\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.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\n this.sceneState = this._initScene(resolution);\n\n let tick = seed !== undefined ? seed : getElapsedSecondsInLastHour();\n const render = () => {\n\n const { renderer, camera, scene, meshes } = this.sceneState;\n if (Math.floor(tick * 10) % 5 === 0) {\n addNeatLink(ref);\n }\n\n renderer.setClearColor(this._backgroundColor, this._backgroundAlpha);\n meshes.forEach((mesh) => {\n\n const width = this._ref.width,\n height = this._ref.height;\n\n const colors = [\n ...this._colors.map(color => ({\n is_active: color.enabled,\n color: new THREE.Color(color.color),\n influence: color.influence\n })),\n ...Array.from({ length: COLORS_COUNT - this._colors.length }).map(() => ({\n is_active: false,\n color: new THREE.Color(0x000000)\n }))\n ];\n\n tick += clock.getDelta() * this._speed;\n // @ts-ignore\n mesh.material.uniforms.u_time.value = tick;\n // @ts-ignore\n mesh.material.uniforms.u_resolution = { value: new THREE.Vector2(width, height) };\n // @ts-ignore\n mesh.material.uniforms.u_color_pressure = { value: new THREE.Vector2(this._horizontalPressure, this._verticalPressure) };\n // @ts-ignore\n mesh.material.uniforms.u_wave_frequency_x = { value: this._waveFrequencyX };\n // @ts-ignore\n mesh.material.uniforms.u_wave_frequency_y = { value: this._waveFrequencyY };\n // @ts-ignore\n mesh.material.uniforms.u_wave_amplitude = { value: this._waveAmplitude };\n // @ts-ignore\n mesh.material.uniforms.u_plane_width = { value: PLANE_WIDTH };\n // @ts-ignore\n mesh.material.uniforms.u_plane_height = { value: PLANE_HEIGHT };\n // @ts-ignore\n mesh.material.uniforms.u_color_blending = { value: this._colorBlending };\n // @ts-ignore\n mesh.material.uniforms.u_colors = { value: colors };\n // @ts-ignore\n mesh.material.uniforms.u_colors_count = { value: COLORS_COUNT };\n // @ts-ignore\n mesh.material.uniforms.u_shadows = { value: this._shadows };\n // @ts-ignore\n mesh.material.uniforms.u_highlights = { value: this._highlights };\n // @ts-ignore\n mesh.material.uniforms.u_saturation = { value: this._saturation };\n // @ts-ignore\n mesh.material.uniforms.u_brightness = { value: this._brightness };\n // @ts-ignore\n mesh.material.wireframe = this._wireframe;\n });\n\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\n this.sizeObserver = new ResizeObserver(entries => {\n setSize();\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 }\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 }\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 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 _initScene(resolution: number): SceneState {\n\n const width = this._ref.width,\n height = this._ref.height;\n\n const renderer = new THREE.WebGLRenderer({\n // antialias: true,\n alpha: 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 const colors = [\n ...this._colors.map(color => ({\n is_active: color.enabled,\n color: new THREE.Color(color.color),\n influence: color.influence\n })),\n ...Array.from({ length: COLORS_COUNT - this._colors.length }).map(() => ({\n is_active: false,\n color: new THREE.Color(0x000000)\n }))\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 };\n\n const material = new THREE.ShaderMaterial({\n uniforms: uniforms,\n vertexShader: buildUniforms() + buildNoise() + buildColorFunctions() + buildVertexShader(),\n fragmentShader: buildUniforms() + buildColorFunctions() + buildFragmentShader()\n });\n\n material.wireframe = WIREFRAME;\n return material;\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 const left = -PLANE_WIDTH / 2;\n const right = Math.min((left + targetWidth) / 1.5, PLANE_WIDTH / 2);\n\n const top = PLANE_HEIGHT / 4;\n const bottom = Math.max((top - targetHeight) / 2, -PLANE_HEIGHT / 4);\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\nfunction buildVertexShader() {\n return `\n\nvoid main() {\n\n vUv = uv;\n\n v_displacement_amount = cnoise( vec3(\n u_wave_frequency_x * position.x + u_time,\n u_wave_frequency_y * position.y + u_time,\n u_time\n ));\n \n vec3 color;\n\n // float t = mod(u_base_color, 100.0);\n color = u_colors[0].color;\n \n vec2 noise_cord = vUv * u_color_pressure;\n \n const float minNoise = .0;\n const float maxNoise = .9;\n \n for (int i = 1; i < u_colors_count; i++) {\n \n if(u_colors[i].is_active == 1.0){\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 );\n \n noise = clamp(minNoise, maxNoise + float(i) * 0.02, noise);\n vec3 nextColor = u_colors[i].color;\n \n // vec3 colorOklab = oklab2rgb(color);\n // vec3 nextColorOklab = oklab2rgb(nextColor);\n // vec3 mixColor = mix(colorOklab, nextColorOklab, smoothstep(0.0, u_color_blending, noise));\n //\n // color = rgb2oklab(mixColor);\n \n color = mix(color, nextColor, smoothstep(0.0, u_color_blending, noise));\n }\n \n }\n \n v_color = color;\n \n vec3 newPosition = position + normal * v_displacement_amount * u_wave_amplitude;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( newPosition, 1.0 );\n \n v_new_position = gl_Position;\n}\n`;\n}\n\nfunction buildFragmentShader() {\n return `\n\nvoid main(){\n vec3 color = v_color;\n \n color.rgb += pow(v_displacement_amount, 1.0) * u_highlights;\n color.rgb -= 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 gl_FragColor = vec4(color,1.0);\n}\n`;\n}\n\nconst buildUniforms = () => `\nprecision highp float;\n\nstruct Color {\n float is_active;\n vec3 color;\n float value;\n};\n\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[5];\nuniform vec2 u_resolution;\n\nvarying vec2 vUv;\nvarying vec4 v_new_position;\nvarying vec3 v_color;\nvarying float v_displacement_amount;\n\n `;\n\nconst buildNoise = () => `\n\nvec3 mod289(vec3 x)\n{\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\n\nvec4 mod289(vec4 x)\n{\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\n\nvec4 permute(vec4 x)\n{\n return mod289(((x*34.0)+1.0)*x);\n}\n\nvec4 taylorInvSqrt(vec4 r)\n{\n return 1.79284291400159 - 0.85373472095314 * r;\n}\n\nvec3 fade(vec3 t) {\n return t*t*t*(t*(t*6.0-15.0)+10.0);\n}\n\nfloat snoise(vec3 v)\n{\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 // x0 = x0 - 0.0 + 0.0 * C.xxx;\n // x1 = x0 - i1 + 1.0 * C.xxx;\n // x2 = x0 - i2 + 2.0 * C.xxx;\n // x3 = x0 - 1.0 + 3.0 * C.xxx;\n vec3 x1 = x0 - i1 + C.xxx;\n vec3 x2 = x0 - i2 + C.yyy; // 2.0*C.x = 1/3 = C.y\n vec3 x3 = x0 - D.yyy; // -1.0+3.0*C.x = -0.5 = -D.y\n\n// Permutations\n i = mod289(i);\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: 7x7 points over a square, mapped onto an octahedron.\n// The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294)\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); // mod(p,7*7)\n\n vec4 x_ = floor(j * ns.z);\n vec4 y_ = floor(j - 7.0 * x_ ); // mod(j,N)\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 = vec4(lessThan(b0,0.0))*2.0 - 1.0;\n //vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0;\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); // Integer part for indexing\n vec3 Pi1 = Pi0 + vec3(1.0); // Integer part + 1\n Pi0 = mod289(Pi0);\n Pi1 = mod289(Pi1);\n vec3 Pf0 = fract(P); // Fractional part for interpolation\n vec3 Pf1 = Pf0 - vec3(1.0); // Fractional part - 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// YUV to RGB matrix\nmat3 yuv2rgb = mat3(1.0, 0.0, 1.13983,\n 1.0, -0.39465, -0.58060,\n 1.0, 2.03211, 0.0);\n\n// RGB to YUV matrix\nmat3 rgb2yuv = mat3(0.2126, 0.7152, 0.0722,\n -0.09991, -0.33609, 0.43600,\n 0.615, -0.5586, -0.05639);\n \nvec3 oklab2rgb(vec3 linear)\n{\n const mat3 im1 = mat3(0.4121656120, 0.2118591070, 0.0883097947,\n 0.5362752080, 0.6807189584, 0.2818474174,\n 0.0514575653, 0.1074065790, 0.6302613616);\n \n const mat3 im2 = mat3(+0.2104542553, +1.9779984951, +0.0259040371,\n +0.7936177850, -2.4285922050, +0.7827717662,\n -0.0040720468, +0.4505937099, -0.8086757660);\n \n vec3 lms = im1 * linear;\n \n return im2 * (sign(lms) * pow(abs(lms), vec3(1.0/3.0)));\n}\n\nvec3 rgb2oklab(vec3 oklab)\n{\n const mat3 m1 = mat3(+1.000000000, +1.000000000, +1.000000000,\n +0.396337777, -0.105561346, -0.089484178,\n +0.215803757, -0.063854173, -1.291485548);\n \n const mat3 m2 = mat3(+4.076724529, -1.268143773, -0.004111989,\n -3.307216883, +2.609332323, -0.703476310,\n +0.230759054, -0.341134429, +1.706862569);\n vec3 lms = m1 * oklab;\n \n return m2 * (lms * lms * lms);\n}\n\n `;\n\nconst buildColorFunctions = () => `\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\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) => {\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;\n }\n }\n }\n const link = document.createElement(\"a\");\n setLinkStyles(link);\n ref.parentElement?.appendChild(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"],"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","wireframe","backgroundColor","backgroundAlpha","resolution","seed","tick","getElapsedSecondsInLastHour","render","renderer","camera","scene","meshes","addNeatLink","mesh","width","height","color","setSize","canvas","updateCamera","entries","material","geo","plane","uniforms","buildUniforms","buildNoise","buildColorFunctions","buildVertexShader","buildFragmentShader","targetPlaneArea","ratio","targetWidth","targetHeight","left","right","top","bottom","near","far","setLinkStyles","link","existingLinks","now","minutes","seconds","length","characters","result","randomIndex"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAoNnBC,IAAsB,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA8C5Ba,IAAgB,CAACC,MAA4B;AAC/C,EAAAA,EAAK,KAAK1D,GACV0D,EAAK,OAAO,2BACZA,EAAK,SAAS,UACdA,EAAK,MAAM,WAAW,YACtBA,EAAK,MAAM,UAAU,SACrBA,EAAK,MAAM,SAAS,KACpBA,EAAK,MAAM,QAAQ,KACnBA,EAAK,MAAM,UAAU,QACrBA,EAAK,MAAM,QAAQ,WACnBA,EAAK,MAAM,UAAU,OACrBA,EAAK,MAAM,aAAa,cACxBA,EAAK,MAAM,WAAW,QACtBA,EAAK,MAAM,aAAa,QACxBA,EAAK,MAAM,iBAAiB,QAC5BA,EAAK,MAAM,SAAS,SACpBA,EAAK,YAAY;AACrB,GAEM7B,IAAc,CAACzB,MAA2B;AAC5C,QAAMuD,IAAgBvD,EAAI,eAAe,qBAAqB,GAAG;AACjE,MAAIuD;AACA,aAAS,IAAI,GAAG,IAAIA,EAAc,QAAQ;AAClC,UAAAA,EAAc,GAAG,OAAO3D,GAAS;AACjC,QAAAyD,EAAcE,EAAc,EAAE;AAC9B;AAAA,MACJ;AAAA;AAGF,QAAAD,IAAO,SAAS,cAAc,GAAG;AACvC,EAAAD,EAAcC,CAAI,GACdtD,EAAA,eAAe,YAAYsD,CAAI;AACvC;AAEA,SAASnC,IAA8B;AAC7B,QAAAqC,IAAM,IAAI,QACVC,IAAUD,EAAI,cACdE,IAAUF,EAAI;AACpB,SAAQC,IAAU,KAAMC;AAC5B;AAEA,SAAS7D,EAAqB8D,IAAiB,GAAW;AACtD,QAAMC,IAAa;AACnB,MAAIC,IAAS;AACb,WAAS,IAAI,GAAG,IAAIF,GAAQ,KAAK;AAC7B,UAAMG,IAAc,KAAK,MAAM,KAAK,WAAWF,EAAW,MAAM;AACtD,IAAAC,KAAAD,EAAW,OAAOE,CAAW;AAAA,EAC3C;AACO,SAAAD;AACX;"}
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../src/NeatGradient.ts"],"sourcesContent":["import * as THREE from \"three\";\n\nconst PLANE_WIDTH = 50;\nconst PLANE_HEIGHT = 80;\n\nconst WIREFRAME = true;\nconst COLORS_COUNT = 5;\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\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 grainSpeed?: number;\n wireframe?: boolean;\n backgroundColor?: string;\n backgroundAlpha?: 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 _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 private requestRef: number = -1;\n private sizeObserver: ResizeObserver;\n private sceneState: SceneState;\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 grainSpeed = 0.1,\n wireframe = false,\n backgroundColor = \"#FFFFFF\",\n backgroundAlpha = 1.0,\n resolution = 1,\n seed\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.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\n this.sceneState = this._initScene(resolution);\n\n let tick = seed !== undefined ? seed : getElapsedSecondsInLastHour();\n const render = () => {\n\n const { renderer, camera, scene, meshes } = this.sceneState;\n if (Math.floor(tick * 10) % 5 === 0) {\n addNeatLink(ref);\n }\n\n renderer.setClearColor(this._backgroundColor, this._backgroundAlpha);\n meshes.forEach((mesh) => {\n\n const width = this._ref.width,\n height = this._ref.height;\n\n const colors = [\n ...this._colors.map(color => {\n let threeColor = new THREE.Color();\n threeColor.setStyle(color.color, \"\");\n return ({\n is_active: color.enabled,\n color: threeColor,\n influence: color.influence\n });\n }),\n ...Array.from({ length: COLORS_COUNT - this._colors.length }).map(() => ({\n is_active: false,\n color: new THREE.Color(0x000000)\n }))\n ];\n\n tick += clock.getDelta() * this._speed;\n // @ts-ignore\n mesh.material.uniforms.u_time.value = tick;\n // @ts-ignore\n mesh.material.uniforms.u_resolution = { value: new THREE.Vector2(width, height) };\n // @ts-ignore\n mesh.material.uniforms.u_color_pressure = { value: new THREE.Vector2(this._horizontalPressure, this._verticalPressure) };\n // @ts-ignore\n mesh.material.uniforms.u_wave_frequency_x = { value: this._waveFrequencyX };\n // @ts-ignore\n mesh.material.uniforms.u_wave_frequency_y = { value: this._waveFrequencyY };\n // @ts-ignore\n mesh.material.uniforms.u_wave_amplitude = { value: this._waveAmplitude };\n // @ts-ignore\n mesh.material.uniforms.u_plane_width = { value: PLANE_WIDTH };\n // @ts-ignore\n mesh.material.uniforms.u_plane_height = { value: PLANE_HEIGHT };\n // @ts-ignore\n mesh.material.uniforms.u_color_blending = { value: this._colorBlending };\n // @ts-ignore\n mesh.material.uniforms.u_colors = { value: colors };\n // @ts-ignore\n mesh.material.uniforms.u_colors_count = { value: COLORS_COUNT };\n // @ts-ignore\n mesh.material.uniforms.u_shadows = { value: this._shadows };\n // @ts-ignore\n mesh.material.uniforms.u_highlights = { value: this._highlights };\n // @ts-ignore\n mesh.material.uniforms.u_saturation = { value: this._saturation };\n // @ts-ignore\n mesh.material.uniforms.u_brightness = { value: this._brightness };\n // @ts-ignore\n mesh.material.uniforms.u_grain_intensity = { value: this._grainIntensity };\n // @ts-ignore\n mesh.material.uniforms.u_grain_speed = { value: this._grainSpeed };\n // @ts-ignore\n mesh.material.uniforms.u_grain_scale = { value: this._grainScale };\n // @ts-ignore\n mesh.material.wireframe = this._wireframe;\n });\n\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\n this.sizeObserver = new ResizeObserver(entries => {\n setSize();\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 }\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 }\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 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 _initScene(resolution: number): SceneState {\n\n const width = this._ref.width,\n height = this._ref.height;\n\n const renderer = new THREE.WebGLRenderer({\n // antialias: true,\n alpha: 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 const colors = [\n ...this._colors.map(color => ({\n is_active: color.enabled,\n color: new THREE.Color(color.color),\n influence: color.influence\n })),\n ...Array.from({ length: COLORS_COUNT - this._colors.length }).map(() => ({\n is_active: false,\n color: new THREE.Color(0x000000)\n }))\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_scale: { value: this._grainScale },\n u_grain_speed: { value: this._grainSpeed },\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 material.wireframe = WIREFRAME;\n return material;\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 const left = -PLANE_WIDTH / 2;\n const right = Math.min((left + targetWidth) / 1.5, PLANE_WIDTH / 2);\n\n const top = PLANE_HEIGHT / 4;\n const bottom = Math.max((top - targetHeight) / 2, -PLANE_HEIGHT / 4);\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\nfunction buildVertexShader() {\n return `\n\nvoid main() {\n\n vUv = uv;\n\n v_displacement_amount = cnoise( vec3(\n u_wave_frequency_x * position.x + u_time,\n u_wave_frequency_y * position.y + u_time,\n u_time\n ));\n \n vec3 color;\n\n // float t = mod(u_base_color, 100.0);\n color = u_colors[0].color;\n \n vec2 noise_cord = vUv * u_color_pressure;\n \n const float minNoise = .0;\n const float maxNoise = .9;\n \n for (int i = 1; i < u_colors_count; i++) {\n \n if(u_colors[i].is_active == 1.0){\n float noiseFlow = (1. + float(i)) / 30.;\n float noiseSpeed = (1. + float(i)) * 0.11;\n float noiseSeed = 13. + float(i) * 7.;\n \n int reverseIndex = u_colors_count - i;\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 vec3 nextColor = u_colors[i].color;\n color = mix(color, nextColor, smoothstep(0.0, u_color_blending, noise));\n \n // vec3 colorOklab = oklab2rgb(color);\n // vec3 nextColorOklab = oklab2rgb(nextColor);\n // vec3 mixColor = mix(colorOklab, nextColorOklab, smoothstep(0.0, u_color_blending, noise));\n // color = rgb2oklab(mixColor);\n \n }\n \n }\n \n v_color = color;\n \n vec3 newPosition = position + normal * v_displacement_amount * u_wave_amplitude;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( newPosition, 1.0 );\n \n v_new_position = gl_Position;\n}\n`;\n}\n\nfunction buildFragmentShader() {\n return `\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\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 vec3 color = v_color;\n \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 // Generate grain using fbm\n vec2 noiseCoords = gl_FragCoord.xy / u_grain_scale;\n\n float grain = (u_grain_speed != 0.0) \n ? fbm(vec3(noiseCoords, u_time * u_grain_speed)) \n : fbm(vec3(noiseCoords, 0.0));\n\n // Center the grain around zero\n grain = grain * 0.5 + 0.5;\n grain -= 0.5;\n\n // Apply grain intensity\n grain *= u_grain_intensity;\n\n // Add grain to color\n color += vec3(grain);\n \n gl_FragColor = vec4(color,1.0);\n}\n`;\n}\n\nconst buildUniforms = () => `\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_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[5];\nuniform vec2 u_resolution;\n\nvarying vec2 vUv;\nvarying vec4 v_new_position;\nvarying vec3 v_color;\nvarying float v_displacement_amount;\n\n `;\n\nconst buildNoise = () => `\n\nvec3 mod289(vec3 x)\n{\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\n\nvec4 mod289(vec4 x)\n{\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\n\nvec4 permute(vec4 x)\n{\n return mod289(((x*34.0)+1.0)*x);\n}\n\nvec4 taylorInvSqrt(vec4 r)\n{\n return 1.79284291400159 - 0.85373472095314 * r;\n}\n\nvec3 fade(vec3 t) {\n return t*t*t*(t*(t*6.0-15.0)+10.0);\n}\n\nfloat snoise(vec3 v)\n{\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 // x0 = x0 - 0.0 + 0.0 * C.xxx;\n // x1 = x0 - i1 + 1.0 * C.xxx;\n // x2 = x0 - i2 + 2.0 * C.xxx;\n // x3 = x0 - 1.0 + 3.0 * C.xxx;\n vec3 x1 = x0 - i1 + C.xxx;\n vec3 x2 = x0 - i2 + C.yyy; // 2.0*C.x = 1/3 = C.y\n vec3 x3 = x0 - D.yyy; // -1.0+3.0*C.x = -0.5 = -D.y\n\n// Permutations\n i = mod289(i);\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: 7x7 points over a square, mapped onto an octahedron.\n// The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294)\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); // mod(p,7*7)\n\n vec4 x_ = floor(j * ns.z);\n vec4 y_ = floor(j - 7.0 * x_ ); // mod(j,N)\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 = vec4(lessThan(b0,0.0))*2.0 - 1.0;\n //vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0;\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); // Integer part for indexing\n vec3 Pi1 = Pi0 + vec3(1.0); // Integer part + 1\n Pi0 = mod289(Pi0);\n Pi1 = mod289(Pi1);\n vec3 Pf0 = fract(P); // Fractional part for interpolation\n vec3 Pf1 = Pf0 - vec3(1.0); // Fractional part - 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// YUV to RGB matrix\nmat3 yuv2rgb = mat3(1.0, 0.0, 1.13983,\n 1.0, -0.39465, -0.58060,\n 1.0, 2.03211, 0.0);\n\n// RGB to YUV matrix\nmat3 rgb2yuv = mat3(0.2126, 0.7152, 0.0722,\n -0.09991, -0.33609, 0.43600,\n 0.615, -0.5586, -0.05639);\n \nvec3 oklab2rgb(vec3 linear)\n{\n const mat3 im1 = mat3(0.4121656120, 0.2118591070, 0.0883097947,\n 0.5362752080, 0.6807189584, 0.2818474174,\n 0.0514575653, 0.1074065790, 0.6302613616);\n \n const mat3 im2 = mat3(+0.2104542553, +1.9779984951, +0.0259040371,\n +0.7936177850, -2.4285922050, +0.7827717662,\n -0.0040720468, +0.4505937099, -0.8086757660);\n \n vec3 lms = im1 * linear;\n \n return im2 * (sign(lms) * pow(abs(lms), vec3(1.0/3.0)));\n}\n\nvec3 rgb2oklab(vec3 oklab)\n{\n const mat3 m1 = mat3(+1.000000000, +1.000000000, +1.000000000,\n +0.396337777, -0.105561346, -0.089484178,\n +0.215803757, -0.063854173, -1.291485548);\n \n const mat3 m2 = mat3(+4.076724529, -1.268143773, -0.004111989,\n -3.307216883, +2.609332323, -0.703476310,\n +0.230759054, -0.341134429, +1.706862569);\n vec3 lms = m1 * oklab;\n \n return m2 * (lms * lms * lms);\n}\n\n `;\n\nconst buildColorFunctions = () => `\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\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) => {\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;\n }\n }\n }\n const link = document.createElement(\"a\");\n setLinkStyles(link);\n ref.parentElement?.appendChild(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"],"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","grainSpeed","wireframe","backgroundColor","backgroundAlpha","resolution","seed","tick","getElapsedSecondsInLastHour","render","renderer","camera","scene","meshes","addNeatLink","mesh","width","height","color","threeColor","setSize","canvas","updateCamera","entries","material","geo","plane","uniforms","buildUniforms","buildNoise","buildColorFunctions","buildVertexShader","buildFragmentShader","targetPlaneArea","ratio","targetWidth","targetHeight","left","right","top","bottom","near","far","setLinkStyles","link","existingLinks","i","now","minutes","seconds","length","characters","result","randomIndex"],"mappings":"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"}
|
package/dist/index.umd.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
(function(u,
|
|
1
|
+
(function(u,d){typeof exports=="object"&&typeof module<"u"?d(exports,require("three")):typeof define=="function"&&define.amd?define(["exports","three"],d):(u=typeof globalThis<"u"?globalThis:u||self,d(u.FireCMS={},u.THREE))})(this,function(u,d){"use strict";function R(t){if(t&&t.__esModule)return t;const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const o in t)if(o!=="default"){const r=Object.getOwnPropertyDescriptor(t,o);Object.defineProperty(e,o,r.get?r:{enumerable:!0,get:()=>t[o]})}}return e.default=t,Object.freeze(e)}const n=R(d),g=50,_=80,T=!0,b=5,B=new n.Clock,F=H();class K{_ref;_speed=-1;_horizontalPressure=-1;_verticalPressure=-1;_waveFrequencyX=-1;_waveFrequencyY=-1;_waveAmplitude=-1;_shadows=-1;_highlights=-1;_saturation=-1;_brightness=-1;_grainScale=-1;_grainIntensity=-1;_grainSpeed=-1;_colorBlending=-1;_colors=[];_wireframe=!1;_backgroundColor="#FFFFFF";_backgroundAlpha=1;requestRef=-1;sizeObserver;sceneState;constructor(e){const{ref:o,speed:r=4,horizontalPressure:s=3,verticalPressure:a=3,waveFrequencyX:c=5,waveFrequencyY:f=5,waveAmplitude:m=3,colors:l,highlights:v=4,shadows:x=4,colorSaturation:z=0,colorBrightness:P=1,colorBlending:S=5,grainScale:Y=2,grainIntensity:W=.55,grainSpeed:U=.1,wireframe:X=!1,backgroundColor:J="#FFFFFF",backgroundAlpha:Q=1,resolution:Z=1,seed:E}=e;this._ref=o,this.destroy=this.destroy.bind(this),this._initScene=this._initScene.bind(this),this._buildMaterial=this._buildMaterial.bind(this),this.speed=r,this.horizontalPressure=s,this.verticalPressure=a,this.waveFrequencyX=c,this.waveFrequencyY=f,this.waveAmplitude=m,this.colorBlending=S,this.grainScale=Y,this.grainIntensity=W,this.grainSpeed=U,this.colors=l,this.shadows=x,this.highlights=v,this.colorSaturation=z,this.colorBrightness=P,this.wireframe=X,this.backgroundColor=J,this.backgroundAlpha=Q,this.sceneState=this._initScene(Z);let C=E!==void 0?E:G();const N=()=>{const{renderer:h,camera:y,scene:p,meshes:w}=this.sceneState;Math.floor(C*10)%5===0&&V(o),h.setClearColor(this._backgroundColor,this._backgroundAlpha),w.forEach(i=>{const ee=this._ref.width,te=this._ref.height,oe=[...this._colors.map(q=>{let j=new n.Color;return j.setStyle(q.color,""),{is_active:q.enabled,color:j,influence:q.influence}}),...Array.from({length:b-this._colors.length}).map(()=>({is_active:!1,color:new n.Color(0)}))];C+=B.getDelta()*this._speed,i.material.uniforms.u_time.value=C,i.material.uniforms.u_resolution={value:new n.Vector2(ee,te)},i.material.uniforms.u_color_pressure={value:new n.Vector2(this._horizontalPressure,this._verticalPressure)},i.material.uniforms.u_wave_frequency_x={value:this._waveFrequencyX},i.material.uniforms.u_wave_frequency_y={value:this._waveFrequencyY},i.material.uniforms.u_wave_amplitude={value:this._waveAmplitude},i.material.uniforms.u_plane_width={value:g},i.material.uniforms.u_plane_height={value:_},i.material.uniforms.u_color_blending={value:this._colorBlending},i.material.uniforms.u_colors={value:oe},i.material.uniforms.u_colors_count={value:b},i.material.uniforms.u_shadows={value:this._shadows},i.material.uniforms.u_highlights={value:this._highlights},i.material.uniforms.u_saturation={value:this._saturation},i.material.uniforms.u_brightness={value:this._brightness},i.material.uniforms.u_grain_intensity={value:this._grainIntensity},i.material.uniforms.u_grain_speed={value:this._grainSpeed},i.material.uniforms.u_grain_scale={value:this._grainScale},i.material.wireframe=this._wireframe}),h.render(p,y),this.requestRef=requestAnimationFrame(N)},$=()=>{const{renderer:h}=this.sceneState,y=h.domElement,p=y.clientWidth,w=y.clientHeight;this.sceneState.renderer.setSize(p,w,!1),A(this.sceneState.camera,p,w)};this.sizeObserver=new ResizeObserver(h=>{$()}),this.sizeObserver.observe(o),N()}destroy(){this&&(cancelAnimationFrame(this.requestRef),this.sizeObserver.disconnect())}set speed(e){this._speed=e/20}set horizontalPressure(e){this._horizontalPressure=e/4}set verticalPressure(e){this._verticalPressure=e/4}set waveFrequencyX(e){this._waveFrequencyX=e*.04}set waveFrequencyY(e){this._waveFrequencyY=e*.04}set waveAmplitude(e){this._waveAmplitude=e*.75}set colors(e){this._colors=e}set highlights(e){this._highlights=e/100}set shadows(e){this._shadows=e/100}set colorSaturation(e){this._saturation=e/10}set colorBrightness(e){this._brightness=e}set colorBlending(e){this._colorBlending=e/10}set grainScale(e){this._grainScale=e==0?1:e}set grainIntensity(e){this._grainIntensity=e}set grainSpeed(e){this._grainSpeed=e}set wireframe(e){this._wireframe=e}set resolution(e){this.sceneState=this._initScene(e)}set backgroundColor(e){this._backgroundColor=e}set backgroundAlpha(e){this._backgroundAlpha=e}_initScene(e){const o=this._ref.width,r=this._ref.height,s=new n.WebGLRenderer({alpha:!0,canvas:this._ref});s.setClearColor(16711680,.5),s.setSize(o,r,!1);const a=[],c=new n.Scene,f=this._buildMaterial(o,r),m=new n.PlaneGeometry(g,_,240*e,240*e),l=new n.Mesh(m,f);l.rotation.x=-Math.PI/3.5,l.position.z=-1,a.push(l),c.add(l);const v=new n.OrthographicCamera(0,0,0,0,0,0);return v.position.z=5,A(v,o,r),{renderer:s,camera:v,scene:c,meshes:a,resolution:e}}_buildMaterial(e,o){const r=[...this._colors.map(c=>({is_active:c.enabled,color:new n.Color(c.color),influence:c.influence})),...Array.from({length:b-this._colors.length}).map(()=>({is_active:!1,color:new n.Color(0)}))],s={u_time:{value:0},u_color_pressure:{value:new n.Vector2(this._horizontalPressure,this._verticalPressure)},u_wave_frequency_x:{value:this._waveFrequencyX},u_wave_frequency_y:{value:this._waveFrequencyY},u_wave_amplitude:{value:this._waveAmplitude},u_resolution:{value:new n.Vector2(e,o)},u_colors:{value:r},u_colors_count:{value:this._colors.length},u_plane_width:{value:g},u_plane_height:{value:_},u_shadows:{value:this._shadows},u_highlights:{value:this._highlights},u_grain_intensity:{value:this._grainIntensity},u_grain_scale:{value:this._grainScale},u_grain_speed:{value:this._grainSpeed}},a=new n.ShaderMaterial({uniforms:s,vertexShader:M()+I()+O()+D(),fragmentShader:M()+O()+I()+L()});return a.wireframe=T,a}}function A(t,e,o){const a=e*o/1e6*g*_/1.5,c=e/o,f=Math.sqrt(a*c),m=a/f,l=-g/2,v=Math.min((l+f)/1.5,g/2),x=_/4,z=Math.max((x-m)/2,-_/4),P=-100,S=1e3;t instanceof n.OrthographicCamera?(t.left=l,t.right=v,t.top=x,t.bottom=z,t.near=P,t.far=S,t.updateProjectionMatrix()):t instanceof n.PerspectiveCamera&&(t.aspect=e/o,t.updateProjectionMatrix())}function D(){return`
|
|
2
2
|
|
|
3
3
|
void main() {
|
|
4
4
|
|
|
@@ -27,24 +27,25 @@ void main() {
|
|
|
27
27
|
float noiseSpeed = (1. + float(i)) * 0.11;
|
|
28
28
|
float noiseSeed = 13. + float(i) * 7.;
|
|
29
29
|
|
|
30
|
+
int reverseIndex = u_colors_count - i;
|
|
31
|
+
|
|
30
32
|
float noise = snoise(
|
|
31
33
|
vec3(
|
|
32
34
|
noise_cord.x * u_color_pressure.x + u_time * noiseFlow * 2.,
|
|
33
35
|
noise_cord.y * u_color_pressure.y,
|
|
34
36
|
u_time * noiseSpeed
|
|
35
37
|
) + noiseSeed
|
|
36
|
-
);
|
|
38
|
+
) - (.1 * float(i)) + (.5 * u_color_blending);
|
|
37
39
|
|
|
38
40
|
noise = clamp(minNoise, maxNoise + float(i) * 0.02, noise);
|
|
39
41
|
vec3 nextColor = u_colors[i].color;
|
|
42
|
+
color = mix(color, nextColor, smoothstep(0.0, u_color_blending, noise));
|
|
40
43
|
|
|
41
44
|
// vec3 colorOklab = oklab2rgb(color);
|
|
42
45
|
// vec3 nextColorOklab = oklab2rgb(nextColor);
|
|
43
46
|
// vec3 mixColor = mix(colorOklab, nextColorOklab, smoothstep(0.0, u_color_blending, noise));
|
|
44
|
-
//
|
|
45
47
|
// color = rgb2oklab(mixColor);
|
|
46
48
|
|
|
47
|
-
color = mix(color, nextColor, smoothstep(0.0, u_color_blending, noise));
|
|
48
49
|
}
|
|
49
50
|
|
|
50
51
|
}
|
|
@@ -56,19 +57,52 @@ void main() {
|
|
|
56
57
|
|
|
57
58
|
v_new_position = gl_Position;
|
|
58
59
|
}
|
|
59
|
-
`}function
|
|
60
|
+
`}function L(){return`
|
|
61
|
+
float random(vec2 p) {
|
|
62
|
+
return fract(sin(dot(p, vec2(12.9898,78.233))) * 43758.5453);
|
|
63
|
+
}
|
|
60
64
|
|
|
65
|
+
float fbm(vec3 x) {
|
|
66
|
+
float value = 0.0;
|
|
67
|
+
float amplitude = 0.5;
|
|
68
|
+
float frequency = 1.0;
|
|
69
|
+
|
|
70
|
+
for (int i = 0; i < 4; i++) {
|
|
71
|
+
value += amplitude * snoise(x * frequency);
|
|
72
|
+
frequency *= 2.0;
|
|
73
|
+
amplitude *= 0.5;
|
|
74
|
+
}
|
|
75
|
+
return value;
|
|
76
|
+
}
|
|
77
|
+
|
|
61
78
|
void main(){
|
|
62
79
|
vec3 color = v_color;
|
|
63
80
|
|
|
64
|
-
color
|
|
65
|
-
color
|
|
81
|
+
color += pow(v_displacement_amount, 1.0) * u_highlights;
|
|
82
|
+
color -= pow(1.0 - v_displacement_amount, 2.0) * u_shadows;
|
|
66
83
|
color = saturation(color, 1.0 + u_saturation);
|
|
67
84
|
color = color * u_brightness;
|
|
68
85
|
|
|
86
|
+
// Generate grain using fbm
|
|
87
|
+
vec2 noiseCoords = gl_FragCoord.xy / u_grain_scale;
|
|
88
|
+
|
|
89
|
+
float grain = (u_grain_speed != 0.0)
|
|
90
|
+
? fbm(vec3(noiseCoords, u_time * u_grain_speed))
|
|
91
|
+
: fbm(vec3(noiseCoords, 0.0));
|
|
92
|
+
|
|
93
|
+
// Center the grain around zero
|
|
94
|
+
grain = grain * 0.5 + 0.5;
|
|
95
|
+
grain -= 0.5;
|
|
96
|
+
|
|
97
|
+
// Apply grain intensity
|
|
98
|
+
grain *= u_grain_intensity;
|
|
99
|
+
|
|
100
|
+
// Add grain to color
|
|
101
|
+
color += vec3(grain);
|
|
102
|
+
|
|
69
103
|
gl_FragColor = vec4(color,1.0);
|
|
70
104
|
}
|
|
71
|
-
`}const
|
|
105
|
+
`}const M=()=>`
|
|
72
106
|
precision highp float;
|
|
73
107
|
|
|
74
108
|
struct Color {
|
|
@@ -77,6 +111,9 @@ struct Color {
|
|
|
77
111
|
float value;
|
|
78
112
|
};
|
|
79
113
|
|
|
114
|
+
uniform float u_grain_intensity;
|
|
115
|
+
uniform float u_grain_scale;
|
|
116
|
+
uniform float u_grain_speed;
|
|
80
117
|
uniform float u_time;
|
|
81
118
|
|
|
82
119
|
uniform float u_wave_amplitude;
|
|
@@ -104,7 +141,7 @@ varying vec4 v_new_position;
|
|
|
104
141
|
varying vec3 v_color;
|
|
105
142
|
varying float v_displacement_amount;
|
|
106
143
|
|
|
107
|
-
`,
|
|
144
|
+
`,I=()=>`
|
|
108
145
|
|
|
109
146
|
vec3 mod289(vec3 x)
|
|
110
147
|
{
|
|
@@ -357,5 +394,5 @@ vec3 hsv2rgb(vec3 c)
|
|
|
357
394
|
vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
|
|
358
395
|
return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
|
|
359
396
|
}
|
|
360
|
-
`,k=t=>{t.id=F,t.href="https://neat.firecms.co",t.target="_blank",t.style.position="absolute",t.style.display="block",t.style.bottom="0",t.style.right="0",t.style.padding="10px",t.style.color="#dcdcdc",t.style.opacity="0.8",t.style.fontFamily="sans-serif",t.style.fontSize="16px",t.style.fontWeight="bold",t.style.textDecoration="none",t.style.zIndex="10000",t.innerHTML="NEAT"},
|
|
397
|
+
`,k=t=>{t.id=F,t.href="https://neat.firecms.co",t.target="_blank",t.style.position="absolute",t.style.display="block",t.style.bottom="0",t.style.right="0",t.style.padding="10px",t.style.color="#dcdcdc",t.style.opacity="0.8",t.style.fontFamily="sans-serif",t.style.fontSize="16px",t.style.fontWeight="bold",t.style.textDecoration="none",t.style.zIndex="10000",t.innerHTML="NEAT"},V=t=>{const e=t.parentElement?.getElementsByTagName("a");if(e){for(let r=0;r<e.length;r++)if(e[r].id===F){k(e[r]);return}}const o=document.createElement("a");k(o),t.parentElement?.appendChild(o)};function G(){const t=new Date,e=t.getMinutes(),o=t.getSeconds();return e*60+o}function H(t=6){const e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";let o="";for(let r=0;r<t;r++){const s=Math.floor(Math.random()*e.length);o+=e.charAt(s)}return o}u.NeatGradient=K,Object.defineProperties(u,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
|
|
361
398
|
//# sourceMappingURL=index.umd.js.map
|
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\nconst PLANE_WIDTH = 50;\nconst PLANE_HEIGHT = 80;\n\nconst WIREFRAME = true;\nconst COLORS_COUNT = 5;\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\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 wireframe?: boolean;\n backgroundColor?: string;\n backgroundAlpha?: 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 _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 private requestRef: number = -1;\n private sizeObserver: ResizeObserver;\n private sceneState: SceneState;\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 wireframe = false,\n backgroundColor = \"#FFFFFF\",\n backgroundAlpha = 1.0,\n resolution = 1,\n seed\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.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\n this.sceneState = this._initScene(resolution);\n\n let tick = seed !== undefined ? seed : getElapsedSecondsInLastHour();\n const render = () => {\n\n const { renderer, camera, scene, meshes } = this.sceneState;\n if (Math.floor(tick * 10) % 5 === 0) {\n addNeatLink(ref);\n }\n\n renderer.setClearColor(this._backgroundColor, this._backgroundAlpha);\n meshes.forEach((mesh) => {\n\n const width = this._ref.width,\n height = this._ref.height;\n\n const colors = [\n ...this._colors.map(color => ({\n is_active: color.enabled,\n color: new THREE.Color(color.color),\n influence: color.influence\n })),\n ...Array.from({ length: COLORS_COUNT - this._colors.length }).map(() => ({\n is_active: false,\n color: new THREE.Color(0x000000)\n }))\n ];\n\n tick += clock.getDelta() * this._speed;\n // @ts-ignore\n mesh.material.uniforms.u_time.value = tick;\n // @ts-ignore\n mesh.material.uniforms.u_resolution = { value: new THREE.Vector2(width, height) };\n // @ts-ignore\n mesh.material.uniforms.u_color_pressure = { value: new THREE.Vector2(this._horizontalPressure, this._verticalPressure) };\n // @ts-ignore\n mesh.material.uniforms.u_wave_frequency_x = { value: this._waveFrequencyX };\n // @ts-ignore\n mesh.material.uniforms.u_wave_frequency_y = { value: this._waveFrequencyY };\n // @ts-ignore\n mesh.material.uniforms.u_wave_amplitude = { value: this._waveAmplitude };\n // @ts-ignore\n mesh.material.uniforms.u_plane_width = { value: PLANE_WIDTH };\n // @ts-ignore\n mesh.material.uniforms.u_plane_height = { value: PLANE_HEIGHT };\n // @ts-ignore\n mesh.material.uniforms.u_color_blending = { value: this._colorBlending };\n // @ts-ignore\n mesh.material.uniforms.u_colors = { value: colors };\n // @ts-ignore\n mesh.material.uniforms.u_colors_count = { value: COLORS_COUNT };\n // @ts-ignore\n mesh.material.uniforms.u_shadows = { value: this._shadows };\n // @ts-ignore\n mesh.material.uniforms.u_highlights = { value: this._highlights };\n // @ts-ignore\n mesh.material.uniforms.u_saturation = { value: this._saturation };\n // @ts-ignore\n mesh.material.uniforms.u_brightness = { value: this._brightness };\n // @ts-ignore\n mesh.material.wireframe = this._wireframe;\n });\n\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\n this.sizeObserver = new ResizeObserver(entries => {\n setSize();\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 }\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 }\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 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 _initScene(resolution: number): SceneState {\n\n const width = this._ref.width,\n height = this._ref.height;\n\n const renderer = new THREE.WebGLRenderer({\n // antialias: true,\n alpha: 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 const colors = [\n ...this._colors.map(color => ({\n is_active: color.enabled,\n color: new THREE.Color(color.color),\n influence: color.influence\n })),\n ...Array.from({ length: COLORS_COUNT - this._colors.length }).map(() => ({\n is_active: false,\n color: new THREE.Color(0x000000)\n }))\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 };\n\n const material = new THREE.ShaderMaterial({\n uniforms: uniforms,\n vertexShader: buildUniforms() + buildNoise() + buildColorFunctions() + buildVertexShader(),\n fragmentShader: buildUniforms() + buildColorFunctions() + buildFragmentShader()\n });\n\n material.wireframe = WIREFRAME;\n return material;\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 const left = -PLANE_WIDTH / 2;\n const right = Math.min((left + targetWidth) / 1.5, PLANE_WIDTH / 2);\n\n const top = PLANE_HEIGHT / 4;\n const bottom = Math.max((top - targetHeight) / 2, -PLANE_HEIGHT / 4);\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\nfunction buildVertexShader() {\n return `\n\nvoid main() {\n\n vUv = uv;\n\n v_displacement_amount = cnoise( vec3(\n u_wave_frequency_x * position.x + u_time,\n u_wave_frequency_y * position.y + u_time,\n u_time\n ));\n \n vec3 color;\n\n // float t = mod(u_base_color, 100.0);\n color = u_colors[0].color;\n \n vec2 noise_cord = vUv * u_color_pressure;\n \n const float minNoise = .0;\n const float maxNoise = .9;\n \n for (int i = 1; i < u_colors_count; i++) {\n \n if(u_colors[i].is_active == 1.0){\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 );\n \n noise = clamp(minNoise, maxNoise + float(i) * 0.02, noise);\n vec3 nextColor = u_colors[i].color;\n \n // vec3 colorOklab = oklab2rgb(color);\n // vec3 nextColorOklab = oklab2rgb(nextColor);\n // vec3 mixColor = mix(colorOklab, nextColorOklab, smoothstep(0.0, u_color_blending, noise));\n //\n // color = rgb2oklab(mixColor);\n \n color = mix(color, nextColor, smoothstep(0.0, u_color_blending, noise));\n }\n \n }\n \n v_color = color;\n \n vec3 newPosition = position + normal * v_displacement_amount * u_wave_amplitude;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( newPosition, 1.0 );\n \n v_new_position = gl_Position;\n}\n`;\n}\n\nfunction buildFragmentShader() {\n return `\n\nvoid main(){\n vec3 color = v_color;\n \n color.rgb += pow(v_displacement_amount, 1.0) * u_highlights;\n color.rgb -= 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 gl_FragColor = vec4(color,1.0);\n}\n`;\n}\n\nconst buildUniforms = () => `\nprecision highp float;\n\nstruct Color {\n float is_active;\n vec3 color;\n float value;\n};\n\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[5];\nuniform vec2 u_resolution;\n\nvarying vec2 vUv;\nvarying vec4 v_new_position;\nvarying vec3 v_color;\nvarying float v_displacement_amount;\n\n `;\n\nconst buildNoise = () => `\n\nvec3 mod289(vec3 x)\n{\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\n\nvec4 mod289(vec4 x)\n{\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\n\nvec4 permute(vec4 x)\n{\n return mod289(((x*34.0)+1.0)*x);\n}\n\nvec4 taylorInvSqrt(vec4 r)\n{\n return 1.79284291400159 - 0.85373472095314 * r;\n}\n\nvec3 fade(vec3 t) {\n return t*t*t*(t*(t*6.0-15.0)+10.0);\n}\n\nfloat snoise(vec3 v)\n{\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 // x0 = x0 - 0.0 + 0.0 * C.xxx;\n // x1 = x0 - i1 + 1.0 * C.xxx;\n // x2 = x0 - i2 + 2.0 * C.xxx;\n // x3 = x0 - 1.0 + 3.0 * C.xxx;\n vec3 x1 = x0 - i1 + C.xxx;\n vec3 x2 = x0 - i2 + C.yyy; // 2.0*C.x = 1/3 = C.y\n vec3 x3 = x0 - D.yyy; // -1.0+3.0*C.x = -0.5 = -D.y\n\n// Permutations\n i = mod289(i);\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: 7x7 points over a square, mapped onto an octahedron.\n// The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294)\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); // mod(p,7*7)\n\n vec4 x_ = floor(j * ns.z);\n vec4 y_ = floor(j - 7.0 * x_ ); // mod(j,N)\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 = vec4(lessThan(b0,0.0))*2.0 - 1.0;\n //vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0;\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); // Integer part for indexing\n vec3 Pi1 = Pi0 + vec3(1.0); // Integer part + 1\n Pi0 = mod289(Pi0);\n Pi1 = mod289(Pi1);\n vec3 Pf0 = fract(P); // Fractional part for interpolation\n vec3 Pf1 = Pf0 - vec3(1.0); // Fractional part - 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// YUV to RGB matrix\nmat3 yuv2rgb = mat3(1.0, 0.0, 1.13983,\n 1.0, -0.39465, -0.58060,\n 1.0, 2.03211, 0.0);\n\n// RGB to YUV matrix\nmat3 rgb2yuv = mat3(0.2126, 0.7152, 0.0722,\n -0.09991, -0.33609, 0.43600,\n 0.615, -0.5586, -0.05639);\n \nvec3 oklab2rgb(vec3 linear)\n{\n const mat3 im1 = mat3(0.4121656120, 0.2118591070, 0.0883097947,\n 0.5362752080, 0.6807189584, 0.2818474174,\n 0.0514575653, 0.1074065790, 0.6302613616);\n \n const mat3 im2 = mat3(+0.2104542553, +1.9779984951, +0.0259040371,\n +0.7936177850, -2.4285922050, +0.7827717662,\n -0.0040720468, +0.4505937099, -0.8086757660);\n \n vec3 lms = im1 * linear;\n \n return im2 * (sign(lms) * pow(abs(lms), vec3(1.0/3.0)));\n}\n\nvec3 rgb2oklab(vec3 oklab)\n{\n const mat3 m1 = mat3(+1.000000000, +1.000000000, +1.000000000,\n +0.396337777, -0.105561346, -0.089484178,\n +0.215803757, -0.063854173, -1.291485548);\n \n const mat3 m2 = mat3(+4.076724529, -1.268143773, -0.004111989,\n -3.307216883, +2.609332323, -0.703476310,\n +0.230759054, -0.341134429, +1.706862569);\n vec3 lms = m1 * oklab;\n \n return m2 * (lms * lms * lms);\n}\n\n `;\n\nconst buildColorFunctions = () => `\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\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) => {\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;\n }\n }\n }\n const link = document.createElement(\"a\");\n setLinkStyles(link);\n ref.parentElement?.appendChild(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"],"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","wireframe","backgroundColor","backgroundAlpha","resolution","seed","tick","getElapsedSecondsInLastHour","render","renderer","camera","scene","meshes","addNeatLink","mesh","width","height","color","setSize","canvas","updateCamera","entries","material","geo","plane","uniforms","buildUniforms","buildNoise","buildColorFunctions","buildVertexShader","buildFragmentShader","targetPlaneArea","ratio","targetWidth","targetHeight","left","right","top","bottom","near","far","setLinkStyles","link","existingLinks","i","now","minutes","seconds","length","characters","result","randomIndex"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.umd.js","sources":["../src/NeatGradient.ts"],"sourcesContent":["import * as THREE from \"three\";\n\nconst PLANE_WIDTH = 50;\nconst PLANE_HEIGHT = 80;\n\nconst WIREFRAME = true;\nconst COLORS_COUNT = 5;\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\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 grainSpeed?: number;\n wireframe?: boolean;\n backgroundColor?: string;\n backgroundAlpha?: 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 _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 private requestRef: number = -1;\n private sizeObserver: ResizeObserver;\n private sceneState: SceneState;\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 grainSpeed = 0.1,\n wireframe = false,\n backgroundColor = \"#FFFFFF\",\n backgroundAlpha = 1.0,\n resolution = 1,\n seed\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.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\n this.sceneState = this._initScene(resolution);\n\n let tick = seed !== undefined ? seed : getElapsedSecondsInLastHour();\n const render = () => {\n\n const { renderer, camera, scene, meshes } = this.sceneState;\n if (Math.floor(tick * 10) % 5 === 0) {\n addNeatLink(ref);\n }\n\n renderer.setClearColor(this._backgroundColor, this._backgroundAlpha);\n meshes.forEach((mesh) => {\n\n const width = this._ref.width,\n height = this._ref.height;\n\n const colors = [\n ...this._colors.map(color => {\n let threeColor = new THREE.Color();\n threeColor.setStyle(color.color, \"\");\n return ({\n is_active: color.enabled,\n color: threeColor,\n influence: color.influence\n });\n }),\n ...Array.from({ length: COLORS_COUNT - this._colors.length }).map(() => ({\n is_active: false,\n color: new THREE.Color(0x000000)\n }))\n ];\n\n tick += clock.getDelta() * this._speed;\n // @ts-ignore\n mesh.material.uniforms.u_time.value = tick;\n // @ts-ignore\n mesh.material.uniforms.u_resolution = { value: new THREE.Vector2(width, height) };\n // @ts-ignore\n mesh.material.uniforms.u_color_pressure = { value: new THREE.Vector2(this._horizontalPressure, this._verticalPressure) };\n // @ts-ignore\n mesh.material.uniforms.u_wave_frequency_x = { value: this._waveFrequencyX };\n // @ts-ignore\n mesh.material.uniforms.u_wave_frequency_y = { value: this._waveFrequencyY };\n // @ts-ignore\n mesh.material.uniforms.u_wave_amplitude = { value: this._waveAmplitude };\n // @ts-ignore\n mesh.material.uniforms.u_plane_width = { value: PLANE_WIDTH };\n // @ts-ignore\n mesh.material.uniforms.u_plane_height = { value: PLANE_HEIGHT };\n // @ts-ignore\n mesh.material.uniforms.u_color_blending = { value: this._colorBlending };\n // @ts-ignore\n mesh.material.uniforms.u_colors = { value: colors };\n // @ts-ignore\n mesh.material.uniforms.u_colors_count = { value: COLORS_COUNT };\n // @ts-ignore\n mesh.material.uniforms.u_shadows = { value: this._shadows };\n // @ts-ignore\n mesh.material.uniforms.u_highlights = { value: this._highlights };\n // @ts-ignore\n mesh.material.uniforms.u_saturation = { value: this._saturation };\n // @ts-ignore\n mesh.material.uniforms.u_brightness = { value: this._brightness };\n // @ts-ignore\n mesh.material.uniforms.u_grain_intensity = { value: this._grainIntensity };\n // @ts-ignore\n mesh.material.uniforms.u_grain_speed = { value: this._grainSpeed };\n // @ts-ignore\n mesh.material.uniforms.u_grain_scale = { value: this._grainScale };\n // @ts-ignore\n mesh.material.wireframe = this._wireframe;\n });\n\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\n this.sizeObserver = new ResizeObserver(entries => {\n setSize();\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 }\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 }\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 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 _initScene(resolution: number): SceneState {\n\n const width = this._ref.width,\n height = this._ref.height;\n\n const renderer = new THREE.WebGLRenderer({\n // antialias: true,\n alpha: 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 const colors = [\n ...this._colors.map(color => ({\n is_active: color.enabled,\n color: new THREE.Color(color.color),\n influence: color.influence\n })),\n ...Array.from({ length: COLORS_COUNT - this._colors.length }).map(() => ({\n is_active: false,\n color: new THREE.Color(0x000000)\n }))\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_scale: { value: this._grainScale },\n u_grain_speed: { value: this._grainSpeed },\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 material.wireframe = WIREFRAME;\n return material;\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 const left = -PLANE_WIDTH / 2;\n const right = Math.min((left + targetWidth) / 1.5, PLANE_WIDTH / 2);\n\n const top = PLANE_HEIGHT / 4;\n const bottom = Math.max((top - targetHeight) / 2, -PLANE_HEIGHT / 4);\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\nfunction buildVertexShader() {\n return `\n\nvoid main() {\n\n vUv = uv;\n\n v_displacement_amount = cnoise( vec3(\n u_wave_frequency_x * position.x + u_time,\n u_wave_frequency_y * position.y + u_time,\n u_time\n ));\n \n vec3 color;\n\n // float t = mod(u_base_color, 100.0);\n color = u_colors[0].color;\n \n vec2 noise_cord = vUv * u_color_pressure;\n \n const float minNoise = .0;\n const float maxNoise = .9;\n \n for (int i = 1; i < u_colors_count; i++) {\n \n if(u_colors[i].is_active == 1.0){\n float noiseFlow = (1. + float(i)) / 30.;\n float noiseSpeed = (1. + float(i)) * 0.11;\n float noiseSeed = 13. + float(i) * 7.;\n \n int reverseIndex = u_colors_count - i;\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 vec3 nextColor = u_colors[i].color;\n color = mix(color, nextColor, smoothstep(0.0, u_color_blending, noise));\n \n // vec3 colorOklab = oklab2rgb(color);\n // vec3 nextColorOklab = oklab2rgb(nextColor);\n // vec3 mixColor = mix(colorOklab, nextColorOklab, smoothstep(0.0, u_color_blending, noise));\n // color = rgb2oklab(mixColor);\n \n }\n \n }\n \n v_color = color;\n \n vec3 newPosition = position + normal * v_displacement_amount * u_wave_amplitude;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( newPosition, 1.0 );\n \n v_new_position = gl_Position;\n}\n`;\n}\n\nfunction buildFragmentShader() {\n return `\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\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 vec3 color = v_color;\n \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 // Generate grain using fbm\n vec2 noiseCoords = gl_FragCoord.xy / u_grain_scale;\n\n float grain = (u_grain_speed != 0.0) \n ? fbm(vec3(noiseCoords, u_time * u_grain_speed)) \n : fbm(vec3(noiseCoords, 0.0));\n\n // Center the grain around zero\n grain = grain * 0.5 + 0.5;\n grain -= 0.5;\n\n // Apply grain intensity\n grain *= u_grain_intensity;\n\n // Add grain to color\n color += vec3(grain);\n \n gl_FragColor = vec4(color,1.0);\n}\n`;\n}\n\nconst buildUniforms = () => `\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_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[5];\nuniform vec2 u_resolution;\n\nvarying vec2 vUv;\nvarying vec4 v_new_position;\nvarying vec3 v_color;\nvarying float v_displacement_amount;\n\n `;\n\nconst buildNoise = () => `\n\nvec3 mod289(vec3 x)\n{\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\n\nvec4 mod289(vec4 x)\n{\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\n\nvec4 permute(vec4 x)\n{\n return mod289(((x*34.0)+1.0)*x);\n}\n\nvec4 taylorInvSqrt(vec4 r)\n{\n return 1.79284291400159 - 0.85373472095314 * r;\n}\n\nvec3 fade(vec3 t) {\n return t*t*t*(t*(t*6.0-15.0)+10.0);\n}\n\nfloat snoise(vec3 v)\n{\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 // x0 = x0 - 0.0 + 0.0 * C.xxx;\n // x1 = x0 - i1 + 1.0 * C.xxx;\n // x2 = x0 - i2 + 2.0 * C.xxx;\n // x3 = x0 - 1.0 + 3.0 * C.xxx;\n vec3 x1 = x0 - i1 + C.xxx;\n vec3 x2 = x0 - i2 + C.yyy; // 2.0*C.x = 1/3 = C.y\n vec3 x3 = x0 - D.yyy; // -1.0+3.0*C.x = -0.5 = -D.y\n\n// Permutations\n i = mod289(i);\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: 7x7 points over a square, mapped onto an octahedron.\n// The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294)\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); // mod(p,7*7)\n\n vec4 x_ = floor(j * ns.z);\n vec4 y_ = floor(j - 7.0 * x_ ); // mod(j,N)\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 = vec4(lessThan(b0,0.0))*2.0 - 1.0;\n //vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0;\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); // Integer part for indexing\n vec3 Pi1 = Pi0 + vec3(1.0); // Integer part + 1\n Pi0 = mod289(Pi0);\n Pi1 = mod289(Pi1);\n vec3 Pf0 = fract(P); // Fractional part for interpolation\n vec3 Pf1 = Pf0 - vec3(1.0); // Fractional part - 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// YUV to RGB matrix\nmat3 yuv2rgb = mat3(1.0, 0.0, 1.13983,\n 1.0, -0.39465, -0.58060,\n 1.0, 2.03211, 0.0);\n\n// RGB to YUV matrix\nmat3 rgb2yuv = mat3(0.2126, 0.7152, 0.0722,\n -0.09991, -0.33609, 0.43600,\n 0.615, -0.5586, -0.05639);\n \nvec3 oklab2rgb(vec3 linear)\n{\n const mat3 im1 = mat3(0.4121656120, 0.2118591070, 0.0883097947,\n 0.5362752080, 0.6807189584, 0.2818474174,\n 0.0514575653, 0.1074065790, 0.6302613616);\n \n const mat3 im2 = mat3(+0.2104542553, +1.9779984951, +0.0259040371,\n +0.7936177850, -2.4285922050, +0.7827717662,\n -0.0040720468, +0.4505937099, -0.8086757660);\n \n vec3 lms = im1 * linear;\n \n return im2 * (sign(lms) * pow(abs(lms), vec3(1.0/3.0)));\n}\n\nvec3 rgb2oklab(vec3 oklab)\n{\n const mat3 m1 = mat3(+1.000000000, +1.000000000, +1.000000000,\n +0.396337777, -0.105561346, -0.089484178,\n +0.215803757, -0.063854173, -1.291485548);\n \n const mat3 m2 = mat3(+4.076724529, -1.268143773, -0.004111989,\n -3.307216883, +2.609332323, -0.703476310,\n +0.230759054, -0.341134429, +1.706862569);\n vec3 lms = m1 * oklab;\n \n return m2 * (lms * lms * lms);\n}\n\n `;\n\nconst buildColorFunctions = () => `\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\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) => {\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;\n }\n }\n }\n const link = document.createElement(\"a\");\n setLinkStyles(link);\n ref.parentElement?.appendChild(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"],"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","grainSpeed","wireframe","backgroundColor","backgroundAlpha","resolution","seed","tick","getElapsedSecondsInLastHour","render","renderer","camera","scene","meshes","addNeatLink","mesh","width","height","color","threeColor","setSize","canvas","updateCamera","entries","material","geo","plane","uniforms","buildUniforms","buildNoise","buildColorFunctions","buildVertexShader","buildFragmentShader","targetPlaneArea","ratio","targetWidth","targetHeight","left","right","top","bottom","near","far","setLinkStyles","link","existingLinks","i","now","minutes","seconds","length","characters","result","randomIndex"],"mappings":"wjBAEMA,EAAc,GACdC,EAAe,GAEfC,EAAY,GACZC,EAAe,EAEfC,EAAQ,IAAIC,EAAM,MAElBC,EAAUC,EAAqB,EA6C9B,MAAMC,CAAuC,CAExC,KAEA,OAAiB,GAEjB,oBAA8B,GAC9B,kBAA4B,GAE5B,gBAA0B,GAC1B,gBAA0B,GAC1B,eAAyB,GAEzB,SAAmB,GACnB,YAAsB,GACtB,YAAsB,GACtB,YAAsB,GAEtB,YAAsB,GACtB,gBAA0B,GAC1B,YAAsB,GAEtB,eAAyB,GAEzB,QAAuB,CAAA,EACvB,WAAsB,GAEtB,iBAA2B,UAC3B,iBAA2B,EAE3B,WAAqB,GACrB,aACA,WAER,YAAYC,EAAqF,CAEvF,KAAA,CACF,IAAAC,EACA,MAAAC,EAAQ,EACR,mBAAAC,EAAqB,EACrB,iBAAAC,EAAmB,EACnB,eAAAC,EAAiB,EACjB,eAAAC,EAAiB,EACjB,cAAAC,EAAgB,EAChB,OAAAC,EACA,WAAAC,EAAa,EACb,QAAAC,EAAU,EACV,gBAAAC,EAAkB,EAClB,gBAAAC,EAAkB,EAClB,cAAAC,EAAgB,EAChB,WAAAC,EAAa,EACb,eAAAC,EAAiB,IACjB,WAAAC,EAAa,GACb,UAAAC,EAAY,GACZ,gBAAAC,EAAkB,UAClB,gBAAAC,EAAkB,EAClB,WAAAC,EAAa,EACb,KAAAC,CACA,EAAArB,EAGJ,KAAK,KAAOC,EAEZ,KAAK,QAAU,KAAK,QAAQ,KAAK,IAAI,EACrC,KAAK,WAAa,KAAK,WAAW,KAAK,IAAI,EAC3C,KAAK,eAAiB,KAAK,eAAe,KAAK,IAAI,EAEnD,KAAK,MAAQC,EACb,KAAK,mBAAqBC,EAC1B,KAAK,iBAAmBC,EACxB,KAAK,eAAiBC,EACtB,KAAK,eAAiBC,EACtB,KAAK,cAAgBC,EACrB,KAAK,cAAgBM,EACrB,KAAK,WAAaC,EAClB,KAAK,eAAiBC,EACtB,KAAK,WAAaC,EAClB,KAAK,OAASR,EACd,KAAK,QAAUE,EACf,KAAK,WAAaD,EAClB,KAAK,gBAAkBE,EACvB,KAAK,gBAAkBC,EACvB,KAAK,UAAYK,EACjB,KAAK,gBAAkBC,EACvB,KAAK,gBAAkBC,EAElB,KAAA,WAAa,KAAK,WAAWC,CAAU,EAE5C,IAAIE,EAAOD,IAAS,OAAYA,EAAOE,EAA4B,EACnE,MAAMC,EAAS,IAAM,CAEjB,KAAM,CAAE,SAAAC,EAAU,OAAAC,EAAQ,MAAAC,EAAO,OAAAC,GAAW,KAAK,WAC7C,KAAK,MAAMN,EAAO,EAAE,EAAI,IAAM,GAC9BO,EAAY5B,CAAG,EAGnBwB,EAAS,cAAc,KAAK,iBAAkB,KAAK,gBAAgB,EAC5DG,EAAA,QAASE,GAAS,CAErB,MAAMC,GAAQ,KAAK,KAAK,MACpBC,GAAS,KAAK,KAAK,OAEjBxB,GAAS,CACX,GAAG,KAAK,QAAQ,IAAayB,GAAA,CACrB,IAAAC,EAAa,IAAItC,EAAM,MAChB,OAAAsC,EAAA,SAASD,EAAM,MAAO,EAAE,EAC3B,CACJ,UAAWA,EAAM,QACjB,MAAOC,EACP,UAAWD,EAAM,SAAA,CACrB,CACH,EACD,GAAG,MAAM,KAAK,CAAE,OAAQvC,EAAe,KAAK,QAAQ,MAAO,CAAC,EAAE,IAAI,KAAO,CACrE,UAAW,GACX,MAAO,IAAIE,EAAM,MAAM,CAAQ,CAAA,EACjC,CAAA,EAGE0B,GAAA3B,EAAM,WAAa,KAAK,OAE3BmC,EAAA,SAAS,SAAS,OAAO,MAAQR,EAEjCQ,EAAA,SAAS,SAAS,aAAe,CAAE,MAAO,IAAIlC,EAAM,QAAQmC,GAAOC,EAAM,CAAE,EAEhFF,EAAK,SAAS,SAAS,iBAAmB,CAAE,MAAO,IAAIlC,EAAM,QAAQ,KAAK,oBAAqB,KAAK,iBAAiB,CAAE,EAEvHkC,EAAK,SAAS,SAAS,mBAAqB,CAAE,MAAO,KAAK,iBAE1DA,EAAK,SAAS,SAAS,mBAAqB,CAAE,MAAO,KAAK,iBAE1DA,EAAK,SAAS,SAAS,iBAAmB,CAAE,MAAO,KAAK,gBAExDA,EAAK,SAAS,SAAS,cAAgB,CAAE,MAAOvC,GAEhDuC,EAAK,SAAS,SAAS,eAAiB,CAAE,MAAOtC,GAEjDsC,EAAK,SAAS,SAAS,iBAAmB,CAAE,MAAO,KAAK,gBAExDA,EAAK,SAAS,SAAS,SAAW,CAAE,MAAOtB,IAE3CsB,EAAK,SAAS,SAAS,eAAiB,CAAE,MAAOpC,GAEjDoC,EAAK,SAAS,SAAS,UAAY,CAAE,MAAO,KAAK,UAEjDA,EAAK,SAAS,SAAS,aAAe,CAAE,MAAO,KAAK,aAEpDA,EAAK,SAAS,SAAS,aAAe,CAAE,MAAO,KAAK,aAEpDA,EAAK,SAAS,SAAS,aAAe,CAAE,MAAO,KAAK,aAEpDA,EAAK,SAAS,SAAS,kBAAoB,CAAE,MAAO,KAAK,iBAEzDA,EAAK,SAAS,SAAS,cAAgB,CAAE,MAAO,KAAK,aAErDA,EAAK,SAAS,SAAS,cAAgB,CAAE,MAAO,KAAK,aAEhDA,EAAA,SAAS,UAAY,KAAK,UAAA,CAClC,EAEQL,EAAA,OAAOE,EAAOD,CAAM,EACxB,KAAA,WAAa,sBAAsBF,CAAM,CAAA,EAG5CW,EAAU,IAAM,CAEZ,KAAA,CAAE,SAAAV,CAAS,EAAI,KAAK,WACpBW,EAASX,EAAS,WAClBM,EAAQK,EAAO,YACfJ,EAASI,EAAO,aAEtB,KAAK,WAAW,SAAS,QAAQL,EAAOC,EAAQ,EAAK,EACrDK,EAAa,KAAK,WAAW,OAAQN,EAAOC,CAAM,CAAA,EAGjD,KAAA,aAAe,IAAI,eAA0BM,GAAA,CACtCH,GAAA,CACX,EAEI,KAAA,aAAa,QAAQlC,CAAG,EAGtBuB,GACX,CAEA,SAAU,CACF,OACA,qBAAqB,KAAK,UAAU,EACpC,KAAK,aAAa,aAE1B,CAEA,IAAI,MAAMtB,EAAe,CACrB,KAAK,OAASA,EAAQ,EAC1B,CAEA,IAAI,mBAAmBC,EAA4B,CAC/C,KAAK,oBAAsBA,EAAqB,CACpD,CAEA,IAAI,iBAAiBC,EAA0B,CAC3C,KAAK,kBAAoBA,EAAmB,CAChD,CAEA,IAAI,eAAeC,EAAwB,CACvC,KAAK,gBAAkBA,EAAiB,GAC5C,CAEA,IAAI,eAAeC,EAAwB,CACvC,KAAK,gBAAkBA,EAAiB,GAC5C,CAEA,IAAI,cAAcC,EAAuB,CACrC,KAAK,eAAiBA,EAAgB,GAC1C,CAEA,IAAI,OAAOC,EAAqB,CAC5B,KAAK,QAAUA,CACnB,CAEA,IAAI,WAAWC,EAAoB,CAC/B,KAAK,YAAcA,EAAa,GACpC,CAEA,IAAI,QAAQC,EAAiB,CACzB,KAAK,SAAWA,EAAU,GAC9B,CAEA,IAAI,gBAAgBC,EAAyB,CACzC,KAAK,YAAcA,EAAkB,EACzC,CAEA,IAAI,gBAAgBC,EAAyB,CACzC,KAAK,YAAcA,CACvB,CAEA,IAAI,cAAcC,EAAuB,CACrC,KAAK,eAAiBA,EAAgB,EAC1C,CAEA,IAAI,WAAWC,EAAoB,CAC1B,KAAA,YAAcA,GAAc,EAAI,EAAIA,CAC7C,CAEA,IAAI,eAAeC,EAAwB,CACvC,KAAK,gBAAkBA,CAC3B,CAEA,IAAI,WAAWC,EAAoB,CAC/B,KAAK,YAAcA,CACvB,CAEA,IAAI,UAAUC,EAAoB,CAC9B,KAAK,WAAaA,CACtB,CAEA,IAAI,WAAWG,EAAoB,CAC1B,KAAA,WAAa,KAAK,WAAWA,CAAU,CAChD,CAEA,IAAI,gBAAgBF,EAAyB,CACzC,KAAK,iBAAmBA,CAC5B,CAEA,IAAI,gBAAgBC,EAAyB,CACzC,KAAK,iBAAmBA,CAC5B,CAEA,WAAWC,EAAgC,CAEvC,MAAMW,EAAQ,KAAK,KAAK,MACpBC,EAAS,KAAK,KAAK,OAEjBP,EAAW,IAAI7B,EAAM,cAAc,CAErC,MAAO,GACP,OAAQ,KAAK,IAAA,CAChB,EAEQ6B,EAAA,cAAc,SAAU,EAAE,EAC1BA,EAAA,QAAQM,EAAOC,EAAQ,EAAK,EAErC,MAAMJ,EAAuB,CAAA,EAEvBD,EAAQ,IAAI/B,EAAM,MAElB2C,EAAW,KAAK,eAAeR,EAAOC,CAAM,EAE5CQ,EAAM,IAAI5C,EAAM,cAAcL,EAAaC,EAAc,IAAM4B,EAAY,IAAMA,CAAU,EAC3FqB,EAAQ,IAAI7C,EAAM,KAAK4C,EAAKD,CAAQ,EAC1CE,EAAM,SAAS,EAAI,CAAC,KAAK,GAAK,IAC9BA,EAAM,SAAS,EAAI,GACnBb,EAAO,KAAKa,CAAK,EACjBd,EAAM,IAAIc,CAAK,EAET,MAAAf,EAAS,IAAI9B,EAAM,mBAAmB,EAAK,EAAK,EAAK,EAAK,EAAK,CAAG,EAExE,OAAA8B,EAAO,SAAS,EAAI,EACPW,EAAAX,EAAQK,EAAOC,CAAM,EAE3B,CACH,SAAAP,EACA,OAAAC,EACA,MAAAC,EACA,OAAAC,EACA,WAAAR,CAAA,CAER,CAEA,eAAeW,EAAeC,EAAgB,CAE1C,MAAMxB,EAAS,CACX,GAAG,KAAK,QAAQ,IAAcyB,IAAA,CAC1B,UAAWA,EAAM,QACjB,MAAO,IAAIrC,EAAM,MAAMqC,EAAM,KAAK,EAClC,UAAWA,EAAM,SAAA,EACnB,EACF,GAAG,MAAM,KAAK,CAAE,OAAQvC,EAAe,KAAK,QAAQ,MAAO,CAAC,EAAE,IAAI,KAAO,CACrE,UAAW,GACX,MAAO,IAAIE,EAAM,MAAM,CAAQ,CAAA,EACjC,CAAA,EAGA8C,EAAW,CACb,OAAQ,CAAE,MAAO,CAAE,EACnB,iBAAkB,CAAE,MAAO,IAAI9C,EAAM,QAAQ,KAAK,oBAAqB,KAAK,iBAAiB,CAAE,EAC/F,mBAAoB,CAAE,MAAO,KAAK,eAAgB,EAClD,mBAAoB,CAAE,MAAO,KAAK,eAAgB,EAClD,iBAAkB,CAAE,MAAO,KAAK,cAAe,EAC/C,aAAc,CAAE,MAAO,IAAIA,EAAM,QAAQmC,EAAOC,CAAM,CAAE,EACxD,SAAU,CAAE,MAAOxB,CAAO,EAC1B,eAAgB,CAAE,MAAO,KAAK,QAAQ,MAAO,EAC7C,cAAe,CAAE,MAAOjB,CAAY,EACpC,eAAgB,CAAE,MAAOC,CAAa,EACtC,UAAW,CAAE,MAAO,KAAK,QAAS,EAClC,aAAc,CAAE,MAAO,KAAK,WAAY,EACxC,kBAAmB,CAAE,MAAO,KAAK,eAAgB,EACjD,cAAe,CAAE,MAAO,KAAK,WAAY,EACzC,cAAe,CAAE,MAAO,KAAK,WAAY,CAAA,EAGvC+C,EAAW,IAAI3C,EAAM,eAAe,CACtC,SAAA8C,EACA,aAAcC,EAAc,EAAIC,EAAe,EAAAC,EAAA,EAAwBC,EAAkB,EACzF,eAAgBH,EAAc,EAAIE,EAAwB,EAAAD,EAAA,EAAeG,EAAoB,CAAA,CAChG,EAED,OAAAR,EAAS,UAAY9C,EACd8C,CACX,CAGJ,CAEA,SAASF,EAAaX,EAAsBK,EAAeC,EAAgB,CAIvE,MAAMgB,EADejB,EAAQC,EAEV,IACfzC,EAAcC,EAAe,IAE3ByD,EAAQlB,EAAQC,EAEhBkB,EAAc,KAAK,KAAKF,EAAkBC,CAAK,EAC/CE,EAAeH,EAAkBE,EAEjCE,EAAO,CAAC7D,EAAc,EACtB8D,EAAQ,KAAK,KAAKD,EAAOF,GAAe,IAAK3D,EAAc,CAAC,EAE5D+D,EAAM9D,EAAe,EACrB+D,EAAS,KAAK,KAAKD,EAAMH,GAAgB,EAAG,CAAC3D,EAAe,CAAC,EAE7DgE,EAAO,KACPC,EAAM,IACR/B,aAAkB9B,EAAM,oBACxB8B,EAAO,KAAO0B,EACd1B,EAAO,MAAQ2B,EACf3B,EAAO,IAAM4B,EACb5B,EAAO,OAAS6B,EAChB7B,EAAO,KAAO8B,EACd9B,EAAO,IAAM+B,EACb/B,EAAO,uBAAuB,GACvBA,aAAkB9B,EAAM,oBAC/B8B,EAAO,OAASK,EAAQC,EACxBN,EAAO,uBAAuB,EAGtC,CAGA,SAASoB,GAAoB,CAClB,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CA4DX,CAEA,SAASC,GAAsB,CACpB,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CA8CX,CAEA,MAAMJ,EAAgB,IAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAyCtBC,EAAa,IAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAoNnBC,EAAsB,IAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8C5Ba,EAAiBC,GAA4B,CAC/CA,EAAK,GAAK9D,EACV8D,EAAK,KAAO,0BACZA,EAAK,OAAS,SACdA,EAAK,MAAM,SAAW,WACtBA,EAAK,MAAM,QAAU,QACrBA,EAAK,MAAM,OAAS,IACpBA,EAAK,MAAM,MAAQ,IACnBA,EAAK,MAAM,QAAU,OACrBA,EAAK,MAAM,MAAQ,UACnBA,EAAK,MAAM,QAAU,MACrBA,EAAK,MAAM,WAAa,aACxBA,EAAK,MAAM,SAAW,OACtBA,EAAK,MAAM,WAAa,OACxBA,EAAK,MAAM,eAAiB,OAC5BA,EAAK,MAAM,OAAS,QACpBA,EAAK,UAAY,MACrB,EAEM9B,EAAe5B,GAA2B,CAC5C,MAAM2D,EAAgB3D,EAAI,eAAe,qBAAqB,GAAG,EACjE,GAAI2D,GACA,QAASC,EAAI,EAAGA,EAAID,EAAc,OAAQC,IAClC,GAAAD,EAAcC,GAAG,KAAOhE,EAAS,CACjC6D,EAAcE,EAAcC,EAAE,EAC9B,MACJ,EAGF,MAAAF,EAAO,SAAS,cAAc,GAAG,EACvCD,EAAcC,CAAI,EACd1D,EAAA,eAAe,YAAY0D,CAAI,CACvC,EAEA,SAASpC,GAA8B,CAC7B,MAAAuC,EAAM,IAAI,KACVC,EAAUD,EAAI,aACdE,EAAUF,EAAI,aACpB,OAAQC,EAAU,GAAMC,CAC5B,CAEA,SAASlE,EAAqBmE,EAAiB,EAAW,CACtD,MAAMC,EAAa,iEACnB,IAAIC,EAAS,GACb,QAASN,EAAI,EAAGA,EAAII,EAAQJ,IAAK,CAC7B,MAAMO,EAAc,KAAK,MAAM,KAAK,SAAWF,EAAW,MAAM,EACtDC,GAAAD,EAAW,OAAOE,CAAW,CAC3C,CACO,OAAAD,CACX"}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@firecms/neat",
|
|
3
3
|
"description": "Beautiful 3D gradients for your website",
|
|
4
4
|
"access": "public",
|
|
5
|
-
"version": "0.
|
|
5
|
+
"version": "0.3.0",
|
|
6
6
|
"main": "./dist/index.umd.js",
|
|
7
7
|
"module": "./dist/index.es.js",
|
|
8
8
|
"types": "dist/index.d.ts",
|
|
@@ -12,10 +12,10 @@
|
|
|
12
12
|
"src"
|
|
13
13
|
],
|
|
14
14
|
"peerDependencies": {
|
|
15
|
-
"three": "^0.
|
|
15
|
+
"three": "^0.169.0"
|
|
16
16
|
},
|
|
17
17
|
"devDependencies": {
|
|
18
|
-
"three": "^0.
|
|
18
|
+
"three": "^0.169.0",
|
|
19
19
|
"typescript": "^4.8.4",
|
|
20
20
|
"vite": "^3.1.4"
|
|
21
21
|
},
|