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

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