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

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