@firecms/neat 0.5.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"math.js","sourceRoot":"","sources":["../src/math.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare const vertexShaderSource = "void main() {\n vUv = uv;\n\n // SCROLLING LOGIC\n // Separate multipliers for wave, color, and flow offsets\n float waveOffset = -u_y_offset * u_y_offset_wave_multiplier;\n float colorOffset = -u_y_offset * u_y_offset_color_multiplier;\n float flowOffset = -u_y_offset * u_y_offset_flow_multiplier;\n\n // 1. DISPLACEMENT (WAVES)\n // We add waveOffset to Y to scroll the wave pattern\n v_displacement_amount = cnoise( vec3(\n u_wave_frequency_x * position.x + u_time,\n u_wave_frequency_y * (position.y + waveOffset) + u_time,\n u_time\n ));\n\n // 2. FLOW FIELD\n // Apply flow offset to scroll the flow field mask\n vec2 baseUv = vUv;\n baseUv.y += flowOffset / u_plane_height; // Scale to match wave speed\n vec2 flowUv = baseUv;\n\n if (u_flow_enabled > 0.5) {\n if (u_flow_ease > 0.0 || u_flow_distortion_a > 0.0) {\n vec2 ppp = -1.0 + 2.0 * baseUv;\n ppp += 0.1 * cos((1.5 * u_flow_scale) * ppp.yx + 1.1 * u_time + vec2(0.1, 1.1));\n ppp += 0.1 * cos((2.3 * u_flow_scale) * ppp.yx + 1.3 * u_time + vec2(3.2, 3.4));\n ppp += 0.1 * cos((2.2 * u_flow_scale) * ppp.yx + 1.7 * u_time + vec2(1.8, 5.2));\n ppp += u_flow_distortion_a * cos((u_flow_distortion_b * u_flow_scale) * ppp.yx + 1.4 * u_time + vec2(6.3, 3.9));\n\n float r = length(ppp);\n flowUv = mix(baseUv, vec2(baseUv.x * (1.0 - u_flow_ease) + r * u_flow_ease, baseUv.y), u_flow_ease);\n }\n }\n\n // Pass the standard flow UV to fragment shader (for texture)\n vFlowUv = flowUv;\n\n // 3. COLOR MIXING\n // We take the computed flow UVs and apply the color offset\n // Scale by plane height to match wave offset speed (world space vs UV space)\n vec3 color = u_colors[0].color;\n // ...\n vec2 adjustedUv = flowUv;\n adjustedUv.y += colorOffset / u_plane_height; // Scroll the color mixing pattern\n\n vec2 noise_cord = adjustedUv * u_color_pressure;\n const float minNoise = .0;\n const float maxNoise = .9;\n\n for (int i = 1; i < 6; i++) {\n if (i < u_colors_count) {\n if (u_colors[i].is_active > 0.5) {\n float noiseFlow = (1. + float(i)) / 30.;\n float noiseSpeed = (1. + float(i)) * 0.11;\n float noiseSeed = 13. + float(i) * 7.;\n\n float noise = snoise(\n vec3(\n noise_cord.x * u_color_pressure.x + u_time * noiseFlow * 2.,\n noise_cord.y * u_color_pressure.y,\n u_time * noiseSpeed\n ) + noiseSeed\n ) - (.1 * float(i)) + (.5 * u_color_blending);\n\n noise = clamp(noise, minNoise, maxNoise + float(i) * 0.02);\n color = mix(color, u_colors[i].color, smoothstep(0.0, u_color_blending, noise));\n }\n }\n }\n\n v_color = color;\n\n // 4. VERTEX POSITION\n vec3 newPosition = position + normal * v_displacement_amount * u_wave_amplitude;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(newPosition, 1.0);\n v_new_position = gl_Position;\n}\n";
2
+ export declare const fragmentShaderSource = "float random(vec2 p) {\n return fract(sin(dot(p, vec2(12.9898,78.233))) * 43758.5453);\n}\n\nfloat fbm(vec3 x) {\n float value = 0.0;\n float amplitude = 0.5;\n float frequency = 1.0;\n for (int i = 0; i < 4; i++) {\n value += amplitude * snoise(x * frequency);\n frequency *= 2.0;\n amplitude *= 0.5;\n }\n return value;\n}\n\nvoid main() {\n vec2 finalUv = vFlowUv;\n \n vec3 baseColor;\n\n if (u_enable_procedural_texture > 0.5) {\n // Calculate flow field distance for ease effect\n vec2 ppp = -1.0 + 2.0 * finalUv;\n ppp += 0.1 * cos((1.5 * u_flow_scale) * ppp.yx + 1.1 * u_time + vec2(0.1, 1.1));\n ppp += 0.1 * cos((2.3 * u_flow_scale) * ppp.yx + 1.3 * u_time + vec2(3.2, 3.4));\n ppp += 0.1 * cos((2.2 * u_flow_scale) * ppp.yx + 1.7 * u_time + vec2(1.8, 5.2));\n ppp += u_flow_distortion_a * cos((u_flow_distortion_b * u_flow_scale) * ppp.yx + 1.4 * u_time + vec2(6.3, 3.9));\n float r = length(ppp); // Flow distance\n \n // Ease blending: 0 = topographic (flow), 1 = image (UV)\n float vx = (finalUv.x * u_texture_ease) + (r * (1.0 - u_texture_ease));\n float vy = (finalUv.y * u_texture_ease) + (0.0 * (1.0 - u_texture_ease));\n vec2 texUv = vec2(vx, vy);\n\n // PARALLAX SCROLLING\n // We manually apply a smaller offset here to make the texture lag behind\n float parallaxFactor = 0.25; // 25% speed of the color mixing\n texUv.y -= (u_y_offset * u_y_offset_color_multiplier / u_plane_height) * parallaxFactor;\n\n texUv *= 1.5; // Tiling scale\n\n vec4 texSample = texture2D(u_procedural_texture, texUv);\n baseColor = texSample.rgb;\n } else {\n baseColor = v_color;\n }\n\n vec3 color = baseColor;\n\n // Post-processing\n color += v_displacement_amount * u_highlights;\n // Replace pow() with direct multiplication to avoid negative base undefined behavior in GLSL\n float shadowFactor = 1.0 - v_displacement_amount;\n color -= shadowFactor * shadowFactor * u_shadows;\n color = saturation(color, 1.0 + u_saturation);\n color = color * u_brightness;\n\n // Grain\n vec2 noiseCoords = gl_FragCoord.xy / u_grain_scale;\n float grain = 0.0;\n \n // Completely bypass expensive noise generation if grain is disabled\n if (u_grain_intensity > 0.0) {\n if (u_grain_speed != 0.0) {\n grain = fbm(vec3(noiseCoords, u_time * u_grain_speed));\n } else {\n grain = fbm(vec3(noiseCoords, 0.0));\n }\n\n grain = grain * 0.5 + 0.5;\n grain -= 0.5;\n grain = (grain > u_grain_sparsity) ? grain : 0.0;\n grain *= u_grain_intensity;\n }\n\n color += vec3(grain);\n\n gl_FragColor = vec4(color, 1.0);\n}\n";
3
+ export declare function buildVertUniforms(): string;
4
+ export declare function buildFragUniforms(): string;
5
+ export declare function buildNoise(): string;
6
+ export declare function buildColorFunctions(): string;
@@ -0,0 +1,407 @@
1
+ export const vertexShaderSource = `void main() {
2
+ vUv = uv;
3
+
4
+ // SCROLLING LOGIC
5
+ // Separate multipliers for wave, color, and flow offsets
6
+ float waveOffset = -u_y_offset * u_y_offset_wave_multiplier;
7
+ float colorOffset = -u_y_offset * u_y_offset_color_multiplier;
8
+ float flowOffset = -u_y_offset * u_y_offset_flow_multiplier;
9
+
10
+ // 1. DISPLACEMENT (WAVES)
11
+ // We add waveOffset to Y to scroll the wave pattern
12
+ v_displacement_amount = cnoise( vec3(
13
+ u_wave_frequency_x * position.x + u_time,
14
+ u_wave_frequency_y * (position.y + waveOffset) + u_time,
15
+ u_time
16
+ ));
17
+
18
+ // 2. FLOW FIELD
19
+ // Apply flow offset to scroll the flow field mask
20
+ vec2 baseUv = vUv;
21
+ baseUv.y += flowOffset / u_plane_height; // Scale to match wave speed
22
+ vec2 flowUv = baseUv;
23
+
24
+ if (u_flow_enabled > 0.5) {
25
+ if (u_flow_ease > 0.0 || u_flow_distortion_a > 0.0) {
26
+ vec2 ppp = -1.0 + 2.0 * baseUv;
27
+ ppp += 0.1 * cos((1.5 * u_flow_scale) * ppp.yx + 1.1 * u_time + vec2(0.1, 1.1));
28
+ ppp += 0.1 * cos((2.3 * u_flow_scale) * ppp.yx + 1.3 * u_time + vec2(3.2, 3.4));
29
+ ppp += 0.1 * cos((2.2 * u_flow_scale) * ppp.yx + 1.7 * u_time + vec2(1.8, 5.2));
30
+ ppp += u_flow_distortion_a * cos((u_flow_distortion_b * u_flow_scale) * ppp.yx + 1.4 * u_time + vec2(6.3, 3.9));
31
+
32
+ float r = length(ppp);
33
+ flowUv = mix(baseUv, vec2(baseUv.x * (1.0 - u_flow_ease) + r * u_flow_ease, baseUv.y), u_flow_ease);
34
+ }
35
+ }
36
+
37
+ // Pass the standard flow UV to fragment shader (for texture)
38
+ vFlowUv = flowUv;
39
+
40
+ // 3. COLOR MIXING
41
+ // We take the computed flow UVs and apply the color offset
42
+ // Scale by plane height to match wave offset speed (world space vs UV space)
43
+ vec3 color = u_colors[0].color;
44
+ // ...
45
+ vec2 adjustedUv = flowUv;
46
+ adjustedUv.y += colorOffset / u_plane_height; // Scroll the color mixing pattern
47
+
48
+ vec2 noise_cord = adjustedUv * u_color_pressure;
49
+ const float minNoise = .0;
50
+ const float maxNoise = .9;
51
+
52
+ for (int i = 1; i < 6; i++) {
53
+ if (i < u_colors_count) {
54
+ if (u_colors[i].is_active > 0.5) {
55
+ float noiseFlow = (1. + float(i)) / 30.;
56
+ float noiseSpeed = (1. + float(i)) * 0.11;
57
+ float noiseSeed = 13. + float(i) * 7.;
58
+
59
+ float noise = snoise(
60
+ vec3(
61
+ noise_cord.x * u_color_pressure.x + u_time * noiseFlow * 2.,
62
+ noise_cord.y * u_color_pressure.y,
63
+ u_time * noiseSpeed
64
+ ) + noiseSeed
65
+ ) - (.1 * float(i)) + (.5 * u_color_blending);
66
+
67
+ noise = clamp(noise, minNoise, maxNoise + float(i) * 0.02);
68
+ color = mix(color, u_colors[i].color, smoothstep(0.0, u_color_blending, noise));
69
+ }
70
+ }
71
+ }
72
+
73
+ v_color = color;
74
+
75
+ // 4. VERTEX POSITION
76
+ vec3 newPosition = position + normal * v_displacement_amount * u_wave_amplitude;
77
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(newPosition, 1.0);
78
+ v_new_position = gl_Position;
79
+ }
80
+ `;
81
+ export const fragmentShaderSource = `float random(vec2 p) {
82
+ return fract(sin(dot(p, vec2(12.9898,78.233))) * 43758.5453);
83
+ }
84
+
85
+ float fbm(vec3 x) {
86
+ float value = 0.0;
87
+ float amplitude = 0.5;
88
+ float frequency = 1.0;
89
+ for (int i = 0; i < 4; i++) {
90
+ value += amplitude * snoise(x * frequency);
91
+ frequency *= 2.0;
92
+ amplitude *= 0.5;
93
+ }
94
+ return value;
95
+ }
96
+
97
+ void main() {
98
+ vec2 finalUv = vFlowUv;
99
+
100
+ vec3 baseColor;
101
+
102
+ if (u_enable_procedural_texture > 0.5) {
103
+ // Calculate flow field distance for ease effect
104
+ vec2 ppp = -1.0 + 2.0 * finalUv;
105
+ ppp += 0.1 * cos((1.5 * u_flow_scale) * ppp.yx + 1.1 * u_time + vec2(0.1, 1.1));
106
+ ppp += 0.1 * cos((2.3 * u_flow_scale) * ppp.yx + 1.3 * u_time + vec2(3.2, 3.4));
107
+ ppp += 0.1 * cos((2.2 * u_flow_scale) * ppp.yx + 1.7 * u_time + vec2(1.8, 5.2));
108
+ ppp += u_flow_distortion_a * cos((u_flow_distortion_b * u_flow_scale) * ppp.yx + 1.4 * u_time + vec2(6.3, 3.9));
109
+ float r = length(ppp); // Flow distance
110
+
111
+ // Ease blending: 0 = topographic (flow), 1 = image (UV)
112
+ float vx = (finalUv.x * u_texture_ease) + (r * (1.0 - u_texture_ease));
113
+ float vy = (finalUv.y * u_texture_ease) + (0.0 * (1.0 - u_texture_ease));
114
+ vec2 texUv = vec2(vx, vy);
115
+
116
+ // PARALLAX SCROLLING
117
+ // We manually apply a smaller offset here to make the texture lag behind
118
+ float parallaxFactor = 0.25; // 25% speed of the color mixing
119
+ texUv.y -= (u_y_offset * u_y_offset_color_multiplier / u_plane_height) * parallaxFactor;
120
+
121
+ texUv *= 1.5; // Tiling scale
122
+
123
+ vec4 texSample = texture2D(u_procedural_texture, texUv);
124
+ baseColor = texSample.rgb;
125
+ } else {
126
+ baseColor = v_color;
127
+ }
128
+
129
+ vec3 color = baseColor;
130
+
131
+ // Post-processing
132
+ color += v_displacement_amount * u_highlights;
133
+ // Replace pow() with direct multiplication to avoid negative base undefined behavior in GLSL
134
+ float shadowFactor = 1.0 - v_displacement_amount;
135
+ color -= shadowFactor * shadowFactor * u_shadows;
136
+ color = saturation(color, 1.0 + u_saturation);
137
+ color = color * u_brightness;
138
+
139
+ // Grain
140
+ vec2 noiseCoords = gl_FragCoord.xy / u_grain_scale;
141
+ float grain = 0.0;
142
+
143
+ // Completely bypass expensive noise generation if grain is disabled
144
+ if (u_grain_intensity > 0.0) {
145
+ if (u_grain_speed != 0.0) {
146
+ grain = fbm(vec3(noiseCoords, u_time * u_grain_speed));
147
+ } else {
148
+ grain = fbm(vec3(noiseCoords, 0.0));
149
+ }
150
+
151
+ grain = grain * 0.5 + 0.5;
152
+ grain -= 0.5;
153
+ grain = (grain > u_grain_sparsity) ? grain : 0.0;
154
+ grain *= u_grain_intensity;
155
+ }
156
+
157
+ color += vec3(grain);
158
+
159
+ gl_FragColor = vec4(color, 1.0);
160
+ }
161
+ `;
162
+ export function buildVertUniforms() {
163
+ return `precision highp float;
164
+
165
+ attribute vec3 position;
166
+ attribute vec3 normal;
167
+ attribute vec2 uv;
168
+
169
+ uniform mat4 modelViewMatrix;
170
+ uniform mat4 projectionMatrix;
171
+
172
+ varying vec2 vUv;
173
+ varying vec2 vFlowUv;
174
+ varying vec4 v_new_position;
175
+ varying vec3 v_color;
176
+ varying float v_displacement_amount;
177
+
178
+ uniform float u_time;
179
+ uniform vec2 u_resolution;
180
+ uniform vec2 u_color_pressure;
181
+ uniform float u_wave_frequency_x;
182
+ uniform float u_wave_frequency_y;
183
+ uniform float u_wave_amplitude;
184
+ uniform float u_plane_width;
185
+ uniform float u_plane_height;
186
+ uniform float u_color_blending;
187
+
188
+ uniform int u_colors_count;
189
+ struct ColorStop {
190
+ float is_active;
191
+ vec3 color;
192
+ float influence;
193
+ };
194
+ uniform ColorStop u_colors[6];
195
+
196
+ uniform float u_y_offset;
197
+ uniform float u_y_offset_wave_multiplier;
198
+ uniform float u_y_offset_color_multiplier;
199
+ uniform float u_y_offset_flow_multiplier;
200
+
201
+ // Flow field uniforms
202
+ uniform float u_flow_distortion_a;
203
+ uniform float u_flow_distortion_b;
204
+ uniform float u_flow_scale;
205
+ uniform float u_flow_ease;
206
+ uniform float u_flow_enabled;
207
+ `;
208
+ }
209
+ export function buildFragUniforms() {
210
+ return `precision highp float;
211
+
212
+ varying vec2 vUv;
213
+ varying vec2 vFlowUv;
214
+ varying vec3 v_color;
215
+ varying float v_displacement_amount;
216
+
217
+ uniform float u_time;
218
+ uniform float u_plane_height;
219
+
220
+ uniform float u_shadows;
221
+ uniform float u_highlights;
222
+ uniform float u_saturation;
223
+ uniform float u_brightness;
224
+ uniform float u_grain_intensity;
225
+ uniform float u_grain_sparsity;
226
+ uniform float u_grain_scale;
227
+ uniform float u_grain_speed;
228
+
229
+ uniform float u_y_offset;
230
+ uniform float u_y_offset_color_multiplier;
231
+
232
+ // Flow field uniforms
233
+ uniform float u_flow_distortion_a;
234
+ uniform float u_flow_distortion_b;
235
+ uniform float u_flow_scale;
236
+
237
+ // Procedural texture uniforms
238
+ uniform sampler2D u_procedural_texture;
239
+ uniform float u_enable_procedural_texture;
240
+ uniform float u_texture_ease;
241
+ `;
242
+ }
243
+ export function buildNoise() {
244
+ return `
245
+ // 1. REPLACEMENT PERMUTE:
246
+ // Uses a hash function (fract/sin) instead of a modular lookup table.
247
+ vec4 permute(vec4 x) {
248
+ return floor(fract(sin(x) * 43758.5453123) * 289.0);
249
+ }
250
+
251
+ // Taylor Inverse Sqrt
252
+ vec4 taylorInvSqrt(vec4 r) {
253
+ return 1.79284291400159 - 0.85373472095314 * r;
254
+ }
255
+
256
+ // Fade function
257
+ vec3 fade(vec3 t) {
258
+ return t*t*t*(t*(t*6.0-15.0)+10.0);
259
+ }
260
+
261
+ // 3D Simplex Noise
262
+ float snoise(vec3 v) {
263
+ const vec2 C = vec2(1.0/6.0, 1.0/3.0) ;
264
+ const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);
265
+
266
+ // First corner
267
+ vec3 i = floor(v + dot(v, C.yyy) );
268
+ vec3 x0 = v - i + dot(i, C.xxx) ;
269
+
270
+ // Other corners
271
+ vec3 g = step(x0.yzx, x0.xyz);
272
+ vec3 l = 1.0 - g;
273
+ vec3 i1 = min( g.xyz, l.zxy );
274
+ vec3 i2 = max( g.xyz, l.zxy );
275
+
276
+ vec3 x1 = x0 - i1 + C.xxx;
277
+ vec3 x2 = x0 - i2 + C.yyy;
278
+ vec3 x3 = x0 - D.yyy;
279
+
280
+ // Permutations
281
+ vec4 p = permute( permute( permute(
282
+ i.z + vec4(0.0, i1.z, i2.z, 1.0 ))
283
+ + i.y + vec4(0.0, i1.y, i2.y, 1.0 ))
284
+ + i.x + vec4(0.0, i1.x, i2.x, 1.0 ));
285
+
286
+ // Gradients
287
+ float n_ = 0.142857142857; // 1.0/7.0
288
+ vec3 ns = n_ * D.wyz - D.xzx;
289
+
290
+ vec4 j = p - 49.0 * floor(p * ns.z * ns.z);
291
+
292
+ vec4 x_ = floor(j * ns.z);
293
+ vec4 y_ = floor(j - 7.0 * x_ );
294
+
295
+ vec4 x = x_ *ns.x + ns.yyyy;
296
+ vec4 y = y_ *ns.x + ns.yyyy;
297
+ vec4 h = 1.0 - abs(x) - abs(y);
298
+
299
+ vec4 b0 = vec4( x.xy, y.xy );
300
+ vec4 b1 = vec4( x.zw, y.zw );
301
+
302
+ vec4 s0 = floor(b0)*2.0 + 1.0;
303
+ vec4 s1 = floor(b1)*2.0 + 1.0;
304
+ vec4 sh = -step(h, vec4(0.0));
305
+
306
+ vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ;
307
+ vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ;
308
+
309
+ vec3 p0 = vec3(a0.xy,h.x);
310
+ vec3 p1 = vec3(a0.zw,h.y);
311
+ vec3 p2 = vec3(a1.xy,h.z);
312
+ vec3 p3 = vec3(a1.zw,h.w);
313
+
314
+ // Normalise gradients
315
+ vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));
316
+ p0 *= norm.x;
317
+ p1 *= norm.y;
318
+ p2 *= norm.z;
319
+ p3 *= norm.w;
320
+
321
+ // Mix final noise value
322
+ vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);
323
+ m = m * m;
324
+ return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1),
325
+ dot(p2,x2), dot(p3,x3) ) );
326
+ }
327
+
328
+ // Classic Perlin noise
329
+ float cnoise(vec3 P)
330
+ {
331
+ vec3 Pi0 = floor(P);
332
+ vec3 Pi1 = Pi0 + vec3(1.0);
333
+
334
+ vec3 Pf0 = fract(P);
335
+ vec3 Pf1 = Pf0 - vec3(1.0);
336
+ vec4 ix = vec4(Pi0.x, Pi1.x, Pi0.x, Pi1.x);
337
+ vec4 iy = vec4(Pi0.yy, Pi1.yy);
338
+ vec4 iz0 = Pi0.zzzz;
339
+ vec4 iz1 = Pi1.zzzz;
340
+
341
+ vec4 ixy = permute(permute(ix) + iy);
342
+ vec4 ixy0 = permute(ixy + iz0);
343
+ vec4 ixy1 = permute(ixy + iz1);
344
+
345
+ vec4 gx0 = ixy0 * (1.0 / 7.0);
346
+ vec4 gy0 = fract(floor(gx0) * (1.0 / 7.0)) - 0.5;
347
+ gx0 = fract(gx0);
348
+ vec4 gz0 = vec4(0.5) - abs(gx0) - abs(gy0);
349
+ vec4 sz0 = step(gz0, vec4(0.0));
350
+ gx0 -= sz0 * (step(0.0, gx0) - 0.5);
351
+ gy0 -= sz0 * (step(0.0, gy0) - 0.5);
352
+
353
+ vec4 gx1 = ixy1 * (1.0 / 7.0);
354
+ vec4 gy1 = fract(floor(gx1) * (1.0 / 7.0)) - 0.5;
355
+ gx1 = fract(gx1);
356
+ vec4 gz1 = vec4(0.5) - abs(gx1) - abs(gy1);
357
+ vec4 sz1 = step(gz1, vec4(0.0));
358
+ gx1 -= sz1 * (step(0.0, gx1) - 0.5);
359
+ gy1 -= sz1 * (step(0.0, gy1) - 0.5);
360
+
361
+ vec3 g000 = vec3(gx0.x,gy0.x,gz0.x);
362
+ vec3 g100 = vec3(gx0.y,gy0.y,gz0.y);
363
+ vec3 g010 = vec3(gx0.z,gy0.z,gz0.z);
364
+ vec3 g110 = vec3(gx0.w,gy0.w,gz0.w);
365
+ vec3 g001 = vec3(gx1.x,gy1.x,gz1.x);
366
+ vec3 g101 = vec3(gx1.y,gy1.y,gz1.y);
367
+ vec3 g011 = vec3(gx1.z,gy1.z,gz1.z);
368
+ vec3 g111 = vec3(gx1.w,gy1.w,gz1.w);
369
+
370
+ vec4 norm0 = taylorInvSqrt(vec4(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110)));
371
+ g000 *= norm0.x;
372
+ g010 *= norm0.y;
373
+ g100 *= norm0.z;
374
+ g110 *= norm0.w;
375
+ vec4 norm1 = taylorInvSqrt(vec4(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111)));
376
+ g001 *= norm1.x;
377
+ g011 *= norm1.y;
378
+ g101 *= norm1.z;
379
+ g111 *= norm1.w;
380
+
381
+ float n000 = dot(g000, Pf0);
382
+ float n100 = dot(g100, vec3(Pf1.x, Pf0.yz));
383
+ float n010 = dot(g010, vec3(Pf0.x, Pf1.y, Pf0.z));
384
+ float n110 = dot(g110, vec3(Pf1.xy, Pf0.z));
385
+ float n001 = dot(g001, vec3(Pf0.xy, Pf1.z));
386
+ float n101 = dot(g101, vec3(Pf1.x, Pf0.y, Pf1.z));
387
+ float n011 = dot(g011, vec3(Pf0.x, Pf1.yz));
388
+ float n111 = dot(g111, Pf1);
389
+
390
+ vec3 fade_xyz = fade(Pf0);
391
+ vec4 n_z = mix(vec4(n000, n100, n010, n110), vec4(n001, n101, n011, n111), fade_xyz.z);
392
+ vec2 n_yz = mix(n_z.xy, n_z.zw, fade_xyz.y);
393
+ float n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x);
394
+ return 2.2 * n_xyz;
395
+ }
396
+ `;
397
+ }
398
+ export function buildColorFunctions() {
399
+ return `
400
+ vec3 saturation(vec3 rgb, float adjustment) {
401
+ const vec3 W = vec3(0.2125, 0.7154, 0.0721);
402
+ vec3 intensity = vec3(dot(rgb, W));
403
+ return mix(intensity, rgb, adjustment);
404
+ }
405
+ `;
406
+ }
407
+ //# sourceMappingURL=shaders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shaders.js","sourceRoot":"","sources":["../src/shaders.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+EjC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgFnC,CAAC;AAEF,MAAM,UAAU,iBAAiB;IAC7B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4CV,CAAC;AACF,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC7B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BV,CAAC;AACF,CAAC;AAED,MAAM,UAAU,UAAU;IACtB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwJV,CAAC;AACF,CAAC;AAED,MAAM,UAAU,mBAAmB;IAC/B,OAAO;;;;;;CAMV,CAAC;AACF,CAAC"}
@@ -0,0 +1,52 @@
1
+ export type NeatConfig = {
2
+ resolution?: number;
3
+ speed?: number;
4
+ horizontalPressure?: number;
5
+ verticalPressure?: number;
6
+ waveFrequencyX?: number;
7
+ waveFrequencyY?: number;
8
+ waveAmplitude?: number;
9
+ highlights?: number;
10
+ shadows?: number;
11
+ colorSaturation?: number;
12
+ colorBrightness?: number;
13
+ colors: NeatColor[];
14
+ colorBlending?: number;
15
+ grainScale?: number;
16
+ grainIntensity?: number;
17
+ grainSparsity?: number;
18
+ grainSpeed?: number;
19
+ wireframe?: boolean;
20
+ backgroundColor?: string;
21
+ backgroundAlpha?: number;
22
+ yOffset?: number;
23
+ yOffsetWaveMultiplier?: number;
24
+ yOffsetColorMultiplier?: number;
25
+ yOffsetFlowMultiplier?: number;
26
+ flowDistortionA?: number;
27
+ flowDistortionB?: number;
28
+ flowScale?: number;
29
+ flowEase?: number;
30
+ flowEnabled?: boolean;
31
+ enableProceduralTexture?: boolean;
32
+ textureVoidLikelihood?: number;
33
+ textureVoidWidthMin?: number;
34
+ textureVoidWidthMax?: number;
35
+ textureBandDensity?: number;
36
+ textureColorBlending?: number;
37
+ textureSeed?: number;
38
+ textureEase?: number;
39
+ proceduralBackgroundColor?: string;
40
+ textureShapeTriangles?: number;
41
+ textureShapeCircles?: number;
42
+ textureShapeBars?: number;
43
+ textureShapeSquiggles?: number;
44
+ };
45
+ export type NeatColor = {
46
+ color: string;
47
+ enabled: boolean;
48
+ influence?: number;
49
+ };
50
+ export type NeatController = {
51
+ destroy: () => void;
52
+ };
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
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.1",
5
+ "version": "0.7.0",
6
6
  "main": "./dist/index.umd.js",
7
7
  "module": "./dist/index.es.js",
8
8
  "types": "dist/index.d.ts",
@@ -11,11 +11,7 @@
11
11
  "dist",
12
12
  "src"
13
13
  ],
14
- "peerDependencies": {
15
- "three": "^0.182.0"
16
- },
17
14
  "devDependencies": {
18
- "three": "^0.182.0",
19
15
  "typescript": "^4.8.4",
20
16
  "vite": "^3.1.4"
21
17
  },
@@ -40,13 +36,13 @@
40
36
  "url": "git+https://github.com/FireCMSco/neat.git"
41
37
  },
42
38
  "keywords": [
43
- "threejs",
39
+ "webgl",
44
40
  "3d",
45
41
  "gradient",
46
42
  "background"
47
43
  ],
48
44
  "author": "Francesco Gatti",
49
- "license": "ISC",
45
+ "license": "MIT AND Commons-Clause",
50
46
  "bugs": {
51
47
  "url": "https://github.com/FireCMSco/neat/issues"
52
48
  },