@3driseai/3drise-viewer 0.1.16 → 0.1.18

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.
Files changed (145) hide show
  1. package/README.md +4 -3
  2. package/dist/components/ChladniGrid.d.ts +15 -0
  3. package/dist/components/ChladniGrid.d.ts.map +1 -0
  4. package/dist/components/ChladniGrid.js +62 -0
  5. package/dist/components/CustomPrimitive.d.ts +2 -0
  6. package/dist/components/CustomPrimitive.d.ts.map +1 -1
  7. package/dist/components/CustomPrimitive.js +2 -2
  8. package/dist/components/EffectsGenerator.d.ts.map +1 -1
  9. package/dist/components/EffectsGenerator.js +26 -2
  10. package/dist/components/FlowNetGrid.d.ts +15 -0
  11. package/dist/components/FlowNetGrid.d.ts.map +1 -0
  12. package/dist/components/FlowNetGrid.js +61 -0
  13. package/dist/components/Galaxy.d.ts.map +1 -1
  14. package/dist/components/Galaxy.js +2 -0
  15. package/dist/components/GirihGrid.d.ts +15 -0
  16. package/dist/components/GirihGrid.d.ts.map +1 -0
  17. package/dist/components/GirihGrid.js +62 -0
  18. package/dist/components/GravWaveGrid.d.ts +15 -0
  19. package/dist/components/GravWaveGrid.d.ts.map +1 -0
  20. package/dist/components/GravWaveGrid.js +62 -0
  21. package/dist/components/GridsGenerator.d.ts +2 -2
  22. package/dist/components/GridsGenerator.d.ts.map +1 -1
  23. package/dist/components/GridsGenerator.js +21 -0
  24. package/dist/components/HyperbolicGrid.d.ts +15 -0
  25. package/dist/components/HyperbolicGrid.d.ts.map +1 -0
  26. package/dist/components/HyperbolicGrid.js +61 -0
  27. package/dist/components/LayoutInstances.d.ts +13 -0
  28. package/dist/components/LayoutInstances.d.ts.map +1 -0
  29. package/dist/components/LayoutInstances.js +39 -0
  30. package/dist/components/ModelPrimitive.d.ts +2 -0
  31. package/dist/components/ModelPrimitive.d.ts.map +1 -1
  32. package/dist/components/ModelPrimitive.js +3 -3
  33. package/dist/components/ObjectNode.d.ts.map +1 -1
  34. package/dist/components/ObjectNode.js +44 -9
  35. package/dist/components/ParticlesGenerator.d.ts +10 -0
  36. package/dist/components/ParticlesGenerator.d.ts.map +1 -0
  37. package/dist/components/ParticlesGenerator.js +23 -0
  38. package/dist/components/ReactionDiffusionGrid.d.ts +15 -0
  39. package/dist/components/ReactionDiffusionGrid.d.ts.map +1 -0
  40. package/dist/components/ReactionDiffusionGrid.js +376 -0
  41. package/dist/components/WallpaperGrid.d.ts +15 -0
  42. package/dist/components/WallpaperGrid.d.ts.map +1 -0
  43. package/dist/components/WallpaperGrid.js +555 -0
  44. package/dist/components/cursor/CursorController.d.ts.map +1 -1
  45. package/dist/components/effects/BlackHoleEffect.d.ts +3 -3
  46. package/dist/components/effects/BlackHoleEffect.d.ts.map +1 -1
  47. package/dist/components/effects/BlackHoleEffect.js +293 -163
  48. package/dist/components/effects/DandelionSeedsEffect.d.ts +13 -0
  49. package/dist/components/effects/DandelionSeedsEffect.d.ts.map +1 -0
  50. package/dist/components/effects/DandelionSeedsEffect.js +510 -0
  51. package/dist/components/effects/FallingLeavesEffect.d.ts +13 -0
  52. package/dist/components/effects/FallingLeavesEffect.d.ts.map +1 -0
  53. package/dist/components/effects/FallingLeavesEffect.js +446 -0
  54. package/dist/components/effects/FieldLinesEffect.d.ts +11 -0
  55. package/dist/components/effects/FieldLinesEffect.d.ts.map +1 -0
  56. package/dist/components/effects/FieldLinesEffect.js +260 -0
  57. package/dist/components/effects/FireflySwarmEffect.d.ts +13 -0
  58. package/dist/components/effects/FireflySwarmEffect.d.ts.map +1 -0
  59. package/dist/components/effects/FireflySwarmEffect.js +408 -0
  60. package/dist/components/effects/GalaxyEffect.d.ts +13 -0
  61. package/dist/components/effects/GalaxyEffect.d.ts.map +1 -0
  62. package/dist/components/effects/GalaxyEffect.js +374 -0
  63. package/dist/components/effects/HarmonicShellEffect.d.ts +11 -0
  64. package/dist/components/effects/HarmonicShellEffect.d.ts.map +1 -0
  65. package/dist/components/effects/HarmonicShellEffect.js +209 -0
  66. package/dist/components/effects/IceCrystalsEffect.d.ts +3 -3
  67. package/dist/components/effects/IceCrystalsEffect.d.ts.map +1 -1
  68. package/dist/components/effects/IceCrystalsEffect.js +286 -166
  69. package/dist/components/effects/IceHaloEffect.d.ts +13 -0
  70. package/dist/components/effects/IceHaloEffect.d.ts.map +1 -0
  71. package/dist/components/effects/IceHaloEffect.js +306 -0
  72. package/dist/components/effects/LichtenbergEffect.d.ts +13 -0
  73. package/dist/components/effects/LichtenbergEffect.d.ts.map +1 -0
  74. package/dist/components/effects/LichtenbergEffect.js +517 -0
  75. package/dist/components/effects/MoleculesEffect.d.ts +3 -3
  76. package/dist/components/effects/MoleculesEffect.d.ts.map +1 -1
  77. package/dist/components/effects/MoleculesEffect.js +322 -164
  78. package/dist/components/effects/MurmurationEffect.d.ts +13 -0
  79. package/dist/components/effects/MurmurationEffect.d.ts.map +1 -0
  80. package/dist/components/effects/MurmurationEffect.js +539 -0
  81. package/dist/components/effects/PlanetaryRingsEffect.d.ts +13 -0
  82. package/dist/components/effects/PlanetaryRingsEffect.d.ts.map +1 -0
  83. package/dist/components/effects/PlanetaryRingsEffect.js +458 -0
  84. package/dist/components/effects/PortalEffect.d.ts +3 -3
  85. package/dist/components/effects/PortalEffect.d.ts.map +1 -1
  86. package/dist/components/effects/PortalEffect.js +240 -163
  87. package/dist/components/effects/ShockwaveEffect.d.ts +5 -3
  88. package/dist/components/effects/ShockwaveEffect.d.ts.map +1 -1
  89. package/dist/components/effects/ShockwaveEffect.js +538 -142
  90. package/dist/components/effects/SmokePlumeEffect.d.ts +3 -3
  91. package/dist/components/effects/SmokePlumeEffect.d.ts.map +1 -1
  92. package/dist/components/effects/SmokePlumeEffect.js +180 -116
  93. package/dist/components/effects/SmokeRingEffect.d.ts +3 -3
  94. package/dist/components/effects/SmokeRingEffect.d.ts.map +1 -1
  95. package/dist/components/effects/SmokeRingEffect.js +260 -135
  96. package/dist/components/effects/StrangeAttractorEffect.d.ts +11 -0
  97. package/dist/components/effects/StrangeAttractorEffect.d.ts.map +1 -0
  98. package/dist/components/effects/StrangeAttractorEffect.js +229 -0
  99. package/dist/components/effects/VolumetricFogEffect.d.ts +5 -3
  100. package/dist/components/effects/VolumetricFogEffect.d.ts.map +1 -1
  101. package/dist/components/effects/VolumetricFogEffect.js +211 -93
  102. package/dist/components/effects/WaterCausticsEffect.d.ts +13 -0
  103. package/dist/components/effects/WaterCausticsEffect.d.ts.map +1 -0
  104. package/dist/components/effects/WaterCausticsEffect.js +308 -0
  105. package/dist/components/effects/index.d.ts +9 -0
  106. package/dist/components/effects/index.d.ts.map +1 -1
  107. package/dist/components/effects/index.js +9 -0
  108. package/dist/components/index.d.ts +19 -0
  109. package/dist/components/index.d.ts.map +1 -1
  110. package/dist/components/index.js +10 -0
  111. package/dist/components/particles/BioluminescentWakeParticles.d.ts +12 -0
  112. package/dist/components/particles/BioluminescentWakeParticles.d.ts.map +1 -0
  113. package/dist/components/particles/BioluminescentWakeParticles.js +1123 -0
  114. package/dist/components/particles/BrownianDustParticles.d.ts +12 -0
  115. package/dist/components/particles/BrownianDustParticles.d.ts.map +1 -0
  116. package/dist/components/particles/BrownianDustParticles.js +757 -0
  117. package/dist/components/particles/ElectronOrbitalsParticles.d.ts +12 -0
  118. package/dist/components/particles/ElectronOrbitalsParticles.d.ts.map +1 -0
  119. package/dist/components/particles/ElectronOrbitalsParticles.js +944 -0
  120. package/dist/components/particles/GrinderSparksParticles.d.ts +12 -0
  121. package/dist/components/particles/GrinderSparksParticles.d.ts.map +1 -0
  122. package/dist/components/particles/GrinderSparksParticles.js +744 -0
  123. package/dist/components/particles/TidalStreamParticles.d.ts +12 -0
  124. package/dist/components/particles/TidalStreamParticles.d.ts.map +1 -0
  125. package/dist/components/particles/TidalStreamParticles.js +788 -0
  126. package/dist/components/particles/index.d.ts +11 -0
  127. package/dist/components/particles/index.d.ts.map +1 -0
  128. package/dist/components/particles/index.js +6 -0
  129. package/dist/constants.d.ts +1 -1
  130. package/dist/constants.d.ts.map +1 -1
  131. package/dist/constants.js +1 -1
  132. package/dist/hooks/useModelObject.d.ts +6 -1
  133. package/dist/hooks/useModelObject.d.ts.map +1 -1
  134. package/dist/hooks/useModelObject.js +19 -6
  135. package/dist/types/gridConfigs.d.ts +98 -0
  136. package/dist/types/gridConfigs.d.ts.map +1 -1
  137. package/dist/types/index.d.ts +1 -1
  138. package/dist/types/index.d.ts.map +1 -1
  139. package/dist/utils/particleTrails.d.ts +70 -0
  140. package/dist/utils/particleTrails.d.ts.map +1 -0
  141. package/dist/utils/particleTrails.js +369 -0
  142. package/dist/utils/pointerField.d.ts +28 -0
  143. package/dist/utils/pointerField.d.ts.map +1 -0
  144. package/dist/utils/pointerField.js +103 -0
  145. package/package.json +2 -2
@@ -0,0 +1,376 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useMemo, useRef } from 'react';
3
+ import * as THREE from 'three';
4
+ import { useFrame } from '@react-three/fiber';
5
+ import { useObjectReady } from '../hooks/useObjectReady.js';
6
+ import { useGridSurface } from '../hooks/useGridSurface.js';
7
+ import { ReactionDiffusionGridMaterial } from '@3driseai/3drise-core';
8
+ // Side-effect import registers <reactionDiffusionGridMaterial> via extend().
9
+ void ReactionDiffusionGridMaterial;
10
+ /** ReactionDiffusionGridConfig defaults. Must match the catalog entry in grid-defaults.json exactly. */
11
+ export const defaultReactionDiffusionGridConfig = {
12
+ cellSize: 3,
13
+ size: 50,
14
+ flat: true,
15
+ segments: undefined,
16
+ lineMode: 0,
17
+ cellMode: 0,
18
+ lineWidth: 1.1,
19
+ sectionSize: 5,
20
+ sectionWidth: 1.2,
21
+ animSpeed: 1,
22
+ animScale: 0.5,
23
+ animIntensity: 0.6,
24
+ fadeDistance: undefined,
25
+ fadeStrength: 0.7,
26
+ displace: 0,
27
+ feed: 0.037,
28
+ kill: 0.06,
29
+ variation: 0.55,
30
+ tileCells: 7,
31
+ lineColor: '#7ff0d4',
32
+ sectionColor: '#f0a26a',
33
+ cellColor: '#0d4b52',
34
+ glowColor: '#2fd9c8',
35
+ bgColor: '#03080a',
36
+ bgOpacity: 0,
37
+ followMouse: false,
38
+ reveal: 1,
39
+ revealDuration: 0,
40
+ };
41
+ const gridFragHeader = /* glsl */ `
42
+ precision highp float;
43
+
44
+ uniform float u_time;
45
+ uniform float u_cellSize;
46
+ uniform float u_lineWidth;
47
+ uniform float u_sectionSize;
48
+ uniform float u_sectionWidth;
49
+ uniform vec3 u_lineColor;
50
+ uniform vec3 u_sectionColor;
51
+ uniform vec3 u_cellColor;
52
+ uniform vec3 u_glowColor;
53
+ uniform vec3 u_bgColor;
54
+ uniform float u_bgOpacity;
55
+ uniform float u_lineMode;
56
+ uniform float u_cellMode;
57
+ uniform float u_animSpeed;
58
+ uniform float u_animScale;
59
+ uniform float u_animIntensity;
60
+ uniform float u_fadeDistance;
61
+ uniform float u_fadeStrength;
62
+ uniform vec2 u_focus;
63
+ uniform float u_reveal;
64
+
65
+ varying vec2 vGridPos;
66
+
67
+ float lineAt(float c, float width, float fp){
68
+ float d = abs(fract(c - 0.5) - 0.5);
69
+ return 1.0 - clamp(d / max(fp * max(width, 0.05), 1e-6), 0.0, 1.0);
70
+ }
71
+ `;
72
+ const gridCommon = /* glsl */ `
73
+ const float PI = 3.14159265359;
74
+ const float TAU = 6.28318530718;
75
+
76
+ float hash21(vec2 p){
77
+ p = fract(p * vec2(123.34, 456.21));
78
+ p += dot(p, p + 45.32);
79
+ return fract(p.x * p.y);
80
+ }
81
+ `;
82
+ const gridTail = /* glsl */ `
83
+ // ---- line animation --------------------------------------------------
84
+ float lineAnim = 1.0;
85
+ if (u_lineMode > 0.5){
86
+ if (u_lineMode < 1.5){
87
+ lineAnim = 0.5 + 0.5 * sin(cellDist * u_animScale - t);
88
+ } else if (u_lineMode < 2.5){
89
+ lineAnim = 0.5 + 0.5 * sin(flowCoord * u_animScale - t);
90
+ } else if (u_lineMode < 3.5){
91
+ float s = fract(scanCoord * 0.05 * u_animScale - t * 0.15);
92
+ lineAnim = 0.25 + smoothstep(0.0, 0.15, s) * (1.0 - smoothstep(0.15, 0.35, s));
93
+ } else {
94
+ lineAnim = 0.5 + 0.5 * sin(t);
95
+ }
96
+ }
97
+ lineAnim = mix(1.0, lineAnim, u_animIntensity);
98
+
99
+ // ---- cell fill -------------------------------------------------------
100
+ float cell = 0.0;
101
+ if (u_cellMode > 0.5){
102
+ if (u_cellMode < 1.5){
103
+ cell = 0.5 + 0.5 * sin(flowCoord * 0.5 * u_animScale - t);
104
+ } else if (u_cellMode < 2.5){
105
+ cell = 0.5 + 0.5 * sin(t * (0.6 + cellH) + cellH * TAU);
106
+ } else if (u_cellMode < 3.5){
107
+ cell = smoothstep(0.6, 1.0, sin(cellDist * u_animScale - t));
108
+ } else {
109
+ cell = step(0.5, cellH) * (0.5 + 0.5 * sin(t));
110
+ }
111
+ }
112
+ cell *= u_animIntensity * edgeKeep;
113
+
114
+ float tone = step(0.55, cellH);
115
+
116
+ vec3 col = u_bgColor * u_bgOpacity;
117
+ float a = u_bgOpacity;
118
+
119
+ col += mix(u_cellColor, u_cellColor * 2.2, tone) * cell;
120
+ a = max(a, cell * 0.9);
121
+ float linesI = lines * lineAnim;
122
+ col += u_lineColor * linesI; a = max(a, linesI);
123
+ float accentI = accent * lineAnim;
124
+ col += u_sectionColor * accentI; a = max(a, accentI);
125
+ col += u_glowColor * (linesI * 0.2 + cell * 0.35) * u_animIntensity;
126
+
127
+ col = col * regionMask + extraCol;
128
+ a = max(a * regionMask, extraA);
129
+
130
+ float fade = 1.0 - smoothstep(1.0 - u_fadeStrength, 1.0, fadeR);
131
+ col *= fade;
132
+ a *= fade;
133
+
134
+ // ---- reveal ----------------------------------------------------------
135
+ // The build boundary sweeps outward from the focus point with a bright
136
+ // leading edge, so the grid reads as assembling itself.
137
+ if (u_reveal < 0.999){
138
+ float rd = length(vGridPos - u_focus) / max(u_fadeDistance, 1e-4);
139
+ float edge = u_reveal * 1.1;
140
+ float mask = 1.0 - smoothstep(edge - 0.05, edge, rd);
141
+ float front = mask * smoothstep(edge - 0.22, edge - 0.05, rd);
142
+ col = col * mask + u_glowColor * front * (a * 1.8 + 0.08);
143
+ a = max(a * mask, front * 0.10);
144
+ }
145
+
146
+ if (a < 0.002) discard;
147
+ gl_FragColor = vec4(col, a);
148
+ }
149
+ `;
150
+ const gridVertexHead = /* glsl */ `
151
+ uniform float u_time;
152
+ uniform float u_cellSize;
153
+ uniform float u_displace;
154
+ uniform float u_animSpeed;
155
+ uniform float u_animScale;
156
+
157
+ varying vec2 vGridPos;
158
+ `;
159
+ // ---------------------------------------------------------------------------
160
+ // Gray-Scott reaction-diffusion. Two chemicals diffuse at different rates and
161
+ // react as u + 2v -> 3v: the autocatalyst v eats u, u is fed in at rate F and
162
+ // v is removed at rate F + k. Because v diffuses at half the rate of u, an even
163
+ // mixture is unstable (Turing instability) and the field breaks into fronts
164
+ // that grow, split and heal. F and k pick the morphology: coral and labyrinths
165
+ // near (0.037, 0.060), dividing spots near (0.030, 0.057), stable dots higher.
166
+ // The simulation runs on a 256^2 float texture with periodic boundaries, so it
167
+ // tiles seamlessly, and the plane just samples it.
168
+ // ---------------------------------------------------------------------------
169
+ const SIM_SIZE = 256;
170
+ const fsVert = /* glsl */ `
171
+ varying vec2 vUv;
172
+ void main(){
173
+ vUv = uv;
174
+ gl_Position = vec4(position.xy, 0.0, 1.0);
175
+ }
176
+ `;
177
+ const simFrag = /* glsl */ `
178
+ precision highp float;
179
+ uniform sampler2D u_state;
180
+ uniform vec2 u_texel;
181
+ uniform float u_feed;
182
+ uniform float u_kill;
183
+ uniform float u_variation;
184
+ uniform float u_age;
185
+ varying vec2 vUv;
186
+
187
+ void main(){
188
+ vec2 e = u_texel;
189
+ vec4 c = texture2D(u_state, vUv);
190
+ // 9-point laplacian (0.2 orthogonal, 0.05 diagonal), wrapped by the texture
191
+ vec2 lap =
192
+ (texture2D(u_state, vUv + vec2( e.x, 0.0)).rg
193
+ + texture2D(u_state, vUv + vec2(-e.x, 0.0)).rg
194
+ + texture2D(u_state, vUv + vec2( 0.0, e.y)).rg
195
+ + texture2D(u_state, vUv + vec2( 0.0,-e.y)).rg) * 0.2
196
+ + (texture2D(u_state, vUv + vec2( e.x, e.y)).rg
197
+ + texture2D(u_state, vUv + vec2(-e.x, e.y)).rg
198
+ + texture2D(u_state, vUv + vec2( e.x,-e.y)).rg
199
+ + texture2D(u_state, vUv + vec2(-e.x,-e.y)).rg) * 0.05
200
+ - c.rg;
201
+
202
+ // F and k drift smoothly across the tile; both modulations are periodic in
203
+ // uv, so the torus still matches itself at the seam.
204
+ float sx = sin(6.2831853 * vUv.x);
205
+ float sy = sin(6.2831853 * vUv.y);
206
+ float cx = cos(6.2831853 * vUv.x);
207
+ float cy = cos(6.2831853 * vUv.y);
208
+ float F = u_feed + u_variation * 0.009 * (sx * cy) + 0.0006 * sin(u_age * 0.031);
209
+ float K = u_kill + u_variation * 0.004 * (cx * sy) + 0.0003 * cos(u_age * 0.023);
210
+
211
+ float uv2 = c.r * c.g * c.g;
212
+ float nu = c.r + (1.0 * lap.x - uv2 + F * (1.0 - c.r));
213
+ float nv = c.g + (0.5 * lap.y + uv2 - (F + K) * c.g);
214
+ gl_FragColor = vec4(clamp(nu, 0.0, 1.0), clamp(nv, 0.0, 1.0), 0.0, 1.0);
215
+ }
216
+ `;
217
+ const seedFrag = /* glsl */ `
218
+ precision highp float;
219
+ uniform float u_spots;
220
+ varying vec2 vUv;
221
+
222
+ float hash21s(vec2 p){
223
+ p = fract(p * vec2(123.34, 456.21));
224
+ p += dot(p, p + 45.32);
225
+ return fract(p.x * p.y);
226
+ }
227
+
228
+ void main(){
229
+ // a scatter of seeded blobs; everything else is pure substrate
230
+ vec2 g = vUv * 9.0;
231
+ vec2 id = floor(g);
232
+ vec2 f = fract(g) - 0.5;
233
+ float h = hash21s(id + 3.7);
234
+ vec2 off = (vec2(hash21s(id + 1.3), hash21s(id + 7.1)) - 0.5) * 0.5;
235
+ float d = length(f - off);
236
+ float blob = step(h, u_spots) * (1.0 - smoothstep(0.10, 0.22, d));
237
+ gl_FragColor = vec4(1.0 - 0.5 * blob, 0.25 * blob, 0.0, 1.0);
238
+ }
239
+ `;
240
+ function createExtraUniforms() {
241
+ return {
242
+ u_field: { value: null },
243
+ u_tileCells: { value: 7 },
244
+ };
245
+ }
246
+ /** The simulation: two half-float targets ping-ponged through the Gray-Scott step. */
247
+ function createRuntime(u, renderer, c) {
248
+ const targetOptions = {
249
+ type: THREE.HalfFloatType,
250
+ format: THREE.RGBAFormat,
251
+ minFilter: THREE.LinearFilter,
252
+ magFilter: THREE.LinearFilter,
253
+ wrapS: THREE.RepeatWrapping,
254
+ wrapT: THREE.RepeatWrapping,
255
+ depthBuffer: false,
256
+ stencilBuffer: false,
257
+ generateMipmaps: false,
258
+ };
259
+ const simMaterial = new THREE.ShaderMaterial({
260
+ vertexShader: fsVert,
261
+ fragmentShader: simFrag,
262
+ uniforms: {
263
+ u_state: { value: null },
264
+ u_texel: { value: new THREE.Vector2(1 / SIM_SIZE, 1 / SIM_SIZE) },
265
+ u_feed: { value: 0.037 },
266
+ u_kill: { value: 0.06 },
267
+ u_variation: { value: 0.55 },
268
+ u_age: { value: 0 },
269
+ },
270
+ depthTest: false,
271
+ depthWrite: false,
272
+ });
273
+ const seedMaterial = new THREE.ShaderMaterial({
274
+ vertexShader: fsVert,
275
+ fragmentShader: seedFrag,
276
+ uniforms: { u_spots: { value: 0.3 } },
277
+ depthTest: false,
278
+ depthWrite: false,
279
+ });
280
+ const quadGeometry = new THREE.PlaneGeometry(2, 2);
281
+ const quad = new THREE.Mesh(quadGeometry, simMaterial);
282
+ quad.frustumCulled = false;
283
+ const scene = new THREE.Scene();
284
+ scene.add(quad);
285
+ return {
286
+ read: new THREE.WebGLRenderTarget(SIM_SIZE, SIM_SIZE, targetOptions),
287
+ write: new THREE.WebGLRenderTarget(SIM_SIZE, SIM_SIZE, targetOptions),
288
+ scene: scene,
289
+ camera: new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1),
290
+ quad: quad,
291
+ quadGeometry: quadGeometry,
292
+ simMaterial: simMaterial,
293
+ seedMaterial: seedMaterial,
294
+ seeded: false,
295
+ age: 0,
296
+ carry: 0,
297
+ };
298
+ }
299
+ function updateRuntime(rt, u, c, dt, renderer) {
300
+ const previousTarget = renderer.getRenderTarget();
301
+ if (!rt.seeded) {
302
+ rt.quad.material = rt.seedMaterial;
303
+ renderer.setRenderTarget(rt.read);
304
+ renderer.render(rt.scene, rt.camera);
305
+ rt.quad.material = rt.simMaterial;
306
+ rt.seeded = true;
307
+ }
308
+ const sim = rt.simMaterial.uniforms;
309
+ sim.u_feed.value = u.u_feed.value;
310
+ sim.u_kill.value = u.u_kill.value;
311
+ sim.u_variation.value = u.u_variation.value;
312
+ // fixed step count per second so the pattern grows at the same rate on any machine
313
+ rt.carry += Math.min(dt, 0.1) * 240 * Math.max(u.u_animSpeed.value, 0);
314
+ let steps = Math.floor(rt.carry);
315
+ rt.carry -= steps;
316
+ if (steps > 16)
317
+ steps = 16;
318
+ for (let i = 0; i < steps; i++) {
319
+ rt.age += 1;
320
+ sim.u_age.value = rt.age;
321
+ sim.u_state.value = rt.read.texture;
322
+ renderer.setRenderTarget(rt.write);
323
+ renderer.render(rt.scene, rt.camera);
324
+ const swap = rt.read;
325
+ rt.read = rt.write;
326
+ rt.write = swap;
327
+ }
328
+ renderer.setRenderTarget(previousTarget);
329
+ u.u_field.value = rt.read.texture;
330
+ }
331
+ function disposeRuntime(rt) {
332
+ rt.read.dispose();
333
+ rt.write.dispose();
334
+ rt.quadGeometry.dispose();
335
+ rt.simMaterial.dispose();
336
+ rt.seedMaterial.dispose();
337
+ }
338
+ /**
339
+ * A Gray-Scott reaction-diffusion field simulated on the GPU and sampled by the plane: coral, labyrinths and dividing spots grow, merge and keep evolving, wrapped seamlessly as a torus.
340
+ */
341
+ export function ReactionDiffusionGrid({ config = defaultReactionDiffusionGridConfig, groupProps, onObjectReady, onObjectDispose }) {
342
+ const matRef = useRef(null);
343
+ const rootRef = useRef(null);
344
+ const meshRef = useRef(null);
345
+ useObjectReady(rootRef, config, onObjectReady, onObjectDispose);
346
+ const { cellSize, size, segments, flat, lineMode, cellMode, lineWidth, sectionSize, sectionWidth, animSpeed, animScale, animIntensity, fadeDistance, fadeStrength, displace, feed, kill, variation, tileCells, lineColor, sectionColor, cellColor, glowColor, bgColor, bgOpacity, followMouse, reveal, revealDuration, } = config;
347
+ // the relief follows the pattern itself, which is a few texels wide
348
+ const segs = segments ?? (displace > 0 ? Math.min(512, Math.max(128, Math.ceil(size / Math.max(cellSize, 1e-4)) * 12)) : 1);
349
+ const fade = fadeDistance ?? size * 0.5;
350
+ const colors = useMemo(() => ({
351
+ line: new THREE.Color(lineColor),
352
+ section: new THREE.Color(sectionColor),
353
+ cell: new THREE.Color(cellColor),
354
+ glow: new THREE.Color(glowColor),
355
+ bg: new THREE.Color(bgColor),
356
+ }), [lineColor, sectionColor, cellColor, glowColor, bgColor]);
357
+ useGridSurface(matRef, meshRef, { followMouse, reveal, revealDuration });
358
+ // the simulation behind this grid: created on mount, stepped every frame
359
+ const runtimeRef = useRef(null);
360
+ useFrame((state, delta) => {
361
+ const mat = matRef.current;
362
+ if (!mat)
363
+ return;
364
+ if (!runtimeRef.current)
365
+ runtimeRef.current = createRuntime(mat.uniforms, state.gl, config);
366
+ updateRuntime(runtimeRef.current, mat.uniforms, config, Math.min(delta, 0.1), state.gl);
367
+ });
368
+ useEffect(() => () => {
369
+ if (runtimeRef.current) {
370
+ disposeRuntime(runtimeRef.current);
371
+ runtimeRef.current = null;
372
+ }
373
+ }, []);
374
+ return (_jsx("group", { ref: rootRef, ...groupProps, children: _jsxs("mesh", { ref: meshRef, rotation: flat ? [-Math.PI / 2, 0, 0] : [0, 0, 0], children: [_jsx("planeGeometry", { args: [size, size, segs, segs] }), _jsx("reactionDiffusionGridMaterial", { ref: matRef, transparent: true, depthWrite: false, blending: THREE.AdditiveBlending, side: THREE.DoubleSide, u_cellSize: cellSize, u_lineWidth: lineWidth, u_sectionSize: sectionSize, u_sectionWidth: sectionWidth, u_lineMode: lineMode, u_cellMode: cellMode, u_animSpeed: animSpeed, u_animScale: animScale, u_animIntensity: animIntensity, u_fadeDistance: fade, u_fadeStrength: fadeStrength, u_displace: displace, u_feed: feed, u_kill: kill, u_variation: variation, u_tileCells: tileCells, u_lineColor: colors.line, u_sectionColor: colors.section, u_cellColor: colors.cell, u_glowColor: colors.glow, u_bgColor: colors.bg, u_bgOpacity: bgOpacity }, ReactionDiffusionGridMaterial.key)] }) }));
375
+ }
376
+ export default ReactionDiffusionGrid;
@@ -0,0 +1,15 @@
1
+ import type { ThreeElements } from '@react-three/fiber';
2
+ import type { ObjectReadyProps } from '../types/objectReady';
3
+ import type { WallpaperGridConfig } from '../types/gridConfigs';
4
+ export interface WallpaperGridProps extends ObjectReadyProps {
5
+ config?: WallpaperGridConfig;
6
+ groupProps?: ThreeElements['group'];
7
+ }
8
+ /** WallpaperGridConfig defaults. Must match the catalog entry in grid-defaults.json exactly. */
9
+ export declare const defaultWallpaperGridConfig: WallpaperGridConfig;
10
+ /**
11
+ * Wallpaper-group kaleidoscope: a drifting lattice-periodic Fourier motif summed over the coset representatives of one of the 17 plane crystallographic groups. The runtime builds the group tables and crossfades from group to group.
12
+ */
13
+ export declare function WallpaperGrid({ config, groupProps, onObjectReady, onObjectDispose }: WallpaperGridProps): import("react").JSX.Element;
14
+ export default WallpaperGrid;
15
+ //# sourceMappingURL=WallpaperGrid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WallpaperGrid.d.ts","sourceRoot":"","sources":["../../src/components/WallpaperGrid.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAKxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAGhE,MAAM,WAAW,kBAAmB,SAAQ,gBAAgB;IACxD,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,UAAU,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;CACvC;AAKD,gGAAgG;AAChG,eAAO,MAAM,0BAA0B,EAAE,mBA6BxC,CAAC;AAocF;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,MAAmC,EAAE,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,EAAE,kBAAkB,+BAgFpI;AAED,eAAe,aAAa,CAAC"}