@woosh/meep-engine 3.43.0 → 3.45.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 (466) hide show
  1. package/build/bundle-worker-terrain.js +1 -1
  2. package/editor/prototypeEditorShell.d.ts.map +1 -1
  3. package/editor/prototypeEditorShell.js +4 -2
  4. package/package.json +1 -1
  5. package/src/core/collection/array/array_sort_insertion_ascending.d.ts +19 -0
  6. package/src/core/collection/array/array_sort_insertion_ascending.d.ts.map +1 -0
  7. package/src/core/collection/array/array_sort_insertion_ascending.js +31 -0
  8. package/src/core/geom/3d/aabb/aabb3_array_round_outward_f32.d.ts +27 -0
  9. package/src/core/geom/3d/aabb/aabb3_array_round_outward_f32.d.ts.map +1 -0
  10. package/src/core/geom/3d/aabb/aabb3_array_round_outward_f32.js +39 -0
  11. package/src/core/geom/3d/aabb/aabb3_from_v3_array.d.ts.map +1 -1
  12. package/src/core/geom/3d/aabb/aabb3_from_v3_array.js +4 -1
  13. package/src/core/geom/3d/aabb/aabb3_transform_oriented.d.ts +2 -2
  14. package/src/core/geom/3d/aabb/aabb3_transform_oriented.d.ts.map +1 -1
  15. package/src/core/geom/3d/aabb/aabb3_transform_oriented.js +1 -1
  16. package/src/core/geom/3d/pose/pose3_apply_inverse_point_array.d.ts +21 -0
  17. package/src/core/geom/3d/pose/pose3_apply_inverse_point_array.d.ts.map +1 -0
  18. package/src/core/geom/3d/pose/pose3_apply_inverse_point_array.js +36 -0
  19. package/src/core/geom/3d/pose/pose3_apply_point_array.d.ts +25 -0
  20. package/src/core/geom/3d/pose/pose3_apply_point_array.d.ts.map +1 -0
  21. package/src/core/geom/3d/pose/pose3_apply_point_array.js +40 -0
  22. package/src/core/geom/3d/pose/pose3_compose_array.d.ts +28 -0
  23. package/src/core/geom/3d/pose/pose3_compose_array.d.ts.map +1 -0
  24. package/src/core/geom/3d/pose/pose3_compose_array.js +41 -0
  25. package/src/core/geom/3d/pose/pose3_to_local_array.d.ts +29 -0
  26. package/src/core/geom/3d/pose/pose3_to_local_array.d.ts.map +1 -0
  27. package/src/core/geom/3d/pose/pose3_to_local_array.js +42 -0
  28. package/src/core/geom/3d/quaternion/quat3_clamp_angle_array.d.ts +28 -0
  29. package/src/core/geom/3d/quaternion/quat3_clamp_angle_array.d.ts.map +1 -0
  30. package/src/core/geom/3d/quaternion/quat3_clamp_angle_array.js +66 -0
  31. package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_left_array.d.ts +22 -0
  32. package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_left_array.d.ts.map +1 -0
  33. package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_left_array.js +30 -0
  34. package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_right_array.d.ts +23 -0
  35. package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_right_array.d.ts.map +1 -0
  36. package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_right_array.js +31 -0
  37. package/src/core/geom/3d/triangle/tri3_compute_normal_area_weighted_array.d.ts +26 -0
  38. package/src/core/geom/3d/triangle/tri3_compute_normal_area_weighted_array.d.ts.map +1 -0
  39. package/src/core/geom/3d/triangle/tri3_compute_normal_area_weighted_array.js +46 -0
  40. package/src/core/geom/vec3/v3_distance_array.d.ts +11 -0
  41. package/src/core/geom/vec3/v3_distance_array.d.ts.map +1 -0
  42. package/src/core/geom/vec3/v3_distance_array.js +19 -0
  43. package/src/core/geom/vec3/v3_normalize_array_checked.d.ts +23 -0
  44. package/src/core/geom/vec3/v3_normalize_array_checked.d.ts.map +1 -0
  45. package/src/core/geom/vec3/v3_normalize_array_checked.js +49 -0
  46. package/src/core/geom/vec3/v3_reject_array.d.ts +15 -0
  47. package/src/core/geom/vec3/v3_reject_array.d.ts.map +1 -0
  48. package/src/core/geom/vec3/v3_reject_array.js +32 -0
  49. package/src/core/graph/csr/csr_build_incidence.d.ts +26 -0
  50. package/src/core/graph/csr/csr_build_incidence.d.ts.map +1 -0
  51. package/src/core/graph/csr/csr_build_incidence.js +71 -0
  52. package/src/core/graph/csr/csr_graph_color_greedy.d.ts +25 -0
  53. package/src/core/graph/csr/csr_graph_color_greedy.d.ts.map +1 -0
  54. package/src/core/graph/csr/csr_graph_color_greedy.js +83 -0
  55. package/src/core/graph/csr/csr_graph_validate_coloring.d.ts +15 -0
  56. package/src/core/graph/csr/csr_graph_validate_coloring.d.ts.map +1 -0
  57. package/src/core/graph/csr/csr_graph_validate_coloring.js +33 -0
  58. package/src/core/math/linalg/matrix_symmetric_3x3_solve_ldlt.d.ts +26 -0
  59. package/src/core/math/linalg/matrix_symmetric_3x3_solve_ldlt.d.ts.map +1 -0
  60. package/src/core/math/linalg/matrix_symmetric_3x3_solve_ldlt.js +71 -0
  61. package/src/core/math/max2_exact.d.ts +15 -0
  62. package/src/core/math/max2_exact.d.ts.map +1 -0
  63. package/src/core/math/max2_exact.js +30 -0
  64. package/src/core/math/min2_exact.d.ts +20 -0
  65. package/src/core/math/min2_exact.d.ts.map +1 -0
  66. package/src/core/math/min2_exact.js +35 -0
  67. package/src/engine/Clock.d.ts +15 -0
  68. package/src/engine/Clock.d.ts.map +1 -1
  69. package/src/engine/Clock.js +29 -5
  70. package/src/engine/Engine.d.ts.map +1 -1
  71. package/src/engine/Engine.js +11 -19
  72. package/src/engine/ecs/ik/IKGoalSystem.d.ts.map +1 -1
  73. package/src/engine/ecs/ik/IKGoalSystem.js +3 -19
  74. package/src/engine/ecs/parent/parent_entity_model_of.d.ts +17 -0
  75. package/src/engine/ecs/parent/parent_entity_model_of.d.ts.map +1 -0
  76. package/src/engine/ecs/parent/parent_entity_model_of.js +26 -0
  77. package/src/engine/ecs/transform/t64_read_pose_array.d.ts +15 -0
  78. package/src/engine/ecs/transform/t64_read_pose_array.d.ts.map +1 -0
  79. package/src/engine/ecs/transform/t64_read_pose_array.js +24 -0
  80. package/src/engine/graphics/ecs/mesh-v2/MeshSkin.d.ts +57 -0
  81. package/src/engine/graphics/ecs/mesh-v2/MeshSkin.d.ts.map +1 -0
  82. package/src/engine/graphics/ecs/mesh-v2/MeshSkin.js +84 -0
  83. package/src/engine/graphics/geometry/geometry_construct_triangle_normal_area_weighted.d.ts +2 -0
  84. package/src/engine/graphics/geometry/geometry_construct_triangle_normal_area_weighted.d.ts.map +1 -1
  85. package/src/engine/graphics/geometry/geometry_construct_triangle_normal_area_weighted.js +10 -21
  86. package/src/engine/graphics3/AnimationGraphSystem.d.ts +28 -13
  87. package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -1
  88. package/src/engine/graphics3/AnimationGraphSystem.js +107 -64
  89. package/src/engine/graphics3/AnimationSystem.d.ts +29 -15
  90. package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -1
  91. package/src/engine/graphics3/AnimationSystem.js +112 -61
  92. package/src/engine/graphics3/MeshSkinSystem.d.ts +56 -0
  93. package/src/engine/graphics3/MeshSkinSystem.d.ts.map +1 -0
  94. package/src/engine/graphics3/MeshSkinSystem.js +317 -0
  95. package/src/engine/graphics3/MeshSystem.d.ts +15 -35
  96. package/src/engine/graphics3/MeshSystem.d.ts.map +1 -1
  97. package/src/engine/graphics3/MeshSystem.js +21 -298
  98. package/src/engine/graphics3/RowChains.d.ts +76 -0
  99. package/src/engine/graphics3/RowChains.d.ts.map +1 -0
  100. package/src/engine/graphics3/RowChains.js +347 -0
  101. package/src/engine/graphics3/ShadedGeometrySystem.d.ts +6 -0
  102. package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -1
  103. package/src/engine/graphics3/ShadedGeometrySystem.js +329 -309
  104. package/src/engine/graphics3/animation/AnimationClips.d.ts +56 -0
  105. package/src/engine/graphics3/animation/AnimationClips.d.ts.map +1 -0
  106. package/src/engine/graphics3/animation/AnimationClips.js +79 -0
  107. package/src/engine/graphics3/animation/ClipListPlayer.d.ts +13 -14
  108. package/src/engine/graphics3/animation/ClipListPlayer.d.ts.map +1 -1
  109. package/src/engine/graphics3/animation/ClipListPlayer.js +262 -263
  110. package/src/engine/graphics3/animation/write_clip_playback.d.ts +3 -3
  111. package/src/engine/graphics3/animation/write_clip_playback.js +4 -4
  112. package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts +5 -0
  113. package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts.map +1 -1
  114. package/src/engine/graphics3/pose/query_entity_node_world_pose.js +80 -75
  115. package/src/engine/graphics3/prefab/PrefabInstance.d.ts +4 -24
  116. package/src/engine/graphics3/prefab/PrefabInstance.d.ts.map +1 -1
  117. package/src/engine/graphics3/prefab/PrefabInstance.js +60 -80
  118. package/src/engine/graphics3/prefab/prefab_instantiate.d.ts +16 -3
  119. package/src/engine/graphics3/prefab/prefab_instantiate.d.ts.map +1 -1
  120. package/src/engine/graphics3/prefab/prefab_instantiate.js +49 -12
  121. package/src/engine/graphics3/prefab/prefab_place.d.ts +31 -17
  122. package/src/engine/graphics3/prefab/prefab_place.d.ts.map +1 -1
  123. package/src/engine/graphics3/prefab/prefab_place.js +175 -130
  124. package/src/engine/graphics3/register_clips.d.ts +93 -0
  125. package/src/engine/graphics3/register_clips.d.ts.map +1 -0
  126. package/src/engine/graphics3/register_clips.js +166 -0
  127. package/src/engine/physics/broadphase/compute_fat_world_aabb.d.ts +9 -0
  128. package/src/engine/physics/broadphase/compute_fat_world_aabb.d.ts.map +1 -1
  129. package/src/engine/physics/broadphase/compute_fat_world_aabb.js +3 -1
  130. package/src/engine/physics/cloth/MEASUREMENTS.md +795 -0
  131. package/src/engine/physics/cloth/PLAN.md +349 -17
  132. package/src/engine/physics/cloth/build/ClothProxy.d.ts +113 -61
  133. package/src/engine/physics/cloth/build/ClothProxy.d.ts.map +1 -1
  134. package/src/engine/physics/cloth/build/ClothProxy.js +142 -77
  135. package/src/engine/physics/cloth/build/cloth_bind_in_frame.d.ts +44 -0
  136. package/src/engine/physics/cloth/build/cloth_bind_in_frame.d.ts.map +1 -0
  137. package/src/engine/physics/cloth/build/cloth_bind_in_frame.js +107 -0
  138. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts +43 -30
  139. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts.map +1 -1
  140. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.js +371 -284
  141. package/src/engine/physics/cloth/build/cloth_proxy_from_mesh.d.ts +62 -0
  142. package/src/engine/physics/cloth/build/cloth_proxy_from_mesh.d.ts.map +1 -0
  143. package/src/engine/physics/cloth/build/cloth_proxy_from_mesh.js +275 -0
  144. package/src/engine/physics/cloth/collider/ClothColliderIndex.d.ts +7 -0
  145. package/src/engine/physics/cloth/collider/ClothColliderIndex.d.ts.map +1 -1
  146. package/src/engine/physics/cloth/collider/ClothColliderIndex.js +85 -67
  147. package/src/engine/physics/cloth/collider/cloth_collider_bounds.d.ts.map +1 -1
  148. package/src/engine/physics/cloth/collider/cloth_collider_bounds.js +19 -101
  149. package/src/engine/physics/cloth/collider/cloth_collider_pack.d.ts +2 -5
  150. package/src/engine/physics/cloth/collider/cloth_collider_pack.d.ts.map +1 -1
  151. package/src/engine/physics/cloth/collider/cloth_collider_pack.js +7 -15
  152. package/src/engine/physics/cloth/collider/cloth_collider_sdf.d.ts +1 -1
  153. package/src/engine/physics/cloth/collider/cloth_collider_sdf.d.ts.map +1 -1
  154. package/src/engine/physics/cloth/collider/cloth_collider_sdf.js +17 -62
  155. package/src/engine/physics/cloth/ecs/Cloth.d.ts +17 -9
  156. package/src/engine/physics/cloth/ecs/Cloth.d.ts.map +1 -1
  157. package/src/engine/physics/cloth/ecs/Cloth.js +220 -212
  158. package/src/engine/physics/cloth/ecs/ClothColliderFlags.d.ts +0 -1
  159. package/src/engine/physics/cloth/ecs/ClothColliderFlags.js +6 -19
  160. package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts +1 -2
  161. package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts.map +1 -1
  162. package/src/engine/physics/cloth/ecs/ClothColliderSystem.js +3 -12
  163. package/src/engine/physics/cloth/ecs/ClothDynamicsFlags.js +6 -0
  164. package/src/engine/physics/cloth/ecs/ClothHold.d.ts +91 -0
  165. package/src/engine/physics/cloth/ecs/ClothHold.d.ts.map +1 -0
  166. package/src/engine/physics/cloth/ecs/ClothHold.js +103 -0
  167. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts +254 -48
  168. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts.map +1 -1
  169. package/src/engine/physics/cloth/ecs/ClothInstance.js +277 -47
  170. package/src/engine/physics/cloth/ecs/ClothPin.d.ts +73 -0
  171. package/src/engine/physics/cloth/ecs/ClothPin.d.ts.map +1 -0
  172. package/src/engine/physics/cloth/ecs/ClothPin.js +92 -0
  173. package/src/engine/physics/cloth/ecs/ClothPinSerializationAdapter.d.ts +36 -0
  174. package/src/engine/physics/cloth/ecs/ClothPinSerializationAdapter.d.ts.map +1 -0
  175. package/src/engine/physics/cloth/ecs/ClothPinSerializationAdapter.js +61 -0
  176. package/src/engine/physics/cloth/ecs/ClothRig.d.ts +23 -17
  177. package/src/engine/physics/cloth/ecs/ClothRig.d.ts.map +1 -1
  178. package/src/engine/physics/cloth/ecs/ClothRig.js +29 -27
  179. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts +12 -14
  180. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts.map +1 -1
  181. package/src/engine/physics/cloth/ecs/ClothSystem.js +20 -15
  182. package/src/engine/physics/cloth/ecs/ClothWorld.d.ts +57 -36
  183. package/src/engine/physics/cloth/ecs/ClothWorld.d.ts.map +1 -1
  184. package/src/engine/physics/cloth/ecs/ClothWorld.js +754 -207
  185. package/src/engine/physics/cloth/ecs/WorkerClothSystem.d.ts +12 -13
  186. package/src/engine/physics/cloth/ecs/WorkerClothSystem.d.ts.map +1 -1
  187. package/src/engine/physics/cloth/ecs/WorkerClothSystem.js +20 -14
  188. package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts +63 -11
  189. package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts.map +1 -1
  190. package/src/engine/physics/cloth/ecs/cloth_build_rows.js +297 -101
  191. package/src/engine/physics/cloth/ecs/cloth_dynamics_map.d.ts +9 -7
  192. package/src/engine/physics/cloth/ecs/cloth_dynamics_map.d.ts.map +1 -1
  193. package/src/engine/physics/cloth/ecs/cloth_dynamics_map.js +12 -10
  194. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts +3 -3
  195. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts.map +1 -1
  196. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.js +60 -120
  197. package/src/engine/physics/cloth/ecs/cloth_geodesic.d.ts +37 -0
  198. package/src/engine/physics/cloth/ecs/cloth_geodesic.d.ts.map +1 -0
  199. package/src/engine/physics/cloth/ecs/cloth_geodesic.js +135 -0
  200. package/src/engine/physics/cloth/ecs/cloth_holds.d.ts +97 -0
  201. package/src/engine/physics/cloth/ecs/cloth_holds.d.ts.map +1 -0
  202. package/src/engine/physics/cloth/ecs/cloth_holds.js +583 -0
  203. package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.d.ts +2 -2
  204. package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.d.ts.map +1 -1
  205. package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.js +168 -51
  206. package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts +17 -22
  207. package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts.map +1 -1
  208. package/src/engine/physics/cloth/ecs/cloth_seed_rig.js +55 -117
  209. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts +21 -6
  210. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts.map +1 -1
  211. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.js +51 -42
  212. package/src/engine/physics/cloth/ecs/cloth_write_back.d.ts +5 -0
  213. package/src/engine/physics/cloth/ecs/cloth_write_back.d.ts.map +1 -1
  214. package/src/engine/physics/cloth/ecs/cloth_write_back.js +62 -50
  215. package/src/engine/physics/cloth/ecs/cloth_write_back_rig.d.ts.map +1 -1
  216. package/src/engine/physics/cloth/ecs/cloth_write_back_rig.js +65 -58
  217. package/src/engine/physics/cloth/playground/cloth_playground_build.d.ts.map +1 -1
  218. package/src/engine/physics/cloth/playground/cloth_playground_build.js +2 -3
  219. package/src/engine/physics/cloth/playground/collide_main.js +3 -29
  220. package/src/engine/physics/cloth/playground/garment_build.d.ts.map +1 -1
  221. package/src/engine/physics/cloth/playground/garment_build.js +17 -5
  222. package/src/engine/physics/cloth/playground/garment_main.js +5 -20
  223. package/src/engine/physics/cloth/playground/main.js +6 -48
  224. package/src/engine/physics/cloth/playground/rig_build.d.ts.map +1 -1
  225. package/src/engine/physics/cloth/playground/rig_build.js +302 -296
  226. package/src/engine/physics/cloth/playground/rig_main.js +947 -955
  227. package/src/engine/physics/cloth/playground/wind_main.js +8 -7
  228. package/src/engine/physics/cloth/solver/ClothState.d.ts +45 -7
  229. package/src/engine/physics/cloth/solver/ClothState.d.ts.map +1 -1
  230. package/src/engine/physics/cloth/solver/ClothState.js +79 -83
  231. package/src/engine/physics/cloth/solver/cloth_color_particles.d.ts +10 -8
  232. package/src/engine/physics/cloth/solver/cloth_color_particles.d.ts.map +1 -1
  233. package/src/engine/physics/cloth/solver/cloth_color_particles.js +30 -102
  234. package/src/engine/physics/cloth/solver/cloth_contact_find.d.ts +6 -1
  235. package/src/engine/physics/cloth/solver/cloth_contact_find.d.ts.map +1 -1
  236. package/src/engine/physics/cloth/solver/cloth_contact_find.js +9 -3
  237. package/src/engine/physics/cloth/solver/cloth_hold_line.d.ts +114 -0
  238. package/src/engine/physics/cloth/solver/cloth_hold_line.d.ts.map +1 -0
  239. package/src/engine/physics/cloth/solver/cloth_hold_line.js +350 -0
  240. package/src/engine/physics/cloth/solver/cloth_kinetic_energy.d.ts +21 -0
  241. package/src/engine/physics/cloth/solver/cloth_kinetic_energy.d.ts.map +1 -0
  242. package/src/engine/physics/cloth/solver/cloth_kinetic_energy.js +45 -0
  243. package/src/engine/physics/cloth/solver/cloth_particle_coupling.d.ts +32 -0
  244. package/src/engine/physics/cloth/solver/cloth_particle_coupling.d.ts.map +1 -0
  245. package/src/engine/physics/cloth/solver/cloth_particle_coupling.js +133 -0
  246. package/src/engine/physics/cloth/solver/cloth_particle_of_source.d.ts +16 -0
  247. package/src/engine/physics/cloth/solver/cloth_particle_of_source.d.ts.map +1 -0
  248. package/src/engine/physics/cloth/solver/cloth_particle_of_source.js +19 -0
  249. package/src/engine/physics/cloth/solver/cloth_self_find.d.ts +6 -2
  250. package/src/engine/physics/cloth/solver/cloth_self_find.d.ts.map +1 -1
  251. package/src/engine/physics/cloth/solver/cloth_self_find.js +19 -68
  252. package/src/engine/physics/cloth/solver/cloth_solve_vertex.d.ts.map +1 -1
  253. package/src/engine/physics/cloth/solver/cloth_solve_vertex.js +30 -65
  254. package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts +24 -12
  255. package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts.map +1 -1
  256. package/src/engine/physics/cloth/solver/cloth_solver_constants.js +24 -12
  257. package/src/engine/physics/cloth/solver/cloth_step.d.ts +16 -0
  258. package/src/engine/physics/cloth/solver/cloth_step.d.ts.map +1 -1
  259. package/src/engine/physics/cloth/solver/cloth_step.js +189 -48
  260. package/src/engine/physics/cloth/solver/cloth_step_instance.d.ts +1 -0
  261. package/src/engine/physics/cloth/solver/cloth_step_instance.d.ts.map +1 -1
  262. package/src/engine/physics/cloth/solver/cloth_step_instance.js +12 -6
  263. package/src/engine/physics/cloth/solver/cloth_stretch_residual.d.ts +21 -0
  264. package/src/engine/physics/cloth/solver/cloth_stretch_residual.d.ts.map +1 -0
  265. package/src/engine/physics/cloth/solver/cloth_stretch_residual.js +54 -0
  266. package/src/engine/physics/cloth/solver/cloth_vertex_accumulator.d.ts +15 -0
  267. package/src/engine/physics/cloth/solver/cloth_vertex_accumulator.d.ts.map +1 -1
  268. package/src/engine/physics/cloth/solver/cloth_vertex_accumulator.js +28 -0
  269. package/src/engine/physics/cloth/solver/cloth_worst_tether_ratio.d.ts +30 -0
  270. package/src/engine/physics/cloth/solver/cloth_worst_tether_ratio.d.ts.map +1 -0
  271. package/src/engine/physics/cloth/solver/cloth_worst_tether_ratio.js +56 -0
  272. package/src/engine/physics/cloth/solver/constraint/cloth_contact_row.d.ts.map +1 -1
  273. package/src/engine/physics/cloth/solver/constraint/cloth_contact_row.js +3 -17
  274. package/src/engine/physics/cloth/solver/constraint/cloth_leash_row.d.ts +1 -1
  275. package/src/engine/physics/cloth/solver/constraint/cloth_leash_row.d.ts.map +1 -1
  276. package/src/engine/physics/cloth/solver/constraint/cloth_leash_row.js +353 -346
  277. package/src/engine/physics/cloth/solver/constraint/cloth_self_row.d.ts +7 -5
  278. package/src/engine/physics/cloth/solver/constraint/cloth_self_row.d.ts.map +1 -1
  279. package/src/engine/physics/cloth/solver/constraint/cloth_self_row.js +7 -5
  280. package/src/engine/physics/cloth/wind/ClothFluidWind.d.ts +2 -1
  281. package/src/engine/physics/cloth/wind/ClothFluidWind.d.ts.map +1 -1
  282. package/src/engine/physics/cloth/wind/ClothFluidWind.js +7 -25
  283. package/src/engine/physics/cloth/wind/cloth_sample_air.d.ts +12 -10
  284. package/src/engine/physics/cloth/wind/cloth_sample_air.d.ts.map +1 -1
  285. package/src/engine/physics/cloth/wind/cloth_sample_air.js +60 -82
  286. package/src/engine/physics/ecs/ContactProbeSystem.d.ts.map +1 -1
  287. package/src/engine/physics/ecs/ContactProbeSystem.js +2 -18
  288. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  289. package/src/engine/physics/ecs/PhysicsSystem.js +9 -50
  290. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  291. package/src/engine/physics/fluid/ecs/fluid_sample_domain_bounds.d.ts +24 -0
  292. package/src/engine/physics/fluid/ecs/fluid_sample_domain_bounds.d.ts.map +1 -0
  293. package/src/engine/physics/fluid/ecs/fluid_sample_domain_bounds.js +42 -0
  294. package/src/engine/physics/fluid/ecs/fluid_sample_velocity_world_mps.d.ts +25 -0
  295. package/src/engine/physics/fluid/ecs/fluid_sample_velocity_world_mps.d.ts.map +1 -0
  296. package/src/engine/physics/fluid/ecs/fluid_sample_velocity_world_mps.js +40 -0
  297. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_solve.d.ts.map +1 -1
  298. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_solve.js +40 -90
  299. package/src/engine/physics/narrowphase/capsule_contacts.d.ts.map +1 -1
  300. package/src/engine/physics/narrowphase/capsule_contacts.js +3 -5
  301. package/src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.d.ts.map +1 -1
  302. package/src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.js +2 -14
  303. package/src/engine/physics/narrowphase/hull_sphere_contact.d.ts.map +1 -1
  304. package/src/engine/physics/narrowphase/hull_sphere_contact.js +2 -5
  305. package/src/engine/physics/narrowphase/narrowphase_step.d.ts.map +1 -1
  306. package/src/engine/physics/narrowphase/narrowphase_step.js +13 -32
  307. package/src/engine/physics/narrowphase/sphere_box_contact.d.ts.map +1 -1
  308. package/src/engine/physics/narrowphase/sphere_box_contact.js +2 -5
  309. package/src/engine/simulation/Ticker.d.ts +13 -0
  310. package/src/engine/simulation/Ticker.d.ts.map +1 -1
  311. package/src/engine/simulation/Ticker.js +43 -8
  312. package/src/format/texture/basis/transcode/etc1s_to_astc.d.ts.map +1 -1
  313. package/src/format/texture/basis/transcode/etc1s_to_astc.js +2 -1
  314. package/src/shade/RENDERER_CONTRACT.md +8 -2
  315. package/src/shade/playground/image_decode_bench/main.js +2 -1
  316. package/src/shade/playground/mesh_row_ceiling/main.js +2 -1
  317. package/src/shade/playground/skinned_blas_refit/diff_traced_against_rasterized.d.ts.map +1 -1
  318. package/src/shade/playground/skinned_blas_refit/diff_traced_against_rasterized.js +2 -1
  319. package/src/shade/playground/skinned_blas_refit/main.d.ts.map +1 -1
  320. package/src/shade/playground/skinned_blas_refit/main.js +11 -19
  321. package/src/shade/playground/skinned_blas_refit/place_character.d.ts +6 -3
  322. package/src/shade/playground/skinned_blas_refit/place_character.d.ts.map +1 -1
  323. package/src/shade/playground/skinned_blas_refit/place_character.js +90 -90
  324. package/src/shade/playground/skinned_mesh_soup/main.d.ts.map +1 -1
  325. package/src/shade/playground/skinned_mesh_soup/main.js +502 -509
  326. package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.d.ts.map +1 -1
  327. package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.js +2 -1
  328. package/src/shade/playground/ssr_variance/statistics.d.ts.map +1 -1
  329. package/src/shade/playground/ssr_variance/statistics.js +2 -1
  330. package/src/shade/playground/texture_encode/README.md +129 -109
  331. package/src/shade/playground/texture_encode/main.d.ts.map +1 -1
  332. package/src/shade/playground/texture_encode/main.js +1431 -1430
  333. package/src/shade/playground/volumetrics_froxel/measure.d.ts.map +1 -1
  334. package/src/shade/playground/volumetrics_froxel/measure.js +2 -1
  335. package/src/shade/renderer/animation/GPUAnimationManager.d.ts +45 -14
  336. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  337. package/src/shade/renderer/animation/GPUAnimationManager.js +316 -64
  338. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts +5 -0
  339. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  340. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +11 -1
  341. package/src/shade/renderer/buffer/table/gpu_database_check_links.d.ts.map +1 -1
  342. package/src/shade/renderer/buffer/table/gpu_database_check_links.js +2 -1
  343. package/src/shade/renderer/geometry/BoxGeometry.d.ts +1 -11
  344. package/src/shade/renderer/geometry/BoxGeometry.d.ts.map +1 -1
  345. package/src/shade/renderer/geometry/BoxGeometry.js +6 -13
  346. package/src/shade/renderer/geometry/CapsuleGeometry.d.ts +19 -0
  347. package/src/shade/renderer/geometry/CapsuleGeometry.d.ts.map +1 -0
  348. package/src/shade/renderer/geometry/CapsuleGeometry.js +24 -0
  349. package/src/shade/renderer/geometry/ConeGeometry.d.ts +20 -0
  350. package/src/shade/renderer/geometry/ConeGeometry.d.ts.map +1 -0
  351. package/src/shade/renderer/geometry/ConeGeometry.js +33 -0
  352. package/src/shade/renderer/geometry/CylinderGeometry.d.ts +21 -0
  353. package/src/shade/renderer/geometry/CylinderGeometry.d.ts.map +1 -0
  354. package/src/shade/renderer/geometry/CylinderGeometry.js +35 -0
  355. package/src/shade/renderer/geometry/PlaneGeometry.d.ts +17 -0
  356. package/src/shade/renderer/geometry/PlaneGeometry.d.ts.map +1 -0
  357. package/src/shade/renderer/geometry/PlaneGeometry.js +22 -0
  358. package/src/shade/renderer/geometry/TorusGeometry.d.ts +18 -0
  359. package/src/shade/renderer/geometry/TorusGeometry.d.ts.map +1 -0
  360. package/src/shade/renderer/geometry/TorusGeometry.js +23 -0
  361. package/src/shade/renderer/geometry/UVSphereGeometry.d.ts +21 -0
  362. package/src/shade/renderer/geometry/UVSphereGeometry.d.ts.map +1 -0
  363. package/src/shade/renderer/geometry/UVSphereGeometry.js +34 -0
  364. package/src/shade/renderer/geometry/primitives/make_capsule_geometry.d.ts +19 -0
  365. package/src/shade/renderer/geometry/primitives/make_capsule_geometry.d.ts.map +1 -0
  366. package/src/shade/renderer/geometry/primitives/make_capsule_geometry.js +205 -0
  367. package/src/shade/renderer/geometry/primitives/make_cone_geometry.d.ts +21 -0
  368. package/src/shade/renderer/geometry/primitives/make_cone_geometry.d.ts.map +1 -0
  369. package/src/shade/renderer/geometry/primitives/make_cone_geometry.js +36 -0
  370. package/src/shade/renderer/geometry/primitives/make_cylinder_geometry.d.ts +1 -1
  371. package/src/shade/renderer/geometry/primitives/make_cylinder_geometry.d.ts.map +1 -1
  372. package/src/shade/renderer/geometry/primitives/make_cylinder_geometry.js +44 -9
  373. package/src/shade/renderer/geometry/primitives/make_uv_sphere_geometry.d.ts +20 -0
  374. package/src/shade/renderer/geometry/primitives/make_uv_sphere_geometry.d.ts.map +1 -0
  375. package/src/shade/renderer/geometry/primitives/make_uv_sphere_geometry.js +190 -0
  376. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.d.ts.map +1 -1
  377. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.js +3 -2
  378. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_leaf_frontier.d.ts.map +1 -1
  379. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_leaf_frontier.js +2 -1
  380. package/src/shade/renderer/geometry/virtual/build/level/vgeo_partition_into_groups.d.ts.map +1 -1
  381. package/src/shade/renderer/geometry/virtual/build/level/vgeo_partition_into_groups.js +2 -1
  382. package/src/shade/renderer/geometry/virtual/build/level/vgeo_run_round.d.ts.map +1 -1
  383. package/src/shade/renderer/geometry/virtual/build/level/vgeo_run_round.js +2 -1
  384. package/src/shade/renderer/geometry/virtual/build/level/vgeo_try_repack.d.ts.map +1 -1
  385. package/src/shade/renderer/geometry/virtual/build/level/vgeo_try_repack.js +3 -2
  386. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_graph_components.d.ts.map +1 -1
  387. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_graph_components.js +2 -1
  388. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.d.ts.map +1 -1
  389. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.js +2 -1
  390. package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.d.ts.map +1 -1
  391. package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.js +3 -2
  392. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.d.ts.map +1 -1
  393. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.js +7 -2
  394. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.d.ts +26 -8
  395. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.d.ts.map +1 -1
  396. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.js +56 -39
  397. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.d.ts +7 -0
  398. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.d.ts.map +1 -1
  399. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.js +46 -4
  400. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/test_prefix_sum.d.ts.map +1 -1
  401. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/test_prefix_sum.js +4 -2
  402. package/src/shade/renderer/gpu_primitive/sort/defs.d.ts +2 -2
  403. package/src/shade/renderer/gpu_primitive/sort/defs.js +79 -79
  404. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts +1 -1
  405. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts.map +1 -1
  406. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.js +7 -3
  407. package/src/shade/renderer/particles/GPUParticleSystem.js +1 -1
  408. package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts +4 -3
  409. package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts.map +1 -1
  410. package/src/shade/renderer/particles/coherence/graph_particle_bucket.js +200 -194
  411. package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
  412. package/src/shade/renderer/particles/graph_particles.js +6 -2
  413. package/src/shade/renderer/particles/optimizer/dag/particle_vector_extract.d.ts.map +1 -1
  414. package/src/shade/renderer/particles/optimizer/dag/particle_vector_extract.js +3 -2
  415. package/src/shade/renderer/particles/warmup/graph_particle_warmup.d.ts.map +1 -1
  416. package/src/shade/renderer/particles/warmup/graph_particle_warmup.js +334 -329
  417. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  418. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +7 -2
  419. package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.d.ts.map +1 -1
  420. package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.js +16 -4
  421. package/src/shade/renderer/texture/COMPRESSED_TEXTURE_PLAN_2026_09_01.md +2444 -2345
  422. package/src/shade/renderer/texture/encode/chunk_astc_encode_block_4x4_rgb.d.ts.map +1 -1
  423. package/src/shade/renderer/texture/encode/chunk_astc_encode_block_4x4_rgb.js +312 -310
  424. package/src/shade/renderer/texture/encode/chunk_bc1_encode_block.d.ts +3 -3
  425. package/src/shade/renderer/texture/encode/chunk_bc1_encode_block.d.ts.map +1 -1
  426. package/src/shade/renderer/texture/encode/chunk_bc1_encode_block.js +383 -375
  427. package/src/shade/renderer/texture/encode/chunk_bc6h_encode_block_mode11.d.ts.map +1 -1
  428. package/src/shade/renderer/texture/encode/chunk_bc6h_encode_block_mode11.js +349 -346
  429. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block.d.ts +58 -0
  430. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block.d.ts.map +1 -0
  431. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block.js +536 -0
  432. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block_mode6.d.ts +21 -7
  433. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block_mode6.d.ts.map +1 -1
  434. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block_mode6.js +291 -327
  435. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode1.d.ts +25 -0
  436. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode1.d.ts.map +1 -0
  437. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode1.js +99 -0
  438. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode6.d.ts +5 -3
  439. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode6.d.ts.map +1 -1
  440. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode6.js +47 -71
  441. package/src/shade/renderer/texture/encode/chunk_bc7_partition_2.d.ts +10 -0
  442. package/src/shade/renderer/texture/encode/chunk_bc7_partition_2.d.ts.map +1 -0
  443. package/src/shade/renderer/texture/encode/chunk_bc7_partition_2.js +50 -0
  444. package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.d.ts +4 -5
  445. package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.d.ts.map +1 -1
  446. package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.js +7 -8
  447. package/src/shade/renderer/water/chunk_water_transport.d.ts.map +1 -1
  448. package/src/shade/renderer/water/chunk_water_transport.js +7 -5
  449. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts.map +1 -1
  450. package/src/shade/renderer/water/medium/GPUWaterBodies.js +8 -2
  451. package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.d.ts +3 -2
  452. package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.d.ts.map +1 -1
  453. package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.js +3 -2
  454. package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
  455. package/src/shade/renderer/water/shader_water.js +3 -1
  456. package/src/shade/renderer/water/surface/GPUWaterSurface.d.ts.map +1 -1
  457. package/src/shade/renderer/water/surface/GPUWaterSurface.js +3 -1
  458. package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts.map +1 -1
  459. package/src/shade/renderer/water/surface/graph_water_tessellation.js +11 -4
  460. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.d.ts.map +1 -1
  461. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.js +37 -20
  462. package/src/shade/wgsl/validate_wgsl_source.d.ts.map +1 -1
  463. package/src/shade/wgsl/validate_wgsl_source.js +74 -3
  464. package/src/engine/graphics3/register_instance_animation.d.ts +0 -114
  465. package/src/engine/graphics3/register_instance_animation.d.ts.map +0 -1
  466. package/src/engine/graphics3/register_instance_animation.js +0 -201
@@ -1 +1 @@
1
- {"version":3,"file":"chunk_astc_encode_block_4x4_rgb.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/texture/encode/chunk_astc_encode_block_4x4_rgb.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,8CAFU,SAAS,CAsRZ;0BArTmB,oCAAoC"}
1
+ {"version":3,"file":"chunk_astc_encode_block_4x4_rgb.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/texture/encode/chunk_astc_encode_block_4x4_rgb.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,8CAFU,SAAS,CAwRZ;0BAvTmB,oCAAoC"}
@@ -1,310 +1,312 @@
1
- import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
2
- import { chunk_astc_pack_4x4_rgb } from "./chunk_astc_pack_4x4_rgb.js";
3
-
4
- /**
5
- * Encode sixteen RGB texels as one ASTC 4x4 block: one partition, eight-bit endpoints, three-bit
6
- * weights.
7
- *
8
- * **The one corner of ASTC this tree can already read.** Step 9f derived this block's layout from
9
- * the specification and beat the reference encoder with it; step 9h inverted the packings. What is
10
- * ported here is the encoder's part: the same RGB line as BC1's, fitted under ASTC's own
11
- * arithmetic, which is not BC1's in two places that each cost a level if ignored:
12
- *
13
- * 1. **The interpolation.** ASTC widens each eight-bit endpoint to sixteen by replication,
14
- * interpolates there with a `+32` round, and takes the top eight bits. Against the direct form
15
- * that disagrees on one texel in twenty, always by a level, so every score here is the
16
- * specification's form — `astc_interpolate` in `astc_block.js`, in WGSL.
17
- * 2. **The endpoint order.** Colour endpoint mode 8 compares the two ends by the sum of their
18
- * channels and, when the second's is below the first's, *swaps them and blue-contracts both* —
19
- * a different picture, not a mirrored one, recorded by no bit. So a fitted pair whose sums come
20
- * out the wrong way round is written the other way up with its weights inverted, which decodes
21
- * identically; that is `astc_order_endpoints`, in WGSL.
22
- *
23
- * Eight weight levels, unevenly spaced — `0, 9, 18, 27, 37, 46, 55, 64` of 64 — over eight-bit
24
- * ends: between BC1 and BC7 mode 6 in what it can hold, at BC7's eight bits a texel. The fit is
25
- * the principal axis, the extreme projections, two rounds of least squares with those weights, and
26
- * one round of coordinate descent over the six stored bytes against the decoder's palette. Alpha
27
- * is not read: mode 8 carries none, and a cut-out wants the RGBA mode, which is a later chunk.
28
- *
29
- * This is the only target here that no device in reach can sample, so it rests on the CPU decoder
30
- * alone — the decoder that §9.17 held against the reference encoder's blocks before trusting it.
31
- *
32
- * @type {CodeChunk}
33
- */
34
- export const chunk_astc_encode_block_4x4_rgb = CodeChunk.from(
35
- //language=WGSL
36
- `
37
- // what a three-bit weight unquantizes to, out of 64: replicated up to six bits and nudged so the
38
- // top of the range is exactly 64
39
- fn astc_weight3(index: u32) -> f32 {
40
- var weights = array<f32, 8>(0.0, 9.0, 18.0, 27.0, 37.0, 46.0, 55.0, 64.0);
41
-
42
- return weights[index];
43
- }
44
-
45
- // one channel decoded as the format decodes it: sixteen-bit replicated ends, a rounded weighted
46
- // sum, the top eight bits
47
- fn astc_interpolate(c0: f32, c1: f32, weight: f32) -> f32 {
48
- let wide0 = c0 * 257.0;
49
- let wide1 = c1 * 257.0;
50
-
51
- return floor(floor((wide0 * (64.0 - weight) + wide1 * weight + 32.0) / 64.0) / 256.0);
52
- }
53
-
54
- fn astc_palette_entry(e0: vec3<f32>, e1: vec3<f32>, index: u32) -> vec3<f32> {
55
- let w = astc_weight3(index);
56
-
57
- return vec3<f32>(
58
- astc_interpolate(e0.x, e1.x, w),
59
- astc_interpolate(e0.y, e1.y, w),
60
- astc_interpolate(e0.z, e1.z, w)
61
- );
62
- }
63
-
64
- // the weight whose palette entry is nearest a texel, and the squared distance
65
- fn astc_nearest(e0: vec3<f32>, e1: vec3<f32>, texel: vec3<f32>) -> vec2<f32> {
66
- let direction = e1 - e0;
67
- let span = dot(direction, direction);
68
-
69
- var estimate = 0.0;
70
-
71
- if (span > 0.0) {
72
- estimate = clamp(round(dot(texel - e0, direction) / span * 7.0), 0.0, 7.0);
73
- }
74
-
75
- var best = estimate;
76
- var best_distance = 1e30;
77
-
78
- for (var offset = -1.0; offset <= 1.0; offset += 1.0) {
79
- let candidate = clamp(estimate + offset, 0.0, 7.0);
80
-
81
- let delta = astc_palette_entry(e0, e1, u32(candidate)) - texel;
82
- let distance = dot(delta, delta);
83
-
84
- if (distance < best_distance) {
85
- best_distance = distance;
86
- best = candidate;
87
- }
88
- }
89
-
90
- return vec2<f32>(best, best_distance);
91
- }
92
-
93
- fn astc_score(texels: array<vec3<f32>, 16>, e0: vec3<f32>, e1: vec3<f32>) -> f32 {
94
- var error = 0.0;
95
-
96
- for (var i = 0u; i < 16u; i++) {
97
- error += astc_nearest(e0, e1, texels[i]).y;
98
- }
99
-
100
- return error;
101
- }
102
-
103
- fn astc_refine(texels: array<vec3<f32>, 16>, e0: vec3<f32>, e1: vec3<f32>) -> array<vec3<f32>, 2> {
104
- let direction = e1 - e0;
105
- let span = dot(direction, direction);
106
-
107
- var aa = 0.0;
108
- var ab = 0.0;
109
- var bb = 0.0;
110
- var ap = vec3<f32>(0.0);
111
- var bp = vec3<f32>(0.0);
112
-
113
- for (var i = 0u; i < 16u; i++) {
114
- var estimate = 0.0;
115
-
116
- if (span > 0.0) {
117
- estimate = clamp(round(dot(texels[i] - e0, direction) / span * 7.0), 0.0, 7.0);
118
- }
119
-
120
- var best_weight = 0.0;
121
- var best_distance = 1e30;
122
-
123
- for (var offset = -1.0; offset <= 1.0; offset += 1.0) {
124
- let candidate = clamp(estimate + offset, 0.0, 7.0);
125
- let weight = astc_weight3(u32(candidate)) / 64.0;
126
-
127
- let delta = mix(e0, e1, weight) - texels[i];
128
- let distance = dot(delta, delta);
129
-
130
- if (distance < best_distance) {
131
- best_distance = distance;
132
- best_weight = weight;
133
- }
134
- }
135
-
136
- let b = best_weight;
137
- let a = 1.0 - b;
138
-
139
- aa += a * a;
140
- ab += a * b;
141
- bb += b * b;
142
- ap += a * texels[i];
143
- bp += b * texels[i];
144
- }
145
-
146
- let determinant = aa * bb - ab * ab;
147
-
148
- var out: array<vec3<f32>, 2>;
149
-
150
- if (abs(determinant) < 1e-6) {
151
- out[0] = e0;
152
- out[1] = e1;
153
-
154
- return out;
155
- }
156
-
157
- out[0] = (bb * ap - ab * bp) / determinant;
158
- out[1] = (aa * bp - ab * ap) / determinant;
159
-
160
- return out;
161
- }
162
-
163
- fn astc_with_component(v: vec3<f32>, channel: u32, value: f32) -> vec3<f32> {
164
- return vec3<f32>(
165
- select(v.x, value, channel == 0u),
166
- select(v.y, value, channel == 1u),
167
- select(v.z, value, channel == 2u)
168
- );
169
- }
170
-
171
- fn astc_encode_block_4x4_rgb(texels: array<vec3<f32>, 16>) -> vec4<u32> {
172
- var scaled: array<vec3<f32>, 16>;
173
-
174
- var low = vec3<f32>(255.0);
175
- var high = vec3<f32>(0.0);
176
- var mean = vec3<f32>(0.0);
177
-
178
- for (var i = 0u; i < 16u; i++) {
179
- let v = clamp(texels[i], vec3<f32>(0.0), vec3<f32>(1.0)) * 255.0;
180
-
181
- scaled[i] = v;
182
- low = min(low, v);
183
- high = max(high, v);
184
- mean += v;
185
- }
186
-
187
- mean = mean / 16.0;
188
-
189
- let extent = high - low;
190
-
191
- var e0 = mean;
192
- var e1 = mean;
193
-
194
- if (max(extent.x, max(extent.y, extent.z)) >= 0.5) {
195
- var cov = array<f32, 6>(0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
196
-
197
- for (var i = 0u; i < 16u; i++) {
198
- let d = scaled[i] - mean;
199
-
200
- cov[0] += d.x * d.x;
201
- cov[1] += d.x * d.y;
202
- cov[2] += d.x * d.z;
203
- cov[3] += d.y * d.y;
204
- cov[4] += d.y * d.z;
205
- cov[5] += d.z * d.z;
206
- }
207
-
208
- var axis = extent;
209
-
210
- for (var iteration = 0u; iteration < 4u; iteration++) {
211
- let next = vec3<f32>(
212
- cov[0] * axis.x + cov[1] * axis.y + cov[2] * axis.z,
213
- cov[1] * axis.x + cov[3] * axis.y + cov[4] * axis.z,
214
- cov[2] * axis.x + cov[4] * axis.y + cov[5] * axis.z
215
- );
216
-
217
- let magnitude = length(next);
218
-
219
- if (magnitude < 1e-3) {
220
- break;
221
- }
222
-
223
- axis = next / magnitude;
224
- }
225
-
226
- axis = normalize(axis);
227
-
228
- var t_min = 1e30;
229
- var t_max = -1e30;
230
-
231
- for (var i = 0u; i < 16u; i++) {
232
- let t = dot(scaled[i] - mean, axis);
233
-
234
- t_min = min(t_min, t);
235
- t_max = max(t_max, t);
236
- }
237
-
238
- e0 = mean + axis * t_min;
239
- e1 = mean + axis * t_max;
240
-
241
- for (var round = 0u; round < 2u; round++) {
242
- let refined = astc_refine(scaled, e0, e1);
243
-
244
- e0 = clamp(refined[0], vec3<f32>(0.0), vec3<f32>(255.0));
245
- e1 = clamp(refined[1], vec3<f32>(0.0), vec3<f32>(255.0));
246
- }
247
- }
248
-
249
- var q0 = round(e0);
250
- var q1 = round(e1);
251
-
252
- var best = astc_score(scaled, q0, q1);
253
-
254
- // coordinate descent over the six stored bytes, one round
255
- for (var component = 0u; component < 6u; component++) {
256
- let channel = component % 3u;
257
-
258
- for (var direction = -1.0; direction <= 1.0; direction += 2.0) {
259
- var c0 = q0;
260
- var c1 = q1;
261
-
262
- if (component < 3u) {
263
- c0 = astc_with_component(q0, channel, clamp(q0[channel] + direction, 0.0, 255.0));
264
- } else {
265
- c1 = astc_with_component(q1, channel, clamp(q1[channel] + direction, 0.0, 255.0));
266
- }
267
-
268
- let error = astc_score(scaled, c0, c1);
269
-
270
- if (error < best) {
271
- best = error;
272
- q0 = c0;
273
- q1 = c1;
274
- }
275
- }
276
- }
277
-
278
- var weights: array<u32, 16>;
279
-
280
- for (var i = 0u; i < 16u; i++) {
281
- weights[i] = u32(astc_nearest(q0, q1, scaled[i]).x);
282
- }
283
-
284
- // mode 8's rule: with the second end's channel sum below the first's, a decoder swaps and
285
- // blue-contracts, so such a pair is written the other way up with its weights inverted
286
- if (q1.x + q1.y + q1.z < q0.x + q0.y + q0.z) {
287
- let swap = q0;
288
-
289
- q0 = q1;
290
- q1 = swap;
291
-
292
- for (var i = 0u; i < 16u; i++) {
293
- weights[i] = 7u - weights[i];
294
- }
295
- }
296
-
297
- var endpoints: array<u32, 6>;
298
-
299
- endpoints[0] = u32(q0.x);
300
- endpoints[1] = u32(q1.x);
301
- endpoints[2] = u32(q0.y);
302
- endpoints[3] = u32(q1.y);
303
- endpoints[4] = u32(q0.z);
304
- endpoints[5] = u32(q1.z);
305
-
306
- return astc_pack_4x4_rgb(endpoints, weights);
307
- }
308
- `, [
309
- chunk_astc_pack_4x4_rgb,
310
- ]);
1
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
2
+ import { chunk_astc_pack_4x4_rgb } from "./chunk_astc_pack_4x4_rgb.js";
3
+
4
+ /**
5
+ * Encode sixteen RGB texels as one ASTC 4x4 block: one partition, eight-bit endpoints, three-bit
6
+ * weights.
7
+ *
8
+ * **The one corner of ASTC this tree can already read.** Step 9f derived this block's layout from
9
+ * the specification and beat the reference encoder with it; step 9h inverted the packings. What is
10
+ * ported here is the encoder's part: the same RGB line as BC1's, fitted under ASTC's own
11
+ * arithmetic, which is not BC1's in two places that each cost a level if ignored:
12
+ *
13
+ * 1. **The interpolation.** ASTC widens each eight-bit endpoint to sixteen by replication,
14
+ * interpolates there with a `+32` round, and takes the top eight bits. Against the direct form
15
+ * that disagrees on one texel in twenty, always by a level, so every score here is the
16
+ * specification's form — `astc_interpolate` in `astc_block.js`, in WGSL.
17
+ * 2. **The endpoint order.** Colour endpoint mode 8 compares the two ends by the sum of their
18
+ * channels and, when the second's is below the first's, *swaps them and blue-contracts both* —
19
+ * a different picture, not a mirrored one, recorded by no bit. So a fitted pair whose sums come
20
+ * out the wrong way round is written the other way up with its weights inverted, which decodes
21
+ * identically; that is `astc_order_endpoints`, in WGSL.
22
+ *
23
+ * Eight weight levels, unevenly spaced — `0, 9, 18, 27, 37, 46, 55, 64` of 64 — over eight-bit
24
+ * ends: between BC1 and BC7 mode 6 in what it can hold, at BC7's eight bits a texel. The fit is
25
+ * the principal axis, the extreme projections, two rounds of least squares with those weights, and
26
+ * one round of coordinate descent over the six stored bytes against the decoder's palette. Alpha
27
+ * is not read: mode 8 carries none, and a cut-out wants the RGBA mode, which is a later chunk.
28
+ *
29
+ * This is the only target here that no device in reach can sample, so it rests on the CPU decoder
30
+ * alone — the decoder that §9.17 held against the reference encoder's blocks before trusting it.
31
+ *
32
+ * @type {CodeChunk}
33
+ */
34
+ export const chunk_astc_encode_block_4x4_rgb = CodeChunk.from(
35
+ //language=WGSL
36
+ `
37
+ // what a three-bit weight unquantizes to, out of 64: replicated up to six bits and nudged so the
38
+ // top of the range is exactly 64
39
+ fn astc_weight3(index: u32) -> f32 {
40
+ var weights = array<f32, 8>(0.0, 9.0, 18.0, 27.0, 37.0, 46.0, 55.0, 64.0);
41
+
42
+ return weights[index];
43
+ }
44
+
45
+ // one channel decoded as the format decodes it: sixteen-bit replicated ends, a rounded weighted
46
+ // sum, the top eight bits
47
+ fn astc_interpolate(c0: f32, c1: f32, weight: f32) -> f32 {
48
+ let wide0 = c0 * 257.0;
49
+ let wide1 = c1 * 257.0;
50
+
51
+ return floor(floor((wide0 * (64.0 - weight) + wide1 * weight + 32.0) / 64.0) / 256.0);
52
+ }
53
+
54
+ fn astc_palette_entry(e0: vec3<f32>, e1: vec3<f32>, index: u32) -> vec3<f32> {
55
+ let w = astc_weight3(index);
56
+
57
+ return vec3<f32>(
58
+ astc_interpolate(e0.x, e1.x, w),
59
+ astc_interpolate(e0.y, e1.y, w),
60
+ astc_interpolate(e0.z, e1.z, w)
61
+ );
62
+ }
63
+
64
+ // the weight whose palette entry is nearest a texel, and the squared distance
65
+ fn astc_nearest(e0: vec3<f32>, e1: vec3<f32>, texel: vec3<f32>) -> vec2<f32> {
66
+ let direction = e1 - e0;
67
+ let span = dot(direction, direction);
68
+
69
+ var estimate = 0.0;
70
+
71
+ if (span > 0.0) {
72
+ estimate = clamp(round(dot(texel - e0, direction) / span * 7.0), 0.0, 7.0);
73
+ }
74
+
75
+ var best = estimate;
76
+ var best_distance = 1e30;
77
+
78
+ // counted in integers: counted in floats, the same loops made the whole encoder a seventh slower on
79
+ // an RTX 4090, the bytes identical
80
+ for (var offset = -1; offset <= 1; offset++) {
81
+ let candidate = clamp(estimate + f32(offset), 0.0, 7.0);
82
+
83
+ let delta = astc_palette_entry(e0, e1, u32(candidate)) - texel;
84
+ let distance = dot(delta, delta);
85
+
86
+ if (distance < best_distance) {
87
+ best_distance = distance;
88
+ best = candidate;
89
+ }
90
+ }
91
+
92
+ return vec2<f32>(best, best_distance);
93
+ }
94
+
95
+ fn astc_score(texels: array<vec3<f32>, 16>, e0: vec3<f32>, e1: vec3<f32>) -> f32 {
96
+ var error = 0.0;
97
+
98
+ for (var i = 0u; i < 16u; i++) {
99
+ error += astc_nearest(e0, e1, texels[i]).y;
100
+ }
101
+
102
+ return error;
103
+ }
104
+
105
+ fn astc_refine(texels: array<vec3<f32>, 16>, e0: vec3<f32>, e1: vec3<f32>) -> array<vec3<f32>, 2> {
106
+ let direction = e1 - e0;
107
+ let span = dot(direction, direction);
108
+
109
+ var aa = 0.0;
110
+ var ab = 0.0;
111
+ var bb = 0.0;
112
+ var ap = vec3<f32>(0.0);
113
+ var bp = vec3<f32>(0.0);
114
+
115
+ for (var i = 0u; i < 16u; i++) {
116
+ var estimate = 0.0;
117
+
118
+ if (span > 0.0) {
119
+ estimate = clamp(round(dot(texels[i] - e0, direction) / span * 7.0), 0.0, 7.0);
120
+ }
121
+
122
+ var best_weight = 0.0;
123
+ var best_distance = 1e30;
124
+
125
+ for (var offset = -1; offset <= 1; offset++) {
126
+ let candidate = clamp(estimate + f32(offset), 0.0, 7.0);
127
+ let weight = astc_weight3(u32(candidate)) / 64.0;
128
+
129
+ let delta = mix(e0, e1, weight) - texels[i];
130
+ let distance = dot(delta, delta);
131
+
132
+ if (distance < best_distance) {
133
+ best_distance = distance;
134
+ best_weight = weight;
135
+ }
136
+ }
137
+
138
+ let b = best_weight;
139
+ let a = 1.0 - b;
140
+
141
+ aa += a * a;
142
+ ab += a * b;
143
+ bb += b * b;
144
+ ap += a * texels[i];
145
+ bp += b * texels[i];
146
+ }
147
+
148
+ let determinant = aa * bb - ab * ab;
149
+
150
+ var out: array<vec3<f32>, 2>;
151
+
152
+ if (abs(determinant) < 1e-6) {
153
+ out[0] = e0;
154
+ out[1] = e1;
155
+
156
+ return out;
157
+ }
158
+
159
+ out[0] = (bb * ap - ab * bp) / determinant;
160
+ out[1] = (aa * bp - ab * ap) / determinant;
161
+
162
+ return out;
163
+ }
164
+
165
+ fn astc_with_component(v: vec3<f32>, channel: u32, value: f32) -> vec3<f32> {
166
+ return vec3<f32>(
167
+ select(v.x, value, channel == 0u),
168
+ select(v.y, value, channel == 1u),
169
+ select(v.z, value, channel == 2u)
170
+ );
171
+ }
172
+
173
+ fn astc_encode_block_4x4_rgb(texels: array<vec3<f32>, 16>) -> vec4<u32> {
174
+ var scaled: array<vec3<f32>, 16>;
175
+
176
+ var low = vec3<f32>(255.0);
177
+ var high = vec3<f32>(0.0);
178
+ var mean = vec3<f32>(0.0);
179
+
180
+ for (var i = 0u; i < 16u; i++) {
181
+ let v = clamp(texels[i], vec3<f32>(0.0), vec3<f32>(1.0)) * 255.0;
182
+
183
+ scaled[i] = v;
184
+ low = min(low, v);
185
+ high = max(high, v);
186
+ mean += v;
187
+ }
188
+
189
+ mean = mean / 16.0;
190
+
191
+ let extent = high - low;
192
+
193
+ var e0 = mean;
194
+ var e1 = mean;
195
+
196
+ if (max(extent.x, max(extent.y, extent.z)) >= 0.5) {
197
+ var cov = array<f32, 6>(0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
198
+
199
+ for (var i = 0u; i < 16u; i++) {
200
+ let d = scaled[i] - mean;
201
+
202
+ cov[0] += d.x * d.x;
203
+ cov[1] += d.x * d.y;
204
+ cov[2] += d.x * d.z;
205
+ cov[3] += d.y * d.y;
206
+ cov[4] += d.y * d.z;
207
+ cov[5] += d.z * d.z;
208
+ }
209
+
210
+ var axis = extent;
211
+
212
+ for (var iteration = 0u; iteration < 4u; iteration++) {
213
+ let next = vec3<f32>(
214
+ cov[0] * axis.x + cov[1] * axis.y + cov[2] * axis.z,
215
+ cov[1] * axis.x + cov[3] * axis.y + cov[4] * axis.z,
216
+ cov[2] * axis.x + cov[4] * axis.y + cov[5] * axis.z
217
+ );
218
+
219
+ let magnitude = length(next);
220
+
221
+ if (magnitude < 1e-3) {
222
+ break;
223
+ }
224
+
225
+ axis = next / magnitude;
226
+ }
227
+
228
+ axis = normalize(axis);
229
+
230
+ var t_min = 1e30;
231
+ var t_max = -1e30;
232
+
233
+ for (var i = 0u; i < 16u; i++) {
234
+ let t = dot(scaled[i] - mean, axis);
235
+
236
+ t_min = min(t_min, t);
237
+ t_max = max(t_max, t);
238
+ }
239
+
240
+ e0 = mean + axis * t_min;
241
+ e1 = mean + axis * t_max;
242
+
243
+ for (var round = 0u; round < 2u; round++) {
244
+ let refined = astc_refine(scaled, e0, e1);
245
+
246
+ e0 = clamp(refined[0], vec3<f32>(0.0), vec3<f32>(255.0));
247
+ e1 = clamp(refined[1], vec3<f32>(0.0), vec3<f32>(255.0));
248
+ }
249
+ }
250
+
251
+ var q0 = round(e0);
252
+ var q1 = round(e1);
253
+
254
+ var best = astc_score(scaled, q0, q1);
255
+
256
+ // coordinate descent over the six stored bytes, one round
257
+ for (var component = 0u; component < 6u; component++) {
258
+ let channel = component % 3u;
259
+
260
+ for (var direction = -1; direction <= 1; direction += 2) {
261
+ var c0 = q0;
262
+ var c1 = q1;
263
+
264
+ if (component < 3u) {
265
+ c0 = astc_with_component(q0, channel, clamp(q0[channel] + f32(direction), 0.0, 255.0));
266
+ } else {
267
+ c1 = astc_with_component(q1, channel, clamp(q1[channel] + f32(direction), 0.0, 255.0));
268
+ }
269
+
270
+ let error = astc_score(scaled, c0, c1);
271
+
272
+ if (error < best) {
273
+ best = error;
274
+ q0 = c0;
275
+ q1 = c1;
276
+ }
277
+ }
278
+ }
279
+
280
+ var weights: array<u32, 16>;
281
+
282
+ for (var i = 0u; i < 16u; i++) {
283
+ weights[i] = u32(astc_nearest(q0, q1, scaled[i]).x);
284
+ }
285
+
286
+ // mode 8's rule: with the second end's channel sum below the first's, a decoder swaps and
287
+ // blue-contracts, so such a pair is written the other way up with its weights inverted
288
+ if (q1.x + q1.y + q1.z < q0.x + q0.y + q0.z) {
289
+ let swap = q0;
290
+
291
+ q0 = q1;
292
+ q1 = swap;
293
+
294
+ for (var i = 0u; i < 16u; i++) {
295
+ weights[i] = 7u - weights[i];
296
+ }
297
+ }
298
+
299
+ var endpoints: array<u32, 6>;
300
+
301
+ endpoints[0] = u32(q0.x);
302
+ endpoints[1] = u32(q1.x);
303
+ endpoints[2] = u32(q0.y);
304
+ endpoints[3] = u32(q1.y);
305
+ endpoints[4] = u32(q0.z);
306
+ endpoints[5] = u32(q1.z);
307
+
308
+ return astc_pack_4x4_rgb(endpoints, weights);
309
+ }
310
+ `, [
311
+ chunk_astc_pack_4x4_rgb,
312
+ ]);
@@ -18,9 +18,9 @@
18
18
  * 3. **Quantisation, then a search in 5:6:5.** The rounded pair is a starting point and not an
19
19
  * answer, because five- and six-bit ends are coarse enough that the best representable pair is
20
20
  * not the rounding of the best real one — §9.11 measured that at up to 1.3 dB for the transcoder.
21
- * So each of the six stored components is stepped up and down in turn, twice over, keeping any
22
- * step that lowers the block's error against the decoder's palette: coordinate descent, twelve
23
- * scores a round, no branch that depends on the content for how long it runs.
21
+ * So each of the six stored components is stepped up and down in turn, keeping any step that
22
+ * lowers the block's error against the decoder's palette: one round of coordinate descent,
23
+ * twelve scores, no branch that depends on the content for how long it runs.
24
24
  *
25
25
  * A **flat block** is the case every table-driven encoder special-cases, because a single colour
26
26
  * rounds to 5:6:5 with an error of up to four levels while a pair of ends whose one-third mix lands
@@ -1 +1 @@
1
- {"version":3,"file":"chunk_bc1_encode_block.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/texture/encode/chunk_bc1_encode_block.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,qCAFU,SAAS,CA8UZ;0BAtXmB,oCAAoC"}
1
+ {"version":3,"file":"chunk_bc1_encode_block.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/texture/encode/chunk_bc1_encode_block.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,qCAFU,SAAS,CAsVZ;0BA9XmB,oCAAoC"}