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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (699) hide show
  1. package/LICENSE +38 -0
  2. package/README.md +25 -2
  3. package/dist/dist.dev.js +19880 -0
  4. package/dist/dist.min.js +12192 -0
  5. package/dist/glsl.cjs +33 -0
  6. package/dist/glsl.cjs.map +6 -0
  7. package/dist/glsl.d.ts +6 -0
  8. package/dist/glsl.d.ts.map +1 -0
  9. package/dist/glsl.js +7 -0
  10. package/dist/glsl.js.map +1 -0
  11. package/dist/index.cjs +243 -0
  12. package/dist/index.cjs.map +6 -0
  13. package/dist/index.d.ts +91 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +65 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/lib/color/normalize-byte-colors.cjs +50 -0
  18. package/dist/lib/color/normalize-byte-colors.d.ts +23 -0
  19. package/dist/lib/color/normalize-byte-colors.d.ts.map +1 -0
  20. package/dist/lib/color/normalize-byte-colors.js +42 -0
  21. package/dist/lib/color/normalize-byte-colors.js.map +1 -0
  22. package/dist/lib/filters/prop-types.cjs +90 -0
  23. package/dist/lib/filters/prop-types.d.ts +44 -0
  24. package/dist/lib/filters/prop-types.d.ts.map +1 -0
  25. package/dist/lib/filters/prop-types.js +96 -0
  26. package/dist/lib/filters/prop-types.js.map +1 -0
  27. package/dist/lib/glsl-shader-assembler.cjs +50 -0
  28. package/dist/lib/glsl-shader-assembler.d.ts +19 -0
  29. package/dist/lib/glsl-shader-assembler.d.ts.map +1 -0
  30. package/dist/lib/glsl-shader-assembler.js +29 -0
  31. package/dist/lib/glsl-shader-assembler.js.map +1 -0
  32. package/dist/lib/glsl-utils/get-shader-info.cjs +52 -0
  33. package/dist/lib/glsl-utils/get-shader-info.d.ts +9 -0
  34. package/dist/lib/glsl-utils/get-shader-info.d.ts.map +1 -0
  35. package/dist/lib/glsl-utils/get-shader-info.js +33 -0
  36. package/dist/lib/glsl-utils/get-shader-info.js.map +1 -0
  37. package/dist/lib/glsl-utils/shader-utils.cjs +126 -0
  38. package/dist/lib/glsl-utils/shader-utils.d.ts +23 -0
  39. package/dist/lib/glsl-utils/shader-utils.d.ts.map +1 -0
  40. package/dist/lib/glsl-utils/shader-utils.js +92 -0
  41. package/dist/lib/glsl-utils/shader-utils.js.map +1 -0
  42. package/dist/lib/preprocessor/preprocessor.cjs +128 -0
  43. package/dist/lib/preprocessor/preprocessor.d.ts +15 -0
  44. package/dist/lib/preprocessor/preprocessor.d.ts.map +1 -0
  45. package/dist/lib/preprocessor/preprocessor.js +120 -0
  46. package/dist/lib/preprocessor/preprocessor.js.map +1 -0
  47. package/dist/lib/shader-assembler-base.cjs +132 -0
  48. package/dist/lib/shader-assembler-base.d.ts +51 -0
  49. package/dist/lib/shader-assembler-base.d.ts.map +1 -0
  50. package/dist/lib/shader-assembler-base.js +127 -0
  51. package/dist/lib/shader-assembler-base.js.map +1 -0
  52. package/dist/lib/shader-assembler.cjs +33 -0
  53. package/dist/lib/shader-assembler.d.ts +4 -0
  54. package/dist/lib/shader-assembler.d.ts.map +1 -0
  55. package/dist/lib/shader-assembler.js +7 -0
  56. package/dist/lib/shader-assembler.js.map +1 -0
  57. package/dist/lib/shader-assembly/assemble-glsl-shaders.cjs +181 -0
  58. package/dist/lib/shader-assembly/assemble-glsl-shaders.d.ts +70 -0
  59. package/dist/lib/shader-assembly/assemble-glsl-shaders.d.ts.map +1 -0
  60. package/dist/lib/shader-assembly/assemble-glsl-shaders.js +208 -0
  61. package/dist/lib/shader-assembly/assemble-glsl-shaders.js.map +1 -0
  62. package/dist/lib/shader-assembly/assemble-shaders.cjs +42 -0
  63. package/dist/lib/shader-assembly/assemble-shaders.d.ts +10 -0
  64. package/dist/lib/shader-assembly/assemble-shaders.d.ts.map +1 -0
  65. package/dist/lib/shader-assembly/assemble-shaders.js +10 -0
  66. package/dist/lib/shader-assembly/assemble-shaders.js.map +1 -0
  67. package/dist/lib/shader-assembly/assemble-wgsl-shaders.cjs +498 -0
  68. package/dist/lib/shader-assembly/assemble-wgsl-shaders.d.ts +70 -0
  69. package/dist/lib/shader-assembly/assemble-wgsl-shaders.d.ts.map +1 -0
  70. package/dist/lib/shader-assembly/assemble-wgsl-shaders.js +480 -0
  71. package/dist/lib/shader-assembly/assemble-wgsl-shaders.js.map +1 -0
  72. package/dist/lib/shader-assembly/platform-defines.cjs +79 -0
  73. package/dist/lib/shader-assembly/platform-defines.d.ts +4 -0
  74. package/dist/lib/shader-assembly/platform-defines.d.ts.map +1 -0
  75. package/dist/lib/shader-assembly/platform-defines.js +52 -0
  76. package/dist/lib/shader-assembly/platform-defines.js.map +1 -0
  77. package/dist/lib/shader-assembly/platform-info.cjs +15 -0
  78. package/dist/lib/shader-assembly/platform-info.d.ts +20 -0
  79. package/dist/lib/shader-assembly/platform-info.d.ts.map +1 -0
  80. package/dist/lib/shader-assembly/platform-info.js +5 -0
  81. package/dist/lib/shader-assembly/platform-info.js.map +1 -0
  82. package/dist/lib/shader-assembly/shader-assembly-shared.cjs +96 -0
  83. package/dist/lib/shader-assembly/shader-assembly-shared.d.ts +16 -0
  84. package/dist/lib/shader-assembly/shader-assembly-shared.d.ts.map +1 -0
  85. package/dist/lib/shader-assembly/shader-assembly-shared.js +79 -0
  86. package/dist/lib/shader-assembly/shader-assembly-shared.js.map +1 -0
  87. package/dist/lib/shader-assembly/shader-assembly-types.cjs +15 -0
  88. package/dist/lib/shader-assembly/shader-assembly-types.d.ts +132 -0
  89. package/dist/lib/shader-assembly/shader-assembly-types.d.ts.map +1 -0
  90. package/dist/lib/shader-assembly/shader-assembly-types.js +5 -0
  91. package/dist/lib/shader-assembly/shader-assembly-types.js.map +1 -0
  92. package/dist/lib/shader-assembly/shader-injection-targets.cjs +103 -0
  93. package/dist/lib/shader-assembly/shader-injection-targets.d.ts +46 -0
  94. package/dist/lib/shader-assembly/shader-injection-targets.d.ts.map +1 -0
  95. package/dist/lib/shader-assembly/shader-injection-targets.js +83 -0
  96. package/dist/lib/shader-assembly/shader-injection-targets.js.map +1 -0
  97. package/dist/lib/shader-assembly/shader-injections.cjs +204 -0
  98. package/dist/lib/shader-assembly/shader-injections.d.ts +49 -0
  99. package/dist/lib/shader-assembly/shader-injections.d.ts.map +1 -0
  100. package/dist/lib/shader-assembly/shader-injections.js +207 -0
  101. package/dist/lib/shader-assembly/shader-injections.js.map +1 -0
  102. package/dist/lib/shader-assembly/shader-plugin-varyings.cjs +434 -0
  103. package/dist/lib/shader-assembly/shader-plugin-varyings.d.ts +15 -0
  104. package/dist/lib/shader-assembly/shader-plugin-varyings.d.ts.map +1 -0
  105. package/dist/lib/shader-assembly/shader-plugin-varyings.js +438 -0
  106. package/dist/lib/shader-assembly/shader-plugin-varyings.js.map +1 -0
  107. package/dist/lib/shader-assembly/shader-plugin-vertex-inputs.cjs +254 -0
  108. package/dist/lib/shader-assembly/shader-plugin-vertex-inputs.d.ts +12 -0
  109. package/dist/lib/shader-assembly/shader-plugin-vertex-inputs.d.ts.map +1 -0
  110. package/dist/lib/shader-assembly/shader-plugin-vertex-inputs.js +237 -0
  111. package/dist/lib/shader-assembly/shader-plugin-vertex-inputs.js.map +1 -0
  112. package/dist/lib/shader-assembly/wgsl-binding-debug.cjs +166 -0
  113. package/dist/lib/shader-assembly/wgsl-binding-debug.d.ts +37 -0
  114. package/dist/lib/shader-assembly/wgsl-binding-debug.d.ts.map +1 -0
  115. package/dist/lib/shader-assembly/wgsl-binding-debug.js +144 -0
  116. package/dist/lib/shader-assembly/wgsl-binding-debug.js.map +1 -0
  117. package/dist/lib/shader-assembly/wgsl-binding-scan.cjs +184 -0
  118. package/dist/lib/shader-assembly/wgsl-binding-scan.d.ts +19 -0
  119. package/dist/lib/shader-assembly/wgsl-binding-scan.d.ts.map +1 -0
  120. package/dist/lib/shader-assembly/wgsl-binding-scan.js +151 -0
  121. package/dist/lib/shader-assembly/wgsl-binding-scan.js.map +1 -0
  122. package/dist/lib/shader-assembly/wgsl-injection-target-names.cjs +163 -0
  123. package/dist/lib/shader-assembly/wgsl-injection-target-names.d.ts +8 -0
  124. package/dist/lib/shader-assembly/wgsl-injection-target-names.d.ts.map +1 -0
  125. package/dist/lib/shader-assembly/wgsl-injection-target-names.js +145 -0
  126. package/dist/lib/shader-assembly/wgsl-injection-target-names.js.map +1 -0
  127. package/dist/lib/shader-assembly/wgsl-interface-scan.cjs +502 -0
  128. package/dist/lib/shader-assembly/wgsl-interface-scan.d.ts +14 -0
  129. package/dist/lib/shader-assembly/wgsl-interface-scan.d.ts.map +1 -0
  130. package/dist/lib/shader-assembly/wgsl-interface-scan.js +498 -0
  131. package/dist/lib/shader-assembly/wgsl-interface-scan.js.map +1 -0
  132. package/dist/lib/shader-generator/generate-shader.cjs +36 -0
  133. package/dist/lib/shader-generator/generate-shader.d.ts +8 -0
  134. package/dist/lib/shader-generator/generate-shader.d.ts.map +1 -0
  135. package/dist/lib/shader-generator/generate-shader.js +15 -0
  136. package/dist/lib/shader-generator/generate-shader.js.map +1 -0
  137. package/dist/lib/shader-generator/glsl/generate-glsl.cjs +94 -0
  138. package/dist/lib/shader-generator/glsl/generate-glsl.d.ts +7 -0
  139. package/dist/lib/shader-generator/glsl/generate-glsl.d.ts.map +1 -0
  140. package/dist/lib/shader-generator/glsl/generate-glsl.js +79 -0
  141. package/dist/lib/shader-generator/glsl/generate-glsl.js.map +1 -0
  142. package/dist/lib/shader-generator/utils/capitalize.cjs +29 -0
  143. package/dist/lib/shader-generator/utils/capitalize.d.ts +7 -0
  144. package/dist/lib/shader-generator/utils/capitalize.d.ts.map +1 -0
  145. package/dist/lib/shader-generator/utils/capitalize.js +12 -0
  146. package/dist/lib/shader-generator/utils/capitalize.js.map +1 -0
  147. package/dist/lib/shader-generator/wgsl/generate-wgsl.cjs +46 -0
  148. package/dist/lib/shader-generator/wgsl/generate-wgsl.d.ts +7 -0
  149. package/dist/lib/shader-generator/wgsl/generate-wgsl.d.ts.map +1 -0
  150. package/dist/lib/shader-generator/wgsl/generate-wgsl.js +23 -0
  151. package/dist/lib/shader-generator/wgsl/generate-wgsl.js.map +1 -0
  152. package/dist/lib/shader-module/composite-shader-pass.cjs +15 -0
  153. package/dist/lib/shader-module/composite-shader-pass.d.ts +41 -0
  154. package/dist/lib/shader-module/composite-shader-pass.d.ts.map +1 -0
  155. package/dist/lib/shader-module/composite-shader-pass.js +5 -0
  156. package/dist/lib/shader-module/composite-shader-pass.js.map +1 -0
  157. package/dist/lib/shader-module/shader-module-dependencies.cjs +83 -0
  158. package/dist/lib/shader-module/shader-module-dependencies.d.ts +39 -0
  159. package/dist/lib/shader-module/shader-module-dependencies.d.ts.map +1 -0
  160. package/dist/lib/shader-module/shader-module-dependencies.js +103 -0
  161. package/dist/lib/shader-module/shader-module-dependencies.js.map +1 -0
  162. package/dist/lib/shader-module/shader-module-uniform-layout.cjs +224 -0
  163. package/dist/lib/shader-module/shader-module-uniform-layout.d.ts +91 -0
  164. package/dist/lib/shader-module/shader-module-uniform-layout.d.ts.map +1 -0
  165. package/dist/lib/shader-module/shader-module-uniform-layout.js +253 -0
  166. package/dist/lib/shader-module/shader-module-uniform-layout.js.map +1 -0
  167. package/dist/lib/shader-module/shader-module.cjs +99 -0
  168. package/dist/lib/shader-module/shader-module.d.ts +94 -0
  169. package/dist/lib/shader-module/shader-module.d.ts.map +1 -0
  170. package/dist/lib/shader-module/shader-module.js +101 -0
  171. package/dist/lib/shader-module/shader-module.js.map +1 -0
  172. package/dist/lib/shader-module/shader-pass.cjs +15 -0
  173. package/dist/lib/shader-module/shader-pass.d.ts +48 -0
  174. package/dist/lib/shader-module/shader-pass.d.ts.map +1 -0
  175. package/dist/lib/shader-module/shader-pass.js +5 -0
  176. package/dist/lib/shader-module/shader-pass.js.map +1 -0
  177. package/dist/lib/shader-plugin.cjs +156 -0
  178. package/dist/lib/shader-plugin.d.ts +61 -0
  179. package/dist/lib/shader-plugin.d.ts.map +1 -0
  180. package/dist/lib/shader-plugin.js +147 -0
  181. package/dist/lib/shader-plugin.js.map +1 -0
  182. package/dist/lib/shader-transpiler/shader-transpiler.cjs +15 -0
  183. package/dist/lib/shader-transpiler/shader-transpiler.d.ts +27 -0
  184. package/dist/lib/shader-transpiler/shader-transpiler.d.ts.map +1 -0
  185. package/dist/lib/shader-transpiler/shader-transpiler.js +5 -0
  186. package/dist/lib/shader-transpiler/shader-transpiler.js.map +1 -0
  187. package/dist/lib/shader-transpiler/transpile-glsl-shader.cjs +71 -0
  188. package/dist/lib/shader-transpiler/transpile-glsl-shader.d.ts +9 -0
  189. package/dist/lib/shader-transpiler/transpile-glsl-shader.d.ts.map +1 -0
  190. package/dist/lib/shader-transpiler/transpile-glsl-shader.js +69 -0
  191. package/dist/lib/shader-transpiler/transpile-glsl-shader.js.map +1 -0
  192. package/dist/lib/utils/assert.cjs +34 -0
  193. package/dist/lib/utils/assert.d.ts +2 -0
  194. package/dist/lib/utils/assert.d.ts.map +1 -0
  195. package/dist/lib/utils/assert.js +13 -0
  196. package/dist/lib/utils/assert.js.map +1 -0
  197. package/dist/lib/utils/uniform-types.cjs +15 -0
  198. package/dist/lib/utils/uniform-types.d.ts +18 -0
  199. package/dist/lib/utils/uniform-types.d.ts.map +1 -0
  200. package/dist/lib/utils/uniform-types.js +5 -0
  201. package/dist/lib/utils/uniform-types.js.map +1 -0
  202. package/dist/lib/wgsl-shader-assembler.cjs +99 -0
  203. package/dist/lib/wgsl-shader-assembler.d.ts +34 -0
  204. package/dist/lib/wgsl-shader-assembler.d.ts.map +1 -0
  205. package/dist/lib/wgsl-shader-assembler.js +84 -0
  206. package/dist/lib/wgsl-shader-assembler.js.map +1 -0
  207. package/dist/module-injectors.cjs +59 -0
  208. package/dist/module-injectors.d.ts +3 -0
  209. package/dist/module-injectors.d.ts.map +1 -0
  210. package/dist/module-injectors.js +31 -0
  211. package/dist/module-injectors.js.map +1 -0
  212. package/dist/modules/color/float-colors.cjs +275 -0
  213. package/dist/modules/color/float-colors.d.ts +132 -0
  214. package/dist/modules/color/float-colors.d.ts.map +1 -0
  215. package/dist/modules/color/float-colors.js +248 -0
  216. package/dist/modules/color/float-colors.js.map +1 -0
  217. package/dist/modules/engine/clip/clip.cjs +142 -0
  218. package/dist/modules/engine/clip/clip.d.ts +12 -0
  219. package/dist/modules/engine/clip/clip.d.ts.map +1 -0
  220. package/dist/modules/engine/clip/clip.js +119 -0
  221. package/dist/modules/engine/clip/clip.js.map +1 -0
  222. package/dist/modules/engine/filter/filter.cjs +103 -0
  223. package/dist/modules/engine/filter/filter.d.ts +12 -0
  224. package/dist/modules/engine/filter/filter.d.ts.map +1 -0
  225. package/dist/modules/engine/filter/filter.js +80 -0
  226. package/dist/modules/engine/filter/filter.js.map +1 -0
  227. package/dist/modules/engine/geometry/geometry.cjs +63 -0
  228. package/dist/modules/engine/geometry/geometry.d.ts +9 -0
  229. package/dist/modules/engine/geometry/geometry.d.ts.map +1 -0
  230. package/dist/modules/engine/geometry/geometry.js +42 -0
  231. package/dist/modules/engine/geometry/geometry.js.map +1 -0
  232. package/dist/modules/engine/gpu-animation/gpu-animation.cjs +255 -0
  233. package/dist/modules/engine/gpu-animation/gpu-animation.d.ts +34 -0
  234. package/dist/modules/engine/gpu-animation/gpu-animation.d.ts.map +1 -0
  235. package/dist/modules/engine/gpu-animation/gpu-animation.js +228 -0
  236. package/dist/modules/engine/gpu-animation/gpu-animation.js.map +1 -0
  237. package/dist/modules/engine/picking/picking.cjs +210 -0
  238. package/dist/modules/engine/picking/picking.d.ts +77 -0
  239. package/dist/modules/engine/picking/picking.d.ts.map +1 -0
  240. package/dist/modules/engine/picking/picking.js +198 -0
  241. package/dist/modules/engine/picking/picking.js.map +1 -0
  242. package/dist/modules/engine/project/project.cjs +138 -0
  243. package/dist/modules/engine/project/project.d.ts +39 -0
  244. package/dist/modules/engine/project/project.d.ts.map +1 -0
  245. package/dist/modules/engine/project/project.js +129 -0
  246. package/dist/modules/engine/project/project.js.map +1 -0
  247. package/dist/modules/engine/skin/skin.cjs +212 -0
  248. package/dist/modules/engine/skin/skin.d.ts +52 -0
  249. package/dist/modules/engine/skin/skin.d.ts.map +1 -0
  250. package/dist/modules/engine/skin/skin.js +179 -0
  251. package/dist/modules/engine/skin/skin.js.map +1 -0
  252. package/dist/modules/engine/transform/transform.cjs +72 -0
  253. package/dist/modules/engine/transform/transform.d.ts +6 -0
  254. package/dist/modules/engine/transform/transform.d.ts.map +1 -0
  255. package/dist/modules/engine/transform/transform.js +49 -0
  256. package/dist/modules/engine/transform/transform.js.map +1 -0
  257. package/dist/modules/geometry/path-dash/path-dash.cjs +93 -0
  258. package/dist/modules/geometry/path-dash/path-dash.d.ts +10 -0
  259. package/dist/modules/geometry/path-dash/path-dash.d.ts.map +1 -0
  260. package/dist/modules/geometry/path-dash/path-dash.js +66 -0
  261. package/dist/modules/geometry/path-dash/path-dash.js.map +1 -0
  262. package/dist/modules/geometry/pattern-fill/pattern-fill-shaders.cjs +117 -0
  263. package/dist/modules/geometry/pattern-fill/pattern-fill-shaders.d.ts +3 -0
  264. package/dist/modules/geometry/pattern-fill/pattern-fill-shaders.d.ts.map +1 -0
  265. package/dist/modules/geometry/pattern-fill/pattern-fill-shaders.js +87 -0
  266. package/dist/modules/geometry/pattern-fill/pattern-fill-shaders.js.map +1 -0
  267. package/dist/modules/geometry/pattern-fill/pattern-fill.cjs +64 -0
  268. package/dist/modules/geometry/pattern-fill/pattern-fill.d.ts +14 -0
  269. package/dist/modules/geometry/pattern-fill/pattern-fill.d.ts.map +1 -0
  270. package/dist/modules/geometry/pattern-fill/pattern-fill.js +43 -0
  271. package/dist/modules/geometry/pattern-fill/pattern-fill.js.map +1 -0
  272. package/dist/modules/geometry/point-glow/point-glow.cjs +104 -0
  273. package/dist/modules/geometry/point-glow/point-glow.d.ts +11 -0
  274. package/dist/modules/geometry/point-glow/point-glow.d.ts.map +1 -0
  275. package/dist/modules/geometry/point-glow/point-glow.js +77 -0
  276. package/dist/modules/geometry/point-glow/point-glow.js.map +1 -0
  277. package/dist/modules/geometry/precipitation/precipitation.cjs +122 -0
  278. package/dist/modules/geometry/precipitation/precipitation.d.ts +40 -0
  279. package/dist/modules/geometry/precipitation/precipitation.d.ts.map +1 -0
  280. package/dist/modules/geometry/precipitation/precipitation.js +95 -0
  281. package/dist/modules/geometry/precipitation/precipitation.js.map +1 -0
  282. package/dist/modules/geometry/sketch-stroke/sketch-stroke.cjs +158 -0
  283. package/dist/modules/geometry/sketch-stroke/sketch-stroke.d.ts +60 -0
  284. package/dist/modules/geometry/sketch-stroke/sketch-stroke.d.ts.map +1 -0
  285. package/dist/modules/geometry/sketch-stroke/sketch-stroke.js +137 -0
  286. package/dist/modules/geometry/sketch-stroke/sketch-stroke.js.map +1 -0
  287. package/dist/modules/geospatial/dggs/dggs-wgsl.cjs +2304 -0
  288. package/dist/modules/geospatial/dggs/dggs-wgsl.d.ts +3 -0
  289. package/dist/modules/geospatial/dggs/dggs-wgsl.d.ts.map +1 -0
  290. package/dist/modules/geospatial/dggs/dggs-wgsl.js +2283 -0
  291. package/dist/modules/geospatial/dggs/dggs-wgsl.js.map +1 -0
  292. package/dist/modules/geospatial/dggs/dggs.cjs +31 -0
  293. package/dist/modules/geospatial/dggs/dggs.d.ts +6 -0
  294. package/dist/modules/geospatial/dggs/dggs.d.ts.map +1 -0
  295. package/dist/modules/geospatial/dggs/dggs.js +10 -0
  296. package/dist/modules/geospatial/dggs/dggs.js.map +1 -0
  297. package/dist/modules/lighting/area-lighting/area-light-types.cjs +68 -0
  298. package/dist/modules/lighting/area-lighting/area-light-types.d.ts +34 -0
  299. package/dist/modules/lighting/area-lighting/area-light-types.d.ts.map +1 -0
  300. package/dist/modules/lighting/area-lighting/area-light-types.js +40 -0
  301. package/dist/modules/lighting/area-lighting/area-light-types.js.map +1 -0
  302. package/dist/modules/lighting/area-lighting/area-lighting-shaders.cjs +101 -0
  303. package/dist/modules/lighting/area-lighting/area-lighting-shaders.d.ts +3 -0
  304. package/dist/modules/lighting/area-lighting/area-lighting-shaders.d.ts.map +1 -0
  305. package/dist/modules/lighting/area-lighting/area-lighting-shaders.js +71 -0
  306. package/dist/modules/lighting/area-lighting/area-lighting-shaders.js.map +1 -0
  307. package/dist/modules/lighting/area-lighting/area-lighting.cjs +62 -0
  308. package/dist/modules/lighting/area-lighting/area-lighting.d.ts +89 -0
  309. package/dist/modules/lighting/area-lighting/area-lighting.d.ts.map +1 -0
  310. package/dist/modules/lighting/area-lighting/area-lighting.js +41 -0
  311. package/dist/modules/lighting/area-lighting/area-lighting.js.map +1 -0
  312. package/dist/modules/lighting/area-lighting/ltc-shaders.cjs +192 -0
  313. package/dist/modules/lighting/area-lighting/ltc-shaders.d.ts +3 -0
  314. package/dist/modules/lighting/area-lighting/ltc-shaders.d.ts.map +1 -0
  315. package/dist/modules/lighting/area-lighting/ltc-shaders.js +162 -0
  316. package/dist/modules/lighting/area-lighting/ltc-shaders.js.map +1 -0
  317. package/dist/modules/lighting/atmosphere/atmosphere.cjs +253 -0
  318. package/dist/modules/lighting/atmosphere/atmosphere.d.ts +45 -0
  319. package/dist/modules/lighting/atmosphere/atmosphere.d.ts.map +1 -0
  320. package/dist/modules/lighting/atmosphere/atmosphere.js +228 -0
  321. package/dist/modules/lighting/atmosphere/atmosphere.js.map +1 -0
  322. package/dist/modules/lighting/clouds/clouds.cjs +216 -0
  323. package/dist/modules/lighting/clouds/clouds.d.ts +58 -0
  324. package/dist/modules/lighting/clouds/clouds.d.ts.map +1 -0
  325. package/dist/modules/lighting/clouds/clouds.js +192 -0
  326. package/dist/modules/lighting/clouds/clouds.js.map +1 -0
  327. package/dist/modules/lighting/firefly/firefly.cjs +74 -0
  328. package/dist/modules/lighting/firefly/firefly.d.ts +36 -0
  329. package/dist/modules/lighting/firefly/firefly.d.ts.map +1 -0
  330. package/dist/modules/lighting/firefly/firefly.js +53 -0
  331. package/dist/modules/lighting/firefly/firefly.js.map +1 -0
  332. package/dist/modules/lighting/globe-clouds/globe-clouds.cjs +143 -0
  333. package/dist/modules/lighting/globe-clouds/globe-clouds.d.ts +53 -0
  334. package/dist/modules/lighting/globe-clouds/globe-clouds.d.ts.map +1 -0
  335. package/dist/modules/lighting/globe-clouds/globe-clouds.js +119 -0
  336. package/dist/modules/lighting/globe-clouds/globe-clouds.js.map +1 -0
  337. package/dist/modules/lighting/gouraud-material/gouraud-material.cjs +61 -0
  338. package/dist/modules/lighting/gouraud-material/gouraud-material.d.ts +12 -0
  339. package/dist/modules/lighting/gouraud-material/gouraud-material.d.ts.map +1 -0
  340. package/dist/modules/lighting/gouraud-material/gouraud-material.js +40 -0
  341. package/dist/modules/lighting/gouraud-material/gouraud-material.js.map +1 -0
  342. package/dist/modules/lighting/height-fog/height-fog-functions.cjs +139 -0
  343. package/dist/modules/lighting/height-fog/height-fog-functions.d.ts +14 -0
  344. package/dist/modules/lighting/height-fog/height-fog-functions.d.ts.map +1 -0
  345. package/dist/modules/lighting/height-fog/height-fog-functions.js +114 -0
  346. package/dist/modules/lighting/height-fog/height-fog-functions.js.map +1 -0
  347. package/dist/modules/lighting/height-fog/height-fog.cjs +104 -0
  348. package/dist/modules/lighting/height-fog/height-fog.d.ts +60 -0
  349. package/dist/modules/lighting/height-fog/height-fog.d.ts.map +1 -0
  350. package/dist/modules/lighting/height-fog/height-fog.js +77 -0
  351. package/dist/modules/lighting/height-fog/height-fog.js.map +1 -0
  352. package/dist/modules/lighting/ibl/ibl.cjs +63 -0
  353. package/dist/modules/lighting/ibl/ibl.d.ts +25 -0
  354. package/dist/modules/lighting/ibl/ibl.d.ts.map +1 -0
  355. package/dist/modules/lighting/ibl/ibl.js +33 -0
  356. package/dist/modules/lighting/ibl/ibl.js.map +1 -0
  357. package/dist/modules/lighting/lambert-material/lambert-material.cjs +54 -0
  358. package/dist/modules/lighting/lambert-material/lambert-material.d.ts +10 -0
  359. package/dist/modules/lighting/lambert-material/lambert-material.d.ts.map +1 -0
  360. package/dist/modules/lighting/lambert-material/lambert-material.js +33 -0
  361. package/dist/modules/lighting/lambert-material/lambert-material.js.map +1 -0
  362. package/dist/modules/lighting/lambert-material/lambert-shaders-glsl.cjs +88 -0
  363. package/dist/modules/lighting/lambert-material/lambert-shaders-glsl.d.ts +3 -0
  364. package/dist/modules/lighting/lambert-material/lambert-shaders-glsl.d.ts.map +1 -0
  365. package/dist/modules/lighting/lambert-material/lambert-shaders-glsl.js +60 -0
  366. package/dist/modules/lighting/lambert-material/lambert-shaders-glsl.js.map +1 -0
  367. package/dist/modules/lighting/lambert-material/lambert-shaders-wgsl.cjs +97 -0
  368. package/dist/modules/lighting/lambert-material/lambert-shaders-wgsl.d.ts +2 -0
  369. package/dist/modules/lighting/lambert-material/lambert-shaders-wgsl.d.ts.map +1 -0
  370. package/dist/modules/lighting/lambert-material/lambert-shaders-wgsl.js +73 -0
  371. package/dist/modules/lighting/lambert-material/lambert-shaders-wgsl.js.map +1 -0
  372. package/dist/modules/lighting/lights/lighting-glsl.cjs +116 -0
  373. package/dist/modules/lighting/lights/lighting-glsl.d.ts +2 -0
  374. package/dist/modules/lighting/lights/lighting-glsl.d.ts.map +1 -0
  375. package/dist/modules/lighting/lights/lighting-glsl.js +92 -0
  376. package/dist/modules/lighting/lights/lighting-glsl.js.map +1 -0
  377. package/dist/modules/lighting/lights/lighting-wgsl.cjs +115 -0
  378. package/dist/modules/lighting/lights/lighting-wgsl.d.ts +2 -0
  379. package/dist/modules/lighting/lights/lighting-wgsl.d.ts.map +1 -0
  380. package/dist/modules/lighting/lights/lighting-wgsl.js +91 -0
  381. package/dist/modules/lighting/lights/lighting-wgsl.js.map +1 -0
  382. package/dist/modules/lighting/lights/lighting.cjs +210 -0
  383. package/dist/modules/lighting/lights/lighting.d.ts +163 -0
  384. package/dist/modules/lighting/lights/lighting.d.ts.map +1 -0
  385. package/dist/modules/lighting/lights/lighting.js +208 -0
  386. package/dist/modules/lighting/lights/lighting.js.map +1 -0
  387. package/dist/modules/lighting/no-material/dirlight.cjs +112 -0
  388. package/dist/modules/lighting/no-material/dirlight.d.ts +33 -0
  389. package/dist/modules/lighting/no-material/dirlight.d.ts.map +1 -0
  390. package/dist/modules/lighting/no-material/dirlight.js +86 -0
  391. package/dist/modules/lighting/no-material/dirlight.js.map +1 -0
  392. package/dist/modules/lighting/pbr-material/pbr-material-glsl.cjs +1767 -0
  393. package/dist/modules/lighting/pbr-material/pbr-material-glsl.d.ts +3 -0
  394. package/dist/modules/lighting/pbr-material/pbr-material-glsl.d.ts.map +1 -0
  395. package/dist/modules/lighting/pbr-material/pbr-material-glsl.js +1745 -0
  396. package/dist/modules/lighting/pbr-material/pbr-material-glsl.js.map +1 -0
  397. package/dist/modules/lighting/pbr-material/pbr-material-wgsl.cjs +2062 -0
  398. package/dist/modules/lighting/pbr-material/pbr-material-wgsl.d.ts +3 -0
  399. package/dist/modules/lighting/pbr-material/pbr-material-wgsl.d.ts.map +1 -0
  400. package/dist/modules/lighting/pbr-material/pbr-material-wgsl.js +2040 -0
  401. package/dist/modules/lighting/pbr-material/pbr-material-wgsl.js.map +1 -0
  402. package/dist/modules/lighting/pbr-material/pbr-material.cjs +315 -0
  403. package/dist/modules/lighting/pbr-material/pbr-material.d.ts +516 -0
  404. package/dist/modules/lighting/pbr-material/pbr-material.d.ts.map +1 -0
  405. package/dist/modules/lighting/pbr-material/pbr-material.js +292 -0
  406. package/dist/modules/lighting/pbr-material/pbr-material.js.map +1 -0
  407. package/dist/modules/lighting/pbr-material/pbr-projection.cjs +63 -0
  408. package/dist/modules/lighting/pbr-material/pbr-projection.d.ts +10 -0
  409. package/dist/modules/lighting/pbr-material/pbr-projection.d.ts.map +1 -0
  410. package/dist/modules/lighting/pbr-material/pbr-projection.js +37 -0
  411. package/dist/modules/lighting/pbr-material/pbr-projection.js.map +1 -0
  412. package/dist/modules/lighting/pbr-material/pbr-scene.cjs +109 -0
  413. package/dist/modules/lighting/pbr-material/pbr-scene.d.ts +52 -0
  414. package/dist/modules/lighting/pbr-material/pbr-scene.d.ts.map +1 -0
  415. package/dist/modules/lighting/pbr-material/pbr-scene.js +83 -0
  416. package/dist/modules/lighting/pbr-material/pbr-scene.js.map +1 -0
  417. package/dist/modules/lighting/phong-material/phong-material.cjs +61 -0
  418. package/dist/modules/lighting/phong-material/phong-material.d.ts +13 -0
  419. package/dist/modules/lighting/phong-material/phong-material.d.ts.map +1 -0
  420. package/dist/modules/lighting/phong-material/phong-material.js +40 -0
  421. package/dist/modules/lighting/phong-material/phong-material.js.map +1 -0
  422. package/dist/modules/lighting/phong-material/phong-shaders-glsl.cjs +100 -0
  423. package/dist/modules/lighting/phong-material/phong-shaders-glsl.d.ts +3 -0
  424. package/dist/modules/lighting/phong-material/phong-shaders-glsl.d.ts.map +1 -0
  425. package/dist/modules/lighting/phong-material/phong-shaders-glsl.js +72 -0
  426. package/dist/modules/lighting/phong-material/phong-shaders-glsl.js.map +1 -0
  427. package/dist/modules/lighting/phong-material/phong-shaders-wgsl.cjs +153 -0
  428. package/dist/modules/lighting/phong-material/phong-shaders-wgsl.d.ts +2 -0
  429. package/dist/modules/lighting/phong-material/phong-shaders-wgsl.d.ts.map +1 -0
  430. package/dist/modules/lighting/phong-material/phong-shaders-wgsl.js +129 -0
  431. package/dist/modules/lighting/phong-material/phong-shaders-wgsl.js.map +1 -0
  432. package/dist/modules/lighting/surface-weather/surface-weather.cjs +199 -0
  433. package/dist/modules/lighting/surface-weather/surface-weather.d.ts +54 -0
  434. package/dist/modules/lighting/surface-weather/surface-weather.d.ts.map +1 -0
  435. package/dist/modules/lighting/surface-weather/surface-weather.js +175 -0
  436. package/dist/modules/lighting/surface-weather/surface-weather.js.map +1 -0
  437. package/dist/modules/lighting/water-material/river-water-material.cjs +56 -0
  438. package/dist/modules/lighting/water-material/river-water-material.d.ts +21 -0
  439. package/dist/modules/lighting/water-material/river-water-material.d.ts.map +1 -0
  440. package/dist/modules/lighting/water-material/river-water-material.js +36 -0
  441. package/dist/modules/lighting/water-material/river-water-material.js.map +1 -0
  442. package/dist/modules/lighting/water-material/river-water-shaders.cjs +261 -0
  443. package/dist/modules/lighting/water-material/river-water-shaders.d.ts +3 -0
  444. package/dist/modules/lighting/water-material/river-water-shaders.d.ts.map +1 -0
  445. package/dist/modules/lighting/water-material/river-water-shaders.js +233 -0
  446. package/dist/modules/lighting/water-material/river-water-shaders.js.map +1 -0
  447. package/dist/modules/lighting/water-material/water-material.cjs +188 -0
  448. package/dist/modules/lighting/water-material/water-material.d.ts +28 -0
  449. package/dist/modules/lighting/water-material/water-material.d.ts.map +1 -0
  450. package/dist/modules/lighting/water-material/water-material.js +179 -0
  451. package/dist/modules/lighting/water-material/water-material.js.map +1 -0
  452. package/dist/modules/lighting/water-material/water-shaders-glsl.cjs +260 -0
  453. package/dist/modules/lighting/water-material/water-shaders-glsl.d.ts +3 -0
  454. package/dist/modules/lighting/water-material/water-shaders-glsl.d.ts.map +1 -0
  455. package/dist/modules/lighting/water-material/water-shaders-glsl.js +232 -0
  456. package/dist/modules/lighting/water-material/water-shaders-glsl.js.map +1 -0
  457. package/dist/modules/lighting/water-material/water-shaders-wgsl.cjs +254 -0
  458. package/dist/modules/lighting/water-material/water-shaders-wgsl.d.ts +2 -0
  459. package/dist/modules/lighting/water-material/water-shaders-wgsl.d.ts.map +1 -0
  460. package/dist/modules/lighting/water-material/water-shaders-wgsl.js +230 -0
  461. package/dist/modules/lighting/water-material/water-shaders-wgsl.js.map +1 -0
  462. package/dist/modules/math/fp16/fp16-utils.cjs +112 -0
  463. package/dist/modules/math/fp16/fp16-utils.d.ts +13 -0
  464. package/dist/modules/math/fp16/fp16-utils.d.ts.map +1 -0
  465. package/dist/modules/math/fp16/fp16-utils.js +118 -0
  466. package/dist/modules/math/fp16/fp16-utils.js.map +1 -0
  467. package/dist/modules/math/fp32/fp32.cjs +310 -0
  468. package/dist/modules/math/fp32/fp32.d.ts +9 -0
  469. package/dist/modules/math/fp32/fp32.d.ts.map +1 -0
  470. package/dist/modules/math/fp32/fp32.js +288 -0
  471. package/dist/modules/math/fp32/fp32.js.map +1 -0
  472. package/dist/modules/math/fp64/fp64-arithmetic-glsl.cjs +229 -0
  473. package/dist/modules/math/fp64/fp64-arithmetic-glsl.d.ts +2 -0
  474. package/dist/modules/math/fp64/fp64-arithmetic-glsl.d.ts.map +1 -0
  475. package/dist/modules/math/fp64/fp64-arithmetic-glsl.js +205 -0
  476. package/dist/modules/math/fp64/fp64-arithmetic-glsl.js.map +1 -0
  477. package/dist/modules/math/fp64/fp64-arithmetic-wgsl-hybrid.cjs +144 -0
  478. package/dist/modules/math/fp64/fp64-arithmetic-wgsl-hybrid.d.ts +10 -0
  479. package/dist/modules/math/fp64/fp64-arithmetic-wgsl-hybrid.d.ts.map +1 -0
  480. package/dist/modules/math/fp64/fp64-arithmetic-wgsl-hybrid.js +128 -0
  481. package/dist/modules/math/fp64/fp64-arithmetic-wgsl-hybrid.js.map +1 -0
  482. package/dist/modules/math/fp64/fp64-arithmetic-wgsl-integer.cjs +583 -0
  483. package/dist/modules/math/fp64/fp64-arithmetic-wgsl-integer.d.ts +11 -0
  484. package/dist/modules/math/fp64/fp64-arithmetic-wgsl-integer.d.ts.map +1 -0
  485. package/dist/modules/math/fp64/fp64-arithmetic-wgsl-integer.js +563 -0
  486. package/dist/modules/math/fp64/fp64-arithmetic-wgsl-integer.js.map +1 -0
  487. package/dist/modules/math/fp64/fp64-arithmetic-wgsl.cjs +946 -0
  488. package/dist/modules/math/fp64/fp64-arithmetic-wgsl.d.ts +3 -0
  489. package/dist/modules/math/fp64/fp64-arithmetic-wgsl.d.ts.map +1 -0
  490. package/dist/modules/math/fp64/fp64-arithmetic-wgsl.js +923 -0
  491. package/dist/modules/math/fp64/fp64-arithmetic-wgsl.js.map +1 -0
  492. package/dist/modules/math/fp64/fp64-functions-glsl.cjs +699 -0
  493. package/dist/modules/math/fp64/fp64-functions-glsl.d.ts +2 -0
  494. package/dist/modules/math/fp64/fp64-functions-glsl.d.ts.map +1 -0
  495. package/dist/modules/math/fp64/fp64-functions-glsl.js +675 -0
  496. package/dist/modules/math/fp64/fp64-functions-glsl.js.map +1 -0
  497. package/dist/modules/math/fp64/fp64-functions-wgsl.cjs +180 -0
  498. package/dist/modules/math/fp64/fp64-functions-wgsl.d.ts +3 -0
  499. package/dist/modules/math/fp64/fp64-functions-wgsl.d.ts.map +1 -0
  500. package/dist/modules/math/fp64/fp64-functions-wgsl.js +157 -0
  501. package/dist/modules/math/fp64/fp64-functions-wgsl.js.map +1 -0
  502. package/dist/modules/math/fp64/fp64-utils.cjs +50 -0
  503. package/dist/modules/math/fp64/fp64-utils.d.ts +22 -0
  504. package/dist/modules/math/fp64/fp64-utils.d.ts.map +1 -0
  505. package/dist/modules/math/fp64/fp64-utils.js +42 -0
  506. package/dist/modules/math/fp64/fp64-utils.js.map +1 -0
  507. package/dist/modules/math/fp64/fp64.cjs +68 -0
  508. package/dist/modules/math/fp64/fp64.d.ts +24 -0
  509. package/dist/modules/math/fp64/fp64.d.ts.map +1 -0
  510. package/dist/modules/math/fp64/fp64.js +46 -0
  511. package/dist/modules/math/fp64/fp64.js.map +1 -0
  512. package/dist/modules/math/random/random.cjs +46 -0
  513. package/dist/modules/math/random/random.d.ts +7 -0
  514. package/dist/modules/math/random/random.d.ts.map +1 -0
  515. package/dist/modules/math/random/random.js +21 -0
  516. package/dist/modules/math/random/random.js.map +1 -0
  517. package/dist/modules/math/value-noise/value-noise.cjs +95 -0
  518. package/dist/modules/math/value-noise/value-noise.d.ts +7 -0
  519. package/dist/modules/math/value-noise/value-noise.d.ts.map +1 -0
  520. package/dist/modules/math/value-noise/value-noise.js +68 -0
  521. package/dist/modules/math/value-noise/value-noise.js.map +1 -0
  522. package/dist/modules/volume/volume-raymarch.cjs +107 -0
  523. package/dist/modules/volume/volume-raymarch.d.ts +6 -0
  524. package/dist/modules/volume/volume-raymarch.d.ts.map +1 -0
  525. package/dist/modules/volume/volume-raymarch.js +84 -0
  526. package/dist/modules/volume/volume-raymarch.js.map +1 -0
  527. package/dist/types/align-to.cjs +38 -0
  528. package/dist/types/align-to.d.ts +3 -0
  529. package/dist/types/align-to.d.ts.map +1 -0
  530. package/dist/types/align-to.js +13 -0
  531. package/dist/types/align-to.js.map +1 -0
  532. package/dist/types/primitive-data-types.cjs +15 -0
  533. package/dist/types/primitive-data-types.d.ts +7 -0
  534. package/dist/types/primitive-data-types.d.ts.map +1 -0
  535. package/dist/types/primitive-data-types.js +5 -0
  536. package/dist/types/primitive-data-types.js.map +1 -0
  537. package/dist/types/sampler-props.cjs +15 -0
  538. package/dist/types/sampler-props.d.ts +26 -0
  539. package/dist/types/sampler-props.d.ts.map +1 -0
  540. package/dist/types/sampler-props.js +5 -0
  541. package/dist/types/sampler-props.js.map +1 -0
  542. package/dist/types/shader-block-layout.cjs +184 -0
  543. package/dist/types/shader-block-layout.d.ts +72 -0
  544. package/dist/types/shader-block-layout.d.ts.map +1 -0
  545. package/dist/types/shader-block-layout.js +209 -0
  546. package/dist/types/shader-block-layout.js.map +1 -0
  547. package/dist/types/shader-layout.cjs +15 -0
  548. package/dist/types/shader-layout.d.ts +178 -0
  549. package/dist/types/shader-layout.d.ts.map +1 -0
  550. package/dist/types/shader-layout.js +5 -0
  551. package/dist/types/shader-layout.js.map +1 -0
  552. package/dist/types/shader-type-decoder.cjs +240 -0
  553. package/dist/types/shader-type-decoder.d.ts +41 -0
  554. package/dist/types/shader-type-decoder.d.ts.map +1 -0
  555. package/dist/types/shader-type-decoder.js +210 -0
  556. package/dist/types/shader-type-decoder.js.map +1 -0
  557. package/dist/types/shader-types.cjs +15 -0
  558. package/dist/types/shader-types.d.ts +101 -0
  559. package/dist/types/shader-types.d.ts.map +1 -0
  560. package/dist/types/shader-types.js +30 -0
  561. package/dist/types/shader-types.js.map +1 -0
  562. package/dist/types/texture-formats.cjs +15 -0
  563. package/dist/types/texture-formats.d.ts +24 -0
  564. package/dist/types/texture-formats.d.ts.map +1 -0
  565. package/dist/types/texture-formats.js +5 -0
  566. package/dist/types/texture-formats.js.map +1 -0
  567. package/dist/types.cjs +53 -0
  568. package/dist/types.cjs.map +6 -0
  569. package/dist/types.d.ts +14 -0
  570. package/dist/types.d.ts.map +1 -0
  571. package/dist/types.js +7 -0
  572. package/dist/types.js.map +1 -0
  573. package/dist/wgsl.cjs +55 -0
  574. package/dist/wgsl.cjs.map +6 -0
  575. package/dist/wgsl.d.ts +8 -0
  576. package/dist/wgsl.d.ts.map +1 -0
  577. package/dist/wgsl.js +9 -0
  578. package/dist/wgsl.js.map +1 -0
  579. package/package.json +65 -4
  580. package/src/glsl.ts +13 -0
  581. package/src/index.ts +259 -0
  582. package/src/lib/color/normalize-byte-colors.ts +57 -0
  583. package/src/lib/filters/prop-types.ts +150 -0
  584. package/src/lib/glsl-shader-assembler.ts +39 -0
  585. package/src/lib/glsl-utils/get-shader-info.ts +42 -0
  586. package/src/lib/glsl-utils/shader-utils.ts +110 -0
  587. package/src/lib/preprocessor/preprocessor.ts +157 -0
  588. package/src/lib/shader-assembler-base.ts +169 -0
  589. package/src/lib/shader-assembler.ts +7 -0
  590. package/src/lib/shader-assembly/assemble-glsl-shaders.ts +305 -0
  591. package/src/lib/shader-assembly/assemble-shaders.ts +13 -0
  592. package/src/lib/shader-assembly/assemble-wgsl-shaders.ts +830 -0
  593. package/src/lib/shader-assembly/platform-defines.ts +58 -0
  594. package/src/lib/shader-assembly/platform-info.ts +23 -0
  595. package/src/lib/shader-assembly/shader-assembly-shared.ts +95 -0
  596. package/src/lib/shader-assembly/shader-assembly-types.ts +146 -0
  597. package/src/lib/shader-assembly/shader-injection-targets.ts +148 -0
  598. package/src/lib/shader-assembly/shader-injections.ts +298 -0
  599. package/src/lib/shader-assembly/shader-plugin-varyings.ts +555 -0
  600. package/src/lib/shader-assembly/shader-plugin-vertex-inputs.ts +279 -0
  601. package/src/lib/shader-assembly/wgsl-binding-debug.ts +227 -0
  602. package/src/lib/shader-assembly/wgsl-binding-scan.ts +228 -0
  603. package/src/lib/shader-assembly/wgsl-injection-target-names.ts +180 -0
  604. package/src/lib/shader-assembly/wgsl-interface-scan.ts +676 -0
  605. package/src/lib/shader-generator/generate-shader.ts +27 -0
  606. package/src/lib/shader-generator/glsl/generate-glsl.ts +101 -0
  607. package/src/lib/shader-generator/utils/capitalize.ts +12 -0
  608. package/src/lib/shader-generator/wgsl/generate-wgsl.ts +40 -0
  609. package/src/lib/shader-module/composite-shader-pass.ts +47 -0
  610. package/src/lib/shader-module/shader-module-dependencies.ts +128 -0
  611. package/src/lib/shader-module/shader-module-uniform-layout.ts +420 -0
  612. package/src/lib/shader-module/shader-module.ts +237 -0
  613. package/src/lib/shader-module/shader-pass.ts +69 -0
  614. package/src/lib/shader-plugin.ts +236 -0
  615. package/src/lib/shader-transpiler/shader-transpiler.ts +34 -0
  616. package/src/lib/shader-transpiler/transpile-glsl-shader.ts +78 -0
  617. package/src/lib/utils/assert.ts +13 -0
  618. package/src/lib/utils/uniform-types.ts +89 -0
  619. package/src/lib/wgsl-shader-assembler.ts +122 -0
  620. package/src/module-injectors.ts +32 -0
  621. package/src/modules/color/float-colors.ts +334 -0
  622. package/src/modules/engine/clip/clip.ts +139 -0
  623. package/src/modules/engine/filter/filter.ts +99 -0
  624. package/src/modules/engine/geometry/geometry.ts +45 -0
  625. package/src/modules/engine/gpu-animation/gpu-animation.ts +244 -0
  626. package/src/modules/engine/picking/README.md +88 -0
  627. package/src/modules/engine/picking/picking.ts +252 -0
  628. package/src/modules/engine/project/project.ts +166 -0
  629. package/src/modules/engine/skin/skin.ts +233 -0
  630. package/src/modules/engine/transform/transform.ts +50 -0
  631. package/src/modules/geometry/path-dash/path-dash.ts +68 -0
  632. package/src/modules/geometry/pattern-fill/pattern-fill-shaders.ts +88 -0
  633. package/src/modules/geometry/pattern-fill/pattern-fill.ts +54 -0
  634. package/src/modules/geometry/point-glow/point-glow.ts +87 -0
  635. package/src/modules/geometry/precipitation/README.md +19 -0
  636. package/src/modules/geometry/precipitation/precipitation.ts +108 -0
  637. package/src/modules/geometry/sketch-stroke/sketch-stroke.ts +160 -0
  638. package/src/modules/geospatial/dggs/dggs-wgsl.ts +2284 -0
  639. package/src/modules/geospatial/dggs/dggs.ts +12 -0
  640. package/src/modules/lighting/area-lighting/area-light-types.ts +71 -0
  641. package/src/modules/lighting/area-lighting/area-lighting-shaders.ts +72 -0
  642. package/src/modules/lighting/area-lighting/area-lighting.ts +63 -0
  643. package/src/modules/lighting/area-lighting/ltc-shaders.ts +163 -0
  644. package/src/modules/lighting/atmosphere/README.md +25 -0
  645. package/src/modules/lighting/atmosphere/atmosphere.ts +246 -0
  646. package/src/modules/lighting/clouds/README.md +24 -0
  647. package/src/modules/lighting/clouds/clouds.ts +216 -0
  648. package/src/modules/lighting/firefly/firefly.ts +64 -0
  649. package/src/modules/lighting/globe-clouds/globe-clouds.ts +124 -0
  650. package/src/modules/lighting/gouraud-material/gouraud-material.ts +55 -0
  651. package/src/modules/lighting/height-fog/README.md +36 -0
  652. package/src/modules/lighting/height-fog/height-fog-functions.ts +116 -0
  653. package/src/modules/lighting/height-fog/height-fog.ts +96 -0
  654. package/src/modules/lighting/ibl/ibl.ts +43 -0
  655. package/src/modules/lighting/lambert-material/lambert-material.ts +42 -0
  656. package/src/modules/lighting/lambert-material/lambert-shaders-glsl.ts +61 -0
  657. package/src/modules/lighting/lambert-material/lambert-shaders-wgsl.ts +73 -0
  658. package/src/modules/lighting/lights/lighting-glsl.ts +92 -0
  659. package/src/modules/lighting/lights/lighting-wgsl.ts +91 -0
  660. package/src/modules/lighting/lights/lighting.ts +385 -0
  661. package/src/modules/lighting/no-material/dirlight.ts +101 -0
  662. package/src/modules/lighting/pbr-material/pbr-material-glsl.ts +1748 -0
  663. package/src/modules/lighting/pbr-material/pbr-material-wgsl.ts +2043 -0
  664. package/src/modules/lighting/pbr-material/pbr-material.ts +517 -0
  665. package/src/modules/lighting/pbr-material/pbr-projection.ts +50 -0
  666. package/src/modules/lighting/pbr-material/pbr-scene.ts +112 -0
  667. package/src/modules/lighting/phong-material/phong-material.ts +53 -0
  668. package/src/modules/lighting/phong-material/phong-shaders-glsl.ts +73 -0
  669. package/src/modules/lighting/phong-material/phong-shaders-wgsl.ts +129 -0
  670. package/src/modules/lighting/surface-weather/README.md +28 -0
  671. package/src/modules/lighting/surface-weather/surface-weather.ts +198 -0
  672. package/src/modules/lighting/water-material/river-water-material.ts +58 -0
  673. package/src/modules/lighting/water-material/river-water-shaders.ts +234 -0
  674. package/src/modules/lighting/water-material/water-material.ts +234 -0
  675. package/src/modules/lighting/water-material/water-shaders-glsl.ts +233 -0
  676. package/src/modules/lighting/water-material/water-shaders-wgsl.ts +230 -0
  677. package/src/modules/math/fp16/fp16-utils.ts +156 -0
  678. package/src/modules/math/fp32/fp32.ts +291 -0
  679. package/src/modules/math/fp64/fp64-arithmetic-glsl.ts +205 -0
  680. package/src/modules/math/fp64/fp64-arithmetic-wgsl-hybrid.ts +129 -0
  681. package/src/modules/math/fp64/fp64-arithmetic-wgsl-integer.ts +564 -0
  682. package/src/modules/math/fp64/fp64-arithmetic-wgsl.ts +924 -0
  683. package/src/modules/math/fp64/fp64-functions-glsl.ts +675 -0
  684. package/src/modules/math/fp64/fp64-functions-wgsl.ts +157 -0
  685. package/src/modules/math/fp64/fp64-utils.ts +46 -0
  686. package/src/modules/math/fp64/fp64.ts +64 -0
  687. package/src/modules/math/random/random.ts +25 -0
  688. package/src/modules/math/value-noise/value-noise.ts +70 -0
  689. package/src/modules/volume/volume-raymarch.ts +87 -0
  690. package/src/types/align-to.ts +13 -0
  691. package/src/types/primitive-data-types.ts +10 -0
  692. package/src/types/sampler-props.ts +39 -0
  693. package/src/types/shader-block-layout.ts +340 -0
  694. package/src/types/shader-layout.ts +208 -0
  695. package/src/types/shader-type-decoder.ts +285 -0
  696. package/src/types/shader-types.ts +207 -0
  697. package/src/types/texture-formats.ts +157 -0
  698. package/src/types.ts +116 -0
  699. package/src/wgsl.ts +34 -0
@@ -0,0 +1,3 @@
1
+ /** WGSL source for fp64 arithmetic helpers and raw binary64 subtraction. */
2
+ export declare const fp64arithmeticWGSL = "struct Fp64ArithmeticUniforms {\n ONE: f32,\n SPLIT: f32,\n};\n\n@group(0) @binding(auto) var<uniform> fp64arithmetic : Fp64ArithmeticUniforms;\n\n#ifndef LUMA_FP64_F32_INPUT_ONLY\nstruct Fp64Bits {\n sign: u32,\n exponent: i32,\n significand: vec2u,\n isZero: bool,\n isInf: bool,\n isNan: bool,\n};\n#endif\n\n#ifndef LUMA_FP64_PREDICATE_ONLY\nfn fp64_nan(seed: f32) -> f32 {\n let nanBits = 0x7fc00000u | select(0u, 1u, seed < 0.0);\n return bitcast<f32>(nanBits);\n}\n#endif\n\nfn fp64_u64_is_zero(value: vec2u) -> bool {\n return value.x == 0u && value.y == 0u;\n}\n\nfn fp64_u64_compare(a: vec2u, b: vec2u) -> i32 {\n if (a.x != b.x) {\n return select(-1, 1, a.x > b.x);\n }\n if (a.y != b.y) {\n return select(-1, 1, a.y > b.y);\n }\n return 0;\n}\n\nfn fp64_u64_add(a: vec2u, b: vec2u) -> vec2u {\n let low = a.y + b.y;\n let carry = select(0u, 1u, low < a.y);\n return vec2u(a.x + b.x + carry, low);\n}\n\nfn fp64_u64_sub(a: vec2u, b: vec2u) -> vec2u {\n let borrow = select(0u, 1u, a.y < b.y);\n return vec2u(a.x - b.x - borrow, a.y - b.y);\n}\n\nfn fp64_u64_shift_left(value: vec2u, shift: u32) -> vec2u {\n if (shift == 0u) {\n return value;\n }\n if (shift < 32u) {\n return vec2u((value.x << shift) | (value.y >> (32u - shift)), value.y << shift);\n }\n if (shift == 32u) {\n return vec2u(value.y, 0u);\n }\n if (shift < 64u) {\n return vec2u(value.y << (shift - 32u), 0u);\n }\n return vec2u(0u);\n}\n\nfn fp64_u64_shift_right(value: vec2u, shift: u32) -> vec2u {\n if (shift == 0u) {\n return value;\n }\n if (shift < 32u) {\n return vec2u(value.x >> shift, (value.y >> shift) | (value.x << (32u - shift)));\n }\n if (shift == 32u) {\n return vec2u(0u, value.x);\n }\n if (shift < 64u) {\n return vec2u(0u, value.x >> (shift - 32u));\n }\n return vec2u(0u);\n}\n\nfn fp64_u64_get_bit(value: vec2u, bitIndex: u32) -> bool {\n if (bitIndex >= 64u) {\n return false;\n }\n if (bitIndex >= 32u) {\n return ((value.x >> (bitIndex - 32u)) & 1u) != 0u;\n }\n return ((value.y >> bitIndex) & 1u) != 0u;\n}\n\nfn fp64_u64_has_bits_below(value: vec2u, bitCount: u32) -> bool {\n if (bitCount == 0u) {\n return false;\n }\n if (bitCount >= 64u) {\n return !fp64_u64_is_zero(value);\n }\n if (bitCount > 32u) {\n let highBitCount = bitCount - 32u;\n let highMask = (1u << highBitCount) - 1u;\n return value.y != 0u || (value.x & highMask) != 0u;\n }\n if (bitCount == 32u) {\n return value.y != 0u;\n }\n let lowMask = (1u << bitCount) - 1u;\n return (value.y & lowMask) != 0u;\n}\n\n#ifndef LUMA_FP64_F32_INPUT_ONLY\nfn fp64_u64_shift_right_sticky(value: vec2u, shift: u32) -> vec2u {\n var shifted = fp64_u64_shift_right(value, shift);\n if (fp64_u64_has_bits_below(value, shift)) {\n shifted.y = shifted.y | 1u;\n }\n return shifted;\n}\n#endif\n\nfn fp64_u64_count_leading_zeros(value: vec2u) -> u32 {\n if (value.x != 0u) {\n return countLeadingZeros(value.x);\n }\n return 32u + countLeadingZeros(value.y);\n}\n\nfn fp64_round_shift_right_to_u32(value: vec2u, shift: u32) -> u32 {\n if (shift == 0u) {\n return value.y;\n }\n\n let truncated = fp64_u64_shift_right(value, shift);\n var rounded = truncated.y;\n let guard = fp64_u64_get_bit(value, shift - 1u);\n let hasTrailingBits = fp64_u64_has_bits_below(value, shift - 1u);\n if (guard && (hasTrailingBits || (rounded & 1u) == 1u)) {\n rounded = rounded + 1u;\n }\n return rounded;\n}\n\n#ifndef LUMA_FP64_F32_INPUT_ONLY\nfn fp64_round_shift_right(value: vec2u, shift: u32) -> vec2u {\n if (shift == 0u) {\n return value;\n }\n\n var rounded = fp64_u64_shift_right(value, shift);\n let guard = fp64_u64_get_bit(value, shift - 1u);\n let hasTrailingBits = fp64_u64_has_bits_below(value, shift - 1u);\n if (guard && (hasTrailingBits || (rounded.y & 1u) == 1u)) {\n rounded = fp64_u64_add(rounded, vec2u(0u, 1u));\n }\n return rounded;\n}\n#endif\n\nfn fp64_make_f32_bits_from_u64(sign: u32, significand: vec2u, baseExponent: i32) -> u32 {\n if (fp64_u64_is_zero(significand)) {\n return sign << 31u;\n }\n\n let leadingZeros = fp64_u64_count_leading_zeros(significand);\n let mostSignificantBit = 63u - leadingZeros;\n var exponent = baseExponent + i32(mostSignificantBit);\n\n if (exponent > 127) {\n return (sign << 31u) | 0x7f800000u;\n }\n\n if (exponent >= -126) {\n let shift = i32(mostSignificantBit) - 23;\n var significand24: u32;\n if (shift > 0) {\n significand24 = fp64_round_shift_right_to_u32(significand, u32(shift));\n } else {\n significand24 = fp64_u64_shift_left(significand, u32(-shift)).y;\n }\n\n if (significand24 >= 0x1000000u) {\n significand24 = significand24 >> 1u;\n exponent = exponent + 1;\n if (exponent > 127) {\n return (sign << 31u) | 0x7f800000u;\n }\n }\n\n return (sign << 31u) | (u32(exponent + 127) << 23u) | (significand24 & 0x7fffffu);\n }\n\n let scaleExponent = baseExponent + 149;\n var mantissa: u32;\n if (scaleExponent >= 0) {\n mantissa = fp64_u64_shift_left(significand, u32(scaleExponent)).y;\n } else {\n mantissa = fp64_round_shift_right_to_u32(significand, u32(-scaleExponent));\n }\n\n if (mantissa >= 0x800000u) {\n return (sign << 31u) | 0x00800000u;\n }\n return (sign << 31u) | mantissa;\n}\n\n#ifndef LUMA_FP64_F32_INPUT_ONLY\nfn fp64_decode_bits(bits: vec2u) -> Fp64Bits {\n let sign = bits.x >> 31u;\n let exponentBits = (bits.x >> 20u) & 0x7ffu;\n let fractionHigh = bits.x & 0xfffffu;\n let fractionLow = bits.y;\n let fraction = vec2u(fractionHigh, fractionLow);\n\n if (exponentBits == 0x7ffu) {\n let isInf = fp64_u64_is_zero(fraction);\n return Fp64Bits(sign, 0, vec2u(0u), false, isInf, !isInf);\n }\n\n if (exponentBits == 0u) {\n let isZero = fp64_u64_is_zero(fraction);\n return Fp64Bits(sign, -1022, fraction, isZero, false, false);\n }\n\n return Fp64Bits(sign, i32(exponentBits) - 1023, vec2u((1u << 20u) | fractionHigh, fractionLow), false, false, false);\n}\n\nfn fp64_finite_magnitude_compare(a: Fp64Bits, b: Fp64Bits) -> i32 {\n if (a.exponent != b.exponent) {\n return select(-1, 1, a.exponent > b.exponent);\n }\n return fp64_u64_compare(a.significand, b.significand);\n}\n#endif\n\n#ifndef LUMA_FP64_F32_INPUT_ONLY\nstruct Fp64RawF32Bits {\n sign: u32,\n baseExponent: i32,\n significand: u32,\n isZero: bool,\n isInf: bool,\n isNan: bool,\n};\n\n// Decode an f32 as (-1)^sign * significand * 2^baseExponent. This shared\n// integer representation lets normalization remain independent of the\n// selected double-single arithmetic implementation.\nfn fp64_decode_raw_f32_bits(bits: u32) -> Fp64RawF32Bits {\n let sign = bits >> 31u;\n let exponentBits = (bits >> 23u) & 0xffu;\n let fraction = bits & 0x7fffffu;\n\n if (exponentBits == 0xffu) {\n return Fp64RawF32Bits(sign, 0, 0u, false, fraction == 0u, fraction != 0u);\n }\n if (exponentBits == 0u) {\n return Fp64RawF32Bits(sign, -149, fraction, fraction == 0u, false, false);\n }\n return Fp64RawF32Bits(\n sign,\n i32(exponentBits) - 150,\n 0x800000u | fraction,\n false,\n false,\n false\n );\n}\n\nfn fp64_raw_f32_magnitude_compare(aBits: u32, bBits: u32) -> i32 {\n let aMagnitude = aBits & 0x7fffffffu;\n let bMagnitude = bBits & 0x7fffffffu;\n if (aMagnitude == bMagnitude) {\n return 0;\n }\n return select(-1, 1, aMagnitude > bMagnitude);\n}\n\nfn fp64_make_raw_residual_f32_bits(\n exactSign: u32,\n exactMagnitude: vec2u,\n exactBaseExponent: i32,\n highBits: u32\n) -> u32 {\n if (fp64_u64_is_zero(exactMagnitude)) {\n return 0u;\n }\n\n let high = fp64_decode_raw_f32_bits(highBits);\n if (high.isInf || high.isNan) {\n return 0u;\n }\n if (high.isZero) {\n return fp64_make_f32_bits_from_u64(exactSign, exactMagnitude, exactBaseExponent);\n }\n\n let commonBaseExponent = min(exactBaseExponent, high.baseExponent);\n let exactShift = exactBaseExponent - commonBaseExponent;\n let highShift = high.baseExponent - commonBaseExponent;\n if (exactShift >= 64 || highShift >= 64) {\n return 0u;\n }\n\n let exactAligned = fp64_u64_shift_left(exactMagnitude, u32(exactShift));\n let highAligned = fp64_u64_shift_left(vec2u(0u, high.significand), u32(highShift));\n let comparison = fp64_u64_compare(exactAligned, highAligned);\n if (comparison == 0) {\n return 0u;\n }\n\n var residualSign = exactSign;\n var residualMagnitude: vec2u;\n if (comparison > 0) {\n residualMagnitude = fp64_u64_sub(exactAligned, highAligned);\n } else {\n residualSign = exactSign ^ 1u;\n residualMagnitude = fp64_u64_sub(highAligned, exactAligned);\n }\n return fp64_make_f32_bits_from_u64(\n residualSign,\n residualMagnitude,\n commonBaseExponent\n );\n}\n\nfn fp64_split_raw_accumulator_bits(\n sign: u32,\n magnitude: vec2u,\n baseExponent: i32\n) -> vec2u {\n if (fp64_u64_is_zero(magnitude)) {\n return vec2u(0u);\n }\n let highBits = fp64_make_f32_bits_from_u64(sign, magnitude, baseExponent);\n let rawLowBits = fp64_make_raw_residual_f32_bits(sign, magnitude, baseExponent, highBits);\n let lowBits = select(rawLowBits, 0u, (rawLowBits & 0x7fffffffu) == 0u);\n if ((highBits & 0x7fffffffu) == 0u && (lowBits & 0x7fffffffu) == 0u) {\n return vec2u(0u);\n }\n return vec2u(highBits, lowBits);\n}\n#endif\n\n#ifndef LUMA_FP64_F32_INPUT_ONLY\n// Round an arithmetic accumulator to binary64 before splitting it. The\n// aligned add/subtract paths retain three guard bits plus a sticky bit, which\n// is sufficient for round-to-nearest-even at the binary64 boundary.\nfn fp64_split_binary64_accumulator_bits(\n sign: u32,\n magnitude: vec2u,\n baseExponent: i32\n) -> vec2u {\n if (fp64_u64_is_zero(magnitude)) {\n return vec2u(0u);\n }\n\n let mostSignificantBit = 63u - fp64_u64_count_leading_zeros(magnitude);\n let exponent = baseExponent + i32(mostSignificantBit);\n if (exponent > 1023) {\n return vec2u((sign << 31u) | 0x7f800000u, 0u);\n }\n\n var roundedMagnitude = magnitude;\n var roundedBaseExponent = baseExponent;\n if (exponent >= -1022) {\n if (mostSignificantBit > 52u) {\n let shift = mostSignificantBit - 52u;\n roundedMagnitude = fp64_round_shift_right(magnitude, shift);\n roundedBaseExponent = baseExponent + i32(shift);\n }\n } else {\n let shift = -1074 - baseExponent;\n if (shift > 0) {\n roundedMagnitude = fp64_round_shift_right(magnitude, u32(shift));\n roundedBaseExponent = -1074;\n }\n }\n\n if (fp64_u64_is_zero(roundedMagnitude)) {\n return vec2u(0u);\n }\n return fp64_split_raw_accumulator_bits(sign, roundedMagnitude, roundedBaseExponent);\n}\n#endif\n\n#ifndef LUMA_FP64_PREDICATE_ONLY\nfn fp64_add_raw_f32_bits(aBits: u32, bBits: u32) -> vec2u {\n let a = fp64_decode_raw_f32_bits(aBits);\n let b = fp64_decode_raw_f32_bits(bBits);\n\n if (a.isNan || b.isNan) {\n return vec2u(0x7fc00000u, 0u);\n }\n if (a.isInf || b.isInf) {\n if (a.isInf && b.isInf && a.sign != b.sign) {\n return vec2u(0x7fc00000u, 0u);\n }\n return select(vec2u(bBits, 0u), vec2u(aBits, 0u), a.isInf);\n }\n if (a.isZero && b.isZero) {\n return vec2u(0u);\n }\n if (a.isZero) {\n return vec2u(bBits, 0u);\n }\n if (b.isZero) {\n return vec2u(aBits, 0u);\n }\n\n let exponentDifference = abs(a.baseExponent - b.baseExponent);\n if (exponentDifference > 25) {\n if (fp64_raw_f32_magnitude_compare(aBits, bBits) >= 0) {\n return vec2u(aBits, bBits);\n }\n return vec2u(bBits, aBits);\n }\n\n let commonBaseExponent = min(a.baseExponent, b.baseExponent);\n let aMagnitude = fp64_u64_shift_left(\n vec2u(0u, a.significand),\n u32(a.baseExponent - commonBaseExponent)\n );\n let bMagnitude = fp64_u64_shift_left(\n vec2u(0u, b.significand),\n u32(b.baseExponent - commonBaseExponent)\n );\n\n var resultSign = a.sign;\n var resultMagnitude: vec2u;\n if (a.sign == b.sign) {\n resultMagnitude = fp64_u64_add(aMagnitude, bMagnitude);\n } else {\n let comparison = fp64_u64_compare(aMagnitude, bMagnitude);\n if (comparison == 0) {\n return vec2u(0u);\n }\n if (comparison > 0) {\n resultMagnitude = fp64_u64_sub(aMagnitude, bMagnitude);\n } else {\n resultSign = b.sign;\n resultMagnitude = fp64_u64_sub(bMagnitude, aMagnitude);\n }\n }\n\n return fp64_split_raw_accumulator_bits(\n resultSign,\n resultMagnitude,\n commonBaseExponent\n );\n}\n#endif\n\n#ifndef LUMA_FP64_F32_INPUT_ONLY\nfn fp64_add_aligned_magnitudes_to_fp64_bits(\n sign: u32,\n larger: Fp64Bits,\n smaller: Fp64Bits\n) -> vec2u {\n let largeSignificand = fp64_u64_shift_left(larger.significand, 3u);\n let smallSignificand = fp64_u64_shift_right_sticky(\n fp64_u64_shift_left(smaller.significand, 3u),\n u32(larger.exponent - smaller.exponent)\n );\n let resultSignificand = fp64_u64_add(largeSignificand, smallSignificand);\n return fp64_split_binary64_accumulator_bits(\n sign,\n resultSignificand,\n larger.exponent - 55\n );\n}\n\nfn fp64_sub_aligned_magnitudes_to_fp64_bits(\n sign: u32,\n larger: Fp64Bits,\n smaller: Fp64Bits\n) -> vec2u {\n let largeSignificand = fp64_u64_shift_left(larger.significand, 3u);\n let smallSignificand = fp64_u64_shift_right_sticky(\n fp64_u64_shift_left(smaller.significand, 3u),\n u32(larger.exponent - smaller.exponent)\n );\n let resultSignificand = fp64_u64_sub(largeSignificand, smallSignificand);\n return fp64_split_binary64_accumulator_bits(\n sign,\n resultSignificand,\n larger.exponent - 55\n );\n}\n\nfn fp64_add_aligned_magnitudes_to_f32_bits(sign: u32, larger: Fp64Bits, smaller: Fp64Bits) -> u32 {\n let largeSignificand = fp64_u64_shift_left(larger.significand, 3u);\n let smallSignificand = fp64_u64_shift_right_sticky(\n fp64_u64_shift_left(smaller.significand, 3u),\n u32(larger.exponent - smaller.exponent)\n );\n let resultSignificand = fp64_u64_add(largeSignificand, smallSignificand);\n return fp64_make_f32_bits_from_u64(sign, resultSignificand, larger.exponent - 55);\n}\n\nfn fp64_sub_aligned_magnitudes_to_f32_bits(sign: u32, larger: Fp64Bits, smaller: Fp64Bits) -> u32 {\n let largeSignificand = fp64_u64_shift_left(larger.significand, 3u);\n let smallSignificand = fp64_u64_shift_right_sticky(\n fp64_u64_shift_left(smaller.significand, 3u),\n u32(larger.exponent - smaller.exponent)\n );\n let resultSignificand = fp64_u64_sub(largeSignificand, smallSignificand);\n return fp64_make_f32_bits_from_u64(sign, resultSignificand, larger.exponent - 55);\n}\n\n// Subtract two raw binary64 values and round the exact result once to f32.\n// The input words are canonical high/low words: .x contains sign/exponent/high\n// fraction bits, and .y contains the low 32 fraction bits.\nfn sub_fp64u32_to_f32_bits(aBits: vec2u, bBits: vec2u) -> u32 {\n let a = fp64_decode_bits(aBits);\n let b = fp64_decode_bits(bBits);\n let bSubtractionSign = b.sign ^ 1u;\n\n if (a.isNan || b.isNan) {\n return 0x7fc00000u;\n }\n if (a.isInf && b.isInf) {\n if (a.sign == bSubtractionSign) {\n return (a.sign << 31u) | 0x7f800000u;\n }\n return 0x7fc00000u;\n }\n if (a.isInf) {\n return (a.sign << 31u) | 0x7f800000u;\n }\n if (b.isInf) {\n return (bSubtractionSign << 31u) | 0x7f800000u;\n }\n if (a.isZero && b.isZero) {\n return select(0u, 0x80000000u, a.sign == 1u && b.sign == 0u);\n }\n\n let magnitudeComparison = fp64_finite_magnitude_compare(a, b);\n if (a.sign == bSubtractionSign) {\n if (magnitudeComparison >= 0) {\n return fp64_add_aligned_magnitudes_to_f32_bits(a.sign, a, b);\n }\n return fp64_add_aligned_magnitudes_to_f32_bits(a.sign, b, a);\n }\n\n if (magnitudeComparison == 0) {\n return 0u;\n }\n if (magnitudeComparison > 0) {\n return fp64_sub_aligned_magnitudes_to_f32_bits(a.sign, a, b);\n }\n return fp64_sub_aligned_magnitudes_to_f32_bits(bSubtractionSign, b, a);\n}\n\nfn sub_fp64u32_to_f32(aBits: vec2u, bBits: vec2u) -> f32 {\n return bitcast<f32>(sub_fp64u32_to_f32_bits(aBits, bBits));\n}\n\n// Subtract two raw binary64 values, round once to binary64, then split the\n// result into normalized f32 limbs. Finite results must fit within the f32\n// exponent range; larger magnitudes map to infinity and smaller magnitudes\n// map to zero. The input words use canonical high/low word order.\nfn sub_fp64u32_to_fp64_bits(aBits: vec2u, bBits: vec2u) -> vec2u {\n let a = fp64_decode_bits(aBits);\n let b = fp64_decode_bits(bBits);\n let bSubtractionSign = b.sign ^ 1u;\n\n if (a.isNan || b.isNan) {\n return vec2u(0x7fc00000u, 0u);\n }\n if (a.isInf && b.isInf) {\n if (a.sign == bSubtractionSign) {\n return vec2u((a.sign << 31u) | 0x7f800000u, 0u);\n }\n return vec2u(0x7fc00000u, 0u);\n }\n if (a.isInf) {\n return vec2u((a.sign << 31u) | 0x7f800000u, 0u);\n }\n if (b.isInf) {\n return vec2u((bSubtractionSign << 31u) | 0x7f800000u, 0u);\n }\n if (a.isZero && b.isZero) {\n return vec2u(0u);\n }\n\n let magnitudeComparison = fp64_finite_magnitude_compare(a, b);\n if (a.sign == bSubtractionSign) {\n if (magnitudeComparison >= 0) {\n return fp64_add_aligned_magnitudes_to_fp64_bits(a.sign, a, b);\n }\n return fp64_add_aligned_magnitudes_to_fp64_bits(a.sign, b, a);\n }\n\n if (magnitudeComparison == 0) {\n return vec2u(0u);\n }\n if (magnitudeComparison > 0) {\n return fp64_sub_aligned_magnitudes_to_fp64_bits(a.sign, a, b);\n }\n return fp64_sub_aligned_magnitudes_to_fp64_bits(bSubtractionSign, b, a);\n}\n\nfn sub_fp64u32_to_fp64(aBits: vec2u, bBits: vec2u) -> vec2f {\n let resultBits = sub_fp64u32_to_fp64_bits(aBits, bBits);\n return vec2f(bitcast<f32>(resultBits.x), bitcast<f32>(resultBits.y));\n}\n#endif\n\n#ifndef LUMA_FP64_PREDICATE_ONLY\n// Zero bits the compiler cannot prove are zero: the uniform ONE is 1.0 at runtime.\n// Some WGSL backends compile with fast-math flags (e.g. Firefox WebGPU on Windows, where DXC\n// runs without IEEE strictness). There, a float barrier such as `x + ONE * 0.0` folds away,\n// and the error terms of the double-single transforms are re-associated and lost. An integer\n// OR is opaque to floating-point simplification, and unlike XOR two nested barriers do not\n// cancel. Each rounding step the transforms rely on gets its own barrier.\nfn fp64_runtime_zero_bits() -> u32 {\n return bitcast<u32>(fp64arithmetic.ONE) ^ 0x3f800000u;\n}\n\nfn fp64_runtime_zero() -> f32 {\n return bitcast<f32>(fp64_runtime_zero_bits());\n}\n\nfn prevent_fp64_optimization(value: f32) -> f32 {\n#ifdef LUMA_FP64_CODE_ELIMINATION_WORKAROUND\n return bitcast<f32>(bitcast<u32>(value) | fp64_runtime_zero_bits());\n#else\n return value;\n#endif\n}\n#endif\n\n#ifdef LUMA_FP64_INTEGER_ARITHMETIC\nstruct Fp64F32Bits {\n sign: u32,\n baseExponent: i32,\n significand: u32,\n isZero: bool,\n isInf: bool,\n isNan: bool,\n};\n\n// Decode an f32 as (-1)^sign * significand * 2^baseExponent.\nfn fp64_decode_f32_bits(bits: u32) -> Fp64F32Bits {\n let sign = bits >> 31u;\n let exponentBits = (bits >> 23u) & 0xffu;\n let fraction = bits & 0x7fffffu;\n\n if (exponentBits == 0xffu) {\n return Fp64F32Bits(sign, 0, 0u, false, fraction == 0u, fraction != 0u);\n }\n if (exponentBits == 0u) {\n return Fp64F32Bits(sign, -149, fraction, fraction == 0u, false, false);\n }\n return Fp64F32Bits(sign, i32(exponentBits) - 150, 0x800000u | fraction, false, false, false);\n}\n\nfn fp64_f32_magnitude_compare(aBits: u32, bBits: u32) -> i32 {\n let aMagnitude = aBits & 0x7fffffffu;\n let bMagnitude = bBits & 0x7fffffffu;\n if (aMagnitude == bMagnitude) {\n return 0;\n }\n return select(-1, 1, aMagnitude > bMagnitude);\n}\n\nfn fp64_make_residual_f32_bits(\n exactSign: u32,\n exactMagnitude: vec2u,\n exactBaseExponent: i32,\n highBits: u32\n) -> u32 {\n if (fp64_u64_is_zero(exactMagnitude)) {\n return 0u;\n }\n\n let high = fp64_decode_f32_bits(highBits);\n if (high.isInf || high.isNan) {\n return exactSign << 31u;\n }\n if (high.isZero) {\n return fp64_make_f32_bits_from_u64(exactSign, exactMagnitude, exactBaseExponent);\n }\n\n let commonBaseExponent = min(exactBaseExponent, high.baseExponent);\n let exactShift = exactBaseExponent - commonBaseExponent;\n let highShift = high.baseExponent - commonBaseExponent;\n\n // A normal two-sum/two-product residual never needs a shift this large.\n // This guard gives deterministic underflow behavior outside that contract.\n if (exactShift >= 64 || highShift >= 64) {\n return exactSign << 31u;\n }\n\n let exactAligned = fp64_u64_shift_left(exactMagnitude, u32(exactShift));\n let highAligned = fp64_u64_shift_left(vec2u(0u, high.significand), u32(highShift));\n let comparison = fp64_u64_compare(exactAligned, highAligned);\n if (comparison == 0) {\n return 0u;\n }\n\n var residualSign = exactSign;\n var residualMagnitude: vec2u;\n if (comparison > 0) {\n residualMagnitude = fp64_u64_sub(exactAligned, highAligned);\n } else {\n residualSign = exactSign ^ 1u;\n residualMagnitude = fp64_u64_sub(highAligned, exactAligned);\n }\n return fp64_make_f32_bits_from_u64(\n residualSign,\n residualMagnitude,\n commonBaseExponent\n );\n}\n\nfn fp64_split_accumulator_bits(\n sign: u32,\n magnitude: vec2u,\n baseExponent: i32\n) -> vec2u {\n let highBits = fp64_make_f32_bits_from_u64(sign, magnitude, baseExponent);\n let lowBits = fp64_make_residual_f32_bits(sign, magnitude, baseExponent, highBits);\n return vec2u(highBits, lowBits);\n}\n\nfn fp64_two_sum_integer_bits(aBits: u32, bBits: u32) -> vec2u {\n let a = fp64_decode_f32_bits(aBits);\n let b = fp64_decode_f32_bits(bBits);\n\n if (a.isNan || b.isNan) {\n return vec2u(0x7fc00000u, 0u);\n }\n if (a.isInf || b.isInf) {\n if (a.isInf && b.isInf && a.sign != b.sign) {\n return vec2u(0x7fc00000u, 0u);\n }\n return select(vec2u(bBits, 0u), vec2u(aBits, 0u), a.isInf);\n }\n if (a.isZero && b.isZero) {\n return vec2u((a.sign & b.sign) << 31u, 0u);\n }\n if (a.isZero) {\n return vec2u(bBits, 0u);\n }\n if (b.isZero) {\n return vec2u(aBits, 0u);\n }\n\n let exponentDifference = select(\n b.baseExponent - a.baseExponent,\n a.baseExponent - b.baseExponent,\n a.baseExponent >= b.baseExponent\n );\n\n // Beyond half an ulp, rounding cannot change the larger operand. Returning\n // the smaller operand intact also avoids an unbounded integer alignment.\n // At a power-of-two boundary the spacing below the larger operand is half\n // the spacing above it, so an opposite-sign gap-25 operand can still change\n // the rounded high limb. Gap 26 is the first universally safe early-out.\n if (exponentDifference > 25) {\n if (fp64_f32_magnitude_compare(aBits, bBits) >= 0) {\n return vec2u(aBits, bBits);\n }\n return vec2u(bBits, aBits);\n }\n\n let commonBaseExponent = min(a.baseExponent, b.baseExponent);\n let aMagnitude = fp64_u64_shift_left(\n vec2u(0u, a.significand),\n u32(a.baseExponent - commonBaseExponent)\n );\n let bMagnitude = fp64_u64_shift_left(\n vec2u(0u, b.significand),\n u32(b.baseExponent - commonBaseExponent)\n );\n\n var resultSign = a.sign;\n var resultMagnitude: vec2u;\n if (a.sign == b.sign) {\n resultMagnitude = fp64_u64_add(aMagnitude, bMagnitude);\n } else {\n let comparison = fp64_u64_compare(aMagnitude, bMagnitude);\n if (comparison == 0) {\n return vec2u(0u, 0u);\n }\n if (comparison > 0) {\n resultMagnitude = fp64_u64_sub(aMagnitude, bMagnitude);\n } else {\n resultSign = b.sign;\n resultMagnitude = fp64_u64_sub(bMagnitude, aMagnitude);\n }\n }\n\n return fp64_split_accumulator_bits(resultSign, resultMagnitude, commonBaseExponent);\n}\n\nfn fp64_two_sum_integer(a: f32, b: f32) -> vec2f {\n let resultBits = fp64_two_sum_integer_bits(bitcast<u32>(a), bitcast<u32>(b));\n return vec2f(bitcast<f32>(resultBits.x), bitcast<f32>(resultBits.y));\n}\n\nfn fp64_multiply_significands(a: u32, b: u32) -> vec2u {\n let aLow = a & 0xffffu;\n let aHigh = a >> 16u;\n let bLow = b & 0xffffu;\n let bHigh = b >> 16u;\n let lowProduct = aLow * bLow;\n let crossProduct = aLow * bHigh + aHigh * bLow;\n let highProduct = aHigh * bHigh;\n\n var result = vec2u(0u, lowProduct);\n result = fp64_u64_add(\n result,\n fp64_u64_shift_left(vec2u(0u, crossProduct), 16u)\n );\n result = fp64_u64_add(result, vec2u(highProduct, 0u));\n return result;\n}\n\nfn fp64_two_prod_integer_bits(aBits: u32, bBits: u32) -> vec2u {\n let a = fp64_decode_f32_bits(aBits);\n let b = fp64_decode_f32_bits(bBits);\n let resultSign = a.sign ^ b.sign;\n\n if (a.isNan || b.isNan || ((a.isZero || b.isZero) && (a.isInf || b.isInf))) {\n return vec2u(0x7fc00000u, 0u);\n }\n if (a.isInf || b.isInf) {\n return vec2u((resultSign << 31u) | 0x7f800000u, resultSign << 31u);\n }\n if (a.isZero || b.isZero) {\n return vec2u(resultSign << 31u, resultSign << 31u);\n }\n\n let magnitude = fp64_multiply_significands(a.significand, b.significand);\n return fp64_split_accumulator_bits(\n resultSign,\n magnitude,\n a.baseExponent + b.baseExponent\n );\n}\n\nfn fp64_two_prod_integer(a: f32, b: f32) -> vec2f {\n let resultBits = fp64_two_prod_integer_bits(bitcast<u32>(a), bitcast<u32>(b));\n return vec2f(bitcast<f32>(resultBits.x), bitcast<f32>(resultBits.y));\n}\n\nfn fp64_round_add_integer(a: f32, b: f32) -> f32 {\n return fp64_two_sum_integer(a, b).x;\n}\n\nfn fp64_round_mul_integer(a: f32, b: f32) -> f32 {\n return fp64_two_prod_integer(a, b).x;\n}\n\n#ifndef LUMA_FP64_PREDICATE_ONLY\nfn fp64_f32_finite_exponent(value: Fp64F32Bits) -> i32 {\n let mostSignificantBit = 31u - countLeadingZeros(value.significand);\n return value.baseExponent + i32(mostSignificantBit);\n}\n\nfn fp64_scale_f32_integer(value: f32, exponent: i32) -> f32 {\n let decoded = fp64_decode_f32_bits(bitcast<u32>(value));\n if (decoded.isZero || decoded.isInf || decoded.isNan) {\n return value;\n }\n let resultBits = fp64_make_f32_bits_from_u64(\n decoded.sign,\n vec2u(0u, decoded.significand),\n decoded.baseExponent + exponent\n );\n return bitcast<f32>(resultBits);\n}\n\n// Divide normalized significands so the hardware operation cannot overflow,\n// underflow, or flush a subnormal result. Reapply the exponent with integer\n// packing, which also produces subnormal correction limbs without relying on\n// floating-point arithmetic to preserve them.\nfn fp64_divide_f32_integer(aValue: f32, bValue: f32) -> f32 {\n let a = fp64_decode_f32_bits(bitcast<u32>(aValue));\n let b = fp64_decode_f32_bits(bitcast<u32>(bValue));\n if (a.isZero || b.isZero || a.isInf || b.isInf || a.isNan || b.isNan) {\n return aValue / bValue;\n }\n\n let aMostSignificantBit = 31u - countLeadingZeros(a.significand);\n let bMostSignificantBit = 31u - countLeadingZeros(b.significand);\n let normalizedABits = fp64_make_f32_bits_from_u64(\n a.sign,\n vec2u(0u, a.significand),\n -i32(aMostSignificantBit)\n );\n let normalizedBBits = fp64_make_f32_bits_from_u64(\n b.sign,\n vec2u(0u, b.significand),\n -i32(bMostSignificantBit)\n );\n let normalizedQuotient = bitcast<f32>(normalizedABits) / bitcast<f32>(normalizedBBits);\n let quotient = fp64_decode_f32_bits(bitcast<u32>(normalizedQuotient));\n let exponentShift =\n a.baseExponent + i32(aMostSignificantBit) -\n b.baseExponent - i32(bMostSignificantBit);\n let quotientBits = fp64_make_f32_bits_from_u64(\n quotient.sign,\n vec2u(0u, quotient.significand),\n quotient.baseExponent + exponentShift\n );\n return bitcast<f32>(quotientBits);\n}\n#endif\n\n\n\n#ifndef LUMA_FP64_PREDICATE_ONLY\nfn split(a: f32) -> vec2f {\n let aBits = bitcast<u32>(a);\n let decoded = fp64_decode_f32_bits(aBits);\n if (decoded.isZero || decoded.isInf || decoded.isNan) {\n return vec2f(a, 0.0);\n }\n\n var roundedHigh = decoded.significand >> 12u;\n let remainder = decoded.significand & 0xfffu;\n if (remainder > 0x800u || (remainder == 0x800u && (roundedHigh & 1u) == 1u)) {\n roundedHigh = roundedHigh + 1u;\n }\n var highMagnitude = vec2u(0u, roundedHigh << 12u);\n var highBits = fp64_make_f32_bits_from_u64(\n decoded.sign,\n highMagnitude,\n decoded.baseExponent\n );\n // Rounding the high limb of a maximum-exponent value can overflow even\n // though the original value is finite. Truncate only in that boundary case\n // so split remains an exact finite decomposition.\n if (fp64_decode_f32_bits(highBits).isInf) {\n roundedHigh = decoded.significand >> 12u;\n highMagnitude = vec2u(0u, roundedHigh << 12u);\n highBits = fp64_make_f32_bits_from_u64(\n decoded.sign,\n highMagnitude,\n decoded.baseExponent\n );\n }\n let lowBits = fp64_make_residual_f32_bits(\n decoded.sign,\n vec2u(0u, decoded.significand),\n decoded.baseExponent,\n highBits\n );\n return vec2f(bitcast<f32>(highBits), bitcast<f32>(lowBits));\n}\n\nfn split2(a: vec2f) -> vec2f {\n var result = split(a.x);\n result.y = fp64_round_add_integer(result.y, a.y);\n return result;\n}\n#endif\n\n#ifndef LUMA_FP64_PREDICATE_ONLY\nfn quickTwoSum(a: f32, b: f32) -> vec2f {\n return fp64_two_sum_integer(a, b);\n}\n#endif\n\nfn twoSum(a: f32, b: f32) -> vec2f {\n return fp64_two_sum_integer(a, b);\n}\n\nfn twoSub(a: f32, b: f32) -> vec2f {\n let bBits = bitcast<u32>(b) ^ 0x80000000u;\n let resultBits = fp64_two_sum_integer_bits(bitcast<u32>(a), bBits);\n return vec2f(bitcast<f32>(resultBits.x), bitcast<f32>(resultBits.y));\n}\n\n#ifndef LUMA_FP64_PREDICATE_ONLY\nfn twoSqr(a: f32) -> vec2f {\n return fp64_two_prod_integer(a, a);\n}\n\nfn twoProd(a: f32, b: f32) -> vec2f {\n return fp64_two_prod_integer(a, b);\n}\n#endif\n\nstruct Fp64IntegerAccumulator {\n sign: u32,\n magnitude: vec2u,\n};\n\nfn fp64_accumulate_f32_integer(\n accumulator: Fp64IntegerAccumulator,\n value: Fp64F32Bits,\n commonBaseExponent: i32\n) -> Fp64IntegerAccumulator {\n if (value.isZero) {\n return accumulator;\n }\n\n let magnitude = fp64_u64_shift_left(\n vec2u(0u, value.significand),\n u32(value.baseExponent - commonBaseExponent)\n );\n if (fp64_u64_is_zero(accumulator.magnitude)) {\n return Fp64IntegerAccumulator(value.sign, magnitude);\n }\n if (accumulator.sign == value.sign) {\n return Fp64IntegerAccumulator(\n accumulator.sign,\n fp64_u64_add(accumulator.magnitude, magnitude)\n );\n }\n\n let comparison = fp64_u64_compare(accumulator.magnitude, magnitude);\n if (comparison == 0) {\n return Fp64IntegerAccumulator(0u, vec2u(0u));\n }\n if (comparison > 0) {\n return Fp64IntegerAccumulator(\n accumulator.sign,\n fp64_u64_sub(accumulator.magnitude, magnitude)\n );\n }\n return Fp64IntegerAccumulator(\n value.sign,\n fp64_u64_sub(magnitude, accumulator.magnitude)\n );\n}\n\nfn fp64_sum_integer_unfused(a: vec2f, b: vec2f) -> vec2f {\n var sum = fp64_two_sum_integer(a.x, b.x);\n let lowSum = fp64_two_sum_integer(a.y, b.y);\n sum.y = fp64_round_add_integer(sum.y, lowSum.x);\n sum = fp64_two_sum_integer(sum.x, sum.y);\n sum.y = fp64_round_add_integer(sum.y, lowSum.y);\n return fp64_two_sum_integer(sum.x, sum.y);\n}\n\nfn sum_fp64(a: vec2f, b: vec2f) -> vec2f {\n let aHigh = fp64_decode_f32_bits(bitcast<u32>(a.x));\n let aLow = fp64_decode_f32_bits(bitcast<u32>(a.y));\n let bHigh = fp64_decode_f32_bits(bitcast<u32>(b.x));\n let bLow = fp64_decode_f32_bits(bitcast<u32>(b.y));\n if (\n aHigh.isInf || aHigh.isNan || aLow.isInf || aLow.isNan ||\n bHigh.isInf || bHigh.isNan || bLow.isInf || bLow.isNan\n ) {\n return fp64_sum_integer_unfused(a, b);\n }\n\n var minimumBaseExponent = 2147483647;\n var maximumBaseExponent = -2147483647;\n if (!aHigh.isZero) {\n minimumBaseExponent = min(minimumBaseExponent, aHigh.baseExponent);\n maximumBaseExponent = max(maximumBaseExponent, aHigh.baseExponent);\n }\n if (!aLow.isZero) {\n minimumBaseExponent = min(minimumBaseExponent, aLow.baseExponent);\n maximumBaseExponent = max(maximumBaseExponent, aLow.baseExponent);\n }\n if (!bHigh.isZero) {\n minimumBaseExponent = min(minimumBaseExponent, bHigh.baseExponent);\n maximumBaseExponent = max(maximumBaseExponent, bHigh.baseExponent);\n }\n if (!bLow.isZero) {\n minimumBaseExponent = min(minimumBaseExponent, bLow.baseExponent);\n maximumBaseExponent = max(maximumBaseExponent, bLow.baseExponent);\n }\n if (maximumBaseExponent < minimumBaseExponent) {\n return vec2f(0.0, 0.0);\n }\n\n // Four 24-bit significands spanning at most 38 bits fit in the 64-bit\n // accumulator, including the two extra carry bits needed by their sum.\n if (maximumBaseExponent - minimumBaseExponent > 38) {\n return fp64_sum_integer_unfused(a, b);\n }\n\n var accumulator = Fp64IntegerAccumulator(0u, vec2u(0u));\n accumulator = fp64_accumulate_f32_integer(accumulator, aHigh, minimumBaseExponent);\n accumulator = fp64_accumulate_f32_integer(accumulator, aLow, minimumBaseExponent);\n accumulator = fp64_accumulate_f32_integer(accumulator, bHigh, minimumBaseExponent);\n accumulator = fp64_accumulate_f32_integer(accumulator, bLow, minimumBaseExponent);\n let resultBits = fp64_split_accumulator_bits(\n accumulator.sign,\n accumulator.magnitude,\n minimumBaseExponent\n );\n return vec2f(bitcast<f32>(resultBits.x), bitcast<f32>(resultBits.y));\n}\n\nfn sub_fp64(a: vec2f, b: vec2f) -> vec2f {\n let negatedB = vec2f(\n bitcast<f32>(bitcast<u32>(b.x) ^ 0x80000000u),\n bitcast<f32>(bitcast<u32>(b.y) ^ 0x80000000u)\n );\n return sum_fp64(a, negatedB);\n}\n\nfn mul_fp64(a: vec2f, b: vec2f) -> vec2f {\n var product = fp64_two_prod_integer(a.x, b.x);\n let crossProduct1 = fp64_round_mul_integer(a.x, b.y);\n product = sum_fp64(product, vec2f(crossProduct1, 0.0));\n let crossProduct2 = fp64_round_mul_integer(a.y, b.x);\n return sum_fp64(product, vec2f(crossProduct2, 0.0));\n}\n\n#ifndef LUMA_FP64_PREDICATE_ONLY\nfn fp64_scale_fp64_integer(value: vec2f, exponent: i32) -> vec2f {\n let high = fp64_scale_f32_integer(value.x, exponent);\n let low = fp64_scale_f32_integer(value.y, exponent);\n return sum_fp64(vec2f(high, 0.0), vec2f(low, 0.0));\n}\n\nfn fp64_div_fp64_normalized(a: vec2f, b: vec2f) -> vec2f {\n let quotientHigh = fp64_divide_f32_integer(a.x, b.x);\n var quotient = vec2f(quotientHigh, 0.0);\n\n let remainder = sub_fp64(a, mul_fp64(b, quotient));\n let quotientLow = fp64_divide_f32_integer(remainder.x, b.x);\n quotient = sum_fp64(quotient, vec2f(quotientLow, 0.0));\n\n let secondRemainder = sub_fp64(a, mul_fp64(b, quotient));\n let correction = fp64_divide_f32_integer(secondRemainder.x, b.x);\n return sum_fp64(quotient, vec2f(correction, 0.0));\n}\n\nfn div_fp64(a: vec2f, b: vec2f) -> vec2f {\n let decodedA = fp64_decode_f32_bits(bitcast<u32>(a.x));\n let decodedB = fp64_decode_f32_bits(bitcast<u32>(b.x));\n if (\n decodedA.isZero || decodedB.isZero ||\n decodedA.isInf || decodedB.isInf ||\n decodedA.isNan || decodedB.isNan\n ) {\n return fp64_div_fp64_normalized(a, b);\n }\n\n let exponentA = fp64_f32_finite_exponent(decodedA);\n let exponentB = fp64_f32_finite_exponent(decodedB);\n // Correct the quotient near unity so b * q and the remainder stay clear of\n // both f32 underflow and overflow. The exponent difference is applied once.\n let normalizedA = fp64_scale_fp64_integer(a, -exponentA);\n let normalizedB = fp64_scale_fp64_integer(b, -exponentB);\n let normalizedQuotient = fp64_div_fp64_normalized(normalizedA, normalizedB);\n return fp64_scale_fp64_integer(normalizedQuotient, exponentA - exponentB);\n}\n\nfn fp64_sqrt_fp64_normalized(a: vec2f) -> vec2f {\n let estimate = sqrt(a.x);\n let difference = sub_fp64(a, fp64_two_prod_integer(estimate, estimate)).x;\n let denominator = fp64_round_add_integer(estimate, estimate);\n let correction = fp64_divide_f32_integer(difference, denominator);\n return sum_fp64(vec2f(estimate, 0.0), vec2f(correction, 0.0));\n}\n\nfn sqrt_fp64(a: vec2f) -> vec2f {\n let decoded = fp64_decode_f32_bits(bitcast<u32>(a.x));\n let decodedLow = fp64_decode_f32_bits(bitcast<u32>(a.y));\n if (decoded.isZero && decodedLow.isZero) {\n return vec2f(0.0, 0.0);\n }\n if (decoded.sign == 1u) {\n let nanValue = fp64_nan(a.x);\n return vec2f(nanValue, nanValue);\n }\n\n if (decoded.isInf || decoded.isNan) {\n return fp64_sqrt_fp64_normalized(a);\n }\n let exponent = fp64_f32_finite_exponent(decoded);\n // An even scale lets the final square-root rescale use an integer exponent.\n let evenExponent = exponent - (exponent & 1);\n let normalizedA = fp64_scale_fp64_integer(a, -evenExponent);\n let normalizedRoot = fp64_sqrt_fp64_normalized(normalizedA);\n return fp64_scale_fp64_integer(normalizedRoot, evenExponent / 2);\n}\n#endif\n\n#else\n#ifdef LUMA_FP64_HYBRID_ARITHMETIC\nstruct Fp64F32Bits {\n sign: u32,\n baseExponent: i32,\n significand: u32,\n isZero: bool,\n isInf: bool,\n isNan: bool,\n};\n\n// Decode an f32 as (-1)^sign * significand * 2^baseExponent.\nfn fp64_decode_f32_bits(bits: u32) -> Fp64F32Bits {\n let sign = bits >> 31u;\n let exponentBits = (bits >> 23u) & 0xffu;\n let fraction = bits & 0x7fffffu;\n\n if (exponentBits == 0xffu) {\n return Fp64F32Bits(sign, 0, 0u, false, fraction == 0u, fraction != 0u);\n }\n if (exponentBits == 0u) {\n return Fp64F32Bits(sign, -149, fraction, fraction == 0u, false, false);\n }\n return Fp64F32Bits(sign, i32(exponentBits) - 150, 0x800000u | fraction, false, false, false);\n}\n\nfn fp64_f32_magnitude_compare(aBits: u32, bBits: u32) -> i32 {\n let aMagnitude = aBits & 0x7fffffffu;\n let bMagnitude = bBits & 0x7fffffffu;\n if (aMagnitude == bMagnitude) {\n return 0;\n }\n return select(-1, 1, aMagnitude > bMagnitude);\n}\n\nfn fp64_make_residual_f32_bits(\n exactSign: u32,\n exactMagnitude: vec2u,\n exactBaseExponent: i32,\n highBits: u32\n) -> u32 {\n if (fp64_u64_is_zero(exactMagnitude)) {\n return 0u;\n }\n\n let high = fp64_decode_f32_bits(highBits);\n if (high.isInf || high.isNan) {\n return exactSign << 31u;\n }\n if (high.isZero) {\n return fp64_make_f32_bits_from_u64(exactSign, exactMagnitude, exactBaseExponent);\n }\n\n let commonBaseExponent = min(exactBaseExponent, high.baseExponent);\n let exactShift = exactBaseExponent - commonBaseExponent;\n let highShift = high.baseExponent - commonBaseExponent;\n\n // A normal two-sum/two-product residual never needs a shift this large.\n // This guard gives deterministic underflow behavior outside that contract.\n if (exactShift >= 64 || highShift >= 64) {\n return exactSign << 31u;\n }\n\n let exactAligned = fp64_u64_shift_left(exactMagnitude, u32(exactShift));\n let highAligned = fp64_u64_shift_left(vec2u(0u, high.significand), u32(highShift));\n let comparison = fp64_u64_compare(exactAligned, highAligned);\n if (comparison == 0) {\n return 0u;\n }\n\n var residualSign = exactSign;\n var residualMagnitude: vec2u;\n if (comparison > 0) {\n residualMagnitude = fp64_u64_sub(exactAligned, highAligned);\n } else {\n residualSign = exactSign ^ 1u;\n residualMagnitude = fp64_u64_sub(highAligned, exactAligned);\n }\n return fp64_make_f32_bits_from_u64(\n residualSign,\n residualMagnitude,\n commonBaseExponent\n );\n}\n\nfn fp64_split_accumulator_bits(\n sign: u32,\n magnitude: vec2u,\n baseExponent: i32\n) -> vec2u {\n let highBits = fp64_make_f32_bits_from_u64(sign, magnitude, baseExponent);\n let lowBits = fp64_make_residual_f32_bits(sign, magnitude, baseExponent, highBits);\n return vec2u(highBits, lowBits);\n}\n\nfn fp64_two_sum_integer_bits(aBits: u32, bBits: u32) -> vec2u {\n let a = fp64_decode_f32_bits(aBits);\n let b = fp64_decode_f32_bits(bBits);\n\n if (a.isNan || b.isNan) {\n return vec2u(0x7fc00000u, 0u);\n }\n if (a.isInf || b.isInf) {\n if (a.isInf && b.isInf && a.sign != b.sign) {\n return vec2u(0x7fc00000u, 0u);\n }\n return select(vec2u(bBits, 0u), vec2u(aBits, 0u), a.isInf);\n }\n if (a.isZero && b.isZero) {\n return vec2u((a.sign & b.sign) << 31u, 0u);\n }\n if (a.isZero) {\n return vec2u(bBits, 0u);\n }\n if (b.isZero) {\n return vec2u(aBits, 0u);\n }\n\n let exponentDifference = select(\n b.baseExponent - a.baseExponent,\n a.baseExponent - b.baseExponent,\n a.baseExponent >= b.baseExponent\n );\n\n // Beyond half an ulp, rounding cannot change the larger operand. Returning\n // the smaller operand intact also avoids an unbounded integer alignment.\n // At a power-of-two boundary the spacing below the larger operand is half\n // the spacing above it, so an opposite-sign gap-25 operand can still change\n // the rounded high limb. Gap 26 is the first universally safe early-out.\n if (exponentDifference > 25) {\n if (fp64_f32_magnitude_compare(aBits, bBits) >= 0) {\n return vec2u(aBits, bBits);\n }\n return vec2u(bBits, aBits);\n }\n\n let commonBaseExponent = min(a.baseExponent, b.baseExponent);\n let aMagnitude = fp64_u64_shift_left(\n vec2u(0u, a.significand),\n u32(a.baseExponent - commonBaseExponent)\n );\n let bMagnitude = fp64_u64_shift_left(\n vec2u(0u, b.significand),\n u32(b.baseExponent - commonBaseExponent)\n );\n\n var resultSign = a.sign;\n var resultMagnitude: vec2u;\n if (a.sign == b.sign) {\n resultMagnitude = fp64_u64_add(aMagnitude, bMagnitude);\n } else {\n let comparison = fp64_u64_compare(aMagnitude, bMagnitude);\n if (comparison == 0) {\n return vec2u(0u, 0u);\n }\n if (comparison > 0) {\n resultMagnitude = fp64_u64_sub(aMagnitude, bMagnitude);\n } else {\n resultSign = b.sign;\n resultMagnitude = fp64_u64_sub(bMagnitude, aMagnitude);\n }\n }\n\n return fp64_split_accumulator_bits(resultSign, resultMagnitude, commonBaseExponent);\n}\n\nfn fp64_two_sum_integer(a: f32, b: f32) -> vec2f {\n let resultBits = fp64_two_sum_integer_bits(bitcast<u32>(a), bitcast<u32>(b));\n return vec2f(bitcast<f32>(resultBits.x), bitcast<f32>(resultBits.y));\n}\n\nfn fp64_multiply_significands(a: u32, b: u32) -> vec2u {\n let aLow = a & 0xffffu;\n let aHigh = a >> 16u;\n let bLow = b & 0xffffu;\n let bHigh = b >> 16u;\n let lowProduct = aLow * bLow;\n let crossProduct = aLow * bHigh + aHigh * bLow;\n let highProduct = aHigh * bHigh;\n\n var result = vec2u(0u, lowProduct);\n result = fp64_u64_add(\n result,\n fp64_u64_shift_left(vec2u(0u, crossProduct), 16u)\n );\n result = fp64_u64_add(result, vec2u(highProduct, 0u));\n return result;\n}\n\nfn fp64_two_prod_integer_bits(aBits: u32, bBits: u32) -> vec2u {\n let a = fp64_decode_f32_bits(aBits);\n let b = fp64_decode_f32_bits(bBits);\n let resultSign = a.sign ^ b.sign;\n\n if (a.isNan || b.isNan || ((a.isZero || b.isZero) && (a.isInf || b.isInf))) {\n return vec2u(0x7fc00000u, 0u);\n }\n if (a.isInf || b.isInf) {\n return vec2u((resultSign << 31u) | 0x7f800000u, resultSign << 31u);\n }\n if (a.isZero || b.isZero) {\n return vec2u(resultSign << 31u, resultSign << 31u);\n }\n\n let magnitude = fp64_multiply_significands(a.significand, b.significand);\n return fp64_split_accumulator_bits(\n resultSign,\n magnitude,\n a.baseExponent + b.baseExponent\n );\n}\n\nfn fp64_two_prod_integer(a: f32, b: f32) -> vec2f {\n let resultBits = fp64_two_prod_integer_bits(bitcast<u32>(a), bitcast<u32>(b));\n return vec2f(bitcast<f32>(resultBits.x), bitcast<f32>(resultBits.y));\n}\n\nfn fp64_round_add_integer(a: f32, b: f32) -> f32 {\n return fp64_two_sum_integer(a, b).x;\n}\n\nfn fp64_round_mul_integer(a: f32, b: f32) -> f32 {\n return fp64_two_prod_integer(a, b).x;\n}\n\n#ifndef LUMA_FP64_PREDICATE_ONLY\nfn fp64_f32_finite_exponent(value: Fp64F32Bits) -> i32 {\n let mostSignificantBit = 31u - countLeadingZeros(value.significand);\n return value.baseExponent + i32(mostSignificantBit);\n}\n\nfn fp64_scale_f32_integer(value: f32, exponent: i32) -> f32 {\n let decoded = fp64_decode_f32_bits(bitcast<u32>(value));\n if (decoded.isZero || decoded.isInf || decoded.isNan) {\n return value;\n }\n let resultBits = fp64_make_f32_bits_from_u64(\n decoded.sign,\n vec2u(0u, decoded.significand),\n decoded.baseExponent + exponent\n );\n return bitcast<f32>(resultBits);\n}\n\n// Divide normalized significands so the hardware operation cannot overflow,\n// underflow, or flush a subnormal result. Reapply the exponent with integer\n// packing, which also produces subnormal correction limbs without relying on\n// floating-point arithmetic to preserve them.\nfn fp64_divide_f32_integer(aValue: f32, bValue: f32) -> f32 {\n let a = fp64_decode_f32_bits(bitcast<u32>(aValue));\n let b = fp64_decode_f32_bits(bitcast<u32>(bValue));\n if (a.isZero || b.isZero || a.isInf || b.isInf || a.isNan || b.isNan) {\n return aValue / bValue;\n }\n\n let aMostSignificantBit = 31u - countLeadingZeros(a.significand);\n let bMostSignificantBit = 31u - countLeadingZeros(b.significand);\n let normalizedABits = fp64_make_f32_bits_from_u64(\n a.sign,\n vec2u(0u, a.significand),\n -i32(aMostSignificantBit)\n );\n let normalizedBBits = fp64_make_f32_bits_from_u64(\n b.sign,\n vec2u(0u, b.significand),\n -i32(bMostSignificantBit)\n );\n let normalizedQuotient = bitcast<f32>(normalizedABits) / bitcast<f32>(normalizedBBits);\n let quotient = fp64_decode_f32_bits(bitcast<u32>(normalizedQuotient));\n let exponentShift =\n a.baseExponent + i32(aMostSignificantBit) -\n b.baseExponent - i32(bMostSignificantBit);\n let quotientBits = fp64_make_f32_bits_from_u64(\n quotient.sign,\n vec2u(0u, quotient.significand),\n quotient.baseExponent + exponentShift\n );\n return bitcast<f32>(quotientBits);\n}\n#endif\n\n\n\n#ifndef LUMA_FP64_PREDICATE_ONLY\nfn split(a: f32) -> vec2f {\n let aBits = bitcast<u32>(a);\n let decoded = fp64_decode_f32_bits(aBits);\n if (decoded.isZero || decoded.isInf || decoded.isNan) {\n return vec2f(a, 0.0);\n }\n\n var roundedHigh = decoded.significand >> 12u;\n let remainder = decoded.significand & 0xfffu;\n if (remainder > 0x800u || (remainder == 0x800u && (roundedHigh & 1u) == 1u)) {\n roundedHigh = roundedHigh + 1u;\n }\n var highMagnitude = vec2u(0u, roundedHigh << 12u);\n var highBits = fp64_make_f32_bits_from_u64(\n decoded.sign,\n highMagnitude,\n decoded.baseExponent\n );\n if (fp64_decode_f32_bits(highBits).isInf) {\n roundedHigh = decoded.significand >> 12u;\n highMagnitude = vec2u(0u, roundedHigh << 12u);\n highBits = fp64_make_f32_bits_from_u64(\n decoded.sign,\n highMagnitude,\n decoded.baseExponent\n );\n }\n let lowBits = fp64_make_residual_f32_bits(\n decoded.sign,\n vec2u(0u, decoded.significand),\n decoded.baseExponent,\n highBits\n );\n return vec2f(bitcast<f32>(highBits), bitcast<f32>(lowBits));\n}\n\nfn split2(a: vec2f) -> vec2f {\n var result = split(a.x);\n result.y = result.y + a.y;\n return result;\n}\n\nfn quickTwoSum(a: f32, b: f32) -> vec2f {\n return fp64_two_sum_integer(a, b);\n}\n#endif\n\nfn twoSum(a: f32, b: f32) -> vec2f {\n return fp64_two_sum_integer(a, b);\n}\n\nfn twoSub(a: f32, b: f32) -> vec2f {\n let bBits = bitcast<u32>(b) ^ 0x80000000u;\n let resultBits = fp64_two_sum_integer_bits(bitcast<u32>(a), bBits);\n return vec2f(bitcast<f32>(resultBits.x), bitcast<f32>(resultBits.y));\n}\n\n#ifndef LUMA_FP64_PREDICATE_ONLY\nfn twoSqr(a: f32) -> vec2f {\n return fp64_two_prod_integer(a, a);\n}\n\nfn twoProd(a: f32, b: f32) -> vec2f {\n return fp64_two_prod_integer(a, b);\n}\n#endif\n\nfn sum_fp64(a: vec2f, b: vec2f) -> vec2f {\n let highSum = fp64_two_sum_integer(a.x, b.x);\n let lowSum = prevent_fp64_optimization((a.y + b.y) + highSum.y);\n return fp64_two_sum_integer(highSum.x, lowSum);\n}\n\nfn sub_fp64(a: vec2f, b: vec2f) -> vec2f {\n let highDifference = twoSub(a.x, b.x);\n let lowDifference = prevent_fp64_optimization((a.y - b.y) + highDifference.y);\n return fp64_two_sum_integer(highDifference.x, lowDifference);\n}\n\nfn mul_fp64(a: vec2f, b: vec2f) -> vec2f {\n let highProduct = fp64_two_prod_integer(a.x, b.x);\n let crossTerms = prevent_fp64_optimization(a.x * b.y + a.y * b.x);\n let lowTerms = prevent_fp64_optimization((crossTerms + a.y * b.y) + highProduct.y);\n return fp64_two_sum_integer(highProduct.x, lowTerms);\n}\n\n#ifndef LUMA_FP64_PREDICATE_ONLY\nfn div_fp64(a: vec2f, b: vec2f) -> vec2f {\n let estimate = prevent_fp64_optimization(1.0 / b.x);\n let quotient = mul_fp64(a, vec2f(estimate, fp64_runtime_zero()));\n let remainder = prevent_fp64_optimization(sub_fp64(a, mul_fp64(b, quotient)).x);\n return sum_fp64(quotient, twoProd(estimate, remainder));\n}\n\nfn sqrt_fp64(a: vec2f) -> vec2f {\n if (a.x == 0.0 && a.y == 0.0) {\n return vec2f(0.0, 0.0);\n }\n if (a.x < 0.0) {\n let nanValue = fp64_nan(a.x);\n return vec2f(nanValue, nanValue);\n }\n\n let reciprocalRoot = prevent_fp64_optimization(1.0 / sqrt(a.x));\n let estimate = prevent_fp64_optimization(a.x * reciprocalRoot);\n let difference = prevent_fp64_optimization(sub_fp64(a, twoSqr(estimate)).x);\n let correction = twoProd(prevent_fp64_optimization(reciprocalRoot * 0.5), difference);\n return sum_fp64(vec2f(estimate, 0.0), correction);\n}\n#endif\n\n#else\nfn split(a: f32) -> vec2f {\n let splitValue = prevent_fp64_optimization(fp64arithmetic.SPLIT + fp64_runtime_zero());\n let t = prevent_fp64_optimization(a * splitValue);\n let temp = prevent_fp64_optimization(t - a);\n let aHi = prevent_fp64_optimization(t - temp);\n let aLo = prevent_fp64_optimization(a - aHi);\n return vec2f(aHi, aLo);\n}\n\nfn split2(a: vec2f) -> vec2f {\n var b = split(a.x);\n b.y = prevent_fp64_optimization(b.y + a.y);\n return b;\n}\n\nfn quickTwoSum(a: f32, b: f32) -> vec2f {\n let sum = prevent_fp64_optimization(a + b);\n let err = prevent_fp64_optimization(b - prevent_fp64_optimization(sum - a));\n return vec2f(sum, err);\n}\n\nfn twoSum(a: f32, b: f32) -> vec2f {\n let s = prevent_fp64_optimization(a + b);\n let v = prevent_fp64_optimization(s - a);\n let aErr = prevent_fp64_optimization(a - prevent_fp64_optimization(s - v));\n let bErr = prevent_fp64_optimization(b - v);\n let err = prevent_fp64_optimization(aErr + bErr);\n return vec2f(s, err);\n}\n\nfn twoSub(a: f32, b: f32) -> vec2f {\n let s = prevent_fp64_optimization(a - b);\n let v = prevent_fp64_optimization(s - a);\n let aErr = prevent_fp64_optimization(a - prevent_fp64_optimization(s - v));\n let bErr = prevent_fp64_optimization(b + v);\n let err = prevent_fp64_optimization(aErr - bErr);\n return vec2f(s, err);\n}\n\nfn twoSqr(a: f32) -> vec2f {\n let prod = prevent_fp64_optimization(a * a);\n let aFp64 = split(a);\n let highProduct = prevent_fp64_optimization(aFp64.x * aFp64.x);\n let crossProduct = prevent_fp64_optimization(2.0 * aFp64.x * aFp64.y);\n let lowProduct = prevent_fp64_optimization(aFp64.y * aFp64.y);\n let highErr = prevent_fp64_optimization(highProduct - prod);\n let err = prevent_fp64_optimization(\n prevent_fp64_optimization(highErr + crossProduct) + lowProduct\n );\n return vec2f(prod, err);\n}\n\nfn twoProd(a: f32, b: f32) -> vec2f {\n let prod = prevent_fp64_optimization(a * b);\n let aFp64 = split(a);\n let bFp64 = split(b);\n let highProduct = prevent_fp64_optimization(aFp64.x * bFp64.x);\n let crossProduct1 = prevent_fp64_optimization(aFp64.x * bFp64.y);\n let crossProduct2 = prevent_fp64_optimization(aFp64.y * bFp64.x);\n let lowProduct = prevent_fp64_optimization(aFp64.y * bFp64.y);\n#ifdef LUMA_FP64_CODE_ELIMINATION_WORKAROUND\n let err1 = (highProduct - prod) * fp64arithmetic.ONE;\n let err2 = crossProduct1 * fp64arithmetic.ONE * fp64arithmetic.ONE;\n let err3 = crossProduct2 * fp64arithmetic.ONE * fp64arithmetic.ONE * fp64arithmetic.ONE;\n let err4 =\n lowProduct *\n fp64arithmetic.ONE *\n fp64arithmetic.ONE *\n fp64arithmetic.ONE *\n fp64arithmetic.ONE;\n#else\n let err1 = highProduct - prod;\n let err2 = crossProduct1;\n let err3 = crossProduct2;\n let err4 = lowProduct;\n#endif\n let err12InputA = prevent_fp64_optimization(err1);\n let err12InputB = prevent_fp64_optimization(err2);\n let err12 = prevent_fp64_optimization(err12InputA + err12InputB);\n let err123InputA = prevent_fp64_optimization(err12);\n let err123InputB = prevent_fp64_optimization(err3);\n let err123 = prevent_fp64_optimization(err123InputA + err123InputB);\n let err1234InputA = prevent_fp64_optimization(err123);\n let err1234InputB = prevent_fp64_optimization(err4);\n let err = prevent_fp64_optimization(err1234InputA + err1234InputB);\n return vec2f(prod, err);\n}\n\nfn sum_fp64(a: vec2f, b: vec2f) -> vec2f {\n var s = twoSum(a.x, b.x);\n let t = twoSum(a.y, b.y);\n s.y = prevent_fp64_optimization(s.y + t.x);\n s = quickTwoSum(s.x, s.y);\n s.y = prevent_fp64_optimization(s.y + t.y);\n s = quickTwoSum(s.x, s.y);\n return s;\n}\n\nfn sub_fp64(a: vec2f, b: vec2f) -> vec2f {\n var s = twoSub(a.x, b.x);\n let t = twoSub(a.y, b.y);\n s.y = prevent_fp64_optimization(s.y + t.x);\n s = quickTwoSum(s.x, s.y);\n s.y = prevent_fp64_optimization(s.y + t.y);\n s = quickTwoSum(s.x, s.y);\n return s;\n}\n\nfn mul_fp64(a: vec2f, b: vec2f) -> vec2f {\n var prod = twoProd(a.x, b.x);\n let crossProduct1 = prevent_fp64_optimization(a.x * b.y);\n prod.y = prevent_fp64_optimization(prod.y + crossProduct1);\n#ifdef LUMA_FP64_HIGH_BITS_OVERFLOW_WORKAROUND\n prod = split2(prod);\n#endif\n prod = quickTwoSum(prod.x, prod.y);\n let crossProduct2 = prevent_fp64_optimization(a.y * b.x);\n prod.y = prevent_fp64_optimization(prod.y + crossProduct2);\n#ifdef LUMA_FP64_HIGH_BITS_OVERFLOW_WORKAROUND\n prod = split2(prod);\n#endif\n prod = quickTwoSum(prod.x, prod.y);\n return prod;\n}\n\n#ifndef LUMA_FP64_PREDICATE_ONLY\nfn div_fp64(a: vec2f, b: vec2f) -> vec2f {\n let xn = prevent_fp64_optimization(1.0 / b.x);\n let yn = mul_fp64(a, vec2f(xn, fp64_runtime_zero()));\n let diff = prevent_fp64_optimization(sub_fp64(a, mul_fp64(b, yn)).x);\n let prod = twoProd(xn, diff);\n return sum_fp64(yn, prod);\n}\n\nfn sqrt_fp64(a: vec2f) -> vec2f {\n if (a.x == 0.0 && a.y == 0.0) {\n return vec2f(0.0, 0.0);\n }\n if (a.x < 0.0) {\n let nanValue = fp64_nan(a.x);\n return vec2f(nanValue, nanValue);\n }\n\n let x = prevent_fp64_optimization(1.0 / sqrt(a.x));\n let yn = prevent_fp64_optimization(a.x * x);\n#ifdef LUMA_FP64_CODE_ELIMINATION_WORKAROUND\n let ynSqr = twoSqr(yn) * fp64arithmetic.ONE;\n#else\n let ynSqr = twoSqr(yn);\n#endif\n let diff = prevent_fp64_optimization(sub_fp64(a, ynSqr).x);\n let prod = twoProd(prevent_fp64_optimization(x * 0.5), diff);\n#ifdef LUMA_FP64_HIGH_BITS_OVERFLOW_WORKAROUND\n return sum_fp64(split(yn), prod);\n#else\n return sum_fp64(vec2f(yn, 0.0), prod);\n#endif\n}\n#endif\n#endif\n#endif\n\n#ifndef LUMA_FP64_PREDICATE_ONLY\nfn fp64_f32_bits_is_nan(bits: u32) -> bool {\n return (bits & 0x7fffffffu) > 0x7f800000u;\n}\n\nfn fp64_f32_bits_is_inf(bits: u32) -> bool {\n return (bits & 0x7fffffffu) == 0x7f800000u;\n}\n\nfn fp64_compare_f32_bits(aBits: u32, bBits: u32) -> i32 {\n let aMagnitude = aBits & 0x7fffffffu;\n let bMagnitude = bBits & 0x7fffffffu;\n if (aMagnitude == 0u && bMagnitude == 0u) {\n return 0;\n }\n let aSign = aBits >> 31u;\n let bSign = bBits >> 31u;\n if (aSign != bSign) {\n return select(1, -1, aSign == 1u);\n }\n if (aMagnitude == bMagnitude) {\n return 0;\n }\n let magnitudeComparison = select(-1, 1, aMagnitude > bMagnitude);\n return select(magnitudeComparison, -magnitudeComparison, aSign == 1u);\n}\n\n// Normalize an arbitrary pair of finite f32 limbs with integer accumulation.\n// This is independent of LUMA_FP64_INTEGER_ARITHMETIC and canonicalizes every\n// representation of zero to vec2f(+0.0, +0.0).\nfn normalize_fp64(value: vec2f) -> vec2f {\n let resultBits = fp64_add_raw_f32_bits(bitcast<u32>(value.x), bitcast<u32>(value.y));\n return vec2f(bitcast<f32>(resultBits.x), bitcast<f32>(resultBits.y));\n}\n\nfn is_nan_fp64(value: vec2f) -> bool {\n let normalized = normalize_fp64(value);\n return fp64_f32_bits_is_nan(bitcast<u32>(normalized.x)) ||\n fp64_f32_bits_is_nan(bitcast<u32>(normalized.y));\n}\n\nfn is_finite_fp64(value: vec2f) -> bool {\n let normalized = normalize_fp64(value);\n let highBits = bitcast<u32>(normalized.x);\n let lowBits = bitcast<u32>(normalized.y);\n return !fp64_f32_bits_is_nan(highBits) && !fp64_f32_bits_is_nan(lowBits) &&\n !fp64_f32_bits_is_inf(highBits) && !fp64_f32_bits_is_inf(lowBits);\n}\n\n// Returns -1, 0, or 1. NaN is unordered and returns 0; call is_nan_fp64 or\n// is_finite_fp64 first when 0 must mean a finite zero.\nfn sign_fp64(value: vec2f) -> i32 {\n let normalized = normalize_fp64(value);\n let highBits = bitcast<u32>(normalized.x);\n let lowBits = bitcast<u32>(normalized.y);\n if (fp64_f32_bits_is_nan(highBits) || fp64_f32_bits_is_nan(lowBits)) {\n return 0;\n }\n if ((highBits & 0x7fffffffu) != 0u) {\n return select(1, -1, (highBits >> 31u) == 1u);\n }\n if ((lowBits & 0x7fffffffu) != 0u) {\n return select(1, -1, (lowBits >> 31u) == 1u);\n }\n return 0;\n}\n\n// Compares double-single values and returns -1, 0, or 1. NaN is unordered\n// and returns 0; callers that require equality semantics must first check\n// is_nan_fp64 or is_finite_fp64.\nfn compare_fp64(a: vec2f, b: vec2f) -> i32 {\n let normalizedA = normalize_fp64(a);\n let normalizedB = normalize_fp64(b);\n let aHighBits = bitcast<u32>(normalizedA.x);\n let aLowBits = bitcast<u32>(normalizedA.y);\n let bHighBits = bitcast<u32>(normalizedB.x);\n let bLowBits = bitcast<u32>(normalizedB.y);\n if (fp64_f32_bits_is_nan(aHighBits) || fp64_f32_bits_is_nan(aLowBits) ||\n fp64_f32_bits_is_nan(bHighBits) || fp64_f32_bits_is_nan(bLowBits)) {\n return 0;\n }\n let highComparison = fp64_compare_f32_bits(aHighBits, bHighBits);\n if (highComparison != 0) {\n return highComparison;\n }\n return fp64_compare_f32_bits(aLowBits, bLowBits);\n}\n\n// Scale by 2^exponent under either arithmetic. The classic path repacks each limb with\n// integer operations and no floating-point arithmetic, so hardware that flushes subnormal\n// results cannot zero a subnormal limb. Its result has the value of the integer path's,\n// which also renormalizes the limbs; that renormalization would flush them here.\nfn fp64_scale_fp64(value: vec2f, exponent: i32) -> vec2f {\n#ifdef LUMA_FP64_INTEGER_ARITHMETIC\n return fp64_scale_fp64_integer(value, exponent);\n#else\n let high = fp64_decode_raw_f32_bits(bitcast<u32>(value.x));\n let low = fp64_decode_raw_f32_bits(bitcast<u32>(value.y));\n var scaledHigh = value.x;\n if (!(high.isZero || high.isInf || high.isNan)) {\n scaledHigh = bitcast<f32>(\n fp64_make_f32_bits_from_u64(high.sign, vec2u(0u, high.significand), high.baseExponent + exponent)\n );\n }\n var scaledLow = value.y;\n if (!(low.isZero || low.isInf || low.isNan)) {\n scaledLow = bitcast<f32>(\n fp64_make_f32_bits_from_u64(low.sign, vec2u(0u, low.significand), low.baseExponent + exponent)\n );\n }\n return vec2f(scaledHigh, scaledLow);\n#endif\n}\n#endif\n";
3
+ //# sourceMappingURL=fp64-arithmetic-wgsl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fp64-arithmetic-wgsl.d.ts","sourceRoot":"","sources":["../../../../src/modules/math/fp64/fp64-arithmetic-wgsl.ts"],"names":[],"mappings":"AAOA,4EAA4E;AAC5E,eAAO,MAAM,kBAAkB,yn0DAm5B9B,CAAC"}