@luma.gl/shaders 0.0.0-stage → 10.0.0-alpha.6

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 (693) hide show
  1. package/LICENSE +38 -0
  2. package/README.md +25 -2
  3. package/dist/dist.dev.js +19686 -0
  4. package/dist/dist.min.js +12180 -0
  5. package/dist/glsl.cjs +33 -0
  6. package/dist/glsl.cjs.map +6 -0
  7. package/dist/glsl.d.ts +6 -0
  8. package/dist/glsl.d.ts.map +1 -0
  9. package/dist/glsl.js +7 -0
  10. package/dist/glsl.js.map +1 -0
  11. package/dist/index.cjs +243 -0
  12. package/dist/index.cjs.map +6 -0
  13. package/dist/index.d.ts +91 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +65 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/lib/color/normalize-byte-colors.cjs +50 -0
  18. package/dist/lib/color/normalize-byte-colors.d.ts +23 -0
  19. package/dist/lib/color/normalize-byte-colors.d.ts.map +1 -0
  20. package/dist/lib/color/normalize-byte-colors.js +42 -0
  21. package/dist/lib/color/normalize-byte-colors.js.map +1 -0
  22. package/dist/lib/filters/prop-types.cjs +90 -0
  23. package/dist/lib/filters/prop-types.d.ts +44 -0
  24. package/dist/lib/filters/prop-types.d.ts.map +1 -0
  25. package/dist/lib/filters/prop-types.js +96 -0
  26. package/dist/lib/filters/prop-types.js.map +1 -0
  27. package/dist/lib/glsl-shader-assembler.cjs +50 -0
  28. package/dist/lib/glsl-shader-assembler.d.ts +19 -0
  29. package/dist/lib/glsl-shader-assembler.d.ts.map +1 -0
  30. package/dist/lib/glsl-shader-assembler.js +29 -0
  31. package/dist/lib/glsl-shader-assembler.js.map +1 -0
  32. package/dist/lib/glsl-utils/get-shader-info.cjs +52 -0
  33. package/dist/lib/glsl-utils/get-shader-info.d.ts +9 -0
  34. package/dist/lib/glsl-utils/get-shader-info.d.ts.map +1 -0
  35. package/dist/lib/glsl-utils/get-shader-info.js +33 -0
  36. package/dist/lib/glsl-utils/get-shader-info.js.map +1 -0
  37. package/dist/lib/glsl-utils/shader-utils.cjs +126 -0
  38. package/dist/lib/glsl-utils/shader-utils.d.ts +23 -0
  39. package/dist/lib/glsl-utils/shader-utils.d.ts.map +1 -0
  40. package/dist/lib/glsl-utils/shader-utils.js +92 -0
  41. package/dist/lib/glsl-utils/shader-utils.js.map +1 -0
  42. package/dist/lib/preprocessor/preprocessor.cjs +107 -0
  43. package/dist/lib/preprocessor/preprocessor.d.ts +15 -0
  44. package/dist/lib/preprocessor/preprocessor.d.ts.map +1 -0
  45. package/dist/lib/preprocessor/preprocessor.js +99 -0
  46. package/dist/lib/preprocessor/preprocessor.js.map +1 -0
  47. package/dist/lib/shader-assembler-base.cjs +133 -0
  48. package/dist/lib/shader-assembler-base.d.ts +52 -0
  49. package/dist/lib/shader-assembler-base.d.ts.map +1 -0
  50. package/dist/lib/shader-assembler-base.js +128 -0
  51. package/dist/lib/shader-assembler-base.js.map +1 -0
  52. package/dist/lib/shader-assembler.cjs +33 -0
  53. package/dist/lib/shader-assembler.d.ts +4 -0
  54. package/dist/lib/shader-assembler.d.ts.map +1 -0
  55. package/dist/lib/shader-assembler.js +7 -0
  56. package/dist/lib/shader-assembler.js.map +1 -0
  57. package/dist/lib/shader-assembly/assemble-glsl-shaders.cjs +200 -0
  58. package/dist/lib/shader-assembly/assemble-glsl-shaders.d.ts +69 -0
  59. package/dist/lib/shader-assembly/assemble-glsl-shaders.d.ts.map +1 -0
  60. package/dist/lib/shader-assembly/assemble-glsl-shaders.js +221 -0
  61. package/dist/lib/shader-assembly/assemble-glsl-shaders.js.map +1 -0
  62. package/dist/lib/shader-assembly/assemble-shaders.cjs +42 -0
  63. package/dist/lib/shader-assembly/assemble-shaders.d.ts +10 -0
  64. package/dist/lib/shader-assembly/assemble-shaders.d.ts.map +1 -0
  65. package/dist/lib/shader-assembly/assemble-shaders.js +10 -0
  66. package/dist/lib/shader-assembly/assemble-shaders.js.map +1 -0
  67. package/dist/lib/shader-assembly/assemble-wgsl-shaders.cjs +501 -0
  68. package/dist/lib/shader-assembly/assemble-wgsl-shaders.d.ts +71 -0
  69. package/dist/lib/shader-assembly/assemble-wgsl-shaders.d.ts.map +1 -0
  70. package/dist/lib/shader-assembly/assemble-wgsl-shaders.js +473 -0
  71. package/dist/lib/shader-assembly/assemble-wgsl-shaders.js.map +1 -0
  72. package/dist/lib/shader-assembly/platform-defines.cjs +79 -0
  73. package/dist/lib/shader-assembly/platform-defines.d.ts +4 -0
  74. package/dist/lib/shader-assembly/platform-defines.d.ts.map +1 -0
  75. package/dist/lib/shader-assembly/platform-defines.js +52 -0
  76. package/dist/lib/shader-assembly/platform-defines.js.map +1 -0
  77. package/dist/lib/shader-assembly/platform-info.cjs +15 -0
  78. package/dist/lib/shader-assembly/platform-info.d.ts +20 -0
  79. package/dist/lib/shader-assembly/platform-info.d.ts.map +1 -0
  80. package/dist/lib/shader-assembly/platform-info.js +5 -0
  81. package/dist/lib/shader-assembly/platform-info.js.map +1 -0
  82. package/dist/lib/shader-assembly/shader-assembly-shared.cjs +96 -0
  83. package/dist/lib/shader-assembly/shader-assembly-shared.d.ts +16 -0
  84. package/dist/lib/shader-assembly/shader-assembly-shared.d.ts.map +1 -0
  85. package/dist/lib/shader-assembly/shader-assembly-shared.js +79 -0
  86. package/dist/lib/shader-assembly/shader-assembly-shared.js.map +1 -0
  87. package/dist/lib/shader-assembly/shader-assembly-types.cjs +15 -0
  88. package/dist/lib/shader-assembly/shader-assembly-types.d.ts +128 -0
  89. package/dist/lib/shader-assembly/shader-assembly-types.d.ts.map +1 -0
  90. package/dist/lib/shader-assembly/shader-assembly-types.js +5 -0
  91. package/dist/lib/shader-assembly/shader-assembly-types.js.map +1 -0
  92. package/dist/lib/shader-assembly/shader-hooks.cjs +103 -0
  93. package/dist/lib/shader-assembly/shader-hooks.d.ts +45 -0
  94. package/dist/lib/shader-assembly/shader-hooks.d.ts.map +1 -0
  95. package/dist/lib/shader-assembly/shader-hooks.js +84 -0
  96. package/dist/lib/shader-assembly/shader-hooks.js.map +1 -0
  97. package/dist/lib/shader-assembly/shader-injections.cjs +180 -0
  98. package/dist/lib/shader-assembly/shader-injections.d.ts +34 -0
  99. package/dist/lib/shader-assembly/shader-injections.d.ts.map +1 -0
  100. package/dist/lib/shader-assembly/shader-injections.js +183 -0
  101. package/dist/lib/shader-assembly/shader-injections.js.map +1 -0
  102. package/dist/lib/shader-assembly/shader-plugin-varyings.cjs +417 -0
  103. package/dist/lib/shader-assembly/shader-plugin-varyings.d.ts +15 -0
  104. package/dist/lib/shader-assembly/shader-plugin-varyings.d.ts.map +1 -0
  105. package/dist/lib/shader-assembly/shader-plugin-varyings.js +412 -0
  106. package/dist/lib/shader-assembly/shader-plugin-varyings.js.map +1 -0
  107. package/dist/lib/shader-assembly/shader-plugin-vertex-inputs.cjs +254 -0
  108. package/dist/lib/shader-assembly/shader-plugin-vertex-inputs.d.ts +12 -0
  109. package/dist/lib/shader-assembly/shader-plugin-vertex-inputs.d.ts.map +1 -0
  110. package/dist/lib/shader-assembly/shader-plugin-vertex-inputs.js +237 -0
  111. package/dist/lib/shader-assembly/shader-plugin-vertex-inputs.js.map +1 -0
  112. package/dist/lib/shader-assembly/wgsl-binding-debug.cjs +166 -0
  113. package/dist/lib/shader-assembly/wgsl-binding-debug.d.ts +37 -0
  114. package/dist/lib/shader-assembly/wgsl-binding-debug.d.ts.map +1 -0
  115. package/dist/lib/shader-assembly/wgsl-binding-debug.js +144 -0
  116. package/dist/lib/shader-assembly/wgsl-binding-debug.js.map +1 -0
  117. package/dist/lib/shader-assembly/wgsl-binding-scan.cjs +184 -0
  118. package/dist/lib/shader-assembly/wgsl-binding-scan.d.ts +19 -0
  119. package/dist/lib/shader-assembly/wgsl-binding-scan.d.ts.map +1 -0
  120. package/dist/lib/shader-assembly/wgsl-binding-scan.js +151 -0
  121. package/dist/lib/shader-assembly/wgsl-binding-scan.js.map +1 -0
  122. package/dist/lib/shader-assembly/wgsl-interface-scan.cjs +502 -0
  123. package/dist/lib/shader-assembly/wgsl-interface-scan.d.ts +14 -0
  124. package/dist/lib/shader-assembly/wgsl-interface-scan.d.ts.map +1 -0
  125. package/dist/lib/shader-assembly/wgsl-interface-scan.js +498 -0
  126. package/dist/lib/shader-assembly/wgsl-interface-scan.js.map +1 -0
  127. package/dist/lib/shader-generator/generate-shader.cjs +36 -0
  128. package/dist/lib/shader-generator/generate-shader.d.ts +8 -0
  129. package/dist/lib/shader-generator/generate-shader.d.ts.map +1 -0
  130. package/dist/lib/shader-generator/generate-shader.js +15 -0
  131. package/dist/lib/shader-generator/generate-shader.js.map +1 -0
  132. package/dist/lib/shader-generator/glsl/generate-glsl.cjs +94 -0
  133. package/dist/lib/shader-generator/glsl/generate-glsl.d.ts +7 -0
  134. package/dist/lib/shader-generator/glsl/generate-glsl.d.ts.map +1 -0
  135. package/dist/lib/shader-generator/glsl/generate-glsl.js +79 -0
  136. package/dist/lib/shader-generator/glsl/generate-glsl.js.map +1 -0
  137. package/dist/lib/shader-generator/utils/capitalize.cjs +29 -0
  138. package/dist/lib/shader-generator/utils/capitalize.d.ts +7 -0
  139. package/dist/lib/shader-generator/utils/capitalize.d.ts.map +1 -0
  140. package/dist/lib/shader-generator/utils/capitalize.js +12 -0
  141. package/dist/lib/shader-generator/utils/capitalize.js.map +1 -0
  142. package/dist/lib/shader-generator/wgsl/generate-wgsl.cjs +46 -0
  143. package/dist/lib/shader-generator/wgsl/generate-wgsl.d.ts +7 -0
  144. package/dist/lib/shader-generator/wgsl/generate-wgsl.d.ts.map +1 -0
  145. package/dist/lib/shader-generator/wgsl/generate-wgsl.js +23 -0
  146. package/dist/lib/shader-generator/wgsl/generate-wgsl.js.map +1 -0
  147. package/dist/lib/shader-module/composite-shader-pass.cjs +15 -0
  148. package/dist/lib/shader-module/composite-shader-pass.d.ts +41 -0
  149. package/dist/lib/shader-module/composite-shader-pass.d.ts.map +1 -0
  150. package/dist/lib/shader-module/composite-shader-pass.js +5 -0
  151. package/dist/lib/shader-module/composite-shader-pass.js.map +1 -0
  152. package/dist/lib/shader-module/shader-module-dependencies.cjs +83 -0
  153. package/dist/lib/shader-module/shader-module-dependencies.d.ts +39 -0
  154. package/dist/lib/shader-module/shader-module-dependencies.d.ts.map +1 -0
  155. package/dist/lib/shader-module/shader-module-dependencies.js +103 -0
  156. package/dist/lib/shader-module/shader-module-dependencies.js.map +1 -0
  157. package/dist/lib/shader-module/shader-module-uniform-layout.cjs +224 -0
  158. package/dist/lib/shader-module/shader-module-uniform-layout.d.ts +91 -0
  159. package/dist/lib/shader-module/shader-module-uniform-layout.d.ts.map +1 -0
  160. package/dist/lib/shader-module/shader-module-uniform-layout.js +253 -0
  161. package/dist/lib/shader-module/shader-module-uniform-layout.js.map +1 -0
  162. package/dist/lib/shader-module/shader-module.cjs +105 -0
  163. package/dist/lib/shader-module/shader-module.d.ts +98 -0
  164. package/dist/lib/shader-module/shader-module.d.ts.map +1 -0
  165. package/dist/lib/shader-module/shader-module.js +104 -0
  166. package/dist/lib/shader-module/shader-module.js.map +1 -0
  167. package/dist/lib/shader-module/shader-pass.cjs +15 -0
  168. package/dist/lib/shader-module/shader-pass.d.ts +48 -0
  169. package/dist/lib/shader-module/shader-pass.d.ts.map +1 -0
  170. package/dist/lib/shader-module/shader-pass.js +5 -0
  171. package/dist/lib/shader-module/shader-pass.js.map +1 -0
  172. package/dist/lib/shader-plugin.cjs +117 -0
  173. package/dist/lib/shader-plugin.d.ts +68 -0
  174. package/dist/lib/shader-plugin.d.ts.map +1 -0
  175. package/dist/lib/shader-plugin.js +98 -0
  176. package/dist/lib/shader-plugin.js.map +1 -0
  177. package/dist/lib/shader-transpiler/shader-transpiler.cjs +15 -0
  178. package/dist/lib/shader-transpiler/shader-transpiler.d.ts +27 -0
  179. package/dist/lib/shader-transpiler/shader-transpiler.d.ts.map +1 -0
  180. package/dist/lib/shader-transpiler/shader-transpiler.js +5 -0
  181. package/dist/lib/shader-transpiler/shader-transpiler.js.map +1 -0
  182. package/dist/lib/shader-transpiler/transpile-glsl-shader.cjs +71 -0
  183. package/dist/lib/shader-transpiler/transpile-glsl-shader.d.ts +9 -0
  184. package/dist/lib/shader-transpiler/transpile-glsl-shader.d.ts.map +1 -0
  185. package/dist/lib/shader-transpiler/transpile-glsl-shader.js +69 -0
  186. package/dist/lib/shader-transpiler/transpile-glsl-shader.js.map +1 -0
  187. package/dist/lib/utils/assert.cjs +34 -0
  188. package/dist/lib/utils/assert.d.ts +2 -0
  189. package/dist/lib/utils/assert.d.ts.map +1 -0
  190. package/dist/lib/utils/assert.js +13 -0
  191. package/dist/lib/utils/assert.js.map +1 -0
  192. package/dist/lib/utils/uniform-types.cjs +15 -0
  193. package/dist/lib/utils/uniform-types.d.ts +18 -0
  194. package/dist/lib/utils/uniform-types.d.ts.map +1 -0
  195. package/dist/lib/utils/uniform-types.js +5 -0
  196. package/dist/lib/utils/uniform-types.js.map +1 -0
  197. package/dist/lib/wgsl-shader-assembler.cjs +99 -0
  198. package/dist/lib/wgsl-shader-assembler.d.ts +34 -0
  199. package/dist/lib/wgsl-shader-assembler.d.ts.map +1 -0
  200. package/dist/lib/wgsl-shader-assembler.js +84 -0
  201. package/dist/lib/wgsl-shader-assembler.js.map +1 -0
  202. package/dist/module-injectors.cjs +59 -0
  203. package/dist/module-injectors.d.ts +3 -0
  204. package/dist/module-injectors.d.ts.map +1 -0
  205. package/dist/module-injectors.js +31 -0
  206. package/dist/module-injectors.js.map +1 -0
  207. package/dist/modules/color/float-colors.cjs +275 -0
  208. package/dist/modules/color/float-colors.d.ts +132 -0
  209. package/dist/modules/color/float-colors.d.ts.map +1 -0
  210. package/dist/modules/color/float-colors.js +248 -0
  211. package/dist/modules/color/float-colors.js.map +1 -0
  212. package/dist/modules/engine/clip/clip.cjs +152 -0
  213. package/dist/modules/engine/clip/clip.d.ts +12 -0
  214. package/dist/modules/engine/clip/clip.d.ts.map +1 -0
  215. package/dist/modules/engine/clip/clip.js +129 -0
  216. package/dist/modules/engine/clip/clip.js.map +1 -0
  217. package/dist/modules/engine/filter/filter.cjs +111 -0
  218. package/dist/modules/engine/filter/filter.d.ts +12 -0
  219. package/dist/modules/engine/filter/filter.d.ts.map +1 -0
  220. package/dist/modules/engine/filter/filter.js +88 -0
  221. package/dist/modules/engine/filter/filter.js.map +1 -0
  222. package/dist/modules/engine/geometry/geometry.cjs +63 -0
  223. package/dist/modules/engine/geometry/geometry.d.ts +9 -0
  224. package/dist/modules/engine/geometry/geometry.d.ts.map +1 -0
  225. package/dist/modules/engine/geometry/geometry.js +42 -0
  226. package/dist/modules/engine/geometry/geometry.js.map +1 -0
  227. package/dist/modules/engine/gpu-animation/gpu-animation.cjs +255 -0
  228. package/dist/modules/engine/gpu-animation/gpu-animation.d.ts +34 -0
  229. package/dist/modules/engine/gpu-animation/gpu-animation.d.ts.map +1 -0
  230. package/dist/modules/engine/gpu-animation/gpu-animation.js +228 -0
  231. package/dist/modules/engine/gpu-animation/gpu-animation.js.map +1 -0
  232. package/dist/modules/engine/picking/picking.cjs +210 -0
  233. package/dist/modules/engine/picking/picking.d.ts +77 -0
  234. package/dist/modules/engine/picking/picking.d.ts.map +1 -0
  235. package/dist/modules/engine/picking/picking.js +198 -0
  236. package/dist/modules/engine/picking/picking.js.map +1 -0
  237. package/dist/modules/engine/project/project.cjs +138 -0
  238. package/dist/modules/engine/project/project.d.ts +39 -0
  239. package/dist/modules/engine/project/project.d.ts.map +1 -0
  240. package/dist/modules/engine/project/project.js +129 -0
  241. package/dist/modules/engine/project/project.js.map +1 -0
  242. package/dist/modules/engine/skin/skin.cjs +212 -0
  243. package/dist/modules/engine/skin/skin.d.ts +52 -0
  244. package/dist/modules/engine/skin/skin.d.ts.map +1 -0
  245. package/dist/modules/engine/skin/skin.js +179 -0
  246. package/dist/modules/engine/skin/skin.js.map +1 -0
  247. package/dist/modules/engine/transform/transform.cjs +72 -0
  248. package/dist/modules/engine/transform/transform.d.ts +6 -0
  249. package/dist/modules/engine/transform/transform.d.ts.map +1 -0
  250. package/dist/modules/engine/transform/transform.js +49 -0
  251. package/dist/modules/engine/transform/transform.js.map +1 -0
  252. package/dist/modules/geometry/path-dash/path-dash.cjs +93 -0
  253. package/dist/modules/geometry/path-dash/path-dash.d.ts +10 -0
  254. package/dist/modules/geometry/path-dash/path-dash.d.ts.map +1 -0
  255. package/dist/modules/geometry/path-dash/path-dash.js +66 -0
  256. package/dist/modules/geometry/path-dash/path-dash.js.map +1 -0
  257. package/dist/modules/geometry/pattern-fill/pattern-fill-shaders.cjs +117 -0
  258. package/dist/modules/geometry/pattern-fill/pattern-fill-shaders.d.ts +3 -0
  259. package/dist/modules/geometry/pattern-fill/pattern-fill-shaders.d.ts.map +1 -0
  260. package/dist/modules/geometry/pattern-fill/pattern-fill-shaders.js +87 -0
  261. package/dist/modules/geometry/pattern-fill/pattern-fill-shaders.js.map +1 -0
  262. package/dist/modules/geometry/pattern-fill/pattern-fill.cjs +64 -0
  263. package/dist/modules/geometry/pattern-fill/pattern-fill.d.ts +14 -0
  264. package/dist/modules/geometry/pattern-fill/pattern-fill.d.ts.map +1 -0
  265. package/dist/modules/geometry/pattern-fill/pattern-fill.js +43 -0
  266. package/dist/modules/geometry/pattern-fill/pattern-fill.js.map +1 -0
  267. package/dist/modules/geometry/point-glow/point-glow.cjs +104 -0
  268. package/dist/modules/geometry/point-glow/point-glow.d.ts +11 -0
  269. package/dist/modules/geometry/point-glow/point-glow.d.ts.map +1 -0
  270. package/dist/modules/geometry/point-glow/point-glow.js +77 -0
  271. package/dist/modules/geometry/point-glow/point-glow.js.map +1 -0
  272. package/dist/modules/geometry/precipitation/precipitation.cjs +122 -0
  273. package/dist/modules/geometry/precipitation/precipitation.d.ts +40 -0
  274. package/dist/modules/geometry/precipitation/precipitation.d.ts.map +1 -0
  275. package/dist/modules/geometry/precipitation/precipitation.js +95 -0
  276. package/dist/modules/geometry/precipitation/precipitation.js.map +1 -0
  277. package/dist/modules/geometry/sketch-stroke/sketch-stroke.cjs +158 -0
  278. package/dist/modules/geometry/sketch-stroke/sketch-stroke.d.ts +60 -0
  279. package/dist/modules/geometry/sketch-stroke/sketch-stroke.d.ts.map +1 -0
  280. package/dist/modules/geometry/sketch-stroke/sketch-stroke.js +137 -0
  281. package/dist/modules/geometry/sketch-stroke/sketch-stroke.js.map +1 -0
  282. package/dist/modules/geospatial/dggs/dggs-wgsl.cjs +2304 -0
  283. package/dist/modules/geospatial/dggs/dggs-wgsl.d.ts +3 -0
  284. package/dist/modules/geospatial/dggs/dggs-wgsl.d.ts.map +1 -0
  285. package/dist/modules/geospatial/dggs/dggs-wgsl.js +2283 -0
  286. package/dist/modules/geospatial/dggs/dggs-wgsl.js.map +1 -0
  287. package/dist/modules/geospatial/dggs/dggs.cjs +31 -0
  288. package/dist/modules/geospatial/dggs/dggs.d.ts +6 -0
  289. package/dist/modules/geospatial/dggs/dggs.d.ts.map +1 -0
  290. package/dist/modules/geospatial/dggs/dggs.js +10 -0
  291. package/dist/modules/geospatial/dggs/dggs.js.map +1 -0
  292. package/dist/modules/lighting/area-lighting/area-light-types.cjs +68 -0
  293. package/dist/modules/lighting/area-lighting/area-light-types.d.ts +34 -0
  294. package/dist/modules/lighting/area-lighting/area-light-types.d.ts.map +1 -0
  295. package/dist/modules/lighting/area-lighting/area-light-types.js +40 -0
  296. package/dist/modules/lighting/area-lighting/area-light-types.js.map +1 -0
  297. package/dist/modules/lighting/area-lighting/area-lighting-shaders.cjs +101 -0
  298. package/dist/modules/lighting/area-lighting/area-lighting-shaders.d.ts +3 -0
  299. package/dist/modules/lighting/area-lighting/area-lighting-shaders.d.ts.map +1 -0
  300. package/dist/modules/lighting/area-lighting/area-lighting-shaders.js +71 -0
  301. package/dist/modules/lighting/area-lighting/area-lighting-shaders.js.map +1 -0
  302. package/dist/modules/lighting/area-lighting/area-lighting.cjs +62 -0
  303. package/dist/modules/lighting/area-lighting/area-lighting.d.ts +89 -0
  304. package/dist/modules/lighting/area-lighting/area-lighting.d.ts.map +1 -0
  305. package/dist/modules/lighting/area-lighting/area-lighting.js +41 -0
  306. package/dist/modules/lighting/area-lighting/area-lighting.js.map +1 -0
  307. package/dist/modules/lighting/area-lighting/ltc-shaders.cjs +192 -0
  308. package/dist/modules/lighting/area-lighting/ltc-shaders.d.ts +3 -0
  309. package/dist/modules/lighting/area-lighting/ltc-shaders.d.ts.map +1 -0
  310. package/dist/modules/lighting/area-lighting/ltc-shaders.js +162 -0
  311. package/dist/modules/lighting/area-lighting/ltc-shaders.js.map +1 -0
  312. package/dist/modules/lighting/atmosphere/atmosphere.cjs +253 -0
  313. package/dist/modules/lighting/atmosphere/atmosphere.d.ts +45 -0
  314. package/dist/modules/lighting/atmosphere/atmosphere.d.ts.map +1 -0
  315. package/dist/modules/lighting/atmosphere/atmosphere.js +228 -0
  316. package/dist/modules/lighting/atmosphere/atmosphere.js.map +1 -0
  317. package/dist/modules/lighting/clouds/clouds.cjs +216 -0
  318. package/dist/modules/lighting/clouds/clouds.d.ts +58 -0
  319. package/dist/modules/lighting/clouds/clouds.d.ts.map +1 -0
  320. package/dist/modules/lighting/clouds/clouds.js +192 -0
  321. package/dist/modules/lighting/clouds/clouds.js.map +1 -0
  322. package/dist/modules/lighting/firefly/firefly.cjs +74 -0
  323. package/dist/modules/lighting/firefly/firefly.d.ts +36 -0
  324. package/dist/modules/lighting/firefly/firefly.d.ts.map +1 -0
  325. package/dist/modules/lighting/firefly/firefly.js +53 -0
  326. package/dist/modules/lighting/firefly/firefly.js.map +1 -0
  327. package/dist/modules/lighting/globe-clouds/globe-clouds.cjs +143 -0
  328. package/dist/modules/lighting/globe-clouds/globe-clouds.d.ts +53 -0
  329. package/dist/modules/lighting/globe-clouds/globe-clouds.d.ts.map +1 -0
  330. package/dist/modules/lighting/globe-clouds/globe-clouds.js +119 -0
  331. package/dist/modules/lighting/globe-clouds/globe-clouds.js.map +1 -0
  332. package/dist/modules/lighting/gouraud-material/gouraud-material.cjs +61 -0
  333. package/dist/modules/lighting/gouraud-material/gouraud-material.d.ts +12 -0
  334. package/dist/modules/lighting/gouraud-material/gouraud-material.d.ts.map +1 -0
  335. package/dist/modules/lighting/gouraud-material/gouraud-material.js +40 -0
  336. package/dist/modules/lighting/gouraud-material/gouraud-material.js.map +1 -0
  337. package/dist/modules/lighting/height-fog/height-fog-functions.cjs +139 -0
  338. package/dist/modules/lighting/height-fog/height-fog-functions.d.ts +14 -0
  339. package/dist/modules/lighting/height-fog/height-fog-functions.d.ts.map +1 -0
  340. package/dist/modules/lighting/height-fog/height-fog-functions.js +114 -0
  341. package/dist/modules/lighting/height-fog/height-fog-functions.js.map +1 -0
  342. package/dist/modules/lighting/height-fog/height-fog.cjs +104 -0
  343. package/dist/modules/lighting/height-fog/height-fog.d.ts +60 -0
  344. package/dist/modules/lighting/height-fog/height-fog.d.ts.map +1 -0
  345. package/dist/modules/lighting/height-fog/height-fog.js +77 -0
  346. package/dist/modules/lighting/height-fog/height-fog.js.map +1 -0
  347. package/dist/modules/lighting/ibl/ibl.cjs +63 -0
  348. package/dist/modules/lighting/ibl/ibl.d.ts +25 -0
  349. package/dist/modules/lighting/ibl/ibl.d.ts.map +1 -0
  350. package/dist/modules/lighting/ibl/ibl.js +33 -0
  351. package/dist/modules/lighting/ibl/ibl.js.map +1 -0
  352. package/dist/modules/lighting/lambert-material/lambert-material.cjs +54 -0
  353. package/dist/modules/lighting/lambert-material/lambert-material.d.ts +10 -0
  354. package/dist/modules/lighting/lambert-material/lambert-material.d.ts.map +1 -0
  355. package/dist/modules/lighting/lambert-material/lambert-material.js +33 -0
  356. package/dist/modules/lighting/lambert-material/lambert-material.js.map +1 -0
  357. package/dist/modules/lighting/lambert-material/lambert-shaders-glsl.cjs +88 -0
  358. package/dist/modules/lighting/lambert-material/lambert-shaders-glsl.d.ts +3 -0
  359. package/dist/modules/lighting/lambert-material/lambert-shaders-glsl.d.ts.map +1 -0
  360. package/dist/modules/lighting/lambert-material/lambert-shaders-glsl.js +60 -0
  361. package/dist/modules/lighting/lambert-material/lambert-shaders-glsl.js.map +1 -0
  362. package/dist/modules/lighting/lambert-material/lambert-shaders-wgsl.cjs +97 -0
  363. package/dist/modules/lighting/lambert-material/lambert-shaders-wgsl.d.ts +2 -0
  364. package/dist/modules/lighting/lambert-material/lambert-shaders-wgsl.d.ts.map +1 -0
  365. package/dist/modules/lighting/lambert-material/lambert-shaders-wgsl.js +73 -0
  366. package/dist/modules/lighting/lambert-material/lambert-shaders-wgsl.js.map +1 -0
  367. package/dist/modules/lighting/lights/lighting-glsl.cjs +116 -0
  368. package/dist/modules/lighting/lights/lighting-glsl.d.ts +2 -0
  369. package/dist/modules/lighting/lights/lighting-glsl.d.ts.map +1 -0
  370. package/dist/modules/lighting/lights/lighting-glsl.js +92 -0
  371. package/dist/modules/lighting/lights/lighting-glsl.js.map +1 -0
  372. package/dist/modules/lighting/lights/lighting-wgsl.cjs +115 -0
  373. package/dist/modules/lighting/lights/lighting-wgsl.d.ts +2 -0
  374. package/dist/modules/lighting/lights/lighting-wgsl.d.ts.map +1 -0
  375. package/dist/modules/lighting/lights/lighting-wgsl.js +91 -0
  376. package/dist/modules/lighting/lights/lighting-wgsl.js.map +1 -0
  377. package/dist/modules/lighting/lights/lighting.cjs +210 -0
  378. package/dist/modules/lighting/lights/lighting.d.ts +163 -0
  379. package/dist/modules/lighting/lights/lighting.d.ts.map +1 -0
  380. package/dist/modules/lighting/lights/lighting.js +208 -0
  381. package/dist/modules/lighting/lights/lighting.js.map +1 -0
  382. package/dist/modules/lighting/no-material/dirlight.cjs +112 -0
  383. package/dist/modules/lighting/no-material/dirlight.d.ts +33 -0
  384. package/dist/modules/lighting/no-material/dirlight.d.ts.map +1 -0
  385. package/dist/modules/lighting/no-material/dirlight.js +86 -0
  386. package/dist/modules/lighting/no-material/dirlight.js.map +1 -0
  387. package/dist/modules/lighting/pbr-material/pbr-material-glsl.cjs +1767 -0
  388. package/dist/modules/lighting/pbr-material/pbr-material-glsl.d.ts +3 -0
  389. package/dist/modules/lighting/pbr-material/pbr-material-glsl.d.ts.map +1 -0
  390. package/dist/modules/lighting/pbr-material/pbr-material-glsl.js +1745 -0
  391. package/dist/modules/lighting/pbr-material/pbr-material-glsl.js.map +1 -0
  392. package/dist/modules/lighting/pbr-material/pbr-material-wgsl.cjs +2062 -0
  393. package/dist/modules/lighting/pbr-material/pbr-material-wgsl.d.ts +3 -0
  394. package/dist/modules/lighting/pbr-material/pbr-material-wgsl.d.ts.map +1 -0
  395. package/dist/modules/lighting/pbr-material/pbr-material-wgsl.js +2040 -0
  396. package/dist/modules/lighting/pbr-material/pbr-material-wgsl.js.map +1 -0
  397. package/dist/modules/lighting/pbr-material/pbr-material.cjs +315 -0
  398. package/dist/modules/lighting/pbr-material/pbr-material.d.ts +516 -0
  399. package/dist/modules/lighting/pbr-material/pbr-material.d.ts.map +1 -0
  400. package/dist/modules/lighting/pbr-material/pbr-material.js +292 -0
  401. package/dist/modules/lighting/pbr-material/pbr-material.js.map +1 -0
  402. package/dist/modules/lighting/pbr-material/pbr-projection.cjs +63 -0
  403. package/dist/modules/lighting/pbr-material/pbr-projection.d.ts +10 -0
  404. package/dist/modules/lighting/pbr-material/pbr-projection.d.ts.map +1 -0
  405. package/dist/modules/lighting/pbr-material/pbr-projection.js +37 -0
  406. package/dist/modules/lighting/pbr-material/pbr-projection.js.map +1 -0
  407. package/dist/modules/lighting/pbr-material/pbr-scene.cjs +109 -0
  408. package/dist/modules/lighting/pbr-material/pbr-scene.d.ts +52 -0
  409. package/dist/modules/lighting/pbr-material/pbr-scene.d.ts.map +1 -0
  410. package/dist/modules/lighting/pbr-material/pbr-scene.js +83 -0
  411. package/dist/modules/lighting/pbr-material/pbr-scene.js.map +1 -0
  412. package/dist/modules/lighting/phong-material/phong-material.cjs +61 -0
  413. package/dist/modules/lighting/phong-material/phong-material.d.ts +13 -0
  414. package/dist/modules/lighting/phong-material/phong-material.d.ts.map +1 -0
  415. package/dist/modules/lighting/phong-material/phong-material.js +40 -0
  416. package/dist/modules/lighting/phong-material/phong-material.js.map +1 -0
  417. package/dist/modules/lighting/phong-material/phong-shaders-glsl.cjs +100 -0
  418. package/dist/modules/lighting/phong-material/phong-shaders-glsl.d.ts +3 -0
  419. package/dist/modules/lighting/phong-material/phong-shaders-glsl.d.ts.map +1 -0
  420. package/dist/modules/lighting/phong-material/phong-shaders-glsl.js +72 -0
  421. package/dist/modules/lighting/phong-material/phong-shaders-glsl.js.map +1 -0
  422. package/dist/modules/lighting/phong-material/phong-shaders-wgsl.cjs +153 -0
  423. package/dist/modules/lighting/phong-material/phong-shaders-wgsl.d.ts +2 -0
  424. package/dist/modules/lighting/phong-material/phong-shaders-wgsl.d.ts.map +1 -0
  425. package/dist/modules/lighting/phong-material/phong-shaders-wgsl.js +129 -0
  426. package/dist/modules/lighting/phong-material/phong-shaders-wgsl.js.map +1 -0
  427. package/dist/modules/lighting/surface-weather/surface-weather.cjs +199 -0
  428. package/dist/modules/lighting/surface-weather/surface-weather.d.ts +54 -0
  429. package/dist/modules/lighting/surface-weather/surface-weather.d.ts.map +1 -0
  430. package/dist/modules/lighting/surface-weather/surface-weather.js +175 -0
  431. package/dist/modules/lighting/surface-weather/surface-weather.js.map +1 -0
  432. package/dist/modules/lighting/water-material/river-water-material.cjs +56 -0
  433. package/dist/modules/lighting/water-material/river-water-material.d.ts +21 -0
  434. package/dist/modules/lighting/water-material/river-water-material.d.ts.map +1 -0
  435. package/dist/modules/lighting/water-material/river-water-material.js +36 -0
  436. package/dist/modules/lighting/water-material/river-water-material.js.map +1 -0
  437. package/dist/modules/lighting/water-material/river-water-shaders.cjs +261 -0
  438. package/dist/modules/lighting/water-material/river-water-shaders.d.ts +3 -0
  439. package/dist/modules/lighting/water-material/river-water-shaders.d.ts.map +1 -0
  440. package/dist/modules/lighting/water-material/river-water-shaders.js +233 -0
  441. package/dist/modules/lighting/water-material/river-water-shaders.js.map +1 -0
  442. package/dist/modules/lighting/water-material/water-material.cjs +188 -0
  443. package/dist/modules/lighting/water-material/water-material.d.ts +28 -0
  444. package/dist/modules/lighting/water-material/water-material.d.ts.map +1 -0
  445. package/dist/modules/lighting/water-material/water-material.js +179 -0
  446. package/dist/modules/lighting/water-material/water-material.js.map +1 -0
  447. package/dist/modules/lighting/water-material/water-shaders-glsl.cjs +260 -0
  448. package/dist/modules/lighting/water-material/water-shaders-glsl.d.ts +3 -0
  449. package/dist/modules/lighting/water-material/water-shaders-glsl.d.ts.map +1 -0
  450. package/dist/modules/lighting/water-material/water-shaders-glsl.js +232 -0
  451. package/dist/modules/lighting/water-material/water-shaders-glsl.js.map +1 -0
  452. package/dist/modules/lighting/water-material/water-shaders-wgsl.cjs +254 -0
  453. package/dist/modules/lighting/water-material/water-shaders-wgsl.d.ts +2 -0
  454. package/dist/modules/lighting/water-material/water-shaders-wgsl.d.ts.map +1 -0
  455. package/dist/modules/lighting/water-material/water-shaders-wgsl.js +230 -0
  456. package/dist/modules/lighting/water-material/water-shaders-wgsl.js.map +1 -0
  457. package/dist/modules/math/fp16/fp16-utils.cjs +112 -0
  458. package/dist/modules/math/fp16/fp16-utils.d.ts +13 -0
  459. package/dist/modules/math/fp16/fp16-utils.d.ts.map +1 -0
  460. package/dist/modules/math/fp16/fp16-utils.js +118 -0
  461. package/dist/modules/math/fp16/fp16-utils.js.map +1 -0
  462. package/dist/modules/math/fp32/fp32.cjs +310 -0
  463. package/dist/modules/math/fp32/fp32.d.ts +9 -0
  464. package/dist/modules/math/fp32/fp32.d.ts.map +1 -0
  465. package/dist/modules/math/fp32/fp32.js +288 -0
  466. package/dist/modules/math/fp32/fp32.js.map +1 -0
  467. package/dist/modules/math/fp64/fp64-arithmetic-glsl.cjs +229 -0
  468. package/dist/modules/math/fp64/fp64-arithmetic-glsl.d.ts +2 -0
  469. package/dist/modules/math/fp64/fp64-arithmetic-glsl.d.ts.map +1 -0
  470. package/dist/modules/math/fp64/fp64-arithmetic-glsl.js +205 -0
  471. package/dist/modules/math/fp64/fp64-arithmetic-glsl.js.map +1 -0
  472. package/dist/modules/math/fp64/fp64-arithmetic-wgsl-hybrid.cjs +144 -0
  473. package/dist/modules/math/fp64/fp64-arithmetic-wgsl-hybrid.d.ts +10 -0
  474. package/dist/modules/math/fp64/fp64-arithmetic-wgsl-hybrid.d.ts.map +1 -0
  475. package/dist/modules/math/fp64/fp64-arithmetic-wgsl-hybrid.js +128 -0
  476. package/dist/modules/math/fp64/fp64-arithmetic-wgsl-hybrid.js.map +1 -0
  477. package/dist/modules/math/fp64/fp64-arithmetic-wgsl-integer.cjs +583 -0
  478. package/dist/modules/math/fp64/fp64-arithmetic-wgsl-integer.d.ts +11 -0
  479. package/dist/modules/math/fp64/fp64-arithmetic-wgsl-integer.d.ts.map +1 -0
  480. package/dist/modules/math/fp64/fp64-arithmetic-wgsl-integer.js +563 -0
  481. package/dist/modules/math/fp64/fp64-arithmetic-wgsl-integer.js.map +1 -0
  482. package/dist/modules/math/fp64/fp64-arithmetic-wgsl.cjs +946 -0
  483. package/dist/modules/math/fp64/fp64-arithmetic-wgsl.d.ts +3 -0
  484. package/dist/modules/math/fp64/fp64-arithmetic-wgsl.d.ts.map +1 -0
  485. package/dist/modules/math/fp64/fp64-arithmetic-wgsl.js +923 -0
  486. package/dist/modules/math/fp64/fp64-arithmetic-wgsl.js.map +1 -0
  487. package/dist/modules/math/fp64/fp64-functions-glsl.cjs +699 -0
  488. package/dist/modules/math/fp64/fp64-functions-glsl.d.ts +2 -0
  489. package/dist/modules/math/fp64/fp64-functions-glsl.d.ts.map +1 -0
  490. package/dist/modules/math/fp64/fp64-functions-glsl.js +675 -0
  491. package/dist/modules/math/fp64/fp64-functions-glsl.js.map +1 -0
  492. package/dist/modules/math/fp64/fp64-functions-wgsl.cjs +180 -0
  493. package/dist/modules/math/fp64/fp64-functions-wgsl.d.ts +3 -0
  494. package/dist/modules/math/fp64/fp64-functions-wgsl.d.ts.map +1 -0
  495. package/dist/modules/math/fp64/fp64-functions-wgsl.js +157 -0
  496. package/dist/modules/math/fp64/fp64-functions-wgsl.js.map +1 -0
  497. package/dist/modules/math/fp64/fp64-utils.cjs +50 -0
  498. package/dist/modules/math/fp64/fp64-utils.d.ts +22 -0
  499. package/dist/modules/math/fp64/fp64-utils.d.ts.map +1 -0
  500. package/dist/modules/math/fp64/fp64-utils.js +42 -0
  501. package/dist/modules/math/fp64/fp64-utils.js.map +1 -0
  502. package/dist/modules/math/fp64/fp64.cjs +68 -0
  503. package/dist/modules/math/fp64/fp64.d.ts +24 -0
  504. package/dist/modules/math/fp64/fp64.d.ts.map +1 -0
  505. package/dist/modules/math/fp64/fp64.js +46 -0
  506. package/dist/modules/math/fp64/fp64.js.map +1 -0
  507. package/dist/modules/math/random/random.cjs +46 -0
  508. package/dist/modules/math/random/random.d.ts +7 -0
  509. package/dist/modules/math/random/random.d.ts.map +1 -0
  510. package/dist/modules/math/random/random.js +21 -0
  511. package/dist/modules/math/random/random.js.map +1 -0
  512. package/dist/modules/math/value-noise/value-noise.cjs +95 -0
  513. package/dist/modules/math/value-noise/value-noise.d.ts +7 -0
  514. package/dist/modules/math/value-noise/value-noise.d.ts.map +1 -0
  515. package/dist/modules/math/value-noise/value-noise.js +68 -0
  516. package/dist/modules/math/value-noise/value-noise.js.map +1 -0
  517. package/dist/modules/volume/volume-raymarch.cjs +107 -0
  518. package/dist/modules/volume/volume-raymarch.d.ts +6 -0
  519. package/dist/modules/volume/volume-raymarch.d.ts.map +1 -0
  520. package/dist/modules/volume/volume-raymarch.js +84 -0
  521. package/dist/modules/volume/volume-raymarch.js.map +1 -0
  522. package/dist/types/align-to.cjs +38 -0
  523. package/dist/types/align-to.d.ts +3 -0
  524. package/dist/types/align-to.d.ts.map +1 -0
  525. package/dist/types/align-to.js +13 -0
  526. package/dist/types/align-to.js.map +1 -0
  527. package/dist/types/primitive-data-types.cjs +15 -0
  528. package/dist/types/primitive-data-types.d.ts +7 -0
  529. package/dist/types/primitive-data-types.d.ts.map +1 -0
  530. package/dist/types/primitive-data-types.js +5 -0
  531. package/dist/types/primitive-data-types.js.map +1 -0
  532. package/dist/types/sampler-props.cjs +15 -0
  533. package/dist/types/sampler-props.d.ts +26 -0
  534. package/dist/types/sampler-props.d.ts.map +1 -0
  535. package/dist/types/sampler-props.js +5 -0
  536. package/dist/types/sampler-props.js.map +1 -0
  537. package/dist/types/shader-block-layout.cjs +184 -0
  538. package/dist/types/shader-block-layout.d.ts +72 -0
  539. package/dist/types/shader-block-layout.d.ts.map +1 -0
  540. package/dist/types/shader-block-layout.js +209 -0
  541. package/dist/types/shader-block-layout.js.map +1 -0
  542. package/dist/types/shader-layout.cjs +15 -0
  543. package/dist/types/shader-layout.d.ts +178 -0
  544. package/dist/types/shader-layout.d.ts.map +1 -0
  545. package/dist/types/shader-layout.js +5 -0
  546. package/dist/types/shader-layout.js.map +1 -0
  547. package/dist/types/shader-type-decoder.cjs +240 -0
  548. package/dist/types/shader-type-decoder.d.ts +41 -0
  549. package/dist/types/shader-type-decoder.d.ts.map +1 -0
  550. package/dist/types/shader-type-decoder.js +210 -0
  551. package/dist/types/shader-type-decoder.js.map +1 -0
  552. package/dist/types/shader-types.cjs +15 -0
  553. package/dist/types/shader-types.d.ts +101 -0
  554. package/dist/types/shader-types.d.ts.map +1 -0
  555. package/dist/types/shader-types.js +30 -0
  556. package/dist/types/shader-types.js.map +1 -0
  557. package/dist/types/texture-formats.cjs +15 -0
  558. package/dist/types/texture-formats.d.ts +24 -0
  559. package/dist/types/texture-formats.d.ts.map +1 -0
  560. package/dist/types/texture-formats.js +5 -0
  561. package/dist/types/texture-formats.js.map +1 -0
  562. package/dist/types.cjs +42 -0
  563. package/dist/types.cjs.map +6 -0
  564. package/dist/types.d.ts +14 -0
  565. package/dist/types.d.ts.map +1 -0
  566. package/dist/types.js +12 -0
  567. package/dist/types.js.map +1 -0
  568. package/dist/wgsl.cjs +39 -0
  569. package/dist/wgsl.cjs.map +6 -0
  570. package/dist/wgsl.d.ts +8 -0
  571. package/dist/wgsl.d.ts.map +1 -0
  572. package/dist/wgsl.js +9 -0
  573. package/dist/wgsl.js.map +1 -0
  574. package/package.json +65 -4
  575. package/src/glsl.ts +13 -0
  576. package/src/index.ts +259 -0
  577. package/src/lib/color/normalize-byte-colors.ts +57 -0
  578. package/src/lib/filters/prop-types.ts +150 -0
  579. package/src/lib/glsl-shader-assembler.ts +39 -0
  580. package/src/lib/glsl-utils/get-shader-info.ts +42 -0
  581. package/src/lib/glsl-utils/shader-utils.ts +110 -0
  582. package/src/lib/preprocessor/preprocessor.ts +132 -0
  583. package/src/lib/shader-assembler-base.ts +170 -0
  584. package/src/lib/shader-assembler.ts +7 -0
  585. package/src/lib/shader-assembly/assemble-glsl-shaders.ts +305 -0
  586. package/src/lib/shader-assembly/assemble-shaders.ts +13 -0
  587. package/src/lib/shader-assembly/assemble-wgsl-shaders.ts +801 -0
  588. package/src/lib/shader-assembly/platform-defines.ts +58 -0
  589. package/src/lib/shader-assembly/platform-info.ts +23 -0
  590. package/src/lib/shader-assembly/shader-assembly-shared.ts +95 -0
  591. package/src/lib/shader-assembly/shader-assembly-types.ts +142 -0
  592. package/src/lib/shader-assembly/shader-hooks.ts +141 -0
  593. package/src/lib/shader-assembly/shader-injections.ts +250 -0
  594. package/src/lib/shader-assembly/shader-plugin-varyings.ts +524 -0
  595. package/src/lib/shader-assembly/shader-plugin-vertex-inputs.ts +279 -0
  596. package/src/lib/shader-assembly/wgsl-binding-debug.ts +227 -0
  597. package/src/lib/shader-assembly/wgsl-binding-scan.ts +228 -0
  598. package/src/lib/shader-assembly/wgsl-interface-scan.ts +676 -0
  599. package/src/lib/shader-generator/generate-shader.ts +27 -0
  600. package/src/lib/shader-generator/glsl/generate-glsl.ts +101 -0
  601. package/src/lib/shader-generator/utils/capitalize.ts +12 -0
  602. package/src/lib/shader-generator/wgsl/generate-wgsl.ts +40 -0
  603. package/src/lib/shader-module/composite-shader-pass.ts +47 -0
  604. package/src/lib/shader-module/shader-module-dependencies.ts +128 -0
  605. package/src/lib/shader-module/shader-module-uniform-layout.ts +420 -0
  606. package/src/lib/shader-module/shader-module.ts +244 -0
  607. package/src/lib/shader-module/shader-pass.ts +69 -0
  608. package/src/lib/shader-plugin.ts +214 -0
  609. package/src/lib/shader-transpiler/shader-transpiler.ts +34 -0
  610. package/src/lib/shader-transpiler/transpile-glsl-shader.ts +78 -0
  611. package/src/lib/utils/assert.ts +13 -0
  612. package/src/lib/utils/uniform-types.ts +89 -0
  613. package/src/lib/wgsl-shader-assembler.ts +122 -0
  614. package/src/module-injectors.ts +32 -0
  615. package/src/modules/color/float-colors.ts +334 -0
  616. package/src/modules/engine/clip/clip.ts +149 -0
  617. package/src/modules/engine/filter/filter.ts +107 -0
  618. package/src/modules/engine/geometry/geometry.ts +45 -0
  619. package/src/modules/engine/gpu-animation/gpu-animation.ts +244 -0
  620. package/src/modules/engine/picking/README.md +88 -0
  621. package/src/modules/engine/picking/picking.ts +252 -0
  622. package/src/modules/engine/project/project.ts +166 -0
  623. package/src/modules/engine/skin/skin.ts +233 -0
  624. package/src/modules/engine/transform/transform.ts +50 -0
  625. package/src/modules/geometry/path-dash/path-dash.ts +68 -0
  626. package/src/modules/geometry/pattern-fill/pattern-fill-shaders.ts +88 -0
  627. package/src/modules/geometry/pattern-fill/pattern-fill.ts +54 -0
  628. package/src/modules/geometry/point-glow/point-glow.ts +87 -0
  629. package/src/modules/geometry/precipitation/README.md +19 -0
  630. package/src/modules/geometry/precipitation/precipitation.ts +108 -0
  631. package/src/modules/geometry/sketch-stroke/sketch-stroke.ts +160 -0
  632. package/src/modules/geospatial/dggs/dggs-wgsl.ts +2284 -0
  633. package/src/modules/geospatial/dggs/dggs.ts +12 -0
  634. package/src/modules/lighting/area-lighting/area-light-types.ts +71 -0
  635. package/src/modules/lighting/area-lighting/area-lighting-shaders.ts +72 -0
  636. package/src/modules/lighting/area-lighting/area-lighting.ts +63 -0
  637. package/src/modules/lighting/area-lighting/ltc-shaders.ts +163 -0
  638. package/src/modules/lighting/atmosphere/README.md +25 -0
  639. package/src/modules/lighting/atmosphere/atmosphere.ts +246 -0
  640. package/src/modules/lighting/clouds/README.md +24 -0
  641. package/src/modules/lighting/clouds/clouds.ts +216 -0
  642. package/src/modules/lighting/firefly/firefly.ts +64 -0
  643. package/src/modules/lighting/globe-clouds/globe-clouds.ts +124 -0
  644. package/src/modules/lighting/gouraud-material/gouraud-material.ts +55 -0
  645. package/src/modules/lighting/height-fog/README.md +36 -0
  646. package/src/modules/lighting/height-fog/height-fog-functions.ts +116 -0
  647. package/src/modules/lighting/height-fog/height-fog.ts +96 -0
  648. package/src/modules/lighting/ibl/ibl.ts +43 -0
  649. package/src/modules/lighting/lambert-material/lambert-material.ts +42 -0
  650. package/src/modules/lighting/lambert-material/lambert-shaders-glsl.ts +61 -0
  651. package/src/modules/lighting/lambert-material/lambert-shaders-wgsl.ts +73 -0
  652. package/src/modules/lighting/lights/lighting-glsl.ts +92 -0
  653. package/src/modules/lighting/lights/lighting-wgsl.ts +91 -0
  654. package/src/modules/lighting/lights/lighting.ts +385 -0
  655. package/src/modules/lighting/no-material/dirlight.ts +101 -0
  656. package/src/modules/lighting/pbr-material/pbr-material-glsl.ts +1748 -0
  657. package/src/modules/lighting/pbr-material/pbr-material-wgsl.ts +2043 -0
  658. package/src/modules/lighting/pbr-material/pbr-material.ts +517 -0
  659. package/src/modules/lighting/pbr-material/pbr-projection.ts +50 -0
  660. package/src/modules/lighting/pbr-material/pbr-scene.ts +112 -0
  661. package/src/modules/lighting/phong-material/phong-material.ts +53 -0
  662. package/src/modules/lighting/phong-material/phong-shaders-glsl.ts +73 -0
  663. package/src/modules/lighting/phong-material/phong-shaders-wgsl.ts +129 -0
  664. package/src/modules/lighting/surface-weather/README.md +28 -0
  665. package/src/modules/lighting/surface-weather/surface-weather.ts +198 -0
  666. package/src/modules/lighting/water-material/river-water-material.ts +58 -0
  667. package/src/modules/lighting/water-material/river-water-shaders.ts +234 -0
  668. package/src/modules/lighting/water-material/water-material.ts +234 -0
  669. package/src/modules/lighting/water-material/water-shaders-glsl.ts +233 -0
  670. package/src/modules/lighting/water-material/water-shaders-wgsl.ts +230 -0
  671. package/src/modules/math/fp16/fp16-utils.ts +156 -0
  672. package/src/modules/math/fp32/fp32.ts +291 -0
  673. package/src/modules/math/fp64/fp64-arithmetic-glsl.ts +205 -0
  674. package/src/modules/math/fp64/fp64-arithmetic-wgsl-hybrid.ts +129 -0
  675. package/src/modules/math/fp64/fp64-arithmetic-wgsl-integer.ts +564 -0
  676. package/src/modules/math/fp64/fp64-arithmetic-wgsl.ts +924 -0
  677. package/src/modules/math/fp64/fp64-functions-glsl.ts +675 -0
  678. package/src/modules/math/fp64/fp64-functions-wgsl.ts +157 -0
  679. package/src/modules/math/fp64/fp64-utils.ts +46 -0
  680. package/src/modules/math/fp64/fp64.ts +64 -0
  681. package/src/modules/math/random/random.ts +25 -0
  682. package/src/modules/math/value-noise/value-noise.ts +70 -0
  683. package/src/modules/volume/volume-raymarch.ts +87 -0
  684. package/src/types/align-to.ts +13 -0
  685. package/src/types/primitive-data-types.ts +10 -0
  686. package/src/types/sampler-props.ts +39 -0
  687. package/src/types/shader-block-layout.ts +340 -0
  688. package/src/types/shader-layout.ts +208 -0
  689. package/src/types/shader-type-decoder.ts +285 -0
  690. package/src/types/shader-types.ts +207 -0
  691. package/src/types/texture-formats.ts +155 -0
  692. package/src/types.ts +48 -0
  693. package/src/wgsl.ts +23 -0
@@ -0,0 +1,2304 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+ var dggs_wgsl_exports = {};
19
+ __export(dggs_wgsl_exports, {
20
+ dggsWGSL: () => dggsWGSL
21
+ });
22
+ module.exports = __toCommonJS(dggs_wgsl_exports);
23
+ const dggsWGSL = (
24
+ /* wgsl */
25
+ `const DGGS_H3_CELL_MODE: u32 = 1u;
26
+ const DGGS_H3_MAX_RESOLUTION: u32 = 15u;
27
+ const DGGS_H3_MAX_BASE_CELL: u32 = 121u;
28
+ const DGGS_H3_UNUSED_DIGIT: u32 = 7u;
29
+ const DGGS_H3_RES0_U_GNOMONIC: f32 = 0.381966011250105;
30
+ const DGGS_H3_RSQRT7: f32 = 0.3779644730092272;
31
+ const DGGS_H3_ONETHIRD: f32 = 0.3333333333333333;
32
+ const DGGS_H3_AP7_ROT_RADS: f32 = 0.3334731722518321;
33
+ const DGGS_H3_SQRT3_2: f32 = 0.8660254037844386;
34
+ const DGGS_S2_MAX_LEVEL: u32 = 30u;
35
+ const DGGS_GEOHASH_MAX_LENGTH: u32 = 12u;
36
+ const DGGS_GEOHASH_LENGTH_BIT_OFFSET: u32 = 60u;
37
+ const DGGS_QUADKEY_MAX_LENGTH: u32 = 29u;
38
+ const DGGS_QUADKEY_LENGTH_BIT_OFFSET: u32 = 58u;
39
+ const DGGS_A5_FIRST_HILBERT_RESOLUTION: u32 = 2u;
40
+ const DGGS_A5_MAX_RESOLUTION: u32 = 30u;
41
+ const DGGS_A5_HILBERT_START_BIT: u32 = 58u;
42
+ const DGGS_PI: f32 = 3.141592653589793;
43
+ const DGGS_TWO_PI: f32 = 6.283185307179586;
44
+ const DGGS_TWO_PI_OVER_5: f32 = 1.2566370614359172;
45
+ const DGGS_PI_OVER_5: f32 = 0.6283185307179586;
46
+ const DGGS_PI_OVER_2: f32 = 1.5707963267948966;
47
+ const DGGS_A5_DISTANCE_TO_EDGE: f32 = 0.6180339887498949;
48
+ const DGGS_A5_REFLECTED_TRIANGLE_SCALE: f32 = 3.23606797749979;
49
+ const DGGS_A5_LONGITUDE_OFFSET: f32 = 93.0;
50
+ const DGGS_RADIANS_TO_DEGREES: f32 = 57.29577951308232;
51
+ const DGGS_DEGREES_TO_RADIANS: f32 = 0.017453292519943295;
52
+ const DGGS_U64_HIGH_WORD_FLOAT_SCALE: f32 = 4294967296.0;
53
+
54
+ // DGGS 64-bit helper functions use canonical word order vec2u(high, low).
55
+ // Arrow BigInt64/BigUint64 buffers are read as little-endian vec2u(low, high),
56
+ // so storage-buffer reads should pass through dggs_u64_from_little_endian_words().
57
+ fn dggs_u64_make(high: u32, low: u32) -> vec2u {
58
+ return vec2u(high, low);
59
+ }
60
+
61
+ fn dggs_u64_from_little_endian_words(words: vec2u) -> vec2u {
62
+ return words.yx;
63
+ }
64
+
65
+ fn dggs_u64_to_little_endian_words(value: vec2u) -> vec2u {
66
+ return value.yx;
67
+ }
68
+
69
+ fn dggs_u64_high(value: vec2u) -> u32 {
70
+ return value.x;
71
+ }
72
+
73
+ fn dggs_u64_low(value: vec2u) -> u32 {
74
+ return value.y;
75
+ }
76
+
77
+ fn dggs_u64_is_zero(value: vec2u) -> bool {
78
+ return value.x == 0u && value.y == 0u;
79
+ }
80
+
81
+ fn dggs_u64_equal(a: vec2u, b: vec2u) -> bool {
82
+ return a.x == b.x && a.y == b.y;
83
+ }
84
+
85
+ fn dggs_u64_compare(a: vec2u, b: vec2u) -> i32 {
86
+ if (a.x != b.x) {
87
+ return select(-1, 1, a.x > b.x);
88
+ }
89
+ if (a.y != b.y) {
90
+ return select(-1, 1, a.y > b.y);
91
+ }
92
+ return 0;
93
+ }
94
+
95
+ fn dggs_u64_less(a: vec2u, b: vec2u) -> bool {
96
+ return dggs_u64_compare(a, b) < 0;
97
+ }
98
+
99
+ fn dggs_u64_add(a: vec2u, b: vec2u) -> vec2u {
100
+ let low = a.y + b.y;
101
+ let carry = select(0u, 1u, low < a.y);
102
+ return vec2u(a.x + b.x + carry, low);
103
+ }
104
+
105
+ fn dggs_u64_subtract(a: vec2u, b: vec2u) -> vec2u {
106
+ let borrow = select(0u, 1u, a.y < b.y);
107
+ return vec2u(a.x - b.x - borrow, a.y - b.y);
108
+ }
109
+
110
+ fn dggs_u64_to_f32(value: vec2u) -> f32 {
111
+ return f32(value.x) * DGGS_U64_HIGH_WORD_FLOAT_SCALE + f32(value.y);
112
+ }
113
+
114
+ fn dggs_i64_from_little_endian_words(words: vec2u) -> vec2u {
115
+ return dggs_u64_from_little_endian_words(words);
116
+ }
117
+
118
+ fn dggs_i64_to_little_endian_words(value: vec2u) -> vec2u {
119
+ return dggs_u64_to_little_endian_words(value);
120
+ }
121
+
122
+ fn dggs_i64_is_negative(value: vec2u) -> bool {
123
+ return (value.x & 0x80000000u) != 0u;
124
+ }
125
+
126
+ fn dggs_i64_negate(value: vec2u) -> vec2u {
127
+ return dggs_u64_add(vec2u(~value.x, ~value.y), vec2u(0u, 1u));
128
+ }
129
+
130
+ fn dggs_i64_compare(a: vec2u, b: vec2u) -> i32 {
131
+ let highA = bitcast<i32>(a.x);
132
+ let highB = bitcast<i32>(b.x);
133
+ if (highA != highB) {
134
+ return select(-1, 1, highA > highB);
135
+ }
136
+ if (a.y != b.y) {
137
+ return select(-1, 1, a.y > b.y);
138
+ }
139
+ return 0;
140
+ }
141
+
142
+ fn dggs_i64_less(a: vec2u, b: vec2u) -> bool {
143
+ return dggs_i64_compare(a, b) < 0;
144
+ }
145
+
146
+ fn dggs_i64_subtract(a: vec2u, b: vec2u) -> vec2u {
147
+ return dggs_u64_subtract(a, b);
148
+ }
149
+
150
+ fn dggs_i64_to_f32(value: vec2u) -> f32 {
151
+ if (dggs_i64_is_negative(value)) {
152
+ return -dggs_u64_to_f32(dggs_i64_negate(value));
153
+ }
154
+ return dggs_u64_to_f32(value);
155
+ }
156
+
157
+ fn dggs_u32_mask_low(bitCount: u32) -> u32 {
158
+ if (bitCount == 0u) {
159
+ return 0u;
160
+ }
161
+ if (bitCount >= 32u) {
162
+ return 0xffffffffu;
163
+ }
164
+ return (1u << bitCount) - 1u;
165
+ }
166
+
167
+ fn dggs_u64_shift_left(value: vec2u, shift: u32) -> vec2u {
168
+ if (shift == 0u) {
169
+ return value;
170
+ }
171
+ if (shift < 32u) {
172
+ return vec2u((value.x << shift) | (value.y >> (32u - shift)), value.y << shift);
173
+ }
174
+ if (shift == 32u) {
175
+ return vec2u(value.y, 0u);
176
+ }
177
+ if (shift < 64u) {
178
+ return vec2u(value.y << (shift - 32u), 0u);
179
+ }
180
+ return vec2u(0u);
181
+ }
182
+
183
+ fn dggs_u64_shift_right(value: vec2u, shift: u32) -> vec2u {
184
+ if (shift == 0u) {
185
+ return value;
186
+ }
187
+ if (shift < 32u) {
188
+ return vec2u(value.x >> shift, (value.y >> shift) | (value.x << (32u - shift)));
189
+ }
190
+ if (shift == 32u) {
191
+ return vec2u(0u, value.x);
192
+ }
193
+ if (shift < 64u) {
194
+ return vec2u(0u, value.x >> (shift - 32u));
195
+ }
196
+ return vec2u(0u);
197
+ }
198
+
199
+ fn dggs_u64_extract_bits(value: vec2u, bitOffset: u32, bitCount: u32) -> u32 {
200
+ if (bitCount == 0u || bitOffset >= 64u) {
201
+ return 0u;
202
+ }
203
+ let shifted = dggs_u64_shift_right(value, bitOffset);
204
+ return shifted.y & dggs_u32_mask_low(bitCount);
205
+ }
206
+
207
+ fn dggs_u64_set_bits(value: vec2u, bitOffset: u32, bitCount: u32, bits: u32) -> vec2u {
208
+ if (bitCount == 0u || bitOffset >= 64u) {
209
+ return value;
210
+ }
211
+ let bitMask = dggs_u32_mask_low(bitCount);
212
+ let fieldMask = dggs_u64_shift_left(vec2u(0u, bitMask), bitOffset);
213
+ let fieldBits = dggs_u64_shift_left(vec2u(0u, bits & bitMask), bitOffset);
214
+ return (value & vec2u(~fieldMask.x, ~fieldMask.y)) | fieldBits;
215
+ }
216
+
217
+ fn dggs_u64_count_trailing_zeros(value: vec2u) -> u32 {
218
+ if (value.y != 0u) {
219
+ return countTrailingZeros(value.y);
220
+ }
221
+ if (value.x != 0u) {
222
+ return 32u + countTrailingZeros(value.x);
223
+ }
224
+ return 64u;
225
+ }
226
+
227
+ struct DggsA5Cell {
228
+ origin : u32,
229
+ segment : u32,
230
+ resolution : u32,
231
+ valid : u32,
232
+ quintantShift : u32,
233
+ hilbertResolution : u32,
234
+ };
235
+
236
+ struct DggsA5Anchor {
237
+ q : u32,
238
+ offset : vec2i,
239
+ flips : vec2i,
240
+ orientation : u32,
241
+ quintant : u32,
242
+ };
243
+
244
+ struct DggsA5FaceTriangle {
245
+ a : vec2f,
246
+ b : vec2f,
247
+ c : vec2f,
248
+ };
249
+
250
+ struct DggsA5SphericalTriangle {
251
+ a : vec3f,
252
+ b : vec3f,
253
+ c : vec3f,
254
+ };
255
+
256
+ struct DggsH3FaceIJK {
257
+ face : u32,
258
+ coord : vec3i,
259
+ valid : u32,
260
+ };
261
+
262
+ struct DggsH3FaceIJKOverage {
263
+ faceIJK : DggsH3FaceIJK,
264
+ overage : u32,
265
+ };
266
+
267
+ struct DggsH3BoundaryVertex {
268
+ face : u32,
269
+ coord : vec3i,
270
+ resolution : u32,
271
+ valid : u32,
272
+ };
273
+
274
+ fn dggs_boundary_point_to_fp64_split(point : vec2f) -> vec4f {
275
+ return vec4f(point.x, point.y, 0.0, 0.0);
276
+ }
277
+
278
+ fn dggs_a5_positive_mod_i32(value : i32, modulus : i32) -> i32 {
279
+ return ((value % modulus) + modulus) % modulus;
280
+ }
281
+
282
+ fn dggs_a5_has_bit(index : vec2u, bitOffset : u32) -> bool {
283
+ return dggs_u64_extract_bits(index, bitOffset, 1u) != 0u;
284
+ }
285
+
286
+ fn dggs_a5_get_resolution(index : vec2u) -> u32 {
287
+ if (dggs_u64_is_zero(index)) {
288
+ return 0u;
289
+ }
290
+ if (
291
+ dggs_a5_has_bit(index, 0u) ||
292
+ dggs_u64_extract_bits(index, 0u, 3u) == 4u ||
293
+ dggs_u64_extract_bits(index, 0u, 5u) == 16u
294
+ ) {
295
+ return DGGS_A5_MAX_RESOLUTION;
296
+ }
297
+
298
+ var resolution = DGGS_A5_MAX_RESOLUTION - 1u;
299
+ var shifted = dggs_u64_shift_right(index, 1u);
300
+ if (dggs_u64_is_zero(shifted)) {
301
+ return 0u;
302
+ }
303
+
304
+ var remaining = shifted.y;
305
+ if (remaining == 0u) {
306
+ shifted = dggs_u64_shift_right(shifted, 32u);
307
+ resolution -= 16u;
308
+ remaining = shifted.y;
309
+ }
310
+ if ((remaining & 0xffffu) == 0u) {
311
+ remaining >>= 16u;
312
+ resolution -= 8u;
313
+ }
314
+ if (resolution >= 6u && (remaining & 0xffu) == 0u) {
315
+ remaining >>= 8u;
316
+ resolution -= 4u;
317
+ }
318
+ if (resolution >= 4u && (remaining & 0xfu) == 0u) {
319
+ remaining >>= 4u;
320
+ resolution -= 2u;
321
+ }
322
+ loop {
323
+ if ((remaining & 1u) != 0u) {
324
+ break;
325
+ }
326
+ if (resolution == 0u) {
327
+ break;
328
+ }
329
+ resolution -= 1u;
330
+ remaining >>= select(2u, 1u, resolution < DGGS_A5_FIRST_HILBERT_RESOLUTION);
331
+ }
332
+ return resolution;
333
+ }
334
+
335
+ fn dggs_a5_get_origin_first_quintant(origin : u32) -> u32 {
336
+ let values = array<u32, 12>(
337
+ 4u, 2u, 3u, 0u, 2u, 4u, 2u, 2u, 3u, 0u, 3u, 0u
338
+ );
339
+ return values[min(origin, 11u)];
340
+ }
341
+
342
+ fn dggs_a5_get_origin_step(origin : u32) -> i32 {
343
+ let values = array<i32, 12>(
344
+ -1, 1, 1, 1, -1, 1, -1, -1, 1, 1, 1, -1
345
+ );
346
+ return values[min(origin, 11u)];
347
+ }
348
+
349
+ fn dggs_a5_get_origin_orientation(origin : u32, faceRelativeQuintant : u32) -> u32 {
350
+ // Orientation codes: uv=0, vu=1, uw=2, wu=3, vw=4, wv=5.
351
+ let values = array<u32, 60>(
352
+ 1u, 2u, 4u, 4u, 4u,
353
+ 1u, 0u, 5u, 3u, 2u,
354
+ 3u, 0u, 5u, 3u, 2u,
355
+ 3u, 0u, 5u, 3u, 2u,
356
+ 3u, 2u, 4u, 1u, 2u,
357
+ 1u, 0u, 5u, 3u, 2u,
358
+ 3u, 2u, 4u, 1u, 2u,
359
+ 3u, 2u, 4u, 1u, 2u,
360
+ 3u, 0u, 5u, 3u, 2u,
361
+ 1u, 0u, 5u, 3u, 2u,
362
+ 1u, 0u, 5u, 3u, 2u,
363
+ 3u, 2u, 4u, 1u, 2u
364
+ );
365
+ return values[min(origin, 11u) * 5u + min(faceRelativeQuintant, 4u)];
366
+ }
367
+
368
+ fn dggs_a5_get_origin_angle(origin : u32) -> f32 {
369
+ if (origin == 0u || origin == 9u) {
370
+ return 0.0;
371
+ }
372
+ return DGGS_PI_OVER_5;
373
+ }
374
+
375
+ fn dggs_a5_get_origin_quaternion(origin : u32) -> vec4f {
376
+ let values = array<vec4f, 12>(
377
+ vec4f(0.0, 0.0, 0.0, 1.0),
378
+ vec4f(0.0, 0.525731112119, 0.0, 0.850650808352),
379
+ vec4f(-0.5, 0.688190960236, 0.0, 0.525731112119),
380
+ vec4f(-0.809016994375, -0.262865556060, 0.0, 0.525731112119),
381
+ vec4f(-0.5, 0.162459848116, 0.0, 0.850650808352),
382
+ vec4f(-0.309016994375, -0.425325404176, 0.0, 0.850650808352),
383
+ vec4f(0.309016994375, -0.425325404176, 0.0, 0.850650808352),
384
+ vec4f(0.809016994375, -0.262865556060, 0.0, 0.525731112119),
385
+ vec4f(0.0, -0.850650808352, 0.0, 0.525731112119),
386
+ vec4f(0.0, -1.0, 0.0, 0.0),
387
+ vec4f(0.5, 0.688190960236, 0.0, 0.525731112119),
388
+ vec4f(0.5, 0.162459848116, 0.0, 0.850650808352)
389
+ );
390
+ return values[min(origin, 11u)];
391
+ }
392
+
393
+ fn dggs_a5_quaternion_rotate(point : vec3f, quaternion : vec4f) -> vec3f {
394
+ let q = quaternion.xyz;
395
+ let t = 2.0 * cross(q, point);
396
+ return point + quaternion.w * t + cross(q, t);
397
+ }
398
+
399
+ fn dggs_a5_deserialize(index : vec2u) -> DggsA5Cell {
400
+ if (dggs_u64_is_zero(index)) {
401
+ return DggsA5Cell(0u, 0u, 0u, 0u, DGGS_A5_HILBERT_START_BIT, 0u);
402
+ }
403
+
404
+ let resolution = dggs_a5_get_resolution(index);
405
+ var quintantShift = DGGS_A5_HILBERT_START_BIT;
406
+ var quintantOffset = 0u;
407
+ if (resolution == DGGS_A5_MAX_RESOLUTION) {
408
+ var markerBits = 5u;
409
+ if (dggs_a5_has_bit(index, 0u)) {
410
+ markerBits = 1u;
411
+ } else if (dggs_a5_has_bit(index, 2u)) {
412
+ markerBits = 3u;
413
+ }
414
+ quintantShift = DGGS_A5_HILBERT_START_BIT + markerBits;
415
+ quintantOffset = select(select(40u, 32u, markerBits == 3u), 0u, markerBits == 1u);
416
+ }
417
+
418
+ let topBits = dggs_u64_shift_right(index, quintantShift).y + quintantOffset;
419
+ if (resolution == 0u) {
420
+ if (topBits >= 12u) {
421
+ return DggsA5Cell(0u, 0u, resolution, 0u, quintantShift, 0u);
422
+ }
423
+ return DggsA5Cell(topBits, 0u, resolution, 1u, quintantShift, 0u);
424
+ }
425
+
426
+ let origin = topBits / 5u;
427
+ if (origin >= 12u) {
428
+ return DggsA5Cell(0u, 0u, resolution, 0u, quintantShift, 0u);
429
+ }
430
+ let segment = (topBits + dggs_a5_get_origin_first_quintant(origin)) % 5u;
431
+ let hilbertResolution = select(0u, resolution - 1u, resolution >= 2u);
432
+ return DggsA5Cell(origin, segment, resolution, 1u, quintantShift, hilbertResolution);
433
+ }
434
+
435
+ fn dggs_a5_segment_to_anchor_info(cell : DggsA5Cell) -> DggsA5Anchor {
436
+ let firstQuintant = dggs_a5_get_origin_first_quintant(cell.origin);
437
+ let faceRelativeQuintant = (cell.segment + 5u - firstQuintant) % 5u;
438
+ let orientation = dggs_a5_get_origin_orientation(cell.origin, faceRelativeQuintant);
439
+ let step = dggs_a5_get_origin_step(cell.origin);
440
+ let quintant = u32(dggs_a5_positive_mod_i32(
441
+ i32(firstQuintant) + step * i32(faceRelativeQuintant),
442
+ 5
443
+ ));
444
+ return DggsA5Anchor(0u, vec2i(0), vec2i(1), orientation, quintant);
445
+ }
446
+
447
+ fn dggs_a5_is_reverse_orientation(orientation : u32) -> bool {
448
+ return orientation == 1u || orientation == 3u || orientation == 4u;
449
+ }
450
+
451
+ fn dggs_a5_is_invert_j_orientation(orientation : u32) -> bool {
452
+ return orientation == 5u || orientation == 4u;
453
+ }
454
+
455
+ fn dggs_a5_is_flip_ij_orientation(orientation : u32) -> bool {
456
+ return orientation == 3u || orientation == 2u;
457
+ }
458
+
459
+ fn dggs_a5_pattern_value(index : u32, flipIj : bool) -> u32 {
460
+ let pattern = array<u32, 8>(0u, 1u, 3u, 4u, 5u, 6u, 7u, 2u);
461
+ let flippedPattern = array<u32, 8>(0u, 1u, 2u, 7u, 3u, 4u, 5u, 6u);
462
+ return select(pattern[min(index, 7u)], flippedPattern[min(index, 7u)], flipIj);
463
+ }
464
+
465
+ fn dggs_a5_quaternary_to_flips(digit : u32) -> vec2i {
466
+ if (digit == 1u) {
467
+ return vec2i(1, -1);
468
+ }
469
+ if (digit == 3u) {
470
+ return vec2i(-1, 1);
471
+ }
472
+ return vec2i(1, 1);
473
+ }
474
+
475
+ fn dggs_a5_quaternary_to_kj(digit : u32, flips : vec2i) -> vec2i {
476
+ var p = vec2i(0);
477
+ var q = vec2i(0);
478
+ if (flips.x == 1 && flips.y == 1) {
479
+ p = vec2i(1, 0);
480
+ q = vec2i(0, 1);
481
+ } else if (flips.x == -1 && flips.y == 1) {
482
+ p = vec2i(0, -1);
483
+ q = vec2i(-1, 0);
484
+ } else if (flips.x == 1 && flips.y == -1) {
485
+ p = vec2i(0, 1);
486
+ q = vec2i(1, 0);
487
+ } else {
488
+ p = vec2i(-1, 0);
489
+ q = vec2i(0, -1);
490
+ }
491
+
492
+ if (digit == 1u) {
493
+ return p;
494
+ }
495
+ if (digit == 2u) {
496
+ return p + q;
497
+ }
498
+ if (digit == 3u) {
499
+ return q + 2 * p;
500
+ }
501
+ return vec2i(0);
502
+ }
503
+
504
+ fn dggs_a5_kj_to_ij(kj : vec2i) -> vec2i {
505
+ return vec2i(kj.x - kj.y, kj.y);
506
+ }
507
+
508
+ fn dggs_a5_shift_digits(
509
+ digits : ptr<function, array<u32, 29>>,
510
+ digitIndex : u32,
511
+ flips : vec2i,
512
+ invertJ : bool,
513
+ flipIj : bool
514
+ ) {
515
+ if (digitIndex == 0u) {
516
+ return;
517
+ }
518
+ let parentK = (*digits)[digitIndex];
519
+ let childK = (*digits)[digitIndex - 1u];
520
+ let flipSum = flips.x + flips.y;
521
+ var needsShift = true;
522
+ var first = true;
523
+ if (invertJ != (flipSum == 0)) {
524
+ needsShift = parentK == 1u || parentK == 2u;
525
+ first = parentK == 1u;
526
+ } else {
527
+ needsShift = parentK < 2u;
528
+ first = parentK == 0u;
529
+ }
530
+ if (!needsShift) {
531
+ return;
532
+ }
533
+ let source = select(childK + 4u, childK, first);
534
+ let destination = dggs_a5_pattern_value(source, flipIj);
535
+ (*digits)[digitIndex - 1u] = destination % 4u;
536
+ (*digits)[digitIndex] = u32(dggs_a5_positive_mod_i32(
537
+ i32(parentK) + 4 + i32(destination / 4u) - i32(source / 4u),
538
+ 4
539
+ ));
540
+ }
541
+
542
+ fn dggs_a5_make_anchor(index : vec2u, cell : DggsA5Cell, anchorInfo : DggsA5Anchor) -> DggsA5Anchor {
543
+ if (cell.hilbertResolution == 0u) {
544
+ return anchorInfo;
545
+ }
546
+
547
+ let reverse = dggs_a5_is_reverse_orientation(anchorInfo.orientation);
548
+ let invertJ = dggs_a5_is_invert_j_orientation(anchorInfo.orientation);
549
+ let flipIj = dggs_a5_is_flip_ij_orientation(anchorInfo.orientation);
550
+ let hilbertBits = 2u * cell.hilbertResolution;
551
+ let sBitOffset = cell.quintantShift - hilbertBits;
552
+ var digits : array<u32, 29>;
553
+ var digitIndex = 0u;
554
+ loop {
555
+ if (digitIndex >= cell.hilbertResolution) {
556
+ break;
557
+ }
558
+ var digit = dggs_u64_extract_bits(index, sBitOffset + 2u * digitIndex, 2u);
559
+ if (reverse) {
560
+ digit = 3u - digit;
561
+ }
562
+ digits[digitIndex] = digit;
563
+ digitIndex += 1u;
564
+ }
565
+
566
+ var flips = vec2i(1, 1);
567
+ digitIndex = cell.hilbertResolution;
568
+ loop {
569
+ if (digitIndex == 0u) {
570
+ break;
571
+ }
572
+ digitIndex -= 1u;
573
+ dggs_a5_shift_digits(&digits, digitIndex, flips, invertJ, flipIj);
574
+ flips *= dggs_a5_quaternary_to_flips(digits[digitIndex]);
575
+ }
576
+
577
+ flips = vec2i(1, 1);
578
+ var offset = vec2i(0);
579
+ digitIndex = cell.hilbertResolution;
580
+ loop {
581
+ if (digitIndex == 0u) {
582
+ break;
583
+ }
584
+ digitIndex -= 1u;
585
+ offset *= 2;
586
+ offset += dggs_a5_quaternary_to_kj(digits[digitIndex], flips);
587
+ flips *= dggs_a5_quaternary_to_flips(digits[digitIndex]);
588
+ }
589
+
590
+ var anchorOffset = dggs_a5_kj_to_ij(offset);
591
+ if (flipIj) {
592
+ let originalOffset = anchorOffset;
593
+ anchorOffset = originalOffset.yx;
594
+ if (flips.x == -1) {
595
+ anchorOffset += vec2i(-1, 1);
596
+ }
597
+ if (flips.y == -1) {
598
+ anchorOffset -= vec2i(-1, 1);
599
+ }
600
+ }
601
+ if (invertJ) {
602
+ let i = anchorOffset.x;
603
+ let j = i32(1u << cell.hilbertResolution) - (i + anchorOffset.y);
604
+ flips.x = -flips.x;
605
+ anchorOffset.y = j;
606
+ }
607
+
608
+ return DggsA5Anchor(
609
+ digits[0],
610
+ anchorOffset,
611
+ flips,
612
+ anchorInfo.orientation,
613
+ anchorInfo.quintant
614
+ );
615
+ }
616
+
617
+ fn dggs_a5_rotate_face_point(point : vec2f, quintant : u32) -> vec2f {
618
+ let angle = f32(quintant) * DGGS_TWO_PI_OVER_5;
619
+ let cosine = cos(angle);
620
+ let sine = sin(angle);
621
+ return vec2f(point.x * cosine - point.y * sine, point.x * sine + point.y * cosine);
622
+ }
623
+
624
+ fn dggs_a5_get_base_pentagon_vertex(vertexIndex : u32) -> vec2f {
625
+ let vertices = array<vec2f, 5>(
626
+ vec2f(0.0, 0.0),
627
+ vec2f(0.199381847431, 0.375413822391),
628
+ vec2f(0.618033988750, 0.449027976580),
629
+ vec2f(0.817415836181, 0.073614154188),
630
+ vec2f(0.418652141319, -0.073614154188)
631
+ );
632
+ return vertices[min(vertexIndex, 4u)];
633
+ }
634
+
635
+ fn dggs_a5_get_base_pentagon_center() -> vec2f {
636
+ return vec2f(0.4106967627362, 0.1648883597942);
637
+ }
638
+
639
+ fn dggs_a5_get_base_triangle_vertex(vertexIndex : u32) -> vec2f {
640
+ let vertices = array<vec2f, 3>(
641
+ vec2f(0.0, 0.0),
642
+ vec2f(0.618033988750, 0.449027976580),
643
+ vec2f(0.618033988750, -0.449027976580)
644
+ );
645
+ return vertices[min(vertexIndex, 2u)];
646
+ }
647
+
648
+ fn dggs_a5_get_face_vertex(vertexIndex : u32) -> vec2f {
649
+ return dggs_a5_rotate_face_point(dggs_a5_get_base_triangle_vertex(1u), 4u - min(vertexIndex, 4u));
650
+ }
651
+
652
+ fn dggs_a5_get_triangle_vertex(quintant : u32, vertexIndex : u32) -> vec2f {
653
+ return dggs_a5_rotate_face_point(dggs_a5_get_base_triangle_vertex(vertexIndex), quintant);
654
+ }
655
+
656
+ fn dggs_a5_get_pentagon_vertex(
657
+ anchor : DggsA5Anchor,
658
+ hilbertResolution : u32,
659
+ vertexIndex : u32
660
+ ) -> vec2f {
661
+ let flipSum = anchor.flips.x + anchor.flips.y;
662
+ let reflectsY = ((flipSum == -2 || flipSum == 2) && anchor.q > 1u) ||
663
+ (flipSum == 0 && (anchor.q == 0u || anchor.q == 3u));
664
+ let sourceIndex = select(vertexIndex, 4u - vertexIndex, reflectsY);
665
+ var point = dggs_a5_get_base_pentagon_vertex(sourceIndex);
666
+
667
+ if (anchor.flips.x == 1 && anchor.flips.y == -1) {
668
+ point = -point;
669
+ }
670
+ if (reflectsY) {
671
+ point.y = -point.y;
672
+ }
673
+ if (anchor.flips.x == -1 && anchor.flips.y == -1) {
674
+ point = -point;
675
+ } else if (anchor.flips.x == -1) {
676
+ point += vec2f(-0.618033988750, 0.449027976580);
677
+ } else if (anchor.flips.y == -1) {
678
+ point += vec2f(0.618033988750, -0.449027976580);
679
+ }
680
+
681
+ let translation = vec2f(
682
+ f32(anchor.offset.x) * 0.618033988750 + f32(anchor.offset.y) * 0.618033988750,
683
+ f32(anchor.offset.x) * 0.449027976580 + f32(anchor.offset.y) * -0.449027976580
684
+ );
685
+ point = (point + translation) / f32(1u << hilbertResolution);
686
+ return dggs_a5_rotate_face_point(point, anchor.quintant);
687
+ }
688
+
689
+ // Transforming the center directly preserves sub-cell precision when individual vertices collapse
690
+ // to the same f32 coordinate at the highest resolutions.
691
+ fn dggs_a5_get_pentagon_center(anchor : DggsA5Anchor, hilbertResolution : u32) -> vec2f {
692
+ let flipSum = anchor.flips.x + anchor.flips.y;
693
+ let reflectsY = ((flipSum == -2 || flipSum == 2) && anchor.q > 1u) ||
694
+ (flipSum == 0 && (anchor.q == 0u || anchor.q == 3u));
695
+ var point = dggs_a5_get_base_pentagon_center();
696
+
697
+ if (anchor.flips.x == 1 && anchor.flips.y == -1) {
698
+ point = -point;
699
+ }
700
+ if (reflectsY) {
701
+ point.y = -point.y;
702
+ }
703
+ if (anchor.flips.x == -1 && anchor.flips.y == -1) {
704
+ point = -point;
705
+ } else if (anchor.flips.x == -1) {
706
+ point += vec2f(-0.618033988750, 0.449027976580);
707
+ } else if (anchor.flips.y == -1) {
708
+ point += vec2f(0.618033988750, -0.449027976580);
709
+ }
710
+
711
+ let translation = vec2f(
712
+ f32(anchor.offset.x) * 0.618033988750 + f32(anchor.offset.y) * 0.618033988750,
713
+ f32(anchor.offset.x) * 0.449027976580 + f32(anchor.offset.y) * -0.449027976580
714
+ );
715
+ point = (point + translation) / f32(1u << hilbertResolution);
716
+ return dggs_a5_rotate_face_point(point, anchor.quintant);
717
+ }
718
+
719
+ fn dggs_a5_get_shape_vertex_count(cell : DggsA5Cell) -> u32 {
720
+ return select(5u, 3u, cell.resolution == 1u);
721
+ }
722
+
723
+ fn dggs_a5_get_reversed_shape_index(vertexIndex : u32, shapeVertexCount : u32) -> u32 {
724
+ if (vertexIndex == 0u || vertexIndex >= shapeVertexCount) {
725
+ return 0u;
726
+ }
727
+ return shapeVertexCount - vertexIndex;
728
+ }
729
+
730
+ fn dggs_a5_get_cell_shape_face_point(index : vec2u, cell : DggsA5Cell, shapeIndex : u32) -> vec2f {
731
+ let anchorInfo = dggs_a5_segment_to_anchor_info(cell);
732
+ if (cell.resolution == 0u) {
733
+ return dggs_a5_get_face_vertex(shapeIndex);
734
+ }
735
+ if (cell.resolution == 1u) {
736
+ return dggs_a5_get_triangle_vertex(anchorInfo.quintant, shapeIndex);
737
+ }
738
+ let anchor = dggs_a5_make_anchor(index, cell, anchorInfo);
739
+ return dggs_a5_get_pentagon_vertex(anchor, cell.hilbertResolution, shapeIndex);
740
+ }
741
+
742
+ fn dggs_a5_get_cell_center_face_point(index : vec2u, cell : DggsA5Cell) -> vec2f {
743
+ if (cell.resolution >= 2u) {
744
+ return dggs_a5_get_pentagon_center(
745
+ dggs_a5_make_anchor(index, cell, dggs_a5_segment_to_anchor_info(cell)),
746
+ cell.hilbertResolution
747
+ );
748
+ }
749
+ let shapeVertexCount = dggs_a5_get_shape_vertex_count(cell);
750
+ var center = vec2f(0.0);
751
+ var vertexIndex = 0u;
752
+ loop {
753
+ if (vertexIndex >= shapeVertexCount) {
754
+ break;
755
+ }
756
+ center += dggs_a5_get_cell_shape_face_point(index, cell, vertexIndex);
757
+ vertexIndex += 1u;
758
+ }
759
+ return center / f32(shapeVertexCount);
760
+ }
761
+
762
+ fn dggs_a5_to_polar(point : vec2f) -> vec2f {
763
+ var angle = 0.0;
764
+ if (dot(point, point) > 1.0e-12) {
765
+ angle = atan2(point.y, point.x);
766
+ }
767
+ return vec2f(length(point), angle);
768
+ }
769
+
770
+ fn dggs_a5_to_cartesian(thetaPhi : vec2f) -> vec3f {
771
+ let sinPhi = sin(thetaPhi.y);
772
+ return vec3f(sinPhi * cos(thetaPhi.x), sinPhi * sin(thetaPhi.x), cos(thetaPhi.y));
773
+ }
774
+
775
+ fn dggs_a5_normalize_vec3(point : vec3f) -> vec3f {
776
+ let magnitude = length(point);
777
+ if (magnitude < 1.0e-12) {
778
+ return vec3f(0.0, 0.0, 1.0);
779
+ }
780
+ return point / magnitude;
781
+ }
782
+
783
+ fn dggs_a5_get_face_triangle_index(polar : vec2f) -> u32 {
784
+ return u32(dggs_a5_positive_mod_i32(i32(floor(polar.y / DGGS_PI_OVER_5)), 10));
785
+ }
786
+
787
+ fn dggs_a5_normalize_gamma(gamma : f32) -> f32 {
788
+ let segment = gamma / DGGS_TWO_PI_OVER_5;
789
+ return (segment - round(segment)) * DGGS_TWO_PI_OVER_5;
790
+ }
791
+
792
+ fn dggs_a5_should_reflect(polar : vec2f) -> bool {
793
+ return polar.x * cos(dggs_a5_normalize_gamma(polar.y)) > DGGS_A5_DISTANCE_TO_EDGE;
794
+ }
795
+
796
+ fn dggs_a5_get_base_face_triangle(faceTriangleIndex : u32) -> DggsA5FaceTriangle {
797
+ let quintant = ((faceTriangleIndex + 1u) / 2u) % 5u;
798
+ let center = dggs_a5_get_triangle_vertex(quintant, 0u);
799
+ let corner1 = dggs_a5_get_triangle_vertex(quintant, 1u);
800
+ let corner2 = dggs_a5_get_triangle_vertex(quintant, 2u);
801
+ let edgeMidpoint = (corner1 + corner2) * 0.5;
802
+ if ((faceTriangleIndex & 1u) == 0u) {
803
+ return DggsA5FaceTriangle(center, edgeMidpoint, corner1);
804
+ }
805
+ return DggsA5FaceTriangle(center, corner2, edgeMidpoint);
806
+ }
807
+
808
+ fn dggs_a5_get_face_triangle_vertex(triangle : DggsA5FaceTriangle, vertexIndex : u32) -> vec2f {
809
+ if (vertexIndex == 0u) {
810
+ return triangle.a;
811
+ }
812
+ if (vertexIndex == 1u) {
813
+ return triangle.b;
814
+ }
815
+ return triangle.c;
816
+ }
817
+
818
+ fn dggs_a5_get_reflected_face_triangle(
819
+ faceTriangleIndex : u32,
820
+ squashed : bool
821
+ ) -> DggsA5FaceTriangle {
822
+ let baseTriangle = dggs_a5_get_base_face_triangle(faceTriangleIndex);
823
+ let even = (faceTriangleIndex & 1u) == 0u;
824
+ let midpoint = select(baseTriangle.c, baseTriangle.b, even);
825
+ let scale = select(2.0, DGGS_A5_REFLECTED_TRIANGLE_SCALE, squashed);
826
+ let reflectedA = -baseTriangle.a + midpoint * scale;
827
+ return DggsA5FaceTriangle(reflectedA, baseTriangle.c, baseTriangle.b);
828
+ }
829
+
830
+ fn dggs_a5_get_face_triangle(
831
+ faceTriangleIndex : u32,
832
+ reflected : bool,
833
+ squashed : bool
834
+ ) -> DggsA5FaceTriangle {
835
+ if (reflected) {
836
+ return dggs_a5_get_reflected_face_triangle(faceTriangleIndex, squashed);
837
+ }
838
+ return dggs_a5_get_base_face_triangle(faceTriangleIndex);
839
+ }
840
+
841
+ fn dggs_a5_face_triangle_to_spherical_triangle(
842
+ faceTriangleIndex : u32,
843
+ origin : u32,
844
+ reflected : bool
845
+ ) -> DggsA5SphericalTriangle {
846
+ let faceTriangle = dggs_a5_get_face_triangle(faceTriangleIndex, reflected, true);
847
+ let originAngle = dggs_a5_get_origin_angle(origin);
848
+ let quaternion = dggs_a5_get_origin_quaternion(origin);
849
+
850
+ let polarA = dggs_a5_to_polar(faceTriangle.a);
851
+ let polarB = dggs_a5_to_polar(faceTriangle.b);
852
+ let polarC = dggs_a5_to_polar(faceTriangle.c);
853
+ let sphericalA = dggs_a5_quaternion_rotate(
854
+ dggs_a5_to_cartesian(vec2f(polarA.y + originAngle, atan(polarA.x))),
855
+ quaternion
856
+ );
857
+ let sphericalB = dggs_a5_quaternion_rotate(
858
+ dggs_a5_to_cartesian(vec2f(polarB.y + originAngle, atan(polarB.x))),
859
+ quaternion
860
+ );
861
+ let sphericalC = dggs_a5_quaternion_rotate(
862
+ dggs_a5_to_cartesian(vec2f(polarC.y + originAngle, atan(polarC.x))),
863
+ quaternion
864
+ );
865
+ return DggsA5SphericalTriangle(
866
+ dggs_a5_normalize_vec3(sphericalA),
867
+ dggs_a5_normalize_vec3(sphericalB),
868
+ dggs_a5_normalize_vec3(sphericalC)
869
+ );
870
+ }
871
+
872
+ fn dggs_a5_face_to_barycentric(point : vec2f, triangle : DggsA5FaceTriangle) -> vec3f {
873
+ let d31 = triangle.a - triangle.c;
874
+ let d23 = triangle.c - triangle.b;
875
+ let d3p = point - triangle.c;
876
+ let determinant = d23.x * d31.y - d23.y * d31.x;
877
+ if (abs(determinant) < 1.0e-12) {
878
+ return vec3f(1.0, 0.0, 0.0);
879
+ }
880
+ let b0 = (d23.x * d3p.y - d23.y * d3p.x) / determinant;
881
+ let b1 = (d31.x * d3p.y - d31.y * d3p.x) / determinant;
882
+ return vec3f(b0, b1, 1.0 - (b0 + b1));
883
+ }
884
+
885
+ fn dggs_a5_triangle_area(a : vec3f, b : vec3f, c : vec3f) -> f32 {
886
+ let midA = dggs_a5_normalize_vec3((b + c) * 0.5);
887
+ let midB = dggs_a5_normalize_vec3((c + a) * 0.5);
888
+ let midC = dggs_a5_normalize_vec3((a + b) * 0.5);
889
+ let tripleProduct = dot(midA, cross(midB, midC));
890
+ let clamped = clamp(tripleProduct, -1.0, 1.0);
891
+ if (abs(clamped) < 1.0e-8) {
892
+ return 2.0 * clamped;
893
+ }
894
+ return asin(clamped) * 2.0;
895
+ }
896
+
897
+ fn dggs_a5_spherical_triangle_area(triangle : DggsA5SphericalTriangle) -> f32 {
898
+ return dggs_a5_triangle_area(triangle.a, triangle.b, triangle.c);
899
+ }
900
+
901
+ fn dggs_a5_vector_difference(a : vec3f, b : vec3f) -> f32 {
902
+ let midpoint = dggs_a5_normalize_vec3((a + b) * 0.5);
903
+ let crossProduct = cross(a, midpoint);
904
+ let distance = length(crossProduct);
905
+ if (distance < 1.0e-8) {
906
+ return 0.5 * length(a - b);
907
+ }
908
+ return distance;
909
+ }
910
+
911
+ fn dggs_a5_slerp(a : vec3f, b : vec3f, t : f32) -> vec3f {
912
+ let cosineGamma = clamp(dot(a, b), -1.0, 1.0);
913
+ let gamma = acos(cosineGamma);
914
+ if (gamma < 1.0e-8) {
915
+ return dggs_a5_normalize_vec3(mix(a, b, t));
916
+ }
917
+ let sinGamma = sin(gamma);
918
+ if (abs(sinGamma) < 1.0e-8) {
919
+ return dggs_a5_normalize_vec3(mix(a, b, t));
920
+ }
921
+ let weightA = sin((1.0 - t) * gamma) / sinGamma;
922
+ let weightB = sin(t * gamma) / sinGamma;
923
+ return dggs_a5_normalize_vec3(weightA * a + weightB * b);
924
+ }
925
+
926
+ fn dggs_a5_safe_acos(value : f32) -> f32 {
927
+ if (value < 1.0e-3) {
928
+ return 2.0 * value + value * value * value / 3.0;
929
+ }
930
+ return acos(clamp(1.0 - 2.0 * value * value, -1.0, 1.0));
931
+ }
932
+
933
+ fn dggs_a5_polyhedral_inverse_edge(a : vec3f, b : vec3f, edgeHeight : f32) -> vec3f {
934
+ let difference = dggs_a5_vector_difference(a, b);
935
+ let denominator = max(dggs_a5_safe_acos(difference), 1.0e-8);
936
+ let interpolation = dggs_a5_safe_acos(clamp(edgeHeight, 0.0, 1.0) * difference) / denominator;
937
+ return dggs_a5_slerp(a, b, clamp(interpolation, 0.0, 1.0));
938
+ }
939
+
940
+ fn dggs_a5_polyhedral_inverse(
941
+ facePoint : vec2f,
942
+ faceTriangle : DggsA5FaceTriangle,
943
+ sphericalTriangle : DggsA5SphericalTriangle
944
+ ) -> vec3f {
945
+ let barycentric = dggs_a5_face_to_barycentric(facePoint, faceTriangle);
946
+ if (barycentric.x > 0.9999999) {
947
+ return sphericalTriangle.a;
948
+ }
949
+ if (barycentric.y > 0.9999999) {
950
+ return sphericalTriangle.b;
951
+ }
952
+ if (barycentric.z > 0.9999999) {
953
+ return sphericalTriangle.c;
954
+ }
955
+ if (abs(barycentric.z) < 1.0e-6) {
956
+ return dggs_a5_polyhedral_inverse_edge(
957
+ sphericalTriangle.a,
958
+ sphericalTriangle.b,
959
+ 1.0 - barycentric.x
960
+ );
961
+ }
962
+ if (abs(barycentric.y) < 1.0e-6) {
963
+ return dggs_a5_polyhedral_inverse_edge(
964
+ sphericalTriangle.a,
965
+ sphericalTriangle.c,
966
+ 1.0 - barycentric.x
967
+ );
968
+ }
969
+
970
+ let crossBC = cross(sphericalTriangle.b, sphericalTriangle.c);
971
+ let areaABC = dggs_a5_spherical_triangle_area(sphericalTriangle);
972
+ let h = max(1.0 - barycentric.x, 1.0e-8);
973
+ let areaRatio = barycentric.z / h;
974
+ let alpha = areaRatio * areaABC;
975
+ let sineAlpha = sin(alpha);
976
+ let halfSineAlpha = sin(alpha * 0.5);
977
+ let chordCoefficient = 2.0 * halfSineAlpha * halfSineAlpha;
978
+ let dotAB = dot(sphericalTriangle.a, sphericalTriangle.b);
979
+ let dotBC = dot(sphericalTriangle.b, sphericalTriangle.c);
980
+ let dotCA = dot(sphericalTriangle.c, sphericalTriangle.a);
981
+ let lengthBC = length(crossBC);
982
+ let volume = dot(sphericalTriangle.a, crossBC);
983
+ let f = sineAlpha * volume + chordCoefficient * (dotAB * dotBC - dotCA);
984
+ let g = chordCoefficient * lengthBC * (1.0 + dotAB);
985
+ let edgeAngle = max(acos(clamp(dotBC, -1.0, 1.0)), 1.0e-8);
986
+ let q = 2.0 / edgeAngle * atan2(g, f);
987
+ let pointOnBC = dggs_a5_slerp(sphericalTriangle.b, sphericalTriangle.c, q);
988
+ let k = dggs_a5_vector_difference(sphericalTriangle.a, pointOnBC);
989
+ let denominator = max(dggs_a5_safe_acos(k), 1.0e-8);
990
+ let t = dggs_a5_safe_acos(h * k) / denominator;
991
+ return dggs_a5_slerp(sphericalTriangle.a, pointOnBC, t);
992
+ }
993
+
994
+ fn dggs_a5_authalic_inverse(phi : f32) -> f32 {
995
+ let sinPhi = sin(phi);
996
+ let cosPhi = cos(phi);
997
+ let coefficientX = 2.0 * (cosPhi - sinPhi) * (cosPhi + sinPhi);
998
+ var u0 = coefficientX * 4.92842354825238055e-17 + 2.19128723067677184e-14;
999
+ var u1 = coefficientX * u0 + 1.02018123778161003e-11;
1000
+ u0 = coefficientX * u1 - u0 + 5.08622073997266026e-9;
1001
+ u1 = coefficientX * u0 - u1 + 0.00000288319780486075558;
1002
+ u0 = coefficientX * u1 - u0 + 0.00223920899635416575;
1003
+ return phi + 2.0 * sinPhi * cosPhi * u0;
1004
+ }
1005
+
1006
+ fn dggs_a5_normalize_longitude(longitude : f32) -> f32 {
1007
+ var result = longitude;
1008
+ loop {
1009
+ if (result < -180.0) {
1010
+ result += 360.0;
1011
+ } else {
1012
+ break;
1013
+ }
1014
+ }
1015
+ loop {
1016
+ if (result >= 180.0) {
1017
+ result -= 360.0;
1018
+ } else {
1019
+ break;
1020
+ }
1021
+ }
1022
+ return result;
1023
+ }
1024
+
1025
+ fn dggs_a5_normalize_longitude_to_center(longitude : f32, centerLongitude : f32) -> f32 {
1026
+ var result = longitude;
1027
+ loop {
1028
+ if (result - centerLongitude > 180.0) {
1029
+ result -= 360.0;
1030
+ } else {
1031
+ break;
1032
+ }
1033
+ }
1034
+ loop {
1035
+ if (result - centerLongitude < -180.0) {
1036
+ result += 360.0;
1037
+ } else {
1038
+ break;
1039
+ }
1040
+ }
1041
+ return result;
1042
+ }
1043
+
1044
+ fn dggs_a5_sphere_to_lnglat(cartesian : vec3f) -> vec2f {
1045
+ let point = dggs_a5_normalize_vec3(cartesian);
1046
+ var theta = 0.0;
1047
+ if (dot(point.xy, point.xy) > 1.0e-12) {
1048
+ theta = atan2(point.y, point.x);
1049
+ }
1050
+ let phi = acos(clamp(point.z, -1.0, 1.0));
1051
+ let longitude = dggs_a5_normalize_longitude(theta * DGGS_RADIANS_TO_DEGREES - DGGS_A5_LONGITUDE_OFFSET);
1052
+ let authalicLatitude = DGGS_PI_OVER_2 - phi;
1053
+ let latitude = dggs_a5_authalic_inverse(authalicLatitude) * DGGS_RADIANS_TO_DEGREES;
1054
+ return vec2f(longitude, latitude);
1055
+ }
1056
+
1057
+ fn dggs_a5_face_to_lnglat(facePoint : vec2f, origin : u32) -> vec2f {
1058
+ let polar = dggs_a5_to_polar(facePoint);
1059
+ let faceTriangleIndex = dggs_a5_get_face_triangle_index(polar);
1060
+ let reflected = dggs_a5_should_reflect(polar);
1061
+ let faceTriangle = dggs_a5_get_face_triangle(faceTriangleIndex, reflected, false);
1062
+ let sphericalTriangle = dggs_a5_face_triangle_to_spherical_triangle(
1063
+ faceTriangleIndex,
1064
+ origin,
1065
+ reflected
1066
+ );
1067
+ return dggs_a5_sphere_to_lnglat(
1068
+ dggs_a5_polyhedral_inverse(facePoint, faceTriangle, sphericalTriangle)
1069
+ );
1070
+ }
1071
+
1072
+ fn dggs_a5_get_center_lnglat(index : vec2u) -> vec2f {
1073
+ let cell = dggs_a5_deserialize(index);
1074
+ if (cell.valid == 0u || dggs_u64_is_zero(index)) {
1075
+ return vec2f(0.0);
1076
+ }
1077
+ if (cell.resolution == 0u) {
1078
+ return dggs_a5_sphere_to_lnglat(dggs_a5_quaternion_rotate(
1079
+ vec3f(0.0, 0.0, 1.0),
1080
+ dggs_a5_get_origin_quaternion(cell.origin)
1081
+ ));
1082
+ }
1083
+ return dggs_a5_face_to_lnglat(
1084
+ dggs_a5_get_cell_center_face_point(index, cell),
1085
+ cell.origin
1086
+ );
1087
+ }
1088
+
1089
+ fn dggs_a5_get_center_unit_vector(index : vec2u) -> vec3f {
1090
+ let longitudeLatitude = dggs_a5_get_center_lnglat(index) * DGGS_DEGREES_TO_RADIANS;
1091
+ let cosLatitude = cos(longitudeLatitude.y);
1092
+ return vec3f(
1093
+ cosLatitude * cos(longitudeLatitude.x),
1094
+ cosLatitude * sin(longitudeLatitude.x),
1095
+ sin(longitudeLatitude.y)
1096
+ );
1097
+ }
1098
+
1099
+ fn dggs_a5_get_boundary_point(index : vec2u, vertexIndex : u32) -> vec2f {
1100
+ let cell = dggs_a5_deserialize(index);
1101
+ if (cell.valid == 0u || dggs_u64_is_zero(index)) {
1102
+ return vec2f(0.0);
1103
+ }
1104
+
1105
+ let shapeVertexCount = dggs_a5_get_shape_vertex_count(cell);
1106
+ let shapeIndex = dggs_a5_get_reversed_shape_index(vertexIndex, shapeVertexCount);
1107
+ let facePoint = dggs_a5_get_cell_shape_face_point(index, cell, shapeIndex);
1108
+ let centerPoint = dggs_a5_get_cell_center_face_point(index, cell);
1109
+ var lngLat = dggs_a5_face_to_lnglat(facePoint, cell.origin);
1110
+ let centerLngLat = dggs_a5_face_to_lnglat(centerPoint, cell.origin);
1111
+ lngLat.x = dggs_a5_normalize_longitude_to_center(lngLat.x, centerLngLat.x);
1112
+ return lngLat;
1113
+ }
1114
+
1115
+ fn dggs_a5_get_boundary_point_fp64_split(index : vec2u, vertexIndex : u32) -> vec4f {
1116
+ return dggs_boundary_point_to_fp64_split(dggs_a5_get_boundary_point(index, vertexIndex));
1117
+ }
1118
+
1119
+ fn dggs_h3_get_mode(index: vec2u) -> u32 {
1120
+ return dggs_u64_extract_bits(index, 59u, 4u);
1121
+ }
1122
+
1123
+ fn dggs_h3_is_cell_mode(index: vec2u) -> bool {
1124
+ return dggs_h3_get_mode(index) == DGGS_H3_CELL_MODE;
1125
+ }
1126
+
1127
+ fn dggs_h3_get_resolution(index: vec2u) -> u32 {
1128
+ return dggs_u64_extract_bits(index, 52u, 4u);
1129
+ }
1130
+
1131
+ fn dggs_h3_get_base_cell(index: vec2u) -> u32 {
1132
+ return dggs_u64_extract_bits(index, 45u, 7u);
1133
+ }
1134
+
1135
+ fn dggs_h3_digit_bit_offset(resolution: u32) -> u32 {
1136
+ return 3u * (DGGS_H3_MAX_RESOLUTION - resolution);
1137
+ }
1138
+
1139
+ fn dggs_h3_get_digit(index: vec2u, resolution: u32) -> u32 {
1140
+ if (resolution == 0u || resolution > DGGS_H3_MAX_RESOLUTION) {
1141
+ return DGGS_H3_UNUSED_DIGIT;
1142
+ }
1143
+ return dggs_u64_extract_bits(index, dggs_h3_digit_bit_offset(resolution), 3u);
1144
+ }
1145
+
1146
+ fn dggs_h3_is_valid_cell_id(index: vec2u) -> bool {
1147
+ let cellResolution = dggs_h3_get_resolution(index);
1148
+ if (
1149
+ (dggs_u64_high(index) >> 24u) != 8u ||
1150
+ !dggs_h3_is_cell_mode(index) ||
1151
+ cellResolution > DGGS_H3_MAX_RESOLUTION ||
1152
+ dggs_h3_get_base_cell(index) > DGGS_H3_MAX_BASE_CELL
1153
+ ) {
1154
+ return false;
1155
+ }
1156
+
1157
+ var digitResolution = 1u;
1158
+ loop {
1159
+ if (digitResolution > DGGS_H3_MAX_RESOLUTION) {
1160
+ break;
1161
+ }
1162
+
1163
+ let digit = dggs_h3_get_digit(index, digitResolution);
1164
+ if (digitResolution <= cellResolution) {
1165
+ if (digit == DGGS_H3_UNUSED_DIGIT) {
1166
+ return false;
1167
+ }
1168
+ } else if (digit != DGGS_H3_UNUSED_DIGIT) {
1169
+ return false;
1170
+ }
1171
+ digitResolution += 1u;
1172
+ }
1173
+ if (
1174
+ dggs_h3_is_base_cell_pentagon(dggs_h3_get_base_cell(index)) &&
1175
+ dggs_h3_get_leading_non_zero_digit(index) == 1u
1176
+ ) {
1177
+ return false;
1178
+ }
1179
+ return true;
1180
+ }
1181
+
1182
+ fn dggs_h3_get_parent(index: vec2u, parentResolution: u32) -> vec2u {
1183
+ let currentResolution = dggs_h3_get_resolution(index);
1184
+ let targetResolution = min(parentResolution, currentResolution);
1185
+ var parent = dggs_u64_set_bits(index, 52u, 4u, targetResolution);
1186
+ var resolution = targetResolution + 1u;
1187
+ loop {
1188
+ if (resolution > DGGS_H3_MAX_RESOLUTION) {
1189
+ break;
1190
+ }
1191
+ parent = dggs_u64_set_bits(
1192
+ parent,
1193
+ dggs_h3_digit_bit_offset(resolution),
1194
+ 3u,
1195
+ DGGS_H3_UNUSED_DIGIT
1196
+ );
1197
+ resolution += 1u;
1198
+ }
1199
+ return parent;
1200
+ }
1201
+
1202
+ fn dggs_h3_positive_angle_rads(angle: f32) -> f32 {
1203
+ var result = angle;
1204
+ if (result < 0.0) {
1205
+ result += DGGS_TWO_PI;
1206
+ }
1207
+ if (result >= DGGS_TWO_PI) {
1208
+ result -= DGGS_TWO_PI;
1209
+ }
1210
+ return result;
1211
+ }
1212
+
1213
+ fn dggs_h3_constrain_longitude(longitude: f32) -> f32 {
1214
+ var result = longitude;
1215
+ loop {
1216
+ if (result <= DGGS_PI) {
1217
+ break;
1218
+ }
1219
+ result -= DGGS_TWO_PI;
1220
+ }
1221
+ loop {
1222
+ if (result >= -DGGS_PI) {
1223
+ break;
1224
+ }
1225
+ result += DGGS_TWO_PI;
1226
+ }
1227
+ return result;
1228
+ }
1229
+
1230
+ fn dggs_h3_is_resolution_class_iii(resolution: u32) -> bool {
1231
+ return (resolution & 1u) != 0u;
1232
+ }
1233
+
1234
+ fn dggs_h3_is_base_cell_pentagon(baseCell: u32) -> bool {
1235
+ return baseCell == 4u ||
1236
+ baseCell == 14u ||
1237
+ baseCell == 24u ||
1238
+ baseCell == 38u ||
1239
+ baseCell == 49u ||
1240
+ baseCell == 58u ||
1241
+ baseCell == 63u ||
1242
+ baseCell == 72u ||
1243
+ baseCell == 83u ||
1244
+ baseCell == 97u ||
1245
+ baseCell == 107u ||
1246
+ baseCell == 117u;
1247
+ }
1248
+
1249
+ fn dggs_h3_get_leading_non_zero_digit(index: vec2u) -> u32 {
1250
+ let cellResolution = dggs_h3_get_resolution(index);
1251
+ var resolution = 1u;
1252
+ loop {
1253
+ if (resolution > cellResolution) {
1254
+ break;
1255
+ }
1256
+ let digit = dggs_h3_get_digit(index, resolution);
1257
+ if (digit != 0u) {
1258
+ return digit;
1259
+ }
1260
+ resolution += 1u;
1261
+ }
1262
+ return 0u;
1263
+ }
1264
+
1265
+ fn dggs_h3_get_base_cell_home(baseCell: u32) -> DggsH3FaceIJK {
1266
+ let values = array<vec4i, 122>(
1267
+ vec4i(1, 1, 0, 0),
1268
+ vec4i(2, 1, 1, 0),
1269
+ vec4i(1, 0, 0, 0),
1270
+ vec4i(2, 1, 0, 0),
1271
+ vec4i(0, 2, 0, 0),
1272
+ vec4i(1, 1, 1, 0),
1273
+ vec4i(1, 0, 0, 1),
1274
+ vec4i(2, 0, 0, 0),
1275
+ vec4i(0, 1, 0, 0),
1276
+ vec4i(2, 0, 1, 0),
1277
+ vec4i(1, 0, 1, 0),
1278
+ vec4i(1, 0, 1, 1),
1279
+ vec4i(3, 1, 0, 0),
1280
+ vec4i(3, 1, 1, 0),
1281
+ vec4i(11, 2, 0, 0),
1282
+ vec4i(4, 1, 0, 0),
1283
+ vec4i(0, 0, 0, 0),
1284
+ vec4i(6, 0, 1, 0),
1285
+ vec4i(0, 0, 0, 1),
1286
+ vec4i(2, 0, 1, 1),
1287
+ vec4i(7, 0, 0, 1),
1288
+ vec4i(2, 0, 0, 1),
1289
+ vec4i(0, 1, 1, 0),
1290
+ vec4i(6, 0, 0, 1),
1291
+ vec4i(10, 2, 0, 0),
1292
+ vec4i(6, 0, 0, 0),
1293
+ vec4i(3, 0, 0, 0),
1294
+ vec4i(11, 1, 0, 0),
1295
+ vec4i(4, 1, 1, 0),
1296
+ vec4i(3, 0, 1, 0),
1297
+ vec4i(0, 0, 1, 1),
1298
+ vec4i(4, 0, 0, 0),
1299
+ vec4i(5, 0, 1, 0),
1300
+ vec4i(0, 0, 1, 0),
1301
+ vec4i(7, 0, 1, 0),
1302
+ vec4i(11, 1, 1, 0),
1303
+ vec4i(7, 0, 0, 0),
1304
+ vec4i(10, 1, 0, 0),
1305
+ vec4i(12, 2, 0, 0),
1306
+ vec4i(6, 1, 0, 1),
1307
+ vec4i(7, 1, 0, 1),
1308
+ vec4i(4, 0, 0, 1),
1309
+ vec4i(3, 0, 0, 1),
1310
+ vec4i(3, 0, 1, 1),
1311
+ vec4i(4, 0, 1, 0),
1312
+ vec4i(6, 1, 0, 0),
1313
+ vec4i(11, 0, 0, 0),
1314
+ vec4i(8, 0, 0, 1),
1315
+ vec4i(5, 0, 0, 1),
1316
+ vec4i(14, 2, 0, 0),
1317
+ vec4i(5, 0, 0, 0),
1318
+ vec4i(12, 1, 0, 0),
1319
+ vec4i(10, 1, 1, 0),
1320
+ vec4i(4, 0, 1, 1),
1321
+ vec4i(12, 1, 1, 0),
1322
+ vec4i(7, 1, 0, 0),
1323
+ vec4i(11, 0, 1, 0),
1324
+ vec4i(10, 0, 0, 0),
1325
+ vec4i(13, 2, 0, 0),
1326
+ vec4i(10, 0, 0, 1),
1327
+ vec4i(11, 0, 0, 1),
1328
+ vec4i(9, 0, 1, 0),
1329
+ vec4i(8, 0, 1, 0),
1330
+ vec4i(6, 2, 0, 0),
1331
+ vec4i(8, 0, 0, 0),
1332
+ vec4i(9, 0, 0, 1),
1333
+ vec4i(14, 1, 0, 0),
1334
+ vec4i(5, 1, 0, 1),
1335
+ vec4i(16, 0, 1, 1),
1336
+ vec4i(8, 1, 0, 1),
1337
+ vec4i(5, 1, 0, 0),
1338
+ vec4i(12, 0, 0, 0),
1339
+ vec4i(7, 2, 0, 0),
1340
+ vec4i(12, 0, 1, 0),
1341
+ vec4i(10, 0, 1, 0),
1342
+ vec4i(9, 0, 0, 0),
1343
+ vec4i(13, 1, 0, 0),
1344
+ vec4i(16, 0, 0, 1),
1345
+ vec4i(15, 0, 1, 1),
1346
+ vec4i(15, 0, 1, 0),
1347
+ vec4i(16, 0, 1, 0),
1348
+ vec4i(14, 1, 1, 0),
1349
+ vec4i(13, 1, 1, 0),
1350
+ vec4i(5, 2, 0, 0),
1351
+ vec4i(8, 1, 0, 0),
1352
+ vec4i(14, 0, 0, 0),
1353
+ vec4i(9, 1, 0, 1),
1354
+ vec4i(14, 0, 0, 1),
1355
+ vec4i(17, 0, 0, 1),
1356
+ vec4i(12, 0, 0, 1),
1357
+ vec4i(16, 0, 0, 0),
1358
+ vec4i(17, 0, 1, 1),
1359
+ vec4i(15, 0, 0, 1),
1360
+ vec4i(16, 1, 0, 1),
1361
+ vec4i(9, 1, 0, 0),
1362
+ vec4i(15, 0, 0, 0),
1363
+ vec4i(13, 0, 0, 0),
1364
+ vec4i(8, 2, 0, 0),
1365
+ vec4i(13, 0, 1, 0),
1366
+ vec4i(17, 1, 0, 1),
1367
+ vec4i(19, 0, 1, 0),
1368
+ vec4i(14, 0, 1, 0),
1369
+ vec4i(19, 0, 1, 1),
1370
+ vec4i(17, 0, 1, 0),
1371
+ vec4i(13, 0, 0, 1),
1372
+ vec4i(17, 0, 0, 0),
1373
+ vec4i(16, 1, 0, 0),
1374
+ vec4i(9, 2, 0, 0),
1375
+ vec4i(15, 1, 0, 1),
1376
+ vec4i(15, 1, 0, 0),
1377
+ vec4i(18, 0, 1, 1),
1378
+ vec4i(18, 0, 0, 1),
1379
+ vec4i(19, 0, 0, 1),
1380
+ vec4i(17, 1, 0, 0),
1381
+ vec4i(19, 0, 0, 0),
1382
+ vec4i(18, 0, 1, 0),
1383
+ vec4i(18, 1, 0, 1),
1384
+ vec4i(19, 2, 0, 0),
1385
+ vec4i(19, 1, 0, 0),
1386
+ vec4i(18, 0, 0, 0),
1387
+ vec4i(19, 1, 0, 1),
1388
+ vec4i(18, 1, 0, 0)
1389
+ );
1390
+ let value = values[min(baseCell, DGGS_H3_MAX_BASE_CELL)];
1391
+ return DggsH3FaceIJK(
1392
+ u32(value.x),
1393
+ value.yzw,
1394
+ select(1u, 0u, baseCell > DGGS_H3_MAX_BASE_CELL)
1395
+ );
1396
+ }
1397
+
1398
+ fn dggs_h3_get_face_center_geo(face: u32) -> vec2f {
1399
+ let values = array<vec2f, 20>(
1400
+ vec2f(0.803582649718989942, 1.248397419617396099),
1401
+ vec2f(1.307747883455638156, 2.536945009877921159),
1402
+ vec2f(1.054751253523952054, -1.347517358900396623),
1403
+ vec2f(0.600191595538186799, -0.450603909469755746),
1404
+ vec2f(0.491715428198773866, 0.401988202911306943),
1405
+ vec2f(0.172745327415618701, 1.678146885280433686),
1406
+ vec2f(0.605929321571350690, 2.953923329812411617),
1407
+ vec2f(0.427370518328979641, -1.888876200336285401),
1408
+ vec2f(-0.079066118549212831, -0.733429513380867741),
1409
+ vec2f(-0.230961644455383637, 0.506495587332349035),
1410
+ vec2f(0.079066118549212831, 2.408163140208925497),
1411
+ vec2f(0.230961644455383637, -2.635097066257444203),
1412
+ vec2f(-0.172745327415618701, -1.463445768309359553),
1413
+ vec2f(-0.605929321571350690, -0.187669323777381622),
1414
+ vec2f(-0.427370518328979641, 1.252716453253507838),
1415
+ vec2f(-0.600191595538186799, 2.690988744120037492),
1416
+ vec2f(-0.491715428198773866, -2.739604450678486295),
1417
+ vec2f(-0.803582649718989942, -1.893195233972397139),
1418
+ vec2f(-1.307747883455638156, -0.604647643711872080),
1419
+ vec2f(-1.054751253523952054, 1.794075294689396615)
1420
+ );
1421
+ return values[min(face, 19u)];
1422
+ }
1423
+
1424
+ fn dggs_h3_get_face_axis_azimuths(face: u32) -> vec3f {
1425
+ let values = array<vec3f, 20>(
1426
+ vec3f(5.619958268523939882, 3.525563166130744542, 1.431168063737548730),
1427
+ vec3f(5.760339081714187279, 3.665943979320991689, 1.571548876927796127),
1428
+ vec3f(0.780213654393430055, 4.969003859179821079, 2.874608756786625655),
1429
+ vec3f(0.430469363979999913, 4.619259568766391033, 2.524864466373195467),
1430
+ vec3f(6.130269123335111400, 4.035874020941915804, 1.941478918548720291),
1431
+ vec3f(2.692877706530642877, 0.598482604137447119, 4.787272808923838195),
1432
+ vec3f(2.982963003477243874, 0.888567901084048369, 5.077358105870439581),
1433
+ vec3f(3.532912002790141181, 1.438516900396945656, 5.627307105183336758),
1434
+ vec3f(3.494305004259568154, 1.399909901866372864, 5.588700106652763840),
1435
+ vec3f(3.003214169499538391, 0.908819067106342928, 5.097609271892733906),
1436
+ vec3f(5.930472956509811562, 3.836077854116615875, 1.741682751723420374),
1437
+ vec3f(0.138378484090254847, 4.327168688876645809, 2.232773586483450311),
1438
+ vec3f(0.448714947059150361, 4.637505151845541521, 2.543110049452346120),
1439
+ vec3f(0.158629650112549365, 4.347419854898940135, 2.253024752505744869),
1440
+ vec3f(5.891865957979238535, 3.797470855586042958, 1.703075753192847583),
1441
+ vec3f(2.711123289609793325, 0.616728187216597771, 4.805518392002988683),
1442
+ vec3f(3.294508837434268316, 1.200113735041072948, 5.388903939827463911),
1443
+ vec3f(3.804819692245439833, 1.710424589852244509, 5.899214794638635174),
1444
+ vec3f(3.664438879055192436, 1.570043776661997111, 5.758833981448388027),
1445
+ vec3f(2.361378999196363184, 0.266983896803167583, 4.455774101589558636)
1446
+ );
1447
+ return values[min(face, 19u)];
1448
+ }
1449
+
1450
+ // Per face: unit-sphere center, Class II hex x axis, and Class II hex y axis.
1451
+ const DGGS_H3_FACE_UNIT_VECTOR_BASES = array<vec4f, 60>(
1452
+ vec4f(0.219930779140, 0.658369178027, 0.719847537893, 0.0),
1453
+ vec4f(0.404214808693, -0.733089476282, 0.546982822580, 0.0),
1454
+ vec4f(0.887829285854, 0.170674676471, -0.427351511044, 0.0),
1455
+ vec4f(-0.213923483450, 0.147817182955, 0.965601793521, 0.0),
1456
+ vec4f(0.972137411506, -0.064768238220, 0.225286325522, 0.0),
1457
+ vec4f(0.095841516985, 0.986891663629, -0.129843166477, 0.0),
1458
+ vec4f(0.109262527878, -0.481195157287, 0.869777512129, 0.0),
1459
+ vec4f(0.549081430333, 0.758619604829, 0.350721938339, 0.0),
1460
+ vec4f(-0.828595970824, 0.439257914866, 0.347104020954, 0.0),
1461
+ vec4f(0.742856730159, -0.359394167828, 0.564800593652, 0.0),
1462
+ vec4f(-0.280304147989, 0.599180039695, 0.749941907518, 0.0),
1463
+ vec4f(-0.607941989895, -0.715415342415, 0.344365249059, 0.0),
1464
+ vec4f(0.811253470914, 0.344895323764, 0.472138773641, 0.0),
1465
+ vec4f(-0.369836643998, -0.322746873758, 0.871237804641, 0.0),
1466
+ vec4f(0.452867157880, -0.881408912551, -0.134274592492, 0.0),
1467
+ vec4f(-0.105549814961, 0.979445729641, 0.171887461001, 0.0),
1468
+ vec4f(-0.447904449344, 0.107499848833, -0.887595283200, 0.0),
1469
+ vec4f(-0.887829285854, -0.170674676471, 0.427351511044, 0.0),
1470
+ vec4f(-0.807540757997, 0.153355248590, 0.569526199488, 0.0),
1471
+ vec4f(-0.581972789566, -0.050269394156, -0.811653041771, 0.0),
1472
+ vec4f(-0.095841516985, -0.986891663629, 0.129843166477, 0.0),
1473
+ vec4f(-0.284614806979, -0.864408097265, 0.414479255247, 0.0),
1474
+ vec4f(-0.482102819721, -0.244644896962, -0.841264373195, 0.0),
1475
+ vec4f(0.828595970824, -0.439257914866, -0.347104020954, 0.0),
1476
+ vec4f(0.740562147385, -0.667329956457, -0.078983764633, 0.0),
1477
+ vec4f(-0.286311443679, -0.207006321288, -0.935507423896, 0.0),
1478
+ vec4f(0.607941989895, 0.715415342415, -0.344365249059, 0.0),
1479
+ vec4f(0.851230398647, 0.472234378858, -0.228913738869, 0.0),
1480
+ vec4f(-0.265175688426, 0.010631100574, -0.964141501009, 0.0),
1481
+ vec4f(-0.452867157880, 0.881408912551, 0.134274592492, 0.0),
1482
+ vec4f(-0.740562147385, 0.667329956457, 0.078983764633, 0.0),
1483
+ vec4f(0.286311443679, 0.207006321288, 0.935507423896, 0.0),
1484
+ vec4f(0.607941989895, 0.715415342415, -0.344365249059, 0.0),
1485
+ vec4f(-0.851230398647, -0.472234378858, 0.228913738869, 0.0),
1486
+ vec4f(0.265175688426, -0.010631100574, 0.964141501009, 0.0),
1487
+ vec4f(-0.452867157880, 0.881408912551, 0.134274592492, 0.0),
1488
+ vec4f(0.105549814961, -0.979445729641, -0.171887461001, 0.0),
1489
+ vec4f(0.447904449344, -0.107499848833, 0.887595283200, 0.0),
1490
+ vec4f(-0.887829285854, -0.170674676471, 0.427351511044, 0.0),
1491
+ vec4f(0.807540757997, -0.153355248590, -0.569526199488, 0.0),
1492
+ vec4f(0.581972789566, 0.050269394156, 0.811653041771, 0.0),
1493
+ vec4f(-0.095841516985, -0.986891663629, 0.129843166477, 0.0),
1494
+ vec4f(0.284614806979, 0.864408097265, -0.414479255247, 0.0),
1495
+ vec4f(0.482102819721, 0.244644896962, 0.841264373195, 0.0),
1496
+ vec4f(0.828595970824, -0.439257914866, -0.347104020954, 0.0),
1497
+ vec4f(-0.742856730159, 0.359394167828, -0.564800593652, 0.0),
1498
+ vec4f(0.280304147989, -0.599180039695, -0.749941907518, 0.0),
1499
+ vec4f(-0.607941989895, -0.715415342415, 0.344365249059, 0.0),
1500
+ vec4f(-0.811253470914, -0.344895323764, -0.472138773641, 0.0),
1501
+ vec4f(0.369836643998, 0.322746873758, -0.871237804641, 0.0),
1502
+ vec4f(0.452867157880, -0.881408912551, -0.134274592492, 0.0),
1503
+ vec4f(-0.219930779140, -0.658369178027, -0.719847537893, 0.0),
1504
+ vec4f(-0.404214808693, 0.733089476282, -0.546982822580, 0.0),
1505
+ vec4f(0.887829285854, 0.170674676471, -0.427351511044, 0.0),
1506
+ vec4f(0.213923483450, -0.147817182955, -0.965601793521, 0.0),
1507
+ vec4f(-0.972137411506, 0.064768238220, -0.225286325522, 0.0),
1508
+ vec4f(0.095841516985, 0.986891663629, -0.129843166477, 0.0),
1509
+ vec4f(-0.109262527878, 0.481195157287, -0.869777512129, 0.0),
1510
+ vec4f(-0.549081430333, -0.758619604829, -0.350721938339, 0.0),
1511
+ vec4f(-0.828595970824, 0.439257914866, 0.347104020954, 0.0)
1512
+ );
1513
+
1514
+ fn dggs_h3_get_face_unit_vector_basis(face: u32, basisIndex: u32) -> vec3f {
1515
+ return DGGS_H3_FACE_UNIT_VECTOR_BASES[min(face, 19u) * 3u + min(basisIndex, 2u)].xyz;
1516
+ }
1517
+
1518
+ fn dggs_h3_get_max_dim_by_cii_resolution(resolution: u32) -> i32 {
1519
+ let values = array<i32, 17>(
1520
+ 2, -1, 14, -1, 98, -1, 686, -1, 4802, -1, 33614, -1, 235298, -1, 1647086, -1, 11529602
1521
+ );
1522
+ return values[min(resolution, 16u)];
1523
+ }
1524
+
1525
+ fn dggs_h3_get_unit_vector(digit: u32) -> vec3i {
1526
+ if (digit == 1u) {
1527
+ return vec3i(0, 0, 1);
1528
+ }
1529
+ if (digit == 2u) {
1530
+ return vec3i(0, 1, 0);
1531
+ }
1532
+ if (digit == 3u) {
1533
+ return vec3i(0, 1, 1);
1534
+ }
1535
+ if (digit == 4u) {
1536
+ return vec3i(1, 0, 0);
1537
+ }
1538
+ if (digit == 5u) {
1539
+ return vec3i(1, 0, 1);
1540
+ }
1541
+ if (digit == 6u) {
1542
+ return vec3i(1, 1, 0);
1543
+ }
1544
+ return vec3i(0);
1545
+ }
1546
+
1547
+ fn dggs_h3_ijk_normalize(coord: vec3i) -> vec3i {
1548
+ var normalized = coord;
1549
+ if (normalized.x < 0) {
1550
+ normalized.y -= normalized.x;
1551
+ normalized.z -= normalized.x;
1552
+ normalized.x = 0;
1553
+ }
1554
+ if (normalized.y < 0) {
1555
+ normalized.x -= normalized.y;
1556
+ normalized.z -= normalized.y;
1557
+ normalized.y = 0;
1558
+ }
1559
+ if (normalized.z < 0) {
1560
+ normalized.x -= normalized.z;
1561
+ normalized.y -= normalized.z;
1562
+ normalized.z = 0;
1563
+ }
1564
+
1565
+ let minimumValue = min(normalized.x, min(normalized.y, normalized.z));
1566
+ if (minimumValue > 0) {
1567
+ normalized -= vec3i(minimumValue);
1568
+ }
1569
+ return normalized;
1570
+ }
1571
+
1572
+ fn dggs_h3_neighbor(coord: vec3i, digit: u32) -> vec3i {
1573
+ if (digit > 0u && digit < DGGS_H3_UNUSED_DIGIT) {
1574
+ return dggs_h3_ijk_normalize(coord + dggs_h3_get_unit_vector(digit));
1575
+ }
1576
+ return coord;
1577
+ }
1578
+
1579
+ fn dggs_h3_down_ap3(coord: vec3i) -> vec3i {
1580
+ let iVector = vec3i(2, 0, 1) * coord.x;
1581
+ let jVector = vec3i(1, 2, 0) * coord.y;
1582
+ let kVector = vec3i(0, 1, 2) * coord.z;
1583
+ return dggs_h3_ijk_normalize(iVector + jVector + kVector);
1584
+ }
1585
+
1586
+ fn dggs_h3_down_ap3r(coord: vec3i) -> vec3i {
1587
+ let iVector = vec3i(2, 1, 0) * coord.x;
1588
+ let jVector = vec3i(0, 2, 1) * coord.y;
1589
+ let kVector = vec3i(1, 0, 2) * coord.z;
1590
+ return dggs_h3_ijk_normalize(iVector + jVector + kVector);
1591
+ }
1592
+
1593
+ fn dggs_h3_down_ap7(coord: vec3i) -> vec3i {
1594
+ let iVector = vec3i(3, 0, 1) * coord.x;
1595
+ let jVector = vec3i(1, 3, 0) * coord.y;
1596
+ let kVector = vec3i(0, 1, 3) * coord.z;
1597
+ return dggs_h3_ijk_normalize(iVector + jVector + kVector);
1598
+ }
1599
+
1600
+ fn dggs_h3_down_ap7r(coord: vec3i) -> vec3i {
1601
+ let iVector = vec3i(3, 1, 0) * coord.x;
1602
+ let jVector = vec3i(0, 3, 1) * coord.y;
1603
+ let kVector = vec3i(1, 0, 3) * coord.z;
1604
+ return dggs_h3_ijk_normalize(iVector + jVector + kVector);
1605
+ }
1606
+
1607
+ fn dggs_h3_divide_round_nearest_seven(value: i32) -> i32 {
1608
+ return select((value - 3) / 7, (value + 3) / 7, value >= 0);
1609
+ }
1610
+
1611
+ fn dggs_h3_up_ap7r(coord: vec3i) -> vec3i {
1612
+ let i = coord.x - coord.z;
1613
+ let j = coord.y - coord.z;
1614
+ return dggs_h3_ijk_normalize(vec3i(
1615
+ dggs_h3_divide_round_nearest_seven(2 * i + j),
1616
+ dggs_h3_divide_round_nearest_seven(3 * j - i),
1617
+ 0
1618
+ ));
1619
+ }
1620
+
1621
+ fn dggs_h3_ijk_rotate_60_ccw(coord: vec3i) -> vec3i {
1622
+ let iVector = vec3i(1, 1, 0) * coord.x;
1623
+ let jVector = vec3i(0, 1, 1) * coord.y;
1624
+ let kVector = vec3i(1, 0, 1) * coord.z;
1625
+ return dggs_h3_ijk_normalize(iVector + jVector + kVector);
1626
+ }
1627
+
1628
+ fn dggs_h3_ijk_rotate_60_cw(coord: vec3i) -> vec3i {
1629
+ let iVector = vec3i(1, 0, 1) * coord.x;
1630
+ let jVector = vec3i(1, 1, 0) * coord.y;
1631
+ let kVector = vec3i(0, 1, 1) * coord.z;
1632
+ return dggs_h3_ijk_normalize(iVector + jVector + kVector);
1633
+ }
1634
+
1635
+ fn dggs_h3_rotate_digit_60_cw(digit: u32) -> u32 {
1636
+ let values = array<u32, 8>(0u, 3u, 6u, 2u, 5u, 1u, 4u, 7u);
1637
+ return values[min(digit, 7u)];
1638
+ }
1639
+
1640
+ fn dggs_h3_get_face_neighbor(face: u32, quadrant: u32) -> DggsH3FaceIJK {
1641
+ let neighborFaces = array<vec3u, 20>(
1642
+ vec3u(4u, 1u, 5u),
1643
+ vec3u(0u, 2u, 6u),
1644
+ vec3u(1u, 3u, 7u),
1645
+ vec3u(2u, 4u, 8u),
1646
+ vec3u(3u, 0u, 9u),
1647
+ vec3u(10u, 14u, 0u),
1648
+ vec3u(11u, 10u, 1u),
1649
+ vec3u(12u, 11u, 2u),
1650
+ vec3u(13u, 12u, 3u),
1651
+ vec3u(14u, 13u, 4u),
1652
+ vec3u(5u, 6u, 15u),
1653
+ vec3u(6u, 7u, 16u),
1654
+ vec3u(7u, 8u, 17u),
1655
+ vec3u(8u, 9u, 18u),
1656
+ vec3u(9u, 5u, 19u),
1657
+ vec3u(16u, 19u, 10u),
1658
+ vec3u(17u, 15u, 11u),
1659
+ vec3u(18u, 16u, 12u),
1660
+ vec3u(19u, 17u, 13u),
1661
+ vec3u(15u, 18u, 14u)
1662
+ );
1663
+ let neighborFace = neighborFaces[min(face, 19u)][min(quadrant, 3u) - 1u];
1664
+ let isOuterBand = face < 5u || face >= 15u;
1665
+ var translate = vec3i(0, 2, 2);
1666
+ if (quadrant == 1u) {
1667
+ translate = select(vec3i(2, 2, 0), vec3i(2, 0, 2), isOuterBand);
1668
+ } else if (quadrant == 2u) {
1669
+ translate = select(vec3i(2, 0, 2), vec3i(2, 2, 0), isOuterBand);
1670
+ }
1671
+ var counterClockwiseRotations = 3u;
1672
+ if (isOuterBand && quadrant == 1u) {
1673
+ counterClockwiseRotations = 1u;
1674
+ } else if (isOuterBand && quadrant == 2u) {
1675
+ counterClockwiseRotations = 5u;
1676
+ }
1677
+ return DggsH3FaceIJK(neighborFace, translate, counterClockwiseRotations);
1678
+ }
1679
+
1680
+ fn dggs_h3_adjust_overage_class_ii(
1681
+ input: DggsH3FaceIJK,
1682
+ resolution: u32,
1683
+ pentagonLeading4: bool
1684
+ ) -> DggsH3FaceIJKOverage {
1685
+ var faceIJK = input;
1686
+ let maximumDimension = dggs_h3_get_max_dim_by_cii_resolution(resolution);
1687
+ if (faceIJK.coord.x + faceIJK.coord.y + faceIJK.coord.z <= maximumDimension) {
1688
+ return DggsH3FaceIJKOverage(faceIJK, 0u);
1689
+ }
1690
+
1691
+ var quadrant = 1u;
1692
+ if (faceIJK.coord.z > 0) {
1693
+ quadrant = select(2u, 3u, faceIJK.coord.y > 0);
1694
+ if (quadrant == 2u && pentagonLeading4) {
1695
+ let origin = vec3i(maximumDimension, 0, 0);
1696
+ faceIJK.coord = dggs_h3_ijk_rotate_60_cw(faceIJK.coord - origin) + origin;
1697
+ }
1698
+ }
1699
+
1700
+ let neighbor = dggs_h3_get_face_neighbor(faceIJK.face, quadrant);
1701
+ faceIJK.face = neighbor.face;
1702
+ var rotation = 0u;
1703
+ loop {
1704
+ if (rotation >= neighbor.valid) {
1705
+ break;
1706
+ }
1707
+ faceIJK.coord = dggs_h3_ijk_rotate_60_ccw(faceIJK.coord);
1708
+ rotation += 1u;
1709
+ }
1710
+ faceIJK.coord = dggs_h3_ijk_normalize(
1711
+ faceIJK.coord + neighbor.coord * (maximumDimension / 2)
1712
+ );
1713
+ faceIJK.valid = 1u;
1714
+ return DggsH3FaceIJKOverage(faceIJK, 2u);
1715
+ }
1716
+
1717
+ fn dggs_h3_get_center_face_ijk(index: vec2u) -> DggsH3FaceIJK {
1718
+ if (!dggs_h3_is_valid_cell_id(index)) {
1719
+ return DggsH3FaceIJK(0u, vec3i(0), 0u);
1720
+ }
1721
+
1722
+ let baseCell = dggs_h3_get_base_cell(index);
1723
+ var faceIJK = dggs_h3_get_base_cell_home(baseCell);
1724
+ let cellResolution = dggs_h3_get_resolution(index);
1725
+ let isPentagonBaseCell = dggs_h3_is_base_cell_pentagon(baseCell);
1726
+ let leadingDigit = dggs_h3_get_leading_non_zero_digit(index);
1727
+ let rotateDigits = isPentagonBaseCell && leadingDigit == 5u;
1728
+ var resolution = 1u;
1729
+ loop {
1730
+ if (resolution > cellResolution) {
1731
+ break;
1732
+ }
1733
+
1734
+ if (dggs_h3_is_resolution_class_iii(resolution)) {
1735
+ faceIJK.coord = dggs_h3_down_ap7(faceIJK.coord);
1736
+ } else {
1737
+ faceIJK.coord = dggs_h3_down_ap7r(faceIJK.coord);
1738
+ }
1739
+ var digit = dggs_h3_get_digit(index, resolution);
1740
+ if (rotateDigits) {
1741
+ digit = dggs_h3_rotate_digit_60_cw(digit);
1742
+ }
1743
+ faceIJK.coord = dggs_h3_neighbor(faceIJK.coord, digit);
1744
+ resolution += 1u;
1745
+ }
1746
+
1747
+ let originalCoord = faceIJK.coord;
1748
+ var adjustedResolution = cellResolution;
1749
+ if (dggs_h3_is_resolution_class_iii(cellResolution)) {
1750
+ faceIJK.coord = dggs_h3_down_ap7r(faceIJK.coord);
1751
+ adjustedResolution += 1u;
1752
+ }
1753
+
1754
+ var adjustment = dggs_h3_adjust_overage_class_ii(
1755
+ faceIJK,
1756
+ adjustedResolution,
1757
+ isPentagonBaseCell && leadingDigit == 4u
1758
+ );
1759
+ if (adjustment.overage != 0u) {
1760
+ faceIJK = adjustment.faceIJK;
1761
+ if (isPentagonBaseCell) {
1762
+ var adjustmentCount = 0u;
1763
+ loop {
1764
+ if (adjustmentCount >= 4u) {
1765
+ break;
1766
+ }
1767
+ adjustment = dggs_h3_adjust_overage_class_ii(faceIJK, adjustedResolution, false);
1768
+ if (adjustment.overage == 0u) {
1769
+ break;
1770
+ }
1771
+ faceIJK = adjustment.faceIJK;
1772
+ adjustmentCount += 1u;
1773
+ }
1774
+ }
1775
+ if (adjustedResolution != cellResolution) {
1776
+ faceIJK.coord = dggs_h3_up_ap7r(faceIJK.coord);
1777
+ }
1778
+ } else if (adjustedResolution != cellResolution) {
1779
+ faceIJK.coord = originalCoord;
1780
+ }
1781
+ return faceIJK;
1782
+ }
1783
+
1784
+ fn dggs_h3_get_vertex_offset(resolution: u32, vertexIndex: u32) -> vec3i {
1785
+ let pointIndex = vertexIndex % 6u;
1786
+ if (dggs_h3_is_resolution_class_iii(resolution)) {
1787
+ let vertices = array<vec3i, 6>(
1788
+ vec3i(5, 4, 0),
1789
+ vec3i(1, 5, 0),
1790
+ vec3i(0, 5, 4),
1791
+ vec3i(0, 1, 5),
1792
+ vec3i(4, 0, 5),
1793
+ vec3i(5, 0, 1)
1794
+ );
1795
+ return vertices[pointIndex];
1796
+ }
1797
+
1798
+ let vertices = array<vec3i, 6>(
1799
+ vec3i(2, 1, 0),
1800
+ vec3i(1, 2, 0),
1801
+ vec3i(0, 2, 1),
1802
+ vec3i(0, 1, 2),
1803
+ vec3i(1, 0, 2),
1804
+ vec3i(2, 0, 1)
1805
+ );
1806
+ return vertices[pointIndex];
1807
+ }
1808
+
1809
+ // Boundary generation retains the original home-face coordinates. Center projection applies face
1810
+ // overage separately because rewriting the center face changes the substrate vertex construction.
1811
+ fn dggs_h3_get_boundary_center_face_ijk(index: vec2u) -> DggsH3FaceIJK {
1812
+ if (!dggs_h3_is_valid_cell_id(index)) {
1813
+ return DggsH3FaceIJK(0u, vec3i(0), 0u);
1814
+ }
1815
+ let baseCell = dggs_h3_get_base_cell(index);
1816
+ if (dggs_h3_is_base_cell_pentagon(baseCell)) {
1817
+ return DggsH3FaceIJK(0u, vec3i(0), 0u);
1818
+ }
1819
+
1820
+ var faceIJK = dggs_h3_get_base_cell_home(baseCell);
1821
+ let cellResolution = dggs_h3_get_resolution(index);
1822
+ var resolution = 1u;
1823
+ loop {
1824
+ if (resolution > cellResolution) {
1825
+ break;
1826
+ }
1827
+ if (dggs_h3_is_resolution_class_iii(resolution)) {
1828
+ faceIJK.coord = dggs_h3_down_ap7(faceIJK.coord);
1829
+ } else {
1830
+ faceIJK.coord = dggs_h3_down_ap7r(faceIJK.coord);
1831
+ }
1832
+ faceIJK.coord = dggs_h3_neighbor(faceIJK.coord, dggs_h3_get_digit(index, resolution));
1833
+ resolution += 1u;
1834
+ }
1835
+ return faceIJK;
1836
+ }
1837
+
1838
+ fn dggs_h3_get_boundary_vertex(index: vec2u, vertexIndex: u32) -> DggsH3BoundaryVertex {
1839
+ let center = dggs_h3_get_boundary_center_face_ijk(index);
1840
+ if (center.valid == 0u) {
1841
+ return DggsH3BoundaryVertex(0u, vec3i(0), 0u, 0u);
1842
+ }
1843
+
1844
+ let cellResolution = dggs_h3_get_resolution(index);
1845
+ var adjustedResolution = cellResolution;
1846
+ var centerCoord = dggs_h3_down_ap3r(dggs_h3_down_ap3(center.coord));
1847
+ if (dggs_h3_is_resolution_class_iii(cellResolution)) {
1848
+ centerCoord = dggs_h3_down_ap7r(centerCoord);
1849
+ adjustedResolution += 1u;
1850
+ }
1851
+
1852
+ let vertexCoord = dggs_h3_ijk_normalize(
1853
+ centerCoord + dggs_h3_get_vertex_offset(cellResolution, vertexIndex)
1854
+ );
1855
+ let maximumDimension = dggs_h3_get_max_dim_by_cii_resolution(adjustedResolution) * 3;
1856
+ let vertexDimension = vertexCoord.x + vertexCoord.y + vertexCoord.z;
1857
+ if (vertexDimension >= maximumDimension) {
1858
+ return DggsH3BoundaryVertex(center.face, vertexCoord, adjustedResolution, 0u);
1859
+ }
1860
+
1861
+ return DggsH3BoundaryVertex(center.face, vertexCoord, adjustedResolution, 1u);
1862
+ }
1863
+
1864
+ fn dggs_h3_is_single_face_boundary(index: vec2u) -> bool {
1865
+ var vertexIndex = 0u;
1866
+ loop {
1867
+ if (vertexIndex >= 6u) {
1868
+ break;
1869
+ }
1870
+ if (dggs_h3_get_boundary_vertex(index, vertexIndex).valid == 0u) {
1871
+ return false;
1872
+ }
1873
+ vertexIndex += 1u;
1874
+ }
1875
+ return true;
1876
+ }
1877
+
1878
+ fn dggs_h3_ijk_to_hex2d(coord: vec3i) -> vec2f {
1879
+ let i = f32(coord.x - coord.z);
1880
+ let j = f32(coord.y - coord.z);
1881
+ return vec2f(i - 0.5 * j, j * DGGS_H3_SQRT3_2);
1882
+ }
1883
+
1884
+ fn dggs_h3_get_center_unit_vector(index: vec2u) -> vec3f {
1885
+ let center = dggs_h3_get_center_face_ijk(index);
1886
+ if (center.valid == 0u) {
1887
+ return vec3f(0.0);
1888
+ }
1889
+
1890
+ var hexPoint = dggs_h3_ijk_to_hex2d(center.coord);
1891
+ let resolution = dggs_h3_get_resolution(index);
1892
+ if (dggs_h3_is_resolution_class_iii(resolution)) {
1893
+ hexPoint = vec2f(
1894
+ 0.944911182523 * hexPoint.x - 0.327326835354 * hexPoint.y,
1895
+ 0.327326835354 * hexPoint.x + 0.944911182523 * hexPoint.y
1896
+ );
1897
+ }
1898
+ var scale = DGGS_H3_RES0_U_GNOMONIC;
1899
+ var resolutionIndex = 0u;
1900
+ loop {
1901
+ if (resolutionIndex >= resolution) {
1902
+ break;
1903
+ }
1904
+ scale *= DGGS_H3_RSQRT7;
1905
+ resolutionIndex += 1u;
1906
+ }
1907
+ return normalize(
1908
+ dggs_h3_get_face_unit_vector_basis(center.face, 0u) +
1909
+ scale * (
1910
+ hexPoint.x * dggs_h3_get_face_unit_vector_basis(center.face, 1u) +
1911
+ hexPoint.y * dggs_h3_get_face_unit_vector_basis(center.face, 2u)
1912
+ )
1913
+ );
1914
+ }
1915
+
1916
+ fn dggs_h3_get_center_lnglat(index: vec2u) -> vec2f {
1917
+ let unitVector = dggs_h3_get_center_unit_vector(index);
1918
+ if (dot(unitVector, unitVector) < 0.5) {
1919
+ return vec2f(0.0);
1920
+ }
1921
+ return vec2f(
1922
+ atan2(unitVector.y, unitVector.x) * DGGS_RADIANS_TO_DEGREES,
1923
+ atan2(unitVector.z, length(unitVector.xy)) * DGGS_RADIANS_TO_DEGREES
1924
+ );
1925
+ }
1926
+
1927
+ fn dggs_h3_geo_az_distance_rads(center: vec2f, azimuth: f32, distance: f32) -> vec2f {
1928
+ if (distance < 1.0e-7) {
1929
+ return center;
1930
+ }
1931
+
1932
+ let positiveAzimuth = dggs_h3_positive_angle_rads(azimuth);
1933
+ let latitude = asin(clamp(
1934
+ sin(center.x) * cos(distance) + cos(center.x) * sin(distance) * cos(positiveAzimuth),
1935
+ -1.0,
1936
+ 1.0
1937
+ ));
1938
+ var longitude = 0.0;
1939
+ if (abs(latitude - DGGS_PI_OVER_2) < 1.0e-7) {
1940
+ return vec2f(DGGS_PI_OVER_2, 0.0);
1941
+ }
1942
+ if (abs(latitude + DGGS_PI_OVER_2) < 1.0e-7) {
1943
+ return vec2f(-DGGS_PI_OVER_2, 0.0);
1944
+ }
1945
+
1946
+ let inverseCosLatitude = 1.0 / max(cos(latitude), 1.0e-8);
1947
+ let sinLongitude = clamp(
1948
+ sin(positiveAzimuth) * sin(distance) * inverseCosLatitude,
1949
+ -1.0,
1950
+ 1.0
1951
+ );
1952
+ let cosLongitude = clamp(
1953
+ (cos(distance) - sin(center.x) * sin(latitude)) / max(cos(center.x), 1.0e-8) *
1954
+ inverseCosLatitude,
1955
+ -1.0,
1956
+ 1.0
1957
+ );
1958
+ longitude = dggs_h3_constrain_longitude(center.y + atan2(sinLongitude, cosLongitude));
1959
+ return vec2f(latitude, longitude);
1960
+ }
1961
+
1962
+ fn dggs_h3_hex2d_to_lnglat(point: vec2f, face: u32, resolution: u32, substrate: bool) -> vec2f {
1963
+ var radius = length(point);
1964
+ let center = dggs_h3_get_face_center_geo(face);
1965
+ if (radius < 1.0e-7) {
1966
+ return vec2f(center.y * DGGS_RADIANS_TO_DEGREES, center.x * DGGS_RADIANS_TO_DEGREES);
1967
+ }
1968
+
1969
+ var theta = atan2(point.y, point.x);
1970
+ var resolutionIndex = 0u;
1971
+ loop {
1972
+ if (resolutionIndex >= resolution) {
1973
+ break;
1974
+ }
1975
+ radius *= DGGS_H3_RSQRT7;
1976
+ resolutionIndex += 1u;
1977
+ }
1978
+
1979
+ if (substrate) {
1980
+ radius *= DGGS_H3_ONETHIRD;
1981
+ if (dggs_h3_is_resolution_class_iii(resolution)) {
1982
+ radius *= DGGS_H3_RSQRT7;
1983
+ }
1984
+ } else if (dggs_h3_is_resolution_class_iii(resolution)) {
1985
+ theta = dggs_h3_positive_angle_rads(theta + DGGS_H3_AP7_ROT_RADS);
1986
+ }
1987
+
1988
+ radius = atan(radius * DGGS_H3_RES0_U_GNOMONIC);
1989
+ theta = dggs_h3_positive_angle_rads(dggs_h3_get_face_axis_azimuths(face).x - theta);
1990
+ let latitudeLongitude = dggs_h3_geo_az_distance_rads(center, theta, radius);
1991
+ return vec2f(
1992
+ latitudeLongitude.y * DGGS_RADIANS_TO_DEGREES,
1993
+ latitudeLongitude.x * DGGS_RADIANS_TO_DEGREES
1994
+ );
1995
+ }
1996
+
1997
+ fn dggs_h3_get_boundary_point(index: vec2u, vertexIndex: u32) -> vec2f {
1998
+ if (!dggs_h3_is_single_face_boundary(index)) {
1999
+ return vec2f(0.0);
2000
+ }
2001
+
2002
+ let vertex = dggs_h3_get_boundary_vertex(index, vertexIndex % 6u);
2003
+ let hexPoint = dggs_h3_ijk_to_hex2d(vertex.coord);
2004
+ return dggs_h3_hex2d_to_lnglat(hexPoint, vertex.face, vertex.resolution, true);
2005
+ }
2006
+
2007
+ fn dggs_h3_get_boundary_point_fp64_split(index: vec2u, vertexIndex: u32) -> vec4f {
2008
+ return dggs_boundary_point_to_fp64_split(dggs_h3_get_boundary_point(index, vertexIndex));
2009
+ }
2010
+
2011
+ fn dggs_s2_get_face(index: vec2u) -> u32 {
2012
+ return dggs_u64_extract_bits(index, 61u, 3u);
2013
+ }
2014
+
2015
+ fn dggs_s2_get_level(index: vec2u) -> u32 {
2016
+ let trailingZeros = dggs_u64_count_trailing_zeros(index);
2017
+ if (trailingZeros > 60u) {
2018
+ return 0u;
2019
+ }
2020
+ return DGGS_S2_MAX_LEVEL - trailingZeros / 2u;
2021
+ }
2022
+
2023
+ fn dggs_s2_is_valid_cell_id(index: vec2u) -> bool {
2024
+ let trailingZeros = dggs_u64_count_trailing_zeros(index);
2025
+ return !dggs_u64_is_zero(index) &&
2026
+ dggs_s2_get_face(index) <= 5u &&
2027
+ trailingZeros <= 60u &&
2028
+ trailingZeros % 2u == 0u;
2029
+ }
2030
+
2031
+ fn dggs_s2_get_child_position(index: vec2u, level: u32) -> u32 {
2032
+ if (level == 0u || level > DGGS_S2_MAX_LEVEL) {
2033
+ return 0u;
2034
+ }
2035
+ return dggs_u64_extract_bits(index, 2u * (DGGS_S2_MAX_LEVEL - level) + 1u, 2u);
2036
+ }
2037
+
2038
+ // Packed geohash keys store the geohash length in bits 60..63 and right-align
2039
+ // the base32 character codes in the lower 60 bits, first character first.
2040
+ fn dggs_geohash_get_length(index: vec2u) -> u32 {
2041
+ return min(
2042
+ dggs_u64_extract_bits(index, DGGS_GEOHASH_LENGTH_BIT_OFFSET, 4u),
2043
+ DGGS_GEOHASH_MAX_LENGTH
2044
+ );
2045
+ }
2046
+
2047
+ fn dggs_geohash_get_character(index: vec2u, characterIndex: u32) -> u32 {
2048
+ let length = dggs_geohash_get_length(index);
2049
+ if (characterIndex >= length) {
2050
+ return 0u;
2051
+ }
2052
+ return dggs_u64_extract_bits(index, 5u * (length - characterIndex - 1u), 5u);
2053
+ }
2054
+
2055
+ // Returns vec4(west, south, east, north) in longitude/latitude degrees.
2056
+ fn dggs_geohash_get_bounds(index: vec2u) -> vec4f {
2057
+ let length = dggs_geohash_get_length(index);
2058
+ var west = -180.0;
2059
+ var east = 180.0;
2060
+ var south = -90.0;
2061
+ var north = 90.0;
2062
+ var isLongitude = true;
2063
+ var characterIndex = 0u;
2064
+ loop {
2065
+ if (characterIndex >= length) {
2066
+ break;
2067
+ }
2068
+
2069
+ let character = dggs_geohash_get_character(index, characterIndex);
2070
+ var bitIndex = 0u;
2071
+ loop {
2072
+ if (bitIndex >= 5u) {
2073
+ break;
2074
+ }
2075
+
2076
+ let bit = (character >> (4u - bitIndex)) & 1u;
2077
+ if (isLongitude) {
2078
+ let midpoint = (west + east) * 0.5;
2079
+ if (bit == 0u) {
2080
+ east = midpoint;
2081
+ } else {
2082
+ west = midpoint;
2083
+ }
2084
+ } else {
2085
+ let midpoint = (south + north) * 0.5;
2086
+ if (bit == 0u) {
2087
+ north = midpoint;
2088
+ } else {
2089
+ south = midpoint;
2090
+ }
2091
+ }
2092
+ isLongitude = !isLongitude;
2093
+ bitIndex += 1u;
2094
+ }
2095
+ characterIndex += 1u;
2096
+ }
2097
+
2098
+ return vec4f(west, south, east, north);
2099
+ }
2100
+
2101
+ fn dggs_bounds_get_boundary_point(bounds: vec4f, vertexIndex: u32) -> vec2f {
2102
+ let pointIndex = vertexIndex % 4u;
2103
+ if (pointIndex == 0u) {
2104
+ return vec2f(bounds.x, bounds.w);
2105
+ }
2106
+ if (pointIndex == 1u) {
2107
+ return vec2f(bounds.z, bounds.w);
2108
+ }
2109
+ if (pointIndex == 2u) {
2110
+ return vec2f(bounds.z, bounds.y);
2111
+ }
2112
+ return vec2f(bounds.x, bounds.y);
2113
+ }
2114
+
2115
+ fn dggs_geohash_get_boundary_point(index: vec2u, vertexIndex: u32) -> vec2f {
2116
+ return dggs_bounds_get_boundary_point(dggs_geohash_get_bounds(index), vertexIndex);
2117
+ }
2118
+
2119
+ fn dggs_geohash_get_boundary_point_fp64_split(index: vec2u, vertexIndex: u32) -> vec4f {
2120
+ return dggs_boundary_point_to_fp64_split(dggs_geohash_get_boundary_point(index, vertexIndex));
2121
+ }
2122
+
2123
+ // Packed quadkey keys store the quadkey length in bits 58..63 and right-align
2124
+ // the base4 digits in the lower 58 bits, first digit first.
2125
+ fn dggs_quadkey_get_length(index: vec2u) -> u32 {
2126
+ return min(
2127
+ dggs_u64_extract_bits(index, DGGS_QUADKEY_LENGTH_BIT_OFFSET, 6u),
2128
+ DGGS_QUADKEY_MAX_LENGTH
2129
+ );
2130
+ }
2131
+
2132
+ fn dggs_quadkey_get_digit(index: vec2u, digitIndex: u32) -> u32 {
2133
+ let length = dggs_quadkey_get_length(index);
2134
+ if (digitIndex >= length) {
2135
+ return 0u;
2136
+ }
2137
+ return dggs_u64_extract_bits(index, 2u * (length - digitIndex - 1u), 2u);
2138
+ }
2139
+
2140
+ fn dggs_quadkey_get_tile(index: vec2u) -> vec3u {
2141
+ let length = dggs_quadkey_get_length(index);
2142
+ var tileX = 0u;
2143
+ var tileY = 0u;
2144
+ var digitIndex = 0u;
2145
+ loop {
2146
+ if (digitIndex >= length) {
2147
+ break;
2148
+ }
2149
+
2150
+ let digit = dggs_quadkey_get_digit(index, digitIndex);
2151
+ let mask = 1u << (length - digitIndex - 1u);
2152
+ if ((digit & 1u) != 0u) {
2153
+ tileX |= mask;
2154
+ }
2155
+ if ((digit & 2u) != 0u) {
2156
+ tileY |= mask;
2157
+ }
2158
+ digitIndex += 1u;
2159
+ }
2160
+ return vec3u(tileX, tileY, length);
2161
+ }
2162
+
2163
+ fn dggs_web_mercator_tile_y_to_latitude(tileY: f32, tileScale: f32) -> f32 {
2164
+ let mercatorY = DGGS_PI * (1.0 - 2.0 * tileY / tileScale);
2165
+ return (2.0 * atan(exp(mercatorY)) - DGGS_PI * 0.5) * DGGS_RADIANS_TO_DEGREES;
2166
+ }
2167
+
2168
+ // Returns vec4(west, south, east, north) in longitude/latitude degrees.
2169
+ fn dggs_quadkey_get_bounds(index: vec2u) -> vec4f {
2170
+ let tile = dggs_quadkey_get_tile(index);
2171
+ let tileScale = f32(1u << tile.z);
2172
+ let west = f32(tile.x) / tileScale * 360.0 - 180.0;
2173
+ let east = f32(tile.x + 1u) / tileScale * 360.0 - 180.0;
2174
+ let north = dggs_web_mercator_tile_y_to_latitude(f32(tile.y), tileScale);
2175
+ let south = dggs_web_mercator_tile_y_to_latitude(f32(tile.y + 1u), tileScale);
2176
+ return vec4f(west, south, east, north);
2177
+ }
2178
+
2179
+ fn dggs_quadkey_get_boundary_point(index: vec2u, vertexIndex: u32) -> vec2f {
2180
+ return dggs_bounds_get_boundary_point(dggs_quadkey_get_bounds(index), vertexIndex);
2181
+ }
2182
+
2183
+ fn dggs_quadkey_get_boundary_point_fp64_split(index: vec2u, vertexIndex: u32) -> vec4f {
2184
+ return dggs_boundary_point_to_fp64_split(dggs_quadkey_get_boundary_point(index, vertexIndex));
2185
+ }
2186
+
2187
+ fn dggs_s2_digit_to_xy(digit: u32) -> vec2u {
2188
+ if (digit == 1u) {
2189
+ return vec2u(0u, 1u);
2190
+ }
2191
+ if (digit == 2u) {
2192
+ return vec2u(1u, 1u);
2193
+ }
2194
+ if (digit == 3u) {
2195
+ return vec2u(1u, 0u);
2196
+ }
2197
+ return vec2u(0u, 0u);
2198
+ }
2199
+
2200
+ fn dggs_s2_rotate_and_flip_quadrant(size: u32, point: vec2u, digitXY: vec2u) -> vec2u {
2201
+ var result = point;
2202
+ if (digitXY.y == 0u) {
2203
+ if (digitXY.x == 1u) {
2204
+ result = vec2u(size - 1u - result.x, size - 1u - result.y);
2205
+ }
2206
+ result = result.yx;
2207
+ }
2208
+ return result;
2209
+ }
2210
+
2211
+ fn dggs_s2_get_ij(index: vec2u) -> vec2u {
2212
+ let level = dggs_s2_get_level(index);
2213
+ var point = vec2u(0u);
2214
+ var hilbertLevel = 1u;
2215
+ loop {
2216
+ if (hilbertLevel > level) {
2217
+ break;
2218
+ }
2219
+ let digitLevel = level - hilbertLevel + 1u;
2220
+ let digitXY = dggs_s2_digit_to_xy(dggs_s2_get_child_position(index, digitLevel));
2221
+ let size = 1u << (hilbertLevel - 1u);
2222
+ point = dggs_s2_rotate_and_flip_quadrant(size, point, digitXY);
2223
+ point += size * digitXY;
2224
+ hilbertLevel += 1u;
2225
+ }
2226
+ if ((dggs_s2_get_face(index) & 1u) != 0u) {
2227
+ point = point.yx;
2228
+ }
2229
+ return point;
2230
+ }
2231
+
2232
+ fn dggs_s2_single_st_to_uv(st: f32) -> f32 {
2233
+ if (st >= 0.5) {
2234
+ return (4.0 * st * st - 1.0) / 3.0;
2235
+ }
2236
+ return (1.0 - 4.0 * (1.0 - st) * (1.0 - st)) / 3.0;
2237
+ }
2238
+
2239
+ fn dggs_s2_ij_to_st(ij: vec2u, level: u32, offset: vec2f) -> vec2f {
2240
+ let maxSize = f32(1u << level);
2241
+ return (vec2f(f32(ij.x), f32(ij.y)) + offset) / maxSize;
2242
+ }
2243
+
2244
+ fn dggs_s2_st_to_uv(st: vec2f) -> vec2f {
2245
+ return vec2f(dggs_s2_single_st_to_uv(st.x), dggs_s2_single_st_to_uv(st.y));
2246
+ }
2247
+
2248
+ fn dggs_s2_face_uv_to_xyz(face: u32, uv: vec2f) -> vec3f {
2249
+ if (face == 0u) {
2250
+ return vec3f(1.0, uv.x, uv.y);
2251
+ }
2252
+ if (face == 1u) {
2253
+ return vec3f(-uv.x, 1.0, uv.y);
2254
+ }
2255
+ if (face == 2u) {
2256
+ return vec3f(-uv.x, -uv.y, 1.0);
2257
+ }
2258
+ if (face == 3u) {
2259
+ return vec3f(-1.0, -uv.y, -uv.x);
2260
+ }
2261
+ if (face == 4u) {
2262
+ return vec3f(uv.y, -1.0, -uv.x);
2263
+ }
2264
+ return vec3f(uv.y, uv.x, -1.0);
2265
+ }
2266
+
2267
+ fn dggs_s2_xyz_to_lnglat(xyz: vec3f) -> vec2f {
2268
+ let latitude = atan2(xyz.z, length(xyz.xy)) * DGGS_RADIANS_TO_DEGREES;
2269
+ let longitude = atan2(xyz.y, xyz.x) * DGGS_RADIANS_TO_DEGREES;
2270
+ return vec2f(longitude, latitude);
2271
+ }
2272
+
2273
+ fn dggs_s2_get_boundary_offset(vertexIndex: u32) -> vec2f {
2274
+ let pointIndex = vertexIndex % 4u;
2275
+ if (pointIndex == 1u) {
2276
+ return vec2f(0.0, 1.0);
2277
+ }
2278
+ if (pointIndex == 2u) {
2279
+ return vec2f(1.0, 1.0);
2280
+ }
2281
+ if (pointIndex == 3u) {
2282
+ return vec2f(1.0, 0.0);
2283
+ }
2284
+ return vec2f(0.0, 0.0);
2285
+ }
2286
+
2287
+ fn dggs_s2_get_boundary_point(index: vec2u, vertexIndex: u32) -> vec2f {
2288
+ let level = dggs_s2_get_level(index);
2289
+ let ij = dggs_s2_get_ij(index);
2290
+ let st = dggs_s2_ij_to_st(ij, level, dggs_s2_get_boundary_offset(vertexIndex));
2291
+ let uv = dggs_s2_st_to_uv(st);
2292
+ let xyz = dggs_s2_face_uv_to_xyz(dggs_s2_get_face(index), uv);
2293
+ return dggs_s2_xyz_to_lnglat(xyz);
2294
+ }
2295
+
2296
+ fn dggs_s2_get_boundary_point_fp64_split(index: vec2u, vertexIndex: u32) -> vec4f {
2297
+ return dggs_boundary_point_to_fp64_split(dggs_s2_get_boundary_point(index, vertexIndex));
2298
+ }
2299
+ `
2300
+ );
2301
+ // Annotate the CommonJS export names for ESM import in node:
2302
+ 0 && (module.exports = {
2303
+ dggsWGSL
2304
+ });