@woosh/meep-engine 2.107.0 → 2.108.0

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 (231) hide show
  1. package/build/bundle-worker-image-decoder.js +1 -1
  2. package/build/meep.cjs +78 -46
  3. package/build/meep.min.js +1 -1
  4. package/build/meep.module.js +78 -47
  5. package/package.json +1 -1
  6. package/src/core/binary/int32_to_binary_string.d.ts +3 -2
  7. package/src/core/binary/int32_to_binary_string.d.ts.map +1 -1
  8. package/src/core/binary/int32_to_binary_string.js +18 -14
  9. package/src/core/binary/split_by_3.spec.d.ts +2 -0
  10. package/src/core/binary/split_by_3.spec.d.ts.map +1 -0
  11. package/src/core/binary/split_by_3.spec.js +22 -0
  12. package/src/core/binary/to_half_float_uint16.d.ts.map +1 -1
  13. package/src/core/binary/to_half_float_uint16.js +7 -5
  14. package/src/core/collection/array/isArrayEqualStrict.d.ts.map +1 -1
  15. package/src/core/collection/array/isArrayEqualStrict.js +2 -2
  16. package/src/core/color/Color.d.ts.map +1 -1
  17. package/src/core/color/Color.js +7 -2
  18. package/src/core/color/hsv/rgb2hsv.d.ts +3 -3
  19. package/src/core/color/hsv/rgb2hsv.d.ts.map +1 -1
  20. package/src/core/color/hsv/rgb2hsv.js +11 -18
  21. package/src/core/color/rgb_to_luminance.d.ts +9 -0
  22. package/src/core/color/rgb_to_luminance.d.ts.map +1 -0
  23. package/src/core/color/rgb_to_luminance.js +10 -0
  24. package/src/core/geom/3d/sphere/harmonics/README.md +16 -2
  25. package/src/core/geom/3d/sphere/harmonics/SH3_COEFFICIENTS.d.ts +6 -0
  26. package/src/core/geom/3d/sphere/harmonics/SH3_COEFFICIENTS.d.ts.map +1 -0
  27. package/src/core/geom/3d/sphere/harmonics/SH3_COEFFICIENTS.js +15 -0
  28. package/src/core/geom/3d/sphere/harmonics/sh3_basis_at.d.ts.map +1 -1
  29. package/src/core/geom/3d/sphere/harmonics/sh3_basis_at.js +21 -9
  30. package/src/core/geom/3d/sphere/harmonics/sh3_dering_optimize_positive.d.ts +3 -3
  31. package/src/core/geom/3d/sphere/harmonics/sh3_dering_optimize_positive.d.ts.map +1 -1
  32. package/src/core/geom/3d/sphere/harmonics/sh3_dering_optimize_positive.js +35 -206
  33. package/src/core/geom/3d/sphere/harmonics/sh3_rotate.d.ts +8 -0
  34. package/src/core/geom/3d/sphere/harmonics/sh3_rotate.d.ts.map +1 -0
  35. package/src/core/geom/3d/sphere/harmonics/sh3_rotate.js +29 -0
  36. package/src/core/geom/3d/sphere/harmonics/sh3_sample_by_direction.js +10 -10
  37. package/src/core/geom/3d/sphere/harmonics/sh_index.d.ts +8 -0
  38. package/src/core/geom/3d/sphere/harmonics/sh_index.d.ts.map +1 -0
  39. package/src/core/geom/3d/sphere/harmonics/sh_index.js +9 -0
  40. package/src/core/geom/3d/sphere/harmonics/sh_rotate_band1.d.ts +8 -0
  41. package/src/core/geom/3d/sphere/harmonics/sh_rotate_band1.d.ts.map +1 -0
  42. package/src/core/geom/3d/sphere/harmonics/sh_rotate_band1.js +44 -0
  43. package/src/core/geom/3d/sphere/harmonics/sh_rotate_band2.d.ts +8 -0
  44. package/src/core/geom/3d/sphere/harmonics/sh_rotate_band2.d.ts.map +1 -0
  45. package/src/core/geom/3d/sphere/harmonics/sh_rotate_band2.js +86 -0
  46. package/src/core/geom/3d/sphere/in_sphere3d_robust.d.ts.map +1 -1
  47. package/src/core/geom/3d/sphere/in_sphere3d_robust.js +2 -1
  48. package/src/core/geom/3d/tetrahedra/TetrahedralMesh.d.ts +20 -1
  49. package/src/core/geom/3d/tetrahedra/TetrahedralMesh.d.ts.map +1 -1
  50. package/src/core/geom/3d/tetrahedra/TetrahedralMesh.js +53 -7
  51. package/src/core/geom/3d/tetrahedra/TetrahedralMesh.spec.js +2 -2
  52. package/src/core/geom/3d/tetrahedra/build_tetrahedral_mesh_buffer_geometry.d.ts +1 -1
  53. package/src/core/geom/3d/tetrahedra/build_tetrahedral_mesh_buffer_geometry.d.ts.map +1 -1
  54. package/src/core/geom/3d/tetrahedra/build_tetrahedral_mesh_buffer_geometry.js +12 -7
  55. package/src/core/geom/3d/tetrahedra/delaunay/tetrahedral_mesh_build_from_grid.d.ts +13 -0
  56. package/src/core/geom/3d/tetrahedra/delaunay/tetrahedral_mesh_build_from_grid.d.ts.map +1 -0
  57. package/src/core/geom/3d/tetrahedra/delaunay/tetrahedral_mesh_build_from_grid.js +135 -0
  58. package/src/core/geom/3d/tetrahedra/prototypeTetrahedraBuilder.js +38 -24
  59. package/src/core/geom/3d/tetrahedra/{compute_circumsphere.d.ts → tetrahedron_compute_circumsphere.d.ts} +3 -5
  60. package/src/core/geom/3d/tetrahedra/tetrahedron_compute_circumsphere.d.ts.map +1 -0
  61. package/src/core/geom/3d/tetrahedra/{compute_circumsphere.js → tetrahedron_compute_circumsphere.js} +2 -4
  62. package/src/core/geom/3d/tetrahedra/tetrahedron_compute_signed_volume.d.ts.map +1 -1
  63. package/src/core/geom/3d/tetrahedra/tetrahedron_compute_signed_volume.js +3 -1
  64. package/src/core/geom/Vector3.d.ts.map +1 -1
  65. package/src/core/geom/Vector3.js +1 -0
  66. package/src/core/geom/mat3/m3_multiply_vec3.d.ts +8 -0
  67. package/src/core/geom/mat3/m3_multiply_vec3.d.ts.map +1 -0
  68. package/src/core/geom/mat3/m3_multiply_vec3.js +21 -0
  69. package/src/core/geom/vec2/v2_cross_product.d.ts +15 -0
  70. package/src/core/geom/vec2/v2_cross_product.d.ts.map +1 -0
  71. package/src/core/geom/vec2/v2_cross_product.js +21 -0
  72. package/src/core/geom/vec3/v3_slerp.d.ts +1 -0
  73. package/src/core/geom/vec3/v3_slerp.d.ts.map +1 -1
  74. package/src/core/geom/vec3/v3_slerp.js +1 -0
  75. package/src/core/graph/MultiNode.d.ts +1 -1
  76. package/src/core/graph/MultiNode.js +1 -1
  77. package/src/core/graph/WeightedEdge.d.ts +6 -4
  78. package/src/core/graph/WeightedEdge.d.ts.map +1 -1
  79. package/src/core/graph/WeightedEdge.js +3 -0
  80. package/src/core/graph/coloring/colorizeGraph.js +19 -19
  81. package/src/core/graph/convert_graph_to_dot_string.d.ts +1 -1
  82. package/src/core/graph/convert_graph_to_dot_string.d.ts.map +1 -1
  83. package/src/core/graph/convert_graph_to_dot_string.js +10 -6
  84. package/src/core/graph/graph_compute_adjacency_matrix.d.ts +9 -0
  85. package/src/core/graph/graph_compute_adjacency_matrix.d.ts.map +1 -0
  86. package/src/core/graph/{graph_adjacency_matrix.js → graph_compute_adjacency_matrix.js} +1 -2
  87. package/src/core/graph/graph_compute_degree_matrix.d.ts +10 -0
  88. package/src/core/graph/graph_compute_degree_matrix.d.ts.map +1 -0
  89. package/src/core/graph/graph_compute_degree_matrix.js +23 -0
  90. package/src/core/graph/graph_compute_distance_matrix.d.ts +13 -0
  91. package/src/core/graph/graph_compute_distance_matrix.d.ts.map +1 -0
  92. package/src/core/graph/graph_compute_distance_matrix.js +103 -0
  93. package/src/core/graph/{graph_laplacian_matrix.d.ts → graph_compute_laplacian_matrix.d.ts} +2 -2
  94. package/src/core/graph/graph_compute_laplacian_matrix.d.ts.map +1 -0
  95. package/src/core/graph/{graph_laplacian_matrix.js → graph_compute_laplacian_matrix.js} +6 -6
  96. package/src/core/graph/graph_k_means_cluster.d.ts.map +1 -1
  97. package/src/core/graph/graph_k_means_cluster.js +4 -119
  98. package/src/core/graph/{coarsen_graph.d.ts → mn_graph_coarsen.d.ts} +2 -2
  99. package/src/core/graph/mn_graph_coarsen.d.ts.map +1 -0
  100. package/src/core/graph/{coarsen_graph.js → mn_graph_coarsen.js} +1 -1
  101. package/src/core/graph/mn_graph_coarsen.spec.d.ts +2 -0
  102. package/src/core/graph/mn_graph_coarsen.spec.d.ts.map +1 -0
  103. package/src/core/graph/{coarsen_graph.spec.js → mn_graph_coarsen.spec.js} +4 -4
  104. package/src/core/graph/mn_graph_collapse_weighted_edge.d.ts +1 -0
  105. package/src/core/graph/mn_graph_collapse_weighted_edge.d.ts.map +1 -1
  106. package/src/core/graph/mn_graph_collapse_weighted_edge.js +7 -1
  107. package/src/core/math/physics/brdf/brdf_burley.d.ts.map +1 -1
  108. package/src/core/math/physics/brdf/brdf_burley.js +9 -1
  109. package/src/core/math/physics/brdf/{D_GGX.d.ts → diffuse_GGX.d.ts} +2 -2
  110. package/src/core/math/physics/brdf/diffuse_GGX.d.ts.map +1 -0
  111. package/src/core/math/physics/brdf/{D_GGX.js → diffuse_GGX.js} +1 -1
  112. package/src/core/math/physics/brdf/fresnel_Schlick.d.ts +3 -0
  113. package/src/core/math/physics/brdf/fresnel_Schlick.d.ts.map +1 -0
  114. package/src/core/math/physics/brdf/fresnel_Schlick.js +3 -0
  115. package/src/core/math/physics/brdf/fresnel_Schlick_optimized.d.ts +9 -0
  116. package/src/core/math/physics/brdf/fresnel_Schlick_optimized.d.ts.map +1 -0
  117. package/src/core/math/physics/brdf/fresnel_Schlick_optimized.js +12 -0
  118. package/src/core/math/physics/brdf/fresnel_Schlick_original.d.ts +9 -0
  119. package/src/core/math/physics/brdf/fresnel_Schlick_original.d.ts.map +1 -0
  120. package/src/core/math/physics/brdf/fresnel_Schlick_original.js +10 -0
  121. package/src/core/math/physics/bsdf/bsdf_schlick.d.ts.map +1 -1
  122. package/src/core/math/physics/bsdf/bsdf_schlick.js +3 -11
  123. package/src/core/math/physics/ior_to_reflectivity.d.ts +7 -0
  124. package/src/core/math/physics/ior_to_reflectivity.d.ts.map +1 -0
  125. package/src/core/math/physics/ior_to_reflectivity.js +9 -0
  126. package/src/core/math/physics/pdf/README.md +1 -0
  127. package/src/core/math/physics/pdf/pdf_GGX.d.ts +16 -0
  128. package/src/core/math/physics/pdf/pdf_GGX.d.ts.map +1 -0
  129. package/src/core/math/physics/pdf/pdf_GGX.js +25 -0
  130. package/src/core/math/physics/reflectivity_to_ior.d.ts +7 -0
  131. package/src/core/math/physics/reflectivity_to_ior.d.ts.map +1 -0
  132. package/src/core/math/physics/reflectivity_to_ior.js +8 -0
  133. package/src/engine/EngineHarness.d.ts +10 -1
  134. package/src/engine/EngineHarness.d.ts.map +1 -1
  135. package/src/engine/EngineHarness.js +16 -11
  136. package/src/engine/asset/loaders/image/png/PNGReader.d.ts +25 -11
  137. package/src/engine/asset/loaders/image/png/PNGReader.d.ts.map +1 -1
  138. package/src/engine/asset/loaders/image/png/PNGReader.js +38 -24
  139. package/src/engine/asset/loaders/material/TextureAttachmensByMaterialType.js +2 -0
  140. package/src/engine/graphics/GraphicsEngine.js +1 -1
  141. package/src/engine/graphics/ecs/light/LightSystem.d.ts.map +1 -1
  142. package/src/engine/graphics/ecs/light/LightSystem.js +2 -3
  143. package/src/engine/graphics/ecs/light/binding/three/ThreeLightBinding.d.ts +6 -0
  144. package/src/engine/graphics/ecs/light/binding/three/ThreeLightBinding.d.ts.map +1 -1
  145. package/src/engine/graphics/ecs/light/binding/three/ThreeLightBinding.js +22 -11
  146. package/src/engine/graphics/render/forward_plus/model/DirectionalLight.d.ts.map +1 -1
  147. package/src/engine/graphics/render/forward_plus/model/DirectionalLight.js +25 -25
  148. package/src/engine/graphics/sh3/fromCubeRenderTarget.d.ts +9 -0
  149. package/src/engine/graphics/sh3/fromCubeRenderTarget.d.ts.map +1 -0
  150. package/src/engine/graphics/sh3/fromCubeRenderTarget.js +145 -0
  151. package/src/engine/graphics/sh3/gi/tetrahedral_mesh_to_texture.d.ts +8 -0
  152. package/src/engine/graphics/sh3/gi/tetrahedral_mesh_to_texture.d.ts.map +1 -0
  153. package/src/engine/graphics/sh3/gi/tetrahedral_mesh_to_texture.js +51 -0
  154. package/src/engine/graphics/sh3/{LightProbeVolume.d.ts → lpv/LightProbeVolume.d.ts} +18 -7
  155. package/src/engine/graphics/sh3/lpv/LightProbeVolume.d.ts.map +1 -0
  156. package/src/engine/graphics/sh3/lpv/LightProbeVolume.js +340 -0
  157. package/src/engine/graphics/sh3/lpv/LightProbeVolumeSerializationAdapter.d.ts +18 -0
  158. package/src/engine/graphics/sh3/lpv/LightProbeVolumeSerializationAdapter.d.ts.map +1 -0
  159. package/src/engine/graphics/sh3/lpv/LightProbeVolumeSerializationAdapter.js +44 -0
  160. package/src/engine/graphics/sh3/lpv/PathTracerProbeRenderer.d.ts +12 -0
  161. package/src/engine/graphics/sh3/lpv/PathTracerProbeRenderer.d.ts.map +1 -0
  162. package/src/engine/graphics/sh3/lpv/PathTracerProbeRenderer.js +123 -0
  163. package/src/engine/graphics/sh3/lpv/ProbeRenderer.d.ts +29 -0
  164. package/src/engine/graphics/sh3/lpv/ProbeRenderer.d.ts.map +1 -0
  165. package/src/engine/graphics/sh3/lpv/ProbeRenderer.js +35 -0
  166. package/src/engine/graphics/sh3/lpv/WebGLCubeProbeRenderer.d.ts +27 -0
  167. package/src/engine/graphics/sh3/lpv/WebGLCubeProbeRenderer.d.ts.map +1 -0
  168. package/src/engine/graphics/sh3/lpv/WebGLCubeProbeRenderer.js +158 -0
  169. package/src/engine/graphics/sh3/lpv/build_probes_for_scene.d.ts +11 -0
  170. package/src/engine/graphics/sh3/lpv/build_probes_for_scene.d.ts.map +1 -0
  171. package/src/engine/graphics/sh3/lpv/build_probes_for_scene.js +127 -0
  172. package/src/engine/graphics/sh3/lpv/probe_volume_to_textures.d.ts +12 -0
  173. package/src/engine/graphics/sh3/lpv/probe_volume_to_textures.d.ts.map +1 -0
  174. package/src/engine/graphics/sh3/lpv/probe_volume_to_textures.js +89 -0
  175. package/src/engine/graphics/sh3/path_tracer/PathTracedScene.d.ts +90 -0
  176. package/src/engine/graphics/sh3/path_tracer/PathTracedScene.d.ts.map +1 -0
  177. package/src/engine/graphics/sh3/path_tracer/PathTracedScene.js +352 -0
  178. package/src/engine/graphics/sh3/path_tracer/PathTracer.d.ts +5 -91
  179. package/src/engine/graphics/sh3/path_tracer/PathTracer.d.ts.map +1 -1
  180. package/src/engine/graphics/sh3/path_tracer/PathTracer.js +41 -477
  181. package/src/engine/graphics/sh3/path_tracer/make_one_vector3.d.ts +1 -0
  182. package/src/engine/graphics/sh3/path_tracer/make_one_vector3.d.ts.map +1 -1
  183. package/src/engine/graphics/sh3/path_tracer/make_one_vector3.js +6 -3
  184. package/src/engine/graphics/sh3/path_tracer/prototypePathTracer.js +26 -58
  185. package/src/engine/graphics/sh3/path_tracer/random_in_hemisphere.d.ts.map +1 -1
  186. package/src/engine/graphics/sh3/path_tracer/random_in_hemisphere.js +7 -1
  187. package/src/engine/graphics/sh3/path_tracer/sample_triangle_attribute.d.ts +2 -2
  188. package/src/engine/graphics/sh3/path_tracer/sample_triangle_attribute.d.ts.map +1 -1
  189. package/src/engine/graphics/sh3/path_tracer/sample_triangle_attribute.js +1 -1
  190. package/src/engine/graphics/sh3/path_tracer/texture/SoftwareTextureCache.d.ts +3 -0
  191. package/src/engine/graphics/sh3/path_tracer/texture/SoftwareTextureCache.d.ts.map +1 -0
  192. package/src/engine/graphics/sh3/path_tracer/texture/SoftwareTextureCache.js +3 -0
  193. package/src/engine/graphics/sh3/path_tracer/texture/apply_texture_clamping_to_coordinate.d.ts.map +1 -0
  194. package/src/engine/graphics/sh3/path_tracer/{apply_texture_clamping_to_coordinate.js → texture/apply_texture_clamping_to_coordinate.js} +2 -2
  195. package/src/engine/graphics/sh3/path_tracer/texture/sample_material.d.ts +11 -0
  196. package/src/engine/graphics/sh3/path_tracer/texture/sample_material.d.ts.map +1 -0
  197. package/src/engine/graphics/sh3/path_tracer/texture/sample_material.js +86 -0
  198. package/src/engine/graphics/sh3/path_tracer/texture/sample_texture.d.ts +10 -0
  199. package/src/engine/graphics/sh3/path_tracer/texture/sample_texture.d.ts.map +1 -0
  200. package/src/engine/graphics/sh3/path_tracer/texture/sample_texture.js +56 -0
  201. package/src/engine/graphics/sh3/prototypeSH3Probe.js +87 -195
  202. package/src/engine/graphics/sh3/sky/hosek/sky_hosek_compute_irradiance_by_direction.d.ts +5 -5
  203. package/src/engine/graphics/sh3/sky/hosek/sky_hosek_compute_irradiance_by_direction.d.ts.map +1 -1
  204. package/src/engine/graphics/sh3/sky/hosek/sky_hosek_compute_irradiance_by_direction.js +8 -8
  205. package/src/engine/graphics/sh3/visualise_spherical_harmonic_sphere.d.ts +13 -0
  206. package/src/engine/graphics/sh3/visualise_spherical_harmonic_sphere.d.ts.map +1 -0
  207. package/src/engine/graphics/sh3/visualise_spherical_harmonic_sphere.js +54 -0
  208. package/src/engine/graphics/texture/AttributeDataTexture.d.ts +2 -2
  209. package/src/engine/graphics/texture/AttributeDataTexture.d.ts.map +1 -1
  210. package/src/engine/graphics/texture/AttributeDataTexture.js +11 -11
  211. package/src/engine/input/ecs/systems/InputControllerSystem.js +1 -1
  212. package/src/view/elements/ColorPickerView.d.ts.map +1 -1
  213. package/src/view/elements/ColorPickerView.js +7 -7
  214. package/src/core/geom/3d/tetrahedra/compute_circumsphere.d.ts.map +0 -1
  215. package/src/core/graph/coarsen_graph.d.ts.map +0 -1
  216. package/src/core/graph/coarsen_graph.spec.d.ts +0 -2
  217. package/src/core/graph/coarsen_graph.spec.d.ts.map +0 -1
  218. package/src/core/graph/graph_adjacency_matrix.d.ts +0 -9
  219. package/src/core/graph/graph_adjacency_matrix.d.ts.map +0 -1
  220. package/src/core/graph/graph_degree_matrix.d.ts +0 -9
  221. package/src/core/graph/graph_degree_matrix.d.ts.map +0 -1
  222. package/src/core/graph/graph_degree_matrix.js +0 -18
  223. package/src/core/graph/graph_laplacian_matrix.d.ts.map +0 -1
  224. package/src/core/math/physics/brdf/D_GGX.d.ts.map +0 -1
  225. package/src/engine/graphics/sh3/LightProbeVolume.d.ts.map +0 -1
  226. package/src/engine/graphics/sh3/LightProbeVolume.js +0 -609
  227. package/src/engine/graphics/sh3/path_tracer/apply_texture_clamping_to_coordinate.d.ts.map +0 -1
  228. package/src/engine/graphics/sh3/visualise_probe.d.ts +0 -12
  229. package/src/engine/graphics/sh3/visualise_probe.d.ts.map +0 -1
  230. package/src/engine/graphics/sh3/visualise_probe.js +0 -40
  231. /package/src/engine/graphics/sh3/path_tracer/{apply_texture_clamping_to_coordinate.d.ts → texture/apply_texture_clamping_to_coordinate.d.ts} +0 -0
@@ -1,3 +1,6 @@
1
+ import { assert } from "../../../../assert.js";
2
+
3
+
1
4
  /**
2
5
  * evaluate the basis functions
3
6
  * shBasis is an Array[ 9 ]
@@ -9,22 +12,31 @@
9
12
  */
10
13
  export function sh3_basis_at(x, y, z, shBasis) {
11
14
 
15
+ assert.isNumber(x,'x');
16
+ assert.notNaN(x,'x');
17
+
18
+ assert.isNumber(y,'y');
19
+ assert.notNaN(y,'y');
20
+
21
+ assert.isNumber(z,'z');
22
+ assert.notNaN(z,'z');
23
+
12
24
  // normal is assumed to be unit length
13
25
 
14
26
 
15
27
  // band 0
16
- shBasis[0] = 0.282095;
28
+ shBasis[0] = 0.28209479177387814;
17
29
 
18
30
  // band 1
19
- shBasis[1] = 0.488603 * y;
20
- shBasis[2] = 0.488603 * z;
21
- shBasis[3] = 0.488603 * x;
31
+ shBasis[1] = -0.4886025119029199 * y;
32
+ shBasis[2] = 0.4886025119029199 * z;
33
+ shBasis[3] = -0.4886025119029199 * x;
22
34
 
23
35
  // band 2
24
- shBasis[4] = 1.092548 * x * y;
25
- shBasis[5] = 1.092548 * y * z;
26
- shBasis[6] = 0.315392 * (3 * z * z - 1);
27
- shBasis[7] = 1.092548 * x * z;
28
- shBasis[8] = 0.546274 * (x * x - y * y);
36
+ shBasis[4] = 1.0925484305920792 * x * y;
37
+ shBasis[5] = -1.0925484305920792 * y * z;
38
+ shBasis[6] = 0.31539156525252005 * (3 * z * z - 1);
39
+ shBasis[7] = -1.0925484305920792 * x * z;
40
+ shBasis[8] = 0.5462742152960396 * (x * x - y * y);
29
41
 
30
42
  }
@@ -1,10 +1,10 @@
1
1
  /**
2
2
  *
3
- * @param {number[]|Float32Array} result
3
+ * @param {number[]|Float32Array|Float64Array} result
4
4
  * @param {number} result_offset
5
- * @param {number[]|Float32Array} harmonics
5
+ * @param {number[]|Float32Array|Float64Array} harmonics
6
6
  * @param {number} harmonics_offset
7
7
  * @param {number} dimension_count
8
8
  */
9
- export function sh3_dering_optimize_positive(result: number[] | Float32Array, result_offset: number, harmonics: number[] | Float32Array, harmonics_offset: number, dimension_count?: number): void;
9
+ export function sh3_dering_optimize_positive(result: number[] | Float32Array | Float64Array, result_offset: number, harmonics: number[] | Float32Array | Float64Array, harmonics_offset: number, dimension_count?: number): void;
10
10
  //# sourceMappingURL=sh3_dering_optimize_positive.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sh3_dering_optimize_positive.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/geom/3d/sphere/harmonics/sh3_dering_optimize_positive.js"],"names":[],"mappings":"AA6cA;;;;;;;GAOG;AACH,qDANW,MAAM,EAAE,GAAC,YAAY,iBACrB,MAAM,aACN,MAAM,EAAE,GAAC,YAAY,oBACrB,MAAM,oBACN,MAAM,QAIhB"}
1
+ {"version":3,"file":"sh3_dering_optimize_positive.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/geom/3d/sphere/harmonics/sh3_dering_optimize_positive.js"],"names":[],"mappings":"AAkSA;;;;;;;GAOG;AACH,qDANW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,iBAClC,MAAM,aACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,oBAClC,MAAM,oBACN,MAAM,QAIhB"}
@@ -2,172 +2,27 @@ import { mat3, vec3 } from "gl-matrix";
2
2
  import { assert } from "../../../../assert.js";
3
3
  import { array_copy } from "../../../../collection/array/array_copy.js";
4
4
  import { min2 } from "../../../../math/min2.js";
5
+ import { SH3_COEFFICIENTS } from "./SH3_COEFFICIENTS.js";
6
+ import { sh3_rotate } from "./sh3_rotate.js";
7
+ import { sh_index } from "./sh_index.js";
5
8
 
6
9
  /*
7
10
  @see https://github.com/Bestmaker602/olacziy/blob/212b64ea5f1856b390cdf7629801243f76a4466d/libs/ibl/src/CubemapSH.cpp
8
11
  */
9
12
 
10
13
 
11
- const F_PI = 3.14159265358979323846264338327950288;
12
- const F_SQRT1_2 = 0.707106781186547524400844362104849039;
13
- const M_SQRT_3 = 1.7320508076;
14
-
15
- const M_SQRT_PI = 1.7724538509;
16
- const M_SQRT_5 = 2.2360679775;
17
- const M_SQRT_15 = 3.8729833462;
18
-
19
- /**
20
- *
21
- * @param {number[]} M 5x5 matrix
22
- * @param {number[]} x vec5
23
- * @return {number[]} vec5
24
- */
25
- function multiply_5d(M, x) {
26
- return [
27
- M[0] * x[0] + M[5] * x[1] + M[10] * x[2] + M[15] * x[3] + M[20] * x[4],
28
- M[1] * x[0] + M[6] * x[1] + M[11] * x[2] + M[16] * x[3] + M[21] * x[4],
29
- M[2] * x[0] + M[7] * x[1] + M[12] * x[2] + M[17] * x[3] + M[22] * x[4],
30
- M[3] * x[0] + M[8] * x[1] + M[13] * x[2] + M[18] * x[3] + M[23] * x[4],
31
- M[4] * x[0] + M[9] * x[1] + M[14] * x[2] + M[19] * x[3] + M[24] * x[4]
32
- ];
33
- }
34
-
35
- /**
36
- * compute Index of spherical harmonics coefficient
37
- * @param {number} m signed offset from zonal harmonic
38
- * @param {number} l band
39
- * @return {number}
40
- */
41
- function sh_index(m, l) {
42
- return l * (l + 1) + m;
43
- }
44
-
45
-
46
- /*
47
- * utilities to rotate very low order spherical harmonics (up to 3rd band)
48
- * @param {number[]} band1
49
- * @param {number[]} M 3x3 matrix
50
- * @returns {number[]}
51
- */
52
- function rotateShericalHarmonicBand1(band1, M) {
53
-
54
- // inverse() is not constexpr -- so we pre-calculate it in mathematica
55
- //
56
- // constexpr float3 N0{ 1, 0, 0 };
57
- // constexpr float3 N1{ 0, 1, 0 };
58
- // constexpr float3 N2{ 0, 0, 1 };
59
- //
60
- // constexpr mat3f A1 = { // this is the projection of N0, N1, N2 to SH space
61
- // float3{ -N0.y, N0.z, -N0.x },
62
- // float3{ -N1.y, N1.z, -N1.x },
63
- // float3{ -N2.y, N2.z, -N2.x }
64
- // };
65
- //
66
- // const mat3f invA1 = inverse(A1);
67
-
68
- const invA1TimesK = [
69
- 0, -1, 0,
70
- 0, 0, 1,
71
- -1, 0, 0
72
- ];
73
-
74
- const R1OverK = [
75
- -M[1], M[2], -M[0],
76
- -M[4], M[5], -M[3],
77
- -M[7], M[8], -M[6]
78
- ];
79
-
80
-
81
- mat3.scale(invA1TimesK, invA1TimesK, band1);
82
-
83
-
84
- mat3.multiply(R1OverK, R1OverK, invA1TimesK);
85
-
86
- return R1OverK;
87
- }
88
-
89
- /**
90
- * This projects a vec3 to SH2/k space (i.e. we premultiply by 1/k)
91
- * below can't be constexpr
92
- * @param {number} x
93
- * @param {number} y
94
- * @param {number} z
95
- * @return {number[]} vec5
96
- */
97
- function project_v3_to_sh(x, y, z) {
98
- return [
99
- (y * x),
100
- -(y * z),
101
- 1 / (2 * M_SQRT_3) * ((3 * z * z - 1)),
102
- -(z * x),
103
- 0.5 * ((x * x - y * y))
104
- ];
105
- }
106
-
107
- /**
108
- *
109
- * @param {number[]} band2 vec5
110
- * @param {number[]} M mat3
111
- * @return {number[]} vec5
112
- */
113
- function rotateShericalHarmonicBand2(band2, M) {
114
- const n = F_SQRT1_2;
115
-
116
- // Below we precompute (with help of Mathematica):
117
- // constexpr float3 N0{ 1, 0, 0 };
118
- // constexpr float3 N1{ 0, 0, 1 };
119
- // constexpr float3 N2{ n, n, 0 };
120
- // constexpr float3 N3{ n, 0, n };
121
- // constexpr float3 N4{ 0, n, n };
122
- // constexpr float M_SQRT_PI = 1.7724538509f;
123
- // constexpr float M_SQRT_15 = 3.8729833462f;
124
- // constexpr float k = M_SQRT_15 / (2.0f * M_SQRT_PI);
125
- // --> k * inverse(mat5{project(N0), project(N1), project(N2), project(N3), project(N4)})
126
- const invATimesK = [
127
- 0, 1, 2, 0, 0,
128
- -1, 0, 0, 0, -2,
129
- 0, M_SQRT_3, 0, 0, 0,
130
- 1, 1, 0, -2, 0,
131
- 2, 1, 0, 0, 0
132
- ];
133
-
134
- // this is: invA * k * band2
135
- // 5x5 matrix by vec5 (this a lot of zeroes and constants, which the compiler should eliminate)
136
- const invATimesKTimesBand2 = multiply_5d(invATimesK, band2);
137
-
138
- // this is: mat5{project(N0), project(N1), project(N2), project(N3), project(N4)} / k
139
- // (the 1/k comes from project(), see above)
140
- const ROverK =
141
- project_v3_to_sh(M[0], M[1], M[2]) // M * N0
142
- .concat(project_v3_to_sh(M[6], M[7], M[8])) // M * N1
143
- .concat(project_v3_to_sh(n * (M[0] + M[3]), n * (M[1] + M[4]), n * (M[2] + M[5]))) // M * N2
144
- .concat(project_v3_to_sh(n * (M[0] + M[6]), n * (M[1] + M[7]), n * (M[2] + M[8]))) // M * N3
145
- .concat(project_v3_to_sh(n * (M[3] + M[6]), n * (M[4] + M[7]), n * (M[5] + M[8]))) // M * N4
146
- ;
147
-
148
- // notice how "k" disappears
149
- // this is: (R / k) * (invA * k) * band2 == R * invA * band2
150
- const result = multiply_5d(ROverK, invATimesKTimesBand2);
151
-
152
- return result;
153
- }
154
-
155
14
  /**
156
15
  * SH from environment with high dynamic range (or high frequencies -- high dynamic range creates
157
16
  * high frequencies) exhibit "ringing" and negative values when reconstructed.
158
17
  * To mitigate this, we need to low-pass the input image -- or equivalently window the SH by
159
18
  * coefficient that tapper towards zero with the band.
160
19
  *
161
- * We use ideas and techniques from
162
- * Stupid Spherical Harmonics (SH)
163
- * Deringing Spherical Harmonics
164
- * by Peter-Pike Sloan
165
- * https://www.ppsloan.org/publications/shdering.pdf
166
- * @param {number} w
20
+ * We use ideas and techniques from Stupid Spherical Harmonics (SH) Deringing Spherical Harmonics by Peter-Pike Sloan ( see https://www.ppsloan.org/publications/shdering.pdf )
21
+ * @param {number} w cutoff
167
22
  * @param {number} l
168
23
  * @returns {number}
169
24
  */
170
- function sincWindow(l, w) {
25
+ function sinc_window(l, w) {
171
26
  if (l === 0) {
172
27
  return 1.0;
173
28
  } else if (l >= w) {
@@ -176,7 +31,7 @@ function sincWindow(l, w) {
176
31
 
177
32
  // we use a sinc window scaled to the desired window size in bands units
178
33
  // a sinc window only has zonal harmonics
179
- let x = ((F_PI) * l) / w;
34
+ let x = (Math.PI * l) / w;
180
35
 
181
36
  x = Math.sin(x) / x;
182
37
 
@@ -188,52 +43,15 @@ function sincWindow(l, w) {
188
43
  }
189
44
 
190
45
  /**
191
- *
192
- * @param {number[]|Float32Array} result sh3
193
- * @param {number[]} sh input
194
- * @param {number[]} M mat3
195
- */
196
- function rotate_sh3_bands(result, sh, M) {
197
-
198
- const b0 = sh[0];
199
- const band1 = [sh[1], sh[2], sh[3]];
200
- const b1 = rotateShericalHarmonicBand1(band1, M);
201
- const band2 = [sh[4], sh[5], sh[6], sh[7], sh[8]];
202
- const b2 = rotateShericalHarmonicBand2(band2, M);
203
-
204
- result[0] = b0;
205
-
206
- result[1] = b1[0];
207
- result[2] = b1[1];
208
- result[3] = b1[2];
209
-
210
- result[4] = b2[0];
211
- result[5] = b2[1];
212
- result[6] = b2[2];
213
- result[7] = b2[3];
214
- result[8] = b2[4];
215
- }
216
-
217
- /**
218
- *
219
- * @param {number[]} input_sh3 sh3
46
+ * Minimum values encoded on the spherical harmonics
47
+ * Lets us find ringing artifacts, which are cases where harmonics encode a negative value
48
+ * @param {number[]|Float32Array} input_sh3 sh3
220
49
  * @returns {number}
221
50
  */
222
- function shmin(input_sh3) {
51
+ function sh3_min(input_sh3) {
223
52
  // See "Deringing Spherical Harmonics" by Peter-Pike Sloan
224
53
  // https://www.ppsloan.org/publications/shdering.pdf
225
54
 
226
- const A = [
227
- 1.0 / (2.0 * M_SQRT_PI), // 0: 0 0
228
- -M_SQRT_3 / (2.0 * M_SQRT_PI), // 1: 1 -1
229
- M_SQRT_3 / (2.0 * M_SQRT_PI), // 2: 1 0
230
- -M_SQRT_3 / (2.0 * M_SQRT_PI), // 3: 1 1
231
- M_SQRT_15 / (2.0 * M_SQRT_PI), // 4: 2 -2
232
- -M_SQRT_15 / (2.0 * M_SQRT_PI), // 5: 2 -1
233
- M_SQRT_5 / (4.0 * M_SQRT_PI), // 6: 2 0
234
- -M_SQRT_15 / (2.0 * M_SQRT_PI), // 7: 2 1
235
- M_SQRT_15 / (4.0 * M_SQRT_PI) // 8: 2 2
236
- ];
237
55
 
238
56
  // first this to do is to rotate the SH to align Z with the optimal linear direction
239
57
  const dir = vec3.fromValues(-input_sh3[3], -input_sh3[1], input_sh3[2]);
@@ -259,7 +77,7 @@ function shmin(input_sh3) {
259
77
 
260
78
  const f = new Float32Array(9);
261
79
 
262
- rotate_sh3_bands(f, input_sh3, M);
80
+ sh3_rotate(f, input_sh3, M);
263
81
  // here we're guaranteed to have normalize(float3{ -f[3], -f[1], f[2] }) == { 0, 0, 1 }
264
82
 
265
83
 
@@ -270,7 +88,7 @@ function shmin(input_sh3) {
270
88
  // of z such as: m2min = -m2max * (1 - z^2) = m2max * z^2 - m2max
271
89
  // with m2max = A[8] * std::sqrt(f[8] * f[8] + f[4] * f[4]);
272
90
  // We can therefore include this in the ZH min computation (which is function of z^2 as well)
273
- const m2max = A[8] * Math.sqrt(f[8] * f[8] + f[4] * f[4]);
91
+ const m2max = SH3_COEFFICIENTS[8] * Math.sqrt(f[8] * f[8] + f[4] * f[4]);
274
92
 
275
93
  // Find the min of the zonal harmonics
276
94
  // -----------------------------------
@@ -286,9 +104,9 @@ function shmin(input_sh3) {
286
104
  //
287
105
  // We also needs to check that -1 < z < 1, otherwise the min is either in z = -1 or 1
288
106
  //
289
- const a = 3 * A[6] * f[6] + m2max;
290
- const b = A[2] * f[2];
291
- const c = A[0] * f[0] - A[6] * f[6] - m2max;
107
+ const a = 3 * SH3_COEFFICIENTS[6] * f[6] + m2max;
108
+ const b = SH3_COEFFICIENTS[2] * f[2];
109
+ const c = SH3_COEFFICIENTS[0] * f[0] - SH3_COEFFICIENTS[6] * f[6] - m2max;
292
110
 
293
111
  const zmin = -b / (2.0 * a);
294
112
  const m0min_z = a * zmin * zmin + b * zmin + c;
@@ -304,7 +122,7 @@ function shmin(input_sh3) {
304
122
  // The function considered is:
305
123
  // Y(x, y, z) = A[5] * f[5] * s.y * s.z
306
124
  // + A[7] * f[7] * s.z * s.x
307
- const d = A[4] * Math.sqrt(f[5] * f[5] + f[7] * f[7]);
125
+ const d = SH3_COEFFICIENTS[4] * Math.sqrt(f[5] * f[5] + f[7] * f[7]);
308
126
 
309
127
  // the |m|=1 function is minimal in -0.5 -- use that to skip the Newton's loop when possible
310
128
  let minimum = m0min - 0.5 * d;
@@ -315,7 +133,7 @@ function shmin(input_sh3) {
315
133
 
316
134
 
317
135
  let dz;
318
- let z = -F_SQRT1_2; // we start guessing at the min of |m|=1 function
136
+ let z = -Math.SQRT1_2; // we start guessing at the min of |m|=1 function
319
137
  do {
320
138
  minimum = func_(z, a, b, c, d); // evaluate our function
321
139
  dz = increment_(z, a, b, d); // refine our guess by this amount
@@ -366,14 +184,22 @@ function increment_(x, a, b, d) {
366
184
  * @param {number} numBands
367
185
  */
368
186
  function windowing(f, cutoff, numBands) {
187
+
369
188
  for (let l = 0; l < numBands; l++) {
370
- const w = sincWindow(l, cutoff);
189
+
190
+ const w = sinc_window(l, cutoff);
191
+
371
192
  f[sh_index(0, l)] *= w;
193
+
372
194
  for (let m = 1; m <= l; m++) {
195
+
373
196
  f[sh_index(-m, l)] *= w;
374
197
  f[sh_index(m, l)] *= w;
198
+
375
199
  }
200
+
376
201
  }
202
+
377
203
  return f;
378
204
  }
379
205
 
@@ -390,7 +216,8 @@ function windowing(f, cutoff, numBands) {
390
216
  function windowSH(
391
217
  output, output_offset,
392
218
  input, input_offset,
393
- numBands, channel_count, cutoff = 0
219
+ numBands, channel_count,
220
+ cutoff = 0
394
221
  ) {
395
222
  assert.isNonNegativeInteger(channel_count, 'channel_count');
396
223
  assert.greaterThan(channel_count, 0, 'channel_count must be greater than 0');
@@ -424,7 +251,9 @@ function windowSH(
424
251
 
425
252
  const m = 0.5 * (l + r);
426
253
 
427
- if (shmin(windowing(SH, m, numBands)) < 0) {
254
+ windowing(SH, m, numBands);
255
+
256
+ if (sh3_min(SH) < 0) {
428
257
  r = m;
429
258
  } else {
430
259
  l = m;
@@ -442,7 +271,7 @@ function windowSH(
442
271
 
443
272
  for (let l = 0; l < numBands; l++) {
444
273
  // scale each band individually
445
- let w = sincWindow(l, cutoff);
274
+ const w = sinc_window(l, cutoff);
446
275
 
447
276
  // write zonal harmonic
448
277
  for (let i = 0; i < channel_count; i++) {
@@ -461,9 +290,9 @@ function windowSH(
461
290
 
462
291
  /**
463
292
  *
464
- * @param {number[]|Float32Array} result
293
+ * @param {number[]|Float32Array|Float64Array} result
465
294
  * @param {number} result_offset
466
- * @param {number[]|Float32Array} harmonics
295
+ * @param {number[]|Float32Array|Float64Array} harmonics
467
296
  * @param {number} harmonics_offset
468
297
  * @param {number} dimension_count
469
298
  */
@@ -0,0 +1,8 @@
1
+ /**
2
+ *
3
+ * @param {number[]|Float32Array} result sh3
4
+ * @param {number[]} sh input
5
+ * @param {number[]} rotation 3x3 rotation matrix
6
+ */
7
+ export function sh3_rotate(result: number[] | Float32Array, sh: number[], rotation: number[]): void;
8
+ //# sourceMappingURL=sh3_rotate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sh3_rotate.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/geom/3d/sphere/harmonics/sh3_rotate.js"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,mCAJW,MAAM,EAAE,GAAC,YAAY,MACrB,MAAM,EAAE,YACR,MAAM,EAAE,QAqBlB"}
@@ -0,0 +1,29 @@
1
+ import { sh_rotate_band1 } from "./sh_rotate_band1.js";
2
+ import { sh_rotate_band2 } from "./sh_rotate_band2.js";
3
+
4
+ /**
5
+ *
6
+ * @param {number[]|Float32Array} result sh3
7
+ * @param {number[]} sh input
8
+ * @param {number[]} rotation 3x3 rotation matrix
9
+ */
10
+ export function sh3_rotate(result, sh, rotation) {
11
+
12
+ const b0 = sh[0];
13
+ const band1 = [sh[1], sh[2], sh[3]];
14
+ const b1 = sh_rotate_band1(band1, rotation);
15
+ const band2 = [sh[4], sh[5], sh[6], sh[7], sh[8]];
16
+ const b2 = sh_rotate_band2(band2, rotation);
17
+
18
+ result[0] = b0;
19
+
20
+ result[1] = b1[0];
21
+ result[2] = b1[1];
22
+ result[3] = b1[2];
23
+
24
+ result[4] = b2[0];
25
+ result[5] = b2[1];
26
+ result[6] = b2[2];
27
+ result[7] = b2[3];
28
+ result[8] = b2[4];
29
+ }
@@ -1,4 +1,4 @@
1
- //
1
+ import { SH3_COEFFICIENTS } from "./SH3_COEFFICIENTS.js";
2
2
 
3
3
  /**
4
4
  * Sample value from a 3-band spherical harmonic defined by 9 coefficients
@@ -30,19 +30,19 @@ export function sh3_sample_by_direction(
30
30
  const offset = harmonics_offset + dimension_count * i;
31
31
 
32
32
  // band 0
33
- channel_value = harmonics[offset] * 0.282095;
33
+ channel_value = harmonics[offset] * SH3_COEFFICIENTS[0];
34
34
 
35
35
  // band 1
36
- channel_value += harmonics[offset + 1] * 0.488603 * y;
37
- channel_value += harmonics[offset + 2] * 0.488603 * z;
38
- channel_value += harmonics[offset + 3] * 0.488603 * x;
36
+ channel_value += harmonics[offset + 1] * SH3_COEFFICIENTS[1] * y;
37
+ channel_value += harmonics[offset + 2] * SH3_COEFFICIENTS[2] * z;
38
+ channel_value += harmonics[offset + 3] * SH3_COEFFICIENTS[3] * x;
39
39
 
40
40
  // band 2
41
- channel_value += harmonics[offset + 4] * 1.092548 * (x * y);
42
- channel_value += harmonics[offset + 5] * 1.092548 * (y * z);
43
- channel_value += harmonics[offset + 6] * 0.315392 * (3.0 * z * z - 1.0);
44
- channel_value += harmonics[offset + 7] * 1.092548 * (x * z);
45
- channel_value += harmonics[offset + 8] * 0.546274 * (x * x - y * y);
41
+ channel_value += harmonics[offset + 4] * SH3_COEFFICIENTS[4] * (x * y);
42
+ channel_value += harmonics[offset + 5] * SH3_COEFFICIENTS[5] * (y * z);
43
+ channel_value += harmonics[offset + 6] * SH3_COEFFICIENTS[6] * (3.0 * z * z - 1.0);
44
+ channel_value += harmonics[offset + 7] * SH3_COEFFICIENTS[7] * (x * z);
45
+ channel_value += harmonics[offset + 8] * SH3_COEFFICIENTS[8] * (x * x - y * y);
46
46
 
47
47
  // write out
48
48
  result[result_offset + i] = channel_value;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * compute index of spherical harmonics coefficient
3
+ * @param {number} m signed offset from zonal harmonic
4
+ * @param {number} l band
5
+ * @return {number}
6
+ */
7
+ export function sh_index(m: number, l: number): number;
8
+ //# sourceMappingURL=sh_index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sh_index.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/geom/3d/sphere/harmonics/sh_index.js"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,4BAJW,MAAM,KACN,MAAM,GACL,MAAM,CAIjB"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * compute index of spherical harmonics coefficient
3
+ * @param {number} m signed offset from zonal harmonic
4
+ * @param {number} l band
5
+ * @return {number}
6
+ */
7
+ export function sh_index(m, l) {
8
+ return l * (l + 1) + m;
9
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * utilities to rotate very low order spherical harmonics (up to 3rd band)
3
+ * @param {number[]} band1 vec3
4
+ * @param {number[]} M 3x3 matrix
5
+ * @returns {number[]}
6
+ */
7
+ export function sh_rotate_band1(band1: number[], M: number[]): number[];
8
+ //# sourceMappingURL=sh_rotate_band1.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sh_rotate_band1.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/geom/3d/sphere/harmonics/sh_rotate_band1.js"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,uCAJW,MAAM,EAAE,KACR,MAAM,EAAE,GACN,MAAM,EAAE,CAoCpB"}
@@ -0,0 +1,44 @@
1
+ import { mat3 } from "gl-matrix";
2
+ import { m3_multiply_vec3 } from "../../../mat3/m3_multiply_vec3.js";
3
+
4
+ /**
5
+ * utilities to rotate very low order spherical harmonics (up to 3rd band)
6
+ * @param {number[]} band1 vec3
7
+ * @param {number[]} M 3x3 matrix
8
+ * @returns {number[]}
9
+ */
10
+ export function sh_rotate_band1(band1, M) {
11
+
12
+ // inverse() is not constexpr -- so we pre-calculate it in mathematica
13
+ //
14
+ // constexpr float3 N0{ 1, 0, 0 };
15
+ // constexpr float3 N1{ 0, 1, 0 };
16
+ // constexpr float3 N2{ 0, 0, 1 };
17
+ //
18
+ // constexpr mat3f A1 = { // this is the projection of N0, N1, N2 to SH space
19
+ // float3{ -N0.y, N0.z, -N0.x },
20
+ // float3{ -N1.y, N1.z, -N1.x },
21
+ // float3{ -N2.y, N2.z, -N2.x }
22
+ // };
23
+ //
24
+ // const mat3f invA1 = inverse(A1);
25
+
26
+ const invA1TimesK = [
27
+ 0, -1, 0,
28
+ 0, 0, 1,
29
+ -1, 0, 0
30
+ ];
31
+
32
+ const R1OverK = [
33
+ -M[1], M[2], -M[0],
34
+ -M[4], M[5], -M[3],
35
+ -M[7], M[8], -M[6]
36
+ ];
37
+
38
+
39
+ m3_multiply_vec3(invA1TimesK, invA1TimesK, band1);
40
+
41
+ mat3.multiply(R1OverK, R1OverK, invA1TimesK);
42
+
43
+ return R1OverK;
44
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ *
3
+ * @param {number[]} band2 vec5
4
+ * @param {number[]} M mat3
5
+ * @return {number[]} vec5
6
+ */
7
+ export function sh_rotate_band2(band2: number[], M: number[]): number[];
8
+ //# sourceMappingURL=sh_rotate_band2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sh_rotate_band2.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/geom/3d/sphere/harmonics/sh_rotate_band2.js"],"names":[],"mappings":"AAuCA;;;;;GAKG;AACH,uCAJW,MAAM,EAAE,KACR,MAAM,EAAE,GACP,MAAM,EAAE,CA0CnB"}