@luma.gl/shadertools 9.1.0-alpha.1 → 9.1.0-alpha.12

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 (244) hide show
  1. package/dist/dist.dev.js +1005 -487
  2. package/dist/dist.min.js +2489 -1625
  3. package/dist/index.cjs +2864 -1817
  4. package/dist/index.cjs.map +4 -4
  5. package/dist/index.d.ts +29 -28
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +8 -12
  8. package/dist/lib/glsl-utils/shader-utils.d.ts.map +1 -1
  9. package/dist/lib/glsl-utils/shader-utils.js +2 -3
  10. package/dist/lib/shader-assembler.d.ts +3 -4
  11. package/dist/lib/shader-assembler.d.ts.map +1 -1
  12. package/dist/lib/shader-assembler.js +3 -2
  13. package/dist/lib/shader-assembly/assemble-shaders.d.ts +4 -3
  14. package/dist/lib/shader-assembly/assemble-shaders.d.ts.map +1 -1
  15. package/dist/lib/shader-assembly/assemble-shaders.js +46 -18
  16. package/dist/lib/shader-assembly/platform-defines.d.ts.map +1 -1
  17. package/dist/lib/shader-assembly/platform-defines.js +14 -6
  18. package/dist/lib/shader-module/shader-module-dependencies.d.ts +53 -0
  19. package/dist/lib/shader-module/shader-module-dependencies.d.ts.map +1 -0
  20. package/dist/lib/{shader-assembly/resolve-modules.js → shader-module/shader-module-dependencies.js} +38 -14
  21. package/dist/lib/shader-module/shader-module.d.ts +30 -12
  22. package/dist/lib/shader-module/shader-module.d.ts.map +1 -1
  23. package/dist/lib/shader-module/shader-module.js +76 -6
  24. package/dist/lib/shader-module/shader-pass.d.ts +3 -2
  25. package/dist/lib/shader-module/shader-pass.d.ts.map +1 -1
  26. package/dist/module-injectors.d.ts +2 -2
  27. package/dist/module-injectors.d.ts.map +1 -1
  28. package/dist/module-injectors.js +13 -10
  29. package/dist/modules/engine/geometry/geometry.d.ts.map +1 -1
  30. package/dist/modules/engine/geometry/geometry.js +12 -8
  31. package/dist/modules/engine/picking/picking.d.ts +9 -9
  32. package/dist/modules/engine/picking/picking.d.ts.map +1 -1
  33. package/dist/modules/engine/picking/picking.js +103 -66
  34. package/dist/modules/engine/project/project.d.ts +2 -2
  35. package/dist/modules/engine/project/project.d.ts.map +1 -1
  36. package/dist/modules/engine/project/project.js +36 -22
  37. package/dist/modules/engine/transform/transform.d.ts.map +1 -1
  38. package/dist/modules/engine/transform/transform.js +28 -16
  39. package/dist/modules/lighting/gouraud-material/gouraud-material.d.ts +10 -7
  40. package/dist/modules/lighting/gouraud-material/gouraud-material.d.ts.map +1 -1
  41. package/dist/modules/lighting/gouraud-material/gouraud-material.js +2 -0
  42. package/dist/modules/lighting/gouraud-material/gouraud-shaders-glsl.d.ts +2 -2
  43. package/dist/modules/lighting/gouraud-material/gouraud-shaders-glsl.d.ts.map +1 -1
  44. package/dist/modules/lighting/gouraud-material/gouraud-shaders-glsl.js +79 -53
  45. package/dist/modules/lighting/lights/lighting-uniforms-glsl.d.ts +1 -1
  46. package/dist/modules/lighting/lights/lighting-uniforms-glsl.d.ts.map +1 -1
  47. package/dist/modules/lighting/lights/lighting-uniforms-glsl.js +38 -23
  48. package/dist/modules/lighting/lights/lighting-uniforms-wgsl.d.ts +2 -0
  49. package/dist/modules/lighting/lights/lighting-uniforms-wgsl.d.ts.map +1 -0
  50. package/dist/modules/lighting/lights/lighting-uniforms-wgsl.js +56 -0
  51. package/dist/modules/lighting/lights/lighting.d.ts +5 -4
  52. package/dist/modules/lighting/lights/lighting.d.ts.map +1 -1
  53. package/dist/modules/lighting/lights/lighting.js +7 -5
  54. package/dist/modules/lighting/no-material/dirlight.d.ts +8 -8
  55. package/dist/modules/lighting/no-material/dirlight.d.ts.map +1 -1
  56. package/dist/modules/lighting/no-material/dirlight.js +34 -20
  57. package/dist/modules/lighting/pbr-material/pbr-fragment-glsl.d.ts +1 -1
  58. package/dist/modules/lighting/pbr-material/pbr-fragment-glsl.d.ts.map +1 -1
  59. package/dist/modules/lighting/pbr-material/pbr-fragment-glsl.js +304 -181
  60. package/dist/modules/lighting/pbr-material/pbr-material.d.ts +72 -69
  61. package/dist/modules/lighting/pbr-material/pbr-material.d.ts.map +1 -1
  62. package/dist/modules/lighting/pbr-material/pbr-material.js +4 -2
  63. package/dist/modules/lighting/pbr-material/pbr-uniforms-glsl.d.ts +1 -1
  64. package/dist/modules/lighting/pbr-material/pbr-uniforms-glsl.d.ts.map +1 -1
  65. package/dist/modules/lighting/pbr-material/pbr-uniforms-glsl.js +38 -20
  66. package/dist/modules/lighting/pbr-material/pbr-vertex-glsl.d.ts +1 -1
  67. package/dist/modules/lighting/pbr-material/pbr-vertex-glsl.d.ts.map +1 -1
  68. package/dist/modules/lighting/pbr-material/pbr-vertex-glsl.js +21 -16
  69. package/dist/modules/lighting/phong-material/phong-material.d.ts +14 -12
  70. package/dist/modules/lighting/phong-material/phong-material.d.ts.map +1 -1
  71. package/dist/modules/lighting/phong-material/phong-material.js +5 -3
  72. package/dist/modules/lighting/phong-material/phong-shaders-glsl.d.ts +2 -2
  73. package/dist/modules/lighting/phong-material/phong-shaders-glsl.d.ts.map +1 -1
  74. package/dist/modules/lighting/phong-material/phong-shaders-glsl.js +82 -54
  75. package/dist/modules/lighting/phong-material/phong-shaders-wgsl.d.ts +41 -0
  76. package/dist/modules/lighting/phong-material/phong-shaders-wgsl.d.ts.map +1 -0
  77. package/dist/modules/lighting/phong-material/phong-shaders-wgsl.js +130 -0
  78. package/dist/modules/math/fp32/fp32.d.ts.map +1 -1
  79. package/dist/modules/math/fp32/fp32.js +127 -100
  80. package/dist/modules/math/fp64/fp64-utils.d.ts +3 -3
  81. package/dist/modules/math/fp64/fp64-utils.d.ts.map +1 -1
  82. package/dist/modules/math/random/random.d.ts +1 -1
  83. package/dist/modules/math/random/random.d.ts.map +1 -1
  84. package/dist/modules/math/random/random.js +3 -3
  85. package/dist/modules/module-injectors.d.ts +2 -2
  86. package/dist/modules/module-injectors.d.ts.map +1 -1
  87. package/dist/modules/module-injectors.js +13 -10
  88. package/dist/modules/postprocessing/image-adjust-filters/brightnesscontrast.d.ts +4 -1
  89. package/dist/modules/postprocessing/image-adjust-filters/brightnesscontrast.d.ts.map +1 -1
  90. package/dist/modules/postprocessing/image-adjust-filters/brightnesscontrast.js +16 -12
  91. package/dist/modules/postprocessing/image-adjust-filters/denoise.d.ts +4 -1
  92. package/dist/modules/postprocessing/image-adjust-filters/denoise.d.ts.map +1 -1
  93. package/dist/modules/postprocessing/image-adjust-filters/denoise.js +21 -17
  94. package/dist/modules/postprocessing/image-adjust-filters/huesaturation.d.ts +5 -2
  95. package/dist/modules/postprocessing/image-adjust-filters/huesaturation.d.ts.map +1 -1
  96. package/dist/modules/postprocessing/image-adjust-filters/huesaturation.js +29 -22
  97. package/dist/modules/postprocessing/image-adjust-filters/noise.d.ts +4 -1
  98. package/dist/modules/postprocessing/image-adjust-filters/noise.d.ts.map +1 -1
  99. package/dist/modules/postprocessing/image-adjust-filters/noise.js +14 -10
  100. package/dist/modules/postprocessing/image-adjust-filters/sepia.d.ts +4 -1
  101. package/dist/modules/postprocessing/image-adjust-filters/sepia.d.ts.map +1 -1
  102. package/dist/modules/postprocessing/image-adjust-filters/sepia.js +17 -12
  103. package/dist/modules/postprocessing/image-adjust-filters/vibrance.d.ts +4 -1
  104. package/dist/modules/postprocessing/image-adjust-filters/vibrance.d.ts.map +1 -1
  105. package/dist/modules/postprocessing/image-adjust-filters/vibrance.js +12 -9
  106. package/dist/modules/postprocessing/image-adjust-filters/vignette.d.ts +4 -1
  107. package/dist/modules/postprocessing/image-adjust-filters/vignette.d.ts.map +1 -1
  108. package/dist/modules/postprocessing/image-adjust-filters/vignette.js +13 -10
  109. package/dist/modules/postprocessing/image-blur-filters/tiltshift.d.ts +5 -2
  110. package/dist/modules/postprocessing/image-blur-filters/tiltshift.d.ts.map +1 -1
  111. package/dist/modules/postprocessing/image-blur-filters/tiltshift.js +40 -26
  112. package/dist/modules/postprocessing/image-blur-filters/triangleblur.d.ts +5 -2
  113. package/dist/modules/postprocessing/image-blur-filters/triangleblur.d.ts.map +1 -1
  114. package/dist/modules/postprocessing/image-blur-filters/triangleblur.js +32 -19
  115. package/dist/modules/postprocessing/image-blur-filters/zoomblur.d.ts +4 -1
  116. package/dist/modules/postprocessing/image-blur-filters/zoomblur.d.ts.map +1 -1
  117. package/dist/modules/postprocessing/image-blur-filters/zoomblur.js +2 -0
  118. package/dist/modules/postprocessing/image-fun-filters/colorhalftone.d.ts +4 -1
  119. package/dist/modules/postprocessing/image-fun-filters/colorhalftone.d.ts.map +1 -1
  120. package/dist/modules/postprocessing/image-fun-filters/colorhalftone.js +31 -27
  121. package/dist/modules/postprocessing/image-fun-filters/dotscreen.d.ts +4 -1
  122. package/dist/modules/postprocessing/image-fun-filters/dotscreen.d.ts.map +1 -1
  123. package/dist/modules/postprocessing/image-fun-filters/dotscreen.js +19 -15
  124. package/dist/modules/postprocessing/image-fun-filters/edgework.d.ts +8 -5
  125. package/dist/modules/postprocessing/image-fun-filters/edgework.d.ts.map +1 -1
  126. package/dist/modules/postprocessing/image-fun-filters/edgework.js +53 -42
  127. package/dist/modules/postprocessing/image-fun-filters/hexagonalpixelate.d.ts +4 -1
  128. package/dist/modules/postprocessing/image-fun-filters/hexagonalpixelate.d.ts.map +1 -1
  129. package/dist/modules/postprocessing/image-fun-filters/hexagonalpixelate.js +41 -33
  130. package/dist/modules/postprocessing/image-fun-filters/ink.d.ts +4 -1
  131. package/dist/modules/postprocessing/image-fun-filters/ink.d.ts.map +1 -1
  132. package/dist/modules/postprocessing/image-fun-filters/ink.js +27 -25
  133. package/dist/modules/postprocessing/image-fun-filters/magnify.d.ts +2 -1
  134. package/dist/modules/postprocessing/image-fun-filters/magnify.d.ts.map +1 -1
  135. package/dist/modules/postprocessing/image-fun-filters/magnify.js +17 -16
  136. package/dist/modules/postprocessing/image-warp-filters/bulgepinch.d.ts +5 -2
  137. package/dist/modules/postprocessing/image-warp-filters/bulgepinch.d.ts.map +1 -1
  138. package/dist/modules/postprocessing/image-warp-filters/bulgepinch.js +24 -20
  139. package/dist/modules/postprocessing/image-warp-filters/swirl.d.ts +5 -2
  140. package/dist/modules/postprocessing/image-warp-filters/swirl.d.ts.map +1 -1
  141. package/dist/modules/postprocessing/image-warp-filters/swirl.js +26 -22
  142. package/dist/modules/postprocessing/image-warp-filters/warp.d.ts +2 -1
  143. package/dist/modules/postprocessing/image-warp-filters/warp.d.ts.map +1 -1
  144. package/dist/modules/postprocessing/image-warp-filters/warp.js +9 -8
  145. package/dist/modules-webgl1/geometry/geometry.d.ts.map +1 -1
  146. package/dist/modules-webgl1/geometry/geometry.js +12 -8
  147. package/dist/modules-webgl1/lighting/dirlight/dirlight.d.ts +2 -2
  148. package/dist/modules-webgl1/lighting/dirlight/dirlight.d.ts.map +1 -1
  149. package/dist/modules-webgl1/lighting/dirlight/dirlight.js +8 -5
  150. package/dist/modules-webgl1/lighting/lights/lights-glsl.d.ts +1 -1
  151. package/dist/modules-webgl1/lighting/lights/lights-glsl.d.ts.map +1 -1
  152. package/dist/modules-webgl1/lighting/lights/lights-glsl.js +19 -11
  153. package/dist/modules-webgl1/lighting/pbr/pbr-fragment-glsl.d.ts +1 -1
  154. package/dist/modules-webgl1/lighting/pbr/pbr-fragment-glsl.d.ts.map +1 -1
  155. package/dist/modules-webgl1/lighting/pbr/pbr-fragment-glsl.js +268 -157
  156. package/dist/modules-webgl1/lighting/pbr/pbr-vertex-glsl.d.ts +1 -1
  157. package/dist/modules-webgl1/lighting/pbr/pbr-vertex-glsl.d.ts.map +1 -1
  158. package/dist/modules-webgl1/lighting/pbr/pbr-vertex-glsl.js +16 -12
  159. package/dist/modules-webgl1/lighting/phong-lighting/phong-lighting-glsl.d.ts +1 -1
  160. package/dist/modules-webgl1/lighting/phong-lighting/phong-lighting-glsl.d.ts.map +1 -1
  161. package/dist/modules-webgl1/lighting/phong-lighting/phong-lighting-glsl.js +64 -55
  162. package/dist/modules-webgl1/math/fp64/fp64-arithmetic-glsl.d.ts +1 -1
  163. package/dist/modules-webgl1/math/fp64/fp64-arithmetic-glsl.d.ts.map +1 -1
  164. package/dist/modules-webgl1/math/fp64/fp64-arithmetic-glsl.js +113 -81
  165. package/dist/modules-webgl1/math/fp64/fp64-functions-glsl.d.ts +1 -1
  166. package/dist/modules-webgl1/math/fp64/fp64-functions-glsl.d.ts.map +1 -1
  167. package/dist/modules-webgl1/math/fp64/fp64-functions-glsl.js +588 -433
  168. package/dist/modules-webgl1/project/project.d.ts +2 -2
  169. package/dist/modules-webgl1/project/project.d.ts.map +1 -1
  170. package/dist/modules-webgl1/project/project.js +5 -4
  171. package/package.json +5 -5
  172. package/src/index.ts +78 -32
  173. package/src/lib/glsl-utils/shader-utils.ts +1 -3
  174. package/src/lib/shader-assembler.ts +7 -8
  175. package/src/lib/shader-assembly/assemble-shaders.ts +55 -22
  176. package/src/lib/shader-assembly/platform-defines.ts +5 -6
  177. package/src/lib/shader-module/shader-module-dependencies.ts +111 -0
  178. package/src/lib/shader-module/shader-module.ts +134 -19
  179. package/src/lib/shader-module/shader-pass.ts +3 -2
  180. package/src/module-injectors.ts +2 -4
  181. package/src/modules/engine/geometry/geometry.ts +2 -3
  182. package/src/modules/engine/picking/picking.ts +12 -10
  183. package/src/modules/engine/project/project.ts +2 -3
  184. package/src/modules/engine/transform/transform.ts +1 -3
  185. package/src/modules/lighting/gouraud-material/gouraud-material.ts +4 -0
  186. package/src/modules/lighting/gouraud-material/gouraud-shaders-glsl.ts +2 -4
  187. package/src/modules/lighting/lights/lighting-uniforms-glsl.ts +1 -3
  188. package/src/modules/lighting/lights/lighting-uniforms-wgsl.ts +57 -0
  189. package/src/modules/lighting/lights/lighting.ts +9 -5
  190. package/src/modules/lighting/no-material/dirlight.ts +30 -19
  191. package/src/modules/lighting/pbr-material/pbr-fragment-glsl.ts +1 -2
  192. package/src/modules/lighting/pbr-material/pbr-material.ts +44 -38
  193. package/src/modules/lighting/pbr-material/pbr-uniforms-glsl.ts +1 -3
  194. package/src/modules/lighting/pbr-material/pbr-vertex-glsl.ts +1 -3
  195. package/src/modules/lighting/phong-material/phong-material.ts +6 -3
  196. package/src/modules/lighting/phong-material/phong-shaders-glsl.ts +2 -4
  197. package/src/modules/lighting/phong-material/phong-shaders-wgsl.ts +132 -0
  198. package/src/modules/math/fp32/fp32.ts +1 -2
  199. package/src/modules/math/fp64/fp64-utils.ts +3 -3
  200. package/src/modules/math/random/random.ts +1 -2
  201. package/src/modules/module-injectors.ts +2 -4
  202. package/src/modules/postprocessing/image-adjust-filters/brightnesscontrast.ts +6 -2
  203. package/src/modules/postprocessing/image-adjust-filters/denoise.ts +7 -3
  204. package/src/modules/postprocessing/image-adjust-filters/huesaturation.ts +9 -4
  205. package/src/modules/postprocessing/image-adjust-filters/noise.ts +6 -2
  206. package/src/modules/postprocessing/image-adjust-filters/sepia.ts +6 -2
  207. package/src/modules/postprocessing/image-adjust-filters/vibrance.ts +5 -2
  208. package/src/modules/postprocessing/image-adjust-filters/vignette.ts +11 -4
  209. package/src/modules/postprocessing/image-blur-filters/tiltshift.ts +6 -2
  210. package/src/modules/postprocessing/image-blur-filters/triangleblur.ts +6 -2
  211. package/src/modules/postprocessing/image-blur-filters/zoomblur.ts +5 -0
  212. package/src/modules/postprocessing/image-fun-filters/colorhalftone.ts +6 -2
  213. package/src/modules/postprocessing/image-fun-filters/dotscreen.ts +6 -2
  214. package/src/modules/postprocessing/image-fun-filters/edgework.ts +10 -4
  215. package/src/modules/postprocessing/image-fun-filters/hexagonalpixelate.ts +6 -2
  216. package/src/modules/postprocessing/image-fun-filters/ink.ts +8 -3
  217. package/src/modules/postprocessing/image-fun-filters/magnify.ts +3 -2
  218. package/src/modules/postprocessing/image-warp-filters/bulgepinch.ts +6 -2
  219. package/src/modules/postprocessing/image-warp-filters/swirl.ts +8 -2
  220. package/src/modules/postprocessing/image-warp-filters/warp.ts +3 -2
  221. package/src/modules-webgl1/geometry/geometry.ts +2 -3
  222. package/src/modules-webgl1/lighting/dirlight/dirlight.ts +3 -4
  223. package/src/modules-webgl1/lighting/lights/lights-glsl.ts +1 -3
  224. package/src/modules-webgl1/lighting/pbr/pbr-fragment-glsl.ts +1 -2
  225. package/src/modules-webgl1/lighting/pbr/pbr-vertex-glsl.ts +1 -3
  226. package/src/modules-webgl1/lighting/phong-lighting/phong-lighting-glsl.ts +1 -3
  227. package/src/modules-webgl1/math/fp64/fp64-arithmetic-glsl.ts +1 -3
  228. package/src/modules-webgl1/math/fp64/fp64-functions-glsl.ts +1 -3
  229. package/src/modules-webgl1/project/project.ts +1 -2
  230. package/dist/lib/glsl-utils/highlight.d.ts +0 -6
  231. package/dist/lib/glsl-utils/highlight.d.ts.map +0 -1
  232. package/dist/lib/glsl-utils/highlight.js +0 -9
  233. package/dist/lib/shader-assembly/resolve-modules.d.ts +0 -40
  234. package/dist/lib/shader-assembly/resolve-modules.d.ts.map +0 -1
  235. package/dist/lib/shader-module/normalize-shader-module.d.ts +0 -3
  236. package/dist/lib/shader-module/normalize-shader-module.d.ts.map +0 -1
  237. package/dist/lib/shader-module/normalize-shader-module.js +0 -14
  238. package/dist/lib/shader-module/shader-module-instance.d.ts +0 -28
  239. package/dist/lib/shader-module/shader-module-instance.d.ts.map +0 -1
  240. package/dist/lib/shader-module/shader-module-instance.js +0 -126
  241. package/src/lib/glsl-utils/highlight.ts +0 -11
  242. package/src/lib/shader-assembly/resolve-modules.ts +0 -81
  243. package/src/lib/shader-module/normalize-shader-module.ts +0 -17
  244. package/src/lib/shader-module/shader-module-instance.ts +0 -167
@@ -1,8 +1,7 @@
1
1
  // luma.gl
2
2
  // SPDX-License-Identifier: MIT
3
3
  // Copyright (c) vis.gl contributors
4
- import { glsl } from "../../../lib/glsl-utils/highlight.js";
5
- export const fp64functionShader = `\
4
+ export const fp64functionShader = /* glsl */ `\
6
5
  const vec2 E_FP64 = vec2(2.7182817459106445e+00, 8.254840366817007e-08);
7
6
  const vec2 LOG2_FP64 = vec2(0.6931471824645996e+00, -1.9046542121259336e-09);
8
7
  const vec2 PI_FP64 = vec2(3.1415927410125732, -8.742278012618954e-8);
@@ -13,507 +12,663 @@ const vec2 PI_16_FP64 = vec2(0.19634954631328583, -5.463923757886846e-9);
13
12
  const vec2 PI_16_2_FP64 = vec2(0.39269909262657166, -1.0927847515773692e-8);
14
13
  const vec2 PI_16_3_FP64 = vec2(0.5890486240386963, -1.4906100798128818e-9);
15
14
  const vec2 PI_180_FP64 = vec2(0.01745329238474369, 1.3519960498364902e-10);
15
+
16
16
  const vec2 SIN_TABLE_0_FP64 = vec2(0.19509032368659973, -1.6704714833615242e-9);
17
17
  const vec2 SIN_TABLE_1_FP64 = vec2(0.3826834261417389, 6.22335089017767e-9);
18
18
  const vec2 SIN_TABLE_2_FP64 = vec2(0.5555702447891235, -1.1769521357507529e-8);
19
19
  const vec2 SIN_TABLE_3_FP64 = vec2(0.7071067690849304, 1.2101617041793133e-8);
20
+
20
21
  const vec2 COS_TABLE_0_FP64 = vec2(0.9807852506637573, 2.9739473106360492e-8);
21
22
  const vec2 COS_TABLE_1_FP64 = vec2(0.9238795042037964, 2.8307490351764386e-8);
22
23
  const vec2 COS_TABLE_2_FP64 = vec2(0.8314695954322815, 1.6870263741530778e-8);
23
24
  const vec2 COS_TABLE_3_FP64 = vec2(0.7071067690849304, 1.2101617152815436e-8);
24
- const vec2 INVERSE_FACTORIAL_3_FP64 = vec2(1.666666716337204e-01, -4.967053879312289e-09);
25
- const vec2 INVERSE_FACTORIAL_4_FP64 = vec2(4.16666679084301e-02, -1.2417634698280722e-09);
26
- const vec2 INVERSE_FACTORIAL_5_FP64 = vec2(8.333333767950535e-03, -4.34617203337595e-10);
27
- const vec2 INVERSE_FACTORIAL_6_FP64 = vec2(1.3888889225199819e-03, -3.3631094437103215e-11);
28
- const vec2 INVERSE_FACTORIAL_7_FP64 = vec2(1.9841270113829523e-04, -2.725596874933456e-12);
29
- const vec2 INVERSE_FACTORIAL_8_FP64 = vec2(2.4801587642286904e-05, -3.406996025904184e-13);
30
- const vec2 INVERSE_FACTORIAL_9_FP64 = vec2(2.75573188446287533e-06, 3.7935713937038186e-14);
31
- const vec2 INVERSE_FACTORIAL_10_FP64 = vec2(2.755731998149713e-07, -7.575112367869873e-15);
25
+
26
+ const vec2 INVERSE_FACTORIAL_3_FP64 = vec2(1.666666716337204e-01, -4.967053879312289e-09); // 1/3!
27
+ const vec2 INVERSE_FACTORIAL_4_FP64 = vec2(4.16666679084301e-02, -1.2417634698280722e-09); // 1/4!
28
+ const vec2 INVERSE_FACTORIAL_5_FP64 = vec2(8.333333767950535e-03, -4.34617203337595e-10); // 1/5!
29
+ const vec2 INVERSE_FACTORIAL_6_FP64 = vec2(1.3888889225199819e-03, -3.3631094437103215e-11); // 1/6!
30
+ const vec2 INVERSE_FACTORIAL_7_FP64 = vec2(1.9841270113829523e-04, -2.725596874933456e-12); // 1/7!
31
+ const vec2 INVERSE_FACTORIAL_8_FP64 = vec2(2.4801587642286904e-05, -3.406996025904184e-13); // 1/8!
32
+ const vec2 INVERSE_FACTORIAL_9_FP64 = vec2(2.75573188446287533e-06, 3.7935713937038186e-14); // 1/9!
33
+ const vec2 INVERSE_FACTORIAL_10_FP64 = vec2(2.755731998149713e-07, -7.575112367869873e-15); // 1/10!
34
+
32
35
  float nint(float d) {
33
- if (d == floor(d)) return d;
34
- return floor(d + 0.5);
36
+ if (d == floor(d)) return d;
37
+ return floor(d + 0.5);
35
38
  }
39
+
36
40
  vec2 nint_fp64(vec2 a) {
37
- float hi = nint(a.x);
38
- float lo;
39
- vec2 tmp;
40
- if (hi == a.x) {
41
- lo = nint(a.y);
42
- tmp = quickTwoSum(hi, lo);
43
- } else {
44
- lo = 0.0;
45
- if (abs(hi - a.x) == 0.5 && a.y < 0.0) {
46
- hi -= 1.0;
47
- }
48
- tmp = vec2(hi, lo);
49
- }
50
- return tmp;
51
- }
41
+ float hi = nint(a.x);
42
+ float lo;
43
+ vec2 tmp;
44
+ if (hi == a.x) {
45
+ lo = nint(a.y);
46
+ tmp = quickTwoSum(hi, lo);
47
+ } else {
48
+ lo = 0.0;
49
+ if (abs(hi - a.x) == 0.5 && a.y < 0.0) {
50
+ hi -= 1.0;
51
+ }
52
+ tmp = vec2(hi, lo);
53
+ }
54
+ return tmp;
55
+ }
56
+
57
+ /* k_power controls how much range reduction we would like to have
58
+ Range reduction uses the following method:
59
+ assume a = k_power * r + m * log(2), k and m being integers.
60
+ Set k_power = 4 (we can choose other k to trade accuracy with performance.
61
+ we only need to calculate exp(r) and using exp(a) = 2^m * exp(r)^k_power;
62
+ */
63
+
52
64
  vec2 exp_fp64(vec2 a) {
53
- const int k_power = 4;
54
- const float k = 16.0;
55
- const float inv_k = 1.0 / k;
56
- if (a.x <= -88.0) return vec2(0.0, 0.0);
57
- if (a.x >= 88.0) return vec2(1.0 / 0.0, 1.0 / 0.0);
58
- if (a.x == 0.0 && a.y == 0.0) return vec2(1.0, 0.0);
59
- if (a.x == 1.0 && a.y == 0.0) return E_FP64;
60
- float m = floor(a.x / LOG2_FP64.x + 0.5);
61
- vec2 r = sub_fp64(a, mul_fp64(LOG2_FP64, vec2(m, 0.0))) * inv_k;
62
- vec2 s, t, p;
63
- p = mul_fp64(r, r);
64
- s = sum_fp64(r, p * 0.5);
65
- p = mul_fp64(p, r);
66
- t = mul_fp64(p, INVERSE_FACTORIAL_3_FP64);
67
- s = sum_fp64(s, t);
68
- p = mul_fp64(p, r);
69
- t = mul_fp64(p, INVERSE_FACTORIAL_4_FP64);
70
- s = sum_fp64(s, t);
71
- p = mul_fp64(p, r);
72
- t = mul_fp64(p, INVERSE_FACTORIAL_5_FP64);
73
- s = sum_fp64(s, t);
74
- for (int i = 0; i < k_power; i++) {
75
- s = sum_fp64(s * 2.0, mul_fp64(s, s));
76
- }
65
+ // We need to make sure these two numbers match
66
+ // as bit-wise shift is not available in GLSL 1.0
67
+ const int k_power = 4;
68
+ const float k = 16.0;
69
+
70
+ const float inv_k = 1.0 / k;
71
+
72
+ if (a.x <= -88.0) return vec2(0.0, 0.0);
73
+ if (a.x >= 88.0) return vec2(1.0 / 0.0, 1.0 / 0.0);
74
+ if (a.x == 0.0 && a.y == 0.0) return vec2(1.0, 0.0);
75
+ if (a.x == 1.0 && a.y == 0.0) return E_FP64;
76
+
77
+ float m = floor(a.x / LOG2_FP64.x + 0.5);
78
+ vec2 r = sub_fp64(a, mul_fp64(LOG2_FP64, vec2(m, 0.0))) * inv_k;
79
+ vec2 s, t, p;
80
+
81
+ p = mul_fp64(r, r);
82
+ s = sum_fp64(r, p * 0.5);
83
+ p = mul_fp64(p, r);
84
+ t = mul_fp64(p, INVERSE_FACTORIAL_3_FP64);
85
+
86
+ s = sum_fp64(s, t);
87
+ p = mul_fp64(p, r);
88
+ t = mul_fp64(p, INVERSE_FACTORIAL_4_FP64);
89
+
90
+ s = sum_fp64(s, t);
91
+ p = mul_fp64(p, r);
92
+ t = mul_fp64(p, INVERSE_FACTORIAL_5_FP64);
93
+
94
+ // s = sum_fp64(s, t);
95
+ // p = mul_fp64(p, r);
96
+ // t = mul_fp64(p, INVERSE_FACTORIAL_6_FP64);
97
+
98
+ // s = sum_fp64(s, t);
99
+ // p = mul_fp64(p, r);
100
+ // t = mul_fp64(p, INVERSE_FACTORIAL_7_FP64);
101
+
102
+ s = sum_fp64(s, t);
103
+
104
+
105
+ // At this point, s = exp(r) - 1; but after following 4 recursions, we will get exp(r) ^ 512 - 1.
106
+ for (int i = 0; i < k_power; i++) {
107
+ s = sum_fp64(s * 2.0, mul_fp64(s, s));
108
+ }
109
+
77
110
  #if defined(NVIDIA_FP64_WORKAROUND) || defined(INTEL_FP64_WORKAROUND)
78
- s = sum_fp64(s, vec2(ONE, 0.0));
111
+ s = sum_fp64(s, vec2(ONE, 0.0));
79
112
  #else
80
- s = sum_fp64(s, vec2(1.0, 0.0));
113
+ s = sum_fp64(s, vec2(1.0, 0.0));
81
114
  #endif
82
- return s * pow(2.0, m);
115
+
116
+ return s * pow(2.0, m);
117
+ // return r;
83
118
  }
119
+
84
120
  vec2 log_fp64(vec2 a)
85
121
  {
86
- if (a.x == 1.0 && a.y == 0.0) return vec2(0.0, 0.0);
87
- if (a.x <= 0.0) return vec2(0.0 / 0.0, 0.0 / 0.0);
88
- vec2 x = vec2(log(a.x), 0.0);
89
- vec2 s;
122
+ if (a.x == 1.0 && a.y == 0.0) return vec2(0.0, 0.0);
123
+ if (a.x <= 0.0) return vec2(0.0 / 0.0, 0.0 / 0.0);
124
+ vec2 x = vec2(log(a.x), 0.0);
125
+ vec2 s;
90
126
  #if defined(NVIDIA_FP64_WORKAROUND) || defined(INTEL_FP64_WORKAROUND)
91
- s = vec2(ONE, 0.0);
127
+ s = vec2(ONE, 0.0);
92
128
  #else
93
- s = vec2(1.0, 0.0);
129
+ s = vec2(1.0, 0.0);
94
130
  #endif
95
- x = sub_fp64(sum_fp64(x, mul_fp64(a, exp_fp64(-x))), s);
96
- return x;
131
+
132
+ x = sub_fp64(sum_fp64(x, mul_fp64(a, exp_fp64(-x))), s);
133
+ return x;
97
134
  }
135
+
98
136
  vec2 sin_taylor_fp64(vec2 a) {
99
- vec2 r, s, t, x;
100
- if (a.x == 0.0 && a.y == 0.0) {
101
- return vec2(0.0, 0.0);
102
- }
103
- x = -mul_fp64(a, a);
104
- s = a;
105
- r = a;
106
- r = mul_fp64(r, x);
107
- t = mul_fp64(r, INVERSE_FACTORIAL_3_FP64);
108
- s = sum_fp64(s, t);
109
- r = mul_fp64(r, x);
110
- t = mul_fp64(r, INVERSE_FACTORIAL_5_FP64);
111
- s = sum_fp64(s, t);
112
- return s;
113
- }
137
+ vec2 r, s, t, x;
138
+
139
+ if (a.x == 0.0 && a.y == 0.0) {
140
+ return vec2(0.0, 0.0);
141
+ }
142
+
143
+ x = -mul_fp64(a, a);
144
+ s = a;
145
+ r = a;
146
+
147
+ r = mul_fp64(r, x);
148
+ t = mul_fp64(r, INVERSE_FACTORIAL_3_FP64);
149
+ s = sum_fp64(s, t);
150
+
151
+ r = mul_fp64(r, x);
152
+ t = mul_fp64(r, INVERSE_FACTORIAL_5_FP64);
153
+ s = sum_fp64(s, t);
154
+
155
+ /* keep the following commented code in case we need them
156
+ for extra accuracy from the Taylor expansion*/
157
+
158
+ // r = mul_fp64(r, x);
159
+ // t = mul_fp64(r, INVERSE_FACTORIAL_7_FP64);
160
+ // s = sum_fp64(s, t);
161
+
162
+ // r = mul_fp64(r, x);
163
+ // t = mul_fp64(r, INVERSE_FACTORIAL_9_FP64);
164
+ // s = sum_fp64(s, t);
165
+
166
+ return s;
167
+ }
168
+
114
169
  vec2 cos_taylor_fp64(vec2 a) {
115
- vec2 r, s, t, x;
116
- if (a.x == 0.0 && a.y == 0.0) {
117
- return vec2(1.0, 0.0);
118
- }
119
- x = -mul_fp64(a, a);
120
- r = x;
121
- s = sum_fp64(vec2(1.0, 0.0), r * 0.5);
122
- r = mul_fp64(r, x);
123
- t = mul_fp64(r, INVERSE_FACTORIAL_4_FP64);
124
- s = sum_fp64(s, t);
125
- r = mul_fp64(r, x);
126
- t = mul_fp64(r, INVERSE_FACTORIAL_6_FP64);
127
- s = sum_fp64(s, t);
128
- return s;
129
- }
170
+ vec2 r, s, t, x;
171
+
172
+ if (a.x == 0.0 && a.y == 0.0) {
173
+ return vec2(1.0, 0.0);
174
+ }
175
+
176
+ x = -mul_fp64(a, a);
177
+ r = x;
178
+ s = sum_fp64(vec2(1.0, 0.0), r * 0.5);
179
+
180
+ r = mul_fp64(r, x);
181
+ t = mul_fp64(r, INVERSE_FACTORIAL_4_FP64);
182
+ s = sum_fp64(s, t);
183
+
184
+ r = mul_fp64(r, x);
185
+ t = mul_fp64(r, INVERSE_FACTORIAL_6_FP64);
186
+ s = sum_fp64(s, t);
187
+
188
+ /* keep the following commented code in case we need them
189
+ for extra accuracy from the Taylor expansion*/
190
+
191
+ // r = mul_fp64(r, x);
192
+ // t = mul_fp64(r, INVERSE_FACTORIAL_8_FP64);
193
+ // s = sum_fp64(s, t);
194
+
195
+ // r = mul_fp64(r, x);
196
+ // t = mul_fp64(r, INVERSE_FACTORIAL_10_FP64);
197
+ // s = sum_fp64(s, t);
198
+
199
+ return s;
200
+ }
201
+
130
202
  void sincos_taylor_fp64(vec2 a, out vec2 sin_t, out vec2 cos_t) {
131
- if (a.x == 0.0 && a.y == 0.0) {
132
- sin_t = vec2(0.0, 0.0);
133
- cos_t = vec2(1.0, 0.0);
134
- }
135
- sin_t = sin_taylor_fp64(a);
136
- cos_t = sqrt_fp64(sub_fp64(vec2(1.0, 0.0), mul_fp64(sin_t, sin_t)));
137
- }
203
+ if (a.x == 0.0 && a.y == 0.0) {
204
+ sin_t = vec2(0.0, 0.0);
205
+ cos_t = vec2(1.0, 0.0);
206
+ }
207
+
208
+ sin_t = sin_taylor_fp64(a);
209
+ cos_t = sqrt_fp64(sub_fp64(vec2(1.0, 0.0), mul_fp64(sin_t, sin_t)));
210
+ }
211
+
138
212
  vec2 sin_fp64(vec2 a) {
139
- if (a.x == 0.0 && a.y == 0.0) {
140
- return vec2(0.0, 0.0);
141
- }
142
- vec2 z = nint_fp64(div_fp64(a, TWO_PI_FP64));
143
- vec2 r = sub_fp64(a, mul_fp64(TWO_PI_FP64, z));
144
- vec2 t;
145
- float q = floor(r.x / PI_2_FP64.x + 0.5);
146
- int j = int(q);
147
- if (j < -2 || j > 2) {
148
- return vec2(0.0 / 0.0, 0.0 / 0.0);
149
- }
150
- t = sub_fp64(r, mul_fp64(PI_2_FP64, vec2(q, 0.0)));
151
- q = floor(t.x / PI_16_FP64.x + 0.5);
152
- int k = int(q);
153
- if (k == 0) {
154
- if (j == 0) {
155
- return sin_taylor_fp64(t);
156
- } else if (j == 1) {
157
- return cos_taylor_fp64(t);
158
- } else if (j == -1) {
159
- return -cos_taylor_fp64(t);
160
- } else {
161
- return -sin_taylor_fp64(t);
162
- }
163
- }
164
- int abs_k = int(abs(float(k)));
165
- if (abs_k > 4) {
166
- return vec2(0.0 / 0.0, 0.0 / 0.0);
167
- } else {
168
- t = sub_fp64(t, mul_fp64(PI_16_FP64, vec2(q, 0.0)));
169
- }
170
- vec2 u = vec2(0.0, 0.0);
171
- vec2 v = vec2(0.0, 0.0);
213
+ if (a.x == 0.0 && a.y == 0.0) {
214
+ return vec2(0.0, 0.0);
215
+ }
216
+
217
+ // 2pi range reduction
218
+ vec2 z = nint_fp64(div_fp64(a, TWO_PI_FP64));
219
+ vec2 r = sub_fp64(a, mul_fp64(TWO_PI_FP64, z));
220
+
221
+ vec2 t;
222
+ float q = floor(r.x / PI_2_FP64.x + 0.5);
223
+ int j = int(q);
224
+
225
+ if (j < -2 || j > 2) {
226
+ return vec2(0.0 / 0.0, 0.0 / 0.0);
227
+ }
228
+
229
+ t = sub_fp64(r, mul_fp64(PI_2_FP64, vec2(q, 0.0)));
230
+
231
+ q = floor(t.x / PI_16_FP64.x + 0.5);
232
+ int k = int(q);
233
+
234
+ if (k == 0) {
235
+ if (j == 0) {
236
+ return sin_taylor_fp64(t);
237
+ } else if (j == 1) {
238
+ return cos_taylor_fp64(t);
239
+ } else if (j == -1) {
240
+ return -cos_taylor_fp64(t);
241
+ } else {
242
+ return -sin_taylor_fp64(t);
243
+ }
244
+ }
245
+
246
+ int abs_k = int(abs(float(k)));
247
+
248
+ if (abs_k > 4) {
249
+ return vec2(0.0 / 0.0, 0.0 / 0.0);
250
+ } else {
251
+ t = sub_fp64(t, mul_fp64(PI_16_FP64, vec2(q, 0.0)));
252
+ }
253
+
254
+ vec2 u = vec2(0.0, 0.0);
255
+ vec2 v = vec2(0.0, 0.0);
256
+
172
257
  #if defined(NVIDIA_FP64_WORKAROUND) || defined(INTEL_FP64_WORKAROUND)
173
- if (abs(float(abs_k) - 1.0) < 0.5) {
174
- u = COS_TABLE_0_FP64;
175
- v = SIN_TABLE_0_FP64;
176
- } else if (abs(float(abs_k) - 2.0) < 0.5) {
177
- u = COS_TABLE_1_FP64;
178
- v = SIN_TABLE_1_FP64;
179
- } else if (abs(float(abs_k) - 3.0) < 0.5) {
180
- u = COS_TABLE_2_FP64;
181
- v = SIN_TABLE_2_FP64;
182
- } else if (abs(float(abs_k) - 4.0) < 0.5) {
183
- u = COS_TABLE_3_FP64;
184
- v = SIN_TABLE_3_FP64;
185
- }
258
+ if (abs(float(abs_k) - 1.0) < 0.5) {
259
+ u = COS_TABLE_0_FP64;
260
+ v = SIN_TABLE_0_FP64;
261
+ } else if (abs(float(abs_k) - 2.0) < 0.5) {
262
+ u = COS_TABLE_1_FP64;
263
+ v = SIN_TABLE_1_FP64;
264
+ } else if (abs(float(abs_k) - 3.0) < 0.5) {
265
+ u = COS_TABLE_2_FP64;
266
+ v = SIN_TABLE_2_FP64;
267
+ } else if (abs(float(abs_k) - 4.0) < 0.5) {
268
+ u = COS_TABLE_3_FP64;
269
+ v = SIN_TABLE_3_FP64;
270
+ }
186
271
  #else
187
- if (abs_k == 1) {
188
- u = COS_TABLE_0_FP64;
189
- v = SIN_TABLE_0_FP64;
190
- } else if (abs_k == 2) {
191
- u = COS_TABLE_1_FP64;
192
- v = SIN_TABLE_1_FP64;
193
- } else if (abs_k == 3) {
194
- u = COS_TABLE_2_FP64;
195
- v = SIN_TABLE_2_FP64;
196
- } else if (abs_k == 4) {
197
- u = COS_TABLE_3_FP64;
198
- v = SIN_TABLE_3_FP64;
199
- }
272
+ if (abs_k == 1) {
273
+ u = COS_TABLE_0_FP64;
274
+ v = SIN_TABLE_0_FP64;
275
+ } else if (abs_k == 2) {
276
+ u = COS_TABLE_1_FP64;
277
+ v = SIN_TABLE_1_FP64;
278
+ } else if (abs_k == 3) {
279
+ u = COS_TABLE_2_FP64;
280
+ v = SIN_TABLE_2_FP64;
281
+ } else if (abs_k == 4) {
282
+ u = COS_TABLE_3_FP64;
283
+ v = SIN_TABLE_3_FP64;
284
+ }
200
285
  #endif
201
- vec2 sin_t, cos_t;
202
- sincos_taylor_fp64(t, sin_t, cos_t);
203
- vec2 result = vec2(0.0, 0.0);
204
- if (j == 0) {
205
- if (k > 0) {
206
- result = sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
207
- } else {
208
- result = sub_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
209
- }
210
- } else if (j == 1) {
211
- if (k > 0) {
212
- result = sub_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));
213
- } else {
214
- result = sum_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));
215
- }
216
- } else if (j == -1) {
217
- if (k > 0) {
218
- result = sub_fp64(mul_fp64(v, sin_t), mul_fp64(u, cos_t));
219
- } else {
220
- result = -sum_fp64(mul_fp64(v, sin_t), mul_fp64(u, cos_t));
221
- }
222
- } else {
223
- if (k > 0) {
224
- result = -sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
225
- } else {
226
- result = sub_fp64(mul_fp64(v, cos_t), mul_fp64(u, sin_t));
227
- }
228
- }
229
- return result;
230
- }
286
+
287
+ vec2 sin_t, cos_t;
288
+ sincos_taylor_fp64(t, sin_t, cos_t);
289
+
290
+
291
+
292
+ vec2 result = vec2(0.0, 0.0);
293
+ if (j == 0) {
294
+ if (k > 0) {
295
+ result = sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
296
+ } else {
297
+ result = sub_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
298
+ }
299
+ } else if (j == 1) {
300
+ if (k > 0) {
301
+ result = sub_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));
302
+ } else {
303
+ result = sum_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));
304
+ }
305
+ } else if (j == -1) {
306
+ if (k > 0) {
307
+ result = sub_fp64(mul_fp64(v, sin_t), mul_fp64(u, cos_t));
308
+ } else {
309
+ result = -sum_fp64(mul_fp64(v, sin_t), mul_fp64(u, cos_t));
310
+ }
311
+ } else {
312
+ if (k > 0) {
313
+ result = -sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
314
+ } else {
315
+ result = sub_fp64(mul_fp64(v, cos_t), mul_fp64(u, sin_t));
316
+ }
317
+ }
318
+
319
+ return result;
320
+ }
321
+
231
322
  vec2 cos_fp64(vec2 a) {
232
- if (a.x == 0.0 && a.y == 0.0) {
233
- return vec2(1.0, 0.0);
234
- }
235
- vec2 z = nint_fp64(div_fp64(a, TWO_PI_FP64));
236
- vec2 r = sub_fp64(a, mul_fp64(TWO_PI_FP64, z));
237
- vec2 t;
238
- float q = floor(r.x / PI_2_FP64.x + 0.5);
239
- int j = int(q);
240
- if (j < -2 || j > 2) {
241
- return vec2(0.0 / 0.0, 0.0 / 0.0);
242
- }
243
- t = sub_fp64(r, mul_fp64(PI_2_FP64, vec2(q, 0.0)));
244
- q = floor(t.x / PI_16_FP64.x + 0.5);
245
- int k = int(q);
246
- if (k == 0) {
247
- if (j == 0) {
248
- return cos_taylor_fp64(t);
249
- } else if (j == 1) {
250
- return -sin_taylor_fp64(t);
251
- } else if (j == -1) {
252
- return sin_taylor_fp64(t);
253
- } else {
254
- return -cos_taylor_fp64(t);
255
- }
256
- }
257
- int abs_k = int(abs(float(k)));
258
- if (abs_k > 4) {
259
- return vec2(0.0 / 0.0, 0.0 / 0.0);
260
- } else {
261
- t = sub_fp64(t, mul_fp64(PI_16_FP64, vec2(q, 0.0)));
262
- }
263
- vec2 u = vec2(0.0, 0.0);
264
- vec2 v = vec2(0.0, 0.0);
323
+ if (a.x == 0.0 && a.y == 0.0) {
324
+ return vec2(1.0, 0.0);
325
+ }
326
+
327
+ // 2pi range reduction
328
+ vec2 z = nint_fp64(div_fp64(a, TWO_PI_FP64));
329
+ vec2 r = sub_fp64(a, mul_fp64(TWO_PI_FP64, z));
330
+
331
+ vec2 t;
332
+ float q = floor(r.x / PI_2_FP64.x + 0.5);
333
+ int j = int(q);
334
+
335
+ if (j < -2 || j > 2) {
336
+ return vec2(0.0 / 0.0, 0.0 / 0.0);
337
+ }
338
+
339
+ t = sub_fp64(r, mul_fp64(PI_2_FP64, vec2(q, 0.0)));
340
+
341
+ q = floor(t.x / PI_16_FP64.x + 0.5);
342
+ int k = int(q);
343
+
344
+ if (k == 0) {
345
+ if (j == 0) {
346
+ return cos_taylor_fp64(t);
347
+ } else if (j == 1) {
348
+ return -sin_taylor_fp64(t);
349
+ } else if (j == -1) {
350
+ return sin_taylor_fp64(t);
351
+ } else {
352
+ return -cos_taylor_fp64(t);
353
+ }
354
+ }
355
+
356
+ int abs_k = int(abs(float(k)));
357
+
358
+ if (abs_k > 4) {
359
+ return vec2(0.0 / 0.0, 0.0 / 0.0);
360
+ } else {
361
+ t = sub_fp64(t, mul_fp64(PI_16_FP64, vec2(q, 0.0)));
362
+ }
363
+
364
+ vec2 u = vec2(0.0, 0.0);
365
+ vec2 v = vec2(0.0, 0.0);
366
+
265
367
  #if defined(NVIDIA_FP64_WORKAROUND) || defined(INTEL_FP64_WORKAROUND)
266
- if (abs(float(abs_k) - 1.0) < 0.5) {
267
- u = COS_TABLE_0_FP64;
268
- v = SIN_TABLE_0_FP64;
269
- } else if (abs(float(abs_k) - 2.0) < 0.5) {
270
- u = COS_TABLE_1_FP64;
271
- v = SIN_TABLE_1_FP64;
272
- } else if (abs(float(abs_k) - 3.0) < 0.5) {
273
- u = COS_TABLE_2_FP64;
274
- v = SIN_TABLE_2_FP64;
275
- } else if (abs(float(abs_k) - 4.0) < 0.5) {
276
- u = COS_TABLE_3_FP64;
277
- v = SIN_TABLE_3_FP64;
278
- }
368
+ if (abs(float(abs_k) - 1.0) < 0.5) {
369
+ u = COS_TABLE_0_FP64;
370
+ v = SIN_TABLE_0_FP64;
371
+ } else if (abs(float(abs_k) - 2.0) < 0.5) {
372
+ u = COS_TABLE_1_FP64;
373
+ v = SIN_TABLE_1_FP64;
374
+ } else if (abs(float(abs_k) - 3.0) < 0.5) {
375
+ u = COS_TABLE_2_FP64;
376
+ v = SIN_TABLE_2_FP64;
377
+ } else if (abs(float(abs_k) - 4.0) < 0.5) {
378
+ u = COS_TABLE_3_FP64;
379
+ v = SIN_TABLE_3_FP64;
380
+ }
279
381
  #else
280
- if (abs_k == 1) {
281
- u = COS_TABLE_0_FP64;
282
- v = SIN_TABLE_0_FP64;
283
- } else if (abs_k == 2) {
284
- u = COS_TABLE_1_FP64;
285
- v = SIN_TABLE_1_FP64;
286
- } else if (abs_k == 3) {
287
- u = COS_TABLE_2_FP64;
288
- v = SIN_TABLE_2_FP64;
289
- } else if (abs_k == 4) {
290
- u = COS_TABLE_3_FP64;
291
- v = SIN_TABLE_3_FP64;
292
- }
382
+ if (abs_k == 1) {
383
+ u = COS_TABLE_0_FP64;
384
+ v = SIN_TABLE_0_FP64;
385
+ } else if (abs_k == 2) {
386
+ u = COS_TABLE_1_FP64;
387
+ v = SIN_TABLE_1_FP64;
388
+ } else if (abs_k == 3) {
389
+ u = COS_TABLE_2_FP64;
390
+ v = SIN_TABLE_2_FP64;
391
+ } else if (abs_k == 4) {
392
+ u = COS_TABLE_3_FP64;
393
+ v = SIN_TABLE_3_FP64;
394
+ }
293
395
  #endif
294
- vec2 sin_t, cos_t;
295
- sincos_taylor_fp64(t, sin_t, cos_t);
296
- vec2 result = vec2(0.0, 0.0);
297
- if (j == 0) {
298
- if (k > 0) {
299
- result = sub_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));
300
- } else {
301
- result = sum_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));
302
- }
303
- } else if (j == 1) {
304
- if (k > 0) {
305
- result = -sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
306
- } else {
307
- result = sub_fp64(mul_fp64(v, cos_t), mul_fp64(u, sin_t));
308
- }
309
- } else if (j == -1) {
310
- if (k > 0) {
311
- result = sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
312
- } else {
313
- result = sub_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
314
- }
315
- } else {
316
- if (k > 0) {
317
- result = sub_fp64(mul_fp64(v, sin_t), mul_fp64(u, cos_t));
318
- } else {
319
- result = -sum_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));
320
- }
321
- }
322
- return result;
323
- }
396
+
397
+ vec2 sin_t, cos_t;
398
+ sincos_taylor_fp64(t, sin_t, cos_t);
399
+
400
+ vec2 result = vec2(0.0, 0.0);
401
+ if (j == 0) {
402
+ if (k > 0) {
403
+ result = sub_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));
404
+ } else {
405
+ result = sum_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));
406
+ }
407
+ } else if (j == 1) {
408
+ if (k > 0) {
409
+ result = -sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
410
+ } else {
411
+ result = sub_fp64(mul_fp64(v, cos_t), mul_fp64(u, sin_t));
412
+ }
413
+ } else if (j == -1) {
414
+ if (k > 0) {
415
+ result = sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
416
+ } else {
417
+ result = sub_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
418
+ }
419
+ } else {
420
+ if (k > 0) {
421
+ result = sub_fp64(mul_fp64(v, sin_t), mul_fp64(u, cos_t));
422
+ } else {
423
+ result = -sum_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));
424
+ }
425
+ }
426
+
427
+ return result;
428
+ }
429
+
324
430
  vec2 tan_fp64(vec2 a) {
325
- vec2 sin_a;
326
- vec2 cos_a;
327
- if (a.x == 0.0 && a.y == 0.0) {
328
- return vec2(0.0, 0.0);
329
- }
330
- vec2 z = nint_fp64(div_fp64(a, TWO_PI_FP64));
331
- vec2 r = sub_fp64(a, mul_fp64(TWO_PI_FP64, z));
332
- vec2 t;
333
- float q = floor(r.x / PI_2_FP64.x + 0.5);
334
- int j = int(q);
335
- if (j < -2 || j > 2) {
336
- return vec2(0.0 / 0.0, 0.0 / 0.0);
337
- }
338
- t = sub_fp64(r, mul_fp64(PI_2_FP64, vec2(q, 0.0)));
339
- q = floor(t.x / PI_16_FP64.x + 0.5);
340
- int k = int(q);
341
- int abs_k = int(abs(float(k)));
342
- if (abs_k > 4) {
343
- return vec2(0.0 / 0.0, 0.0 / 0.0);
344
- } else {
345
- t = sub_fp64(t, mul_fp64(PI_16_FP64, vec2(q, 0.0)));
346
- }
347
- vec2 u = vec2(0.0, 0.0);
348
- vec2 v = vec2(0.0, 0.0);
349
- vec2 sin_t, cos_t;
350
- vec2 s, c;
351
- sincos_taylor_fp64(t, sin_t, cos_t);
352
- if (k == 0) {
353
- s = sin_t;
354
- c = cos_t;
355
- } else {
431
+ vec2 sin_a;
432
+ vec2 cos_a;
433
+
434
+ if (a.x == 0.0 && a.y == 0.0) {
435
+ return vec2(0.0, 0.0);
436
+ }
437
+
438
+ // 2pi range reduction
439
+ vec2 z = nint_fp64(div_fp64(a, TWO_PI_FP64));
440
+ vec2 r = sub_fp64(a, mul_fp64(TWO_PI_FP64, z));
441
+
442
+ vec2 t;
443
+ float q = floor(r.x / PI_2_FP64.x + 0.5);
444
+ int j = int(q);
445
+
446
+
447
+ if (j < -2 || j > 2) {
448
+ return vec2(0.0 / 0.0, 0.0 / 0.0);
449
+ }
450
+
451
+ t = sub_fp64(r, mul_fp64(PI_2_FP64, vec2(q, 0.0)));
452
+
453
+ q = floor(t.x / PI_16_FP64.x + 0.5);
454
+ int k = int(q);
455
+ int abs_k = int(abs(float(k)));
456
+
457
+ // We just can't get PI/16 * 3.0 very accurately.
458
+ // so let's just store it
459
+ if (abs_k > 4) {
460
+ return vec2(0.0 / 0.0, 0.0 / 0.0);
461
+ } else {
462
+ t = sub_fp64(t, mul_fp64(PI_16_FP64, vec2(q, 0.0)));
463
+ }
464
+
465
+
466
+ vec2 u = vec2(0.0, 0.0);
467
+ vec2 v = vec2(0.0, 0.0);
468
+
469
+ vec2 sin_t, cos_t;
470
+ vec2 s, c;
471
+ sincos_taylor_fp64(t, sin_t, cos_t);
472
+
473
+ if (k == 0) {
474
+ s = sin_t;
475
+ c = cos_t;
476
+ } else {
356
477
  #if defined(NVIDIA_FP64_WORKAROUND) || defined(INTEL_FP64_WORKAROUND)
357
- if (abs(float(abs_k) - 1.0) < 0.5) {
358
- u = COS_TABLE_0_FP64;
359
- v = SIN_TABLE_0_FP64;
360
- } else if (abs(float(abs_k) - 2.0) < 0.5) {
361
- u = COS_TABLE_1_FP64;
362
- v = SIN_TABLE_1_FP64;
363
- } else if (abs(float(abs_k) - 3.0) < 0.5) {
364
- u = COS_TABLE_2_FP64;
365
- v = SIN_TABLE_2_FP64;
366
- } else if (abs(float(abs_k) - 4.0) < 0.5) {
367
- u = COS_TABLE_3_FP64;
368
- v = SIN_TABLE_3_FP64;
369
- }
478
+ if (abs(float(abs_k) - 1.0) < 0.5) {
479
+ u = COS_TABLE_0_FP64;
480
+ v = SIN_TABLE_0_FP64;
481
+ } else if (abs(float(abs_k) - 2.0) < 0.5) {
482
+ u = COS_TABLE_1_FP64;
483
+ v = SIN_TABLE_1_FP64;
484
+ } else if (abs(float(abs_k) - 3.0) < 0.5) {
485
+ u = COS_TABLE_2_FP64;
486
+ v = SIN_TABLE_2_FP64;
487
+ } else if (abs(float(abs_k) - 4.0) < 0.5) {
488
+ u = COS_TABLE_3_FP64;
489
+ v = SIN_TABLE_3_FP64;
490
+ }
370
491
  #else
371
- if (abs_k == 1) {
372
- u = COS_TABLE_0_FP64;
373
- v = SIN_TABLE_0_FP64;
374
- } else if (abs_k == 2) {
375
- u = COS_TABLE_1_FP64;
376
- v = SIN_TABLE_1_FP64;
377
- } else if (abs_k == 3) {
378
- u = COS_TABLE_2_FP64;
379
- v = SIN_TABLE_2_FP64;
380
- } else if (abs_k == 4) {
381
- u = COS_TABLE_3_FP64;
382
- v = SIN_TABLE_3_FP64;
383
- }
492
+ if (abs_k == 1) {
493
+ u = COS_TABLE_0_FP64;
494
+ v = SIN_TABLE_0_FP64;
495
+ } else if (abs_k == 2) {
496
+ u = COS_TABLE_1_FP64;
497
+ v = SIN_TABLE_1_FP64;
498
+ } else if (abs_k == 3) {
499
+ u = COS_TABLE_2_FP64;
500
+ v = SIN_TABLE_2_FP64;
501
+ } else if (abs_k == 4) {
502
+ u = COS_TABLE_3_FP64;
503
+ v = SIN_TABLE_3_FP64;
504
+ }
384
505
  #endif
385
- if (k > 0) {
386
- s = sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
387
- c = sub_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));
388
- } else {
389
- s = sub_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
390
- c = sum_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));
391
- }
392
- }
393
- if (j == 0) {
394
- sin_a = s;
395
- cos_a = c;
396
- } else if (j == 1) {
397
- sin_a = c;
398
- cos_a = -s;
399
- } else if (j == -1) {
400
- sin_a = -c;
401
- cos_a = s;
402
- } else {
403
- sin_a = -s;
404
- cos_a = -c;
405
- }
406
- return div_fp64(sin_a, cos_a);
407
- }
506
+ if (k > 0) {
507
+ s = sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
508
+ c = sub_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));
509
+ } else {
510
+ s = sub_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
511
+ c = sum_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));
512
+ }
513
+ }
514
+
515
+ if (j == 0) {
516
+ sin_a = s;
517
+ cos_a = c;
518
+ } else if (j == 1) {
519
+ sin_a = c;
520
+ cos_a = -s;
521
+ } else if (j == -1) {
522
+ sin_a = -c;
523
+ cos_a = s;
524
+ } else {
525
+ sin_a = -s;
526
+ cos_a = -c;
527
+ }
528
+ return div_fp64(sin_a, cos_a);
529
+ }
530
+
408
531
  vec2 radians_fp64(vec2 degree) {
409
- return mul_fp64(degree, PI_180_FP64);
532
+ return mul_fp64(degree, PI_180_FP64);
410
533
  }
534
+
411
535
  vec2 mix_fp64(vec2 a, vec2 b, float x) {
412
- vec2 range = sub_fp64(b, a);
413
- return sum_fp64(a, mul_fp64(range, vec2(x, 0.0)));
536
+ vec2 range = sub_fp64(b, a);
537
+ return sum_fp64(a, mul_fp64(range, vec2(x, 0.0)));
414
538
  }
539
+
540
+ // Vector functions
541
+ // vec2 functions
415
542
  void vec2_sum_fp64(vec2 a[2], vec2 b[2], out vec2 out_val[2]) {
416
- out_val[0] = sum_fp64(a[0], b[0]);
417
- out_val[1] = sum_fp64(a[1], b[1]);
543
+ out_val[0] = sum_fp64(a[0], b[0]);
544
+ out_val[1] = sum_fp64(a[1], b[1]);
418
545
  }
546
+
419
547
  void vec2_sub_fp64(vec2 a[2], vec2 b[2], out vec2 out_val[2]) {
420
- out_val[0] = sub_fp64(a[0], b[0]);
421
- out_val[1] = sub_fp64(a[1], b[1]);
548
+ out_val[0] = sub_fp64(a[0], b[0]);
549
+ out_val[1] = sub_fp64(a[1], b[1]);
422
550
  }
551
+
423
552
  void vec2_mul_fp64(vec2 a[2], vec2 b[2], out vec2 out_val[2]) {
424
- out_val[0] = mul_fp64(a[0], b[0]);
425
- out_val[1] = mul_fp64(a[1], b[1]);
553
+ out_val[0] = mul_fp64(a[0], b[0]);
554
+ out_val[1] = mul_fp64(a[1], b[1]);
426
555
  }
556
+
427
557
  void vec2_div_fp64(vec2 a[2], vec2 b[2], out vec2 out_val[2]) {
428
- out_val[0] = div_fp64(a[0], b[0]);
429
- out_val[1] = div_fp64(a[1], b[1]);
558
+ out_val[0] = div_fp64(a[0], b[0]);
559
+ out_val[1] = div_fp64(a[1], b[1]);
430
560
  }
561
+
431
562
  void vec2_mix_fp64(vec2 x[2], vec2 y[2], float a, out vec2 out_val[2]) {
432
- vec2 range[2];
433
- vec2_sub_fp64(y, x, range);
434
- vec2 portion[2];
435
- portion[0] = range[0] * a;
436
- portion[1] = range[1] * a;
437
- vec2_sum_fp64(x, portion, out_val);
438
- }
563
+ vec2 range[2];
564
+ vec2_sub_fp64(y, x, range);
565
+ vec2 portion[2];
566
+ portion[0] = range[0] * a;
567
+ portion[1] = range[1] * a;
568
+ vec2_sum_fp64(x, portion, out_val);
569
+ }
570
+
439
571
  vec2 vec2_length_fp64(vec2 x[2]) {
440
- return sqrt_fp64(sum_fp64(mul_fp64(x[0], x[0]), mul_fp64(x[1], x[1])));
572
+ return sqrt_fp64(sum_fp64(mul_fp64(x[0], x[0]), mul_fp64(x[1], x[1])));
441
573
  }
574
+
442
575
  void vec2_normalize_fp64(vec2 x[2], out vec2 out_val[2]) {
443
- vec2 length = vec2_length_fp64(x);
444
- vec2 length_vec2[2];
445
- length_vec2[0] = length;
446
- length_vec2[1] = length;
447
- vec2_div_fp64(x, length_vec2, out_val);
448
- }
576
+ vec2 length = vec2_length_fp64(x);
577
+ vec2 length_vec2[2];
578
+ length_vec2[0] = length;
579
+ length_vec2[1] = length;
580
+
581
+ vec2_div_fp64(x, length_vec2, out_val);
582
+ }
583
+
449
584
  vec2 vec2_distance_fp64(vec2 x[2], vec2 y[2]) {
450
- vec2 diff[2];
451
- vec2_sub_fp64(x, y, diff);
452
- return vec2_length_fp64(diff);
585
+ vec2 diff[2];
586
+ vec2_sub_fp64(x, y, diff);
587
+ return vec2_length_fp64(diff);
453
588
  }
589
+
454
590
  vec2 vec2_dot_fp64(vec2 a[2], vec2 b[2]) {
455
- vec2 v[2];
456
- v[0] = mul_fp64(a[0], b[0]);
457
- v[1] = mul_fp64(a[1], b[1]);
458
- return sum_fp64(v[0], v[1]);
459
- }
591
+ vec2 v[2];
592
+
593
+ v[0] = mul_fp64(a[0], b[0]);
594
+ v[1] = mul_fp64(a[1], b[1]);
595
+
596
+ return sum_fp64(v[0], v[1]);
597
+ }
598
+
599
+ // vec3 functions
460
600
  void vec3_sub_fp64(vec2 a[3], vec2 b[3], out vec2 out_val[3]) {
461
- for (int i = 0; i < 3; i++) {
462
- out_val[i] = sum_fp64(a[i], b[i]);
463
- }
601
+ for (int i = 0; i < 3; i++) {
602
+ out_val[i] = sum_fp64(a[i], b[i]);
603
+ }
464
604
  }
605
+
465
606
  void vec3_sum_fp64(vec2 a[3], vec2 b[3], out vec2 out_val[3]) {
466
- for (int i = 0; i < 3; i++) {
467
- out_val[i] = sum_fp64(a[i], b[i]);
468
- }
607
+ for (int i = 0; i < 3; i++) {
608
+ out_val[i] = sum_fp64(a[i], b[i]);
609
+ }
469
610
  }
611
+
470
612
  vec2 vec3_length_fp64(vec2 x[3]) {
471
- return sqrt_fp64(sum_fp64(sum_fp64(mul_fp64(x[0], x[0]), mul_fp64(x[1], x[1])),
472
- mul_fp64(x[2], x[2])));
613
+ return sqrt_fp64(sum_fp64(sum_fp64(mul_fp64(x[0], x[0]), mul_fp64(x[1], x[1])),
614
+ mul_fp64(x[2], x[2])));
473
615
  }
616
+
474
617
  vec2 vec3_distance_fp64(vec2 x[3], vec2 y[3]) {
475
- vec2 diff[3];
476
- vec3_sub_fp64(x, y, diff);
477
- return vec3_length_fp64(diff);
618
+ vec2 diff[3];
619
+ vec3_sub_fp64(x, y, diff);
620
+ return vec3_length_fp64(diff);
478
621
  }
622
+
623
+ // vec4 functions
479
624
  void vec4_fp64(vec4 a, out vec2 out_val[4]) {
480
- out_val[0].x = a[0];
481
- out_val[0].y = 0.0;
482
- out_val[1].x = a[1];
483
- out_val[1].y = 0.0;
484
- out_val[2].x = a[2];
485
- out_val[2].y = 0.0;
486
- out_val[3].x = a[3];
487
- out_val[3].y = 0.0;
488
- }
625
+ out_val[0].x = a[0];
626
+ out_val[0].y = 0.0;
627
+
628
+ out_val[1].x = a[1];
629
+ out_val[1].y = 0.0;
630
+
631
+ out_val[2].x = a[2];
632
+ out_val[2].y = 0.0;
633
+
634
+ out_val[3].x = a[3];
635
+ out_val[3].y = 0.0;
636
+ }
637
+
489
638
  void vec4_scalar_mul_fp64(vec2 a[4], vec2 b, out vec2 out_val[4]) {
490
- out_val[0] = mul_fp64(a[0], b);
491
- out_val[1] = mul_fp64(a[1], b);
492
- out_val[2] = mul_fp64(a[2], b);
493
- out_val[3] = mul_fp64(a[3], b);
639
+ out_val[0] = mul_fp64(a[0], b);
640
+ out_val[1] = mul_fp64(a[1], b);
641
+ out_val[2] = mul_fp64(a[2], b);
642
+ out_val[3] = mul_fp64(a[3], b);
494
643
  }
644
+
495
645
  void vec4_sum_fp64(vec2 a[4], vec2 b[4], out vec2 out_val[4]) {
496
- for (int i = 0; i < 4; i++) {
497
- out_val[i] = sum_fp64(a[i], b[i]);
498
- }
646
+ for (int i = 0; i < 4; i++) {
647
+ out_val[i] = sum_fp64(a[i], b[i]);
648
+ }
499
649
  }
650
+
500
651
  void vec4_dot_fp64(vec2 a[4], vec2 b[4], out vec2 out_val) {
501
- vec2 v[4];
502
- v[0] = mul_fp64(a[0], b[0]);
503
- v[1] = mul_fp64(a[1], b[1]);
504
- v[2] = mul_fp64(a[2], b[2]);
505
- v[3] = mul_fp64(a[3], b[3]);
506
- out_val = sum_fp64(sum_fp64(v[0], v[1]), sum_fp64(v[2], v[3]));
507
- }
652
+ vec2 v[4];
653
+
654
+ v[0] = mul_fp64(a[0], b[0]);
655
+ v[1] = mul_fp64(a[1], b[1]);
656
+ v[2] = mul_fp64(a[2], b[2]);
657
+ v[3] = mul_fp64(a[3], b[3]);
658
+
659
+ out_val = sum_fp64(sum_fp64(v[0], v[1]), sum_fp64(v[2], v[3]));
660
+ }
661
+
508
662
  void mat4_vec4_mul_fp64(vec2 b[16], vec2 a[4], out vec2 out_val[4]) {
509
- vec2 tmp[4];
510
- for (int i = 0; i < 4; i++)
511
- {
512
- for (int j = 0; j < 4; j++)
513
- {
514
- tmp[j] = b[j + i * 4];
515
- }
516
- vec4_dot_fp64(a, tmp, out_val[i]);
517
- }
663
+ vec2 tmp[4];
664
+
665
+ for (int i = 0; i < 4; i++)
666
+ {
667
+ for (int j = 0; j < 4; j++)
668
+ {
669
+ tmp[j] = b[j + i * 4];
670
+ }
671
+ vec4_dot_fp64(a, tmp, out_val[i]);
672
+ }
518
673
  }
519
674
  `;