@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,609 +0,0 @@
1
- import {
2
- CubeCamera,
3
- LinearEncoding,
4
- LinearFilter,
5
- LineBasicMaterial,
6
- MeshStandardMaterial,
7
- RGBAFormat,
8
- Scene,
9
- WebGLCubeRenderTarget
10
- } from "three";
11
- import { array_copy } from "../../../core/collection/array/array_copy.js";
12
- import { sh3_basis_at } from "../../../core/geom/3d/sphere/harmonics/sh3_basis_at.js";
13
- import { sh3_dering_optimize_positive } from "../../../core/geom/3d/sphere/harmonics/sh3_dering_optimize_positive.js";
14
- import { SurfacePoint3 } from "../../../core/geom/3d/SurfacePoint3.js";
15
- import {
16
- build_tetrahedral_mesh_buffer_geometry
17
- } from "../../../core/geom/3d/tetrahedra/build_tetrahedral_mesh_buffer_geometry.js";
18
- import {
19
- compute_delaunay_tetrahedral_mesh
20
- } from "../../../core/geom/3d/tetrahedra/delaunay/compute_delaunay_tetrahedral_mesh.js";
21
- import { TetrahedralMesh } from "../../../core/geom/3d/tetrahedra/TetrahedralMesh.js";
22
- import { v3_length_sqr } from "../../../core/geom/vec3/v3_length_sqr.js";
23
- import TaskGroup from "../../../core/process/task/TaskGroup.js";
24
- import { actionTask } from "../../../core/process/task/util/actionTask.js";
25
- import { countTask } from "../../../core/process/task/util/countTask.js";
26
- import Entity from "../../ecs/Entity.js";
27
- import { Transform } from "../../ecs/transform/Transform.js";
28
- import { threeMakeLight } from "../ecs/light/binding/three/threeMakeLight.js";
29
- import { Light } from "../ecs/light/Light.js";
30
- import { ThreeLightCache } from "../ecs/light/three/ThreeLightCache.js";
31
- import { build_three_object } from "../ecs/mesh-v2/build_three_object.js";
32
- import { DrawMode } from "../ecs/mesh-v2/DrawMode.js";
33
- import { ShadedGeometry } from "../ecs/mesh-v2/ShadedGeometry.js";
34
- import { ShadedGeometryFlags } from "../ecs/mesh-v2/ShadedGeometryFlags.js";
35
- import { applyTransformToThreeObject } from "../ecs/mesh/applyTransformToThreeObject.js";
36
- import { visualise_probe } from "./visualise_probe.js";
37
-
38
- const TEMP_CONTACT = new SurfacePoint3();
39
-
40
- /**
41
- *
42
- * @param {Uint8Array} data
43
- * @param {THREE.WebGLRenderer} renderer
44
- * @param {THREE.WebGLCubeRenderTarget} cubeRenderTarget
45
- * @return {Float64Array}
46
- */
47
- function fromCubeRenderTarget(data, renderer, cubeRenderTarget) {
48
-
49
- // The renderTarget must be set to RGBA in order to make readRenderTargetPixels works
50
- let total_weight = 0;
51
-
52
- const __shared_buffer = new ArrayBuffer((27 + 9) * 8);
53
-
54
- const sh_basis = new Float64Array(__shared_buffer, 0, 9);
55
- const coefficients = new Float64Array(__shared_buffer, 9 * 8, 27);
56
-
57
- const image_size = cubeRenderTarget.width;
58
-
59
- const pixel_size = 2 / image_size;
60
-
61
- let normal_x = 0, normal_y = 0, normal_z = 0;
62
-
63
- for (let faceIndex = 0; faceIndex < 6; faceIndex++) {
64
-
65
- renderer.readRenderTargetPixels(cubeRenderTarget, 0, 0, image_size, image_size, data, faceIndex);
66
-
67
- // RGBA assumed
68
-
69
- for (let i = 0, il = data.length; i < il; i += 4) {
70
-
71
-
72
- // pixel coordinate on unit cube
73
-
74
- const pixelIndex = i / 4;
75
-
76
- const col = -1 + (pixelIndex % image_size + 0.5) * pixel_size;
77
-
78
- const row = 1 - (Math.floor(pixelIndex / image_size) + 0.5) * pixel_size;
79
-
80
-
81
- switch (faceIndex) {
82
-
83
- case 0:
84
- normal_x = 1;
85
- normal_y = row;
86
- normal_z = -col;
87
- break;
88
-
89
- case 1:
90
- normal_x = -1;
91
- normal_y = row;
92
- normal_z = col;
93
- break;
94
-
95
- case 2:
96
- normal_x = col;
97
- normal_y = 1;
98
- normal_z = -row;
99
- break;
100
-
101
- case 3:
102
- normal_x = col;
103
- normal_y = -1;
104
- normal_z = row;
105
- break;
106
-
107
- case 4:
108
- normal_x = col;
109
- normal_y = row;
110
- normal_z = 1;
111
- break;
112
-
113
- case 5:
114
- normal_x = -col;
115
- normal_y = row;
116
- normal_z = -1;
117
- break;
118
-
119
- }
120
-
121
- // weight assigned to this pixel
122
-
123
- const length_squared = v3_length_sqr(normal_x, normal_y, normal_z);
124
-
125
- const length = Math.sqrt(length_squared);
126
-
127
- const weight = 4 / (length * length_squared);
128
-
129
- total_weight += weight;
130
-
131
- // direction vector to this pixel
132
- normal_x /= length;
133
- normal_y /= length;
134
- normal_z /= length;
135
-
136
- // evaluate SH basis functions in direction dir
137
- sh3_basis_at(normal_x, normal_y, normal_z, sh_basis);
138
-
139
- // pixel color, already in linear space so no sRGB->Linear conversion necessary
140
-
141
- // 0.003921 constant value is 1/255, a conversion value from UINT8 to normalized float
142
- const weight_conv = weight * 0.00392156862745098;
143
-
144
- const color_r = data[i] * weight_conv;
145
- const color_g = data[i + 1] * weight_conv;
146
- const color_b = data[i + 2] * weight_conv;
147
-
148
- // accumulate
149
- for (let j = 0; j < 9; j++) {
150
-
151
- coefficients[j * 3] += sh_basis[j] * color_r;
152
- coefficients[j * 3 + 1] += sh_basis[j] * color_g;
153
- coefficients[j * 3 + 2] += sh_basis[j] * color_b;
154
-
155
- }
156
-
157
- }
158
-
159
- }
160
-
161
- // normalize
162
- const norm = (4 * Math.PI) / total_weight;
163
-
164
- for (let j = 0; j < 27; j++) {
165
-
166
- coefficients[j] *= norm;
167
-
168
- }
169
-
170
- sh3_dering_optimize_positive(coefficients, 0, coefficients, 0, 3);
171
-
172
- return coefficients;
173
-
174
- }
175
-
176
-
177
- class CubeRenderer {
178
- constructor() {
179
- /**
180
- *
181
- * @type {GraphicsEngine|null}
182
- */
183
- this.ge = null;
184
-
185
- /**
186
- *
187
- * @type {THREE.WebGLRenderer|null}
188
- * @private
189
- */
190
- this.__renderer = null;
191
-
192
- this.render_target = new WebGLCubeRenderTarget(32, {
193
- format: RGBAFormat,
194
- minFilter: LinearFilter,
195
- magFilter: LinearFilter,
196
- depthBuffer: true,
197
- scissorTest: false,
198
- stencilBuffer: false,
199
- generateMipmaps: false,
200
- encoding: LinearEncoding
201
- });
202
-
203
- /**
204
- * Used to read out GPU memory for each face
205
- * @type {Uint8Array}
206
- * @private
207
- */
208
- this.__cube_face_raw = new Uint8Array(this.render_target.width * this.render_target.width * 4);
209
-
210
-
211
- this.__cube_camera = new CubeCamera(0.1, 100, this.render_target);
212
-
213
- /**
214
- *
215
- * @type {Scene}
216
- * @private
217
- */
218
- this.__scene = new Scene();
219
- // this.__scene.autoUpdate = false;
220
- // this.__scene.matrixAutoUpdate = false;
221
- }
222
-
223
- /**
224
- *
225
- * @param {EntityComponentDataset} ecd
226
- */
227
- build_scene(ecd) {
228
- this.__scene.children.splice(0, this.__scene.children.length);
229
-
230
- ecd.traverseEntities([ShadedGeometry, Transform], (sg, t, entity) => {
231
- const object3D = build_three_object(sg);
232
-
233
- const source_material = sg.material;
234
-
235
- //
236
- if (source_material.isMeshStandardMaterial === true) {
237
- object3D.material = new MeshStandardMaterial({
238
- map: source_material.map,
239
- });
240
-
241
- object3D.material.color.copy(source_material.color);
242
- } else {
243
- object3D.material = source_material.clone();
244
- }
245
-
246
- applyTransformToThreeObject(object3D, t);
247
-
248
- array_copy(t.matrix, 0, object3D.matrixWorld.elements, 0, 16);
249
-
250
- this.__scene.add(object3D);
251
- });
252
-
253
- const lightCache = new ThreeLightCache();
254
-
255
- ecd.traverseEntities([Light, Transform], (light, t) => {
256
-
257
- const object = threeMakeLight(light, lightCache);
258
- applyTransformToThreeObject(object, t);
259
-
260
- this.__scene.add(object);
261
- });
262
-
263
- // this.__scene.add(this.__cube_camera);
264
- }
265
-
266
- bake_start() {
267
- // this.__renderer = WebGLRendererPool.global.get();
268
-
269
- this.__renderer = this.ge.getRenderer();
270
- }
271
-
272
- bake_end() {
273
- // WebGLRendererPool.global.release(this.__renderer);
274
-
275
- this.__renderer = null;
276
- }
277
-
278
- /**
279
- *
280
- * @param {number[]} position
281
- * @param {number} position_offset
282
- * @param {number[]} output
283
- * @param {number} output_offset
284
- */
285
- bake(position, position_offset, output, output_offset) {
286
- // console.warn(position_offset, output_offset);
287
-
288
- // const ge = this.ge;
289
- const renderer = this.__renderer;
290
-
291
- const _rt = renderer.getRenderTarget();
292
- const _rt_active_face = renderer.getActiveCubeFace();
293
- const _acc = renderer.autoClearColor;
294
- const _acd = renderer.autoClearDepth;
295
- const _ac = renderer.autoClear;
296
- const _outputEncoding = renderer.outputEncoding;
297
-
298
- renderer.outputEncoding = LinearEncoding;
299
-
300
- renderer.autoClearColor = true;
301
- renderer.autoClearDepth = true;
302
- renderer.autoClear = true;
303
-
304
- this.__cube_camera.position.fromArray(position, position_offset);
305
-
306
- this.__cube_camera.children.forEach(c => {
307
- c.updateProjectionMatrix();
308
- c.updateMatrix();
309
- c.updateMatrixWorld(true);
310
- });
311
-
312
- this.__cube_camera.update(renderer, this.__scene);
313
-
314
-
315
- // compute coefficients from renderer
316
- const probe_coefficients = fromCubeRenderTarget(this.__cube_face_raw, renderer, this.render_target);
317
-
318
- array_copy(probe_coefficients, 0, output, output_offset, 27);
319
-
320
- // restore state
321
- renderer.setRenderTarget(_rt, _rt_active_face);
322
- renderer.autoClearColor = _acc;
323
- renderer.autoClearDepth = _acd;
324
- renderer.autoClear = _ac;
325
- renderer.outputEncoding = _outputEncoding;
326
- }
327
- }
328
-
329
- class Baker {
330
- constructor() {
331
- /**
332
- *
333
- * @type {EntityComponentDataset|null}
334
- * @private
335
- */
336
- this.__ecd = null;
337
-
338
- /**
339
- *
340
- * @type {BVH|null}
341
- * @private
342
- */
343
- this.__bvh = null;
344
-
345
- this.__min_bounce_count = 3;
346
- this.__max_bounce_count = 100;
347
-
348
- this._ren = new CubeRenderer();
349
- }
350
-
351
- /**
352
- * @param {BVH} bvh
353
- */
354
- set_bvh(bvh) {
355
- this.__bvh = bvh;
356
- }
357
-
358
- build_spatial() {
359
-
360
- }
361
-
362
- /**
363
- *
364
- * @param {number[]} irradiance RGB irradiance result is written here
365
- * @param {number} bounce_count number of reflections before this trace
366
- * @param {number} origin_x
367
- * @param {number} origin_y
368
- * @param {number} origin_z
369
- * @param {number} direction_x
370
- * @param {number} direction_y
371
- * @param {number} direction_z
372
- */
373
- trace_ray(irradiance, bounce_count,
374
- origin_x, origin_y, origin_z,
375
- direction_x, direction_y, direction_z) {
376
-
377
- //
378
-
379
- if (!this.ray_cast(TEMP_CONTACT, origin_x, origin_y, origin_z, direction_x, direction_y, direction_z)) {
380
- // no hit, assume irradiance is zeroed - black
381
-
382
- return;
383
- }
384
-
385
- // record irradiance
386
-
387
- // reflect ray around normal
388
- // TODO apply BDRF to compute reflected ray
389
-
390
- if (bounce_count > this.__max_bounce_count) {
391
- // terminate
392
- }
393
-
394
- }
395
-
396
- /**
397
- *
398
- * @param contact
399
- * @param origin_x
400
- * @param origin_y
401
- * @param origin_z
402
- * @param direction_x
403
- * @param direction_y
404
- * @param direction_z
405
- * @returns {boolean}
406
- */
407
- ray_cast(contact,
408
- origin_x, origin_y, origin_z,
409
- direction_x, direction_y, direction_z
410
- ) {
411
-
412
- }
413
-
414
- prepare_scene() {
415
-
416
- }
417
-
418
- /**
419
- *
420
- * @param {number[]} position
421
- * @param {number} position_offset
422
- * @param {number[]} output
423
- * @param {number} output_offset
424
- */
425
- bake_sh3_cube(
426
- position, position_offset,
427
- output, output_offset
428
- ) {
429
-
430
- this._ren.bake(position, position_offset, output, output_offset);
431
-
432
- }
433
-
434
- /**
435
- *
436
- * @param {Engine} engine
437
- */
438
- prepare(engine) {
439
- this._ren.ge = engine.graphics;
440
-
441
- this._ren.build_scene(engine.entityManager.dataset);
442
-
443
- this._ren.bake_start();
444
- }
445
-
446
- finish() {
447
- this._ren.bake_end();
448
- }
449
- }
450
-
451
- export class LightProbeVolume {
452
- constructor() {
453
- this.__positions = [];
454
-
455
- this.__mesh = new TetrahedralMesh();
456
-
457
- this.__probe_data = [];
458
-
459
- this.__length = 0;
460
- }
461
-
462
- /**
463
- *
464
- * @param {number} x
465
- * @param {number} y
466
- * @param {number} z
467
- */
468
- add_point(x, y, z) {
469
- const i = this.__length;
470
-
471
- this.__positions[i * 3] = x;
472
- this.__positions[i * 3 + 1] = y;
473
- this.__positions[i * 3 + 2] = z;
474
-
475
- for (let j = 0; j < 9 * 3; j++) {
476
- this.__probe_data[i * 9 * 3 + j] = 1; // fill with white
477
- }
478
-
479
- this.__length++;
480
- }
481
-
482
- /**
483
- *
484
- * @param {number} index
485
- * @param {number[]} source
486
- * @param {number} source_offset
487
- */
488
- white_probe(index, source, source_offset) {
489
- array_copy(source, source_offset, this.__probe_data, index * 9 * 3, 9 * 3);
490
- }
491
-
492
- /**
493
- * Build tetrahedral mesh
494
- */
495
- build_mesh() {
496
-
497
- const t0 = performance.now();
498
- compute_delaunay_tetrahedral_mesh(this.__mesh, this.__positions, this.__length);
499
-
500
- const t1 = performance.now();
501
-
502
- // optional step to improve memory utilization
503
- this.__mesh.compact();
504
-
505
- const t2 = performance.now();
506
-
507
- console.log(`Tetrahedral mesh (${this.__length} points, ${this.__mesh.size()} tets) build took ${t2 - t0}ms`);
508
- }
509
-
510
-
511
- /**
512
- * Bake light probes
513
- * @param {Engine} engine
514
- * @returns {TaskGroup}
515
- */
516
- bake(engine) {
517
- const baker = new Baker();
518
- // baker.set_bvh(entityManager.getSystem(ShadedGeometrySystem).__bvh_binary);
519
-
520
-
521
- const tPrepare = actionTask(() => {
522
- baker.prepare(engine);
523
- });
524
-
525
-
526
- const probe_count = this.__length;
527
- const tBake = countTask(0, probe_count, (i) => {
528
-
529
- baker.bake_sh3_cube(
530
- this.__positions, i * 3,
531
- this.__probe_data, i * 9 * 3
532
- );
533
-
534
- });
535
-
536
- tBake.promise().then(()=>{
537
-
538
- const duration =tBake.__executedCpuTime;
539
-
540
- console.log(`Baked ${probe_count} probes in ${duration}ms, ~${(duration / probe_count).toFixed(2)}ms per probe`);
541
-
542
- })
543
-
544
- const tFinish = actionTask(() => {
545
- baker.finish();
546
- });
547
-
548
- tFinish.addDependency(tBake);
549
- tBake.addDependency(tPrepare);
550
-
551
- return new TaskGroup([
552
- tPrepare, tBake, tFinish
553
- ]);
554
- }
555
-
556
- /**
557
- *
558
- * @param {EntityComponentDataset} ecd
559
- * @param {number} size
560
- * @param {boolean} shadow
561
- */
562
- visualize_probes({ ecd, size = 0.2, shadow = false }) {
563
- for (let i = 0; i < this.__length; i++) {
564
- visualise_probe({
565
- size,
566
- position: this.__positions,
567
- position_offset: i * 3,
568
- sh: this.__probe_data,
569
- sh_offset: i * 3 * 9,
570
- shadow: shadow
571
- }).build(ecd);
572
- }
573
- }
574
-
575
- /**
576
- *
577
- * @param {EntityComponentDataset} ecd
578
- * @param {string|number} color CSS color definition
579
- */
580
- visualize_mesh({ ecd, color = '#FF00FF' }) {
581
-
582
- const geometry = build_tetrahedral_mesh_buffer_geometry(this.__mesh, this.__positions);
583
-
584
- const sg = ShadedGeometry.from(geometry, new LineBasicMaterial({
585
- color: color,
586
- transparent: true,
587
- opacity: 0.35,
588
- depthWrite: false
589
- }), DrawMode.LineSegments);
590
-
591
- sg.clearFlag(ShadedGeometryFlags.CastShadow);
592
- sg.clearFlag(ShadedGeometryFlags.ReceiveShadow);
593
-
594
- new Entity()
595
- .add(sg)
596
- .add(new Transform())
597
- .build(ecd);
598
- }
599
-
600
- /**
601
- *
602
- * @param {Engine} engine
603
- * @returns {TaskGroup}
604
- */
605
- build(engine) {
606
- this.build_mesh();
607
- return this.bake(engine);
608
- }
609
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"apply_texture_clamping_to_coordinate.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/graphics/sh3/path_tracer/apply_texture_clamping_to_coordinate.js"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,+DAJW,MAAM,KACN,MAAM,GACL,MAAM,CAcjB"}
@@ -1,12 +0,0 @@
1
- /**
2
- *
3
- * @param {number} [size]
4
- * @param position
5
- * @param position_offset
6
- * @param sh
7
- * @param sh_offset
8
- * @return {Entity}
9
- */
10
- export function visualise_probe({ size, shadow, position, position_offset, sh, sh_offset }?: number): Entity;
11
- import Entity from "../../ecs/Entity.js";
12
- //# sourceMappingURL=visualise_probe.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"visualise_probe.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics/sh3/visualise_probe.js"],"names":[],"mappings":"AAOA;;;;;;;;GAQG;AACH,6FAPW,MAAM,GAKL,MAAM,CAyBjB;mBAtCkB,qBAAqB"}
@@ -1,40 +0,0 @@
1
- import { SH3VisualisationMaterial } from "./SH3VisualisationMaterial.js";
2
- import Entity from "../../ecs/Entity.js";
3
- import { Transform } from "../../ecs/transform/Transform.js";
4
- import { ShadedGeometry } from "../ecs/mesh-v2/ShadedGeometry.js";
5
- import { OctahedronBufferGeometry } from "three";
6
- import { ShadedGeometryFlags } from "../ecs/mesh-v2/ShadedGeometryFlags.js";
7
-
8
- /**
9
- *
10
- * @param {number} [size]
11
- * @param position
12
- * @param position_offset
13
- * @param sh
14
- * @param sh_offset
15
- * @return {Entity}
16
- */
17
- export function visualise_probe({ size = 1,shadow=false, position, position_offset = 0, sh, sh_offset = 0 }) {
18
-
19
- const mat = new SH3VisualisationMaterial();
20
-
21
- for (let i = 0; i < 9; i++) {
22
- mat.uniforms.sh.value[i].fromArray(sh, sh_offset + i * 3);
23
- }
24
-
25
- const shadedGeometry = ShadedGeometry.from(new OctahedronBufferGeometry(1, 5), mat);
26
-
27
- shadedGeometry.writeFlag(ShadedGeometryFlags.ReceiveShadow,shadow);
28
- shadedGeometry.writeFlag(ShadedGeometryFlags.CastShadow,shadow);
29
-
30
- return new Entity()
31
- .add(Transform.fromJSON({
32
- position: {
33
- x: position[position_offset],
34
- y: position[position_offset + 1],
35
- z: position[position_offset + 2],
36
- },
37
- scale: size
38
- }))
39
- .add(shadedGeometry);
40
- }