interactive-bg 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +202 -2
  3. package/dist/core/canvas2d-renderer.cjs +119 -0
  4. package/dist/core/canvas2d-renderer.cjs.map +1 -0
  5. package/dist/core/canvas2d-renderer.d.cts +7 -0
  6. package/dist/core/canvas2d-renderer.d.ts +7 -0
  7. package/dist/core/canvas2d-renderer.js +119 -0
  8. package/dist/core/canvas2d-renderer.js.map +1 -0
  9. package/dist/core/color.cjs +46 -0
  10. package/dist/core/color.cjs.map +1 -0
  11. package/dist/core/color.d.cts +6 -0
  12. package/dist/core/color.d.ts +6 -0
  13. package/dist/core/color.js +46 -0
  14. package/dist/core/color.js.map +1 -0
  15. package/dist/core/engine.cjs +367 -0
  16. package/dist/core/engine.cjs.map +1 -0
  17. package/dist/core/engine.d.cts +69 -0
  18. package/dist/core/engine.d.ts +69 -0
  19. package/dist/core/engine.js +366 -0
  20. package/dist/core/engine.js.map +1 -0
  21. package/dist/core/style.cjs +21 -0
  22. package/dist/core/style.cjs.map +1 -0
  23. package/dist/core/style.d.cts +85 -0
  24. package/dist/core/style.d.ts +85 -0
  25. package/dist/core/style.js +21 -0
  26. package/dist/core/style.js.map +1 -0
  27. package/dist/core/surface.cjs +25 -0
  28. package/dist/core/surface.cjs.map +1 -0
  29. package/dist/core/surface.d.cts +42 -0
  30. package/dist/core/surface.d.ts +42 -0
  31. package/dist/core/surface.js +24 -0
  32. package/dist/core/surface.js.map +1 -0
  33. package/dist/core/webgl-renderer.cjs +137 -0
  34. package/dist/core/webgl-renderer.cjs.map +1 -0
  35. package/dist/core/webgl-renderer.d.cts +8 -0
  36. package/dist/core/webgl-renderer.d.ts +8 -0
  37. package/dist/core/webgl-renderer.js +137 -0
  38. package/dist/core/webgl-renderer.js.map +1 -0
  39. package/dist/core/webgl.cjs +62 -0
  40. package/dist/core/webgl.cjs.map +1 -0
  41. package/dist/core/webgl.d.cts +15 -0
  42. package/dist/core/webgl.d.ts +15 -0
  43. package/dist/core/webgl.js +60 -0
  44. package/dist/core/webgl.js.map +1 -0
  45. package/dist/dots/canvas2d.cjs +14 -0
  46. package/dist/dots/canvas2d.cjs.map +1 -0
  47. package/dist/dots/canvas2d.d.cts +5 -0
  48. package/dist/dots/canvas2d.d.ts +5 -0
  49. package/dist/dots/canvas2d.js +13 -0
  50. package/dist/dots/canvas2d.js.map +1 -0
  51. package/dist/dots/index.cjs +16 -0
  52. package/dist/dots/index.cjs.map +1 -0
  53. package/dist/dots/index.d.cts +5 -0
  54. package/dist/dots/index.d.ts +5 -0
  55. package/dist/dots/index.js +15 -0
  56. package/dist/dots/index.js.map +1 -0
  57. package/dist/dots/webgl.cjs +14 -0
  58. package/dist/dots/webgl.cjs.map +1 -0
  59. package/dist/dots/webgl.d.cts +5 -0
  60. package/dist/dots/webgl.d.ts +5 -0
  61. package/dist/dots/webgl.js +13 -0
  62. package/dist/dots/webgl.js.map +1 -0
  63. package/dist/index.cjs +24 -0
  64. package/dist/index.d.cts +18 -0
  65. package/dist/index.d.ts +18 -0
  66. package/dist/index.js +11 -0
  67. package/dist/index.umd.js +211 -0
  68. package/dist/index.umd.js.map +1 -0
  69. package/dist/plus/canvas2d.cjs +14 -0
  70. package/dist/plus/canvas2d.cjs.map +1 -0
  71. package/dist/plus/canvas2d.d.cts +5 -0
  72. package/dist/plus/canvas2d.d.ts +5 -0
  73. package/dist/plus/canvas2d.js +13 -0
  74. package/dist/plus/canvas2d.js.map +1 -0
  75. package/dist/plus/index.cjs +16 -0
  76. package/dist/plus/index.cjs.map +1 -0
  77. package/dist/plus/index.d.cts +5 -0
  78. package/dist/plus/index.d.ts +5 -0
  79. package/dist/plus/index.js +15 -0
  80. package/dist/plus/index.js.map +1 -0
  81. package/dist/plus/webgl.cjs +14 -0
  82. package/dist/plus/webgl.cjs.map +1 -0
  83. package/dist/plus/webgl.d.cts +5 -0
  84. package/dist/plus/webgl.d.ts +5 -0
  85. package/dist/plus/webgl.js +13 -0
  86. package/dist/plus/webgl.js.map +1 -0
  87. package/dist/shared/buffer.cjs +20 -0
  88. package/dist/shared/buffer.cjs.map +1 -0
  89. package/dist/shared/buffer.d.cts +11 -0
  90. package/dist/shared/buffer.d.ts +11 -0
  91. package/dist/shared/buffer.js +19 -0
  92. package/dist/shared/buffer.js.map +1 -0
  93. package/dist/shared/grid-webgl.cjs +63 -0
  94. package/dist/shared/grid-webgl.cjs.map +1 -0
  95. package/dist/shared/grid-webgl.d.cts +10 -0
  96. package/dist/shared/grid-webgl.d.ts +10 -0
  97. package/dist/shared/grid-webgl.js +61 -0
  98. package/dist/shared/grid-webgl.js.map +1 -0
  99. package/dist/shared/grid.cjs +133 -0
  100. package/dist/shared/grid.cjs.map +1 -0
  101. package/dist/shared/grid.d.cts +72 -0
  102. package/dist/shared/grid.d.ts +72 -0
  103. package/dist/shared/grid.js +123 -0
  104. package/dist/shared/grid.js.map +1 -0
  105. package/dist/shared/noise.cjs +166 -0
  106. package/dist/shared/noise.cjs.map +1 -0
  107. package/dist/shared/noise.d.cts +4 -0
  108. package/dist/shared/noise.d.ts +4 -0
  109. package/dist/shared/noise.js +166 -0
  110. package/dist/shared/noise.js.map +1 -0
  111. package/dist/styles/dots/canvas2d.cjs +99 -0
  112. package/dist/styles/dots/canvas2d.cjs.map +1 -0
  113. package/dist/styles/dots/canvas2d.d.cts +7 -0
  114. package/dist/styles/dots/canvas2d.d.ts +7 -0
  115. package/dist/styles/dots/canvas2d.js +99 -0
  116. package/dist/styles/dots/canvas2d.js.map +1 -0
  117. package/dist/styles/dots/definition.cjs +15 -0
  118. package/dist/styles/dots/definition.cjs.map +1 -0
  119. package/dist/styles/dots/definition.d.cts +7 -0
  120. package/dist/styles/dots/definition.d.ts +7 -0
  121. package/dist/styles/dots/definition.js +16 -0
  122. package/dist/styles/dots/definition.js.map +1 -0
  123. package/dist/styles/dots/motion.cjs +6 -0
  124. package/dist/styles/dots/motion.cjs.map +1 -0
  125. package/dist/styles/dots/motion.d.cts +2 -0
  126. package/dist/styles/dots/motion.d.ts +2 -0
  127. package/dist/styles/dots/motion.js +6 -0
  128. package/dist/styles/dots/motion.js.map +1 -0
  129. package/dist/styles/dots/options.cjs +33 -0
  130. package/dist/styles/dots/options.cjs.map +1 -0
  131. package/dist/styles/dots/options.d.cts +33 -0
  132. package/dist/styles/dots/options.d.ts +33 -0
  133. package/dist/styles/dots/options.js +32 -0
  134. package/dist/styles/dots/options.js.map +1 -0
  135. package/dist/styles/dots/webgl.cjs +113 -0
  136. package/dist/styles/dots/webgl.cjs.map +1 -0
  137. package/dist/styles/dots/webgl.d.cts +4 -0
  138. package/dist/styles/dots/webgl.d.ts +4 -0
  139. package/dist/styles/dots/webgl.js +113 -0
  140. package/dist/styles/dots/webgl.js.map +1 -0
  141. package/dist/styles/plus/canvas2d.cjs +88 -0
  142. package/dist/styles/plus/canvas2d.cjs.map +1 -0
  143. package/dist/styles/plus/canvas2d.d.cts +8 -0
  144. package/dist/styles/plus/canvas2d.d.ts +8 -0
  145. package/dist/styles/plus/canvas2d.js +88 -0
  146. package/dist/styles/plus/canvas2d.js.map +1 -0
  147. package/dist/styles/plus/definition.cjs +17 -0
  148. package/dist/styles/plus/definition.cjs.map +1 -0
  149. package/dist/styles/plus/definition.d.cts +9 -0
  150. package/dist/styles/plus/definition.d.ts +9 -0
  151. package/dist/styles/plus/definition.js +18 -0
  152. package/dist/styles/plus/definition.js.map +1 -0
  153. package/dist/styles/plus/motion.cjs +18 -0
  154. package/dist/styles/plus/motion.cjs.map +1 -0
  155. package/dist/styles/plus/motion.d.cts +5 -0
  156. package/dist/styles/plus/motion.d.ts +5 -0
  157. package/dist/styles/plus/motion.js +18 -0
  158. package/dist/styles/plus/motion.js.map +1 -0
  159. package/dist/styles/plus/options.cjs +45 -0
  160. package/dist/styles/plus/options.cjs.map +1 -0
  161. package/dist/styles/plus/options.d.cts +45 -0
  162. package/dist/styles/plus/options.d.ts +45 -0
  163. package/dist/styles/plus/options.js +43 -0
  164. package/dist/styles/plus/options.js.map +1 -0
  165. package/dist/styles/plus/turns.cjs +102 -0
  166. package/dist/styles/plus/turns.cjs.map +1 -0
  167. package/dist/styles/plus/turns.d.cts +17 -0
  168. package/dist/styles/plus/turns.d.ts +17 -0
  169. package/dist/styles/plus/turns.js +102 -0
  170. package/dist/styles/plus/turns.js.map +1 -0
  171. package/dist/styles/plus/webgl.cjs +121 -0
  172. package/dist/styles/plus/webgl.cjs.map +1 -0
  173. package/dist/styles/plus/webgl.d.cts +8 -0
  174. package/dist/styles/plus/webgl.d.ts +8 -0
  175. package/dist/styles/plus/webgl.js +121 -0
  176. package/dist/styles/plus/webgl.js.map +1 -0
  177. package/dist/styles/topo/canvas2d.cjs +77 -0
  178. package/dist/styles/topo/canvas2d.cjs.map +1 -0
  179. package/dist/styles/topo/canvas2d.d.cts +4 -0
  180. package/dist/styles/topo/canvas2d.d.ts +4 -0
  181. package/dist/styles/topo/canvas2d.js +77 -0
  182. package/dist/styles/topo/canvas2d.js.map +1 -0
  183. package/dist/styles/topo/contours.cjs +83 -0
  184. package/dist/styles/topo/contours.cjs.map +1 -0
  185. package/dist/styles/topo/contours.d.cts +9 -0
  186. package/dist/styles/topo/contours.d.ts +9 -0
  187. package/dist/styles/topo/contours.js +83 -0
  188. package/dist/styles/topo/contours.js.map +1 -0
  189. package/dist/styles/topo/definition.cjs +13 -0
  190. package/dist/styles/topo/definition.cjs.map +1 -0
  191. package/dist/styles/topo/definition.d.cts +7 -0
  192. package/dist/styles/topo/definition.d.ts +7 -0
  193. package/dist/styles/topo/definition.js +14 -0
  194. package/dist/styles/topo/definition.js.map +1 -0
  195. package/dist/styles/topo/field.cjs +118 -0
  196. package/dist/styles/topo/field.cjs.map +1 -0
  197. package/dist/styles/topo/field.d.cts +26 -0
  198. package/dist/styles/topo/field.d.ts +26 -0
  199. package/dist/styles/topo/field.js +118 -0
  200. package/dist/styles/topo/field.js.map +1 -0
  201. package/dist/styles/topo/options.cjs +39 -0
  202. package/dist/styles/topo/options.cjs.map +1 -0
  203. package/dist/styles/topo/options.d.cts +52 -0
  204. package/dist/styles/topo/options.d.ts +52 -0
  205. package/dist/styles/topo/options.js +38 -0
  206. package/dist/styles/topo/options.js.map +1 -0
  207. package/dist/styles/topo/terrain.cjs +22 -0
  208. package/dist/styles/topo/terrain.cjs.map +1 -0
  209. package/dist/styles/topo/terrain.d.cts +11 -0
  210. package/dist/styles/topo/terrain.d.ts +11 -0
  211. package/dist/styles/topo/terrain.js +22 -0
  212. package/dist/styles/topo/terrain.js.map +1 -0
  213. package/dist/styles/topo/webgl.cjs +150 -0
  214. package/dist/styles/topo/webgl.cjs.map +1 -0
  215. package/dist/styles/topo/webgl.d.cts +7 -0
  216. package/dist/styles/topo/webgl.d.ts +7 -0
  217. package/dist/styles/topo/webgl.js +150 -0
  218. package/dist/styles/topo/webgl.js.map +1 -0
  219. package/dist/topo/canvas2d.cjs +14 -0
  220. package/dist/topo/canvas2d.cjs.map +1 -0
  221. package/dist/topo/canvas2d.d.cts +5 -0
  222. package/dist/topo/canvas2d.d.ts +5 -0
  223. package/dist/topo/canvas2d.js +13 -0
  224. package/dist/topo/canvas2d.js.map +1 -0
  225. package/dist/topo/index.cjs +16 -0
  226. package/dist/topo/index.cjs.map +1 -0
  227. package/dist/topo/index.d.cts +5 -0
  228. package/dist/topo/index.d.ts +5 -0
  229. package/dist/topo/index.js +15 -0
  230. package/dist/topo/index.js.map +1 -0
  231. package/dist/topo/webgl.cjs +14 -0
  232. package/dist/topo/webgl.cjs.map +1 -0
  233. package/dist/topo/webgl.d.cts +5 -0
  234. package/dist/topo/webgl.d.ts +5 -0
  235. package/dist/topo/webgl.js +13 -0
  236. package/dist/topo/webgl.js.map +1 -0
  237. package/package.json +192 -4
@@ -0,0 +1,52 @@
1
+ export interface TopoOptions {
2
+ /** Stroke colour of regular contour lines. Any CSS colour. */
3
+ lineColor: string;
4
+ /** Stroke colour of every `majorEvery`-th ("index") line. Defaults to `lineColor`. */
5
+ majorLineColor?: string;
6
+ /** Opacity of all lines, from `0` (invisible) to `1` (opaque). Multiplies any alpha in the colours. */
7
+ lineOpacity: number;
8
+ /** Width of regular lines, in CSS pixels. */
9
+ lineWidth: number;
10
+ /** Width of index lines, in CSS pixels. */
11
+ majorLineWidth: number;
12
+ /** Every n-th contour is drawn as an index line. `0` disables index lines. */
13
+ majorEvery: number;
14
+ /** Number of contour levels across the full elevation range. More = denser lines. */
15
+ levels: number;
16
+ /** Noise frequency per CSS pixel. Smaller = larger, smoother landforms. */
17
+ scale: number;
18
+ /** Noise octaves. More = more detailed, rougher terrain (and more CPU). */
19
+ octaves: number;
20
+ /** How fast the terrain morphs, in noise units per second. `0` = static. */
21
+ speed: number;
22
+ /** Size of a sampling cell in CSS pixels. Smaller = smoother lines, more CPU. */
23
+ resolution: number;
24
+ /** Seed for the terrain. Same seed, same landscape. Pass a random number for a different one on every load. */
25
+ seed: number;
26
+ /** Radius of the pointer's influence, in CSS pixels. */
27
+ pointerRadius: number;
28
+ /** Height of the bump under the pointer. Negative values dig a crater. */
29
+ pointerStrength: number;
30
+ }
31
+ export declare const topoDefaults: Readonly<TopoOptions>;
32
+ /** Options after clamping and deriving: what the field and the renderers consume. */
33
+ export interface ResolvedTopoOptions {
34
+ lineColor: string;
35
+ majorLineColor: string;
36
+ lineOpacity: number;
37
+ lineWidth: number;
38
+ majorLineWidth: number;
39
+ /** Integer; `0` = no index lines. */
40
+ majorEvery: number;
41
+ /** Height difference between neighbouring contour levels. */
42
+ levelStep: number;
43
+ /** Grid spacing of the height field, in CSS pixels. */
44
+ cellSize: number;
45
+ octaves: number;
46
+ scale: number;
47
+ speed: number;
48
+ seed: number;
49
+ pointerRadius: number;
50
+ pointerStrength: number;
51
+ }
52
+ export declare function resolveTopoOptions(options: TopoOptions): ResolvedTopoOptions;
@@ -0,0 +1,52 @@
1
+ export interface TopoOptions {
2
+ /** Stroke colour of regular contour lines. Any CSS colour. */
3
+ lineColor: string;
4
+ /** Stroke colour of every `majorEvery`-th ("index") line. Defaults to `lineColor`. */
5
+ majorLineColor?: string;
6
+ /** Opacity of all lines, from `0` (invisible) to `1` (opaque). Multiplies any alpha in the colours. */
7
+ lineOpacity: number;
8
+ /** Width of regular lines, in CSS pixels. */
9
+ lineWidth: number;
10
+ /** Width of index lines, in CSS pixels. */
11
+ majorLineWidth: number;
12
+ /** Every n-th contour is drawn as an index line. `0` disables index lines. */
13
+ majorEvery: number;
14
+ /** Number of contour levels across the full elevation range. More = denser lines. */
15
+ levels: number;
16
+ /** Noise frequency per CSS pixel. Smaller = larger, smoother landforms. */
17
+ scale: number;
18
+ /** Noise octaves. More = more detailed, rougher terrain (and more CPU). */
19
+ octaves: number;
20
+ /** How fast the terrain morphs, in noise units per second. `0` = static. */
21
+ speed: number;
22
+ /** Size of a sampling cell in CSS pixels. Smaller = smoother lines, more CPU. */
23
+ resolution: number;
24
+ /** Seed for the terrain. Same seed, same landscape. Pass a random number for a different one on every load. */
25
+ seed: number;
26
+ /** Radius of the pointer's influence, in CSS pixels. */
27
+ pointerRadius: number;
28
+ /** Height of the bump under the pointer. Negative values dig a crater. */
29
+ pointerStrength: number;
30
+ }
31
+ export declare const topoDefaults: Readonly<TopoOptions>;
32
+ /** Options after clamping and deriving: what the field and the renderers consume. */
33
+ export interface ResolvedTopoOptions {
34
+ lineColor: string;
35
+ majorLineColor: string;
36
+ lineOpacity: number;
37
+ lineWidth: number;
38
+ majorLineWidth: number;
39
+ /** Integer; `0` = no index lines. */
40
+ majorEvery: number;
41
+ /** Height difference between neighbouring contour levels. */
42
+ levelStep: number;
43
+ /** Grid spacing of the height field, in CSS pixels. */
44
+ cellSize: number;
45
+ octaves: number;
46
+ scale: number;
47
+ speed: number;
48
+ seed: number;
49
+ pointerRadius: number;
50
+ pointerStrength: number;
51
+ }
52
+ export declare function resolveTopoOptions(options: TopoOptions): ResolvedTopoOptions;
@@ -0,0 +1,38 @@
1
+ // src/styles/topo/options.ts
2
+ var topoDefaults = Object.freeze({
3
+ lineColor: "#5b6576",
4
+ majorLineColor: "#7dd3a8",
5
+ lineOpacity: .5,
6
+ lineWidth: 1,
7
+ majorLineWidth: 1.75,
8
+ majorEvery: 5,
9
+ levels: 12,
10
+ scale: .0025,
11
+ octaves: 2,
12
+ speed: .025,
13
+ resolution: 6,
14
+ seed: 1332056948,
15
+ pointerRadius: 100,
16
+ pointerStrength: .35
17
+ });
18
+ function resolveTopoOptions(options) {
19
+ return {
20
+ lineColor: options.lineColor,
21
+ majorLineColor: options.majorLineColor ?? options.lineColor,
22
+ lineOpacity: Math.min(1, Math.max(0, options.lineOpacity)),
23
+ lineWidth: Math.max(.1, options.lineWidth),
24
+ majorLineWidth: Math.max(.1, options.majorLineWidth),
25
+ majorEvery: Math.max(0, Math.round(options.majorEvery)),
26
+ levelStep: 2 / Math.max(1, options.levels),
27
+ cellSize: Math.max(2, options.resolution),
28
+ octaves: Math.max(1, Math.round(options.octaves)),
29
+ scale: options.scale,
30
+ speed: Math.abs(options.speed),
31
+ seed: options.seed,
32
+ pointerRadius: Math.max(1, options.pointerRadius),
33
+ pointerStrength: options.pointerStrength
34
+ };
35
+ }
36
+ export { resolveTopoOptions, topoDefaults };
37
+
38
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","names":[],"sources":["../../../src/styles/topo/options.ts"],"sourcesContent":["export interface TopoOptions {\n /** Stroke colour of regular contour lines. Any CSS colour. */\n lineColor: string;\n /** Stroke colour of every `majorEvery`-th (\"index\") line. Defaults to `lineColor`. */\n majorLineColor?: string;\n /** Opacity of all lines, from `0` (invisible) to `1` (opaque). Multiplies any alpha in the colours. */\n lineOpacity: number;\n /** Width of regular lines, in CSS pixels. */\n lineWidth: number;\n /** Width of index lines, in CSS pixels. */\n majorLineWidth: number;\n /** Every n-th contour is drawn as an index line. `0` disables index lines. */\n majorEvery: number;\n /** Number of contour levels across the full elevation range. More = denser lines. */\n levels: number;\n /** Noise frequency per CSS pixel. Smaller = larger, smoother landforms. */\n scale: number;\n /** Noise octaves. More = more detailed, rougher terrain (and more CPU). */\n octaves: number;\n /** How fast the terrain morphs, in noise units per second. `0` = static. */\n speed: number;\n /** Size of a sampling cell in CSS pixels. Smaller = smoother lines, more CPU. */\n resolution: number;\n /** Seed for the terrain. Same seed, same landscape. Pass a random number for a different one on every load. */\n seed: number;\n /** Radius of the pointer's influence, in CSS pixels. */\n pointerRadius: number;\n /** Height of the bump under the pointer. Negative values dig a crater. */\n pointerStrength: number;\n}\n\nexport const topoDefaults: Readonly<TopoOptions> = Object.freeze({\n lineColor: '#5b6576',\n majorLineColor: '#7dd3a8',\n lineOpacity: 0.5,\n lineWidth: 1,\n majorLineWidth: 1.75,\n majorEvery: 5,\n levels: 12,\n scale: 0.0025,\n octaves: 2,\n speed: 0.025,\n resolution: 6,\n seed: 1332056948,\n pointerRadius: 100,\n pointerStrength: 0.35,\n});\n\n/** Options after clamping and deriving: what the field and the renderers consume. */\nexport interface ResolvedTopoOptions {\n lineColor: string;\n majorLineColor: string;\n lineOpacity: number;\n lineWidth: number;\n majorLineWidth: number;\n /** Integer; `0` = no index lines. */\n majorEvery: number;\n /** Height difference between neighbouring contour levels. */\n levelStep: number;\n /** Grid spacing of the height field, in CSS pixels. */\n cellSize: number;\n octaves: number;\n scale: number;\n speed: number;\n seed: number;\n pointerRadius: number;\n pointerStrength: number;\n}\n\nexport function resolveTopoOptions(options: TopoOptions): ResolvedTopoOptions {\n return {\n lineColor: options.lineColor,\n majorLineColor: options.majorLineColor ?? options.lineColor,\n lineOpacity: Math.min(1, Math.max(0, options.lineOpacity)),\n lineWidth: Math.max(0.1, options.lineWidth),\n majorLineWidth: Math.max(0.1, options.majorLineWidth),\n majorEvery: Math.max(0, Math.round(options.majorEvery)),\n // The height field spans roughly [-1, 1], so the levels cover a range of 2.\n levelStep: 2 / Math.max(1, options.levels),\n cellSize: Math.max(2, options.resolution),\n octaves: Math.max(1, Math.round(options.octaves)),\n scale: options.scale,\n // The keyframes only step forwards in time; morphing backwards looks the same, so use the magnitude.\n speed: Math.abs(options.speed),\n seed: options.seed,\n pointerRadius: Math.max(1, options.pointerRadius),\n pointerStrength: options.pointerStrength,\n };\n}\n"],"mappings":";AA+BA,IAAa,eAAsC,OAAO,OAAO;CAC/D,WAAW;CACX,gBAAgB;CAChB,aAAa;CACb,WAAW;CACX,gBAAgB;CAChB,YAAY;CACZ,QAAQ;CACR,OAAO;CACP,SAAS;CACT,OAAO;CACP,YAAY;CACZ,MAAM;CACN,eAAe;CACf,iBAAiB;AACnB,CAAC;AAuBD,SAAgB,mBAAmB,SAA2C;CAC5E,OAAO;EACL,WAAW,QAAQ;EACnB,gBAAgB,QAAQ,kBAAkB,QAAQ;EAClD,aAAa,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,QAAQ,WAAW,CAAC;EACzD,WAAW,KAAK,IAAI,IAAK,QAAQ,SAAS;EAC1C,gBAAgB,KAAK,IAAI,IAAK,QAAQ,cAAc;EACpD,YAAY,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,UAAU,CAAC;EAEtD,WAAW,IAAI,KAAK,IAAI,GAAG,QAAQ,MAAM;EACzC,UAAU,KAAK,IAAI,GAAG,QAAQ,UAAU;EACxC,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,OAAO,CAAC;EAChD,OAAO,QAAQ;EAEf,OAAO,KAAK,IAAI,QAAQ,KAAK;EAC7B,MAAM,QAAQ;EACd,eAAe,KAAK,IAAI,GAAG,QAAQ,aAAa;EAChD,iBAAiB,QAAQ;CAC3B;AACF"}
@@ -0,0 +1,22 @@
1
+ const require_field = require("./field.cjs");
2
+ // src/styles/topo/terrain.ts
3
+ function createTerrain(initial) {
4
+ const field = require_field.createKeyframeField(initial);
5
+ let speed = initial.speed;
6
+ let time = 0;
7
+ return {
8
+ field,
9
+ configure(options) {
10
+ field.configure(options);
11
+ speed = options.speed;
12
+ },
13
+ advance(frame) {
14
+ field.resize(frame.width, frame.height);
15
+ if (!frame.reducedMotion) time += frame.dt * speed;
16
+ return field.advance(time);
17
+ }
18
+ };
19
+ }
20
+ exports.createTerrain = createTerrain;
21
+
22
+ //# sourceMappingURL=terrain.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terrain.cjs","names":["createKeyframeField"],"sources":["../../../src/styles/topo/terrain.ts"],"sourcesContent":["import type { Frame } from '../../core/style';\nimport { createKeyframeField, type KeyframeField } from './field';\nimport type { ResolvedTopoOptions } from './options';\n\n/** The animated height field both topo renderers draw: keyframes plus the clock that drives them. */\nexport interface Terrain {\n readonly field: KeyframeField;\n configure(options: ResolvedTopoOptions): void;\n /** Move the terrain forward by one frame and return the blend factor between the keyframes. */\n advance(frame: Frame): number;\n}\n\nexport function createTerrain(initial: ResolvedTopoOptions): Terrain {\n const field = createKeyframeField(initial);\n let speed = initial.speed;\n let time = 0;\n return {\n field,\n configure(options) {\n field.configure(options);\n speed = options.speed;\n },\n advance(frame) {\n field.resize(frame.width, frame.height);\n if (!frame.reducedMotion) time += frame.dt * speed;\n return field.advance(time);\n },\n };\n}\n"],"mappings":";;AAYA,SAAgB,cAAc,SAAuC;CACnE,MAAM,QAAQA,cAAAA,oBAAoB,OAAO;CACzC,IAAI,QAAQ,QAAQ;CACpB,IAAI,OAAO;CACX,OAAO;EACL;EACA,UAAU,SAAS;GACjB,MAAM,UAAU,OAAO;GACvB,QAAQ,QAAQ;EAClB;EACA,QAAQ,OAAO;GACb,MAAM,OAAO,MAAM,OAAO,MAAM,MAAM;GACtC,IAAI,CAAC,MAAM,eAAe,QAAQ,MAAM,KAAK;GAC7C,OAAO,MAAM,QAAQ,IAAI;EAC3B;CACF;AACF"}
@@ -0,0 +1,11 @@
1
+ import type { Frame } from '../../core/style.cjs';
2
+ import { type KeyframeField } from './field.cjs';
3
+ import type { ResolvedTopoOptions } from './options.cjs';
4
+ /** The animated height field both topo renderers draw: keyframes plus the clock that drives them. */
5
+ export interface Terrain {
6
+ readonly field: KeyframeField;
7
+ configure(options: ResolvedTopoOptions): void;
8
+ /** Move the terrain forward by one frame and return the blend factor between the keyframes. */
9
+ advance(frame: Frame): number;
10
+ }
11
+ export declare function createTerrain(initial: ResolvedTopoOptions): Terrain;
@@ -0,0 +1,11 @@
1
+ import type { Frame } from '../../core/style.js';
2
+ import { type KeyframeField } from './field.js';
3
+ import type { ResolvedTopoOptions } from './options.js';
4
+ /** The animated height field both topo renderers draw: keyframes plus the clock that drives them. */
5
+ export interface Terrain {
6
+ readonly field: KeyframeField;
7
+ configure(options: ResolvedTopoOptions): void;
8
+ /** Move the terrain forward by one frame and return the blend factor between the keyframes. */
9
+ advance(frame: Frame): number;
10
+ }
11
+ export declare function createTerrain(initial: ResolvedTopoOptions): Terrain;
@@ -0,0 +1,22 @@
1
+ import { createKeyframeField } from "./field.js";
2
+ // src/styles/topo/terrain.ts
3
+ function createTerrain(initial) {
4
+ const field = createKeyframeField(initial);
5
+ let speed = initial.speed;
6
+ let time = 0;
7
+ return {
8
+ field,
9
+ configure(options) {
10
+ field.configure(options);
11
+ speed = options.speed;
12
+ },
13
+ advance(frame) {
14
+ field.resize(frame.width, frame.height);
15
+ if (!frame.reducedMotion) time += frame.dt * speed;
16
+ return field.advance(time);
17
+ }
18
+ };
19
+ }
20
+ export { createTerrain };
21
+
22
+ //# sourceMappingURL=terrain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terrain.js","names":[],"sources":["../../../src/styles/topo/terrain.ts"],"sourcesContent":["import type { Frame } from '../../core/style';\nimport { createKeyframeField, type KeyframeField } from './field';\nimport type { ResolvedTopoOptions } from './options';\n\n/** The animated height field both topo renderers draw: keyframes plus the clock that drives them. */\nexport interface Terrain {\n readonly field: KeyframeField;\n configure(options: ResolvedTopoOptions): void;\n /** Move the terrain forward by one frame and return the blend factor between the keyframes. */\n advance(frame: Frame): number;\n}\n\nexport function createTerrain(initial: ResolvedTopoOptions): Terrain {\n const field = createKeyframeField(initial);\n let speed = initial.speed;\n let time = 0;\n return {\n field,\n configure(options) {\n field.configure(options);\n speed = options.speed;\n },\n advance(frame) {\n field.resize(frame.width, frame.height);\n if (!frame.reducedMotion) time += frame.dt * speed;\n return field.advance(time);\n },\n };\n}\n"],"mappings":";;AAYA,SAAgB,cAAc,SAAuC;CACnE,MAAM,QAAQ,oBAAoB,OAAO;CACzC,IAAI,QAAQ,QAAQ;CACpB,IAAI,OAAO;CACX,OAAO;EACL;EACA,UAAU,SAAS;GACjB,MAAM,UAAU,OAAO;GACvB,QAAQ,QAAQ;EAClB;EACA,QAAQ,OAAO;GACb,MAAM,OAAO,MAAM,OAAO,MAAM,MAAM;GACtC,IAAI,CAAC,MAAM,eAAe,QAAQ,MAAM,KAAK;GAC7C,OAAO,MAAM,QAAQ,IAAI;EAC3B;CACF;AACF"}
@@ -0,0 +1,150 @@
1
+ const require_color = require("../../core/color.cjs");
2
+ const require_webgl = require("../../core/webgl.cjs");
3
+ const require_options = require("./options.cjs");
4
+ const require_terrain = require("./terrain.cjs");
5
+ // src/styles/topo/webgl.ts
6
+ var FRAGMENT = `#version 300 es
7
+ precision highp float;
8
+ precision highp sampler2D;
9
+
10
+ uniform sampler2D uKeyA;
11
+ uniform sampler2D uKeyB;
12
+ uniform float uBlend;
13
+ uniform vec2 uGrid; // cols, rows
14
+ uniform float uCellSize; // CSS px between grid samples
15
+ uniform float uDpr;
16
+ uniform float uHeight; // canvas height in device px
17
+ uniform vec3 uPointer; // x, y (CSS px), bump height
18
+ uniform float uRadius2;
19
+ uniform float uStep; // height difference between contour levels
20
+ uniform float uMajorEvery;
21
+ uniform vec2 uHalfWidth; // half line widths (device px): minor, major
22
+ uniform vec4 uMinor; // straight RGBA, opacity applied
23
+ uniform vec4 uMajor;
24
+
25
+ out vec4 outColor;
26
+
27
+ float heightAt(ivec2 c) {
28
+ return mix(texelFetch(uKeyA, c, 0).r, texelFetch(uKeyB, c, 0).r, uBlend);
29
+ }
30
+
31
+ void main() {
32
+ vec2 p = vec2(gl_FragCoord.x, uHeight - gl_FragCoord.y) / uDpr;
33
+
34
+ // Bilinear interpolation of the height field (same surface the CPU renderer traces).
35
+ vec2 g = p / uCellSize;
36
+ vec2 cell = clamp(floor(g), vec2(0.0), uGrid - 2.0);
37
+ vec2 f = g - cell;
38
+ ivec2 c = ivec2(cell);
39
+ float h = mix(
40
+ mix(heightAt(c), heightAt(c + ivec2(1, 0)), f.x),
41
+ mix(heightAt(c + ivec2(0, 1)), heightAt(c + ivec2(1, 1)), f.x),
42
+ f.y);
43
+
44
+ vec2 d = p - uPointer.xy;
45
+ h += uPointer.z * exp(-dot(d, d) / uRadius2);
46
+
47
+ // Distance to the nearest contour, in device pixels, from the screen-space gradient.
48
+ float v = h / uStep;
49
+ float level = floor(v + 0.5);
50
+ float dist = abs(v - level) / max(fwidth(v), 1e-5);
51
+
52
+ bool major = uMajorEvery > 0.0 && mod(level, uMajorEvery) == 0.0;
53
+ float halfWidth = major ? uHalfWidth.y : uHalfWidth.x;
54
+ vec4 line = major ? uMajor : uMinor;
55
+ // Analytic antialiasing: coverage ramps over one pixel at the line edge.
56
+ float a = line.a * clamp(halfWidth + 0.5 - dist, 0.0, 1.0);
57
+ outColor = vec4(line.rgb * a, a); // premultiplied; the engine blends it over the background
58
+ }`;
59
+ var UNIFORMS = [
60
+ "uKeyA",
61
+ "uKeyB",
62
+ "uBlend",
63
+ "uGrid",
64
+ "uCellSize",
65
+ "uDpr",
66
+ "uHeight",
67
+ "uPointer",
68
+ "uRadius2",
69
+ "uStep",
70
+ "uMajorEvery",
71
+ "uHalfWidth",
72
+ "uMinor",
73
+ "uMajor"
74
+ ];
75
+ /**
76
+ * Per-pixel contour lines in a fragment shader. The CPU only uploads the two noise
77
+ * keyframes when they change (once per keyframe interval) and sets a few uniforms per frame.
78
+ */
79
+ function createTopoWebGL(gl, initial) {
80
+ let options = require_options.resolveTopoOptions(initial);
81
+ const terrain = require_terrain.createTerrain(options);
82
+ const program = require_webgl.createProgram(gl, require_webgl.FULLSCREEN_VERTEX_SHADER, FRAGMENT);
83
+ const uniforms = program ? require_webgl.getUniforms(gl, program, UNIFORMS) : null;
84
+ const textures = [gl.createTexture(), gl.createTexture()];
85
+ for (const texture of textures) {
86
+ gl.bindTexture(gl.TEXTURE_2D, texture);
87
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
88
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
89
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
90
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
91
+ }
92
+ let textureCols = 0;
93
+ let textureRows = 0;
94
+ let uploadedVersion = -1;
95
+ /** Upload the keyframes when they changed since the last frame. */
96
+ function upload() {
97
+ const { field } = terrain;
98
+ const resized = textureCols !== field.cols || textureRows !== field.rows;
99
+ if (!resized && uploadedVersion === field.version) return;
100
+ const keys = [field.keyA, field.keyB];
101
+ for (let unit = 0; unit < 2; unit++) {
102
+ gl.activeTexture(gl.TEXTURE0 + unit);
103
+ gl.bindTexture(gl.TEXTURE_2D, textures[unit]);
104
+ if (resized) gl.texImage2D(gl.TEXTURE_2D, 0, gl.R32F, field.cols, field.rows, 0, gl.RED, gl.FLOAT, keys[unit]);
105
+ else gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, field.cols, field.rows, gl.RED, gl.FLOAT, keys[unit]);
106
+ }
107
+ textureCols = field.cols;
108
+ textureRows = field.rows;
109
+ uploadedVersion = field.version;
110
+ }
111
+ return {
112
+ update(next) {
113
+ options = require_options.resolveTopoOptions(next);
114
+ terrain.configure(options);
115
+ },
116
+ render(frame) {
117
+ const blend = terrain.advance(frame);
118
+ if (!program || !uniforms) return;
119
+ upload();
120
+ const minor = require_color.parseColor(options.lineColor);
121
+ const major = require_color.parseColor(options.majorLineColor);
122
+ const opacity = options.lineOpacity;
123
+ const { field } = terrain;
124
+ gl.useProgram(program);
125
+ gl.uniform1i(uniforms.uKeyA, 0);
126
+ gl.uniform1i(uniforms.uKeyB, 1);
127
+ gl.uniform1f(uniforms.uBlend, blend);
128
+ gl.uniform2f(uniforms.uGrid, field.cols, field.rows);
129
+ gl.uniform1f(uniforms.uCellSize, options.cellSize);
130
+ gl.uniform1f(uniforms.uDpr, frame.dpr);
131
+ gl.uniform1f(uniforms.uHeight, gl.drawingBufferHeight);
132
+ gl.uniform3f(uniforms.uPointer, frame.pointer.x, frame.pointer.y, options.pointerStrength * frame.pointer.influence);
133
+ gl.uniform1f(uniforms.uRadius2, options.pointerRadius * options.pointerRadius);
134
+ gl.uniform1f(uniforms.uStep, options.levelStep);
135
+ gl.uniform1f(uniforms.uMajorEvery, options.majorEvery);
136
+ gl.uniform2f(uniforms.uHalfWidth, options.lineWidth * frame.dpr / 2, options.majorLineWidth * frame.dpr / 2);
137
+ gl.uniform4f(uniforms.uMinor, minor[0], minor[1], minor[2], minor[3] * opacity);
138
+ gl.uniform4f(uniforms.uMajor, major[0], major[1], major[2], major[3] * opacity);
139
+ gl.drawArrays(gl.TRIANGLES, 0, 3);
140
+ },
141
+ destroy() {
142
+ gl.deleteTexture(textures[0]);
143
+ gl.deleteTexture(textures[1]);
144
+ gl.deleteProgram(program);
145
+ }
146
+ };
147
+ }
148
+ exports.createTopoWebGL = createTopoWebGL;
149
+
150
+ //# sourceMappingURL=webgl.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webgl.cjs","names":["resolveTopoOptions","createTerrain","createProgram","FULLSCREEN_VERTEX_SHADER","getUniforms","parseColor"],"sources":["../../../src/styles/topo/webgl.ts"],"sourcesContent":["import { parseColor } from '../../core/color';\nimport type { StyleRenderer } from '../../core/style';\nimport { createProgram, FULLSCREEN_VERTEX_SHADER, getUniforms } from '../../core/webgl';\nimport { resolveTopoOptions, type TopoOptions } from './options';\nimport { createTerrain } from './terrain';\n\nconst FRAGMENT = `#version 300 es\nprecision highp float;\nprecision highp sampler2D;\n\nuniform sampler2D uKeyA;\nuniform sampler2D uKeyB;\nuniform float uBlend;\nuniform vec2 uGrid; // cols, rows\nuniform float uCellSize; // CSS px between grid samples\nuniform float uDpr;\nuniform float uHeight; // canvas height in device px\nuniform vec3 uPointer; // x, y (CSS px), bump height\nuniform float uRadius2;\nuniform float uStep; // height difference between contour levels\nuniform float uMajorEvery;\nuniform vec2 uHalfWidth; // half line widths (device px): minor, major\nuniform vec4 uMinor; // straight RGBA, opacity applied\nuniform vec4 uMajor;\n\nout vec4 outColor;\n\nfloat heightAt(ivec2 c) {\n return mix(texelFetch(uKeyA, c, 0).r, texelFetch(uKeyB, c, 0).r, uBlend);\n}\n\nvoid main() {\n vec2 p = vec2(gl_FragCoord.x, uHeight - gl_FragCoord.y) / uDpr;\n\n // Bilinear interpolation of the height field (same surface the CPU renderer traces).\n vec2 g = p / uCellSize;\n vec2 cell = clamp(floor(g), vec2(0.0), uGrid - 2.0);\n vec2 f = g - cell;\n ivec2 c = ivec2(cell);\n float h = mix(\n mix(heightAt(c), heightAt(c + ivec2(1, 0)), f.x),\n mix(heightAt(c + ivec2(0, 1)), heightAt(c + ivec2(1, 1)), f.x),\n f.y);\n\n vec2 d = p - uPointer.xy;\n h += uPointer.z * exp(-dot(d, d) / uRadius2);\n\n // Distance to the nearest contour, in device pixels, from the screen-space gradient.\n float v = h / uStep;\n float level = floor(v + 0.5);\n float dist = abs(v - level) / max(fwidth(v), 1e-5);\n\n bool major = uMajorEvery > 0.0 && mod(level, uMajorEvery) == 0.0;\n float halfWidth = major ? uHalfWidth.y : uHalfWidth.x;\n vec4 line = major ? uMajor : uMinor;\n // Analytic antialiasing: coverage ramps over one pixel at the line edge.\n float a = line.a * clamp(halfWidth + 0.5 - dist, 0.0, 1.0);\n outColor = vec4(line.rgb * a, a); // premultiplied; the engine blends it over the background\n}`;\n\nconst UNIFORMS = [\n 'uKeyA', 'uKeyB', 'uBlend', 'uGrid', 'uCellSize', 'uDpr', 'uHeight', 'uPointer', 'uRadius2',\n 'uStep', 'uMajorEvery', 'uHalfWidth', 'uMinor', 'uMajor',\n] as const;\n\n/**\n * Per-pixel contour lines in a fragment shader. The CPU only uploads the two noise\n * keyframes when they change (once per keyframe interval) and sets a few uniforms per frame.\n */\nexport function createTopoWebGL(gl: WebGL2RenderingContext, initial: TopoOptions): StyleRenderer<TopoOptions> {\n let options = resolveTopoOptions(initial);\n const terrain = createTerrain(options);\n\n const program = createProgram(gl, FULLSCREEN_VERTEX_SHADER, FRAGMENT);\n const uniforms = program ? getUniforms(gl, program, UNIFORMS) : null;\n const textures = [gl.createTexture(), gl.createTexture()] as const;\n for (const texture of textures) {\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n }\n let textureCols = 0;\n let textureRows = 0;\n let uploadedVersion = -1;\n\n /** Upload the keyframes when they changed since the last frame. */\n function upload(): void {\n const { field } = terrain;\n const resized = textureCols !== field.cols || textureRows !== field.rows;\n if (!resized && uploadedVersion === field.version) return;\n const keys = [field.keyA, field.keyB];\n for (let unit = 0; unit < 2; unit++) {\n gl.activeTexture(gl.TEXTURE0 + unit);\n gl.bindTexture(gl.TEXTURE_2D, textures[unit]);\n if (resized) {\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.R32F, field.cols, field.rows, 0, gl.RED, gl.FLOAT, keys[unit]);\n } else {\n gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, field.cols, field.rows, gl.RED, gl.FLOAT, keys[unit]);\n }\n }\n textureCols = field.cols;\n textureRows = field.rows;\n uploadedVersion = field.version;\n }\n\n return {\n update(next) {\n options = resolveTopoOptions(next);\n terrain.configure(options);\n },\n render(frame) {\n const blend = terrain.advance(frame);\n if (!program || !uniforms) return; // context lost during setup; the engine recreates us\n upload();\n\n const minor = parseColor(options.lineColor);\n const major = parseColor(options.majorLineColor);\n const opacity = options.lineOpacity;\n const { field } = terrain;\n\n gl.useProgram(program);\n gl.uniform1i(uniforms.uKeyA, 0);\n gl.uniform1i(uniforms.uKeyB, 1);\n gl.uniform1f(uniforms.uBlend, blend);\n gl.uniform2f(uniforms.uGrid, field.cols, field.rows);\n gl.uniform1f(uniforms.uCellSize, options.cellSize);\n gl.uniform1f(uniforms.uDpr, frame.dpr);\n gl.uniform1f(uniforms.uHeight, gl.drawingBufferHeight);\n gl.uniform3f(uniforms.uPointer, frame.pointer.x, frame.pointer.y, options.pointerStrength * frame.pointer.influence);\n gl.uniform1f(uniforms.uRadius2, options.pointerRadius * options.pointerRadius);\n gl.uniform1f(uniforms.uStep, options.levelStep);\n gl.uniform1f(uniforms.uMajorEvery, options.majorEvery);\n gl.uniform2f(uniforms.uHalfWidth, (options.lineWidth * frame.dpr) / 2, (options.majorLineWidth * frame.dpr) / 2);\n gl.uniform4f(uniforms.uMinor, minor[0], minor[1], minor[2], minor[3] * opacity);\n gl.uniform4f(uniforms.uMajor, major[0], major[1], major[2], major[3] * opacity);\n gl.drawArrays(gl.TRIANGLES, 0, 3);\n },\n destroy() {\n gl.deleteTexture(textures[0]);\n gl.deleteTexture(textures[1]);\n gl.deleteProgram(program);\n },\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { StyleRenderer } from '../../core/style.cjs';
2
+ import { type TopoOptions } from './options.cjs';
3
+ /**
4
+ * Per-pixel contour lines in a fragment shader. The CPU only uploads the two noise
5
+ * keyframes when they change (once per keyframe interval) and sets a few uniforms per frame.
6
+ */
7
+ export declare function createTopoWebGL(gl: WebGL2RenderingContext, initial: TopoOptions): StyleRenderer<TopoOptions>;
@@ -0,0 +1,7 @@
1
+ import type { StyleRenderer } from '../../core/style.js';
2
+ import { type TopoOptions } from './options.js';
3
+ /**
4
+ * Per-pixel contour lines in a fragment shader. The CPU only uploads the two noise
5
+ * keyframes when they change (once per keyframe interval) and sets a few uniforms per frame.
6
+ */
7
+ export declare function createTopoWebGL(gl: WebGL2RenderingContext, initial: TopoOptions): StyleRenderer<TopoOptions>;
@@ -0,0 +1,150 @@
1
+ import { parseColor } from "../../core/color.js";
2
+ import { FULLSCREEN_VERTEX_SHADER, createProgram, getUniforms } from "../../core/webgl.js";
3
+ import { resolveTopoOptions } from "./options.js";
4
+ import { createTerrain } from "./terrain.js";
5
+ // src/styles/topo/webgl.ts
6
+ var FRAGMENT = `#version 300 es
7
+ precision highp float;
8
+ precision highp sampler2D;
9
+
10
+ uniform sampler2D uKeyA;
11
+ uniform sampler2D uKeyB;
12
+ uniform float uBlend;
13
+ uniform vec2 uGrid; // cols, rows
14
+ uniform float uCellSize; // CSS px between grid samples
15
+ uniform float uDpr;
16
+ uniform float uHeight; // canvas height in device px
17
+ uniform vec3 uPointer; // x, y (CSS px), bump height
18
+ uniform float uRadius2;
19
+ uniform float uStep; // height difference between contour levels
20
+ uniform float uMajorEvery;
21
+ uniform vec2 uHalfWidth; // half line widths (device px): minor, major
22
+ uniform vec4 uMinor; // straight RGBA, opacity applied
23
+ uniform vec4 uMajor;
24
+
25
+ out vec4 outColor;
26
+
27
+ float heightAt(ivec2 c) {
28
+ return mix(texelFetch(uKeyA, c, 0).r, texelFetch(uKeyB, c, 0).r, uBlend);
29
+ }
30
+
31
+ void main() {
32
+ vec2 p = vec2(gl_FragCoord.x, uHeight - gl_FragCoord.y) / uDpr;
33
+
34
+ // Bilinear interpolation of the height field (same surface the CPU renderer traces).
35
+ vec2 g = p / uCellSize;
36
+ vec2 cell = clamp(floor(g), vec2(0.0), uGrid - 2.0);
37
+ vec2 f = g - cell;
38
+ ivec2 c = ivec2(cell);
39
+ float h = mix(
40
+ mix(heightAt(c), heightAt(c + ivec2(1, 0)), f.x),
41
+ mix(heightAt(c + ivec2(0, 1)), heightAt(c + ivec2(1, 1)), f.x),
42
+ f.y);
43
+
44
+ vec2 d = p - uPointer.xy;
45
+ h += uPointer.z * exp(-dot(d, d) / uRadius2);
46
+
47
+ // Distance to the nearest contour, in device pixels, from the screen-space gradient.
48
+ float v = h / uStep;
49
+ float level = floor(v + 0.5);
50
+ float dist = abs(v - level) / max(fwidth(v), 1e-5);
51
+
52
+ bool major = uMajorEvery > 0.0 && mod(level, uMajorEvery) == 0.0;
53
+ float halfWidth = major ? uHalfWidth.y : uHalfWidth.x;
54
+ vec4 line = major ? uMajor : uMinor;
55
+ // Analytic antialiasing: coverage ramps over one pixel at the line edge.
56
+ float a = line.a * clamp(halfWidth + 0.5 - dist, 0.0, 1.0);
57
+ outColor = vec4(line.rgb * a, a); // premultiplied; the engine blends it over the background
58
+ }`;
59
+ var UNIFORMS = [
60
+ "uKeyA",
61
+ "uKeyB",
62
+ "uBlend",
63
+ "uGrid",
64
+ "uCellSize",
65
+ "uDpr",
66
+ "uHeight",
67
+ "uPointer",
68
+ "uRadius2",
69
+ "uStep",
70
+ "uMajorEvery",
71
+ "uHalfWidth",
72
+ "uMinor",
73
+ "uMajor"
74
+ ];
75
+ /**
76
+ * Per-pixel contour lines in a fragment shader. The CPU only uploads the two noise
77
+ * keyframes when they change (once per keyframe interval) and sets a few uniforms per frame.
78
+ */
79
+ function createTopoWebGL(gl, initial) {
80
+ let options = resolveTopoOptions(initial);
81
+ const terrain = createTerrain(options);
82
+ const program = createProgram(gl, FULLSCREEN_VERTEX_SHADER, FRAGMENT);
83
+ const uniforms = program ? getUniforms(gl, program, UNIFORMS) : null;
84
+ const textures = [gl.createTexture(), gl.createTexture()];
85
+ for (const texture of textures) {
86
+ gl.bindTexture(gl.TEXTURE_2D, texture);
87
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
88
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
89
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
90
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
91
+ }
92
+ let textureCols = 0;
93
+ let textureRows = 0;
94
+ let uploadedVersion = -1;
95
+ /** Upload the keyframes when they changed since the last frame. */
96
+ function upload() {
97
+ const { field } = terrain;
98
+ const resized = textureCols !== field.cols || textureRows !== field.rows;
99
+ if (!resized && uploadedVersion === field.version) return;
100
+ const keys = [field.keyA, field.keyB];
101
+ for (let unit = 0; unit < 2; unit++) {
102
+ gl.activeTexture(gl.TEXTURE0 + unit);
103
+ gl.bindTexture(gl.TEXTURE_2D, textures[unit]);
104
+ if (resized) gl.texImage2D(gl.TEXTURE_2D, 0, gl.R32F, field.cols, field.rows, 0, gl.RED, gl.FLOAT, keys[unit]);
105
+ else gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, field.cols, field.rows, gl.RED, gl.FLOAT, keys[unit]);
106
+ }
107
+ textureCols = field.cols;
108
+ textureRows = field.rows;
109
+ uploadedVersion = field.version;
110
+ }
111
+ return {
112
+ update(next) {
113
+ options = resolveTopoOptions(next);
114
+ terrain.configure(options);
115
+ },
116
+ render(frame) {
117
+ const blend = terrain.advance(frame);
118
+ if (!program || !uniforms) return;
119
+ upload();
120
+ const minor = parseColor(options.lineColor);
121
+ const major = parseColor(options.majorLineColor);
122
+ const opacity = options.lineOpacity;
123
+ const { field } = terrain;
124
+ gl.useProgram(program);
125
+ gl.uniform1i(uniforms.uKeyA, 0);
126
+ gl.uniform1i(uniforms.uKeyB, 1);
127
+ gl.uniform1f(uniforms.uBlend, blend);
128
+ gl.uniform2f(uniforms.uGrid, field.cols, field.rows);
129
+ gl.uniform1f(uniforms.uCellSize, options.cellSize);
130
+ gl.uniform1f(uniforms.uDpr, frame.dpr);
131
+ gl.uniform1f(uniforms.uHeight, gl.drawingBufferHeight);
132
+ gl.uniform3f(uniforms.uPointer, frame.pointer.x, frame.pointer.y, options.pointerStrength * frame.pointer.influence);
133
+ gl.uniform1f(uniforms.uRadius2, options.pointerRadius * options.pointerRadius);
134
+ gl.uniform1f(uniforms.uStep, options.levelStep);
135
+ gl.uniform1f(uniforms.uMajorEvery, options.majorEvery);
136
+ gl.uniform2f(uniforms.uHalfWidth, options.lineWidth * frame.dpr / 2, options.majorLineWidth * frame.dpr / 2);
137
+ gl.uniform4f(uniforms.uMinor, minor[0], minor[1], minor[2], minor[3] * opacity);
138
+ gl.uniform4f(uniforms.uMajor, major[0], major[1], major[2], major[3] * opacity);
139
+ gl.drawArrays(gl.TRIANGLES, 0, 3);
140
+ },
141
+ destroy() {
142
+ gl.deleteTexture(textures[0]);
143
+ gl.deleteTexture(textures[1]);
144
+ gl.deleteProgram(program);
145
+ }
146
+ };
147
+ }
148
+ export { createTopoWebGL };
149
+
150
+ //# sourceMappingURL=webgl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webgl.js","names":[],"sources":["../../../src/styles/topo/webgl.ts"],"sourcesContent":["import { parseColor } from '../../core/color';\nimport type { StyleRenderer } from '../../core/style';\nimport { createProgram, FULLSCREEN_VERTEX_SHADER, getUniforms } from '../../core/webgl';\nimport { resolveTopoOptions, type TopoOptions } from './options';\nimport { createTerrain } from './terrain';\n\nconst FRAGMENT = `#version 300 es\nprecision highp float;\nprecision highp sampler2D;\n\nuniform sampler2D uKeyA;\nuniform sampler2D uKeyB;\nuniform float uBlend;\nuniform vec2 uGrid; // cols, rows\nuniform float uCellSize; // CSS px between grid samples\nuniform float uDpr;\nuniform float uHeight; // canvas height in device px\nuniform vec3 uPointer; // x, y (CSS px), bump height\nuniform float uRadius2;\nuniform float uStep; // height difference between contour levels\nuniform float uMajorEvery;\nuniform vec2 uHalfWidth; // half line widths (device px): minor, major\nuniform vec4 uMinor; // straight RGBA, opacity applied\nuniform vec4 uMajor;\n\nout vec4 outColor;\n\nfloat heightAt(ivec2 c) {\n return mix(texelFetch(uKeyA, c, 0).r, texelFetch(uKeyB, c, 0).r, uBlend);\n}\n\nvoid main() {\n vec2 p = vec2(gl_FragCoord.x, uHeight - gl_FragCoord.y) / uDpr;\n\n // Bilinear interpolation of the height field (same surface the CPU renderer traces).\n vec2 g = p / uCellSize;\n vec2 cell = clamp(floor(g), vec2(0.0), uGrid - 2.0);\n vec2 f = g - cell;\n ivec2 c = ivec2(cell);\n float h = mix(\n mix(heightAt(c), heightAt(c + ivec2(1, 0)), f.x),\n mix(heightAt(c + ivec2(0, 1)), heightAt(c + ivec2(1, 1)), f.x),\n f.y);\n\n vec2 d = p - uPointer.xy;\n h += uPointer.z * exp(-dot(d, d) / uRadius2);\n\n // Distance to the nearest contour, in device pixels, from the screen-space gradient.\n float v = h / uStep;\n float level = floor(v + 0.5);\n float dist = abs(v - level) / max(fwidth(v), 1e-5);\n\n bool major = uMajorEvery > 0.0 && mod(level, uMajorEvery) == 0.0;\n float halfWidth = major ? uHalfWidth.y : uHalfWidth.x;\n vec4 line = major ? uMajor : uMinor;\n // Analytic antialiasing: coverage ramps over one pixel at the line edge.\n float a = line.a * clamp(halfWidth + 0.5 - dist, 0.0, 1.0);\n outColor = vec4(line.rgb * a, a); // premultiplied; the engine blends it over the background\n}`;\n\nconst UNIFORMS = [\n 'uKeyA', 'uKeyB', 'uBlend', 'uGrid', 'uCellSize', 'uDpr', 'uHeight', 'uPointer', 'uRadius2',\n 'uStep', 'uMajorEvery', 'uHalfWidth', 'uMinor', 'uMajor',\n] as const;\n\n/**\n * Per-pixel contour lines in a fragment shader. The CPU only uploads the two noise\n * keyframes when they change (once per keyframe interval) and sets a few uniforms per frame.\n */\nexport function createTopoWebGL(gl: WebGL2RenderingContext, initial: TopoOptions): StyleRenderer<TopoOptions> {\n let options = resolveTopoOptions(initial);\n const terrain = createTerrain(options);\n\n const program = createProgram(gl, FULLSCREEN_VERTEX_SHADER, FRAGMENT);\n const uniforms = program ? getUniforms(gl, program, UNIFORMS) : null;\n const textures = [gl.createTexture(), gl.createTexture()] as const;\n for (const texture of textures) {\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n }\n let textureCols = 0;\n let textureRows = 0;\n let uploadedVersion = -1;\n\n /** Upload the keyframes when they changed since the last frame. */\n function upload(): void {\n const { field } = terrain;\n const resized = textureCols !== field.cols || textureRows !== field.rows;\n if (!resized && uploadedVersion === field.version) return;\n const keys = [field.keyA, field.keyB];\n for (let unit = 0; unit < 2; unit++) {\n gl.activeTexture(gl.TEXTURE0 + unit);\n gl.bindTexture(gl.TEXTURE_2D, textures[unit]);\n if (resized) {\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.R32F, field.cols, field.rows, 0, gl.RED, gl.FLOAT, keys[unit]);\n } else {\n gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, field.cols, field.rows, gl.RED, gl.FLOAT, keys[unit]);\n }\n }\n textureCols = field.cols;\n textureRows = field.rows;\n uploadedVersion = field.version;\n }\n\n return {\n update(next) {\n options = resolveTopoOptions(next);\n terrain.configure(options);\n },\n render(frame) {\n const blend = terrain.advance(frame);\n if (!program || !uniforms) return; // context lost during setup; the engine recreates us\n upload();\n\n const minor = parseColor(options.lineColor);\n const major = parseColor(options.majorLineColor);\n const opacity = options.lineOpacity;\n const { field } = terrain;\n\n gl.useProgram(program);\n gl.uniform1i(uniforms.uKeyA, 0);\n gl.uniform1i(uniforms.uKeyB, 1);\n gl.uniform1f(uniforms.uBlend, blend);\n gl.uniform2f(uniforms.uGrid, field.cols, field.rows);\n gl.uniform1f(uniforms.uCellSize, options.cellSize);\n gl.uniform1f(uniforms.uDpr, frame.dpr);\n gl.uniform1f(uniforms.uHeight, gl.drawingBufferHeight);\n gl.uniform3f(uniforms.uPointer, frame.pointer.x, frame.pointer.y, options.pointerStrength * frame.pointer.influence);\n gl.uniform1f(uniforms.uRadius2, options.pointerRadius * options.pointerRadius);\n gl.uniform1f(uniforms.uStep, options.levelStep);\n gl.uniform1f(uniforms.uMajorEvery, options.majorEvery);\n gl.uniform2f(uniforms.uHalfWidth, (options.lineWidth * frame.dpr) / 2, (options.majorLineWidth * frame.dpr) / 2);\n gl.uniform4f(uniforms.uMinor, minor[0], minor[1], minor[2], minor[3] * opacity);\n gl.uniform4f(uniforms.uMajor, major[0], major[1], major[2], major[3] * opacity);\n gl.drawArrays(gl.TRIANGLES, 0, 3);\n },\n destroy() {\n gl.deleteTexture(textures[0]);\n gl.deleteTexture(textures[1]);\n gl.deleteProgram(program);\n },\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_canvas2d_renderer = require("../core/canvas2d-renderer.cjs");
3
+ const require_style = require("../core/style.cjs");
4
+ const require_canvas2d = require("../styles/topo/canvas2d.cjs");
5
+ const require_definition = require("../styles/topo/definition.cjs");
6
+ // src/topo/canvas2d.ts
7
+ /** Animated topographic contour lines, drawn with Canvas 2D only. */
8
+ var topo = require_style.defineStyle({
9
+ ...require_definition.topoStyle,
10
+ renderers: [require_canvas2d_renderer.canvas2dRenderer(require_canvas2d.createTopoCanvas2D)]
11
+ });
12
+ exports.topo = topo;
13
+
14
+ //# sourceMappingURL=canvas2d.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas2d.cjs","names":["defineStyle","topoStyle","canvas2dRenderer","createTopoCanvas2D"],"sources":["../../src/topo/canvas2d.ts"],"sourcesContent":["import { canvas2dRenderer } from '../core/canvas2d-renderer';\nimport { defineStyle, type StyleFactory } from '../core/style';\nimport { createTopoCanvas2D } from '../styles/topo/canvas2d';\nimport { topoStyle } from '../styles/topo/definition';\nimport type { TopoOptions } from '../styles/topo/options';\n\nexport type { TopoOptions };\n\n/** Animated topographic contour lines, drawn with Canvas 2D only. */\nexport const topo: StyleFactory<TopoOptions> = defineStyle({ ...topoStyle, renderers: [canvas2dRenderer(createTopoCanvas2D)] });\n"],"mappings":";;;;;;;AASA,IAAa,OAAkCA,cAAAA,YAAY;CAAE,GAAGC,mBAAAA;CAAW,WAAW,CAACC,0BAAAA,iBAAiBC,iBAAAA,kBAAkB,CAAC;AAAE,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { type StyleFactory } from '../core/style.cjs';
2
+ import type { TopoOptions } from '../styles/topo/options.cjs';
3
+ export type { TopoOptions };
4
+ /** Animated topographic contour lines, drawn with Canvas 2D only. */
5
+ export declare const topo: StyleFactory<TopoOptions>;
@@ -0,0 +1,5 @@
1
+ import { type StyleFactory } from '../core/style.js';
2
+ import type { TopoOptions } from '../styles/topo/options.js';
3
+ export type { TopoOptions };
4
+ /** Animated topographic contour lines, drawn with Canvas 2D only. */
5
+ export declare const topo: StyleFactory<TopoOptions>;
@@ -0,0 +1,13 @@
1
+ import { canvas2dRenderer } from "../core/canvas2d-renderer.js";
2
+ import { defineStyle } from "../core/style.js";
3
+ import { createTopoCanvas2D } from "../styles/topo/canvas2d.js";
4
+ import { topoStyle } from "../styles/topo/definition.js";
5
+ // src/topo/canvas2d.ts
6
+ /** Animated topographic contour lines, drawn with Canvas 2D only. */
7
+ var topo = defineStyle({
8
+ ...topoStyle,
9
+ renderers: [canvas2dRenderer(createTopoCanvas2D)]
10
+ });
11
+ export { topo };
12
+
13
+ //# sourceMappingURL=canvas2d.js.map