@woosh/meep-engine 3.29.0 → 3.31.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 (1766) hide show
  1. package/build/bundle-worker-image-decoder.js +1 -1
  2. package/build/bundle-worker-terrain.js +1 -1
  3. package/package.json +3 -1
  4. package/src/core/binary/BinaryBuffer.d.ts.map +1 -1
  5. package/src/core/binary/BinaryBuffer.js +56 -16
  6. package/src/core/binary/BitImage2.d.ts.map +1 -1
  7. package/src/core/binary/BitImage2.js +2 -6
  8. package/src/core/binary/BitSet.js +5 -5
  9. package/src/core/binary/compression/chunks_to_stream.d.ts +24 -0
  10. package/src/core/binary/compression/chunks_to_stream.d.ts.map +1 -0
  11. package/src/core/binary/compression/chunks_to_stream.js +35 -0
  12. package/src/core/binary/compression/compress_bytes.d.ts +3 -4
  13. package/src/core/binary/compression/compress_bytes.d.ts.map +1 -1
  14. package/src/core/binary/compression/compress_bytes.js +6 -17
  15. package/src/core/binary/compression/decompress_bytes.d.ts +1 -2
  16. package/src/core/binary/compression/decompress_bytes.d.ts.map +1 -1
  17. package/src/core/binary/compression/decompress_bytes.js +4 -15
  18. package/src/core/binary/compression/decompress_bytes_into.d.ts.map +1 -1
  19. package/src/core/binary/compression/decompress_bytes_into.js +2 -13
  20. package/src/core/binary/ctz32.d.ts +12 -4
  21. package/src/core/binary/ctz32.d.ts.map +1 -1
  22. package/src/core/binary/ctz32.js +23 -41
  23. package/src/core/binary/lsb_32.d.ts +10 -2
  24. package/src/core/binary/lsb_32.d.ts.map +1 -1
  25. package/src/core/binary/lsb_32.js +17 -12
  26. package/src/core/binary/lz4/lz4_compress_block_hc.js +2 -2
  27. package/src/core/binary/type/DataTypeIndices.d.ts +39 -0
  28. package/src/core/binary/type/DataTypeIndices.d.ts.map +1 -1
  29. package/src/core/binary/type/DataTypeIndices.js +38 -1
  30. package/src/core/binary/type/Type.d.ts.map +1 -1
  31. package/src/core/binary/type/Type.js +6 -1
  32. package/src/core/bvh2/bvh3/BVH.d.ts.map +1 -1
  33. package/src/core/bvh2/bvh3/BVH.js +14 -1
  34. package/src/core/bvh2/bvh3/ebvh_optimize_treelet.js +3 -3
  35. package/src/core/bvh8/bvh8_geometry_validate.d.ts.map +1 -1
  36. package/src/core/bvh8/bvh8_geometry_validate.js +2 -88
  37. package/src/core/bvh8/bvh8_geometry_validate_bounds.d.ts +25 -0
  38. package/src/core/bvh8/bvh8_geometry_validate_bounds.d.ts.map +1 -0
  39. package/src/core/bvh8/bvh8_geometry_validate_bounds.js +105 -0
  40. package/src/core/bvh8/bvh8_geometry_validate_indirect.d.ts.map +1 -1
  41. package/src/core/bvh8/bvh8_geometry_validate_indirect.js +2 -91
  42. package/src/core/cache/FrequencySketch.d.ts +3 -1
  43. package/src/core/cache/FrequencySketch.d.ts.map +1 -1
  44. package/src/core/cache/FrequencySketch.js +10 -4
  45. package/src/core/cache/wtinylfu/CacheWTinylfu.d.ts.map +1 -1
  46. package/src/core/cache/wtinylfu/CacheWTinylfu.js +24 -2
  47. package/src/core/clipboard/obtainClipBoard.d.ts +4 -0
  48. package/src/core/clipboard/obtainClipBoard.d.ts.map +1 -1
  49. package/src/core/clipboard/obtainClipBoard.js +29 -8
  50. package/src/core/clipboard/safeClipboardReadText.d.ts.map +1 -1
  51. package/src/core/clipboard/safeClipboardReadText.js +73 -38
  52. package/src/core/clipboard/safeClipboardWriteText.d.ts.map +1 -1
  53. package/src/core/clipboard/safeClipboardWriteText.js +11 -9
  54. package/src/core/collection/array/iterator/ArrayIteratorRandom.d.ts.map +1 -1
  55. package/src/core/collection/array/iterator/ArrayIteratorRandom.js +6 -0
  56. package/src/core/collection/heap/IndexedFloatMinHeap.d.ts +6 -0
  57. package/src/core/collection/heap/IndexedFloatMinHeap.d.ts.map +1 -1
  58. package/src/core/collection/heap/IndexedFloatMinHeap.js +14 -0
  59. package/src/core/collection/list/FilteredListProjection.d.ts.map +1 -1
  60. package/src/core/collection/list/FilteredListProjection.js +7 -54
  61. package/src/core/collection/list/List.d.ts +4 -0
  62. package/src/core/collection/list/List.d.ts.map +1 -1
  63. package/src/core/collection/list/List.js +10 -52
  64. package/src/core/collection/list/SortedListProjection.d.ts +7 -0
  65. package/src/core/collection/list/SortedListProjection.d.ts.map +1 -1
  66. package/src/core/collection/list/SortedListProjection.js +12 -0
  67. package/src/core/collection/list/list_apply_ordered_diff.d.ts +37 -0
  68. package/src/core/collection/list/list_apply_ordered_diff.d.ts.map +1 -0
  69. package/src/core/collection/list/list_apply_ordered_diff.js +87 -0
  70. package/src/core/collection/map/BiMap.d.ts.map +1 -1
  71. package/src/core/collection/map/BiMap.js +19 -6
  72. package/src/core/collection/map/HashMap.d.ts.map +1 -1
  73. package/src/core/collection/map/HashMap.js +38 -11
  74. package/src/core/collection/queue/Deque.d.ts +2 -2
  75. package/src/core/collection/queue/Deque.d.ts.map +1 -1
  76. package/src/core/collection/queue/Deque.js +12 -1
  77. package/src/core/collection/table/RowFirstTable.d.ts.map +1 -1
  78. package/src/core/collection/table/RowFirstTable.js +15 -2
  79. package/src/core/collection/table/serializeRowFirstTable.d.ts.map +1 -1
  80. package/src/core/collection/table/serializeRowFirstTable.js +2 -3
  81. package/src/core/color/operations/color_lerp.d.ts.map +1 -1
  82. package/src/core/color/operations/color_lerp.js +77 -55
  83. package/src/core/color/sRGB/linear_to_sRGB.d.ts.map +1 -1
  84. package/src/core/color/sRGB/linear_to_sRGB.js +3 -1
  85. package/src/core/debug/matchers/AllOf.d.ts +2 -1
  86. package/src/core/debug/matchers/AllOf.d.ts.map +1 -1
  87. package/src/core/debug/matchers/AllOf.js +1 -1
  88. package/src/core/debug/matchers/AnyOf.d.ts +2 -1
  89. package/src/core/debug/matchers/AnyOf.d.ts.map +1 -1
  90. package/src/core/debug/matchers/AnyOf.js +1 -1
  91. package/src/core/debug/matchers/CombinableMatcher.d.ts +2 -1
  92. package/src/core/debug/matchers/CombinableMatcher.d.ts.map +1 -1
  93. package/src/core/debug/matchers/CombinableMatcher.js +1 -1
  94. package/src/core/debug/matchers/DescribeAs.d.ts +2 -1
  95. package/src/core/debug/matchers/DescribeAs.d.ts.map +1 -1
  96. package/src/core/debug/matchers/DescribeAs.js +2 -1
  97. package/src/core/debug/matchers/IsAnything.d.ts +2 -1
  98. package/src/core/debug/matchers/IsAnything.d.ts.map +1 -1
  99. package/src/core/debug/matchers/IsAnything.js +2 -1
  100. package/src/core/debug/matchers/IsEqual.d.ts +2 -1
  101. package/src/core/debug/matchers/IsEqual.d.ts.map +1 -1
  102. package/src/core/debug/matchers/IsEqual.js +2 -1
  103. package/src/core/debug/matchers/IsFinite.d.ts +2 -1
  104. package/src/core/debug/matchers/IsFinite.d.ts.map +1 -1
  105. package/src/core/debug/matchers/IsFinite.js +2 -1
  106. package/src/core/debug/matchers/IsIn.d.ts +2 -1
  107. package/src/core/debug/matchers/IsIn.d.ts.map +1 -1
  108. package/src/core/debug/matchers/IsIn.js +2 -1
  109. package/src/core/debug/matchers/IsInteger.d.ts +2 -1
  110. package/src/core/debug/matchers/IsInteger.d.ts.map +1 -1
  111. package/src/core/debug/matchers/IsInteger.js +2 -1
  112. package/src/core/debug/matchers/IsIterableContaining.d.ts +2 -1
  113. package/src/core/debug/matchers/IsIterableContaining.d.ts.map +1 -1
  114. package/src/core/debug/matchers/IsIterableContaining.js +1 -1
  115. package/src/core/debug/matchers/IsNot.d.ts +2 -1
  116. package/src/core/debug/matchers/IsNot.d.ts.map +1 -1
  117. package/src/core/debug/matchers/IsNot.js +2 -1
  118. package/src/core/debug/matchers/IsNull.d.ts +2 -1
  119. package/src/core/debug/matchers/IsNull.d.ts.map +1 -1
  120. package/src/core/debug/matchers/IsNull.js +2 -1
  121. package/src/core/debug/matchers/IsUndefined.d.ts +2 -1
  122. package/src/core/debug/matchers/IsUndefined.d.ts.map +1 -1
  123. package/src/core/debug/matchers/IsUndefined.js +2 -1
  124. package/src/core/events/signal/Signal.d.ts +15 -0
  125. package/src/core/events/signal/Signal.d.ts.map +1 -1
  126. package/src/core/events/signal/Signal.js +857 -820
  127. package/src/core/fsm/simple/SimpleStateMachineDescription.d.ts.map +1 -1
  128. package/src/core/fsm/simple/SimpleStateMachineDescription.js +4 -3
  129. package/src/core/geom/2d/convex-hull/convex_hull_fixed_count_2d_bruteforce.d.ts.map +1 -1
  130. package/src/core/geom/2d/convex-hull/convex_hull_fixed_count_2d_bruteforce.js +6 -1
  131. package/src/core/geom/2d/convex-hull/convex_hull_fixed_count_2d_relaxation.d.ts +1 -1
  132. package/src/core/geom/2d/convex-hull/convex_hull_fixed_count_2d_relaxation.d.ts.map +1 -1
  133. package/src/core/geom/2d/convex-hull/convex_hull_fixed_count_2d_relaxation.js +6 -7
  134. package/src/core/geom/2d/hash-grid/SpatialHashGrid.d.ts.map +1 -1
  135. package/src/core/geom/2d/hash-grid/SpatialHashGrid.js +23 -6
  136. package/src/core/geom/2d/line/ray2_ray2_compute_intersection_array_2d.d.ts.map +1 -1
  137. package/src/core/geom/2d/line/ray2_ray2_compute_intersection_array_2d.js +13 -1
  138. package/src/core/geom/3d/aabb/aabb3_raycast_hit_point.d.ts.map +1 -1
  139. package/src/core/geom/3d/aabb/aabb3_raycast_hit_point.js +53 -32
  140. package/src/core/geom/3d/atlas/segment/atlas_chart_growth_cost.d.ts +40 -0
  141. package/src/core/geom/3d/atlas/segment/atlas_chart_growth_cost.d.ts.map +1 -0
  142. package/src/core/geom/3d/atlas/segment/atlas_chart_growth_cost.js +54 -0
  143. package/src/core/geom/3d/atlas/segment/atlas_segment_charts.d.ts +21 -3
  144. package/src/core/geom/3d/atlas/segment/atlas_segment_charts.d.ts.map +1 -1
  145. package/src/core/geom/3d/atlas/segment/atlas_segment_charts.js +24 -15
  146. package/src/core/geom/3d/atlas/segment/atlas_segment_charts_atomic.d.ts +6 -3
  147. package/src/core/geom/3d/atlas/segment/atlas_segment_charts_atomic.d.ts.map +1 -1
  148. package/src/core/geom/3d/atlas/segment/atlas_segment_charts_atomic.js +9 -15
  149. package/src/core/geom/3d/cone/cone_compute_plane_side.d.ts.map +1 -1
  150. package/src/core/geom/3d/cone/cone_compute_plane_side.js +31 -19
  151. package/src/core/geom/3d/equirectangular/equirectangular_direction_to_uv.d.ts +11 -1
  152. package/src/core/geom/3d/equirectangular/equirectangular_direction_to_uv.d.ts.map +1 -1
  153. package/src/core/geom/3d/equirectangular/equirectangular_direction_to_uv.js +11 -1
  154. package/src/core/geom/3d/equirectangular/equirectangular_uv_to_direction.d.ts +11 -1
  155. package/src/core/geom/3d/equirectangular/equirectangular_uv_to_direction.d.ts.map +1 -1
  156. package/src/core/geom/3d/equirectangular/equirectangular_uv_to_direction.js +11 -1
  157. package/src/core/geom/3d/frustum/frustum3_compute_closest_point.d.ts.map +1 -1
  158. package/src/core/geom/3d/frustum/frustum3_compute_closest_point.js +55 -0
  159. package/src/core/geom/3d/frustum/frustum_from_projection_matrix_array.d.ts +14 -0
  160. package/src/core/geom/3d/frustum/frustum_from_projection_matrix_array.d.ts.map +1 -1
  161. package/src/core/geom/3d/frustum/frustum_from_projection_matrix_array.js +17 -1
  162. package/src/core/geom/3d/gjk/gjk.d.ts +15 -0
  163. package/src/core/geom/3d/gjk/gjk.d.ts.map +1 -1
  164. package/src/core/geom/3d/gjk/gjk.js +15 -0
  165. package/src/core/geom/3d/gjk/gjk_epa_penetration.d.ts.map +1 -1
  166. package/src/core/geom/3d/gjk/gjk_epa_penetration.js +18 -0
  167. package/src/core/geom/3d/hash-grid/PointHashGrid3.d.ts +32 -3
  168. package/src/core/geom/3d/hash-grid/PointHashGrid3.d.ts.map +1 -1
  169. package/src/core/geom/3d/hash-grid/PointHashGrid3.js +36 -3
  170. package/src/core/geom/3d/morton/v3_morton_encode_lut.d.ts.map +1 -1
  171. package/src/core/geom/3d/morton/v3_morton_encode_lut.js +11 -4
  172. package/src/core/geom/3d/morton/v3_morton_encode_normalized.d.ts +16 -4
  173. package/src/core/geom/3d/morton/v3_morton_encode_normalized.d.ts.map +1 -1
  174. package/src/core/geom/3d/morton/v3_morton_encode_normalized.js +21 -8
  175. package/src/core/geom/3d/normal/spherical/encode_unit_to_spheremap.d.ts.map +1 -1
  176. package/src/core/geom/3d/normal/spherical/encode_unit_to_spheremap.js +17 -3
  177. package/src/core/geom/3d/octahedra/octahedral_direction_to_uv.d.ts +10 -0
  178. package/src/core/geom/3d/octahedra/octahedral_direction_to_uv.d.ts.map +1 -1
  179. package/src/core/geom/3d/octahedra/octahedral_direction_to_uv.js +46 -49
  180. package/src/core/geom/3d/octahedra/octahedral_uv_to_direction.d.ts +13 -1
  181. package/src/core/geom/3d/octahedra/octahedral_uv_to_direction.d.ts.map +1 -1
  182. package/src/core/geom/3d/octahedra/octahedral_uv_to_direction.js +36 -39
  183. package/src/core/geom/3d/quadric/quadric3_to_tensor_m3_inverse.d.ts +4 -1
  184. package/src/core/geom/3d/quadric/quadric3_to_tensor_m3_inverse.d.ts.map +1 -1
  185. package/src/core/geom/3d/quadric/quadric3_to_tensor_m3_inverse.js +22 -4
  186. package/src/core/geom/3d/quaternion/quat3_canonicalize_sign_run.d.ts +38 -0
  187. package/src/core/geom/3d/quaternion/quat3_canonicalize_sign_run.d.ts.map +1 -0
  188. package/src/core/geom/3d/quaternion/quat3_canonicalize_sign_run.js +76 -0
  189. package/src/core/geom/3d/quaternion/quat3_encode_to_uint32.d.ts +11 -0
  190. package/src/core/geom/3d/quaternion/quat3_encode_to_uint32.d.ts.map +1 -1
  191. package/src/core/geom/3d/quaternion/quat3_encode_to_uint32.js +14 -34
  192. package/src/core/geom/3d/shape/PosedShape3D.d.ts +9 -0
  193. package/src/core/geom/3d/shape/PosedShape3D.d.ts.map +1 -1
  194. package/src/core/geom/3d/shape/PosedShape3D.js +43 -0
  195. package/src/core/geom/3d/shape/UnionShape3D.d.ts.map +1 -1
  196. package/src/core/geom/3d/shape/UnionShape3D.js +20 -3
  197. package/src/core/geom/3d/shape/json/type_adapters.d.ts +11 -2
  198. package/src/core/geom/3d/shape/json/type_adapters.d.ts.map +1 -1
  199. package/src/core/geom/3d/shape/json/type_adapters.js +36 -12
  200. package/src/core/geom/3d/sphere/harmonics/sh3_sample_irradiance_by_direction.d.ts +13 -0
  201. package/src/core/geom/3d/sphere/harmonics/sh3_sample_irradiance_by_direction.d.ts.map +1 -1
  202. package/src/core/geom/3d/sphere/harmonics/sh3_sample_irradiance_by_direction.js +17 -4
  203. package/src/core/geom/3d/tetrahedra/tetrahedral_flip_layouts.d.ts +88 -0
  204. package/src/core/geom/3d/tetrahedra/tetrahedral_flip_layouts.d.ts.map +1 -0
  205. package/src/core/geom/3d/tetrahedra/tetrahedral_flip_layouts.js +108 -0
  206. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_23.d.ts.map +1 -1
  207. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_23.js +13 -31
  208. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_32.d.ts.map +1 -1
  209. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_32.js +14 -22
  210. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_improve_quality.d.ts.map +1 -1
  211. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_improve_quality.js +96 -26
  212. package/src/core/geom/3d/tetrahedra/tetrahedron_contains_point.d.ts.map +1 -1
  213. package/src/core/geom/3d/tetrahedra/tetrahedron_contains_point.js +17 -6
  214. package/src/core/geom/3d/topology/struct/binary/io/bt_boundary_loop.d.ts +27 -0
  215. package/src/core/geom/3d/topology/struct/binary/io/bt_boundary_loop.d.ts.map +1 -1
  216. package/src/core/geom/3d/topology/struct/binary/io/bt_boundary_loop.js +101 -0
  217. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_close_boundary_holes.d.ts +3 -0
  218. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_close_boundary_holes.d.ts.map +1 -1
  219. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_close_boundary_holes.js +5 -57
  220. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadrics.d.ts +20 -0
  221. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadrics.d.ts.map +1 -1
  222. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadrics.js +68 -35
  223. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_fill_small_holes.d.ts.map +1 -1
  224. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_fill_small_holes.js +2 -43
  225. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.d.ts +72 -21
  226. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.d.ts.map +1 -1
  227. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.js +452 -99
  228. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_kill_parallels.d.ts.map +1 -1
  229. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_kill_parallels.js +4 -15
  230. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_mesh_split_pinched_vertices.d.ts.map +1 -1
  231. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_mesh_split_pinched_vertices.js +13 -1
  232. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_fuse_duplicate_edges.d.ts.map +1 -1
  233. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_fuse_duplicate_edges.js +3 -1
  234. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_replace.d.ts.map +1 -1
  235. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_replace.js +22 -3
  236. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_collapse_fold_limit.d.ts +25 -0
  237. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_collapse_fold_limit.d.ts.map +1 -0
  238. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_collapse_fold_limit.js +228 -0
  239. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_collapse_would_fold.d.ts +13 -0
  240. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_collapse_would_fold.d.ts.map +1 -1
  241. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_collapse_would_fold.js +10 -128
  242. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_count_faces.d.ts +17 -2
  243. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_count_faces.d.ts.map +1 -1
  244. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_count_faces.js +28 -4
  245. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_get.d.ts.map +1 -1
  246. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_get.js +8 -1
  247. package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_edge_adjacent_faces_weighted.d.ts.map +1 -1
  248. package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_edge_adjacent_faces_weighted.js +10 -2
  249. package/src/core/geom/3d/topology/struct/binary/query/bt_face_island_flood_fill.d.ts.map +1 -1
  250. package/src/core/geom/3d/topology/struct/binary/query/bt_face_island_flood_fill.js +2 -0
  251. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_build_boundary_distance_field.d.ts.map +1 -1
  252. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_build_boundary_distance_field.js +25 -5
  253. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_build_face_bvh.d.ts.map +1 -1
  254. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_build_face_bvh.js +11 -1
  255. package/src/core/geom/3d/triangle/tri3_compute_normal.d.ts +5 -1
  256. package/src/core/geom/3d/triangle/tri3_compute_normal.d.ts.map +1 -1
  257. package/src/core/geom/3d/triangle/tri3_compute_normal.js +8 -1
  258. package/src/core/geom/3d/triangle/tri3_ray_intersection.d.ts.map +1 -1
  259. package/src/core/geom/3d/triangle/tri3_ray_intersection.js +15 -3
  260. package/src/core/geom/3d/triangle/tri3_ray_intersection_barycentric.d.ts +2 -1
  261. package/src/core/geom/3d/triangle/tri3_ray_intersection_barycentric.d.ts.map +1 -1
  262. package/src/core/geom/3d/triangle/tri3_ray_intersection_barycentric.js +2 -1
  263. package/src/core/geom/3d/triangle/tri3_ray_intersection_barycentric_edge.d.ts +1 -1
  264. package/src/core/geom/3d/triangle/tri3_ray_intersection_barycentric_edge.d.ts.map +1 -1
  265. package/src/core/geom/3d/triangle/tri3_ray_intersection_barycentric_edge.js +8 -1
  266. package/src/core/geom/vec/vector_normalize.d.ts.map +1 -1
  267. package/src/core/geom/vec/vector_normalize.js +5 -1
  268. package/src/core/geom/vec3/v3_slerp.d.ts.map +1 -1
  269. package/src/core/geom/vec3/v3_slerp.js +69 -4
  270. package/src/core/geom/vec4/v4_max_axis.d.ts +28 -0
  271. package/src/core/geom/vec4/v4_max_axis.d.ts.map +1 -0
  272. package/src/core/geom/vec4/v4_max_axis.js +41 -0
  273. package/src/core/graph/coloring/colorizeGraph.js +10 -7
  274. package/src/core/graph/layout/graph_peel_topological_layer.d.ts.map +1 -1
  275. package/src/core/graph/layout/graph_peel_topological_layer.js +16 -2
  276. package/src/core/graph/mn_graph_collapse_weighted_edge.js +6 -6
  277. package/src/core/json/JsonUtils.d.ts.map +1 -1
  278. package/src/core/json/JsonUtils.js +6 -2
  279. package/src/core/json/abstractJSONSerializer.d.ts.map +1 -1
  280. package/src/core/json/abstractJSONSerializer.js +5 -1
  281. package/src/core/lang/reactive/ReactiveOperatorType.d.ts +20 -0
  282. package/src/core/lang/reactive/ReactiveOperatorType.d.ts.map +1 -1
  283. package/src/core/lang/reactive/ReactiveOperatorType.js +34 -12
  284. package/src/core/localization/LanguageMetadata.d.ts +2 -1
  285. package/src/core/localization/LanguageMetadata.d.ts.map +1 -1
  286. package/src/core/localization/LanguageMetadata.js +6 -0
  287. package/src/core/localization/Localization.d.ts.map +1 -1
  288. package/src/core/localization/Localization.js +23 -10
  289. package/src/core/localization/LocalizationEngine.d.ts.map +1 -1
  290. package/src/core/localization/LocalizationEngine.js +4 -0
  291. package/src/core/math/fract.d.ts.map +1 -1
  292. package/src/core/math/fract.js +4 -3
  293. package/src/core/math/hash/squirrel3.d.ts +10 -2
  294. package/src/core/math/hash/squirrel3.d.ts.map +1 -1
  295. package/src/core/math/hash/squirrel3.js +16 -8
  296. package/src/core/math/linalg/m2/m2_polar_decomp_noS.d.ts +7 -0
  297. package/src/core/math/linalg/m2/m2_polar_decomp_noS.d.ts.map +1 -1
  298. package/src/core/math/linalg/m2/m2_polar_decomp_noS.js +20 -1
  299. package/src/core/math/lookup/ParameterLookupTable.d.ts.map +1 -1
  300. package/src/core/math/lookup/ParameterLookupTable.js +10 -5
  301. package/src/core/math/noise/sdnoise.d.ts.map +1 -1
  302. package/src/core/math/noise/sdnoise.js +16 -10
  303. package/src/core/math/physics/pdf/pdf_normal.d.ts +11 -3
  304. package/src/core/math/physics/pdf/pdf_normal.d.ts.map +1 -1
  305. package/src/core/math/physics/pdf/pdf_normal.js +25 -11
  306. package/src/core/math/solveQuadratic.d.ts.map +1 -1
  307. package/src/core/math/solveQuadratic.js +22 -3
  308. package/src/core/math/statistics/computeStatisticalPartialMedian.d.ts +9 -2
  309. package/src/core/math/statistics/computeStatisticalPartialMedian.d.ts.map +1 -1
  310. package/src/core/math/statistics/computeStatisticalPartialMedian.js +12 -6
  311. package/src/core/math/statistics/computeStatisticalPercentile.d.ts.map +1 -1
  312. package/src/core/math/statistics/computeStatisticalPercentile.js +9 -2
  313. package/src/core/math/statistics/gaussian_amplitude.d.ts +10 -1
  314. package/src/core/math/statistics/gaussian_amplitude.d.ts.map +1 -1
  315. package/src/core/math/statistics/gaussian_amplitude.js +20 -15
  316. package/src/core/model/BooleanVector3.d.ts.map +1 -1
  317. package/src/core/model/BooleanVector3.js +18 -2
  318. package/src/core/model/BoundedValue.d.ts +9 -0
  319. package/src/core/model/BoundedValue.d.ts.map +1 -1
  320. package/src/core/model/BoundedValue.js +30 -3
  321. package/src/core/model/ObservedBoolean.d.ts.map +1 -1
  322. package/src/core/model/ObservedBoolean.js +22 -2
  323. package/src/core/model/ObservedEnum.d.ts.map +1 -1
  324. package/src/core/model/ObservedEnum.js +6 -2
  325. package/src/core/model/node-graph/NodeGraph.d.ts +6 -1
  326. package/src/core/model/node-graph/NodeGraph.d.ts.map +1 -1
  327. package/src/core/model/node-graph/NodeGraph.js +22 -4
  328. package/src/core/model/node-graph/json/deserializeNodeGraphFromJSON.d.ts.map +1 -1
  329. package/src/core/model/node-graph/json/deserializeNodeGraphFromJSON.js +3 -1
  330. package/src/core/model/node-graph/json/serializeNodeGraphToJSON.d.ts.map +1 -1
  331. package/src/core/model/node-graph/json/serializeNodeGraphToJSON.js +5 -0
  332. package/src/core/model/node-graph/type/DataType.d.ts.map +1 -1
  333. package/src/core/model/node-graph/type/DataType.js +8 -0
  334. package/src/core/model/node-graph/type/ParametricDataType.d.ts.map +1 -1
  335. package/src/core/model/node-graph/type/ParametricDataType.js +19 -0
  336. package/src/core/model/node-graph/visual/NodeGraphVisualData.d.ts.map +1 -1
  337. package/src/core/model/node-graph/visual/NodeGraphVisualData.js +5 -0
  338. package/src/core/model/object/ImmutableObjectPool.d.ts.map +1 -1
  339. package/src/core/model/object/ImmutableObjectPool.js +17 -7
  340. package/src/core/model/reactive/js/compileReactiveToJS.d.ts +22 -0
  341. package/src/core/model/reactive/js/compileReactiveToJS.d.ts.map +1 -1
  342. package/src/core/model/reactive/js/compileReactiveToJS.js +113 -219
  343. package/src/core/model/reactive/model/ReactiveBinaryExpression.d.ts.map +1 -1
  344. package/src/core/model/reactive/model/ReactiveBinaryExpression.js +8 -2
  345. package/src/core/model/reactive/model/comparative/ReactiveEquals.d.ts.map +1 -1
  346. package/src/core/model/reactive/model/comparative/ReactiveEquals.js +3 -1
  347. package/src/core/model/reactive/model/comparative/ReactiveNotEquals.d.ts.map +1 -1
  348. package/src/core/model/reactive/model/comparative/ReactiveNotEquals.js +2 -1
  349. package/src/core/model/reactive/model/terminal/ReactiveLiteralString.d.ts.map +1 -1
  350. package/src/core/model/reactive/model/terminal/ReactiveLiteralString.js +4 -2
  351. package/src/core/model/stat/Stat.d.ts.map +1 -1
  352. package/src/core/model/stat/Stat.js +4 -0
  353. package/src/core/parser/seedVariablesIntoTemplateString.d.ts.map +1 -1
  354. package/src/core/parser/seedVariablesIntoTemplateString.js +5 -0
  355. package/src/core/parser/simple/readArrayLiteral.d.ts.map +1 -1
  356. package/src/core/parser/simple/readArrayLiteral.js +7 -0
  357. package/src/core/parser/simple/readHexToken.d.ts +3 -0
  358. package/src/core/parser/simple/readHexToken.d.ts.map +1 -1
  359. package/src/core/parser/simple/readHexToken.js +39 -106
  360. package/src/core/parser/simple/readNumberToken.d.ts.map +1 -1
  361. package/src/core/parser/simple/readNumberToken.js +13 -4
  362. package/src/core/parser/simple/readUnsignedIntegerToken.d.ts +2 -0
  363. package/src/core/parser/simple/readUnsignedIntegerToken.d.ts.map +1 -1
  364. package/src/core/parser/simple/readUnsignedIntegerToken.js +31 -71
  365. package/src/core/parser/simple/read_digits.d.ts +31 -0
  366. package/src/core/parser/simple/read_digits.d.ts.map +1 -0
  367. package/src/core/parser/simple/read_digits.js +74 -0
  368. package/src/core/primitives/numbers/number_format_by_thousands.d.ts.map +1 -1
  369. package/src/core/primitives/numbers/number_format_by_thousands.js +16 -1
  370. package/src/core/primitives/numbers/number_pretty_print.d.ts.map +1 -1
  371. package/src/core/primitives/numbers/number_pretty_print.js +6 -1
  372. package/src/core/process/executor/ConcurrentExecutor.d.ts +1 -5
  373. package/src/core/process/executor/ConcurrentExecutor.d.ts.map +1 -1
  374. package/src/core/process/executor/ConcurrentExecutor.js +131 -1
  375. package/src/core/process/task/Task.d.ts +8 -0
  376. package/src/core/process/task/Task.d.ts.map +1 -1
  377. package/src/core/process/task/Task.js +12 -1
  378. package/src/core/process/task/TaskGroup.d.ts +6 -0
  379. package/src/core/process/task/TaskGroup.d.ts.map +1 -1
  380. package/src/core/process/task/TaskGroup.js +7 -1
  381. package/src/core/process/task/task_find_dependency_cycle.d.ts +17 -0
  382. package/src/core/process/task/task_find_dependency_cycle.d.ts.map +1 -0
  383. package/src/core/process/task/task_find_dependency_cycle.js +81 -0
  384. package/src/core/process/undo/ActionProcessor.d.ts +12 -0
  385. package/src/core/process/undo/ActionProcessor.d.ts.map +1 -1
  386. package/src/core/process/undo/ActionProcessor.js +41 -15
  387. package/src/core/process/worker/OnDemandWorkerManager.d.ts.map +1 -1
  388. package/src/core/process/worker/OnDemandWorkerManager.js +6 -1
  389. package/src/core/process/worker/WorkerBuilder.d.ts.map +1 -1
  390. package/src/core/process/worker/WorkerBuilder.js +27 -5
  391. package/src/core/wfc/WFCCellChoice.d.ts +17 -0
  392. package/src/core/wfc/WFCCellChoice.d.ts.map +1 -0
  393. package/src/core/wfc/WFCCellChoice.js +36 -0
  394. package/src/core/wfc/WFCLattice.d.ts +105 -0
  395. package/src/core/wfc/WFCLattice.d.ts.map +1 -0
  396. package/src/core/wfc/WFCLattice.js +235 -0
  397. package/src/core/wfc/WFCRuleTable.d.ts +172 -0
  398. package/src/core/wfc/WFCRuleTable.d.ts.map +1 -0
  399. package/src/core/wfc/WFCRuleTable.js +334 -0
  400. package/src/core/wfc/WFCState.d.ts +273 -0
  401. package/src/core/wfc/WFCState.d.ts.map +1 -0
  402. package/src/core/wfc/WFCState.js +552 -0
  403. package/src/core/wfc/WFCStatus.d.ts +11 -0
  404. package/src/core/wfc/WFCStatus.d.ts.map +1 -0
  405. package/src/core/wfc/WFCStatus.js +28 -0
  406. package/src/core/wfc/WFCTileWeights.d.ts +48 -0
  407. package/src/core/wfc/WFCTileWeights.d.ts.map +1 -0
  408. package/src/core/wfc/WFCTileWeights.js +86 -0
  409. package/src/core/wfc/WFC_UNRESOLVED.d.ts +12 -0
  410. package/src/core/wfc/WFC_UNRESOLVED.d.ts.map +1 -0
  411. package/src/core/wfc/WFC_UNRESOLVED.js +11 -0
  412. package/src/core/wfc/wfc_estimate_bytes.d.ts +24 -0
  413. package/src/core/wfc/wfc_estimate_bytes.d.ts.map +1 -0
  414. package/src/core/wfc/wfc_estimate_bytes.js +47 -0
  415. package/src/core/wfc/wfc_rule_table_tile_components.d.ts +27 -0
  416. package/src/core/wfc/wfc_rule_table_tile_components.d.ts.map +1 -0
  417. package/src/core/wfc/wfc_rule_table_tile_components.js +80 -0
  418. package/src/core/wfc/wfc_solve.d.ts +21 -0
  419. package/src/core/wfc/wfc_solve.d.ts.map +1 -0
  420. package/src/core/wfc/wfc_solve.js +154 -0
  421. package/src/core/wfc/wfc_state_apply_boundary.d.ts +18 -0
  422. package/src/core/wfc/wfc_state_apply_boundary.d.ts.map +1 -0
  423. package/src/core/wfc/wfc_state_apply_boundary.js +61 -0
  424. package/src/core/wfc/wfc_state_assign.d.ts +11 -0
  425. package/src/core/wfc/wfc_state_assign.d.ts.map +1 -0
  426. package/src/core/wfc/wfc_state_assign.js +36 -0
  427. package/src/core/wfc/wfc_state_ban_bits.d.ts +17 -0
  428. package/src/core/wfc/wfc_state_ban_bits.d.ts.map +1 -0
  429. package/src/core/wfc/wfc_state_ban_bits.js +81 -0
  430. package/src/core/wfc/wfc_state_collapse.d.ts +12 -0
  431. package/src/core/wfc/wfc_state_collapse.d.ts.map +1 -0
  432. package/src/core/wfc/wfc_state_collapse.js +73 -0
  433. package/src/core/wfc/wfc_state_flush_dirty.d.ts +12 -0
  434. package/src/core/wfc/wfc_state_flush_dirty.d.ts.map +1 -0
  435. package/src/core/wfc/wfc_state_flush_dirty.js +39 -0
  436. package/src/core/wfc/wfc_state_propagate.d.ts +14 -0
  437. package/src/core/wfc/wfc_state_propagate.d.ts.map +1 -0
  438. package/src/core/wfc/wfc_state_propagate.js +155 -0
  439. package/src/core/wfc/wfc_state_read.d.ts +11 -0
  440. package/src/core/wfc/wfc_state_read.d.ts.map +1 -0
  441. package/src/core/wfc/wfc_state_read.js +38 -0
  442. package/src/core/wfc/wfc_state_restrict.d.ts +18 -0
  443. package/src/core/wfc/wfc_state_restrict.d.ts.map +1 -0
  444. package/src/core/wfc/wfc_state_restrict.js +39 -0
  445. package/src/core/wfc/wfc_state_set_eligible.d.ts +24 -0
  446. package/src/core/wfc/wfc_state_set_eligible.d.ts.map +1 -0
  447. package/src/core/wfc/wfc_state_set_eligible.js +49 -0
  448. package/src/core/wfc/wfc_state_undo_to.d.ts +13 -0
  449. package/src/core/wfc/wfc_state_undo_to.d.ts.map +1 -0
  450. package/src/core/wfc/wfc_state_undo_to.js +84 -0
  451. package/src/core/wfc/wfc_words_per_cell.d.ts +11 -0
  452. package/src/core/wfc/wfc_words_per_cell.d.ts.map +1 -0
  453. package/src/core/wfc/wfc_words_per_cell.js +16 -0
  454. package/src/engine/Clock.d.ts.map +1 -1
  455. package/src/engine/Clock.js +11 -0
  456. package/src/engine/Engine.d.ts.map +1 -1
  457. package/src/engine/Engine.js +107 -6
  458. package/src/engine/achievements/AchievementManager.d.ts.map +1 -1
  459. package/src/engine/achievements/AchievementManager.js +16 -1
  460. package/src/engine/animation/clip/ecd_bind_animation_curve.d.ts.map +1 -1
  461. package/src/engine/animation/clip/ecd_bind_animation_curve.js +17 -6
  462. package/src/engine/animation/clip/hemisphere_align_quaternion_values.d.ts +19 -10
  463. package/src/engine/animation/clip/hemisphere_align_quaternion_values.d.ts.map +1 -1
  464. package/src/engine/animation/clip/hemisphere_align_quaternion_values.js +19 -23
  465. package/src/engine/animation/keyed2/AnimationTrackPlayback.d.ts +1 -1
  466. package/src/engine/animation/keyed2/AnimationTrackPlayback.d.ts.map +1 -1
  467. package/src/engine/animation/keyed2/AnimationTrackPlayback.js +21 -4
  468. package/src/engine/asset/AssetManager.d.ts.map +1 -1
  469. package/src/engine/asset/AssetManager.js +11 -3
  470. package/src/engine/control/first-person/FirstPersonPlayerController.d.ts +1 -0
  471. package/src/engine/control/first-person/FirstPersonPlayerController.d.ts.map +1 -1
  472. package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts +28 -0
  473. package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts.map +1 -1
  474. package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.js +14 -0
  475. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts +23 -2
  476. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts.map +1 -1
  477. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.js +2122 -2078
  478. package/src/engine/ecs/Entity.d.ts.map +1 -1
  479. package/src/engine/ecs/Entity.js +43 -7
  480. package/src/engine/ecs/EntityBlueprint.d.ts.map +1 -1
  481. package/src/engine/ecs/EntityBlueprint.js +13 -4
  482. package/src/engine/ecs/EntityComponentDataset.d.ts +8 -0
  483. package/src/engine/ecs/EntityComponentDataset.d.ts.map +1 -1
  484. package/src/engine/ecs/EntityComponentDataset.js +132 -23
  485. package/src/engine/ecs/EntityManager.d.ts +16 -0
  486. package/src/engine/ecs/EntityManager.d.ts.map +1 -1
  487. package/src/engine/ecs/EntityManager.js +112 -37
  488. package/src/engine/ecs/EntityObserver.d.ts +7 -0
  489. package/src/engine/ecs/EntityObserver.d.ts.map +1 -1
  490. package/src/engine/ecs/EntityObserver.js +8 -1
  491. package/src/engine/ecs/System.d.ts +23 -0
  492. package/src/engine/ecs/System.d.ts.map +1 -1
  493. package/src/engine/ecs/System.js +25 -0
  494. package/src/engine/ecs/components/Tag.d.ts.map +1 -1
  495. package/src/engine/ecs/components/Tag.js +4 -1
  496. package/src/engine/ecs/computeComponentClassName.d.ts +13 -1
  497. package/src/engine/ecs/computeComponentClassName.d.ts.map +1 -1
  498. package/src/engine/ecs/computeComponentClassName.js +11 -1
  499. package/src/engine/ecs/dynamic_actions/DynamicActorSystem.d.ts.map +1 -1
  500. package/src/engine/ecs/dynamic_actions/DynamicActorSystem.js +11 -0
  501. package/src/engine/ecs/fow/FogOfWar.d.ts.map +1 -1
  502. package/src/engine/ecs/fow/FogOfWar.js +37 -11
  503. package/src/engine/ecs/fow/FogOfWarRevealerSystem.d.ts +8 -1
  504. package/src/engine/ecs/fow/FogOfWarRevealerSystem.d.ts.map +1 -1
  505. package/src/engine/ecs/fow/FogOfWarRevealerSystem.js +37 -2
  506. package/src/engine/ecs/guid/UUID.d.ts.map +1 -1
  507. package/src/engine/ecs/guid/UUID.js +45 -17
  508. package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.d.ts.map +1 -1
  509. package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.js +3 -1
  510. package/src/engine/ecs/parent/EntityNode.d.ts.map +1 -1
  511. package/src/engine/ecs/parent/EntityNode.js +8 -0
  512. package/src/engine/ecs/speaker/VoiceSystem.d.ts.map +1 -1
  513. package/src/engine/ecs/speaker/VoiceSystem.js +9 -0
  514. package/src/engine/ecs/storage/binary/BinaryClassSerializationAdapter.d.ts +15 -0
  515. package/src/engine/ecs/storage/binary/BinaryClassSerializationAdapter.d.ts.map +1 -1
  516. package/src/engine/ecs/storage/binary/BinaryClassSerializationAdapter.js +18 -0
  517. package/src/engine/ecs/system/AbstractContextSystem.d.ts.map +1 -1
  518. package/src/engine/ecs/system/AbstractContextSystem.js +14 -4
  519. package/src/engine/ecs/system/SystemEntityContext.d.ts +12 -0
  520. package/src/engine/ecs/system/SystemEntityContext.d.ts.map +1 -1
  521. package/src/engine/ecs/system/SystemEntityContext.js +23 -0
  522. package/src/engine/ecs/system_validate_class.d.ts.map +1 -1
  523. package/src/engine/ecs/system_validate_class.js +6 -2
  524. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts.map +1 -1
  525. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.js +395 -360
  526. package/src/engine/ecs/terrain/tiles/TerrainTile.d.ts.map +1 -1
  527. package/src/engine/ecs/terrain/tiles/TerrainTile.js +45 -3
  528. package/src/engine/ecs/terrain/tiles/TerrainTileManager.d.ts.map +1 -1
  529. package/src/engine/ecs/terrain/tiles/TerrainTileManager.js +5 -8
  530. package/src/engine/graphics/ecs/camera/pp/PerfectPanner.d.ts.map +1 -1
  531. package/src/engine/graphics/ecs/camera/pp/PerfectPanner.js +62 -7
  532. package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMesh.d.ts +9 -0
  533. package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMesh.d.ts.map +1 -1
  534. package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMesh.js +13 -0
  535. package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMeshAnimationControllerSystem.d.ts +11 -0
  536. package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMeshAnimationControllerSystem.d.ts.map +1 -1
  537. package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMeshAnimationControllerSystem.js +78 -13
  538. package/src/engine/graphics/ecs/path/tube/build/make_ring_vertices.d.ts.map +1 -1
  539. package/src/engine/graphics/ecs/path/tube/build/make_ring_vertices.js +22 -8
  540. package/src/engine/graphics/geometry/buffered/geometry_compute_vertex_normals_indexed.d.ts.map +1 -1
  541. package/src/engine/graphics/geometry/buffered/geometry_compute_vertex_normals_indexed.js +18 -2
  542. package/src/engine/graphics/geometry/geometry_construct_triangle_normal.d.ts +3 -1
  543. package/src/engine/graphics/geometry/geometry_construct_triangle_normal.d.ts.map +1 -1
  544. package/src/engine/graphics/geometry/geometry_construct_triangle_normal.js +3 -1
  545. package/src/engine/graphics/geometry/geometry_construct_triangle_normal_area_weighted.d.ts +32 -0
  546. package/src/engine/graphics/geometry/geometry_construct_triangle_normal_area_weighted.d.ts.map +1 -0
  547. package/src/engine/graphics/geometry/geometry_construct_triangle_normal_area_weighted.js +53 -0
  548. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts +22 -2
  549. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts.map +1 -1
  550. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +1201 -1160
  551. package/src/engine/graphics/particles/particular/engine/simulator/SimulationStepCurlNoiseVelocity.d.ts +0 -1
  552. package/src/engine/graphics/particles/particular/engine/simulator/SimulationStepCurlNoiseVelocity.d.ts.map +1 -1
  553. package/src/engine/graphics/particles/particular/engine/simulator/SimulationStepCurlNoiseVelocity.js +10 -5
  554. package/src/engine/graphics/particles/particular/engine/simulator/update_parameters.d.ts.map +1 -1
  555. package/src/engine/graphics/particles/particular/engine/simulator/update_parameters.js +23 -0
  556. package/src/engine/graphics/particles/particular/group/itemSizeFromAttributeType.d.ts +1 -1
  557. package/src/engine/graphics/sh3/path_tracer/texture/apply_texture_clamping_to_coordinate.d.ts.map +1 -1
  558. package/src/engine/graphics/sh3/path_tracer/texture/apply_texture_clamping_to_coordinate.js +6 -1
  559. package/src/engine/graphics/texture/atlas/ManagedTextureAtlas.d.ts.map +1 -1
  560. package/src/engine/graphics/texture/atlas/ManagedTextureAtlas.js +20 -0
  561. package/src/engine/graphics/texture/atlas/TextureAtlas.d.ts +1 -0
  562. package/src/engine/graphics/texture/atlas/TextureAtlas.d.ts.map +1 -1
  563. package/src/engine/graphics/texture/atlas/TextureAtlas.js +24 -5
  564. package/src/engine/graphics/texture/sampler/Sampler2D.d.ts.map +1 -1
  565. package/src/engine/graphics/texture/sampler/Sampler2D.js +14 -1
  566. package/src/engine/graphics/texture/sampler/resize/sampler2d_scale_down_linear.d.ts.map +1 -1
  567. package/src/engine/graphics/texture/sampler/resize/sampler2d_scale_down_linear.js +24 -10
  568. package/src/engine/graphics/texture/sampler/sampler2d_sub_copy_same_item_size.d.ts.map +1 -1
  569. package/src/engine/graphics/texture/sampler/sampler2d_sub_copy_same_item_size.js +16 -5
  570. package/src/engine/graphics/texture/sampler/sampler2d_to_uint8_RGBA.d.ts.map +1 -1
  571. package/src/engine/graphics/texture/sampler/sampler2d_to_uint8_RGBA.js +29 -8
  572. package/src/engine/graphics/texture/sampler/serialization/TextureBinaryBufferSerializer.d.ts.map +1 -1
  573. package/src/engine/graphics/texture/sampler/serialization/TextureBinaryBufferSerializer.js +8 -3
  574. package/src/engine/graphics3/DecalSystem.d.ts +5 -4
  575. package/src/engine/graphics3/DecalSystem.d.ts.map +1 -1
  576. package/src/engine/graphics3/DecalSystem.js +5 -4
  577. package/src/engine/graphics3/GraphicsEngine.d.ts +40 -7
  578. package/src/engine/graphics3/GraphicsEngine.d.ts.map +1 -1
  579. package/src/engine/graphics3/GraphicsEngine.js +92 -7
  580. package/src/engine/graphics3/MeshSystem.d.ts +7 -0
  581. package/src/engine/graphics3/MeshSystem.d.ts.map +1 -1
  582. package/src/engine/graphics3/MeshSystem.js +681 -661
  583. package/src/engine/graphics3/ParticleEmitterSystem.d.ts +1 -0
  584. package/src/engine/graphics3/ParticleEmitterSystem.d.ts.map +1 -1
  585. package/src/engine/graphics3/ParticleEmitterSystem.js +1 -0
  586. package/src/engine/graphics3/TerrainSystem.d.ts +10 -40
  587. package/src/engine/graphics3/TerrainSystem.d.ts.map +1 -1
  588. package/src/engine/graphics3/TerrainSystem.js +186 -185
  589. package/src/engine/graphics3/Trail3DSystem.d.ts +28 -19
  590. package/src/engine/graphics3/Trail3DSystem.d.ts.map +1 -1
  591. package/src/engine/graphics3/Trail3DSystem.js +57 -64
  592. package/src/engine/graphics3/debug/gizmo_write_geometry.d.ts.map +1 -1
  593. package/src/engine/graphics3/debug/gizmo_write_geometry.js +7 -59
  594. package/src/engine/graphics3/decal/GPUDecalRenderer.d.ts.map +1 -1
  595. package/src/engine/graphics3/decal/GPUDecalRenderer.js +23 -7
  596. package/src/engine/graphics3/decal/shader_cluster_assign_decals.d.ts.map +1 -1
  597. package/src/engine/graphics3/decal/shader_cluster_assign_decals.js +29 -6
  598. package/src/engine/graphics3/path/tube_stream_write_geometry.d.ts.map +1 -1
  599. package/src/engine/graphics3/path/tube_stream_write_geometry.js +7 -56
  600. package/src/engine/graphics3/register_instance_animation.d.ts +3 -3
  601. package/src/engine/graphics3/register_instance_animation.js +3 -3
  602. package/src/engine/graphics3/terrain/GPUTerrainSplatRenderer.d.ts.map +1 -1
  603. package/src/engine/graphics3/terrain/TERRAIN_MATERIAL_TEMPLATE.d.ts +77 -0
  604. package/src/engine/graphics3/terrain/TERRAIN_MATERIAL_TEMPLATE.d.ts.map +1 -0
  605. package/src/engine/graphics3/terrain/TERRAIN_MATERIAL_TEMPLATE.js +485 -0
  606. package/src/engine/graphics3/terrain/TerrainShadeMaterial.d.ts +103 -0
  607. package/src/engine/graphics3/terrain/TerrainShadeMaterial.d.ts.map +1 -0
  608. package/src/engine/graphics3/terrain/TerrainShadeMaterial.js +130 -0
  609. package/src/engine/graphics3/terrain/chunk_terrain_material_surface.d.ts +23 -0
  610. package/src/engine/graphics3/terrain/chunk_terrain_material_surface.d.ts.map +1 -0
  611. package/src/engine/graphics3/terrain/chunk_terrain_material_surface.js +68 -0
  612. package/src/engine/graphics3/trail/trail_tube_write_geometry.d.ts.map +1 -1
  613. package/src/engine/graphics3/trail/trail_tube_write_geometry.js +8 -59
  614. package/src/engine/grid/grid2transform/GridPosition2TransformSystem.d.ts.map +1 -1
  615. package/src/engine/grid/grid2transform/GridPosition2TransformSystem.js +24 -5
  616. package/src/engine/grid/transform2grid/Transform2GridPositionSystem.d.ts.map +1 -1
  617. package/src/engine/grid/transform2grid/Transform2GridPositionSystem.js +10 -0
  618. package/src/engine/input/devices/PointerDevice.d.ts.map +1 -1
  619. package/src/engine/input/devices/PointerDevice.js +58 -5
  620. package/src/engine/input/ecs/ism/InputMapProgram.d.ts.map +1 -1
  621. package/src/engine/input/ecs/ism/InputMapProgram.js +13 -0
  622. package/src/engine/input/ecs/systems/InputControllerSystem.d.ts +1 -0
  623. package/src/engine/input/ecs/systems/InputControllerSystem.d.ts.map +1 -1
  624. package/src/engine/input/ecs/systems/InputControllerSystem.js +52 -2
  625. package/src/engine/intelligence/behavior/composite/ParallelBehavior.d.ts.map +1 -1
  626. package/src/engine/intelligence/behavior/composite/ParallelBehavior.js +8 -0
  627. package/src/engine/intelligence/behavior/decorator/RepeatBehavior.d.ts.map +1 -1
  628. package/src/engine/intelligence/behavior/decorator/RepeatBehavior.js +7 -0
  629. package/src/engine/intelligence/behavior/decorator/RepeatUntilSuccessBehavior.d.ts.map +1 -1
  630. package/src/engine/intelligence/behavior/decorator/RepeatUntilSuccessBehavior.js +14 -0
  631. package/src/engine/intelligence/behavior/ecs/BehaviorSystem.d.ts.map +1 -1
  632. package/src/engine/intelligence/behavior/ecs/BehaviorSystem.js +13 -0
  633. package/src/engine/interpolation/Interpoland.d.ts +7 -1
  634. package/src/engine/interpolation/Interpoland.d.ts.map +1 -1
  635. package/src/engine/interpolation/Interpoland.js +8 -1
  636. package/src/engine/interpolation/InterpolationLog.d.ts +51 -4
  637. package/src/engine/interpolation/InterpolationLog.d.ts.map +1 -1
  638. package/src/engine/interpolation/InterpolationLog.js +132 -2
  639. package/src/engine/interpolation/InterpolationSystem.d.ts +113 -35
  640. package/src/engine/interpolation/InterpolationSystem.d.ts.map +1 -1
  641. package/src/engine/interpolation/InterpolationSystem.js +677 -50
  642. package/src/engine/interpolation/TransformPoseSerializationAdapter.d.ts +5 -3
  643. package/src/engine/interpolation/TransformPoseSerializationAdapter.d.ts.map +1 -1
  644. package/src/engine/interpolation/TransformPoseSerializationAdapter.js +14 -3
  645. package/src/engine/interpolation/pose_interpoland.d.ts.map +1 -1
  646. package/src/engine/interpolation/pose_interpoland.js +2 -0
  647. package/src/engine/network/NetworkSession.d.ts +176 -47
  648. package/src/engine/network/NetworkSession.d.ts.map +1 -1
  649. package/src/engine/network/NetworkSession.js +1462 -272
  650. package/src/engine/network/README.md +106 -3
  651. package/src/engine/network/SMOOTHNESS_DESIGN.md +392 -0
  652. package/src/engine/network/adapters/PoseCorrection.d.ts +50 -0
  653. package/src/engine/network/adapters/PoseCorrection.d.ts.map +1 -0
  654. package/src/engine/network/adapters/PoseCorrection.js +211 -0
  655. package/src/engine/network/adapters/TransformReplicationAdapter.d.ts +1 -0
  656. package/src/engine/network/adapters/TransformReplicationAdapter.d.ts.map +1 -1
  657. package/src/engine/network/adapters/TransformReplicationAdapter.js +17 -0
  658. package/src/engine/network/adapters/VelocityCorrection.d.ts +31 -0
  659. package/src/engine/network/adapters/VelocityCorrection.d.ts.map +1 -0
  660. package/src/engine/network/adapters/VelocityCorrection.js +71 -0
  661. package/src/engine/network/adapters/replicate_transform64.d.ts +13 -0
  662. package/src/engine/network/adapters/replicate_transform64.d.ts.map +1 -0
  663. package/src/engine/network/adapters/replicate_transform64.js +18 -0
  664. package/src/engine/network/adapters/rigid_body_of.d.ts +22 -0
  665. package/src/engine/network/adapters/rigid_body_of.d.ts.map +1 -0
  666. package/src/engine/network/adapters/rigid_body_of.js +33 -0
  667. package/src/engine/network/correction/Correction.d.ts +120 -0
  668. package/src/engine/network/correction/Correction.d.ts.map +1 -0
  669. package/src/engine/network/correction/Correction.js +143 -0
  670. package/src/engine/network/ecs/NetworkSystem.d.ts +36 -7
  671. package/src/engine/network/ecs/NetworkSystem.d.ts.map +1 -1
  672. package/src/engine/network/ecs/NetworkSystem.js +49 -7
  673. package/src/engine/network/orchestrator/NetworkPeer.d.ts +50 -1
  674. package/src/engine/network/orchestrator/NetworkPeer.d.ts.map +1 -1
  675. package/src/engine/network/orchestrator/NetworkPeer.js +158 -20
  676. package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts +38 -2
  677. package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts.map +1 -1
  678. package/src/engine/network/orchestrator/ServerAuthoritativeClient.js +58 -10
  679. package/src/engine/network/orchestrator/ServerAuthoritativeServer.d.ts +68 -2
  680. package/src/engine/network/orchestrator/ServerAuthoritativeServer.d.ts.map +1 -1
  681. package/src/engine/network/orchestrator/ServerAuthoritativeServer.js +299 -18
  682. package/src/engine/network/replication/Replicator.d.ts +8 -1
  683. package/src/engine/network/replication/Replicator.d.ts.map +1 -1
  684. package/src/engine/network/replication/Replicator.js +50 -6
  685. package/src/engine/network/sim/ActionLog.d.ts +5 -2
  686. package/src/engine/network/sim/ActionLog.d.ts.map +1 -1
  687. package/src/engine/network/sim/ActionLog.js +5 -2
  688. package/src/engine/network/sim/RewindEngine.d.ts.map +1 -1
  689. package/src/engine/network/sim/RewindEngine.js +6 -0
  690. package/src/engine/network/sim/SimActionExecutor.d.ts +48 -3
  691. package/src/engine/network/sim/SimActionExecutor.d.ts.map +1 -1
  692. package/src/engine/network/sim/SimActionExecutor.js +152 -6
  693. package/src/engine/network/sim/SmoothingState.d.ts +54 -2
  694. package/src/engine/network/sim/SmoothingState.d.ts.map +1 -1
  695. package/src/engine/network/sim/SmoothingState.js +107 -3
  696. package/src/engine/network/state/MutationLedger.d.ts.map +1 -1
  697. package/src/engine/network/state/MutationLedger.js +18 -2
  698. package/src/engine/network/state/PredictionHistory.d.ts +67 -0
  699. package/src/engine/network/state/PredictionHistory.d.ts.map +1 -0
  700. package/src/engine/network/state/PredictionHistory.js +145 -0
  701. package/src/engine/network/time/RenderPlayout.d.ts +2 -1
  702. package/src/engine/network/time/RenderPlayout.d.ts.map +1 -1
  703. package/src/engine/network/time/RenderPlayout.js +174 -163
  704. package/src/engine/network/transport/DeferredTransport.d.ts +57 -0
  705. package/src/engine/network/transport/DeferredTransport.d.ts.map +1 -0
  706. package/src/engine/network/transport/DeferredTransport.js +143 -0
  707. package/src/engine/network/transport/LoopbackTransport.d.ts +8 -0
  708. package/src/engine/network/transport/LoopbackTransport.d.ts.map +1 -1
  709. package/src/engine/network/transport/LoopbackTransport.js +12 -1
  710. package/src/engine/network/transport/ReliableCommandPipeline.d.ts.map +1 -1
  711. package/src/engine/network/transport/ReliableCommandPipeline.js +20 -0
  712. package/src/engine/network/transport/adapters/NodeUDPTransport.d.ts.map +1 -1
  713. package/src/engine/network/transport/adapters/NodeUDPTransport.js +11 -2
  714. package/src/engine/network/transport/adapters/WebTransportTransport.d.ts.map +1 -1
  715. package/src/engine/network/transport/adapters/WebTransportTransport.js +8 -1
  716. package/src/engine/network/transport/fragments/FragmentAssembler.d.ts +2 -1
  717. package/src/engine/network/transport/fragments/FragmentAssembler.d.ts.map +1 -1
  718. package/src/engine/network/transport/fragments/FragmentAssembler.js +67 -3
  719. package/src/engine/network/transport/fragments/fragment_send.d.ts +8 -0
  720. package/src/engine/network/transport/fragments/fragment_send.d.ts.map +1 -1
  721. package/src/engine/network/transport/fragments/fragment_send.js +17 -7
  722. package/src/engine/network/transport/fragments/packet_size.d.ts +6 -0
  723. package/src/engine/network/transport/fragments/packet_size.d.ts.map +1 -1
  724. package/src/engine/network/transport/fragments/packet_size.js +6 -0
  725. package/src/engine/physics/ccd/linear_sweep.d.ts.map +1 -1
  726. package/src/engine/physics/ccd/linear_sweep.js +19 -1
  727. package/src/engine/physics/cloth/ecs/ClothWorld.d.ts +7 -3
  728. package/src/engine/physics/cloth/ecs/ClothWorld.d.ts.map +1 -1
  729. package/src/engine/physics/cloth/ecs/ClothWorld.js +51 -4
  730. package/src/engine/physics/cloth/solver/cloth_self_find.js +17 -0
  731. package/src/engine/physics/contact/ManifoldStore.d.ts +20 -1
  732. package/src/engine/physics/contact/ManifoldStore.d.ts.map +1 -1
  733. package/src/engine/physics/contact/ManifoldStore.js +24 -2
  734. package/src/engine/physics/ecs/PhysicsSystem.d.ts +51 -88
  735. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  736. package/src/engine/physics/ecs/PhysicsSystem.js +82 -217
  737. package/src/engine/physics/ecs/is_sensor.d.ts +24 -0
  738. package/src/engine/physics/ecs/is_sensor.d.ts.map +1 -1
  739. package/src/engine/physics/ecs/is_sensor.js +39 -0
  740. package/src/engine/physics/fluid/ecs/FluidComponent.d.ts +18 -4
  741. package/src/engine/physics/fluid/ecs/FluidComponent.d.ts.map +1 -1
  742. package/src/engine/physics/fluid/ecs/FluidComponent.js +29 -8
  743. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  744. package/src/engine/physics/fluid/effector/AbstractFluidEffector.d.ts +8 -0
  745. package/src/engine/physics/fluid/effector/AbstractFluidEffector.d.ts.map +1 -1
  746. package/src/engine/physics/fluid/effector/AbstractFluidEffector.js +8 -0
  747. package/src/engine/physics/fluid/solver/NOTES.md +46 -0
  748. package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_scalar.js +1 -1
  749. package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_velocity.js +1 -1
  750. package/src/engine/physics/fluid/solver/v3_grid_advect_sl_velocity.js +1 -1
  751. package/src/engine/physics/fluid/solver/v3_grid_apply_advection_forward.js +1 -1
  752. package/src/engine/physics/fluid/solver/v3_grid_apply_scalar_advection.js +1 -1
  753. package/src/engine/physics/fluid/solver/v3_grid_apply_vorticity_confinement.d.ts.map +1 -1
  754. package/src/engine/physics/fluid/solver/v3_grid_apply_vorticity_confinement.js +8 -0
  755. package/src/engine/physics/fluid/solver/v3_grid_compute_divergence.d.ts.map +1 -1
  756. package/src/engine/physics/fluid/solver/v3_grid_compute_divergence.js +8 -0
  757. package/src/engine/physics/fluid/solver/v3_grid_subtract_pressure_gradient.d.ts.map +1 -1
  758. package/src/engine/physics/fluid/solver/v3_grid_subtract_pressure_gradient.js +8 -0
  759. package/src/engine/physics/fluid/solver/v3_mac_advect_scalar.d.ts +5 -0
  760. package/src/engine/physics/fluid/solver/v3_mac_advect_scalar.d.ts.map +1 -1
  761. package/src/engine/physics/fluid/solver/v3_mac_advect_scalar.js +5 -0
  762. package/src/engine/physics/integration/integrate_velocity.d.ts +15 -0
  763. package/src/engine/physics/integration/integrate_velocity.d.ts.map +1 -1
  764. package/src/engine/physics/integration/integrate_velocity.js +15 -0
  765. package/src/engine/physics/island/IslandBuilder.d.ts.map +1 -1
  766. package/src/engine/physics/island/IslandBuilder.js +6 -7
  767. package/src/engine/physics/mls-mpm/MLS_MPM.d.ts.map +1 -1
  768. package/src/engine/physics/mls-mpm/MLS_MPM.js +36 -6
  769. package/src/engine/physics/mls-mpm/mls_mpm_demo_scene.d.ts +29 -0
  770. package/src/engine/physics/mls-mpm/mls_mpm_demo_scene.d.ts.map +1 -0
  771. package/src/engine/physics/mls-mpm/mls_mpm_demo_scene.js +44 -0
  772. package/src/engine/physics/mls-mpm/testMLS_MPM.js +3 -3
  773. package/src/engine/physics/narrowphase/narrowphase_step.d.ts.map +1 -1
  774. package/src/engine/physics/narrowphase/narrowphase_step.js +74 -11
  775. package/src/engine/physics/queries/overlap_shape.d.ts.map +1 -1
  776. package/src/engine/physics/queries/overlap_shape.js +92 -45
  777. package/src/engine/physics/queries/raycast.d.ts.map +1 -1
  778. package/src/engine/physics/queries/raycast.js +55 -43
  779. package/src/engine/physics/queries/shape_cast.d.ts.map +1 -1
  780. package/src/engine/physics/queries/shape_cast.js +185 -174
  781. package/src/engine/physics/solver/solve_contacts.d.ts.map +1 -1
  782. package/src/engine/physics/solver/solve_contacts.js +42 -19
  783. package/src/engine/plugin/EnginePluginManager.d.ts +10 -0
  784. package/src/engine/plugin/EnginePluginManager.d.ts.map +1 -1
  785. package/src/engine/plugin/EnginePluginManager.js +54 -1
  786. package/src/engine/plugin/PluginReferenceContext.d.ts.map +1 -1
  787. package/src/engine/plugin/PluginReferenceContext.js +7 -3
  788. package/src/engine/reference/v2/Reference.d.ts +9 -0
  789. package/src/engine/reference/v2/Reference.d.ts.map +1 -1
  790. package/src/engine/reference/v2/Reference.js +39 -2
  791. package/src/engine/simulation/Ticker.d.ts.map +1 -1
  792. package/src/engine/simulation/Ticker.js +20 -1
  793. package/src/engine/sound/ecs/SoundListenerSystem.d.ts +27 -0
  794. package/src/engine/sound/ecs/SoundListenerSystem.d.ts.map +1 -1
  795. package/src/engine/sound/ecs/SoundListenerSystem.js +82 -21
  796. package/src/engine/sound/ecs/audio/LiveEmitterSet.d.ts.map +1 -1
  797. package/src/engine/sound/ecs/audio/LiveEmitterSet.js +394 -356
  798. package/src/engine/sound/material/concrete/SoundMaterialComposition.d.ts.map +1 -1
  799. package/src/engine/sound/material/concrete/SoundMaterialComposition.js +54 -17
  800. package/src/engine/sound/material/detector/terrain/TerrainSoundMaterialSurfaceDetector.d.ts.map +1 -1
  801. package/src/engine/sound/material/detector/terrain/TerrainSoundMaterialSurfaceDetector.js +34 -3
  802. package/src/engine/sound/simulation/core/AcousticSolution.d.ts +5 -0
  803. package/src/engine/sound/simulation/core/AcousticSolution.d.ts.map +1 -1
  804. package/src/engine/sound/simulation/core/AcousticSolution.js +5 -0
  805. package/src/engine/sound/simulation/definition/AcousticMaterial.d.ts +8 -0
  806. package/src/engine/sound/simulation/definition/AcousticMaterial.d.ts.map +1 -1
  807. package/src/engine/sound/simulation/definition/AcousticMaterial.js +8 -0
  808. package/src/engine/sound/simulation/probe/probe_visibility_augment.d.ts +6 -4
  809. package/src/engine/sound/simulation/probe/probe_visibility_augment.d.ts.map +1 -1
  810. package/src/engine/sound/simulation/probe/probe_visibility_augment.js +19 -7
  811. package/src/engine/sound/simulation/render/FoaProbeReverbRenderer.d.ts +39 -0
  812. package/src/engine/sound/simulation/render/FoaProbeReverbRenderer.d.ts.map +1 -1
  813. package/src/engine/sound/simulation/render/FoaProbeReverbRenderer.js +130 -1
  814. package/src/engine/sound/simulation/render/ProbeReverbRenderer.d.ts +3 -2
  815. package/src/engine/sound/simulation/render/ProbeReverbRenderer.d.ts.map +1 -1
  816. package/src/engine/sound/simulation/render/ProbeReverbRenderer.js +15 -1
  817. package/src/engine/sound/sopra/SopraEngine.d.ts +10 -0
  818. package/src/engine/sound/sopra/SopraEngine.d.ts.map +1 -1
  819. package/src/engine/sound/sopra/SopraEngine.js +486 -440
  820. package/src/engine/sound/sopra/definition/clip/AbstractAudioClip.d.ts +2 -1
  821. package/src/engine/sound/sopra/definition/clip/AbstractAudioClip.d.ts.map +1 -1
  822. package/src/engine/sound/sopra/definition/clip/AbstractAudioClip.js +1 -1
  823. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.d.ts +1 -0
  824. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.d.ts.map +1 -1
  825. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.d.ts +1 -0
  826. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.d.ts.map +1 -1
  827. package/src/engine/sound/sopra/definition/clip/SampleAudioClip.d.ts +2 -1
  828. package/src/engine/sound/sopra/definition/clip/SampleAudioClip.d.ts.map +1 -1
  829. package/src/engine/sound/sopra/definition/clip/SampleAudioClip.js +12 -3
  830. package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClip.d.ts +1 -0
  831. package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClip.d.ts.map +1 -1
  832. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.d.ts +1 -0
  833. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.d.ts.map +1 -1
  834. package/src/engine/sound/sopra/runtime/BusGraph.d.ts +29 -0
  835. package/src/engine/sound/sopra/runtime/BusGraph.d.ts.map +1 -1
  836. package/src/engine/sound/sopra/runtime/BusGraph.js +69 -2
  837. package/src/engine/sound/sopra/runtime/EventInstance.d.ts.map +1 -1
  838. package/src/engine/sound/sopra/runtime/EventInstance.js +134 -10
  839. package/src/engine/ui/GUIEngine.d.ts +14 -0
  840. package/src/engine/ui/GUIEngine.d.ts.map +1 -1
  841. package/src/engine/ui/GUIEngine.js +52 -4
  842. package/src/format/image/avif/api/apply_transformations.d.ts +2 -1
  843. package/src/format/image/avif/api/apply_transformations.d.ts.map +1 -1
  844. package/src/format/image/avif/api/apply_transformations.js +129 -120
  845. package/src/format/image/avif/api/convert_to_rgba.d.ts.map +1 -1
  846. package/src/format/image/avif/api/convert_to_rgba.js +35 -2
  847. package/src/format/image/avif/api/decode_image_item.d.ts +2 -1
  848. package/src/format/image/avif/api/decode_image_item.d.ts.map +1 -1
  849. package/src/format/image/avif/api/decode_image_item.js +322 -234
  850. package/src/format/image/avif/av1/decode/decode_av1_still.js +329 -309
  851. package/src/format/image/avif/av1/decode/decode_coefficients.d.ts.map +1 -1
  852. package/src/format/image/avif/av1/decode/decode_coefficients.js +248 -259
  853. package/src/format/image/avif/av1/decode/read_golomb.d.ts +21 -0
  854. package/src/format/image/avif/av1/decode/read_golomb.d.ts.map +1 -0
  855. package/src/format/image/avif/av1/decode/read_golomb.js +49 -0
  856. package/src/format/image/avif/av1/encode/encode_tile.js +2349 -2331
  857. package/src/format/image/avif/av1/entropy/symbol_cost.d.ts.map +1 -1
  858. package/src/format/image/avif/av1/entropy/symbol_cost.js +86 -76
  859. package/src/format/image/avif/av1/filter/loop_restoration.js +461 -451
  860. package/src/format/image/avif/av1/util/round2.d.ts +19 -2
  861. package/src/format/image/avif/av1/util/round2.d.ts.map +1 -1
  862. package/src/format/image/avif/av1/util/round2.js +51 -27
  863. package/src/format/image/avif/heif/AvifFile.d.ts +11 -0
  864. package/src/format/image/avif/heif/AvifFile.d.ts.map +1 -1
  865. package/src/format/image/avif/heif/AvifFile.js +154 -142
  866. package/src/format/image/avif/heif/find_item_properties.d.ts +23 -0
  867. package/src/format/image/avif/heif/find_item_properties.d.ts.map +1 -0
  868. package/src/format/image/avif/heif/find_item_properties.js +36 -0
  869. package/src/format/image/avif/heif/parse_avif_file.js +30 -3
  870. package/src/format/image/avif/heif/read_item_data.d.ts.map +1 -1
  871. package/src/format/image/avif/heif/read_item_data.js +131 -97
  872. package/src/format/image/jpeg/decodeScan.d.ts.map +1 -1
  873. package/src/format/image/jpeg/decodeScan.js +17 -0
  874. package/src/format/scene/gltf/gltf_parse_container.d.ts.map +1 -1
  875. package/src/format/scene/gltf/gltf_parse_container.js +61 -41
  876. package/src/format/scene/gltf/gltf_read_accessor.d.ts +21 -0
  877. package/src/format/scene/gltf/gltf_read_accessor.d.ts.map +1 -1
  878. package/src/format/scene/gltf/gltf_read_accessor.js +37 -0
  879. package/src/format/scene/usd/usd_compose_transform.d.ts.map +1 -1
  880. package/src/format/scene/usd/usd_compose_transform.js +56 -6
  881. package/src/format/texture/basis/transcode/fit_endpoints.d.ts +6 -0
  882. package/src/format/texture/basis/transcode/fit_endpoints.d.ts.map +1 -1
  883. package/src/format/texture/basis/transcode/fit_endpoints.js +33 -39
  884. package/src/generation/filtering/numeric/CellFilterCache.d.ts +17 -0
  885. package/src/generation/filtering/numeric/CellFilterCache.d.ts.map +1 -1
  886. package/src/generation/filtering/numeric/CellFilterCache.js +36 -3
  887. package/src/generation/grid/actions/ContinuousGridCellActionSetTerrainObstacle.d.ts +9 -0
  888. package/src/generation/grid/actions/ContinuousGridCellActionSetTerrainObstacle.d.ts.map +1 -1
  889. package/src/generation/grid/actions/ContinuousGridCellActionSetTerrainObstacle.js +37 -6
  890. package/src/generation/grid/actions/ContinuousGridCellActionWriteObstacle.d.ts.map +1 -1
  891. package/src/generation/grid/actions/ContinuousGridCellActionWriteObstacle.js +8 -21
  892. package/src/generation/grid/actions/grid_obstacle_write_grid_point.d.ts +28 -0
  893. package/src/generation/grid/actions/grid_obstacle_write_grid_point.d.ts.map +1 -0
  894. package/src/generation/grid/actions/grid_obstacle_write_grid_point.js +41 -0
  895. package/src/generation/grid/generation/GridTaskDensityMarkerDistribution.d.ts +15 -1
  896. package/src/generation/grid/generation/GridTaskDensityMarkerDistribution.d.ts.map +1 -1
  897. package/src/generation/grid/generation/GridTaskDensityMarkerDistribution.js +17 -3
  898. package/src/generation/markers/actions/MarkerNodeProcessingRuleSet.d.ts.map +1 -1
  899. package/src/generation/markers/actions/MarkerNodeProcessingRuleSet.js +16 -1
  900. package/src/generation/placement/action/GridCellActionWriteFilterToLayer.d.ts.map +1 -1
  901. package/src/generation/placement/action/GridCellActionWriteFilterToLayer.js +8 -1
  902. package/src/generation/theme/TerrainTheme.d.ts.map +1 -1
  903. package/src/generation/theme/TerrainTheme.js +20 -1
  904. package/src/shade/RENDERER_CONTRACT.md +48 -6
  905. package/src/shade/descriptor/texture/format/gpu_texture_formats_copy_compatible.d.ts +23 -0
  906. package/src/shade/descriptor/texture/format/gpu_texture_formats_copy_compatible.d.ts.map +1 -0
  907. package/src/shade/descriptor/texture/format/gpu_texture_formats_copy_compatible.js +28 -0
  908. package/src/shade/descriptor/texture/format/gpu_texture_formats_view_compatible.d.ts +25 -0
  909. package/src/shade/descriptor/texture/format/gpu_texture_formats_view_compatible.d.ts.map +1 -0
  910. package/src/shade/descriptor/texture/format/gpu_texture_formats_view_compatible.js +42 -0
  911. package/src/shade/device/ShadeGPUCommandContext.d.ts.map +1 -1
  912. package/src/shade/device/ShadeGPUCommandContext.js +874 -857
  913. package/src/shade/device/mock/SoftwareGPUBindGroup.d.ts +38 -1
  914. package/src/shade/device/mock/SoftwareGPUBindGroup.d.ts.map +1 -1
  915. package/src/shade/device/mock/SoftwareGPUBindGroup.js +73 -1
  916. package/src/shade/device/mock/SoftwareGPUBuffer.d.ts.map +1 -1
  917. package/src/shade/device/mock/SoftwareGPUBuffer.js +5 -0
  918. package/src/shade/device/mock/SoftwareGPUCommandBuffer.d.ts +34 -0
  919. package/src/shade/device/mock/SoftwareGPUCommandBuffer.d.ts.map +1 -1
  920. package/src/shade/device/mock/SoftwareGPUCommandBuffer.js +71 -1
  921. package/src/shade/device/mock/SoftwareGPUCommandEncoder.d.ts +15 -0
  922. package/src/shade/device/mock/SoftwareGPUCommandEncoder.d.ts.map +1 -1
  923. package/src/shade/device/mock/SoftwareGPUCommandEncoder.js +109 -1
  924. package/src/shade/device/mock/SoftwareGPUComputePassEncoder.d.ts.map +1 -1
  925. package/src/shade/device/mock/SoftwareGPUComputePassEncoder.js +51 -0
  926. package/src/shade/device/mock/SoftwareGPUDevice.d.ts +5 -1
  927. package/src/shade/device/mock/SoftwareGPUDevice.d.ts.map +1 -1
  928. package/src/shade/device/mock/SoftwareGPUDevice.js +58 -1
  929. package/src/shade/device/mock/SoftwareGPUPipeline.d.ts +1 -0
  930. package/src/shade/device/mock/SoftwareGPUPipeline.d.ts.map +1 -1
  931. package/src/shade/device/mock/SoftwareGPUPipeline.js +17 -11
  932. package/src/shade/device/mock/SoftwareGPUQueue.d.ts.map +1 -1
  933. package/src/shade/device/mock/SoftwareGPUQueue.js +41 -0
  934. package/src/shade/device/mock/SoftwareGPURenderPassEncoder.d.ts.map +1 -1
  935. package/src/shade/device/mock/SoftwareGPURenderPassEncoder.js +24 -0
  936. package/src/shade/device/mock/SoftwareGPUTexture.d.ts +11 -1
  937. package/src/shade/device/mock/SoftwareGPUTexture.d.ts.map +1 -1
  938. package/src/shade/device/mock/SoftwareGPUTexture.js +45 -8
  939. package/src/shade/device/mock/SoftwareGPUTextureView.d.ts +20 -1
  940. package/src/shade/device/mock/SoftwareGPUTextureView.d.ts.map +1 -1
  941. package/src/shade/device/mock/SoftwareGPUTextureView.js +28 -1
  942. package/src/shade/device/mock/recorded_binding_kind_mismatches.d.ts +20 -0
  943. package/src/shade/device/mock/recorded_binding_kind_mismatches.d.ts.map +1 -0
  944. package/src/shade/device/mock/recorded_binding_kind_mismatches.js +84 -0
  945. package/src/shade/device/mock/texture_copy.d.ts.map +1 -1
  946. package/src/shade/device/mock/texture_copy.js +41 -3
  947. package/src/shade/device/mock/texture_view_resource.d.ts +26 -0
  948. package/src/shade/device/mock/texture_view_resource.d.ts.map +1 -0
  949. package/src/shade/device/mock/texture_view_resource.js +47 -0
  950. package/src/shade/device/timing/GPUTimer.d.ts.map +1 -1
  951. package/src/shade/device/timing/GPUTimer.js +35 -21
  952. package/src/shade/playground/caldera/caldera_format.d.ts +28 -1
  953. package/src/shade/playground/caldera/caldera_format.d.ts.map +1 -1
  954. package/src/shade/playground/caldera/caldera_format.js +37 -0
  955. package/src/shade/playground/caldera/main.js +12 -2
  956. package/src/shade/playground/frame_rate_meter.d.ts +92 -0
  957. package/src/shade/playground/frame_rate_meter.d.ts.map +1 -0
  958. package/src/shade/playground/frame_rate_meter.js +147 -0
  959. package/src/shade/playground/particle_ecs/main.js +53 -7
  960. package/src/shade/playground/particle_ecs/moonlit_environment.js +2 -2
  961. package/src/shade/playground/particle_stats_readback.d.ts +58 -0
  962. package/src/shade/playground/particle_stats_readback.d.ts.map +1 -0
  963. package/src/shade/playground/particle_stats_readback.js +83 -0
  964. package/src/shade/playground/particle_system/main.js +378 -325
  965. package/src/shade/playground/skinned_blas_refit/main.d.ts.map +1 -1
  966. package/src/shade/playground/skinned_blas_refit/main.js +7 -2
  967. package/src/shade/playground/sponza_path_trace/main.d.ts.map +1 -1
  968. package/src/shade/playground/sponza_path_trace/main.js +398 -393
  969. package/src/shade/playground/volumetrics_froxel/main.d.ts.map +1 -1
  970. package/src/shade/playground/volumetrics_froxel/main.js +941 -936
  971. package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
  972. package/src/shade/renderer/GraphicsContext.js +7 -2
  973. package/src/shade/renderer/Renderer.d.ts +47 -1
  974. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  975. package/src/shade/renderer/Renderer.js +224 -27
  976. package/src/shade/renderer/animation/ANIMATION_CLIP_STATE_STRUCT.d.ts +4 -7
  977. package/src/shade/renderer/animation/ANIMATION_CLIP_STATE_STRUCT.d.ts.map +1 -1
  978. package/src/shade/renderer/animation/ANIMATION_CLIP_STATE_STRUCT.js +19 -16
  979. package/src/shade/renderer/animation/ANIMATION_CURVE_HEADER_STRUCT.js +11 -11
  980. package/src/shade/renderer/animation/ANIMATION_DATABASE_SPEC.d.ts +14 -18
  981. package/src/shade/renderer/animation/ANIMATION_DATABASE_SPEC.d.ts.map +1 -1
  982. package/src/shade/renderer/animation/ANIMATION_DATABASE_SPEC.js +95 -24
  983. package/src/shade/renderer/animation/ANIMATION_SKIN_JOINT_STRUCT.d.ts +5 -4
  984. package/src/shade/renderer/animation/ANIMATION_SKIN_JOINT_STRUCT.d.ts.map +1 -1
  985. package/src/shade/renderer/animation/ANIMATION_SKIN_JOINT_STRUCT.js +7 -4
  986. package/src/shade/renderer/animation/ANIMATION_SKIN_STRUCT.d.ts +6 -12
  987. package/src/shade/renderer/animation/ANIMATION_SKIN_STRUCT.d.ts.map +1 -1
  988. package/src/shade/renderer/animation/ANIMATION_SKIN_STRUCT.js +9 -16
  989. package/src/shade/renderer/animation/ANIMATION_TRACK_BINDING_STRUCT.d.ts +6 -5
  990. package/src/shade/renderer/animation/ANIMATION_TRACK_BINDING_STRUCT.d.ts.map +1 -1
  991. package/src/shade/renderer/animation/ANIMATION_TRACK_BINDING_STRUCT.js +12 -5
  992. package/src/shade/renderer/animation/GPUAnimationManager.d.ts +80 -95
  993. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  994. package/src/shade/renderer/animation/GPUAnimationManager.js +371 -606
  995. package/src/shade/renderer/animation/chunk_animation_curve_evaluate.d.ts +10 -14
  996. package/src/shade/renderer/animation/chunk_animation_curve_evaluate.d.ts.map +1 -1
  997. package/src/shade/renderer/animation/chunk_animation_curve_evaluate.js +40 -67
  998. package/src/shade/renderer/animation/chunk_pose_accumulator.d.ts.map +1 -1
  999. package/src/shade/renderer/animation/chunk_pose_accumulator.js +13 -4
  1000. package/src/shade/renderer/animation/shader_animation_apply.d.ts +14 -8
  1001. package/src/shade/renderer/animation/shader_animation_apply.d.ts.map +1 -1
  1002. package/src/shade/renderer/animation/shader_animation_apply.js +129 -128
  1003. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +2 -2
  1004. package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.d.ts +3 -2
  1005. package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.d.ts.map +1 -1
  1006. package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.js +3 -2
  1007. package/src/shade/renderer/animation/skinning/shader_skin_matrix_prep.d.ts +12 -7
  1008. package/src/shade/renderer/animation/skinning/shader_skin_matrix_prep.d.ts.map +1 -1
  1009. package/src/shade/renderer/animation/skinning/shader_skin_matrix_prep.js +107 -104
  1010. package/src/shade/renderer/binding/BindingResource.d.ts +36 -1
  1011. package/src/shade/renderer/binding/BindingResource.d.ts.map +1 -1
  1012. package/src/shade/renderer/binding/BindingResource.js +36 -3
  1013. package/src/shade/renderer/binding/BufferBinding.d.ts +8 -0
  1014. package/src/shade/renderer/binding/BufferBinding.d.ts.map +1 -1
  1015. package/src/shade/renderer/binding/BufferBinding.js +21 -0
  1016. package/src/shade/renderer/buffer/table/GPUDatabase.d.ts +19 -0
  1017. package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
  1018. package/src/shade/renderer/buffer/table/GPUDatabase.js +114 -1
  1019. package/src/shade/renderer/buffer/table/GPUDatabaseDefinition.d.ts +132 -1
  1020. package/src/shade/renderer/buffer/table/GPUDatabaseDefinition.d.ts.map +1 -1
  1021. package/src/shade/renderer/buffer/table/GPUDatabaseDefinition.js +384 -1
  1022. package/src/shade/renderer/buffer/table/GPUDatabaseReadback.d.ts.map +1 -1
  1023. package/src/shade/renderer/buffer/table/GPUDatabaseReadback.js +1332 -1323
  1024. package/src/shade/renderer/buffer/table/GPUTableLink.d.ts +67 -0
  1025. package/src/shade/renderer/buffer/table/GPUTableLink.d.ts.map +1 -0
  1026. package/src/shade/renderer/buffer/table/GPUTableLink.js +76 -0
  1027. package/src/shade/renderer/buffer/table/GPUTableRange.d.ts +72 -0
  1028. package/src/shade/renderer/buffer/table/GPUTableRange.d.ts.map +1 -0
  1029. package/src/shade/renderer/buffer/table/GPUTableRange.js +82 -0
  1030. package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts +106 -5
  1031. package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts.map +1 -1
  1032. package/src/shade/renderer/buffer/table/GPUTypedTable.js +458 -28
  1033. package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.d.ts.map +1 -1
  1034. package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.js +28 -5
  1035. package/src/shade/renderer/buffer/table/GPU_DATABASE_NULL.d.ts +14 -0
  1036. package/src/shade/renderer/buffer/table/GPU_DATABASE_NULL.d.ts.map +1 -0
  1037. package/src/shade/renderer/buffer/table/GPU_DATABASE_NULL.js +13 -0
  1038. package/src/shade/renderer/buffer/table/gpu_database_check_links.d.ts +80 -0
  1039. package/src/shade/renderer/buffer/table/gpu_database_check_links.d.ts.map +1 -0
  1040. package/src/shade/renderer/buffer/table/gpu_database_check_links.js +456 -0
  1041. package/src/shade/renderer/buffer/table/gpu_table_field_word.d.ts +17 -0
  1042. package/src/shade/renderer/buffer/table/gpu_table_field_word.d.ts.map +1 -0
  1043. package/src/shade/renderer/buffer/table/gpu_table_field_word.js +111 -0
  1044. package/src/shade/renderer/buffer/table/gpu_table_range_well_formed.d.ts +20 -0
  1045. package/src/shade/renderer/buffer/table/gpu_table_range_well_formed.d.ts.map +1 -0
  1046. package/src/shade/renderer/buffer/table/gpu_table_range_well_formed.js +27 -0
  1047. package/src/shade/renderer/camera/CameraManager.d.ts +11 -0
  1048. package/src/shade/renderer/camera/CameraManager.d.ts.map +1 -1
  1049. package/src/shade/renderer/camera/CameraManager.js +18 -0
  1050. package/src/shade/renderer/create_frame_loop.d.ts +16 -0
  1051. package/src/shade/renderer/create_frame_loop.d.ts.map +1 -1
  1052. package/src/shade/renderer/create_frame_loop.js +16 -0
  1053. package/src/shade/renderer/deferred/chunk_shade_standard_material_direct.d.ts +23 -0
  1054. package/src/shade/renderer/deferred/chunk_shade_standard_material_direct.d.ts.map +1 -1
  1055. package/src/shade/renderer/deferred/chunk_shade_standard_material_direct.js +27 -32
  1056. package/src/shade/renderer/deferred/chunk_shade_standard_material_direct_heavy.d.ts +9 -7
  1057. package/src/shade/renderer/deferred/chunk_shade_standard_material_direct_heavy.d.ts.map +1 -1
  1058. package/src/shade/renderer/deferred/chunk_shade_standard_material_direct_heavy.js +16 -108
  1059. package/src/shade/renderer/dynamic/DynamicMeshAVBOITChannel.d.ts +135 -0
  1060. package/src/shade/renderer/dynamic/DynamicMeshAVBOITChannel.d.ts.map +1 -0
  1061. package/src/shade/renderer/dynamic/DynamicMeshAVBOITChannel.js +296 -0
  1062. package/src/shade/renderer/dynamic/GPUDynamicMeshRenderer.d.ts +2 -2
  1063. package/src/shade/renderer/dynamic/GPUDynamicMeshRenderer.d.ts.map +1 -1
  1064. package/src/shade/renderer/dynamic/GPUDynamicMeshRenderer.js +10 -131
  1065. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.d.ts.map +1 -1
  1066. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.js +185 -167
  1067. package/src/shade/renderer/dynamic/GPUDynamicMeshResidencyTable.d.ts +49 -0
  1068. package/src/shade/renderer/dynamic/GPUDynamicMeshResidencyTable.d.ts.map +1 -0
  1069. package/src/shade/renderer/dynamic/GPUDynamicMeshResidencyTable.js +185 -0
  1070. package/src/shade/renderer/dynamic/chunk_dynamic_mesh_avboit_vertex.d.ts +24 -0
  1071. package/src/shade/renderer/dynamic/chunk_dynamic_mesh_avboit_vertex.d.ts.map +1 -0
  1072. package/src/shade/renderer/dynamic/chunk_dynamic_mesh_avboit_vertex.js +49 -0
  1073. package/src/shade/renderer/dynamic/chunk_dynamic_mesh_vertex.d.ts +18 -0
  1074. package/src/shade/renderer/dynamic/chunk_dynamic_mesh_vertex.d.ts.map +1 -0
  1075. package/src/shade/renderer/dynamic/chunk_dynamic_mesh_vertex.js +54 -0
  1076. package/src/shade/renderer/dynamic/dynamic_mesh_live_bounds.d.ts +26 -0
  1077. package/src/shade/renderer/dynamic/dynamic_mesh_live_bounds.d.ts.map +1 -0
  1078. package/src/shade/renderer/dynamic/dynamic_mesh_live_bounds.js +96 -0
  1079. package/src/shade/renderer/dynamic/graph_dynamic_mesh_avboit.d.ts +102 -0
  1080. package/src/shade/renderer/dynamic/graph_dynamic_mesh_avboit.d.ts.map +1 -0
  1081. package/src/shade/renderer/dynamic/graph_dynamic_mesh_avboit.js +364 -0
  1082. package/src/shade/renderer/dynamic/shader_dynamic_mesh.d.ts.map +1 -1
  1083. package/src/shade/renderer/dynamic/shader_dynamic_mesh.js +153 -177
  1084. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_draw.d.ts +20 -0
  1085. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_draw.d.ts.map +1 -0
  1086. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_draw.js +136 -0
  1087. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_occupancy.d.ts +20 -0
  1088. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_occupancy.d.ts.map +1 -0
  1089. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_occupancy.js +106 -0
  1090. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_splat.d.ts +32 -0
  1091. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_splat.d.ts.map +1 -0
  1092. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_splat.js +163 -0
  1093. package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +13 -2
  1094. package/src/shade/renderer/fow/GPUFogOfWarRenderer.d.ts.map +1 -1
  1095. package/src/shade/renderer/fow/GPUFogOfWarRenderer.js +5 -14
  1096. package/src/shade/renderer/fow/fow_obtain_mask.d.ts +17 -0
  1097. package/src/shade/renderer/fow/fow_obtain_mask.d.ts.map +1 -0
  1098. package/src/shade/renderer/fow/fow_obtain_mask.js +41 -0
  1099. package/src/shade/renderer/frame_jitter_applies.d.ts +21 -0
  1100. package/src/shade/renderer/frame_jitter_applies.d.ts.map +1 -0
  1101. package/src/shade/renderer/frame_jitter_applies.js +23 -0
  1102. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts.map +1 -1
  1103. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js +128 -3
  1104. package/src/shade/renderer/geometry/geometry_obtain_attribute.d.ts +42 -0
  1105. package/src/shade/renderer/geometry/geometry_obtain_attribute.d.ts.map +1 -0
  1106. package/src/shade/renderer/geometry/geometry_obtain_attribute.js +83 -0
  1107. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts +12 -0
  1108. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
  1109. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +65 -0
  1110. package/src/shade/renderer/geometry/meshlet/build/geometry_to_meshlets_greedy.d.ts.map +1 -1
  1111. package/src/shade/renderer/geometry/meshlet/build/geometry_to_meshlets_greedy.js +4 -1
  1112. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.d.ts.map +1 -1
  1113. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.js +4 -1
  1114. package/src/shade/renderer/geometry/normals/encode_normals_to_octahedral_u32.d.ts.map +1 -1
  1115. package/src/shade/renderer/geometry/normals/encode_normals_to_octahedral_u32.js +4 -1
  1116. package/src/shade/renderer/geometry/normals/geometry_build_tangents.d.ts.map +1 -1
  1117. package/src/shade/renderer/geometry/normals/geometry_build_tangents.js +39 -1
  1118. package/src/shade/renderer/geometry/util/geometry_merge.d.ts.map +1 -1
  1119. package/src/shade/renderer/geometry/util/geometry_merge.js +18 -2
  1120. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_DESIGN.md +93 -12
  1121. package/src/shade/renderer/geometry/virtual/WEDGE_PLAN_2026_09_18.md +91 -1
  1122. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts +0 -13
  1123. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts.map +1 -1
  1124. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.js +0 -15
  1125. package/src/shade/renderer/geometry/virtual/build/gltf/gltf_collect_geometries.d.ts.map +1 -1
  1126. package/src/shade/renderer/geometry/virtual/build/gltf/gltf_collect_geometries.js +31 -2
  1127. package/src/shade/renderer/geometry/virtual/build/level/VGeoFrontier.d.ts +18 -0
  1128. package/src/shade/renderer/geometry/virtual/build/level/VGeoFrontier.d.ts.map +1 -1
  1129. package/src/shade/renderer/geometry/virtual/build/level/VGeoFrontier.js +19 -0
  1130. package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupStep.d.ts +8 -0
  1131. package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupStep.d.ts.map +1 -1
  1132. package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupStep.js +9 -0
  1133. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.d.ts.map +1 -1
  1134. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.js +15 -6
  1135. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_leaf_frontier.d.ts.map +1 -1
  1136. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_leaf_frontier.js +4 -0
  1137. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.d.ts.map +1 -1
  1138. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.js +12 -0
  1139. package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.d.ts +11 -1
  1140. package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.d.ts.map +1 -1
  1141. package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.js +11 -1
  1142. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.d.ts +18 -9
  1143. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.d.ts.map +1 -1
  1144. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.js +20 -26
  1145. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.d.ts +1 -3
  1146. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.d.ts.map +1 -1
  1147. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.js +2 -5
  1148. package/src/shade/renderer/geometry/virtual/build/vgeo_build.js +1 -1
  1149. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.d.ts.map +1 -1
  1150. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.js +10 -1
  1151. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.js +21 -0
  1152. package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.d.ts.map +1 -1
  1153. package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.js +33 -1
  1154. package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.d.ts.map +1 -1
  1155. package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.js +63 -2
  1156. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidency.d.ts.map +1 -1
  1157. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidency.js +14 -1
  1158. package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.d.ts +17 -0
  1159. package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.d.ts.map +1 -1
  1160. package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.js +39 -0
  1161. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.d.ts.map +1 -1
  1162. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.js +7 -0
  1163. package/src/shade/renderer/global_illumination/brick4/gpu/encoding/v1/chunk_brick4_sh3_color_decode.d.ts.map +1 -1
  1164. package/src/shade/renderer/global_illumination/brick4/gpu/encoding/v1/chunk_brick4_sh3_color_decode.js +23 -2
  1165. package/src/shade/renderer/global_illumination/brick4/gpu/encoding/v1/chunk_brick4_sh3_color_decode_from_storage.d.ts.map +1 -1
  1166. package/src/shade/renderer/global_illumination/brick4/gpu/encoding/v1/chunk_brick4_sh3_color_decode_from_storage.js +22 -1
  1167. package/src/shade/renderer/global_illumination/brick4/gpu/encoding/v1/chunk_brick4_sh3_color_encode.d.ts.map +1 -1
  1168. package/src/shade/renderer/global_illumination/brick4/gpu/encoding/v1/chunk_brick4_sh3_color_encode.js +23 -2
  1169. package/src/shade/renderer/global_illumination/brick4/gpu/encoding/v1/chunk_brick4_sh3_color_encode_to_storage.d.ts.map +1 -1
  1170. package/src/shade/renderer/global_illumination/brick4/gpu/encoding/v1/chunk_brick4_sh3_color_encode_to_storage.js +22 -1
  1171. package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.d.ts +2 -1
  1172. package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.d.ts.map +1 -1
  1173. package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.js +12 -53
  1174. package/src/shade/renderer/global_illumination/probe/octahedral/GPUProbeAtlas.d.ts.map +1 -1
  1175. package/src/shade/renderer/global_illumination/probe/octahedral/GPUProbeAtlas.js +12 -3
  1176. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.d.ts.map +1 -1
  1177. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.js +2 -1
  1178. package/src/shade/renderer/global_illumination/probe/octahedral/sample/chunk_lpv_atlas_patch_texel_coord.d.ts +17 -0
  1179. package/src/shade/renderer/global_illumination/probe/octahedral/sample/chunk_lpv_atlas_patch_texel_coord.d.ts.map +1 -0
  1180. package/src/shade/renderer/global_illumination/probe/octahedral/sample/chunk_lpv_atlas_patch_texel_coord.js +38 -0
  1181. package/src/shade/renderer/global_illumination/probe/octahedral/sample/chunk_lpv_atlas_read_patch_texel.d.ts.map +1 -1
  1182. package/src/shade/renderer/global_illumination/probe/octahedral/sample/chunk_lpv_atlas_read_patch_texel.js +16 -10
  1183. package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.d.ts +1 -1
  1184. package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.d.ts.map +1 -1
  1185. package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.js +25 -14
  1186. package/src/shade/renderer/gpu_primitive/indirect/NOTES.md +94 -0
  1187. package/src/shade/renderer/gpu_primitive/indirect/WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION.d.ts +10 -7
  1188. package/src/shade/renderer/gpu_primitive/indirect/WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION.d.ts.map +1 -1
  1189. package/src/shade/renderer/gpu_primitive/indirect/WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION.js +10 -7
  1190. package/src/shade/renderer/light/GPULightCollection.d.ts.map +1 -1
  1191. package/src/shade/renderer/light/GPULightCollection.js +22 -1
  1192. package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.d.ts.map +1 -1
  1193. package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.js +26 -0
  1194. package/src/shade/renderer/light/cluster/chunk_cluster_keep_smallest.d.ts +21 -0
  1195. package/src/shade/renderer/light/cluster/chunk_cluster_keep_smallest.d.ts.map +1 -0
  1196. package/src/shade/renderer/light/cluster/chunk_cluster_keep_smallest.js +47 -0
  1197. package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.d.ts.map +1 -1
  1198. package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.js +12 -8
  1199. package/src/shade/renderer/light/environment/equirectangular_zenith_first_direction_to_uv.d.ts +36 -0
  1200. package/src/shade/renderer/light/environment/equirectangular_zenith_first_direction_to_uv.d.ts.map +1 -0
  1201. package/src/shade/renderer/light/environment/equirectangular_zenith_first_direction_to_uv.js +41 -0
  1202. package/src/shade/renderer/light/environment/execute_filter_environment_map.d.ts.map +1 -1
  1203. package/src/shade/renderer/light/environment/execute_filter_environment_map.js +17 -1
  1204. package/src/shade/renderer/light/environment/octahedral_uv_to_direction.d.ts +5 -13
  1205. package/src/shade/renderer/light/environment/octahedral_uv_to_direction.d.ts.map +1 -1
  1206. package/src/shade/renderer/light/environment/octahedral_uv_to_direction.js +10 -30
  1207. package/src/shade/renderer/light/environment/octahedral_z_pole_uv_to_direction.d.ts +31 -0
  1208. package/src/shade/renderer/light/environment/octahedral_z_pole_uv_to_direction.d.ts.map +1 -0
  1209. package/src/shade/renderer/light/environment/octahedral_z_pole_uv_to_direction.js +45 -0
  1210. package/src/shade/renderer/light/environment/resample_cube_to_octahedral.js +2 -2
  1211. package/src/shade/renderer/light/environment/resample_equirectangular_to_octahedral.d.ts.map +1 -1
  1212. package/src/shade/renderer/light/environment/resample_equirectangular_to_octahedral.js +11 -8
  1213. package/src/shade/renderer/light/environment/rgbe/RGBE_ReadPixels_RLE.d.ts.map +1 -1
  1214. package/src/shade/renderer/light/environment/rgbe/RGBE_ReadPixels_RLE.js +7 -1
  1215. package/src/shade/renderer/light/model/SpotLight.d.ts +10 -1
  1216. package/src/shade/renderer/light/model/SpotLight.d.ts.map +1 -1
  1217. package/src/shade/renderer/light/model/SpotLight.js +11 -3
  1218. package/src/shade/renderer/light/model/io/light_record_directional.d.ts.map +1 -1
  1219. package/src/shade/renderer/light/model/io/light_record_directional.js +3 -1
  1220. package/src/shade/renderer/light/model/io/light_record_point.d.ts.map +1 -1
  1221. package/src/shade/renderer/light/model/io/light_record_point.js +3 -1
  1222. package/src/shade/renderer/light/model/io/light_record_spot.d.ts.map +1 -1
  1223. package/src/shade/renderer/light/model/io/light_record_spot.js +3 -1
  1224. package/src/shade/renderer/lightmap/GPULightMap.d.ts.map +1 -1
  1225. package/src/shade/renderer/lightmap/GPULightMap.js +349 -336
  1226. package/src/shade/renderer/loader/gltf/gltf_base_url.d.ts +20 -0
  1227. package/src/shade/renderer/loader/gltf/gltf_base_url.d.ts.map +1 -0
  1228. package/src/shade/renderer/loader/gltf/gltf_base_url.js +27 -0
  1229. package/src/shade/renderer/loader/gltf/gltf_create_material.d.ts.map +1 -1
  1230. package/src/shade/renderer/loader/gltf/gltf_create_material.js +50 -10
  1231. package/src/shade/renderer/loader/gltf/load_gltf.d.ts +4 -0
  1232. package/src/shade/renderer/loader/gltf/load_gltf.d.ts.map +1 -1
  1233. package/src/shade/renderer/loader/gltf/load_gltf.js +1109 -1128
  1234. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  1235. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts.map +1 -1
  1236. package/src/shade/renderer/loader/gltf/tiny-gltf.js +843 -843
  1237. package/src/shade/renderer/material/GPUMaterialContext.d.ts +63 -26
  1238. package/src/shade/renderer/material/GPUMaterialContext.d.ts.map +1 -1
  1239. package/src/shade/renderer/material/GPUMaterialContext.js +255 -390
  1240. package/src/shade/renderer/material/GPUMaterialManager.d.ts +51 -1
  1241. package/src/shade/renderer/material/GPUMaterialManager.d.ts.map +1 -1
  1242. package/src/shade/renderer/material/GPUMaterialManager.js +345 -91
  1243. package/src/shade/renderer/material/ShadeMaterial.d.ts +21 -0
  1244. package/src/shade/renderer/material/ShadeMaterial.d.ts.map +1 -1
  1245. package/src/shade/renderer/material/ShadeMaterial.js +31 -0
  1246. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts.map +1 -1
  1247. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.js +25 -6
  1248. package/src/shade/renderer/material/standard/SHADING_MATERIAL_RESOURCE_GROUP.d.ts +10 -0
  1249. package/src/shade/renderer/material/standard/SHADING_MATERIAL_RESOURCE_GROUP.d.ts.map +1 -1
  1250. package/src/shade/renderer/material/standard/SHADING_MATERIAL_RESOURCE_GROUP.js +14 -2
  1251. package/src/shade/renderer/material/standard/STANDARD_MATERIAL_TEMPLATE.d.ts +12 -0
  1252. package/src/shade/renderer/material/standard/STANDARD_MATERIAL_TEMPLATE.d.ts.map +1 -0
  1253. package/src/shade/renderer/material/standard/STANDARD_MATERIAL_TEMPLATE.js +166 -0
  1254. package/src/shade/renderer/material/standard/VT_MATERIAL_TEMPLATE.d.ts +10 -0
  1255. package/src/shade/renderer/material/standard/VT_MATERIAL_TEMPLATE.d.ts.map +1 -0
  1256. package/src/shade/renderer/material/standard/VT_MATERIAL_TEMPLATE.js +141 -0
  1257. package/src/shade/renderer/material/standard/chunk_standard_material_surface.d.ts +29 -0
  1258. package/src/shade/renderer/material/standard/chunk_standard_material_surface.d.ts.map +1 -0
  1259. package/src/shade/renderer/material/standard/chunk_standard_material_surface.js +92 -0
  1260. package/src/shade/renderer/material/standard/fragment_gbuffer.d.ts +74 -28
  1261. package/src/shade/renderer/material/standard/fragment_gbuffer.d.ts.map +1 -1
  1262. package/src/shade/renderer/material/standard/fragment_gbuffer.js +165 -67
  1263. package/src/shade/renderer/material/standard/fragment_gbuffer_vt.d.ts +27 -18
  1264. package/src/shade/renderer/material/standard/fragment_gbuffer_vt.d.ts.map +1 -1
  1265. package/src/shade/renderer/material/standard/fragment_gbuffer_vt.js +70 -91
  1266. package/src/shade/renderer/material/standard/material_gbuffer_vertex.d.ts +9 -6
  1267. package/src/shade/renderer/material/standard/material_gbuffer_vertex.d.ts.map +1 -1
  1268. package/src/shade/renderer/material/standard/material_gbuffer_vertex.js +13 -14
  1269. package/src/shade/renderer/material/template/GPUMaterialServices.d.ts +73 -0
  1270. package/src/shade/renderer/material/template/GPUMaterialServices.d.ts.map +1 -0
  1271. package/src/shade/renderer/material/template/GPUMaterialServices.js +79 -0
  1272. package/src/shade/renderer/material/template/ShadeMaterialTemplate.d.ts +170 -0
  1273. package/src/shade/renderer/material/template/ShadeMaterialTemplate.d.ts.map +1 -0
  1274. package/src/shade/renderer/material/template/ShadeMaterialTemplate.js +234 -0
  1275. package/src/shade/renderer/material/template/chunk_material_surface.d.ts +47 -0
  1276. package/src/shade/renderer/material/template/chunk_material_surface.d.ts.map +1 -0
  1277. package/src/shade/renderer/material/template/chunk_material_surface.js +116 -0
  1278. package/src/shade/renderer/material/template/flat_material_template_spec_support.d.ts +22 -0
  1279. package/src/shade/renderer/material/template/flat_material_template_spec_support.d.ts.map +1 -0
  1280. package/src/shade/renderer/material/template/flat_material_template_spec_support.js +78 -0
  1281. package/src/shade/renderer/material/template/material_metadata_neutral.d.ts +15 -0
  1282. package/src/shade/renderer/material/template/material_metadata_neutral.d.ts.map +1 -0
  1283. package/src/shade/renderer/material/template/material_metadata_neutral.js +46 -0
  1284. package/src/shade/renderer/material/template/material_template_of.d.ts +10 -0
  1285. package/src/shade/renderer/material/template/material_template_of.d.ts.map +1 -0
  1286. package/src/shade/renderer/material/template/material_template_of.js +20 -0
  1287. package/src/shade/renderer/object_property/chunk_write_object_property.d.ts +5 -0
  1288. package/src/shade/renderer/object_property/chunk_write_object_property.d.ts.map +1 -1
  1289. package/src/shade/renderer/object_property/chunk_write_object_property.js +7 -1
  1290. package/src/shade/renderer/object_property/chunk_write_object_property_node3d.d.ts +7 -1
  1291. package/src/shade/renderer/object_property/chunk_write_object_property_node3d.d.ts.map +1 -1
  1292. package/src/shade/renderer/object_property/chunk_write_object_property_node3d.js +9 -2
  1293. package/src/shade/renderer/particles/DESIGN.md +21 -5
  1294. package/src/shade/renderer/particles/GPUParticleSystem.d.ts +25 -10
  1295. package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
  1296. package/src/shade/renderer/particles/GPUParticleSystem.js +182 -38
  1297. package/src/shade/renderer/particles/data/PARTICLE_DATABASE_SPEC.d.ts.map +1 -1
  1298. package/src/shade/renderer/particles/data/PARTICLE_DATABASE_SPEC.js +81 -68
  1299. package/src/shade/renderer/particles/graph/groups/simplex_reference.d.ts.map +1 -1
  1300. package/src/shade/renderer/particles/graph/groups/simplex_reference.js +16 -10
  1301. package/src/shade/renderer/particles/graph_particles.d.ts +4 -2
  1302. package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
  1303. package/src/shade/renderer/particles/graph_particles.js +8 -2
  1304. package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts +22 -3
  1305. package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts.map +1 -1
  1306. package/src/shade/renderer/particles/isa/ParticleVMISA.js +30 -3
  1307. package/src/shade/renderer/particles/isa/particle_assembly.js +41 -1
  1308. package/src/shade/renderer/particles/optimizer/particle_program_analysis.d.ts +7 -1
  1309. package/src/shade/renderer/particles/optimizer/particle_program_analysis.d.ts.map +1 -1
  1310. package/src/shade/renderer/particles/optimizer/particle_program_analysis.js +23 -17
  1311. package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts.map +1 -1
  1312. package/src/shade/renderer/particles/optimizer/particle_vm_semantics.js +8 -2
  1313. package/src/shade/renderer/particles/optimizer/pass_allocate_registers.js +1 -1
  1314. package/src/shade/renderer/particles/optimizer/pass_fold_constants.d.ts.map +1 -1
  1315. package/src/shade/renderer/particles/optimizer/pass_fold_constants.js +20 -13
  1316. package/src/shade/renderer/particles/optimizer/pass_inline_constants.d.ts.map +1 -1
  1317. package/src/shade/renderer/particles/optimizer/pass_inline_constants.js +4 -3
  1318. package/src/shade/renderer/particles/optimizer/pass_narrow_widths.d.ts.map +1 -1
  1319. package/src/shade/renderer/particles/optimizer/pass_narrow_widths.js +1 -1
  1320. package/src/shade/renderer/particles/optimizer/pass_pack_registers.d.ts.map +1 -1
  1321. package/src/shade/renderer/particles/optimizer/pass_pack_registers.js +12 -4
  1322. package/src/shade/renderer/particles/optimizer/pass_peephole.d.ts.map +1 -1
  1323. package/src/shade/renderer/particles/optimizer/pass_peephole.js +11 -10
  1324. package/src/shade/renderer/particles/optimizer/pass_propagate_copies.d.ts.map +1 -1
  1325. package/src/shade/renderer/particles/optimizer/pass_propagate_copies.js +12 -10
  1326. package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.d.ts.map +1 -1
  1327. package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.js +12 -4
  1328. package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts.map +1 -1
  1329. package/src/shade/renderer/particles/runtime/ParticleEmitter.js +7 -0
  1330. package/src/shade/renderer/particles/shaders/chunk_particle_avboit_contribution.d.ts +4 -0
  1331. package/src/shade/renderer/particles/shaders/chunk_particle_avboit_contribution.d.ts.map +1 -1
  1332. package/src/shade/renderer/particles/shaders/chunk_particle_avboit_contribution.js +47 -88
  1333. package/src/shade/renderer/particles/shaders/shader_particle_avboit_occupancy.d.ts.map +1 -1
  1334. package/src/shade/renderer/particles/shaders/shader_particle_avboit_occupancy.js +22 -68
  1335. package/src/shade/renderer/particles/shaders/shader_particle_avboit_splat.d.ts.map +1 -1
  1336. package/src/shade/renderer/particles/shaders/shader_particle_avboit_splat.js +5 -3
  1337. package/src/shade/renderer/particles/shaders/shader_particle_init_free_list.d.ts +31 -0
  1338. package/src/shade/renderer/particles/shaders/shader_particle_init_free_list.d.ts.map +1 -0
  1339. package/src/shade/renderer/particles/shaders/shader_particle_init_free_list.js +62 -0
  1340. package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts +13 -0
  1341. package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts.map +1 -1
  1342. package/src/shade/renderer/particles/vm/ParticleVMReference.js +112 -18
  1343. package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.d.ts.map +1 -1
  1344. package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.js +12 -2
  1345. package/src/shade/renderer/postprocess/TemporalJitterSequence.d.ts +44 -0
  1346. package/src/shade/renderer/postprocess/TemporalJitterSequence.d.ts.map +1 -0
  1347. package/src/shade/renderer/postprocess/TemporalJitterSequence.js +104 -0
  1348. package/src/shade/renderer/postprocess/chunk_find_nearest_depth.d.ts +25 -0
  1349. package/src/shade/renderer/postprocess/chunk_find_nearest_depth.d.ts.map +1 -0
  1350. package/src/shade/renderer/postprocess/chunk_find_nearest_depth.js +74 -0
  1351. package/src/shade/renderer/postprocess/denoise/shader_temporal_reprojection_luma.d.ts.map +1 -1
  1352. package/src/shade/renderer/postprocess/denoise/shader_temporal_reprojection_luma.js +19 -4
  1353. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_recombine.d.ts.map +1 -1
  1354. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_recombine.js +12 -1
  1355. package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.d.ts.map +1 -1
  1356. package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.js +8 -0
  1357. package/src/shade/renderer/postprocess/eye/shader_autoexposure_adapt.d.ts.map +1 -1
  1358. package/src/shade/renderer/postprocess/eye/shader_autoexposure_adapt.js +18 -3
  1359. package/src/shade/renderer/postprocess/eye/shader_autoexposure_read_histogram.d.ts.map +1 -1
  1360. package/src/shade/renderer/postprocess/eye/shader_autoexposure_read_histogram.js +17 -4
  1361. package/src/shade/renderer/postprocess/gtao/GTAO_CONSTANTS.d.ts +29 -0
  1362. package/src/shade/renderer/postprocess/gtao/GTAO_CONSTANTS.d.ts.map +1 -0
  1363. package/src/shade/renderer/postprocess/gtao/GTAO_CONSTANTS.js +69 -0
  1364. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.d.ts +4 -16
  1365. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.d.ts.map +1 -1
  1366. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.js +10 -52
  1367. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.d.ts +0 -16
  1368. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.d.ts.map +1 -1
  1369. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.js +23 -55
  1370. package/src/shade/renderer/postprocess/motion_blur/MotionBlur.d.ts +4 -1
  1371. package/src/shade/renderer/postprocess/motion_blur/MotionBlur.d.ts.map +1 -1
  1372. package/src/shade/renderer/postprocess/motion_blur/MotionBlur.js +4 -1
  1373. package/src/shade/renderer/postprocess/motion_blur/chunk_motion_blur_resolution.d.ts +18 -0
  1374. package/src/shade/renderer/postprocess/motion_blur/chunk_motion_blur_resolution.d.ts.map +1 -0
  1375. package/src/shade/renderer/postprocess/motion_blur/chunk_motion_blur_resolution.js +43 -0
  1376. package/src/shade/renderer/postprocess/motion_blur/graph_postprocess_motion_blur.d.ts +5 -1
  1377. package/src/shade/renderer/postprocess/motion_blur/graph_postprocess_motion_blur.d.ts.map +1 -1
  1378. package/src/shade/renderer/postprocess/motion_blur/graph_postprocess_motion_blur.js +12 -2
  1379. package/src/shade/renderer/postprocess/motion_blur/shader_motion_blur_reconstruct.d.ts.map +1 -1
  1380. package/src/shade/renderer/postprocess/motion_blur/shader_motion_blur_reconstruct.js +33 -6
  1381. package/src/shade/renderer/postprocess/nss/NSS.d.ts +16 -8
  1382. package/src/shade/renderer/postprocess/nss/NSS.d.ts.map +1 -1
  1383. package/src/shade/renderer/postprocess/nss/NSS.js +37 -35
  1384. package/src/shade/renderer/postprocess/nss/chunk_nss_find_nearest_depth.d.ts +2 -2
  1385. package/src/shade/renderer/postprocess/nss/chunk_nss_find_nearest_depth.d.ts.map +1 -1
  1386. package/src/shade/renderer/postprocess/nss/chunk_nss_find_nearest_depth.js +28 -61
  1387. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.d.ts.map +1 -1
  1388. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.js +296 -291
  1389. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.d.ts.map +1 -1
  1390. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.js +13 -0
  1391. package/src/shade/renderer/postprocess/ssr/SSR.d.ts.map +1 -1
  1392. package/src/shade/renderer/postprocess/ssr/SSR.js +9 -7
  1393. package/src/shade/renderer/postprocess/ssr/depth_max_shader.d.ts +14 -0
  1394. package/src/shade/renderer/postprocess/ssr/depth_max_shader.d.ts.map +1 -1
  1395. package/src/shade/renderer/postprocess/ssr/depth_max_shader.js +53 -25
  1396. package/src/shade/renderer/postprocess/ssr/graph_build_depth_max_pyramid.d.ts +11 -1
  1397. package/src/shade/renderer/postprocess/ssr/graph_build_depth_max_pyramid.d.ts.map +1 -1
  1398. package/src/shade/renderer/postprocess/ssr/graph_build_depth_max_pyramid.js +11 -1
  1399. package/src/shade/renderer/postprocess/ssr/prefilter/NOTES.md +46 -0
  1400. package/src/shade/renderer/postprocess/ssr/prefilter/shader_ssr_prefilter.d.ts.map +1 -1
  1401. package/src/shade/renderer/postprocess/ssr/prefilter/shader_ssr_prefilter.js +7 -0
  1402. package/src/shade/renderer/postprocess/ssr/shader/chunk_ssr_depth_thickness.d.ts +32 -0
  1403. package/src/shade/renderer/postprocess/ssr/shader/chunk_ssr_depth_thickness.d.ts.map +1 -0
  1404. package/src/shade/renderer/postprocess/ssr/shader/chunk_ssr_depth_thickness.js +41 -0
  1405. package/src/shade/renderer/postprocess/ssr/ssr_trace_shader.d.ts.map +1 -1
  1406. package/src/shade/renderer/postprocess/ssr/ssr_trace_shader.js +11 -6
  1407. package/src/shade/renderer/postprocess/taa/TAA.d.ts +13 -4
  1408. package/src/shade/renderer/postprocess/taa/TAA.d.ts.map +1 -1
  1409. package/src/shade/renderer/postprocess/taa/TAA.js +29 -48
  1410. package/src/shade/renderer/postprocess/taa/chunk_taa_tonemap.d.ts +11 -0
  1411. package/src/shade/renderer/postprocess/taa/chunk_taa_tonemap.d.ts.map +1 -1
  1412. package/src/shade/renderer/postprocess/taa/chunk_taa_tonemap.js +25 -4
  1413. package/src/shade/renderer/postprocess/taa/shader_depth_occlusion_clip.d.ts +8 -0
  1414. package/src/shade/renderer/postprocess/taa/shader_depth_occlusion_clip.d.ts.map +1 -1
  1415. package/src/shade/renderer/postprocess/taa/shader_depth_occlusion_clip.js +14 -42
  1416. package/src/shade/renderer/rasterize/RasterizationJob.d.ts +4 -2
  1417. package/src/shade/renderer/rasterize/RasterizationJob.d.ts.map +1 -1
  1418. package/src/shade/renderer/rasterize/RasterizationJob.js +3 -1
  1419. package/src/shade/renderer/rasterize/TemplatePassDescriptor.d.ts +57 -0
  1420. package/src/shade/renderer/rasterize/TemplatePassDescriptor.d.ts.map +1 -0
  1421. package/src/shade/renderer/rasterize/TemplatePassDescriptor.js +133 -0
  1422. package/src/shade/renderer/rasterize/bucket/construct_primitive_state.d.ts.map +1 -1
  1423. package/src/shade/renderer/rasterize/bucket/construct_primitive_state.js +17 -0
  1424. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  1425. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +30 -4
  1426. package/src/shade/renderer/rasterize/bucket/rasterization_has_opaque_bucket.d.ts +21 -0
  1427. package/src/shade/renderer/rasterize/bucket/rasterization_has_opaque_bucket.d.ts.map +1 -0
  1428. package/src/shade/renderer/rasterize/bucket/rasterization_has_opaque_bucket.js +28 -0
  1429. package/src/shade/renderer/rasterize/bucket/shader_count_meshlets_by_material.d.ts.map +1 -1
  1430. package/src/shade/renderer/rasterize/bucket/shader_count_meshlets_by_material.js +74 -68
  1431. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts.map +1 -1
  1432. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js +11 -1
  1433. package/src/shade/renderer/rasterize/bucket/shader_sort_meshlets_by_material.d.ts.map +1 -1
  1434. package/src/shade/renderer/rasterize/bucket/shader_sort_meshlets_by_material.js +70 -64
  1435. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way.d.ts.map +1 -1
  1436. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way.js +3 -4
  1437. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.d.ts.map +1 -1
  1438. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js +8 -2
  1439. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.d.ts.map +1 -1
  1440. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.js +3 -4
  1441. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
  1442. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +7 -5
  1443. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.d.ts.map +1 -1
  1444. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.js +3 -4
  1445. package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.d.ts.map +1 -1
  1446. package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.js +3 -4
  1447. package/src/shade/renderer/rasterize/expand/mesh/shader_prefix_sum_to_command.d.ts.map +1 -1
  1448. package/src/shade/renderer/rasterize/expand/mesh/shader_prefix_sum_to_command.js +5 -2
  1449. package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.d.ts.map +1 -1
  1450. package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.js +3 -4
  1451. package/src/shade/renderer/rasterize/fast/graph_rasterize_scene_fast.d.ts.map +1 -1
  1452. package/src/shade/renderer/rasterize/fast/graph_rasterize_scene_fast.js +19 -2
  1453. package/src/shade/renderer/rasterize/forward/SHADING_SCENE_RESOURCE_GROUP.d.ts +20 -0
  1454. package/src/shade/renderer/rasterize/forward/SHADING_SCENE_RESOURCE_GROUP.d.ts.map +1 -1
  1455. package/src/shade/renderer/rasterize/forward/SHADING_SCENE_RESOURCE_GROUP.js +25 -0
  1456. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_brick4.d.ts.map +1 -1
  1457. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_brick4.js +2 -1
  1458. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_ibl.d.ts.map +1 -1
  1459. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_ibl.js +2 -1
  1460. package/src/shade/renderer/rasterize/forward/forward_template_pipeline.d.ts +40 -0
  1461. package/src/shade/renderer/rasterize/forward/forward_template_pipeline.d.ts.map +1 -0
  1462. package/src/shade/renderer/rasterize/forward/forward_template_pipeline.js +86 -0
  1463. package/src/shade/renderer/rasterize/forward/vertex_shader_chunk.d.ts +11 -0
  1464. package/src/shade/renderer/rasterize/forward/vertex_shader_chunk.d.ts.map +1 -1
  1465. package/src/shade/renderer/rasterize/forward/vertex_shader_chunk.js +13 -2
  1466. package/src/shade/renderer/rasterize/native/alpha_tested_pass_resources.d.ts +59 -1
  1467. package/src/shade/renderer/rasterize/native/alpha_tested_pass_resources.d.ts.map +1 -1
  1468. package/src/shade/renderer/rasterize/native/alpha_tested_pass_resources.js +109 -7
  1469. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts +16 -1
  1470. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -1
  1471. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +13 -1
  1472. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_LEDGER.md +247 -0
  1473. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_PLAN_2026_09_03.md +20 -2
  1474. package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.js +1 -1
  1475. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_coverage.d.ts +17 -0
  1476. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_coverage.d.ts.map +1 -0
  1477. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_coverage.js +25 -0
  1478. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_fold_pairs.d.ts +4 -5
  1479. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_fold_pairs.d.ts.map +1 -1
  1480. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_fold_pairs.js +7 -6
  1481. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_mark.d.ts +17 -0
  1482. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_mark.d.ts.map +1 -0
  1483. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_mark.js +51 -0
  1484. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_premultiplied_contribution.d.ts +23 -0
  1485. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_premultiplied_contribution.d.ts.map +1 -0
  1486. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_premultiplied_contribution.js +77 -0
  1487. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts.map +1 -1
  1488. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +16 -20
  1489. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_brick4.d.ts +8 -2
  1490. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_brick4.d.ts.map +1 -1
  1491. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_brick4.js +57 -43
  1492. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_ibl.d.ts +8 -2
  1493. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_ibl.d.ts.map +1 -1
  1494. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_ibl.js +57 -43
  1495. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_occupancy.d.ts.map +1 -1
  1496. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_occupancy.js +8 -2
  1497. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.d.ts +7 -2
  1498. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.d.ts.map +1 -1
  1499. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.js +67 -58
  1500. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_alpha_tested_pass_descriptor.d.ts +8 -2
  1501. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_alpha_tested_pass_descriptor.d.ts.map +1 -1
  1502. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_alpha_tested_pass_descriptor.js +186 -156
  1503. package/src/shade/renderer/rasterize/native/graph_rasterize_meshes_alpha_tested.d.ts +2 -2
  1504. package/src/shade/renderer/rasterize/native/graph_rasterize_meshes_alpha_tested.d.ts.map +1 -1
  1505. package/src/shade/renderer/rasterize/native/graph_rasterize_meshes_alpha_tested.js +36 -28
  1506. package/src/shade/renderer/rasterize/native/material_draw_indirect.d.ts +14 -12
  1507. package/src/shade/renderer/rasterize/native/material_draw_indirect.d.ts.map +1 -1
  1508. package/src/shade/renderer/rasterize/native/material_draw_indirect.js +29 -23
  1509. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.d.ts.map +1 -1
  1510. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +16 -22
  1511. package/src/shade/renderer/rasterize/native/oit/oit_resolve_fragment_body.d.ts +33 -0
  1512. package/src/shade/renderer/rasterize/native/oit/oit_resolve_fragment_body.d.ts.map +1 -0
  1513. package/src/shade/renderer/rasterize/native/oit/oit_resolve_fragment_body.js +123 -0
  1514. package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.d.ts +7 -2
  1515. package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.d.ts.map +1 -1
  1516. package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.js +227 -218
  1517. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.d.ts +8 -2
  1518. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.d.ts.map +1 -1
  1519. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.js +112 -180
  1520. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments_ibl.d.ts +8 -2
  1521. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments_ibl.d.ts.map +1 -1
  1522. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments_ibl.js +110 -178
  1523. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.d.ts +7 -2
  1524. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.d.ts.map +1 -1
  1525. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.js +242 -204
  1526. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts.map +1 -1
  1527. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +19 -2
  1528. package/src/shade/renderer/restir/reservoir/shader.d.ts.map +1 -1
  1529. package/src/shade/renderer/restir/reservoir/shader.js +27 -1
  1530. package/src/shade/renderer/scene/GPUSceneContext.d.ts +2 -1
  1531. package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
  1532. package/src/shade/renderer/scene/GPUSceneContext.js +11 -9
  1533. package/src/shade/renderer/scene/SCENE_DATABASE_SPEC.js +22 -0
  1534. package/src/shade/renderer/scene/SceneManager.d.ts +10 -0
  1535. package/src/shade/renderer/scene/SceneManager.d.ts.map +1 -1
  1536. package/src/shade/renderer/scene/SceneManager.js +17 -0
  1537. package/src/shade/renderer/scene/rows/GPUEntityBoundsReadback.d.ts.map +1 -1
  1538. package/src/shade/renderer/scene/rows/GPUEntityBoundsReadback.js +164 -144
  1539. package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts +10 -0
  1540. package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts.map +1 -1
  1541. package/src/shade/renderer/scene/rows/GPUSceneRows.js +14 -0
  1542. package/src/shade/renderer/scene/serialization/serialize_scene.d.ts.map +1 -1
  1543. package/src/shade/renderer/scene/serialization/serialize_scene.js +2 -6
  1544. package/src/shade/renderer/shader/ComputeShader.d.ts +5 -0
  1545. package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
  1546. package/src/shade/renderer/shader/ComputeShader.js +358 -353
  1547. package/src/shade/renderer/shader/chunk/atmosphere/chunk_integrate_scattering.d.ts.map +1 -1
  1548. package/src/shade/renderer/shader/chunk/atmosphere/chunk_integrate_scattering.js +15 -1
  1549. package/src/shade/renderer/shader/chunk/binary/chunk_encode_f16.d.ts +11 -2
  1550. package/src/shade/renderer/shader/chunk/binary/chunk_encode_f16.d.ts.map +1 -1
  1551. package/src/shade/renderer/shader/chunk/binary/chunk_encode_f16.js +33 -13
  1552. package/src/shade/renderer/shader/chunk/brdf/chunk_D_GGX.d.ts.map +1 -1
  1553. package/src/shade/renderer/shader/chunk/brdf/chunk_D_GGX.js +31 -3
  1554. package/src/shade/renderer/shader/chunk/bvh/morton/chunk_decode32_morton2.d.ts +10 -1
  1555. package/src/shade/renderer/shader/chunk/bvh/morton/chunk_decode32_morton2.d.ts.map +1 -1
  1556. package/src/shade/renderer/shader/chunk/bvh/morton/chunk_decode32_morton2.js +23 -8
  1557. package/src/shade/renderer/shader/chunk/camera/chunk_pixel_radius_to_world.d.ts +8 -1
  1558. package/src/shade/renderer/shader/chunk/camera/chunk_pixel_radius_to_world.d.ts.map +1 -1
  1559. package/src/shade/renderer/shader/chunk/camera/chunk_pixel_radius_to_world.js +12 -5
  1560. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_distance_to_ray.d.ts +15 -1
  1561. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_distance_to_ray.d.ts.map +1 -1
  1562. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_distance_to_ray.js +24 -28
  1563. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_distance_to_ray_v2.d.ts +5 -0
  1564. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_distance_to_ray_v2.d.ts.map +1 -1
  1565. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_distance_to_ray_v2.js +18 -13
  1566. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_intersects_ray.d.ts.map +1 -1
  1567. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_intersects_ray.js +1 -47
  1568. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_raycast.d.ts +10 -0
  1569. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_raycast.d.ts.map +1 -1
  1570. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_raycast.js +23 -8
  1571. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_raycast_positive.d.ts +7 -0
  1572. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_raycast_positive.d.ts.map +1 -1
  1573. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_raycast_positive.js +12 -25
  1574. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_slab_span.d.ts +32 -0
  1575. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_slab_span.d.ts.map +1 -0
  1576. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_slab_span.js +52 -0
  1577. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_view_depth_range.d.ts +20 -0
  1578. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_view_depth_range.d.ts.map +1 -0
  1579. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_view_depth_range.js +42 -0
  1580. package/src/shade/renderer/shader/chunk/geometry/octahedron/chunk_octahedral_uv_wrap.d.ts +10 -1
  1581. package/src/shade/renderer/shader/chunk/geometry/octahedron/chunk_octahedral_uv_wrap.d.ts.map +1 -1
  1582. package/src/shade/renderer/shader/chunk/geometry/octahedron/chunk_octahedral_uv_wrap.js +18 -3
  1583. package/src/shade/renderer/shader/chunk/geometry/quaternion/chunk_quat_encode_u32.d.ts.map +1 -1
  1584. package/src/shade/renderer/shader/chunk/geometry/quaternion/chunk_quat_encode_u32.js +8 -4
  1585. package/src/shade/renderer/shader/chunk/grid/chunk_folded_workgroup_index.d.ts +24 -0
  1586. package/src/shade/renderer/shader/chunk/grid/chunk_folded_workgroup_index.d.ts.map +1 -0
  1587. package/src/shade/renderer/shader/chunk/grid/chunk_folded_workgroup_index.js +36 -0
  1588. package/src/shade/renderer/shader/chunk/grid/chunk_grid3d_to_index.d.ts +6 -0
  1589. package/src/shade/renderer/shader/chunk/grid/chunk_grid3d_to_index.d.ts.map +1 -1
  1590. package/src/shade/renderer/shader/chunk/grid/chunk_grid3d_to_index.js +6 -0
  1591. package/src/shade/renderer/shader/chunk/light/INCIDENT_LIGHT_STRUCT.d.ts.map +1 -1
  1592. package/src/shade/renderer/shader/chunk/light/INCIDENT_LIGHT_STRUCT.js +6 -1
  1593. package/src/shade/renderer/shader/chunk/light/io/chunk_get_spot_light_info.d.ts.map +1 -1
  1594. package/src/shade/renderer/shader/chunk/light/io/chunk_get_spot_light_info.js +6 -1
  1595. package/src/shade/renderer/shader/chunk/material/chunk_albedo_unpremultiply.d.ts +24 -0
  1596. package/src/shade/renderer/shader/chunk/material/chunk_albedo_unpremultiply.d.ts.map +1 -0
  1597. package/src/shade/renderer/shader/chunk/material/chunk_albedo_unpremultiply.js +31 -0
  1598. package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg2d.js +2 -2
  1599. package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg3d16.js +1 -1
  1600. package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg4d.js +1 -1
  1601. package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_validate_hit.d.ts.map +1 -1
  1602. package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_validate_hit.js +8 -4
  1603. package/src/shade/renderer/shader/chunk/sdf/chunk_mesh_sdf_soft_shadow.d.ts.map +1 -1
  1604. package/src/shade/renderer/shader/chunk/sdf/chunk_mesh_sdf_soft_shadow.js +17 -3
  1605. package/src/shade/renderer/shader/graph/compute/graph_compute_indirect_pass.d.ts +4 -0
  1606. package/src/shade/renderer/shader/graph/compute/graph_compute_indirect_pass.d.ts.map +1 -1
  1607. package/src/shade/renderer/shader/graph/compute/graph_compute_indirect_pass.js +4 -0
  1608. package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts +8 -0
  1609. package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts.map +1 -1
  1610. package/src/shade/renderer/shader/pass/RenderPassDescriptor.js +203 -192
  1611. package/src/shade/renderer/shader/resource/ShaderResourceGroupDescriptor.d.ts.map +1 -1
  1612. package/src/shade/renderer/shader/resource/ShaderResourceGroupDescriptor.js +12 -0
  1613. package/src/shade/renderer/shader/type/WebGPUArray.d.ts.map +1 -1
  1614. package/src/shade/renderer/shader/type/WebGPUArray.js +25 -1
  1615. package/src/shade/renderer/shader/type/WebGPUStruct.d.ts.map +1 -1
  1616. package/src/shade/renderer/shader/type/WebGPUStruct.js +12 -0
  1617. package/src/shade/renderer/shader/type/queue_typed_buffer_update.d.ts.map +1 -1
  1618. package/src/shade/renderer/shader/type/queue_typed_buffer_update.js +15 -0
  1619. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
  1620. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +10 -9
  1621. package/src/shade/renderer/shadow/map/ShadowmapDrawSelector.d.ts +12 -2
  1622. package/src/shade/renderer/shadow/map/ShadowmapDrawSelector.d.ts.map +1 -1
  1623. package/src/shade/renderer/shadow/map/ShadowmapDrawSelector.js +210 -196
  1624. package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.d.ts +10 -3
  1625. package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.d.ts.map +1 -1
  1626. package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.js +219 -194
  1627. package/src/shade/renderer/shadow/map/shadowmap_budget_carry_over.d.ts +32 -0
  1628. package/src/shade/renderer/shadow/map/shadowmap_budget_carry_over.d.ts.map +1 -0
  1629. package/src/shade/renderer/shadow/map/shadowmap_budget_carry_over.js +47 -0
  1630. package/src/shade/renderer/shadow/vsm/VirtualShadowMap.d.ts.map +1 -1
  1631. package/src/shade/renderer/shadow/vsm/VirtualShadowMap.js +11 -1
  1632. package/src/shade/renderer/texture/ShadeTexture.d.ts +16 -0
  1633. package/src/shade/renderer/texture/ShadeTexture.d.ts.map +1 -1
  1634. package/src/shade/renderer/texture/ShadeTexture.js +17 -0
  1635. package/src/shade/renderer/texture/TextureManager.d.ts +22 -5
  1636. package/src/shade/renderer/texture/TextureManager.d.ts.map +1 -1
  1637. package/src/shade/renderer/texture/TextureManager.js +109 -6
  1638. package/src/shade/renderer/texture/bindless/GPUBindlessTextureManager.d.ts.map +1 -1
  1639. package/src/shade/renderer/texture/bindless/GPUBindlessTextureManager.js +8 -2
  1640. package/src/shade/renderer/texture/download_texture_data.d.ts.map +1 -1
  1641. package/src/shade/renderer/texture/download_texture_data.js +12 -4
  1642. package/src/shade/renderer/texture/encode/shader_texture_encode_astc_4x4.d.ts.map +1 -1
  1643. package/src/shade/renderer/texture/encode/shader_texture_encode_astc_4x4.js +66 -63
  1644. package/src/shade/renderer/texture/encode/shader_texture_encode_bc1.d.ts.map +1 -1
  1645. package/src/shade/renderer/texture/encode/shader_texture_encode_bc1.js +63 -60
  1646. package/src/shade/renderer/texture/encode/shader_texture_encode_bc4.d.ts.map +1 -1
  1647. package/src/shade/renderer/texture/encode/shader_texture_encode_bc4.js +79 -76
  1648. package/src/shade/renderer/texture/encode/shader_texture_encode_bc4_snorm.d.ts.map +1 -1
  1649. package/src/shade/renderer/texture/encode/shader_texture_encode_bc4_snorm.js +67 -64
  1650. package/src/shade/renderer/texture/encode/shader_texture_encode_bc5.d.ts.map +1 -1
  1651. package/src/shade/renderer/texture/encode/shader_texture_encode_bc5.js +70 -67
  1652. package/src/shade/renderer/texture/encode/shader_texture_encode_bc5_snorm.d.ts.map +1 -1
  1653. package/src/shade/renderer/texture/encode/shader_texture_encode_bc5_snorm.js +66 -63
  1654. package/src/shade/renderer/texture/encode/shader_texture_encode_bc6h.d.ts.map +1 -1
  1655. package/src/shade/renderer/texture/encode/shader_texture_encode_bc6h.js +65 -62
  1656. package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.d.ts.map +1 -1
  1657. package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.js +61 -58
  1658. package/src/shade/renderer/texture/format/texture_format_from_shade_image.d.ts +7 -1
  1659. package/src/shade/renderer/texture/format/texture_format_from_shade_image.d.ts.map +1 -1
  1660. package/src/shade/renderer/texture/format/texture_format_from_shade_image.js +100 -95
  1661. package/src/shade/renderer/texture/mipmaps/WebGPUMipmapGenerator.d.ts +8 -2
  1662. package/src/shade/renderer/texture/mipmaps/WebGPUMipmapGenerator.d.ts.map +1 -1
  1663. package/src/shade/renderer/texture/mipmaps/WebGPUMipmapGenerator.js +99 -73
  1664. package/src/shade/renderer/texture/mipmaps/filters/mipmap_shader_code_wronski2021.d.ts +30 -1
  1665. package/src/shade/renderer/texture/mipmaps/filters/mipmap_shader_code_wronski2021.d.ts.map +1 -1
  1666. package/src/shade/renderer/texture/mipmaps/filters/mipmap_shader_code_wronski2021.js +37 -20
  1667. package/src/shade/renderer/texture/texture_descriptor_from_texture_shade.js +73 -73
  1668. package/src/shade/renderer/view/ViewManager.d.ts +8 -0
  1669. package/src/shade/renderer/view/ViewManager.d.ts.map +1 -1
  1670. package/src/shade/renderer/view/ViewManager.js +15 -0
  1671. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
  1672. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +516 -507
  1673. package/src/shade/renderer/volumetrics/shader_volumetrics_build_scattering_lut.d.ts.map +1 -1
  1674. package/src/shade/renderer/volumetrics/shader_volumetrics_build_scattering_lut.js +272 -260
  1675. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts.map +1 -1
  1676. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.js +160 -134
  1677. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts +3 -0
  1678. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts.map +1 -1
  1679. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +2564 -2356
  1680. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  1681. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +110 -7
  1682. package/src/shade/wgsl/validate_wgsl_source.d.ts.map +1 -1
  1683. package/src/shade/wgsl/validate_wgsl_source.js +57 -0
  1684. package/src/view/asset/AssetLoaderStatusView.d.ts.map +1 -1
  1685. package/src/view/asset/AssetLoaderStatusView.js +8 -0
  1686. package/src/view/common/LabelView.d.ts.map +1 -1
  1687. package/src/view/common/LabelView.js +4 -0
  1688. package/src/view/common/ListView.d.ts +6 -2
  1689. package/src/view/common/ListView.d.ts.map +1 -1
  1690. package/src/view/common/ListView.js +27 -7
  1691. package/src/view/common/TabbedView.d.ts.map +1 -1
  1692. package/src/view/common/TabbedView.js +8 -0
  1693. package/src/view/common/VirtualListView.d.ts.map +1 -1
  1694. package/src/view/common/VirtualListView.js +17 -1
  1695. package/src/view/common/dnd/DropTarget.d.ts.map +1 -1
  1696. package/src/view/common/dnd/DropTarget.js +18 -0
  1697. package/src/view/elements/DropDownSelectionView.d.ts.map +1 -1
  1698. package/src/view/elements/DropDownSelectionView.js +8 -0
  1699. package/src/view/elements/image/SvgImageView.d.ts.map +1 -1
  1700. package/src/view/elements/image/SvgImageView.js +8 -0
  1701. package/src/view/elements/navigation/ViewStack.d.ts.map +1 -1
  1702. package/src/view/elements/navigation/ViewStack.js +4 -0
  1703. package/src/view/elements/notify/NotificationView.d.ts.map +1 -1
  1704. package/src/view/elements/notify/NotificationView.js +4 -0
  1705. package/src/view/elements/progress/segmented/SegmentedResourceBarView.d.ts.map +1 -1
  1706. package/src/view/elements/progress/segmented/SegmentedResourceBarView.js +8 -0
  1707. package/src/view/elements/radial/RadialMenu.d.ts.map +1 -1
  1708. package/src/view/elements/radial/RadialMenu.js +4 -0
  1709. package/src/view/minimap/Minimap.d.ts.map +1 -1
  1710. package/src/view/minimap/Minimap.js +8 -0
  1711. package/src/view/minimap/MinimapCanvasView.d.ts.map +1 -1
  1712. package/src/view/minimap/MinimapCanvasView.js +21 -1
  1713. package/src/view/minimap/dom/MinimapCameraView.d.ts.map +1 -1
  1714. package/src/view/minimap/dom/MinimapCameraView.js +232 -220
  1715. package/src/view/minimap/dom/MinimapMarkerView.d.ts.map +1 -1
  1716. package/src/view/minimap/dom/MinimapMarkerView.js +8 -0
  1717. package/src/view/minimap/minimap_focus_area.d.ts +5 -0
  1718. package/src/view/minimap/minimap_focus_area.d.ts.map +1 -1
  1719. package/src/view/minimap/minimap_focus_area.js +22 -0
  1720. package/src/view/tooltip/DomTooltipManager.d.ts +7 -0
  1721. package/src/view/tooltip/DomTooltipManager.d.ts.map +1 -1
  1722. package/src/view/tooltip/DomTooltipManager.js +22 -0
  1723. package/src/view/tooltip/DomTooltipObserver.d.ts.map +1 -1
  1724. package/src/view/tooltip/DomTooltipObserver.js +13 -3
  1725. package/src/view/tooltip/TooltipManager.d.ts.map +1 -1
  1726. package/src/view/tooltip/TooltipManager.js +16 -4
  1727. package/src/core/geom/3d/atlas/atlas_bench_lib.js +0 -315
  1728. package/src/engine/graphics/ecs/mesh/MeshEvents.d.ts +0 -6
  1729. package/src/engine/graphics/ecs/mesh/MeshEvents.d.ts.map +0 -1
  1730. package/src/engine/graphics/ecs/mesh/MeshEvents.js +0 -16
  1731. package/src/engine/graphics/ecs/mesh/commonObject3DFastMatrixUpdate.d.ts +0 -2
  1732. package/src/engine/graphics/ecs/mesh/commonObject3DFastMatrixUpdate.d.ts.map +0 -1
  1733. package/src/engine/graphics/ecs/mesh/commonObject3DFastMatrixUpdate.js +0 -37
  1734. package/src/engine/graphics/ecs/mesh/copyToVector3.d.ts +0 -8
  1735. package/src/engine/graphics/ecs/mesh/copyToVector3.d.ts.map +0 -1
  1736. package/src/engine/graphics/ecs/mesh/copyToVector3.js +0 -18
  1737. package/src/engine/graphics/ecs/mesh/object3DFastMatrixUpdate.d.ts +0 -6
  1738. package/src/engine/graphics/ecs/mesh/object3DFastMatrixUpdate.d.ts.map +0 -1
  1739. package/src/engine/graphics/ecs/mesh/object3DFastMatrixUpdate.js +0 -18
  1740. package/src/engine/graphics/ecs/mesh/rootObject3DFastMatrixUpdate.d.ts +0 -6
  1741. package/src/engine/graphics/ecs/mesh/rootObject3DFastMatrixUpdate.d.ts.map +0 -1
  1742. package/src/engine/graphics/ecs/mesh/rootObject3DFastMatrixUpdate.js +0 -14
  1743. package/src/engine/graphics/ecs/mesh/setMesh.d.ts +0 -16
  1744. package/src/engine/graphics/ecs/mesh/setMesh.d.ts.map +0 -1
  1745. package/src/engine/graphics/ecs/mesh/setMesh.js +0 -55
  1746. package/src/engine/graphics/ecs/mesh/skeleton/BoneMapping.d.ts +0 -13
  1747. package/src/engine/graphics/ecs/mesh/skeleton/BoneMapping.d.ts.map +0 -1
  1748. package/src/engine/graphics/ecs/mesh/skeleton/BoneMapping.js +0 -99
  1749. package/src/engine/graphics/ecs/mesh/skeleton/HumanoidBoneType.d.ts +0 -25
  1750. package/src/engine/graphics/ecs/mesh/skeleton/HumanoidBoneType.d.ts.map +0 -1
  1751. package/src/engine/graphics/ecs/mesh/skeleton/HumanoidBoneType.js +0 -29
  1752. package/src/engine/graphics/ecs/mesh/updateMeshTransform.d.ts +0 -6
  1753. package/src/engine/graphics/ecs/mesh/updateMeshTransform.d.ts.map +0 -1
  1754. package/src/engine/graphics/ecs/mesh/updateMeshTransform.js +0 -15
  1755. package/src/engine/graphics/ecs/mesh/updateNodeByTransformAndBBB.d.ts +0 -8
  1756. package/src/engine/graphics/ecs/mesh/updateNodeByTransformAndBBB.d.ts.map +0 -1
  1757. package/src/engine/graphics/ecs/mesh/updateNodeByTransformAndBBB.js +0 -14
  1758. package/src/engine/graphics3/terrain/GPUTerrainSplatRenderer.js +0 -481
  1759. package/src/engine/graphics3/terrain/pack_terrain_row_table.js +0 -48
  1760. package/src/engine/graphics3/terrain/shader_terrain_splat.js +0 -215
  1761. package/src/shade/renderer/animation/ANIMATION_BOUND_TRACK_GROUP_STRUCT.js +0 -57
  1762. package/src/shade/renderer/animation/ANIMATION_KEYFRAME_BLOCK_STRUCT.js +0 -50
  1763. package/src/shade/renderer/animation/ANIMATION_SKIN_JOINT_BLOCK_STRUCT.js +0 -62
  1764. package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_CREASE_ANGLE.d.ts +0 -46
  1765. package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_CREASE_ANGLE.d.ts.map +0 -1
  1766. package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_CREASE_ANGLE.js +0 -45
@@ -1,1128 +1,1109 @@
1
- import { assert } from "../../../../core/assert.js";
2
- import { HashMap } from "../../../../core/collection/map/HashMap.js";
3
- import { HashSet } from "../../../../core/collection/set/HashSet.js";
4
- import { Color } from "../../../../core/color/Color.js";
5
- import { Quaternion } from "../../../../core/geom/Quaternion.js";
6
- import Vector3 from "../../../../core/geom/Vector3.js";
7
- import { clamp } from "../../../../core/math/clamp.js";
8
- import { clamp01 } from "../../../../core/math/clamp01.js";
9
- import { computeObjectHash } from "../../../../core/math/hash/computeObjectHash.js";
10
- import { inverseLerp } from "../../../../core/math/inverseLerp.js";
11
- import { objectDeepEquals } from "../../../../core/model/object/objectDeepEquals.js";
12
- import { AnimationInterpolationKind } from "../../../../engine/animation/clip/AnimationInterpolationKind.js";
13
- import { curve_from_track_data } from "../../../../engine/animation/clip/curve_from_track_data.js";
14
- import { AnimationCurve } from "../../../../engine/animation/curve/AnimationCurve.js";
15
- import { t64_look_rotation } from "../../../../engine/ecs/transform/t64_look_rotation.js";
16
- import { t64_transform_direction } from "../../../../engine/ecs/transform/t64_transform_direction.js";
17
- import { meshopt_optimizeVertexCache } from "../../../../engine/graphics/geometry/optimization/VertexCacheOptimizer.js";
18
- import { ShadeAnimationChannel } from "../../animation/ShadeAnimationChannel.js";
19
- import { ShadeAnimationClip } from "../../animation/ShadeAnimationClip.js";
20
- import { Skin } from "../../animation/Skin.js";
21
- import { Attribute } from "../../geometry/Attribute.js";
22
- import { Geometry, GeometryFlags } from "../../geometry/Geometry.js";
23
- import { meshlet_geometry_build_from_geometry } from "../../geometry/meshlet_geometry_build_from_geometry.js";
24
- import { StandardAttributes } from "../../geometry/StandardAttributes.js";
25
- import { normalize_attribute } from "../../geometry/util/normalize_attribute.js";
26
- import { DirectionalLight } from "../../light/model/DirectionalLight.js";
27
- import { PointLight } from "../../light/model/PointLight.js";
28
- import { SpotLight } from "../../light/model/SpotLight.js";
29
-
30
- import { StandardShadeMaterial } from "../../material/StandardShadeMaterial.js";
31
- import { Node3DProperty } from "../../object_property/Node3DProperty.js";
32
- import { ShadeTexture } from "../../texture/ShadeTexture.js";
33
- import { ShadeImage } from "../../texture/source/ShadeImage.js";
34
- import { SceneBundle } from "../SceneBundle.js";
35
- import { SceneNode } from "../SceneNode.js";
36
- import { coalesce_array_duplicates } from "../../../../format/scene/gltf/coalesce_array_duplicates.js";
37
- import { GLTF_COMPONENT_TYPE } from "../../../../format/scene/gltf/gltf_component_type.js";
38
- import { gltf_create_material } from "./gltf_create_material.js";
39
- import { gltf_create_texture } from "./gltf_create_texture.js";
40
- import { GLTF_PRIMITIVE_MODE, GLTF_PRIMITIVE_MODE_DEFAULT } from "../../../../format/scene/gltf/GLTF_PRIMITIVE_MODE.js";
41
- import { gltf_read_accessor } from "../../../../format/scene/gltf/gltf_read_accessor.js";
42
- import { gltf_texture_image_index, gltf_used_image_indices } from "../../../../format/scene/gltf/gltf_used_image_indices.js";
43
- import { TinyGltf } from "./tiny-gltf.js";
44
-
45
-
46
- /**
47
- * Somewhere to hand `canonicalize_quaternion_signs` a rest rotation it can read by component name —
48
- * a `Transform64` addresses its rotation by index, and the function's contract is named components.
49
- *
50
- * @type {Quaternion}
51
- */
52
- const SCRATCH_REST_ROTATION = new Quaternion();
53
-
54
- /**
55
- * Somewhere to read a light's facing before flipping it.
56
- *
57
- * @type {Vector3}
58
- */
59
- const SCRATCH_DIRECTION = new Vector3();
60
- const OPTIMIZE_GEOMETRIES = false;
61
-
62
- /**
63
- * @see https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html
64
- * @param {string} id
65
- */
66
- function gltf_attribute_id_to_standard(id) {
67
- switch (id) {
68
- case "POSITION":
69
- return StandardAttributes.Position;
70
- case "NORMAL":
71
- return StandardAttributes.Normal;
72
- case "TEXCOORD_0":
73
- return StandardAttributes.TextureCoordinates0;
74
- case "TEXCOORD_1":
75
- return StandardAttributes.TextureCoordinates1;
76
- case "TANGENT":
77
- return StandardAttributes.Tangent;
78
- case "COLOR_0":
79
- return StandardAttributes.Color;
80
- case "JOINTS_0":
81
- return StandardAttributes.SkinningJoints;
82
- case "WEIGHTS_0":
83
- return StandardAttributes.SkinningWeights;
84
- default:
85
- return id;
86
- }
87
- }
88
-
89
- /**
90
- * Map glTF `animation.channels[].target.path` to {@link Node3DProperty}.
91
- * Returns `-1` for paths we don't yet drive (morph-target `weights`),
92
- * so the caller can skip those channels without throwing.
93
- *
94
- * @param {string} path
95
- * @returns {number}
96
- */
97
- function gltf_animation_path_to_property(path) {
98
- switch (path) {
99
- case "translation":
100
- return Node3DProperty.Translation;
101
- case "rotation":
102
- return Node3DProperty.Rotation;
103
- case "scale":
104
- return Node3DProperty.Scale;
105
- default:
106
- // "weights" (morph targets) lands here; we don't yet have
107
- // morph-target support in the renderer.
108
- return -1;
109
- }
110
- }
111
-
112
- /**
113
- * Number of scalar components per keyframe value for a given Node3D
114
- * property — translation/scale = 3 (vec3), rotation = 4 (quaternion
115
- * x/y/z/w).
116
- *
117
- * @param {number} property one of {@link Node3DProperty}
118
- * @returns {number}
119
- */
120
- function node3d_property_component_count(property) {
121
- switch (property) {
122
- case Node3DProperty.Translation:
123
- case Node3DProperty.Scale:
124
- return 3;
125
- case Node3DProperty.Rotation:
126
- return 4;
127
- default:
128
- throw new Error(`Unsupported animated property ${property}`);
129
- }
130
- }
131
-
132
- /**
133
- * Walk a flat keyframe-values buffer for a rotation channel and flip
134
- * the sign of any keyframe whose val-quaternion has negative dot
135
- * product with the previous keyframe's val-quaternion. The same flip
136
- * is applied to that keyframe's in/out tangents in CUBICSPLINE mode
137
- * so the cubic remains internally consistent.
138
- *
139
- * The flip preserves the rotation (q and -q encode the same
140
- * orientation) while ensuring per-component interpolation between
141
- * consecutive keyframes follows the short arc instead of passing
142
- * through a near-zero quaternion mid-segment.
143
- *
144
- * The curve's leading sign is anchored against `rest_rotation` —
145
- * the target node's authored local rest rotation: when the first
146
- * keyframe's val-quat has negative dot product with the rest
147
- * quaternion, the whole first keyframe block is negated (and the
148
- * consecutive-keyframe pass propagates that sign down the curve).
149
- * Every rotation curve targeting one node aligns against the same
150
- * reference, so weighted multi-clip blends accumulate
151
- * hemisphere-consistent contributions instead of cancelling toward
152
- * a near-zero quaternion. Residual limitation: the anchor is the
153
- * FIRST keyframe only — a curve that swings more than 90° away
154
- * from the rest rotation mid-clip can still contribute opposite
155
- * signs to another clip at those times; fixing that would need
156
- * apply-time alignment, which the atomic pose accumulator cannot
157
- * do order-independently.
158
- *
159
- * Mutates `values` in place. Safe to call on an output array that's
160
- * a fresh copy of the source accessor (which is what
161
- * {@link read_accessor_as_float32_array} produces).
162
- *
163
- * Exported for spec coverage; not part of the loader's public API.
164
- *
165
- * @param {Float32Array} values flat values: STEP/LINEAR uses 4
166
- * floats/keyframe (x, y, z, w); CUBICSPLINE uses 12 (inX, inY,
167
- * inZ, inW, valX, valY, valZ, valW, outX, outY, outZ, outW).
168
- * @param {number} key_count
169
- * @param {number} interpolation one of {@link AnimationInterpolationKind}
170
- * @param {{x:number, y:number, z:number, w:number}} [rest_rotation]
171
- * target node's authored local rest rotation; omitted → the
172
- * leading sign is kept as authored.
173
- */
174
- export function canonicalize_quaternion_signs(values, key_count, interpolation, rest_rotation) {
175
- const is_cubic = interpolation === AnimationInterpolationKind.CubicTangents;
176
- const stride = is_cubic ? 12 : 4;
177
- // Offset into a keyframe block at which the val-quat sits.
178
- // CUBICSPLINE has [in, val, out]; the val starts at offset 4 (i.e.
179
- // after the 4-float in-tangent). STEP/LINEAR has just val at 0.
180
- const val_offset = is_cubic ? 4 : 0;
181
-
182
- if (key_count >= 1 && rest_rotation !== undefined) {
183
- const rest_dot =
184
- values[val_offset + 0] * rest_rotation.x +
185
- values[val_offset + 1] * rest_rotation.y +
186
- values[val_offset + 2] * rest_rotation.z +
187
- values[val_offset + 3] * rest_rotation.w;
188
-
189
- if (rest_dot < 0) {
190
- // Negate the whole first keyframe block (value +
191
- // tangents); the loop below carries the flip through
192
- // the remaining keyframes.
193
- for (let i = 0; i < stride; i++) {
194
- values[i] = -values[i];
195
- }
196
- }
197
- }
198
-
199
- for (let k = 1; k < key_count; k++) {
200
- const prev_base = (k - 1) * stride + val_offset;
201
- const cur_base = k * stride + val_offset;
202
-
203
- const dot =
204
- values[prev_base + 0] * values[cur_base + 0] +
205
- values[prev_base + 1] * values[cur_base + 1] +
206
- values[prev_base + 2] * values[cur_base + 2] +
207
- values[prev_base + 3] * values[cur_base + 3];
208
-
209
- if (dot < 0) {
210
- // Flip the whole keyframe block (value + tangents).
211
- const start = k * stride;
212
- const end = start + stride;
213
- for (let i = start; i < end; i++) {
214
- values[i] = -values[i];
215
- }
216
- }
217
- }
218
- }
219
-
220
- /**
221
- * Map glTF interpolation strings to the engine's enum. Defaults to
222
- * LINEAR when missing — the glTF spec's default.
223
- *
224
- * @param {string|undefined} interpolation
225
- * @returns {number} one of {@link AnimationInterpolationKind}
226
- */
227
- function gltf_interpolation_to_kind(interpolation) {
228
- switch (interpolation) {
229
- case "STEP":
230
- return AnimationInterpolationKind.Discrete;
231
- case "CUBICSPLINE":
232
- return AnimationInterpolationKind.CubicTangents;
233
- case "LINEAR":
234
- case undefined:
235
- return AnimationInterpolationKind.Linear;
236
- default:
237
- throw new Error(`Unsupported interpolation '${interpolation}'`);
238
- }
239
- }
240
-
241
- /**
242
- * Input can be a .glb or .gltf file.
243
- *
244
- * Does not support most compression GLTF extensions such as draco, basis etc.
245
- *
246
- * Returns a {@link SceneBundle} that groups the parsed scene roots
247
- * with any skins and animation clips extracted from the same asset.
248
- * Callers add `bundle.scenes` to their scene, then pass the bundle's
249
- * `skins` / `clips` to the scene's animation manager (e.g. via
250
- * {@link GPUAnimationManager#register_skin} and
251
- * {@link GPUAnimationManager#register_clip}) once the bundle has been
252
- * compiled into a prefab and instantiated, so that the joints and targets
253
- * are entities holding rows.
254
- *
255
- * @param {string} url un-resolved — the asset manager resolves network paths
256
- * @param {Object} options
257
- * @param {AssetManager} options.assetManager where the container, its buffers and its images come
258
- * from. Required: a glTF is several files, and which of them are already in memory is not this
259
- * parser's business to know.
260
- * @param {AssetRequestScope} [options.scope] the load these requests belong to
261
- * @param {Map<string, File|Blob|ArrayBuffer>} [options.fileMap] Map of relative paths to file data.
262
- * When provided, buffer and image URIs in the GLTF are resolved from this map before the asset
263
- * framework is asked. Enables multi-file GLTF loading from drag-and-drop.
264
- * @param {Set<GPUTextureFormat>} [options.texture_support] what the device can sample, from
265
- * `gpu_texture_compression_support(device)`. Only a `KHR_texture_basisu` image reads it, to choose
266
- * what to transcode into; omitted, the loader targets the best format the transcoder writes.
267
- * @return {Promise<SceneBundle>}
268
- */
269
- export function load_gltf(url, { assetManager, scope, fileMap, texture_support } = {}) {
270
- // TODO
271
- // apply some checks to the model, things like non-uniform scales, that can be fixed potentially
272
- // see https://www.youtube.com/watch?v=FJRO5wFTEc8 for common ideas
273
- // check for inverted normals
274
- // check for duplicated vertices
275
- // check for overlapping faces
276
-
277
- async function process(gltf) {
278
- // console.log(gltf);
279
-
280
- /**
281
- * @type {{type:string, componentType:number, count:number, bufferView:number, byteOffset:number, normalized:boolean, min?:number[], max?:number}[]}
282
- */
283
- const accessors = gltf.accessors;
284
-
285
- /**
286
- * `aabb` is six numbers, `[x0, y0, z0, x1, y1, z1]`, in world space — and is absent on a node
287
- * that bounds nothing, meaning neither it nor anything below it declared any.
288
- *
289
- * {{aabb?:Float64Array, mesh:number, worldMatrix:Float32Array}[]}
290
- */
291
- const nodes = gltf.nodes;
292
-
293
- /**
294
- *
295
- * @type {{aabb:Float64Array, primitives:({attributes:Object<number>,indices:number, material:number, mode:number}[])}[]}
296
- */
297
- const meshes = gltf.meshes;
298
-
299
- /**
300
- *
301
- * @type {{}[]}
302
- */
303
- const scenes = gltf.scenes;
304
-
305
- /**
306
- * Engine Node3Ds indexed by glTF node index — populated lazily
307
- * by {@link process_node} as the scene-graph recursion visits
308
- * each node. Used afterwards to resolve skin joint references
309
- * and animation channel targets (both of which point at glTF
310
- * node indices, not at any in-memory object).
311
- *
312
- * @type {Node3D[]}
313
- */
314
- const record_index_of = new Int32Array((gltf.nodes ?? []).length).fill(-1);
315
-
316
- // what the file becomes: nodes in pre-order, as the walk below produces them
317
- const bundle = new SceneBundle();
318
-
319
- /**
320
- * Queue of pending `skin.meshes` pushes. process_node() can't
321
- * resolve `node.skin → Skin` directly because skins[] is built
322
- * *after* the recursion completes (the joint lookup needs
323
- * node3d_by_index fully populated). So we enqueue the produced
324
- * SkinnedMeshes here and drain into the matching skin once the
325
- * walk finishes.
326
- *
327
- * @type {{ skin_index: number, meshes: Mesh[] }[]}
328
- */
329
- const skin_mesh_pushes = [];
330
-
331
- /**
332
- * Primitive converted to JSON string serves as key
333
- * @type {Map<string, MeshletGeometry>}
334
- */
335
- const geometry_cache = new Map();
336
-
337
- /**
338
- *
339
- * @type {HashSet<MeshletGeometry>}
340
- */
341
- const geometry_cache_secondary = new HashSet();
342
-
343
- /**
344
- * Indexed as `gltf.images` is, and populated only where an image was actually fetched.
345
- *
346
- * Built from {@link gltf_used_image_indices} rather than by mapping the whole list, because
347
- * that is the same function the fetch is filtered by: the two cannot drift into decoding one
348
- * set and sampling another, and there is no slot here for an image that was never brought in.
349
- *
350
- * @type {ShadeImage[]}
351
- */
352
- const mapped_images = [];
353
-
354
- for (const index of gltf_used_image_indices(gltf)) {
355
- const source = gltf.images[index];
356
-
357
- /*
358
- A `KHR_texture_basisu` image arrives already transcoded — the container reader ran in
359
- the parser, where the bytes were, and what came back is texels in a device format. Every
360
- other image is an `ImageBitmap` the browser decoded. Below this line the two are the same
361
- thing: a `ShadeImage`, which is what §3.1 bought.
362
- */
363
- mapped_images[index] = source.isShadeTexelData === true
364
- ? ShadeImage.fromTexelData(source)
365
- : ShadeImage.fromImageBitmap(source);
366
- }
367
-
368
- /**
369
- * used when no material is specified
370
- * @type {StandardShadeMaterial}
371
- */
372
- const default_material = new StandardShadeMaterial();
373
-
374
- /**
375
- *
376
- * @type {ShadeTexture[]}
377
- */
378
- const mapped_textures = (gltf.textures ?? []).map(gltf_texture => gltf_create_texture(
379
- gltf_texture,
380
- /*
381
- The same function the fetch was filtered by. Asking it twice is the point: this is the
382
- half that decides what to *sample*, and the half in `gltf_used_image_indices` decides
383
- what to *fetch*. When those two disagreed, every model in the game's level failed to
384
- load — see the note at the top of that file.
385
- */
386
- mapped_images[gltf_texture_image_index(gltf_texture)],
387
- gltf.samplers
388
- ));
389
-
390
- coalesce_array_duplicates(mapped_textures);
391
-
392
- // account for materials missing
393
- const gltf_materials = gltf.materials ?? [];
394
-
395
- const mapped_materials = gltf_materials.map(gltf_mat => gltf_create_material(gltf_mat, mapped_textures));
396
-
397
- // dedupe materials
398
- coalesce_array_duplicates(mapped_materials);
399
-
400
-
401
- /**
402
- * One accessor as an attribute in the shape the renderer stores it.
403
- *
404
- * The read itself — stride, sparse overlay, a view-less accessor's zeroes — belongs to the
405
- * format and is done by {@link gltf_read_accessor}; what is left here is the engine's own
406
- * question of which storage type an attribute of this name is kept in.
407
- *
408
- * @param {number} accessor_index
409
- * @param {string} name
410
- * @returns {Attribute}
411
- */
412
- function buffer_to_attribute(accessor_index, name) {
413
- const data = gltf_read_accessor(gltf, accessor_index);
414
-
415
- const raw_attribute = Attribute.from(data.values, data.components, name);
416
-
417
- raw_attribute.spec.normalized = data.normalized;
418
-
419
- return normalize_attribute(raw_attribute);
420
- }
421
-
422
- /**
423
- *
424
- * @type {HashMap<Object, Attribute>}
425
- */
426
- const attribute_cache = new HashMap({
427
- keyEqualityFunction: objectDeepEquals,
428
- keyHashFunction: computeObjectHash
429
- });
430
-
431
- /**
432
- *
433
- * @param {number} attribute_accessor
434
- * @param {string} name
435
- * @returns {Attribute}
436
- */
437
- function obtain_attribute(attribute_accessor, name) {
438
- const key = {
439
- attribute_accessor, name
440
- };
441
-
442
- let attribute = attribute_cache.get(key);
443
-
444
- if (attribute === undefined) {
445
- attribute = buffer_to_attribute(attribute_accessor, name);
446
- attribute_cache.set(key, attribute);
447
- } else {
448
- // console.warn('attribute reuse')
449
- }
450
-
451
- return attribute;
452
- }
453
-
454
- /**
455
- * A FLOAT-componentType accessor's values as a flat `Float32Array`. Used for animation
456
- * sampler inputs/outputs (times, values) and the skin inverse-bind matrices, where
457
- * downstream code wants a stride-free flat buffer.
458
- *
459
- * @param {number} accessor_index
460
- * @returns {Float32Array}
461
- */
462
- function read_accessor_as_float32_array(accessor_index) {
463
- const accessor = accessors[accessor_index];
464
-
465
- assert.equal(
466
- accessor.componentType, GLTF_COMPONENT_TYPE.FLOAT,
467
- `accessor[${accessor_index}].componentType must be FLOAT for read_accessor_as_float32_array`
468
- );
469
-
470
- return gltf_read_accessor(gltf, accessor_index).values;
471
- }
472
-
473
- /**
474
- *
475
- * @returns {MeshletGeometry}
476
- */
477
- function primitive_to_geometry(primitive) {
478
- const geometry = new Geometry();
479
-
480
- const mode = primitive.mode ?? GLTF_PRIMITIVE_MODE_DEFAULT;
481
-
482
- if (mode !== GLTF_PRIMITIVE_MODE.TRIANGLES) {
483
- throw new Error('Unsupported draw method');
484
- }
485
-
486
- for (const attribute_key in primitive.attributes) {
487
-
488
- const name = gltf_attribute_id_to_standard(attribute_key);
489
-
490
- if (geometry.getAttribute(name) !== undefined) {
491
- console.warn(`attribute '${name}' already exists, skipping. Primitive.attributes = ${JSON.stringify(primitive.attributes)}`)
492
- }
493
-
494
- /**
495
- * @type {number}
496
- */
497
- const attribute_accessor = primitive.attributes[attribute_key];
498
-
499
- let attribute;
500
- try {
501
- attribute = obtain_attribute(attribute_accessor, name);
502
- } catch (e) {
503
- console.warn(`Failed to parse attribute '${name}'. Skipping`, e);
504
- continue;
505
- }
506
-
507
- geometry.addAttribute(attribute);
508
-
509
-
510
- if (attribute_key === "POSITION") {
511
- // The spec mandates POSITION accessors carry min/max,
512
- // so we can adopt them as the bounding box without
513
- // walking the vertex data. The sphere is derived from
514
- // the box inside meshlet_geometry_build_from_geometry,
515
- // so we just clear the dirty flag here.
516
- const accessor = accessors[attribute_accessor];
517
-
518
- if (accessor.min !== undefined && accessor.max !== undefined) {
519
- geometry.bounding_box.set([
520
- ...accessor.min,
521
- ...accessor.max
522
- ]);
523
-
524
- geometry.clearFlag(GeometryFlags.BoundsNeedUpdate);
525
- }
526
- }
527
- }
528
-
529
- if (primitive.indices !== undefined) {
530
-
531
- geometry.index = obtain_attribute(primitive.indices, 'index');
532
-
533
- // geometry_fix_index(geometry.index, geometry.getVertexCount());
534
- }
535
-
536
-
537
- // vertex optimize
538
- if (geometry.index !== null && OPTIMIZE_GEOMETRIES) {
539
- meshopt_optimizeVertexCache(geometry.index.data, geometry.index.data, geometry.index.count, geometry.getVertexCount());
540
- }
541
-
542
- return meshlet_geometry_build_from_geometry(geometry);
543
- }
544
-
545
- function obtain_geometry_by_primitive(primitive) {
546
- const key = JSON.stringify(primitive);
547
-
548
- let geometry = geometry_cache.get(key);
549
-
550
- if (geometry === undefined) {
551
- geometry = primitive_to_geometry(primitive)
552
-
553
- const secondary_cached = geometry_cache_secondary.get(geometry);
554
-
555
- if (secondary_cached !== undefined) {
556
- // found an equivalent geometry in the secondary cache, use it instead
557
- geometry = secondary_cached;
558
- // console.warn("secondary reuse");
559
- } else {
560
- geometry_cache_secondary.add(geometry);
561
- }
562
-
563
- geometry_cache.set(key, geometry);
564
- } else {
565
- // console.warn('geometry reuse');
566
- }
567
-
568
- return geometry;
569
- }
570
-
571
-
572
- /**
573
- * Build the renderable mesh(es) for one glTF node.
574
- *
575
- * A glTF mesh is a list of primitives sharing a name and an
576
- * `aabb`, and each primitive becomes one engine-side {@link Mesh}.
577
- * When the owning glTF node references a skin, every primitive is
578
- * instead constructed as a {@link SkinnedMesh} so the renderer
579
- * routes it through a per-instance geometry clone for deformation.
580
- *
581
- * @param {number} mesh_index
582
- * @param {{}} node
583
- * @param {boolean} is_skinned
584
- * @returns {Mesh[]}
585
- */
586
- function process_mesh(mesh_index) {
587
-
588
- const mesh = meshes[mesh_index];
589
-
590
- const primitives = mesh.primitives;
591
-
592
- const primitive_count = primitives.length;
593
-
594
- /**
595
- * @type {{geometry: MeshletGeometry, material: StandardShadeMaterial, name: string}[]}
596
- */
597
- const result = [];
598
-
599
- for (let i = 0; i < primitive_count; i++) {
600
- const primitive = primitives[i];
601
-
602
- // build geometry
603
-
604
- /**
605
- * @type {MeshletGeometry}
606
- */
607
- let geometry;
608
-
609
- try {
610
- geometry = obtain_geometry_by_primitive(primitive);
611
- } catch (e) {
612
- console.error(`Failed to obtain geometry for primitive [${i}] ${primitive}. `, e);
613
- console.log('Ignoring mesh');
614
- continue;
615
- }
616
-
617
- if (primitive_count === 1 && mesh.name !== undefined) {
618
- geometry.name = mesh.name;
619
- }
620
-
621
- const material_id = primitive.material;
622
-
623
- let material;
624
-
625
- if (material_id !== undefined) {
626
- material = mapped_materials[material_id];
627
-
628
- if (material === undefined) {
629
- console.warn(`specified material ${material_id} does not exist. Using default.`);
630
-
631
- material = default_material;
632
- }
633
-
634
- } else {
635
- // no material specified, use default
636
- material = default_material;
637
- }
638
-
639
- result.push({ geometry, material, name: mesh.name ?? "" });
640
- }
641
-
642
- return result;
643
- }
644
-
645
- /**
646
- *
647
- * @param {number} light_index
648
- * @param {{}} node
649
- * @returns {AbstractLight}
650
- */
651
- function process_light(light_index, node) {
652
-
653
- // SPEC: https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_lights_punctual/README.md
654
-
655
- const gltf_light = gltf.extensions.KHR_lights_punctual.lights[light_index];
656
-
657
- // parse color
658
- const color = new Color();
659
-
660
- if (gltf_light.color !== undefined) {
661
- color.fromArray(gltf_light.color);
662
- } else {
663
- color.setRGB(1, 1, 1);
664
- }
665
-
666
- const intensity = gltf_light.intensity ?? 1;
667
-
668
- const name = gltf_light.name ?? "";
669
-
670
- let light;
671
-
672
- const type = gltf_light.type;
673
-
674
- switch (type) {
675
- case "directional":
676
- light = new DirectionalLight();
677
- break;
678
- case "point":
679
- light = new PointLight();
680
- light.distance = gltf_light.range ?? 1e20; // default light radius
681
- break;
682
- case "spot":
683
- light = new SpotLight();
684
-
685
- const gltf_spot = gltf_light.spot;
686
-
687
- const outerCone = gltf_spot?.outerConeAngle ?? (Math.PI / 4); // default PI/4
688
- const innerCone = gltf_spot?.innerConeAngle ?? 0;
689
-
690
- light.angle = clamp(
691
- outerCone,
692
- 0,
693
- Math.PI / 2
694
- );
695
-
696
- light.penumbra = clamp01(
697
- inverseLerp(light.angle, 0, innerCone)
698
- );
699
-
700
- light.distance = gltf_light.range ?? 1e20;
701
- // TODO rotation is messed up?
702
- break;
703
- default:
704
- throw new Error(`Unsupported light type ${type}`);
705
- }
706
-
707
- light.color.copy(color);
708
- light.intensity = intensity;
709
- light.name = name;
710
-
711
- // check for light radius
712
- light.radius = gltf_light.extras?.radius ?? 0;
713
-
714
- light.near_clip_distance = gltf_light.extras?.near_clip_distance ?? light.radius;
715
-
716
- light.casts_shadow = true;
717
-
718
- return light;
719
- }
720
-
721
- /**
722
- *
723
- * @param {Node3D} parent
724
- * @param {number} node_index
725
- */
726
- function process_node(parent, node_index) {
727
- const node = nodes[node_index];
728
-
729
- // glTF "skin" attaches at the node, not the mesh: every primitive of the referenced
730
- // mesh deforms against this skin. Resolved later, against `skins[]`, which is built
731
- // after the walk — the joints may be visited *after* this node — so the primitives
732
- // produced here are queued and pushed into `skin.meshes` once the walk finishes.
733
- const skin_index = typeof node.skin === "number" ? node.skin : -1;
734
-
735
- const record = new SceneNode();
736
-
737
- record.parent = parent;
738
-
739
- if (node.name !== undefined) {
740
- record.name = node.name;
741
- }
742
-
743
- const t = record.local;
744
-
745
- if (node.matrix !== undefined) {
746
- t.fromMatrix(node.matrix);
747
- } else {
748
- if (node.translation !== undefined) {
749
- const v = node.translation;
750
- t.setTranslation(v[0], v[1], v[2]);
751
- }
752
-
753
- if (node.rotation !== undefined) {
754
- const q = node.rotation;
755
- t.setRotation(q[0], q[1], q[2], q[3]);
756
- }
757
-
758
- if (node.scale !== undefined) {
759
- const v = node.scale;
760
- t.setScale(v[0], v[1], v[2]);
761
- }
762
-
763
- t.updateMatrix();
764
- }
765
-
766
- const index = bundle.add_node(record);
767
-
768
- // joint refs, channel targets and light anchors resolve through this once the
769
- // recursion unwinds
770
- record_index_of[node_index] = index;
771
-
772
- if (node.extensions !== undefined && node.extensions.KHR_lights_punctual !== undefined) {
773
- const light_index = node.extensions.KHR_lights_punctual.light;
774
-
775
- try {
776
- // a light is not a node: the node is where it is, and the bundle carries the pair
777
- const punctual = process_light(light_index, node);
778
-
779
- if (punctual.isDirectionalLight === true || punctual.isSpotLight === true) {
780
- // glTF lights shine along their local -Z; engine convention is forward =
781
- // shining direction. The direction is read off the matrix, which the
782
- // record keeps current.
783
- t64_transform_direction(SCRATCH_DIRECTION, t, 0, 0, 1);
784
- t64_look_rotation(
785
- t,
786
- -SCRATCH_DIRECTION.x, -SCRATCH_DIRECTION.y, -SCRATCH_DIRECTION.z,
787
- 0, 1, 0
788
- );
789
- t.updateMatrix();
790
- }
791
-
792
- punctual_lights.push({ light: punctual, node: index });
793
- } catch (e) {
794
- console.error("Failed to process light ", light_index, " ", e);
795
- }
796
- }
797
-
798
- if (typeof node.mesh === "number") {
799
- const primitives = process_mesh(node.mesh);
800
-
801
- /** @type {number[]} the records that draw this mesh's primitives */
802
- const produced = [];
803
-
804
- if (primitives.length === 1) {
805
- // the node is the primitive. Its name wins over the mesh's, which is what the
806
- // pose query names parts by; the geometry keeps the mesh's own
807
- const primitive = primitives[0];
808
-
809
- record.geometry = primitive.geometry;
810
- record.material = primitive.material;
811
-
812
- if (node.name === undefined) {
813
- record.name = primitive.name;
814
- }
815
-
816
- produced.push(index);
817
- } else {
818
- // one child per primitive, each named after the mesh, at the node's own place
819
- for (let i = 0; i < primitives.length; i++) {
820
- const primitive = primitives[i];
821
- const child = new SceneNode();
822
-
823
- child.parent = index;
824
- child.name = primitive.name;
825
- child.geometry = primitive.geometry;
826
- child.material = primitive.material;
827
-
828
- produced.push(bundle.add_node(child));
829
- }
830
- }
831
-
832
- if (skin_index !== -1 && produced.length > 0) {
833
- skin_mesh_pushes.push({
834
- skin_index,
835
- meshes: produced,
836
- });
837
- }
838
- }
839
-
840
- if (node.children !== undefined) {
841
- for (let i = 0; i < node.children.length; i++) {
842
- process_node(index, node.children[i]);
843
- }
844
- }
845
- }
846
-
847
- for (let i = 0; i < scenes.length; i++) {
848
- const scene = scenes[i];
849
-
850
- // a root per glTF scene, unnamed and at the identity — what the prefab compiler folds
851
- const scene_root = bundle.add_node(new SceneNode());
852
-
853
- /**
854
- * @type {number[]}
855
- */
856
- const scene_nodes = scene.nodes;
857
- const node_count = scene_nodes.length;
858
-
859
- for (let i = 0; i < node_count; i++) {
860
- process_node(scene_root, scene_nodes[i]);
861
- }
862
- }
863
-
864
- // ── Skins ──────────────────────────────────────────────────
865
- //
866
- // Build {@link Skin} objects from `gltf.skins[]`. Joints
867
- // resolve to node indices through `record_index_of` (fully
868
- // populated by the recursion above). Inverse-bind matrices
869
- // come from a single MAT4 accessor — `joint_count * 16` f32s
870
- // laid out column-major, copied into a flat Float32Array that
871
- // the manager can subarray-view at registration time.
872
- const skins = (gltf.skins ?? []).map((gltf_skin, skin_index) => {
873
- const joint_indices = gltf_skin.joints;
874
- const joint_count = joint_indices.length;
875
-
876
- const joint_nodes = new Array(joint_count);
877
- for (let i = 0; i < joint_count; i++) {
878
- const joint_node_index = joint_indices[i];
879
- const joint_node = record_index_of[joint_node_index];
880
-
881
- assert.notEqual(
882
- joint_node, -1,
883
- `skin[${skin_index}].joints[${i}] references unknown node index ${joint_node_index}`
884
- );
885
-
886
- joint_nodes[i] = joint_node;
887
- }
888
-
889
- // Inverse-bind matrices: glTF stores them MAT4-typed
890
- // (column-major, 16 f32s per joint). When the accessor is
891
- // omitted, the spec says every joint's IBM is identity —
892
- // we materialise that here so the manager always sees a
893
- // ready-to-use flat array.
894
- let inverse_bind_matrices;
895
- if (gltf_skin.inverseBindMatrices !== undefined) {
896
- inverse_bind_matrices = read_accessor_as_float32_array(gltf_skin.inverseBindMatrices);
897
- } else {
898
- inverse_bind_matrices = new Float32Array(joint_count * 16);
899
- for (let i = 0; i < joint_count; i++) {
900
- inverse_bind_matrices[i * 16 + 0] = 1;
901
- inverse_bind_matrices[i * 16 + 5] = 1;
902
- inverse_bind_matrices[i * 16 + 10] = 1;
903
- inverse_bind_matrices[i * 16 + 15] = 1;
904
- }
905
- }
906
-
907
- return Skin.from({
908
- name: gltf_skin.name ?? "",
909
- joints: joint_nodes,
910
- inverse_bind_matrices,
911
- meshes: [],
912
- });
913
- });
914
-
915
- // Drain the deferred skin.meshes pushes captured during the
916
- // node walk.
917
- for (let i = 0; i < skin_mesh_pushes.length; i++) {
918
- const { skin_index, meshes: skin_meshes } = skin_mesh_pushes[i];
919
- skins[skin_index].meshes.push(...skin_meshes);
920
- }
921
-
922
- // ── Animation clips ───────────────────────────────────────
923
- //
924
- // One glTF animation → one {@link ShadeAnimationClip}. Each
925
- // channel becomes a {@link ShadeAnimationChannel}; per-component
926
- // curves are built from the sampler's input (times) / output
927
- // (values) accessors via the engine's curve_from_track_data
928
- // helpers, which already handle STEP / LINEAR / CUBICSPLINE.
929
- const clips = [];
930
-
931
- /** @type {{light: import("../../light/model/Light.js").Light, node: number}[]} */
932
- const punctual_lights = [];
933
- const gltf_animations = gltf.animations ?? [];
934
- for (let a = 0; a < gltf_animations.length; a++) {
935
- const gltf_animation = gltf_animations[a];
936
-
937
- const channels = [];
938
-
939
- for (let c = 0; c < gltf_animation.channels.length; c++) {
940
- const gltf_channel = gltf_animation.channels[c];
941
- const target = gltf_channel.target;
942
-
943
- const property = gltf_animation_path_to_property(target.path);
944
- if (property === -1) {
945
- // Morph-target weights or other unsupported paths.
946
- continue;
947
- }
948
-
949
- if (target.node === undefined) {
950
- // Channels without a node target are a glTF
951
- // extension hook and not actionable here.
952
- continue;
953
- }
954
-
955
- const target_node = record_index_of[target.node];
956
-
957
- assert.notEqual(
958
- target_node, -1,
959
- `animations[${a}].channels[${c}].target.node ${target.node} not resolved`
960
- );
961
-
962
- const sampler = gltf_animation.samplers[gltf_channel.sampler];
963
- const times = read_accessor_as_float32_array(sampler.input);
964
- const values = read_accessor_as_float32_array(sampler.output);
965
- const interpolation = gltf_interpolation_to_kind(sampler.interpolation);
966
- const component_count = node3d_property_component_count(property);
967
-
968
- // Canonicalize quaternion signs on rotation channels.
969
- //
970
- // glTF stores rotation keyframes as raw (x, y, z, w)
971
- // quaternions, but `q` and `-q` represent the same
972
- // orientation. Authoring tools (notably Mixamo) often
973
- // alternate signs across consecutive keyframes when a
974
- // bone passes through 180°. Per-component interpolation
975
- // between sign-mismatched keyframes — especially
976
- // CUBICSPLINE — passes through near-zero quaternions
977
- // mid-segment; the apply shader's `normalize(value)`
978
- // call then produces an effectively-identity quaternion
979
- // for one frame, which reads as a one-frame snap to
980
- // bind pose.
981
- //
982
- // Fix: flip the sign of every keyframe whose val-quat
983
- // has negative dot product with the prior keyframe's
984
- // val-quat. For CUBICSPLINE, flip the in/out tangents
985
- // alongside the value so the cubic stays consistent.
986
- // The leading sign is anchored against the target
987
- // node's authored rest rotation so all clips driving
988
- // one node land in the same hemisphere — required
989
- // for weighted multi-clip blends, where the pose
990
- // accumulator sums raw components across clips.
991
- // No-op when the property isn't Rotation, or when the
992
- // data was already canonicalized at export time.
993
- if (property === Node3DProperty.Rotation && times.length >= 1) {
994
- // `canonicalize_quaternion_signs` reads the rest rotation by component name,
995
- // which a `Transform64` does not offer — hand it a quaternion instead
996
- const rest = bundle.nodes[target_node].local;
997
-
998
- SCRATCH_REST_ROTATION.set(
999
- rest.rotation_x,
1000
- rest.rotation_y,
1001
- rest.rotation_z,
1002
- rest.rotation_w
1003
- );
1004
-
1005
- canonicalize_quaternion_signs(
1006
- values, times.length, interpolation,
1007
- SCRATCH_REST_ROTATION
1008
- );
1009
- }
1010
-
1011
- // Build the per-axis curves object. component_count
1012
- // is property-driven (3 for Translation/Scale, 4 for
1013
- // Rotation); slots beyond what the property uses are
1014
- // omitted. The keys align with the GPU track's
1015
- // (x, y, z, w) vec4f output — see ShadeAnimationChannel.
1016
- const axis_keys = ['x', 'y', 'z', 'w'];
1017
- const curves = {};
1018
- for (let comp = 0; comp < component_count; comp++) {
1019
- const curve = new AnimationCurve();
1020
- curve_from_track_data(curve, interpolation, values, times, component_count, comp);
1021
- curves[axis_keys[comp]] = curve;
1022
- }
1023
-
1024
- channels.push(ShadeAnimationChannel.from({
1025
- target: target_node,
1026
- property,
1027
- curves,
1028
- }));
1029
- }
1030
-
1031
- if (channels.length === 0) {
1032
- // All channels were unsupported / unresolved — skip
1033
- // the clip entirely so we don't emit a zero-channel
1034
- // record the manager would reject.
1035
- continue;
1036
- }
1037
-
1038
- const clip = ShadeAnimationClip.from({
1039
- name: gltf_animation.name ?? "",
1040
- channels,
1041
- });
1042
-
1043
- // Default optimization pass: strip channels that
1044
- // evaluate to the identity transform and individual
1045
- // per-axis curves that are constant at identity, then
1046
- // key-reduce the survivors. glTF exporters often emit
1047
- // redundant bind-pose channels (every joint gets a
1048
- // translation channel even when only rotation is
1049
- // animated), so this typically trims a sizeable
1050
- // fraction of the channel + curve count. Behaviour
1051
- // unchanged — applying the optimised clip produces
1052
- // the same poses.
1053
- //
1054
- // Stats are computed by diffing channel + total-curve
1055
- // counts before and after; the methods don't carry
1056
- // them in their return values.
1057
- const before_channels = clip.channels.length;
1058
- let before_curves = 0;
1059
- for (let i = 0; i < clip.channels.length; i++) {
1060
- before_curves += clip.channels[i].curve_count;
1061
- }
1062
-
1063
- clip.optimize(target => bundle.nodes[target].local);
1064
-
1065
- const after_channels = clip.channels.length;
1066
- let after_curves = 0;
1067
- for (let i = 0; i < clip.channels.length; i++) {
1068
- after_curves += clip.channels[i].curve_count;
1069
- }
1070
-
1071
- const removed_channels = before_channels - after_channels;
1072
- const removed_curves = before_curves - after_curves;
1073
- if (removed_channels > 0 || removed_curves > 0) {
1074
- // console.log(
1075
- // `[load_gltf] optimised clip '${clip.name}': ` +
1076
- // `removed ${removed_channels} track(s), ` +
1077
- // `${removed_curves} curve(s)`
1078
- // );
1079
- }
1080
-
1081
- clips.push(clip);
1082
- }
1083
-
1084
- // console.profileEnd('parse-gltf');
1085
- // console.timeEnd('parse-gltf');
1086
-
1087
- bundle.skins = skins;
1088
- bundle.clips = clips;
1089
- bundle.lights = punctual_lights;
1090
- return bundle;
1091
- }
1092
-
1093
- return load_gltf_document(url, { assetManager, scope, fileMap, texture_support })
1094
- .then(process)
1095
- // .then(prepare_lightmap)
1096
- ;
1097
- }
1098
-
1099
- /**
1100
- * The same file, parsed and with its dependencies in memory, **without** being turned into anything
1101
- * a renderer draws: the glTF's own JSON alongside `buffers` as `Uint8Array`s and `images` as
1102
- * `ImageBitmap`s — or, for a `KHR_texture_basisu` image, as a `ShadeTexelData` already in a device
1103
- * format, because no browser decodes a KTX2 container into a bitmap.
1104
- *
1105
- * The half of {@link load_gltf} that is not about pictures. A glTF carries more than a scene to draw
1106
- * — collision hulls, navigation surfaces, spawn markers, whatever a tool reads accessors for — and
1107
- * those consumers want the accessors and the bytes behind them, not a {@link SceneBundle} they would
1108
- * have to take apart again.
1109
- *
1110
- * @param {string} url un-resolved — the asset manager resolves network paths
1111
- * @param {Object} options
1112
- * @param {AssetManager} options.assetManager
1113
- * @param {AssetRequestScope} [options.scope]
1114
- * @param {Map<string, File|Blob|ArrayBuffer>} [options.fileMap]
1115
- * @param {Set<GPUTextureFormat>} [options.texture_support] see {@link load_gltf}
1116
- * @returns {Promise<TinyGltf>}
1117
- */
1118
- export function load_gltf_document(url, { assetManager, scope, fileMap, texture_support } = {}) {
1119
- const gltf = new TinyGltf(assetManager, scope, texture_support);
1120
-
1121
- if (fileMap) {
1122
- gltf.fileMap = fileMap;
1123
- }
1124
-
1125
- return gltf.loadFromUrl(url);
1126
- }
1127
-
1128
-
1
+ import { assert } from "../../../../core/assert.js";
2
+ import { HashMap } from "../../../../core/collection/map/HashMap.js";
3
+ import { HashSet } from "../../../../core/collection/set/HashSet.js";
4
+ import { Color } from "../../../../core/color/Color.js";
5
+ import { Quaternion } from "../../../../core/geom/Quaternion.js";
6
+ import Vector3 from "../../../../core/geom/Vector3.js";
7
+ import { clamp } from "../../../../core/math/clamp.js";
8
+ import { clamp01 } from "../../../../core/math/clamp01.js";
9
+ import { computeObjectHash } from "../../../../core/math/hash/computeObjectHash.js";
10
+ import { inverseLerp } from "../../../../core/math/inverseLerp.js";
11
+ import { objectDeepEquals } from "../../../../core/model/object/objectDeepEquals.js";
12
+ import { AnimationInterpolationKind } from "../../../../engine/animation/clip/AnimationInterpolationKind.js";
13
+ import { curve_from_track_data } from "../../../../engine/animation/clip/curve_from_track_data.js";
14
+ import { AnimationCurve } from "../../../../engine/animation/curve/AnimationCurve.js";
15
+ import { t64_look_rotation } from "../../../../engine/ecs/transform/t64_look_rotation.js";
16
+ import { t64_transform_direction } from "../../../../engine/ecs/transform/t64_transform_direction.js";
17
+ import { meshopt_optimizeVertexCache } from "../../../../engine/graphics/geometry/optimization/VertexCacheOptimizer.js";
18
+ import { ShadeAnimationChannel } from "../../animation/ShadeAnimationChannel.js";
19
+ import { ShadeAnimationClip } from "../../animation/ShadeAnimationClip.js";
20
+ import { Skin } from "../../animation/Skin.js";
21
+ import { Attribute } from "../../geometry/Attribute.js";
22
+ import { Geometry, GeometryFlags } from "../../geometry/Geometry.js";
23
+ import { meshlet_geometry_build_from_geometry } from "../../geometry/meshlet_geometry_build_from_geometry.js";
24
+ import { StandardAttributes } from "../../geometry/StandardAttributes.js";
25
+ import { normalize_attribute } from "../../geometry/util/normalize_attribute.js";
26
+ import { DirectionalLight } from "../../light/model/DirectionalLight.js";
27
+ import { PointLight } from "../../light/model/PointLight.js";
28
+ import { SpotLight } from "../../light/model/SpotLight.js";
29
+
30
+ import { StandardShadeMaterial } from "../../material/StandardShadeMaterial.js";
31
+ import { Node3DProperty } from "../../object_property/Node3DProperty.js";
32
+ import { ShadeTexture } from "../../texture/ShadeTexture.js";
33
+ import { ShadeImage } from "../../texture/source/ShadeImage.js";
34
+ import { SceneBundle } from "../SceneBundle.js";
35
+ import { SceneNode } from "../SceneNode.js";
36
+ import { coalesce_array_duplicates } from "../../../../format/scene/gltf/coalesce_array_duplicates.js";
37
+ import { gltf_create_material } from "./gltf_create_material.js";
38
+ import { gltf_create_texture } from "./gltf_create_texture.js";
39
+ import { GLTF_PRIMITIVE_MODE, GLTF_PRIMITIVE_MODE_DEFAULT } from "../../../../format/scene/gltf/GLTF_PRIMITIVE_MODE.js";
40
+ import {
41
+ gltf_read_accessor,
42
+ gltf_read_accessor_as_float32_array
43
+ } from "../../../../format/scene/gltf/gltf_read_accessor.js";
44
+ import { gltf_texture_image_index, gltf_used_image_indices } from "../../../../format/scene/gltf/gltf_used_image_indices.js";
45
+ import { TinyGltf } from "./tiny-gltf.js";
46
+ import { quat3_canonicalize_sign_run } from "../../../../core/geom/3d/quaternion/quat3_canonicalize_sign_run.js";
47
+
48
+
49
+ /**
50
+ * Somewhere to hand `canonicalize_quaternion_signs` a rest rotation it can read by component name —
51
+ * a `Transform64` addresses its rotation by index, and the function's contract is named components.
52
+ *
53
+ * @type {Quaternion}
54
+ */
55
+ const SCRATCH_REST_ROTATION = new Quaternion();
56
+
57
+ /**
58
+ * Somewhere to read a light's facing before flipping it.
59
+ *
60
+ * @type {Vector3}
61
+ */
62
+ const SCRATCH_DIRECTION = new Vector3();
63
+ const OPTIMIZE_GEOMETRIES = false;
64
+
65
+ /**
66
+ * @see https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html
67
+ * @param {string} id
68
+ */
69
+ function gltf_attribute_id_to_standard(id) {
70
+ switch (id) {
71
+ case "POSITION":
72
+ return StandardAttributes.Position;
73
+ case "NORMAL":
74
+ return StandardAttributes.Normal;
75
+ case "TEXCOORD_0":
76
+ return StandardAttributes.TextureCoordinates0;
77
+ case "TEXCOORD_1":
78
+ return StandardAttributes.TextureCoordinates1;
79
+ case "TANGENT":
80
+ return StandardAttributes.Tangent;
81
+ case "COLOR_0":
82
+ return StandardAttributes.Color;
83
+ case "JOINTS_0":
84
+ return StandardAttributes.SkinningJoints;
85
+ case "WEIGHTS_0":
86
+ return StandardAttributes.SkinningWeights;
87
+ default:
88
+ return id;
89
+ }
90
+ }
91
+
92
+ /**
93
+ * Map glTF `animation.channels[].target.path` to {@link Node3DProperty}.
94
+ * Returns `-1` for paths we don't yet drive (morph-target `weights`),
95
+ * so the caller can skip those channels without throwing.
96
+ *
97
+ * @param {string} path
98
+ * @returns {number}
99
+ */
100
+ function gltf_animation_path_to_property(path) {
101
+ switch (path) {
102
+ case "translation":
103
+ return Node3DProperty.Translation;
104
+ case "rotation":
105
+ return Node3DProperty.Rotation;
106
+ case "scale":
107
+ return Node3DProperty.Scale;
108
+ default:
109
+ // "weights" (morph targets) lands here; we don't yet have
110
+ // morph-target support in the renderer.
111
+ return -1;
112
+ }
113
+ }
114
+
115
+ /**
116
+ * Number of scalar components per keyframe value for a given Node3D
117
+ * property — translation/scale = 3 (vec3), rotation = 4 (quaternion
118
+ * x/y/z/w).
119
+ *
120
+ * @param {number} property one of {@link Node3DProperty}
121
+ * @returns {number}
122
+ */
123
+ function node3d_property_component_count(property) {
124
+ switch (property) {
125
+ case Node3DProperty.Translation:
126
+ case Node3DProperty.Scale:
127
+ return 3;
128
+ case Node3DProperty.Rotation:
129
+ return 4;
130
+ default:
131
+ throw new Error(`Unsupported animated property ${property}`);
132
+ }
133
+ }
134
+
135
+ /**
136
+ * Walk a flat keyframe-values buffer for a rotation channel and flip
137
+ * the sign of any keyframe whose val-quaternion has negative dot
138
+ * product with the previous keyframe's val-quaternion. The same flip
139
+ * is applied to that keyframe's in/out tangents in CUBICSPLINE mode
140
+ * so the cubic remains internally consistent.
141
+ *
142
+ * The flip preserves the rotation (q and -q encode the same
143
+ * orientation) while ensuring per-component interpolation between
144
+ * consecutive keyframes follows the short arc instead of passing
145
+ * through a near-zero quaternion mid-segment.
146
+ *
147
+ * The curve's leading sign is anchored against `rest_rotation` —
148
+ * the target node's authored local rest rotation: when the first
149
+ * keyframe's val-quat has negative dot product with the rest
150
+ * quaternion, the whole first keyframe block is negated (and the
151
+ * consecutive-keyframe pass propagates that sign down the curve).
152
+ * Every rotation curve targeting one node aligns against the same
153
+ * reference, so weighted multi-clip blends accumulate
154
+ * hemisphere-consistent contributions instead of cancelling toward
155
+ * a near-zero quaternion. Residual limitation: the anchor is the
156
+ * FIRST keyframe only — a curve that swings more than 90° away
157
+ * from the rest rotation mid-clip can still contribute opposite
158
+ * signs to another clip at those times; fixing that would need
159
+ * apply-time alignment, which the atomic pose accumulator cannot
160
+ * do order-independently.
161
+ *
162
+ * Mutates `values` in place. Safe to call on an output array that's
163
+ * a fresh copy of the source accessor (which is what
164
+ * {@link read_accessor_as_float32_array} produces).
165
+ *
166
+ * Exported for spec coverage; not part of the loader's public API.
167
+ *
168
+ * The walk itself is {@link quat3_canonicalize_sign_run}, which
169
+ * `hemisphere_align_quaternion_values` in `engine/animation/clip` also runs — that one used to be a
170
+ * second, weaker implementation, handling only the 4-float stride and anchoring nothing.
171
+ *
172
+ * @param {Float32Array} values flat values: STEP/LINEAR uses 4
173
+ * floats/keyframe (x, y, z, w); CUBICSPLINE uses 12 (inX, inY,
174
+ * inZ, inW, valX, valY, valZ, valW, outX, outY, outZ, outW).
175
+ * @param {number} key_count
176
+ * @param {number} interpolation one of {@link AnimationInterpolationKind}
177
+ * @param {{x:number, y:number, z:number, w:number}} [rest_rotation]
178
+ * target node's authored local rest rotation; omitted → the
179
+ * leading sign is kept as authored.
180
+ */
181
+ export function canonicalize_quaternion_signs(values, key_count, interpolation, rest_rotation) {
182
+ const is_cubic = interpolation === AnimationInterpolationKind.CubicTangents;
183
+
184
+ // CUBICSPLINE has [in, val, out]; the val starts at offset 4, after the 4-float in-tangent.
185
+ // STEP/LINEAR has just val at 0.
186
+ quat3_canonicalize_sign_run(values, key_count, is_cubic ? 12 : 4, is_cubic ? 4 : 0, rest_rotation);
187
+ }
188
+
189
+ /**
190
+ * Map glTF interpolation strings to the engine's enum. Defaults to
191
+ * LINEAR when missing — the glTF spec's default.
192
+ *
193
+ * @param {string|undefined} interpolation
194
+ * @returns {number} one of {@link AnimationInterpolationKind}
195
+ */
196
+ function gltf_interpolation_to_kind(interpolation) {
197
+ switch (interpolation) {
198
+ case "STEP":
199
+ return AnimationInterpolationKind.Discrete;
200
+ case "CUBICSPLINE":
201
+ return AnimationInterpolationKind.CubicTangents;
202
+ case "LINEAR":
203
+ case undefined:
204
+ return AnimationInterpolationKind.Linear;
205
+ default:
206
+ throw new Error(`Unsupported interpolation '${interpolation}'`);
207
+ }
208
+ }
209
+
210
+ /**
211
+ * Input can be a .glb or .gltf file.
212
+ *
213
+ * Does not support most compression GLTF extensions such as draco, basis etc.
214
+ *
215
+ * Returns a {@link SceneBundle} that groups the parsed scene roots
216
+ * with any skins and animation clips extracted from the same asset.
217
+ * Callers add `bundle.scenes` to their scene, then pass the bundle's
218
+ * `skins` / `clips` to the scene's animation manager (e.g. via
219
+ * {@link GPUAnimationManager#register_skin} and
220
+ * {@link GPUAnimationManager#register_clip}) once the bundle has been
221
+ * compiled into a prefab and instantiated, so that the joints and targets
222
+ * are entities holding rows.
223
+ *
224
+ * @param {string} url un-resolved — the asset manager resolves network paths
225
+ * @param {Object} options
226
+ * @param {AssetManager} options.assetManager where the container, its buffers and its images come
227
+ * from. Required: a glTF is several files, and which of them are already in memory is not this
228
+ * parser's business to know.
229
+ * @param {AssetRequestScope} [options.scope] the load these requests belong to
230
+ * @param {Map<string, File|Blob|ArrayBuffer>} [options.fileMap] Map of relative paths to file data.
231
+ * When provided, buffer and image URIs in the GLTF are resolved from this map before the asset
232
+ * framework is asked. Enables multi-file GLTF loading from drag-and-drop.
233
+ * @param {Set<GPUTextureFormat>} [options.texture_support] what the device can sample, from
234
+ * `gpu_texture_compression_support(device)`. Only a `KHR_texture_basisu` image reads it, to choose
235
+ * what to transcode into; omitted, the loader targets the best format the transcoder writes.
236
+ * @return {Promise<SceneBundle>}
237
+ */
238
+ export function load_gltf(url, { assetManager, scope, fileMap, texture_support } = {}) {
239
+ // TODO
240
+ // apply some checks to the model, things like non-uniform scales, that can be fixed potentially
241
+ // see https://www.youtube.com/watch?v=FJRO5wFTEc8 for common ideas
242
+ // check for inverted normals
243
+ // check for duplicated vertices
244
+ // check for overlapping faces
245
+
246
+ async function process(gltf) {
247
+ // console.log(gltf);
248
+
249
+ /**
250
+ * @type {{type:string, componentType:number, count:number, bufferView:number, byteOffset:number, normalized:boolean, min?:number[], max?:number}[]}
251
+ */
252
+ const accessors = gltf.accessors;
253
+
254
+ /**
255
+ * `aabb` is six numbers, `[x0, y0, z0, x1, y1, z1]`, in world space — and is absent on a node
256
+ * that bounds nothing, meaning neither it nor anything below it declared any.
257
+ *
258
+ * {{aabb?:Float64Array, mesh:number, worldMatrix:Float32Array}[]}
259
+ */
260
+ const nodes = gltf.nodes;
261
+
262
+ /**
263
+ *
264
+ * @type {{aabb:Float64Array, primitives:({attributes:Object<number>,indices:number, material:number, mode:number}[])}[]}
265
+ */
266
+ const meshes = gltf.meshes;
267
+
268
+ /**
269
+ *
270
+ * @type {{}[]}
271
+ */
272
+ const scenes = gltf.scenes;
273
+
274
+ /**
275
+ * Engine Node3Ds indexed by glTF node index — populated lazily
276
+ * by {@link process_node} as the scene-graph recursion visits
277
+ * each node. Used afterwards to resolve skin joint references
278
+ * and animation channel targets (both of which point at glTF
279
+ * node indices, not at any in-memory object).
280
+ *
281
+ * @type {Node3D[]}
282
+ */
283
+ const record_index_of = new Int32Array((gltf.nodes ?? []).length).fill(-1);
284
+
285
+ // what the file becomes: nodes in pre-order, as the walk below produces them
286
+ const bundle = new SceneBundle();
287
+
288
+ /**
289
+ * Queue of pending `skin.meshes` pushes. process_node() can't
290
+ * resolve `node.skin → Skin` directly because skins[] is built
291
+ * *after* the recursion completes (the joint lookup needs
292
+ * node3d_by_index fully populated). So we enqueue the produced
293
+ * SkinnedMeshes here and drain into the matching skin once the
294
+ * walk finishes.
295
+ *
296
+ * @type {{ skin_index: number, meshes: Mesh[] }[]}
297
+ */
298
+ const skin_mesh_pushes = [];
299
+
300
+ /**
301
+ * Primitive converted to JSON string serves as key
302
+ * @type {Map<string, MeshletGeometry>}
303
+ */
304
+ const geometry_cache = new Map();
305
+
306
+ /**
307
+ *
308
+ * @type {HashSet<MeshletGeometry>}
309
+ */
310
+ const geometry_cache_secondary = new HashSet();
311
+
312
+ /**
313
+ * Indexed as `gltf.images` is, and populated only where an image was actually fetched.
314
+ *
315
+ * Built from {@link gltf_used_image_indices} rather than by mapping the whole list, because
316
+ * that is the same function the fetch is filtered by: the two cannot drift into decoding one
317
+ * set and sampling another, and there is no slot here for an image that was never brought in.
318
+ *
319
+ * @type {ShadeImage[]}
320
+ */
321
+ const mapped_images = [];
322
+
323
+ for (const index of gltf_used_image_indices(gltf)) {
324
+ const source = gltf.images[index];
325
+
326
+ /*
327
+ A `KHR_texture_basisu` image arrives already transcoded — the container reader ran in
328
+ the parser, where the bytes were, and what came back is texels in a device format. Every
329
+ other image is an `ImageBitmap` the browser decoded. Below this line the two are the same
330
+ thing: a `ShadeImage`, which is what §3.1 bought.
331
+ */
332
+ mapped_images[index] = source.isShadeTexelData === true
333
+ ? ShadeImage.fromTexelData(source)
334
+ : ShadeImage.fromImageBitmap(source);
335
+ }
336
+
337
+ /**
338
+ * used when no material is specified
339
+ * @type {StandardShadeMaterial}
340
+ */
341
+ const default_material = new StandardShadeMaterial();
342
+
343
+ /**
344
+ *
345
+ * @type {ShadeTexture[]}
346
+ */
347
+ const mapped_textures = (gltf.textures ?? []).map(gltf_texture => gltf_create_texture(
348
+ gltf_texture,
349
+ /*
350
+ The same function the fetch was filtered by. Asking it twice is the point: this is the
351
+ half that decides what to *sample*, and the half in `gltf_used_image_indices` decides
352
+ what to *fetch*. When those two disagreed, every model in the game's level failed to
353
+ load — see the note at the top of that file.
354
+ */
355
+ mapped_images[gltf_texture_image_index(gltf_texture)],
356
+ gltf.samplers
357
+ ));
358
+
359
+ coalesce_array_duplicates(mapped_textures);
360
+
361
+ // account for materials missing
362
+ const gltf_materials = gltf.materials ?? [];
363
+
364
+ const mapped_materials = gltf_materials.map(gltf_mat => gltf_create_material(gltf_mat, mapped_textures));
365
+
366
+ // dedupe materials
367
+ coalesce_array_duplicates(mapped_materials);
368
+
369
+
370
+ /**
371
+ * One accessor as an attribute in the shape the renderer stores it.
372
+ *
373
+ * The read itself — stride, sparse overlay, a view-less accessor's zeroes — belongs to the
374
+ * format and is done by {@link gltf_read_accessor}; what is left here is the engine's own
375
+ * question of which storage type an attribute of this name is kept in.
376
+ *
377
+ * @param {number} accessor_index
378
+ * @param {string} name
379
+ * @returns {Attribute}
380
+ */
381
+ function buffer_to_attribute(accessor_index, name) {
382
+ const data = gltf_read_accessor(gltf, accessor_index);
383
+
384
+ const raw_attribute = Attribute.from(data.values, data.components, name);
385
+
386
+ raw_attribute.spec.normalized = data.normalized;
387
+
388
+ return normalize_attribute(raw_attribute);
389
+ }
390
+
391
+ /**
392
+ *
393
+ * @type {HashMap<Object, Attribute>}
394
+ */
395
+ const attribute_cache = new HashMap({
396
+ keyEqualityFunction: objectDeepEquals,
397
+ keyHashFunction: computeObjectHash
398
+ });
399
+
400
+ /**
401
+ *
402
+ * @param {number} attribute_accessor
403
+ * @param {string} name
404
+ * @returns {Attribute}
405
+ */
406
+ function obtain_attribute(attribute_accessor, name) {
407
+ const key = {
408
+ attribute_accessor, name
409
+ };
410
+
411
+ let attribute = attribute_cache.get(key);
412
+
413
+ if (attribute === undefined) {
414
+ attribute = buffer_to_attribute(attribute_accessor, name);
415
+ attribute_cache.set(key, attribute);
416
+ } else {
417
+ // console.warn('attribute reuse')
418
+ }
419
+
420
+ return attribute;
421
+ }
422
+
423
+ /**
424
+ * An accessor's values as a flat `Float32Array`. Used for animation sampler inputs/outputs
425
+ * (times, values) and the skin inverse-bind matrices, where downstream code wants a
426
+ * stride-free flat buffer.
427
+ *
428
+ * This used to assert FLOAT and return the accessor's storage array verbatim, which refused
429
+ * a quantised animation outright in a development build and read it as raw integers in a
430
+ * shipped one — see {@link gltf_read_accessor_as_float32_array}, which is the rule glTF
431
+ * states for it and was already in the file next door.
432
+ *
433
+ * @param {number} accessor_index
434
+ * @returns {Float32Array}
435
+ */
436
+ function read_accessor_as_float32_array(accessor_index) {
437
+ return gltf_read_accessor_as_float32_array(gltf, accessor_index);
438
+ }
439
+
440
+ /**
441
+ *
442
+ * @returns {MeshletGeometry}
443
+ */
444
+ function primitive_to_geometry(primitive) {
445
+ const geometry = new Geometry();
446
+
447
+ const mode = primitive.mode ?? GLTF_PRIMITIVE_MODE_DEFAULT;
448
+
449
+ if (mode !== GLTF_PRIMITIVE_MODE.TRIANGLES) {
450
+ throw new Error('Unsupported draw method');
451
+ }
452
+
453
+ for (const attribute_key in primitive.attributes) {
454
+
455
+ const name = gltf_attribute_id_to_standard(attribute_key);
456
+
457
+ if (geometry.getAttribute(name) !== undefined) {
458
+ console.warn(`attribute '${name}' already exists, skipping. Primitive.attributes = ${JSON.stringify(primitive.attributes)}`)
459
+ }
460
+
461
+ /**
462
+ * @type {number}
463
+ */
464
+ const attribute_accessor = primitive.attributes[attribute_key];
465
+
466
+ let attribute;
467
+ try {
468
+ attribute = obtain_attribute(attribute_accessor, name);
469
+ } catch (e) {
470
+ console.warn(`Failed to parse attribute '${name}'. Skipping`, e);
471
+ continue;
472
+ }
473
+
474
+ geometry.addAttribute(attribute);
475
+
476
+
477
+ if (attribute_key === "POSITION") {
478
+ // The spec mandates POSITION accessors carry min/max,
479
+ // so we can adopt them as the bounding box without
480
+ // walking the vertex data. The sphere is derived from
481
+ // the box inside meshlet_geometry_build_from_geometry,
482
+ // so we just clear the dirty flag here.
483
+ const accessor = accessors[attribute_accessor];
484
+
485
+ if (accessor.min !== undefined && accessor.max !== undefined) {
486
+ geometry.bounding_box.set([
487
+ ...accessor.min,
488
+ ...accessor.max
489
+ ]);
490
+
491
+ geometry.clearFlag(GeometryFlags.BoundsNeedUpdate);
492
+ }
493
+ }
494
+ }
495
+
496
+ if (primitive.indices !== undefined) {
497
+
498
+ geometry.index = obtain_attribute(primitive.indices, 'index');
499
+
500
+ // geometry_fix_index(geometry.index, geometry.getVertexCount());
501
+ }
502
+
503
+
504
+ // vertex optimize
505
+ if (geometry.index !== null && OPTIMIZE_GEOMETRIES) {
506
+ meshopt_optimizeVertexCache(geometry.index.data, geometry.index.data, geometry.index.count, geometry.getVertexCount());
507
+ }
508
+
509
+ return meshlet_geometry_build_from_geometry(geometry);
510
+ }
511
+
512
+ function obtain_geometry_by_primitive(primitive) {
513
+ const key = JSON.stringify(primitive);
514
+
515
+ let geometry = geometry_cache.get(key);
516
+
517
+ if (geometry === undefined) {
518
+ geometry = primitive_to_geometry(primitive)
519
+
520
+ const secondary_cached = geometry_cache_secondary.get(geometry);
521
+
522
+ if (secondary_cached !== undefined) {
523
+ // found an equivalent geometry in the secondary cache, use it instead
524
+ geometry = secondary_cached;
525
+ // console.warn("secondary reuse");
526
+ } else {
527
+ geometry_cache_secondary.add(geometry);
528
+ }
529
+
530
+ geometry_cache.set(key, geometry);
531
+ } else {
532
+ // console.warn('geometry reuse');
533
+ }
534
+
535
+ return geometry;
536
+ }
537
+
538
+
539
+ /**
540
+ * Build the renderable mesh(es) for one glTF node.
541
+ *
542
+ * A glTF mesh is a list of primitives sharing a name and an
543
+ * `aabb`, and each primitive becomes one engine-side {@link Mesh}.
544
+ * When the owning glTF node references a skin, every primitive is
545
+ * instead constructed as a {@link SkinnedMesh} so the renderer
546
+ * routes it through a per-instance geometry clone for deformation.
547
+ *
548
+ * @param {number} mesh_index
549
+ * @param {{}} node
550
+ * @param {boolean} is_skinned
551
+ * @returns {Mesh[]}
552
+ */
553
+ function process_mesh(mesh_index) {
554
+
555
+ const mesh = meshes[mesh_index];
556
+
557
+ const primitives = mesh.primitives;
558
+
559
+ const primitive_count = primitives.length;
560
+
561
+ /**
562
+ * @type {{geometry: MeshletGeometry, material: StandardShadeMaterial, name: string}[]}
563
+ */
564
+ const result = [];
565
+
566
+ for (let i = 0; i < primitive_count; i++) {
567
+ const primitive = primitives[i];
568
+
569
+ // build geometry
570
+
571
+ /**
572
+ * @type {MeshletGeometry}
573
+ */
574
+ let geometry;
575
+
576
+ try {
577
+ geometry = obtain_geometry_by_primitive(primitive);
578
+ } catch (e) {
579
+ console.error(`Failed to obtain geometry for primitive [${i}] ${primitive}. `, e);
580
+ console.log('Ignoring mesh');
581
+ continue;
582
+ }
583
+
584
+ if (primitive_count === 1 && mesh.name !== undefined) {
585
+ geometry.name = mesh.name;
586
+ }
587
+
588
+ const material_id = primitive.material;
589
+
590
+ let material;
591
+
592
+ if (material_id !== undefined) {
593
+ material = mapped_materials[material_id];
594
+
595
+ if (material === undefined) {
596
+ console.warn(`specified material ${material_id} does not exist. Using default.`);
597
+
598
+ material = default_material;
599
+ }
600
+
601
+ } else {
602
+ // no material specified, use default
603
+ material = default_material;
604
+ }
605
+
606
+ result.push({ geometry, material, name: mesh.name ?? "" });
607
+ }
608
+
609
+ return result;
610
+ }
611
+
612
+ /**
613
+ *
614
+ * @param {number} light_index
615
+ * @param {{}} node
616
+ * @returns {AbstractLight}
617
+ */
618
+ function process_light(light_index, node) {
619
+
620
+ // SPEC: https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_lights_punctual/README.md
621
+
622
+ const gltf_light = gltf.extensions.KHR_lights_punctual.lights[light_index];
623
+
624
+ // parse color
625
+ const color = new Color();
626
+
627
+ if (gltf_light.color !== undefined) {
628
+ color.fromArray(gltf_light.color);
629
+ } else {
630
+ color.setRGB(1, 1, 1);
631
+ }
632
+
633
+ const intensity = gltf_light.intensity ?? 1;
634
+
635
+ const name = gltf_light.name ?? "";
636
+
637
+ let light;
638
+
639
+ const type = gltf_light.type;
640
+
641
+ switch (type) {
642
+ case "directional":
643
+ light = new DirectionalLight();
644
+ break;
645
+ case "point":
646
+ light = new PointLight();
647
+ // glTF: no `range` means the light is unbounded, which is what the cull
648
+ // shaders read `distance <= 0` as. 1e20 was a stand-in that they took as a
649
+ // real extent instead.
650
+ light.distance = gltf_light.range ?? 0;
651
+ break;
652
+ case "spot":
653
+ light = new SpotLight();
654
+
655
+ const gltf_spot = gltf_light.spot;
656
+
657
+ const outerCone = gltf_spot?.outerConeAngle ?? (Math.PI / 4); // default PI/4
658
+ const innerCone = gltf_spot?.innerConeAngle ?? 0;
659
+
660
+ light.angle = clamp(
661
+ outerCone,
662
+ 0,
663
+ Math.PI / 2
664
+ );
665
+
666
+ light.penumbra = clamp01(
667
+ inverseLerp(light.angle, 0, innerCone)
668
+ );
669
+
670
+ // as above: the sentinel, not a very large number the cone bounds will
671
+ // overflow on
672
+ light.distance = gltf_light.range ?? 0;
673
+ // TODO rotation is messed up?
674
+ break;
675
+ default:
676
+ throw new Error(`Unsupported light type ${type}`);
677
+ }
678
+
679
+ light.color.copy(color);
680
+ light.intensity = intensity;
681
+ light.name = name;
682
+
683
+ // check for light radius
684
+ light.radius = gltf_light.extras?.radius ?? 0;
685
+
686
+ light.near_clip_distance = gltf_light.extras?.near_clip_distance ?? light.radius;
687
+
688
+ light.casts_shadow = true;
689
+
690
+ return light;
691
+ }
692
+
693
+ /**
694
+ * Declared ahead of `process_node`, which pushes into it, because the scene walk that calls
695
+ * `process_node` runs before the point where this used to be declared — so the push landed
696
+ * in the `const`'s temporal dead zone and threw `ReferenceError: Cannot access
697
+ * 'punctual_lights' before initialization`. Inside the `try` that wraps `process_light`,
698
+ * whose `catch` logs "Failed to process light" and moves on: so every KHR_lights_punctual
699
+ * light in every glTF was dropped, and the console said the light had failed to parse.
700
+ * @type {{light: import("../../light/model/Light.js").Light, node: number}[]}
701
+ */
702
+ const punctual_lights = [];
703
+
704
+ /**
705
+ *
706
+ * @param {Node3D} parent
707
+ * @param {number} node_index
708
+ */
709
+ function process_node(parent, node_index) {
710
+ const node = nodes[node_index];
711
+
712
+ // glTF "skin" attaches at the node, not the mesh: every primitive of the referenced
713
+ // mesh deforms against this skin. Resolved later, against `skins[]`, which is built
714
+ // after the walk — the joints may be visited *after* this node — so the primitives
715
+ // produced here are queued and pushed into `skin.meshes` once the walk finishes.
716
+ const skin_index = typeof node.skin === "number" ? node.skin : -1;
717
+
718
+ const record = new SceneNode();
719
+
720
+ record.parent = parent;
721
+
722
+ if (node.name !== undefined) {
723
+ record.name = node.name;
724
+ }
725
+
726
+ const t = record.local;
727
+
728
+ if (node.matrix !== undefined) {
729
+ t.fromMatrix(node.matrix);
730
+ } else {
731
+ if (node.translation !== undefined) {
732
+ const v = node.translation;
733
+ t.setTranslation(v[0], v[1], v[2]);
734
+ }
735
+
736
+ if (node.rotation !== undefined) {
737
+ const q = node.rotation;
738
+ t.setRotation(q[0], q[1], q[2], q[3]);
739
+ }
740
+
741
+ if (node.scale !== undefined) {
742
+ const v = node.scale;
743
+ t.setScale(v[0], v[1], v[2]);
744
+ }
745
+
746
+ t.updateMatrix();
747
+ }
748
+
749
+ const index = bundle.add_node(record);
750
+
751
+ // joint refs, channel targets and light anchors resolve through this once the
752
+ // recursion unwinds
753
+ record_index_of[node_index] = index;
754
+
755
+ if (node.extensions !== undefined && node.extensions.KHR_lights_punctual !== undefined) {
756
+ const light_index = node.extensions.KHR_lights_punctual.light;
757
+
758
+ try {
759
+ // a light is not a node: the node is where it is, and the bundle carries the pair
760
+ const punctual = process_light(light_index, node);
761
+
762
+ if (punctual.isDirectionalLight === true || punctual.isSpotLight === true) {
763
+ // glTF lights shine along their local -Z; engine convention is forward =
764
+ // shining direction. The direction is read off the matrix, which the
765
+ // record keeps current.
766
+ t64_transform_direction(SCRATCH_DIRECTION, t, 0, 0, 1);
767
+ t64_look_rotation(
768
+ t,
769
+ -SCRATCH_DIRECTION.x, -SCRATCH_DIRECTION.y, -SCRATCH_DIRECTION.z,
770
+ 0, 1, 0
771
+ );
772
+ t.updateMatrix();
773
+ }
774
+
775
+ punctual_lights.push({ light: punctual, node: index });
776
+ } catch (e) {
777
+ console.error("Failed to process light ", light_index, " ", e);
778
+ }
779
+ }
780
+
781
+ if (typeof node.mesh === "number") {
782
+ const primitives = process_mesh(node.mesh);
783
+
784
+ /** @type {number[]} the records that draw this mesh's primitives */
785
+ const produced = [];
786
+
787
+ if (primitives.length === 1) {
788
+ // the node is the primitive. Its name wins over the mesh's, which is what the
789
+ // pose query names parts by; the geometry keeps the mesh's own
790
+ const primitive = primitives[0];
791
+
792
+ record.geometry = primitive.geometry;
793
+ record.material = primitive.material;
794
+
795
+ if (node.name === undefined) {
796
+ record.name = primitive.name;
797
+ }
798
+
799
+ produced.push(index);
800
+ } else {
801
+ // one child per primitive, each named after the mesh, at the node's own place
802
+ for (let i = 0; i < primitives.length; i++) {
803
+ const primitive = primitives[i];
804
+ const child = new SceneNode();
805
+
806
+ child.parent = index;
807
+ child.name = primitive.name;
808
+ child.geometry = primitive.geometry;
809
+ child.material = primitive.material;
810
+
811
+ produced.push(bundle.add_node(child));
812
+ }
813
+ }
814
+
815
+ if (skin_index !== -1 && produced.length > 0) {
816
+ skin_mesh_pushes.push({
817
+ skin_index,
818
+ meshes: produced,
819
+ });
820
+ }
821
+ }
822
+
823
+ if (node.children !== undefined) {
824
+ for (let i = 0; i < node.children.length; i++) {
825
+ process_node(index, node.children[i]);
826
+ }
827
+ }
828
+ }
829
+
830
+ for (let i = 0; i < scenes.length; i++) {
831
+ const scene = scenes[i];
832
+
833
+ // a root per glTF scene, unnamed and at the identity — what the prefab compiler folds
834
+ const scene_root = bundle.add_node(new SceneNode());
835
+
836
+ /**
837
+ * @type {number[]}
838
+ */
839
+ const scene_nodes = scene.nodes;
840
+ const node_count = scene_nodes.length;
841
+
842
+ for (let i = 0; i < node_count; i++) {
843
+ process_node(scene_root, scene_nodes[i]);
844
+ }
845
+ }
846
+
847
+ // ── Skins ──────────────────────────────────────────────────
848
+ //
849
+ // Build {@link Skin} objects from `gltf.skins[]`. Joints
850
+ // resolve to node indices through `record_index_of` (fully
851
+ // populated by the recursion above). Inverse-bind matrices
852
+ // come from a single MAT4 accessor — `joint_count * 16` f32s
853
+ // laid out column-major, copied into a flat Float32Array that
854
+ // the manager can subarray-view at registration time.
855
+ const skins = (gltf.skins ?? []).map((gltf_skin, skin_index) => {
856
+ const joint_indices = gltf_skin.joints;
857
+ const joint_count = joint_indices.length;
858
+
859
+ const joint_nodes = new Array(joint_count);
860
+ for (let i = 0; i < joint_count; i++) {
861
+ const joint_node_index = joint_indices[i];
862
+ const joint_node = record_index_of[joint_node_index];
863
+
864
+ assert.notEqual(
865
+ joint_node, -1,
866
+ `skin[${skin_index}].joints[${i}] references unknown node index ${joint_node_index}`
867
+ );
868
+
869
+ joint_nodes[i] = joint_node;
870
+ }
871
+
872
+ // Inverse-bind matrices: glTF stores them MAT4-typed
873
+ // (column-major, 16 f32s per joint). When the accessor is
874
+ // omitted, the spec says every joint's IBM is identity —
875
+ // we materialise that here so the manager always sees a
876
+ // ready-to-use flat array.
877
+ let inverse_bind_matrices;
878
+ if (gltf_skin.inverseBindMatrices !== undefined) {
879
+ inverse_bind_matrices = read_accessor_as_float32_array(gltf_skin.inverseBindMatrices);
880
+ } else {
881
+ inverse_bind_matrices = new Float32Array(joint_count * 16);
882
+ for (let i = 0; i < joint_count; i++) {
883
+ inverse_bind_matrices[i * 16 + 0] = 1;
884
+ inverse_bind_matrices[i * 16 + 5] = 1;
885
+ inverse_bind_matrices[i * 16 + 10] = 1;
886
+ inverse_bind_matrices[i * 16 + 15] = 1;
887
+ }
888
+ }
889
+
890
+ return Skin.from({
891
+ name: gltf_skin.name ?? "",
892
+ joints: joint_nodes,
893
+ inverse_bind_matrices,
894
+ meshes: [],
895
+ });
896
+ });
897
+
898
+ // Drain the deferred skin.meshes pushes captured during the
899
+ // node walk.
900
+ for (let i = 0; i < skin_mesh_pushes.length; i++) {
901
+ const { skin_index, meshes: skin_meshes } = skin_mesh_pushes[i];
902
+ skins[skin_index].meshes.push(...skin_meshes);
903
+ }
904
+
905
+ // ── Animation clips ───────────────────────────────────────
906
+ //
907
+ // One glTF animation → one {@link ShadeAnimationClip}. Each
908
+ // channel becomes a {@link ShadeAnimationChannel}; per-component
909
+ // curves are built from the sampler's input (times) / output
910
+ // (values) accessors via the engine's curve_from_track_data
911
+ // helpers, which already handle STEP / LINEAR / CUBICSPLINE.
912
+ const clips = [];
913
+
914
+ const gltf_animations = gltf.animations ?? [];
915
+ for (let a = 0; a < gltf_animations.length; a++) {
916
+ const gltf_animation = gltf_animations[a];
917
+
918
+ const channels = [];
919
+
920
+ for (let c = 0; c < gltf_animation.channels.length; c++) {
921
+ const gltf_channel = gltf_animation.channels[c];
922
+ const target = gltf_channel.target;
923
+
924
+ const property = gltf_animation_path_to_property(target.path);
925
+ if (property === -1) {
926
+ // Morph-target weights or other unsupported paths.
927
+ continue;
928
+ }
929
+
930
+ if (target.node === undefined) {
931
+ // Channels without a node target are a glTF
932
+ // extension hook and not actionable here.
933
+ continue;
934
+ }
935
+
936
+ const target_node = record_index_of[target.node];
937
+
938
+ assert.notEqual(
939
+ target_node, -1,
940
+ `animations[${a}].channels[${c}].target.node ${target.node} not resolved`
941
+ );
942
+
943
+ const sampler = gltf_animation.samplers[gltf_channel.sampler];
944
+ const times = read_accessor_as_float32_array(sampler.input);
945
+ const values = read_accessor_as_float32_array(sampler.output);
946
+ const interpolation = gltf_interpolation_to_kind(sampler.interpolation);
947
+ const component_count = node3d_property_component_count(property);
948
+
949
+ // Canonicalize quaternion signs on rotation channels.
950
+ //
951
+ // glTF stores rotation keyframes as raw (x, y, z, w)
952
+ // quaternions, but `q` and `-q` represent the same
953
+ // orientation. Authoring tools (notably Mixamo) often
954
+ // alternate signs across consecutive keyframes when a
955
+ // bone passes through 180°. Per-component interpolation
956
+ // between sign-mismatched keyframes — especially
957
+ // CUBICSPLINE — passes through near-zero quaternions
958
+ // mid-segment; the apply shader's `normalize(value)`
959
+ // call then produces an effectively-identity quaternion
960
+ // for one frame, which reads as a one-frame snap to
961
+ // bind pose.
962
+ //
963
+ // Fix: flip the sign of every keyframe whose val-quat
964
+ // has negative dot product with the prior keyframe's
965
+ // val-quat. For CUBICSPLINE, flip the in/out tangents
966
+ // alongside the value so the cubic stays consistent.
967
+ // The leading sign is anchored against the target
968
+ // node's authored rest rotation so all clips driving
969
+ // one node land in the same hemisphere — required
970
+ // for weighted multi-clip blends, where the pose
971
+ // accumulator sums raw components across clips.
972
+ // No-op when the property isn't Rotation, or when the
973
+ // data was already canonicalized at export time.
974
+ if (property === Node3DProperty.Rotation && times.length >= 1) {
975
+ // `canonicalize_quaternion_signs` reads the rest rotation by component name,
976
+ // which a `Transform64` does not offer — hand it a quaternion instead
977
+ const rest = bundle.nodes[target_node].local;
978
+
979
+ SCRATCH_REST_ROTATION.set(
980
+ rest.rotation_x,
981
+ rest.rotation_y,
982
+ rest.rotation_z,
983
+ rest.rotation_w
984
+ );
985
+
986
+ canonicalize_quaternion_signs(
987
+ values, times.length, interpolation,
988
+ SCRATCH_REST_ROTATION
989
+ );
990
+ }
991
+
992
+ // Build the per-axis curves object. component_count
993
+ // is property-driven (3 for Translation/Scale, 4 for
994
+ // Rotation); slots beyond what the property uses are
995
+ // omitted. The keys align with the GPU track's
996
+ // (x, y, z, w) vec4f output — see ShadeAnimationChannel.
997
+ const axis_keys = ['x', 'y', 'z', 'w'];
998
+ const curves = {};
999
+ for (let comp = 0; comp < component_count; comp++) {
1000
+ const curve = new AnimationCurve();
1001
+ curve_from_track_data(curve, interpolation, values, times, component_count, comp);
1002
+ curves[axis_keys[comp]] = curve;
1003
+ }
1004
+
1005
+ channels.push(ShadeAnimationChannel.from({
1006
+ target: target_node,
1007
+ property,
1008
+ curves,
1009
+ }));
1010
+ }
1011
+
1012
+ if (channels.length === 0) {
1013
+ // All channels were unsupported / unresolved — skip
1014
+ // the clip entirely so we don't emit a zero-channel
1015
+ // record the manager would reject.
1016
+ continue;
1017
+ }
1018
+
1019
+ const clip = ShadeAnimationClip.from({
1020
+ name: gltf_animation.name ?? "",
1021
+ channels,
1022
+ });
1023
+
1024
+ // Default optimization pass: strip channels that
1025
+ // evaluate to the identity transform and individual
1026
+ // per-axis curves that are constant at identity, then
1027
+ // key-reduce the survivors. glTF exporters often emit
1028
+ // redundant bind-pose channels (every joint gets a
1029
+ // translation channel even when only rotation is
1030
+ // animated), so this typically trims a sizeable
1031
+ // fraction of the channel + curve count. Behaviour
1032
+ // unchanged — applying the optimised clip produces
1033
+ // the same poses.
1034
+ //
1035
+ // Stats are computed by diffing channel + total-curve
1036
+ // counts before and after; the methods don't carry
1037
+ // them in their return values.
1038
+ const before_channels = clip.channels.length;
1039
+ let before_curves = 0;
1040
+ for (let i = 0; i < clip.channels.length; i++) {
1041
+ before_curves += clip.channels[i].curve_count;
1042
+ }
1043
+
1044
+ clip.optimize(target => bundle.nodes[target].local);
1045
+
1046
+ const after_channels = clip.channels.length;
1047
+ let after_curves = 0;
1048
+ for (let i = 0; i < clip.channels.length; i++) {
1049
+ after_curves += clip.channels[i].curve_count;
1050
+ }
1051
+
1052
+ const removed_channels = before_channels - after_channels;
1053
+ const removed_curves = before_curves - after_curves;
1054
+ if (removed_channels > 0 || removed_curves > 0) {
1055
+ // console.log(
1056
+ // `[load_gltf] optimised clip '${clip.name}': ` +
1057
+ // `removed ${removed_channels} track(s), ` +
1058
+ // `${removed_curves} curve(s)`
1059
+ // );
1060
+ }
1061
+
1062
+ clips.push(clip);
1063
+ }
1064
+
1065
+ // console.profileEnd('parse-gltf');
1066
+ // console.timeEnd('parse-gltf');
1067
+
1068
+ bundle.skins = skins;
1069
+ bundle.clips = clips;
1070
+ bundle.lights = punctual_lights;
1071
+ return bundle;
1072
+ }
1073
+
1074
+ return load_gltf_document(url, { assetManager, scope, fileMap, texture_support })
1075
+ .then(process)
1076
+ // .then(prepare_lightmap)
1077
+ ;
1078
+ }
1079
+
1080
+ /**
1081
+ * The same file, parsed and with its dependencies in memory, **without** being turned into anything
1082
+ * a renderer draws: the glTF's own JSON alongside `buffers` as `Uint8Array`s and `images` as
1083
+ * `ImageBitmap`s — or, for a `KHR_texture_basisu` image, as a `ShadeTexelData` already in a device
1084
+ * format, because no browser decodes a KTX2 container into a bitmap.
1085
+ *
1086
+ * The half of {@link load_gltf} that is not about pictures. A glTF carries more than a scene to draw
1087
+ * — collision hulls, navigation surfaces, spawn markers, whatever a tool reads accessors for — and
1088
+ * those consumers want the accessors and the bytes behind them, not a {@link SceneBundle} they would
1089
+ * have to take apart again.
1090
+ *
1091
+ * @param {string} url un-resolved — the asset manager resolves network paths
1092
+ * @param {Object} options
1093
+ * @param {AssetManager} options.assetManager
1094
+ * @param {AssetRequestScope} [options.scope]
1095
+ * @param {Map<string, File|Blob|ArrayBuffer>} [options.fileMap]
1096
+ * @param {Set<GPUTextureFormat>} [options.texture_support] see {@link load_gltf}
1097
+ * @returns {Promise<TinyGltf>}
1098
+ */
1099
+ export function load_gltf_document(url, { assetManager, scope, fileMap, texture_support } = {}) {
1100
+ const gltf = new TinyGltf(assetManager, scope, texture_support);
1101
+
1102
+ if (fileMap) {
1103
+ gltf.fileMap = fileMap;
1104
+ }
1105
+
1106
+ return gltf.loadFromUrl(url);
1107
+ }
1108
+
1109
+