@3driseai/3drise-core 1.0.20 → 1.0.22
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/autoAnimate/composer.d.ts +6 -0
- package/dist/autoAnimate/composer.d.ts.map +1 -1
- package/dist/autoAnimate/composer.js +4 -3
- package/dist/autoAnimate/describeScene.js +1 -1
- package/dist/catalog/catalogInfo.d.ts +22 -0
- package/dist/catalog/catalogInfo.d.ts.map +1 -0
- package/dist/catalog/catalogInfo.js +204 -0
- package/dist/catalog/index.d.ts +3 -0
- package/dist/catalog/index.d.ts.map +1 -0
- package/dist/catalog/index.js +2 -0
- package/dist/catalog/objectCatalog.d.ts +33 -0
- package/dist/catalog/objectCatalog.d.ts.map +1 -0
- package/dist/catalog/objectCatalog.js +99 -0
- package/dist/data/allMaterials.js +2 -2
- package/dist/data/environmentDefaults.d.ts +10 -0
- package/dist/data/environmentDefaults.d.ts.map +1 -0
- package/dist/data/environmentDefaults.js +126 -0
- package/dist/data/gridsDefaults.d.ts +2 -0
- package/dist/data/gridsDefaults.d.ts.map +1 -1
- package/dist/data/gridsDefaults.js +186 -0
- package/dist/data/index.d.ts +4 -0
- package/dist/data/index.d.ts.map +1 -1
- package/dist/data/index.js +4 -0
- package/dist/data/landDefaults.d.ts +26 -0
- package/dist/data/landDefaults.d.ts.map +1 -0
- package/dist/data/landDefaults.js +76 -0
- package/dist/data/spaceDefaults.d.ts +10 -0
- package/dist/data/spaceDefaults.d.ts.map +1 -0
- package/dist/data/spaceDefaults.js +46 -0
- package/dist/data/textDefaults.d.ts +16 -0
- package/dist/data/textDefaults.d.ts.map +1 -0
- package/dist/data/textDefaults.js +199 -0
- package/dist/environment/oceanConfigs.d.ts +5 -4
- package/dist/environment/oceanConfigs.d.ts.map +1 -1
- package/dist/environment/oceanConfigs.js +2 -2
- package/dist/environment/terrainConfigs.d.ts +78 -0
- package/dist/environment/terrainConfigs.d.ts.map +1 -1
- package/dist/environment/terrainConfigs.js +72 -2
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/properties/registry.d.ts +10 -1
- package/dist/properties/registry.d.ts.map +1 -1
- package/dist/properties/registry.js +60 -9
- package/dist/properties/tables/environmentProperties.d.ts +9 -0
- package/dist/properties/tables/environmentProperties.d.ts.map +1 -0
- package/dist/properties/tables/environmentProperties.js +127 -0
- package/dist/properties/tables/gridProperties.d.ts.map +1 -1
- package/dist/properties/tables/gridProperties.js +184 -82
- package/dist/properties/tables/index.d.ts +4 -1
- package/dist/properties/tables/index.d.ts.map +1 -1
- package/dist/properties/tables/index.js +4 -1
- package/dist/properties/tables/landProperties.d.ts +5 -0
- package/dist/properties/tables/landProperties.d.ts.map +1 -0
- package/dist/properties/tables/landProperties.js +24 -0
- package/dist/properties/tables/lightProperties.js +1 -1
- package/dist/properties/tables/materialBounds.js +1 -1
- package/dist/properties/tables/optionalProperties.d.ts +1 -2
- package/dist/properties/tables/optionalProperties.d.ts.map +1 -1
- package/dist/properties/tables/optionalProperties.js +21 -0
- package/dist/properties/tables/spaceProperties.d.ts +8 -0
- package/dist/properties/tables/spaceProperties.d.ts.map +1 -0
- package/dist/properties/tables/spaceProperties.js +42 -0
- package/dist/properties/tables/textProperties.d.ts +4 -0
- package/dist/properties/tables/textProperties.d.ts.map +1 -0
- package/dist/properties/tables/textProperties.js +361 -0
- package/dist/properties/types.d.ts +1 -1
- package/dist/properties/types.d.ts.map +1 -1
- package/dist/services/MaterialRegistry.d.ts.map +1 -1
- package/dist/services/MaterialRegistry.js +2 -0
- package/dist/services/SkySystemManager.d.ts +22 -0
- package/dist/services/SkySystemManager.d.ts.map +1 -1
- package/dist/services/SkySystemManager.js +50 -18
- package/dist/services/TextureResolver.d.ts.map +1 -1
- package/dist/services/TextureResolver.js +22 -0
- package/dist/services/index.d.ts +1 -1
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +1 -1
- package/dist/shaders/ApollonianGridMaterial.d.ts +70 -0
- package/dist/shaders/ApollonianGridMaterial.d.ts.map +1 -0
- package/dist/shaders/ApollonianGridMaterial.js +289 -0
- package/dist/shaders/ConformalGridMaterial.d.ts +91 -0
- package/dist/shaders/ConformalGridMaterial.d.ts.map +1 -0
- package/dist/shaders/ConformalGridMaterial.js +335 -0
- package/dist/shaders/HilbertGridMaterial.d.ts +79 -0
- package/dist/shaders/HilbertGridMaterial.d.ts.map +1 -0
- package/dist/shaders/HilbertGridMaterial.js +329 -0
- package/dist/shaders/LensingGridMaterial.d.ts +73 -0
- package/dist/shaders/LensingGridMaterial.d.ts.map +1 -0
- package/dist/shaders/LensingGridMaterial.js +253 -0
- package/dist/shaders/ParastichyGridMaterial.d.ts +76 -0
- package/dist/shaders/ParastichyGridMaterial.d.ts.map +1 -0
- package/dist/shaders/ParastichyGridMaterial.js +282 -0
- package/dist/shaders/PhyllotaxisGridMaterial.d.ts +85 -0
- package/dist/shaders/PhyllotaxisGridMaterial.d.ts.map +1 -0
- package/dist/shaders/PhyllotaxisGridMaterial.js +532 -0
- package/dist/shaders/SkyboxMaterial.js +3 -3
- package/dist/shaders/StarsMaterial.d.ts +5 -0
- package/dist/shaders/StarsMaterial.d.ts.map +1 -1
- package/dist/shaders/StarsMaterial.js +59 -57
- package/dist/shaders/TruchetGridMaterial.d.ts +76 -0
- package/dist/shaders/TruchetGridMaterial.d.ts.map +1 -0
- package/dist/shaders/TruchetGridMaterial.js +290 -0
- package/dist/shaders/index.d.ts +7 -0
- package/dist/shaders/index.d.ts.map +1 -1
- package/dist/shaders/index.js +7 -0
- package/dist/types/actions.d.ts +6 -5
- package/dist/types/actions.d.ts.map +1 -1
- package/dist/types/commands.d.ts +61 -0
- package/dist/types/commands.d.ts.map +1 -0
- package/dist/types/commands.js +1 -0
- package/dist/types/environment.d.ts +34 -1
- package/dist/types/environment.d.ts.map +1 -1
- package/dist/types/environment.js +15 -0
- package/dist/types/environmentObjects.d.ts +152 -0
- package/dist/types/environmentObjects.d.ts.map +1 -0
- package/dist/types/environmentObjects.js +10 -0
- package/dist/types/index.d.ts +5 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/landObjects.d.ts +15 -0
- package/dist/types/landObjects.d.ts.map +1 -0
- package/dist/types/landObjects.js +1 -0
- package/dist/types/objectSettings.d.ts +187 -16
- package/dist/types/objectSettings.d.ts.map +1 -1
- package/dist/types/objectsConfigs.d.ts +0 -3
- package/dist/types/objectsConfigs.d.ts.map +1 -1
- package/dist/types/scene3d.d.ts +8 -5
- package/dist/types/scene3d.d.ts.map +1 -1
- package/dist/types/spaceObjects.d.ts +65 -0
- package/dist/types/spaceObjects.d.ts.map +1 -0
- package/dist/types/spaceObjects.js +11 -0
- package/dist/types/textObjects.d.ts +352 -0
- package/dist/types/textObjects.d.ts.map +1 -0
- package/dist/types/textObjects.js +14 -0
- package/dist/types/types.d.ts +3 -6
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/users.d.ts +3 -1
- package/dist/types/users.d.ts.map +1 -1
- package/dist/types/users.js +2 -0
- package/dist/ui/index.d.ts +5 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +4 -0
- package/dist/ui/uiBindings.d.ts +45 -0
- package/dist/ui/uiBindings.d.ts.map +1 -0
- package/dist/ui/uiBindings.js +172 -0
- package/dist/ui/uiKeys.d.ts +14 -0
- package/dist/ui/uiKeys.d.ts.map +1 -0
- package/dist/ui/uiKeys.js +22 -0
- package/dist/ui/uiSanitize.d.ts +18 -0
- package/dist/ui/uiSanitize.d.ts.map +1 -0
- package/dist/ui/uiSanitize.js +251 -0
- package/dist/ui/uiSpec.d.ts +116 -0
- package/dist/ui/uiSpec.d.ts.map +1 -0
- package/dist/ui/uiSpec.js +173 -0
- package/dist/utils/environmentMigration.d.ts +3 -0
- package/dist/utils/environmentMigration.d.ts.map +1 -0
- package/dist/utils/environmentMigration.js +50 -0
- package/dist/utils/generativeAnimatable.d.ts +1 -1
- package/dist/utils/generativeAnimatable.d.ts.map +1 -1
- package/dist/utils/generativeAnimatable.js +12 -0
- package/dist/utils/getAnimatableProperties.d.ts +1 -1
- package/dist/utils/getAnimatableProperties.d.ts.map +1 -1
- package/dist/utils/getAnimatableProperties.js +1 -1
- package/dist/utils/gridMigration.d.ts +3 -0
- package/dist/utils/gridMigration.d.ts.map +1 -0
- package/dist/utils/gridMigration.js +34 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +5 -0
- package/dist/utils/objectEffects.d.ts +24 -2
- package/dist/utils/objectEffects.d.ts.map +1 -1
- package/dist/utils/objectEffects.js +29 -2
- package/dist/utils/objectMigration.d.ts +9 -0
- package/dist/utils/objectMigration.d.ts.map +1 -0
- package/dist/utils/objectMigration.js +12 -0
- package/dist/utils/skyPhase.d.ts +61 -0
- package/dist/utils/skyPhase.d.ts.map +1 -0
- package/dist/utils/skyPhase.js +93 -0
- package/dist/utils/spaceMigration.d.ts +3 -0
- package/dist/utils/spaceMigration.d.ts.map +1 -0
- package/dist/utils/spaceMigration.js +46 -0
- package/dist/utils/sunUtils.d.ts +26 -1
- package/dist/utils/sunUtils.d.ts.map +1 -1
- package/dist/utils/sunUtils.js +37 -6
- package/package.json +1 -1
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
import { shaderMaterial } from '@react-three/drei';
|
|
3
|
+
import { extend } from '@react-three/fiber';
|
|
4
|
+
export const hilbertGridMaterialDefaults = {
|
|
5
|
+
u_time: 0,
|
|
6
|
+
u_cellSize: 0.8,
|
|
7
|
+
u_lineWidth: 1.2,
|
|
8
|
+
u_sectionSize: 8,
|
|
9
|
+
u_sectionWidth: 3,
|
|
10
|
+
u_lineColor: new THREE.Color('#2a8a5c'),
|
|
11
|
+
u_sectionColor: new THREE.Color('#1d4d37'),
|
|
12
|
+
u_cellColor: new THREE.Color('#082016'),
|
|
13
|
+
u_glowColor: new THREE.Color('#5dffb0'),
|
|
14
|
+
u_bgColor: new THREE.Color('#020805'),
|
|
15
|
+
u_bgOpacity: 0,
|
|
16
|
+
u_lineMode: 0,
|
|
17
|
+
u_cellMode: 0,
|
|
18
|
+
u_animSpeed: 1,
|
|
19
|
+
u_animScale: 0.5,
|
|
20
|
+
u_animIntensity: 0.6,
|
|
21
|
+
u_fadeDistance: 25,
|
|
22
|
+
u_fadeStrength: 0.7,
|
|
23
|
+
u_focus: new THREE.Vector2(0, 0),
|
|
24
|
+
u_mouse: new THREE.Vector2(0, 0),
|
|
25
|
+
u_displace: 0,
|
|
26
|
+
u_reveal: 1,
|
|
27
|
+
u_order: 6,
|
|
28
|
+
u_signals: 12,
|
|
29
|
+
u_trail: 40,
|
|
30
|
+
u_signalSpeed: 10,
|
|
31
|
+
u_signalPhase: 0,
|
|
32
|
+
};
|
|
33
|
+
const vertex = /* glsl */ `
|
|
34
|
+
uniform float u_time;
|
|
35
|
+
uniform float u_cellSize;
|
|
36
|
+
uniform float u_displace;
|
|
37
|
+
uniform float u_animSpeed;
|
|
38
|
+
uniform float u_animScale;
|
|
39
|
+
|
|
40
|
+
varying vec2 vGridPos;
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
const float PI = 3.14159265359;
|
|
44
|
+
const float TAU = 6.28318530718;
|
|
45
|
+
|
|
46
|
+
float hash21(vec2 p){
|
|
47
|
+
p = fract(p * vec2(123.34, 456.21));
|
|
48
|
+
p += dot(p, p + 45.32);
|
|
49
|
+
return fract(p.x * p.y);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
void main(){
|
|
54
|
+
vGridPos = position.xy;
|
|
55
|
+
vec3 pos = position;
|
|
56
|
+
if (u_displace > 0.0){
|
|
57
|
+
float t = u_time * u_animSpeed;
|
|
58
|
+
float d = length(position.xy) / max(u_cellSize, 1e-4);
|
|
59
|
+
pos.z += sin(d * u_animScale - t) * u_displace;
|
|
60
|
+
}
|
|
61
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4(pos, 1.0);
|
|
62
|
+
}
|
|
63
|
+
`;
|
|
64
|
+
const fragment = /* glsl */ `
|
|
65
|
+
precision highp float;
|
|
66
|
+
|
|
67
|
+
uniform float u_time;
|
|
68
|
+
uniform float u_cellSize;
|
|
69
|
+
uniform float u_lineWidth;
|
|
70
|
+
uniform float u_sectionSize;
|
|
71
|
+
uniform float u_sectionWidth;
|
|
72
|
+
uniform vec3 u_lineColor;
|
|
73
|
+
uniform vec3 u_sectionColor;
|
|
74
|
+
uniform vec3 u_cellColor;
|
|
75
|
+
uniform vec3 u_glowColor;
|
|
76
|
+
uniform vec3 u_bgColor;
|
|
77
|
+
uniform float u_bgOpacity;
|
|
78
|
+
uniform float u_lineMode;
|
|
79
|
+
uniform float u_cellMode;
|
|
80
|
+
uniform float u_animSpeed;
|
|
81
|
+
uniform float u_animScale;
|
|
82
|
+
uniform float u_animIntensity;
|
|
83
|
+
uniform float u_fadeDistance;
|
|
84
|
+
uniform float u_fadeStrength;
|
|
85
|
+
uniform vec2 u_focus;
|
|
86
|
+
uniform float u_reveal;
|
|
87
|
+
|
|
88
|
+
uniform float u_order;
|
|
89
|
+
uniform float u_signals;
|
|
90
|
+
uniform float u_trail;
|
|
91
|
+
uniform float u_signalPhase;
|
|
92
|
+
|
|
93
|
+
varying vec2 vGridPos;
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
const float PI = 3.14159265359;
|
|
97
|
+
const float TAU = 6.28318530718;
|
|
98
|
+
|
|
99
|
+
float hash21(vec2 p){
|
|
100
|
+
p = fract(p * vec2(123.34, 456.21));
|
|
101
|
+
p += dot(p, p + 45.32);
|
|
102
|
+
return fract(p.x * p.y);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
float lineAt(float c, float width, float fp){
|
|
107
|
+
float d = abs(fract(c - 0.5) - 0.5);
|
|
108
|
+
return 1.0 - clamp(d / max(fp * max(width, 0.05), 1e-6), 0.0, 1.0);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Hilbert index of cell (x, y) on an n x n grid (n a power of two); the curve
|
|
112
|
+
// starts at (0, 0) and ends at (n - 1, 0).
|
|
113
|
+
int hilbertXY2D(int n, int x, int y){
|
|
114
|
+
int d = 0;
|
|
115
|
+
for (int s = n / 2; s > 0; s /= 2){
|
|
116
|
+
int rx = (x & s) > 0 ? 1 : 0;
|
|
117
|
+
int ry = (y & s) > 0 ? 1 : 0;
|
|
118
|
+
d += s * s * ((3 * rx) ^ ry);
|
|
119
|
+
if (ry == 0){
|
|
120
|
+
if (rx == 1){ x = n - 1 - x; y = n - 1 - y; }
|
|
121
|
+
int tt = x; x = y; y = tt;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return d;
|
|
125
|
+
}
|
|
126
|
+
ivec2 hilbertD2XY(int n, int d){
|
|
127
|
+
int x = 0, y = 0, t = d;
|
|
128
|
+
for (int s = 1; s < n; s *= 2){
|
|
129
|
+
int rx = 1 & (t / 2);
|
|
130
|
+
int ry = 1 & (t ^ rx);
|
|
131
|
+
if (ry == 0){
|
|
132
|
+
if (rx == 1){ x = s - 1 - x; y = s - 1 - y; }
|
|
133
|
+
int tt = x; x = y; y = tt;
|
|
134
|
+
}
|
|
135
|
+
x += s * rx; y += s * ry;
|
|
136
|
+
t /= 4;
|
|
137
|
+
}
|
|
138
|
+
return ivec2(x, y);
|
|
139
|
+
}
|
|
140
|
+
// The Moore curve: four order-(n-1) Hilbert curves turned so they join into
|
|
141
|
+
// one closed loop, so signals circulate forever with no end points.
|
|
142
|
+
int mooreXY2D(int N, ivec2 c){
|
|
143
|
+
int h = N / 2;
|
|
144
|
+
if (c.x < h){
|
|
145
|
+
int q = c.y < h ? 0 : 1;
|
|
146
|
+
ivec2 l = ivec2(c.x, c.y - q * h);
|
|
147
|
+
return q * h * h + hilbertXY2D(h, l.y, h - 1 - l.x);
|
|
148
|
+
}
|
|
149
|
+
int q = c.y >= h ? 2 : 3;
|
|
150
|
+
ivec2 l = ivec2(c.x - h, c.y - (q == 2 ? h : 0));
|
|
151
|
+
return q * h * h + hilbertXY2D(h, h - 1 - l.y, l.x);
|
|
152
|
+
}
|
|
153
|
+
ivec2 mooreD2XY(int N, int d){
|
|
154
|
+
int h = N / 2, hh = h * h, L = N * N;
|
|
155
|
+
d = ((d % L) + L) % L;
|
|
156
|
+
int q = d / hh;
|
|
157
|
+
ivec2 s = hilbertD2XY(h, d - q * hh);
|
|
158
|
+
if (q < 2) return ivec2(h - 1 - s.y, s.x + q * h);
|
|
159
|
+
return ivec2(s.y + h, h - 1 - s.x + (q == 2 ? h : 0));
|
|
160
|
+
}
|
|
161
|
+
float cross2(vec2 a, vec2 b){ return a.x * b.y - a.y * b.x; }
|
|
162
|
+
// Distance to the curve through cell cc of an N x N Moore curve, and the
|
|
163
|
+
// curve parameter there (cells along the loop). Straight runs are segments;
|
|
164
|
+
// turns are quarter arcs, so the curve reads as one smooth line.
|
|
165
|
+
vec2 mooreCurve(vec2 cc, int N, out int dIdx){
|
|
166
|
+
ivec2 ci = ivec2(floor(cc));
|
|
167
|
+
vec2 f = fract(cc) - 0.5;
|
|
168
|
+
int d = mooreXY2D(N, ci);
|
|
169
|
+
dIdx = d;
|
|
170
|
+
vec2 dp = vec2(mooreD2XY(N, d - 1) - ci);
|
|
171
|
+
vec2 dn = vec2(mooreD2XY(N, d + 1) - ci);
|
|
172
|
+
if (dot(dp, dn) < -0.5){
|
|
173
|
+
return vec2(abs(dot(f, vec2(-dn.y, dn.x))), float(d) + dot(f, dn));
|
|
174
|
+
}
|
|
175
|
+
vec2 k = 0.5 * (dp + dn);
|
|
176
|
+
vec2 v = f - k;
|
|
177
|
+
vec2 a0 = 0.5 * dp - k;
|
|
178
|
+
float fr = clamp(abs(atan(cross2(a0, v), dot(a0, v))) / (PI * 0.5), 0.0, 1.0);
|
|
179
|
+
return vec2(abs(length(v) - 0.5), float(d) - 0.5 + fr);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
void main(){
|
|
183
|
+
vec2 coord = vGridPos / max(u_cellSize, 1e-4);
|
|
184
|
+
vec2 focus = u_focus / max(u_cellSize, 1e-4);
|
|
185
|
+
float t = u_time * u_animSpeed;
|
|
186
|
+
|
|
187
|
+
// A Hilbert curve is a single line that visits every cell exactly once while
|
|
188
|
+
// keeping neighbours on the line neighbours on the plane — the most local way
|
|
189
|
+
// to string a 2D grid onto 1D. Four of them joined make the closed Moore
|
|
190
|
+
// curve. Signals run along it at a constant speed in cells, so they wind
|
|
191
|
+
// through every corner of the floor like data through a board.
|
|
192
|
+
int ord = int(clamp(floor(u_order + 0.5), 2.0, 8.0));
|
|
193
|
+
int N = 1 << ord;
|
|
194
|
+
float Nf = float(N);
|
|
195
|
+
vec2 cc = coord + Nf * 0.5;
|
|
196
|
+
vec2 fc = fwidth(coord);
|
|
197
|
+
float fp = max(max(fc.x, fc.y), 1e-6);
|
|
198
|
+
float inside = step(0.0, cc.x) * step(cc.x, Nf) * step(0.0, cc.y) * step(cc.y, Nf);
|
|
199
|
+
vec2 ccl = clamp(cc, vec2(0.0), vec2(Nf - 1e-3));
|
|
200
|
+
|
|
201
|
+
int dIdx;
|
|
202
|
+
vec2 cv = mooreCurve(ccl, N, dIdx);
|
|
203
|
+
float lw = fp * max(u_lineWidth, 0.05);
|
|
204
|
+
float lines = (1.0 - clamp(cv.x / lw, 0.0, 1.0)) * inside;
|
|
205
|
+
|
|
206
|
+
// The accent is the same curve sectionSize times coarser — the shape the
|
|
207
|
+
// fine curve is built from, one recursion level up.
|
|
208
|
+
float accent = 0.0;
|
|
209
|
+
int kS = int(floor(log2(max(u_sectionSize, 1.0)) + 0.5));
|
|
210
|
+
if (u_sectionWidth > 0.0 && kS >= 1 && ord - kS >= 1){
|
|
211
|
+
float sc = float(1 << kS);
|
|
212
|
+
int d2;
|
|
213
|
+
vec2 cv2 = mooreCurve(ccl / sc, N >> kS, d2);
|
|
214
|
+
accent = (1.0 - clamp(cv2.x / (fp / sc * max(u_sectionWidth, 0.05)), 0.0, 1.0)) * inside;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// Signals: S heads spaced evenly round the loop, each dragging an
|
|
218
|
+
// exponential trail behind it.
|
|
219
|
+
float Lc = Nf * Nf;
|
|
220
|
+
float S = max(floor(u_signals + 0.5), 1.0);
|
|
221
|
+
float period = Lc / S;
|
|
222
|
+
float behind = mod(u_signalPhase - cv.y, period);
|
|
223
|
+
float sig = exp(-behind / max(u_trail, 0.01));
|
|
224
|
+
float core = exp(-pow(cv.x / (lw * 1.6), 2.0));
|
|
225
|
+
float bloom = exp(-pow(cv.x / 0.16, 2.0)) * 0.35;
|
|
226
|
+
|
|
227
|
+
vec2 fl = fract(ccl) - 0.5;
|
|
228
|
+
float dmin = (0.5 - max(abs(fl.x), abs(fl.y))) * inside;
|
|
229
|
+
float idAcc = float(dIdx);
|
|
230
|
+
vec2 cellPos = floor(ccl) + 0.5 - Nf * 0.5;
|
|
231
|
+
float cellH = hash21(floor(ccl) * 0.37 + 1.1);
|
|
232
|
+
float tone = step(0.55, cellH);
|
|
233
|
+
|
|
234
|
+
vec3 extraCol = u_glowColor * (core + bloom) * sig * 1.6 * inside;
|
|
235
|
+
float extraA = (core + bloom * 0.6) * sig * inside;
|
|
236
|
+
|
|
237
|
+
// ---- line animation --------------------------------------------------
|
|
238
|
+
float lineAnim = 1.0;
|
|
239
|
+
// Mode 0 is static: the chain starts at 0.5 so 0 never falls into flow.
|
|
240
|
+
if (u_lineMode < 0.5){
|
|
241
|
+
} else if (u_lineMode < 1.5){
|
|
242
|
+
lineAnim = 0.5 + 0.5 * sin(length(cellPos - focus) * u_animScale - t);
|
|
243
|
+
} else if (u_lineMode < 2.5){
|
|
244
|
+
lineAnim = 0.5 + 0.5 * sin(dot(cellPos, vec2(0.5, 0.5)) * u_animScale - t);
|
|
245
|
+
} else if (u_lineMode < 3.5){
|
|
246
|
+
float s = fract((coord.x + coord.y) * 0.05 * u_animScale - t * 0.15);
|
|
247
|
+
lineAnim = 0.25 + smoothstep(0.0, 0.15, s) * (1.0 - smoothstep(0.15, 0.35, s));
|
|
248
|
+
} else if (u_lineMode < 4.5){
|
|
249
|
+
lineAnim = 0.5 + 0.5 * sin(t);
|
|
250
|
+
}
|
|
251
|
+
lineAnim = mix(1.0, lineAnim, u_animIntensity);
|
|
252
|
+
|
|
253
|
+
// ---- cell fill -------------------------------------------------------
|
|
254
|
+
float cell = 0.0;
|
|
255
|
+
if (u_cellMode < 0.5){
|
|
256
|
+
} else if (u_cellMode < 1.5){
|
|
257
|
+
cell = 0.5 + 0.5 * sin(idAcc * 0.05 * u_animScale - t);
|
|
258
|
+
} else if (u_cellMode < 2.5){
|
|
259
|
+
cell = 0.5 + 0.5 * sin(t * (0.6 + cellH) + cellH * TAU);
|
|
260
|
+
} else if (u_cellMode < 3.5){
|
|
261
|
+
cell = smoothstep(0.6, 1.0, sin(length(cellPos - focus) * u_animScale - t));
|
|
262
|
+
} else if (u_cellMode < 4.5){
|
|
263
|
+
cell = step(0.5, cellH) * (0.5 + 0.5 * sin(t));
|
|
264
|
+
}
|
|
265
|
+
cell *= u_animIntensity;
|
|
266
|
+
cell *= smoothstep(0.0, 0.16, dmin); // keep the fill off its own edges
|
|
267
|
+
|
|
268
|
+
float r = length(vGridPos) / max(u_fadeDistance, 1e-4);
|
|
269
|
+
float fade = 1.0 - smoothstep(1.0 - u_fadeStrength, 1.0, r);
|
|
270
|
+
|
|
271
|
+
vec3 col = u_bgColor * u_bgOpacity;
|
|
272
|
+
float a = u_bgOpacity;
|
|
273
|
+
|
|
274
|
+
col += mix(u_cellColor, u_cellColor * 2.2, tone) * cell;
|
|
275
|
+
a = max(a, cell * 0.9);
|
|
276
|
+
float linesI = lines * lineAnim;
|
|
277
|
+
col += u_lineColor * linesI; a = max(a, linesI);
|
|
278
|
+
float accentI = accent * lineAnim;
|
|
279
|
+
col += u_sectionColor * accentI; a = max(a, accentI);
|
|
280
|
+
col += u_glowColor * (linesI * 0.2 + cell * 0.35) * u_animIntensity;
|
|
281
|
+
col += extraCol; a = max(a, extraA);
|
|
282
|
+
|
|
283
|
+
col *= fade;
|
|
284
|
+
a *= fade;
|
|
285
|
+
|
|
286
|
+
// ---- reveal ----------------------------------------------------------
|
|
287
|
+
if (u_reveal < 0.999){
|
|
288
|
+
float rd = length(vGridPos - u_focus) / max(u_fadeDistance, 1e-4);
|
|
289
|
+
float edge = u_reveal * 1.1;
|
|
290
|
+
float mask = 1.0 - smoothstep(edge - 0.05, edge, rd);
|
|
291
|
+
float front = mask * smoothstep(edge - 0.22, edge - 0.05, rd);
|
|
292
|
+
col = col * mask + u_glowColor * front * (a * 1.8 + 0.08);
|
|
293
|
+
a = max(a * mask, front * 0.10);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
if (a < 0.002) discard;
|
|
297
|
+
gl_FragColor = vec4(col, a);
|
|
298
|
+
}
|
|
299
|
+
`;
|
|
300
|
+
export const HilbertGridMaterial = shaderMaterial({
|
|
301
|
+
u_time: hilbertGridMaterialDefaults.u_time,
|
|
302
|
+
u_cellSize: hilbertGridMaterialDefaults.u_cellSize,
|
|
303
|
+
u_lineWidth: hilbertGridMaterialDefaults.u_lineWidth,
|
|
304
|
+
u_sectionSize: hilbertGridMaterialDefaults.u_sectionSize,
|
|
305
|
+
u_sectionWidth: hilbertGridMaterialDefaults.u_sectionWidth,
|
|
306
|
+
u_lineColor: hilbertGridMaterialDefaults.u_lineColor.clone(),
|
|
307
|
+
u_sectionColor: hilbertGridMaterialDefaults.u_sectionColor.clone(),
|
|
308
|
+
u_cellColor: hilbertGridMaterialDefaults.u_cellColor.clone(),
|
|
309
|
+
u_glowColor: hilbertGridMaterialDefaults.u_glowColor.clone(),
|
|
310
|
+
u_bgColor: hilbertGridMaterialDefaults.u_bgColor.clone(),
|
|
311
|
+
u_bgOpacity: hilbertGridMaterialDefaults.u_bgOpacity,
|
|
312
|
+
u_lineMode: hilbertGridMaterialDefaults.u_lineMode,
|
|
313
|
+
u_cellMode: hilbertGridMaterialDefaults.u_cellMode,
|
|
314
|
+
u_animSpeed: hilbertGridMaterialDefaults.u_animSpeed,
|
|
315
|
+
u_animScale: hilbertGridMaterialDefaults.u_animScale,
|
|
316
|
+
u_animIntensity: hilbertGridMaterialDefaults.u_animIntensity,
|
|
317
|
+
u_fadeDistance: hilbertGridMaterialDefaults.u_fadeDistance,
|
|
318
|
+
u_fadeStrength: hilbertGridMaterialDefaults.u_fadeStrength,
|
|
319
|
+
u_focus: hilbertGridMaterialDefaults.u_focus.clone(),
|
|
320
|
+
u_mouse: hilbertGridMaterialDefaults.u_mouse.clone(),
|
|
321
|
+
u_displace: hilbertGridMaterialDefaults.u_displace,
|
|
322
|
+
u_reveal: hilbertGridMaterialDefaults.u_reveal,
|
|
323
|
+
u_order: hilbertGridMaterialDefaults.u_order,
|
|
324
|
+
u_signals: hilbertGridMaterialDefaults.u_signals,
|
|
325
|
+
u_trail: hilbertGridMaterialDefaults.u_trail,
|
|
326
|
+
u_signalSpeed: hilbertGridMaterialDefaults.u_signalSpeed,
|
|
327
|
+
u_signalPhase: hilbertGridMaterialDefaults.u_signalPhase,
|
|
328
|
+
}, vertex, fragment);
|
|
329
|
+
extend({ HilbertGridMaterial });
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
export interface LensingGridMaterialUniforms {
|
|
3
|
+
/** elapsed seconds (useGridSurface) */
|
|
4
|
+
u_time: number;
|
|
5
|
+
/** size of one cell, in world units */
|
|
6
|
+
u_cellSize: number;
|
|
7
|
+
/** line thickness, in pixels */
|
|
8
|
+
u_lineWidth: number;
|
|
9
|
+
u_sectionSize: number;
|
|
10
|
+
/** accent thickness, in pixels; 0 disables the layer */
|
|
11
|
+
u_sectionWidth: number;
|
|
12
|
+
u_lineColor: THREE.Color;
|
|
13
|
+
u_sectionColor: THREE.Color;
|
|
14
|
+
u_cellColor: THREE.Color;
|
|
15
|
+
u_glowColor: THREE.Color;
|
|
16
|
+
u_bgColor: THREE.Color;
|
|
17
|
+
u_bgOpacity: number;
|
|
18
|
+
u_lineMode: number;
|
|
19
|
+
u_cellMode: number;
|
|
20
|
+
u_animSpeed: number;
|
|
21
|
+
u_animScale: number;
|
|
22
|
+
u_animIntensity: number;
|
|
23
|
+
u_fadeDistance: number;
|
|
24
|
+
u_fadeStrength: number;
|
|
25
|
+
/** ripple / reveal origin; stays at the origin */
|
|
26
|
+
u_focus: THREE.Vector2;
|
|
27
|
+
u_mouse: THREE.Vector2;
|
|
28
|
+
u_displace: number;
|
|
29
|
+
/** 0..1 assemble / dissolve */
|
|
30
|
+
u_reveal: number;
|
|
31
|
+
/** Einstein radius of the lens, in cells; 0 leaves the lattice undistorted */
|
|
32
|
+
u_mass: number;
|
|
33
|
+
/** Radius the lens circles the centre on, in cells; 0 holds it at the centre */
|
|
34
|
+
u_orbit: number;
|
|
35
|
+
/** Brightness of the Einstein ring and its halo */
|
|
36
|
+
u_ringGlow: number;
|
|
37
|
+
}
|
|
38
|
+
declare module '@react-three/fiber' {
|
|
39
|
+
interface ThreeElements {
|
|
40
|
+
lensingGridMaterial: ThreeElements['shaderMaterial'] & Partial<LensingGridMaterialUniforms>;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export declare const lensingGridMaterialDefaults: LensingGridMaterialUniforms;
|
|
44
|
+
export declare const LensingGridMaterial: import("@react-three/fiber").ConstructorRepresentation<THREE.ShaderMaterial & {
|
|
45
|
+
u_time: number;
|
|
46
|
+
u_cellSize: number;
|
|
47
|
+
u_lineWidth: number;
|
|
48
|
+
u_sectionSize: number;
|
|
49
|
+
u_sectionWidth: number;
|
|
50
|
+
u_lineColor: THREE.Color;
|
|
51
|
+
u_sectionColor: THREE.Color;
|
|
52
|
+
u_cellColor: THREE.Color;
|
|
53
|
+
u_glowColor: THREE.Color;
|
|
54
|
+
u_bgColor: THREE.Color;
|
|
55
|
+
u_bgOpacity: number;
|
|
56
|
+
u_lineMode: number;
|
|
57
|
+
u_cellMode: number;
|
|
58
|
+
u_animSpeed: number;
|
|
59
|
+
u_animScale: number;
|
|
60
|
+
u_animIntensity: number;
|
|
61
|
+
u_fadeDistance: number;
|
|
62
|
+
u_fadeStrength: number;
|
|
63
|
+
u_focus: THREE.Vector2;
|
|
64
|
+
u_mouse: THREE.Vector2;
|
|
65
|
+
u_displace: number;
|
|
66
|
+
u_reveal: number;
|
|
67
|
+
u_mass: number;
|
|
68
|
+
u_orbit: number;
|
|
69
|
+
u_ringGlow: number;
|
|
70
|
+
}> & {
|
|
71
|
+
key: string;
|
|
72
|
+
};
|
|
73
|
+
//# sourceMappingURL=LensingGridMaterial.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LensingGridMaterial.d.ts","sourceRoot":"","sources":["../../src/shaders/LensingGridMaterial.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAgB/B,MAAM,WAAW,2BAA2B;IACxC,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,wDAAwD;IACxD,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC;IACzB,cAAc,EAAE,KAAK,CAAC,KAAK,CAAC;IAC5B,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC;IACzB,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC;IACzB,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,kDAAkD;IAClD,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC;IACvB,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,MAAM,EAAE,MAAM,CAAC;IACf,gFAAgF;IAChF,OAAO,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,OAAO,QAAQ,oBAAoB,CAAC;IAChC,UAAU,aAAa;QACnB,mBAAmB,EAAE,aAAa,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAAC;KAC/F;CACJ;AAED,eAAO,MAAM,2BAA2B,EAAE,2BA0BzC,CAAC;AAuMF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8B/B,CAAC"}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
import { shaderMaterial } from '@react-three/drei';
|
|
3
|
+
import { extend } from '@react-three/fiber';
|
|
4
|
+
export const lensingGridMaterialDefaults = {
|
|
5
|
+
u_time: 0,
|
|
6
|
+
u_cellSize: 2,
|
|
7
|
+
u_lineWidth: 1.1,
|
|
8
|
+
u_sectionSize: 5,
|
|
9
|
+
u_sectionWidth: 1.8,
|
|
10
|
+
u_lineColor: new THREE.Color('#2b4f80'),
|
|
11
|
+
u_sectionColor: new THREE.Color('#9fd0ff'),
|
|
12
|
+
u_cellColor: new THREE.Color('#0b1a33'),
|
|
13
|
+
u_glowColor: new THREE.Color('#ffcf8a'),
|
|
14
|
+
u_bgColor: new THREE.Color('#02040a'),
|
|
15
|
+
u_bgOpacity: 0,
|
|
16
|
+
u_lineMode: 1,
|
|
17
|
+
u_cellMode: 2,
|
|
18
|
+
u_animSpeed: 1,
|
|
19
|
+
u_animScale: 0.6,
|
|
20
|
+
u_animIntensity: 0.6,
|
|
21
|
+
u_fadeDistance: 25,
|
|
22
|
+
u_fadeStrength: 0.7,
|
|
23
|
+
u_focus: new THREE.Vector2(0, 0),
|
|
24
|
+
u_mouse: new THREE.Vector2(0, 0),
|
|
25
|
+
u_displace: 0,
|
|
26
|
+
u_reveal: 1,
|
|
27
|
+
u_mass: 4,
|
|
28
|
+
u_orbit: 0,
|
|
29
|
+
u_ringGlow: 0.8,
|
|
30
|
+
};
|
|
31
|
+
const vertex = /* glsl */ `
|
|
32
|
+
uniform float u_time;
|
|
33
|
+
uniform float u_cellSize;
|
|
34
|
+
uniform float u_displace;
|
|
35
|
+
uniform float u_animSpeed;
|
|
36
|
+
uniform float u_animScale;
|
|
37
|
+
|
|
38
|
+
varying vec2 vGridPos;
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
const float PI = 3.14159265359;
|
|
42
|
+
const float TAU = 6.28318530718;
|
|
43
|
+
|
|
44
|
+
float hash21(vec2 p){
|
|
45
|
+
p = fract(p * vec2(123.34, 456.21));
|
|
46
|
+
p += dot(p, p + 45.32);
|
|
47
|
+
return fract(p.x * p.y);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
void main(){
|
|
52
|
+
vGridPos = position.xy;
|
|
53
|
+
vec3 pos = position;
|
|
54
|
+
if (u_displace > 0.0){
|
|
55
|
+
float t = u_time * u_animSpeed;
|
|
56
|
+
float d = length(position.xy) / max(u_cellSize, 1e-4);
|
|
57
|
+
pos.z += sin(d * u_animScale - t) * u_displace;
|
|
58
|
+
}
|
|
59
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4(pos, 1.0);
|
|
60
|
+
}
|
|
61
|
+
`;
|
|
62
|
+
const fragment = /* glsl */ `
|
|
63
|
+
precision highp float;
|
|
64
|
+
|
|
65
|
+
uniform float u_time;
|
|
66
|
+
uniform float u_cellSize;
|
|
67
|
+
uniform float u_lineWidth;
|
|
68
|
+
uniform float u_sectionSize;
|
|
69
|
+
uniform float u_sectionWidth;
|
|
70
|
+
uniform vec3 u_lineColor;
|
|
71
|
+
uniform vec3 u_sectionColor;
|
|
72
|
+
uniform vec3 u_cellColor;
|
|
73
|
+
uniform vec3 u_glowColor;
|
|
74
|
+
uniform vec3 u_bgColor;
|
|
75
|
+
uniform float u_bgOpacity;
|
|
76
|
+
uniform float u_lineMode;
|
|
77
|
+
uniform float u_cellMode;
|
|
78
|
+
uniform float u_animSpeed;
|
|
79
|
+
uniform float u_animScale;
|
|
80
|
+
uniform float u_animIntensity;
|
|
81
|
+
uniform float u_fadeDistance;
|
|
82
|
+
uniform float u_fadeStrength;
|
|
83
|
+
uniform vec2 u_focus;
|
|
84
|
+
uniform float u_reveal;
|
|
85
|
+
|
|
86
|
+
uniform float u_mass;
|
|
87
|
+
uniform float u_orbit;
|
|
88
|
+
uniform float u_ringGlow;
|
|
89
|
+
|
|
90
|
+
varying vec2 vGridPos;
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
const float PI = 3.14159265359;
|
|
94
|
+
const float TAU = 6.28318530718;
|
|
95
|
+
|
|
96
|
+
float hash21(vec2 p){
|
|
97
|
+
p = fract(p * vec2(123.34, 456.21));
|
|
98
|
+
p += dot(p, p + 45.32);
|
|
99
|
+
return fract(p.x * p.y);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
float lineAt(float c, float width, float fp){
|
|
104
|
+
float d = abs(fract(c - 0.5) - 0.5);
|
|
105
|
+
return 1.0 - clamp(d / max(fp * max(width, 0.05), 1e-6), 0.0, 1.0);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
void main(){
|
|
109
|
+
vec2 coord = vGridPos / max(u_cellSize, 1e-4);
|
|
110
|
+
vec2 focus = u_focus / max(u_cellSize, 1e-4);
|
|
111
|
+
float t = u_time * u_animSpeed;
|
|
112
|
+
|
|
113
|
+
// Gravitational lensing by a point mass. The thin-lens equation
|
|
114
|
+
// beta = theta - thetaE^2 (theta - L) / |theta - L|^2
|
|
115
|
+
// says the ray seen at theta left the source plane at beta, so every pixel
|
|
116
|
+
// samples a plain square lattice at beta. On the Einstein ring |theta - L| =
|
|
117
|
+
// thetaE every ray lands on L itself: the point behind the mass is smeared
|
|
118
|
+
// into a ring. Inside the ring the image is inverted, and toward the mass the
|
|
119
|
+
// lattice is compressed without bound — it fades out, and that is the shadow.
|
|
120
|
+
float thetaE = max(u_mass, 0.0);
|
|
121
|
+
float oa = t * 0.12;
|
|
122
|
+
vec2 L = focus + u_orbit * vec2(cos(oa), sin(oa));
|
|
123
|
+
vec2 rel = coord - L;
|
|
124
|
+
float r2 = max(dot(rel, rel), 1e-4);
|
|
125
|
+
float rr = sqrt(r2);
|
|
126
|
+
vec2 beta = coord - thetaE * thetaE * rel / r2;
|
|
127
|
+
|
|
128
|
+
// Once a source cell is smaller than a pixel it cannot be drawn any more.
|
|
129
|
+
vec2 fb = max(fwidth(beta), vec2(1e-6));
|
|
130
|
+
float dens = 1.0 - smoothstep(0.2, 0.7, max(fb.x, fb.y));
|
|
131
|
+
|
|
132
|
+
// Per-image magnification 1 / |1 - (thetaE/r)^4|: lines brighten where the
|
|
133
|
+
// lens stretches the source, peaking along the ring.
|
|
134
|
+
float q4 = pow(thetaE / rr, 4.0);
|
|
135
|
+
float mag = clamp(1.0 / max(abs(1.0 - q4), 1e-3), 1.0, 4.0);
|
|
136
|
+
|
|
137
|
+
float lines = max(lineAt(beta.x, u_lineWidth, fb.x), lineAt(beta.y, u_lineWidth, fb.y));
|
|
138
|
+
lines *= dens * mix(1.0, sqrt(mag), 0.7);
|
|
139
|
+
|
|
140
|
+
float accent = 0.0;
|
|
141
|
+
if (u_sectionWidth > 0.0 && u_sectionSize > 0.0){
|
|
142
|
+
vec2 sb = beta / u_sectionSize;
|
|
143
|
+
vec2 fs = max(fwidth(sb), vec2(1e-6));
|
|
144
|
+
accent = max(lineAt(sb.x, u_sectionWidth, fs.x), lineAt(sb.y, u_sectionWidth, fs.y));
|
|
145
|
+
accent *= 1.0 - smoothstep(0.3, 0.9, max(fs.x, fs.y));
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
vec2 id = floor(beta);
|
|
149
|
+
vec2 fr = fract(beta);
|
|
150
|
+
float dmin = min(min(fr.x, 1.0 - fr.x), min(fr.y, 1.0 - fr.y)) * dens;
|
|
151
|
+
float idAcc = id.x + id.y * 7.13;
|
|
152
|
+
vec2 cellPos = id + 0.5;
|
|
153
|
+
float cellH = hash21(id * 0.137 + 7.7);
|
|
154
|
+
float tone = step(0.55, cellH);
|
|
155
|
+
|
|
156
|
+
// The Einstein ring itself: a thin bright ring on a soft photon halo.
|
|
157
|
+
float on = smoothstep(0.0, 0.3, thetaE);
|
|
158
|
+
float ring = exp(-pow((rr - thetaE) / (0.035 * thetaE + 0.08), 2.0)) * on;
|
|
159
|
+
float halo = exp(-pow((rr - thetaE) / (0.4 * thetaE + 0.4), 2.0)) * 0.12 * on;
|
|
160
|
+
vec3 extraCol = (u_glowColor * (ring + halo) + u_sectionColor * ring * 0.3) * u_ringGlow;
|
|
161
|
+
float extraA = (ring + halo) * u_ringGlow;
|
|
162
|
+
|
|
163
|
+
// ---- line animation --------------------------------------------------
|
|
164
|
+
float lineAnim = 1.0;
|
|
165
|
+
// Mode 0 is static: the chain starts at 0.5 so 0 never falls into flow.
|
|
166
|
+
if (u_lineMode < 0.5){
|
|
167
|
+
} else if (u_lineMode < 1.5){
|
|
168
|
+
lineAnim = 0.5 + 0.5 * sin(length(cellPos - focus) * u_animScale - t);
|
|
169
|
+
} else if (u_lineMode < 2.5){
|
|
170
|
+
lineAnim = 0.5 + 0.5 * sin(dot(cellPos, vec2(0.5, 0.5)) * u_animScale - t);
|
|
171
|
+
} else if (u_lineMode < 3.5){
|
|
172
|
+
float s = fract((coord.x + coord.y) * 0.05 * u_animScale - t * 0.15);
|
|
173
|
+
lineAnim = 0.25 + smoothstep(0.0, 0.15, s) * (1.0 - smoothstep(0.15, 0.35, s));
|
|
174
|
+
} else if (u_lineMode < 4.5){
|
|
175
|
+
lineAnim = 0.5 + 0.5 * sin(t);
|
|
176
|
+
}
|
|
177
|
+
lineAnim = mix(1.0, lineAnim, u_animIntensity);
|
|
178
|
+
|
|
179
|
+
// ---- cell fill -------------------------------------------------------
|
|
180
|
+
float cell = 0.0;
|
|
181
|
+
if (u_cellMode < 0.5){
|
|
182
|
+
} else if (u_cellMode < 1.5){
|
|
183
|
+
cell = 0.5 + 0.5 * sin(idAcc * 0.05 * u_animScale - t);
|
|
184
|
+
} else if (u_cellMode < 2.5){
|
|
185
|
+
cell = 0.5 + 0.5 * sin(t * (0.6 + cellH) + cellH * TAU);
|
|
186
|
+
} else if (u_cellMode < 3.5){
|
|
187
|
+
cell = smoothstep(0.6, 1.0, sin(length(cellPos - focus) * u_animScale - t));
|
|
188
|
+
} else if (u_cellMode < 4.5){
|
|
189
|
+
cell = step(0.5, cellH) * (0.5 + 0.5 * sin(t));
|
|
190
|
+
}
|
|
191
|
+
cell *= u_animIntensity;
|
|
192
|
+
cell *= smoothstep(0.0, 0.16, dmin); // keep the fill off its own edges
|
|
193
|
+
|
|
194
|
+
float r = length(vGridPos) / max(u_fadeDistance, 1e-4);
|
|
195
|
+
float fade = 1.0 - smoothstep(1.0 - u_fadeStrength, 1.0, r);
|
|
196
|
+
|
|
197
|
+
vec3 col = u_bgColor * u_bgOpacity;
|
|
198
|
+
float a = u_bgOpacity;
|
|
199
|
+
|
|
200
|
+
col += mix(u_cellColor, u_cellColor * 2.2, tone) * cell;
|
|
201
|
+
a = max(a, cell * 0.9);
|
|
202
|
+
float linesI = lines * lineAnim;
|
|
203
|
+
col += u_lineColor * linesI; a = max(a, linesI);
|
|
204
|
+
float accentI = accent * lineAnim;
|
|
205
|
+
col += u_sectionColor * accentI; a = max(a, accentI);
|
|
206
|
+
col += u_glowColor * (linesI * 0.2 + cell * 0.35) * u_animIntensity;
|
|
207
|
+
col += extraCol; a = max(a, extraA);
|
|
208
|
+
|
|
209
|
+
col *= fade;
|
|
210
|
+
a *= fade;
|
|
211
|
+
|
|
212
|
+
// ---- reveal ----------------------------------------------------------
|
|
213
|
+
if (u_reveal < 0.999){
|
|
214
|
+
float rd = length(vGridPos - u_focus) / max(u_fadeDistance, 1e-4);
|
|
215
|
+
float edge = u_reveal * 1.1;
|
|
216
|
+
float mask = 1.0 - smoothstep(edge - 0.05, edge, rd);
|
|
217
|
+
float front = mask * smoothstep(edge - 0.22, edge - 0.05, rd);
|
|
218
|
+
col = col * mask + u_glowColor * front * (a * 1.8 + 0.08);
|
|
219
|
+
a = max(a * mask, front * 0.10);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
if (a < 0.002) discard;
|
|
223
|
+
gl_FragColor = vec4(col, a);
|
|
224
|
+
}
|
|
225
|
+
`;
|
|
226
|
+
export const LensingGridMaterial = shaderMaterial({
|
|
227
|
+
u_time: lensingGridMaterialDefaults.u_time,
|
|
228
|
+
u_cellSize: lensingGridMaterialDefaults.u_cellSize,
|
|
229
|
+
u_lineWidth: lensingGridMaterialDefaults.u_lineWidth,
|
|
230
|
+
u_sectionSize: lensingGridMaterialDefaults.u_sectionSize,
|
|
231
|
+
u_sectionWidth: lensingGridMaterialDefaults.u_sectionWidth,
|
|
232
|
+
u_lineColor: lensingGridMaterialDefaults.u_lineColor.clone(),
|
|
233
|
+
u_sectionColor: lensingGridMaterialDefaults.u_sectionColor.clone(),
|
|
234
|
+
u_cellColor: lensingGridMaterialDefaults.u_cellColor.clone(),
|
|
235
|
+
u_glowColor: lensingGridMaterialDefaults.u_glowColor.clone(),
|
|
236
|
+
u_bgColor: lensingGridMaterialDefaults.u_bgColor.clone(),
|
|
237
|
+
u_bgOpacity: lensingGridMaterialDefaults.u_bgOpacity,
|
|
238
|
+
u_lineMode: lensingGridMaterialDefaults.u_lineMode,
|
|
239
|
+
u_cellMode: lensingGridMaterialDefaults.u_cellMode,
|
|
240
|
+
u_animSpeed: lensingGridMaterialDefaults.u_animSpeed,
|
|
241
|
+
u_animScale: lensingGridMaterialDefaults.u_animScale,
|
|
242
|
+
u_animIntensity: lensingGridMaterialDefaults.u_animIntensity,
|
|
243
|
+
u_fadeDistance: lensingGridMaterialDefaults.u_fadeDistance,
|
|
244
|
+
u_fadeStrength: lensingGridMaterialDefaults.u_fadeStrength,
|
|
245
|
+
u_focus: lensingGridMaterialDefaults.u_focus.clone(),
|
|
246
|
+
u_mouse: lensingGridMaterialDefaults.u_mouse.clone(),
|
|
247
|
+
u_displace: lensingGridMaterialDefaults.u_displace,
|
|
248
|
+
u_reveal: lensingGridMaterialDefaults.u_reveal,
|
|
249
|
+
u_mass: lensingGridMaterialDefaults.u_mass,
|
|
250
|
+
u_orbit: lensingGridMaterialDefaults.u_orbit,
|
|
251
|
+
u_ringGlow: lensingGridMaterialDefaults.u_ringGlow,
|
|
252
|
+
}, vertex, fragment);
|
|
253
|
+
extend({ LensingGridMaterial });
|