@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,532 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
import { shaderMaterial } from '@react-three/drei';
|
|
3
|
+
import { extend } from '@react-three/fiber';
|
|
4
|
+
export const phyllotaxisGridMaterialDefaults = {
|
|
5
|
+
u_time: 0,
|
|
6
|
+
u_cellSize: 1.6,
|
|
7
|
+
u_lineWidth: 0.6,
|
|
8
|
+
u_sectionSize: 2,
|
|
9
|
+
u_sectionWidth: 1.4,
|
|
10
|
+
u_lineColor: new THREE.Color('#a8661c'),
|
|
11
|
+
u_sectionColor: new THREE.Color('#ffcf70'),
|
|
12
|
+
u_cellColor: new THREE.Color('#3a1a08'),
|
|
13
|
+
u_glowColor: new THREE.Color('#e4ee8a'),
|
|
14
|
+
u_bgColor: new THREE.Color('#070402'),
|
|
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.6,
|
|
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_divergence: 137.508,
|
|
28
|
+
u_bloomRate: 0.04,
|
|
29
|
+
u_relief: 0.8,
|
|
30
|
+
u_shape: 1,
|
|
31
|
+
u_shapeSize: 0.85,
|
|
32
|
+
u_shapeGlow: 0.9,
|
|
33
|
+
u_bloomPhase: 0,
|
|
34
|
+
};
|
|
35
|
+
const vertex = /* glsl */ `
|
|
36
|
+
uniform float u_time;
|
|
37
|
+
uniform float u_cellSize;
|
|
38
|
+
uniform float u_displace;
|
|
39
|
+
uniform float u_animSpeed;
|
|
40
|
+
uniform float u_animScale;
|
|
41
|
+
|
|
42
|
+
varying vec2 vGridPos;
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
const float PI = 3.14159265359;
|
|
46
|
+
const float TAU = 6.28318530718;
|
|
47
|
+
|
|
48
|
+
float hash21(vec2 p){
|
|
49
|
+
p = fract(p * vec2(123.34, 456.21));
|
|
50
|
+
p += dot(p, p + 45.32);
|
|
51
|
+
return fract(p.x * p.y);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
void main(){
|
|
56
|
+
vGridPos = position.xy;
|
|
57
|
+
vec3 pos = position;
|
|
58
|
+
if (u_displace > 0.0){
|
|
59
|
+
float t = u_time * u_animSpeed;
|
|
60
|
+
float d = length(position.xy) / max(u_cellSize, 1e-4);
|
|
61
|
+
pos.z += sin(d * u_animScale - t) * u_displace;
|
|
62
|
+
}
|
|
63
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4(pos, 1.0);
|
|
64
|
+
}
|
|
65
|
+
`;
|
|
66
|
+
const fragment = /* glsl */ `
|
|
67
|
+
precision highp float;
|
|
68
|
+
|
|
69
|
+
uniform float u_time;
|
|
70
|
+
uniform float u_cellSize;
|
|
71
|
+
uniform float u_lineWidth;
|
|
72
|
+
uniform float u_sectionSize;
|
|
73
|
+
uniform float u_sectionWidth;
|
|
74
|
+
uniform vec3 u_lineColor;
|
|
75
|
+
uniform vec3 u_sectionColor;
|
|
76
|
+
uniform vec3 u_cellColor;
|
|
77
|
+
uniform vec3 u_glowColor;
|
|
78
|
+
uniform vec3 u_bgColor;
|
|
79
|
+
uniform float u_bgOpacity;
|
|
80
|
+
uniform float u_lineMode;
|
|
81
|
+
uniform float u_cellMode;
|
|
82
|
+
uniform float u_animSpeed;
|
|
83
|
+
uniform float u_animScale;
|
|
84
|
+
uniform float u_animIntensity;
|
|
85
|
+
uniform float u_fadeDistance;
|
|
86
|
+
uniform float u_fadeStrength;
|
|
87
|
+
uniform vec2 u_focus;
|
|
88
|
+
uniform float u_reveal;
|
|
89
|
+
|
|
90
|
+
uniform float u_divergence;
|
|
91
|
+
uniform float u_bloomPhase;
|
|
92
|
+
uniform float u_relief;
|
|
93
|
+
uniform float u_shape;
|
|
94
|
+
uniform float u_shapeSize;
|
|
95
|
+
uniform float u_shapeGlow;
|
|
96
|
+
|
|
97
|
+
varying vec2 vGridPos;
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
const float PI = 3.14159265359;
|
|
101
|
+
const float TAU = 6.28318530718;
|
|
102
|
+
|
|
103
|
+
float hash21(vec2 p){
|
|
104
|
+
p = fract(p * vec2(123.34, 456.21));
|
|
105
|
+
p += dot(p, p + 45.32);
|
|
106
|
+
return fract(p.x * p.y);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
float lineAt(float c, float width, float fp){
|
|
111
|
+
float d = abs(fract(c - 0.5) - 0.5);
|
|
112
|
+
return 1.0 - clamp(d / max(fp * max(width, 0.05), 1e-6), 0.0, 1.0);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// The floret's own mark, in a frame aligned to the head's radius (x points
|
|
116
|
+
// away from the centre), so every mark across the head is oriented the way
|
|
117
|
+
// its spiral grows. q is in units of a little under half a cell; op (0..1) is
|
|
118
|
+
// how far the bloom wave has opened this floret. Returns a signed distance
|
|
119
|
+
// (negative inside) for filled shapes; strokes return |d| - halfWidth.
|
|
120
|
+
mat2 rot2(float a){ float c = cos(a), s = sin(a); return mat2(c, s, -s, c); }
|
|
121
|
+
float sdBox(vec2 p, vec2 b){ vec2 d = abs(p) - b; return length(max(d, 0.0)) + min(max(d.x, d.y), 0.0); }
|
|
122
|
+
float sdSegment(vec2 p, vec2 a, vec2 b){
|
|
123
|
+
vec2 pa = p - a, ba = b - a;
|
|
124
|
+
return length(pa - ba * clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0));
|
|
125
|
+
}
|
|
126
|
+
// The exact 2D distances below are Inigo Quilez's.
|
|
127
|
+
float sdStar5(vec2 p, float r, float rf){
|
|
128
|
+
const vec2 k1 = vec2(0.809016994375, -0.587785252292);
|
|
129
|
+
const vec2 k2 = vec2(-k1.x, k1.y);
|
|
130
|
+
p.x = abs(p.x);
|
|
131
|
+
p -= 2.0 * max(dot(k1, p), 0.0) * k1;
|
|
132
|
+
p -= 2.0 * max(dot(k2, p), 0.0) * k2;
|
|
133
|
+
p.x = abs(p.x);
|
|
134
|
+
p.y -= r;
|
|
135
|
+
vec2 ba = rf * vec2(-k1.y, k1.x) - vec2(0.0, 1.0);
|
|
136
|
+
float h = clamp(dot(p, ba) / dot(ba, ba), 0.0, r);
|
|
137
|
+
return length(p - ba * h) * sign(p.y * ba.x - p.x * ba.y);
|
|
138
|
+
}
|
|
139
|
+
float sdHexagon(vec2 p, float r){
|
|
140
|
+
const vec3 k = vec3(-0.866025404, 0.5, 0.577350269);
|
|
141
|
+
p = abs(p);
|
|
142
|
+
p -= 2.0 * min(dot(k.xy, p), 0.0) * k.xy;
|
|
143
|
+
p -= vec2(clamp(p.x, -k.z * r, k.z * r), r);
|
|
144
|
+
return length(p) * sign(p.y);
|
|
145
|
+
}
|
|
146
|
+
float sdEqTri(vec2 p, float r){
|
|
147
|
+
const float k = 1.7320508;
|
|
148
|
+
p.x = abs(p.x) - r;
|
|
149
|
+
p.y = p.y + r / k;
|
|
150
|
+
if (p.x + k * p.y > 0.0) p = vec2(p.x - k * p.y, -k * p.x - p.y) / 2.0;
|
|
151
|
+
p.x -= clamp(p.x, -2.0 * r, 0.0);
|
|
152
|
+
return -length(p) * sign(p.y);
|
|
153
|
+
}
|
|
154
|
+
float dot2(vec2 v){ return dot(v, v); }
|
|
155
|
+
float sdHeart(vec2 p){
|
|
156
|
+
p.x = abs(p.x);
|
|
157
|
+
if (p.y + p.x > 1.0) return sqrt(dot2(p - vec2(0.25, 0.75))) - 0.35355339;
|
|
158
|
+
return sqrt(min(dot2(p - vec2(0.0, 1.0)), dot2(p - 0.5 * max(p.x + p.y, 0.0)))) * sign(p.x - p.y);
|
|
159
|
+
}
|
|
160
|
+
float sdVesica(vec2 p, float r, float d){
|
|
161
|
+
p = abs(p);
|
|
162
|
+
float b = sqrt(r * r - d * d);
|
|
163
|
+
return ((p.y - b) * d > p.x * b) ? length(p - vec2(0.0, b)) : length(p - vec2(-d, 0.0)) - r;
|
|
164
|
+
}
|
|
165
|
+
float floretShape(float shape, vec2 q, float op, float hh, out float stroke){
|
|
166
|
+
stroke = 0.0;
|
|
167
|
+
float r = length(q);
|
|
168
|
+
float an = atan(q.y, q.x);
|
|
169
|
+
if (shape < 1.5){
|
|
170
|
+
// 1 Seed: the achene of a real sunflower, an almond (vesica) lying along
|
|
171
|
+
// the radius, fattening as the floret matures
|
|
172
|
+
return sdVesica(q.yx, 1.0, mix(0.82, 0.55, op));
|
|
173
|
+
} else if (shape < 2.5){
|
|
174
|
+
// 2 Ring: a bokeh annulus that widens as it opens
|
|
175
|
+
stroke = 1.0;
|
|
176
|
+
return abs(r - mix(0.45, 0.78, op)) - 0.07;
|
|
177
|
+
} else if (shape < 3.5){
|
|
178
|
+
// 3 Crescent: a moon whose phase is the bloom — a sliver on the rising
|
|
179
|
+
// edge of the wave, a full disc behind it. Lit limb faces the rim.
|
|
180
|
+
float dd = r - 0.8;
|
|
181
|
+
float cut = length(q + vec2(mix(0.28, 1.65, op), 0.0)) - 0.8;
|
|
182
|
+
return max(dd, -cut);
|
|
183
|
+
} else if (shape < 4.5){
|
|
184
|
+
// 4 Sparkle: an astroid, |x|^(2/3) + |y|^(2/3) = R^(2/3) — the four-point
|
|
185
|
+
// glint of a caustic, long rays along the radius
|
|
186
|
+
vec2 a = abs(q) / vec2(1.0, 0.62);
|
|
187
|
+
float R = mix(0.55, 1.0, op);
|
|
188
|
+
return (pow(a.x, 0.6667) + pow(a.y, 0.6667) - pow(R, 0.6667)) * 0.9;
|
|
189
|
+
} else if (shape < 5.5){
|
|
190
|
+
// 5 Reuleaux: the constant-width triangle — the intersection of three
|
|
191
|
+
// discs centred on an equilateral triangle's corners. It turns a third of
|
|
192
|
+
// a revolution inside its cell as the floret opens.
|
|
193
|
+
float rot = op * TAU / 3.0;
|
|
194
|
+
float d = -1e9;
|
|
195
|
+
for (int k = 0; k < 3; k++){
|
|
196
|
+
float ak = rot + float(k) * TAU / 3.0;
|
|
197
|
+
vec2 vk = 0.52 * vec2(cos(ak), sin(ak));
|
|
198
|
+
d = max(d, length(q + vk) - 0.9);
|
|
199
|
+
}
|
|
200
|
+
return d;
|
|
201
|
+
} else if (shape < 6.5){
|
|
202
|
+
// 6 Spiral: a logarithmic spiral r = a e^(b theta), the fiddlehead of a
|
|
203
|
+
// fern — tightly curled in bud, unrolling as it opens
|
|
204
|
+
stroke = 1.0;
|
|
205
|
+
float b = mix(0.11, 0.24, op);
|
|
206
|
+
float t = (an - log(max(r, 1e-3) / 0.05) / b) / TAU;
|
|
207
|
+
float gap = abs(fract(t) - 0.5) * TAU * b * r; // distance to the nearest turn
|
|
208
|
+
float d = gap - 0.05;
|
|
209
|
+
return max(d, r - 0.92);
|
|
210
|
+
} else if (shape < 7.5){
|
|
211
|
+
// 7 Target: concentric rings that ripple outward through each floret
|
|
212
|
+
stroke = 1.0;
|
|
213
|
+
float w = abs(fract(r * 2.6 - op * 1.5) - 0.5) / 2.6;
|
|
214
|
+
return max(w - 0.035, r - 0.95);
|
|
215
|
+
} else if (shape < 8.5){
|
|
216
|
+
// 8 Pebble: a superellipse |x|^n + |y|^n = 1 that swells from a diamond
|
|
217
|
+
// (n = 1) through a circle (n = 2) to a soft square as it opens
|
|
218
|
+
float n = mix(1.0, 3.5, op);
|
|
219
|
+
vec2 a = abs(q) / 0.78;
|
|
220
|
+
return (pow(pow(a.x, n) + pow(a.y, n), 1.0 / n) - 1.0) * 0.78;
|
|
221
|
+
} else if (shape < 9.5){
|
|
222
|
+
// 9 Dot: a plain disc that swells as it opens
|
|
223
|
+
return r - mix(0.32, 0.62, op);
|
|
224
|
+
} else if (shape < 10.5){
|
|
225
|
+
// 10 Dots: a sunflower inside every floret — 13 dots at the golden angle
|
|
226
|
+
// (Vogel again, one level down). The dots appear one by one, centre
|
|
227
|
+
// first, as the floret opens, so the head is self-similar.
|
|
228
|
+
float d = 1e9;
|
|
229
|
+
float shown = 1.0 + op * 12.0;
|
|
230
|
+
for (int k = 0; k < 13; k++){
|
|
231
|
+
float sk = float(k) + 0.5;
|
|
232
|
+
if (float(k) >= shown) break;
|
|
233
|
+
float ak = sk * 2.39996323;
|
|
234
|
+
vec2 pk = 0.235 * sqrt(sk) * vec2(cos(ak), sin(ak));
|
|
235
|
+
d = min(d, length(q - pk) - 0.105);
|
|
236
|
+
}
|
|
237
|
+
return d;
|
|
238
|
+
} else if (shape < 11.5){
|
|
239
|
+
// 11 Square: a rounded square that turns from square to diamond (45 deg)
|
|
240
|
+
// as it opens
|
|
241
|
+
vec2 p = rot2(op * PI * 0.25) * q;
|
|
242
|
+
return sdBox(p, vec2(0.56)) - 0.07;
|
|
243
|
+
} else if (shape < 12.5){
|
|
244
|
+
// 12 Star: a five-pointed star with one point down the radius; soft and
|
|
245
|
+
// round in bud, sharp when open
|
|
246
|
+
return sdStar5(q.yx, 0.88, mix(0.85, 0.4, op));
|
|
247
|
+
} else if (shape < 13.5){
|
|
248
|
+
// 13 Hexagon: a hex tile with a hex window that opens in it — a
|
|
249
|
+
// honeycomb cell in every floret
|
|
250
|
+
float outer = sdHexagon(q, 0.66);
|
|
251
|
+
float inner = sdHexagon(q, mix(0.0, 0.46, op));
|
|
252
|
+
return max(outer, -inner);
|
|
253
|
+
} else if (shape < 14.5){
|
|
254
|
+
// 14 Triangle: an equilateral triangle pointing out along the radius
|
|
255
|
+
return sdEqTri(q.yx, mix(0.48, 0.66, op)) - 0.06;
|
|
256
|
+
} else if (shape < 15.5){
|
|
257
|
+
// 15 Cross: a plus that turns into an X as it opens
|
|
258
|
+
vec2 p = rot2(op * PI * 0.25) * q;
|
|
259
|
+
return min(sdBox(p, vec2(0.74, 0.17)), sdBox(p, vec2(0.17, 0.74))) - 0.04;
|
|
260
|
+
} else if (shape < 16.5){
|
|
261
|
+
// 16 Heart: Inigo Quilez's exact heart, lobes out, tip to the centre
|
|
262
|
+
float s = mix(1.35, 1.7, op);
|
|
263
|
+
vec2 p = vec2(q.y, q.x + 0.8 * s / 1.7) / s;
|
|
264
|
+
return sdHeart(p) * s;
|
|
265
|
+
} else if (shape < 17.5){
|
|
266
|
+
// 17 Chevron: an arrowhead pointing out along the radius — a field of
|
|
267
|
+
// them reads as the head's own outward growth. It flattens into a bar
|
|
268
|
+
// as it opens.
|
|
269
|
+
stroke = 1.0;
|
|
270
|
+
float w = mix(0.62, 0.15, op);
|
|
271
|
+
vec2 tip = vec2(0.42, 0.0);
|
|
272
|
+
float d = min(sdSegment(q, tip, vec2(-0.3, w)), sdSegment(q, tip, vec2(-0.3, -w)));
|
|
273
|
+
return d - 0.1;
|
|
274
|
+
} else if (shape < 18.5){
|
|
275
|
+
// 18 Infinity: the lemniscate of Bernoulli (x^2 + y^2)^2 = a^2 (x^2 - y^2),
|
|
276
|
+
// drawn by its implicit distance F / |grad F|
|
|
277
|
+
stroke = 1.0;
|
|
278
|
+
float a = mix(0.62, 0.86, op);
|
|
279
|
+
vec2 p = q;
|
|
280
|
+
float rr = dot(p, p);
|
|
281
|
+
float F = rr * rr - a * a * (p.x * p.x - p.y * p.y);
|
|
282
|
+
vec2 G = 4.0 * rr * p - 2.0 * a * a * vec2(p.x, -p.y);
|
|
283
|
+
return abs(F) / max(length(G), 1e-3) - 0.055;
|
|
284
|
+
} else if (shape < 19.5){
|
|
285
|
+
// 19 Gear: a cog with eight teeth around an axle hole; it turns half a
|
|
286
|
+
// tooth as it opens
|
|
287
|
+
float n = 8.0;
|
|
288
|
+
float tooth = smoothstep(-0.25, 0.25, cos(n * an + op * PI));
|
|
289
|
+
float R = 0.56 + 0.16 * tooth;
|
|
290
|
+
float d = (r - R) * 0.8;
|
|
291
|
+
return max(d, -(r - 0.2));
|
|
292
|
+
} else if (shape < 20.5){
|
|
293
|
+
// 20 Atom: a nucleus and three elliptical orbits 60 deg apart, each with
|
|
294
|
+
// its electron; the electrons move round as the floret opens
|
|
295
|
+
float d = r - 0.15;
|
|
296
|
+
for (int k = 0; k < 3; k++){
|
|
297
|
+
float ak = float(k) * PI / 3.0;
|
|
298
|
+
vec2 p = rot2(ak) * q;
|
|
299
|
+
vec2 ab = vec2(0.84, 0.3);
|
|
300
|
+
vec2 pn = p / ab;
|
|
301
|
+
float f = length(pn) - 1.0;
|
|
302
|
+
vec2 g = pn / (ab * max(length(pn), 1e-4));
|
|
303
|
+
d = min(d, abs(f) / max(length(g), 1e-4) - 0.035);
|
|
304
|
+
float ae = op * TAU + float(k) * 2.1 + hh * TAU;
|
|
305
|
+
vec2 e = rot2(-ak) * (ab * vec2(cos(ae), sin(ae)));
|
|
306
|
+
d = min(d, length(q - e) - 0.085);
|
|
307
|
+
}
|
|
308
|
+
return d;
|
|
309
|
+
} else {
|
|
310
|
+
// 21 Sunburst: a small sun, twelve rays that lengthen as it opens
|
|
311
|
+
float n = 12.0;
|
|
312
|
+
float aw = (fract(an * n / TAU + 0.5) - 0.5) * TAU / n;
|
|
313
|
+
float ray = abs(r * sin(aw)) - 0.045 * (1.0 - r * 0.6);
|
|
314
|
+
ray = max(ray, max(0.3 - r, r - mix(0.55, 0.95, op)));
|
|
315
|
+
return min(ray, r - 0.2);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
void main(){
|
|
320
|
+
vec2 coord = vGridPos / max(u_cellSize, 1e-4);
|
|
321
|
+
vec2 focus = u_focus / max(u_cellSize, 1e-4);
|
|
322
|
+
float t = u_time * u_animSpeed;
|
|
323
|
+
|
|
324
|
+
// Vogel's model of a sunflower head: seed n sits at radius c*sqrt(n) and angle
|
|
325
|
+
// n * divergence. At the golden angle (137.508 deg) no two seeds ever line up,
|
|
326
|
+
// so each takes an almost equal share of the disk and the florets pack with
|
|
327
|
+
// no gaps and no rings. The head itself never moves — any turning or drifting
|
|
328
|
+
// of the whole is the parent object's transform. What moves is the bloom.
|
|
329
|
+
const float C = 0.5641896; // 1/sqrt(pi): one cell of area per seed
|
|
330
|
+
float g = u_divergence / 360.0; // turns per seed
|
|
331
|
+
vec2 fc = fwidth(coord);
|
|
332
|
+
float fp = max(max(fc.x, fc.y), 1e-6);
|
|
333
|
+
|
|
334
|
+
float rp = length(coord);
|
|
335
|
+
float thp = atan(coord.y, coord.x) / TAU;
|
|
336
|
+
float sT = (rp / C) * (rp / C);
|
|
337
|
+
float Rmax = u_fadeDistance / max(u_cellSize, 1e-4);
|
|
338
|
+
float sMax = pow(Rmax * 1.05 / C, 2.0);
|
|
339
|
+
// slots whose radius lies within ~1.2 cells of this pixel's radius
|
|
340
|
+
float W = 2.0 * sqrt(sT) * 1.25 / C + 3.0;
|
|
341
|
+
float m0 = max(0.0, floor(sT - W));
|
|
342
|
+
float m1 = min(floor(sT + W), sMax);
|
|
343
|
+
|
|
344
|
+
// pass 1: the nearest seed, plus a short list of close ones for the cell edges
|
|
345
|
+
vec2 cand[16];
|
|
346
|
+
int nc = 0;
|
|
347
|
+
float d1 = 1e9;
|
|
348
|
+
vec2 p1 = vec2(0.0);
|
|
349
|
+
float id1 = 0.0;
|
|
350
|
+
for (int i = 0; i < 256; i++){
|
|
351
|
+
float m = m0 + float(i);
|
|
352
|
+
if (m > m1) break;
|
|
353
|
+
float rs = C * sqrt(m);
|
|
354
|
+
if (abs(rs - rp) > 1.25) continue;
|
|
355
|
+
float dth = fract(m * g - thp + 0.5) - 0.5; // angular gap, turns
|
|
356
|
+
if (abs(dth) * TAU * max(rp, rs) > 1.7) continue; // cheap reject before trig
|
|
357
|
+
float a = m * g * TAU;
|
|
358
|
+
vec2 p = rs * vec2(cos(a), sin(a));
|
|
359
|
+
float dd = length(coord - p);
|
|
360
|
+
if (dd < d1){ d1 = dd; p1 = p; id1 = m; }
|
|
361
|
+
if (nc < 16){ cand[nc] = p; nc++; }
|
|
362
|
+
}
|
|
363
|
+
// pass 2: distance to the Voronoi edge = nearest bisector against p1
|
|
364
|
+
float e = 1e9;
|
|
365
|
+
for (int i = 0; i < 16; i++){
|
|
366
|
+
if (i >= nc) break;
|
|
367
|
+
vec2 dq = cand[i] - p1;
|
|
368
|
+
float L2 = dot(dq, dq);
|
|
369
|
+
if (L2 < 1e-6) continue;
|
|
370
|
+
e = min(e, dot(0.5 * (p1 + cand[i]) - coord, dq) * inversesqrt(L2));
|
|
371
|
+
}
|
|
372
|
+
float have = step(d1, 2.0);
|
|
373
|
+
e = max(e, 0.0);
|
|
374
|
+
float hh = hash21(vec2(id1 * 0.0137, 3.7));
|
|
375
|
+
|
|
376
|
+
// Voronoi edges stay hairline: the grooves below do the separating.
|
|
377
|
+
float lines = (1.0 - clamp(e / (fp * max(u_lineWidth, 0.05)), 0.0, 1.0)) * have;
|
|
378
|
+
|
|
379
|
+
// ---- age and bloom ------------------------------------------------------
|
|
380
|
+
// Florets open in rings that travel from the rim toward the centre
|
|
381
|
+
// (centripetal, as in a real capitulum). sectionSize rings cross the head
|
|
382
|
+
// at once; each floret opens with its own small delay, so a ring's edge is
|
|
383
|
+
// ragged like a living one rather than a ruled circle.
|
|
384
|
+
float age = clamp(length(p1) / max(Rmax, 1e-3), 0.0, 1.0);
|
|
385
|
+
vec3 ageCol = mix(u_glowColor, u_lineColor, smoothstep(0.0, 0.45, age));
|
|
386
|
+
ageCol = mix(ageCol, u_cellColor, smoothstep(0.45, 1.0, age));
|
|
387
|
+
float rings = max(floor(u_sectionSize + 0.5), 1.0);
|
|
388
|
+
float wave = sin(TAU * (age * rings + u_bloomPhase) + hh * 1.2);
|
|
389
|
+
float open = smoothstep(-0.25, 0.65, wave);
|
|
390
|
+
|
|
391
|
+
// the opening front gets its outline lit: that is the accent
|
|
392
|
+
float front = open * (1.0 - open) * 4.0;
|
|
393
|
+
float accent = (1.0 - clamp(e / (fp * max(u_sectionWidth, 0.05)), 0.0, 1.0)) * front * have;
|
|
394
|
+
if (u_sectionWidth <= 0.0) accent = 0.0;
|
|
395
|
+
|
|
396
|
+
// ---- relief ---------------------------------------------------------------
|
|
397
|
+
// Each floret is a soft dome over its own Voronoi cell. tr runs 0 at the seed
|
|
398
|
+
// to 1 at the cell wall whatever the cell's shape, so the dome follows the
|
|
399
|
+
// cell, lit by a low key light from the upper left.
|
|
400
|
+
float tr = clamp(d1 / max(d1 + e, 1e-4), 0.0, 1.0);
|
|
401
|
+
vec2 dir = (coord - p1) / max(d1, 1e-4);
|
|
402
|
+
float hz = sqrt(max(1.0 - tr * tr, 0.0));
|
|
403
|
+
vec3 nrm = normalize(vec3(dir * tr * 1.2, hz));
|
|
404
|
+
float lit = max(dot(nrm, normalize(vec3(-0.55, 0.45, 0.70))), 0.0);
|
|
405
|
+
float shade = mix(0.75, 0.25 + 1.05 * lit, u_relief);
|
|
406
|
+
float groove = smoothstep(0.0, 0.14, e);
|
|
407
|
+
float body = shade * groove * have * (0.55 + 0.45 * open);
|
|
408
|
+
|
|
409
|
+
// ---- the floret's mark ---------------------------------------------------
|
|
410
|
+
// shape 0 draws only the lit domes; 1..8 add a mark in each floret,
|
|
411
|
+
// oriented along the head's radius and opened by the bloom wave.
|
|
412
|
+
float shape = floor(u_shape + 0.5);
|
|
413
|
+
vec2 rad = length(p1) > 1e-3 ? normalize(p1) : vec2(1.0, 0.0);
|
|
414
|
+
vec2 lp = coord - p1;
|
|
415
|
+
float sc = 0.42 * max(u_shapeSize, 0.05);
|
|
416
|
+
vec2 q = vec2(dot(lp, rad), dot(lp, vec2(-rad.y, rad.x))) / sc;
|
|
417
|
+
float fq = fp / sc;
|
|
418
|
+
float stroke = 0.0;
|
|
419
|
+
float sd = shape > 0.5 ? floretShape(shape, q, open, hh, stroke) : 1e3;
|
|
420
|
+
// filled shapes: solid body with a bright rim; strokes: just the line
|
|
421
|
+
float fill = (1.0 - smoothstep(-fq, fq, sd)) * (1.0 - stroke);
|
|
422
|
+
float rim = 1.0 - smoothstep(0.0, fq * 1.6, abs(sd));
|
|
423
|
+
if (stroke > 0.5) rim = 1.0 - smoothstep(-fq, fq, sd);
|
|
424
|
+
float mark = (fill * 0.55 * (0.4 + 0.8 * lit) + rim * 0.9) * (0.35 + 0.65 * open) * u_shapeGlow * have;
|
|
425
|
+
// the mark sits inside its floret: never across the groove
|
|
426
|
+
mark *= smoothstep(0.02, 0.08, e);
|
|
427
|
+
|
|
428
|
+
float dmin = e * have;
|
|
429
|
+
float idAcc = id1;
|
|
430
|
+
vec2 cellPos = p1;
|
|
431
|
+
float cellH = hh;
|
|
432
|
+
float tone = step(0.55, cellH);
|
|
433
|
+
|
|
434
|
+
vec3 markCol = mix(u_sectionColor, u_glowColor, 1.0 - age);
|
|
435
|
+
vec3 extraCol = ageCol * body * 0.6 + markCol * mark;
|
|
436
|
+
float extraA = max(body * 0.55, mark * 0.9);
|
|
437
|
+
|
|
438
|
+
// ---- line animation --------------------------------------------------
|
|
439
|
+
float lineAnim = 1.0;
|
|
440
|
+
// Mode 0 is static: the chain starts at 0.5 so 0 never falls into flow.
|
|
441
|
+
if (u_lineMode < 0.5){
|
|
442
|
+
} else if (u_lineMode < 1.5){
|
|
443
|
+
lineAnim = 0.5 + 0.5 * sin(length(cellPos - focus) * u_animScale - t);
|
|
444
|
+
} else if (u_lineMode < 2.5){
|
|
445
|
+
lineAnim = 0.5 + 0.5 * sin(dot(cellPos, vec2(0.5, 0.5)) * u_animScale - t);
|
|
446
|
+
} else if (u_lineMode < 3.5){
|
|
447
|
+
float s = fract((coord.x + coord.y) * 0.05 * u_animScale - t * 0.15);
|
|
448
|
+
lineAnim = 0.25 + smoothstep(0.0, 0.15, s) * (1.0 - smoothstep(0.15, 0.35, s));
|
|
449
|
+
} else if (u_lineMode < 4.5){
|
|
450
|
+
lineAnim = 0.5 + 0.5 * sin(t);
|
|
451
|
+
}
|
|
452
|
+
lineAnim = mix(1.0, lineAnim, u_animIntensity);
|
|
453
|
+
|
|
454
|
+
// ---- cell fill -------------------------------------------------------
|
|
455
|
+
float cell = 0.0;
|
|
456
|
+
if (u_cellMode < 0.5){
|
|
457
|
+
} else if (u_cellMode < 1.5){
|
|
458
|
+
cell = 0.5 + 0.5 * sin(idAcc * 0.05 * u_animScale - t);
|
|
459
|
+
} else if (u_cellMode < 2.5){
|
|
460
|
+
cell = 0.5 + 0.5 * sin(t * (0.6 + cellH) + cellH * TAU);
|
|
461
|
+
} else if (u_cellMode < 3.5){
|
|
462
|
+
cell = smoothstep(0.6, 1.0, sin(length(cellPos - focus) * u_animScale - t));
|
|
463
|
+
} else if (u_cellMode < 4.5){
|
|
464
|
+
cell = step(0.5, cellH) * (0.5 + 0.5 * sin(t));
|
|
465
|
+
}
|
|
466
|
+
cell *= u_animIntensity;
|
|
467
|
+
cell *= smoothstep(0.0, 0.16, dmin); // keep the fill off its own edges
|
|
468
|
+
|
|
469
|
+
float r = length(vGridPos) / max(u_fadeDistance, 1e-4);
|
|
470
|
+
float fade = 1.0 - smoothstep(1.0 - u_fadeStrength, 1.0, r);
|
|
471
|
+
|
|
472
|
+
vec3 col = u_bgColor * u_bgOpacity;
|
|
473
|
+
float a = u_bgOpacity;
|
|
474
|
+
|
|
475
|
+
col += mix(u_cellColor, u_cellColor * 2.2, tone) * cell;
|
|
476
|
+
a = max(a, cell * 0.9);
|
|
477
|
+
float linesI = lines * lineAnim;
|
|
478
|
+
col += u_lineColor * linesI; a = max(a, linesI);
|
|
479
|
+
float accentI = accent * lineAnim;
|
|
480
|
+
col += u_sectionColor * accentI; a = max(a, accentI);
|
|
481
|
+
col += u_glowColor * (linesI * 0.2 + cell * 0.35) * u_animIntensity;
|
|
482
|
+
col += extraCol; a = max(a, extraA);
|
|
483
|
+
|
|
484
|
+
col *= fade;
|
|
485
|
+
a *= fade;
|
|
486
|
+
|
|
487
|
+
// ---- reveal ----------------------------------------------------------
|
|
488
|
+
if (u_reveal < 0.999){
|
|
489
|
+
float rd = length(vGridPos - u_focus) / max(u_fadeDistance, 1e-4);
|
|
490
|
+
float edge = u_reveal * 1.1;
|
|
491
|
+
float mask = 1.0 - smoothstep(edge - 0.05, edge, rd);
|
|
492
|
+
float front = mask * smoothstep(edge - 0.22, edge - 0.05, rd);
|
|
493
|
+
col = col * mask + u_glowColor * front * (a * 1.8 + 0.08);
|
|
494
|
+
a = max(a * mask, front * 0.10);
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
if (a < 0.002) discard;
|
|
498
|
+
gl_FragColor = vec4(col, a);
|
|
499
|
+
}
|
|
500
|
+
`;
|
|
501
|
+
export const PhyllotaxisGridMaterial = shaderMaterial({
|
|
502
|
+
u_time: phyllotaxisGridMaterialDefaults.u_time,
|
|
503
|
+
u_cellSize: phyllotaxisGridMaterialDefaults.u_cellSize,
|
|
504
|
+
u_lineWidth: phyllotaxisGridMaterialDefaults.u_lineWidth,
|
|
505
|
+
u_sectionSize: phyllotaxisGridMaterialDefaults.u_sectionSize,
|
|
506
|
+
u_sectionWidth: phyllotaxisGridMaterialDefaults.u_sectionWidth,
|
|
507
|
+
u_lineColor: phyllotaxisGridMaterialDefaults.u_lineColor.clone(),
|
|
508
|
+
u_sectionColor: phyllotaxisGridMaterialDefaults.u_sectionColor.clone(),
|
|
509
|
+
u_cellColor: phyllotaxisGridMaterialDefaults.u_cellColor.clone(),
|
|
510
|
+
u_glowColor: phyllotaxisGridMaterialDefaults.u_glowColor.clone(),
|
|
511
|
+
u_bgColor: phyllotaxisGridMaterialDefaults.u_bgColor.clone(),
|
|
512
|
+
u_bgOpacity: phyllotaxisGridMaterialDefaults.u_bgOpacity,
|
|
513
|
+
u_lineMode: phyllotaxisGridMaterialDefaults.u_lineMode,
|
|
514
|
+
u_cellMode: phyllotaxisGridMaterialDefaults.u_cellMode,
|
|
515
|
+
u_animSpeed: phyllotaxisGridMaterialDefaults.u_animSpeed,
|
|
516
|
+
u_animScale: phyllotaxisGridMaterialDefaults.u_animScale,
|
|
517
|
+
u_animIntensity: phyllotaxisGridMaterialDefaults.u_animIntensity,
|
|
518
|
+
u_fadeDistance: phyllotaxisGridMaterialDefaults.u_fadeDistance,
|
|
519
|
+
u_fadeStrength: phyllotaxisGridMaterialDefaults.u_fadeStrength,
|
|
520
|
+
u_focus: phyllotaxisGridMaterialDefaults.u_focus.clone(),
|
|
521
|
+
u_mouse: phyllotaxisGridMaterialDefaults.u_mouse.clone(),
|
|
522
|
+
u_displace: phyllotaxisGridMaterialDefaults.u_displace,
|
|
523
|
+
u_reveal: phyllotaxisGridMaterialDefaults.u_reveal,
|
|
524
|
+
u_divergence: phyllotaxisGridMaterialDefaults.u_divergence,
|
|
525
|
+
u_bloomRate: phyllotaxisGridMaterialDefaults.u_bloomRate,
|
|
526
|
+
u_relief: phyllotaxisGridMaterialDefaults.u_relief,
|
|
527
|
+
u_shape: phyllotaxisGridMaterialDefaults.u_shape,
|
|
528
|
+
u_shapeSize: phyllotaxisGridMaterialDefaults.u_shapeSize,
|
|
529
|
+
u_shapeGlow: phyllotaxisGridMaterialDefaults.u_shapeGlow,
|
|
530
|
+
u_bloomPhase: phyllotaxisGridMaterialDefaults.u_bloomPhase,
|
|
531
|
+
}, vertex, fragment);
|
|
532
|
+
extend({ PhyllotaxisGridMaterial });
|
|
@@ -34,13 +34,13 @@ const fragmentShader = /*glsl*/ `
|
|
|
34
34
|
// Sky gradient from horizon to zenith
|
|
35
35
|
vec3 skyColor = mix(uSkyColorLow, uSkyColorHigh, clamp(direction.y * 0.5 + 0.5, 0.0, 1.0));
|
|
36
36
|
|
|
37
|
-
//
|
|
37
|
+
// Sun direction from azimuth and elevation, same convention as core sunUtils
|
|
38
38
|
float azimuth = radians(uSunAzimuth);
|
|
39
39
|
float elevation = radians(uSunElevation);
|
|
40
40
|
vec3 sunDirection = normalize(vec3(
|
|
41
|
-
cos(elevation) *
|
|
41
|
+
cos(elevation) * cos(azimuth),
|
|
42
42
|
sin(elevation),
|
|
43
|
-
cos(elevation) *
|
|
43
|
+
cos(elevation) * sin(azimuth)
|
|
44
44
|
));
|
|
45
45
|
|
|
46
46
|
// Sun disc with intensity falloff
|
|
@@ -15,6 +15,10 @@ export interface StarsMaterialUniforms {
|
|
|
15
15
|
colorMix: {
|
|
16
16
|
value: number;
|
|
17
17
|
};
|
|
18
|
+
/** Multiplier on every star's sprite size. */
|
|
19
|
+
sizeScale: {
|
|
20
|
+
value: number;
|
|
21
|
+
};
|
|
18
22
|
}
|
|
19
23
|
declare global {
|
|
20
24
|
namespace JSX {
|
|
@@ -29,6 +33,7 @@ declare const StarsMaterial: import("@react-three/fiber").ConstructorRepresentat
|
|
|
29
33
|
uColor: THREE.Color;
|
|
30
34
|
targetColor: THREE.Color;
|
|
31
35
|
colorMix: number;
|
|
36
|
+
sizeScale: number;
|
|
32
37
|
}> & {
|
|
33
38
|
key: string;
|
|
34
39
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StarsMaterial.d.ts","sourceRoot":"","sources":["../../src/shaders/StarsMaterial.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,MAAM,WAAW,qBAAqB;IAClC,IAAI,EAAE;QACF,KAAK,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,OAAO,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,MAAM,EAAE;QACJ,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;KACtB,CAAC;IACF,WAAW,EAAE;QACT,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;KACtB,CAAC;IACF,QAAQ,EAAE;QACN,KAAK,EAAE,MAAM,CAAC;KACjB,CAAC;CACL;AAED,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,GAAG,CAAC;QACV,UAAU,iBAAiB;YACvB,aAAa,EAAE,GAAG,CAAC;SACtB;KACJ;CACJ;
|
|
1
|
+
{"version":3,"file":"StarsMaterial.d.ts","sourceRoot":"","sources":["../../src/shaders/StarsMaterial.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,MAAM,WAAW,qBAAqB;IAClC,IAAI,EAAE;QACF,KAAK,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,OAAO,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,MAAM,EAAE;QACJ,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;KACtB,CAAC;IACF,WAAW,EAAE;QACT,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;KACtB,CAAC;IACF,QAAQ,EAAE;QACN,KAAK,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,8CAA8C;IAC9C,SAAS,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;KACjB,CAAC;CACL;AAED,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,GAAG,CAAC;QACV,UAAU,iBAAiB;YACvB,aAAa,EAAE,GAAG,CAAC;SACtB;KACJ;CACJ;AAgED,QAAA,MAAM,aAAa;;;;;;;;;CAOa,CAAC;AAGjC,OAAO,EAAE,aAAa,EAAE,CAAC"}
|