@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.
Files changed (185) hide show
  1. package/dist/autoAnimate/composer.d.ts +6 -0
  2. package/dist/autoAnimate/composer.d.ts.map +1 -1
  3. package/dist/autoAnimate/composer.js +4 -3
  4. package/dist/autoAnimate/describeScene.js +1 -1
  5. package/dist/catalog/catalogInfo.d.ts +22 -0
  6. package/dist/catalog/catalogInfo.d.ts.map +1 -0
  7. package/dist/catalog/catalogInfo.js +204 -0
  8. package/dist/catalog/index.d.ts +3 -0
  9. package/dist/catalog/index.d.ts.map +1 -0
  10. package/dist/catalog/index.js +2 -0
  11. package/dist/catalog/objectCatalog.d.ts +33 -0
  12. package/dist/catalog/objectCatalog.d.ts.map +1 -0
  13. package/dist/catalog/objectCatalog.js +99 -0
  14. package/dist/data/allMaterials.js +2 -2
  15. package/dist/data/environmentDefaults.d.ts +10 -0
  16. package/dist/data/environmentDefaults.d.ts.map +1 -0
  17. package/dist/data/environmentDefaults.js +126 -0
  18. package/dist/data/gridsDefaults.d.ts +2 -0
  19. package/dist/data/gridsDefaults.d.ts.map +1 -1
  20. package/dist/data/gridsDefaults.js +186 -0
  21. package/dist/data/index.d.ts +4 -0
  22. package/dist/data/index.d.ts.map +1 -1
  23. package/dist/data/index.js +4 -0
  24. package/dist/data/landDefaults.d.ts +26 -0
  25. package/dist/data/landDefaults.d.ts.map +1 -0
  26. package/dist/data/landDefaults.js +76 -0
  27. package/dist/data/spaceDefaults.d.ts +10 -0
  28. package/dist/data/spaceDefaults.d.ts.map +1 -0
  29. package/dist/data/spaceDefaults.js +46 -0
  30. package/dist/data/textDefaults.d.ts +16 -0
  31. package/dist/data/textDefaults.d.ts.map +1 -0
  32. package/dist/data/textDefaults.js +199 -0
  33. package/dist/environment/oceanConfigs.d.ts +5 -4
  34. package/dist/environment/oceanConfigs.d.ts.map +1 -1
  35. package/dist/environment/oceanConfigs.js +2 -2
  36. package/dist/environment/terrainConfigs.d.ts +78 -0
  37. package/dist/environment/terrainConfigs.d.ts.map +1 -1
  38. package/dist/environment/terrainConfigs.js +72 -2
  39. package/dist/index.d.ts +3 -1
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +3 -1
  42. package/dist/properties/registry.d.ts +10 -1
  43. package/dist/properties/registry.d.ts.map +1 -1
  44. package/dist/properties/registry.js +60 -9
  45. package/dist/properties/tables/environmentProperties.d.ts +9 -0
  46. package/dist/properties/tables/environmentProperties.d.ts.map +1 -0
  47. package/dist/properties/tables/environmentProperties.js +127 -0
  48. package/dist/properties/tables/gridProperties.d.ts.map +1 -1
  49. package/dist/properties/tables/gridProperties.js +184 -82
  50. package/dist/properties/tables/index.d.ts +4 -1
  51. package/dist/properties/tables/index.d.ts.map +1 -1
  52. package/dist/properties/tables/index.js +4 -1
  53. package/dist/properties/tables/landProperties.d.ts +5 -0
  54. package/dist/properties/tables/landProperties.d.ts.map +1 -0
  55. package/dist/properties/tables/landProperties.js +24 -0
  56. package/dist/properties/tables/lightProperties.js +1 -1
  57. package/dist/properties/tables/materialBounds.js +1 -1
  58. package/dist/properties/tables/optionalProperties.d.ts +1 -2
  59. package/dist/properties/tables/optionalProperties.d.ts.map +1 -1
  60. package/dist/properties/tables/optionalProperties.js +21 -0
  61. package/dist/properties/tables/spaceProperties.d.ts +8 -0
  62. package/dist/properties/tables/spaceProperties.d.ts.map +1 -0
  63. package/dist/properties/tables/spaceProperties.js +42 -0
  64. package/dist/properties/tables/textProperties.d.ts +4 -0
  65. package/dist/properties/tables/textProperties.d.ts.map +1 -0
  66. package/dist/properties/tables/textProperties.js +361 -0
  67. package/dist/properties/types.d.ts +1 -1
  68. package/dist/properties/types.d.ts.map +1 -1
  69. package/dist/services/MaterialRegistry.d.ts.map +1 -1
  70. package/dist/services/MaterialRegistry.js +2 -0
  71. package/dist/services/SkySystemManager.d.ts +22 -0
  72. package/dist/services/SkySystemManager.d.ts.map +1 -1
  73. package/dist/services/SkySystemManager.js +50 -18
  74. package/dist/services/TextureResolver.d.ts.map +1 -1
  75. package/dist/services/TextureResolver.js +22 -0
  76. package/dist/services/index.d.ts +1 -1
  77. package/dist/services/index.d.ts.map +1 -1
  78. package/dist/services/index.js +1 -1
  79. package/dist/shaders/ApollonianGridMaterial.d.ts +70 -0
  80. package/dist/shaders/ApollonianGridMaterial.d.ts.map +1 -0
  81. package/dist/shaders/ApollonianGridMaterial.js +289 -0
  82. package/dist/shaders/ConformalGridMaterial.d.ts +91 -0
  83. package/dist/shaders/ConformalGridMaterial.d.ts.map +1 -0
  84. package/dist/shaders/ConformalGridMaterial.js +335 -0
  85. package/dist/shaders/HilbertGridMaterial.d.ts +79 -0
  86. package/dist/shaders/HilbertGridMaterial.d.ts.map +1 -0
  87. package/dist/shaders/HilbertGridMaterial.js +329 -0
  88. package/dist/shaders/LensingGridMaterial.d.ts +73 -0
  89. package/dist/shaders/LensingGridMaterial.d.ts.map +1 -0
  90. package/dist/shaders/LensingGridMaterial.js +253 -0
  91. package/dist/shaders/ParastichyGridMaterial.d.ts +76 -0
  92. package/dist/shaders/ParastichyGridMaterial.d.ts.map +1 -0
  93. package/dist/shaders/ParastichyGridMaterial.js +282 -0
  94. package/dist/shaders/PhyllotaxisGridMaterial.d.ts +85 -0
  95. package/dist/shaders/PhyllotaxisGridMaterial.d.ts.map +1 -0
  96. package/dist/shaders/PhyllotaxisGridMaterial.js +532 -0
  97. package/dist/shaders/SkyboxMaterial.js +3 -3
  98. package/dist/shaders/StarsMaterial.d.ts +5 -0
  99. package/dist/shaders/StarsMaterial.d.ts.map +1 -1
  100. package/dist/shaders/StarsMaterial.js +59 -57
  101. package/dist/shaders/TruchetGridMaterial.d.ts +76 -0
  102. package/dist/shaders/TruchetGridMaterial.d.ts.map +1 -0
  103. package/dist/shaders/TruchetGridMaterial.js +290 -0
  104. package/dist/shaders/index.d.ts +7 -0
  105. package/dist/shaders/index.d.ts.map +1 -1
  106. package/dist/shaders/index.js +7 -0
  107. package/dist/types/actions.d.ts +6 -5
  108. package/dist/types/actions.d.ts.map +1 -1
  109. package/dist/types/commands.d.ts +61 -0
  110. package/dist/types/commands.d.ts.map +1 -0
  111. package/dist/types/commands.js +1 -0
  112. package/dist/types/environment.d.ts +34 -1
  113. package/dist/types/environment.d.ts.map +1 -1
  114. package/dist/types/environment.js +15 -0
  115. package/dist/types/environmentObjects.d.ts +152 -0
  116. package/dist/types/environmentObjects.d.ts.map +1 -0
  117. package/dist/types/environmentObjects.js +10 -0
  118. package/dist/types/index.d.ts +5 -1
  119. package/dist/types/index.d.ts.map +1 -1
  120. package/dist/types/landObjects.d.ts +15 -0
  121. package/dist/types/landObjects.d.ts.map +1 -0
  122. package/dist/types/landObjects.js +1 -0
  123. package/dist/types/objectSettings.d.ts +187 -16
  124. package/dist/types/objectSettings.d.ts.map +1 -1
  125. package/dist/types/objectsConfigs.d.ts +0 -3
  126. package/dist/types/objectsConfigs.d.ts.map +1 -1
  127. package/dist/types/scene3d.d.ts +8 -5
  128. package/dist/types/scene3d.d.ts.map +1 -1
  129. package/dist/types/spaceObjects.d.ts +65 -0
  130. package/dist/types/spaceObjects.d.ts.map +1 -0
  131. package/dist/types/spaceObjects.js +11 -0
  132. package/dist/types/textObjects.d.ts +352 -0
  133. package/dist/types/textObjects.d.ts.map +1 -0
  134. package/dist/types/textObjects.js +14 -0
  135. package/dist/types/types.d.ts +3 -6
  136. package/dist/types/types.d.ts.map +1 -1
  137. package/dist/types/users.d.ts +3 -1
  138. package/dist/types/users.d.ts.map +1 -1
  139. package/dist/types/users.js +2 -0
  140. package/dist/ui/index.d.ts +5 -0
  141. package/dist/ui/index.d.ts.map +1 -0
  142. package/dist/ui/index.js +4 -0
  143. package/dist/ui/uiBindings.d.ts +45 -0
  144. package/dist/ui/uiBindings.d.ts.map +1 -0
  145. package/dist/ui/uiBindings.js +172 -0
  146. package/dist/ui/uiKeys.d.ts +14 -0
  147. package/dist/ui/uiKeys.d.ts.map +1 -0
  148. package/dist/ui/uiKeys.js +22 -0
  149. package/dist/ui/uiSanitize.d.ts +18 -0
  150. package/dist/ui/uiSanitize.d.ts.map +1 -0
  151. package/dist/ui/uiSanitize.js +251 -0
  152. package/dist/ui/uiSpec.d.ts +116 -0
  153. package/dist/ui/uiSpec.d.ts.map +1 -0
  154. package/dist/ui/uiSpec.js +173 -0
  155. package/dist/utils/environmentMigration.d.ts +3 -0
  156. package/dist/utils/environmentMigration.d.ts.map +1 -0
  157. package/dist/utils/environmentMigration.js +50 -0
  158. package/dist/utils/generativeAnimatable.d.ts +1 -1
  159. package/dist/utils/generativeAnimatable.d.ts.map +1 -1
  160. package/dist/utils/generativeAnimatable.js +12 -0
  161. package/dist/utils/getAnimatableProperties.d.ts +1 -1
  162. package/dist/utils/getAnimatableProperties.d.ts.map +1 -1
  163. package/dist/utils/getAnimatableProperties.js +1 -1
  164. package/dist/utils/gridMigration.d.ts +3 -0
  165. package/dist/utils/gridMigration.d.ts.map +1 -0
  166. package/dist/utils/gridMigration.js +34 -0
  167. package/dist/utils/index.d.ts +5 -0
  168. package/dist/utils/index.d.ts.map +1 -1
  169. package/dist/utils/index.js +5 -0
  170. package/dist/utils/objectEffects.d.ts +24 -2
  171. package/dist/utils/objectEffects.d.ts.map +1 -1
  172. package/dist/utils/objectEffects.js +29 -2
  173. package/dist/utils/objectMigration.d.ts +9 -0
  174. package/dist/utils/objectMigration.d.ts.map +1 -0
  175. package/dist/utils/objectMigration.js +12 -0
  176. package/dist/utils/skyPhase.d.ts +61 -0
  177. package/dist/utils/skyPhase.d.ts.map +1 -0
  178. package/dist/utils/skyPhase.js +93 -0
  179. package/dist/utils/spaceMigration.d.ts +3 -0
  180. package/dist/utils/spaceMigration.d.ts.map +1 -0
  181. package/dist/utils/spaceMigration.js +46 -0
  182. package/dist/utils/sunUtils.d.ts +26 -1
  183. package/dist/utils/sunUtils.d.ts.map +1 -1
  184. package/dist/utils/sunUtils.js +37 -6
  185. 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
- // Calculate sun direction from azimuth and elevation
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) * sin(azimuth),
41
+ cos(elevation) * cos(azimuth),
42
42
  sin(elevation),
43
- cos(elevation) * cos(azimuth)
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;AA+DD,QAAA,MAAM,aAAa;;;;;;;;CAMa,CAAC;AAGjC,OAAO,EAAE,aAAa,EAAE,CAAC"}
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"}